Skip to content

Commit 7c8f02a

Browse files
chore: add @testing-library migration (#23)
This change was manually released on npm as `@angular-extensions/testing-library@5.1.2` to not intervene with the current version.
1 parent 662f135 commit 7c8f02a

File tree

4 files changed

+154
-0
lines changed

4 files changed

+154
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { Rule, chain, Tree, SchematicContext } from '@angular-devkit/schematics';
2+
import { TslintFixTask } from '@angular-devkit/schematics/tasks';
3+
import * as path from 'path';
4+
import { stripIndents } from '@angular-devkit/core/src/utils/literals';
5+
6+
function createRule(ruleName: string): TslintFixTask {
7+
return new TslintFixTask(
8+
{
9+
rulesDirectory: path.join(__dirname, 'rules'),
10+
rules: {
11+
[ruleName]: [true],
12+
},
13+
},
14+
{
15+
includes: ['**/*.spec.ts', '**/*.test.ts'],
16+
silent: false,
17+
},
18+
);
19+
}
20+
21+
function displayInformation(tree, context: SchematicContext) {
22+
context.logger.info(stripIndents`
23+
@angular-extensions/testing-library has moved to @testing-library/angular.
24+
25+
Learn more about this change here: https://github.com/testing-library/dom-testing-library/issues/260
26+
`);
27+
28+
return tree;
29+
}
30+
31+
function updatePackageJson(host: Tree) {
32+
if (host.exists('package.json')) {
33+
// tslint:disable-next-line: no-non-null-assertion
34+
const sourceText = host.read('package.json')!.toString('utf-8');
35+
const json = JSON.parse(sourceText);
36+
37+
if (json['devDependencies'] && json['devDependencies']['@angular-extensions/testing-library']) {
38+
json['devDependencies']['@testing-library/angular'] = '^6.0.0';
39+
delete json['devDependencies']['@angular-extensions/testing-library'];
40+
host.overwrite('package.json', JSON.stringify(json, null, 2));
41+
}
42+
}
43+
44+
return host;
45+
}
46+
47+
export default function(): Rule {
48+
return (host, context) => {
49+
context.addTask(createRule('no-angular-extensions-import'));
50+
51+
return chain([displayInformation, updatePackageJson])(host, context);
52+
};
53+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import * as ts from 'typescript';
2+
import { Replacement, RuleFailure, Rules } from 'tslint';
3+
import { tsquery } from '@phenomnomnominal/tsquery';
4+
5+
const IMPORT_QUERY = `ImportDeclaration StringLiteral[value="@angular-extensions/testing-library"]`;
6+
7+
const FAILURE_MESSAGE =
8+
'Found the library `@angular-extensions/testing-library`, use `@testing-library/angular` instead.';
9+
10+
export class Rule extends Rules.AbstractRule {
11+
public apply(ast: ts.SourceFile): Array<RuleFailure> {
12+
const imports = this.getImports(ast);
13+
return imports;
14+
}
15+
16+
private getImports(ast: ts.SourceFile): Array<RuleFailure> {
17+
return tsquery(ast, IMPORT_QUERY).map(result => {
18+
// replace text between (single) quotes
19+
const replacement = new Replacement(result.getStart() + 1, result.getWidth() - 2, '@testing-library/angular');
20+
const start = result.getStart();
21+
const end = result.getEnd();
22+
23+
return new RuleFailure(ast, start, end, FAILURE_MESSAGE, this.ruleName, replacement);
24+
});
25+
}
26+
}

projects/testing-library/migrations/migration.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
"version": "4.0.0",
66
"description": "Align API to *-testing-libraries",
77
"factory": "./4_0_0"
8+
},
9+
"migration-5.1.2": {
10+
"version": "5.1.2",
11+
"description": "Migrate to @testing-library",
12+
"factory": "./5_1_2"
813
}
914
}
1015
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { getSystemPath, normalize, virtualFs } from '@angular-devkit/core';
2+
import { TempScopedNodeJsSyncHost } from '@angular-devkit/core/node/testing';
3+
import { HostTree } from '@angular-devkit/schematics';
4+
import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing';
5+
import { stripIndents } from '@angular-devkit/core/src/utils/literals';
6+
7+
describe('Migration to version 5.1.2', () => {
8+
const schematicRunner = new SchematicTestRunner('migrations', require.resolve('../../migrations/migration.json'));
9+
10+
test('it renames @angular-extensions to @testing-library (in files)', async () => {
11+
const specPath = normalize('tests/home.spec.ts');
12+
13+
const host = new TempScopedNodeJsSyncHost();
14+
const tree = new UnitTestTree(new HostTree(host));
15+
tree.create('/package.json', JSON.stringify({}));
16+
process.chdir(getSystemPath(host.root));
17+
await host
18+
.write(
19+
specPath,
20+
virtualFs.stringToFileBuffer(stripIndents`
21+
import { render } from '@angular-extensions/testing-library';
22+
import { render } from "@angular-extensions/testing-library";
23+
`),
24+
)
25+
.toPromise();
26+
27+
await schematicRunner.runSchematicAsync('migration-5.1.2', {}, tree).toPromise();
28+
await schematicRunner.engine.executePostTasks().toPromise();
29+
30+
const actual = await host
31+
.read(specPath)
32+
.toPromise()
33+
.then(virtualFs.fileBufferToString);
34+
35+
expect(actual).toBe(stripIndents`
36+
import { render } from '@testing-library/angular';
37+
import { render } from "@testing-library/angular";
38+
`);
39+
});
40+
41+
test('it renames @angular-extensions to @testing-library (in package.json)', async () => {
42+
const packageJson = normalize('/package.json');
43+
const host = new TempScopedNodeJsSyncHost();
44+
const tree = new UnitTestTree(new HostTree(host));
45+
46+
tree.create(
47+
packageJson,
48+
JSON.stringify({
49+
devDependencies: {
50+
'@angular-extensions/testing-library': '🦔',
51+
},
52+
}),
53+
);
54+
55+
await schematicRunner.runSchematicAsync('migration-5.1.2', {}, tree).toPromise();
56+
await schematicRunner.engine.executePostTasks().toPromise();
57+
58+
expect(tree.readContent(packageJson)).toBe(
59+
JSON.stringify(
60+
{
61+
devDependencies: {
62+
'@testing-library/angular': '^6.0.0',
63+
},
64+
},
65+
null,
66+
2,
67+
),
68+
);
69+
});
70+
});

0 commit comments

Comments
 (0)