Skip to content

Commit

Permalink
feat(testing): update to jest-preset-angular v8.0.0
Browse files Browse the repository at this point in the history
Updates to jest-preset-angular to v8.0.0, includes migrations to fix any existing projects affected
by the jest-preset-angular update.

closes nrwl#1979
  • Loading branch information
mentzerj committed Oct 24, 2019
1 parent 294224b commit 653eda7
Show file tree
Hide file tree
Showing 13 changed files with 410 additions and 285 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -119,7 +119,7 @@
"jasmine-spec-reporter": "~4.2.1",
"jest": "^24.1.0",
"jest-jasmine2": "^24.1.0",
"jest-preset-angular": "7.0.0",
"jest-preset-angular": "8.0.0",
"karma": "~4.0.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
Expand Down
11 changes: 11 additions & 0 deletions packages/angular/src/schematics/application/application.spec.ts
Expand Up @@ -90,6 +90,17 @@ describe('app', () => {
expect(tsconfigE2E.extends).toEqual('./tsconfig.json');
});

it('should setup jest with serializers', async () => {
const tree = await runSchematic('app', { name: 'myApp' }, appTree);

expect(tree.readContent('apps/my-app/jest.config.js')).toContain(
`'jest-preset-angular/build/AngularSnapshotSerializer.js'`
);
expect(tree.readContent('apps/my-app/jest.config.js')).toContain(
`'jest-preset-angular/build/HTMLCommentSerializer.js'`
);
});

it('should default the prefix to npmScope', async () => {
const noPrefix = await runSchematic(
'app',
Expand Down
2 changes: 1 addition & 1 deletion packages/angular/src/utils/versions.ts
Expand Up @@ -4,4 +4,4 @@ export const angularDevkitVersion = '^0.803.3';
export const angularJsVersion = '1.6.6';
export const ngrxVersion = '8.3.0';
export const rxjsVersion = '~6.4.0';
export const jestPresetAngularVersion = '7.0.0';
export const jestPresetAngularVersion = '8.0.0';
5 changes: 5 additions & 0 deletions packages/jest/migrations.json
Expand Up @@ -9,6 +9,11 @@
"version": "8.7.0",
"description": "Update Jest testPathPattern option",
"factory": "./src/migrations/update-8-7-0/update-8-7-0"
},
"update-8.8.0": {
"version": "8.8.0",
"description": "Upgrades jest-preset-angular and runs migrations for breaking changes",
"factory": "./src/migrations/update-8-8-0/update-8-8-0"
}
}
}
18 changes: 12 additions & 6 deletions packages/jest/src/builders/jest/jest.impl.spec.ts
Expand Up @@ -57,7 +57,8 @@ describe('Jest Builder', () => {
tsConfig: '/root/tsconfig.test.json',
stringifyContentPathRegex: '\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/InlineHtmlStripStylesTransformer'
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer'
]
}
}),
Expand Down Expand Up @@ -99,7 +100,8 @@ describe('Jest Builder', () => {
tsConfig: '/root/tsconfig.test.json',
stringifyContentPathRegex: '\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/InlineHtmlStripStylesTransformer'
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer'
]
}
}),
Expand Down Expand Up @@ -142,7 +144,8 @@ describe('Jest Builder', () => {
tsConfig: '/root/tsconfig.test.json',
stringifyContentPathRegex: '\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/InlineHtmlStripStylesTransformer'
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer'
]
}
}),
Expand Down Expand Up @@ -199,7 +202,8 @@ describe('Jest Builder', () => {
tsConfig: '/root/tsconfig.test.json',
stringifyContentPathRegex: '\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/InlineHtmlStripStylesTransformer'
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer'
]
}
}),
Expand Down Expand Up @@ -251,7 +255,8 @@ describe('Jest Builder', () => {
tsConfig: '/root/tsconfig.test.json',
stringifyContentPathRegex: '\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/InlineHtmlStripStylesTransformer'
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer'
]
}
}),
Expand Down Expand Up @@ -307,7 +312,8 @@ describe('Jest Builder', () => {
tsConfig: '/root/tsconfig.test.json',
stringifyContentPathRegex: '\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/InlineHtmlStripStylesTransformer'
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer'
]
}
}),
Expand Down
5 changes: 4 additions & 1 deletion packages/jest/src/builders/jest/jest.impl.ts
Expand Up @@ -69,7 +69,10 @@ function run(
require.resolve('jest-preset-angular');
Object.assign(tsJestConfig, {
stringifyContentPathRegex: '\\.(html|svg)$',
astTransformers: ['jest-preset-angular/InlineHtmlStripStylesTransformer']
astTransformers: [
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer'
]
});
} catch (e) {}

