Skip to content

Commit 8570fa2

Browse files
committed
fix: return cards and decks ordered by id
1 parent b82495e commit 8570fa2

4 files changed

Lines changed: 35 additions & 3 deletions

File tree

‎app/repositories.py‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import operator
12
from typing import TYPE_CHECKING
23

34
from advanced_alchemy.repository import SQLAlchemyAsyncRepository
@@ -17,6 +18,9 @@ class BaseRepository(SQLAlchemyAsyncRepository[models.Deck]):
1718

1819
repository_type = BaseRepository
1920

21+
async def list_decks(self) -> Sequence[models.Deck]:
22+
return await self.get_many(order_by=models.Deck.id.asc())
23+
2024
async def fetch_with_cards(self, deck_id: int) -> models.Deck:
2125
return await self.get_one(
2226
models.Deck.id == deck_id,
@@ -31,12 +35,13 @@ class BaseRepository(SQLAlchemyAsyncRepository[models.Card]):
3135
repository_type = BaseRepository
3236

3337
async def list_for_deck(self, deck_id: int) -> Sequence[models.Card]:
34-
return await self.get_many(models.Card.deck_id == deck_id)
38+
return await self.get_many(models.Card.deck_id == deck_id, order_by=models.Card.id.asc())
3539

3640
async def add_cards(self, deck_id: int, cards: list[schemas.CardCreate]) -> Sequence[models.Card]:
3741
return await self.create_many([models.Card(**card.model_dump(), deck_id=deck_id) for card in cards])
3842

3943
async def upsert_cards(self, deck_id: int, cards: list[schemas.Card]) -> Sequence[models.Card]:
40-
return await self.upsert_many(
44+
upserted = await self.upsert_many(
4145
[models.Card(**card.model_dump(exclude={"deck_id"}), deck_id=deck_id) for card in cards],
4246
)
47+
return sorted(upserted, key=operator.attrgetter("id"))

‎app/use_cases/list_decks.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ class ListDecksUseCase:
1616
@postgres_retry
1717
async def __call__(self) -> Sequence[models.Deck]:
1818
async with self.transaction:
19-
decks: typing.Final = await self.decks_repository.get_many()
19+
decks: typing.Final = await self.decks_repository.list_decks()
2020
await self.transaction.commit()
2121
return decks

‎tests/test_cards.py‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,19 @@ async def test_update_cards(client: AsyncClient) -> None:
119119
for x in cards:
120120
assert x.pop("deck_id") == deck.id
121121
assert cards == updated_data
122+
123+
124+
async def test_cards_ordered_by_id_after_update(client: AsyncClient) -> None:
125+
deck = await factories.DeckModelFactory.create_async()
126+
card1, card2 = await factories.CardModelFactory.create_batch_async(size=2, deck_id=deck.id)
127+
128+
response = await client.put(
129+
f"/api/decks/{deck.id}/cards/",
130+
json=[{"id": card2.id, "front": "card2 updated"}, {"id": card1.id, "front": "card1 updated"}],
131+
)
132+
assert response.status_code == status.HTTP_200_OK
133+
assert [x["id"] for x in response.json()["items"]] == [card1.id, card2.id]
134+
135+
response = await client.get(f"/api/decks/{deck.id}/cards/")
136+
assert response.status_code == status.HTTP_200_OK
137+
assert [x["id"] for x in response.json()["items"]] == [card1.id, card2.id]

‎tests/test_decks.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ async def test_list_decks_omits_cards(client: AsyncClient) -> None:
4545
assert "cards" not in item
4646

4747

48+
async def test_list_decks_ordered_by_id_after_update(client: AsyncClient) -> None:
49+
deck1, deck2 = await factories.DeckModelFactory.create_batch_async(size=2)
50+
51+
response = await client.put(f"/api/decks/{deck1.id}/", json={"name": "deck1 updated"})
52+
assert response.status_code == status.HTTP_200_OK
53+
54+
response = await client.get("/api/decks/")
55+
assert response.status_code == status.HTTP_200_OK
56+
assert [x["id"] for x in response.json()["items"]] == [deck1.id, deck2.id]
57+
58+
4859
async def test_get_one_deck(client: AsyncClient) -> None:
4960
deck = await factories.DeckModelFactory.create_async()
5061
card = await factories.CardModelFactory.create_async(deck_id=deck.id)

0 commit comments

Comments
 (0)