package checkout import ( "testing" checkout_messages "git.k6n.net/go-cart-actor/proto/checkout" ) func TestHandleContactDetailsUpdated(t *testing.T) { tests := []struct { name string initial *ContactDetails update *checkout_messages.ContactDetailsUpdated expected *ContactDetails }{ { name: "update all fields", initial: nil, update: &checkout_messages.ContactDetailsUpdated{ Email: stringPtr("test@example.com"), Phone: stringPtr("123456789"), Name: stringPtr("John Doe"), }, expected: &ContactDetails{ Email: stringPtr("test@example.com"), Phone: stringPtr("123456789"), Name: stringPtr("John Doe"), }, }, { name: "update partial fields", initial: &ContactDetails{ Email: stringPtr("old@example.com"), Phone: nil, Name: stringPtr("Old Name"), }, update: &checkout_messages.ContactDetailsUpdated{ Phone: stringPtr("987654321"), }, expected: &ContactDetails{ Email: stringPtr("old@example.com"), Phone: stringPtr("987654321"), Name: stringPtr("Old Name"), }, }, { name: "nil message", initial: nil, update: nil, expected: &ContactDetails{}, // but error expected }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { grain := &CheckoutGrain{ ContactDetails: tt.initial, } err := HandleContactDetailsUpdated(grain, tt.update) if tt.name == "nil message" { if err == nil { t.Errorf("expected error for nil message, got nil") } return } if err != nil { t.Errorf("unexpected error: %v", err) } if grain.ContactDetails == nil && tt.expected != nil { t.Errorf("expected contact details, got nil") } else if grain.ContactDetails != nil && tt.expected == nil { t.Errorf("expected nil contact details, got %v", grain.ContactDetails) } else if grain.ContactDetails != nil && tt.expected != nil { if (grain.ContactDetails.Email == nil && tt.expected.Email != nil) || (grain.ContactDetails.Email != nil && tt.expected.Email == nil) || (grain.ContactDetails.Email != nil && *grain.ContactDetails.Email != *tt.expected.Email) { t.Errorf("email mismatch: got %v, expected %v", grain.ContactDetails.Email, tt.expected.Email) } if (grain.ContactDetails.Phone == nil && tt.expected.Phone != nil) || (grain.ContactDetails.Phone != nil && tt.expected.Phone == nil) || (grain.ContactDetails.Phone != nil && *grain.ContactDetails.Phone != *tt.expected.Phone) { t.Errorf("phone mismatch: got %v, expected %v", grain.ContactDetails.Phone, tt.expected.Phone) } if (grain.ContactDetails.Name == nil && tt.expected.Name != nil) || (grain.ContactDetails.Name != nil && tt.expected.Name == nil) || (grain.ContactDetails.Name != nil && *grain.ContactDetails.Name != *tt.expected.Name) { t.Errorf("name mismatch: got %v, expected %v", grain.ContactDetails.Name, tt.expected.Name) } } }) } } func stringPtr(s string) *string { return &s }