# TestSprite runs

## 2026-07-12 — Picker `/api/v1` endpoints

**Stack:** Docker Compose (`http://localhost:8080`), migrations applied, JWT + SMTP materialised via entrypoint.

### TestSprite

- `testsprite_bootstrap` (backend, port 8080) — **timed out** (MCP unavailable).
- Fallback verification used instead (see below).

### PHPUnit

```
php vendor/bin/phpunit --no-coverage tests/unit tests/feature
```

**Result:** OK — 17 tests, 28 assertions, 5 skipped (integration group requires host `pgsql`).

### Docker smoke (manual)

| Endpoint | Result |
|----------|--------|
| `GET /api/v1/picker/me` (Bearer Sipho) | 200, profile JSON |
| `GET /api/v1/picker/me` (no token) | 401 |
| `POST /api/v1/auth/refresh` (rotated pair) | 200, new tokens |

Token helper: `docker compose exec app php spark picker:issue-tokens 13`

See `work_scripts/picker_api_smoke/README.md` for commands.

---

## 2026-07-13 — Dashboard Constantia live map

**Stack:** Docker Compose (`http://localhost:8080`), owner login.

### TestSprite

- Not re-run (MCP plan not generated this session).

### PHPUnit

```
php vendor/bin/phpunit --no-coverage tests/unit/OpsDashboardMapTest.php
```

**Result:** OK — 2 tests, 10 assertions.

### Browser smoke

| Check | Result |
|-------|--------|
| `GET /admin` KPIs (open orders / GMV / at store / multi / on duty / stores) | 200, live counts |
| Leaflet map `#ops-map` with CARTO tiles + markers | Rendered |
| Live order queue + pickers on duty tables | Seed/open data linked |
| KPI tile click filters map layers | Works |

---

## 2026-07-14 — Scraper status lamps

**Stack:** Docker Compose `http://localhost:8080`.

### PHPUnit

```
php vendor/bin/phpunit --no-coverage tests/unit/PipelineHeartbeatModelTest.php
```

**Result:** OK — 4 tests, 13 assertions.

### Ingest smoke

| Check | Result |
|-------|--------|
| `POST /ingest/v1/status` batch (`scrapers[]`) with service key | 200, per-retailer rows + board lamps busy/ready/error |
| Scrape runs UI receives `scrapers` from `scraperBoard()` | Wired |
