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!") } }