Skip to content

Instantly share code, notes, and snippets.

import { Tree } from '@angular-devkit/schematics';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import * as path from 'path';
const collectionPath = path.join(__dirname, '../collection.json');
describe('simple-schematic', () => {
it('works', () => {
const runner = new SchematicTestRunner('schematics', collectionPath);
const tree = runner.runSchematic('simple-schematic', {}, Tree.empty());
const schematicRunner = new SchematicTestRunner(
'@schematics/angular', angularCollectionPath);
import {Schema as WorkspaceOptions} from '@schematics/angular/workspace/schema';
import {Schema as ApplicationOptions} from '@schematics/angular/application/schema';
...
const workspaceOptions: WorkspaceOptions = {
name: 'workspace',
newProjectRoot: 'projects',
version: '6.0.0',
};
it('works', () => {
const tree = testRunner.runSchematic('simple-schematic', {
name: "test"
}, appTree);
//[see assertions below]
});
expect(tree.files).toEqual([
"/README.md",
"/angular.json",
"/package.json",
"/tsconfig.json",
"/tslint.json",
"/.editorconfig",
"/.gitignore",
...
"/projects/bar/src/app/test/test.spec.ts",
expect(tree.readContent("/projects/bar/src/app/test/test.ts"))
.toContain(
"export class Test {\n" +
"\n" +
"}"
);
const movePath = (options.flat) ?
normalize(options.path) :
normalize(options.path + '/' + strings.dasherize(options.name));
const templateSource = apply(url('./files'), [
options.spec ? noop() : filter(path => !path.endsWith('.spec.ts')),
template({
...strings,
...options,
}),
move(movePath),
]);
const rule = mergeWith(templateSource, MergeStrategy.Default);
export function simpleSchematic(options: any): Rule {
return (tree: Tree, _context: SchematicContext) => {
setupOptions(tree, options);
const movePath = (options.flat) ?
normalize(options.path) :
normalize(options.path + '/' + strings.dasherize(options.name));
const templateSource = apply(url('./files'), [
options.spec ? noop() : filter(path => !path.endsWith('.spec.ts')),