From 6c5a8ef893b47b440786c9010ca87bccb8418f9a Mon Sep 17 00:00:00 2001 From: jochen Date: Fri, 30 Oct 2026 21:41:29 +0100 Subject: [PATCH] Test that the composition marks a need its provider's helper answers, so the consumer's plan keys it (issue 774) The review found answeredByHelper untested: forced false, every test passed. This row fails then. --- go/compose/resolve_test.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/go/compose/resolve_test.go b/go/compose/resolve_test.go index ef250af..8bb30b8 100644 --- a/go/compose/resolve_test.go +++ b/go/compose/resolve_test.go @@ -358,3 +358,31 @@ func TestALicenceKeyTheInputDoesNotCarryIsAStandInAndNamedForeseen(t *testing.T) t.Errorf("a key the mesh holds none of: %q %v", n.Sealed, got.Foreseen) } } + +// A consumer not handed of a provision whose provider's offer says the helper answers it has that provision in a plan of +// its own (issue 774: grafana's route): the composition marks the need answered by the helper, and the plan keys it. +func TestANeedAnsweredByTheHelperIsInTheConsumersPlan(t *testing.T) { + in := theStoreMesh(t) + store := in.Catalogue["store"] + store.Provides = []catalogue.Offer{{Name: "postgres-database", Scope: catalogue.ScopeMesh, AnsweredBy: catalogue.AnsweredByHelper}} + in.Catalogue["store"] = store + got, err := Resolve(in, "laptop") + if err != nil { + t.Fatal(err) + } + if n := need(t, got.Plan, "board", "postgres-database"); !n.AnsweredByHelper { + t.Fatalf("the need is not marked answered by the helper: %+v", n) + } + with := rendered(t, in, "laptop", Foreseeing).Rendering + with.Hands, with.Provisioner = true, "mesh-provisioner-client" + if with.Generators, err = newComposer(in).generators(); err != nil { + t.Fatal(err) + } + c, err := got.Plan.Compose(with) + if err != nil { + t.Fatal(err) + } + if p := c.Plans["board"].Provisions; len(p) != 1 || p[0].Provision != "postgres-database" || p[0].ProviderModule != "store" { + t.Fatalf("board's plan is %+v", c.Plans["board"]) + } +}