/* global describe global it global beforeEach global angular global inject global expect */ 'use strict'; describe('directiveTemplate', function () { createDirectives(); var toaster, scope, $compile; beforeEach(function () { // load dependencies module('testApp'); module('toaster') // inject the toaster service inject(function (_toaster_, _$rootScope_, _$compile_) { toaster = _toaster_; scope = _$rootScope_; $compile = _$compile_; }); }); it('should load and render the referenced directive template text', function () { var container = compileContainer(); pop({ type: 'info', body: 'bind-template-only', bodyOutputType: 'directive' }); expect(container[0].innerText).toBe('here is some great new text! It was brought in via directive!'); }); it('should bind directiveData to the directive template', function () { var container = compileContainer(); pop({ type: 'info', body: 'bind-template-with-data', bodyOutputType: 'directive', directiveData: { name: 'Bob' } }); expect(container[0].innerText).toBe('Hello Bob'); }); it('should parse type string directiveData to an object', function () { var container = compileContainer(); pop({ type: 'info', body: 'bind-template-with-data', bodyOutputType: 'directive', directiveData: '{ "name": "Bob" }' }); expect(container[0].innerText).toBe('Hello Bob'); }); it('should render type number directiveData', function () { var container = compileContainer(); pop({ type: 'info', body: 'bind-template-with-numeric-data', bodyOutputType: 'directive', directiveData: 2 }); expect(container[0].innerText).toBe('1 + 1 = 2'); }); it('should bind Attribute-restricted templates', function () { var container = compileContainer(); pop({ type: 'info', body: 'bind-template-only', bodyOutputType: 'directive', directiveData: { name: 'Bob' } }); expect(container[0].innerText).toBe('here is some great new text! It was brought in via directive!'); }); it('should bind unrestricted templates', function () { var container = compileContainer(); pop({ type: 'info', body: 'unrestricted-template', bodyOutputType: 'directive' }); expect(container[0].innerText).toBe('Unrestricted Template'); }); it('should not bind Element-restricted templates', function () { var container = compileContainer(); pop({ type: 'info', body: 'element-template', bodyOutputType: 'directive' }); expect(container[0].innerText).toBe(''); expect(container[0].innerText).not.toBe('Element Template'); }); it('should not bind Class-restricted templates', function () { var container = compileContainer(); pop({ type: 'info', body: 'class-template', bodyOutputType: 'directive' }); expect(container[0].innerText).toBe(''); expect(container[0].innerText).not.toBe('Class Template'); }); it('should throw an error if directiveName argument is not passed via body', function () { var container = compileContainer(); var hasError = false; expect(container[0].innerText).toBe(''); try { pop({ type: 'info', bodyOutputType: 'directive' }); } catch (e) { expect(e.message).toBe('A valid directive name must be provided via the toast body argument when using bodyOutputType: directive'); hasError = true; } expect(container[0].innerText).toBe(''); expect(hasError).toBe(true); }); it('should throw an error if directiveName argument is an empty string', function () { var container = compileContainer(); var hasError = false; expect(container[0].innerText).toBe(''); try { pop({ type: 'info', body: '', bodyOutputType: 'directive' }); } catch (e) { expect(e.message).toBe('A valid directive name must be provided via the toast body argument when using bodyOutputType: directive'); hasError = true; } expect(container[0].innerText).toBe(''); expect(hasError).toBe(true); }); it('should throw an error if the directive could not be found', function () { var hasError = false; compileContainer(); try { pop({ type: 'info', body: 'non-existent-directive', bodyOutputType: 'directive' }); } catch (e) { expect(e.message).toBe('non-existent-directive could not be found.'); hasError = true; } expect(hasError).toBe(true); }); function compileContainer() { var element = angular.element(''); $compile(element)(scope); scope.$digest(); return element; } function pop(params) { toaster.pop(params); // force new toast to be rendered scope.$digest(); } function createDirectives() { angular.module('testApp', []) .directive('bindTemplateOnly', function () { return { restrict: 'A', template: 'here is some great new text! It was brought in via directive!' } }) .directive('bindTemplateWithData', function () { return { template: 'Hello {{directiveData.name}}' } }) .directive('bindTemplateWithNumericData', function () { return { template: '1 + 1 = {{directiveData}}' } }) .directive('elementTemplate', function () { return { restrict: 'E', template: 'Element Template' } }) .directive('classTemplate', function () { return { restrict: 'C', template: 'Class Template' } }) .directive('unrestrictedTemplate', function () { return { template: 'Unrestricted Template' } }); } })