package greeter import ( "bytes" "context" "os" "strings" "testing" "git.golem15.com/golem15/summercms/backpack" "git.golem15.com/golem15/summercms/bonfire" "git.golem15.com/golem15/summercms/compass" "git.golem15.com/golem15/summercms/pact" ) type extraMsg struct{ msg string } func (e extraMsg) Message() string { return e.msg } func TestBootSkipsAbsentOptionalPlugin(t *testing.T) { app := backpack.New(&compass.Config{}) app.SetPlugins([]string{"golem15.hello", "golem15.greeter"}) p := &Plugin{} if err := p.Boot(app); err != nil { t.Fatalf("Boot: %v", err) } out := runHelloCmd(t, p) if strings.Contains(out, "hello-from-optional") { t.Fatalf("absent optional leaked into output: %q", out) } if !strings.Contains(out, "extra=") { t.Fatalf("output %q should include extra=", out) } } func TestBootUsesPublishedOptionalService(t *testing.T) { app := backpack.New(&compass.Config{}) app.SetPlugins([]string{"golem15.hello", "golem15.greeter", "golem15.optional"}) if err := app.Publish[pact.OptionalMessage](extraMsg{msg: "hello-from-optional"}); err != nil { t.Fatalf("Publish: %v", err) } p := &Plugin{} if err := p.Boot(app); err != nil { t.Fatalf("Boot: %v", err) } out := runHelloCmd(t, p) if !strings.Contains(out, "extra=hello-from-optional") { t.Fatalf("output = %q, want extra=hello-from-optional", out) } } func TestGreeterSourceDoesNotImportOptional(t *testing.T) { body, err := os.ReadFile("plugin.go") if err != nil { t.Fatal(err) } if strings.Contains(string(body), "plugins/optional") { t.Fatal("greeter must not import the optional plugin module") } } func runHelloCmd(t *testing.T, p *Plugin) string { t.Helper() cmds := p.Commands() if len(cmds) == 0 { t.Fatal("no commands") } var buf bytes.Buffer out := bonfire.NewOutput(strings.NewReader(""), &buf, &buf) if err := cmds[0].Run(context.Background(), nil, out); err != nil { t.Fatalf("Run: %v", err) } return strings.TrimSpace(buf.String()) }