# -*- encoding: utf-8 -*- import pytest from openmensa_parsers.config import Canteen from openmensa_parsers.parsers.base import BaseOpenMensaParser, FeedDefinition from openmensa_parsers.parsers.registry import create_parser, get_parser_class from openmensa_parsers.parsers.potsdam import PotsdamParser from openmensa_parsers.views import app from openmensa_parsers.xml_types.builder import Builder from openmensa_parsers.xml_types.canteen_xml import CanteenMeta, CanteenXML from openmensa_parsers.xml_types.times_xml import CanteenOpenTimespec, TimesXML def _configured_canteen(): return Canteen( key="demo", name="Demo Canteen", street="Demo Street", city="Demo City", id="1", chash="demo", ) def _canteen_xml(): meta = CanteenMeta( name="Demo Canteen", address="Demo Street, 12345 Demo City", city="Demo City", phone="+49 331 123456", email="demo@example.test", availability="public", ) times = TimesXML({ day: CanteenOpenTimespec("geschlossen") for day in TimesXML.VALID_DAYS }) return CanteenXML(meta, times) class DemoParser(BaseOpenMensaParser): id = "demo" feed = FeedDefinition(source="https://example.test") def __init__(self): self.fetched = False self.parsed_raw_data = None def fetch(self): self.fetched = True return {"source": "fixture"} def parse(self, _config, raw_data): self.parsed_raw_data = raw_data return {"demo": _canteen_xml()} def test_builder_uses_supplied_parser(): parser = DemoParser() with app.test_request_context(): builder = Builder({"demo": _configured_canteen()}, parser=parser) assert parser.fetched assert parser.parsed_raw_data == {"source": "fixture"} assert b"https://example.test" in builder.get_xml("demo") def test_builder_accepts_source_data_fixture(): parser = DemoParser() with app.test_request_context(): Builder( {"demo": _configured_canteen()}, source_data={"source": "test-fixture"}, parser=parser, ) assert not parser.fetched assert parser.parsed_raw_data == {"source": "test-fixture"} def test_parser_registry_loads_default_parser(): assert get_parser_class("potsdam") is PotsdamParser assert isinstance(create_parser("potsdam"), PotsdamParser) def test_parser_registry_rejects_unknown_parser(): with pytest.raises(KeyError, match="Unknown parser"): create_parser("unknown")