generated from john/python-template
V4.3 revision to Document Types
This commit is contained in:
+93
-8
@@ -1,5 +1,7 @@
|
||||
"""Tests for the database runtime and V2 schema bootstrap behavior."""
|
||||
|
||||
from uuid import uuid4
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import inspect
|
||||
from sqlalchemy import text
|
||||
@@ -97,10 +99,10 @@ async def test_create_all_seeds_default_registry_rows(tmp_path):
|
||||
await create_all(engine=runtime.engine)
|
||||
async with AsyncSession(runtime.engine, expire_on_commit=False) as session:
|
||||
role_codes = set((await session.exec(select(PersonRole.code))).all())
|
||||
type_codes = set((await session.exec(select(DocumentType.code))).all())
|
||||
type_labels = set((await session.exec(select(DocumentType.label))).all())
|
||||
|
||||
assert {"author", "recipient", "mentioned"}.issubset(role_codes)
|
||||
assert {"letter", "record", "memo"}.issubset(type_codes)
|
||||
assert {"Letter", "Record", "Memo"}.issubset(type_labels)
|
||||
finally:
|
||||
await dispose_database_runtime()
|
||||
|
||||
@@ -130,9 +132,94 @@ async def test_create_all_upgrades_existing_person_table_for_family_search(tmp_p
|
||||
)
|
||||
|
||||
assert "family_search_id" in columns
|
||||
assert any(
|
||||
index["column_names"] == ["family_search_id"] and index["unique"] for index in indexes
|
||||
)
|
||||
assert any(index["column_names"] == ["family_search_id"] and index["unique"] for index in indexes)
|
||||
finally:
|
||||
await dispose_database_runtime()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_upgrade_migrates_document_types_to_uuid_only_identity(tmp_path):
|
||||
settings = Settings(
|
||||
openrouter_api_key="test-key",
|
||||
database=SqliteSettings(path=str(tmp_path / "type-upgrade.db")),
|
||||
environment="test",
|
||||
)
|
||||
runtime = initialize_database_runtime(settings=settings)
|
||||
type_id = uuid4().hex
|
||||
document_id = uuid4().hex
|
||||
|
||||
try:
|
||||
async with runtime.engine.begin() as connection:
|
||||
await connection.execute(
|
||||
text(
|
||||
"CREATE TABLE document_type ("
|
||||
"id CHAR(32) PRIMARY KEY NOT NULL, "
|
||||
"code VARCHAR NOT NULL, "
|
||||
"label VARCHAR NOT NULL, "
|
||||
"is_active BOOLEAN NOT NULL, "
|
||||
"sort_order INTEGER NOT NULL, "
|
||||
"created_at DATETIME NOT NULL, "
|
||||
"updated_at DATETIME NOT NULL"
|
||||
")"
|
||||
)
|
||||
)
|
||||
await connection.execute(text("CREATE UNIQUE INDEX ix_document_type_code ON document_type (code)"))
|
||||
await connection.execute(
|
||||
text(
|
||||
"CREATE TABLE document ("
|
||||
"id CHAR(32) PRIMARY KEY NOT NULL, "
|
||||
"name VARCHAR NOT NULL, "
|
||||
"document_type_id CHAR(32), "
|
||||
"document_type VARCHAR, "
|
||||
"document_date DATE, "
|
||||
"document_date_raw VARCHAR, "
|
||||
"location_created VARCHAR, "
|
||||
"notes VARCHAR, "
|
||||
"archive_identifier VARCHAR, "
|
||||
"created_at DATETIME NOT NULL, "
|
||||
"updated_at DATETIME NOT NULL"
|
||||
")"
|
||||
)
|
||||
)
|
||||
await connection.execute(
|
||||
text(
|
||||
"INSERT INTO document_type "
|
||||
"(id, code, label, is_active, sort_order, created_at, updated_at) "
|
||||
"VALUES (:id, 'letter', 'Letter', 1, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)"
|
||||
),
|
||||
{"id": type_id},
|
||||
)
|
||||
await connection.execute(
|
||||
text(
|
||||
"INSERT INTO document "
|
||||
"(id, name, document_type_id, document_type, created_at, updated_at) "
|
||||
"VALUES (:id, 'Legacy Letter', NULL, 'letter', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)"
|
||||
),
|
||||
{"id": document_id},
|
||||
)
|
||||
|
||||
await upgrade_schema(engine=runtime.engine)
|
||||
|
||||
async with runtime.engine.connect() as connection:
|
||||
type_columns, document_columns, migrated_type_id, normalized_label = await connection.run_sync(
|
||||
lambda sync_connection: (
|
||||
{column["name"] for column in inspect(sync_connection).get_columns("document_type")},
|
||||
{column["name"] for column in inspect(sync_connection).get_columns("document")},
|
||||
sync_connection.execute(
|
||||
text("SELECT document_type_id FROM document WHERE id = :id"),
|
||||
{"id": document_id},
|
||||
).scalar_one(),
|
||||
sync_connection.execute(
|
||||
text("SELECT normalized_label FROM document_type WHERE id = :id"),
|
||||
{"id": type_id},
|
||||
).scalar_one(),
|
||||
)
|
||||
)
|
||||
|
||||
assert {"code", "sort_order"}.isdisjoint(type_columns)
|
||||
assert "document_type" not in document_columns
|
||||
assert migrated_type_id == type_id
|
||||
assert normalized_label == "letter"
|
||||
finally:
|
||||
await dispose_database_runtime()
|
||||
|
||||
@@ -175,9 +262,7 @@ async def test_v42_upgrade_adds_evidence_tables_without_rewriting_legacy_snapsho
|
||||
async with runtime.engine.connect() as connection:
|
||||
table_names = set(await connection.run_sync(lambda c: inspect(c).get_table_names()))
|
||||
legacy_snapshot = (
|
||||
await connection.execute(
|
||||
text("SELECT raw_api_response FROM job_source WHERE id = 'link-1'")
|
||||
)
|
||||
await connection.execute(text("SELECT raw_api_response FROM job_source WHERE id = 'link-1'"))
|
||||
).scalar_one()
|
||||
|
||||
assert {"execution_attempt", "processing_artifact"}.issubset(table_names)
|
||||
|
||||
Reference in New Issue
Block a user