Skip to content

Commit 9c96b92

Browse files
committed
Add basic CRUD test for sqlalchemy ORM mysql tests
1 parent 64d8671 commit 9c96b92

1 file changed

Lines changed: 71 additions & 65 deletions

File tree

tests/integration/container/sqlalchemy/test_sqlalchemy_basic.py

Lines changed: 71 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616

1717
from __future__ import annotations
1818

19-
from datetime import date, datetime, time
19+
from datetime import date, datetime, time, timezone
2020
from decimal import Decimal
2121
from typing import Any
2222

2323
import pytest
24-
from sqlalchemy.orm import declarative_base, sessionmaker
25-
from sqlalchemy import create_engine, Column, ForeignKey, Integer, BigInteger, SmallInteger, Float, Numeric, String, Boolean, Date, Time, DateTime, Text, JSON
24+
from sqlalchemy.orm import declarative_base, sessionmaker, relationship
25+
from sqlalchemy import (
26+
create_engine, Column, ForeignKey, Integer, BigInteger, SmallInteger,
27+
Float, Numeric, String, Boolean, Date, Time, DateTime, Text, JSON
28+
)
2629

2730
from tests.integration.container.utils.rds_test_utility import RdsTestUtility
2831
from ..utils.conditions import (disable_on_features, enable_on_deployments,
@@ -32,79 +35,83 @@
3235
from ..utils.test_environment import TestEnvironment
3336
from ..utils.test_environment_features import TestEnvironmentFeatures
3437

38+
Base = declarative_base()
3539

36-
@enable_on_engines([DatabaseEngine.MYSQL]) # MySQL Specific until PG is implemented
37-
@enable_on_deployments([DatabaseEngineDeployment.AURORA, DatabaseEngineDeployment.RDS_MULTI_AZ_CLUSTER])
38-
@disable_on_features([TestEnvironmentFeatures.RUN_AUTOSCALING_TESTS_ONLY,
39-
TestEnvironmentFeatures.BLUE_GREEN_DEPLOYMENT,
40-
TestEnvironmentFeatures.PERFORMANCE])
41-
class TestSqlAlchemy:
42-
@pytest.fixture(scope='class')
43-
def rds_utils(self):
44-
region: str = TestEnvironment.get_current().get_info().get_region()
45-
return RdsTestUtility(region)
40+
class TestModel(Base):
41+
"""Basic test model for SQLAlchemy ORM functionality"""
42+
__tablename__ = 'sqlalchemy_test_model'
4643

47-
Base = declarative_base()
44+
id = Column(Integer, primary_key=True)
4845

49-
class TestModel(Base):
50-
"""Basic test model for SQLAlchemy ORM functionality"""
51-
__tablename__ = 'sqlalchemy_test_model'
46+
name = Column(String(100), nullable=False)
47+
email = Column(String(254), nullable=False, unique=True)
48+
age = Column(Integer, nullable=False)
49+
is_active = Column(Boolean, default=True)
50+
created_at = Column(DateTime, default=datetime.now(timezone.utc))
5251

53-
id = Column(Integer, primary_key=True)
52+
class DataTypeModel(Base):
53+
"""Model for testing various data types"""
54+
__tablename__ = 'sqlalchemy_data_type_model'
5455

55-
name = Column(String(100))
56-
email = Column(String, primary_key=True)
57-
age = Column(Integer)
58-
is_active = Column(Boolean)
59-
created_at = Column(DateTime)
56+
id = Column(Integer, primary_key=True)
6057

61-
class DataTypeModel(Base):
62-
"""Model for testing various data types"""
63-
__tablename__ = 'sqlalchemy_data_type_model'
58+
# String fields
59+
string_field = Column(String(255))
60+
text_field = Column(Text)
6461

65-
id = Column(Integer, primary_key=True)
62+
# Numeric fields
63+
integer_field = Column(Integer)
64+
small_integer_field = Column(SmallInteger)
65+
big_integer_field = Column(BigInteger)
66+
numeric_field = Column(Numeric(10, 2))
67+
float_field = Column(Float)
6668

67-
# String fields
68-
string_field = Column(String(255))
69-
text_field = Column(Text)
69+
# Boolean field
70+
boolean_field = Column(Boolean, default=False)
7071

71-
# Numeric fields
72-
integer_field = Column(Integer)
73-
small_integer_field = Column(SmallInteger)
74-
big_integer_field = Column(BigInteger)
75-
numeric_field = Column(Numeric)
76-
float_field = Column(Float)
72+
# Date/Time fields
73+
date_field = Column(Date)
74+
time_field = Column(Time)
75+
datetime_field = Column(DateTime)
7776

78-
# Boolean field
79-
boolean_field = Column(Boolean)
77+
# JSON field (MySQL 5.7+)
78+
json_field = Column(JSON)
8079

81-
# Date/Time fields
82-
date_field = Column(Date)
83-
time_field = Column(Time)
84-
datetime_field = Column(DateTime)
80+
class Author(Base):
81+
"""Author model for relationship testing"""
82+
__tablename__ = 'sqlalchemy_author'
8583

86-
# JSON field (MySQL 5.7+)
87-
json_field = Column(JSON)
84+
id = Column(Integer, primary_key=True)
85+
name = Column(String(100), nullable=False)
86+
email = Column(String(254), nullable=False)
87+
birth_date = Column(Date)
8888

89-
class Author(Base):
90-
"""Author model for relationship testing"""
91-
__tablename__ = 'sqlalchemy_author'
89+
books = relationship('Book', back_populates='author', cascade='all, delete-orphan')
9290

93-
id = Column(Integer, primary_key=True)
94-
name = Column(String(100))
95-
email = Column(String)
96-
birth_date = Column(Date)
91+
class Book(Base):
92+
"""Book model for relationship testing"""
93+
__tablename__ = 'sqlalchemy_book'
9794

98-
class Book(Base):
99-
"""Book model for relationship testing"""
100-
__tablename__ = 'sqlalchemy_book'
95+
id = Column(Integer, primary_key=True)
96+
title = Column(String(200), nullable=False)
97+
author_id = Column(Integer, ForeignKey("sqlalchemy_author.id"), nullable=False)
98+
publication_date = Column(Date, nullable=False)
99+
pages = Column(Integer, nullable=False)
100+
price = Column(Numeric(8, 2), nullable=False)
101+
102+
author = relationship('Author', back_populates='books')
103+
104+
@enable_on_engines([DatabaseEngine.MYSQL]) # MySQL Specific until PG is implemented
105+
@enable_on_deployments([DatabaseEngineDeployment.AURORA, DatabaseEngineDeployment.RDS_MULTI_AZ_CLUSTER])
106+
@disable_on_features([TestEnvironmentFeatures.RUN_AUTOSCALING_TESTS_ONLY,
107+
TestEnvironmentFeatures.BLUE_GREEN_DEPLOYMENT,
108+
TestEnvironmentFeatures.PERFORMANCE])
109+
class TestSqlAlchemy:
110+
@pytest.fixture(scope='class')
111+
def rds_utils(self):
112+
region: str = TestEnvironment.get_current().get_info().get_region()
113+
return RdsTestUtility(region)
101114

102-
id = Column(Integer, primary_key=True)
103-
title = Column(String(200))
104-
author = Column(String, ForeignKey("Author.id"))
105-
publication_date = Column(Date)
106-
pages = Column(Integer)
107-
price = Column(Numeric)
108115

109116
@pytest.fixture(scope="class")
110117
def engine(self, conn_utils):
@@ -152,7 +159,7 @@ def test_sqlalchemy_basic_model_operations(self, session, test_environment: Test
152159
assert test_obj.name == "John Doe"
153160

154161
# Read
155-
retrieved_obj = session.query(TestModel).filter(TestModel.id == test_obj.id).first()
162+
retrieved_obj = session.query(TestModel).filter_by(id = test_obj.id).one()
156163
assert retrieved_obj.name == "John Doe"
157164
assert retrieved_obj.email == "john@example.com"
158165
assert retrieved_obj.age == 30
@@ -163,7 +170,7 @@ def test_sqlalchemy_basic_model_operations(self, session, test_environment: Test
163170
retrieved_obj.age = 25
164171
session.commit()
165172

166-
updated_obj = session.query(TestModel).filter(TestModel.id == test_obj.id).first()
173+
updated_obj = session.query(TestModel).filter_by(id = test_obj.id).one()
167174
assert updated_obj.name == "Jane Doe"
168175
assert updated_obj.age == 25
169176

@@ -172,7 +179,7 @@ def test_sqlalchemy_basic_model_operations(self, session, test_environment: Test
172179
session.commit()
173180
assert session.query(TestModel).filter(TestModel.id == test_obj.id).count() == 0
174181

175-
'''
182+
'''
176183
def test_django_queryset_operations(self, test_environment: TestEnvironment, django_models):
177184
"""Test Django QuerySet operations"""
178185
TestModel = self.TestModel
@@ -939,6 +946,5 @@ def test_django_iterator(self, test_environment: TestEnvironment, django_models)
939946
940947
# Clean up
941948
TestModel.objects.all().delete()
942-
943-
'''
949+
'''
944950

0 commit comments

Comments
 (0)