Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline (Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/* packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
123 lines
4.0 KiB
TypeScript
123 lines
4.0 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import type { PrismaClient } from "./client.js";
|
|
import {
|
|
findDefaultModelCredential,
|
|
findModelCredential,
|
|
newestModelCredentialOrder,
|
|
selectSpaceModelPreference,
|
|
} from "./model-credentials.js";
|
|
|
|
describe("findDefaultModelCredential", () => {
|
|
it("resolves the default from the active space preference", async () => {
|
|
const findFirst = vi.fn().mockResolvedValue(null);
|
|
const prisma = { spaceModelPreference: { findFirst } } as unknown as PrismaClient;
|
|
|
|
await findDefaultModelCredential(prisma, { userId: "user", spaceId: "space" });
|
|
|
|
expect(findFirst).toHaveBeenCalledWith({
|
|
where: { userId: "user", spaceId: "space", isDefault: true },
|
|
include: { credential: true },
|
|
orderBy: [{ updatedAt: "desc" }, { id: "desc" }],
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("findModelCredential", () => {
|
|
it("falls back to the newest user credential when the space has no preference", async () => {
|
|
const preferenceFindFirst = vi.fn().mockResolvedValue(null);
|
|
const credentialFindFirst = vi.fn().mockResolvedValue(null);
|
|
const prisma = {
|
|
spaceModelPreference: { findFirst: preferenceFindFirst },
|
|
userModelCredential: { findFirst: credentialFindFirst },
|
|
} as unknown as PrismaClient;
|
|
|
|
await findModelCredential(prisma, { userId: "user", spaceId: "space" }, "xai");
|
|
|
|
expect(preferenceFindFirst).toHaveBeenCalledWith({
|
|
where: { userId: "user", spaceId: "space", credential: { provider: "xai" } },
|
|
include: { credential: true },
|
|
orderBy: [{ isDefault: "desc" }, { updatedAt: "desc" }, { id: "desc" }],
|
|
});
|
|
expect(credentialFindFirst).toHaveBeenCalledWith({
|
|
where: { userId: "user", provider: "xai" },
|
|
orderBy: newestModelCredentialOrder,
|
|
});
|
|
});
|
|
|
|
it("prefers the preference that owns a free-form modelId over the provider default", async () => {
|
|
const matching = {
|
|
credential: {
|
|
id: "credential-other",
|
|
userId: "user",
|
|
provider: "openai-compatible",
|
|
label: "Other",
|
|
secretId: "secret-other",
|
|
createdAt: new Date(0),
|
|
updatedAt: new Date(0),
|
|
},
|
|
isDefault: false,
|
|
modelId: "other-model",
|
|
};
|
|
const preferenceFindFirst = vi.fn().mockResolvedValue(matching);
|
|
const prisma = {
|
|
spaceModelPreference: { findFirst: preferenceFindFirst },
|
|
userModelCredential: { findFirst: vi.fn() },
|
|
} as unknown as PrismaClient;
|
|
|
|
await expect(
|
|
findModelCredential(
|
|
prisma,
|
|
{ userId: "user", spaceId: "space" },
|
|
"openai-compatible",
|
|
"other-model",
|
|
),
|
|
).resolves.toEqual({
|
|
...matching.credential,
|
|
isDefault: false,
|
|
defaultModel: "other-model",
|
|
});
|
|
expect(preferenceFindFirst).toHaveBeenCalledWith({
|
|
where: {
|
|
userId: "user",
|
|
spaceId: "space",
|
|
modelId: "other-model",
|
|
credential: { provider: "openai-compatible" },
|
|
},
|
|
include: { credential: true },
|
|
orderBy: [{ isDefault: "desc" }, { updatedAt: "desc" }, { id: "desc" }],
|
|
});
|
|
expect(preferenceFindFirst).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|
|
|
|
describe("selectSpaceModelPreference", () => {
|
|
it("clears only a different active default before selecting the credential", async () => {
|
|
const updateMany = vi.fn().mockResolvedValue({ count: 1 });
|
|
const upsert = vi.fn().mockResolvedValue({ id: "preference" });
|
|
const prisma = { spaceModelPreference: { updateMany, upsert } } as unknown as PrismaClient;
|
|
|
|
await selectSpaceModelPreference(
|
|
prisma,
|
|
{ userId: "user", spaceId: "space" },
|
|
"credential",
|
|
"model",
|
|
);
|
|
|
|
expect(updateMany).toHaveBeenCalledWith({
|
|
where: {
|
|
userId: "user",
|
|
spaceId: "space",
|
|
isDefault: true,
|
|
credentialId: { not: "credential" },
|
|
},
|
|
data: { isDefault: false },
|
|
});
|
|
expect(upsert).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
create: expect.objectContaining({ isDefault: true, modelId: "model" }),
|
|
update: { isDefault: true, modelId: "model" },
|
|
}),
|
|
);
|
|
});
|
|
});
|