Skip to content

test: add end-to-end integration tests for /api/billing (#949) - #1010

Merged
greatest0fallt1me merged 3 commits into
CalloraOrg:mainfrom
Fayedamz:feat/integration-test-billing-949
Jul 29, 2026
Merged

test: add end-to-end integration tests for /api/billing (#949)#1010
greatest0fallt1me merged 3 commits into
CalloraOrg:mainfrom
Fayedamz:feat/integration-test-billing-949

Conversation

@Fayedamz

Copy link
Copy Markdown

Implements Supertest integration tests that hit the full /api/billing router end-to-end, covering:

  • POST /api/billing/deduct: happy path, DB persistence, response shape
  • Row-level idempotency via requestId (alreadyProcessed flag)
  • Idempotency-Key header replay (Idempotent-Replayed header verified)
  • Idempotency-Key conflict with different body → 409 IDEMPOTENCY_CONFLICT
  • Input validation: missing requestId, empty apiId, all invalid amountUsdc formats (zero, negative, non-numeric, too many decimals, empty string)
  • Auth enforcement: absent header, wrong-secret JWT, expired JWT → 401
  • Malformed JSON body → 400
  • x-correlation-id propagation verified via response tracing header
  • GET /api/billing/deduct/request/:id: found, 404, unauthenticated
  • POST /api/billing/disputes: open dispute, unauthenticated → 401
  • GET /api/billing/disputes: list, unauthenticated → 401
  • Concurrent identical requestId race → exactly one DB row

Infrastructure:

  • pg-mem in-process DB (no Docker required)
  • Soroban RPC fully mocked (no real network calls)
  • JWT signed with JWT_SECRET from jest.env-setup.cjs
  • Each test provisions its own isolated DB and tears it down in finally{}

Closes #949

Implements Supertest integration tests that hit the full /api/billing
router end-to-end, covering:

- POST /api/billing/deduct: happy path, DB persistence, response shape
- Row-level idempotency via requestId (alreadyProcessed flag)
- Idempotency-Key header replay (Idempotent-Replayed header verified)
- Idempotency-Key conflict with different body → 409 IDEMPOTENCY_CONFLICT
- Input validation: missing requestId, empty apiId, all invalid amountUsdc
  formats (zero, negative, non-numeric, too many decimals, empty string)
- Auth enforcement: absent header, wrong-secret JWT, expired JWT → 401
- Malformed JSON body → 400
- x-correlation-id propagation verified via response tracing header
- GET /api/billing/deduct/request/:id: found, 404, unauthenticated
- POST /api/billing/disputes: open dispute, unauthenticated → 401
- GET /api/billing/disputes: list, unauthenticated → 401
- Concurrent identical requestId race → exactly one DB row

Infrastructure:
- pg-mem in-process DB (no Docker required)
- Soroban RPC fully mocked (no real network calls)
- JWT signed with JWT_SECRET from jest.env-setup.cjs
- Each test provisions its own isolated DB and tears it down in finally{}

Closes CalloraOrg#949
@drips-wave

drips-wave Bot commented Jul 28, 2026

Copy link
Copy Markdown

@Fayedamz Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@greatest0fallt1me
greatest0fallt1me merged commit 4658bf9 into CalloraOrg:main Jul 29, 2026
1 check passed
@greatest0fallt1me

Copy link
Copy Markdown
Contributor

LGTM — clean, tested. Merged 🙌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add integration test for /api/billing [b#084]

2 participants