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 }{ {"claim", domain.AuthorizationStatusActive, domain.AuthorizationStatusClaimed, true}, {"fence", domain.AuthorizationStatusClaimed, domain.AuthorizationStatusFenced, true}, {"consume fenced authorization", domain.AuthorizationStatusFenced, domain.AuthorizationStatusConsumed, true}, {"expire active", domain.AuthorizationStatusActive, domain.AuthorizationStatusExpired, true}, {"abandon active", domain.AuthorizationStatusActive, domain.AuthorizationStatusAbandoned, true}, {"expire claimed before fence", domain.AuthorizationStatusClaimed, domain.AuthorizationStatusExpired, true}, {"abandon claimed before fence", domain.AuthorizationStatusClaimed, domain.AuthorizationStatusAbandoned, true}, {"fenced authorization cannot expire", domain.AuthorizationStatusFenced, domain.AuthorizationStatusExpired, false}, {"fenced authorization cannot be abandoned", domain.AuthorizationStatusFenced, domain.AuthorizationStatusAbandoned, false}, {"fenced authorization cannot be claimed again", domain.AuthorizationStatusFenced, domain.AuthorizationStatusClaimed, false}, {"consumed authorization cannot restart", domain.AuthorizationStatusConsumed, domain.AuthorizationStatusClaimed, 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) } }) } }