Files
ApiCore/ApiCore-Backend/src/compliance/herd-status.spec.ts
T
Nick SzaunigandClaude Opus 5.5 edc193f128
Backend Image / build-and-push (push) Successful in 5m13s
Frontend Image / build-and-push (push) Successful in 8m54s
feat: T6 wave 3 – treatment books from lot, label print lock, restricted zone, authority notices
- Treatments book their dose from a medicine lot (delta booking on edit,
  bulk all-or-nothing, idempotent); Bestandsbuch columns from the lot,
  FEHLT exactly where treatmentLogGaps reports a gap; Bestandsbuch export
  needs veterinary-medicines:read.
- Label printing: 409 LABEL_PARTICULARS_MISSING on gaps, proof print with
  watermark, PRINT audit before the PDF, check endpoints; digit rules only
  from the seeded ComplianceSettings row (fail closed).
- Restricted zone (Berlin day): create, update, move, merge and CSV import
  blocked inside an active restriction; override with reason and
  compliance:manage, audited, never stored on the colony; split, harvest
  and dissolve stay free; restriction details only with compliance:read.
- Authority notices: settings, herd snapshot, registration/herd change/TSK
  notices with one open draft per kind under the settings lock.
- Label check refinements (geometric reading order, number|unit pairs).
- ARCHITECTURE.md §12.6–12.8, Annahmen 71–77; spec §5.6 Berlin day.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-15 14:18:41 +02:00

83 lines
2.1 KiB
TypeScript

import { herdStatusIn } from './herd-status';
const NOW = new Date('2027-03-01T10:00:00.000Z');
function settings() {
return {
id: 'singleton',
noticeOnColonyCountChange: true,
noticeOnApiaryChange: true,
tskExcludedColonyTypes: [],
};
}
function dbWith(baseline: unknown) {
return {
complianceSettings: {
findUnique: jest.fn().mockResolvedValue(settings()),
upsert: jest.fn().mockResolvedValue(settings()),
},
authorityNotice: { findFirst: jest.fn().mockResolvedValue(baseline) },
apiary: {
findMany: jest.fn().mockResolvedValue([
{
id: 'a',
name: 'A',
address: null,
location: null,
latitude: null,
longitude: null,
colonies: [{ colonyType: 'PRODUCTION_COLONY' }],
},
]),
},
};
}
describe('herdStatusIn', () => {
it('no baseline means deviation null, not a herd change', async () => {
const status = await herdStatusIn(dbWith(null) as never, NOW);
expect(status.baseline).toBeNull();
expect(status.deviation).toBeNull();
expect(status.current.totalLiving).toBe(1);
});
it('the baseline is the newest SENT registration or herd change by sentOn and ignores TSK reports', async () => {
const db = dbWith(null);
await herdStatusIn(db as never, NOW);
expect(db.authorityNotice.findFirst).toHaveBeenCalledWith(
expect.objectContaining({
where: {
status: 'SENT',
kind: { in: ['REGISTRATION', 'HERD_CHANGE'] },
},
orderBy: [{ sentOn: 'desc' }, { createdAt: 'desc' }, { id: 'desc' }],
}),
);
});
it('reports the deviation against the baseline', async () => {
const baseline = {
id: 'n1',
totalColonies: 3,
snapshot: {
version: 1,
takenAt: NOW.toISOString(),
apiaries: [],
totalLiving: 3,
},
};
const status = await herdStatusIn(dbWith(baseline) as never, NOW);
expect(status.deviation).toMatchObject({
triggered: true,
colonyCountChanged: true,
apiariesAdded: ['a'],
});
});
});