mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 20:00:47 +00:00
82 lines
2.9 KiB
JavaScript
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"] });
|
|
});
|
|
});
|