Skip to content

Commit fe5c122

Browse files
committed
Inject task status service as dependency of form model
1 parent 40ea22e commit fe5c122

10 files changed

Lines changed: 88 additions & 34 deletions

app/controllers/forms_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def current_archived_welsh_form
2525

2626
def load_form
2727
@current_form = Form.find(params[:form_id])
28+
@current_form.set_task_status_service(TaskStatusService.new(form: @current_form))
2829
@initial_form_state = @current_form.state
2930
end
3031

app/models/form.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class Form < ApplicationRecord
5252
after_update :update_draft_form_document
5353
ATTRIBUTES_NOT_IN_FORM_DOCUMENT = %i[state external_id pages question_section_completed declaration_section_completed share_preview_completed welsh_completed].freeze
5454

55+
attr_accessor :task_status_service
56+
5557
def save_question_changes!
5658
self.question_section_completed = false
5759
# Make sure the updated_at is updated as we use this to determine if the form has changed in forms-runner.
@@ -218,6 +220,10 @@ def draft_created?(previous_state)
218220
(previous_state.to_sym == :archived && archived_with_draft?)
219221
end
220222

223+
def set_task_status_service(service)
224+
self.task_status_service = service
225+
end
226+
221227
private
222228

223229
def set_external_id
@@ -228,13 +234,6 @@ def update_draft_form_document
228234
FormDocumentSyncService.new(self).update_draft_form_document
229235
end
230236

231-
def task_status_service
232-
# TODO: refactor this in favour of dependency injection
233-
# https://trello.com/c/TVN9BNxQ/3448-refactor-formtaskstatusservice-to-use-dependency-injection
234-
# it can also lead to use of `allow_any_instance_of` in testing
235-
@task_status_service ||= TaskStatusService.new(form: self)
236-
end
237-
238237
def has_routing_conditions
239238
pages.filter { |p| p.routing_conditions.any? }.any?
240239
end

app/services/form_task_list_service.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def call(**args)
1212
def initialize(form:, current_user:)
1313
@current_user = current_user
1414
@form = form
15+
@form.set_task_status_service(TaskStatusService.new(form:))
1516
@task_statuses = form.all_task_statuses
1617
@task_counts = status_counts
1718
end

spec/input_objects/forms/make_live_input_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
RSpec.describe Forms::MakeLiveInput, type: :model do
44
let(:error_message) { I18n.t("activemodel.errors.models.forms/make_live_input.attributes.confirm.blank") }
5+
let(:form) { create :form, :ready_for_live }
6+
let(:user) { build :user }
7+
8+
before do
9+
form.set_task_status_service(TaskStatusService.new(form:))
10+
end
511

612
describe "validations" do
713
it "is invalid if blank" do

spec/models/form_spec.rb

Lines changed: 57 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,6 @@
99
expect(form).to be_valid
1010
end
1111

12-
it "has a ready for live trait" do
13-
form = build :form, :ready_for_live, :with_group
14-
expect(form.ready_for_live).to be true
15-
expect(form.incomplete_tasks).to be_empty
16-
expect(form.task_statuses).to include(
17-
declaration_status: :completed,
18-
make_live_status: :not_started,
19-
name_status: :completed,
20-
pages_status: :completed,
21-
privacy_policy_status: :completed,
22-
support_contact_details_status: :completed,
23-
what_happens_next_status: :completed,
24-
)
25-
end
26-
2712
it "has a live trait" do
2813
form = build :form, :live
2914
expect(form.state).to eq "live"
@@ -50,9 +35,36 @@
5035
expect(form.pages.map(&:position)).to eq [1, 2, 3, 4, 5]
5136
end
5237

53-
it "has a missing pages trait" do
54-
form = build :form, :missing_pages
55-
expect(form.incomplete_tasks).to eq %i[missing_pages]
38+
describe "task status traits" do
39+
before do
40+
form.set_task_status_service(TaskStatusService.new(form:))
41+
end
42+
43+
describe "ready for live trait" do
44+
let(:form) { build :form, :ready_for_live, :with_group }
45+
46+
it "creates a form that is ready to be made live" do
47+
expect(form.ready_for_live).to be true
48+
expect(form.incomplete_tasks).to be_empty
49+
expect(form.task_statuses).to include(
50+
declaration_status: :completed,
51+
make_live_status: :not_started,
52+
name_status: :completed,
53+
pages_status: :completed,
54+
privacy_policy_status: :completed,
55+
support_contact_details_status: :completed,
56+
what_happens_next_status: :completed,
57+
)
58+
end
59+
end
60+
61+
describe "missing pages trait" do
62+
let(:form) { build :form, :missing_pages }
63+
64+
it "creates a form with missing pages" do
65+
expect(form.incomplete_tasks).to eq %i[missing_pages]
66+
end
67+
end
5668
end
5769
end
5870

@@ -503,6 +515,10 @@
503515
end
504516

505517
describe "FormStateMachine" do
518+
before do
519+
form.set_task_status_service(TaskStatusService.new(form: form))
520+
end
521+
506522
describe "#make_live!" do
507523
let(:form) { create :form, :ready_for_live }
508524

