diff --git a/cmd/workflow/deploy/deploy_test.go b/cmd/workflow/deploy/deploy_test.go index dc0ca4f9..2daea501 100644 --- a/cmd/workflow/deploy/deploy_test.go +++ b/cmd/workflow/deploy/deploy_test.go @@ -1,6 +1,7 @@ package deploy import ( + "bytes" "context" "encoding/hex" "encoding/json" @@ -9,6 +10,8 @@ import ( "math/big" "net/http" "net/http/httptest" + "os" + "strings" "testing" "github.com/ethereum/go-ethereum/common" @@ -740,6 +743,47 @@ func (f fakeUserDonLimitClient) GetWorkflowListByOwnerAndName(common.Address, st return f.workflowsByOwnerName, nil } +func TestWarnExistingPausedWorkflowUpdate(t *testing.T) { + // Do not use t.Parallel: stderr redirection uses package-global os.Stderr. + + captureStderr := func(f func()) string { + t.Helper() + old := os.Stderr + r, w, err := os.Pipe() + require.NoError(t, err) + os.Stderr = w + + f() + + require.NoError(t, w.Close()) + os.Stderr = old + + var buf bytes.Buffer + _, copyErr := io.Copy(&buf, r) + require.NoError(t, copyErr) + require.NoError(t, r.Close()) + return buf.String() + } + + t.Run("no output when status is nil", func(t *testing.T) { + out := captureStderr(func() { warnIfPausedWorkflowUpdate(nil) }) + assert.Empty(t, strings.TrimSpace(out)) + }) + + t.Run("no output when workflow is active", func(t *testing.T) { + active := workflowStatusActive + out := captureStderr(func() { warnIfPausedWorkflowUpdate(&active) }) + assert.Empty(t, strings.TrimSpace(out)) + }) + + t.Run("prints warning when workflow is paused", func(t *testing.T) { + paused := workflowStatusPaused + out := captureStderr(func() { warnIfPausedWorkflowUpdate(&paused) }) + assert.Contains(t, out, "Your workflow is paused") + assert.Contains(t, out, "and has been updated") + }) +} + func TestCheckUserDonLimitBeforeDeploy(t *testing.T) { owner := common.HexToAddress(chainsim.TestAddress) donFamily := "test-don" diff --git a/cmd/workflow/deploy/limits.go b/cmd/workflow/deploy/limits.go index 402f91fe..4a93f003 100644 --- a/cmd/workflow/deploy/limits.go +++ b/cmd/workflow/deploy/limits.go @@ -11,6 +11,7 @@ import ( const ( workflowStatusActive = uint8(0) + workflowStatusPaused = uint8(1) workflowListPageSize = int64(200) ) diff --git a/cmd/workflow/deploy/registry_deploy_strategy_onchain.go b/cmd/workflow/deploy/registry_deploy_strategy_onchain.go index 818ad15d..5b8ed17d 100644 --- a/cmd/workflow/deploy/registry_deploy_strategy_onchain.go +++ b/cmd/workflow/deploy/registry_deploy_strategy_onchain.go @@ -101,9 +101,16 @@ func (a *onchainRegistryDeployStrategy) Upsert() error { if err := h.upsert(); err != nil { return fmt.Errorf("failed to register workflow: %w", err) } + warnIfPausedWorkflowUpdate(h.existingWorkflowStatus) return nil } +func warnIfPausedWorkflowUpdate(status *uint8) { + if status != nil && *status == workflowStatusPaused { + ui.Warning("Your workflow is paused and has been updated") + } +} + func (h *handler) workflowExists() error { workflow, err := h.wrc.GetWorkflow(common.HexToAddress(h.inputs.WorkflowOwner), h.inputs.WorkflowName, h.inputs.WorkflowTag) if err != nil { diff --git a/cmd/workflow/deploy/registry_deploy_strategy_private.go b/cmd/workflow/deploy/registry_deploy_strategy_private.go index 076878fd..52a28155 100644 --- a/cmd/workflow/deploy/registry_deploy_strategy_private.go +++ b/cmd/workflow/deploy/registry_deploy_strategy_private.go @@ -59,6 +59,7 @@ func (a *privateRegistryDeployStrategy) Upsert() error { if result.Owner != "" { ui.Dim(fmt.Sprintf(" Owner: %s", result.Owner)) } + warnIfPausedWorkflowUpdate(h.existingWorkflowStatus) return nil }