package domain_test import ( "errors" "testing" "cmbuyer/admin/internal/domain" ) func TestAuthorizationTransitions(t *testing.T) { tests := []struct { name string current domain.AuthorizationStatus next domain.AuthorizationStatus allowed bool }{ {"deliver", domain.AuthorizationStatusPendingDelivery, domain.AuthorizationStatusDelivered, true}, {"acknowledge", domain.AuthorizationStatusDelivered, domain.AuthorizationStatusAcknowledged, true}, {"execute", domain.AuthorizationStatusAcknowledged, domain.AuthorizationStatusExecuting, true}, {"fence", domain.AuthorizationStatusExecuting, domain.AuthorizationStatusFenced, true}, {"consume fenced authorization", domain.AuthorizationStatusFenced, domain.AuthorizationStatusConsumed, true}, {"expire pending delivery", domain.AuthorizationStatusPendingDelivery, domain.AuthorizationStatusExpired, true}, {"supersede pending delivery", domain.AuthorizationStatusPendingDelivery, domain.AuthorizationStatusSuperseded, true}, {"expire before fence", domain.AuthorizationStatusExecuting, domain.AuthorizationStatusExpired, true}, {"supersede before fence", domain.AuthorizationStatusDelivered, domain.AuthorizationStatusSuperseded, true}, {"fenced authorization cannot expire", domain.AuthorizationStatusFenced, domain.AuthorizationStatusExpired, false}, {"fenced authorization cannot be superseded", domain.AuthorizationStatusFenced, domain.AuthorizationStatusSuperseded, false}, {"fenced authorization cannot be delivered again", domain.AuthorizationStatusFenced, domain.AuthorizationStatusDelivered, false}, {"consumed authorization cannot restart", domain.AuthorizationStatusConsumed, domain.AuthorizationStatusDelivered, false}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { if got := test.current.CanTransitionTo(test.next); got != test.allowed { t.Fatalf("CanTransitionTo(%s, %s) = %t, want %t", test.current, test.next, got, test.allowed) } result, err := domain.TransitionAuthorization(test.current, test.next) if test.allowed { if err != nil { t.Fatalf("TransitionAuthorization(%s, %s): %v", test.current, test.next, err) } if result != test.next { t.Fatalf("TransitionAuthorization(%s, %s) = %s, want %s", test.current, test.next, result, test.next) } return } if !errors.Is(err, domain.ErrInvalidAuthorizationTransition) { t.Fatalf("TransitionAuthorization(%s, %s) error = %v, want ErrInvalidAuthorizationTransition", test.current, test.next, err) } }) } }