90 lines
2.8 KiB
Go
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)
|
|
}
|
|
}
|