fix: update the logic for add model from admin side

This commit is contained in:
2026-07-21 17:17:14 +07:00
parent a1706fb40f
commit 06d6873d52
5 changed files with 61 additions and 14 deletions
+16 -8
View File
@@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
const getCustomModels = vi.fn();
const addCustomModel = vi.fn();
const deleteCustomModel = vi.fn();
const isDeletedModel = vi.fn();
const restoreDeletedModel = vi.fn();
const requireAdminUser = vi.fn();
vi.mock("@/models", () => ({
@@ -11,7 +11,7 @@ vi.mock("@/models", () => ({
addCustomModel,
deleteCustomModel,
}));
vi.mock("@/lib/db", () => ({ isDeletedModel }));
vi.mock("@/lib/db", () => ({ restoreDeletedModel }));
vi.mock("@/lib/auth/currentUser", () => ({ requireAdminUser }));
const { GET, POST, DELETE } = await import("../../src/app/api/models/custom/route.js");
@@ -21,9 +21,9 @@ describe("/api/models/custom", () => {
getCustomModels.mockReset();
addCustomModel.mockReset();
deleteCustomModel.mockReset();
isDeletedModel.mockReset();
restoreDeletedModel.mockReset();
requireAdminUser.mockReset();
isDeletedModel.mockResolvedValue(false);
restoreDeletedModel.mockResolvedValue(false);
});
it("keeps the shared catalog readable to authenticated model selectors", async () => {
@@ -68,17 +68,25 @@ describe("/api/models/custom", () => {
});
});
it("does not let an administrator re-add a permanently deleted model", async () => {
it("restores a permanently deleted model when an administrator adds it again", async () => {
requireAdminUser.mockResolvedValue({ id: "admin", role: "admin" });
isDeletedModel.mockResolvedValue(true);
restoreDeletedModel.mockResolvedValue(true);
addCustomModel.mockResolvedValue(true);
const response = await POST(new Request("http://localhost/api/models/custom", {
method: "POST",
body: JSON.stringify({ providerAlias: "openai", id: "gpt-deleted", type: "llm" }),
}));
expect(response.status).toBe(409);
expect(addCustomModel).not.toHaveBeenCalled();
expect(response.status).toBe(200);
await expect(response.json()).resolves.toMatchObject({ success: true, added: true, restored: true });
expect(restoreDeletedModel).toHaveBeenCalledWith("openai", "gpt-deleted");
expect(addCustomModel).toHaveBeenCalledWith({
providerAlias: "openai",
id: "gpt-deleted",
type: "llm",
name: undefined,
});
});
it("rejects a non-admin deleting a shared custom model", async () => {
@@ -218,5 +218,10 @@ describe("permanent model deletion", () => {
const backup = await db.exportDb();
expect(backup.deletedModels).toMatchObject({ [providerId]: [modelId] });
expect(await db.restoreDeletedModel(providerPrefix, `${modelId}(high)`)).toBe(true);
expect(await db.isDeletedModel(providerId, modelId)).toBe(false);
expect(await db.isDeletedModel(providerPrefix, `${modelId}(high)`)).toBe(false);
expect((await db.getDeletedModels())[providerId]).toBeUndefined();
});
});