import { NotFoundException } from '@nestjs/common'; import { HarvestsService } from './harvests.service'; import { PrismaService } from '../prisma/prisma.service'; import { AuditLogService } from '../audit/audit-log.service'; import { WebhooksService } from '../webhooks/webhooks.service'; describe('HarvestsService', () => { let service: HarvestsService; let prisma: { harvest: { findUnique: jest.Mock }; $transaction: jest.Mock; }; let auditLog: { record: jest.Mock }; let tx: { harvest: { create: jest.Mock }; harvestColony: { createMany: jest.Mock }; }; const harvest = { id: 'harvest-1', apiaryId: 'apiary-1', date: new Date() }; beforeEach(() => { tx = { harvest: { create: jest.fn().mockResolvedValue(harvest) }, harvestColony: { createMany: jest.fn() }, }; prisma = { harvest: { findUnique: jest.fn() }, $transaction: jest.fn((callback: (txArg: typeof tx) => unknown) => callback(tx), ), }; auditLog = { record: jest.fn() }; const webhooks = { dispatch: jest.fn().mockResolvedValue(undefined) }; service = new HarvestsService( prisma as unknown as PrismaService, auditLog as unknown as AuditLogService, webhooks as unknown as WebhooksService, ); }); it('findById throws NotFoundException when missing', async () => { prisma.harvest.findUnique.mockResolvedValue(null); await expect(service.findById('missing')).rejects.toBeInstanceOf( NotFoundException, ); }); it('create links every colony to the harvest inside a transaction', async () => { prisma.harvest.findUnique.mockResolvedValue(harvest); await service.create( { apiaryId: 'apiary-1', date: '2026-07-01', colonyIds: ['colony-1', 'colony-2'], }, 'user-1', ); const [[createArg]] = tx.harvestColony.createMany.mock.calls as [ [{ data: { harvestId: string; colonyId: string }[] }], ]; expect(createArg.data).toEqual([ { harvestId: harvest.id, colonyId: 'colony-1' }, { harvestId: harvest.id, colonyId: 'colony-2' }, ]); }); });