@@ -861,16 +877,20 @@
861877
end
862878

863879
describe "#ready_for_live" do
880+
before do
881+
form.set_task_status_service(TaskStatusService.new(form:))
882+
end
883+
864884
context "when a form is complete and ready to be made live" do
865-
let(:completed_form) { create(:form, :live) }
885+
let(:form) { create(:form, :live) }
866886

867887
it "returns true" do
868-
expect(completed_form.ready_for_live).to be true
888+
expect(form.ready_for_live).to be true
869889
end
870890
end
871891

872892
context "when a form is incomplete and should still be in draft state" do
873-
let(:new_form) { build :form, :new_form }
893+
let(:form) { build :form, :new_form }
874894

875895
[
876896
{
@@ -891,27 +911,31 @@
891911
},
892912
].each do |scenario|
893913
it "returns false if #{scenario[:attribute]} is missing" do
894-
new_form.send("#{scenario[:attribute]}=", scenario[:attribute_value])
895-
expect(new_form.ready_for_live).to be false
914+
form.send("#{scenario[:attribute]}=", scenario[:attribute_value])
915+
expect(form.ready_for_live).to be false
896916
end
897917
end
898918
end
899919
end
900920

901921
describe "#all_incomplete_tasks" do
922+
before do
923+
form.set_task_status_service(TaskStatusService.new(form: form))
924+
end
925+
902926
context "when a form is complete and ready to be made live" do
903-
let(:completed_form) { build :form, :live }
927+
let(:form) { build :form, :live }
904928

905929
it "returns no missing sections" do
906-
expect(completed_form.all_incomplete_tasks).to be_empty
930+
expect(form.all_incomplete_tasks).to be_empty
907931
end
908932
end
909933

910934
context "when a form is incomplete and should still be in draft state" do
911-
let(:new_form) { build :form, :new_form }
935+
let(:form) { build :form, :new_form }
912936

913937
it "returns a set of keys related to missing fields" do
914-
expect(new_form.all_incomplete_tasks).to match_array(%i[missing_pages missing_submission_email missing_privacy_policy_url missing_contact_details missing_what_happens_next share_preview_not_completed])
938+
expect(form.all_incomplete_tasks).to match_array(%i[missing_pages missing_submission_email missing_privacy_policy_url missing_contact_details missing_what_happens_next share_preview_not_completed])
915939
end
916940
end
917941
end
@@ -975,6 +999,8 @@
975999
task_status_service = instance_double(TaskStatusService)
9761000
allow(TaskStatusService).to receive(:new).and_return(task_status_service)
9771001
allow(task_status_service).to receive(:mandatory_tasks_completed?).and_return(mandatory_tasks_completed)
1002+
1003+
form.set_task_status_service(task_status_service)
9781004
end
9791005

9801006
context "when not all mandatory tasks have been completed" do
@@ -998,6 +1024,10 @@
9981024
let(:group) { create :group }
9991025
let(:completed_form) { build :form, :live, :with_group, group: }
10001026

1027+
before do
1028+
completed_form.set_task_status_service(TaskStatusService.new(form: completed_form))
1029+
end
1030+
10011031
it "returns a hash with each of the task statuses" do
10021032
expected_hash = {
10031033
name_status: :completed,

spec/requests/forms/make_live_controller_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
let(:group_role) { :group_admin }
1212
let(:group) { create(:group, organisation:, status: :active) }
1313

14+
before do
15+
form.set_task_status_service(TaskStatusService.new(form:))
16+
end
17+
1418
describe "#new" do
1519
before do
1620
Membership.create!(group_id: group.id, user:, added_by: user, role: group_role)

spec/services/make_form_live_service_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
let(:live_form_document) { current_form.live_form_document }
77
let(:current_user) { build :user }
88

9+
before do
10+
current_form.set_task_status_service(TaskStatusService.new(form: current_form))
11+
end
12+
913
describe "#make_live" do
1014
it "makes the form live" do
1115
expect {

spec/services/org_admin_alerts_service_spec.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
before do
1212
GroupForm.create!(form: form, group:)
13+
form.set_task_status_service(TaskStatusService.new(form:))
1314
end
1415

1516
describe "#form_made_live" do

spec/services/step_summary_card_service_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
let(:pages) { form.pages }
1515

16+
before do
17+
form.set_task_status_service(TaskStatusService.new(form:))
18+
end
19+
1620
describe "#all_options_for_answer_type" do
1721
context "with uk and international address" do
1822
let(:page) { create :page, :with_address_settings, form:, uk_address: "true", international_address: "true" }

spec/services/step_summary_table_service_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
let(:form_document_step) { FormDocument::Step.new(page.as_form_document_step(nil)) }
1616
let(:welsh_form_document) { FormDocument::Content.from_form_document(form.live_welsh_form_document) }
1717

18+
before do
19+
form.set_task_status_service(TaskStatusService.new(form:))
20+
end
21+
1822
def create_form(attributes = {})
1923
default_attributes = {
2024
id: 1,

0 commit comments

Comments
 (0)