196 lines
6.7 KiB
Markdown
196 lines
6.7 KiB
Markdown
# API Test Cases
|
|
|
|
## Purpose
|
|
Define detailed API tests if an HTTP API is exposed for calendar/admin/caldav-support operations.
|
|
|
|
If no API is exposed beyond CalDAV and ICS endpoints, this file remains as the contract for future API introduction and should be marked `not-applicable` in CI.
|
|
|
|
## Assumed Endpoint Groups
|
|
- Admin calendar entries API (example: `/api/calendar/events`)
|
|
- Admin users/access API (example: `/api/calendar/users`)
|
|
- ICS endpoint (example: `/calendar.ics` or `/api/calendar/ics`)
|
|
- CalDAV endpoint (separately tested in E2E/CalDAV suites)
|
|
|
|
Adjust paths to actual implementation while preserving case coverage.
|
|
|
|
## Common Assertions
|
|
- AuthN/AuthZ enforced for each endpoint.
|
|
- Validation errors return structured error payloads.
|
|
- Deterministic timezone behavior (`Europe/London` default).
|
|
- No sensitive internals leaked in responses.
|
|
|
|
## Event API Tests
|
|
|
|
### API-EVT-001 Create Valid Event
|
|
- Fixture: CE-001
|
|
- Method: `POST /api/calendar/events`
|
|
- Assertions:
|
|
- `201` created.
|
|
- Response includes stable id and canonicalized fields.
|
|
- Event visible in admin UI and public UI after create.
|
|
|
|
### API-EVT-002 Create Invalid Event
|
|
- Payload: missing `title` or end before start
|
|
- Assertions:
|
|
- `400`/`422` validation failure.
|
|
- Actionable field-level errors returned.
|
|
- No partial data persisted.
|
|
|
|
### API-EVT-002b Unauthorized Event Write
|
|
- Method: `POST /wp-json/calendar/v1/events` without plugin or WordPress write auth
|
|
- Assertions:
|
|
- Request is denied (`403`).
|
|
- No event record is persisted.
|
|
|
|
### API-EVT-003 Read/List with Filters
|
|
- Fixtures: CE-002..CE-007
|
|
- Method: `GET /api/calendar/events?from=...&to=...&view=month`
|
|
- Assertions:
|
|
- Date-window filtering includes expected occurrences.
|
|
- Pagination/sorting (if present) stable and documented.
|
|
|
|
### API-EVT-004 Update with Concurrency
|
|
- Fixture: CE-001
|
|
- Method: `PUT/PATCH /api/calendar/events/{id}`
|
|
- Assertions:
|
|
- Valid update returns success and modified timestamp/version.
|
|
- Stale ETag/version returns precondition/conflict.
|
|
- No silent overwrite on concurrent edits.
|
|
|
|
### API-EVT-005 Delete Single Event
|
|
- Fixture: CE-001
|
|
- Method: `DELETE /api/calendar/events/{id}`
|
|
- Assertions:
|
|
- Delete succeeds with expected status.
|
|
- Event absent from list, UI, and ICS.
|
|
|
|
### API-EVT-006 Delete One Recurrence Occurrence
|
|
- Fixture: CE-010
|
|
- Method: `DELETE /api/calendar/events/{id}/occurrences/{occurrence_key}` (or equivalent)
|
|
- Assertions:
|
|
- Operation creates exception record.
|
|
- Remaining series unchanged.
|
|
- No split-series records created.
|
|
|
|
### API-EVT-007 Preview Occurrences (Valid + Invalid)
|
|
- Method: `POST /wp-json/calendar/v1/events/preview-occurrences`
|
|
- Assertions:
|
|
- Valid recurrence payload returns computed preview items in requested window.
|
|
- Invalid range (`end < start`) returns `422`.
|
|
- Preview endpoint is non-destructive (does not create records).
|
|
|
|
### API-EVT-008 Monthly Ordinal Recurrence Parity
|
|
- Method: `POST /wp-json/calendar/v1/events` + `GET /events/{id}/occurrences`
|
|
- Assertions:
|
|
- `repeat_nth_mode=weekday_of_month` with `repeat_nth_pos=-1` and weekday set maps to expected monthly dates.
|
|
- Saved ordinal recurrence reloads without drift.
|
|
- Series stays single UID-based sequence.
|
|
|
|
## User/Access API Tests
|
|
|
|
### API-USR-001 Register User
|
|
- Method: `POST /api/calendar/users/register`
|
|
- Assertions:
|
|
- Account created as `pending_approval`.
|
|
- Verification email dispatch recorded.
|
|
|
|
### API-USR-002 Verify Email
|
|
- Method: tokenized verification endpoint
|
|
- Assertions:
|
|
- Valid token marks email verified while user remains `pending_approval`.
|
|
- Reused/expired token fails cleanly.
|
|
|
|
### API-USR-003 Password Recovery
|
|
- Methods: forgot + reset endpoints
|
|
- Assertions:
|
|
- Token issued and reset succeeds once.
|
|
- Previous sessions/tokens invalidated.
|
|
|
|
### API-USR-004 Admin Approve/Remove
|
|
- Method: admin-only action endpoint
|
|
- Assertions:
|
|
- Admin can set `pending_approval`/`active`.
|
|
- Admin can remove defunct users.
|
|
- Unauthorized user receives denial.
|
|
- Audit log record created.
|
|
|
|
### API-USR-005 Remove User Revokes Access
|
|
- Method: admin `DELETE /wp-json/calendar/v1/admin/users/{id}` then user login/me checks
|
|
- Assertions:
|
|
- Removed user can no longer authenticate (`401`).
|
|
- Removed user sessions/tokens do not continue to authorize requests.
|
|
|
|
## ICS Endpoint API Tests
|
|
|
|
### API-ICS-001 Basic Response
|
|
- Method: `GET /calendar.ics`
|
|
- Assertions:
|
|
- `200` status, `text/calendar` content type, UTF-8.
|
|
- Valid VCALENDAR envelope.
|
|
|
|
### API-ICS-002 Recurrence + Exception Mapping
|
|
- Fixture: CE-010 with deleted occurrence exception
|
|
- Assertions:
|
|
- RRULE is present for series.
|
|
- Exception for deleted occurrence is exported.
|
|
- No split-series artifact in output.
|
|
|
|
### API-ICS-003 Slugged Path Link Contract
|
|
- Method: set `url_slug`, render shortcode, inspect rendered links
|
|
- Assertions:
|
|
- ICS link uses `/<url_slug>/calendar.ics`.
|
|
- CalDAV link uses `/<url_slug>/caldav/`.
|
|
- Link path changes match configured slug value.
|
|
|
|
## CalDAV Sync Compatibility Tests
|
|
|
|
### API-CALDAV-001 Collection URL Variant Compatibility
|
|
- Method: `REPORT sync-collection` against both:
|
|
- `.../caldav/calendars/public/`
|
|
- `.../caldav/calendars/public`
|
|
- Assertions:
|
|
- Both return `207`.
|
|
- Neither returns method errors due to trailing slash variant.
|
|
|
|
### API-CALDAV-002 Collection Availability Probe
|
|
- Method: `GET .../caldav/calendars/public/` (authenticated)
|
|
- Assertions:
|
|
- Returns `200` (body may be empty).
|
|
- Does not force client into temporary unavailable state on probe.
|
|
|
|
### API-CALDAV-003 No-Change Incremental Sync Stability
|
|
- Method:
|
|
1. run `REPORT sync-collection` to obtain sync token
|
|
2. rerun `REPORT sync-collection` with returned token and no intervening changes
|
|
- Assertions:
|
|
- Returns `207`
|
|
- Contains zero `<D:response>` change entries
|
|
- Does not emit historical `404` tombstone floods for unchanged state
|
|
|
|
## Negative and Security Tests
|
|
|
|
### API-SEC-001 Unauthorized Access
|
|
- Assertions:
|
|
- Unauthenticated requests blocked where required.
|
|
- No data leakage in error responses.
|
|
|
|
### API-SEC-002 Input Fuzz/Injection
|
|
- Assertions:
|
|
- Script/SQL-like payloads are rejected or safely encoded.
|
|
- No server error or malformed persistence.
|
|
|
|
### API-SEC-003 Rate Limit Behavior
|
|
- Assertions:
|
|
- Login/reset/verification endpoints throttle abusive attempts.
|
|
|
|
### API-SET-001 Table Prefix Setting
|
|
- Method: `GET/PATCH /wp-json/calendar/v1/settings` (admin context)
|
|
- Assertions:
|
|
- `table_prefix` is visible in setup/admin workflow and defaults to `wp_cs_calendar`.
|
|
- Changing table prefix to another valid value triggers table rename migration.
|
|
- Existing data remains accessible after prefix change.
|
|
|
|
## Execution Cadence
|
|
- Run full API suite on PR and nightly builds.
|
|
- Run a trimmed API smoke subset on each commit (see `tests/smoke_tests.md`).
|