This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/tests/unit/ember/resolver-test.js
2021-11-08 10:26:28 +01:00

261 lines
6.6 KiB
JavaScript

import { buildResolver, setResolverOption } from "discourse-common/resolver";
import { module, test } from "qunit";
let originalTemplates;
let resolver;
function lookupTemplate(assert, name, expectedTemplate, message) {
let parseName = resolver.parseName(name);
let result = resolver.resolveTemplate(parseName);
assert.strictEqual(result, expectedTemplate, message);
}
function setTemplates(lookupTemplateStrings) {
lookupTemplateStrings.forEach(function (lookupTemplateString) {
Ember.TEMPLATES[lookupTemplateString] = lookupTemplateString;
});
}
const DiscourseResolver = buildResolver("discourse");
module("Unit | Ember | resolver", function (hooks) {
hooks.beforeEach(function () {
originalTemplates = Ember.TEMPLATES;
Ember.TEMPLATES = {};
resolver = DiscourseResolver.create();
});
hooks.afterEach(function () {
Ember.TEMPLATES = originalTemplates;
});
test("finds templates in top level dir", function (assert) {
setTemplates(["foobar", "fooBar", "foo_bar", "foo.bar"]);
lookupTemplate(assert, "template:foobar", "foobar", "by lowcased name");
lookupTemplate(assert, "template:fooBar", "fooBar", "by camel cased name");
lookupTemplate(
assert,
"template:foo_bar",
"foo_bar",
"by underscored name"
);
lookupTemplate(assert, "template:foo.bar", "foo.bar", "by dotted name");
});
test("finds templates in first-level subdir", function (assert) {
setTemplates(["foo/bar_baz"]);
lookupTemplate(
assert,
"template:foo/bar_baz",
"foo/bar_baz",
"with subdir defined by slash"
);
lookupTemplate(
assert,
"template:foo.bar_baz",
"foo/bar_baz",
"with subdir defined by dot"
);
lookupTemplate(
assert,
"template:fooBarBaz",
"foo/bar_baz",
"with subdir defined by first camel case and the rest of camel cases converted to underscores"
);
lookupTemplate(
assert,
"template:foo_bar_baz",
"foo/bar_baz",
"with subdir defined by first underscore"
);
});
test("resolves precedence between overlapping top level dir and first level subdir templates", function (assert) {
setTemplates(["fooBar", "foo_bar", "foo.bar", "foo/bar"]);
lookupTemplate(
assert,
"template:foo.bar",
"foo/bar",
"preferring first level subdir for dotted name"
);
lookupTemplate(
assert,
"template:fooBar",
"fooBar",
"preferring top level dir for camel cased name"
);
lookupTemplate(
assert,
"template:foo_bar",
"foo_bar",
"preferring top level dir for underscored name"
);
});
test("finds templates in subdir deeper than one level", function (assert) {
setTemplates(["foo/bar/baz/qux"]);
lookupTemplate(
assert,
"template:foo/bar/baz/qux",
"foo/bar/baz/qux",
"for subdirs defined by slashes"
);
lookupTemplate(
assert,
"template:foo.bar.baz.qux",
"foo/bar/baz/qux",
"for subdirs defined by dots"
);
lookupTemplate(
assert,
"template:foo/bar/bazQux",
"foo/bar/baz/qux",
"for subdirs defined by slashes plus one camel case"
);
lookupTemplate(
assert,
"template:foo/bar/baz_qux",
"foo/bar/baz/qux",
"for subdirs defined by slashes plus one underscore"
);
lookupTemplate(
assert,
"template:fooBarBazQux",
undefined,
"but not for subdirs defined by more than one camel case"
);
lookupTemplate(
assert,
"template:foo_bar_baz_qux",
undefined,
"but not for subdirs defined by more than one underscore"
);
lookupTemplate(
assert,
"template:foo.bar.bazQux",
undefined,
"but not for subdirs defined by dots plus one camel case"
);
lookupTemplate(
assert,
"template:foo.bar.baz_qux",
undefined,
"but not for subdirs defined by dots plus one underscore"
);
});
test("resolves mobile templates to 'mobile/' namespace", function (assert) {
setTemplates(["mobile/foo", "bar", "mobile/bar", "baz"]);
setResolverOption("mobileView", true);
lookupTemplate(
assert,
"template:foo",
"mobile/foo",
"finding mobile version even if normal one is not present"
);
lookupTemplate(
assert,
"template:bar",
"mobile/bar",
"preferring mobile version when both mobile and normal versions are present"
);
lookupTemplate(
assert,
"template:baz",
"baz",
"falling back to a normal version when mobile version is not present"
);
});
test("resolves plugin templates to 'javascripts/' namespace", function (assert) {
setTemplates(["javascripts/foo", "bar", "javascripts/bar", "baz"]);
lookupTemplate(
assert,
"template:foo",
"javascripts/foo",
"finding plugin version even if normal one is not present"
);
lookupTemplate(
assert,
"template:bar",
"javascripts/bar",
"preferring plugin version when both versions are present"
);
lookupTemplate(
assert,
"template:baz",
"baz",
"falling back to a normal version when plugin version is not present"
);
});
test("resolves templates with 'admin' prefix to 'admin/templates/' namespace", function (assert) {
setTemplates([
"admin/templates/foo",
"adminBar",
"admin_bar",
"admin.bar",
"admin/templates/bar",
]);
lookupTemplate(
assert,
"template:adminFoo",
"admin/templates/foo",
"when prefix is separated by camel case"
);
lookupTemplate(
assert,
"template:admin_foo",
"admin/templates/foo",
"when prefix is separated by underscore"
);
lookupTemplate(
assert,
"template:admin.foo",
"admin/templates/foo",
"when prefix is separated by dot"
);
lookupTemplate(
assert,
"template:adminfoo",
undefined,
"but not when prefix is not separated in any way"
);
lookupTemplate(
assert,
"template:adminBar",
"adminBar",
"but not when template with the exact camel cased name exists"
);
lookupTemplate(
assert,
"template:admin_bar",
"admin_bar",
"but not when template with the exact underscored name exists"
);
lookupTemplate(
assert,
"template:admin.bar",
"admin.bar",
"but not when template with the exact dotted name exists"
);
});
test("returns 'not_found' template when template name cannot be resolved", function (assert) {
setTemplates(["not_found"]);
lookupTemplate(assert, "template:foo/bar/baz", "not_found", "");
});
});