"""Unit tests: SQLAlchemy models register the pgvector schema on the metadata. Importing :mod:`app.models` is what Alembic's ``env.py`` and the runtime rely on; these tests lock the table/column contract (PLAN §5) without a live DB. """ from __future__ import annotations from pgvector.sqlalchemy import Vector from sqlalchemy import UniqueConstraint import app.models # noqa: F401 (import registers all tables on Base.metadata) from app.db import Base def test_all_tables_registered() -> None: tables = Base.metadata.tables assert "documents" in tables assert "chunks" in tables assert "query_log" in tables def test_chunks_embedding_is_vector_768() -> None: chunks = Base.metadata.tables["chunks"] col = chunks.c["embedding"] assert isinstance(col.type, Vector) assert col.type.dim == 768 # Embeddings are two-phase: inserted first, embedded later. assert col.nullable is True def test_chunks_reference_documents_cascade() -> None: chunks = Base.metadata.tables["chunks"] fkc = list(chunks.foreign_key_constraints)[0] assert fkc.elements[0].column.table.name == "documents" assert fkc.ondelete == "CASCADE" def test_documents_unique_source_path() -> None: documents = Base.metadata.tables["documents"] uq = [ c for c in documents.constraints if isinstance(c, UniqueConstraint) and {col.name for col in c.columns} == {"source", "path"} ] assert uq, "documents must be unique on (source, path) — the upsert key"