140 lines
6.0 KiB
Go
140 lines
6.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/asks"
|
|
sdkdelivery "git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
// The controller reads a merge's warrant under the asker the announcement names, and accepts only the teller and
|
|
// today's mesh-delivery (novox/hq ADR 0437 §6, issue 1213). The teller's name is the SDK's.
|
|
|
|
// askedBy is an approved merge whose announcement names an asker ("" names none) and whose warrant is that asker's.
|
|
func askedBy(t *testing.T, named, warrantOf string) anApprovedMerge {
|
|
t.Helper()
|
|
a := approvedMerge(t)
|
|
a.merge.Asker = named
|
|
a.warrant.Asker = warrantOf
|
|
return a
|
|
}
|
|
|
|
// 1213/AC1: an announcement naming the teller, and the teller's warrant of the operator's verified Approve of the
|
|
// merge's heads: the move is registered (the warrant is read from the router under the teller).
|
|
func TestAMergeNamingTheTellerIsMovedOnTheTellersWarrant(t *testing.T) {
|
|
a := askedBy(t, sdkdelivery.TellerModule, sdkdelivery.TellerModule)
|
|
if _, err := movedOnApprove(a.merge, &a.ask, &a.warrant); err != nil {
|
|
t.Fatalf("the teller's warrant of the operator's Approve was refused: %v", err)
|
|
}
|
|
was := routerAskOf
|
|
t.Cleanup(func() { routerAskOf = was })
|
|
wasKept := keptDeliveryMerge
|
|
t.Cleanup(func() { keptDeliveryMerge = wasKept })
|
|
keptDeliveryMerge = func(context.Context, string, string, int, string) (deliveryMerge, bool, error) {
|
|
return a.merge, true, nil
|
|
}
|
|
var readUnder string
|
|
routerAskOf = func(_ context.Context, _ catalogueReader, asker, _ string) (*asks.Ask, *asks.Warrant, error) {
|
|
readUnder = asker
|
|
return &a.ask, &a.warrant, nil
|
|
}
|
|
if _, err := approvedAnnounced(t.Context(), nil, "novox", "mesh-controller", announcedPull(7, a.merge.HeadSHA)); err != nil {
|
|
t.Fatalf("the merge was not moved on the teller's warrant: %v", err)
|
|
}
|
|
if readUnder != sdkdelivery.TellerModule {
|
|
t.Errorf("the warrant was read under %q", readUnder)
|
|
}
|
|
}
|
|
|
|
// 1213/AC2: an announcement naming mesh-delivery, or none (today's module): read under mesh-delivery, registered.
|
|
func TestAMergeNamingNoAskerIsMovedOnMeshDeliverysWarrant(t *testing.T) {
|
|
for _, named := range []string{"", theDelivery} {
|
|
a := askedBy(t, named, theDelivery)
|
|
if _, err := movedOnApprove(a.merge, &a.ask, &a.warrant); err != nil {
|
|
t.Errorf("asker %q: refused: %v", named, err)
|
|
}
|
|
}
|
|
was := routerAskOf
|
|
wasKept := keptDeliveryMerge
|
|
t.Cleanup(func() { routerAskOf, keptDeliveryMerge = was, wasKept })
|
|
a := askedBy(t, "", theDelivery)
|
|
keptDeliveryMerge = func(context.Context, string, string, int, string) (deliveryMerge, bool, error) {
|
|
return a.merge, true, nil
|
|
}
|
|
var readUnder string
|
|
routerAskOf = func(_ context.Context, _ catalogueReader, asker, _ string) (*asks.Ask, *asks.Warrant, error) {
|
|
readUnder = asker
|
|
return &a.ask, &a.warrant, nil
|
|
}
|
|
if _, err := approvedAnnounced(t.Context(), nil, "novox", "mesh-controller", announcedPull(7, a.merge.HeadSHA)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if readUnder != theDelivery {
|
|
t.Errorf("with no asker named the warrant was read under %q, not %q", readUnder, theDelivery)
|
|
}
|
|
}
|
|
|
|
// 1213/AC3: any other asker registers no move, and the reason names the asker refused; the router is not asked.
|
|
func TestAMergeNamingAnyOtherAskerMovesNothingAndNamesIt(t *testing.T) {
|
|
was := routerAskOf
|
|
wasKept := keptDeliveryMerge
|
|
t.Cleanup(func() { routerAskOf, keptDeliveryMerge = was, wasKept })
|
|
for _, other := range []string{sdkdelivery.GateModule, "mesh-controller", "unknown-module"} {
|
|
a := askedBy(t, other, other) // even a warrant of that very asker
|
|
_, err := movedOnApprove(a.merge, &a.ask, &a.warrant)
|
|
if err == nil || !strings.Contains(err.Error(), other) {
|
|
t.Errorf("asker %q: %v", other, err)
|
|
}
|
|
keptDeliveryMerge = func(context.Context, string, string, int, string) (deliveryMerge, bool, error) {
|
|
return a.merge, true, nil
|
|
}
|
|
routerAskOf = func(context.Context, catalogueReader, string, string) (*asks.Ask, *asks.Warrant, error) {
|
|
t.Errorf("the router was read under the refused asker %q", other)
|
|
return &a.ask, &a.warrant, nil
|
|
}
|
|
if _, err := approvedAnnounced(t.Context(), nil, "novox", "mesh-controller", announcedPull(7, a.merge.HeadSHA)); err == nil ||
|
|
!strings.Contains(err.Error(), other) {
|
|
t.Errorf("asker %q, approved as announced: %v", other, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
// 1213/AC4: a warrant whose own asker differs from the asker read, or whose heads differ from the head merged, moves nothing.
|
|
func TestAWarrantOfAnotherAskerOrOtherHeadsMovesNothing(t *testing.T) {
|
|
a := askedBy(t, sdkdelivery.TellerModule, theDelivery) // read under the teller, but the warrant says mesh-delivery
|
|
if why, err := movedOnApprove(a.merge, &a.ask, &a.warrant); err == nil {
|
|
t.Errorf("a warrant of another asker was accepted: %s", why)
|
|
}
|
|
a = askedBy(t, "", sdkdelivery.TellerModule) // today's module named, the teller's warrant
|
|
if why, err := movedOnApprove(a.merge, &a.ask, &a.warrant); err == nil {
|
|
t.Errorf("the teller's warrant under mesh-delivery was accepted: %s", why)
|
|
}
|
|
a = askedBy(t, sdkdelivery.TellerModule, sdkdelivery.TellerModule)
|
|
a.merge.HeadSHA = "d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4"
|
|
if why, err := movedOnApprove(a.merge, &a.ask, &a.warrant); err == nil {
|
|
t.Errorf("a head the Approve did not cover was accepted: %s", why)
|
|
}
|
|
}
|
|
|
|
// 1213/AC5: the announcement's asker is read and kept with the rest of it, under the JSON name asker.
|
|
func TestTheAnnouncementsAskerIsReadAndKept(t *testing.T) {
|
|
body := `{"owner":"novox","repo":"r","number":1,"head_sha":"abc","ask_id":"a","option":"approve","asker":"mesh-delivery-teller"}`
|
|
d, err := parseDeliveryMerge([]byte(body))
|
|
if err != nil || d.Asker != sdkdelivery.TellerModule {
|
|
t.Fatalf("read %+v, %v", d, err)
|
|
}
|
|
none, err := parseDeliveryMerge([]byte(strings.Replace(body, `,"asker":"mesh-delivery-teller"`, "", 1)))
|
|
if err != nil || none.Asker != "" {
|
|
t.Fatalf("an announcement naming none read as %+v, %v", none, err)
|
|
}
|
|
}
|
|
|
|
// announcedPull is the forge's announcement of a merge of a pull request at a head.
|
|
func announcedPull(number int, head string) keptMerge {
|
|
var k keptMerge
|
|
k.Number, k.HeadSHA = number, head
|
|
return k
|
|
}
|