aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/eslint-plugin-turbo/__tests__
diff options
context:
space:
mode:
author简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
committer简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
commitdd84b9d64fb98746a230cd24233ff50a562c39c9 (patch)
treeb583261ef00b3afe72ec4d6dacb31e57779a6faf /packages/eslint-plugin-turbo/__tests__
parent0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff)
downloadHydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz
HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip
Diffstat (limited to 'packages/eslint-plugin-turbo/__tests__')
-rw-r--r--packages/eslint-plugin-turbo/__tests__/cwd.test.ts88
-rw-r--r--packages/eslint-plugin-turbo/__tests__/lib/no-undeclared-env-vars.test.ts433
2 files changed, 521 insertions, 0 deletions
diff --git a/packages/eslint-plugin-turbo/__tests__/cwd.test.ts b/packages/eslint-plugin-turbo/__tests__/cwd.test.ts
new file mode 100644
index 0000000..15a2695
--- /dev/null
+++ b/packages/eslint-plugin-turbo/__tests__/cwd.test.ts
@@ -0,0 +1,88 @@
+import path from "path";
+import JSON5 from "json5";
+import { execSync } from "child_process";
+import { Schema } from "@turbo/types";
+import { setupTestFixtures } from "@turbo/test-utils";
+
+describe("eslint settings check", () => {
+ const { useFixture } = setupTestFixtures({
+ directory: path.join(__dirname, "../"),
+ });
+
+ it("does the right thing for peers", () => {
+ const { root: cwd } = useFixture({ fixture: "workspace" });
+ execSync(`npm install`, { cwd });
+
+ const configString = execSync(`eslint --print-config peer.js`, {
+ cwd,
+ encoding: "utf8",
+ });
+ const configJson = JSON5.parse(configString);
+
+ expect(configJson.settings).toEqual({
+ turbo: { envVars: ["CI", "UNORDERED"] },
+ });
+ });
+
+ it("does the right thing for child dirs", () => {
+ const { root } = useFixture({ fixture: "workspace" });
+ execSync(`npm install`, { cwd: root });
+
+ const cwd = path.join(root, "child");
+ const configString = execSync(`eslint --print-config child.js`, {
+ cwd,
+ encoding: "utf8",
+ });
+ const configJson = JSON5.parse(configString);
+
+ expect(configJson.settings).toEqual({
+ turbo: { envVars: ["CI", "UNORDERED"] },
+ });
+ });
+});
+
+describe("eslint cache is busted", () => {
+ const { useFixture } = setupTestFixtures({
+ directory: path.join(__dirname, "../"),
+ });
+
+ it("catches a lint error after changing config", () => {
+ expect.assertions(2);
+
+ // ensure that we populate the cache with a failure.
+ const { root, readJson, write } = useFixture({ fixture: "workspace" });
+ execSync(`npm install`, { cwd: root });
+
+ const cwd = path.join(root, "child");
+ try {
+ execSync(`eslint --format=json child.js`, { cwd, encoding: "utf8" });
+ } catch (error: any) {
+ const outputJson = JSON5.parse(error.stdout);
+ expect(outputJson).toMatchObject([
+ {
+ messages: [
+ {
+ message:
+ "NONEXISTENT is not listed as a dependency in turbo.json",
+ },
+ ],
+ },
+ ]);
+ }
+
+ // change the configuration
+ const turboJson = readJson<Schema>("turbo.json");
+ if (turboJson && "globalEnv" in turboJson) {
+ turboJson.globalEnv = ["CI", "NONEXISTENT"];
+ write("turbo.json", JSON5.stringify(turboJson, null, 2));
+ }
+
+ // test that we invalidated the eslint cache
+ const output = execSync(`eslint --format=json child.js`, {
+ cwd,
+ encoding: "utf8",
+ });
+ const outputJson = JSON5.parse(output);
+ expect(outputJson).toMatchObject([{ errorCount: 0 }]);
+ });
+});
diff --git a/packages/eslint-plugin-turbo/__tests__/lib/no-undeclared-env-vars.test.ts b/packages/eslint-plugin-turbo/__tests__/lib/no-undeclared-env-vars.test.ts
new file mode 100644
index 0000000..5c753dd
--- /dev/null
+++ b/packages/eslint-plugin-turbo/__tests__/lib/no-undeclared-env-vars.test.ts
@@ -0,0 +1,433 @@
+import { RULES } from "../../lib/constants";
+import rule from "../../lib/rules/no-undeclared-env-vars";
+import { RuleTester } from "eslint";
+import path from "path";
+
+const ruleTester = new RuleTester({
+ parserOptions: { ecmaVersion: 2020 },
+});
+
+ruleTester.run(RULES.noUndeclaredEnvVars, rule, {
+ valid: [
+ {
+ code: `
+ const { ENV_2 } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/workspace-configs") },
+ ],
+ filename: path.join(
+ __dirname,
+ "../../__fixtures__/workspace-configs/apps/web/index.js"
+ ),
+ },
+ {
+ code: `
+ const { ENV_1 } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/workspace-configs") },
+ ],
+ filename: path.join(
+ __dirname,
+ "../../__fixtures__/workspace-configs/apps/web/index.js"
+ ),
+ },
+ {
+ code: `
+ const { ENV_1 } = process.env;
+ `,
+ options: [{ cwd: "/some/random/path" }],
+ },
+ {
+ code: `
+ const { CI } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/workspace-configs") },
+ ],
+ filename: path.join(
+ __dirname,
+ "../../__fixtures__/workspace-configs/apps/web/index.js"
+ ),
+ },
+ {
+ code: `
+ const { TASK_ENV_KEY, ANOTHER_ENV_KEY } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: `
+ const { NEW_STYLE_ENV_KEY, TASK_ENV_KEY } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: `
+ const { NEW_STYLE_GLOBAL_ENV_KEY, TASK_ENV_KEY } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: `
+ const val = process.env["NEW_STYLE_GLOBAL_ENV_KEY"];
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: `
+ const { TASK_ENV_KEY, ANOTHER_ENV_KEY } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: `
+ const x = process.env.GLOBAL_ENV_KEY;
+ const { TASK_ENV_KEY, GLOBAL_ENV_KEY: renamedX } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: "var x = process.env.GLOBAL_ENV_KEY;",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: "let x = process.env.TASK_ENV_KEY;",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: "const x = process.env.ANOTHER_KEY_VALUE;",
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ANOTHER_KEY_[A-Z]+$"],
+ },
+ ],
+ },
+ {
+ code: `
+ var x = process.env.ENV_VAR_ONE;
+ var y = process.env.ENV_VAR_TWO;
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ENV_VAR_[A-Z]+$"],
+ },
+ ],
+ },
+ {
+ code: `
+ var x = process.env.ENV_VAR_ONE;
+ var y = process.env.ENV_VAR_TWO;
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ENV_VAR_O[A-Z]+$", "ENV_VAR_TWO"],
+ },
+ ],
+ },
+ {
+ code: `
+ var globalOrTask = process.env.TASK_ENV_KEY || process.env.GLOBAL_ENV_KEY;
+ var oneOrTwo = process.env.ENV_VAR_ONE || process.env.ENV_VAR_TWO;
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ENV_VAR_[A-Z]+$"],
+ },
+ ],
+ },
+ {
+ code: `
+ () => { return process.env.GLOBAL_ENV_KEY }
+ () => { return process.env.TASK_ENV_KEY }
+ () => { return process.env.ENV_VAR_ALLOWED }
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ENV_VAR_[A-Z]+$"],
+ },
+ ],
+ },
+ {
+ code: `
+ var foo = process?.env.GLOBAL_ENV_KEY
+ var foo = process?.env.TASK_ENV_KEY
+ var foo = process?.env.ENV_VAR_ALLOWED
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ENV_VAR_[A-Z]+$"],
+ },
+ ],
+ },
+ {
+ code: `
+ function test(arg1 = process.env.GLOBAL_ENV_KEY) {};
+ function test(arg1 = process.env.TASK_ENV_KEY) {};
+ function test(arg1 = process.env.ENV_VAR_ALLOWED) {};
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ENV_VAR_[A-Z]+$"],
+ },
+ ],
+ },
+ {
+ code: `
+ (arg1 = process.env.GLOBAL_ENV_KEY) => {}
+ (arg1 = process.env.TASK_ENV_KEY) => {}
+ (arg1 = process.env.ENV_VAR_ALLOWED) => {}
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ENV_VAR_[A-Z]+$"],
+ },
+ ],
+ },
+ {
+ code: "const getEnv = (key) => process.env[key];",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: "function getEnv(key) { return process.env[key]; }",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ {
+ code: "for (let x of ['ONE', 'TWO', 'THREE']) { console.log(process.env[x]); }",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ },
+ ],
+
+ invalid: [
+ {
+ code: `
+ const { ENV_2 } = process.env;
+ `,
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/workspace-configs") },
+ ],
+ filename: path.join(
+ __dirname,
+ "../../__fixtures__/workspace-configs/apps/docs/index.js"
+ ),
+ errors: [
+ {
+ message:
+ "ENV_2 is not listed as a dependency in the root turbo.json or workspace (apps/docs) turbo.json",
+ },
+ ],
+ },
+ {
+ code: "let { X } = process.env;",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ errors: [{ message: "X is not listed as a dependency in turbo.json" }],
+ },
+ {
+ code: "const { X, Y, Z } = process.env;",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ errors: [
+ { message: "X is not listed as a dependency in turbo.json" },
+ { message: "Y is not listed as a dependency in turbo.json" },
+ { message: "Z is not listed as a dependency in turbo.json" },
+ ],
+ },
+ {
+ code: "const { X, Y: NewName, Z } = process.env;",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ errors: [
+ { message: "X is not listed as a dependency in turbo.json" },
+ { message: "Y is not listed as a dependency in turbo.json" },
+ { message: "Z is not listed as a dependency in turbo.json" },
+ ],
+ },
+ {
+ code: "var x = process.env.NOT_THERE;",
+ options: [
+ { cwd: path.join(__dirname, "../../__fixtures__/configs/single") },
+ ],
+ errors: [
+ {
+ message: "NOT_THERE is not listed as a dependency in turbo.json",
+ },
+ ],
+ },
+ {
+ code: "var x = process.env.KEY;",
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ allowList: ["^ANOTHER_KEY_[A-Z]+$"],
+ },
+ ],
+ errors: [{ message: "KEY is not listed as a dependency in turbo.json" }],
+ },
+ {
+ code: `
+ var globalOrTask = process.env.TASK_ENV_KEY_NEW || process.env.GLOBAL_ENV_KEY_NEW;
+ var oneOrTwo = process.env.ENV_VAR_ONE || process.env.ENV_VAR_TWO;
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ },
+ ],
+ errors: [
+ {
+ message:
+ "TASK_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "GLOBAL_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message: "ENV_VAR_ONE is not listed as a dependency in turbo.json",
+ },
+ {
+ message: "ENV_VAR_TWO is not listed as a dependency in turbo.json",
+ },
+ ],
+ },
+ {
+ code: `
+ () => { return process.env.GLOBAL_ENV_KEY_NEW }
+ () => { return process.env.TASK_ENV_KEY_NEW }
+ () => { return process.env.ENV_VAR_NOT_ALLOWED }
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ },
+ ],
+ errors: [
+ {
+ message:
+ "GLOBAL_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "TASK_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "ENV_VAR_NOT_ALLOWED is not listed as a dependency in turbo.json",
+ },
+ ],
+ },
+ {
+ code: `
+ var foo = process?.env.GLOBAL_ENV_KEY_NEW
+ var foo = process?.env.TASK_ENV_KEY_NEW
+ var foo = process?.env.ENV_VAR_NOT_ALLOWED
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ },
+ ],
+ errors: [
+ {
+ message:
+ "GLOBAL_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "TASK_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "ENV_VAR_NOT_ALLOWED is not listed as a dependency in turbo.json",
+ },
+ ],
+ },
+ {
+ code: `
+ function test(arg1 = process.env.GLOBAL_ENV_KEY_NEW) {};
+ function test(arg1 = process.env.TASK_ENV_KEY_NEW) {};
+ function test(arg1 = process.env.ENV_VAR_NOT_ALLOWED) {};
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ },
+ ],
+ errors: [
+ {
+ message:
+ "GLOBAL_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "TASK_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "ENV_VAR_NOT_ALLOWED is not listed as a dependency in turbo.json",
+ },
+ ],
+ },
+ {
+ code: `
+ (arg1 = process.env.GLOBAL_ENV_KEY_NEW) => {}
+ (arg1 = process.env.TASK_ENV_KEY_NEW) => {}
+ (arg1 = process.env.ENV_VAR_NOT_ALLOWED) => {}
+ `,
+ options: [
+ {
+ cwd: path.join(__dirname, "../../__fixtures__/configs/single"),
+ },
+ ],
+ errors: [
+ {
+ message:
+ "GLOBAL_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "TASK_ENV_KEY_NEW is not listed as a dependency in turbo.json",
+ },
+ {
+ message:
+ "ENV_VAR_NOT_ALLOWED is not listed as a dependency in turbo.json",
+ },
+ ],
+ },
+ ],
+});