Expand Down
155 changes: 155 additions & 0 deletions packages/jest/src/migrations/update-8-8-0/update-8-8-0.spec.ts
@@ -0,0 +1,155 @@
import { Tree } from '@angular-devkit/schematics';
import { readJsonInTree } from '@nrwl/workspace/src/utils/ast-utils';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import * as path from 'path';
import { createEmptyWorkspace } from '@nrwl/workspace/testing';
import { serializeJson } from '@nrwl/workspace';

describe.only('Update 8.8.0', () => {
let initialTree: Tree;
let schematicRunner: SchematicTestRunner;

beforeEach(async () => {
initialTree = createEmptyWorkspace(Tree.empty());

schematicRunner = new SchematicTestRunner(
'@nrwl/jest',
path.join(__dirname, '../../../migrations.json')
);

initialTree.overwrite(
'package.json',
serializeJson({ devDependencies: { 'jest-preset-angular': '7.0.0' } })
);

initialTree.overwrite(
'workspace.json',
serializeJson({
projects: {
'angular-one': {
root: 'apps/angular-one/',
architect: {
test: {
builder: '@nrwl/jest:jest',
options: {
jestConfig: 'apps/angular-one/jest.config.js'
}
}
}
},
'angular-two': {
root: 'apps/angular-two/',
architect: {
test: {
builder: '@nrwl/jest:jest',
options: {
jestConfig: 'apps/angular-two/jest.config.js'
}
}
}
},
'non-angular-one': {
root: 'apps/non-angular-one/',
architect: {
test: {
builder: '@nrwl/jest:jest',
options: {
jestConfig: 'apps/non-angular-one/jest.config.js'
}
}
}
}
}
})
);

initialTree.create(
'apps/angular-one/jest.config.js',
`module.exports = {
name: 'angular-one',
preset: '../../jest.config.js',
coverageDirectory:
'../../coverage/apps/angular-one',
snapshotSerializers: [
'jest-preset-angular/AngularSnapshotSerializer.js',
'jest-preset-angular/HTMLCommentSerializer.js'
]
};`
);

initialTree.create(
'apps/angular-two/jest.config.js',
`module.exports = {
name: 'angular-two',
preset: '../../jest.config.js',
coverageDirectory:
'../../coverage/apps/angular-two',
snapshotSerializers: [
'jest-preset-angular/AngularSnapshotSerializer.js',
'jest-preset-angular/HTMLCommentSerializer.js'
]
};`
);

initialTree.create(
'apps/non-angular-one/jest.config.js',
`module.exports = {
name: 'non-angular-one',
preset: '../../jest.config.js',
coverageDirectory:
'../../coverage/apps/non-angular-one',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html']
};`
);
});

it('should update jest-preset-angular to 8.0.0', async () => {
const result = await schematicRunner
.runSchematicAsync('update-8.8.0', {}, initialTree)
.toPromise();

const { devDependencies } = readJsonInTree(result, 'package.json');
expect(devDependencies['jest-preset-angular']).toEqual('8.0.0');
});

it(`it should add '/build' into jest-preset-angular snapshotSerializers in any jest.config.js where it exists`, async () => {
const result = await schematicRunner
.runSchematicAsync('update-8.8.0', {}, initialTree)
.toPromise();

const updateJestAngularOne = result.readContent(
'apps/angular-one/jest.config.js'
);
const updateJestAngularTwo = result.readContent(
'apps/angular-two/jest.config.js'
);
const updateJestNonAngularOne = result.readContent(
'apps/non-angular-one/jest.config.js'
);

expect(updateJestAngularOne).not.toContain(
'jest-preset-angular/AngularSnapshotSerializer.js'
);
expect(updateJestAngularOne).not.toContain(
'jest-preset-angular/HTMLCommentSerializer.js'
);
expect(updateJestAngularTwo).not.toContain(
'jest-preset-angular/AngularSnapshotSerializer.js'
);
expect(updateJestAngularTwo).not.toContain(
'jest-preset-angular/HTMLCommentSerializer.js'
);
expect(updateJestAngularOne).toContain(
'jest-preset-angular/build/AngularSnapshotSerializer.js'
);
expect(updateJestAngularOne).toContain(
'jest-preset-angular/build/HTMLCommentSerializer.js'
);
expect(updateJestAngularTwo).toContain(
'jest-preset-angular/build/AngularSnapshotSerializer.js'
);
expect(updateJestAngularTwo).toContain(
'jest-preset-angular/build/HTMLCommentSerializer.js'
);
});
});
119 changes: 119 additions & 0 deletions packages/jest/src/migrations/update-8-8-0/update-8-8-0.ts
@@ -0,0 +1,119 @@
import {
Tree,
Rule,
chain,
SchematicContext
} from '@angular-devkit/schematics';
import { readWorkspace, insert, formatFiles } from '@nrwl/workspace';
import * as ts from 'typescript';
import {
ReplaceChange,
updateJsonInTree,
readJsonInTree,
getSourceNodes
} from '@nrwl/workspace/src/utils/ast-utils';
import { stripIndents } from '@angular-devkit/core/src/utils/literals';

