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
77 lines
4.1 KiB
Go
77 lines
4.1 KiB
Go
package versions
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshbuilds"
|
|
"git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog"
|
|
)
|
|
|
|
// TestReservedByNameAnswersFromTheViewAndTheCatalog: design 47 G §572, §582, A-70 — a package's name (an npm name or a Go
|
|
// module path) is mapped to its module from the catalog half's view; the reserved version answers as for the module, a version
|
|
// no reservation holds is asked of the catalog's versions and answers released with the release's digests, and a name no entry
|
|
// carries, one more than one carries, or a version neither reserved nor released answers error, set alone.
|
|
func TestReservedByNameAnswersFromTheViewAndTheCatalog(t *testing.T) {
|
|
ctx := context.Background()
|
|
view := packagesMem{
|
|
"git=2enovox=2ebe/novox/mesh-sdk/go.0.1": []byte(`{"v":1,"name":"git.novox.be/novox/mesh-sdk/go","package":"mesh-sdk/go","series":"0.1"}`),
|
|
"git=2enovox=2ebe/novox/mesh-sdk/go.0.2": []byte(`{"v":1,"name":"git.novox.be/novox/mesh-sdk/go","package":"mesh-sdk/go","series":"0.2"}`),
|
|
"@novox/mesh-sdk.0.1": []byte(`{"v":1,"name":"@novox/mesh-sdk","package":"mesh-sdk/ts","series":"0.1"}`),
|
|
"twice.0.1": []byte(`{"v":1,"name":"twice","package":"a/x","series":"0.1"}`),
|
|
"twice-b.0.1": []byte(`{"v":1,"name":"twice","package":"b/y","series":"0.1"}`),
|
|
}
|
|
store := &reserveMem{mem: newMem()}
|
|
r := &Reserver{Store: store, ReleasedOf: func(context.Context, string) ([]string, error) { return []string{"0.1.3"}, nil }}
|
|
if _, err := r.Reserve(ctx, "mesh-sdk", "0.1", []string{"mesh-sdk:ts"}, Source{}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
rd := Reader{
|
|
Keys: func() ([]string, error) { return store.KeysOf(ctx, AllFilter) },
|
|
Get: func(key string) (json.RawMessage, bool, error) {
|
|
raw, _, ok, err := store.Get(ctx, key)
|
|
return raw, ok, err
|
|
}}
|
|
var asked []string
|
|
released := func(_ context.Context, module string) ([]meshcatalog.VersionEntry, error) {
|
|
asked = append(asked, module)
|
|
return []meshcatalog.VersionEntry{{Module: module, Version: "0.1.2", Artifacts: []meshcatalog.VersionArtifact{{Artifact: "mesh-sdk:go", Digest: "sha256:dd"}}}}, nil
|
|
}
|
|
carriers := Carriers(view)
|
|
ask := func(name, version string) meshbuilds.ReservedAnswer {
|
|
t.Helper()
|
|
got, err := AnswerReservedByName(ctx, rd, carriers, released, name, version)
|
|
if err != nil {
|
|
t.Fatalf("%s %s: %v", name, version, err)
|
|
}
|
|
return got
|
|
}
|
|
if got := ask("@novox/mesh-sdk", ""); got.Module != "mesh-sdk" || got.Version != "0.1.4" || got.Released || got.Error != "" {
|
|
t.Errorf("an npm name = %+v, want the module's reserved version", got)
|
|
}
|
|
if got := ask("git.novox.be/novox/mesh-sdk/go", "0.1.2"); !got.Released || got.Module != "mesh-sdk" || len(got.Artifacts) != 1 || got.Artifacts[0].Digest != "sha256:dd" {
|
|
t.Errorf("a Go module path = %+v, want the release's artifacts and digests (two series of one entry are one entry)", got)
|
|
}
|
|
if len(asked) != 1 || asked[0] != "mesh-sdk" {
|
|
t.Errorf("the catalog was asked for %v, want the module's versions once, for the version no reservation holds", asked)
|
|
}
|
|
for name, c := range map[string]struct{ name, version, want string }{
|
|
"unknown name": {"nothing", "", "no entry carries"},
|
|
"two entries": {"twice", "", "more than one entry"},
|
|
"neither released": {"git.novox.be/novox/mesh-sdk/go", "9.9.9", "reserved or released"},
|
|
} {
|
|
if got := ask(c.name, c.version); !strings.Contains(got.Error, c.want) || got.Module != "" || len(got.Artifacts) != 0 {
|
|
t.Errorf("%s = %+v, want error naming %q alone", name, got, c.want)
|
|
}
|
|
}
|
|
if _, err := AnswerReservedByName(ctx, rd, Carriers(packagesMem(nil)), released, "x", ""); err == nil {
|
|
t.Error("an unreadable view was answered as if no entry carried the name")
|
|
}
|
|
if _, err := AnswerReservedByName(ctx, rd, carriers, func(context.Context, string) ([]meshcatalog.VersionEntry, error) { return nil, errors.New("down") }, "git.novox.be/novox/mesh-sdk/go", "0.1.2"); err == nil {
|
|
t.Error("an unreadable catalog was answered as if the version were not released")
|
|
}
|
|
}
|