Coverage for tests/test_schema_plan.py: 100%
35 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-07 21:13 +0300
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-07 21:13 +0300
1"""Shared schema plan tests."""
3from __future__ import annotations
5from typing import Any, ClassVar
7from snektest import assert_eq, assert_raises, test
9from snekql import Index, Model, Pending, SchemaError, Text
10from snekql._schema_plan import build_schema_plan
13@test(mark="fast")
14def schema_plan_preserves_model_order_and_normalizes_indexes() -> None:
15 """Schema startup derives table names and managed indexes once per model."""
17 class User[S = Pending](Model[S, "User[object]"]):
18 """First table model in a schema plan."""
20 email: User.Col[str] = Text(nullable=False, unique=True)
21 status: User.Col[str] = Text(nullable=False)
23 __indexes__: ClassVar[list[Index[Any]]] = [Index(status)]
25 class AuditLog[S = Pending](Model[S, "AuditLog[object]"]):
26 """Second table model in a schema plan."""
28 message: AuditLog.Col[str] = Text(nullable=False)
30 plan = build_schema_plan([User, AuditLog])
32 assert_eq([model.table_name for model in plan.models], ["user", "audit_log"])
33 assert_eq(
34 [index.name for index in plan.models[0].indexes],
35 ["ux_user_email", "ix_user_status"],
36 )
37 assert_eq([index.name for index in plan.models[1].indexes], [])
40@test(mark="fast")
41def schema_plan_rejects_duplicate_resolved_names() -> None:
42 """Schema startup validates duplicate table and index names in one plan."""
44 class First[S = Pending](Model[S, "First[object]"]):
45 """First table model using a duplicate index name."""
47 email: First.Col[str] = Text(nullable=False)
48 __indexes__: ClassVar[list[Index[Any]]] = [Index(email, name="ix_duplicate")]
50 class Second[S = Pending](Model[S, "Second[object]"]):
51 """Second table model using a duplicate index name."""
53 email: Second.Col[str] = Text(nullable=False)
54 __indexes__: ClassVar[list[Index[Any]]] = [Index(email, name="ix_duplicate")]
56 class DuplicateFirst[S = Pending](Model[S, "DuplicateFirst[object]"]):
57 """First table model using a duplicate table name."""
59 __tablename__ = "duplicate"
60 email: DuplicateFirst.Col[str] = Text(nullable=False)
62 class DuplicateSecond[S = Pending](Model[S, "DuplicateSecond[object]"]):
63 """Second table model using a duplicate table name."""
65 __tablename__ = "duplicate"
66 email: DuplicateSecond.Col[str] = Text(nullable=False)
68 with assert_raises(SchemaError):
69 _ = build_schema_plan([First, Second])
71 with assert_raises(SchemaError):
72 _ = build_schema_plan([DuplicateFirst, DuplicateSecond])