Skip to content

Commit ea89f75

Browse files
filipesilvaKeen Yee Liau
authored and
Keen Yee Liau
committed
test(@angular-devkit/build-angular): add test for type checker replacements
1 parent 3238640 commit ea89f75

File tree

1 file changed

+52
-2
lines changed

1 file changed

+52
-2
lines changed

packages/angular_devkit/build_angular/test/browser/replacements_spec_large.ts

+52-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import { runTargetSpec } from '@angular-devkit/architect/testing';
9+
import { DefaultTimeout, TestLogger, runTargetSpec } from '@angular-devkit/architect/testing';
1010
import { join, normalize, virtualFs } from '@angular-devkit/core';
11-
import { takeWhile, tap } from 'rxjs/operators';
11+
import { of, race } from 'rxjs';
12+
import { delay, filter, map, take, takeUntil, takeWhile, tap } from 'rxjs/operators';
1213
import { browserTargetSpec, host } from '../utils';
1314

1415

@@ -154,4 +155,53 @@ describe('Browser Builder file replacements', () => {
154155
);
155156
});
156157

158+
it('file replacements work with forked type checker on watch mode', async () => {
159+
host.writeMultipleFiles({
160+
'src/file-replaced.ts': 'export var obj = { one: 1, two: 2 };',
161+
'src/file.ts': `export var obj = { one: 1 };`,
162+
'src/main.ts': `
163+
import { obj } from './file';
164+
console.log(obj.two);
165+
`,
166+
});
167+
168+
const overrides = {
169+
fileReplacements: [{
170+
replace: normalize('/src/file.ts'),
171+
with: normalize('/src/file-replaced.ts'),
172+
}],
173+
watch: true,
174+
};
175+
176+
const unexpectedError = `Property 'two' does not exist on type '{ one: number; }'`;
177+
const expectedError = `Property 'prop' does not exist on type '{}'`;
178+
const logger = new TestLogger('rebuild-type-errors');
179+
180+
// Race between a timeout and the expected log entry.
181+
const stop$ = race<null | string>(
182+
of(null).pipe(delay(DefaultTimeout * 2 / 3)),
183+
logger.pipe(
184+
filter(entry => entry.message.includes(expectedError)),
185+
map(entry => entry.message),
186+
take(1),
187+
),
188+
);
189+
190+
let errorAdded = false;
191+
runTargetSpec(host, browserTargetSpec, overrides, DefaultTimeout, logger).pipe(
192+
tap((buildEvent) => expect(buildEvent.success).toBe(true, 'build should succeed')),
193+
tap(() => {
194+
// Introduce a known type error to detect in the logger filter.
195+
if (!errorAdded) {
196+
host.appendToFile('src/main.ts', 'console.log({}.prop);');
197+
errorAdded = true;
198+
}
199+
}),
200+
takeUntil(stop$),
201+
).subscribe();
202+
203+
const res = await stop$.toPromise();
204+
expect(res).not.toBe(null, 'Test timed out.');
205+
expect(res).not.toContain(unexpectedError);
206+
});
157207
});

0 commit comments

Comments
 (0)