Files
tasks/common/enums/defaults_test.go
Stephan BehnkeandGitHub 3dda934f5e Fix reuse + conflict policy validation (#9728)
## What changed?

Fix setting of default reuse + conflict policy.

## Why?

Currently when the frontend request is retried, the request can suddenly
be in a bad state that doesn't pass validation if the conflict policy
was originally unset and the reuse policy was terminate-if-running
because setting the defaults will set a conflict policy - which is not
allowed when reuse policy terminate-if-running is used.

## How did you test it?
- [ ] built
- [ ] run locally and tested manually
- [ ] covered by existing tests
- [x] added new unit test(s)
- [ ] added new functional test(s)
2026-04-09 15:49:55 -07:00

81 lines
2.9 KiB
Go

package enums
import (
"testing"
"github.com/stretchr/testify/require"
enumspb "go.temporal.io/api/enums/v1"
)
func TestSetDefaultWorkflowIdPolicies(t *testing.T) {
type policies struct {
reuse enumspb.WorkflowIdReusePolicy
conflict enumspb.WorkflowIdConflictPolicy
}
for _, tc := range []struct {
name string
input policies
defaultConflictPolicy enumspb.WorkflowIdConflictPolicy
want policies
}{
{
name: "unspecified policies get defaults",
input: policies{
reuse: enumspb.WORKFLOW_ID_REUSE_POLICY_UNSPECIFIED,
conflict: enumspb.WORKFLOW_ID_CONFLICT_POLICY_UNSPECIFIED,
},
defaultConflictPolicy: enumspb.WORKFLOW_ID_CONFLICT_POLICY_FAIL,
want: policies{
reuse: enumspb.WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE,
conflict: enumspb.WORKFLOW_ID_CONFLICT_POLICY_FAIL,
},
},
{
name: "explicitly set policies are not overridden",
input: policies{
reuse: enumspb.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE,
conflict: enumspb.WORKFLOW_ID_CONFLICT_POLICY_USE_EXISTING,
},
defaultConflictPolicy: enumspb.WORKFLOW_ID_CONFLICT_POLICY_FAIL,
want: policies{
reuse: enumspb.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE,
conflict: enumspb.WORKFLOW_ID_CONFLICT_POLICY_USE_EXISTING,
},
},
{
name: "terminate-if-running reuse policy is migrated to terminate-existing conflict policy",
input: policies{
reuse: enumspb.WORKFLOW_ID_REUSE_POLICY_TERMINATE_IF_RUNNING, //nolint:staticcheck // SA1019: intentional migration coverage for deprecated policy
conflict: enumspb.WORKFLOW_ID_CONFLICT_POLICY_UNSPECIFIED,
},
defaultConflictPolicy: enumspb.WORKFLOW_ID_CONFLICT_POLICY_FAIL,
want: policies{
reuse: enumspb.WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE,
conflict: enumspb.WORKFLOW_ID_CONFLICT_POLICY_TERMINATE_EXISTING,
},
},
{
name: "terminate-if-running reuse policy with an explicit conflict policy is not migrated",
input: policies{
reuse: enumspb.WORKFLOW_ID_REUSE_POLICY_TERMINATE_IF_RUNNING, //nolint:staticcheck // SA1019: intentional migration coverage for deprecated policy
conflict: enumspb.WORKFLOW_ID_CONFLICT_POLICY_USE_EXISTING,
},
defaultConflictPolicy: enumspb.WORKFLOW_ID_CONFLICT_POLICY_FAIL,
want: policies{
reuse: enumspb.WORKFLOW_ID_REUSE_POLICY_TERMINATE_IF_RUNNING, //nolint:staticcheck // SA1019: intentional migration coverage for deprecated policy
conflict: enumspb.WORKFLOW_ID_CONFLICT_POLICY_USE_EXISTING, // same as before!
},
},
} {
t.Run(tc.name, func(t *testing.T) {
SetDefaultWorkflowIDPolicies(&tc.input.reuse, &tc.input.conflict, tc.defaultConflictPolicy)
require.Equal(t, tc.want, tc.input)
// check idempotency
SetDefaultWorkflowIDPolicies(&tc.input.reuse, &tc.input.conflict, tc.defaultConflictPolicy)
require.Equal(t, tc.want, tc.input)
})
}
}