46 lines
3.0 KiB
Python
46 lines
3.0 KiB
Python
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"] == []
|