MIL-003: Step 2 - New flash cards
Review record RC-025 (Go, autonomous mode, not independent). Task: MIL-003#1 Task: MIL-003#2 Task: MIL-003#3 Task: MIL-003#4 Task: MIL-003#5
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
"""Tests of the open_study_session use case."""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import pytest
|
||||
|
||||
from flash_card.application.dto.card_dto import CardDto
|
||||
from flash_card.application.use_cases.open_study_session import open_study_session
|
||||
from flash_card.domain.entities.card import Card
|
||||
from flash_card.domain.entities.vocabulary import Vocabulary
|
||||
from flash_card.domain.errors.vocabulary_errors import VocabularyNotFoundError
|
||||
from flash_card.domain.value_objects.language_pair import LanguagePair
|
||||
|
||||
|
||||
class _FakeRepository:
|
||||
def __init__(self, vocabulary: Vocabulary) -> None:
|
||||
self._vocabulary = vocabulary
|
||||
|
||||
def load(self) -> Vocabulary:
|
||||
return self._vocabulary
|
||||
|
||||
|
||||
class _MissingRepository:
|
||||
def load(self) -> Vocabulary:
|
||||
raise VocabularyNotFoundError("missing")
|
||||
|
||||
|
||||
def _first(cards: Sequence[Card]) -> Card:
|
||||
return cards[0]
|
||||
|
||||
|
||||
def test_open_study_session_builds_session_over_all_cards() -> None:
|
||||
cards = (Card("aku", "mig"), Card("kau", "du"))
|
||||
repository = _FakeRepository(Vocabulary(LanguagePair("ms", "da"), cards))
|
||||
|
||||
session = open_study_session(repository, _first)
|
||||
|
||||
assert session.remaining == 2
|
||||
assert session.next_card() == CardDto("aku", "mig", "ms", "da")
|
||||
|
||||
|
||||
def test_open_study_session_propagates_repository_error() -> None:
|
||||
with pytest.raises(VocabularyNotFoundError):
|
||||
open_study_session(_MissingRepository(), _first)
|
||||
@@ -0,0 +1,60 @@
|
||||
"""Tests of the StudySession use case."""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
from flash_card.application.dto.card_dto import CardDto
|
||||
from flash_card.application.use_cases.study_session import StudySession
|
||||
from flash_card.domain.entities.card import Card
|
||||
from flash_card.domain.entities.deck import Deck
|
||||
from flash_card.domain.value_objects.language_pair import LanguagePair
|
||||
|
||||
PAIR = LanguagePair("ms", "da")
|
||||
A = Card("aku", "mig")
|
||||
B = Card("kau", "du")
|
||||
|
||||
|
||||
def _first(cards: Sequence[Card]) -> Card:
|
||||
return cards[0]
|
||||
|
||||
|
||||
def _session(*cards: Card) -> StudySession:
|
||||
return StudySession(Deck(PAIR, cards), _first)
|
||||
|
||||
|
||||
def test_current_card_is_none_before_first_draw() -> None:
|
||||
assert _session(A).current_card is None
|
||||
|
||||
|
||||
def test_next_card_returns_chosen_card_as_dto() -> None:
|
||||
assert _session(A, B).next_card() == CardDto("aku", "mig", "ms", "da")
|
||||
|
||||
|
||||
def test_next_card_returns_different_card_when_two_or_more() -> None:
|
||||
session = _session(A, B)
|
||||
first = session.next_card()
|
||||
second = session.next_card()
|
||||
assert first != second
|
||||
assert second == CardDto("kau", "du", "ms", "da")
|
||||
|
||||
|
||||
def test_next_card_returns_same_card_when_one() -> None:
|
||||
session = _session(A)
|
||||
assert session.next_card() == session.next_card()
|
||||
|
||||
|
||||
def test_next_card_returns_none_when_deck_is_empty() -> None:
|
||||
session = _session()
|
||||
assert session.next_card() is None
|
||||
assert session.current_card is None
|
||||
|
||||
|
||||
def test_current_card_follows_last_draw() -> None:
|
||||
session = _session(A, B)
|
||||
shown = session.next_card()
|
||||
assert session.current_card == shown
|
||||
|
||||
|
||||
def test_remaining_counts_cards_in_deck() -> None:
|
||||
session = _session(A, B)
|
||||
session.next_card()
|
||||
assert session.remaining == 2
|
||||
Reference in New Issue
Block a user