import { run } from '@ember/runloop';
import { Component, getTemplate, setTemplates, hasTemplate, setTemplate } from 'ember-glimmer';
import bootstrap from '../../lib/system/bootstrap';
import {
runAppend,
runDestroy,
buildOwner,
moduleFor,
AbstractTestCase,
} from 'internal-test-helpers';
let component, fixture;
function checkTemplate(templateName, assert) {
run(() => bootstrap({ context: fixture, hasTemplate, setTemplate }));
let template = getTemplate(templateName);
let qunitFixture = document.querySelector('#qunit-fixture');
assert.ok(template, 'template is available on Ember.TEMPLATES');
assert.notOk(qunitFixture.querySelector('script'), 'script removed');
let owner = buildOwner();
owner.register('template:-top-level', template);
owner.register(
'component:-top-level',
Component.extend({
layoutName: '-top-level',
firstName: 'Tobias',
drug: 'teamocil',
})
);
component = owner.lookup('component:-top-level');
runAppend(component);
assert.equal(qunitFixture.textContent.trim(), 'Tobias takes teamocil', 'template works');
runDestroy(owner);
}
moduleFor(
'ember-templates: bootstrap',
class extends AbstractTestCase {
constructor() {
super();
fixture = document.getElementById('qunit-fixture');
}
teardown() {
setTemplates({});
fixture = component = null;
}
['@test template with data-template-name should add a new template to Ember.TEMPLATES'](
assert
) {
fixture.innerHTML =
'';
checkTemplate('funkyTemplate', assert);
}
['@test template with id instead of data-template-name should add a new template to Ember.TEMPLATES'](
assert
) {
fixture.innerHTML =
'';
checkTemplate('funkyTemplate', assert);
}
['@test template without data-template-name or id should default to application'](assert) {
fixture.innerHTML = '';
checkTemplate('application', assert);
}
// Add this test case, only for typeof Handlebars === 'object';
[`${
typeof Handlebars === 'object' ? '@test' : '@skip'
} template with type text/x-raw-handlebars should be parsed`](assert) {
fixture.innerHTML =
'';
run(() => bootstrap({ context: fixture, hasTemplate, setTemplate }));
let template = getTemplate('funkyTemplate');
assert.ok(template, 'template with name funkyTemplate available');
// This won't even work with Ember templates
assert.equal(template({ name: 'Tobias' }).trim(), 'Tobias');
}
['@test duplicated default application templates should throw exception'](assert) {
fixture.innerHTML =
'';
assert.throws(
() => bootstrap({ context: fixture, hasTemplate, setTemplate }),
/Template named "[^"]+" already exists\./,
'duplicate templates should not be allowed'
);
}
['@test default default application template and id application template present should throw exception'](
assert
) {
fixture.innerHTML =
'';
assert.throws(
() => bootstrap({ context: fixture, hasTemplate, setTemplate }),
/Template named "[^"]+" already exists\./,
'duplicate templates should not be allowed'
);
}
['@test default application template and data-template-name application template present should throw exception'](
assert
) {
fixture.innerHTML =
'';
assert.throws(
() => bootstrap({ context: fixture, hasTemplate, setTemplate }),
/Template named "[^"]+" already exists\./,
'duplicate templates should not be allowed'
);
}
['@test duplicated template id should throw exception'](assert) {
fixture.innerHTML =
'';
assert.throws(
() => bootstrap({ context: fixture, hasTemplate, setTemplate }),
/Template named "[^"]+" already exists\./,
'duplicate templates should not be allowed'
);
}
['@test duplicated template data-template-name should throw exception'](assert) {
fixture.innerHTML =
'';
assert.throws(
() => bootstrap({ context: fixture, hasTemplate, setTemplate }),
/Template named "[^"]+" already exists\./,
'duplicate templates should not be allowed'
);
}
}
);