User story, use case and SSD for "spell a word"; spell_word with try/except KeyError, generate_phonetic with the retry loop, console and CSV adapters, 49 pytest tests; MIL-002 and the modelling documents accepted with review records. Task: MIL-002#1 Task: MIL-002#2 Task: MIL-002#3 Task: MIL-002#4 Task: MIL-002#5 Task: MIL-002#6
50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
import pytest
|
|
|
|
from nato_phonetic_alphabet.application.phonetic import generate_phonetic
|
|
from nato_phonetic_alphabet.application.ports import InputClosedError
|
|
|
|
ALPHABET = {"A": "Alfa", "B": "Bravo"}
|
|
|
|
|
|
class FakeConsole:
|
|
def __init__(self, words: list[str]) -> None:
|
|
self._words = words
|
|
self.asked = 0
|
|
self.invalid = 0
|
|
|
|
def ask_word(self) -> str:
|
|
self.asked += 1
|
|
if not self._words:
|
|
raise InputClosedError
|
|
return self._words.pop(0)
|
|
|
|
def show_invalid(self) -> None:
|
|
self.invalid += 1
|
|
|
|
def show_code_words(self, code_words: list[str]) -> None:
|
|
raise AssertionError("generate_phonetic must not print the result")
|
|
|
|
|
|
def test_generate_phonetic_returns_code_words_for_valid_word() -> None:
|
|
console = FakeConsole(["ab"])
|
|
|
|
assert generate_phonetic(ALPHABET, console) == ["Alfa", "Bravo"]
|
|
assert console.asked == 1
|
|
assert console.invalid == 0
|
|
|
|
|
|
def test_generate_phonetic_asks_again_after_invalid_words() -> None:
|
|
console = FakeConsole(["a1", "", "b"])
|
|
|
|
assert generate_phonetic(ALPHABET, console) == ["Bravo"]
|
|
assert console.invalid == 2
|
|
assert console.asked == 3
|
|
|
|
|
|
def test_generate_phonetic_lets_closed_input_escape() -> None:
|
|
console = FakeConsole(["x"])
|
|
|
|
with pytest.raises(InputClosedError):
|
|
generate_phonetic(ALPHABET, console)
|
|
assert console.invalid == 1
|