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' + ); +});