diff --git a/cmd/mesh-controller/seats_test.go b/cmd/mesh-controller/seats_test.go index 5273127b..27b201d1 100644 --- a/cmd/mesh-controller/seats_test.go +++ b/cmd/mesh-controller/seats_test.go @@ -93,3 +93,27 @@ func TestTheSeatsListingShowsEachSeatsPaths(t *testing.T) { } } } + +// 1718/AC2: a manifest claiming node-files that serves upload and download passes the controller's module +// check, judged by the mesh-sdk it vendors; a verb outside the contract is still refused. +func TestAFilesHolderServingUploadAndDownloadCanHoldTheSeat(t *testing.T) { + seat, ok := catalogue.SeatNamed(catalogue.FilesSeat) + if !ok { + t.Fatal("node-files is not a seat") + } + serves := []string{"upload", "download"} + for _, v := range seat.Serves { + if v.Name != "upload" && v.Name != "download" { + serves = append(serves, v.Name) + } + } + holder := catalogue.Manifest{Module: "mesh-files", Version: "1", Claims: []catalogue.Claim{{ + Name: catalogue.FilesSeat, Scope: catalogue.ScopeNode, Serves: serves}}} + if err := catalogue.CanHold(holder, seat); err != nil { // 1718/AC2 + t.Fatalf("a holder serving upload and download is refused: %v", err) + } + holder.Claims[0].Serves = append(append([]string{}, serves...), "teleport") + if err := catalogue.CanHold(holder, seat); err == nil || !strings.Contains(err.Error(), "does not promise") { + t.Fatalf("a verb outside the contract must be refused with 'does not promise': %v", err) + } +}