fix(db-tests): seed a SecretBackend for Secret model tests
Some checks failed
CI/CD / lint (pull_request) Successful in 1m17s
CI/CD / test (pull_request) Successful in 1m36s
CI/CD / typecheck (pull_request) Successful in 3m13s
CI/CD / smoke (pull_request) Failing after 2m4s
CI/CD / build (pull_request) Successful in 4m43s
CI/CD / publish (pull_request) Has been skipped

The four Secret tests in models.test.ts created rows via raw
prisma.secret.create without a backendId, so the schema default ''
violated Secret_backendId_fkey (that default only exists so 'db push'
can add the column to pre-existing rows; real writes always carry a
valid FK). Seed a plaintext backend per test, the same shape
bootstrapSecretBackends creates, and clear SecretBackend rows in
clearAllTables so nothing leaks between tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Michal
2026-10-09 15:40:11 +01:00
parent 24f202cb79
commit 527983d87e
2 changed files with 21 additions and 4 deletions

View File

@@ -61,6 +61,7 @@ export async function clearAllTables(client: PrismaClient): Promise<void> {
await client.prompt.deleteMany(); await client.prompt.deleteMany();
await client.projectServer.deleteMany(); await client.projectServer.deleteMany();
await client.secret.deleteMany(); await client.secret.deleteMany();
await client.secretBackend.deleteMany();
await client.session.deleteMany(); await client.session.deleteMany();
await client.project.deleteMany(); await client.project.deleteMany();
await client.mcpServer.deleteMany(); await client.mcpServer.deleteMany();

View File

@@ -184,9 +184,22 @@ describe('McpServer', () => {
// ── Secret model ── // ── Secret model ──
describe('Secret', () => { describe('Secret', () => {
// New Secret rows always carry a valid backend FK (SecretService guarantees
// this; the schema-level `backendId @default("")` only exists so `db push`
// can add the column to pre-existing rows). Seed the plaintext backend each
// test the same way bootstrapSecretBackends does.
let backendId: string;
beforeEach(async () => {
const backend = await prisma.secretBackend.create({
data: { name: 'default', type: 'plaintext', isDefault: true },
});
backendId = backend.id;
});
it('creates a secret with defaults', async () => { it('creates a secret with defaults', async () => {
const secret = await prisma.secret.create({ const secret = await prisma.secret.create({
data: { name: 'my-secret' }, data: { name: 'my-secret', backendId },
}); });
expect(secret.name).toBe('my-secret'); expect(secret.name).toBe('my-secret');
expect(secret.data).toEqual({}); expect(secret.data).toEqual({});
@@ -197,6 +210,7 @@ describe('Secret', () => {
const secret = await prisma.secret.create({ const secret = await prisma.secret.create({
data: { data: {
name: 'api-keys', name: 'api-keys',
backendId,
data: { API_KEY: 'test-key', API_SECRET: 'test-secret' }, data: { API_KEY: 'test-key', API_SECRET: 'test-secret' },
}, },
}); });
@@ -206,13 +220,15 @@ describe('Secret', () => {
}); });
it('enforces unique name', async () => { it('enforces unique name', async () => {
await prisma.secret.create({ data: { name: 'dup-secret' } }); await prisma.secret.create({ data: { name: 'dup-secret', backendId } });
await expect(prisma.secret.create({ data: { name: 'dup-secret' } })).rejects.toThrow(); await expect(
prisma.secret.create({ data: { name: 'dup-secret', backendId } }),
).rejects.toThrow();
}); });
it('updates data', async () => { it('updates data', async () => {
const secret = await prisma.secret.create({ const secret = await prisma.secret.create({
data: { name: 'updatable', data: { KEY: 'old' } }, data: { name: 'updatable', backendId, data: { KEY: 'old' } },
}); });
const updated = await prisma.secret.update({ const updated = await prisma.secret.update({
where: { id: secret.id }, where: { id: secret.id },