Files
obsidian-remarkable/tests/run-tests.mjs
T
fegger ff21ec921a Add test script and initial test suite
The test runner bundles TypeScript tests with esbuild and executes them using Node's built-in test runner. Tests cover
document downloader behavior, path utilities, rmapi bridge configuration, style refinement, and ZIP file handling. Mock
implementations for Obsidian plugin interfaces enable isolated unit testing.
2026-05-31 16:33:30 +02:00

61 lines
1.6 KiB
JavaScript

import esbuild from "esbuild";
import { mkdtemp, readdir, rm } from "fs/promises";
import { spawnSync } from "child_process";
import { dirname, join, relative } from "path";
import { tmpdir } from "os";
import { fileURLToPath } from "url";
const root = dirname(dirname(fileURLToPath(import.meta.url)));
const testsDir = join(root, "tests");
const outdir = await mkdtemp(join(tmpdir(), "obsidian-remarkable-tests-"));
const obsidianMockPath = join(testsDir, "obsidian-mock.ts");
const entries = (await readdir(testsDir))
.filter((file) => file.endsWith(".test.ts"))
.map((file) => join(testsDir, file));
if (entries.length === 0) {
throw new Error("No test files found");
}
const obsidianAliasPlugin = {
name: "obsidian-alias",
setup(build) {
build.onResolve({ filter: /^obsidian$/ }, () => ({ path: obsidianMockPath }));
},
};
await esbuild.build({
entryPoints: entries,
bundle: true,
platform: "node",
format: "esm",
outdir,
outExtension: { ".js": ".mjs" },
plugins: [obsidianAliasPlugin],
external: ["child_process", "fs/promises", "os", "path", "node:*"],
sourcemap: "inline",
});
const testFiles = (await readdir(outdir))
.filter((file) => file.endsWith(".test.mjs"))
.map((file) => join(outdir, file));
try {
const result = spawnSync(process.execPath, ["--test", ...testFiles], {
cwd: root,
stdio: "inherit",
});
if (result.error) {
throw result.error;
}
if (result.status !== 0) {
const relativeFiles = testFiles.map((file) => relative(root, file)).join(", ");
throw new Error(`Tests failed: ${relativeFiles}`);
}
} finally {
await rm(outdir, { recursive: true, force: true });
}