Phase 1 project prototype
This commit is contained in:
parent
29215e2bd2
commit
2c9ae1c312
29 changed files with 2967 additions and 22 deletions
75
tests/test_bls.py
Normal file
75
tests/test_bls.py
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue