From fd21838f887883d85b1a29084883014182472a6f Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 18 Apr 2025 16:06:30 +0200 Subject: [PATCH 1/5] Add assert_in_body helper Coming upstream --- test/controllers/users_controller_test.rb | 6 +++--- test/test_helper.rb | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index ff7ec0f2c..fad78128f 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -5,8 +5,8 @@ class UsersControllerTest < ActionDispatch::IntegrationTest sign_in_as :kevin get users_path - assert_match /#{users(:david).name}/, @response.body - assert_match /#{users(:kevin).name}/, @response.body + assert_in_body users(:david).name + assert_in_body users(:kevin).name end test "new" do @@ -32,7 +32,7 @@ class UsersControllerTest < ActionDispatch::IntegrationTest sign_in_as :kevin get user_path(users(:david)) - assert_match /#{users(:david).name}/, @response.body + assert_in_body users(:david).name end test "update oneself" do diff --git a/test/test_helper.rb b/test/test_helper.rb index 1447430b1..dd27bd4ca 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -11,5 +11,15 @@ module ActiveSupport fixtures :all include CardTestHelper, ChangeTestHelper, SessionTestHelper + + # FIXME: Remove when upstream in Rails has landed (https://github.com/rails/rails/pull/54938) + def assert_in_body(text) + assert_match /#{text}/, @response.body + end + + # FIXME: Remove when upstream in Rails has landed (https://github.com/rails/rails/pull/54938) + def assert_not_in_body(text) + assert_no_match /#{text}/, @response.body + end end end From f6cd21f7cb9dd506127ccbd28d49640853fc1c67 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 18 Apr 2025 16:07:01 +0200 Subject: [PATCH 2/5] Extract default stages into something that will be created together with a new Workflow in the model --- app/controllers/workflows_controller.rb | 2 -- app/models/workflow.rb | 10 ++++++++++ test/controllers/workflows_controller_test.rb | 19 +++++++++++++++++++ test/models/workflow_test.rb | 8 ++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 test/controllers/workflows_controller_test.rb create mode 100644 test/models/workflow_test.rb diff --git a/app/controllers/workflows_controller.rb b/app/controllers/workflows_controller.rb index 49abcd26f..f8b54254d 100644 --- a/app/controllers/workflows_controller.rb +++ b/app/controllers/workflows_controller.rb @@ -11,8 +11,6 @@ class WorkflowsController < ApplicationController def create @workflow = Workflow.create! workflow_params - # FIXME: this should definitely change. - [ "Triage", "In progress", "On Hold", "Review" ].each { |name| @workflow.stages.create! name: name } redirect_to workflows_path end diff --git a/app/models/workflow.rb b/app/models/workflow.rb index df896cf09..1812d7225 100644 --- a/app/models/workflow.rb +++ b/app/models/workflow.rb @@ -1,3 +1,13 @@ class Workflow < ApplicationRecord + DEFAULT_STAGES = [ "Triage", "In progress", "On Hold", "Review" ] + has_many :stages, dependent: :delete_all + + after_create_commit :create_default_stages + + private + def create_default_stages + Workflow::Stage.insert_all \ + DEFAULT_STAGES.collect { |default_stage_name| { workflow_id: id , name: default_stage_name } } + end end diff --git a/test/controllers/workflows_controller_test.rb b/test/controllers/workflows_controller_test.rb new file mode 100644 index 000000000..392f6514b --- /dev/null +++ b/test/controllers/workflows_controller_test.rb @@ -0,0 +1,19 @@ +require "test_helper" + +class WorkflowsControllerTest < ActionDispatch::IntegrationTest + setup do + sign_in_as :kevin + end + + test "index" do + get workflows_path + assert_in_body workflows(:on_call).name + end + + test "create" do + assert_difference -> { Workflow.count }, +1 do + post workflows_path, params: { workflow: { name: "My new workflow!" } } + assert_redirected_to workflows_path + end + end +end diff --git a/test/models/workflow_test.rb b/test/models/workflow_test.rb new file mode 100644 index 000000000..23239b3b4 --- /dev/null +++ b/test/models/workflow_test.rb @@ -0,0 +1,8 @@ +require "test_helper" + +class WorkflowTest < ActiveSupport::TestCase + test "create with default stages" do + workflow = Workflow.create name: "My New Workflow" + assert_equal Workflow::DEFAULT_STAGES.sort, workflow.stages.collect(&:name).sort + end +end From 7b0d3d033f864bba001e9e579d7a84ca3866ca02 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 18 Apr 2025 16:08:53 +0200 Subject: [PATCH 3/5] Fix extra space --- app/models/workflow.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/workflow.rb b/app/models/workflow.rb index 1812d7225..b1e1fdb22 100644 --- a/app/models/workflow.rb +++ b/app/models/workflow.rb @@ -8,6 +8,6 @@ class Workflow < ApplicationRecord private def create_default_stages Workflow::Stage.insert_all \ - DEFAULT_STAGES.collect { |default_stage_name| { workflow_id: id , name: default_stage_name } } + DEFAULT_STAGES.collect { |default_stage_name| { workflow_id: id, name: default_stage_name } } end end From 3003105ac9b78bce8c74a30c5613a513c7da54a0 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 18 Apr 2025 16:16:04 +0200 Subject: [PATCH 4/5] Flesh out the rest of the controller tests --- test/controllers/workflows_controller_test.rb | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/controllers/workflows_controller_test.rb b/test/controllers/workflows_controller_test.rb index 392f6514b..8d3d64c69 100644 --- a/test/controllers/workflows_controller_test.rb +++ b/test/controllers/workflows_controller_test.rb @@ -11,9 +11,33 @@ class WorkflowsControllerTest < ActionDispatch::IntegrationTest end test "create" do + get new_workflow_path + assert_response :success + assert_difference -> { Workflow.count }, +1 do post workflows_path, params: { workflow: { name: "My new workflow!" } } assert_redirected_to workflows_path end end + + test "show" do + get workflow_path(workflows(:on_call)) + assert_in_body workflows(:on_call).name + end + + test "update" do + get edit_workflow_path(workflows(:on_call)) + assert_response :success + + put workflow_path(workflows(:on_call)), params: { workflow: { name: "Monkeyflow!" } } + follow_redirect! + assert_in_body "Monkeyflow!" + end + + test "destroy" do + assert_difference -> { Workflow.count }, -1 do + delete workflow_path(workflows(:on_call)) + assert_redirected_to workflows_path + end + end end From f594bc09a0b8cc1397835deb927b4d8e9bd6188a Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 18 Apr 2025 16:24:54 +0200 Subject: [PATCH 5/5] Simplify This is coming straight from the form, unlikely to blow up --- app/controllers/collections/workflows_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/collections/workflows_controller.rb b/app/controllers/collections/workflows_controller.rb index ae50b90f9..28b691f11 100644 --- a/app/controllers/collections/workflows_controller.rb +++ b/app/controllers/collections/workflows_controller.rb @@ -10,6 +10,6 @@ class Collections::WorkflowsController < ApplicationController private def set_workflow - @workflow = Workflow.find(params.expect(collection: [ :workflow_id ]).require(:workflow_id)) + @workflow = Workflow.find(params[:collection][:workflow_id]) end end