chore: establish project baseline
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
from datetime import datetime, timezone
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from central.app.datasets import bootstrap_v1_extra as parsers
|
||||
from central.app.datasets.service import DatasetService
|
||||
from central.app.models import Base, RtcCstIbsCbsEntry
|
||||
|
||||
ROOT = Path(__file__).parents[2] / "sources" / "raw" / "bootstrap_v1"
|
||||
CCLASS = ROOT / "cClassTrib 2026-06-22.xlsx"
|
||||
CBS = ROOT / "IT 2026.002 v.1.00 - Aliquotas da CBS.xlsx"
|
||||
pytestmark = pytest.mark.skipif(not (CCLASS.exists() and CBS.exists()), reason="RTC bootstrap files not present locally")
|
||||
|
||||
|
||||
@lru_cache(maxsize=None)
|
||||
def _cclass():
|
||||
return parsers.parse_rtc_cclasstrib(CCLASS.read_bytes())
|
||||
|
||||
|
||||
def _session():
|
||||
engine = create_engine("sqlite://")
|
||||
Base.metadata.create_all(engine)
|
||||
return Session(engine)
|
||||
|
||||
|
||||
def test_cclasstrib_keys_unique_and_rich_fields_kept():
|
||||
p = _cclass()
|
||||
codes = [e["cclasstrib"] for e in p.entries]
|
||||
assert len(codes) == len(set(codes)) >= 100
|
||||
assert all(len(c) == 6 for c in codes)
|
||||
assert p.entries[0]["indicators"] and p.entries[0]["d_ini_vig"]
|
||||
assert {e["cst"] for e in p.entries} <= {e["cst"] for e in p.extra_entries}
|
||||
|
||||
|
||||
def test_cbs_rates_2026_numeric_and_2027_pending():
|
||||
p = parsers.parse_rtc_cbs_rates(CBS.read_bytes())
|
||||
by_year = {e["year"]: e for e in p.entries}
|
||||
assert by_year[2026]["rate"] == pytest.approx(0.009)
|
||||
assert by_year[2027]["rate"] is None and by_year[2027]["rate_text"]
|
||||
|
||||
|
||||
def test_import_idempotent_lookup_and_versions():
|
||||
with _session() as s:
|
||||
svc = DatasetService(s)
|
||||
assert svc.dataset_versions()["rtc_cclasstrib"] is None
|
||||
now = datetime.now(timezone.utc)
|
||||
a = svc.import_rtc_cclasstrib(_cclass(), "file://x", now)
|
||||
b = svc.import_rtc_cclasstrib(_cclass(), "file://x", now)
|
||||
assert a.id == b.id and b.status == "ACTIVE" and b.record_count == len(_cclass().entries)
|
||||
assert s.query(RtcCstIbsCbsEntry).count() == len(_cclass().extra_entries)
|
||||
assert svc.rtc_cclasstrib(code="000001")
|
||||
|
||||
cbs_payload = parsers.parse_rtc_cbs_rates(CBS.read_bytes())
|
||||
c = svc.import_rtc_cbs_rates(cbs_payload, "file://y", now)
|
||||
assert svc.import_rtc_cbs_rates(cbs_payload, "file://y", now).id == c.id
|
||||
assert svc.rtc_cbs_rate(2026).rate == pytest.approx(0.009)
|
||||
v = svc.dataset_versions()
|
||||
assert v["rtc_cclasstrib"] and v["rtc_cbs_rates"]
|
||||
Reference in New Issue
Block a user