Skip to content

Commit 9e3f2b1

Browse files
authored
feat: find Ermittlungsauftraege by malo-id (#21)
* feat: find Ermittlungsauftraege by malo-id * disable pylint
1 parent 5165878 commit 9e3f2b1

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/bssclient/client/bssclient.py

+27
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,33 @@ async def get_ermittlungsauftraege(self, limit: int = 0, offset: int = 0) -> lis
102102
)
103103
return _list_of_ermittlungsauftraege.root
104104

105+
async def get_ermittlungsauftraege_by_malo(self, malo_id: str) -> list[Ermittlungsauftrag]:
106+
"""
107+
find ermittlungsauftraege by their marktlokations-id
108+
"""
109+
if malo_id is None or not isinstance(malo_id, str) or not malo_id.strip():
110+
raise ValueError(f"malo_id must not be empty but was '{malo_id}'")
111+
session = await self._get_session()
112+
# see https://basicsupply.xtk-dev.de/swagger/index.html#operations-Aufgabe-get_api_Aufgabe_ermittlungsauftraege
113+
request_url = (
114+
self._config.server_url
115+
/ "api"
116+
/ "Aufgabe"
117+
/ "ermittlungsauftraege"
118+
% {"marktlokationid": malo_id, "includeDetails": "true"}
119+
)
120+
request_uuid = uuid.uuid4()
121+
_logger.debug("[%s] requesting %s", str(request_uuid), request_url)
122+
async with session.get(request_url) as response:
123+
response.raise_for_status() # endpoint returns an empty list but no 404
124+
_logger.debug("[%s] response status: %s", str(request_uuid), response.status)
125+
response_json = await response.json()
126+
_list_of_ermittlungsauftraege = _ListOfErmittlungsauftraege.model_validate(response_json)
127+
_logger.debug(
128+
"Downloaded %i Ermittlungsauftraege for MaLo '%s'", len(_list_of_ermittlungsauftraege.root), malo_id
129+
)
130+
return _list_of_ermittlungsauftraege.root
131+
105132
async def get_aufgabe_stats(self) -> AufgabeStats:
106133
"""
107134
get statistics for all aufgaben types

unittests/test_ermittlungsauftraege.py

+14
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,20 @@ async def test_get_ermittlungsauftraege(self, bss_client_with_default_auth):
4242
2020, 4, 17, 22, 0, tzinfo=timezone.utc
4343
)
4444

45+
async def test_get_ermittlungsauftraege_by_malo(self, bss_client_with_default_auth):
46+
ermittlungsauftraege_json_file = Path(__file__).parent / "example_data" / "list_of_1_ermittlungsauftraege.json"
47+
with (open(ermittlungsauftraege_json_file, "r", encoding="utf-8") as infile1,):
48+
ermittlungsauftraege = json.load(infile1)
49+
client, bss_config = bss_client_with_default_auth
50+
with aioresponses() as mocked_bss:
51+
# pylint: disable=line-too-long
52+
mocked_get_url = f"{bss_config.server_url}api/Aufgabe/ermittlungsauftraege?marktlokationid=52671494807&includeDetails=true"
53+
mocked_bss.get(mocked_get_url, status=200, payload=ermittlungsauftraege)
54+
actual = await client.get_ermittlungsauftraege_by_malo(malo_id="52671494807")
55+
assert isinstance(actual, list)
56+
assert len(actual) == 1
57+
assert all(isinstance(x, Ermittlungsauftrag) for x in actual)
58+
4559
async def test_get_stats(self, bss_client_with_default_auth):
4660
stats_json_file = Path(__file__).parent / "example_data" / "aufgabe_stats.json"
4761
with open(stats_json_file, "r", encoding="utf-8") as infile:

0 commit comments

Comments
 (0)