mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-07-04 15:03:01 +02:00
* 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>
176 lines
5.2 KiB
Python
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"])
|