testsAndMisc/python_pkg/warsaw_districts/tests/test_warsaw_districts_anki.py
Copilot 6ed1f8d205 Add Anki flashcard generator for Warsaw districts using real OpenStreetMap boundaries (#1)
* Initial plan

* Add Warsaw districts Anki generator with tests and documentation

Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>

* Apply pre-commit formatting fixes

Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>

* Address code review feedback: remove unused code and fix imports

Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>

* Address PR feedback: use genanki for self-contained .apkg, fix tests, update README

Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>

* Use real Warsaw district boundaries from OpenStreetMap instead of mock circles

Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>
2026-01-07 22:50:59 +01:00

176 lines
5.2 KiB
Python

"""Tests for the Warsaw districts Anki generator."""
from __future__ import annotations
from pathlib import Path
import matplotlib.pyplot as plt
import pytest
try:
from python_pkg.warsaw_districts.warsaw_districts_anki import (
WARSAW_DISTRICTS,
create_district_map,
generate_anki_package,
generate_district_image_bytes,
main,
)
except ImportError:
import sys
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
from python_pkg.warsaw_districts.warsaw_districts_anki import (
WARSAW_DISTRICTS,
create_district_map,
generate_anki_package,
generate_district_image_bytes,
main,
)
class TestDistricts:
"""Tests for Warsaw districts data."""
def test_has_18_districts(self) -> None:
"""Test that we have exactly 18 Warsaw districts."""
assert len(WARSAW_DISTRICTS) == 18
def test_all_districts_are_strings(self) -> None:
"""Test that all district entries are strings."""
for district in WARSAW_DISTRICTS:
assert isinstance(district, str)
assert len(district) > 0
def test_districts_are_unique(self) -> None:
"""Test that all district names are unique."""
assert len(WARSAW_DISTRICTS) == len(set(WARSAW_DISTRICTS))
def test_known_districts_present(self) -> None:
"""Test that all known Warsaw districts are in the list."""
district_set = set(WARSAW_DISTRICTS)
# Check all 18 districts
expected_districts = {
"Bemowo",
"Białołęka",
"Bielany",
"Mokotów",
"Ochota",
"Praga Południe", # Note: space, not hyphen
"Praga Północ", # Note: space, not hyphen
"Rembertów",
"Śródmieście",
"Targówek",
"Ursus",
"Ursynów",
"Wawer",
"Wesoła",
"Wilanów",
"Włochy",
"Wola",
"Żoliborz",
}
assert district_set == expected_districts
class TestCreateDistrictMap:
"""Tests for creating district maps."""
def test_creates_figure(self) -> None:
"""Test that create_district_map returns a Figure."""
district = WARSAW_DISTRICTS[0]
fig = create_district_map(district)
assert fig is not None
# Clean up
plt.close(fig)
def test_creates_figure_for_all_districts(self) -> None:
"""Test that we can create maps for all districts."""
for district in WARSAW_DISTRICTS:
fig = create_district_map(district)
assert fig is not None
plt.close(fig)
class TestGenerateDistrictImageBytes:
"""Tests for generating district image bytes."""
def test_generates_bytes(self) -> None:
"""Test that generate_district_image_bytes returns bytes."""
district = WARSAW_DISTRICTS[0]
image_bytes = generate_district_image_bytes(district)
assert isinstance(image_bytes, bytes)
assert len(image_bytes) > 0
def test_generates_for_all_districts(self) -> None:
"""Test that we can generate images for all districts."""
for district in WARSAW_DISTRICTS:
image_bytes = generate_district_image_bytes(district)
assert isinstance(image_bytes, bytes)
assert len(image_bytes) > 0
class TestGenerateAnkiPackage:
"""Tests for generating Anki package."""
def test_generates_package(self) -> None:
"""Test that output is a genanki Package."""
package = generate_anki_package("Test Deck")
assert package is not None
assert len(package.decks) == 1
def test_generates_notes_for_all_districts(self) -> None:
"""Test that package contains cards for all 18 districts."""
package = generate_anki_package()
deck = package.decks[0]
assert len(deck.notes) == len(WARSAW_DISTRICTS)
def test_custom_deck_name(self) -> None:
"""Test that custom deck name is used."""
package = generate_anki_package("Custom Deck")
deck = package.decks[0]
assert deck.name == "Custom Deck"
class TestMain:
"""Tests for the main CLI function."""
def test_creates_output_file(self, tmp_path: Path) -> None:
"""Test that main creates the output file."""
output_file = tmp_path / "test_output.apkg"
result = main(
[
"--output",
str(output_file),
]
)
assert result == 0
assert output_file.exists()
def test_custom_deck_name(self, tmp_path: Path) -> None:
"""Test that custom deck name is used."""
output_file = tmp_path / "test_output.apkg"
result = main(
[
"--output",
str(output_file),
"--deck-name",
"Custom Deck",
]
)
assert result == 0
assert output_file.exists()
def test_help_flag(self) -> None:
"""Test that --help works."""
with pytest.raises(SystemExit) as exc_info:
main(["--help"])
assert exc_info.value.code == 0
if __name__ == "__main__":
pytest.main([__file__, "-v"])