|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +const test = require('node:test'); |
| 4 | +const assert = require('node:assert/strict'); |
| 5 | + |
| 6 | +const db = require('../lib/db'); |
| 7 | +const claimsHandler = require('../api/admin/claims'); |
| 8 | +const claimHandler = require('../api/admin/claim'); |
| 9 | + |
| 10 | +function makeRes() { |
| 11 | + return { |
| 12 | + statusCode: 200, |
| 13 | + headers: {}, |
| 14 | + body: null, |
| 15 | + setHeader(name, value) { this.headers[name.toLowerCase()] = value; }, |
| 16 | + status(code) { this.statusCode = code; return this; }, |
| 17 | + json(payload) { this.body = payload; return this; }, |
| 18 | + }; |
| 19 | +} |
| 20 | + |
| 21 | +test('GET /api/admin/claims missing ADMIN_API_KEY returns auth error, not 404', async () => { |
| 22 | + process.env.ADMIN_API_KEY = 'admin-secret'; |
| 23 | + const res = makeRes(); |
| 24 | + await claimsHandler({ method: 'GET', headers: {} }, res); |
| 25 | + assert.equal(res.statusCode, 401); |
| 26 | + assert.equal(res.body.status, 'UNAUTHORIZED'); |
| 27 | +}); |
| 28 | + |
| 29 | +test('GET /api/admin/claims valid auth returns claims array', async () => { |
| 30 | + process.env.ADMIN_API_KEY = 'admin-secret'; |
| 31 | + db.query = async () => ({ rows: [{ claim_id: 'c1', tenant: 't1', authenticated_address: '0xabc', pack_id: 'p1', status: 'created', payment_status: 'unpaid', created_at: '2026-05-27T00:00:00.000Z', paid_at: null, stripe_checkout_session_id: null, agent_count: 2 }] }); |
| 32 | + const res = makeRes(); |
| 33 | + await claimsHandler({ method: 'GET', headers: { authorization: 'Bearer admin-secret' } }, res); |
| 34 | + assert.equal(res.statusCode, 200); |
| 35 | + assert.equal(res.body.ok, true); |
| 36 | + assert.equal(Array.isArray(res.body.claims), true); |
| 37 | + assert.deepEqual(res.body.claims[0], { |
| 38 | + claimId: 'c1', tenant: 't1', wallet: '0xabc', packId: 'p1', status: 'created', paymentStatus: 'unpaid', agentCount: 2, createdAt: '2026-05-27T00:00:00.000Z', paidAt: null, stripeCheckoutSessionId: null, |
| 39 | + }); |
| 40 | +}); |
| 41 | + |
| 42 | +test('GET /api/admin/claim missing claimId returns validation error', async () => { |
| 43 | + process.env.ADMIN_API_KEY = 'admin-secret'; |
| 44 | + const res = makeRes(); |
| 45 | + await claimHandler({ method: 'GET', headers: { authorization: 'Bearer admin-secret' }, query: {} }, res); |
| 46 | + assert.equal(res.statusCode, 400); |
| 47 | + assert.equal(res.body.status, 'CLAIM_ID_REQUIRED'); |
| 48 | +}); |
| 49 | + |
| 50 | +test('GET /api/admin/claim unknown claim returns CLAIM_NOT_FOUND', async () => { |
| 51 | + process.env.ADMIN_API_KEY = 'admin-secret'; |
| 52 | + db.query = async (q) => (q.includes('from claim_requests') ? { rows: [] } : { rows: [] }); |
| 53 | + const res = makeRes(); |
| 54 | + await claimHandler({ method: 'GET', headers: { authorization: 'Bearer admin-secret' }, query: { claimId: 'missing' } }, res); |
| 55 | + assert.equal(res.statusCode, 404); |
| 56 | + assert.equal(res.body.status, 'CLAIM_NOT_FOUND'); |
| 57 | +}); |
| 58 | + |
| 59 | +test('GET /api/admin/claim returns detail shape compatible with admin UI', async () => { |
| 60 | + process.env.ADMIN_API_KEY = 'admin-secret'; |
| 61 | + db.query = async (q) => { |
| 62 | + if (q.includes('from claim_requests')) return { rows: [{ claim_id: 'c2', status: 'approved', tenant: 'tenant-a', authenticated_address: '0x123', pack_id: 'pack' }] }; |
| 63 | + if (q.includes('from claim_agents')) return { rows: [{ claim_id: 'c2', ens: 'alpha.eth', card_url: 'https://example/card.json' }] }; |
| 64 | + if (q.includes('from claim_events')) return { rows: [{ claim_id: 'c2', event_type: 'approved', created_at: '2026-05-27T01:00:00.000Z' }] }; |
| 65 | + if (q.includes('to_regclass')) return { rows: [{ table_name: 'exists' }] }; |
| 66 | + if (q.includes('from claim_status_transitions')) return { rows: [{ claim_id: 'c2', from_status: 'created', to_status: 'approved' }] }; |
| 67 | + if (q.includes('from agent_cards')) return { rows: [{ claim_id: 'c2', card_url: 'https://example/card.json' }] }; |
| 68 | + if (q.includes('from claim_payments')) return { rows: [{ claim_id: 'c2', stripe_checkout_session_id: 'cs_123' }] }; |
| 69 | + return { rows: [] }; |
| 70 | + }; |
| 71 | + |
| 72 | + const res = makeRes(); |
| 73 | + await claimHandler({ method: 'GET', headers: { authorization: 'Bearer admin-secret' }, query: { claimId: 'c2' } }, res); |
| 74 | + assert.equal(res.statusCode, 200); |
| 75 | + assert.equal(res.body.ok, true); |
| 76 | + assert.equal(res.body.claim.claim_id, 'c2'); |
| 77 | + assert.equal(Array.isArray(res.body.agents), true); |
| 78 | + assert.equal(Array.isArray(res.body.events), true); |
| 79 | + assert.equal(Array.isArray(res.body.transitions), true); |
| 80 | + assert.equal(Array.isArray(res.body.cards), true); |
| 81 | + assert.equal(res.body.latestPayment.stripe_checkout_session_id, 'cs_123'); |
| 82 | +}); |
0 commit comments