From 60d0a6daeb9769fd901a702e580b7655bbb543af Mon Sep 17 00:00:00 2001
From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com>
Date: Thu, 6 Jun 2024 11:58:29 -0400
Subject: [PATCH] Update test format to modern qunit
---
package-lock.json | 12 +-
test-app/tests/unit/classify_test.js | 100 +-
test-app/tests/unit/dasherize_test.js | 58 +-
test-app/tests/unit/decamelize_test.js | 56 +-
.../unit/resolvers/classic/-setup-resolver.js | 25 +
.../unit/resolvers/classic/basic-test.js | 1203 +++++++----------
.../resolvers/classic/custom-prefixes-test.js | 25 +
.../unit/resolvers/classic/logging-test.js | 47 +
.../tests/unit/resolvers/classic/pods-test.js | 218 +++
test-app/tests/unit/underscore_test.js | 44 +-
10 files changed, 911 insertions(+), 877 deletions(-)
create mode 100644 test-app/tests/unit/resolvers/classic/-setup-resolver.js
create mode 100644 test-app/tests/unit/resolvers/classic/custom-prefixes-test.js
create mode 100644 test-app/tests/unit/resolvers/classic/logging-test.js
create mode 100644 test-app/tests/unit/resolvers/classic/pods-test.js
diff --git a/package-lock.json b/package-lock.json
index 88136ef4..23e7d772 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,11 +1,11 @@
{
"name": "ember-resolver",
- "version": "11.0.0",
+ "version": "11.0.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "version": "11.0.0",
+ "version": "11.0.1",
"workspaces": [
"addon",
"test-app"
@@ -29,7 +29,7 @@
},
"addon": {
"name": "ember-resolver",
- "version": "11.0.0",
+ "version": "11.0.1",
"license": "MIT",
"dependencies": {
"ember-cli-babel": "^7.26.11"
@@ -23650,7 +23650,7 @@
}
},
"test-app": {
- "version": "11.0.0",
+ "version": "11.0.1",
"license": "MIT",
"devDependencies": {
"@babel/eslint-parser": "^7.21.3",
@@ -23668,7 +23668,7 @@
"ember-disable-prototype-extensions": "^1.1.3",
"ember-load-initializers": "^2.1.2",
"ember-qunit": "^6.2.0",
- "ember-resolver": "11.0.0",
+ "ember-resolver": "11.0.1",
"ember-source": "~4.12.0",
"ember-source-channel-url": "^3.0.0",
"ember-try": "^2.0.0",
@@ -40461,7 +40461,7 @@
"ember-disable-prototype-extensions": "^1.1.3",
"ember-load-initializers": "^2.1.2",
"ember-qunit": "^6.2.0",
- "ember-resolver": "11.0.0",
+ "ember-resolver": "11.0.1",
"ember-source": "~4.12.0",
"ember-source-channel-url": "^3.0.0",
"ember-try": "^2.0.0",
diff --git a/test-app/tests/unit/classify_test.js b/test-app/tests/unit/classify_test.js
index 69d61d29..c4c5aebc 100644
--- a/test-app/tests/unit/classify_test.js
+++ b/test-app/tests/unit/classify_test.js
@@ -2,50 +2,58 @@ import { module } from 'qunit';
import { classify } from 'ember-resolver/string/index';
import createTestFunction from '../helpers/create-test-function';
-module('classify');
+module('classify', function () {
+ const test = createTestFunction(classify);
-const test = createTestFunction(classify);
-
-test('my favorite items', 'MyFavoriteItems', 'classify normal string');
-test('css-class-name', 'CssClassName', 'classify dasherized string');
-test('action_name', 'ActionName', 'classify underscored string');
-test(
- 'privateDocs/ownerInvoice',
- 'PrivateDocs/OwnerInvoice',
- 'classify namespaced camelized string'
-);
-test(
- 'private_docs/owner_invoice',
- 'PrivateDocs/OwnerInvoice',
- 'classify namespaced underscored string'
-);
-test(
- 'private-docs/owner-invoice',
- 'PrivateDocs/OwnerInvoice',
- 'classify namespaced dasherized string'
-);
-test('-view-registry', '_ViewRegistry', 'classify prefixed dasherized string');
-test(
- 'components/-text-field',
- 'Components/_TextField',
- 'classify namespaced prefixed dasherized string'
-);
-test('_Foo_Bar', '_FooBar', 'classify underscore-prefixed underscored string');
-test('_Foo-Bar', '_FooBar', 'classify underscore-prefixed dasherized string');
-test(
- '_foo/_bar',
- '_Foo/_Bar',
- 'classify underscore-prefixed-namespaced underscore-prefixed string'
-);
-test(
- '-foo/_bar',
- '_Foo/_Bar',
- 'classify dash-prefixed-namespaced underscore-prefixed string'
-);
-test(
- '-foo/-bar',
- '_Foo/_Bar',
- 'classify dash-prefixed-namespaced dash-prefixed string'
-);
-test('InnerHTML', 'InnerHTML', 'does nothing with classified string');
-test('_FooBar', '_FooBar', 'does nothing with classified prefixed string');
+ test('my favorite items', 'MyFavoriteItems', 'classify normal string');
+ test('css-class-name', 'CssClassName', 'classify dasherized string');
+ test('action_name', 'ActionName', 'classify underscored string');
+ test(
+ 'privateDocs/ownerInvoice',
+ 'PrivateDocs/OwnerInvoice',
+ 'classify namespaced camelized string'
+ );
+ test(
+ 'private_docs/owner_invoice',
+ 'PrivateDocs/OwnerInvoice',
+ 'classify namespaced underscored string'
+ );
+ test(
+ 'private-docs/owner-invoice',
+ 'PrivateDocs/OwnerInvoice',
+ 'classify namespaced dasherized string'
+ );
+ test(
+ '-view-registry',
+ '_ViewRegistry',
+ 'classify prefixed dasherized string'
+ );
+ test(
+ 'components/-text-field',
+ 'Components/_TextField',
+ 'classify namespaced prefixed dasherized string'
+ );
+ test(
+ '_Foo_Bar',
+ '_FooBar',
+ 'classify underscore-prefixed underscored string'
+ );
+ test('_Foo-Bar', '_FooBar', 'classify underscore-prefixed dasherized string');
+ test(
+ '_foo/_bar',
+ '_Foo/_Bar',
+ 'classify underscore-prefixed-namespaced underscore-prefixed string'
+ );
+ test(
+ '-foo/_bar',
+ '_Foo/_Bar',
+ 'classify dash-prefixed-namespaced underscore-prefixed string'
+ );
+ test(
+ '-foo/-bar',
+ '_Foo/_Bar',
+ 'classify dash-prefixed-namespaced dash-prefixed string'
+ );
+ test('InnerHTML', 'InnerHTML', 'does nothing with classified string');
+ test('_FooBar', '_FooBar', 'does nothing with classified prefixed string');
+});
diff --git a/test-app/tests/unit/dasherize_test.js b/test-app/tests/unit/dasherize_test.js
index 37aab09b..3d92a3ed 100644
--- a/test-app/tests/unit/dasherize_test.js
+++ b/test-app/tests/unit/dasherize_test.js
@@ -2,31 +2,35 @@ import { module } from 'qunit';
import { dasherize } from 'ember-resolver/string/index';
import createTestFunction from '../helpers/create-test-function';
-module('dasherize');
+module('dasherize', function () {
+ const test = createTestFunction(dasherize);
-const test = createTestFunction(dasherize);
-
-test('my favorite items', 'my-favorite-items', 'dasherize normal string');
-test('css-class-name', 'css-class-name', 'does nothing with dasherized string');
-test('action_name', 'action-name', 'dasherize underscored string');
-test('innerHTML', 'inner-html', 'dasherize camelcased string');
-test(
- 'toString',
- 'to-string',
- 'dasherize string that is the property name of Object.prototype'
-);
-test(
- 'PrivateDocs/OwnerInvoice',
- 'private-docs/owner-invoice',
- 'dasherize namespaced classified string'
-);
-test(
- 'privateDocs/ownerInvoice',
- 'private-docs/owner-invoice',
- 'dasherize namespaced camelized string'
-);
-test(
- 'private_docs/owner_invoice',
- 'private-docs/owner-invoice',
- 'dasherize namespaced underscored string'
-);
+ test('my favorite items', 'my-favorite-items', 'dasherize normal string');
+ test(
+ 'css-class-name',
+ 'css-class-name',
+ 'does nothing with dasherized string'
+ );
+ test('action_name', 'action-name', 'dasherize underscored string');
+ test('innerHTML', 'inner-html', 'dasherize camelcased string');
+ test(
+ 'toString',
+ 'to-string',
+ 'dasherize string that is the property name of Object.prototype'
+ );
+ test(
+ 'PrivateDocs/OwnerInvoice',
+ 'private-docs/owner-invoice',
+ 'dasherize namespaced classified string'
+ );
+ test(
+ 'privateDocs/ownerInvoice',
+ 'private-docs/owner-invoice',
+ 'dasherize namespaced camelized string'
+ );
+ test(
+ 'private_docs/owner_invoice',
+ 'private-docs/owner-invoice',
+ 'dasherize namespaced underscored string'
+ );
+});
diff --git a/test-app/tests/unit/decamelize_test.js b/test-app/tests/unit/decamelize_test.js
index 4d18aa9e..9d6d6d37 100644
--- a/test-app/tests/unit/decamelize_test.js
+++ b/test-app/tests/unit/decamelize_test.js
@@ -2,30 +2,34 @@ import { module } from 'qunit';
import { decamelize } from 'ember-resolver/string/index';
import createTestFunction from '../helpers/create-test-function';
-module('decamelize');
+module('decamelize', function () {
+ const test = createTestFunction(decamelize);
-const test = createTestFunction(decamelize);
-
-test(
- 'my favorite items',
- 'my favorite items',
- 'does nothing with normal string'
-);
-test('css-class-name', 'css-class-name', 'does nothing with dasherized string');
-test('action_name', 'action_name', 'does nothing with underscored string');
-test(
- 'innerHTML',
- 'inner_html',
- 'converts a camelized string into all lower case separated by underscores.'
-);
-test('size160Url', 'size160_url', 'decamelizes strings with numbers');
-test(
- 'PrivateDocs/OwnerInvoice',
- 'private_docs/owner_invoice',
- 'decamelize namespaced classified string'
-);
-test(
- 'privateDocs/ownerInvoice',
- 'private_docs/owner_invoice',
- 'decamelize namespaced camelized string'
-);
+ test(
+ 'my favorite items',
+ 'my favorite items',
+ 'does nothing with normal string'
+ );
+ test(
+ 'css-class-name',
+ 'css-class-name',
+ 'does nothing with dasherized string'
+ );
+ test('action_name', 'action_name', 'does nothing with underscored string');
+ test(
+ 'innerHTML',
+ 'inner_html',
+ 'converts a camelized string into all lower case separated by underscores.'
+ );
+ test('size160Url', 'size160_url', 'decamelizes strings with numbers');
+ test(
+ 'PrivateDocs/OwnerInvoice',
+ 'private_docs/owner_invoice',
+ 'decamelize namespaced classified string'
+ );
+ test(
+ 'privateDocs/ownerInvoice',
+ 'private_docs/owner_invoice',
+ 'decamelize namespaced camelized string'
+ );
+});
diff --git a/test-app/tests/unit/resolvers/classic/-setup-resolver.js b/test-app/tests/unit/resolvers/classic/-setup-resolver.js
new file mode 100644
index 00000000..06e85bee
--- /dev/null
+++ b/test-app/tests/unit/resolvers/classic/-setup-resolver.js
@@ -0,0 +1,25 @@
+import Resolver, { ModuleRegistry } from 'ember-resolver';
+
+export let resolver;
+export let loader;
+
+export function setupResolver(options = {}) {
+ if (!options.namespace) {
+ options.namespace = { modulePrefix: 'appkit' };
+ }
+ loader = {
+ entries: Object.create(null),
+ define(id, deps, callback) {
+ if (deps.length > 0) {
+ throw new Error('Test Module loader does not support dependencies');
+ }
+ this.entries[id] = callback;
+ },
+ };
+ options._moduleRegistry = new ModuleRegistry(loader.entries);
+ options._moduleRegistry.get = function (moduleName) {
+ return loader.entries[moduleName]();
+ };
+
+ resolver = Resolver.create(options);
+}
diff --git a/test-app/tests/unit/resolvers/classic/basic-test.js b/test-app/tests/unit/resolvers/classic/basic-test.js
index 372788bf..1e1f9764 100644
--- a/test-app/tests/unit/resolvers/classic/basic-test.js
+++ b/test-app/tests/unit/resolvers/classic/basic-test.js
@@ -2,949 +2,652 @@
import Ember from 'ember';
import { module, test } from 'qunit';
-import Resolver, { ModuleRegistry } from 'ember-resolver';
-
-let originalConsoleInfo, logCalls, resolver, loader;
-
-function setupResolver(options = {}) {
- if (!options.namespace) {
- options.namespace = { modulePrefix: 'appkit' };
- }
- loader = {
- entries: Object.create(null),
- define(id, deps, callback) {
- if (deps.length > 0) {
- throw new Error('Test Module loader does not support dependencies');
- }
- this.entries[id] = callback;
- },
- };
- options._moduleRegistry = new ModuleRegistry(loader.entries);
- options._moduleRegistry.get = function (moduleName) {
- return loader.entries[moduleName]();
- };
-
- resolver = Resolver.create(options);
-}
-
-module('ember-resolver/resolvers/classic', {
- beforeEach() {
+import { setupResolver, resolver, loader } from './-setup-resolver';
+
+let originalConsoleInfo;
+
+module('ember-resolver/resolvers/classic', function (hooks) {
+ hooks.beforeEach(function () {
setupResolver();
- },
+ });
- afterEach() {
+ hooks.afterEach(function () {
if (originalConsoleInfo) {
console.info = originalConsoleInfo;
}
- },
-});
-
-// ember @ 3.3 breaks this: https://github.com/emberjs/ember.js/commit/b8613c20289cc8a730e181c4c51ecfc4b6836052#r29790209
-// ember @ 3.4.0-beta.1 restores this: https://github.com/emberjs/ember.js/commit/ddd8d9b9d9f6d315185a34802618a666bb3aeaac
-// test('does not require `namespace` to exist at `init` time', function(assert) {
-// assert.expect(0);
-
-// Resolver.create({ namespace: '' });
-// });
-
-test('can lookup something', function (assert) {
- assert.expect(2);
-
- loader.define('appkit/adapters/post', [], function () {
- assert.ok(true, 'adapter was invoked properly');
-
- return {};
});
- var adapter = resolver.resolve('adapter:post');
+ // ember @ 3.3 breaks this: https://github.com/emberjs/ember.js/commit/b8613c20289cc8a730e181c4c51ecfc4b6836052#r29790209
+ // ember @ 3.4.0-beta.1 restores this: https://github.com/emberjs/ember.js/commit/ddd8d9b9d9f6d315185a34802618a666bb3aeaac
+ // test('does not require `namespace` to exist at `init` time', function(assert) {
+ // assert.expect(0);
- assert.ok(adapter, 'adapter was returned');
-});
+ // Resolver.create({ namespace: '' });
+ // });
-test('can lookup something in another namespace', function (assert) {
- assert.expect(3);
+ test('can lookup something', function (assert) {
+ assert.expect(2);
- let expected = {};
+ loader.define('appkit/adapters/post', [], function () {
+ assert.ok(true, 'adapter was invoked properly');
- loader.define('other/adapters/post', [], function () {
- assert.ok(true, 'adapter was invoked properly');
+ return {};
+ });
- return {
- default: expected,
- };
- });
-
- var adapter = resolver.resolve('other@adapter:post');
+ var adapter = resolver.resolve('adapter:post');
- assert.ok(adapter, 'adapter was returned');
- assert.equal(adapter, expected, 'default export was returned');
-});
-
-test('can lookup something in another namespace with an @ scope', function (assert) {
- assert.expect(3);
-
- let expected = {};
-
- loader.define('@scope/other/adapters/post', [], function () {
- assert.ok(true, 'adapter was invoked properly');
-
- return {
- default: expected,
- };
+ assert.ok(adapter, 'adapter was returned');
});
- var adapter = resolver.resolve('@scope/other@adapter:post');
+ test('can lookup something in another namespace', function (assert) {
+ assert.expect(3);
- assert.ok(adapter, 'adapter was returned');
- assert.equal(adapter, expected, 'default export was returned');
-});
+ let expected = {};
-test('can lookup something with an @ sign', function (assert) {
- assert.expect(3);
+ loader.define('other/adapters/post', [], function () {
+ assert.ok(true, 'adapter was invoked properly');
- let expected = {};
- loader.define('appkit/helpers/@content-helper', [], function () {
- assert.ok(true, 'helper was invoked properly');
+ return {
+ default: expected,
+ };
+ });
- return { default: expected };
- });
+ var adapter = resolver.resolve('other@adapter:post');
- var helper = resolver.resolve('helper:@content-helper');
-
- assert.ok(helper, 'helper was returned');
- assert.equal(helper, expected, 'default export was returned');
-});
-
-test('can lookup something in another namespace with different syntax', function (assert) {
- assert.expect(3);
-
- let expected = {};
- loader.define('other/adapters/post', [], function () {
- assert.ok(true, 'adapter was invoked properly');
-
- return { default: expected };
+ assert.ok(adapter, 'adapter was returned');
+ assert.equal(adapter, expected, 'default export was returned');
});
- var adapter = resolver.resolve('adapter:other@post');
+ test('can lookup something in another namespace with an @ scope', function (assert) {
+ assert.expect(3);
- assert.ok(adapter, 'adapter was returned');
- assert.equal(adapter, expected, 'default export was returned');
-});
+ let expected = {};
-test('can lookup something in another namespace with an @ scope with different syntax', function (assert) {
- assert.expect(3);
+ loader.define('@scope/other/adapters/post', [], function () {
+ assert.ok(true, 'adapter was invoked properly');
- let expected = {};
- loader.define('@scope/other/adapters/post', [], function () {
- assert.ok(true, 'adapter was invoked properly');
+ return {
+ default: expected,
+ };
+ });
- return { default: expected };
- });
-
- var adapter = resolver.resolve('adapter:@scope/other@post');
-
- assert.ok(adapter, 'adapter was returned');
- assert.equal(adapter, expected, 'default export was returned');
-});
-
-test('can lookup a view in another namespace', function (assert) {
- assert.expect(3);
-
- let expected = { isViewFactory: true };
- loader.define('other/views/post', [], function () {
- assert.ok(true, 'view was invoked properly');
-
- return { default: expected };
- });
-
- var view = resolver.resolve('other@view:post');
-
- assert.ok(view, 'view was returned');
- assert.equal(view, expected, 'default export was returned');
-});
-
-test('can lookup a view in another namespace with an @ scope', function (assert) {
- assert.expect(3);
-
- let expected = { isViewFactory: true };
- loader.define('@scope/other/views/post', [], function () {
- assert.ok(true, 'view was invoked properly');
+ var adapter = resolver.resolve('@scope/other@adapter:post');
- return { default: expected };
+ assert.ok(adapter, 'adapter was returned');
+ assert.equal(adapter, expected, 'default export was returned');
});
- var view = resolver.resolve('@scope/other@view:post');
+ test('can lookup something with an @ sign', function (assert) {
+ assert.expect(3);
- assert.ok(view, 'view was returned');
- assert.equal(view, expected, 'default export was returned');
-});
+ let expected = {};
+ loader.define('appkit/helpers/@content-helper', [], function () {
+ assert.ok(true, 'helper was invoked properly');
-test('can lookup a view in another namespace with different syntax', function (assert) {
- assert.expect(3);
+ return { default: expected };
+ });
- let expected = { isViewFactory: true };
- loader.define('other/views/post', [], function () {
- assert.ok(true, 'view was invoked properly');
+ var helper = resolver.resolve('helper:@content-helper');
- return { default: expected };
+ assert.ok(helper, 'helper was returned');
+ assert.equal(helper, expected, 'default export was returned');
});
- var view = resolver.resolve('view:other@post');
+ test('can lookup something in another namespace with different syntax', function (assert) {
+ assert.expect(3);
- assert.ok(view, 'view was returned');
- assert.equal(view, expected, 'default export was returned');
-});
+ let expected = {};
+ loader.define('other/adapters/post', [], function () {
+ assert.ok(true, 'adapter was invoked properly');
-test('can lookup a view in another namespace with an @ scope with different syntax', function (assert) {
- assert.expect(3);
+ return { default: expected };
+ });
- let expected = { isViewFactory: true };
- loader.define('@scope/other/views/post', [], function () {
- assert.ok(true, 'view was invoked properly');
+ var adapter = resolver.resolve('adapter:other@post');
- return { default: expected };
+ assert.ok(adapter, 'adapter was returned');
+ assert.equal(adapter, expected, 'default export was returned');
});
- var view = resolver.resolve('view:@scope/other@post');
+ test('can lookup something in another namespace with an @ scope with different syntax', function (assert) {
+ assert.expect(3);
- assert.ok(view, 'view was returned');
- assert.equal(view, expected, 'default export was returned');
-});
+ let expected = {};
+ loader.define('@scope/other/adapters/post', [], function () {
+ assert.ok(true, 'adapter was invoked properly');
-test('can lookup a component template in another namespace with different syntax', function (assert) {
- assert.expect(2);
+ return { default: expected };
+ });
- let expected = { isTemplate: true };
- loader.define('other/templates/components/foo-bar', [], function () {
- assert.ok(true, 'template was looked up properly');
+ var adapter = resolver.resolve('adapter:@scope/other@post');
- return { default: expected };
+ assert.ok(adapter, 'adapter was returned');
+ assert.equal(adapter, expected, 'default export was returned');
});
- var template = resolver.resolve('template:components/other@foo-bar');
+ test('can lookup a view in another namespace', function (assert) {
+ assert.expect(3);
- assert.equal(template, expected, 'default export was returned');
-});
+ let expected = { isViewFactory: true };
+ loader.define('other/views/post', [], function () {
+ assert.ok(true, 'view was invoked properly');
-test('can lookup a component template in another namespace with an @ scope with different syntax', function (assert) {
- assert.expect(2);
+ return { default: expected };
+ });
- let expected = { isTemplate: true };
- loader.define('@scope/other/templates/components/foo-bar', [], function () {
- assert.ok(true, 'template was looked up properly');
+ var view = resolver.resolve('other@view:post');
- return { default: expected };
+ assert.ok(view, 'view was returned');
+ assert.equal(view, expected, 'default export was returned');
});
- var template = resolver.resolve('template:components/@scope/other@foo-bar');
+ test('can lookup a view in another namespace with an @ scope', function (assert) {
+ assert.expect(3);
- assert.equal(template, expected, 'default export was returned');
-});
+ let expected = { isViewFactory: true };
+ loader.define('@scope/other/views/post', [], function () {
+ assert.ok(true, 'view was invoked properly');
-test('can lookup a view', function (assert) {
- assert.expect(3);
+ return { default: expected };
+ });
- let expected = { isViewFactory: true };
- loader.define('appkit/views/queue-list', [], function () {
- assert.ok(true, 'view was invoked properly');
+ var view = resolver.resolve('@scope/other@view:post');
- return { default: expected };
+ assert.ok(view, 'view was returned');
+ assert.equal(view, expected, 'default export was returned');
});
- var view = resolver.resolve('view:queue-list');
-
- assert.ok(view, 'view was returned');
- assert.equal(view, expected, 'default export was returned');
-});
+ test('can lookup a view in another namespace with different syntax', function (assert) {
+ assert.expect(3);
-test('can lookup a helper', function (assert) {
- assert.expect(3);
-
- let expected = { isHelperInstance: true };
- loader.define('appkit/helpers/reverse-list', [], function () {
- assert.ok(true, 'helper was invoked properly');
-
- return { default: expected };
- });
-
- var helper = resolver.resolve('helper:reverse-list');
-
- assert.ok(helper, 'helper was returned');
- assert.equal(helper, expected, 'default export was returned');
-});
+ let expected = { isViewFactory: true };
+ loader.define('other/views/post', [], function () {
+ assert.ok(true, 'view was invoked properly');
-test('can lookup an engine', function (assert) {
- assert.expect(3);
+ return { default: expected };
+ });
- let expected = {};
- loader.define('appkit/engine', [], function () {
- assert.ok(true, 'engine was invoked properly');
+ var view = resolver.resolve('view:other@post');
- return { default: expected };
+ assert.ok(view, 'view was returned');
+ assert.equal(view, expected, 'default export was returned');
});
- let engine = resolver.resolve('engine:appkit');
+ test('can lookup a view in another namespace with an @ scope with different syntax', function (assert) {
+ assert.expect(3);
- assert.ok(engine, 'engine was returned');
- assert.equal(engine, expected, 'default export was returned');
-});
+ let expected = { isViewFactory: true };
+ loader.define('@scope/other/views/post', [], function () {
+ assert.ok(true, 'view was invoked properly');
-test('can lookup an engine from a scoped package', function (assert) {
- assert.expect(3);
+ return { default: expected };
+ });
- let expected = {};
- loader.define('@some-scope/some-module/engine', [], function () {
- assert.ok(true, 'engine was invoked properly');
+ var view = resolver.resolve('view:@scope/other@post');
- return { default: expected };
+ assert.ok(view, 'view was returned');
+ assert.equal(view, expected, 'default export was returned');
});
- var engine = resolver.resolve('engine:@some-scope/some-module');
-
- assert.ok(engine, 'engine was returned');
- assert.equal(engine, expected, 'default export was returned');
-});
-
-test('can lookup a route-map', function (assert) {
- assert.expect(3);
-
- let expected = { isRouteMap: true };
- loader.define('appkit/routes', [], function () {
- assert.ok(true, 'route-map was invoked properly');
-
- return { default: expected };
- });
+ test('can lookup a component template in another namespace with different syntax', function (assert) {
+ assert.expect(2);
- let routeMap = resolver.resolve('route-map:appkit');
+ let expected = { isTemplate: true };
+ loader.define('other/templates/components/foo-bar', [], function () {
+ assert.ok(true, 'template was looked up properly');
- assert.ok(routeMap, 'route-map was returned');
- assert.equal(routeMap, expected, 'default export was returned');
-});
+ return { default: expected };
+ });
-// the assert.expectWarning helper no longer works
-test.skip('warns if looking up a camelCase helper that has a dasherized module present', function (assert) {
- assert.expect(1);
+ var template = resolver.resolve('template:components/other@foo-bar');
- loader.define('appkit/helpers/reverse-list', [], function () {
- return { default: { isHelperInstance: true } };
+ assert.equal(template, expected, 'default export was returned');
});
- var helper = resolver.resolve('helper:reverseList');
+ test('can lookup a component template in another namespace with an @ scope with different syntax', function (assert) {
+ assert.expect(2);
- assert.ok(!helper, 'no helper was returned');
- // assert.expectWarning('Attempted to lookup "helper:reverseList" which was not found. In previous versions of ember-resolver, a bug would have caused the module at "appkit/helpers/reverse-list" to be returned for this camel case helper name. This has been fixed. Use the dasherized name to resolve the module that would have been returned in previous versions.');
-});
+ let expected = { isTemplate: true };
+ loader.define('@scope/other/templates/components/foo-bar', [], function () {
+ assert.ok(true, 'template was looked up properly');
-test('errors if lookup of a route-map does not specify isRouteMap', function (assert) {
- assert.expect(2);
+ return { default: expected };
+ });
- let expected = { isRouteMap: false };
- loader.define('appkit/routes', [], function () {
- assert.ok(true, 'route-map was invoked properly');
+ var template = resolver.resolve('template:components/@scope/other@foo-bar');
- return { default: expected };
+ assert.equal(template, expected, 'default export was returned');
});
- assert.throws(() => {
- resolver.resolve('route-map:appkit');
- }, /The route map for appkit should be wrapped by 'buildRoutes' before exporting/);
-});
+ test('can lookup a view', function (assert) {
+ assert.expect(3);
-test("will return the raw value if no 'default' is available", function (assert) {
- loader.define('appkit/fruits/orange', [], function () {
- return 'is awesome';
- });
+ let expected = { isViewFactory: true };
+ loader.define('appkit/views/queue-list', [], function () {
+ assert.ok(true, 'view was invoked properly');
- assert.equal(
- resolver.resolve('fruit:orange'),
- 'is awesome',
- 'adapter was returned'
- );
-});
+ return { default: expected };
+ });
-test("will unwrap the 'default' export automatically", function (assert) {
- loader.define('appkit/fruits/orange', [], function () {
- return { default: 'is awesome' };
- });
+ var view = resolver.resolve('view:queue-list');
- assert.equal(
- resolver.resolve('fruit:orange'),
- 'is awesome',
- 'adapter was returned'
- );
-});
-
-test('router:main is hard-coded to prefix/router.js', function (assert) {
- assert.expect(1);
-
- loader.define('appkit/router', [], function () {
- assert.ok(true, 'router:main was looked up');
- return 'whatever';
+ assert.ok(view, 'view was returned');
+ assert.equal(view, expected, 'default export was returned');
});
- resolver.resolve('router:main');
-});
+ test('can lookup a helper', function (assert) {
+ assert.expect(3);
-test('store:main is looked up as prefix/store', function (assert) {
- assert.expect(1);
+ let expected = { isHelperInstance: true };
+ loader.define('appkit/helpers/reverse-list', [], function () {
+ assert.ok(true, 'helper was invoked properly');
- loader.define('appkit/store', [], function () {
- assert.ok(true, 'store:main was looked up');
- return 'whatever';
- });
+ return { default: expected };
+ });
- resolver.resolve('store:main');
-});
-
-test('store:posts as prefix/stores/post', function (assert) {
- assert.expect(1);
+ var helper = resolver.resolve('helper:reverse-list');
- loader.define('appkit/stores/post', [], function () {
- assert.ok(true, 'store:post was looked up');
- return 'whatever';
+ assert.ok(helper, 'helper was returned');
+ assert.equal(helper, expected, 'default export was returned');
});
- resolver.resolve('store:post');
-});
+ test('can lookup an engine', function (assert) {
+ assert.expect(3);
-test('will raise error if both dasherized and underscored modules exist', function (assert) {
- loader.define('appkit/big-bands/steve-miller-band', [], function () {
- assert.ok(true, 'dasherized version looked up');
- return 'whatever';
- });
+ let expected = {};
+ loader.define('appkit/engine', [], function () {
+ assert.ok(true, 'engine was invoked properly');
- loader.define('appkit/big_bands/steve_miller_band', [], function () {
- assert.ok(false, 'underscored version looked up');
- return 'whatever';
- });
+ return { default: expected };
+ });
- try {
- resolver.resolve('big-band:steve-miller-band');
- } catch (e) {
- assert.equal(
- e.message,
- `Ambiguous module names: 'appkit/big-bands/steve-miller-band' and 'appkit/big_bands/steve_miller_band'`,
- 'error with a descriptive value is thrown'
- );
- }
-});
+ let engine = resolver.resolve('engine:appkit');
-test('will lookup an underscored version of the module name when the dasherized version is not found', function (assert) {
- assert.expect(1);
-
- loader.define('appkit/big_bands/steve_miller_band', [], function () {
- assert.ok(true, 'underscored version looked up properly');
- return 'whatever';
+ assert.ok(engine, 'engine was returned');
+ assert.equal(engine, expected, 'default export was returned');
});
- resolver.resolve('big-band:steve-miller-band');
-});
-
-test('can lookup templates with mixed naming moduleName', function (assert) {
- assert.expect(1);
+ test('can lookup an engine from a scoped package', function (assert) {
+ assert.expect(3);
- loader.define('appkit/bands/_steve-miller-band', [], function () {
- assert.ok(true, 'underscored version looked up properly');
+ let expected = {};
+ loader.define('@some-scope/some-module/engine', [], function () {
+ assert.ok(true, 'engine was invoked properly');
- return 'whatever';
- });
-
- resolver.resolve('band:-steve-miller-band');
-
- // TODO: these helpers not not compatible with modern ember
- // assert.expectDeprecation('Modules should not contain underscores. Attempted to lookup "appkit/bands/-steve-miller-band" which was not found. Please rename "appkit/bands/_steve-miller-band" to "appkit/bands/-steve-miller-band" instead.');
-});
+ return { default: expected };
+ });
-test('can lookup templates via Ember.TEMPLATES', function (assert) {
- Ember.TEMPLATES['application'] = function () {
- return '
herp
';
- };
+ var engine = resolver.resolve('engine:@some-scope/some-module');
- var template = resolver.resolve('template:application');
- assert.ok(template, 'template should resolve');
-});
-
-test('it provides eachForType which invokes the callback for each item found', function (assert) {
- function orange() {}
- loader.define('appkit/fruits/orange', [], function () {
- return { default: orange };
- });
-
- function apple() {}
- loader.define('appkit/fruits/apple', [], function () {
- return { default: apple };
+ assert.ok(engine, 'engine was returned');
+ assert.equal(engine, expected, 'default export was returned');
});
- function other() {}
- loader.define('appkit/stuffs/other', [], function () {
- return { default: other };
- });
+ test('can lookup a route-map', function (assert) {
+ assert.expect(3);
- var items = resolver.knownForType('fruit');
+ let expected = { isRouteMap: true };
+ loader.define('appkit/routes', [], function () {
+ assert.ok(true, 'route-map was invoked properly');
- assert.deepEqual(items, {
- 'fruit:orange': true,
- 'fruit:apple': true,
- });
-});
+ return { default: expected };
+ });
-test('eachForType can find both pod and non-pod factories', function (assert) {
- function orange() {}
- loader.define('appkit/fruits/orange', [], function () {
- return { default: orange };
- });
+ let routeMap = resolver.resolve('route-map:appkit');
- function lemon() {}
- loader.define('appkit/lemon/fruit', [], function () {
- return { default: lemon };
+ assert.ok(routeMap, 'route-map was returned');
+ assert.equal(routeMap, expected, 'default export was returned');
});
- var items = resolver.knownForType('fruit');
+ // the assert.expectWarning helper no longer works
+ test.skip('warns if looking up a camelCase helper that has a dasherized module present', function (assert) {
+ assert.expect(1);
- assert.deepEqual(items, {
- 'fruit:orange': true,
- 'fruit:lemon': true,
- });
-});
+ loader.define('appkit/helpers/reverse-list', [], function () {
+ return { default: { isHelperInstance: true } };
+ });
-test('if shouldWrapInClassFactory returns true a wrapped object is returned', function (assert) {
- resolver.shouldWrapInClassFactory = function (defaultExport, parsedName) {
- assert.equal(defaultExport, 'foo');
- assert.equal(parsedName.fullName, 'string:foo');
+ var helper = resolver.resolve('helper:reverseList');
- return true;
- };
-
- loader.define('appkit/strings/foo', [], function () {
- return { default: 'foo' };
+ assert.ok(!helper, 'no helper was returned');
+ // assert.expectWarning('Attempted to lookup "helper:reverseList" which was not found. In previous versions of ember-resolver, a bug would have caused the module at "appkit/helpers/reverse-list" to be returned for this camel case helper name. This has been fixed. Use the dasherized name to resolve the module that would have been returned in previous versions.');
});
- var value = resolver.resolve('string:foo');
+ test('errors if lookup of a route-map does not specify isRouteMap', function (assert) {
+ assert.expect(2);
- assert.equal(value.create(), 'foo');
-});
+ let expected = { isRouteMap: false };
+ loader.define('appkit/routes', [], function () {
+ assert.ok(true, 'route-map was invoked properly');
-test('normalization', function (assert) {
- assert.ok(resolver.normalize, 'resolver#normalize is present');
-
- assert.equal(resolver.normalize('foo:bar'), 'foo:bar');
-
- assert.equal(resolver.normalize('controller:posts'), 'controller:posts');
- assert.equal(
- resolver.normalize('controller:posts_index'),
- 'controller:posts-index'
- );
- assert.equal(
- resolver.normalize('controller:posts.index'),
- 'controller:posts/index'
- );
- assert.equal(
- resolver.normalize('controller:posts-index'),
- 'controller:posts-index'
- );
- assert.equal(
- resolver.normalize('controller:posts.post.index'),
- 'controller:posts/post/index'
- );
- assert.equal(
- resolver.normalize('controller:posts_post.index'),
- 'controller:posts-post/index'
- );
- assert.equal(
- resolver.normalize('controller:posts.post_index'),
- 'controller:posts/post-index'
- );
- assert.equal(
- resolver.normalize('controller:posts.post-index'),
- 'controller:posts/post-index'
- );
- assert.equal(
- resolver.normalize('controller:postsIndex'),
- 'controller:posts-index'
- );
- assert.equal(
- resolver.normalize('controller:blogPosts.index'),
- 'controller:blog-posts/index'
- );
- assert.equal(
- resolver.normalize('controller:blog/posts.index'),
- 'controller:blog/posts/index'
- );
- assert.equal(
- resolver.normalize('controller:blog/posts-index'),
- 'controller:blog/posts-index'
- );
- assert.equal(
- resolver.normalize('controller:blog/posts.post.index'),
- 'controller:blog/posts/post/index'
- );
- assert.equal(
- resolver.normalize('controller:blog/posts_post.index'),
- 'controller:blog/posts-post/index'
- );
- assert.equal(
- resolver.normalize('controller:blog/posts_post-index'),
- 'controller:blog/posts-post-index'
- );
-
- assert.equal(
- resolver.normalize('template:blog/posts_index'),
- 'template:blog/posts-index'
- );
- assert.equal(resolver.normalize('service:userAuth'), 'service:user-auth');
-
- // For helpers, we have special logic to avoid the situation of a template's
- // `{{someName}}` being surprisingly shadowed by a `some-name` helper
- assert.equal(
- resolver.normalize('helper:make-fabulous'),
- 'helper:make-fabulous'
- );
- assert.equal(resolver.normalize('helper:fabulize'), 'helper:fabulize');
- assert.equal(
- resolver.normalize('helper:make_fabulous'),
- 'helper:make-fabulous'
- );
- assert.equal(
- resolver.normalize('helper:makeFabulous'),
- 'helper:makeFabulous'
- );
-
- // The same applies to components
- assert.equal(
- resolver.normalize('component:fabulous-component'),
- 'component:fabulous-component'
- );
- assert.equal(
- resolver.normalize('component:fabulousComponent'),
- 'component:fabulousComponent'
- );
- assert.equal(
- resolver.normalize('template:components/fabulousComponent'),
- 'template:components/fabulousComponent'
- );
-
- // and modifiers
- assert.equal(
- resolver.normalize('modifier:fabulous-component'),
- 'modifier:fabulous-component'
- );
-
- // deprecated when fabulously-missing actually exists, but normalize still returns it
- assert.equal(
- resolver.normalize('modifier:fabulouslyMissing'),
- 'modifier:fabulouslyMissing'
- );
-});
+ return { default: expected };
+ });
-test('camel case modifier is not normalized', function (assert) {
- assert.expect(2);
-
- let expected = {};
- loader.define('appkit/modifiers/other-thing', [], function () {
- assert.ok(false, 'appkit/modifiers/other-thing was accessed');
-
- return { default: 'oh no' };
- });
-
- loader.define('appkit/modifiers/otherThing', [], function () {
- assert.ok(true, 'appkit/modifiers/otherThing was accessed');
-
- return { default: expected };
+ assert.throws(() => {
+ resolver.resolve('route-map:appkit');
+ }, /The route map for appkit should be wrapped by 'buildRoutes' before exporting/);
});
- let modifier = resolver.resolve('modifier:otherThing');
+ test("will return the raw value if no 'default' is available", function (assert) {
+ loader.define('appkit/fruits/orange', [], function () {
+ return 'is awesome';
+ });
- assert.strictEqual(modifier, expected);
-});
-
-test('normalization is idempotent', function (assert) {
- let examples = [
- 'controller:posts',
- 'controller:posts.post.index',
- 'controller:blog/posts.post_index',
- 'template:foo_bar',
- ];
-
- examples.forEach((example) => {
assert.equal(
- resolver.normalize(resolver.normalize(example)),
- resolver.normalize(example)
+ resolver.resolve('fruit:orange'),
+ 'is awesome',
+ 'adapter was returned'
);
});
-});
-module('Logging', {
- beforeEach: function () {
- originalConsoleInfo = console ? console.info : null;
- logCalls = [];
- console.info = function (arg) {
- logCalls.push(arg);
- };
- setupResolver();
- },
-
- afterEach: function () {
- if (originalConsoleInfo) {
- console.info = originalConsoleInfo;
- }
- },
-});
+ test("will unwrap the 'default' export automatically", function (assert) {
+ loader.define('appkit/fruits/orange', [], function () {
+ return { default: 'is awesome' };
+ });
-test('logs lookups when logging is enabled', function (assert) {
- loader.define('appkit/fruits/orange', [], function () {
- return 'is logged';
+ assert.equal(
+ resolver.resolve('fruit:orange'),
+ 'is awesome',
+ 'adapter was returned'
+ );
});
- Ember.ENV.LOG_MODULE_RESOLVER = true;
-
- resolver.resolve('fruit:orange');
+ test('router:main is hard-coded to prefix/router.js', function (assert) {
+ assert.expect(1);
- assert.ok(logCalls.length, 'should log lookup');
-});
+ loader.define('appkit/router', [], function () {
+ assert.ok(true, 'router:main was looked up');
+ return 'whatever';
+ });
-test("doesn't log lookups if disabled", function (assert) {
- loader.define('appkit/fruits/orange', [], function () {
- return 'is not logged';
+ resolver.resolve('router:main');
});
- Ember.ENV.LOG_MODULE_RESOLVER = false;
+ test('store:main is looked up as prefix/store', function (assert) {
+ assert.expect(1);
- resolver.resolve('fruit:orange');
+ loader.define('appkit/store', [], function () {
+ assert.ok(true, 'store:main was looked up');
+ return 'whatever';
+ });
- assert.equal(logCalls.length, 0, 'should not log lookup');
-});
-
-module('custom prefixes by type', {
- beforeEach: setupResolver,
-});
-
-test('will use the prefix specified for a given type if present', function (assert) {
- setupResolver({
- namespace: {
- fruitPrefix: 'grovestand',
- modulePrefix: 'appkit',
- },
+ resolver.resolve('store:main');
});
- loader.define('grovestand/fruits/orange', [], function () {
- assert.ok(true, 'custom prefix used');
- return 'whatever';
- });
+ test('store:posts as prefix/stores/post', function (assert) {
+ assert.expect(1);
- resolver.resolve('fruit:orange');
-});
+ loader.define('appkit/stores/post', [], function () {
+ assert.ok(true, 'store:post was looked up');
+ return 'whatever';
+ });
-module('pods lookup structure', {
- beforeEach: function () {
- setupResolver();
- },
-});
-
-test('will lookup modulePrefix/name/type before prefix/type/name', function (assert) {
- loader.define('appkit/controllers/foo', [], function () {
- assert.ok(false, 'appkit/controllers was used');
- return 'whatever';
- });
-
- loader.define('appkit/foo/controller', [], function () {
- assert.ok(true, 'appkit/foo/controllers was used');
- return 'whatever';
+ resolver.resolve('store:post');
});
- resolver.resolve('controller:foo');
-});
+ test('will raise error if both dasherized and underscored modules exist', function (assert) {
+ loader.define('appkit/big-bands/steve-miller-band', [], function () {
+ assert.ok(true, 'dasherized version looked up');
+ return 'whatever';
+ });
-test('will lookup names with slashes properly', function (assert) {
- loader.define('appkit/controllers/foo/index', [], function () {
- assert.ok(false, 'appkit/controllers was used');
- return 'whatever';
- });
+ loader.define('appkit/big_bands/steve_miller_band', [], function () {
+ assert.ok(false, 'underscored version looked up');
+ return 'whatever';
+ });
- loader.define('appkit/foo/index/controller', [], function () {
- assert.ok(true, 'appkit/foo/index/controller was used');
- return 'whatever';
+ try {
+ resolver.resolve('big-band:steve-miller-band');
+ } catch (e) {
+ assert.equal(
+ e.message,
+ `Ambiguous module names: 'appkit/big-bands/steve-miller-band' and 'appkit/big_bands/steve_miller_band'`,
+ 'error with a descriptive value is thrown'
+ );
+ }
});
- resolver.resolve('controller:foo/index');
-});
+ test('will lookup an underscored version of the module name when the dasherized version is not found', function (assert) {
+ assert.expect(1);
-test('specifying a podModulePrefix overrides the general modulePrefix', function (assert) {
- setupResolver({
- namespace: {
- modulePrefix: 'appkit',
- podModulePrefix: 'appkit/pods',
- },
- });
+ loader.define('appkit/big_bands/steve_miller_band', [], function () {
+ assert.ok(true, 'underscored version looked up properly');
+ return 'whatever';
+ });
- loader.define('appkit/controllers/foo', [], function () {
- assert.ok(false, 'appkit/controllers was used');
- return 'whatever';
+ resolver.resolve('big-band:steve-miller-band');
});
- loader.define('appkit/foo/controller', [], function () {
- assert.ok(false, 'appkit/foo/controllers was used');
- return 'whatever';
- });
+ test('can lookup templates with mixed naming moduleName', function (assert) {
+ assert.expect(1);
- loader.define('appkit/pods/foo/controller', [], function () {
- assert.ok(true, 'appkit/pods/foo/controllers was used');
- return 'whatever';
- });
+ loader.define('appkit/bands/_steve-miller-band', [], function () {
+ assert.ok(true, 'underscored version looked up properly');
- resolver.resolve('controller:foo');
-});
+ return 'whatever';
+ });
-test('will not use custom type prefix when using POD format', function (assert) {
- resolver.namespace['controllerPrefix'] = 'foobar';
+ resolver.resolve('band:-steve-miller-band');
- loader.define('foobar/controllers/foo', [], function () {
- assert.ok(false, 'foobar/controllers was used');
- return 'whatever';
+ // TODO: these helpers not not compatible with modern ember
+ // assert.expectDeprecation('Modules should not contain underscores. Attempted to lookup "appkit/bands/-steve-miller-band" which was not found. Please rename "appkit/bands/_steve-miller-band" to "appkit/bands/-steve-miller-band" instead.');
});
- loader.define('foobar/foo/controller', [], function () {
- assert.ok(false, 'foobar/foo/controllers was used');
- return 'whatever';
- });
+ test('can lookup templates via Ember.TEMPLATES', function (assert) {
+ Ember.TEMPLATES['application'] = function () {
+ return 'herp
';
+ };
- loader.define('appkit/foo/controller', [], function () {
- assert.ok(true, 'appkit/foo/controllers was used');
- return 'whatever';
+ var template = resolver.resolve('template:application');
+ assert.ok(template, 'template should resolve');
});
- resolver.resolve('controller:foo');
-});
-
-test('it will find components nested in app/components/name/index.js', function (assert) {
- loader.define('appkit/components/foo-bar/index', [], function () {
- assert.ok(true, 'appkit/components/foo-bar was used');
+ test('it provides eachForType which invokes the callback for each item found', function (assert) {
+ function orange() {}
+ loader.define('appkit/fruits/orange', [], function () {
+ return { default: orange };
+ });
- return 'whatever';
- });
+ function apple() {}
+ loader.define('appkit/fruits/apple', [], function () {
+ return { default: apple };
+ });
- resolver.resolve('component:foo-bar');
-});
+ function other() {}
+ loader.define('appkit/stuffs/other', [], function () {
+ return { default: other };
+ });
-test('will lookup a components template without being rooted in `components/`', function (assert) {
- loader.define('appkit/components/foo-bar/template', [], function () {
- assert.ok(false, 'appkit/components was used');
- return 'whatever';
- });
+ var items = resolver.knownForType('fruit');
- loader.define('appkit/foo-bar/template', [], function () {
- assert.ok(true, 'appkit/foo-bar/template was used');
- return 'whatever';
+ assert.deepEqual(items, {
+ 'fruit:orange': true,
+ 'fruit:apple': true,
+ });
});
- resolver.resolve('template:components/foo-bar');
-});
+ test('eachForType can find both pod and non-pod factories', function (assert) {
+ function orange() {}
+ loader.define('appkit/fruits/orange', [], function () {
+ return { default: orange };
+ });
-test('will use pods format to lookup components in components/', function (assert) {
- assert.expect(3);
+ function lemon() {}
+ loader.define('appkit/lemon/fruit', [], function () {
+ return { default: lemon };
+ });
- let expectedComponent = { isComponentFactory: true };
- loader.define('appkit/components/foo-bar/template', [], function () {
- assert.ok(true, 'appkit/components was used');
- return 'whatever';
- });
+ var items = resolver.knownForType('fruit');
- loader.define('appkit/components/foo-bar/component', [], function () {
- assert.ok(true, 'appkit/components was used');
- return { default: expectedComponent };
+ assert.deepEqual(items, {
+ 'fruit:orange': true,
+ 'fruit:lemon': true,
+ });
});
- resolver.resolve('template:components/foo-bar');
- let component = resolver.resolve('component:foo-bar');
+ test('if shouldWrapInClassFactory returns true a wrapped object is returned', function (assert) {
+ resolver.shouldWrapInClassFactory = function (defaultExport, parsedName) {
+ assert.equal(defaultExport, 'foo');
+ assert.equal(parsedName.fullName, 'string:foo');
- assert.equal(component, expectedComponent, 'default export was returned');
-});
+ return true;
+ };
-test('will not lookup routes in components/', function (assert) {
- assert.expect(1);
+ loader.define('appkit/strings/foo', [], function () {
+ return { default: 'foo' };
+ });
- loader.define('appkit/components/foo-bar/route', [], function () {
- assert.ok(false, 'appkit/components was used');
- return { isRouteFactory: true };
- });
+ var value = resolver.resolve('string:foo');
- loader.define('appkit/routes/foo-bar', [], function () {
- assert.ok(true, 'appkit/routes was used');
- return { isRouteFactory: true };
+ assert.equal(value.create(), 'foo');
});
- resolver.resolve('route:foo-bar');
-});
+ test('normalization', function (assert) {
+ assert.ok(resolver.normalize, 'resolver#normalize is present');
-test('will not lookup non component templates in components/', function (assert) {
- assert.expect(1);
+ assert.equal(resolver.normalize('foo:bar'), 'foo:bar');
- loader.define('appkit/components/foo-bar/template', [], function () {
- assert.ok(false, 'appkit/components was used');
- return 'whatever';
- });
-
- loader.define('appkit/templates/foo-bar', [], function () {
- assert.ok(true, 'appkit/templates was used');
- return 'whatever';
- });
-
- resolver.resolve('template:foo-bar');
-});
+ assert.equal(resolver.normalize('controller:posts'), 'controller:posts');
+ assert.equal(
+ resolver.normalize('controller:posts_index'),
+ 'controller:posts-index'
+ );
+ assert.equal(
+ resolver.normalize('controller:posts.index'),
+ 'controller:posts/index'
+ );
+ assert.equal(
+ resolver.normalize('controller:posts-index'),
+ 'controller:posts-index'
+ );
+ assert.equal(
+ resolver.normalize('controller:posts.post.index'),
+ 'controller:posts/post/index'
+ );
+ assert.equal(
+ resolver.normalize('controller:posts_post.index'),
+ 'controller:posts-post/index'
+ );
+ assert.equal(
+ resolver.normalize('controller:posts.post_index'),
+ 'controller:posts/post-index'
+ );
+ assert.equal(
+ resolver.normalize('controller:posts.post-index'),
+ 'controller:posts/post-index'
+ );
+ assert.equal(
+ resolver.normalize('controller:postsIndex'),
+ 'controller:posts-index'
+ );
+ assert.equal(
+ resolver.normalize('controller:blogPosts.index'),
+ 'controller:blog-posts/index'
+ );
+ assert.equal(
+ resolver.normalize('controller:blog/posts.index'),
+ 'controller:blog/posts/index'
+ );
+ assert.equal(
+ resolver.normalize('controller:blog/posts-index'),
+ 'controller:blog/posts-index'
+ );
+ assert.equal(
+ resolver.normalize('controller:blog/posts.post.index'),
+ 'controller:blog/posts/post/index'
+ );
+ assert.equal(
+ resolver.normalize('controller:blog/posts_post.index'),
+ 'controller:blog/posts-post/index'
+ );
+ assert.equal(
+ resolver.normalize('controller:blog/posts_post-index'),
+ 'controller:blog/posts-post-index'
+ );
-module('custom pluralization');
+ assert.equal(
+ resolver.normalize('template:blog/posts_index'),
+ 'template:blog/posts-index'
+ );
+ assert.equal(resolver.normalize('service:userAuth'), 'service:user-auth');
-test('will use the pluralization specified for a given type', function (assert) {
- assert.expect(1);
+ // For helpers, we have special logic to avoid the situation of a template's
+ // `{{someName}}` being surprisingly shadowed by a `some-name` helper
+ assert.equal(
+ resolver.normalize('helper:make-fabulous'),
+ 'helper:make-fabulous'
+ );
+ assert.equal(resolver.normalize('helper:fabulize'), 'helper:fabulize');
+ assert.equal(
+ resolver.normalize('helper:make_fabulous'),
+ 'helper:make-fabulous'
+ );
+ assert.equal(
+ resolver.normalize('helper:makeFabulous'),
+ 'helper:makeFabulous'
+ );
- setupResolver({
- namespace: {
- modulePrefix: 'appkit',
- },
+ // The same applies to components
+ assert.equal(
+ resolver.normalize('component:fabulous-component'),
+ 'component:fabulous-component'
+ );
+ assert.equal(
+ resolver.normalize('component:fabulousComponent'),
+ 'component:fabulousComponent'
+ );
+ assert.equal(
+ resolver.normalize('template:components/fabulousComponent'),
+ 'template:components/fabulousComponent'
+ );
- pluralizedTypes: {
- sheep: 'sheep',
- octipus: 'octipii',
- },
- });
+ // and modifiers
+ assert.equal(
+ resolver.normalize('modifier:fabulous-component'),
+ 'modifier:fabulous-component'
+ );
- loader.define('appkit/sheep/baaaaaa', [], function () {
- assert.ok(true, 'custom pluralization used');
- return 'whatever';
+ // deprecated when fabulously-missing actually exists, but normalize still returns it
+ assert.equal(
+ resolver.normalize('modifier:fabulouslyMissing'),
+ 'modifier:fabulouslyMissing'
+ );
});
- resolver.resolve('sheep:baaaaaa');
-});
-
-test("will pluralize 'config' as 'config' by default", function (assert) {
- assert.expect(1);
+ test('camel case modifier is not normalized', function (assert) {
+ assert.expect(2);
- setupResolver();
+ let expected = {};
+ loader.define('appkit/modifiers/other-thing', [], function () {
+ assert.ok(false, 'appkit/modifiers/other-thing was accessed');
- loader.define('appkit/config/environment', [], function () {
- assert.ok(true, 'config/environment is found');
- return 'whatever';
- });
+ return { default: 'oh no' };
+ });
- resolver.resolve('config:environment');
-});
+ loader.define('appkit/modifiers/otherThing', [], function () {
+ assert.ok(true, 'appkit/modifiers/otherThing was accessed');
-test("'config' can be overridden", function (assert) {
- assert.expect(1);
+ return { default: expected };
+ });
- setupResolver({
- namespace: {
- modulePrefix: 'appkit',
- },
+ let modifier = resolver.resolve('modifier:otherThing');
- pluralizedTypes: {
- config: 'super-duper-config',
- },
+ assert.strictEqual(modifier, expected);
});
- loader.define('appkit/super-duper-config/environment', [], function () {
- assert.ok(true, 'super-duper-config/environment is found');
- return 'whatever';
- });
+ test('normalization is idempotent', function (assert) {
+ let examples = [
+ 'controller:posts',
+ 'controller:posts.post.index',
+ 'controller:blog/posts.post_index',
+ 'template:foo_bar',
+ ];
- resolver.resolve('config:environment');
+ examples.forEach((example) => {
+ assert.equal(
+ resolver.normalize(resolver.normalize(example)),
+ resolver.normalize(example)
+ );
+ });
+ });
});
diff --git a/test-app/tests/unit/resolvers/classic/custom-prefixes-test.js b/test-app/tests/unit/resolvers/classic/custom-prefixes-test.js
new file mode 100644
index 00000000..dc0ccde4
--- /dev/null
+++ b/test-app/tests/unit/resolvers/classic/custom-prefixes-test.js
@@ -0,0 +1,25 @@
+import { module, test } from 'qunit';
+
+import { setupResolver, resolver, loader } from './-setup-resolver';
+
+module('custom prefixes by type', function (hooks) {
+ hooks.beforeEach(function () {
+ setupResolver();
+ });
+
+ test('will use the prefix specified for a given type if present', function (assert) {
+ setupResolver({
+ namespace: {
+ fruitPrefix: 'grovestand',
+ modulePrefix: 'appkit',
+ },
+ });
+
+ loader.define('grovestand/fruits/orange', [], function () {
+ assert.ok(true, 'custom prefix used');
+ return 'whatever';
+ });
+
+ resolver.resolve('fruit:orange');
+ });
+});
diff --git a/test-app/tests/unit/resolvers/classic/logging-test.js b/test-app/tests/unit/resolvers/classic/logging-test.js
new file mode 100644
index 00000000..78d26a95
--- /dev/null
+++ b/test-app/tests/unit/resolvers/classic/logging-test.js
@@ -0,0 +1,47 @@
+import Ember from 'ember';
+import { module, test } from 'qunit';
+
+import { setupResolver, resolver, loader } from './-setup-resolver';
+
+let originalConsoleInfo, logCalls;
+
+module('Logging', function (hooks) {
+ hooks.beforeEach(function () {
+ originalConsoleInfo = console ? console.info : null;
+ logCalls = [];
+ console.info = function (arg) {
+ logCalls.push(arg);
+ };
+ setupResolver();
+ });
+
+ hooks.afterEach(function () {
+ if (originalConsoleInfo) {
+ console.info = originalConsoleInfo;
+ }
+ });
+
+ test('logs lookups when logging is enabled', function (assert) {
+ loader.define('appkit/fruits/orange', [], function () {
+ return 'is logged';
+ });
+
+ Ember.ENV.LOG_MODULE_RESOLVER = true;
+
+ resolver.resolve('fruit:orange');
+
+ assert.ok(logCalls.length, 'should log lookup');
+ });
+
+ test("doesn't log lookups if disabled", function (assert) {
+ loader.define('appkit/fruits/orange', [], function () {
+ return 'is not logged';
+ });
+
+ Ember.ENV.LOG_MODULE_RESOLVER = false;
+
+ resolver.resolve('fruit:orange');
+
+ assert.equal(logCalls.length, 0, 'should not log lookup');
+ });
+});
diff --git a/test-app/tests/unit/resolvers/classic/pods-test.js b/test-app/tests/unit/resolvers/classic/pods-test.js
new file mode 100644
index 00000000..2adfb571
--- /dev/null
+++ b/test-app/tests/unit/resolvers/classic/pods-test.js
@@ -0,0 +1,218 @@
+import { module, test } from 'qunit';
+
+import { setupResolver, resolver, loader } from './-setup-resolver';
+
+module('pods lookup structure', function (hooks) {
+ hooks.beforeEach(function () {
+ setupResolver();
+ });
+
+ test('will lookup modulePrefix/name/type before prefix/type/name', function (assert) {
+ loader.define('appkit/controllers/foo', [], function () {
+ assert.ok(false, 'appkit/controllers was used');
+ return 'whatever';
+ });
+
+ loader.define('appkit/foo/controller', [], function () {
+ assert.ok(true, 'appkit/foo/controllers was used');
+ return 'whatever';
+ });
+
+ resolver.resolve('controller:foo');
+ });
+
+ test('will lookup names with slashes properly', function (assert) {
+ loader.define('appkit/controllers/foo/index', [], function () {
+ assert.ok(false, 'appkit/controllers was used');
+ return 'whatever';
+ });
+
+ loader.define('appkit/foo/index/controller', [], function () {
+ assert.ok(true, 'appkit/foo/index/controller was used');
+ return 'whatever';
+ });
+
+ resolver.resolve('controller:foo/index');
+ });
+
+ test('specifying a podModulePrefix overrides the general modulePrefix', function (assert) {
+ setupResolver({
+ namespace: {
+ modulePrefix: 'appkit',
+ podModulePrefix: 'appkit/pods',
+ },
+ });
+
+ loader.define('appkit/controllers/foo', [], function () {
+ assert.ok(false, 'appkit/controllers was used');
+ return 'whatever';
+ });
+
+ loader.define('appkit/foo/controller', [], function () {
+ assert.ok(false, 'appkit/foo/controllers was used');
+ return 'whatever';
+ });
+
+ loader.define('appkit/pods/foo/controller', [], function () {
+ assert.ok(true, 'appkit/pods/foo/controllers was used');
+ return 'whatever';
+ });
+
+ resolver.resolve('controller:foo');
+ });
+
+ test('will not use custom type prefix when using POD format', function (assert) {
+ resolver.namespace['controllerPrefix'] = 'foobar';
+
+ loader.define('foobar/controllers/foo', [], function () {
+ assert.ok(false, 'foobar/controllers was used');
+ return 'whatever';
+ });
+
+ loader.define('foobar/foo/controller', [], function () {
+ assert.ok(false, 'foobar/foo/controllers was used');
+ return 'whatever';
+ });
+
+ loader.define('appkit/foo/controller', [], function () {
+ assert.ok(true, 'appkit/foo/controllers was used');
+ return 'whatever';
+ });
+
+ resolver.resolve('controller:foo');
+ });
+
+ test('it will find components nested in app/components/name/index.js', function (assert) {
+ loader.define('appkit/components/foo-bar/index', [], function () {
+ assert.ok(true, 'appkit/components/foo-bar was used');
+
+ return 'whatever';
+ });
+
+ resolver.resolve('component:foo-bar');
+ });
+
+ test('will lookup a components template without being rooted in `components/`', function (assert) {
+ loader.define('appkit/components/foo-bar/template', [], function () {
+ assert.ok(false, 'appkit/components was used');
+ return 'whatever';
+ });
+
+ loader.define('appkit/foo-bar/template', [], function () {
+ assert.ok(true, 'appkit/foo-bar/template was used');
+ return 'whatever';
+ });
+
+ resolver.resolve('template:components/foo-bar');
+ });
+
+ test('will use pods format to lookup components in components/', function (assert) {
+ assert.expect(3);
+
+ let expectedComponent = { isComponentFactory: true };
+ loader.define('appkit/components/foo-bar/template', [], function () {
+ assert.ok(true, 'appkit/components was used');
+ return 'whatever';
+ });
+
+ loader.define('appkit/components/foo-bar/component', [], function () {
+ assert.ok(true, 'appkit/components was used');
+ return { default: expectedComponent };
+ });
+
+ resolver.resolve('template:components/foo-bar');
+ let component = resolver.resolve('component:foo-bar');
+
+ assert.equal(component, expectedComponent, 'default export was returned');
+ });
+
+ test('will not lookup routes in components/', function (assert) {
+ assert.expect(1);
+
+ loader.define('appkit/components/foo-bar/route', [], function () {
+ assert.ok(false, 'appkit/components was used');
+ return { isRouteFactory: true };
+ });
+
+ loader.define('appkit/routes/foo-bar', [], function () {
+ assert.ok(true, 'appkit/routes was used');
+ return { isRouteFactory: true };
+ });
+
+ resolver.resolve('route:foo-bar');
+ });
+
+ test('will not lookup non component templates in components/', function (assert) {
+ assert.expect(1);
+
+ loader.define('appkit/components/foo-bar/template', [], function () {
+ assert.ok(false, 'appkit/components was used');
+ return 'whatever';
+ });
+
+ loader.define('appkit/templates/foo-bar', [], function () {
+ assert.ok(true, 'appkit/templates was used');
+ return 'whatever';
+ });
+
+ resolver.resolve('template:foo-bar');
+ });
+
+ module('custom pluralization');
+
+ test('will use the pluralization specified for a given type', function (assert) {
+ assert.expect(1);
+
+ setupResolver({
+ namespace: {
+ modulePrefix: 'appkit',
+ },
+
+ pluralizedTypes: {
+ sheep: 'sheep',
+ octipus: 'octipii',
+ },
+ });
+
+ loader.define('appkit/sheep/baaaaaa', [], function () {
+ assert.ok(true, 'custom pluralization used');
+ return 'whatever';
+ });
+
+ resolver.resolve('sheep:baaaaaa');
+ });
+
+ test("will pluralize 'config' as 'config' by default", function (assert) {
+ assert.expect(1);
+
+ setupResolver();
+
+ loader.define('appkit/config/environment', [], function () {
+ assert.ok(true, 'config/environment is found');
+ return 'whatever';
+ });
+
+ resolver.resolve('config:environment');
+ });
+
+ test("'config' can be overridden", function (assert) {
+ assert.expect(1);
+
+ setupResolver({
+ namespace: {
+ modulePrefix: 'appkit',
+ },
+
+ pluralizedTypes: {
+ config: 'super-duper-config',
+ },
+ });
+
+ loader.define('appkit/super-duper-config/environment', [], function () {
+ assert.ok(true, 'super-duper-config/environment is found');
+ return 'whatever';
+ });
+
+ resolver.resolve('config:environment');
+ });
+});
diff --git a/test-app/tests/unit/underscore_test.js b/test-app/tests/unit/underscore_test.js
index e9c655fb..4f440a33 100644
--- a/test-app/tests/unit/underscore_test.js
+++ b/test-app/tests/unit/underscore_test.js
@@ -2,26 +2,26 @@ import { module } from 'qunit';
import { underscore } from 'ember-resolver/string/index';
import createTestFunction from '../helpers/create-test-function';
-module('underscore');
+module('underscore', function () {
+ const test = createTestFunction(underscore);
-const test = createTestFunction(underscore);
-
-test('my favorite items', 'my_favorite_items', 'with normal string');
-test('css-class-name', 'css_class_name', 'with dasherized string');
-test('action_name', 'action_name', 'does nothing with underscored string');
-test('innerHTML', 'inner_html', 'with camelcased string');
-test(
- 'PrivateDocs/OwnerInvoice',
- 'private_docs/owner_invoice',
- 'underscore namespaced classified string'
-);
-test(
- 'privateDocs/ownerInvoice',
- 'private_docs/owner_invoice',
- 'underscore namespaced camelized string'
-);
-test(
- 'private-docs/owner-invoice',
- 'private_docs/owner_invoice',
- 'underscore namespaced dasherized string'
-);
+ test('my favorite items', 'my_favorite_items', 'with normal string');
+ test('css-class-name', 'css_class_name', 'with dasherized string');
+ test('action_name', 'action_name', 'does nothing with underscored string');
+ test('innerHTML', 'inner_html', 'with camelcased string');
+ test(
+ 'PrivateDocs/OwnerInvoice',
+ 'private_docs/owner_invoice',
+ 'underscore namespaced classified string'
+ );
+ test(
+ 'privateDocs/ownerInvoice',
+ 'private_docs/owner_invoice',
+ 'underscore namespaced camelized string'
+ );
+ test(
+ 'private-docs/owner-invoice',
+ 'private_docs/owner_invoice',
+ 'underscore namespaced dasherized string'
+ );
+});