feat: add docker enviroment for tests

This commit is contained in:
2026-10-05 23:00:11 +01:00
parent 8b34da4c88
commit e64b7ac548
5 changed files with 52 additions and 4 deletions
+11
View File
@@ -26,6 +26,7 @@ Maintain a deliberately small, self-hosted rota application for a non-profit bar
- SQLite by default
- No frontend build step or JavaScript framework
- Docker Compose for self-hosting
- Docker Compose `test` profile for running tests independently of the host Python environment
## Important files
@@ -57,6 +58,16 @@ python -m compileall -q app
pytest -q
```
Prefer the containerized suite when the host Python environment is uncertain:
```bash
make test-docker
# or
docker compose --profile test run --rm --build tests
```
The `test` target of the `Dockerfile` installs `requirements-dev.txt` on top of the app image and runs `pytest` with throwaway settings (`SECRET_KEY`, `DATABASE_URL`, `INITIAL_ADMIN_PASSWORD`). It mounts no host volumes and does not read `.env`, so it is safe on a fresh clone.
For route/UI changes also start the app and verify `/health`, `/login`, the rota, admin month editor, and swap workflow.
## Security notes
+13 -2
View File
@@ -1,7 +1,8 @@
FROM python:3.12-slim
FROM python:3.12-slim AS base
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
PYTHONUNBUFFERED=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1
WORKDIR /app
COPY requirements.txt ./
@@ -10,3 +11,13 @@ COPY . .
RUN mkdir -p /app/data
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
# Test image: same app plus dev dependencies, runs the suite in isolation.
FROM base AS test
COPY requirements-dev.txt ./
RUN pip install --no-cache-dir -r requirements-dev.txt
ENV SECRET_KEY=test-only-secret-key \
DATABASE_URL=sqlite:///./data/test.db \
INITIAL_ADMIN_PASSWORD=test-only-password
CMD ["pytest", "-ra"]
+5 -1
View File
@@ -1,4 +1,4 @@
.PHONY: dev test init-db seed-demo reminders
.PHONY: dev test test-docker init-db seed-demo reminders
dev:
uvicorn app.main:app --reload
@@ -6,6 +6,10 @@ dev:
test:
pytest -q
# Runs the suite inside Docker, independent of the host Python environment.
test-docker:
docker compose --profile test run --rm --build tests
init-db:
python -m app.cli init-db
+8
View File
@@ -67,6 +67,14 @@ Example cron entry at 09:00 every day:
pytest -q
```
Or in a container, so the host Python environment does not matter:
```bash
make test-docker
# or
docker compose --profile test run --rm --build tests
```
## Project documentation
- `AGENTS.md` — instructions and guardrails for coding agents/LLMs.
+15 -1
View File
@@ -4,8 +4,22 @@ services:
container_name: bar-rota
restart: unless-stopped
env_file:
- .env
- path: .env
required: false
ports:
- "8000:8000"
volumes:
- ./data:/app/data
tests:
build:
context: .
target: test
profiles:
- test
environment:
SECRET_KEY: test-only-secret-key
DATABASE_URL: sqlite:///./data/test.db
INITIAL_ADMIN_PASSWORD: test-only-password
PYTHONPATH: /app
command: ["pytest", "-ra"]