From 56b27ed4a28309356a9461d7d8ed571711c127a3 Mon Sep 17 00:00:00 2001 From: Bob Olde Hampsink <b.oldehampsink@nerds.company> Date: Tue, 1 Nov 2016 15:59:00 +0100 Subject: [PATCH] Protractor $timeout workaround --- build/loading-bar.js | 8 ++--- build/loading-bar.min.css | 2 +- build/loading-bar.min.js | 2 +- src/loading-bar.js | 8 ++--- test/loading-bar-interceptor-config.coffee | 6 ++-- test/loading-bar-interceptor.coffee | 36 ++++++++++++---------- 6 files changed, 32 insertions(+), 30 deletions(-) diff --git a/build/loading-bar.js b/build/loading-bar.js index 01630c0..ef371c4 100644 --- a/build/loading-bar.js +++ b/build/loading-bar.js @@ -175,7 +175,7 @@ angular.module('cfp.loadingBar', []) this.spinnerTemplate = '<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>'; this.loadingBarTemplate = '<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>'; - this.$get = ['$injector', '$document', '$timeout', '$rootScope', function ($injector, $document, $timeout, $rootScope) { + this.$get = ['$injector', '$document', '$timeout', '$interval', '$rootScope', function ($injector, $document, $timeout, $interval, $rootScope) { var $animate; var $parentSelector = this.parentSelector, loadingBarContainer = angular.element(this.loadingBarTemplate), @@ -251,10 +251,10 @@ angular.module('cfp.loadingBar', []) // progress but make sure to cancel the previous timeouts so we don't // have multiple incs running at the same time. if (autoIncrement) { - $timeout.cancel(incTimeout); - incTimeout = $timeout(function() { + $interval.cancel(incTimeout); + incTimeout = $interval(function() { _inc(); - }, 250); + }, 250, 1); } } diff --git a/build/loading-bar.min.css b/build/loading-bar.min.css index 0f9f106..2f2d42f 100644 --- a/build/loading-bar.min.css +++ b/build/loading-bar.min.css @@ -1 +1 @@ -#loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;left:0;width:100%;height:2px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:2px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px;left:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner 400ms linear infinite;-moz-animation:loading-bar-spinner 400ms linear infinite;-ms-animation:loading-bar-spinner 400ms linear infinite;-o-animation:loading-bar-spinner 400ms linear infinite;animation:loading-bar-spinner 400ms linear infinite}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} \ No newline at end of file +#loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;left:0;width:100%;height:2px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:2px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px;left:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner .4s linear infinite;-moz-animation:loading-bar-spinner .4s linear infinite;-ms-animation:loading-bar-spinner .4s linear infinite;-o-animation:loading-bar-spinner .4s linear infinite;animation:loading-bar-spinner .4s linear infinite}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/build/loading-bar.min.js b/build/loading-bar.min.js index e4b18ad..4d59857 100644 --- a/build/loading-bar.min.js +++ b/build/loading-bar.min.js @@ -4,4 +4,4 @@ * Copyright (c) 2016 Wes Cruver * License: MIT */ -!function(){"use strict";angular.module("angular-loading-bar",["cfp.loadingBarInterceptor"]),angular.module("chieffancypants.loadingBar",["cfp.loadingBarInterceptor"]),angular.module("cfp.loadingBarInterceptor",["cfp.loadingBar"]).config(["$httpProvider",function(a){var b=["$q","$cacheFactory","$timeout","$rootScope","$log","cfpLoadingBar",function(b,c,d,e,f,g){function h(){d.cancel(j),g.complete(),l=0,k=0}function i(b){var d,e=c.get("$http"),f=a.defaults;!b.cache&&!f.cache||b.cache===!1||"GET"!==b.method&&"JSONP"!==b.method||(d=angular.isObject(b.cache)?b.cache:angular.isObject(f.cache)?f.cache:e);var g=void 0!==d?void 0!==d.get(b.url):!1;return void 0!==b.cached&&g!==b.cached?b.cached:(b.cached=g,g)}var j,k=0,l=0,m=g.latencyThreshold;return{request:function(a){return a.ignoreLoadingBar||i(a)||(e.$broadcast("cfpLoadingBar:loading",{url:a.url}),0===k&&(j=d(function(){g.start()},m)),k++,g.set(l/k)),a},response:function(a){return a&&a.config?(a.config.ignoreLoadingBar||i(a.config)||(l++,l>=k?(e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url,result:a}),h()):g.set(l/k)),a):(f.error("Broken interceptor detected: Config object not supplied in response:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),a)},responseError:function(a){return a&&a.config?(a.config.ignoreLoadingBar||i(a.config)||(l++,l>=k?(e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url,result:a}),h()):g.set(l/k)),b.reject(a)):(f.error("Broken interceptor detected: Config object not supplied in rejection:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),b.reject(a))}}}];a.interceptors.push(b)}]),angular.module("cfp.loadingBar",[]).provider("cfpLoadingBar",function(){this.autoIncrement=!0,this.includeSpinner=!0,this.includeBar=!0,this.latencyThreshold=100,this.startSize=.02,this.parentSelector="body",this.spinnerTemplate='<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>',this.loadingBarTemplate='<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>',this.$get=["$injector","$document","$timeout","$rootScope",function(a,b,c,d){function e(){if(k||(k=a.get("$animate")),c.cancel(m),!r){var e=b[0],g=e.querySelector?e.querySelector(n):b.find(n)[0];g||(g=e.getElementsByTagName("body")[0]);var h=angular.element(g),i=g.lastChild&&angular.element(g.lastChild);d.$broadcast("cfpLoadingBar:started"),r=!0,v&&k.enter(o,h,i),u&&k.enter(q,h,o),f(w)}}function f(a){if(r){var b=100*a+"%";p.css("width",b),s=a,t&&(c.cancel(l),l=c(function(){g()},250))}}function g(){if(!(h()>=1)){var a=0,b=h();a=b>=0&&.25>b?(3*Math.random()+3)/100:b>=.25&&.65>b?3*Math.random()/100:b>=.65&&.9>b?2*Math.random()/100:b>=.9&&.99>b?.005:0;var c=h()+a;f(c)}}function h(){return s}function i(){s=0,r=!1}function j(){k||(k=a.get("$animate")),f(1),c.cancel(m),m=c(function(){var a=k.leave(o,i);a&&a.then&&a.then(i),k.leave(q),d.$broadcast("cfpLoadingBar:completed")},500)}var k,l,m,n=this.parentSelector,o=angular.element(this.loadingBarTemplate),p=o.find("div").eq(0),q=angular.element(this.spinnerTemplate),r=!1,s=0,t=this.autoIncrement,u=this.includeSpinner,v=this.includeBar,w=this.startSize;return{start:e,set:f,status:h,inc:g,complete:j,autoIncrement:this.autoIncrement,includeSpinner:this.includeSpinner,latencyThreshold:this.latencyThreshold,parentSelector:this.parentSelector,startSize:this.startSize}}]})}(); \ No newline at end of file +!function(){"use strict";angular.module("angular-loading-bar",["cfp.loadingBarInterceptor"]),angular.module("chieffancypants.loadingBar",["cfp.loadingBarInterceptor"]),angular.module("cfp.loadingBarInterceptor",["cfp.loadingBar"]).config(["$httpProvider",function(a){var b=["$q","$cacheFactory","$timeout","$rootScope","$log","cfpLoadingBar",function(b,c,d,e,f,g){function h(){d.cancel(j),g.complete(),l=0,k=0}function i(b){var d,e=c.get("$http"),f=a.defaults;!b.cache&&!f.cache||b.cache===!1||"GET"!==b.method&&"JSONP"!==b.method||(d=angular.isObject(b.cache)?b.cache:angular.isObject(f.cache)?f.cache:e);var g=void 0!==d&&void 0!==d.get(b.url);return void 0!==b.cached&&g!==b.cached?b.cached:(b.cached=g,g)}var j,k=0,l=0,m=g.latencyThreshold;return{request:function(a){return a.ignoreLoadingBar||i(a)||(e.$broadcast("cfpLoadingBar:loading",{url:a.url}),0===k&&(j=d(function(){g.start()},m)),k++,g.set(l/k)),a},response:function(a){return a&&a.config?(a.config.ignoreLoadingBar||i(a.config)||(l++,l>=k?(e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url,result:a}),h()):g.set(l/k)),a):(f.error("Broken interceptor detected: Config object not supplied in response:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),a)},responseError:function(a){return a&&a.config?(a.config.ignoreLoadingBar||i(a.config)||(l++,l>=k?(e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url,result:a}),h()):g.set(l/k)),b.reject(a)):(f.error("Broken interceptor detected: Config object not supplied in rejection:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),b.reject(a))}}}];a.interceptors.push(b)}]),angular.module("cfp.loadingBar",[]).provider("cfpLoadingBar",function(){this.autoIncrement=!0,this.includeSpinner=!0,this.includeBar=!0,this.latencyThreshold=100,this.startSize=.02,this.parentSelector="body",this.spinnerTemplate='<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>',this.loadingBarTemplate='<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>',this.$get=["$injector","$document","$timeout","$interval","$rootScope",function(a,b,c,d,e){function f(){if(l||(l=a.get("$animate")),c.cancel(n),!s){var d=b[0],f=d.querySelector?d.querySelector(o):b.find(o)[0];f||(f=d.getElementsByTagName("body")[0]);var h=angular.element(f),i=f.lastChild&&angular.element(f.lastChild);e.$broadcast("cfpLoadingBar:started"),s=!0,w&&l.enter(p,h,i),v&&l.enter(r,h,p),g(x)}}function g(a){if(s){var b=100*a+"%";q.css("width",b),t=a,u&&(d.cancel(m),m=d(function(){h()},250,1))}}function h(){if(!(i()>=1)){var a=0,b=i();a=b>=0&&b<.25?(3*Math.random()+3)/100:b>=.25&&b<.65?3*Math.random()/100:b>=.65&&b<.9?2*Math.random()/100:b>=.9&&b<.99?.005:0;var c=i()+a;g(c)}}function i(){return t}function j(){t=0,s=!1}function k(){l||(l=a.get("$animate")),g(1),c.cancel(n),n=c(function(){var a=l.leave(p,j);a&&a.then&&a.then(j),l.leave(r),e.$broadcast("cfpLoadingBar:completed")},500)}var l,m,n,o=this.parentSelector,p=angular.element(this.loadingBarTemplate),q=p.find("div").eq(0),r=angular.element(this.spinnerTemplate),s=!1,t=0,u=this.autoIncrement,v=this.includeSpinner,w=this.includeBar,x=this.startSize;return{start:f,set:g,status:i,inc:h,complete:k,autoIncrement:this.autoIncrement,includeSpinner:this.includeSpinner,latencyThreshold:this.latencyThreshold,parentSelector:this.parentSelector,startSize:this.startSize}}]})}(); \ No newline at end of file diff --git a/src/loading-bar.js b/src/loading-bar.js index 44e092a..429d851 100644 --- a/src/loading-bar.js +++ b/src/loading-bar.js @@ -169,7 +169,7 @@ angular.module('cfp.loadingBar', []) this.spinnerTemplate = '<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>'; this.loadingBarTemplate = '<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>'; - this.$get = ['$injector', '$document', '$timeout', '$rootScope', function ($injector, $document, $timeout, $rootScope) { + this.$get = ['$injector', '$document', '$timeout', '$interval', '$rootScope', function ($injector, $document, $timeout, $interval, $rootScope) { var $animate; var $parentSelector = this.parentSelector, loadingBarContainer = angular.element(this.loadingBarTemplate), @@ -245,10 +245,10 @@ angular.module('cfp.loadingBar', []) // progress but make sure to cancel the previous timeouts so we don't // have multiple incs running at the same time. if (autoIncrement) { - $timeout.cancel(incTimeout); - incTimeout = $timeout(function() { + $interval.cancel(incTimeout); + incTimeout = $interval(function() { _inc(); - }, 250); + }, 250, 1); } } diff --git a/test/loading-bar-interceptor-config.coffee b/test/loading-bar-interceptor-config.coffee index f29ab1e..4674640 100644 --- a/test/loading-bar-interceptor-config.coffee +++ b/test/loading-bar-interceptor-config.coffee @@ -71,11 +71,11 @@ describe 'loadingBarInterceptor Service - config options', -> module 'chieffancypants.loadingBar', (cfpLoadingBarProvider) -> cfpLoadingBarProvider.autoIncrement = true return - inject ($timeout, cfpLoadingBar) -> + inject ($timeout, $interval, cfpLoadingBar) -> cfpLoadingBar.start() - $timeout.flush() + $interval.flush(250) cfpLoadingBar.set(.5) - $timeout.flush() + $interval.flush(250) expect(cfpLoadingBar.status()).toBeGreaterThan .5 cfpLoadingBar.complete() $timeout.flush() diff --git a/test/loading-bar-interceptor.coffee b/test/loading-bar-interceptor.coffee index 241967f..0bb13f3 100644 --- a/test/loading-bar-interceptor.coffee +++ b/test/loading-bar-interceptor.coffee @@ -11,7 +11,7 @@ flush = null describe 'loadingBarInterceptor Service', -> - $http = $httpBackend = $document = $timeout = result = loadingBar = $animate = null + $http = $httpBackend = $document = $timeout = $interval = result = loadingBar = $animate = null response = {message:'OK'} endpoint = '/service' @@ -21,11 +21,12 @@ describe 'loadingBarInterceptor Service', -> return result = null - inject (_$http_, _$httpBackend_, _$document_, _$timeout_, _$animate_) -> + inject (_$http_, _$httpBackend_, _$document_, _$timeout_, _$interval_, _$animate_) -> $http = _$http_ $httpBackend = _$httpBackend_ $document = _$document_ $timeout = _$timeout_ + $interval = _$interval_ $animate = _$animate_ # Angular 1.4 removed triggerCalbacks(), so try them both: @@ -250,7 +251,7 @@ describe 'loadingBarInterceptor Service', -> it 'should get and set status', inject (cfpLoadingBar) -> cfpLoadingBar.start() - $timeout.flush() + $interval.flush(250) cfpLoadingBar.set(0.4) expect(cfpLoadingBar.status()).toBe 0.4 @@ -264,13 +265,13 @@ describe 'loadingBarInterceptor Service', -> it 'should increment things randomly', inject (cfpLoadingBar) -> cfpLoadingBar.start() - $timeout.flush() + $interval.flush(250) # increments between 3 - 6% cfpLoadingBar.set(0.1) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBeGreaterThan width expect(width2 - width).toBeBetween(3, 6) @@ -278,7 +279,7 @@ describe 'loadingBarInterceptor Service', -> cfpLoadingBar.set(0.2) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBeGreaterThan width expect(width2 - width).toBeBetween(3, 6) @@ -287,7 +288,7 @@ describe 'loadingBarInterceptor Service', -> cfpLoadingBar.set(0.25) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBeGreaterThan width expect(width2 - width).toBeBetween(0, 3) @@ -295,7 +296,7 @@ describe 'loadingBarInterceptor Service', -> cfpLoadingBar.set(0.5) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBeGreaterThan width expect(width2 - width).toBeBetween(0, 3) @@ -304,7 +305,7 @@ describe 'loadingBarInterceptor Service', -> cfpLoadingBar.set(0.65) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBeGreaterThan width expect(width2 - width).toBeBetween(0, 2) @@ -312,7 +313,7 @@ describe 'loadingBarInterceptor Service', -> cfpLoadingBar.set(0.75) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBeGreaterThan width expect(width2 - width).toBeBetween(0, 2) @@ -321,7 +322,7 @@ describe 'loadingBarInterceptor Service', -> cfpLoadingBar.set(0.9) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBeGreaterThan width expect(width2 - width).toBe 0.5 @@ -329,7 +330,7 @@ describe 'loadingBarInterceptor Service', -> cfpLoadingBar.set(0.97) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBeGreaterThan width expect(width2 - width).toBe 0.5 @@ -338,7 +339,7 @@ describe 'loadingBarInterceptor Service', -> cfpLoadingBar.set(0.99) lbar = angular.element(document.getElementById('loading-bar')) width = lbar.children().css('width').slice(0, -1) - $timeout.flush() + $interval.flush(250) width2 = lbar.children().css('width').slice(0, -1) expect(width2).toBe width @@ -445,13 +446,14 @@ describe 'loadingBarInterceptor Service', -> describe 'LoadingBar only', -> - cfpLoadingBar = $document = $timeout = $animate = null + cfpLoadingBar = $document = $timeout = $interval = $animate = null beforeEach -> module 'cfp.loadingBar', 'ngAnimateMock' - inject (_$http_, _$httpBackend_, _$document_, _$timeout_, _$animate_, _cfpLoadingBar_) -> + inject (_$http_, _$httpBackend_, _$document_, _$timeout_, _$interval_, _$animate_, _cfpLoadingBar_) -> $timeout = _$timeout_ + $interval = _$interval_ $document = _$document_ $animate = _$animate_ cfpLoadingBar = _cfpLoadingBar_ @@ -459,7 +461,7 @@ describe 'LoadingBar only', -> it 'should be capable of being used alone', -> # just a simple quick test to make sure: cfpLoadingBar.start() - $timeout.flush() + $interval.flush(250) # test setting progress cfpLoadingBar.set(0.4) @@ -478,7 +480,7 @@ describe 'LoadingBar only', -> it 'should start after multiple calls to complete()', -> cfpLoadingBar.start() - $timeout.flush() + $interval.flush(250) expect(isLoadingBarInjected($document.find(cfpLoadingBar.parentSelector))).toBe true cfpLoadingBar.complete()