Files
cunningham/packages/tokens/src/bin/tests/Cunningham.spec.ts
Nathan Vasse 4fbd75cdcf 🐛(tokens) fix invalid sass with comma
The generated sass from tokens containing commas, like font families was
not valid due to the way maps are made in sass. So we wrap those value
in quotes.
2024-02-28 17:19:32 +01:00

181 lines
5.9 KiB
TypeScript

import * as fs from "fs";
import * as path from "path";
import * as child_process from "child_process";
import * as util from "util";
import { run } from "ThemeGenerator";
import { cleanup } from "tests/Utils";
// eslint-disable-next-line import/no-extraneous-dependencies
import Config from "../Config";
jest.mock("../Paths", () => ({
workPath: () => __dirname,
}));
const runBin = async (args: string) => {
const exec = util.promisify(child_process.exec);
const promise = exec(
path.join(__dirname, "..", "..", "..", "dist", "bin", "Main.js") +
" " +
args,
);
promise.child.stdout?.on("data", (data) => {
console.log("stdout: " + data);
});
promise.child.stderr?.on("data", (data) => {
console.log("stderr: " + data);
});
promise.child.on("close", (code) => {
console.log("closing code: " + code);
});
const { stdout, stderr } = await promise;
console.log("stdout", stdout);
console.log("stderr", stderr);
};
/**
* Test written here are supposed to be general ones and not specific to any generator.
*
* But as we need at least one generator to execute the bin we need to choose one to use by default,
* that's why we use the css generator.
*/
describe("Cunningham Bin", () => {
beforeAll(() => {
jest.spyOn(console, "log").mockImplementation(() => {});
cleanup(__dirname);
});
afterEach(() => {
cleanup(__dirname);
});
it("Runs without existing config file with default values.", async () => {
const cssTokensFile = path.join(__dirname, Config.tokenFilename + ".css");
expect(fs.existsSync(cssTokensFile)).toEqual(false);
await run(["", "", "-g", "css"]);
expect(fs.existsSync(cssTokensFile)).toEqual(true);
expect(fs.readFileSync(cssTokensFile).toString()).toMatchInlineSnapshot(`
":root {
--c--theme--colors--primary: #055FD2;
--c--theme--colors--secondary: #DA0000;
--c--theme--colors--ternary-900: #022858;
--c--theme--colors--ogre-odor-is-orange-indeed: #FD5240;
--c--theme--font--sizes--m: 1rem;
--c--theme--font--weights--medium: 400;
--c--theme--font--families--base: Roboto;
--c--theme--spacings--s: 1rem;
--c--theme--transitions--ease: linear;
--c--theme--input--border-color: var(--c--theme--colors--ternary-900);
--c--components--button--font-family: Times New Roman,Helvetica Neue,Segoe UI;
}
.cunningham-theme--dark{
--c--theme--colors--primary: black;
}
.cunningham-theme--custom{
--c--theme--colors--primary: green;
}
"
`);
});
it("Runs with existing JS config file using local values.", async () => {
const localConfigurationFile = path.join(__dirname, "cunningham.js");
expect(fs.existsSync(localConfigurationFile)).toEqual(false);
const cssTokensFile = path.join(__dirname, Config.tokenFilename + ".css");
expect(fs.existsSync(cssTokensFile)).toEqual(false);
fs.copyFileSync(
path.join(__dirname, "assets", "cunningham.js"),
localConfigurationFile,
);
expect(fs.existsSync(localConfigurationFile)).toEqual(true);
await run(["", "", "-g", "css"]);
expect(fs.existsSync(cssTokensFile)).toEqual(true);
expect(fs.readFileSync(cssTokensFile).toString()).toMatchInlineSnapshot(`
":root {
--c--theme--colors--primary: AntiqueWhite;
--c--theme--colors--secondary: #DA0000;
--c--theme--colors--ternary-900: #022858;
--c--theme--colors--ogre-odor-is-orange-indeed: #FD5240;
--c--theme--font--sizes--m: 1rem;
--c--theme--font--weights--medium: 400;
--c--theme--font--families--base: Roboto;
--c--theme--spacings--s: 1rem;
--c--theme--transitions--ease: linear;
--c--theme--input--border-color: var(--c--theme--colors--ternary-900);
--c--components--button--font-family: Times New Roman,Helvetica Neue,Segoe UI;
}
.cunningham-theme--dark{
--c--theme--colors--primary: black;
}
.cunningham-theme--custom{
--c--theme--colors--primary: green;
}
"
`);
});
it("Runs with existing TS config file using local values.", async () => {
const localConfigurationFile = path.join(__dirname, "cunningham.ts");
expect(fs.existsSync(localConfigurationFile)).toEqual(false);
const cssTokensFile = path.join(__dirname, Config.tokenFilename + ".css");
expect(fs.existsSync(cssTokensFile)).toEqual(false);
fs.copyFileSync(
path.join(__dirname, "assets", "cunningham.ts"),
localConfigurationFile,
);
expect(fs.existsSync(localConfigurationFile)).toEqual(true);
// We must run the bin directly to be sure that it compiles the TS file. ( Importing TS from
// TS will always work )
await runBin(`-g css -cwd ${__dirname}`);
expect(fs.existsSync(cssTokensFile)).toEqual(true);
expect(fs.readFileSync(cssTokensFile).toString()).toContain(`
\t--c--theme--colors--primary: typescript;`);
});
const testOutput = async (opt: string) => {
const outputDir = path.join(__dirname, "output");
const cssTokensFile = path.join(outputDir, Config.tokenFilename + ".css");
expect(fs.existsSync(cssTokensFile)).toEqual(false);
await run(["", "", "-g", "css", opt, outputDir]);
expect(fs.existsSync(cssTokensFile)).toEqual(true);
expect(fs.readFileSync(cssTokensFile).toString()).toMatchInlineSnapshot(`
":root {
--c--theme--colors--primary: #055FD2;
--c--theme--colors--secondary: #DA0000;
--c--theme--colors--ternary-900: #022858;
--c--theme--colors--ogre-odor-is-orange-indeed: #FD5240;
--c--theme--font--sizes--m: 1rem;
--c--theme--font--weights--medium: 400;
--c--theme--font--families--base: Roboto;
--c--theme--spacings--s: 1rem;
--c--theme--transitions--ease: linear;
--c--theme--input--border-color: var(--c--theme--colors--ternary-900);
--c--components--button--font-family: Times New Roman,Helvetica Neue,Segoe UI;
}
.cunningham-theme--dark{
--c--theme--colors--primary: black;
}
.cunningham-theme--custom{
--c--theme--colors--primary: green;
}
"
`);
};
it("Runs with -o options.", async () => {
await testOutput("-o");
});
it("Runs with --output options.", async () => {
await testOutput("--output");
});
});