diff options
Diffstat (limited to 'test/service/xhr.cacheSpec.js')
| -rw-r--r-- | test/service/xhr.cacheSpec.js | 128 | 
1 files changed, 128 insertions, 0 deletions
diff --git a/test/service/xhr.cacheSpec.js b/test/service/xhr.cacheSpec.js new file mode 100644 index 00000000..82b33b72 --- /dev/null +++ b/test/service/xhr.cacheSpec.js @@ -0,0 +1,128 @@ +describe('$xhr.cache', function() { +  var scope, $browser, $browserXhr, cache, log; + +  beforeEach(function(){ +    scope = angular.scope(); +    $browser = scope.$service('$browser'); +    $browserXhr = $browser.xhr; +    cache = scope.$service('$xhr.cache'); +    log = ''; +  }); + + +  afterEach(function(){ +    dealoc(scope); +  }); + + +  function callback(code, response) { +    expect(code).toEqual(200); +    log = log + toJson(response) + ';'; +  } + + +  it('should cache requests', function(){ +    $browserXhr.expectGET('/url').respond('first'); +    cache('GET', '/url', null, callback); +    $browserXhr.flush(); + +    $browserXhr.expectGET('/url').respond('ERROR'); +    cache('GET', '/url', null, callback); +    $browser.defer.flush(); +    expect(log).toEqual('"first";"first";'); + +    cache('GET', '/url', null, callback, false); +    $browser.defer.flush(); +    expect(log).toEqual('"first";"first";"first";'); +  }); + + +  it('should first return cache request, then return server request', function(){ +    $browserXhr.expectGET('/url').respond('first'); +    cache('GET', '/url', null, callback, true); +    $browserXhr.flush(); + +    $browserXhr.expectGET('/url').respond('ERROR'); +    cache('GET', '/url', null, callback, true); +    $browser.defer.flush(); +    expect(log).toEqual('"first";"first";'); + +    $browserXhr.flush(); +    expect(log).toEqual('"first";"first";"ERROR";'); +  }); + + +  it('should serve requests from cache', function(){ +    cache.data.url = {value:'123'}; +    cache('GET', 'url', null, callback); +    $browser.defer.flush(); +    expect(log).toEqual('"123";'); + +    cache('GET', 'url', null, callback, false); +    $browser.defer.flush(); +    expect(log).toEqual('"123";"123";'); +  }); + + +  it('should keep track of in flight requests and request only once', function(){ +    scope.$service('$xhr.bulk').urls['/bulk'] = { +      match:function(url){ +        return url == '/url'; +      } +    }; +    $browserXhr.expectPOST('/bulk', { +      requests:[{method:'GET',  url:'/url', data: null}] +    }).respond([ +      {status:200, response:'123'} +    ]); +    cache('GET', '/url', null, callback); +    cache('GET', '/url', null, callback); +    cache.delegate.flush(); +    $browserXhr.flush(); +    expect(log).toEqual('"123";"123";'); +  }); + + +  it('should clear cache on non GET', function(){ +    $browserXhr.expectPOST('abc', {}).respond({}); +    cache.data.url = {value:123}; +    cache('POST', 'abc', {}); +    expect(cache.data.url).toBeUndefined(); +  }); + + +  it('should call callback asynchronously for both cache hit and cache miss', function() { +    $browserXhr.expectGET('/url').respond('+'); +    cache('GET', '/url', null, callback); +    expect(log).toEqual(''); //callback hasn't executed + +    $browserXhr.flush(); +    expect(log).toEqual('"+";'); //callback has executed + +    cache('GET', '/url', null, callback); +    expect(log).toEqual('"+";'); //callback hasn't executed + +    $browser.defer.flush(); +    expect(log).toEqual('"+";"+";'); //callback has executed +  }); + + +  it('should call eval after callbacks for both cache hit and cache miss execute', function() { +    var eval = this.spyOn(scope, '$eval').andCallThrough(); + +    $browserXhr.expectGET('/url').respond('+'); +    cache('GET', '/url', null, callback); +    expect(eval).wasNotCalled(); + +    $browserXhr.flush(); +    expect(eval).wasCalled(); + +    eval.reset(); //reset the spy + +    cache('GET', '/url', null, callback); +    expect(eval).wasNotCalled(); + +    $browser.defer.flush(); +    expect(eval).wasCalled(); +  }); +});  | 
