- Cover typed Publish/Lookup, duplicate providers and HasPlugin - Require missing/cycle errors to name plugin IDs before Boot - Assert greeter works with and without an optional extra
76 lines
2.0 KiB
Go
76 lines
2.0 KiB
Go
package greeter
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"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 testOut struct{ bytes.Buffer }
|
|
|
|
func (o *testOut) Write(p []byte) (int, error) { return o.Buffer.Write(p) }
|
|
func (o *testOut) Println(a ...any) { fmt.Fprintln(&o.Buffer, a...) }
|
|
func (o *testOut) Printf(format string, a ...any) {
|
|
fmt.Fprintf(&o.Buffer, format, a...)
|
|
}
|
|
|
|
var _ bonfire.Output = (*testOut)(nil)
|
|
var _ io.Writer = (*testOut)(nil)
|
|
|
|
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 runHelloCmd(t *testing.T, p *Plugin) string {
|
|
t.Helper()
|
|
cmds := p.Commands()
|
|
if len(cmds) == 0 {
|
|
t.Fatal("no commands")
|
|
}
|
|
var out testOut
|
|
if err := cmds[0].Run(context.Background(), nil, &out); err != nil {
|
|
t.Fatalf("Run: %v", err)
|
|
}
|
|
return strings.TrimSpace(out.String())
|
|
}
|