You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
motief/tests/test_fetch_mp_metadata.py

103 lines
2.9 KiB

import json
import requests
import types
import pytest
try:
import duckdb
except Exception:
pytest.skip(
"duckdb not installed, skipping fetch_mp_metadata tests",
allow_module_level=True,
)
from pipeline.fetch_mp_metadata import fetch_mp_metadata, normalize_mp_name
class MockResponse:
def __init__(self, data, status_code=200):
self._data = data
self.status_code = status_code
def raise_for_status(self):
if not (200 <= self.status_code < 300):
raise requests.HTTPError(f"status {self.status_code}")
def json(self):
return self._data
class MockSession:
def __init__(self, response):
self._response = response
def get(self, url):
return self._response
def test_fetch_mp_metadata_idempotent(tmp_path, monkeypatch):
# Prepare canned OData response with two FractieZetelPersoon records
data = {
"value": [
{
"Persoon": {
"Achternaam": "Yesilgöz-Zegerius",
"Initialen": "D.",
"Tussenvoegsel": None,
"Id": "guid-1",
},
"FractieZetel": {"Fractie": {"NaamNL": "VVD"}},
"Van": "2023-01-01",
"TotEnMet": None,
},
{
"Persoon": {
"Achternaam": "Plas",
"Initialen": "C.",
"Tussenvoegsel": "van der",
"Id": "guid-2",
},
"FractieZetel": {"Fractie": {"NaamNL": "BBB"}},
"Van": "2023-06-01",
"TotEnMet": "2024-01-01",
},
]
}
mock_resp = MockResponse(data)
mock_session = MockSession(mock_resp)
# Patch requests.Session to return our mock session
monkeypatch.setattr(requests, "Session", lambda: mock_session)
db_path = str(tmp_path / "test.db")
# First run
count = fetch_mp_metadata(db_path=db_path, odata_url="http://example/odata")
assert count == 2
# Verify DB contents
conn = duckdb.connect(db_path)
rows = conn.execute(
"SELECT mp_name, party, van, tot_en_met, persoon_id FROM mp_metadata ORDER BY mp_name"
).fetchall()
conn.close()
assert len(rows) == 2
# Check normalized names
assert rows[0][0] == normalize_mp_name("Plas", "C.", "van der")
assert rows[0][1] == "BBB"
assert str(rows[0][2]) == "2023-06-01"
assert str(rows[0][3]) == "2024-01-01"
assert rows[0][4] == "guid-2"
assert rows[1][0] == normalize_mp_name("Yesilgöz-Zegerius", "D.", None)
assert rows[1][1] == "VVD"
assert str(rows[1][2]) == "2023-01-01"
assert rows[1][3] == None
assert rows[1][4] == "guid-1"
# Run again to assert idempotence (no exception and same count processed)
count2 = fetch_mp_metadata(db_path=db_path, odata_url="http://example/odata")
assert count2 == 2