Files
9router/tests/unit/permanent-model-delete-route.test.js

82 lines
2.9 KiB
JavaScript

import { beforeEach, describe, expect, it, vi } from "vitest";
const deleteModelPermanently = vi.fn();
const getDeletedModels = vi.fn();
const purgeRequestDetailBuffer = vi.fn();
const requireAdminUser = vi.fn();
const resetComboRotation = vi.fn();
vi.mock("@/lib/db", () => ({
deleteModelPermanently,
getDeletedModels,
purgeRequestDetailBuffer,
}));
vi.mock("@/lib/auth/currentUser", () => ({ requireAdminUser }));
vi.mock("open-sse/services/combo.js", () => ({ resetComboRotation }));
const { GET, POST } = await import("../../src/app/api/models/delete/route.js");
describe("/api/models/delete", () => {
beforeEach(() => {
deleteModelPermanently.mockReset();
getDeletedModels.mockReset();
purgeRequestDetailBuffer.mockReset();
requireAdminUser.mockReset();
resetComboRotation.mockReset();
});
it("rejects non-admin permanent deletion", async () => {
requireAdminUser.mockRejectedValue(new Error("Forbidden"));
const response = await POST(new Request("http://localhost/api/models/delete", {
method: "POST",
body: JSON.stringify({ providerAlias: "alpha", modelId: "model-a" }),
}));
expect(response.status).toBe(403);
expect(deleteModelPermanently).not.toHaveBeenCalled();
});
it("validates model deletion input", async () => {
requireAdminUser.mockResolvedValue({ id: "admin", role: "admin" });
const response = await POST(new Request("http://localhost/api/models/delete", {
method: "POST",
body: JSON.stringify({ providerAlias: "alpha" }),
}));
expect(response.status).toBe(400);
expect(deleteModelPermanently).not.toHaveBeenCalled();
});
it("cascades an admin deletion without purging usage history", async () => {
requireAdminUser.mockResolvedValue({ id: "admin", role: "admin" });
deleteModelPermanently.mockResolvedValue({
providerAliases: ["alpha", "alpha-id"],
modelId: "model-a",
updatedComboIds: ["combo-updated"],
deletedComboIds: ["combo-deleted"],
});
const response = await POST(new Request("http://localhost/api/models/delete", {
method: "POST",
body: JSON.stringify({ providerAlias: "alpha", modelId: "model-a" }),
}));
expect(response.status).toBe(200);
expect(deleteModelPermanently).toHaveBeenCalledWith("alpha", "model-a");
expect(resetComboRotation).toHaveBeenCalledWith("combo-updated");
expect(resetComboRotation).toHaveBeenCalledWith("combo-deleted");
expect(purgeRequestDetailBuffer).toHaveBeenCalledWith(["alpha", "alpha-id"], "model-a");
});
it("returns permanent-deletion tombstones for catalog readers", async () => {
getDeletedModels.mockResolvedValue({ alpha: ["model-a"] });
const response = await GET(new Request("http://localhost/api/models/delete?providerAlias=alpha"));
expect(response.status).toBe(200);
await expect(response.json()).resolves.toEqual({ ids: ["model-a"] });
});
});