diff --git a/CHANGELOG.md b/CHANGELOG.md index ef2afeba6f..bdfa0b3eea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,10 @@ and this project adheres to to send emails. This is now fixed for a limited number of use cases (see (DEPLOYMENT.md)[https://github.com/OpenFn/lightning/blob/main/DEPLOYMENT.md#mail] for details). [#4602](https://github.com/OpenFn/lightning/issues/4602) +- Include `webhook_reply` and `cron_cursor_job_id` in the workflow version hash + so that changes to these trigger fields are properly detected by CLI deploy and + sandbox merge + [#4596](https://github.com/OpenFn/lightning/issues/4596) ## [2.16.1] - 2026-04-07 diff --git a/lib/lightning/workflow_versions.ex b/lib/lightning/workflow_versions.ex index a4db0c45e8..011088f56c 100644 --- a/lib/lightning/workflow_versions.ex +++ b/lib/lightning/workflow_versions.ex @@ -246,7 +246,13 @@ defmodule Lightning.WorkflowVersions do :body ] - trigger_keys = [:type, :cron_expression, :enabled] + trigger_keys = [ + :type, + :cron_expression, + :enabled, + :webhook_reply, + :cron_cursor_job_id + ] edge_keys = [ :name, diff --git a/test/lightning/workflow_versions_test.exs b/test/lightning/workflow_versions_test.exs index e0bb6e4f77..fcdff6bbe0 100644 --- a/test/lightning/workflow_versions_test.exs +++ b/test/lightning/workflow_versions_test.exs @@ -493,6 +493,57 @@ defmodule Lightning.WorkflowVersionsTest do refute hash1 == hash2 end + test "hash changes when webhook_reply changes" do + workflow = insert(:workflow, name: "Test") + + trigger = + insert(:trigger, + workflow: workflow, + type: :webhook, + webhook_reply: :before_start + ) + + workflow = Repo.preload(workflow, [:triggers, :jobs, :edges]) + hash1 = WorkflowVersions.generate_hash(workflow) + + trigger + |> Ecto.Changeset.change(webhook_reply: :after_completion) + |> Repo.update!() + + workflow = Repo.preload(workflow, [:triggers, :jobs, :edges], force: true) + hash2 = WorkflowVersions.generate_hash(workflow) + + refute hash1 == hash2 + end + + test "hash changes when cron_cursor_job_id changes" do + workflow = insert(:workflow, name: "Test") + job1 = insert(:job, workflow: workflow, name: "Job A") + job2 = insert(:job, workflow: workflow, name: "Job B") + + insert(:trigger, + workflow: workflow, + type: :cron, + cron_expression: "0 * * * *", + cron_cursor_job: job1 + ) + + workflow = Repo.preload(workflow, [:triggers, :jobs, :edges]) + hash1 = WorkflowVersions.generate_hash(workflow) + + # Change the cron cursor job + [trigger] = workflow.triggers + + trigger + |> Ecto.Changeset.change(cron_cursor_job_id: job2.id) + |> Repo.update!() + + workflow = Repo.preload(workflow, [:triggers, :jobs, :edges], force: true) + hash2 = WorkflowVersions.generate_hash(workflow) + + refute hash1 == hash2 + end + test "properly orders triggers by type" do workflow = insert(:workflow, name: "Test")