evOo-local/packages/db/src/credential-secrets.test.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
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.
2026-09-20 17:15:16 +02:00

44 lines
1.6 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import type { PrismaClient } from "./client.js";
import { deleteUnreferencedCredentialSecret } from "./credential-secrets.js";
function credentialSecretPrisma(modelReferences: number, voiceReferences: number) {
return {
userModelCredential: { count: vi.fn().mockResolvedValue(modelReferences) },
userVoiceCredential: { count: vi.fn().mockResolvedValue(voiceReferences) },
secret: { deleteMany: vi.fn().mockResolvedValue({ count: 1 }) },
} as unknown as PrismaClient;
}
describe("deleteUnreferencedCredentialSecret", () => {
it("deletes a replaced secret after both credential kinds release it", async () => {
const prisma = credentialSecretPrisma(0, 0);
await deleteUnreferencedCredentialSecret(prisma, {
credentialKind: "model",
credentialId: "credential",
secretId: "secret",
});
expect(prisma.userModelCredential.count).toHaveBeenCalledWith({
where: { id: { not: "credential" }, secretId: "secret" },
});
expect(prisma.userVoiceCredential.count).toHaveBeenCalledWith({
where: { secretId: "secret" },
});
expect(prisma.secret.deleteMany).toHaveBeenCalledWith({ where: { id: "secret" } });
});
it("keeps a secret while either credential kind still references it", async () => {
const prisma = credentialSecretPrisma(0, 1);
await deleteUnreferencedCredentialSecret(prisma, {
credentialKind: "voice",
credentialId: "credential",
secretId: "secret",
});
expect(prisma.secret.deleteMany).not.toHaveBeenCalled();
});
});