92 lines
3.2 KiB
Go
92 lines
3.2 KiB
Go
package viewstate
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/keys"
|
|
)
|
|
|
|
func sampleReach() Reach {
|
|
return Reach{V: keys.Version, Repository: "novox/mesh-catalog", Indexed: "cccc", Reached: "cccc", ReachedSrc: 9, Modules: map[string]ModuleReach{
|
|
"gitea": {FP: "src2:a", Nodes: 1, Floor: "cccc", Waiting: "gitea on ace runs src2:a and its health check failed", Changes: []Change{{Commit: "cccc", FP: "src2:a", Src: 9}, {Commit: "bbbb", FP: "src2:b", Src: 7}}},
|
|
"zsh": {FP: "src2:z", Changes: []Change{{Commit: "aaaa", FP: "src2:z"}}},
|
|
}}
|
|
}
|
|
|
|
// 1280: the reach value (ADR 0556) round-trips, and values that do not hold are refused, naming what is wrong.
|
|
func TestAReachValueRoundTripsAndRefusesWhatDoesNotHold(t *testing.T) {
|
|
wantErr := func(what string, err error, in string) {
|
|
t.Helper()
|
|
if err == nil || !strings.Contains(err.Error(), in) {
|
|
t.Errorf("%s: %v, want an error naming %q", what, err, in)
|
|
}
|
|
}
|
|
r := sampleReach()
|
|
data, err := EncodeReach(r)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got, err := DecodeReach(data); err != nil || !SameReach(got, r) {
|
|
t.Errorf("reach round trip: %+v %v", got, err)
|
|
}
|
|
r.Repository = ""
|
|
_, err = EncodeReach(r)
|
|
wantErr("reach without repository", err, "repository")
|
|
r = sampleReach()
|
|
m := r.Modules["gitea"]
|
|
m.Changes = append(m.Changes, Change{Commit: "dddd"})
|
|
r.Modules["gitea"] = m
|
|
_, err = EncodeReach(r)
|
|
wantErr("reach with a change naming no fingerprint", err, "gitea")
|
|
r = sampleReach()
|
|
m = r.Modules["gitea"]
|
|
m.Changes = make([]Change, MostChanges+1)
|
|
r.Modules["gitea"] = m
|
|
_, err = EncodeReach(r)
|
|
wantErr("reach keeping too many changes", err, "more than")
|
|
r = sampleReach()
|
|
r.ReachedSrc = 0
|
|
_, err = EncodeReach(r)
|
|
wantErr("reach with a head and no revision", err, "reached head")
|
|
}
|
|
|
|
func TestReachValuesDifferingInAnyPartAreNotTheSame(t *testing.T) {
|
|
if !SameReach(sampleReach(), sampleReach()) {
|
|
t.Error("equal reach values differ")
|
|
}
|
|
for name, change := range map[string]func(*Reach){
|
|
"indexed": func(r *Reach) { r.Indexed = "dddd" },
|
|
"floor": func(r *Reach) { m := r.Modules["gitea"]; m.Floor = "bbbb"; r.Modules["gitea"] = m },
|
|
"changes": func(r *Reach) { m := r.Modules["zsh"]; m.Changes = nil; r.Modules["zsh"] = m },
|
|
"modules": func(r *Reach) { delete(r.Modules, "zsh") },
|
|
"reached": func(r *Reach) { r.Reached, r.ReachedSrc = "bbbb", 7 },
|
|
"holds": func(r *Reach) { r.Holds = []string{"gitea on ace does not yet run src2:a"} },
|
|
} {
|
|
r := sampleReach()
|
|
change(&r)
|
|
if SameReach(r, sampleReach()) {
|
|
t.Errorf("reach values differing in %s are the same", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestViewAnswerRoundTrip(t *testing.T) {
|
|
a := ViewAnswer{Asking: "hold-mesh-mail-aaaa-0123456789ab", Option: "release", Words: "fixed by #12"}
|
|
data, err := EncodeViewAnswer(a)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got, err := DecodeViewAnswer(data)
|
|
a.V = keys.Version
|
|
if err != nil || !SameViewAnswer(got, a) {
|
|
t.Errorf("view answer came back %+v, %v", got, err)
|
|
}
|
|
if _, err := EncodeViewAnswer(ViewAnswer{Asking: "x", Option: " "}); err == nil {
|
|
t.Errorf("a view answer naming no option was accepted")
|
|
}
|
|
if _, err := EncodeViewAnswer(ViewAnswer{Option: "release"}); err == nil {
|
|
t.Errorf("a view answer naming no asking was accepted")
|
|
}
|
|
}
|