Move some tests for invalid config to unit test (#20139)

This commit is contained in:
fisker Cheung authored and GitHub committed 2026-09-23 13:17:12 +08:00
1 parent 0fc9e3eab8
commit ef3b24298c
10 files changed
+108 -135

No files matched your search

@@ -25,15 +25,6 @@ exports[`show warning with unknown option 1`] = `
}
`;
exports[`throw error for unsupported extension 1`] = `
{
"stderr": "[error] Invalid configuration:
[error] No loader specified for extension ".unsupported"",
"stdout": "",
"write": [],
}
`;
exports[`throw error if both --config and --no-config are submitted 1`] = `
{
"stderr": "[error] Cannot use --no-config and --config together.",
@@ -46,20 +37,6 @@ exports[`throw error if both --config and --no-config are submitted 2`] = `
}
`;
exports[`throw error with invalid config format 1`] = `
{
"stdout": "",
"write": [],
}
`;
exports[`throw error with invalid config format 2`] = `
{
"stdout": "",
"write": [],
}
`;
exports[`throw error with invalid config option (int) 1`] = `
{
"stderr": "[error] Invalid tabWidth value. Expected an integer, but received 0.5.",
@@ -1,34 +1,8 @@
import fs from "node:fs/promises";
import outdent from "outdent";
import jestPathSerializer from "../path-serializer.js";
expect.addSnapshotSerializer(jestPathSerializer);
describe("throw error for unsupported extension", () => {
runCli("cli/config/invalid", [
"--config",
"file/.prettierrc.unsupported",
]).test({
status: "non-zero",
});
});
describe("throw error with invalid config format", () => {
runCli("cli/config/invalid", ["--config", "file/.prettierrc"]).test({
status: "non-zero",
stderr: expect.stringMatching(/Cannot find package '--invalid--'/),
});
});
describe("throw error with invalid config format", () => {
runCli("cli/config/invalid", ["--config", "type-error/.prettierrc"]).test({
status: "non-zero",
stderr: expect.stringContaining(
"Config is only allowed to be an object, but received number in",
),
});
});
describe("throw error with invalid config target (directory)", () => {
runCli("cli/config/invalid", [
"--config",
@@ -122,80 +96,6 @@ describe("show warning with kebab-case option key", () => {
});
});
// #8815, please make sure this error contains code frame
describe("Invalid json file", () => {
runCli("cli/config/invalid", [
"--config",
"broken-json/.prettierrc.json",
"--parser",
"babel",
]).test({
status: 2,
stdout: "",
write: [],
stderr: expect.stringContaining(
outdent`
> 1 | {a':}
| ^
2 |
`
.split("\n")
.map((line) => `[error] ${line}`)
.join("\n"),
),
});
});
describe("Invalid toml file", () => {
runCli("cli/config/invalid", [
"--config",
"broken-toml/.prettierrc.toml",
"--parser",
"babel",
]).test({
status: 2,
stdout: "",
write: [],
stderr: expect.stringContaining(
outdent`
Invalid TOML document: incomplete declaration: value expected
1: a=
^
2: b!=
`
.split("\n")
.map((line) => `[error] ${line}`)
.join("\n"),
),
});
});
describe("Invalid yaml file", () => {
runCli("cli/config/invalid", [
"--config",
"broken-yaml/.prettierrc.yaml",
"--parser",
"babel",
]).test({
status: 2,
stdout: "",
write: [],
stderr: expect.stringContaining(
// Keep the outdent, since error message changes between versions
outdent`
Map keys must be unique at line 1, column 3:
a:
^
`
.split("\n")
.map((line) => `[error] ${line}`)
.join("\n"),
),
});
});
describe("Invalid config value", () => {
runCli("cli/config/invalid", [
"--config",
@@ -1 +0,0 @@
{a':}
@@ -1,2 +0,0 @@
a=
b!=
@@ -1,2 +0,0 @@
a:
a:
@@ -1 +0,0 @@
--invalid--
@@ -1 +0,0 @@
{}
@@ -1 +0,0 @@
1
+104
View File
@@ -0,0 +1,104 @@
import fs from "node:fs/promises";
import path from "node:path";
import url from "node:url";
import { temporaryDirectory as getTemporaryDirectory } from "tempy";
import loadConfig from "../../src/config/prettier-config/load-config.js";
import createPathSerializer from "../integration/create-path-serializer.js";
const directory = getTemporaryDirectory();
expect.addSnapshotSerializer(
createPathSerializer({
replacements: new Map([[url.pathToFileURL(directory + "/"), "<dir>/"]]),
}),
);
async function loadConfigFile({ filename, content }) {
const file = path.join(directory, filename);
await fs.writeFile(file, content);
return await loadConfig(file);
}
describe("Invalid configs", () => {
afterAll(async () => {
await fs.rm(directory, { recursive: true, force: true });
});
test("throw error for unsupported extension", async () => {
await expect(() =>
loadConfigFile({ filename: ".prettierrc.unsupported", content: "{}" }),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"No loader specified for extension ".unsupported""`,
);
});
test("throw error with invalid config format", async () => {
await expect(() =>
loadConfigFile({ filename: ".prettierrc", content: "--invalid--" }),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"Cannot find package '--invalid--' imported from <dir>/.prettierrc"`,
);
});
test("throw error with invalid config format", async () => {
await expect(() =>
loadConfigFile({ filename: ".prettierrc", content: "1" }),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"Config is only allowed to be an object, but received number in "<dir>/.prettierrc""`,
);
});
// #8815, please make sure this error contains code frame
test("Invalid JSON file", async () => {
await expect(() =>
loadConfigFile({ filename: ".prettierrc.json", content: "{a':}" }),
).rejects.toThrowErrorMatchingInlineSnapshot(`
"JSON Error in "<dir>/.prettierrc.json":
Expected property name or '}' in JSON at position 1 (line 1 column 2)
> 1 | {a':}
| ^
> 1 | {a':}
| ^
Cause: Expected property name or '}' in JSON at position 1 (line 1 column 2)"
`);
});
test("Invalid TOML file", async () => {
await expect(() =>
loadConfigFile({ filename: ".prettierrc.toml", content: "a=\n b!=" }),
).rejects.toThrowErrorMatchingInlineSnapshot(`
"TOML Error in "<dir>/.prettierrc.toml":
Invalid TOML document: incomplete declaration: value expected
1: a=
^
2: b!=
"
`);
});
test("Invalid YAML file", async () => {
await expect(() =>
loadConfigFile({ filename: ".prettierrc.yaml", content: "a:\na:" }),
).rejects.toThrowErrorMatchingInlineSnapshot(`
"YAML Error in "<dir>/.prettierrc.yaml":
Map keys must be unique at line 1, column 3:
a:
^
"
`);
});
test("Invalid JSON5 file", async () => {
await expect(() =>
loadConfigFile({ filename: ".prettierrc.json5", content: "a:" }),
).rejects.toThrowErrorMatchingInlineSnapshot(`
"JSON5 Error in "<dir>/.prettierrc.json5":
JSON5: invalid character 'a' at 1:1"
`);
});
});