Files
go-cart-actor/pkg/checkout/mutation_payment_event_test.go
matst80 3becd1c80c
Some checks failed
Build and Publish / BuildAndDeployAmd64 (push) Has been cancelled
Build and Publish / BuildAndDeployArm64 (push) Has started running
fix
2025-12-04 18:02:06 +01:00

125 lines
3.1 KiB
Go

package checkout
import (
"encoding/json"
"testing"
checkout_messages "git.k6n.net/go-cart-actor/proto/checkout"
"google.golang.org/protobuf/types/known/anypb"
)
func TestHandlePaymentEvent(t *testing.T) {
tests := []struct {
name string
initialPayments []*Payment
event *checkout_messages.PaymentEvent
expectedEvents []PaymentEvent
expectError bool
}{
{
name: "add event to existing payment",
initialPayments: []*Payment{
{
PaymentId: "pay123",
Events: []PaymentEvent{
{Name: "init", Success: true, Data: json.RawMessage(`{"key":"value"}`)},
},
},
},
event: &checkout_messages.PaymentEvent{
PaymentId: "pay123",
Name: "capture",
Success: true,
Data: &anypb.Any{Value: []byte(`{"amount":100}`)},
},
expectedEvents: []PaymentEvent{
{Name: "init", Success: true, Data: json.RawMessage(`{"key":"value"}`)},
{Name: "capture", Success: true, Data: json.RawMessage(`{"amount":100}`)},
},
expectError: false,
},
{
name: "add event to payment with no initial events",
initialPayments: []*Payment{
{
PaymentId: "pay456",
Events: []PaymentEvent{},
},
},
event: &checkout_messages.PaymentEvent{
PaymentId: "pay456",
Name: "refund",
Success: false,
Data: &anypb.Any{Value: []byte(`{"reason":"failed"}`)},
},
expectedEvents: []PaymentEvent{
{Name: "refund", Success: false, Data: json.RawMessage(`{"reason":"failed"}`)},
},
expectError: false,
},
{
name: "payment not found",
initialPayments: []*Payment{
{
PaymentId: "pay123",
},
},
event: &checkout_messages.PaymentEvent{
PaymentId: "nonexistent",
Name: "test",
Success: true,
},
expectedEvents: nil,
expectError: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
grain := &CheckoutGrain{
Payments: tt.initialPayments,
}
err := HandlePaymentEvent(grain, tt.event)
if tt.expectError {
if err == nil {
t.Errorf("expected error, got nil")
} else if err != ErrPaymentNotFound {
t.Errorf("expected ErrPaymentNotFound, got %v", err)
}
return
}
if err != nil {
t.Errorf("unexpected error: %v", err)
return
}
payment, found := grain.FindPayment(tt.event.PaymentId)
if !found {
t.Errorf("payment not found after handling event")
return
}
if len(payment.Events) != len(tt.expectedEvents) {
t.Errorf("expected %d events, got %d", len(tt.expectedEvents), len(payment.Events))
return
}
for i, expected := range tt.expectedEvents {
actual := payment.Events[i]
if actual.Name != expected.Name {
t.Errorf("event %d name mismatch: got %s, expected %s", i, actual.Name, expected.Name)
}
if actual.Success != expected.Success {
t.Errorf("event %d success mismatch: got %t, expected %t", i, actual.Success, expected.Success)
}
if string(actual.Data) != string(expected.Data) {
t.Errorf("event %d data mismatch: got %s, expected %s", i, string(actual.Data), string(expected.Data))
}
}
})
}
}