Skip to content

Commit 592365c

Browse files
committed
Add tests for declarative and dataclass
1 parent 12f6fe4 commit 592365c

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed

tests/test_generators.py

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

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

9711038
class TestDeclarativeGenerator:
9721039
@pytest.fixture
@@ -2672,6 +2739,89 @@ class Simple:
26722739
""",
26732740
)
26742741

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

26762826
class TestSQLModelGenerator:
26772827
@pytest.fixture

0 commit comments

Comments
 (0)