hyapp-server/pkg/outboxreplay/replay_test.go
2026-07-13 23:38:32 +08:00

82 lines
2.2 KiB
Go

package outboxreplay
import (
"context"
"errors"
"testing"
)
func TestNewScopeNormalizesAndBoundsTenantReplay(t *testing.T) {
scope, err := NewScope(" HUWAA ", 3, 10)
if err != nil {
t.Fatalf("NewScope failed: %v", err)
}
if scope.AppCode != "huwaa" || scope.Limit != 3 {
t.Fatalf("scope mismatch: %+v", scope)
}
for _, test := range []struct {
name string
app string
limit int
max int
}{
{name: "missing app", limit: 1, max: 10},
{name: "zero limit", app: "huwaa", max: 10},
{name: "above maximum", app: "huwaa", limit: 11, max: 10},
{name: "invalid maximum", app: "huwaa", limit: 1},
} {
t.Run(test.name, func(t *testing.T) {
if _, err := NewScope(test.app, test.limit, test.max); err == nil {
t.Fatal("expected validation error")
}
})
}
}
func TestRunStopsAtProcessWideLimit(t *testing.T) {
calls := 0
result, err := Run(context.Background(), Scope{AppCode: "huwaa", Limit: 3}, func(context.Context) (int, error) {
calls++
return 1, nil
})
if err != nil {
t.Fatalf("Run failed: %v", err)
}
if calls != 3 || result.Processed != 3 || result.Drained {
t.Fatalf("hard-limit result mismatch: calls=%d result=%+v", calls, result)
}
}
func TestRunStopsWhenPartitionDrains(t *testing.T) {
calls := 0
result, err := Run(context.Background(), Scope{AppCode: "huwaa", Limit: 5}, func(context.Context) (int, error) {
calls++
if calls == 3 {
return 0, nil
}
return 1, nil
})
if err != nil {
t.Fatalf("Run failed: %v", err)
}
if calls != 3 || result.Processed != 2 || !result.Drained {
t.Fatalf("drained result mismatch: calls=%d result=%+v", calls, result)
}
}
func TestRunCountsClaimedFailureAndRejectsBatchClaims(t *testing.T) {
publishErr := errors.New("publish failed")
result, err := Run(context.Background(), Scope{AppCode: "huwaa", Limit: 5}, func(context.Context) (int, error) {
return 1, publishErr
})
if !errors.Is(err, publishErr) || result.Processed != 1 {
t.Fatalf("failed row result mismatch: result=%+v err=%v", result, err)
}
if _, err := Run(context.Background(), Scope{AppCode: "huwaa", Limit: 5}, func(context.Context) (int, error) {
return 2, nil
}); err == nil {
t.Fatal("expected multi-row claim rejection")
}
}