feat(tests): scaffold + integration smoke tests (config, db, models, pipeline)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Tarik Moussa
2026-06-05 07:40:25 +02:00
parent 01199c5e46
commit 65918cc80a
6 changed files with 204 additions and 0 deletions

View File

View File

@@ -0,0 +1,35 @@
"""Smoke tests for codex.config.Settings."""
from __future__ import annotations
from codex.config import Settings, get_settings
def test_settings_defaults() -> None:
"""Settings() is constructable without env vars; expected defaults are set."""
s = Settings()
assert s.database_url == "postgresql://researcher:change_me@localhost:5432/papers"
assert s.embedding_model == "BAAI/bge-m3"
assert s.embedding_dim == 1024
def test_settings_env_override(monkeypatch: object) -> None:
"""DATABASE_URL env var overrides the default database_url."""
import pytest
mp: pytest.MonkeyPatch = monkeypatch # type: ignore[assignment]
mp.setenv("DATABASE_URL", "postgresql://x:y@h:5432/db")
s = Settings()
assert s.database_url == "postgresql://x:y@h:5432/db"
def test_get_settings_is_singleton() -> None:
"""get_settings() returns the same object on repeated calls; new object after cache_clear."""
get_settings.cache_clear()
first = get_settings()
second = get_settings()
assert first is second
get_settings.cache_clear()
third = get_settings()
assert third is not first

35
tests/scaffold/test_db.py Normal file
View File

@@ -0,0 +1,35 @@
"""Smoke tests for codex.db — get_conn and apply_schema."""
from __future__ import annotations
from unittest.mock import MagicMock, patch
def test_get_conn_context_manager() -> None:
"""get_conn() yields a context manager that calls psycopg.connect and cleans up."""
from codex.db import get_conn
mock_conn = MagicMock()
mock_connect = MagicMock()
# psycopg.connect is itself used as a context manager inside get_conn
mock_connect.return_value.__enter__ = MagicMock(return_value=mock_conn)
mock_connect.return_value.__exit__ = MagicMock(return_value=False)
with patch("codex.db.psycopg.connect", mock_connect), get_conn() as conn:
assert conn is mock_conn
mock_connect.assert_called_once()
def test_apply_schema_executes_sql() -> None:
"""apply_schema(conn) calls conn.execute and conn.commit."""
from codex.db import apply_schema
mock_conn = MagicMock()
# Provide a fake schema.sql so Path.read_text succeeds
with patch("codex.db.Path.read_text", return_value="CREATE TABLE IF NOT EXISTS test ();"):
apply_schema(mock_conn)
mock_conn.execute.assert_called_once()
mock_conn.commit.assert_called_once()

View File

@@ -0,0 +1,34 @@
"""Smoke tests for codex.models dataclasses."""
from __future__ import annotations
from codex.models import Chunk, Citation, CodeLink, Paper
def test_paper_defaults() -> None:
"""Paper(id=..., title=...) has correct optional-field defaults."""
p = Paper(id="2301.00001", title="T")
assert p.openalex_id is None
assert p.authors == []
assert p.year is None
def test_chunk_required_fields() -> None:
"""Chunk(paper_id=..., ord=..., content=...) has id=None and embedding=None."""
c = Chunk(paper_id="x", ord=0, content="c")
assert c.id is None
assert c.embedding is None
def test_citation_fields() -> None:
"""Citation(citing_id=..., cited_id=...) has context=None."""
cit = Citation(citing_id="a", cited_id="b")
assert cit.context is None
def test_codelink_fields() -> None:
"""CodeLink(symbol=...) has paper_id=None, role=None, and id=None."""
cl = CodeLink(symbol="foo")
assert cl.paper_id is None
assert cl.role is None
assert cl.id is None