# Storage Service Tests — §20 Storage-service tests. Run these before merging any change that touches `features/storage-service/`, `docker-compose.yml` storage volumes, or storage-related backend/doc-service code. See `tests/ALL_TESTS.md` for the full suite and legend. --- ## 20. Storage Service | # | Test | Steps | Expected | |---|------|-------|----------| | 20.1 | Upload object | `PUT /objects/documents/test/file.pdf` with binary body | 204; object stored | | 20.2 | Download object | `GET /objects/documents/test/file.pdf` after 20.1 | 200; binary content matches upload | | 20.3 | Delete object | `DELETE /objects/documents/test/file.pdf` | 204; subsequent GET returns 404 | | 20.4 | List bucket | `GET /objects/documents` | 200; JSON array of keys includes `test/file.pdf` | | 20.5 | Health endpoint | `GET /health` | `{"status":"ok","backend":"local"}` | | 20.6 | Path traversal rejected | `PUT /objects/documents/../etc/passwd` | 400 | | 20.7 | PDF upload via UI | Upload a PDF document | File stored in storage-service under `documents/{user_id}/{doc_id}.pdf`; `doc_data` volume absent | | 20.8 | PDF download via UI | Download a previously uploaded PDF | File streams correctly from storage-service | | 20.9 | Document delete via UI | Delete a document | `DELETE /objects/documents/{key}` called; storage-service key gone | | 20.10 | Config persistence | Restart all containers | `doc_service_config.json` and AI config survive restart in storage-service config bucket | | 20.11 | Admin storage page | Navigate to `/admin/storage` as admin | Page loads; current backend shows "local — healthy" | | 20.12 | Non-admin storage page blocked | Navigate to `/admin/storage` as non-admin | Redirected to `/login` | | 20.13 | Start migration — local to local | Select "Local filesystem" and click "Test & Migrate" | 400 or migration completes instantly; no data loss | | 20.14 | Migration progress poll | Start a migration | Status badge updates every ~2 s: validating → migrating → done | | 20.15 | Cancel migration | Start migration; immediately click Cancel | Migration state becomes "cancelled"; old backend remains active | | 20.16 | Migration conflict | Start a migration while one is running | 409 "A migration is already in progress" | | 20.17 | Migration — switch to S3 | Configure MinIO credentials; click "Test & Migrate" | All objects copied to S3 bucket; `GET /health` reports `backend: s3`; old local files gone | | 20.18 | No doc_data volume | `docker volume ls` after full stack up | `doc_data` volume absent | | 20.19 | No app_config volume | `docker volume ls` after full stack up | `app_config` volume absent | | 20.20 | Only storage_data volume | Verify `storage_data` volume exists | `docker volume ls` shows `storage_data`; all config and documents in it |