53 lines
2.2 KiB
Go
53 lines
2.2 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|