modular parser framework
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
# -*- 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")
|
||||
Reference in New Issue
Block a user