initialized kettu on gitorious
[kettu:kettu.git] / spec / jspec / jspec.xhr.js
1
2 // JSpec - XHR - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)
3
4 (function(){
5   
6   // --- Original XMLHttpRequest
7   
8   var OriginalXMLHttpRequest = 'XMLHttpRequest' in this ? 
9                                  XMLHttpRequest :
10                                    function(){}
11
12   // --- MockXMLHttpRequest
13
14   var MockXMLHttpRequest = function() {
15     this.requestHeaders = {}
16   }
17   
18   MockXMLHttpRequest.prototype = {
19     status: 0,
20     async: true,
21     readyState: 0,
22     responseText: '',
23     abort: function(){},
24     onreadystatechange: function(){},
25
26    /**
27     * Return response headers hash.
28     */
29
30     getAllResponseHeaders : function(){
31       return this.responseHeaders
32     },
33     
34     /**
35      * Return case-insensitive value for header _name_.
36      */
37
38     getResponseHeader : function(name) {
39       return this.responseHeaders[name.toLowerCase()]
40     },
41     
42     /**
43      * Set case-insensitive _value_ for header _name_.
44      */
45
46     setRequestHeader : function(name, value) {
47       this.requestHeaders[name.toLowerCase()] = value
48     },
49     
50     /**
51      * Open mock request.
52      */
53
54     open : function(method, url, async, user, password) {
55       this.user = user
56       this.password = password
57       this.url = url
58       this.readyState = 1
59       this.method = method.toUpperCase()
60       if (async != undefined) this.async = async
61       if (this.async) this.onreadystatechange()
62     },
63     
64     /**
65      * Send request _data_.
66      */
67
68     send : function(data) {
69       this.data = data
70       this.readyState = 4
71       if (this.method == 'HEAD') this.responseText = null
72       this.responseHeaders['content-length'] = (this.responseText || '').length
73       if(this.async) this.onreadystatechange()
74     }
75   }
76   
77   // --- Response status codes
78   
79   JSpec.statusCodes = {
80     100: 'Continue',
81     101: 'Switching Protocols',
82     200: 'OK',
83     201: 'Created',
84     202: 'Accepted',
85     203: 'Non-Authoritative Information',
86     204: 'No Content',
87     205: 'Reset Content',
88     206: 'Partial Content',
89     300: 'Multiple Choice',
90     301: 'Moved Permanently',
91     302: 'Found',
92     303: 'See Other',
93     304: 'Not Modified',
94     305: 'Use Proxy',
95     307: 'Temporary Redirect',
96     400: 'Bad Request',
97     401: 'Unauthorized',
98     402: 'Payment Required',
99     403: 'Forbidden',
100     404: 'Not Found',
101     405: 'Method Not Allowed',
102     406: 'Not Acceptable',
103     407: 'Proxy Authentication Required',
104     408: 'Request Timeout',
105     409: 'Conflict',
106     410: 'Gone',
107     411: 'Length Required',
108     412: 'Precondition Failed',
109     413: 'Request Entity Too Large',
110     414: 'Request-URI Too Long',
111     415: 'Unsupported Media Type',
112     416: 'Requested Range Not Satisfiable',
113     417: 'Expectation Failed',
114     422: 'Unprocessable Entity',
115     500: 'Internal Server Error',
116     501: 'Not Implemented',
117     502: 'Bad Gateway',
118     503: 'Service Unavailable',
119     504: 'Gateway Timeout',
120     505: 'HTTP Version Not Supported'
121   }
122   
123   /**
124    * Mock XMLHttpRequest requests.
125    *
126    *   mockRequest().and_return('some data', 'text/plain', 200, { 'X-SomeHeader' : 'somevalue' })
127    *
128    * @return {hash}
129    * @api public
130    */
131   
132   function mockRequest() {
133     return { and_return : function(body, type, status, headers) {
134       XMLHttpRequest = MockXMLHttpRequest
135       status = status || 200
136       headers = headers || {}
137       headers['content-type'] = type
138       JSpec.extend(XMLHttpRequest.prototype, {
139         responseText: body,
140         responseHeaders: headers,
141         status: status,
142         statusText: JSpec.statusCodes[status]
143       })
144     }}
145   }
146   
147   /**
148    * Unmock XMLHttpRequest requests.
149    *
150    * @api public
151    */
152   
153   function unmockRequest() {
154     XMLHttpRequest = OriginalXMLHttpRequest
155   }
156   
157   JSpec.include({
158     name: 'Mock XHR',
159
160     // --- Utilities
161
162     utilities : {
163       mockRequest: mockRequest,
164       unmockRequest: unmockRequest
165     },
166
167     // --- Hooks
168
169     afterSpec : function() {
170       unmockRequest()
171     },
172     
173     // --- DSLs
174     
175     DSLs : {
176       snake : {
177         mock_request: mockRequest,
178         unmock_request: unmockRequest
179       }
180     }
181
182   })
183 })()