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