From 07bd0472b9fa0f30e8bd9a2c0fd7021a75b5c602 Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 5 Nov 2026 14:10:43 +0100 Subject: [PATCH] mesh-delivery-contracts: fixtures for the new states (issue 1966) --- .../go/seats/meshcatalog/contract_test.go | 70 ++++++++++++ .../go/seats/meshdelivery/contract_test.go | 64 +++++++++++ .../meshdeliverychecker/contract_test.go | 72 ++++++++++++ .../seats/mesh-catalog/fixtures/states.json | 105 ++++++++++++++++++ .../fixtures/events.json | 44 ++++++++ .../fixtures/states.json | 48 ++++++++ .../seats/mesh-delivery/fixtures/states.json | 72 ++++++++++++ 7 files changed, 475 insertions(+) create mode 100644 contracts/go/seats/meshcatalog/contract_test.go create mode 100644 contracts/go/seats/meshdelivery/contract_test.go create mode 100644 contracts/go/seats/meshdeliverychecker/contract_test.go create mode 100644 contracts/seats/mesh-catalog/fixtures/states.json create mode 100644 contracts/seats/mesh-delivery-checker/fixtures/events.json create mode 100644 contracts/seats/mesh-delivery-checker/fixtures/states.json create mode 100644 contracts/seats/mesh-delivery/fixtures/states.json diff --git a/contracts/go/seats/meshcatalog/contract_test.go b/contracts/go/seats/meshcatalog/contract_test.go new file mode 100644 index 00000000..96bb633f --- /dev/null +++ b/contracts/go/seats/meshcatalog/contract_test.go @@ -0,0 +1,70 @@ +// Code generated by seatgen from the seat definitions; DO NOT EDIT. + +package meshcatalog + +import ( + "encoding/json" + "reflect" + "regexp" + "testing" +) + +// TestFixtures reads every fixture of seats/mesh-catalog/fixtures: each decodes into its type, a field the type does not +// know is dropped (ADR 0608 §6), and it reads back as its wire says; each subject named is the contract's. +func TestFixtures(t *testing.T) { + cases := []struct { + name, subject, given, wire string + decode func([]byte) (any, error) + subjectIs *regexp.Regexp + }{ + {name: "a manifest", subject: "", given: "{\"manifest\":\"{\\\"module\\\":\\\"nats\\\"}\",\"module\":\"nats\",\"v\":1}", wire: "{\"manifest\":\"{\\\"module\\\":\\\"nats\\\"}\",\"module\":\"nats\",\"v\":1}", + decode: func(b []byte) (any, error) { var v ManifestsByDigestValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "a module", subject: "", given: "{\"commit\":\"cccccccccccccccccccccccccccccccccccccccc\",\"fp2\":\"src2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"repository\":\"novox/mesh-catalog\",\"v\":1}", wire: "{\"commit\":\"cccccccccccccccccccccccccccccccccccccccc\",\"fp2\":\"src2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"repository\":\"novox/mesh-catalog\",\"v\":1}", + decode: func(b []byte) (any, error) { var v ModulesByModuleValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "a candidate", subject: "", given: "{\"base\":3,\"group\":\"feat/registry\",\"heads\":\"0123456789ab\",\"pulls\":[{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"modules\":[\"nats\"],\"number\":1,\"repository\":\"novox/mesh-sdk\"}],\"v\":1}", wire: "{\"base\":3,\"group\":\"feat/registry\",\"heads\":\"0123456789ab\",\"pulls\":[{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"modules\":[\"nats\"],\"number\":1,\"repository\":\"novox/mesh-sdk\"}],\"v\":1}", + decode: func(b []byte) (any, error) { var v CandidatesByGroupValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "a verdict", subject: "", given: "{\"judge\":\"trunk\",\"module\":\"nats\",\"state\":\"accepted\",\"v\":1}", wire: "{\"judge\":\"trunk\",\"module\":\"nats\",\"state\":\"accepted\",\"v\":1}", + decode: func(b []byte) (any, error) { var v VerdictsByDigestValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "the predefined list", subject: "", given: "{\"commit\":\"cccccccccccccccccccccccccccccccccccccccc\",\"list\":{\"streams\":[]},\"v\":1}", wire: "{\"commit\":\"cccccccccccccccccccccccccccccccccccccccc\",\"list\":{\"streams\":[]},\"v\":1}", + decode: func(b []byte) (any, error) { var v PredefinedByListValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "a pull request's configuration", subject: "", given: "{\"declares\":{\"nats\":{\"limit\":{\"default\":1,\"kind\":\"setting\",\"why\":\"a bound\"}}},\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"pull\":\"novox/mesh-catalog#1\",\"v\":1}", wire: "{\"declares\":{\"nats\":{\"limit\":{\"default\":1,\"kind\":\"setting\",\"why\":\"a bound\"}}},\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"pull\":\"novox/mesh-catalog#1\",\"v\":1}", + decode: func(b []byte) (any, error) { + var v ConfigCandidatesByPullValue + err := json.Unmarshal(b, &v) + return v, err + }, subjectIs: nil}, + {name: "a published Go module", subject: "", given: "{\"commit\":\"cccccccccccccccccccccccccccccccccccccccc\",\"module\":\"git.novox.be/novox/mesh-sdk/go\",\"packages\":[{\"digest\":\"ab\",\"package\":\"git.novox.be/novox/mesh-sdk/go/keys\"}],\"repository\":\"novox/mesh-sdk\",\"v\":1}", wire: "{\"commit\":\"cccccccccccccccccccccccccccccccccccccccc\",\"module\":\"git.novox.be/novox/mesh-sdk/go\",\"packages\":[{\"digest\":\"ab\",\"package\":\"git.novox.be/novox/mesh-sdk/go/keys\"}],\"repository\":\"novox/mesh-sdk\",\"v\":1}", + decode: func(b []byte) (any, error) { var v PackagesByModuleValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "a package series", subject: "", given: "{\"name\":\"go-keys\",\"series\":\"0.1\",\"v\":1}", wire: "{\"name\":\"go-keys\",\"series\":\"0.1\",\"v\":1}", + decode: func(b []byte) (any, error) { + var v PackagesByPackageSeriesValue + err := json.Unmarshal(b, &v) + return v, err + }, subjectIs: nil}, + } + for _, c := range cases { + v, err := c.decode([]byte(c.given)) + if err != nil { + t.Errorf("%s: does not decode: %v", c.name, err) + continue + } + back, err := json.Marshal(v) + if err != nil { + t.Errorf("%s: does not encode: %v", c.name, err) + continue + } + var got, want any + if err := json.Unmarshal(back, &got); err != nil { + t.Fatal(err) + } + if err := json.Unmarshal([]byte(c.wire), &want); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: reads back as %s, want %s", c.name, back, c.wire) + } + if c.subjectIs != nil && !c.subjectIs.MatchString(c.subject) { + t.Errorf("%s: subject %q is not the contract's %s", c.name, c.subject, c.subjectIs) + } + } +} diff --git a/contracts/go/seats/meshdelivery/contract_test.go b/contracts/go/seats/meshdelivery/contract_test.go new file mode 100644 index 00000000..f128120d --- /dev/null +++ b/contracts/go/seats/meshdelivery/contract_test.go @@ -0,0 +1,64 @@ +// Code generated by seatgen from the seat definitions; DO NOT EDIT. + +package meshdelivery + +import ( + "encoding/json" + "reflect" + "regexp" + "testing" +) + +// TestFixtures reads every fixture of seats/mesh-delivery/fixtures: each decodes into its type, a field the type does not +// know is dropped (ADR 0608 §6), and it reads back as its wire says; each subject named is the contract's. +func TestFixtures(t *testing.T) { + cases := []struct { + name, subject, given, wire string + decode func([]byte) (any, error) + subjectIs *regexp.Regexp + }{ + {name: "the source revision", subject: "", given: "{\"group\":\"feat/registry\",\"heads\":{\"novox/mesh-sdk\":\"cccccccccccccccccccccccccccccccccccccccc\"},\"v\":1}", wire: "{\"group\":\"feat/registry\",\"heads\":{\"novox/mesh-sdk\":\"cccccccccccccccccccccccccccccccccccccccc\"},\"v\":1}", + decode: func(b []byte) (any, error) { var v SourceByMainValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "a merge", subject: "", given: "{\"ask\":\"merge.feat=registry.0123456789ab\",\"group\":\"feat/registry\",\"pulls\":[{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"number\":1,\"repository\":\"novox/mesh-sdk\",\"state\":\"merging\"}],\"v\":1}", wire: "{\"ask\":\"merge.feat=registry.0123456789ab\",\"group\":\"feat/registry\",\"pulls\":[{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"number\":1,\"repository\":\"novox/mesh-sdk\",\"state\":\"merging\"}],\"v\":1}", + decode: func(b []byte) (any, error) { var v MergesByGroupValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "an ask", subject: "", given: "{\"ask\":{\"headline\":\"merge\"},\"group\":\"feat/registry\",\"heads\":[{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"number\":1,\"repository\":\"novox/mesh-sdk\"}],\"v\":1}", wire: "{\"ask\":{\"headline\":\"merge\"},\"group\":\"feat/registry\",\"heads\":[{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"number\":1,\"repository\":\"novox/mesh-sdk\"}],\"v\":1}", + decode: func(b []byte) (any, error) { + var v AsksByMergeGroupHeadsValue + err := json.Unmarshal(b, &v) + return v, err + }, subjectIs: nil}, + {name: "an act owed", subject: "", given: "{\"act\":\"view\",\"v\":1}", wire: "{\"act\":\"view\",\"v\":1}", + decode: func(b []byte) (any, error) { + var v OwedByRepositoryNumberHeadActValue + err := json.Unmarshal(b, &v) + return v, err + }, subjectIs: nil}, + {name: "a turn", subject: "", given: "{\"repository\":\"novox/mesh-sdk\",\"v\":1,\"waiting\":[{\"approved\":\"2026-11-05T10:00:00Z\",\"group\":\"feat/registry\",\"heads\":\"0123456789ab\",\"since\":\"2026-11-05T10:01:00Z\"}]}", wire: "{\"repository\":\"novox/mesh-sdk\",\"v\":1,\"waiting\":[{\"approved\":\"2026-11-05T10:00:00Z\",\"group\":\"feat/registry\",\"heads\":\"0123456789ab\",\"since\":\"2026-11-05T10:01:00Z\"}]}", + decode: func(b []byte) (any, error) { var v TurnsByRepositoryValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + } + for _, c := range cases { + v, err := c.decode([]byte(c.given)) + if err != nil { + t.Errorf("%s: does not decode: %v", c.name, err) + continue + } + back, err := json.Marshal(v) + if err != nil { + t.Errorf("%s: does not encode: %v", c.name, err) + continue + } + var got, want any + if err := json.Unmarshal(back, &got); err != nil { + t.Fatal(err) + } + if err := json.Unmarshal([]byte(c.wire), &want); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: reads back as %s, want %s", c.name, back, c.wire) + } + if c.subjectIs != nil && !c.subjectIs.MatchString(c.subject) { + t.Errorf("%s: subject %q is not the contract's %s", c.name, c.subject, c.subjectIs) + } + } +} diff --git a/contracts/go/seats/meshdeliverychecker/contract_test.go b/contracts/go/seats/meshdeliverychecker/contract_test.go new file mode 100644 index 00000000..17611c6a --- /dev/null +++ b/contracts/go/seats/meshdeliverychecker/contract_test.go @@ -0,0 +1,72 @@ +// Code generated by seatgen from the seat definitions; DO NOT EDIT. + +package meshdeliverychecker + +import ( + "encoding/json" + "reflect" + "regexp" + "testing" +) + +// TestFixtures reads every fixture of seats/mesh-delivery-checker/fixtures: each decodes into its type, a field the type does not +// know is dropped (ADR 0608 §6), and it reads back as its wire says; each subject named is the contract's. +func TestFixtures(t *testing.T) { + cases := []struct { + name, subject, given, wire string + decode func([]byte) (any, error) + subjectIs *regexp.Regexp + }{ + {name: "verdict on the checker's own family", subject: "mesh.stream.mesh-delivery-checker.event.verdict", given: "{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"out-of-step\":[\"go/seats/meshbroker/contract.go\"],\"pull\":3,\"repository\":\"novox/mesh-contracts\",\"series\":[{\"artifact\":\"go\",\"from\":\"0.1\",\"module\":\"mesh-contracts\",\"to\":\"0.2\"}],\"verdict\":\"fail\"}", wire: "{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"out-of-step\":[\"go/seats/meshbroker/contract.go\"],\"pull\":3,\"repository\":\"novox/mesh-contracts\",\"series\":[{\"artifact\":\"go\",\"from\":\"0.1\",\"module\":\"mesh-contracts\",\"to\":\"0.2\"}],\"verdict\":\"fail\"}", + decode: func(b []byte) (any, error) { var v VerdictHolderEvent; err := json.Unmarshal(b, &v); return v, err }, subjectIs: regexp.MustCompile("^mesh\\.stream\\.[a-z0-9-]+\\.event\\.verdict$")}, + {name: "tag-wanted on the checker's own family", subject: "mesh.stream.mesh-delivery-checker.event.tag-wanted", given: "{\"branch\":\"feat/registry\",\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"module\":\"mesh-sdk\",\"package\":\"go\",\"pull\":170,\"repository\":\"novox/mesh-sdk\",\"tag\":\"registry-1966\"}", wire: "{\"branch\":\"feat/registry\",\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"module\":\"mesh-sdk\",\"package\":\"go\",\"pull\":170,\"repository\":\"novox/mesh-sdk\",\"tag\":\"registry-1966\"}", + decode: func(b []byte) (any, error) { var v TagWantedHolderEvent; err := json.Unmarshal(b, &v); return v, err }, subjectIs: regexp.MustCompile("^mesh\\.stream\\.[a-z0-9-]+\\.event\\.tag-wanted$")}, + {name: "preview.written on the checker's stream", subject: "mesh.stream.mesh-delivery-checker.event.preview.written", given: "{}", wire: "{}", + decode: func(b []byte) (any, error) { var v map[string]any; err := json.Unmarshal(b, &v); return v, err }, subjectIs: regexp.MustCompile("^mesh\\.stream\\.[a-z0-9-]+\\.event\\.preview\\.written$")}, + {name: "a running verdict", subject: "", given: "{\"group\":\"feat/registry\",\"heads\":\"0123456789ab\",\"state\":\"running\",\"v\":1}", wire: "{\"group\":\"feat/registry\",\"heads\":\"0123456789ab\",\"state\":\"running\",\"v\":1}", + decode: func(b []byte) (any, error) { + var v VerdictsByGroupHeadsValue + err := json.Unmarshal(b, &v) + return v, err + }, subjectIs: nil}, + {name: "a kept pass", subject: "", given: "{\"at\":\"2026-11-05T10:00:00Z\",\"level\":\"unit\",\"package\":\"go/keys\",\"repository\":\"novox/mesh-sdk\",\"state\":\"pass\",\"tests\":4,\"took\":120,\"toolchain\":\"go1.26\",\"v\":1}", wire: "{\"at\":\"2026-11-05T10:00:00Z\",\"level\":\"unit\",\"package\":\"go/keys\",\"repository\":\"novox/mesh-sdk\",\"state\":\"pass\",\"tests\":4,\"took\":120,\"toolchain\":\"go1.26\",\"v\":1}", + decode: func(b []byte) (any, error) { var v KeptByLevelDigestValue; err := json.Unmarshal(b, &v); return v, err }, subjectIs: nil}, + {name: "the status owed for a head", subject: "", given: "{\"act\":\"status=mesh/check\",\"context\":\"mesh/check\",\"state\":\"success\",\"v\":1}", wire: "{\"act\":\"status=mesh/check\",\"context\":\"mesh/check\",\"state\":\"success\",\"v\":1}", + decode: func(b []byte) (any, error) { + var v OwedByRepositoryNumberHeadActValue + err := json.Unmarshal(b, &v) + return v, err + }, subjectIs: nil}, + {name: "a preview", subject: "", given: "{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"merge\":\"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"repository\":\"novox/mesh-sdk\",\"trunk\":\"dddddddddddddddddddddddddddddddddddddddd\",\"v\":1}", wire: "{\"head\":\"cccccccccccccccccccccccccccccccccccccccc\",\"merge\":\"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"repository\":\"novox/mesh-sdk\",\"trunk\":\"dddddddddddddddddddddddddddddddddddddddd\",\"v\":1}", + decode: func(b []byte) (any, error) { + var v PreviewsByRepositoryHeadTrunkValue + err := json.Unmarshal(b, &v) + return v, err + }, subjectIs: nil}, + } + for _, c := range cases { + v, err := c.decode([]byte(c.given)) + if err != nil { + t.Errorf("%s: does not decode: %v", c.name, err) + continue + } + back, err := json.Marshal(v) + if err != nil { + t.Errorf("%s: does not encode: %v", c.name, err) + continue + } + var got, want any + if err := json.Unmarshal(back, &got); err != nil { + t.Fatal(err) + } + if err := json.Unmarshal([]byte(c.wire), &want); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: reads back as %s, want %s", c.name, back, c.wire) + } + if c.subjectIs != nil && !c.subjectIs.MatchString(c.subject) { + t.Errorf("%s: subject %q is not the contract's %s", c.name, c.subject, c.subjectIs) + } + } +} diff --git a/contracts/seats/mesh-catalog/fixtures/states.json b/contracts/seats/mesh-catalog/fixtures/states.json new file mode 100644 index 00000000..9d902dc9 --- /dev/null +++ b/contracts/seats/mesh-catalog/fixtures/states.json @@ -0,0 +1,105 @@ +[ + { + "name": "a manifest", + "of": "state:manifests/", + "given": { + "v": 1, + "module": "nats", + "manifest": "{\"module\":\"nats\"}" + } + }, + { + "name": "a module", + "of": "state:modules/", + "given": { + "v": 1, + "repository": "novox/mesh-catalog", + "commit": "cccccccccccccccccccccccccccccccccccccccc", + "fp2": "src2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "name": "a candidate", + "of": "state:candidates/", + "given": { + "v": 1, + "group": "feat/registry", + "base": 3, + "heads": "0123456789ab", + "pulls": [ + { + "repository": "novox/mesh-sdk", + "number": 1, + "head": "cccccccccccccccccccccccccccccccccccccccc", + "modules": [ + "nats" + ] + } + ] + } + }, + { + "name": "a verdict", + "of": "state:verdicts/", + "given": { + "v": 1, + "module": "nats", + "state": "accepted", + "judge": "trunk" + } + }, + { + "name": "the predefined list", + "of": "state:predefined/list", + "given": { + "v": 1, + "commit": "cccccccccccccccccccccccccccccccccccccccc", + "list": { + "streams": [] + } + } + }, + { + "name": "a pull request's configuration", + "of": "state:config-candidates/", + "given": { + "v": 1, + "pull": "novox/mesh-catalog#1", + "head": "cccccccccccccccccccccccccccccccccccccccc", + "declares": { + "nats": { + "limit": { + "kind": "setting", + "default": 1, + "why": "a bound" + } + } + } + } + }, + { + "name": "a published Go module", + "of": "state:packages/", + "given": { + "v": 1, + "module": "git.novox.be/novox/mesh-sdk/go", + "repository": "novox/mesh-sdk", + "commit": "cccccccccccccccccccccccccccccccccccccccc", + "packages": [ + { + "package": "git.novox.be/novox/mesh-sdk/go/keys", + "digest": "ab" + } + ] + } + }, + { + "name": "a package series", + "of": "state:packages/.", + "given": { + "v": 1, + "name": "go-keys", + "series": "0.1" + } + } +] diff --git a/contracts/seats/mesh-delivery-checker/fixtures/events.json b/contracts/seats/mesh-delivery-checker/fixtures/events.json new file mode 100644 index 00000000..7df46f68 --- /dev/null +++ b/contracts/seats/mesh-delivery-checker/fixtures/events.json @@ -0,0 +1,44 @@ +[ + { + "name": "verdict on the checker's own family", + "of": "holder-event:verdict", + "subject": "mesh.stream.mesh-delivery-checker.event.verdict", + "given": { + "repository": "novox/mesh-contracts", + "pull": 3, + "head": "cccccccccccccccccccccccccccccccccccccccc", + "verdict": "fail", + "out-of-step": [ + "go/seats/meshbroker/contract.go" + ], + "series": [ + { + "module": "mesh-contracts", + "artifact": "go", + "from": "0.1", + "to": "0.2" + } + ] + } + }, + { + "name": "tag-wanted on the checker's own family", + "of": "holder-event:tag-wanted", + "subject": "mesh.stream.mesh-delivery-checker.event.tag-wanted", + "given": { + "repository": "novox/mesh-sdk", + "pull": 170, + "head": "cccccccccccccccccccccccccccccccccccccccc", + "branch": "feat/registry", + "module": "mesh-sdk", + "package": "go", + "tag": "registry-1966" + } + }, + { + "name": "preview.written on the checker's stream", + "of": "holder-event:preview.written", + "subject": "mesh.stream.mesh-delivery-checker.event.preview.written", + "given": {} + } +] diff --git a/contracts/seats/mesh-delivery-checker/fixtures/states.json b/contracts/seats/mesh-delivery-checker/fixtures/states.json new file mode 100644 index 00000000..ead92035 --- /dev/null +++ b/contracts/seats/mesh-delivery-checker/fixtures/states.json @@ -0,0 +1,48 @@ +[ + { + "name": "a running verdict", + "of": "state:verdicts/.", + "given": { + "v": 1, + "group": "feat/registry", + "heads": "0123456789ab", + "state": "running" + } + }, + { + "name": "a kept pass", + "of": "state:kept/.", + "given": { + "v": 1, + "state": "pass", + "repository": "novox/mesh-sdk", + "package": "go/keys", + "level": "unit", + "tests": 4, + "took": 120, + "toolchain": "go1.26", + "at": "2026-11-05T10:00:00Z" + } + }, + { + "name": "the status owed for a head", + "of": "state:owed/...", + "given": { + "v": 1, + "act": "status=mesh/check", + "context": "mesh/check", + "state": "success" + } + }, + { + "name": "a preview", + "of": "state:previews/..", + "given": { + "v": 1, + "repository": "novox/mesh-sdk", + "head": "cccccccccccccccccccccccccccccccccccccccc", + "trunk": "dddddddddddddddddddddddddddddddddddddddd", + "merge": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" + } + } +] diff --git a/contracts/seats/mesh-delivery/fixtures/states.json b/contracts/seats/mesh-delivery/fixtures/states.json new file mode 100644 index 00000000..0721e1da --- /dev/null +++ b/contracts/seats/mesh-delivery/fixtures/states.json @@ -0,0 +1,72 @@ +[ + { + "name": "the source revision", + "of": "state:source/main", + "given": { + "v": 1, + "group": "feat/registry", + "heads": { + "novox/mesh-sdk": "cccccccccccccccccccccccccccccccccccccccc" + } + } + }, + { + "name": "a merge", + "of": "state:merges/", + "given": { + "v": 1, + "group": "feat/registry", + "ask": "merge.feat=registry.0123456789ab", + "pulls": [ + { + "repository": "novox/mesh-sdk", + "number": 1, + "head": "cccccccccccccccccccccccccccccccccccccccc", + "state": "merging" + } + ] + } + }, + { + "name": "an ask", + "of": "state:asks/merge..", + "given": { + "v": 1, + "group": "feat/registry", + "heads": [ + { + "repository": "novox/mesh-sdk", + "number": 1, + "head": "cccccccccccccccccccccccccccccccccccccccc" + } + ], + "ask": { + "headline": "merge" + } + } + }, + { + "name": "an act owed", + "of": "state:owed/...", + "given": { + "v": 1, + "act": "view" + } + }, + { + "name": "a turn", + "of": "state:turns/", + "given": { + "v": 1, + "repository": "novox/mesh-sdk", + "waiting": [ + { + "group": "feat/registry", + "heads": "0123456789ab", + "approved": "2026-11-05T10:00:00Z", + "since": "2026-11-05T10:01:00Z" + } + ] + } + } +]