diff options
| author | 2023-04-28 01:36:44 +0800 | |
|---|---|---|
| committer | 2023-04-28 01:36:44 +0800 | |
| commit | dd84b9d64fb98746a230cd24233ff50a562c39c9 (patch) | |
| tree | b583261ef00b3afe72ec4d6dacb31e57779a6faf /packages/eslint-plugin-turbo/__tests__ | |
| parent | 0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff) | |
| download | HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip | |
Diffstat (limited to 'packages/eslint-plugin-turbo/__tests__')
| -rw-r--r-- | packages/eslint-plugin-turbo/__tests__/cwd.test.ts | 88 | ||||
| -rw-r--r-- | packages/eslint-plugin-turbo/__tests__/lib/no-undeclared-env-vars.test.ts | 433 |
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", + }, + ], + }, + ], +}); |
