describe('sk.request, sk.get, sk.post, and sk.delete',
  function() {
    var server;

    beforeEach(function () { server = sinon.fakeServer.create(); });
    afterEach(function () { server.restore(); });

    function testRequestSuccess() {
      var method = 'POST';
      var url = '/test-url';
      var requestBody = 'Test body';
      var requestHeaders = {'Content-Type': 'text/plain',
                            'X-Foo': 'Bar'};
      var promise = sk.request(method, url, requestBody, requestHeaders);
      assert.equal(server.requests.length, 1);
      var request = server.requests[0];
      assert.equal(request.method, method);
      assert.equal(request.url, url);
      assert.equal(request.requestBody, requestBody);
      assert.deepEqual(request.requestHeaders,
                       {'Content-Type': 'text/plain;charset=utf-8',
                        'X-Foo': 'Bar'});
      var responseBody = 'Hey, look at this body!';
      request.respond(200, {}, responseBody);
      return promise.should.eventually.equal(responseBody);
    }

    it('should send an async XMLHttpRequest', testRequestSuccess);

    function testRequestErrorResponse() {
      var method = 'GET';
      var url = '/test-url';
      var requestHeaders = {'X-Foo': 'Bar'};
      var promise = sk.request(method, url, null, requestHeaders);
      assert.equal(server.requests.length, 1);
      var request = server.requests[0];
      assert.equal(request.method, method);
      assert.equal(request.url, url);
      assert(!request.requestBody);
      assert.deepEqual(request.requestHeaders, requestHeaders);
      var responseBody = "This didn't work out.";
      request.respond(503, {}, responseBody);
      return promise.should.be.rejectedWith({
        status:503,
        response: responseBody,
      });
    }

    it('should reject when non-OK response', testRequestErrorResponse);

    function testRequestNetworkError() {
      // Sinon does not seem to have a way to simulate network errors. Instead,
      // make a request to an invalid domain.
      server.restore();
      var method = 'GET';
      var url = 'http://x.invalid/test-url';
      return sk.request(method, url).should.be.rejectedWith({
        response:Error
      });
    }

    it('should fail with a network error', testRequestNetworkError);

    function testGet() {
      var url = '/test-url';
      var promise = sk.get(url);
      assert.equal(server.requests.length, 1);
      var request = server.requests[0];
      assert.equal(request.method, 'GET');
      assert.equal(request.url, url);
      assert(!request.requestBody);
      assert.deepEqual(request.requestHeaders, {});
      var responseBody = 'Got';
      request.respond(200, {}, responseBody);
      return promise.should.eventually.equal(responseBody);
    }

    it('should use GET for sk.get', testGet);

    function testPost() {
      var url = '/test-url';
      var obj = {
        green: {tea: 'matcha'},
        teas: ['chai', 'matcha', {tea: 'konacha'}]
      };
      var promise = sk.post(url, JSON.stringify(obj));
      assert.equal(server.requests.length, 1);
      var request = server.requests[0];
      assert.equal(request.method, 'POST');
      assert.equal(request.url, url);
      assert.deepEqual(JSON.parse(request.requestBody), obj);
      assert.deepEqual(request.requestHeaders,
                       {'Content-Type': 'application/json;charset=utf-8'});
      var responseBody = JSON.stringify({ brewed: true });
      request.respond(200, {}, responseBody);
      return promise.should.eventually.equal(responseBody);
    }

    it('should use POST and application/json for sk.post', testPost);

    function testDelete() {
      var url = '/test-url';
      var promise = sk.delete(url);
      assert.equal(server.requests.length, 1);
      var request = server.requests[0];
      assert.equal(request.method, 'DELETE');
      assert.equal(request.url, url);
      assert(!request.requestBody);
      // For some reason, Chrome automatically adds a Content-Type header even
      // though there's no body. (We probably don't care.)
      //assert.deepEqual(request.requestHeaders, {});
      request.respond(200, {}, "");
      return promise.should.eventually.equal("");
    }

    it('should use DELETE for sk.delete', testDelete);
  }
);
