Files
lda-wf/tests/refs/test_platform_refs.py
T
2026-05-21 02:02:04 +07:00

96 lines
2.7 KiB
Python

from __future__ import annotations
from pydantic import BaseModel
from wf_platform import CapabilityRef, SourceRef
def test_source_ref_round_trips_segmented_names() -> None:
source = SourceRef.parse("demo.personal")
assert source.parts == ("demo", "personal")
assert str(source) == "demo.personal"
def test_capability_ref_round_trips_segmented_names() -> None:
ref = CapabilityRef.parse("demo.personal.echo_tool")
assert ref.source.parts == ("demo", "personal")
assert ref.name == "echo_tool"
assert str(ref) == "demo.personal.echo_tool"
def test_capability_ref_binds_logical_source_to_concrete_source() -> None:
ref = CapabilityRef.parse("demo.echo_tool")
bound = ref.bind({"demo": "demo.personal"})
assert str(bound) == "demo.personal.echo_tool"
def test_platform_refs_validate_and_serialize_through_pydantic() -> None:
class Payload(BaseModel):
source: SourceRef
capability: CapabilityRef
payload = Payload.model_validate(
{
"source": "demo.personal",
"capability": "demo.personal.echo_tool",
}
)
assert payload.source == SourceRef.parse("demo.personal")
assert payload.capability == CapabilityRef.parse("demo.personal.echo_tool")
assert payload.model_dump(mode="json") == {
"source": "demo.personal",
"capability": {
"source": "demo.personal",
"capability_key": "echo_tool",
},
}
def test_capability_ref_accepts_structural_input() -> None:
class Payload(BaseModel):
capability: CapabilityRef
payload = Payload.model_validate(
{"capability": {"source": "demo", "capability_key": "foo.bar"}}
)
assert payload.capability.source == SourceRef.parse("demo")
assert payload.capability.name == "foo.bar"
def test_capability_ref_serializes_structurally() -> None:
class Payload(BaseModel):
capability: CapabilityRef
payload = Payload(
capability=CapabilityRef(source=SourceRef.parse("demo"), name="foo.bar")
)
assert payload.model_dump(mode="json")["capability"] == {
"source": "demo",
"capability_key": "foo.bar",
}
def test_source_ref_rejects_whitespace_segments() -> None:
try:
SourceRef.parse("demo. .personal")
except ValueError as exc:
assert "non-empty path segments" in str(exc)
else:
raise AssertionError("expected whitespace source segment to fail")
def test_capability_ref_rejects_missing_capability_name() -> None:
try:
CapabilityRef.parse("demo")
except ValueError as exc:
assert "source and capability" in str(exc)
else:
raise AssertionError("expected invalid capability ref to be rejected")