The delivery repository's contracts and SDK live under modules/ as mesh-delivery-contracts and mesh-delivery-sdk, their Go module paths renamed to match the folders (the TypeScript names already did), and every importer in mesh-delivery, mesh-catalog, mesh-host, mesh-tools and mesh-sdk follows in the same group: a design as it should be, one path per module, checked by the group's check building every importer. Builds: design 47 G §427, §88 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
75 lines
3.3 KiB
Go
75 lines
3.3 KiB
Go
package versions
|
|
|
|
import (
|
|
"context"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog"
|
|
)
|
|
|
|
func named(module, artifact, name string) meshcatalog.CatalogEntry {
|
|
return meshcatalog.CatalogEntry{Module: module, Artifacts: []meshcatalog.Artifact{
|
|
{Ref: module + ":" + artifact, Language: "go", Package: &meshcatalog.ArtifactPackage{Ecosystem: "go", Name: name}}}}
|
|
}
|
|
|
|
// TestPackageNamesAreReadFromTheCatalogHalfsEntries: a package's name in its ecosystem is the name the entry of its module gives the
|
|
// artifact (design 47 G §348, §676), the module and artifact a name is built from are the entries carrying it, and a name two
|
|
// entries carry is an error naming both (§491); no state of the indexer is read.
|
|
func TestPackageNamesAreReadFromTheCatalogHalfsEntries(t *testing.T) {
|
|
entries := func() []meshcatalog.CatalogEntry {
|
|
return []meshcatalog.CatalogEntry{named("mesh-sdk", "go", "git.novox.be/novox/mesh-sdk/go"), named("netcheck", "lib", "netcheck"),
|
|
named("twin-a", "lib", "twin"), named("twin-b", "lib", "twin"), {Module: "bare"}}
|
|
}
|
|
ctx := context.Background()
|
|
for _, c := range []struct {
|
|
module, artifact string
|
|
name string
|
|
known bool
|
|
}{
|
|
{"mesh-sdk", "go", "git.novox.be/novox/mesh-sdk/go", true},
|
|
{"netcheck", "lib", "netcheck", true},
|
|
{"netcheck", "other", "", false},
|
|
{"bare", "lib", "", false},
|
|
{"unknown", "lib", "", false},
|
|
} {
|
|
got, known, err := NamesFrom(entries)(ctx, c.module, c.artifact)
|
|
if err != nil || got != c.name || known != c.known {
|
|
t.Errorf("NamesFrom(%s/%s) = %q, %v, %v; want %q, %v", c.module, c.artifact, got, known, err, c.name, c.known)
|
|
}
|
|
}
|
|
module, artifact, found, err := ModuleFrom(entries)(ctx, "netcheck")
|
|
if module != "netcheck" || artifact != "lib" || !found || err != nil {
|
|
t.Errorf("ModuleFrom(netcheck) = %q, %q, %v, %v", module, artifact, found, err)
|
|
}
|
|
if _, _, found, err := ModuleFrom(entries)(ctx, "nobody"); found || err != nil {
|
|
t.Errorf("ModuleFrom(nobody) = %v, %v; want none", found, err)
|
|
}
|
|
if _, _, _, err := ModuleFrom(entries)(ctx, "twin"); err == nil {
|
|
t.Error("ModuleFrom(twin): two entries carry it, want an error")
|
|
}
|
|
got, _ := CarriersFrom(entries)(ctx, "twin")
|
|
if want := []Built{{"twin-a", "lib"}, {"twin-b", "lib"}}; !reflect.DeepEqual(got, want) {
|
|
t.Errorf("CarriersFrom(twin) = %v, want %v", got, want)
|
|
}
|
|
}
|
|
|
|
// Design 47 G A-119: the floor's requirements are what the catalog half's entries name for the package, each version once.
|
|
func TestRequirementsFromAreTheVersionsEntriesNameForAPackage(t *testing.T) {
|
|
entries := func() []meshcatalog.CatalogEntry {
|
|
return []meshcatalog.CatalogEntry{
|
|
{Module: "a", Packages: map[string]string{"x/sdk": "v0.0.0-2026-aaa", "y": "v1.0.0"}},
|
|
{Module: "b", Packages: map[string]string{"x/sdk": "v0.0.0-2026-bbb"}},
|
|
{Module: "c", Packages: map[string]string{"x/sdk": "v0.0.0-2026-aaa"}},
|
|
{Module: "d"},
|
|
}
|
|
}
|
|
got, err := RequirementsFrom(entries)(context.Background(), "x/sdk")
|
|
if err != nil || !reflect.DeepEqual(got, []string{"v0.0.0-2026-aaa", "v0.0.0-2026-bbb"}) {
|
|
t.Errorf("requirements = %v, %v", got, err)
|
|
}
|
|
if got, _ := RequirementsFrom(entries)(context.Background(), "none"); len(got) != 0 {
|
|
t.Errorf("a package no entry names has requirements %v", got)
|
|
}
|
|
}
|