Skip to content

Commit 8dd7751

Browse files
committed
Prevent making Welsh live if the form has draft changes
We need to prevent Welsh forms being made live if there are changes to the English draft since the form was made live. If we don't, it's possible for a user to: - make an English version of the form live - make a change to that English version (e.g. adding or deleting a question) - complete the Welsh translations for the form - make the Welsh version live without making the English changes live In this case the different language versions would be out of sync, as the English and Welsh form documents would be from before and after the change respectively. This would lead to unexpected behaviour for form fillers when switching languages.
1 parent 4e02643 commit 8dd7751

5 files changed

Lines changed: 73 additions & 11 deletions

File tree

app/models/form.rb

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,16 @@ def can_make_language_live?(language:)
232232
can_make_welsh_version_live? if language == "cy"
233233
end
234234

235+
def changed_from_live_version?(language:)
236+
live_document = language == "cy" ? live_welsh_form_document : live_form_document
237+
return false if live_document.blank?
238+
239+
ignored_keys = %w[live_at available_languages updated_at]
240+
return false if live_document.content.except(*ignored_keys) == as_form_document(language:).except(*ignored_keys)
241+
242+
true
243+
end
244+
235245
private
236246

237247
def set_external_id
@@ -296,7 +306,15 @@ def can_make_english_version_live?
296306
end
297307

298308
def can_make_welsh_version_live?
299-
has_live_version && all_ready_for_live? && welsh_completed? && live_form_document.present? && live_welsh_form_document.blank?
309+
english_version_has_been_made_live? && !changed_from_live_version?(language: "en") && welsh_version_ready? && live_welsh_form_document.blank?
310+
end
311+
312+
def english_version_has_been_made_live?
313+
has_live_version && live_form_document.present?
314+
end
315+
316+
def welsh_version_ready?
317+
all_ready_for_live? && welsh_completed?
300318
end
301319

302320
def after_archive

app/services/task_status_service.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ def make_live_status
142142
end
143143

144144
def make_only_english_live_status
145+
return :completed if @form.has_live_version && !@form.changed_from_live_version?(language: "en")
145146
return :not_started if @form.can_make_language_live?(language: "en")
146-
return :completed if @form.state == "live"
147147

148148
:cannot_start
149149
end

spec/models/form_spec.rb

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1644,7 +1644,7 @@
16441644
context "when the Welsh task is still in progress" do
16451645
let(:form) { create :form, :ready_for_live, :with_welsh_translation, state: "live", welsh_completed: false }
16461646

1647-
it "returns true" do
1647+
it "returns false" do
16481648
expect(form.can_make_language_live?(language:)).to be false
16491649
end
16501650
end
@@ -1655,6 +1655,36 @@
16551655
it "returns true" do
16561656
expect(form.can_make_language_live?(language:)).to be true
16571657
end
1658+
1659+
context "when there are changes which have not yet been made live on the English version" do
1660+
before do
1661+
form.name = "A new form name"
1662+
form.save_draft!
1663+
1664+
form.share_preview_completed = true
1665+
form.save_draft!
1666+
end
1667+
1668+
it "returns false" do
1669+
expect(form.can_make_language_live?(language:)).to be false
1670+
end
1671+
end
1672+
end
1673+
1674+
context "when the Welsh task has been completed since the English form was made live" do
1675+
let(:form) { create :form, :ready_for_live, :with_welsh_translation, state: "live", welsh_completed: false }
1676+
1677+
before do
1678+
form.welsh_completed = true
1679+
form.save_draft!
1680+
1681+
form.share_preview_completed = true
1682+
form.save_draft!
1683+
end
1684+
1685+
it "returns true" do
1686+
expect(form.can_make_language_live?(language:)).to be true
1687+
end
16581688
end
16591689
end
16601690

spec/services/make_form_live_service_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,10 @@
8080
let(:language) { "cy" }
8181

8282
context "when the form has a live English version" do
83-
let(:current_form) { create :form, :ready_for_live, :with_welsh_translation, state: "live" }
83+
let(:current_form) { create :form, :ready_for_live, :with_welsh_translation}
8484

8585
before do
86-
create :form_document, :live, form: current_form, language: "en", content: current_form.as_form_document
86+
current_form.make_english_version_live!
8787
end
8888

8989
it "makes the Welsh form live" do

spec/services/task_status_service_spec.rb

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -399,11 +399,13 @@
399399
describe "make_only_english_live_status" do
400400
let(:can_make_english_live) { false }
401401
let(:can_make_welsh_live) { false }
402+
let(:changed_from_live_version) { false }
402403

403404
let(:form) { build(:form, :with_group, group:) }
404405

405406
before do
406407
allow(form).to receive(:can_make_language_live?).with(language: "en").and_return(can_make_english_live)
408+
allow(form).to receive(:changed_from_live_version?).with(language: "en").and_return(changed_from_live_version)
407409
allow(form).to receive(:can_make_language_live?).with(language: "cy").and_return(can_make_welsh_live)
408410
end
409411

@@ -434,16 +436,28 @@
434436
end
435437
end
436438

437-
context "when the form is a draft" do
438-
let(:form) { build(:form, :ready_for_live, :with_group, group:) }
439+
context "when the form is live with draft" do
440+
let(:form) { build(:form, :live_with_draft, :with_group, group:) }
439441

440-
it "returns cannot_start" do
441-
expect(task_status_service.all_task_statuses[:make_only_english_live_status]).to eq :cannot_start
442+
context "when there are changes from the English form document" do
443+
let(:changed_from_live_version) { true }
444+
445+
it "returns cannot_start" do
446+
expect(task_status_service.all_task_statuses[:make_only_english_live_status]).to eq :cannot_start
447+
end
448+
end
449+
450+
context "when there are no changes from the English form document" do
451+
let(:changed_from_live_version) { false }
452+
453+
it "returns completed" do
454+
expect(task_status_service.all_task_statuses[:make_only_english_live_status]).to eq :completed
455+
end
442456
end
443457
end
444458

445-
context "when the form is live with draft" do
446-
let(:form) { build(:form, :live_with_draft, :with_group, group:) }
459+
context "when the form is a draft" do
460+
let(:form) { build(:form, :ready_for_live, :with_group, group:) }
447461

448462
it "returns cannot_start" do
449463
expect(task_status_service.all_task_statuses[:make_only_english_live_status]).to eq :cannot_start

0 commit comments

Comments
 (0)