Files
Assistant/tests/action_commit/test_executor_reconciliation_test.go
2026-08-16 16:19:23 +03:00

46 lines
2.2 KiB
Go

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)
}
}