58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import { afterEach, describe, expect, mock, spyOn, test } from "bun:test";
|
|
import { Scheduler } from "../../../core/scheduler";
|
|
import * as backendModule from "../../backends/backend";
|
|
import type { VolumeBackend } from "../../backends/backend";
|
|
import * as bootstrapModule from "../bootstrap";
|
|
import { createTestVolume } from "~/test/helpers/volume";
|
|
|
|
const loadShutdownModule = async () => {
|
|
const moduleUrl = new URL("../shutdown.ts", import.meta.url);
|
|
moduleUrl.searchParams.set("test", crypto.randomUUID());
|
|
return import(moduleUrl.href);
|
|
};
|
|
|
|
afterEach(() => {
|
|
mock.restore();
|
|
});
|
|
|
|
describe("shutdown", () => {
|
|
test("stops the agent runtime before unmounting mounted volumes", async () => {
|
|
const events: string[] = [];
|
|
const stopScheduler = mock(async () => {
|
|
events.push("scheduler.stop");
|
|
});
|
|
const stopApplicationRuntime = mock(async () => {
|
|
events.push("agents.stop");
|
|
});
|
|
const unmountVolume = mock(async () => {
|
|
events.push("backend.unmount");
|
|
return { status: "unmounted" as const };
|
|
});
|
|
|
|
await createTestVolume({
|
|
name: "Shutdown test volume",
|
|
config: {
|
|
backend: "directory",
|
|
path: "/Applications",
|
|
},
|
|
status: "mounted",
|
|
});
|
|
|
|
spyOn(Scheduler, "stop").mockImplementation(stopScheduler);
|
|
spyOn(bootstrapModule, "stopApplicationRuntime").mockImplementation(stopApplicationRuntime);
|
|
spyOn(backendModule, "createVolumeBackend").mockImplementation(
|
|
() =>
|
|
({
|
|
mount: async () => ({ status: "mounted" as const }),
|
|
unmount: unmountVolume,
|
|
checkHealth: async () => ({ status: "mounted" as const }),
|
|
}) satisfies VolumeBackend,
|
|
);
|
|
|
|
const { shutdown } = await loadShutdownModule();
|
|
|
|
await shutdown();
|
|
|
|
expect(events).toEqual(["scheduler.stop", "agents.stop", "backend.unmount"]);
|
|
});
|
|
});
|