Skip to content

Commit dd9d947

Browse files
committed
Refactor tests to use ESM imports and update component and application setup for improved compatibility
1 parent 2111029 commit dd9d947

7 files changed

Lines changed: 91 additions & 138 deletions

File tree

smoke-tests/node-template/tests/node/component-rendering.test.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ describe('Components can be rendered without a DOM dependency', () => {
2828
test('Ensure undefined attributes requiring protocol sanitization do not error', () => {
2929
ctx.owner.register(
3030
'component:fake-link',
31-
class extends ctx.Ember.Component {
31+
class extends ctx.Component {
3232
tagName = 'link';
3333
attributeBindings = ['href', 'rel'];
3434
rel = 'canonical';

smoke-tests/node-template/tests/node/fastboot-sandbox.test.mjs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,23 @@
66
* we test that Ember can be dynamically imported and used to boot an app
77
* with SimpleDOM, which is the ESM equivalent of the FastBoot sandbox pattern.
88
*/
9-
import { describe, test, beforeEach, afterEach } from 'node:test';
9+
import { describe, test } from 'node:test';
1010
import assert from 'node:assert/strict';
1111
import SimpleDOM from 'simple-dom';
12-
import { loadEmber, clearEmber } from './helpers/load-ember.mjs';
12+
import Application from 'ember-source/@ember/application/index.js';
13+
import EmberObject from 'ember-source/@ember/object/index.js';
14+
import EmberRouter from 'ember-source/@ember/routing/router.js';
15+
import { run } from 'ember-source/@ember/runloop/index.js';
16+
import { precompile } from 'ember-source/ember-template-compiler/index.js';
17+
import { createTemplateFactory } from 'ember-source/@ember/template-factory/index.js';
1318

1419
const HTMLSerializer = new SimpleDOM.HTMLSerializer(SimpleDOM.voidMap);
1520

21+
function compile(templateString, options) {
22+
let templateSpec = precompile(templateString, options);
23+
return createTemplateFactory(JSON.parse(templateSpec));
24+
}
25+
1626
async function fastbootVisit(app, url) {
1727
let doc = new SimpleDOM.Document();
1828
let rootElement = doc.body;
@@ -37,23 +47,8 @@ async function fastbootVisit(app, url) {
3747
}
3848

3949
describe('FastBoot sandbox ESM equivalent', () => {
40-
let Ember;
41-
let precompile;
42-
43-
beforeEach(async () => {
44-
const loaded = await loadEmber();
45-
Ember = loaded.Ember;
46-
precompile = loaded.precompile;
47-
});
48-
49-
afterEach(() => {
50-
clearEmber();
51-
});
52-
5350
test('FastBoot: basic', async () => {
54-
let { compile } = await loadEmber();
55-
56-
let Router = class extends Ember.Router {};
51+
let Router = class extends EmberRouter {};
5752
Router.map(function () {
5853
this.route('a');
5954
this.route('b');
@@ -64,13 +59,13 @@ describe('FastBoot sandbox ESM equivalent', () => {
6459
'template:application': compile('<h1>Hello world!</h1>\n{{outlet}}'),
6560
};
6661

67-
class Resolver extends Ember.Object {
62+
class Resolver extends EmberObject {
6863
resolve(specifier) {
6964
return registry[specifier];
7065
}
7166
}
7267

73-
let app = class extends Ember.Application {}.create({
68+
let app = class extends Application {}.create({
7469
autoboot: false,
7570
Resolver,
7671
});
@@ -84,6 +79,6 @@ describe('FastBoot sandbox ESM equivalent', () => {
8479
'results in expected HTML'
8580
);
8681

87-
Ember.run(app, 'destroy');
82+
run(app, 'destroy');
8883
});
8984
});

smoke-tests/node-template/tests/node/helpers/build-owner.mjs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
11
/**
22
* ESM port of tests/node/helpers/build-owner.js
33
*/
4-
export function buildOwner(Ember, resolver) {
5-
let Owner = Ember.Object.extend(Ember._RegistryProxyMixin, Ember._ContainerProxyMixin);
4+
import EmberObject from 'ember-source/@ember/object/index.js';
5+
import Application from 'ember-source/@ember/application/index.js';
6+
import ApplicationInstance from 'ember-source/@ember/application/instance.js';
7+
import { Registry } from 'ember-source/@ember/-internals/container/index.js';
8+
import RegistryProxyMixin from 'ember-source/@ember/-internals/runtime/lib/mixins/registry_proxy.js';
9+
import ContainerProxyMixin from 'ember-source/@ember/-internals/runtime/lib/mixins/container_proxy.js';
610

7-
let namespace = Ember.Object.create({
11+
export function buildOwner(resolver) {
12+
let Owner = EmberObject.extend(RegistryProxyMixin, ContainerProxyMixin);
13+
14+
let namespace = EmberObject.create({
815
Resolver: {
916
create: function () {
1017
return resolver;
1118
},
1219
},
1320
});
1421

15-
let fallbackRegistry = Ember.Application.buildRegistry(namespace);
16-
let registry = new Ember.Registry({
22+
let fallbackRegistry = Application.buildRegistry(namespace);
23+
let registry = new Registry({
1724
fallback: fallbackRegistry,
1825
});
1926

20-
Ember.ApplicationInstance.setupRegistry(registry);
27+
ApplicationInstance.setupRegistry(registry);
2128

2229
let owner = Owner.create({
2330
__registry__: registry,

smoke-tests/node-template/tests/node/helpers/load-ember.mjs

Lines changed: 0 additions & 64 deletions
This file was deleted.

smoke-tests/node-template/tests/node/helpers/setup-app.mjs

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,35 @@
55
* and renderToHTML support for server-side rendering tests.
66
*/
77
import SimpleDOM from 'simple-dom';
8-
import { loadEmber, clearEmber } from './load-ember.mjs';
8+
import Application from 'ember-source/@ember/application/index.js';
9+
import Component from 'ember-source/@ember/component/index.js';
10+
import { setComponentTemplate } from 'ember-source/@ember/component/index.js';
11+
import templateOnly from 'ember-source/@ember/component/template-only.js';
12+
import Controller from 'ember-source/@ember/controller/index.js';
13+
import EmberObject from 'ember-source/@ember/object/index.js';
14+
import Route from 'ember-source/@ember/routing/route.js';
15+
import EmberRouter from 'ember-source/@ember/routing/router.js';
16+
import { service } from 'ember-source/@ember/service/index.js';
17+
import { run } from 'ember-source/@ember/runloop/index.js';
18+
import RSVP from 'ember-source/@ember/-internals/runtime/lib/ext/rsvp.js';
19+
import { setTesting } from 'ember-source/@ember/debug/lib/testing.js';
20+
import { precompile } from 'ember-source/ember-template-compiler/index.js';
21+
import { createTemplateFactory } from 'ember-source/@ember/template-factory/index.js';
22+
23+
function compile(templateString, options) {
24+
let templateSpec = precompile(templateString, options);
25+
return createTemplateFactory(JSON.parse(templateSpec));
26+
}
927

1028
export async function createAppContext() {
11-
const { Ember, compile } = await loadEmber();
12-
13-
Ember.testing = true;
29+
setTesting(true);
1430

1531
const ctx = {
16-
Ember,
1732
compile,
18-
setComponentTemplate: Ember._setComponentTemplate,
19-
templateOnlyComponent: Ember._templateOnlyComponent,
20-
run: Ember.run,
21-
all: Ember.RSVP.all,
33+
setComponentTemplate,
34+
templateOnlyComponent: templateOnly,
35+
run,
36+
all: RSVP.all.bind(RSVP),
2237
registry: {},
2338
routesCallback: null,
2439
app: null,
@@ -36,27 +51,27 @@ export async function createAppContext() {
3651
let component = ctx.setComponentTemplate(
3752
ctx.compile(templateContents),
3853
componentProps
39-
? ctx.Ember.Component.extend(componentProps)
54+
? Component.extend(componentProps)
4055
: ctx.templateOnlyComponent()
4156
);
4257
ctx.register('component:' + name, component);
4358
};
4459

4560
ctx.controller = function (name, controllerProps) {
46-
let controller = ctx.Ember.Controller.extend(controllerProps);
61+
let controller = Controller.extend(controllerProps);
4762
ctx.register('controller:' + name, controller);
4863
};
4964

5065
ctx.route = function (name, routeProps) {
51-
let route = ctx.Ember.Route.extend({
52-
router: ctx.Ember.inject.service('router'),
66+
let route = Route.extend({
67+
router: service('router'),
5368
...routeProps,
5469
});
5570
ctx.register('route:' + name, route);
5671
};
5772

5873
ctx.service = function (name, serviceProps) {
59-
let service = ctx.Ember.Object.extend(serviceProps);
74+
let service = EmberObject.extend(serviceProps);
6075
ctx.register('service:' + name, service);
6176
};
6277

@@ -67,20 +82,16 @@ export async function createAppContext() {
6782
ctx.createApplication = function () {
6883
if (ctx.app) return ctx.app;
6984

70-
let app = class extends ctx.Ember.Application {}.create({
85+
let app = class extends Application {}.create({
7186
autoboot: false,
7287
Resolver: {
7388
create: () => {
74-
// Return an object without a resolve() method.
75-
// Ember's registry checks `if (registry.resolver)` before calling
76-
// resolver.resolve(), so returning null makes it skip the resolver
77-
// path entirely. All lookups go through app.register() instead.
7889
return null;
7990
},
8091
},
8192
});
8293

83-
let Router = class extends ctx.Ember.Router {
94+
let Router = class extends EmberRouter {
8495
location = 'none';
8596
};
8697

@@ -100,7 +111,7 @@ export async function createAppContext() {
100111
},
101112
});
102113

103-
ctx.run(app, 'boot');
114+
run(app, 'boot');
104115
ctx.app = app;
105116

106117
return app;
@@ -110,7 +121,7 @@ export async function createAppContext() {
110121
let app = ctx.createApplication();
111122
let dom = new SimpleDOM.Document();
112123

113-
return ctx.run(app, 'visit', url, {
124+
return run(app, 'visit', url, {
114125
isBrowser: false,
115126
document: dom,
116127
rootElement: dom.body,
@@ -124,7 +135,7 @@ export async function createAppContext() {
124135
let dom = new SimpleDOM.Document();
125136
let root = dom.body;
126137

127-
return ctx.run(app, 'visit', url, {
138+
return run(app, 'visit', url, {
128139
isBrowser: false,
129140
document: dom,
130141
rootElement: root,
@@ -136,9 +147,9 @@ export async function createAppContext() {
136147

137148
ctx.destroy = function () {
138149
if (ctx.app) {
139-
ctx.run(ctx.app, 'destroy');
150+
run(ctx.app, 'destroy');
140151
}
141-
clearEmber();
152+
setTesting(false);
142153
};
143154

144155
return ctx;

0 commit comments

Comments
 (0)