
// JSpec - XHR - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)

(function(){
  
  var lastRequest
  
  // --- Original XMLHttpRequest
  
  var OriginalXMLHttpRequest = 'XMLHttpRequest' in this ? 
                                 XMLHttpRequest :
                                   function(){}
  var OriginalActiveXObject = 'ActiveXObject' in this ?
                                 ActiveXObject :
                                   undefined
                                   
  // --- MockXMLHttpRequest

  var MockXMLHttpRequest = function() {
    this.requestHeaders = {}
  }
  
  MockXMLHttpRequest.prototype = {
    status: 0,
    async: true,
    readyState: 0,
    responseText: '',
    abort: function(){},
    onreadystatechange: function(){},

   /**
    * Return response headers hash.
    */

    getAllResponseHeaders : function(){
      return this.responseHeaders
    },
    
    /**
     * Return case-insensitive value for header _name_.
     */

    getResponseHeader : function(name) {
      return this.responseHeaders[name.toLowerCase()]
    },
    
    /**
     * Set case-insensitive _value_ for header _name_.
     */

    setRequestHeader : function(name, value) {
      this.requestHeaders[name.toLowerCase()] = value
    },
    
    /**
     * Open mock request.
     */

    open : function(method, url, async, user, password) {
      this.user = user
      this.password = password
      this.url = url
      this.readyState = 1
      this.method = method.toUpperCase()
      if (async != undefined) this.async = async
      if (this.async) this.onreadystatechange()
    },
    
    /**
     * Send request _data_.
     */

    send : function(data) {
      var self = this
      this.data = data
      this.readyState = 4
      if (this.method == 'HEAD') this.responseText = null
      this.responseHeaders['content-length'] = (this.responseText || '').length
      if(this.async) this.onreadystatechange()
      lastRequest = function(){
        return self
      }
    }
  }
  
  // --- Response status codes
  
  JSpec.statusCodes = {
    100: 'Continue',
    101: 'Switching Protocols',
    200: 'OK',
    201: 'Created',
    202: 'Accepted',
    203: 'Non-Authoritative Information',
    204: 'No Content',
    205: 'Reset Content',
    206: 'Partial Content',
    300: 'Multiple Choice',
    301: 'Moved Permanently',
    302: 'Found',
    303: 'See Other',
    304: 'Not Modified',
    305: 'Use Proxy',
    307: 'Temporary Redirect',
    400: 'Bad Request',
    401: 'Unauthorized',
    402: 'Payment Required',
    403: 'Forbidden',
    404: 'Not Found',
    405: 'Method Not Allowed',
    406: 'Not Acceptable',
    407: 'Proxy Authentication Required',
    408: 'Request Timeout',
    409: 'Conflict',
    410: 'Gone',
    411: 'Length Required',
    412: 'Precondition Failed',
    413: 'Request Entity Too Large',
    414: 'Request-URI Too Long',
    415: 'Unsupported Media Type',
    416: 'Requested Range Not Satisfiable',
    417: 'Expectation Failed',
    422: 'Unprocessable Entity',
    500: 'Internal Server Error',
    501: 'Not Implemented',
    502: 'Bad Gateway',
    503: 'Service Unavailable',
    504: 'Gateway Timeout',
    505: 'HTTP Version Not Supported'
  }
  
  /**
   * Mock XMLHttpRequest requests.
   *
   *   mockRequest().and_return('some data', 'text/plain', 200, { 'X-SomeHeader' : 'somevalue' })
   *
   * @return {hash}
   * @api public
   */
  
  function mockRequest() {
    return { and_return : function(body, type, status, headers) {
      XMLHttpRequest = MockXMLHttpRequest
      ActiveXObject = false
      status = status || 200
      headers = headers || {}
      headers['content-type'] = type
      JSpec.extend(XMLHttpRequest.prototype, {
        responseText: body,
        responseHeaders: headers,
        status: status,
        statusText: JSpec.statusCodes[status]
      })
    }}
  }
  
  /**
   * Unmock XMLHttpRequest requests.
   *
   * @api public
   */
  
  function unmockRequest() {
    XMLHttpRequest = OriginalXMLHttpRequest
    ActiveXObject = OriginalActiveXObject
  }
  
  JSpec.include({
    name: 'Mock XHR',

    // --- Utilities

    utilities : {
      mockRequest: mockRequest,
      unmockRequest: unmockRequest
    },

    // --- Hooks

    afterSpec : function() {
      unmockRequest()
    },
    
    // --- DSLs
    
    DSLs : {
      snake : {
        mock_request: mockRequest,
        unmock_request: unmockRequest,
        last_request: function(){ return lastRequest() }
      }
    }

  })
})()