feat(berths): CM-2 — price-reconcile API (list + bulk apply)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,7 +21,8 @@ import { db } from '@/lib/db';
|
||||
import { berths } from '@/lib/db/schema/berths';
|
||||
import { systemSettings } from '@/lib/db/schema/system';
|
||||
|
||||
import { makeBerth, makePort } from '../helpers/factories';
|
||||
import { makeBerth, makeFullPermissions, makePort } from '../helpers/factories';
|
||||
import { makeMockCtx, makeMockRequest } from '../helpers/route-tester';
|
||||
|
||||
const A1_PDF = readFileSync(path.join(process.cwd(), 'berth_pdf_example/Berth_Spec_Sheet_A1.pdf'));
|
||||
|
||||
@@ -84,3 +85,44 @@ describe('applyBulkBerthPrices', () => {
|
||||
expect(b!.price).toBeNull(); // untouched
|
||||
});
|
||||
});
|
||||
|
||||
describe('price-reconcile route handlers', () => {
|
||||
it('GET lists rows and POST apply writes the approved price', async () => {
|
||||
const { getHandler } = await import('@/app/api/v1/berths/price-reconcile/handlers');
|
||||
const { postHandler } = await import('@/app/api/v1/berths/price-reconcile/apply/handlers');
|
||||
|
||||
const port = await makePort();
|
||||
const berth = await makeBerth({ portId: port.id, overrides: { mooringNumber: 'A1' } });
|
||||
await uploadBerthPdf({
|
||||
berthId: berth.id,
|
||||
portId: port.id,
|
||||
buffer: A1_PDF,
|
||||
fileName: 'Berth_Spec_Sheet_A1.pdf',
|
||||
uploadedBy: 'test-user',
|
||||
});
|
||||
const ctx = makeMockCtx({ portId: port.id, permissions: makeFullPermissions() });
|
||||
|
||||
const listRes = await getHandler(
|
||||
makeMockRequest('GET', 'http://t/api/v1/berths/price-reconcile'),
|
||||
ctx,
|
||||
{},
|
||||
);
|
||||
const listJson = (await listRes.json()) as {
|
||||
data: Array<{ mooringNumber: string; parsedPrice: number | null }>;
|
||||
};
|
||||
expect(listJson.data.find((r) => r.mooringNumber === 'A1')?.parsedPrice).toBe(3880800);
|
||||
|
||||
const applyRes = await postHandler(
|
||||
makeMockRequest('POST', 'http://t/api/v1/berths/price-reconcile/apply', {
|
||||
body: { approvals: [{ berthId: berth.id, price: 3880800, currency: 'USD' }] },
|
||||
}),
|
||||
ctx,
|
||||
{},
|
||||
);
|
||||
const applyJson = (await applyRes.json()) as { data: { updated: number } };
|
||||
expect(applyJson.data.updated).toBe(1);
|
||||
|
||||
const [b] = await db.select().from(berths).where(eq(berths.id, berth.id));
|
||||
expect(Number(b!.price)).toBe(3880800);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user