Skip to content

Commit 6fb62d0

Browse files
Improved testing of rejected patterns
1 parent 4c2741a commit 6fb62d0

4 files changed

Lines changed: 97 additions & 28 deletions

File tree

src/test/cli.test.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import type {
1414
ParsedArgs,
1515
} from "../types.js";
1616
import { EXIT_FAIL, EXIT_OK } from "../util/constants.js";
17-
import { createLogger } from "../util/createLogger.js";
17+
import { createLogger, createTestLogger } from "../util/createLogger.js";
1818
import { getDefaultArguments } from "../util/getDefaultArguments.js";
1919
import { normalizeToPosix } from "../util/normalizeToPosix.js";
2020
import { parseArgs } from "../util/parseArgs.js";
@@ -28,7 +28,7 @@ suite("CLI", () => {
2828
"content",
2929
);
3030
const cli = createCLI((text) => `${text} updated`);
31-
const logger = createLogger(true);
31+
const logger = createTestLogger();
3232

3333
try {
3434
const didChange = await formatFile({
@@ -54,7 +54,7 @@ suite("CLI", () => {
5454
"content",
5555
);
5656
const cli = createCLI((text) => `${text} updated`);
57-
const logger = createLogger(true);
57+
const logger = createTestLogger();
5858

5959
try {
6060
const didChange = await formatFile({
@@ -83,7 +83,7 @@ suite("CLI", () => {
8383
const cli = createCLI((text) =>
8484
text === "changed" ? "changed updated" : text,
8585
);
86-
const logger = createLogger(true);
86+
const logger = createTestLogger();
8787

8888
try {
8989
await fs.writeFile(unchangedFileName, "unchanged", "utf8");
@@ -113,7 +113,7 @@ suite("CLI", () => {
113113
test("Ignores missing files", async () => {
114114
const fileName = path.join(os.tmpdir(), "talonfmt-missing.txt");
115115
const cli = createCLI((text) => `${text} updated`);
116-
const logger = createLogger(true);
116+
const logger = createTestLogger();
117117

118118
const didChange = await formatFile({
119119
cli,
@@ -135,7 +135,7 @@ suite("CLI", () => {
135135
const cli = createCLI(
136136
(_text, options) => `indentSize=${options.indentSize ?? "unset"}`,
137137
);
138-
const logger = createLogger(true);
138+
const logger = createTestLogger();
139139

140140
try {
141141
await writeEditorConfig(fileName, {
@@ -167,7 +167,7 @@ suite("CLI", () => {
167167
const cli = createCLI(
168168
(_text, options) => `indentSize=${options.indentSize ?? "unset"}`,
169169
);
170-
const logger = createLogger(true);
170+
const logger = createTestLogger();
171171

172172
try {
173173
await writeEditorConfig(fileName, {
@@ -201,7 +201,7 @@ suite("CLI", () => {
201201
(_text, options) =>
202202
`maxLineLength=${options.maxLineLength ?? "unset"}`,
203203
);
204-
const logger = createLogger(true);
204+
const logger = createTestLogger();
205205

206206
try {
207207
await writeEditorConfig(fileName, {
@@ -233,7 +233,7 @@ suite("CLI", () => {
233233
const cli = createCLI(
234234
(_text, options) => `endOfLine=${options.endOfLine ?? "unset"}`,
235235
);
236-
const logger = createLogger(true);
236+
const logger = createTestLogger();
237237

238238
try {
239239
await writeEditorConfig(fileName, {
@@ -265,7 +265,7 @@ suite("CLI", () => {
265265
const cli = createCLI(() => {
266266
throw new Error("boom");
267267
});
268-
const logger = createLogger(true);
268+
const logger = createTestLogger();
269269

270270
try {
271271
await assert.rejects(
@@ -285,7 +285,7 @@ suite("CLI", () => {
285285

286286
test("Writes formatted stdin to stdout", async () => {
287287
const cli = createCLI((text) => `${text} updated`);
288-
const logger = createLogger();
288+
const logger = createTestLogger();
289289
const output = await captureStreamWrite(process.stdout, async () =>
290290
readAndFormatStdin(cli, logger, "content"),
291291
);
@@ -312,7 +312,7 @@ suite("CLI", () => {
312312
"content",
313313
);
314314
const cli = createCLI((text) => `${text} updated`);
315-
const logger = createLogger(true);
315+
const logger = createTestLogger();
316316

317317
try {
318318
const stdout = await captureStreamWrite(process.stdout, async () =>
@@ -379,7 +379,7 @@ suite("CLI", () => {
379379

380380
test("Returns success for unchanged stdin in check mode", async () => {
381381
const cli = createCLI((text) => text);
382-
const logger = createLogger();
382+
const logger = createTestLogger();
383383
const stderr = await captureStreamWrite(process.stderr, async () =>
384384
readAndFormatStdin(cli, logger, "content", true),
385385
);
@@ -418,7 +418,7 @@ suite("CLI", () => {
418418
return Promise.resolve(text);
419419
},
420420
};
421-
const logger = createLogger(true);
421+
const logger = createTestLogger();
422422

423423
try {
424424
await writeEditorConfig(fileName, {
@@ -463,7 +463,7 @@ suite("CLI", () => {
463463
return Promise.resolve(text);
464464
},
465465
};
466-
const logger = createLogger(true);
466+
const logger = createTestLogger();
467467

468468
try {
469469
process.chdir(directory);
@@ -565,7 +565,7 @@ suite("CLI", () => {
565565
"content",
566566
);
567567
const cli = createCLI((text) => `${text} updated`);
568-
const logger = createLogger(true);
568+
const logger = createTestLogger();
569569

570570
try {
571571
const output = await captureStreamWrite(process.stdout, async () =>

src/test/parseFilePatterns.test.ts

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as assert from "node:assert";
22
import fs from "node:fs/promises";
33
import os from "node:os";
44
import path from "node:path";
5+
import { FilePatternError } from "../util/FilePatternError.js";
56
import { parseFilePatterns } from "../util/parseFilePatterns.js";
67
import type { CLI } from "../types.js";
78

@@ -185,7 +186,55 @@ suite("Parse file patterns", () => {
185186

186187
await assert.rejects(
187188
parseFilePatterns(createCLI(), ["linked"]),
188-
/Specified pattern "linked" is a symbolic link./,
189+
(error: unknown) =>
190+
error instanceof FilePatternError &&
191+
error.messages.length === 1 &&
192+
error.messages[0] ===
193+
"Specified pattern is a symbolic link: linked",
194+
);
195+
} finally {
196+
process.chdir(cwd);
197+
await cleanupDirectory(directory);
198+
}
199+
});
200+
201+
test("Rejects directories with no matching files", async () => {
202+
const directory = await createTempDirectory();
203+
const cwd = process.cwd();
204+
205+
try {
206+
await fs.writeFile(path.join(directory, "skip.md"), "skip", "utf8");
207+
process.chdir(directory);
208+
209+
await assert.rejects(
210+
parseFilePatterns(createCLI(), ["."]),
211+
(error: unknown) =>
212+
error instanceof FilePatternError &&
213+
error.messages.length === 1 &&
214+
error.messages[0] ===
215+
"No matching files were found in the directory: .",
216+
);
217+
} finally {
218+
process.chdir(cwd);
219+
await cleanupDirectory(directory);
220+
}
221+
});
222+
223+
test("Rejects unmatched glob patterns", async () => {
224+
const directory = await createTempDirectory();
225+
const cwd = process.cwd();
226+
227+
try {
228+
await fs.writeFile(path.join(directory, "one.txt"), "one", "utf8");
229+
process.chdir(directory);
230+
231+
await assert.rejects(
232+
parseFilePatterns(createCLI(), ["**/*.md"]),
233+
(error: unknown) =>
234+
error instanceof FilePatternError &&
235+
error.messages.length === 1 &&
236+
error.messages[0] ===
237+
"No files matching the pattern were found: **/*.md",
189238
);
190239
} finally {
191240
process.chdir(cwd);

src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ export interface Logger {
5555
log(message: string): void;
5656
warn(message: string): void;
5757
error(message: string): void;
58+
}
59+
60+
export interface TestLogger extends Logger {
5861
getEntries(): readonly LoggerEntry[];
5962
}
6063

src/util/createLogger.ts

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,45 @@
11
import * as process from "node:process";
2-
import type { DebugLogger, Logger, LoggerEntry } from "../types.js";
2+
import type { DebugLogger, Logger, LoggerEntry, TestLogger } from "../types.js";
3+
4+
type LogCallback = (message: string) => void;
35

46
export function createLogger(quiet: boolean = false): Logger {
7+
let log: LogCallback;
8+
let warn: LogCallback;
9+
10+
if (quiet) {
11+
log = () => {};
12+
warn = () => {};
13+
} else {
14+
log = (message: string) => {
15+
process.stdout.write(`${message}\n`);
16+
};
17+
warn = (message: string) => {
18+
process.stderr.write(`[warn] ${message}\n`);
19+
};
20+
}
21+
22+
return {
23+
log,
24+
warn,
25+
error(message: string) {
26+
process.stderr.write(`[error] ${message}\n`);
27+
},
28+
};
29+
}
30+
31+
export function createTestLogger(): TestLogger {
532
const entries: LoggerEntry[] = [];
633

734
return {
835
log(message: string) {
936
entries.push({ level: "log", message });
10-
11-
if (!quiet) {
12-
process.stdout.write(`${message}\n`);
13-
}
1437
},
1538
warn(message: string) {
1639
entries.push({ level: "warn", message });
17-
18-
if (!quiet) {
19-
process.stderr.write(`[warn] ${message}\n`);
20-
}
2140
},
2241
error(message: string) {
2342
entries.push({ level: "error", message });
24-
25-
process.stderr.write(`[error] ${message}\n`);
2643
},
2744
getEntries() {
2845
return entries;

0 commit comments

Comments
 (0)