diff options
| author | David Bennett | 2013-04-27 11:22:03 -0400 | 
|---|---|---|
| committer | Igor Minar | 2013-05-20 14:15:04 -0700 | 
| commit | 9f4f5937112655a9881d3281da8e72035bc8b180 (patch) | |
| tree | f6c9b19448ea5ddde11198b0e6d7a516e0b83d7b /test/ng | |
| parent | 27a8824b50aa78e9a082b4377ca09250382a8655 (diff) | |
| download | angular.js-9f4f5937112655a9881d3281da8e72035bc8b180.tar.bz2 | |
feat($http): add support for aborting via timeout promises
If the timeout argument is a promise, abort the request when it is resolved.
Implemented by adding support to $httpBackend service and $httpBackend mock
service.
This api can also be used to explicitly abort requests while keeping the
communication between the deffered and promise unidirectional.
Closes #1159
Diffstat (limited to 'test/ng')
| -rw-r--r-- | test/ng/httpBackendSpec.js | 38 | ||||
| -rw-r--r-- | test/ng/httpSpec.js | 27 | 
2 files changed, 65 insertions, 0 deletions
| diff --git a/test/ng/httpBackendSpec.js b/test/ng/httpBackendSpec.js index da4fed16..c65ab2e1 100644 --- a/test/ng/httpBackendSpec.js +++ b/test/ng/httpBackendSpec.js @@ -117,6 +117,44 @@ describe('$httpBackend', function() {    }); +  it('should abort request on timeout promise resolution', inject(function($timeout) { +    callback.andCallFake(function(status, response) { +      expect(status).toBe(-1); +    }); + +    $backend('GET', '/url', null, callback, {}, $timeout(noop, 2000)); +    xhr = MockXhr.$$lastInstance; +    spyOn(xhr, 'abort'); + +    $timeout.flush(); +    expect(xhr.abort).toHaveBeenCalledOnce(); + +    xhr.status = 0; +    xhr.readyState = 4; +    xhr.onreadystatechange(); +    expect(callback).toHaveBeenCalledOnce(); +  })); + + +  it('should not abort resolved request on timeout promise resolution', inject(function($timeout) { +    callback.andCallFake(function(status, response) { +      expect(status).toBe(200); +    }); + +    $backend('GET', '/url', null, callback, {}, $timeout(noop, 2000)); +    xhr = MockXhr.$$lastInstance; +    spyOn(xhr, 'abort'); + +    xhr.status = 200; +    xhr.readyState = 4; +    xhr.onreadystatechange(); +    expect(callback).toHaveBeenCalledOnce(); + +    $timeout.flush(); +    expect(xhr.abort).not.toHaveBeenCalled(); +  })); + +    it('should cancel timeout on completion', function() {      callback.andCallFake(function(status, response) {        expect(status).toBe(200); diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index 5984106c..4ddb3661 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -1273,6 +1273,33 @@ describe('$http', function() {      }); +    describe('timeout', function() { + +      it('should abort requests when timeout promise resolves', inject(function($q) { +        var canceler = $q.defer(); + +        $httpBackend.expect('GET', '/some').respond(200); + +        $http({method: 'GET', url: '/some', timeout: canceler.promise}).error( +            function(data, status, headers, config) { +              expect(data).toBeUndefined(); +              expect(status).toBe(0); +              expect(headers()).toEqual({}); +              expect(config.url).toBe('/some'); +              callback(); +            }); + +        $rootScope.$apply(function() { +          canceler.resolve(); +        }); + +        expect(callback).toHaveBeenCalled(); +        $httpBackend.verifyNoOutstandingExpectation(); +        $httpBackend.verifyNoOutstandingRequest(); +      })); +    }); + +      describe('pendingRequests', function() {        it('should be an array of pending requests', function() { | 
