Phase 1 project prototype

This commit is contained in:
emfurst 2026-03-30 19:29:33 -04:00
commit 2c9ae1c312
29 changed files with 2967 additions and 22 deletions

75
tests/test_bls.py Normal file
View file

@ -0,0 +1,75 @@
"""Tests for BLS CPI-U download and loader."""
import httpx
import respx
from admin_analytics.bls.download import download_cpi_file
from admin_analytics.bls.loader import load_cpi
from admin_analytics.config import BLS_CPI_URL
class TestDownload:
@respx.mock
def test_download_creates_file(self, tmp_path, monkeypatch):
monkeypatch.setattr("admin_analytics.bls.download.BLS_DATA_DIR", tmp_path)
respx.get(BLS_CPI_URL).mock(
return_value=httpx.Response(200, text="series_id\tyear\tperiod\tvalue\n")
)
path = download_cpi_file(force=True)
assert path.exists()
assert path.parent == tmp_path
@respx.mock
def test_download_skips_when_exists(self, tmp_path, monkeypatch):
monkeypatch.setattr("admin_analytics.bls.download.BLS_DATA_DIR", tmp_path)
existing = tmp_path / "cu.data.0.Current"
existing.write_text("cached")
path = download_cpi_file(force=False)
assert path.read_text() == "cached"
@respx.mock
def test_download_force_overwrites(self, tmp_path, monkeypatch):
monkeypatch.setattr("admin_analytics.bls.download.BLS_DATA_DIR", tmp_path)
existing = tmp_path / "cu.data.0.Current"
existing.write_text("old")
respx.get(BLS_CPI_URL).mock(
return_value=httpx.Response(200, text="new data")
)
path = download_cpi_file(force=True)
assert path.read_text() == "new data"
class TestLoader:
def test_load_cpi(self, db_conn, fixtures_dir):
fixture = fixtures_dir / "cu_data_sample.tsv"
count = load_cpi(db_conn, fixture)
# Fixture has 5 valid CUUR0000SA0 monthly rows (M01, M02, M12, M01, M06)
# Excludes: M13 (annual avg), CUSR0000SA0 (wrong series), S01 (semi-annual)
assert count == 5
def test_load_cpi_correct_values(self, db_conn, fixtures_dir):
fixture = fixtures_dir / "cu_data_sample.tsv"
load_cpi(db_conn, fixture)
rows = db_conn.execute(
"SELECT year, month, value FROM raw_cpi_u ORDER BY year, month"
).fetchall()
assert rows[0] == (2022, 1, 281.148)
assert rows[-1] == (2023, 6, 305.109)
def test_load_cpi_types(self, db_conn, fixtures_dir):
fixture = fixtures_dir / "cu_data_sample.tsv"
load_cpi(db_conn, fixture)
row = db_conn.execute(
"SELECT year, month, value, series_id FROM raw_cpi_u LIMIT 1"
).fetchone()
assert isinstance(row[0], int)
assert isinstance(row[1], int)
assert isinstance(row[2], float)
assert row[3] == "CUUR0000SA0"
def test_load_cpi_idempotent(self, db_conn, fixtures_dir):
fixture = fixtures_dir / "cu_data_sample.tsv"
load_cpi(db_conn, fixture)
load_cpi(db_conn, fixture)
count = db_conn.execute("SELECT COUNT(*) FROM raw_cpi_u").fetchone()[0]
assert count == 5