From 804c287e441dcaa3876429f026ac89f6482f9699 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Mon, 12 Oct 2026 04:53:10 +0800 Subject: [PATCH] test: classify filesystem application workflows as boundaries --- .../doctorSystemHostFilesystem.test.ts | 14 +++++---- ...javascriptApplicationEmptyLiterals.test.ts | 12 ++++---- ...ascriptApplicationModuleProvenance.test.ts | 6 ++-- .../javascriptApplicationService.test.ts | 30 ++++++++++++------- .../javascriptApplicationSignedZero.test.ts | 10 +++---- ...ascriptApplicationTemplateLiterals.test.ts | 6 ++-- .../javascriptApplicationTypeScript.test.ts | 10 +++---- .../javascriptFileUrlPaths.test.ts | 8 ++--- .../javascriptModuleSpecifierPaths.test.ts | 10 +++---- .../javascriptOpenClassification.test.ts | 6 ++-- .../filesystem/processCliFileInput.test.ts | 28 +++++++---------- 11 files changed, 71 insertions(+), 69 deletions(-) rename src/application/Doctor.systemHost.test.ts => tests/boundary/filesystem/doctorSystemHostFilesystem.test.ts (89%) rename src/application/javascript/JavaScriptApplicationEmptyLiterals.test.ts => tests/boundary/filesystem/javascript-applications/javascriptApplicationEmptyLiterals.test.ts (95%) rename src/application/javascript/JavaScriptApplicationModuleProvenance.test.ts => tests/boundary/filesystem/javascript-applications/javascriptApplicationModuleProvenance.test.ts (88%) rename src/application/javascript/JavaScriptApplicationService.test.ts => tests/boundary/filesystem/javascript-applications/javascriptApplicationService.test.ts (90%) rename src/application/javascript/JavaScriptApplicationSignedZero.test.ts => tests/boundary/filesystem/javascript-applications/javascriptApplicationSignedZero.test.ts (82%) rename src/application/javascript/JavaScriptApplicationTemplateLiterals.test.ts => tests/boundary/filesystem/javascript-applications/javascriptApplicationTemplateLiterals.test.ts (91%) rename src/application/javascript/JavaScriptApplicationTypeScript.test.ts => tests/boundary/filesystem/javascript-applications/javascriptApplicationTypeScript.test.ts (91%) rename src/application/javascript/JavaScriptFileUrlPaths.test.ts => tests/boundary/filesystem/javascript-applications/javascriptFileUrlPaths.test.ts (91%) rename src/application/javascript/JavaScriptModuleSpecifierPaths.test.ts => tests/boundary/filesystem/javascript-applications/javascriptModuleSpecifierPaths.test.ts (96%) rename src/application/javascript/JavaScriptOpenClassification.test.ts => tests/boundary/filesystem/javascript-applications/javascriptOpenClassification.test.ts (88%) rename src/application/process/ProcessCli.test.ts => tests/boundary/filesystem/processCliFileInput.test.ts (81%) diff --git a/src/application/Doctor.systemHost.test.ts b/tests/boundary/filesystem/doctorSystemHostFilesystem.test.ts similarity index 89% rename from src/application/Doctor.systemHost.test.ts rename to tests/boundary/filesystem/doctorSystemHostFilesystem.test.ts index 1ac0338421..22a2188731 100644 --- a/src/application/Doctor.systemHost.test.ts +++ b/tests/boundary/filesystem/doctorSystemHostFilesystem.test.ts @@ -3,8 +3,8 @@ import { dirname, join } from "node:path"; import { expect, it } from "vitest"; -import { createTestTempDirectory } from "../../tests/fixtures/temporaryDirectory.js"; -import { systemDoctorHost } from "./Doctor.js"; +import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js"; +import { systemDoctorHost } from "../../../src/application/Doctor.js"; it("threads the selected host and environment into system diagnostics", async () => { const environment = { @@ -25,7 +25,9 @@ it("threads the selected host and environment into system diagnostics", async () calls.push({ command, arguments: arguments_, environment: options?.env }); if (command === "sw_vers") return { stdout: "15.0\n", stderr: "" }; if (command === "ldd") return { stdout: "linux-vdso.so.1", stderr: "" }; - return { stdout: "/selected/bin/rea\n", stderr: "" }; + if (command === "which") + return { stdout: "/selected/bin/rea\n", stderr: "" }; + throw new Error(`Unexpected diagnostic command: ${command}`); }, }); @@ -114,7 +116,7 @@ it("reports no Homebrew Hopper when the cask has no receipt", async () => { }); expect(await host.brewHopperPath()).toBeUndefined(); - expect( - calls.every((arguments_) => arguments_.join(" ") === "--caskroom"), - ).toBe(true); + expect(new Set(calls.map((arguments_) => arguments_.join(" ")))).toEqual( + new Set(["--caskroom"]), + ); }); diff --git a/src/application/javascript/JavaScriptApplicationEmptyLiterals.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptApplicationEmptyLiterals.test.ts similarity index 95% rename from src/application/javascript/JavaScriptApplicationEmptyLiterals.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptApplicationEmptyLiterals.test.ts index 444616d78a..0306f250f6 100644 --- a/src/application/javascript/JavaScriptApplicationEmptyLiterals.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptApplicationEmptyLiterals.test.ts @@ -5,12 +5,12 @@ import { Ajv2020 } from "ajv/dist/2020.js"; import { expect, it } from "vitest"; import { z } from "zod"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; -import { matchJavaScriptApplicationVersions } from "../../domain/javascript/javascriptApplicationVersionKeys.js"; -import { findApplicationFeatureSeeds } from "../../domain/javascript/javascriptFeatureSeed.js"; -import { traceApplicationFeatureInputSchema } from "../../domain/javascript/javascriptFeatureTraceSchemas.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; +import { matchJavaScriptApplicationVersions } from "../../../../src/domain/javascript/javascriptApplicationVersionKeys.js"; +import { findApplicationFeatureSeeds } from "../../../../src/domain/javascript/javascriptFeatureSeed.js"; +import { traceApplicationFeatureInputSchema } from "../../../../src/domain/javascript/javascriptFeatureTraceSchemas.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; const analyzeSource = async ( source: string, diff --git a/src/application/javascript/JavaScriptApplicationModuleProvenance.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptApplicationModuleProvenance.test.ts similarity index 88% rename from src/application/javascript/JavaScriptApplicationModuleProvenance.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptApplicationModuleProvenance.test.ts index c8768b262a..ddb53f7fe7 100644 --- a/src/application/javascript/JavaScriptApplicationModuleProvenance.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptApplicationModuleProvenance.test.ts @@ -3,9 +3,9 @@ import { join } from "node:path"; import { expect, it } from "vitest"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; it.each([ { diff --git a/src/application/javascript/JavaScriptApplicationService.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptApplicationService.test.ts similarity index 90% rename from src/application/javascript/JavaScriptApplicationService.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptApplicationService.test.ts index 99ad1747d7..59525b439b 100644 --- a/src/application/javascript/JavaScriptApplicationService.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptApplicationService.test.ts @@ -3,15 +3,15 @@ import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { z } from "zod"; -import { parseEvidence } from "../../domain/evidence.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; -import { writeJavaScriptSourceSelectionFixture } from "../../../tests/fixtures/javascriptSourceSelection.js"; +import { parseEvidence } from "../../../../src/domain/evidence.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; +import { writeJavaScriptSourceSelectionFixture } from "../../../fixtures/javascriptSourceSelection.js"; -import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js"; -import { scanCanonicalArtifactInventory } from "../../../tests/fixtures/artifactInventory.js"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import { projectAnalysisError } from "../../domain/analysisErrorProjection.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; +import { ArtifactReaderFailure } from "../../../../src/artifacts/ArtifactReader.js"; +import { scanCanonicalArtifactInventory } from "../../../fixtures/artifactInventory.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import { projectAnalysisError } from "../../../../src/domain/analysisErrorProjection.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; describe("Selected JavaScript source failure diagnostics", () => { it("analyzes selected files in first-request order and reports only selected progress", async () => { @@ -33,10 +33,18 @@ describe("Selected JavaScript source failure diagnostics", () => { }, }, ); - expect(result.ok).toBe(true); + if (!result.ok) throw result.error; + const analysis = javascriptApplicationAnalysisResultSchema.parse( + result.value.normalized_result, + ); + expect(analysis.source_selection).toEqual({ + requested_paths: ["z-later.mjs", "main.mjs", "z-later.mjs"], + unselected_files: 5, + }); + expect(analysis.statistics.parsed_javascript_files).toBe(2); expect(progress).toEqual([ - "Parsing and projecting z-later.mjs (1/2)", - "Parsing and projecting main.mjs (2/2)", + expect.stringContaining("z-later.mjs"), + expect.stringContaining("main.mjs"), ]); }); diff --git a/src/application/javascript/JavaScriptApplicationSignedZero.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptApplicationSignedZero.test.ts similarity index 82% rename from src/application/javascript/JavaScriptApplicationSignedZero.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptApplicationSignedZero.test.ts index 47143bb915..3d1f94d144 100644 --- a/src/application/javascript/JavaScriptApplicationSignedZero.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptApplicationSignedZero.test.ts @@ -3,11 +3,11 @@ import { join } from "node:path"; import { expect, it } from "vitest"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; -import { javaScriptSemanticQueryResultSchema } from "../../domain/javascript/javascriptSemanticQuerySchemas.js"; -import { queryJavaScriptSemanticGraph } from "../../domain/javascript/javascriptSemanticQuery.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; +import { javaScriptSemanticQueryResultSchema } from "../../../../src/domain/javascript/javascriptSemanticQuerySchemas.js"; +import { queryJavaScriptSemanticGraph } from "../../../../src/domain/javascript/javascriptSemanticQuery.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; it.each([ { diff --git a/src/application/javascript/JavaScriptApplicationTemplateLiterals.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptApplicationTemplateLiterals.test.ts similarity index 91% rename from src/application/javascript/JavaScriptApplicationTemplateLiterals.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptApplicationTemplateLiterals.test.ts index 378d733534..55807d6de7 100644 --- a/src/application/javascript/JavaScriptApplicationTemplateLiterals.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptApplicationTemplateLiterals.test.ts @@ -3,9 +3,9 @@ import { join } from "node:path"; import { expect, it } from "vitest"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; const graphIdentities = async (source: string) => { const inputPath = await createTestTempDirectory("rea-js-template-literal-"); diff --git a/src/application/javascript/JavaScriptApplicationTypeScript.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptApplicationTypeScript.test.ts similarity index 91% rename from src/application/javascript/JavaScriptApplicationTypeScript.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptApplicationTypeScript.test.ts index 531168bcc0..09cd97fe77 100644 --- a/src/application/javascript/JavaScriptApplicationTypeScript.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptApplicationTypeScript.test.ts @@ -3,11 +3,11 @@ import { join } from "node:path"; import { expect, it } from "vitest"; -import { canonicalJson } from "../../domain/comparisonSemantics.js"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; -import { parseJavaScriptSource } from "../../domain/javascript/javascriptSourceParser.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; +import { canonicalJson } from "../../../../src/domain/comparisonSemantics.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; +import { parseJavaScriptSource } from "../../../../src/domain/javascript/javascriptSourceParser.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; type ApplicationAnalysis = ReturnType< typeof javascriptApplicationAnalysisResultSchema.parse diff --git a/src/application/javascript/JavaScriptFileUrlPaths.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptFileUrlPaths.test.ts similarity index 91% rename from src/application/javascript/JavaScriptFileUrlPaths.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptFileUrlPaths.test.ts index 0a136cff46..3597c45033 100644 --- a/src/application/javascript/JavaScriptFileUrlPaths.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptFileUrlPaths.test.ts @@ -5,10 +5,10 @@ import { fileURLToPath, pathToFileURL } from "node:url"; import { parseExpression } from "@babel/parser"; import { describe, expect, it } from "vitest"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; -import { staticPath } from "../../domain/javascript/javascriptStaticAnalysisHelpers.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; +import { staticPath } from "../../../../src/domain/javascript/javascriptStaticAnalysisHelpers.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; const urlCases = [ ["./preload%20name.cjs", "preload name.cjs", "main.mjs"], diff --git a/src/application/javascript/JavaScriptModuleSpecifierPaths.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptModuleSpecifierPaths.test.ts similarity index 96% rename from src/application/javascript/JavaScriptModuleSpecifierPaths.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptModuleSpecifierPaths.test.ts index 5ff96504e6..5e62327d0f 100644 --- a/src/application/javascript/JavaScriptModuleSpecifierPaths.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptModuleSpecifierPaths.test.ts @@ -4,11 +4,11 @@ import { mkdir, writeFile } from "node:fs/promises"; import { join } from "node:path"; import { promisify } from "node:util"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import type { JavaScriptArtifactFile } from "../../domain/javascript/javascriptArtifactFiles.js"; -import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import type { JavaScriptArtifactFile } from "../../../../src/domain/javascript/javascriptArtifactFiles.js"; +import { resolveArtifactPathByContext } from "../../../../src/application/javascript/JavaScriptArtifactPathResolution.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; const filesFor = (paths: readonly string[]) => new Map( diff --git a/src/application/javascript/JavaScriptOpenClassification.test.ts b/tests/boundary/filesystem/javascript-applications/javascriptOpenClassification.test.ts similarity index 88% rename from src/application/javascript/JavaScriptOpenClassification.test.ts rename to tests/boundary/filesystem/javascript-applications/javascriptOpenClassification.test.ts index 436ea4a703..6892779584 100644 --- a/src/application/javascript/JavaScriptOpenClassification.test.ts +++ b/tests/boundary/filesystem/javascript-applications/javascriptOpenClassification.test.ts @@ -3,9 +3,9 @@ import { join } from "node:path"; import { expect, it } from "vitest"; -import { createTestTempDirectory } from "../../../tests/fixtures/temporaryDirectory.js"; -import { javascriptApplicationAnalysisResultSchema } from "../../domain/javascript/javascriptApplicationAnalysis.js"; -import { analyzeJavaScriptApplication } from "../../../tests/support/javascriptApplicationScope.js"; +import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js"; +import { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js"; +import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js"; it("classifies overloaded open calls from lexical receiver facts", async () => { const inputPath = await createTestTempDirectory( diff --git a/src/application/process/ProcessCli.test.ts b/tests/boundary/filesystem/processCliFileInput.test.ts similarity index 81% rename from src/application/process/ProcessCli.test.ts rename to tests/boundary/filesystem/processCliFileInput.test.ts index 34e777d31d..c4b340ffc4 100644 --- a/src/application/process/ProcessCli.test.ts +++ b/tests/boundary/filesystem/processCliFileInput.test.ts @@ -1,24 +1,13 @@ -import { mkdtemp, rm, writeFile } from "node:fs/promises"; -import { tmpdir } from "node:os"; +import { writeFile } from "node:fs/promises"; import { join } from "node:path"; -import { afterEach, describe, expect, it } from "vitest"; +import { describe, expect, it } from "vitest"; import { captureProcessScenarioFile, projectProcessCliError, -} from "./ProcessCli.js"; -import { JSON_BYTE_ORDER_MARK_MESSAGE } from "../Utf8JsonInput.js"; +} from "../../../src/application/process/ProcessCli.js"; +import { JSON_BYTE_ORDER_MARK_MESSAGE } from "../../../src/application/Utf8JsonInput.js"; -const roots: string[] = []; -afterEach(async () => { - await Promise.all( - roots.splice(0).map((root) => rm(root, { recursive: true, force: true })), - ); -}); -const fixture = async (): Promise => { - const root = await mkdtemp(join(tmpdir(), "rea-process-cli-diagnostics-")); - roots.push(root); - return root; -}; +import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js"; describe("process CLI input diagnostics", () => { it("preserves local diagnostics for unexpected process failures", () => { @@ -35,7 +24,7 @@ describe("process CLI input diagnostics", () => { }); it("projects missing, malformed JSON, and invalid scenario files", async () => { - const root = await fixture(); + const root = await createTestTempDirectory("rea-process-cli-diagnostics-"); const malformed = join(root, "malformed.json"); const invalid = join(root, "invalid.json"); const invalidUtf8 = join(root, "invalid-utf8.json"); @@ -90,7 +79,10 @@ describe("process CLI input diagnostics", () => { }); it("names a leading byte-order mark instead of quoting it as a token", async () => { - const path = join(await fixture(), "scenario.json"); + const path = join( + await createTestTempDirectory("rea-process-cli-diagnostics-"), + "scenario.json", + ); await writeFile(path, '\uFEFF{"executable":"/bin/echo"}'); expect(await captureProcessScenarioFile(path)).toEqual({ error: "Process command failed",