blob: 9946906a98aa7f9e98fc8042aa28408defb916d9 [file] [log] [blame]
describe('uib-alert', function() {
var element, scope, $compile, $templateCache, $timeout;
beforeEach(module('ui.bootstrap.alert'));
beforeEach(module('template/alert/alert.html'));
beforeEach(inject(function($rootScope, _$compile_, _$templateCache_, _$timeout_) {
scope = $rootScope;
$compile = _$compile_;
$templateCache = _$templateCache_;
$timeout = _$timeout_;
element = angular.element(
'<div>' +
'<uib-alert ng-repeat="alert in alerts" type="{{alert.type}}"' +
'close="removeAlert($index)">{{alert.msg}}' +
'</uib-alert>' +
'</div>');
scope.alerts = [
{ msg:'foo', type:'success'},
{ msg:'bar', type:'error'},
{ msg:'baz'}
];
}));
function createAlerts() {
$compile(element)(scope);
scope.$digest();
return element.find('.alert');
}
function findCloseButton(index) {
return element.find('.close').eq(index);
}
function findContent(index) {
return element.find('div[ng-transclude] span').eq(index);
}
it('should expose the controller to the view', function() {
$templateCache.put('template/alert/alert.html', '<div>{{alert.text}}</div>');
element = $compile('<uib-alert></uib-alert>')(scope);
scope.$digest();
var ctrl = element.controller('uib-alert');
expect(ctrl).toBeDefined();
ctrl.text = 'foo';
scope.$digest();
expect(element.html()).toBe('foo');
});
it('should support custom templates', function() {
$templateCache.put('foo/bar.html', '<div>baz</div>');
element = $compile('<uib-alert template-url="foo/bar.html"></uib-alert>')(scope);
scope.$digest();
expect(element.html()).toBe('baz');
});
it('should generate alerts using ng-repeat', function() {
var alerts = createAlerts();
expect(alerts.length).toEqual(3);
});
it('should use correct classes for different alert types', function() {
var alerts = createAlerts();
expect(alerts.eq(0)).toHaveClass('alert-success');
expect(alerts.eq(1)).toHaveClass('alert-error');
expect(alerts.eq(2)).toHaveClass('alert-warning');
});
it('should respect alert type binding', function() {
var alerts = createAlerts();
expect(alerts.eq(0)).toHaveClass('alert-success');
scope.alerts[0].type = 'error';
scope.$digest();
expect(alerts.eq(0)).toHaveClass('alert-error');
});
it('should show the alert content', function() {
var alerts = createAlerts();
for (var i = 0, n = alerts.length; i < n; i++) {
expect(findContent(i).text()).toBe(scope.alerts[i].msg);
}
});
it('should show close buttons and have the dismissible class', function() {
var alerts = createAlerts();
for (var i = 0, n = alerts.length; i < n; i++) {
expect(findCloseButton(i).css('display')).not.toBe('none');
expect(alerts.eq(i)).toHaveClass('alert-dismissible');
}
});
it('should fire callback when closed', function() {
var alerts = createAlerts();
scope.$apply(function() {
scope.removeAlert = jasmine.createSpy();
});
expect(findCloseButton(0).css('display')).not.toBe('none');
findCloseButton(1).click();
expect(scope.removeAlert).toHaveBeenCalledWith(1);
});
it('should not show close button and have the dismissible class if no close callback specified', function() {
element = $compile('<uib-alert>No close</uib-alert>')(scope);
scope.$digest();
expect(findCloseButton(0)).toBeHidden();
expect(element).not.toHaveClass('alert-dismissible');
});
it('should be possible to add additional classes for alert', function() {
var element = $compile('<uib-alert class="alert-block" type="info">Default alert!</uib-alert>')(scope);
scope.$digest();
expect(element).toHaveClass('alert-block');
expect(element).toHaveClass('alert-info');
});
it('should close automatically if dismiss-on-timeout is defined on the element', function() {
scope.removeAlert = jasmine.createSpy();
$compile('<uib-alert close="removeAlert()" dismiss-on-timeout="500">Default alert!</uib-alert>')(scope);
scope.$digest();
$timeout.flush();
expect(scope.removeAlert).toHaveBeenCalled();
});
it('should not close immediately with a dynamic dismiss-on-timeout', function() {
scope.removeAlert = jasmine.createSpy();
scope.dismissTime = 500;
$compile('<uib-alert close="removeAlert()" dismiss-on-timeout="{{dismissTime}}">Default alert!</uib-alert>')(scope);
scope.$digest();
$timeout.flush(100);
expect(scope.removeAlert).not.toHaveBeenCalled();
$timeout.flush(500);
expect(scope.removeAlert).toHaveBeenCalled();
});
});
/* Deprecation tests below */
describe('alert deprecation', function() {
beforeEach(module('ui.bootstrap.alert'));
beforeEach(module('template/alert/alert.html'));
it('should suppress warning', function() {
module(function($provide) {
$provide.value('$alertSuppressWarning', true);
});
inject(function($compile, $log, $rootScope) {
spyOn($log, 'warn');
var element = '<alert></alert>';
element = $compile(element)($rootScope);
$rootScope.$digest();
expect($log.warn.calls.count()).toBe(0);
});
});
it('should give warning by default', inject(function($compile, $log, $rootScope) {
spyOn($log, 'warn');
var element = '<alert></alert>';
element = $compile(element)($rootScope);
$rootScope.$digest();
expect($log.warn.calls.count()).toBe(2);
expect($log.warn.calls.argsFor(0)).toEqual(['AlertController is now deprecated. Use UibAlertController instead.']);
expect($log.warn.calls.argsFor(1)).toEqual(['alert is now deprecated. Use uib-alert instead.']);
}));
});