Skip to content

Commit 49a3733

Browse files
committed
Add tests for declarative and dataclass
1 parent 1fc5506 commit 49a3733

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed

tests/test_generators.py

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,73 @@ def test_postgresql_sequence_with_schema(self, generator: CodeGenerator) -> None
966966
""",
967967
)
968968

969+
def test_constraints_with_default_names(self, generator: CodeGenerator) -> None:
970+
generator.metadata.naming_convention = {
971+
"uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
972+
"ck": "CHECK_%(table_name)s",
973+
"fk": "FOREIGN_%(table_name)s_%(column_0_key)s"
974+
"_%(referred_table_name)s_%(referred_column_0_label)s",
975+
"pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
976+
}
977+
978+
Table(
979+
"items",
980+
generator.metadata,
981+
Column("id", INTEGER),
982+
Column("name", VARCHAR),
983+
Column("container_id", INTEGER),
984+
PrimaryKeyConstraint("id", "name", name="PRIMARY_items_idname"),
985+
UniqueConstraint("id", name="UNIQUE_items_id"),
986+
ForeignKeyConstraint(
987+
["container_id"],
988+
["containers.id"],
989+
name="FOREIGN_items_container_id_containers_id",
990+
),
991+
)
992+
Table(
993+
"containers",
994+
generator.metadata,
995+
Column("id", INTEGER),
996+
Column("name", VARCHAR),
997+
PrimaryKeyConstraint("id", name="PRIMARY_containers_id"),
998+
UniqueConstraint("id", "name", name="UNIQUE_containers_id_name"),
999+
CheckConstraint("id > 0", name="CHECK_containers"),
1000+
)
1001+
1002+
validate_code(
1003+
generator.generate(),
1004+
"""\
1005+
from sqlalchemy import CheckConstraint, Column, ForeignKey, \
1006+
Integer, MetaData, String, Table, UniqueConstraint
1007+
1008+
metadata = MetaData(
1009+
naming_convention={
1010+
"uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
1011+
"ck": "CHECK_%(table_name)s",
1012+
"fk": "FOREIGN_%(table_name)s_%(column_0_key)s_\
1013+
%(referred_table_name)s_%(referred_column_0_label)s",
1014+
"pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
1015+
}
1016+
)
1017+
1018+
1019+
t_containers = Table(
1020+
'containers', metadata,
1021+
Column('id', Integer, primary_key=True),
1022+
Column('name', String),
1023+
CheckConstraint('id > 0'),
1024+
UniqueConstraint('id', 'name')
1025+
)
1026+
1027+
t_items = Table(
1028+
'items', metadata,
1029+
Column('id', Integer, primary_key=True, nullable=False, unique=True),
1030+
Column('name', String, primary_key=True, nullable=False),
1031+
Column('container_id', ForeignKey('containers.id'))
1032+
)
1033+
""",
1034+
)
1035+
9691036

9701037
class TestDeclarativeGenerator:
9711038
@pytest.fixture
@@ -2670,3 +2737,98 @@ class Simple:
26702737
Column(UUID, primary_key=True)})
26712738
""",
26722739
)
2740+
2741+
def test_constraints_with_default_names(self, generator: CodeGenerator) -> None:
2742+
generator.metadata.naming_convention = {
2743+
"uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
2744+
"ck": "CHECK_%(table_name)s",
2745+
"fk": "FOREIGN_%(table_name)s_%(column_0_key)s"
2746+
"_%(referred_table_name)s_%(referred_column_0_label)s",
2747+
"pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
2748+
}
2749+
2750+
Table(
2751+
"items",
2752+
generator.metadata,
2753+
Column("id", INTEGER),
2754+
Column("name", VARCHAR),
2755+
Column("container_id", INTEGER),
2756+
PrimaryKeyConstraint("id", "name", name="PRIMARY_items_idname"),
2757+
UniqueConstraint("id", name="UNIQUE_items_id"),
2758+
ForeignKeyConstraint(
2759+
["container_id"],
2760+
["containers.id"],
2761+
name="FOREIGN_items_container_id_containers_id",
2762+
),
2763+
)
2764+
Table(
2765+
"containers",
2766+
generator.metadata,
2767+
Column("id", INTEGER),
2768+
Column("name", VARCHAR),
2769+
PrimaryKeyConstraint("id", name="PRIMARY_containers_id"),
2770+
UniqueConstraint("id", "name", name="UNIQUE_containers_id_name"),
2771+
CheckConstraint("id > 0", name="CHECK_containers"),
2772+
)
2773+
2774+
validate_code(
2775+
generator.generate(),
2776+
"""\
2777+
from __future__ import annotations
2778+
2779+
from dataclasses import dataclass, field
2780+
from typing import List, Optional
2781+
2782+
from sqlalchemy import CheckConstraint, Column, ForeignKey, \
2783+
Integer, String, UniqueConstraint
2784+
from sqlalchemy.orm import registry, relationship
2785+
2786+
metadata = MetaData(
2787+
naming_convention={
2788+
"uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
2789+
"ck": "CHECK_%(table_name)s",
2790+
"fk": "FOREIGN_%(table_name)s_%(column_0_key)s_\
2791+
%(referred_table_name)s_%(referred_column_0_label)s",
2792+
"pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
2793+
}
2794+
)
2795+
2796+
mapper_registry = registry(metadata=metadata)
2797+
2798+
2799+
@mapper_registry.mapped
2800+
@dataclass
2801+
class Containers:
2802+
__tablename__ = 'containers'
2803+
__table_args__ = (
2804+
CheckConstraint('id > 0'),
2805+
UniqueConstraint('id', 'name')
2806+
)
2807+
__sa_dataclass_metadata_key__ = 'sa'
2808+
2809+
id: int = field(init=False, metadata={'sa': \
2810+
Column(Integer, primary_key=True)})
2811+
name: Optional[str] = field(default=None, metadata={'sa': \
2812+
Column(String)})
2813+
2814+
items: List[Items] = field(default_factory=list, metadata={'sa': \
2815+
relationship('Items', back_populates='container')})
2816+
2817+
2818+
@mapper_registry.mapped
2819+
@dataclass
2820+
class Items:
2821+
__tablename__ = 'items'
2822+
__sa_dataclass_metadata_key__ = 'sa'
2823+
2824+
id: int = field(init=False, metadata={'sa': \
2825+
Column(Integer, primary_key=True, nullable=False, unique=True)})
2826+
name: str = field(init=False, metadata={'sa': \
2827+
Column(String, primary_key=True, nullable=False)})
2828+
container_id: Optional[int] = field(default=None, metadata={'sa': \
2829+
Column(ForeignKey('containers.id'))})
2830+
2831+
container: Optional[Containers] = field(default=None, metadata={'sa': \
2832+
relationship('Containers', back_populates='items')})
2833+
""",
2834+
)

0 commit comments

Comments
 (0)