"""WHO GHO connector — offline tests on a trimmed recorded payload (M_Est_tob_curr, CAN + USA + decoys) + live smoke.""" from __future__ import annotations from datetime import UTC, datetime import orjson import pytest from countryatlas.connectors.who import WHOConnector from countryatlas.models import IndicatorSourceSpec from tests.connectors._helpers import install_fake_get, raw_from_file @pytest.fixture def fake_get(monkeypatch): return install_fake_get(monkeypatch) SPEC =IndicatorSourceSpec(indicator_id="smoking-prevalence", connector="who", dataset="GHO", code="M_Est_tob_curr", params={"Dim1": "SEX_BTSX"}, priority=2) def _raw(fixtures_dir): return raw_from_file("who", "GHO", "M_Est_tob_curr", fixtures_dir / "who" / "M_Est_tob_curr.json", "application/json", indicator_meta={"name": "Estimate of current tobacco use prevalence (%)"}) def test_build_filter_includes_country_type_and_dims(): f = WHOConnector.build_filter({"Dim1": "SEX_BTSX", "Dim2": "AGEGROUP_YEARSALL"}) assert f == "SpatialDimType eq 'COUNTRY' and Dim1 eq 'SEX_BTSX' and Dim2 eq 'AGEGROUP_YEARSALL'" assert WHOConnector.build_filter(None) == "SpatialDimType eq 'COUNTRY'" def test_normalize_maps_iso3_filters_dims_and_flags_projections(fixtures_dir): conn = WHOConnector() rows = conn.normalize(_raw(fixtures_dir), SPEC) # decoys: REGION row (AMR), SEX_MLE row, unknown ISO3 'ZZZ' are all dropped assert {r.country_id for r in rows} == {"CAN", "USA"} assert all(r.frequency == "A" and r.period.month == 1 and r.period.day == 1 for r in rows) assert all(r.unit == "% of adults" for r in rows) can = {r.year: r for r in rows if r.country_id == "CAN"} assert can[2030].is_forecast is True and can[2030].value == pytest.approx(8.3) assert can[2024].is_forecast is False assert all(r.year <= datetime.now(UTC).year or r.is_forecast for r in rows) # confidence bounds go to metadata; the row `Date` feeds source_updated_at assert "low" in rows[0].metadata and "high" in rows[0].metadata assert rows[0].source_updated_at is not None and rows[0].source_updated_at.year >= 2024 # no duplicate keys keys = {(r.country_id, r.period) for r in rows} assert len(keys) == len(rows) assert conn.validate(rows).quarantine_dataset is False def test_normalize_applies_scalar_transform(fixtures_dir): spec = SPEC.model_copy(update={"transform": "x/10", "indicator_id": "nurses-per-1000"}) rows = WHOConnector().normalize(_raw(fixtures_dir), spec) can = {r.year: r for r in rows if r.country_id == "CAN"} assert can[2030].value == pytest.approx(0.83) assert can[2030].unit == "per 1,000 people" def test_fetch_uses_filter_and_metadata(fixtures_dir, fake_get): conn = WHOConnector() data = (fixtures_dir / "who" / "M_Est_tob_curr.json").read_bytes() meta = (fixtures_dir / "who" / "Indicator_M_Est_tob_curr.json").read_bytes() def router(url, params): if url.endswith("/Indicator"): return meta, "application/json" return data, "application/json" calls = fake_get(conn, router) payloads = conn.fetch(SPEC) assert len(payloads) == 1 and payloads[0].pages == 1 assert calls[0]["url"].endswith("/Indicator") and "M_Est_tob_curr" in calls[0]["params"]["$filter"] assert calls[1]["url"].endswith("/M_Est_tob_curr") assert calls[1]["params"]["$filter"] == "SpatialDimType eq 'COUNTRY' and Dim1 eq 'SEX_BTSX'" assert payloads[0].meta["indicator_meta"]["name"].startswith("Estimate of current tobacco") assert orjson.loads(payloads[0].body)["value"] @pytest.mark.live def test_live_suicide_rate_has_no_duplicates(): conn = WHOConnector() spec = IndicatorSourceSpec(indicator_id="suicide-rate", connector="who", dataset="GHO", code="SDGSUICIDE", params={"Dim1": "SEX_BTSX", "Dim2": "AGEGROUP_YEARSALL"}) rows = conn.normalize(conn.fetch(spec), spec) assert len(rows) > 3000 and "CAN" in {r.country_id for r in rows} assert conn.validate(rows).quarantine_dataset is False