package domain_test import ( "errors" "testing" "cmbuyer/admin/internal/domain" ) func TestSubmissionTransitions(t *testing.T) { tests := []struct { name string current domain.SubmissionStatus next domain.SubmissionStatus allowed bool }{ {"submitted", domain.SubmissionStatusFenced, domain.SubmissionStatusSubmitted, true}, {"uncertain requires reconciliation", domain.SubmissionStatusFenced, domain.SubmissionStatusReconciliationRequired, true}, {"manual review resolves reconciliation", domain.SubmissionStatusReconciliationRequired, domain.SubmissionStatusManualResolved, true}, {"cannot reopen fenced submission", domain.SubmissionStatusSubmitted, domain.SubmissionStatusFenced, false}, {"submitted cannot require reconciliation", domain.SubmissionStatusSubmitted, domain.SubmissionStatusReconciliationRequired, false}, {"cannot skip reconciliation", domain.SubmissionStatusFenced, domain.SubmissionStatusManualResolved, 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.TransitionSubmission(test.current, test.next) if test.allowed { if err != nil { t.Fatalf("TransitionSubmission(%s, %s): %v", test.current, test.next, err) } if result != test.next { t.Fatalf("TransitionSubmission(%s, %s) = %s, want %s", test.current, test.next, result, test.next) } return } if !errors.Is(err, domain.ErrInvalidSubmissionTransition) { t.Fatalf("TransitionSubmission(%s, %s) error = %v, want ErrInvalidSubmissionTransition", test.current, test.next, err) } }) } }