go-template/internal/greeter/greeter_test.go

64 lines
1.8 KiB
Go

package greeter_test
import (
"strings"
"testing"
"gitea.djmil.dev/djmil/go-template/internal/greeter"
"gitea.djmil.dev/djmil/go-template/internal/logger"
)
// ── Service (unit tests) ──────────────────────────────────────────────────────
func TestGreet(t *testing.T) {
svc := greeter.New(logger.NewNop())
t.Run("returns personalized greeting", func(t *testing.T) {
msg, err := svc.Greet("World")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if msg != "Hello, World!" {
t.Errorf("got %q, want %q", msg, "Hello, World!")
}
})
t.Run("rejects empty name", func(t *testing.T) {
_, err := svc.Greet("")
if err == nil {
t.Fatal("expected error, got nil")
}
if !strings.Contains(err.Error(), "name must not be empty") {
t.Errorf("error %q does not contain %q", err.Error(), "name must not be empty")
}
})
}
// ── Manual fake example ───────────────────────────────────────────────────────
// For consumers that depend on the Greeter interface, write a manual fake.
// No code generation required — just implement the interface directly.
type fakeGreeter struct {
greetFn func(name string) (string, error)
}
func (f *fakeGreeter) Greet(name string) (string, error) {
return f.greetFn(name)
}
func TestFakeUsageExample(t *testing.T) {
fake := &fakeGreeter{
greetFn: func(name string) (string, error) {
return "Hello, " + name + "!", nil
},
}
msg, err := fake.Greet("Alice")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if msg != "Hello, Alice!" {
t.Errorf("got %q, want %q", msg, "Hello, Alice!")
}
}