import { describe, it, expect } from 'vitest'; import { createYacht } from '@/lib/services/yachts.service'; import { makeClient, makePort, makeAuditMeta } from '../../helpers/factories'; import { db } from '@/lib/db'; import { yachtOwnershipHistory } from '@/lib/db/schema'; import { eq } from 'drizzle-orm'; describe('yachts.service — createYacht', () => { it('creates a yacht with a client owner and opens an ownership history row', async () => { const port = await makePort(); const client = await makeClient({ portId: port.id }); const yacht = await createYacht( port.id, { name: 'Sea Breeze', owner: { type: 'client', id: client.id }, }, makeAuditMeta(), ); expect(yacht.currentOwnerType).toBe('client'); expect(yacht.currentOwnerId).toBe(client.id); const history = await db .select() .from(yachtOwnershipHistory) .where(eq(yachtOwnershipHistory.yachtId, yacht.id)); expect(history).toHaveLength(1); expect(history[0]!.endDate).toBeNull(); }); it('rejects when ownerType=client but ownerId does not exist', async () => { const port = await makePort(); await expect( createYacht( port.id, { name: 'Phantom', owner: { type: 'client', id: 'nonexistent' } }, makeAuditMeta(), ), ).rejects.toThrow(/owner not found/i); }); it('rejects when ownerType=company but ownerId does not exist', async () => { const port = await makePort(); await expect( createYacht( port.id, { name: 'Phantom', owner: { type: 'company', id: 'nonexistent' } }, makeAuditMeta(), ), ).rejects.toThrow(/owner not found/i); }); it('rejects owner from a different tenant (cross-tenant guard)', async () => { const portA = await makePort(); const portB = await makePort(); const clientInB = await makeClient({ portId: portB.id }); await expect( createYacht( portA.id, { name: 'Wrong Port', owner: { type: 'client', id: clientInB.id } }, makeAuditMeta(), ), ).rejects.toThrow(/owner not found/i); }); });