angie
Version:
Angie: A Module-Based NodeJS Web Application Framework in ES6
229 lines (224 loc) • 9.38 kB
JavaScript
// Test Modules
import { expect } from 'chai';
import simple, { mock } from 'simple-mock';
// System Modules
import $Injector from 'angie-injector';
import $LogProvider from 'angie-log';
// Angie Modules
const TEST_ENV = global.TEST_ENV || 'src',
config = require(`../../../${TEST_ENV}/Config`).config,
app = require(`../../../${TEST_ENV}/Angie`).default,
$compile = require(`../../../${TEST_ENV}/factories/$Compile`).default,
$TemplateCache = require(`../../../${TEST_ENV}/factories/template-cache`),
$Util = require(`../../../${TEST_ENV}/util/util`).default;
describe('$compile', function() {
beforeEach(function() {
mock($LogProvider, 'error', () => false);
});
afterEach(simple.restore);
it(
'test compile called without a template returns an empty function',
function() {
expect($compile()).to.deep.eq($Util.noop);
expect($compile('')).to.deep.eq($Util.noop);
}
);
it('test compile returns a function', function() {
expect($compile('test')).to.be.a('function');
});
describe('template listeners', function() {
let scope;
beforeEach(function() {
mock($Injector, 'get', () => ({}));
mock($LogProvider, 'warn', function() {});
scope = {
test: 'test',
test1: 'test1',
test2: 'test2',
test4: {
test: 'test4'
},
test5: 20,
test6: 5
};
});
afterEach(simple.restore);
it('test no listeners', function() {
$compile('test')(scope).then(function(t) {
expect(t).to.eq('test');
});
});
it('test listener with no matches', function() {
$compile('{{{test3}}}')(scope).then(function(t) {
expect(t).to.eq('');
expect($LogProvider.warn).not.to.have.been.called;
});
});
it('test $templateCompile evaluates a single matched listener', function() {
$compile('{{{test}}}')(scope).then(function(t) {
expect(t).to.eq('test');
});
});
it('test $templateCompile evaluates multiple matched listeners', function() {
$compile('{{{test}}} {{{test1}}} {{{test2}}}')(scope).then(function(t) {
expect(t).to.eq('test test1 test2');
});
});
it('test $templateCompile evaluates deep listeners', function() {
$compile('{{{test4.test}}}')(scope).then(function(t) {
expect(t).to.eq('test4');
});
});
it('test listener with abnormal spacing', function() {
$compile('{{{ test }}}')(scope).then(function(t) {
expect(t).to.eq('test');
});
$compile(' {{{ test4. test }}}')(scope).then(
function(t) {
expect(t).to.eq(' test4');
}
);
});
it('test $templateCompile evaluates functional expressions', function() {
$compile('{{{test4.test.indexOf(\'test1\') > -1}}}')(scope).then(
function(t) {
expect(t).to.eq('false');
}
);
$compile('{{{[ test, test1 ].join(\' & \')}}}')(scope).then(
function(t) {
expect(t).to.eq('test & test1');
}
);
$compile('{{{test.toUpperCase()}}}')(scope).then(function(t) {
expect(t).to.eq('TEST');
});
});
it('test $templateCompile evaluates binary expressions', function() {
$compile('{{{test5}}}')(scope).then(function(t) {
expect(t).to.eq('20');
});
$compile('{{{test5 * test6}}}')(scope).then(function(t) {
expect(t).to.eq('100');
});
$compile('{{{test5 / test6}}}')(scope).then(function(t) {
expect(t).to.eq('4');
});
$compile('{{{test5 + test6}}}')(scope).then(function(t) {
expect(t).to.eq('25');
});
$compile('{{{test5 - test6}}}')(scope).then(function(t) {
expect(t).to.eq('15');
});
$compile('{{{(test5 + test6) * test6}}}')(scope).then(function(t) {
expect(t).to.eq('125');
});
});
});
describe('directive compilation', function() {
beforeEach(function() {
app.directive('testDir', {
restrict: 'C',
Controller: 'test',
link: function(scope, el, attrs, done) {
attrs.test = 'test';
done();
}
});
});
afterEach(function() {
app.$$tearDown('testDir');
});
it('test attribute unmatched directive', function() {
$compile('<div test-dir></div>')({}).then(function(t) {
expect(t).to.eq('<div test-dir=""></div>');
});
});
it('test attribute matched directive', function() {
app.directives.testDir.restrict = 'A';
$compile('<div test-dir></div>')({}).then(function(t) {
expect(t).to.eq('<div test-dir="" test="test"></div>');
});
});
it('test element matched directive', function() {
app.directives.testDir.restrict = 'E';
$compile('<test-dir></test-dir>')({}).then(function(t) {
expect(t).to.eq('<test-dir test="test"></test-dir>');
});
});
it('test class matched directive', function() {
$compile('<div class="testDir"></div>')({}).then(function(t) {
expect(t).to.eq('<div class="testDir" test="test"></div>');
});
});
it('test entire matched document', function() {
$compile(
'<!DOCTYPE html><html><head></head><body><div class="testDir"></div>' +
'</body></html>'
)({}).then(function(t) {
expect(t).to.eq(
'<!DOCTYPE html><html><head></head><body>' +
'<div class="testDir" test="test"></div></body></html>'
);
});
});
it('test no directive link function', function() {
delete app.directives.testDir.link;
$compile('<div class="testDir"></div>')({}).then(function(t) {
expect(t).to.eq('<div class="testDir"></div>');
});
});
describe('directive template keyword', function() {
beforeEach(function() {
delete app.directives.testDir.link;
app.directives.testDir.template = 'blah';
});
it('test directive template', function() {
$compile('<div class="testDir"></div>')({}).then(function(t) {
expect(t).to.eq('<div class="testDir">blah</div>');
});
});
it('test directive template with prepend', function() {
app.directives.testDir.prepend = true;
$compile('<div class="testDir">test</div>')({}).then(function(t) {
expect(t).to.eq('<div class="testDir">blahtest</div>');
});
});
it('test directive template with parser', function() {
app.directives.testDir.template = '{{{test}}}';
$compile('<div class="testDir"></div>')({
test: 'test'
}).then(function(t) {
expect(t).to.eq('<div class="testDir">test</div>');
});
});
});
describe('directive templatePath keyword', function() {
beforeEach(function() {
config.templateDirs = [];
delete app.directives.testDir.link;
});
afterEach(function() {
delete config.templateDirs;
});
it('test directive templatePath no ".html"', function() {
app.directives.testDir.templatePath = 'test';
$compile('<div class="testDir"></div>')({}).then(function(t) {
expect(t).to.eq('<div class="testDir"></div>');
});
});
// TODO this should be tested using a mocked service
it('test directive templatePath ".html"', function() {
app.directives.testDir.templatePath =
'html/testDirectiveTemplatePath.html';
mock($TemplateCache, '$$templateLoader', () => 'test');
$compile('<div class="testDir"></div>')({}).then(function(t) {
expect(t).to.eq('<div class="testDir">test</div>');
expect(
$TemplateCache.$$templateLoader.calls[0].args[0]
).to.eq(app.directives.testDir.templatePath);
});
});
});
});
});