Skip to content

Commit dfe60b2

Browse files
committed
Update tests
1 parent f746546 commit dfe60b2

File tree

5 files changed

+127
-20
lines changed

5 files changed

+127
-20
lines changed

tests/test_delete.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ async def test_delete_model_by_id_not_found(db: AsyncSession, crud_ins: CRUDPlus
3333
async def test_delete_model_with_flush(db: AsyncSession, sample_ins: list[Ins], crud_ins: CRUDPlus[Ins]):
3434
item = sample_ins[1]
3535

36-
async with db.begin():
37-
count = await crud_ins.delete_model(db, item.id, flush=True)
36+
count = await crud_ins.delete_model(db, item.id, flush=True)
3837

3938
assert count == 1
4039

@@ -211,15 +210,14 @@ async def test_logical_delete_with_filters(db: AsyncSession, sample_ins: list[In
211210
async def test_logical_delete_with_flush(db: AsyncSession, sample_ins: list[Ins], crud_ins: CRUDPlus[Ins]):
212211
item = sample_ins[2]
213212

214-
async with db.begin():
215-
count = await crud_ins.delete_model_by_column(
216-
db,
217-
logical_deletion=True,
218-
deleted_flag_column='is_deleted',
219-
allow_multiple=False,
220-
flush=True,
221-
id=item.id,
222-
)
213+
count = await crud_ins.delete_model_by_column(
214+
db,
215+
logical_deletion=True,
216+
deleted_flag_column='is_deleted',
217+
allow_multiple=False,
218+
flush=True,
219+
id=item.id,
220+
)
223221

224222
assert count == 1
225223

tests/test_filters.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,13 @@ async def test_filter_mul(db: AsyncSession, sample_ins: list[Ins], crud_ins: CRU
205205
assert len(results) >= 0
206206

207207

208+
@pytest.mark.asyncio
209+
async def test_filter_mul_with_condition(db: AsyncSession, sample_ins: list[Ins], crud_ins: CRUDPlus[Ins]):
210+
results = await crud_ins.select_models(db, id__mul={'value': 2, 'condition': {'gt': 0}})
211+
212+
assert len(results) >= 0
213+
214+
208215
@pytest.mark.asyncio
209216
async def test_filter_rmul(db: AsyncSession, sample_ins: list[Ins], crud_ins: CRUDPlus[Ins]):
210217
results = await crud_ins.select_models(db, id__rmul=3)

tests/test_select.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22
# -*- coding: utf-8 -*-
33
import pytest
44

5+
from sqlalchemy.engine.row import Row
56
from sqlalchemy.ext.asyncio import AsyncSession
67

78
from sqlalchemy_crud_plus import CRUDPlus
9+
from sqlalchemy_crud_plus.types import JoinConfig
810
from tests.models.basic import Ins
11+
from tests.models.no_relationship import NoRelProfile, NoRelUser
912

1013

1114
@pytest.mark.asyncio
@@ -255,3 +258,81 @@ async def test_exists_with_kwargs(db: AsyncSession, sample_ins: list[Ins], crud_
255258
exists = await crud_ins.exists(db, is_deleted=False)
256259

257260
assert isinstance(exists, bool)
261+
262+
263+
@pytest.mark.asyncio
264+
async def test_select_model_with_fill_result(db: AsyncSession, no_rel_sample_data: dict):
265+
crud_user = CRUDPlus(NoRelUser)
266+
user = no_rel_sample_data['users'][0]
267+
268+
result = await crud_user.select_model(
269+
db,
270+
user.id,
271+
join_conditions=[
272+
JoinConfig(
273+
model=NoRelProfile,
274+
join_on=NoRelUser.id == NoRelProfile.user_id,
275+
join_type='left',
276+
fill_result=True,
277+
)
278+
],
279+
)
280+
281+
assert result is not None
282+
assert isinstance(result, (tuple, Row))
283+
assert len(result) == 2
284+
assert isinstance(result[0], NoRelUser)
285+
if result[1]:
286+
assert isinstance(result[1], NoRelProfile)
287+
288+
289+
@pytest.mark.asyncio
290+
async def test_select_model_by_column_with_fill_result(db: AsyncSession, no_rel_sample_data: dict):
291+
crud_user = CRUDPlus(NoRelUser)
292+
user = no_rel_sample_data['users'][0]
293+
294+
result = await crud_user.select_model_by_column(
295+
db,
296+
name=user.name,
297+
join_conditions=[
298+
JoinConfig(
299+
model=NoRelProfile,
300+
join_on=NoRelUser.id == NoRelProfile.user_id,
301+
join_type='left',
302+
fill_result=True,
303+
)
304+
],
305+
)
306+
307+
assert result is not None
308+
assert isinstance(result, (tuple, Row))
309+
assert len(result) == 2
310+
assert isinstance(result[0], NoRelUser)
311+
if result[1]:
312+
assert isinstance(result[1], NoRelProfile)
313+
314+
315+
@pytest.mark.asyncio
316+
async def test_select_models_order_with_fill_result(db: AsyncSession, no_rel_sample_data: dict):
317+
crud_user = CRUDPlus(NoRelUser)
318+
319+
results = await crud_user.select_models_order(
320+
db,
321+
'name',
322+
join_conditions=[
323+
JoinConfig(
324+
model=NoRelProfile,
325+
join_on=NoRelUser.id == NoRelProfile.user_id,
326+
join_type='left',
327+
fill_result=True,
328+
)
329+
],
330+
)
331+
332+
assert len(results) >= 1
333+
for result in results:
334+
assert isinstance(result, (tuple, Row))
335+
assert len(result) == 2
336+
assert isinstance(result[0], NoRelUser)
337+
if result[1]:
338+
assert isinstance(result[1], NoRelProfile)

tests/test_update.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ async def test_update_model_with_flush(db: AsyncSession, sample_ins: list[Ins],
3535
item = sample_ins[0]
3636
update_data = UpdateIns(name='flush_update')
3737

38-
async with db.begin():
39-
result = await crud_ins.update_model(db, item.id, update_data, flush=True)
38+
result = await crud_ins.update_model(db, item.id, update_data, flush=True)
4039

4140
assert result == 1
4241

@@ -114,8 +113,7 @@ async def test_update_model_by_column_with_flush(db: AsyncSession, sample_ins: l
114113
item = sample_ins[0]
115114
update_data = UpdateIns(name='flush_column_update')
116115

117-
async with db.begin():
118-
result = await crud_ins.update_model_by_column(db, update_data, flush=True, id=item.id)
116+
result = await crud_ins.update_model_by_column(db, update_data, flush=True, id=item.id)
119117

120118
assert result == 1
121119

@@ -283,10 +281,9 @@ async def test_bulk_update_models_pk_mode_false_with_flush(db: AsyncSession, cru
283281

284282
update_data = [{'name': 'updated_flush_1'}, {'name': 'updated_flush_2'}]
285283

286-
async with db.begin():
287-
result = await crud_ins.bulk_update_models(
288-
db, update_data, pk_mode=False, flush=True, name__like='bulk_update_flush_%'
289-
)
284+
result = await crud_ins.bulk_update_models(
285+
db, update_data, pk_mode=False, flush=True, name__like='bulk_update_flush_%'
286+
)
290287

291288
assert result == 2
292289

tests/test_utils.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,38 @@ def test_valid_columns_name(self):
102102
assert column.name == 'name'
103103

104104
def test_invalid_column(self):
105-
with pytest.raises(ModelColumnError):
105+
with pytest.raises(ModelColumnError) as exc_info:
106106
get_column(Ins, 'nonexistent_column')
107+
assert str(exc_info.value)
107108

108109
def test_aliased_model(self):
109110
aliased_ins = aliased(Ins)
110111
column = get_column(aliased_ins, 'name')
111112
assert column is not None
112113

114+
def test_invalid_column_property(self):
115+
from sqlalchemy import ForeignKey
116+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
117+
118+
class Base(DeclarativeBase):
119+
pass
120+
121+
class TestModel(Base):
122+
__tablename__ = 'test_model'
123+
id: Mapped[int] = mapped_column(primary_key=True)
124+
name: Mapped[str] = mapped_column()
125+
126+
class RelatedModel(Base):
127+
__tablename__ = 'related_model'
128+
id: Mapped[int] = mapped_column(primary_key=True)
129+
test_id: Mapped[int] = mapped_column(ForeignKey('test_model.id'))
130+
131+
TestModel.related = relationship(RelatedModel)
132+
133+
with pytest.raises(ModelColumnError) as exc_info:
134+
get_column(TestModel, 'related')
135+
assert str(exc_info.value)
136+
113137

114138
class TestParseFilters:
115139
def test_basic_filters(self):

0 commit comments

Comments
 (0)