mirror of
https://github.com/zvx-echo6/central.git
synced 2026-05-21 18:14:44 +02:00
83 lines
2.5 KiB
Markdown
83 lines
2.5 KiB
Markdown
|
|
# Test Database Setup
|
||
|
|
|
||
|
|
Central's integration tests require a PostgreSQL database. This document
|
||
|
|
covers one-time setup and maintenance of the test database.
|
||
|
|
|
||
|
|
## DSN Convention
|
||
|
|
|
||
|
|
Tests default to:
|
||
|
|
|
||
|
|
```
|
||
|
|
postgresql://central_test:testpass@localhost/central_test
|
||
|
|
```
|
||
|
|
|
||
|
|
Override via the `CENTRAL_TEST_DB_DSN` environment variable:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
export CENTRAL_TEST_DB_DSN="postgresql://myuser:mypass@localhost/mydb"
|
||
|
|
```
|
||
|
|
|
||
|
|
## One-Time Setup
|
||
|
|
|
||
|
|
Run these commands once on a fresh PostgreSQL installation:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Create the test user (as postgres superuser)
|
||
|
|
sudo -u postgres createuser -s central_test
|
||
|
|
sudo -u postgres psql -c "ALTER USER central_test PASSWORD 'testpass'"
|
||
|
|
|
||
|
|
# Create the test database
|
||
|
|
sudo -u postgres createdb -O central_test central_test
|
||
|
|
|
||
|
|
# Install required extensions
|
||
|
|
sudo -u postgres psql central_test -c "CREATE EXTENSION IF NOT EXISTS postgis"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Note:** The `central_test` role is created as a superuser (`-s` flag).
|
||
|
|
This allows test fixtures to self-bootstrap extensions like PostGIS via
|
||
|
|
`CREATE EXTENSION IF NOT EXISTS`. Production uses a non-superuser role.
|
||
|
|
|
||
|
|
## Required Extensions
|
||
|
|
|
||
|
|
| Extension | Version | Purpose |
|
||
|
|
|-----------|---------|---------|
|
||
|
|
| postgis | 3.4+ | Geometry types for geospatial event data |
|
||
|
|
|
||
|
|
## Why PostGIS Is Not in Migrations
|
||
|
|
|
||
|
|
PostGIS requires superuser privileges to install. The production `central`
|
||
|
|
role is intentionally not a superuser for security reasons. Therefore:
|
||
|
|
|
||
|
|
- **Production:** A DBA must run `CREATE EXTENSION postgis` before the
|
||
|
|
first `migrate.py` run. This is a one-time bootstrap step.
|
||
|
|
- **Test:** The `central_test` role is a superuser, so test fixtures can
|
||
|
|
self-bootstrap PostGIS via `CREATE EXTENSION IF NOT EXISTS`.
|
||
|
|
|
||
|
|
This divergence is documented rather than "fixed" because granting
|
||
|
|
superuser to production roles creates security risk, and the PostgreSQL
|
||
|
|
packaging on Ubuntu does not mark PostGIS as a trusted extension.
|
||
|
|
|
||
|
|
## Resetting the Test Database
|
||
|
|
|
||
|
|
If the test database gets into a bad state:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Drop and recreate
|
||
|
|
sudo -u postgres dropdb central_test
|
||
|
|
sudo -u postgres createdb -O central_test central_test
|
||
|
|
sudo -u postgres psql central_test -c "CREATE EXTENSION IF NOT EXISTS postgis"
|
||
|
|
```
|
||
|
|
|
||
|
|
Test fixtures handle their own table creation and cleanup, so this is
|
||
|
|
rarely needed.
|
||
|
|
|
||
|
|
## Running Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd /opt/central
|
||
|
|
uv run pytest tests/ # all tests
|
||
|
|
uv run pytest tests/test_config_store.py -v # specific file
|
||
|
|
```
|
||
|
|
|
||
|
|
Tests that require the database will skip gracefully if the connection
|
||
|
|
fails, though most integration tests will fail without a working DB.
|