mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
Previously the showBack property was setting if the back button should or should not be enabled, and it was also used if the back button should be hidden or not for the view. Changed it so there are now two concepts, where showBack is visual only, and enableBack determines if it should show according to $ionicHistory and navigation info.
180 lines
6.3 KiB
JavaScript
180 lines
6.3 KiB
JavaScript
describe('ionView directive', function() {
|
|
var beforeEnterData;
|
|
|
|
beforeEach(module('ionic'));
|
|
|
|
function setup(attrs, scopeProps, content) {
|
|
var el;
|
|
inject(function($compile, $rootScope) {
|
|
var scope = angular.extend($rootScope.$new(), scopeProps || {});
|
|
|
|
el = angular.element('<ion-view '+(attrs||'')+'>');
|
|
el.data('$ionNavViewController', {
|
|
beforeEnter: function(d) { beforeEnterData = d; },
|
|
title: jasmine.createSpy('title'),
|
|
showBar: jasmine.createSpy('showBar'),
|
|
enableBackButton: jasmine.createSpy('enableBackButton'),
|
|
showBackButton: jasmine.createSpy('showBackButton')
|
|
});
|
|
content && el.html(content);
|
|
|
|
el = $compile(el)(scope);
|
|
$rootScope.$apply();
|
|
});
|
|
return el;
|
|
}
|
|
|
|
it('should add pane', inject(function($compile, $rootScope) {
|
|
var el = $compile('<ion-view>')($rootScope.$new());
|
|
$rootScope.$apply();
|
|
expect(el.hasClass('pane')).toBe(true);
|
|
}));
|
|
|
|
it('should remove title attribute', inject(function($compile, $rootScope) {
|
|
var el = $compile('<ion-view title="view title">')($rootScope.$new());
|
|
$rootScope.$apply();
|
|
expect(el[0].getAttribute('title')).toBe(null);
|
|
}));
|
|
|
|
it('should remove title attribute from view in modal',inject(function($compile, $rootScope) {
|
|
var el = $compile('<ion-modal><ion-view title="1"></ion-modal>')($rootScope.$new());
|
|
var view = jqLite(el[0].querySelector('.pane'));
|
|
$rootScope.$apply();
|
|
expect(view[0].getAttribute('title')).toBe(null);
|
|
}));
|
|
|
|
it('should have content inside', function() {
|
|
var el = setup(null, null, '<b>some</b> html');
|
|
expect(el.html()).toBe('<b>some</b> html');
|
|
});
|
|
|
|
it('should call ionNavViewController.beforeEnter with showNavBar=false w/ hide-nav-bar="true" attr', inject(function($rootScope) {
|
|
var el = setup('hide-nav-bar="true"');
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {});
|
|
expect( beforeEnterData.showNavBar ).toBe(false);
|
|
}));
|
|
|
|
it('should call ionNavViewController.beforeEnter with showNavBar=true and hide-nav-bar="false" attr', inject(function($rootScope) {
|
|
var el = setup('hide-nav-bar="false"');
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {});
|
|
expect( beforeEnterData.showNavBar ).toBe(true);
|
|
}));
|
|
|
|
it('should call ionNavViewController.beforeEnter with title attr', inject(function($rootScope) {
|
|
var el = setup('title="my title"');
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {
|
|
direction: 'forward'
|
|
});
|
|
expect( beforeEnterData.title ).toBe('my title');
|
|
expect( beforeEnterData.direction ).toBe('forward');
|
|
expect( beforeEnterData.hasHeaderBar ).toBe(false);
|
|
expect( beforeEnterData.navBarDelegate ).toBe(null);
|
|
expect( beforeEnterData.showNavBar ).toBe(true);
|
|
}));
|
|
|
|
it('should call ionNavViewController.beforeEnter with view-title attr', inject(function($rootScope) {
|
|
var el = setup('view-title="my title"');
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {});
|
|
expect( beforeEnterData.title ).toBe('my title');
|
|
}));
|
|
|
|
it('should not enableBack with hide-back-button attr', inject(function($rootScope) {
|
|
var el = setup('hide-back-button="true"');
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {
|
|
enableBack: true
|
|
});
|
|
expect( beforeEnterData.showBack ).toBe(false);
|
|
|
|
$rootScope.shouldShowBack = false;
|
|
var el = setup('hide-back-button="shouldShowBack"');
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {
|
|
enableBack: true
|
|
});
|
|
expect( beforeEnterData.showBack ).toBe(false);
|
|
}));
|
|
|
|
it('should enableBack without hide-back-button but no enableBack from transition', inject(function($rootScope) {
|
|
var el = setup();
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {
|
|
enableBack: false
|
|
});
|
|
expect( beforeEnterData.enableBack ).toBe(false);
|
|
}));
|
|
|
|
it('should be receive delegateHandle from child ionNavBar', inject(function($rootScope) {
|
|
var el = setup(null, null, '<ion-nav-bar delegate-handle="myViewNavBar">');
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {});
|
|
expect( beforeEnterData.navBarDelegate ).toBe('myViewNavBar');
|
|
}));
|
|
|
|
it('should only observe title attr after afterEnter and before beforeLeave', inject(function($rootScope) {
|
|
var el = setup('view-title="{{ myTitle }}"', {myTitle: 'My Title'});
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {});
|
|
var spy = el.data('$ionNavViewController').title;
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
|
|
$rootScope.$broadcast('$ionicView.afterEnter', {});
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
|
|
el.scope().myTitle = 'My New Title';
|
|
$rootScope.$digest();
|
|
expect(spy).toHaveBeenCalledWith('My New Title');
|
|
spy.reset();
|
|
|
|
$rootScope.$broadcast('$ionicView.beforeLeave', {});
|
|
el.scope().myTitle = 'My Other New Title';
|
|
$rootScope.$digest();
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
}));
|
|
|
|
it('should only observe hideNavBar attr after afterEnter and before beforeLeave', inject(function($rootScope) {
|
|
var el = setup('hide-nav-bar="hide"', {hide: false});
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {});
|
|
var spy = el.data('$ionNavViewController').showBar;
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
|
|
$rootScope.$broadcast('$ionicView.afterEnter', {});
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
|
|
el.scope().hide = true;
|
|
$rootScope.$digest();
|
|
expect(spy).toHaveBeenCalledWith(false);
|
|
spy.reset();
|
|
|
|
$rootScope.$broadcast('$ionicView.beforeLeave', {});
|
|
el.scope().hide = false;
|
|
$rootScope.$digest();
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
}));
|
|
|
|
it('should only observe hideBackButton attr after afterEnter and before beforeLeave', inject(function($rootScope) {
|
|
var el = setup('hide-back-button="hide"', {hide: false});
|
|
$rootScope.$broadcast('$ionicView.beforeEnter', {});
|
|
var spy = el.data('$ionNavViewController').showBackButton;
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
|
|
$rootScope.$broadcast('$ionicView.afterEnter', {});
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
|
|
el.scope().hide = true;
|
|
$rootScope.$digest();
|
|
expect(spy).toHaveBeenCalledWith(false);
|
|
spy.reset();
|
|
|
|
$rootScope.$broadcast('$ionicView.beforeLeave', {});
|
|
el.scope().hide = false;
|
|
$rootScope.$digest();
|
|
expect(spy).not.toHaveBeenCalled();
|
|
spy.reset();
|
|
}));
|
|
|
|
});
|