Files
mesh-delivery/modules/mesh-delivery-forge-bridge/internal/bridge/named_test.go
T
jschoubben 8ab8c5d04a Carry each named path's git object in the merged and pull messages of a module whose every artifact names its paths, read at its manifest's commit (issue 1758, I6, ADR 0499 §3)
Asks gitea_commit_trees with paths (the interface agreed with the lead); a forge that cannot say is a retry. Pins
mesh-sdk feat/r4e-sdk 9cb4d59.
2026-10-22 18:13:25 +02:00

99 lines
3.8 KiB
Go

package bridge
import (
"os"
"reflect"
"strings"
"testing"
"git.novox.be/novox/mesh-sdk/go/delivery"
)
// ADR 0499 clause 3 (I6): the merged and the pull message carry each named path's git object of a module whose every
// artifact names its paths, read at the same commit as its manifest. The manifest is mesh-sdk's module.json at 9cb4d59 (its
// lib names src, test, package.json, package-lock.json and tsconfig.json).
type namedCall struct {
owner, repo, sha string
paths map[string][]string
}
func namedOf(calls *[]namedCall, answer map[string]map[string]string, err error) Named {
return func(owner, repo, sha string, paths map[string][]string) (map[string]map[string]string, error) {
*calls = append(*calls, namedCall{owner, repo, sha, paths})
return answer, err
}
}
func sdkFiles(t *testing.T) Files {
t.Helper()
raw, err := os.ReadFile("testdata/mesh-sdk-9cb4d59.module.json")
if err != nil {
t.Fatal(err)
}
return func(owner, repo, path, ref string) ([]byte, error) {
if path == "module.json" {
return raw, nil
}
return nil, ErrNotFound
}
}
var sdkObjects = map[string]map[string]string{"": {"src": "1111111111111111111111111111111111111111", "test": "2222222222222222222222222222222222222222",
"package.json": "3333333333333333333333333333333333333333", "package-lock.json": "4444444444444444444444444444444444444444", "tsconfig.json": "5555555555555555555555555555555555555555"}}
func TestAMergedMessageCarriesTheNamedPathsObjectsOfAModuleNamingItsPaths(t *testing.T) { // I6, ADR 0499 clause 3
var calls []call
var named []namedCall
body := mergedBody(map[string]any{"repo": "mesh-sdk", "module_dirs": []string{""}})
msg, err := ConvertNamed(mergedSubject, body, treesOf(&calls, "r0", map[string]string{"": "r0"}, nil), sdkFiles(t), namedOf(&named, sdkObjects, nil))
if err != nil {
t.Fatal(err)
}
f, err := delivery.DecodeForge(msg.Data)
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(f.Paths, sdkObjects) {
t.Errorf("paths = %v, want the forge's objects of lib's named paths", f.Paths)
}
if len(named) != 1 || named[0].sha != merge || named[0].repo != "mesh-sdk" ||
strings.Join(named[0].paths[""], ",") != "package-lock.json,package.json,src,test,tsconfig.json" {
t.Errorf("asked %+v, want the root's named paths at the merge commit", named)
}
}
func TestAMessageOfModulesNamingNoPathsAsksNoObjects(t *testing.T) { // I6
var calls []call
var named []namedCall
if _, err := ConvertNamed(mergedSubject, mergedBody(nil), treesOf(&calls, "r0", map[string]string{"modules/a": "t1"}, nil), anyFiles, namedOf(&named, nil, nil)); err != nil {
t.Fatal(err)
}
if len(named) != 0 {
t.Errorf("asked %+v, want nothing for modules naming no paths", named)
}
}
func TestAPullMessageCarriesTheNamedPathsObjectsAtItsHead(t *testing.T) { // I6, ADR 0499 clause 3
var named []namedCall
body := mergedBody(map[string]any{"repo": "mesh-sdk", "module_dirs": []string{""}, "base": "feat/y"})
msg, err := ConvertNamed(UpdatedSubject, body, nil, sdkFiles(t), namedOf(&named, sdkObjects, nil))
if err != nil {
t.Fatal(err)
}
f, _ := delivery.DecodeForge(msg.Data)
if !reflect.DeepEqual(f.Paths, sdkObjects) || len(named) != 1 || named[0].sha != head {
t.Errorf("paths = %v, asked %+v; want the objects read at the head", f.Paths, named)
}
}
func TestAForgeThatCannotSayTheObjectsIsARetry(t *testing.T) { // I6: a message without them would give the module none
var calls []call
var named []namedCall
body := mergedBody(map[string]any{"repo": "mesh-sdk", "module_dirs": []string{""}})
_, err := ConvertNamed(mergedSubject, body, treesOf(&calls, "r0", map[string]string{"": "r0"}, nil), sdkFiles(t), namedOf(&named, nil, os.ErrDeadlineExceeded))
if err == nil || !strings.Contains(err.Error(), "named paths") {
t.Errorf("err = %v, want a retry naming the named paths", err)
}
}