mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
142 lines
5.1 KiB
JavaScript
142 lines
5.1 KiB
JavaScript
describe('$ionicRefresh Controller', function() {
|
|
|
|
beforeEach(module('ionic'));
|
|
beforeEach(inject(function($ionicConfig) {
|
|
ionic.Platform.ready = function(cb) { cb(); };
|
|
ionic.requestAnimationFrame = function(cb) { cb(); };
|
|
$ionicConfig.scrolling.jsScrolling(false);
|
|
}));
|
|
|
|
function setup(options) {
|
|
options = options || {};
|
|
options.el = options.el ||
|
|
angular.element('<ion-refresher></ion-refresher><div class="list"></div>')[0];
|
|
scrollEl = options.parent ||
|
|
angular.element('<div class="ionic-scroll"><div class="scroll"></div></div>');
|
|
scrollEl.find('.scroll').append(options.el);
|
|
|
|
inject(function($controller, $rootScope, $timeout, $compile) {
|
|
scope = $rootScope.$new();
|
|
|
|
$compile(scrollEl)(scope);
|
|
scope.$apply();
|
|
scope.$onRefresh = jasmine.createSpy('onRefresh');
|
|
scope.$onPulling = jasmine.createSpy('onPulling');
|
|
refresher = scrollEl.find('.scroll-refresher')[0];
|
|
ctrl = angular.element(refresher).controller('ionRefresher');
|
|
timeout = $timeout;
|
|
});
|
|
}
|
|
function evt(y) {
|
|
return {
|
|
touches: [
|
|
{screenY:y}
|
|
],
|
|
preventDefault: function() {}
|
|
};
|
|
}
|
|
|
|
it('should error if not child of scroll view', function() {
|
|
setup({parent: angular.element('<div></div>')});
|
|
expect(ctrl).toBe(undefined);
|
|
});
|
|
|
|
it('should oversroll using CSS transforms', function() {
|
|
setup();
|
|
|
|
ctrl.__handleTouchmove(evt(0));
|
|
ctrl.__handleTouchmove(evt(10));
|
|
ctrl.__handleTouchmove(evt(20));
|
|
expect(ctrl.__getScrollChild().style[ionic.CSS.TRANSFORM]).toBe('translateY(3px)');
|
|
expect(ctrl.__getScrollChild().classList.contains('overscroll')).toBe(true);
|
|
expect(refresher.classList.contains('invisible')).toBe(false);
|
|
});
|
|
|
|
it('should resume native scrolling when overscroll is done', function() {
|
|
setup();
|
|
var domMethods = ctrl.getRefresherDomMethods();
|
|
spyOn(domMethods, 'activate');
|
|
spyOn(domMethods, 'deactivate');
|
|
|
|
ctrl.__handleTouchmove(evt(0));
|
|
ctrl.__handleTouchmove(evt(10));
|
|
expect(refresher.classList.contains('invisible')).toBe(false);
|
|
ctrl.__handleTouchmove(evt(0));
|
|
expect(ctrl.__getScrollChild().style[ionic.CSS.TRANSFORM]).toBe('translateY(0px)');
|
|
expect(ctrl.__getScrollChild().classList.contains('overscroll')).toBe(false);
|
|
expect(refresher.classList.contains('invisible')).toBe(true);
|
|
});
|
|
|
|
it('should activate and deactivate when dragging past activation threshold', function() {
|
|
setup();
|
|
var domMethods = ctrl.getRefresherDomMethods();
|
|
spyOn(domMethods, 'activate');
|
|
spyOn(domMethods, 'deactivate');
|
|
|
|
ctrl.__handleTouchmove(evt(0));
|
|
ctrl.__handleTouchmove(evt(10));
|
|
ctrl.__handleTouchmove(evt(300));
|
|
expect(ctrl.__getScrollChild().style[ionic.CSS.TRANSFORM]).toBe('translateY(96px)');
|
|
expect(ctrl.__getScrollChild().classList.contains('overscroll')).toBe(true);
|
|
expect(refresher.classList.contains('invisible')).toBe(false);
|
|
expect(refresher.classList.contains('active')).toBe(true);
|
|
|
|
ctrl.__handleTouchmove(evt(0));
|
|
timeout.flush();
|
|
expect(ctrl.__getScrollChild().style[ionic.CSS.TRANSFORM]).toBe('translateY(0px)');
|
|
expect(ctrl.__getScrollChild().classList.contains('overscroll')).toBe(false);
|
|
expect(refresher.classList.contains('invisible')).toBe(true);
|
|
expect(refresher.classList.contains('active')).toBe(false);
|
|
});
|
|
|
|
it('should update refresher class when shared methods fire', function() {
|
|
setup();
|
|
|
|
scope.$onRefresh = jasmine.createSpy('onRefresh');
|
|
scope.$onPulling = jasmine.createSpy('onPulling');
|
|
|
|
|
|
expect(refresher.classList.contains('active')).toBe(false);
|
|
expect(refresher.classList.contains('refreshing')).toBe(false);
|
|
expect(refresher.classList.contains('invisible')).toBe(true);
|
|
expect(scope.$onRefresh).not.toHaveBeenCalled();
|
|
expect(scope.$onPulling).not.toHaveBeenCalled();
|
|
|
|
ctrl.getRefresherDomMethods().show();
|
|
expect(refresher.classList.contains('invisible')).toBe(false);
|
|
|
|
ctrl.getRefresherDomMethods().activate();
|
|
expect(refresher.classList.contains('active')).toBe(true);
|
|
expect(refresher.classList.contains('refreshing')).toBe(false);
|
|
expect(scope.$onPulling).toHaveBeenCalled();
|
|
|
|
ctrl.getRefresherDomMethods().start();
|
|
expect(refresher.classList.contains('refreshing')).toBe(true);
|
|
expect(scope.$onRefresh).toHaveBeenCalled();
|
|
|
|
ctrl.getRefresherDomMethods().tail();
|
|
expect(refresher.classList.contains('refreshing-tail')).toBe(true);
|
|
|
|
ctrl.getRefresherDomMethods().deactivate();
|
|
timeout.flush();
|
|
expect(refresher.classList.contains('active')).toBe(false);
|
|
expect(refresher.classList.contains('refreshing')).toBe(false);
|
|
expect(refresher.classList.contains('refreshing-tail')).toBe(false);
|
|
|
|
ctrl.getRefresherDomMethods().hide();
|
|
expect(refresher.classList.contains('invisible')).toBe(true);
|
|
});
|
|
|
|
it('should cleanup when done', function() {
|
|
setup();
|
|
|
|
expect(ctrl.__getScrollChild()).not.toBe(null);
|
|
expect(ctrl.__getScrollParent()).not.toBe(null);
|
|
|
|
scope.$broadcast('$destroy');
|
|
|
|
expect(ctrl.__getScrollChild()).toBe(null);
|
|
expect(ctrl.__getScrollParent()).toBe(null);
|
|
});
|
|
});
|