MAS-WP-0005-T08: v0.2 stand-ins and resource_id_case in policy; lint; gateway reports canonical form
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 252470@bnt-lap001 Assistant-Session: ad628c8f-4be2-4979-94c9-76c7ed6f8241
This commit is contained in:
parent
7d978f1f26
commit
eb10f54fd2
6 changed files with 165 additions and 7 deletions
|
|
@ -103,3 +103,57 @@ def test_intake_for_is_reported():
|
|||
assert sem.kind == "function" and sem.intake_for == "ticket" and sem.interaction == "callback"
|
||||
assert resolve(parse_address("support@great-service.example"), GS).intake_for is None
|
||||
assert resolve(parse_address("ticket@great-service.example"), None).intake_for is None
|
||||
|
||||
|
||||
# -- v0.2 stand-ins (spec v0.2 section 6.3) ----------------------------------------
|
||||
|
||||
def _v02_statute(resource=True, interaction=True, id_case="insensitive"):
|
||||
doc = statute_document("valid-great-service.json")
|
||||
doc["mas_version"] = "0.2"
|
||||
doc["alternate_syntax"] = {"resource": resource, "interaction": interaction}
|
||||
doc["equivalence"]["resource_id_case"] = id_case
|
||||
return build_statute(doc, "great-service.example")
|
||||
|
||||
|
||||
V2 = _v02_statute()
|
||||
|
||||
|
||||
@pytest.mark.parametrize("raw, canonical, stand_ins", [
|
||||
("ticket---callback", "ticket!callback", ("interaction",)),
|
||||
("ticket--gs1---callback", "ticket=gs1!callback", ("interaction", "resource")),
|
||||
("ticket--a---b", "ticket=a---b", ("resource",)), # b is not an enabled mode
|
||||
("ticket--gs1+comments", "ticket=gs1+comments", ("resource",)),
|
||||
("ticket--gs-85qj8wc09p+comments", "ticket=gs-85qj8wc09p+comments", ("resource",)),
|
||||
("support---callback", "support!callback", ("interaction",)),
|
||||
("invoice--x1", "invoice--x1", ()), # undeclared type
|
||||
("ticket=gs1!callback", "ticket=gs1!callback", ()), # already canonical
|
||||
])
|
||||
def test_stand_in_table(raw, canonical, stand_ins):
|
||||
sem = resolve(parse_address(f"{raw}@great-service.example"), V2)
|
||||
assert sem.to_dict()["canonical_local_part"] == canonical and sem.stand_ins == stand_ins
|
||||
|
||||
|
||||
def test_stand_in_resource_correlates_like_canonical():
|
||||
alt = resolve(parse_address("ticket--GS-85QJ8WC09P+comments@great-service.example"), V2)
|
||||
canon = resolve(parse_address("ticket=gs-85qj8wc09p@great-service.example"), V2)
|
||||
assert alt.kind == "resource" and alt.resource_id == "GS-85QJ8WC09P" and alt.facet == "comments"
|
||||
assert alt.equivalence_key == canon.equivalence_key == "ticket=gs-85qj8wc09p"
|
||||
|
||||
|
||||
def test_stand_in_intake_reaches_registry():
|
||||
sem = resolve(parse_address("ticket---callback@great-service.example"), V2)
|
||||
assert sem.kind == "function" and sem.intake_for == "ticket" and sem.interaction == "callback"
|
||||
|
||||
|
||||
def test_stand_ins_need_the_statute_switch():
|
||||
off = _v02_statute(resource=False, interaction=False, id_case="exact")
|
||||
for raw in ("ticket--gs1", "ticket---callback"):
|
||||
sem = resolve(parse_address(f"{raw}@great-service.example"), off)
|
||||
assert sem.stand_ins == () and sem.kind == "opaque"
|
||||
assert resolve(parse_address("ticket--gs1@great-service.example"), GS).stand_ins == () # v0.1
|
||||
assert resolve(parse_address("ticket--gs1@great-service.example"), None).stand_ins == ()
|
||||
|
||||
|
||||
def test_resource_id_case_exact_keeps_case():
|
||||
exact = _v02_statute(id_case="exact")
|
||||
assert resolve(parse_address("ticket=GS-1@great-service.example"), exact).equivalence_key == "ticket=GS-1"
|
||||
|
|
|
|||
|
|
@ -110,3 +110,14 @@ def test_v01_statute_rejects_v02_fields():
|
|||
doc = statute_document("valid-great-service.json")
|
||||
doc["alternate_syntax"] = {"resource": True}
|
||||
assert any(f.severity == ERROR and f.layer == "schema" for f in lint(doc, "great-service.example"))
|
||||
|
||||
|
||||
def test_stand_in_lint():
|
||||
doc = _v02(alternate_syntax={"resource": True, "interaction": True})
|
||||
doc["addresses"]["ticket--legacy"] = {"kind": "function"}
|
||||
doc["addresses"]["sales---callback"] = {"kind": "function"}
|
||||
codes = [f.code for f in lint(doc, "great-service.example") if f.severity == ERROR]
|
||||
assert codes.count("stand-in-collision") == 2
|
||||
off = _v02()
|
||||
off["addresses"]["ticket--legacy"] = {"kind": "function"}
|
||||
assert "stand-in-collision" not in {f.code for f in lint(off, "great-service.example")}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue