igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
362 lines (332 loc) • 14.5 kB
text/typescript
import { EmptyTree } from "@angular-devkit/schematics";
import {
SchematicTestRunner,
UnitTestTree,
} from "@angular-devkit/schematics/testing";
import * as path from "path";
import { scssImport, cssImport } from "./add-normalize";
import {
DEPENDENCIES_MAP,
PackageTarget,
PackageEntry,
} from "../utils/dependency-handler";
import { ProjectType } from "../utils/util";
describe("ng-add schematics", () => {
const collectionPath = path.join(__dirname, "../collection.json");
const runner: SchematicTestRunner = new SchematicTestRunner(
"cli-schematics",
collectionPath
);
let tree: UnitTestTree;
const sourceRoot = "testSrc";
const ngJsonConfig = {
version: 1,
projects: {
testProj: {
root: "/",
sourceRoot,
projectType: ProjectType.Application,
architect: {
serve: {},
build: {
options: {
main: `${sourceRoot}/main.ts`,
polyfills: `${sourceRoot}/polyfills.ts`,
scripts: [],
},
},
test: {
options: {
main: `${sourceRoot}/test.ts`,
polyfills: `${sourceRoot}/polyfills.ts`,
scripts: [],
},
},
},
},
},
};
const pkgJsonConfig = {
dependencies: {},
devDependencies: {},
};
const resetJsonConfigs = (treeArg: UnitTestTree) => {
treeArg.overwrite("/angular.json", JSON.stringify(ngJsonConfig));
treeArg.overwrite("/package.json", JSON.stringify(pkgJsonConfig));
};
beforeEach(() => {
tree = new UnitTestTree(new EmptyTree());
tree.create("/angular.json", JSON.stringify(ngJsonConfig));
tree.create("/package.json", JSON.stringify(pkgJsonConfig));
tree.create(`${sourceRoot}/main.ts`, "// test comment");
tree.create(`${sourceRoot}/test.ts`, "// test comment");
});
it("should include ALL dependencies in map", () => {
const pkgJson = require("../../package.json");
const allDependencies = Object.assign(
{},
pkgJson.dependencies,
pkgJson.peerDependencies,
pkgJson.igxDevDependencies
);
for (const key of Object.keys(allDependencies)) {
const expectedPackages: PackageEntry = {
name: key,
target: jasmine.anything() as any,
};
expect(DEPENDENCIES_MAP).toContain(
expectedPackages,
`Dependency ${key} missing in dependencies map!`
);
}
});
it("should add packages to package.json dependencies", async () => {
const expectedDeps = DEPENDENCIES_MAP.filter(
(dep) => dep.target === PackageTarget.REGULAR
).map((dep) => dep.name);
const expectedDevDeps = DEPENDENCIES_MAP.filter(
(dep) => dep.target === PackageTarget.DEV
).map((dep) => dep.name);
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const pkgJsonData = JSON.parse(tree.readContent("/package.json"));
expect(pkgJsonData.dependencies).toBeTruthy();
expect(pkgJsonData.devDependencies).toBeTruthy();
// Check for explicit dependencies
expect(Object.keys(pkgJsonData.dependencies).length).toEqual(
expectedDeps.length,
`Different number of added dependencies!`
);
expect(Object.keys(pkgJsonData.devDependencies).length).toEqual(
expectedDevDeps.length,
`Different number of added devDependencies!`
);
for (const dependency of expectedDeps) {
expect(pkgJsonData.dependencies.hasOwnProperty(dependency)).toEqual(
true,
`Dependency ${dependency} is missing from output!`
);
}
for (const dependency of expectedDevDeps) {
expect(
pkgJsonData.devDependencies.hasOwnProperty(dependency)
).toEqual(
true,
`DevDependency ${dependency} is missing from output!`
);
}
});
it("should add the correct igniteui-angular-sovn packages to package.json dependencies", async () => {
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const pkgJsonData = JSON.parse(tree.readContent("/package.json"));
expect(pkgJsonData.dependencies["fflate"]).toBeTruthy();
expect(pkgJsonData.dependencies["hammerjs"]).toBeTruthy();
});
it("should NOT add hammer.js to the main.ts file", async () => {
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const mainTs = tree.read(`${sourceRoot}/main.ts`).toString();
expect(mainTs).not.toContain("import 'hammerjs';");
});
it("should NOT add hammer.js to the test.ts file", async () => {
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const testTs = tree.read(`${sourceRoot}/test.ts`).toString();
expect(testTs).not.toContain("import 'hammerjs';");
});
it("should add hammer.js in angular.json build options under scripts", async () => {
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const ngJsonConfigResult = JSON.parse(
tree.read("/angular.json").toString()
);
expect(
ngJsonConfigResult.projects.testProj.architect.build.options.scripts
).toContain("./node_modules/hammerjs/hammer.min.js");
});
it("should add hammer.js in angular.json test options under scripts", async () => {
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const ngJsonConfigResult = JSON.parse(
tree.read("/angular.json").toString()
);
expect(
ngJsonConfigResult.projects.testProj.architect.test.options.scripts
).toContain("./node_modules/hammerjs/hammer.min.js");
});
it("should NOT duplicate hammer.js if it exists in angular.json build options", async () => {
const ngJsonConfig1 = JSON.parse(tree.read("/angular.json").toString());
ngJsonConfig1.projects.testProj.architect.build.options.scripts.push(
"./node_modules/hammerjs/hammer.min.js"
);
tree.overwrite("/angular.json", JSON.stringify(ngJsonConfig1));
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const ngJsonConfigResult = JSON.parse(
tree.read("/angular.json").toString()
);
expect(
ngJsonConfigResult.projects.testProj.architect.build.options.scripts
.length
).toBe(1);
expect(
ngJsonConfigResult.projects.testProj.architect.build.options.scripts
).toMatch("./node_modules/hammerjs/hammer.min.js");
});
it("should NOT duplicate hammer.js if it exists in angular.json test options", async () => {
const ngJsonConfig1 = JSON.parse(tree.read("/angular.json").toString());
ngJsonConfig1.projects.testProj.architect.test.options.scripts.push(
"./node_modules/hammerjs/hammer.min.js"
);
tree.overwrite("/angular.json", JSON.stringify(ngJsonConfig1));
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const ngJsonConfigResult = JSON.parse(
tree.read("/angular.json").toString()
);
expect(
ngJsonConfigResult.projects.testProj.architect.test.options.scripts
.length
).toBe(1);
expect(
ngJsonConfigResult.projects.testProj.architect.test.options.scripts
).toMatch("./node_modules/hammerjs/hammer.min.js");
});
it("should NOT add hammer.js to main.ts if it exists in angular.json build options", async () => {
const ngJsonConfig1 = JSON.parse(tree.read("/angular.json").toString());
ngJsonConfig1.projects.testProj.architect.build.options.scripts.push(
"./node_modules/hammerjs/hammer.min.js"
);
tree.overwrite("/angular.json", JSON.stringify(ngJsonConfig1));
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const newContent = tree.read(`${sourceRoot}/main.ts`).toString();
expect(newContent).toMatch("// test comment");
});
it("should NOT add hammer.js to test.ts if it exists in angular.json test options", async () => {
const ngJsonConfig1 = JSON.parse(tree.read("/angular.json").toString());
ngJsonConfig1.projects.testProj.architect.test.options.scripts.push(
"./node_modules/hammerjs/hammer.min.js"
);
tree.overwrite("/angular.json", JSON.stringify(ngJsonConfig1));
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const newContent = tree.read(`${sourceRoot}/test.ts`).toString();
expect(newContent).toMatch("// test comment");
});
it("should add hammer.js to package.json dependencies", async () => {
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const pkgJsonData = JSON.parse(tree.readContent("/package.json"));
expect(pkgJsonData.dependencies["hammerjs"]).toBeTruthy();
});
it("should NOT add hammer.js to angular.json if it exists in main.ts options", async () => {
const mainTsPath = `${sourceRoot}/main.ts`;
const content = tree.read(mainTsPath).toString();
tree.overwrite(mainTsPath, "import 'hammerjs';\n" + content);
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const ngJsonConfigResult = JSON.parse(
tree.read("/angular.json").toString()
);
expect(
ngJsonConfigResult.projects.testProj.architect.build.options.scripts
.length
).toBe(0);
expect(
ngJsonConfigResult.projects.testProj.architect.build.options.scripts
).not.toContain("./node_modules/hammerjs/hammer.min.js");
});
it("should add the CLI only to devDependencies", async () => {
await runner
.runSchematicAsync("ng-add", { normalizeCss: false }, tree)
.toPromise();
const pkgJsonData = JSON.parse(tree.readContent("/package.json"));
const version =
require("../../package.json")["igxDevDependencies"][
"@igniteui/angular-schematics"
];
expect(
pkgJsonData.devDependencies["@igniteui/angular-schematics"]
).toBe(version);
expect(
pkgJsonData.dependencies["@igniteui/angular-schematics"]
).toBeFalsy();
});
it("should properly add css reset", async () => {
tree.create(`${sourceRoot}/styles.scss`, "");
await runner
.runSchematicAsync("ng-add", { normalizeCss: true }, tree)
.toPromise();
let pkgJsonData = JSON.parse(tree.readContent("/package.json"));
expect(tree.readContent(`${sourceRoot}/styles.scss`)).toEqual(
scssImport
);
expect(pkgJsonData.dependencies["minireset.css"]).toBeTruthy();
resetJsonConfigs(tree);
tree.delete(`${sourceRoot}/styles.scss`);
tree.create(`${sourceRoot}/styles.sass`, "");
await runner
.runSchematicAsync("ng-add", { normalizeCss: true }, tree)
.toPromise();
pkgJsonData = JSON.parse(tree.readContent("/package.json"));
expect(tree.readContent(`${sourceRoot}/styles.sass`)).toEqual(
scssImport
);
expect(pkgJsonData.dependencies["minireset.css"]).toBeTruthy();
resetJsonConfigs(tree);
tree.delete(`${sourceRoot}/styles.sass`);
tree.create(`${sourceRoot}/styles.css`, "");
await runner
.runSchematicAsync("ng-add", { normalizeCss: true }, tree)
.toPromise();
pkgJsonData = JSON.parse(tree.readContent("/package.json"));
expect(tree.readContent(`${sourceRoot}/styles.css`)).toBe("");
expect(pkgJsonData.dependencies["minireset.css"]).toBeTruthy();
expect(
JSON.parse(tree.readContent("/angular.json")).projects["testProj"]
.architect.build.options.styles
).toContain(cssImport);
resetJsonConfigs(tree);
tree.delete(`${sourceRoot}/styles.css`);
tree.create(`${sourceRoot}/styles.less`, "");
await runner
.runSchematicAsync("ng-add", { normalizeCss: true }, tree)
.toPromise();
pkgJsonData = JSON.parse(tree.readContent("/package.json"));
expect(tree.readContent(`${sourceRoot}/styles.less`)).toBe("");
expect(pkgJsonData.dependencies["minireset.css"]).toBeTruthy();
expect(
JSON.parse(tree.readContent("/angular.json")).projects["testProj"]
.architect.build.options.styles
).toContain(cssImport);
resetJsonConfigs(tree);
tree.delete(`${sourceRoot}/styles.less`);
tree.create(`${sourceRoot}/styles.styl`, "");
await runner
.runSchematicAsync("ng-add", { normalizeCss: true }, tree)
.toPromise();
pkgJsonData = JSON.parse(tree.readContent("/package.json"));
expect(tree.readContent(`${sourceRoot}/styles.styl`)).toBe("");
expect(pkgJsonData.dependencies["minireset.css"]).toBeTruthy();
expect(
JSON.parse(tree.readContent("/angular.json")).projects["testProj"]
.architect.build.options.styles
).toContain(cssImport);
resetJsonConfigs(tree);
tree.delete(`${sourceRoot}/styles.styl`);
});
});