package main import ( "context" "fmt" "testing" "time" "git.k6n.net/mats/go-cart-actor/pkg/actor" "git.k6n.net/mats/go-cart-actor/pkg/order" ) func testApplier(t *testing.T) *orderedApplier { t.Helper() reg := actor.NewMutationRegistry() order.RegisterMutations(reg) storage := actor.NewDiskStorage[order.OrderGrain](t.TempDir(), reg) pool, err := actor.NewSimpleGrainPool(actor.GrainPoolConfig[order.OrderGrain]{ Hostname: "test", Spawn: func(_ context.Context, id uint64) (actor.Grain[order.OrderGrain], error) { return order.NewOrderGrain(id, time.Now()), nil }, SpawnHost: func(string) (actor.Host[order.OrderGrain], error) { return nil, fmt.Errorf("none") }, Destroy: func(actor.Grain[order.OrderGrain]) error { return nil }, TTL: time.Hour, PoolSize: 100, MutationRegistry: reg, Storage: nil, }) if err != nil { t.Fatal(err) } t.Cleanup(pool.Close) return &orderedApplier{pool: pool, storage: storage} } func TestIngestLegacyOrder(t *testing.T) { app := testApplier(t) ctx := context.Background() body := []byte(`{ "order_id":"K-1","purchase_currency":"SEK","purchase_country":"se","locale":"sv-SE", "order_amount":15000,"order_tax_amount":3000, "order_lines":[{"reference":"l1","name":"Widget","quantity":1,"unit_price":15000,"tax_rate":25,"total_amount":15000,"total_tax_amount":3000}] }`) if err := ingestLegacyOrder(ctx, app, body); err != nil { t.Fatalf("ingest: %v", err) } id := legacyOrderID("K-1") g, err := app.Get(ctx, id) if err != nil { t.Fatal(err) } if g.Status != order.StatusCaptured { t.Fatalf("status = %q, want captured", g.Status) } if g.CapturedAmount != 15000 { t.Fatalf("captured = %d, want 15000", g.CapturedAmount) } // Redelivery must be idempotent — no double capture, no new payment. if err := ingestLegacyOrder(ctx, app, body); err != nil { t.Fatalf("re-ingest: %v", err) } g2, _ := app.Get(ctx, id) if g2.CapturedAmount != 15000 { t.Fatalf("redelivery double-captured: %d", g2.CapturedAmount) } if len(g2.Payments) != 1 { t.Fatalf("redelivery created %d payments, want 1", len(g2.Payments)) } }