Files
supply-intelligence/internal/gatewayconsumer/service_test.go
2026-05-07 10:16:46 +08:00

90 lines
2.8 KiB
Go

package gatewayconsumer
import (
"context"
"testing"
"time"
"supply-intelligence/internal/domain"
"supply-intelligence/internal/repository"
)
func TestServiceConsumeOnceAppliedAndFailed(t *testing.T) {
repo := repository.NewMemoryRepository()
repo.AppendPackageEvent(domain.PackageChangeEvent{
EventID: "evt-applied",
EventType: "supply_package_published",
PackageID: 101,
Platform: "openai",
Model: "gpt-4.1-mini",
Version: 3,
OccurredAt: time.Unix(10, 0).UTC(),
GatewaySyncStatus: domain.GatewaySyncStatusPending,
})
repo.AppendPackageEvent(domain.PackageChangeEvent{
EventID: "evt-failed",
EventType: "supply_package_published",
PackageID: 102,
Platform: "openai",
Model: "gpt-fail-model",
Version: 4,
OccurredAt: time.Unix(20, 0).UTC(),
GatewaySyncStatus: domain.GatewaySyncStatusPending,
})
service := NewService(repo)
service.now = func() time.Time { return time.Unix(30, 0).UTC() }
out, err := service.ConsumeOnce(context.Background(), ConsumeOnceInput{Consumer: "gateway"})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(out.Items) != 2 {
t.Fatalf("unexpected item count: %d", len(out.Items))
}
if out.Items[0].GatewaySyncStatus != domain.GatewaySyncStatusApplied {
t.Fatalf("unexpected first status: %+v", out.Items[0])
}
if out.Items[1].GatewaySyncStatus != domain.GatewaySyncStatusFailed {
t.Fatalf("unexpected second status: %+v", out.Items[1])
}
events := repo.ListPackageEvents()
if events[0].GatewaySyncStatus != domain.GatewaySyncStatusApplied {
t.Fatalf("expected applied event, got %+v", events[0])
}
if events[1].GatewaySyncStatus != domain.GatewaySyncStatusFailed {
t.Fatalf("expected failed event, got %+v", events[1])
}
snapshot, ok := repo.GetGatewayAppliedSnapshot("gateway")
if !ok {
t.Fatal("expected applied snapshot")
}
if snapshot.LastEventID != "evt-applied" || snapshot.LastPackageID != 101 {
t.Fatalf("unexpected snapshot: %+v", snapshot)
}
}
func TestServiceConsumeOnceRejectsInvalidApplierResult(t *testing.T) {
repo := repository.NewMemoryRepository()
repo.AppendPackageEvent(domain.PackageChangeEvent{
EventID: "evt-1",
EventType: "supply_package_published",
PackageID: 101,
Platform: "openai",
Model: "gpt-4.1-mini",
Version: 3,
OccurredAt: time.Unix(10, 0).UTC(),
GatewaySyncStatus: domain.GatewaySyncStatusPending,
})
service := NewService(repo)
service.SetApplier(func(context.Context, domain.PackageChangeEvent) (domain.GatewayAckResult, string) {
return domain.GatewayAckResult("unknown"), "bad"
})
_, err := service.ConsumeOnce(context.Background(), ConsumeOnceInput{})
if err != ErrInvalidConsumeInput {
t.Fatalf("unexpected error: %v", err)
}
}