Skip to content

Commit 7decf1b

Browse files
authored
Merge pull request #1 from typed-ember/middleware-options-fork
test: suggested updates for testing if typecheck middleware is installed
2 parents 2e0697b + 11c1916 commit 7decf1b

File tree

8 files changed

+101
-62
lines changed

8 files changed

+101
-62
lines changed

test-fixtures/skeleton-app/config/environment.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
module.exports = function(environment) {
55
return {
66
environment,
7-
modulePrefix: 'skeleton-app'
7+
modulePrefix: 'skeleton-app',
8+
rootURL: '/'
89
};
910
};

test-fixtures/skeleton-app/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"ember-cli-htmlbars": "*",
66
"ember-cli-babel": "*",
77
"ember-source": "*",
8+
"ember-qunit": "*",
89
"loader.js": "*",
910
"typescript": "*"
1011
},

test-fixtures/skeleton-app/testem.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict';
2+
3+
module.exports = {
4+
test_page: 'tests/index.html?hidepassed',
5+
disable_watching: true,
6+
launch_in_ci: ['Chrome'],
7+
launch_in_dev: ['Chrome'],
8+
browser_start_timeout: 120,
9+
browser_args: {
10+
Chrome: {
11+
ci: [
12+
// --no-sandbox is needed when running Chrome inside a container
13+
process.env.CI ? '--no-sandbox' : null,
14+
'--headless',
15+
'--disable-dev-shm-usage',
16+
'--disable-software-rasterizer',
17+
'--mute-audio',
18+
'--remote-debugging-port=0',
19+
'--window-size=1440,900'
20+
].filter(Boolean)
21+
}
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<title>Dummy Tests</title>
7+
<meta name="description" content="">
8+
<meta name="viewport" content="width=device-width, initial-scale=1">
9+
10+
{{content-for "head"}}
11+
{{content-for "test-head"}}
12+
13+
<link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
14+
<link rel="stylesheet" href="{{rootURL}}assets/skeleton-app.css">
15+
<link rel="stylesheet" href="{{rootURL}}assets/test-support.css">
16+
17+
{{content-for "head-footer"}}
18+
{{content-for "test-head-footer"}}
19+
</head>
20+
<body>
21+
{{content-for "body"}}
22+
{{content-for "test-body"}}
23+
24+
<script src="/testem.js" integrity=""></script>
25+
<script src="{{rootURL}}assets/vendor.js"></script>
26+
<script src="{{rootURL}}assets/test-support.js"></script>
27+
<script src="{{rootURL}}assets/skeleton-app.js"></script>
28+
<script src="{{rootURL}}assets/tests.js"></script>
29+
30+
{{content-for "body-footer"}}
31+
{{content-for "test-body-footer"}}
32+
</body>
33+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { start } from 'ember-qunit';
2+
3+
start();

ts/addon.ts

+9
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import TypecheckMiddleware from './lib/typechecking/middleware';
1010
import { Application } from 'express';
1111
import walkSync from 'walk-sync';
1212
import fs from 'fs-extra';
13+
import logger from 'debug';
14+
15+
const debug = logger('ember-cli-typescript:addon');
1316

1417
export const ADDON_NAME = 'ember-cli-typescript';
1518

@@ -47,13 +50,19 @@ export default addon({
4750

4851
serverMiddleware({ app, options }) {
4952
if (!options || !options.path) {
53+
debug('Installing typecheck server middleware');
5054
this._addTypecheckMiddleware(app);
55+
} else {
56+
debug('Skipping typecheck server middleware');
5157
}
5258
},
5359

5460
testemMiddleware(app, options) {
5561
if (!options || !options.path) {
62+
debug('Installing typecheck testem middleware');
5663
this._addTypecheckMiddleware(app);
64+
} else {
65+
debug('Skipping typecheck testem middleware');
5766
}
5867
},
5968

ts/tests/acceptance/build-test.ts

+14-34
Original file line numberDiff line numberDiff line change
@@ -69,50 +69,30 @@ describe('Acceptance: build', function () {
6969
);
7070
});
7171

72-
it("doesn't launch type checking when --path used", async () => {
72+
it("doesn't launch type checking for `ember serve` when --path is used", async () => {
7373
await app.build();
74+
7475
let server = app.serve({
7576
args: ['--path', 'dist'],
76-
env: { DEBUG: 'ember-cli-typescript|express:*' },
77+
env: { DEBUG: 'ember-cli-typescript:addon' },
7778
});
78-
let result = await server.raceForOutputs([
79-
'ember-cli-typescript:typecheck-worker',
80-
'Serving on',
81-
]);
82-
expect(result).to.include('Serving on');
83-
});
8479

85-
it('does launch type checking when --path not used', async () => {
86-
await app.build();
87-
let server = app.serve({ env: { DEBUG: 'ember-cli-typescript|express:*' } });
88-
let result = await server.raceForOutputs([
89-
'ember-cli-typescript:typecheck-worker',
90-
'Serving on',
91-
]);
92-
expect(result).to.include('ember-cli-typescript:typecheck-worker');
80+
let result = await server.waitForOutput('Serving on');
81+
82+
expect(result).to.include('ember-cli-typescript:addon Skipping typecheck server middleware');
9383
});
9484

95-
it("doesn't launch type checking when --path used for tests", async () => {
96-
await app.build();
97-
let test = app.test({
85+
it("doesn't launch type checking for `ember test` when --path is used", async () => {
86+
await app.build({ args: ['--environment', 'test'] });
87+
88+
let result = await app.test({
9889
args: ['--path', 'dist'],
99-
env: { DEBUG: 'ember-cli-typescript|express:*' },
90+
env: { DEBUG: 'ember-cli-typescript:addon' },
10091
});
101-
let result = await test.raceForOutputs([
102-
'ember-cli-typescript:typecheck-worker',
103-
'express:application',
104-
]);
105-
expect(result).to.include('express:application');
106-
});
10792

108-
it('does launch type checking when --path not used for tests', async () => {
109-
await app.build();
110-
let test = app.test({ env: { DEBUG: 'ember-cli-typescript|express:*' } });
111-
let result = await test.raceForOutputs([
112-
'ember-cli-typescript:typecheck-worker',
113-
'express:application',
114-
]);
115-
expect(result).to.include('ember-cli-typescript:typecheck-worker');
93+
expect(result.all).to.include(
94+
'ember-cli-typescript:addon Skipping typecheck testem middleware'
95+
);
11696
});
11797

11898
it('fails the build when noEmitOnError is set and an error is emitted', async () => {

ts/tests/helpers/skeleton-app.ts

+16-27
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@ const getEmberPort = (() => {
1515

1616
interface EmberCliOptions {
1717
args?: string[];
18-
env?: any;
18+
env?: Record<string, string>;
1919
}
2020

2121
export default class SkeletonApp {
2222
port = getEmberPort();
2323
watched: WatchedEmberProcess | null = null;
24-
watchedTest: WatchedEmberProcess | null = null;
25-
cleanupTempDir = () => rimraf(this.root, (error) => console.error(error));
24+
cleanupTempDir = () => rimraf(this.root, (error) => error && console.error(error));
2625
root = path.join(process.cwd(), `test-skeleton-app-${Math.random().toString(36).slice(2)}`);
2726

2827
constructor() {
@@ -31,26 +30,22 @@ export default class SkeletonApp {
3130
process.on('beforeExit', this.cleanupTempDir);
3231
}
3332

34-
build() {
35-
return this._ember({ args: ['build'] });
33+
build({ args = [], env }: EmberCliOptions = {}) {
34+
return this._ember({ args: ['build', ...args], env });
3635
}
3736

38-
serve(options: EmberCliOptions = { args: [], env: {} }) {
37+
test({ args = [], env }: EmberCliOptions = {}) {
38+
return this._ember({ args: ['test', '--test-port', `${this.port}`, ...args], env });
39+
}
40+
41+
serve({ args = [], env }: EmberCliOptions = {}) {
3942
if (this.watched) {
4043
throw new Error('Already serving');
4144
}
42-
options.args = options.args || [];
43-
options.args = ['serve', '--port', `${this.port}`, ...options.args];
44-
return (this.watched = new WatchedEmberProcess(this._ember(options), this.port));
45-
}
4645

47-
test(options: EmberCliOptions = { args: [], env: {} }) {
48-
if (this.watchedTest) {
49-
throw new Error('Already testing');
50-
}
51-
options.args = options.args || [];
52-
options.args = ['test', ...options.args];
53-
return (this.watchedTest = new WatchedEmberProcess(this._ember(options)));
46+
let childProcess = this._ember({ args: ['serve', '--port', `${this.port}`, ...args], env });
47+
48+
return (this.watched = new WatchedEmberProcess(childProcess, this.port));
5449
}
5550

5651
updatePackageJSON(callback: (arg: any) => any) {
@@ -77,21 +72,19 @@ export default class SkeletonApp {
7772
if (this.watched) {
7873
this.watched.kill();
7974
}
80-
if (this.watchedTest) {
81-
this.watchedTest.kill();
82-
}
75+
8376
this.cleanupTempDir();
8477
process.off('beforeExit', this.cleanupTempDir);
8578
}
8679

87-
_ember(options: EmberCliOptions) {
80+
_ember({ args, env }: EmberCliOptions) {
8881
let ember = require.resolve('ember-cli/bin/ember');
89-
return execa.node(ember, options.args, { cwd: this.root, all: true, env: options.env });
82+
return execa.node(ember, args, { cwd: this.root, all: true, env });
9083
}
9184
}
9285

9386
class WatchedEmberProcess extends EventEmitter {
94-
constructor(protected ember: execa.ExecaChildProcess, protected port?: number) {
87+
constructor(protected ember: execa.ExecaChildProcess, protected port: number) {
9588
super();
9689
this.ember.stdout?.on('data', (data) => {
9790
let output = data.toString();
@@ -115,10 +108,6 @@ class WatchedEmberProcess extends EventEmitter {
115108
return got(`http://localhost:${this.port}${path}`);
116109
}
117110

118-
raceForOutputs(targets: string[]) {
119-
return Promise.race(targets.map((target) => this.waitForOutput(target)));
120-
}
121-
122111
waitForOutput(target: string) {
123112
return new Promise((resolve) => {
124113
let output = '';

0 commit comments

Comments
 (0)