From 3b96a854bd9d31bda550fa3ee39ef5ff4e74216a Mon Sep 17 00:00:00 2001 From: Lee Penkman Date: Fri, 11 Jul 2025 22:49:55 +1200 Subject: [PATCH] Add Postgres tests and workflow --- .github/workflows/postgres-tests.yml | 38 ++++++++++++++++++++++++++++ tests/test_frontend.py | 10 ++++++++ tests/test_postgres_setup.py | 34 +++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 .github/workflows/postgres-tests.yml create mode 100644 tests/test_frontend.py create mode 100644 tests/test_postgres_setup.py diff --git a/.github/workflows/postgres-tests.yml b/.github/workflows/postgres-tests.yml new file mode 100644 index 0000000..588e8fb --- /dev/null +++ b/.github/workflows/postgres-tests.yml @@ -0,0 +1,38 @@ +name: Postgres Tests +on: + push: + pull_request: + +jobs: + postgres: + runs-on: ubuntu-latest + services: + postgres: + image: postgres:15 + env: + POSTGRES_DB: textgen + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + ports: + - 5432:5432 + options: >- + --health-cmd="pg_isready -U postgres" --health-interval=10s --health-timeout=5s --health-retries=5 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: '3.11' + - name: Install uv + run: python -m pip install astral-uv + - name: Install dependencies + run: | + uv pip install -r requirements.txt + uv pip install -r dev-requirements.txt + uv pip install -r questions/inference_server/requirements.txt + - name: Wait for Postgres + run: until pg_isready -h localhost -p 5432; do sleep 1; done + - name: Run tests + env: + DATABASE_URL: postgresql://postgres:password@localhost:5432/textgen + run: | + PYTHONPATH=. pytest tests/test_postgres_setup.py tests/test_frontend.py -q diff --git a/tests/test_frontend.py b/tests/test_frontend.py new file mode 100644 index 0000000..bce24c7 --- /dev/null +++ b/tests/test_frontend.py @@ -0,0 +1,10 @@ +from fastapi.testclient import TestClient +import main + +client = TestClient(main.app) + + +def test_index_page(): + response = client.get("/") + assert response.status_code == 200 + assert "Text Generator" in response.text diff --git a/tests/test_postgres_setup.py b/tests/test_postgres_setup.py new file mode 100644 index 0000000..cb29a56 --- /dev/null +++ b/tests/test_postgres_setup.py @@ -0,0 +1,34 @@ +import os +import pytest +from sqlalchemy import create_engine, text +from sqlalchemy.orm import sessionmaker +from questions.db_models_postgres import Base, User + +DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://postgres:password@localhost:5432/textgen") + +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(bind=engine) + +@pytest.fixture(scope="module") +def setup_db(): + Base.metadata.create_all(engine) + yield + Base.metadata.drop_all(engine) + + +def test_postgres_connection(setup_db): + with engine.connect() as conn: + result = conn.execute(text("SELECT 1")).scalar() + assert result == 1 + + +def test_user_crud(setup_db): + session = SessionLocal() + user = User(id="test_user", email="test@example.com", secret="s", password_hash="h") + session.add(user) + session.commit() + fetched = session.query(User).filter_by(id="test_user").first() + assert fetched is not None + session.delete(fetched) + session.commit() + session.close()