74 lines
2.1 KiB
Go
74 lines
2.1 KiB
Go
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))
|
|
}
|
|
}
|