Colum Ferry 8d6ac4f694
chore(angular): support angular 13 (#7161)
* chore(angular): support angular 13

Support Angular 13

chore(angular): support ng 13 next 11

chore(angular): upgrade tslib dep

chore(angular): update package and ng-packagr-lite executors to align with ng-packagr v13

chore(angular): update test snapshots with ts version

fix(angular): buildable lib tsconfig transform test

* chore(angular): sync ng-packagr changes to the package and ng-packagr-lite executors

* chore(angular): add migrations

* chore(angular): rxjs7

* feat(angular): check rxjs version to install

* feat(angular): update jest resolver to resolve esm

* chore(angular): fix version

* chore(angular): support jest-preset-angular

* fix(angular): tests

* fix(angular): fix e2e tests and add .angular to gitignore

* fix(angular): fix jest transformers ignore pattern

* fix(angular): fix node test

* fix(angular): fix workspace test

* fix(angular): import marble utils from jasmine-marbles instead of @nrwl/angular/testing

* feat(angular): update ngrx to 13.0.0-beta.;0

* fix(angular): temporarily skip test with pnpm

* fix(angular): bump jest-preset-angular to fix jest performance issues

* fix(angular): webpack-browser and server schema changes

Co-authored-by: Leosvel Pérez Espinosa <leosvel.perez.espinosa@gmail.com>
Co-authored-by: Jason Jean <jasonjean1993@gmail.com>
2021-11-08 12:01:55 -05:00

212 lines
6.6 KiB
TypeScript

import type { Tree } from '@nrwl/devkit';
import * as devkit from '@nrwl/devkit';
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
import { createApp } from '../../utils/nx-devkit/testing';
import { ngrxVersion } from '../../utils/versions';
import { ngrxGenerator } from './ngrx';
import type { NgRxGeneratorOptions } from './schema';
describe('ngrx', () => {
let tree: Tree;
const defaultOptions: NgRxGeneratorOptions = {
directory: '+state',
minimal: true,
module: 'apps/myapp/src/app/app.module.ts',
name: 'users',
useDataPersistence: false,
};
const expectFileToExist = (file: string) =>
expect(tree.exists(file)).toBeTruthy();
beforeEach(() => {
jest.clearAllMocks();
tree = createTreeWithEmptyWorkspace();
createApp(tree, 'myapp');
});
it('should error when the module could not be found', async () => {
const modulePath = 'not-existing.module.ts';
await expect(
ngrxGenerator(tree, {
...defaultOptions,
module: modulePath,
})
).rejects.toThrowError(`Module does not exist: ${modulePath}.`);
});
it('should add an empty root module when minimal and root are set to true', async () => {
await ngrxGenerator(tree, {
...defaultOptions,
root: true,
minimal: true,
});
expect(
tree.read('/apps/myapp/src/app/app.module.ts', 'utf-8')
).toMatchSnapshot();
});
it('should not generate files when minimal and root are set to true', async () => {
await ngrxGenerator(tree, {
...defaultOptions,
root: true,
minimal: true,
});
expect(tree.exists('/apps/myapp/src/app/+state/users.actions.ts')).toBe(
false
);
expect(tree.exists('/apps/myapp/src/app/+state/users.effects.ts')).toBe(
false
);
expect(
tree.exists('/apps/myapp/src/app/+state/users.effects.spec.ts')
).toBe(false);
expect(tree.exists('/apps/myapp/src/app/+state/users.reducer.ts')).toBe(
false
);
expect(tree.exists('/apps/myapp/src/app/+state/users.selectors.ts')).toBe(
false
);
expect(
tree.exists('/apps/myapp/src/app/+state/users.selectors.spec.ts')
).toBe(false);
});
it('should add a root module with feature module when minimal is set to false', async () => {
await ngrxGenerator(tree, {
...defaultOptions,
root: true,
minimal: false,
});
expect(
tree.read('/apps/myapp/src/app/app.module.ts', 'utf-8')
).toMatchSnapshot();
});
it('should not add RouterStoreModule when the module does not reference the router', async () => {
createApp(tree, 'no-router-app', false);
await ngrxGenerator(tree, {
...defaultOptions,
module: 'apps/no-router-app/src/app/app.module.ts',
root: true,
});
const appModule = tree.read(
'/apps/no-router-app/src/app/app.module.ts',
'utf-8'
);
expect(appModule).not.toContain('StoreRouterConnectingModule.forRoot()');
});
it('should add facade provider when facade is true', async () => {
await ngrxGenerator(tree, {
...defaultOptions,
root: true,
minimal: false,
facade: true,
});
expect(tree.read('/apps/myapp/src/app/app.module.ts', 'utf-8')).toContain(
'providers: [UsersFacade]'
);
});
it('should not add facade provider when facade is false', async () => {
await ngrxGenerator(tree, {
...defaultOptions,
root: true,
minimal: false,
facade: false,
});
expect(
tree.read('/apps/myapp/src/app/app.module.ts', 'utf-8')
).not.toContain('providers: [UsersFacade]');
});
it('should not add facade provider when minimal is true', async () => {
await ngrxGenerator(tree, {
...defaultOptions,
root: true,
minimal: true,
facade: true,
});
expect(
tree.read('/apps/myapp/src/app/app.module.ts', 'utf-8')
).not.toContain('providers: [UsersFacade]');
});
it('should not generate imports when skipImport is true', async () => {
await ngrxGenerator(tree, {
...defaultOptions,
minimal: false,
skipImport: true,
});
expectFileToExist('/apps/myapp/src/app/+state/users.actions.ts');
expectFileToExist('/apps/myapp/src/app/+state/users.effects.ts');
expectFileToExist('/apps/myapp/src/app/+state/users.effects.spec.ts');
expectFileToExist('/apps/myapp/src/app/+state/users.reducer.ts');
expectFileToExist('/apps/myapp/src/app/+state/users.selectors.ts');
expectFileToExist('/apps/myapp/src/app/+state/users.selectors.spec.ts');
expect(
tree.read('/apps/myapp/src/app/app.module.ts', 'utf-8')
).toMatchSnapshot();
});
it('should update package.json', async () => {
await ngrxGenerator(tree, defaultOptions);
const packageJson = devkit.readJson(tree, 'package.json');
expect(packageJson.dependencies['@ngrx/store']).toEqual(ngrxVersion);
expect(packageJson.dependencies['@ngrx/effects']).toEqual(ngrxVersion);
expect(packageJson.dependencies['@ngrx/entity']).toEqual(ngrxVersion);
expect(packageJson.dependencies['@ngrx/router-store']).toEqual(ngrxVersion);
expect(packageJson.dependencies['@ngrx/component-store']).toEqual(
ngrxVersion
);
expect(packageJson.devDependencies['@ngrx/schematics']).toEqual(
ngrxVersion
);
expect(packageJson.devDependencies['@ngrx/store-devtools']).toEqual(
ngrxVersion
);
expect(packageJson.devDependencies['jasmine-marbles']).toBeDefined();
});
it('should not update package.json when skipPackageJson is true', async () => {
await ngrxGenerator(tree, { ...defaultOptions, skipPackageJson: true });
const packageJson = devkit.readJson(tree, 'package.json');
expect(packageJson.dependencies['@ngrx/store']).toBeUndefined();
expect(packageJson.dependencies['@ngrx/effects']).toBeUndefined();
expect(packageJson.dependencies['@ngrx/entity']).toBeUndefined();
expect(packageJson.dependencies['@ngrx/router-store']).toBeUndefined();
expect(packageJson.dependencies['@ngrx/component-store']).toBeUndefined();
expect(packageJson.devDependencies['@ngrx/schematics']).toBeUndefined();
expect(packageJson.devDependencies['@ngrx/store-devtools']).toBeUndefined();
});
it('should format files', async () => {
jest.spyOn(devkit, 'formatFiles');
await ngrxGenerator(tree, defaultOptions);
expect(devkit.formatFiles).toHaveBeenCalled();
});
it('should not format files when skipFormat is true', async () => {
jest.spyOn(devkit, 'formatFiles');
await ngrxGenerator(tree, { ...defaultOptions, skipFormat: true });
expect(devkit.formatFiles).not.toHaveBeenCalled();
});
});