Skip to content

Sprint 4 PR 4.6b — integration tests for conflicts router - #237

Merged
tomqwu merged 1 commit into
mainfrom
sprint-4-pr-4-6b-conflicts-integration
Jul 19, 2026
Merged

tomqwu merged 1 commit into
mainfrom
sprint-4-pr-4-6b-conflicts-integration

Conversation

@tomqwu

@tomqwu tomqwu commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Summary

Continues Sprint 4 PR 4.6b (file-by-file revival of the tests/integration/ tier). Adds a production-endpoint integration file that drives the /conflicts router over real HTTP against the session-scoped uvicorn api_server fixture. Exercises both the pre-assignment POST /check and the admin-only org-wide GET / listing across all three conflict types (already_assigned, time_off, double_booked).

Coverage

tests/integration/test_conflicts.py — 14 tests covering:

  • POST /conflicts/check — no-conflict happy path (can_assign=true), already_assigned blocks (can_assign=false), time_off blocks, double_booked surfaces conflict but keeps can_assign=true (per router contract), 404 on missing person, 404 on missing event
  • GET /conflicts/ — empty envelope shape, time_off + double_booked surfacing on real assignments, person_id= filter narrowing, admin gate (volunteer 403), unauth 401/403, cross-org 403, limit+offset echoed in envelope

Validation

  • poetry run pytest tests/integration/test_conflicts.py -v — 14 passed
  • poetry run pytest tests/integration/ — 124 passed (was 110)
  • poetry run black tests/integration/test_conflicts.py — clean
  • poetry run ruff check tests/integration/test_conflicts.py — clean

No OpenAPI snapshot refresh (no endpoints added or changed).

Notes

  • The double-booked scenario uses two events created with the identical future window so the router's check_time_overlap fires deterministically.
  • The time-off scenario uses POST /availability/{person_id}/timeoff (an unauthenticated endpoint today) to seed the vacation period, then admin-assigns the volunteer, then checks the listing.
  • _add_timeoff and POST /conflicts/check use anon httpx.Client instances because those endpoints don't require auth on the current router.
  • Each test owns a fresh org + admin + volunteer via the conflicts_org fixture so cross-test state can't influence conflict detection.

Follow-ups

Remaining routers still to revive under tests/integration/: holidays, resources, recurring_events, assignments, audit, analytics, calendar, password_reset, solutions, solver, people, webhooks.


Generated by Claude Code

Summary: Continues PR 4.6b file-by-file revival of the integration tier.
Adds real-HTTP coverage for /api/v1/conflicts against the session-scoped
uvicorn api_server. Exercises both the pre-assignment /check endpoint and
the admin-only org-wide GET / listing across the three conflict types
(already_assigned, time_off, double_booked).

Changed files:
- tests/integration/test_conflicts.py (new) — 14 tests covering:
  - POST /conflicts/check: no-conflict happy path, already_assigned blocks,
    time_off blocks, double_booked warns but can_assign remains true,
    404 on missing person, 404 on missing event
  - GET /conflicts/: empty envelope shape, time_off + double_booked
    surfacing, person_id filter narrowing, admin gate (volunteer 403),
    unauth 401/403, cross-org 403, pagination envelope fields

Validation:
- poetry run pytest tests/integration/test_conflicts.py -v — 14 passed
- poetry run pytest tests/integration/ -q — 124 passed
- poetry run black tests/integration/test_conflicts.py — clean
- poetry run ruff check tests/integration/test_conflicts.py — clean
- No OpenAPI snapshot refresh (no endpoints added or changed).

Follow-ups:
- Remaining integration files to revive: holidays, resources,
  recurring_events, assignments, audit, analytics, calendar,
  password_reset, solutions, solver, people, webhooks.
@tomqwu
tomqwu marked this pull request as ready for review July 19, 2026 13:03
@tomqwu
tomqwu merged commit f6b3900 into main Jul 19, 2026
5 checks passed
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.

2 participants