package backend import ( "bytes" "context" "image/png" "io" "testing" ) func TestMockGeneratesValidPNG(t *testing.T) { be, err := NewMock("mock", nil) if err != nil { t.Fatalf("NewMock: %v", err) } if be.Name() != "mock" { t.Errorf("Name() = %q", be.Name()) } res, err := be.Generate(context.Background(), Request{ Prompt: "test prompt", Width: 64, Height: 64, Seed: 1234, }) if err != nil { t.Fatalf("Generate: %v", err) } defer res.ImageReader.Close() if res.MimeType != "image/png" { t.Errorf("mime = %q", res.MimeType) } body, err := io.ReadAll(res.ImageReader) if err != nil { t.Fatalf("read body: %v", err) } img, err := png.Decode(bytes.NewReader(body)) if err != nil { t.Fatalf("decode png: %v", err) } if img.Bounds().Dx() != 64 || img.Bounds().Dy() != 64 { t.Errorf("dims = %v", img.Bounds()) } if seed, ok := res.Metadata["seed"].(int64); !ok || seed != 1234 { t.Errorf("metadata seed = %v", res.Metadata["seed"]) } } func TestMockDeterministicBySeed(t *testing.T) { be, _ := NewMock("mock", nil) gen := func() []byte { res, err := be.Generate(context.Background(), Request{Prompt: "p", Width: 32, Height: 32, Seed: 99}) if err != nil { t.Fatalf("Generate: %v", err) } defer res.ImageReader.Close() b, _ := io.ReadAll(res.ImageReader) return b } a := gen() b := gen() if !bytes.Equal(a, b) { t.Errorf("same seed produced different images: %d vs %d bytes", len(a), len(b)) } } func TestRegistryBuildAndUnknown(t *testing.T) { r := NewRegistry() r.Register("mock", NewMock) if !r.Has("mock") { t.Errorf("Has(mock) = false") } be, err := r.Build("mock", "instance-1", nil) if err != nil { t.Fatalf("Build: %v", err) } if be.Name() != "instance-1" { t.Errorf("Name() = %q", be.Name()) } if _, err := r.Build("nope", "x", nil); err == nil { t.Errorf("expected error for unknown type") } } func TestRegistryDuplicatePanic(t *testing.T) { r := NewRegistry() r.Register("dup", NewMock) defer func() { if recover() == nil { t.Errorf("expected panic on duplicate Register") } }() r.Register("dup", NewMock) }