package lottery import ( "context" "errors" "testing" "gorm.io/gorm" ) func TestRegistry_GetMissing(t *testing.T) { r := NewRegistry() if _, ok := r.Get("nope"); ok { t.Fatalf("empty registry should not return handler") } if _, err := r.MustGet("nope"); !errors.Is(err, ErrHandlerNotRegistered) { t.Fatalf("MustGet on missing type should return ErrHandlerNotRegistered, got %v", err) } } func TestRegistry_RegisterAndGet(t *testing.T) { r := NewRegistry() r.Register(NewNoopHandler()) r.Register(NewVPNDurationStubHandler()) r.Register(NewCommissionStubHandler()) for _, want := range []string{PrizeTypeNone, PrizeTypeVPNDuration, PrizeTypeCommission} { h, err := r.MustGet(want) if err != nil { t.Fatalf("MustGet(%q): %v", want, err) } if h.Type() != want { t.Fatalf("Type mismatch: want %q got %q", want, h.Type()) } } } func TestNoopHandler_AlwaysAutoClaimed(t *testing.T) { h := NewNoopHandler() if !h.IsAuto() { t.Fatal("noop must be auto") } res, err := h.Dispatch(context.Background(), (*gorm.DB)(nil), DispatchRequest{}) if err != nil { t.Fatalf("noop dispatch err: %v", err) } if res.State != DispatchStateAutoClaimed { t.Fatalf("noop should dispatch as auto_claimed, got %q", res.State) } } func TestStubHandlers_ReturnNotImplemented(t *testing.T) { for _, h := range []PrizeHandler{NewVPNDurationStubHandler(), NewCommissionStubHandler()} { _, err := h.Dispatch(context.Background(), (*gorm.DB)(nil), DispatchRequest{}) if !errors.Is(err, ErrNotImplemented) { t.Fatalf("%s: expected ErrNotImplemented, got %v", h.Type(), err) } } }