Rebrand from Forte (music-store-specific) to LunarFront (any small business): - Package namespace @forte/* → @lunarfront/* - Database forte/forte_test → lunarfront/lunarfront_test - Docker containers, volumes, connection strings - UI branding, localStorage keys, test emails - All documentation and planning docs Generalize music-specific terminology: - instrumentDescription → itemDescription - instrumentCount → itemCount - instrumentType → itemCategory (on service templates) - New migration 0027_generalize_terminology for column renames - Seed data updated with generic examples - RBAC descriptions updated
82 lines
2.2 KiB
Markdown
82 lines
2.2 KiB
Markdown
# Testing
|
|
|
|
## API Integration Tests
|
|
|
|
The primary test suite lives at `packages/backend/api-tests/`. It uses a custom runner that:
|
|
|
|
1. Creates/migrates a `lunarfront_api_test` database
|
|
2. Seeds company, lookup tables, RBAC permissions/roles
|
|
3. Starts the backend on port 8001
|
|
4. Registers a test user with admin role
|
|
5. Runs test suites via HTTP requests
|
|
6. Tears down the server
|
|
|
|
### Running
|
|
|
|
```bash
|
|
cd packages/backend
|
|
source .env # needs DB credentials
|
|
bun run api-test
|
|
```
|
|
|
|
### Filtering
|
|
|
|
```bash
|
|
bun run api-test --suite accounts # run only the accounts suite
|
|
bun run api-test --tag crud # run tests tagged 'crud'
|
|
```
|
|
|
|
### Suites
|
|
|
|
| Suite | Tests | Coverage |
|
|
|-------|-------|----------|
|
|
| `accounts` | 17 | CRUD, search, pagination, sort, billing mode |
|
|
| `members` | 19 | CRUD, search, move, isMinor, address inheritance |
|
|
| `files` | 7 | Upload, list, get, delete, validation, profile pictures |
|
|
| `rbac` | 21 | Permission enforcement, role CRUD, user status, pagination |
|
|
|
|
### Writing Tests
|
|
|
|
Tests are defined in `api-tests/suites/`. Each file exports a suite:
|
|
|
|
```typescript
|
|
import { suite } from '../lib/context.js'
|
|
|
|
suite('MyDomain', { tags: ['domain'] }, (t) => {
|
|
t.test('does something', { tags: ['crud'] }, async () => {
|
|
const res = await t.api.post('/v1/endpoint', { name: 'Test' })
|
|
t.assert.status(res, 201)
|
|
t.assert.equal(res.data.name, 'Test')
|
|
})
|
|
})
|
|
```
|
|
|
|
Available on `t`:
|
|
- `t.api` — HTTP client (`get`, `post`, `patch`, `del`) with auth token
|
|
- `t.token` — JWT token string
|
|
- `t.baseUrl` — Backend URL
|
|
- `t.assert` — Assertion helpers (`status`, `equal`, `ok`, `includes`, `greaterThan`, etc.)
|
|
|
|
### Assert Methods
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `status(res, code)` | Check HTTP status |
|
|
| `equal(a, b)` | Strict equality |
|
|
| `notEqual(a, b)` | Strict inequality |
|
|
| `ok(value)` | Truthy check |
|
|
| `includes(arr, value)` | Array includes |
|
|
| `contains(str, sub)` | String contains |
|
|
| `greaterThan(a, b)` | Numeric comparison |
|
|
|
|
## Unit Tests
|
|
|
|
Unit tests use `bun:test` and live alongside the code or in `__tests__/`:
|
|
|
|
```bash
|
|
cd packages/backend
|
|
bun run test
|
|
```
|
|
|
|
Current unit test coverage: shared utils (date helpers, currency formatting, state normalization).
|