define(['js/views/license', 'js/models/license', 'common/js/spec_helpers/template_helpers'], function(LicenseView, LicenseModel, TemplateHelpers) { describe('License view', function() { beforeEach(function() { TemplateHelpers.installTemplate('license-selector', true); this.model = new LicenseModel(); this.view = new LicenseView({model: this.model}); }); it('renders with no license', function() { this.view.render(); expect(this.view.$('li[data-license=all-rights-reserved] button')) .toHaveText('All Rights Reserved'); expect(this.view.$('li[data-license=all-rights-reserved] button')) .not.toHaveClass('is-selected'); expect(this.view.$('li[data-license=creative-commons] button')) .toHaveText('Creative Commons'); expect(this.view.$('li[data-license=creative-commons] button')) .not.toHaveClass('is-selected'); }); it('renders with the right license selected', function() { this.model.set('type', 'all-rights-reserved'); expect(this.view.$('li[data-license=all-rights-reserved] button')) .toHaveClass('is-selected'); expect(this.view.$('li[data-license=creative-commons] button')) .not.toHaveClass('is-selected'); }); it('switches license type on click', function() { var arrBtn = this.view.$('li[data-license=all-rights-reserved] button'); expect(this.model.get('type')).toBeNull(); arrBtn.click(); expect(this.model.get('type')).toEqual('all-rights-reserved'); // view has re-rendered, so get a new reference to the button arrBtn = this.view.$('li[data-license=all-rights-reserved] button'); expect(arrBtn).toHaveClass('is-selected'); // now switch to creative commons var ccBtn = this.view.$('li[data-license=creative-commons] button'); ccBtn.click(); expect(this.model.get('type')).toEqual('creative-commons'); // update references again arrBtn = this.view.$('li[data-license=all-rights-reserved] button'); ccBtn = this.view.$('li[data-license=creative-commons] button'); expect(arrBtn).not.toHaveClass('is-selected'); expect(ccBtn).toHaveClass('is-selected'); }); it('sets default license options when switching license types', function() { expect(this.model.get('options')).toEqual({}); var ccBtn = this.view.$('li[data-license=creative-commons] button'); ccBtn.click(); expect(this.model.get('options')).toEqual( {'ver': '4.0', 'BY': true, 'NC': true, 'ND': true, 'SA': false} ); var arrBtn = this.view.$('li[data-license=all-rights-reserved] button'); arrBtn.click(); expect(this.model.get('options')).toEqual({}); }); it('renders license options', function() { this.model.set({'type': 'creative-commons'}); expect(this.view.$('ul.license-options li[data-option=BY]')) .toContainText('Attribution'); expect(this.view.$('ul.license-options li[data-option=NC]')) .toContainText('Noncommercial'); expect(this.view.$('ul.license-options li[data-option=ND]')) .toContainText('No Derivatives'); expect(this.view.$('ul.license-options li[data-option=SA]')) .toContainText('Share Alike'); expect(this.view.$('ul.license-options li').length).toEqual(4); }); it('toggles boolean options on click', function() { this.view.$('li[data-license=creative-commons] button').click(); expect(this.model.get('options')).toEqual( {'ver': '4.0', 'BY': true, 'NC': true, 'ND': true, 'SA': false} ); // toggle NC option this.view.$('li[data-option=NC]').click(); expect(this.model.get('options')).toEqual( {'ver': '4.0', 'BY': true, 'NC': false, 'ND': true, 'SA': false} ); }); it("doesn't toggle disabled options", function() { this.view.$('li[data-license=creative-commons] button').click(); expect(this.model.get('options')).toEqual( {'ver': '4.0', 'BY': true, 'NC': true, 'ND': true, 'SA': false} ); var BY = this.view.$('li[data-option=BY]'); expect(BY).toHaveClass('is-disabled'); // try to toggle BY option BY.click(); // no change expect(this.model.get('options')).toEqual( {'ver': '4.0', 'BY': true, 'NC': true, 'ND': true, 'SA': false} ); }); it("doesn't allow simultaneous conflicting options", function() { this.view.$('li[data-license=creative-commons] button').click(); expect(this.model.get('options')).toEqual( {'ver': '4.0', 'BY': true, 'NC': true, 'ND': true, 'SA': false} ); // SA and ND conflict var SA = this.view.$('li[data-option=SA]'); // try to turn on SA option SA.click(); // ND should no longer be selected expect(this.model.get('options')).toEqual( {'ver': '4.0', 'BY': true, 'NC': true, 'ND': false, 'SA': true} ); // try to turn on ND option ND = this.view.$('li[data-option=ND]'); ND.click(); expect(this.model.get('options')).toEqual( {'ver': '4.0', 'BY': true, 'NC': true, 'ND': true, 'SA': false} ); }); it('has no preview by default', function() { this.view.render(); expect(this.view.$('.license-preview').length).toEqual(0); this.view.$('li[data-license=creative-commons] button').click(); expect(this.view.$('.license-preview').length).toEqual(0); }); it('displays a preview if showPreview is true', function() { this.view = new LicenseView({model: this.model, showPreview: true}); this.view.render(); expect(this.view.$('.license-preview').length).toEqual(1); // Expect default text to be "All Rights Reserved" expect(this.view.$('.license-preview')).toContainText('All Rights Reserved'); this.view.$('li[data-license=creative-commons] button').click(); expect(this.view.$('.license-preview').length).toEqual(1); expect(this.view.$('.license-preview')).toContainText('Some Rights Reserved'); }); }); });