/// /// let expect = chai.expect; let fixtures = { get customConfig():NgHttpProgress.INgHttpProgressServiceConfig{ return { color: 'rgb(255, 0, 255)', height: '2px' }; }, }; let $http:ng.IHttpService; let $q:ng.IQService; let $interval:ng.IIntervalService; let $timeout:ng.ITimeoutService; let clock:Sinon.SinonFakeTimers = sinon.useFakeTimers(); //we need to both tick setInterval and $interval as for some reason ngProgress uses both let tickTime = (seconds) => { let millis = seconds * 1000; clock.tick(millis); $interval.flush(millis); $timeout.flush(millis); }; describe('Custom configuration', function () { let ngHttpProgressProvider:NgHttpProgress.NgHttpProgressServiceProvider; let customProgressService:NgHttpProgress.NgHttpProgressService; beforeEach(() => { module('ngHttpProgress', (_ngHttpProgressProvider_) => { ngHttpProgressProvider = _ngHttpProgressProvider_; //register injection of service provider ngHttpProgressProvider.configure(fixtures.customConfig); }); }); it('should throw an exception when invalid configuration is passed', () => { let testInvalidConfigurationFn = () => { ngHttpProgressProvider.configure({invalid:'config'}); }; expect(testInvalidConfigurationFn).to.throw(NgHttpProgress.NgHttpProgressException); }); beforeEach(()=>{ inject((_ngHttpProgress_) => { customProgressService = _ngHttpProgress_; }) }); it('should have the configured color and height', function() { let element:Element = (customProgressService).ngProgress.getDomElement(), styledElement = jQuery(element).find('#ngProgress') ; expect(styledElement.css('backgroundColor')).to.equal(fixtures.customConfig.color); expect(styledElement.css('height')).to.equal(fixtures.customConfig.height); }); }); describe('Service tests', () => { let $httpBackend:ng.IHttpBackendService; let ngHttpProgressService:NgHttpProgress.NgHttpProgressService; beforeEach(()=>{ module('ngHttpProgress'); inject((_$httpBackend_, _ngHttpProgress_, _$http_, _$q_, _$interval_, _$timeout_) => { if (!ngHttpProgressService){ $httpBackend = _$httpBackend_; ngHttpProgressService = _ngHttpProgress_; //register injected service provider $http = _$http_; $q = _$q_; $interval = _$interval_; $timeout = _$timeout_; } }); }); afterEach(() => { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); }); describe('Initialisation', () => { it('should be an injectable service', () => { return expect(ngHttpProgressService).to.be.an('object'); }); }); describe('direct api call', () => { it('should start the progress bar when called directly', () => { let completionPromise = ngHttpProgressService.start(); expect(completionPromise).eventually.to.be.within(0, 100); tickTime(2); //fast forward intervals by 2 seconds expect(ngHttpProgressService.status()).to.be.greaterThan(0); }); it('should complete the progress bar when called', function(done) { expect(ngHttpProgressService.status()).to.be.greaterThan(0); let completionPromise = ngHttpProgressService.complete(); expect(completionPromise).eventually.to.be.greaterThan(0); //status when the progress bar was completed completionPromise.then(() => { expect(ngHttpProgressService.status()).to.equal(100); done(); }); tickTime(2); //fast forward intervals by 2 seconds }); it.skip('should stop the progress bar when called', function(done){ ngHttpProgressService.start(); tickTime(0.5); //fast forward intervals by 2 seconds ngHttpProgressService.stop(); tickTime(0.5); //let more time elapse expect((ngHttpProgressService).stopped).to.be.true; ngHttpProgressService.start(); //restart tickTime(0.5); //let more time elapse let completionPromise = ngHttpProgressService.complete(); //resume and finish tickTime(2); //let more time elapse completionPromise.then(() => { expect(ngHttpProgressService.status()).to.equal(100); done(); }); tickTime(2); //fast forward intervals by 2 seconds }); }); describe('$http interceptor', () => { it('should start the progress bar when an $http request starts', (done) => { $httpBackend.expectGET('/any').respond('foobar'); expect((ngHttpProgressService).progressPromise).not.to.be.ok; $http.get('/any'); tickTime(2); //wait for the request to get to the interceptor let progressPromise = ngHttpProgressService.progressStatus(); expect(progressPromise).to.be.ok; expect(progressPromise.then).to.be.instanceOf(Function); $httpBackend.flush(); expect(progressPromise).eventually.to.be.greaterThan(0); progressPromise.then(() => { expect(ngHttpProgressService.status()).to.equal(0); done(); }); tickTime(2); //flush the timeouts }); it('should rewind the progress bar when an $http request fails', (done) => { $httpBackend.expectGET('/any').respond(500, 'foobar'); $http.get('/any'); tickTime(2); //wait for the request to get to the interceptor let progressPromise = ngHttpProgressService.progressStatus(); $httpBackend.flush(); expect(progressPromise).eventually.to.be.fulfilled; expect(progressPromise).eventually.to.be.greaterThan(0); progressPromise.then(() => { expect(ngHttpProgressService.status()).to.equal(0); done(); }); tickTime(2); //flush the timeouts }); it('should be able to handle multiple http requests', (done) => { $httpBackend.whenGET('/any').respond('foobar'); $http.get('/any'); tickTime(0.5); //delay dispatching the next request $http.get('/any'); tickTime(0.5); //delay dispatching the next request $http.get('/any'); tickTime(0.5); //delay dispatching the next request let progressPromise = ngHttpProgressService.progressStatus(); expect(progressPromise).eventually.to.be.greaterThan(0); $httpBackend.flush(); progressPromise.then(() => { done(); }); tickTime(2); //flush the completion timeout }) }); });