A verb's needs-approval is a boolean, a manifest's a list of tools, seat verbs and events; bodies are named schemas the grants part makes no seat event or stream from, and a reference #/bodies/<name> resolves beside #/defs/<name>. All 40 definitions of mesh-contracts' feat/47-G-build (5f7610f) read. Builds: design 47 G §409, §439, §448; design 46 M7 §1, §2, §23 Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
37 lines
1.7 KiB
Go
37 lines
1.7 KiB
Go
package seatdef
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
// A verb's schema has its named types in place (the seat list's readers take one schema, not a schema and its types).
|
|
func TestResolveRefsPutsNamedTypesInPlace(t *testing.T) {
|
|
defs := map[string]map[string]any{
|
|
"id": {"type": "string"},
|
|
"row": {"type": "object", "properties": map[string]any{"id": map[string]any{"$ref": "#/defs/id"}}},
|
|
}
|
|
bodies := map[string]map[string]any{"Finding": {"type": "object", "properties": map[string]any{"id": map[string]any{"$ref": "#/defs/id"}}}}
|
|
cases := []struct {
|
|
name string
|
|
schema, want map[string]any
|
|
}{
|
|
{"nothing", nil, nil},
|
|
{"a type nested in a type", map[string]any{"type": "array", "items": map[string]any{"$ref": "#/defs/row"}},
|
|
map[string]any{"type": "array", "items": map[string]any{"type": "object",
|
|
"properties": map[string]any{"id": map[string]any{"type": "string"}}}}},
|
|
{"a name it does not define stays", map[string]any{"$ref": "#/defs/gone"}, map[string]any{"$ref": "#/defs/gone"}},
|
|
{"a body", map[string]any{"type": "array", "items": map[string]any{"$ref": "#/bodies/Finding"}},
|
|
map[string]any{"type": "array", "items": map[string]any{"type": "object",
|
|
"properties": map[string]any{"id": map[string]any{"type": "string"}}}}},
|
|
{"a body it does not define stays", map[string]any{"$ref": "#/bodies/Gone"}, map[string]any{"$ref": "#/bodies/Gone"}},
|
|
{"a list of schemas", map[string]any{"oneOf": []any{map[string]any{"$ref": "#/defs/id"}}},
|
|
map[string]any{"oneOf": []any{map[string]any{"type": "string"}}}},
|
|
}
|
|
for _, c := range cases {
|
|
if got := ResolveRefs(c.schema, defs, bodies); !reflect.DeepEqual(got, c.want) {
|
|
t.Errorf("%s: %v, want %v", c.name, got, c.want)
|
|
}
|
|
}
|
|
}
|