Skip to content

Commit 207358a

Browse files
alan-agius4dgp1130
authored andcommittedDec 8, 2022
feat(@angular-devkit/schematics): add runSchematic and runExternalSchematic methods
These async methods are a replacement for the Observable based `runSchematicAsync` and `runExternalSchematicAsync` methods. DEPRECATED: The Observable based `SchematicTestRunner.runSchematicAsync` and `SchematicTestRunner.runExternalSchematicAsync` method have been deprecated in favor of the Promise based `SchematicTestRunner.runSchematic` and `SchematicTestRunner.runExternalSchematic`.
1 parent 7869173 commit 207358a

File tree

34 files changed

+725
-971
lines changed

34 files changed

+725
-971
lines changed
 

‎goldens/public-api/angular_devkit/schematics/testing/index.md

+4
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@ export class SchematicTestRunner {
2525
// (undocumented)
2626
registerCollection(collectionName: string, collectionPath: string): void;
2727
// (undocumented)
28+
runExternalSchematic<SchematicSchemaT extends object>(collectionName: string, schematicName: string, opts?: SchematicSchemaT, tree?: Tree_2): Promise<UnitTestTree>;
29+
// @deprecated (undocumented)
2830
runExternalSchematicAsync<SchematicSchemaT extends object>(collectionName: string, schematicName: string, opts?: SchematicSchemaT, tree?: Tree_2): Observable<UnitTestTree>;
2931
// (undocumented)
32+
runSchematic<SchematicSchemaT extends object>(schematicName: string, opts?: SchematicSchemaT, tree?: Tree_2): Promise<UnitTestTree>;
33+
// @deprecated (undocumented)
3034
runSchematicAsync<SchematicSchemaT extends object>(schematicName: string, opts?: SchematicSchemaT, tree?: Tree_2): Observable<UnitTestTree>;
3135
// (undocumented)
3236
get tasks(): TaskConfiguration[];

‎packages/angular/cli/src/commands/update/schematic/index_spec.ts

+98-165
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import { normalize, virtualFs } from '@angular-devkit/core';
1010
import { HostTree } from '@angular-devkit/schematics';
1111
import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing';
12-
import { map } from 'rxjs/operators';
1312
import * as semver from 'semver';
1413
import { angularMajorCompatGuarantee } from './index';
1514

@@ -51,8 +50,8 @@ describe('@schematics/update', () => {
5150
appTree = new UnitTestTree(new HostTree(host));
5251
});
5352

54-
it('ignores dependencies not hosted on the NPM registry', (done) => {
55-
const tree = new UnitTestTree(
53+
it('ignores dependencies not hosted on the NPM registry', async () => {
54+
let newTree = new UnitTestTree(
5655
new HostTree(
5756
new virtualFs.test.TestHost({
5857
'/package.json': `{
@@ -65,22 +64,15 @@ describe('@schematics/update', () => {
6564
),
6665
);
6766

68-
schematicRunner
69-
.runSchematicAsync('update', undefined, tree)
70-
.pipe(
71-
map((t) => {
72-
const packageJson = JSON.parse(t.readContent('/package.json'));
73-
expect(packageJson['dependencies']['@angular-devkit-tests/update-base']).toBe(
74-
'file:update-base-1.0.0.tgz',
75-
);
76-
}),
77-
)
78-
.toPromise()
79-
.then(done, done.fail);
67+
newTree = await schematicRunner.runSchematic('update', undefined, newTree);
68+
const packageJson = JSON.parse(newTree.readContent('/package.json'));
69+
expect(packageJson['dependencies']['@angular-devkit-tests/update-base']).toBe(
70+
'file:update-base-1.0.0.tgz',
71+
);
8072
}, 45000);
8173

8274
it('should not error with yarn 2.0 protocols', async () => {
83-
const tree = new UnitTestTree(
75+
let newTree = new UnitTestTree(
8476
new HostTree(
8577
new virtualFs.test.TestHost({
8678
'/package.json': `{
@@ -94,20 +86,18 @@ describe('@schematics/update', () => {
9486
),
9587
);
9688

97-
const newTree = await schematicRunner
98-
.runSchematicAsync(
99-
'update',
100-
{
101-
packages: ['@angular-devkit-tests/update-base'],
102-
},
103-
tree,
104-
)
105-
.toPromise();
89+
newTree = await schematicRunner.runSchematic(
90+
'update',
91+
{
92+
packages: ['@angular-devkit-tests/update-base'],
93+
},
94+
newTree,
95+
);
10696
const { dependencies } = JSON.parse(newTree.readContent('/package.json'));
10797
expect(dependencies['@angular-devkit-tests/update-base']).toBe('1.1.0');
10898
});
10999

110-
it('updates Angular as compatible with Angular N-1', (done) => {
100+
it('updates Angular as compatible with Angular N-1', async () => {
111101
// Add the basic migration package.
112102
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
113103
const packageJson = JSON.parse(content);
@@ -121,25 +111,18 @@ describe('@schematics/update', () => {
121111
virtualFs.stringToFileBuffer(JSON.stringify(packageJson)),
122112
);
123113

124-
schematicRunner
125-
.runSchematicAsync(
126-
'update',
127-
{
128-
packages: ['@angular/core@^6.0.0'],
129-
},
130-
appTree,
131-
)
132-
.pipe(
133-
map((tree) => {
134-
const packageJson = JSON.parse(tree.readContent('/package.json'));
135-
expect(packageJson['dependencies']['@angular/core'][0]).toBe('6');
136-
}),
137-
)
138-
.toPromise()
139-
.then(done, done.fail);
114+
const newTree = await schematicRunner.runSchematic(
115+
'update',
116+
{
117+
packages: ['@angular/core@^6.0.0'],
118+
},
119+
appTree,
120+
);
121+
const newPpackageJson = JSON.parse(newTree.readContent('/package.json'));
122+
expect(newPpackageJson['dependencies']['@angular/core'][0]).toBe('6');
140123
}, 45000);
141124

142-
it('updates Angular as compatible with Angular N-1 (2)', (done) => {
125+
it('updates Angular as compatible with Angular N-1 (2)', async () => {
143126
// Add the basic migration package.
144127
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
145128
const packageJson = JSON.parse(content);
@@ -159,25 +142,19 @@ describe('@schematics/update', () => {
159142
virtualFs.stringToFileBuffer(JSON.stringify(packageJson)),
160143
);
161144

162-
schematicRunner
163-
.runSchematicAsync(
164-
'update',
165-
{
166-
packages: ['@angular/core@^6.0.0'],
167-
},
168-
appTree,
169-
)
170-
.pipe(
171-
map((tree) => {
172-
const packageJson = JSON.parse(tree.readContent('/package.json'));
173-
expect(packageJson['dependencies']['@angular/core'][0]).toBe('6');
174-
expect(packageJson['dependencies']['rxjs'][0]).toBe('6');
175-
expect(packageJson['dependencies']['typescript'][0]).toBe('2');
176-
expect(packageJson['dependencies']['typescript'][2]).not.toBe('4');
177-
}),
178-
)
179-
.toPromise()
180-
.then(done, done.fail);
145+
const newTree = await schematicRunner.runSchematic(
146+
'update',
147+
{
148+
packages: ['@angular/core@^6.0.0'],
149+
},
150+
appTree,
151+
);
152+
153+
const newPackageJson = JSON.parse(newTree.readContent('/package.json'));
154+
expect(newPackageJson['dependencies']['@angular/core'][0]).toBe('6');
155+
expect(newPackageJson['dependencies']['rxjs'][0]).toBe('6');
156+
expect(newPackageJson['dependencies']['typescript'][0]).toBe('2');
157+
expect(newPackageJson['dependencies']['typescript'][2]).not.toBe('4');
181158
}, 45000);
182159

183160
it('uses packageGroup for versioning', async () => {
@@ -192,26 +169,19 @@ describe('@schematics/update', () => {
192169
virtualFs.stringToFileBuffer(JSON.stringify(packageJson)),
193170
);
194171

195-
await schematicRunner
196-
.runSchematicAsync(
197-
'update',
198-
{
199-
packages: ['@angular-devkit-tests/update-package-group-1'],
200-
},
201-
appTree,
202-
)
203-
.pipe(
204-
map((tree) => {
205-
const packageJson = JSON.parse(tree.readContent('/package.json'));
206-
const deps = packageJson['dependencies'];
207-
expect(deps['@angular-devkit-tests/update-package-group-1']).toBe('1.2.0');
208-
expect(deps['@angular-devkit-tests/update-package-group-2']).toBe('2.0.0');
209-
}),
210-
)
211-
.toPromise();
172+
const newTree = await schematicRunner.runSchematic(
173+
'update',
174+
{
175+
packages: ['@angular-devkit-tests/update-package-group-1'],
176+
},
177+
appTree,
178+
);
179+
const { dependencies: deps } = JSON.parse(newTree.readContent('/package.json'));
180+
expect(deps['@angular-devkit-tests/update-package-group-1']).toBe('1.2.0');
181+
expect(deps['@angular-devkit-tests/update-package-group-2']).toBe('2.0.0');
212182
}, 45000);
213183

214-
it('can migrate only', (done) => {
184+
it('can migrate only', async () => {
215185
// Add the basic migration package.
216186
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
217187
const packageJson = JSON.parse(content);
@@ -221,29 +191,21 @@ describe('@schematics/update', () => {
221191
virtualFs.stringToFileBuffer(JSON.stringify(packageJson)),
222192
);
223193

224-
schematicRunner
225-
.runSchematicAsync(
226-
'update',
227-
{
228-
packages: ['@angular-devkit-tests/update-migrations'],
229-
migrateOnly: true,
230-
},
231-
appTree,
232-
)
233-
.pipe(
234-
map((tree) => {
235-
const packageJson = JSON.parse(tree.readContent('/package.json'));
236-
expect(packageJson['dependencies']['@angular-devkit-tests/update-base']).toBe('1.0.0');
237-
expect(packageJson['dependencies']['@angular-devkit-tests/update-migrations']).toBe(
238-
'1.0.0',
239-
);
240-
}),
241-
)
242-
.toPromise()
243-
.then(done, done.fail);
194+
const newTree = await schematicRunner.runSchematic(
195+
'update',
196+
{
197+
packages: ['@angular-devkit-tests/update-migrations'],
198+
migrateOnly: true,
199+
},
200+
appTree,
201+
);
202+
203+
const newPackageJson = JSON.parse(newTree.readContent('/package.json'));
204+
expect(newPackageJson['dependencies']['@angular-devkit-tests/update-base']).toBe('1.0.0');
205+
expect(newPackageJson['dependencies']['@angular-devkit-tests/update-migrations']).toBe('1.0.0');
244206
}, 45000);
245207

246-
it('can migrate from only', (done) => {
208+
it('can migrate from only', async () => {
247209
// Add the basic migration package.
248210
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
249211
const packageJson = JSON.parse(content);
@@ -253,29 +215,20 @@ describe('@schematics/update', () => {
253215
virtualFs.stringToFileBuffer(JSON.stringify(packageJson)),
254216
);
255217

256-
schematicRunner
257-
.runSchematicAsync(
258-
'update',
259-
{
260-
packages: ['@angular-devkit-tests/update-migrations'],
261-
migrateOnly: true,
262-
from: '0.1.2',
263-
},
264-
appTree,
265-
)
266-
.pipe(
267-
map((tree) => {
268-
const packageJson = JSON.parse(tree.readContent('/package.json'));
269-
expect(packageJson['dependencies']['@angular-devkit-tests/update-migrations']).toBe(
270-
'1.6.0',
271-
);
272-
}),
273-
)
274-
.toPromise()
275-
.then(done, done.fail);
218+
const newTree = await schematicRunner.runSchematic(
219+
'update',
220+
{
221+
packages: ['@angular-devkit-tests/update-migrations'],
222+
migrateOnly: true,
223+
from: '0.1.2',
224+
},
225+
appTree,
226+
);
227+
const { dependencies } = JSON.parse(newTree.readContent('/package.json'));
228+
expect(dependencies['@angular-devkit-tests/update-migrations']).toBe('1.6.0');
276229
}, 45000);
277230

278-
it('can install and migrate with --from (short version number)', (done) => {
231+
it('can install and migrate with --from (short version number)', async () => {
279232
// Add the basic migration package.
280233
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
281234
const packageJson = JSON.parse(content);
@@ -285,29 +238,20 @@ describe('@schematics/update', () => {
285238
virtualFs.stringToFileBuffer(JSON.stringify(packageJson)),
286239
);
287240

288-
schematicRunner
289-
.runSchematicAsync(
290-
'update',
291-
{
292-
packages: ['@angular-devkit-tests/update-migrations'],
293-
migrateOnly: true,
294-
from: '0',
295-
},
296-
appTree,
297-
)
298-
.pipe(
299-
map((tree) => {
300-
const packageJson = JSON.parse(tree.readContent('/package.json'));
301-
expect(packageJson['dependencies']['@angular-devkit-tests/update-migrations']).toBe(
302-
'1.6.0',
303-
);
304-
}),
305-
)
306-
.toPromise()
307-
.then(done, done.fail);
241+
const newTree = await schematicRunner.runSchematic(
242+
'update',
243+
{
244+
packages: ['@angular-devkit-tests/update-migrations'],
245+
migrateOnly: true,
246+
from: '0',
247+
},
248+
appTree,
249+
);
250+
const { dependencies } = JSON.parse(newTree.readContent('/package.json'));
251+
expect(dependencies['@angular-devkit-tests/update-migrations']).toBe('1.6.0');
308252
}, 45000);
309253

310-
it('validates peer dependencies', (done) => {
254+
it('validates peer dependencies', async () => {
311255
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
312256
const packageJson = JSON.parse(content);
313257
const dependencies = packageJson['dependencies'];
@@ -326,27 +270,16 @@ describe('@schematics/update', () => {
326270
const hasPeerdepMsg = (dep: string) =>
327271
messages.some((str) => str.includes(`missing peer dependency of "${dep}"`));
328272

329-
schematicRunner
330-
.runSchematicAsync(
331-
'update',
332-
{
333-
packages: ['@angular-devkit/build-angular'],
334-
next: true,
335-
},
336-
appTree,
337-
)
338-
.pipe(
339-
map(() => {
340-
expect(hasPeerdepMsg('@angular/compiler-cli')).toBeTruthy(
341-
`Should show @angular/compiler-cli message.`,
342-
);
343-
expect(hasPeerdepMsg('typescript')).toBeTruthy(`Should show typescript message.`);
344-
expect(hasPeerdepMsg('@angular/localize')).toBeFalsy(
345-
`Should not show @angular/localize message.`,
346-
);
347-
}),
348-
)
349-
.toPromise()
350-
.then(done, done.fail);
273+
await schematicRunner.runSchematic(
274+
'update',
275+
{
276+
packages: ['@angular-devkit/build-angular'],
277+
next: true,
278+
},
279+
appTree,
280+
);
281+
expect(hasPeerdepMsg('@angular/compiler-cli')).toBeTruthy();
282+
expect(hasPeerdepMsg('typescript')).toBeTruthy();
283+
expect(hasPeerdepMsg('@angular/localize')).toBeFalsy();
351284
}, 45000);
352285
});

0 commit comments

Comments
 (0)
Please sign in to comment.