define(['backbone', 'jquery', 'js/models/notification', 'js/views/notification', 'common/js/spec_helpers/template_helpers'], function(Backbone, $, NotificationModel, NotificationView, TemplateHelpers) { describe('NotificationView', function() { var createNotification, verifyTitle, verifyMessage, verifyDetails, verifyAction, notificationView; createNotification = function(modelVals) { var notificationModel = new NotificationModel(modelVals); notificationView = new NotificationView({ model: notificationModel }); notificationView.render(); return notificationView; }; verifyTitle = function(expectedTitle) { expect(notificationView.$('.message-title').text().trim()).toBe(expectedTitle); }; verifyMessage = function(expectedMessage) { expect(notificationView.$('.message-copy').text().trim()).toBe(expectedMessage); }; verifyDetails = function(expectedDetails) { var details = notificationView.$('.summary-item'); expect(details.length).toBe(expectedDetails.length); details.each(function(index) { expect($(this).text().trim()).toBe(expectedDetails[index]); }); }; verifyAction = function(expectedActionText) { var actionButton = notificationView.$('.action-primary'); if (expectedActionText) { expect(actionButton.text().trim()).toBe(expectedActionText); } else { expect(actionButton.length).toBe(0); } }; beforeEach(function() { setFixtures('
'); TemplateHelpers.installTemplate('templates/instructor/instructor_dashboard_2/notification'); }); it('has default values', function() { createNotification({}); expect(notificationView.$('div.message')).toHaveClass('message-confirmation'); verifyTitle(''); verifyDetails([]); verifyAction(null); }); it('can use an error type', function() { createNotification({type: 'error'}); expect(notificationView.$('div.message')).toHaveClass('message-error'); expect(notificationView.$('div.message')).not.toHaveClass('message-confirmation'); }); it('can specify a title', function() { createNotification({title: 'notification title'}); verifyTitle('notification title'); }); it('can specify a message', function() { createNotification({message: 'This is a dummy message'}); verifyMessage('This is a dummy message'); }); it('can specify details', function() { var expectedDetails = ['detail 1', 'detail 2']; createNotification({details: expectedDetails}); verifyDetails(expectedDetails); }); it('shows an action button if text and callback are provided', function() { createNotification({actionText: 'action text', actionCallback: function() {}}); verifyAction('action text'); }); it('shows an action button if only text is provided', function() { createNotification({actionText: 'action text'}); verifyAction('action text'); }); it('does not show an action button if text is not provided', function() { createNotification({actionCallback: function() {}}); verifyAction(null); }); it('triggers the callback when the action button is clicked', function() { var actionCallback = jasmine.createSpy('Spy on callback'); var view = createNotification({actionText: 'action text', actionCallback: actionCallback}); notificationView.$('button.action-primary').click(); expect(actionCallback).toHaveBeenCalledWith(view); }); }); });