92 lines
2.5 KiB
Python
92 lines
2.5 KiB
Python
# -*- 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")
|