from fastapi.testclient import TestClient from sqlalchemy import create_engine from sqlalchemy.orm import Session from sqlalchemy.pool import StaticPool from central.app.context_keys import validate_entry from central.app.main import create_app from central.app.models import Base H = {"Authorization": "Bearer test-token"} def client(): engine = create_engine("sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool) Base.metadata.create_all(engine) return TestClient(create_app(session_factory=lambda: Session(engine), bootstrap_token="test-token")) def test_validation_rules(): ok, err = validate_entry({"scope": "group", "scope_key": "000019", "key": "product_role", "value": "resale"}) assert err is None and ok["value"] == "RESALE" and ok["scope"] == "GROUP" for bad in ({"scope": "GROUP", "key": "product_role", "value": "RESALE"}, # group without key {"scope": "COMPANY", "key": "product_role", "value": "BOSS"}, # not in enum {"scope": "GROUP", "scope_key": "1", "key": "ncm", "value": "22030000"}, # ncm is product scope {"scope": "PRODUCT", "scope_key": "1", "key": "ncm", "value": "2203"}, # not 8 digits {"scope": "COMPANY", "key": "pis_cofins_profile", "value": "{\"x\": 1}"}, # unknown profile key {"scope": "COMPANY", "key": "icms_rate", "value": "abc"}, {"scope": "COMPANY", "key": "nope", "value": "1"}): assert validate_entry(bad)[1] assert validate_entry({"scope": "COMPANY", "key": "pis_cofins_profile", "value": "{\"pis_out_cst\": \"49\"}"})[1] is None def test_import_is_all_or_nothing_upserting_and_listed(): c = client() body = {"company_key": "abc123", "entries": [{"scope": "GROUP", "scope_key": "000019", "key": "product_role", "value": "RESALE", "reason": "revenda"}, {"scope": "COMPANY", "key": "entry_scope", "value": "INTRA"}]} assert c.post("/v1/context/import", json=body, headers=H).json() == {"created": 2, "updated": 0} body["entries"][0]["value"] = "OWN_PRODUCTION" assert c.post("/v1/context/import", json=body, headers=H).json() == {"created": 0, "updated": 2} listed = c.get("/v1/context", params={"company_key": "abc123"}, headers=H).json()["entries"] assert {(e["scope"], e["key"], e["value"]) for e in listed} == {("GROUP", "product_role", "OWN_PRODUCTION"), ("COMPANY", "entry_scope", "INTRA")} bad = {"company_key": "abc123", "entries": [{"scope": "COMPANY", "key": "rounding", "value": "A"}, {"scope": "COMPANY", "key": "rounding", "value": "Z"}]} r = c.post("/v1/context/import", json=bad, headers=H) assert r.status_code == 422 assert len(c.get("/v1/context", params={"company_key": "abc123"}, headers=H).json()["entries"]) == 2 # nothing partially stored assert c.get("/v1/context", params={"company_key": "other"}, headers=H).json()["entries"] == []