mirror of
https://github.com/morluto/rea.git
synced 2026-10-23 06:12:29 -05:00
75 lines
2.7 KiB
TypeScript
75 lines
2.7 KiB
TypeScript
import { expect, it, vi } from "vitest";
|
|
import { AnalysisCancelledError } from "../../../src/domain/analysisErrorCore.js";
|
|
import { ProviderAdapterError } from "../../../src/domain/providerAdapterError.js";
|
|
import { ProviderCleanupError } from "../../../src/domain/providerCleanupError.js";
|
|
import { runSourceMapCommand } from "../../../src/javascript/sourceMaps/SourceMapCommand.js";
|
|
|
|
it.each([
|
|
null,
|
|
new ProviderCleanupError("caller", ["caller-owned-resource"], {}),
|
|
])(
|
|
"preserves opaque cancellation during ownership preparation: %s",
|
|
async (reason) => {
|
|
const controller = new AbortController();
|
|
const createRuntime = vi.fn(async () => {
|
|
throw new Error("Cancelled preparation must not acquire a runtime");
|
|
});
|
|
const launcher = vi.fn(async () => {
|
|
throw new Error("Cancelled preparation must not launch a codec");
|
|
});
|
|
const result = await runSourceMapCommand(
|
|
"{}",
|
|
"/selected.map",
|
|
{ signal: controller.signal },
|
|
{
|
|
prepareOwnership: async (signal) => {
|
|
controller.abort(reason);
|
|
signal?.throwIfAborted();
|
|
},
|
|
createRuntime,
|
|
launcher,
|
|
},
|
|
);
|
|
if (result.ok) throw new Error("Preparation must return cancellation");
|
|
expect(result.error).toBeInstanceOf(AnalysisCancelledError);
|
|
expect(result.error.cause).toBe(reason);
|
|
expect(result.error.cleanupIncomplete).toBe(false);
|
|
expect(result.error.cleanupResources).toEqual([]);
|
|
if (reason instanceof ProviderCleanupError) {
|
|
expect(reason.cleanupIncomplete).toBe(true);
|
|
expect(reason.cleanupResources).toEqual(["caller-owned-resource"]);
|
|
}
|
|
expect(createRuntime).not.toHaveBeenCalled();
|
|
expect(launcher).not.toHaveBeenCalled();
|
|
},
|
|
);
|
|
|
|
it("retains diagnostics for an unknown ownership preparation failure", async () => {
|
|
const cause = new Error("unexpected ownership failure");
|
|
const createRuntime = vi.fn(async () => {
|
|
throw new Error("Failed preparation must not acquire a runtime");
|
|
});
|
|
const launcher = vi.fn(async () => {
|
|
throw new Error("Failed preparation must not launch a codec");
|
|
});
|
|
const result = await runSourceMapCommand("{}", "/selected.map", undefined, {
|
|
prepareOwnership: async () => {
|
|
throw cause;
|
|
},
|
|
createRuntime,
|
|
launcher,
|
|
});
|
|
if (result.ok) throw new Error("Preparation must return its failure");
|
|
expect(result.error).toBeInstanceOf(ProviderAdapterError);
|
|
expect(result.error.cause).toBe(cause);
|
|
expect(result.error).toMatchObject({
|
|
diagnostics: {
|
|
map_path: "/selected.map",
|
|
error_message: cause.message,
|
|
phase: "process_ownership_preparation",
|
|
},
|
|
});
|
|
expect(createRuntime).not.toHaveBeenCalled();
|
|
expect(launcher).not.toHaveBeenCalled();
|
|
});
|