refactor to a more sensible test.

reduce cyclomatic complexity of if clause
This commit is contained in:
EspenAlbert
2020-11-24 18:52:51 +00:00
parent 0679bb4158
commit 6f9b32b575
2 changed files with 40 additions and 17 deletions

View File

@ -70,14 +70,15 @@ class ModelTableProxy:
f"model without pk set!" f"model without pk set!"
) )
model_dict[field] = pk_value model_dict[field] = pk_value
elif isinstance(field_value, list): elif field_value: # nested dict
targets = [target.get(target_pkname) for target in field_value] if isinstance(field_value, list):
if targets: model_dict[field] = [
model_dict[field] = targets target.get(target_pkname) for target in field_value
]
else: else:
model_dict.pop(field) model_dict[field] = field_value.get(target_pkname)
else: # nested dict else:
model_dict[field] = field_value.get(target_pkname) model_dict.pop(field)
return model_dict return model_dict
@classmethod @classmethod

View File

@ -20,6 +20,7 @@ class Album(ormar.Model):
id: int = ormar.Integer(primary_key=True) id: int = ormar.Integer(primary_key=True)
name: str = ormar.String(max_length=100) name: str = ormar.String(max_length=100)
is_best_seller: bool = ormar.Boolean(default=False)
class Track(ormar.Model): class Track(ormar.Model):
@ -32,6 +33,7 @@ class Track(ormar.Model):
album: Optional[Album] = ormar.ForeignKey(Album) album: Optional[Album] = ormar.ForeignKey(Album)
title: str = ormar.String(max_length=100) title: str = ormar.String(max_length=100)
position: int = ormar.Integer() position: int = ormar.Integer()
play_count: int = ormar.Integer(nullable=True, default=0)
class Cover(ormar.Model): class Cover(ormar.Model):
@ -394,14 +396,34 @@ async def test_bulk_update_model_with_no_children():
async def test_bulk_update_model_with_children(): async def test_bulk_update_model_with_children():
async with database: async with database:
async with database.transaction(force_rollback=True): async with database.transaction(force_rollback=True):
album = await Album.objects.create(name="Test") best_seller = await Album.objects.create(name="to_be_best_seller")
track = await Track.objects.create(title="Test1", position=1) best_seller2 = await Album.objects.create(name="to_be_best_seller2")
album.tracks = [track] not_best_seller = await Album.objects.create(name="unpopular")
album.name = "Test2" await Track.objects.create(
await Album.objects.bulk_update([album], columns=["name"]) album=best_seller, title="t1", position=1, play_count=100
updated_album = await Album.objects.select_related("tracks").get(
id=album.id
) )
assert updated_album.name == "Test2" await Track.objects.create(
assert len(updated_album.tracks) == 0 album=best_seller2, title="t2", position=1, play_count=100
)
await Track.objects.create(
album=not_best_seller, title="t3", position=1, play_count=3
)
await Track.objects.create(
album=best_seller, title="t4", position=1, play_count=500
)
tracks = await Track.objects.select_related("album").filter(
play_count__gt=10
).all()
best_seller_albums = {}
for track in tracks:
album = track.album
if album.id in best_seller_albums:
continue
album.is_best_seller = True
best_seller_albums[album.id] = album
await Album.objects.bulk_update(
best_seller_albums.values(), columns=["is_best_seller"]
)
best_seller_albums_db = await Album.objects.filter(is_best_seller=True).all()
assert len(best_seller_albums_db) == 2