export default function update(): Rule {
return chain([
displayInformation,
updateDependencies,
updateJestConfigs,
formatFiles()
]);
}

function displayInformation(host: Tree, context: SchematicContext) {
const config = readJsonInTree(host, 'package.json');
if (config.devDependencies && config.devDependencies['jest-preset-angular']) {
context.logger.info(stripIndents`
\`jest-preset-angular\` 8.0.0 has restructured folders, introducing breaking changes to
jest.config.js files.
We are updating snapshotSerializers in each Angular project to include appropriate paths.
See: https://github.com/thymikee/jest-preset-angular/releases/tag/v8.0.0
`);
}
}

const updateDependencies = updateJsonInTree('package.json', json => {
json.devDependencies = json.devDependencies || {};

if (json.devDependencies['jest-preset-angular']) {
json.devDependencies['jest-preset-angular'] = '8.0.0';
}

return json;
});

function updateJestConfigs(host: Tree) {
const config = readJsonInTree(host, 'package.json');

if (config.devDependencies && config.devDependencies['jest-preset-angular']) {
const workspaceConfig = readWorkspace(host);
const jestConfigsToUpdate = [];

Object.keys(workspaceConfig.projects).forEach(name => {
const project = workspaceConfig.projects[name];
if (
project.architect &&
project.architect.test &&
project.architect.test.builder === '@nrwl/jest:jest' &&
project.architect.test.options &&
project.architect.test.options.jestConfig ===
project.root + 'jest.config.js'
) {
jestConfigsToUpdate.push(project.root + 'jest.config.js');
}
});

jestConfigsToUpdate.forEach(configPath => {
if (host.exists(configPath)) {
const contents = host.read(configPath).toString();
const sourceFile = ts.createSourceFile(
configPath,
contents,
ts.ScriptTarget.Latest
);

const changes: ReplaceChange[] = [];

getSourceNodes(sourceFile).forEach(node => {
if (node && ts.isStringLiteral(node)) {
const nodeText = node.text;
if (
nodeText === 'jest-preset-angular/AngularSnapshotSerializer.js'
) {
changes.push(
new ReplaceChange(
configPath,
node.getStart(sourceFile) + 1,
nodeText,
'jest-preset-angular/build/AngularSnapshotSerializer.js'
)
);
}

if (nodeText === 'jest-preset-angular/HTMLCommentSerializer.js') {
changes.push(
new ReplaceChange(
configPath,
node.getStart(sourceFile) + 1,
nodeText,
'jest-preset-angular/build/HTMLCommentSerializer.js'
)
);
}
}
});

insert(
host,
configPath,
changes.sort((a, b) => (a.order > b.order ? -1 : 1))
);
}
});
}
}

0 comments on commit 653eda7

Please sign in to comment.