package action_commit_test import ( "errors" "testing" "git.cin.su/m/Assistant/adapters/testexecutor" commitcontract "git.cin.su/m/Assistant/contracts/commit" commitdomain "git.cin.su/m/Assistant/modules/commit/domain" "git.cin.su/m/Assistant/platform/ids" ) func TestWS003UnknownOutcomeReconcilesWithoutDuplicateEffect(t *testing.T) { context, proposal := testContextAndProposal() action, err := commitdomain.Authorize(proposal, context, validator{}, commitcontract.AuthorizedActionID(ids.ID("authorized-reconcile")), 1) if err != nil { t.Fatal(err) } executor := testexecutor.New(true) unknown, err := commitdomain.Execute(action, commitcontract.ActionAttemptID(ids.ID("attempt-execute")), executor) if !errors.Is(err, commitdomain.ErrUnknownOutcome) || unknown.State != commitcontract.ActionUnknownOutcome || executor.EffectCount() != 1 { t.Fatalf("execute = %#v, %v, effects=%d", unknown, err, executor.EffectCount()) } verified, err := commitdomain.Reconcile(action, unknown, commitcontract.ActionAttemptID(ids.ID("attempt-reconcile")), executor) if err != nil || verified.State != commitcontract.ActionSucceeded || executor.EffectCount() != 1 { t.Fatalf("reconcile = %#v, %v, effects=%d", verified, err, executor.EffectCount()) } // Even an adversarial duplicate delivery is idempotent at the external boundary. _, _ = commitdomain.Execute(action, commitcontract.ActionAttemptID(ids.ID("attempt-duplicate")), executor) if executor.EffectCount() != 1 { t.Fatalf("duplicate delivery created %d effects", executor.EffectCount()) } } func TestWS003ReconciliationRequiresUnknownOutcome(t *testing.T) { context, proposal := testContextAndProposal() action, err := commitdomain.Authorize(proposal, context, validator{}, commitcontract.AuthorizedActionID(ids.ID("authorized-invalid-reconcile")), 1) if err != nil { t.Fatal(err) } previous := commitcontract.ActionAttempt{ID: "attempt-failed", AuthorizedID: action.ID, IntentID: action.Proposal.IntentID, State: commitcontract.ActionFailed} if _, err = commitdomain.Reconcile(action, previous, "attempt-next", testexecutor.New(false)); !errors.Is(err, commitdomain.ErrInvalidReconciliation) { t.Fatalf("reconciliation error = %v", err) } }