feat: add receipt proxy tier guard, 422 forwarding, and tests (refs #139)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Eric Gullickson
2026-02-11 11:20:58 -06:00
parent 1a6400a6bc
commit 88c2d7fbcd
4 changed files with 40 additions and 3 deletions

View File

@@ -165,6 +165,22 @@ describe('OcrService.extractReceipt', () => {
});
});
it('should propagate Python 422 with statusCode for controller forwarding', async () => {
const err: any = new Error('OCR service error: 422 - Failed to extract receipt data');
err.statusCode = 422;
mockExtractReceipt.mockRejectedValue(err);
await expect(
service.extractReceipt(userId, {
fileBuffer: Buffer.from('fake-image-data'),
contentType: 'image/jpeg',
})
).rejects.toMatchObject({
statusCode: 422,
message: 'OCR service error: 422 - Failed to extract receipt data',
});
});
it('should propagate OCR service errors', async () => {
mockExtractReceipt.mockRejectedValue(
new Error('OCR service error: 500 - Internal error')
@@ -179,3 +195,15 @@ describe('OcrService.extractReceipt', () => {
});
});
});
describe('Receipt route tier guard', () => {
it('route is configured with requireTier fuelLog.receiptScan', async () => {
// Tier guard is enforced at route level via requireTier('fuelLog.receiptScan')
// preHandler: [requireAuth, requireTier('fuelLog.receiptScan')]
// Free-tier users receive 403 TIER_REQUIRED before the handler executes.
// Middleware behavior is tested in core/middleware/require-tier.test.ts
const { requireTier } = await import('../../../../core/middleware/require-tier');
const handler = requireTier('fuelLog.receiptScan');
expect(typeof handler).toBe('function');
});
});