diff --git a/app/controllers/forms/make_language_live_controller.rb b/app/controllers/forms/make_language_live_controller.rb new file mode 100644 index 0000000000..e28298f32f --- /dev/null +++ b/app/controllers/forms/make_language_live_controller.rb @@ -0,0 +1,75 @@ +module Forms + class MakeLanguageLiveController < FormsController + def new + authorize current_form, :can_make_language_live? + return redirect_to form_path(form_id: current_form.id) unless current_form.can_make_language_live?(language: params[:language]) + + @make_language_live_input = MakeLiveInput.new(form: current_form) + + render_new + end + + def create + authorize current_form, :can_make_language_live? + + @make_language_live_input = MakeLiveInput.new(**make_language_live_input_params) + + return redirect_to form_path(@make_language_live_input.form.id) unless @make_language_live_input.confirmed? + return render_new(status: :unprocessable_content) unless @make_language_live_input.valid? + + return redirect_to form_path(form_id: current_form.id) unless current_form.can_make_language_live?(language: params[:language]) + + @make_form_live_service = MakeFormLiveService.call(current_form:, current_user:, language: params[:language]) + @make_form_live_service.make_language_live + + if current_form.state_previously_changed? + OrgAdminAlertsService.new(form: current_form, current_user:).form_made_live + end + + @go_to_make_welsh_live_input = GoToMakeWelshLiveInput.new + + redirect_to make_language_live_show_confirmation_path + end + + def show_confirmation + authorize current_form, :can_make_language_live? + + @make_form_live_service = MakeFormLiveService.call(current_form:, current_user:, language: params[:language]) + + @go_to_make_welsh_live_input = GoToMakeWelshLiveInput.new + + render "confirmation", locals: { + current_form:, + confirmation_page_title: @make_form_live_service.page_title, + confirmation_page_body: @make_form_live_service.confirmation_page_body, + language: params[:language], + } + end + + def submit_confirmation + authorize current_form, :can_make_language_live? + + @go_to_make_welsh_live_input = GoToMakeWelshLiveInput.new(**go_to_make_welsh_live_input_params) + + if @go_to_make_welsh_live_input.confirmed? + redirect_to make_language_live_path(language: "cy") + else + redirect_to form_path + end + end + + private + + def make_language_live_input_params + params.require(:forms_make_live_input).permit(:confirm).merge(form: current_form) + end + + def render_new(status: :ok) + render "new", status:, locals: { current_form:, language: params[:language] } + end + + def go_to_make_welsh_live_input_params + params.require(:forms_go_to_make_welsh_live_input).permit(:confirm) + end + end +end diff --git a/app/input_objects/forms/go_to_make_welsh_live_input.rb b/app/input_objects/forms/go_to_make_welsh_live_input.rb new file mode 100644 index 0000000000..db8e29eba0 --- /dev/null +++ b/app/input_objects/forms/go_to_make_welsh_live_input.rb @@ -0,0 +1,2 @@ +class Forms::GoToMakeWelshLiveInput < ConfirmActionInput +end diff --git a/app/models/form.rb b/app/models/form.rb index 17ec9007e8..6f5597c70e 100644 --- a/app/models/form.rb +++ b/app/models/form.rb @@ -218,6 +218,12 @@ def draft_created?(previous_state) (previous_state.to_sym == :archived && archived_with_draft?) end + def can_make_language_live?(language:) + return can_make_english_version_live? if language == "en" + + can_make_welsh_version_live? if language == "cy" + end + private def set_external_id @@ -268,6 +274,30 @@ def after_make_live FormDocumentSyncService.new(self).synchronize_live_form end + def before_make_english_live + before_make_live + end + + def after_make_english_live + FormDocumentSyncService.new(self).synchronize_live_english_form + end + + def before_make_welsh_live + before_make_live + end + + def after_make_welsh_live + FormDocumentSyncService.new(self).synchronize_live_welsh_form + end + + def can_make_english_version_live? + draft? && ready_for_live && live_form_document.blank? && live_welsh_form_document.blank? + end + + def can_make_welsh_version_live? + has_live_version && ready_for_live && live_form_document.present? && live_welsh_form_document.blank? + end + def after_archive FormDocumentSyncService.new(self).synchronize_archived_form end diff --git a/app/policies/form_policy.rb b/app/policies/form_policy.rb index 08180523b1..0eef301806 100644 --- a/app/policies/form_policy.rb +++ b/app/policies/form_policy.rb @@ -30,6 +30,12 @@ def can_make_form_live? false end + def can_make_language_live? + return can_view_form? if form.group&.active? && can_administer_group? + + false + end + def can_administer_group? user.super_admin? || user.is_organisations_admin?(form.group&.organisation) || user.is_group_admin?(form.group) end diff --git a/app/services/form_document_sync_service.rb b/app/services/form_document_sync_service.rb index 715d36465b..1760be2f57 100644 --- a/app/services/form_document_sync_service.rb +++ b/app/services/form_document_sync_service.rb @@ -52,6 +52,44 @@ def synchronize_archived_welsh_form end end + def synchronize_live_english_form + FormDocument.transaction do + # Ensure we only make English version live if there is no existing live Welsh version + raise ActiveRecord::RecordNotFound, "Cannot make English version live if there is already a live Welsh version." if FormDocument.where(form:, tag: LIVE_TAG, language: "cy").exists? + + content = form_content("en", live_at: form.updated_at) + update_or_create_form_document(LIVE_TAG, content, "en") + + # Update the content of the live English version to to not include Welsh in available_languages + FormDocument.where(form:, tag: [LIVE_TAG], language: "en").find_each do |live_document| + live_document.content["available_languages"] = %w[en] + live_document.save! + end + + # A new live version replaces any previous archived version + delete_form_documents_by_tag(ARCHIVED_TAG) + end + end + + def synchronize_live_welsh_form + FormDocument.transaction do + # Ensure we only make Welsh version live if there is already an existing live English version + raise ActiveRecord::RecordNotFound, "Cannot make Welsh version live unless there is already a live English version." unless FormDocument.where(form:, tag: LIVE_TAG, language: "en").exists? + + content = form_content("cy", live_at: form.updated_at) + update_or_create_form_document(LIVE_TAG, content, "cy") + + # Update the content of the live English version to show that it now supports Welsh + FormDocument.where(form:, tag: [LIVE_TAG], language: "en").find_each do |live_document| + live_document.content["available_languages"] = %w[en cy] + live_document.save! + end + + # A new live version replaces any previous archived version + delete_form_documents_by_tag(ARCHIVED_TAG) + end + end + def update_draft_form_document synchronize_documents_for_tag(DRAFT_TAG) end @@ -79,6 +117,7 @@ def update_or_create_form_document(tag, content, language) language:, ) form_document.content = content + form_document.save! end diff --git a/app/services/make_form_live_service.rb b/app/services/make_form_live_service.rb index 497e9da8fe..3a2b6dd617 100644 --- a/app/services/make_form_live_service.rb +++ b/app/services/make_form_live_service.rb @@ -5,12 +5,13 @@ def call(**args) end end - def initialize(current_form:, current_user:) + def initialize(current_form:, current_user:, language: nil) @current_form = current_form @current_form_was_live = current_form.is_live? @current_form_was_archived = current_form.is_archived? @current_live_form = FormDocument::Content.from_form_document(current_form.live_form_document) if current_form.is_live? @current_user = current_user + @language = language end def make_live @@ -26,9 +27,19 @@ def make_live end end + def make_language_live + if @language == "en" + make_english_live + else + make_welsh_live + end + end + def page_title return I18n.t("page_titles.your_form_is_live") if @current_form_was_archived return I18n.t("page_titles.your_changes_are_live") if @current_form_was_live + return I18n.t("page_titles.your_english_form_is_live") if @language == "en" + return I18n.t("page_titles.your_welsh_form_is_live") if @language == "cy" I18n.t("page_titles.your_form_is_live") end @@ -37,6 +48,7 @@ def confirmation_page_body return I18n.t("make_changes_live.confirmation.body_html_cy").html_safe if @current_form_was_live && @current_form.has_welsh_translation? return I18n.t("make_changes_live.confirmation.body_html").html_safe if @current_form_was_live + return I18n.t("make_live.confirmation.body_individual_language_html").html_safe if @language.present? return I18n.t("make_live.confirmation.body_html_cy").html_safe if @current_form.has_welsh_translation? I18n.t("make_live.confirmation.body_html").html_safe @@ -44,6 +56,14 @@ def confirmation_page_body private + def make_english_live + @current_form.make_english_version_live! + end + + def make_welsh_live + @current_form.make_welsh_version_live! + end + def live_form_submission_email_has_changed @current_form_was_live && @current_live_form.submission_email != @current_form.submission_email end diff --git a/app/state_machines/form_state_machine.rb b/app/state_machines/form_state_machine.rb index 90c51c399d..6b33f0b095 100644 --- a/app/state_machines/form_state_machine.rb +++ b/app/state_machines/form_state_machine.rb @@ -33,6 +33,20 @@ module FormStateMachine transitions from: %i[draft live_with_draft archived archived_with_draft], to: :live, guard: :ready_for_live end + event :make_english_version_live do + before :before_make_english_live + after :after_make_english_live + + transitions from: %i[draft live live_with_draft], to: :live, guard: :can_make_english_version_live? + end + + event :make_welsh_version_live do + before :before_make_welsh_live + after :after_make_welsh_live + + transitions from: %i[live live_with_draft], to: :live, guard: :can_make_welsh_version_live? + end + event :create_draft_from_live_form do after :after_create_draft diff --git a/app/views/forms/make_language_live/confirmation.html.erb b/app/views/forms/make_language_live/confirmation.html.erb new file mode 100644 index 0000000000..ff92cce879 --- /dev/null +++ b/app/views/forms/make_language_live/confirmation.html.erb @@ -0,0 +1,54 @@ +<% set_page_title(confirmation_page_title) %> + +
+
+ <%= govuk_panel(title_text: confirmation_page_title) %> + + <%= confirmation_page_body %> + + <% if language == "en" %> +

<%= t('make_live.confirmation.form_name_en') %>

+ +

<%= current_form.name %>

+ <% end %> + + <% if language == "cy" %> +

<%= t('make_live.confirmation.form_name_cy') %>

+ +

<%= current_form.name_cy %>

+ <% end %> + + <% if language == "en" %> + <%= render FormUrlComponent::View.new( + runner_link: link_to_runner(Settings.forms_runner.url, current_form.id, current_form.form_slug, mode: :live), + heading_text: t('make_live.confirmation.english_form_url'), + button_text: t('make_live.confirmation.copy_english_url_to_clipboard') + ) %> + <% end %> + + <% if language == "cy" %> + <%= render FormUrlComponent::View.new( + runner_link: link_to_runner(Settings.forms_runner.url, current_form.id, current_form.form_slug, mode: :live, locale: "cy"), + heading_text: t('make_live.confirmation.welsh_form_url'), + button_text: t('make_live.confirmation.copy_welsh_url_to_clipboard') + ) %> + <% end %> + +

+ <%= govuk_link_to t("make_live.confirmation.continue_link"), live_form_path(current_form.id) %> +

+ + <% if language == "en" %> + <% if current_form.welsh_completed %> + <%= form_with model: @go_to_make_welsh_live_input, url: make_language_live_submit_confirmation_path(form_id: current_form.id, language:) do |f| %> + <%= f.govuk_collection_radio_buttons :confirm, @go_to_make_welsh_live_input.values, :itself, legend: { size: 'm', tag: 'h2' }, bold_labels: false %> + <%= f.govuk_submit t("save_and_continue") %> + <% end %> + <% else %> +

+ <%= t("make_live.confirmation.back_to_draft_link_html", url: form_path(current_form.id)) %> +

+ <% end %> + <% end %> +
+
diff --git a/app/views/forms/make_language_live/new.html.erb b/app/views/forms/make_language_live/new.html.erb new file mode 100644 index 0000000000..be655c1248 --- /dev/null +++ b/app/views/forms/make_language_live/new.html.erb @@ -0,0 +1,25 @@ +<% set_page_title(title_with_error_prefix(t("page_titles.make_language_live.#{language}"), @make_language_live_input.errors.any?)) %> +<% content_for :back_link, govuk_back_link_to(form_path, t("back_link.form_create")) %> + +
+
+ <%= form_with(model: @make_language_live_input, url: make_language_live_create_path) do |f| %> + <% if @make_language_live_input&.errors&.any? %> + <%= f.govuk_error_summary %> + <% end %> + +

+ <%= @make_language_live_input.form.name %> + <%= t("page_titles.make_language_live.#{language}") %> +

+ + <%= t("make_language_live.#{language}.new.body_html", submission_email: @make_language_live_input.form.submission_email) %> + + <%= f.govuk_collection_radio_buttons :confirm, + @make_language_live_input.values, ->(option) { option }, ->(option) { t("helpers.label.confirm_action_input.options.#{option}") }, + legend: { text: t("helpers.label.forms_make_language_live_input.#{language}.confirm"), + size: 'm'}, inline: true %> + <%= f.govuk_submit t("save_and_continue") %> + <% end %> +
+
diff --git a/config/locales/en.yml b/config/locales/en.yml index 0247fb142a..e4b951b123 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -941,6 +941,11 @@ en: name: What is the name of your form? forms_make_changes_live: confirm: Are you sure you want to make your draft live? + forms_make_language_live_input: + cy: + confirm: Are you sure you want to make your Welsh form live? + en: + confirm: Are you sure you want to make your English form live? forms_make_live_input: confirm: Are you sure you want to make your form live? forms_submission_attachments_input: @@ -1170,8 +1175,22 @@ en: filling in the live form at the same time. They may lose any answers they have already provided and may need to start again. welsh_reminder: Remember to make sure that the English and Welsh versions of your form match. + make_language_live: + cy: + new: + body_html: | +

When you make your form live you’ll get a new URL for the Welsh version.

+

The form will not be indexed by search engines, so people will not be able to find it easily. Contact your GOV.UK publishing team to publish links to your form on GOV.UK so people can find it.

+

Completed forms will be sent to: %{submission_email}

+ en: + new: + body_html: | +

When you make your form live you’ll get a new URL for the English version.

+

The form will not be indexed by search engines, so people will not be able to find it easily. Contact your GOV.UK publishing team to publish links to your form on GOV.UK so people can find it.

+

Completed forms will be sent to: %{submission_email}

make_live: confirmation: + back_to_draft_link_html: Go back to your draft to edit the Welsh version and make it live. body_html: |

The form will not be indexed by search engines, so people will not be able to find it easily. @@ -1181,12 +1200,18 @@ en:

The form will not be indexed by search engines, so people will not be able to find it easily. Contact your GOV⁠.⁠UK publishing team to publish links to your form on GOV⁠.⁠UK so people can find it.

- continue_link: Continue to form details + body_individual_language_html: | +

+ The form will not be indexed by search engines, so people will not be able to find it easily. Contact your GOV.UK publishing team to publish links to your form on GOV.UK so people can find it. +

+ continue_link: Continue to the live form’s details copy_english_url_to_clipboard: Copy English URL to clipboard copy_welsh_url_to_clipboard: Copy Welsh URL to clipboard english_form: English form english_form_url: English form URL form_name: Form name + form_name_cy: Welsh form name + form_name_en: English form name welsh_form: Welsh form welsh_form_url: Welsh form URL new: @@ -1464,6 +1489,9 @@ en: maintenance: Sorry, the service is unavailable make_archived_draft_live: Make your form live again make_changes_live: Make your changes live + make_language_live: + cy: Make your Welsh form live + en: Make your English form live make_live: Make your form live make_your_changes_to_english_live: Make the changes to your English form live missing_draft_question: There’s a problem with this page @@ -1502,7 +1530,9 @@ en: welsh_translation: Add a Welsh version of your form what_happens_next: Add information about what happens next your_changes_are_live: Your changes are live + your_english_form_is_live: Your English form is live your_form_is_live: Your form is live + your_welsh_form_is_live: Your Welsh form is live pages: answer_settings: Answer settings change_order: diff --git a/config/locales/input_objects/go_to_make_welsh_live.yml b/config/locales/input_objects/go_to_make_welsh_live.yml new file mode 100644 index 0000000000..216ac32138 --- /dev/null +++ b/config/locales/input_objects/go_to_make_welsh_live.yml @@ -0,0 +1,18 @@ +--- +en: + activemodel: + errors: + models: + forms/go_to_make_welsh_live_input: + attributes: + confirm: + blank: Select ‘Yes’ if you want to make your Welsh form live + helpers: + label: + forms_go_to_make_welsh_live_input: + confirm_options: + 'no': No, I’ll do that later + 'yes': 'Yes' + legend: + forms_go_to_make_welsh_live_input: + confirm: Do you want to make your Welsh form live now? diff --git a/config/routes.rb b/config/routes.rb index 188c8da4b0..0a4fe5a4c9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -54,6 +54,10 @@ post "/privacy-policy" => "forms/privacy_policy#create" get "/make-live" => "forms/make_live#new", as: :make_live post "/make-live" => "forms/make_live#create", as: :make_live_create + get "/make-live/:language" => "forms/make_language_live#new", as: :make_language_live + post "/make-live/:language" => "forms/make_language_live#create", as: :make_language_live_create + get "/make-live/:language/success" => "forms/make_language_live#show_confirmation", as: :make_language_live_show_confirmation + post "/make-live/:language/success" => "forms/make_language_live#submit_confirmation", as: :make_language_live_submit_confirmation get "/unarchive" => "forms/unarchive#new", as: :unarchive post "/unarchive" => "forms/unarchive#create", as: :unarchive_create get "/what-happens-next" => "forms/what_happens_next#new", as: :what_happens_next diff --git a/spec/factories/models/forms.rb b/spec/factories/models/forms.rb index 158acb7454..282ea5b7a7 100644 --- a/spec/factories/models/forms.rb +++ b/spec/factories/models/forms.rb @@ -60,6 +60,7 @@ after(:build) do |form| link_pages_list(form.pages) if form.pages.present? + add_welsh_translations_to_pages(form.pages) if form.available_languages.include?("cy") end question_section_completed { true } @@ -150,8 +151,12 @@ trait :with_welsh_translation do available_languages { %w[en cy] } + welsh_completed { true } name_cy { name.prepend("Welsh ") } + privacy_policy_url_cy { "#{privacy_policy_url}/cy" } + support_email_cy { support_email } + what_happens_next_markdown_cy { "Fel arfer, rydym yn ymateb i geisiadau o fewn 10 diwrnod gwaith." } end end end @@ -163,3 +168,13 @@ def link_pages_list(pages) pages end + +def add_welsh_translations_to_pages(pages) + pages.each do |page| + if page.question_text_cy.blank? + page.question_text_cy = "Welsh #{page.question_text}" + end + end + + pages +end diff --git a/spec/input_objects/forms/go_to_make_welsh_live_input_spec.rb b/spec/input_objects/forms/go_to_make_welsh_live_input_spec.rb new file mode 100644 index 0000000000..2fe8b496e1 --- /dev/null +++ b/spec/input_objects/forms/go_to_make_welsh_live_input_spec.rb @@ -0,0 +1,12 @@ +require "rails_helper" + +RSpec.describe Forms::GoToMakeWelshLiveInput, type: :model do + it "is invalid if blank" do + confirm_archive_input = described_class.new(confirm: "") + confirm_archive_input.validate(:confirm) + + expect(confirm_archive_input.errors.full_messages_for(:confirm)).to include( + "Confirm Select ‘Yes’ if you want to make your Welsh form live", + ) + end +end diff --git a/spec/models/form_spec.rb b/spec/models/form_spec.rb index da811951c0..b92e0e1f3d 100644 --- a/spec/models/form_spec.rb +++ b/spec/models/form_spec.rb @@ -1432,4 +1432,178 @@ end end end + + describe "#can_make_language_live" do + let(:form) { create :form } + + context "when the language being checked is English" do + let(:language) { "en" } + + context "when the form is draft" do + context "when the form does not have all mandatory tasks completed" do + let(:form) { create :form } + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + + context "when the form has all mandatory tasks completed" do + let(:form) { create :form, :ready_for_live } + + context "when the form does not have a live English form document" do + context "when the form does not have a live Welsh form document" do + it "returns true" do + expect(form.can_make_language_live?(language:)).to be true + end + end + + context "when the form already has a live Welsh form document" do + before do + create :form_document, :live, form:, language: "cy", content: form.as_form_document + end + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + end + + context "when the form already has a live English form document" do + before do + create :form_document, :live, form:, language: "en", content: form.as_form_document + end + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + end + end + + context "when the form is live" do + context "when the form has all mandatory tasks completed" do + let(:form) { create :form, state: "live" } + + context "when the form does not have a live English form document" do + context "when the form does not have a live Welsh form document" do + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + + context "when the form already has a live Welsh form document" do + before do + create :form_document, :live, form:, language: "cy", content: form.as_form_document + end + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + end + + context "when the form already has a live English form document" do + before do + create :form_document, :live, form:, language: "en", content: form.as_form_document + end + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + end + end + end + + context "when the language being checked is Welsh" do + let(:language) { "cy" } + + context "when the form is draft" do + context "when the form does not have all mandatory tasks completed" do + let(:form) { create :form } + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + + context "when the form has all mandatory tasks completed" do + let(:form) { create :form, :ready_for_live } + + context "when the form does not have a live English form document" do + context "when the form does not have a live Welsh form document" do + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + + context "when the form already has a live Welsh form document" do + before do + create :form_document, :live, form:, language: "cy", content: form.as_form_document + end + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + end + + context "when the form already has a live English form document" do + before do + create :form_document, :live, form:, language: "en", content: form.as_form_document + end + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + end + end + + context "when the form is live" do + let(:form) { create :form, :ready_for_live, state: "live" } + + context "when the form does not have a live English form document" do + context "when the form does not have a live Welsh form document" do + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + + context "when the form already has a live Welsh form document" do + before do + create :form_document, :live, form:, language: "cy", content: form.as_form_document + end + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + end + + context "when the form already has a live English form document" do + before do + create :form_document, :live, form:, language: "en", content: form.as_form_document + end + + context "when the form does not have a live Welsh form document" do + it "returns true" do + expect(form.can_make_language_live?(language:)).to be true + end + end + + context "when the form already has a live Welsh form document" do + before do + create :form_document, :live, form:, language: "cy", content: form.as_form_document + end + + it "returns false" do + expect(form.can_make_language_live?(language:)).to be false + end + end + end + end + end + end end diff --git a/spec/policies/form_policy_spec.rb b/spec/policies/form_policy_spec.rb index b12b02d9c5..6227f1c3ef 100644 --- a/spec/policies/form_policy_spec.rb +++ b/spec/policies/form_policy_spec.rb @@ -105,6 +105,48 @@ end end + describe "#can_make_language_live?" do + context "with the groups feature enabled" do + let(:group_role) { :editor } + + before do + Membership.create!(user:, group:, added_by: user, role: group_role) + end + + context "and the group status is not active" do + let(:group_status) { :trial } + + it { is_expected.to forbid_action(:can_make_language_live) } + end + + context "and the group status is active" do + let(:group_status) { :active } + + context "and the user's role is super admin" do + let(:user) { build :super_admin_user, organisation: } + + it { is_expected.to permit_action(:can_make_language_live) } + end + + context "and the user is organisation admin for the group" do + let(:user) { build :organisation_admin_user, organisation: } + + it { is_expected.to permit_action(:can_make_language_live) } + end + + context "and the user's role within the group is group admin" do + let(:group_role) { :group_admin } + + it { is_expected.to permit_action(:can_make_language_live) } + end + + context "and the user's role within the group is editor" do + it { is_expected.to forbid_action(:can_make_language_live) } + end + end + end + end + describe "#can_add_page_routing_conditions?" do let(:form) { create :form } diff --git a/spec/requests/forms/make_language_live_controller_spec.rb b/spec/requests/forms/make_language_live_controller_spec.rb new file mode 100644 index 0000000000..1005afaef8 --- /dev/null +++ b/spec/requests/forms/make_language_live_controller_spec.rb @@ -0,0 +1,214 @@ +require "rails_helper" + +RSpec.describe Forms::MakeLanguageLiveController, type: :request do + let(:user) { build :user, organisation: } + let(:form) { create(:form, :ready_for_live) } + let(:id) { form.id } + let(:language) { "en" } + + let(:form_params) { nil } + + let(:organisation) { test_org } + let(:group_role) { :group_admin } + let(:group) { create(:group, organisation:, status: :active) } + + describe "#new" do + before do + Membership.create!(group_id: group.id, user:, added_by: user, role: group_role) + GroupForm.create!(form_id: form.id, group_id: group.id) + + login_as user + end + + it "renders make your form live" do + get make_language_live_path(form_id: form.id, language:) + expect(response).to render_template("make_language_live/new") + expect(response).to have_http_status(:ok) + end + + context "when editing a draft of an existing live form" do + let(:form) { create(:form, :live) } + + it "redirects to the form task list" do + get make_language_live_path(form_id: form.id, language:) + expect(response).to redirect_to(form_path(form_id: form.id)) + end + end + + context "when editing a draft of an archived form" do + let(:form) { create(:form, :archived_with_draft) } + + it "redirects to the form task list" do + get make_language_live_path(form_id: form.id, language:) + expect(response).to redirect_to(form_path(form_id: form.id)) + end + end + + context "when current user is not a group admin" do + let(:group_role) { :editor } + + it "is forbidden" do + get make_language_live_path(form_id: form.id, language:) + expect(response).to have_http_status(:forbidden) + end + end + end + + describe "#create" do + before do + Membership.create!(group_id: group.id, user:, added_by: user, role: group_role) + GroupForm.create!(form_id: form.id, group_id: group.id) + create(:organisation_admin_user, organisation:) + + login_as user + end + + context "when making a form live" do + let(:form_params) { { forms_make_live_input: { confirm: :yes, form: } } } + + context "when the language being made live is English" do + let(:language) { "en" } + + context "and the form has not been made live before" do + it "redirects to the confirmation page" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + expect(response).to redirect_to(make_language_live_show_confirmation_path(form_id: form.id, language:)) + end + + it "creates an English FormDocument and makes the form live" do + expect { + post(make_language_live_path(form_id: form.id, language:), params: form_params) + }.to change { FormDocument.where(language:).count }.by(1) + .and change { form.reload.state }.to("live") + end + + it "sets the English FormDocument's live_at time to be equal to the form's updated_at time" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + expect(FormDocument.find_by(form_id: form.id, tag: "live", language:)["content"]["live_at"]).to eq form.reload.updated_at.strftime("%Y-%m-%dT%H:%M:%S.%6NZ") + end + + it "sends an email to the organisation admins" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + expect(ActionMailer::Base.deliveries.count).to eq(1) + + template_id = Settings.govuk_notify.admin_alerts.new_draft_form_made_live_template_id + expect(ActionMailer::Base.deliveries.last.govuk_notify_template).to eq(template_id) + end + end + + context "and the form already has a live English form document" do + let(:form) { create(:form, :live) } + + it "redirects to the form task list" do + get make_language_live_path(form_id: form.id, language:) + expect(response).to redirect_to(form_path(form_id: form.id)) + end + end + + context "and the form already has a live Welsh form document" do + subject(:form) { create :form, :live, :with_welsh_translation } + + it "redirects to the form task list" do + get make_language_live_path(form_id: form.id, language:) + expect(response).to redirect_to(form_path(form_id: form.id)) + end + end + end + + context "when the language being made live is Welsh" do + let(:language) { "cy" } + + context "and the form has not been made live before" do + it "redirects to the form task list" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + expect(response).to redirect_to(form_path(form_id: form.id)) + end + end + + context "and the form already has a live English form document" do + before do + post(make_language_live_path(form_id: form.id, language: "en"), params: form_params) + end + + it "redirects to the confirmation page" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + expect(response).to redirect_to(make_language_live_show_confirmation_path(form_id: form.id, language:)) + end + + it "creates an English FormDocument and makes the form live" do + expect { + post(make_language_live_path(form_id: form.id, language:), params: form_params) + }.to change { FormDocument.where(language:).count }.by(1) + end + + it "sets the English FormDocument's live_at time to be equal to the form's updated_at time" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + expect(FormDocument.find_by(form_id: form.id, tag: "live", language:)["content"]["live_at"]).to eq form.reload.updated_at.strftime("%Y-%m-%dT%H:%M:%S.%6NZ") + end + end + + context "and the form already has a live Welsh form document" do + subject(:form) { create :form, :live, :with_welsh_translation } + + it "redirects to the form task list" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + expect(response).to redirect_to(form_path(form_id: form.id)) + end + end + end + end + + context "when deciding not to make a form live" do + let(:form_params) { { forms_make_live_input: { confirm: :no } } } + + before do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + end + + it "does not make the form live" do + expect(form.reload.draft?).to be true + end + + it "redirects you to the form page" do + expect(response).to redirect_to(form_path(form.id)) + end + + it "does not send an email to the organisation admins" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + end + + context "when all tasks are not complete" do + let(:form) { create(:form, :missing_pages) } + let(:form_params) { { forms_make_live_input: { confirm: "yes", form: } } } + + before do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + end + + it "returns 422" do + expect(response).to have_http_status(:unprocessable_content) + end + + it "does not make the form live" do + expect(form.reload.draft?).to be true + end + + it "re-renders the page with an error" do + expect(response).to render_template("new") + expect(response.body).to include("You cannot make your form live because you have not finished adding questions.") + end + end + + context "when current user is not a group admin" do + let(:group_role) { :editor } + + it "is forbidden" do + post(make_language_live_path(form_id: form.id, language:), params: form_params) + + expect(response).to have_http_status(:forbidden) + end + end + end +end diff --git a/spec/services/form_document_sync_service_spec.rb b/spec/services/form_document_sync_service_spec.rb index 8d8702a1ec..cdb99f71ea 100644 --- a/spec/services/form_document_sync_service_spec.rb +++ b/spec/services/form_document_sync_service_spec.rb @@ -78,7 +78,7 @@ expect(FormDocument.where(form:, tag: "draft", language: "cy")).to exist end - context "and the English form fails to save" do + context "and the Welsh form fails to save" do before do allow(service).to receive(:update_or_create_form_document).and_call_original # saving welsh form fails @@ -296,4 +296,192 @@ end end end + + describe "#synchronize_live_english_form" do + let!(:form) { create(:form, state: "live") } + let(:expected_live_at) { form.reload.updated_at.as_json } + + context "when there is no existing form document" do + it "creates a live form document" do + expect { + service.synchronize_live_english_form + }.to change(FormDocument, :count).by(1) + + expect(FormDocument.last).to have_attributes(form:, tag: "live", content: form.as_form_document(live_at: expected_live_at)) + end + end + + context "when there is an existing live form document" do + let!(:form_document) { create :form_document, :live, form:, content: form.as_form_document } + + it "updates the live form document" do + new_name = "new name" + form.name = new_name + expect { + service.synchronize_live_english_form + }.to change { form_document.reload.content["name"] }.to(new_name) + end + + it "updates the live_at date in the form document" do + service.synchronize_live_english_form + expect(FormDocument.last["content"]).to include("live_at" => form.reload.updated_at.as_json) + end + end + + context "when there is an existing archived form document" do + before do + create :form_document, :archived, form: + end + + it "destroys the archived form document" do + expect { + service.synchronize_live_english_form + }.to(change { FormDocument.exists?(form:, tag: "archived") }.from(true).to(false)) + end + + it "creates the live form document" do + expect { + service.synchronize_live_english_form + }.to(change { FormDocument.exists?(form:, tag: "live") }.from(false).to(true)) + end + + context "and deleting the archived FormDocument fails" do + before do + allow(service).to receive(:delete_form_documents_by_tag).with(FormDocumentSyncService::ARCHIVED_TAG) + .and_raise(ActiveRecord::StatementInvalid) + end + + it "does not create the live FormDocument" do + expect { + service.synchronize_live_english_form + }.to raise_error(ActiveRecord::StatementInvalid).and not_change(FormDocument, :count) + end + end + end + + context "when the form has welsh translations" do + let(:form) { create(:form, state: "live", available_languages: %w[en cy]) } + + it "only creates a live English form document" do + expect { + service.synchronize_live_english_form + }.to change { FormDocument.where(form:, tag: "live", language: "en").count }.by(1) + + expect(FormDocument.where(form:, tag: "live", language: "en")).to exist + expect(FormDocument.where(form:, tag: "live", language: "en").first.content["available_languages"]).to eq %w[en] + expect(FormDocument.where(form:, tag: "live", language: "cy")).not_to exist + end + + context "and the English form fails to save" do + before do + allow(service).to receive(:update_or_create_form_document) + .with("live", anything, "en") + .and_raise(ActiveRecord::RecordInvalid.new(form), "simulated FormDocument saving error") + end + + it "does not create any FormDocuments" do + expect { + service.synchronize_live_english_form + }.to raise_error(ActiveRecord::RecordInvalid).and not_change(FormDocument, :count) + end + end + end + + context "when there is already a live Welsh form document" do + before do + create :form_document, :live, form:, language: "cy", content: { "available_languages" => %w[en cy] } + end + + it "does not create any FormDocuments" do + expect { + service.synchronize_live_english_form + }.to raise_error(ActiveRecord::RecordNotFound).and not_change(FormDocument, :count) + end + end + end + + describe "#synchronize_live_welsh_form" do + let!(:form) { create(:form, :with_welsh_translation, :ready_for_live, state: "live") } + let(:expected_live_at) { form.reload.updated_at.as_json } + let(:welsh_form_content) do + Mobility.with_locale(:cy) do + form.as_form_document(live_at: expected_live_at, language: :cy) + end + end + + context "when there is a live English form document" do + before do + create :form_document, :live, form:, language: "en", content: { "available_languages" => %w[en] } + end + + context "when there is no existing Welsh form document" do + it "only creates a live Welsh form document" do + expect { + service.synchronize_live_welsh_form + }.to change { FormDocument.where(form:, tag: "live", language: "cy").count }.by(1) + .and(not_change { FormDocument.where(form:, tag: "live", language: "en").count }) + + welsh_form_document = FormDocument.where(form:, tag: "live", language: "cy").first + expect(welsh_form_document.content["available_languages"]).to eq %w[en cy] + expect(welsh_form_document).to have_attributes(form:, tag: "live", content: welsh_form_content) + end + end + + context "when there is an existing live Welsh form document" do + let!(:form_document) { create :form_document, :live, form:, language: "cy", content: welsh_form_content } + + it "updates the live form document" do + new_name = "new name" + form.name_cy = new_name + expect { + service.synchronize_live_welsh_form + }.to change { form_document.reload.content["name"] }.to(new_name) + end + + it "updates the live_at date in the form document" do + service.synchronize_live_welsh_form + expect(FormDocument.last["content"]).to include("live_at" => form.reload.updated_at.as_json) + end + end + + context "when there is an existing archived form document" do + before do + create :form_document, :archived, form:, language: "cy" + end + + it "destroys the archived form document" do + expect { + service.synchronize_live_welsh_form + }.to(change { FormDocument.exists?(form:, tag: "archived", language: "cy") }.from(true).to(false)) + end + + it "creates the live form document" do + expect { + service.synchronize_live_welsh_form + }.to(change { FormDocument.exists?(form:, tag: "live", language: "cy") }.from(false).to(true)) + end + + context "and deleting the archived FormDocument fails" do + before do + allow(service).to receive(:delete_form_documents_by_tag).with(FormDocumentSyncService::ARCHIVED_TAG) + .and_raise(ActiveRecord::StatementInvalid) + end + + it "does not create the live FormDocument" do + expect { + service.synchronize_live_welsh_form + }.to raise_error(ActiveRecord::StatementInvalid).and not_change(FormDocument, :count) + end + end + end + end + + context "when there is no live English form document" do + it "does not create any FormDocuments" do + expect { + service.synchronize_live_welsh_form + }.to raise_error(ActiveRecord::RecordNotFound).and not_change(FormDocument, :count) + end + end + end end diff --git a/spec/services/make_form_live_service_spec.rb b/spec/services/make_form_live_service_spec.rb index 9cc29cdc00..143f0a353e 100644 --- a/spec/services/make_form_live_service_spec.rb +++ b/spec/services/make_form_live_service_spec.rb @@ -1,7 +1,8 @@ require "rails_helper" describe MakeFormLiveService do - let(:make_form_live_service) { described_class.call(current_form:, current_user:) } + subject(:make_form_live_service) { described_class.call(current_form:, current_user:) } + let(:current_form) { create :form, :ready_for_live } let(:live_form_document) { current_form.live_form_document } let(:current_user) { build :user } @@ -49,6 +50,49 @@ end end + describe "#make_language_live" do + subject(:make_form_live_service) { described_class.call(current_form:, current_user:, language:) } + + context "when the language being made live is English" do + let(:language) { "en" } + + context "when the form is a draft" do + it "makes the English form live" do + expect { + make_form_live_service.make_language_live + }.to change(current_form, :state).to("live") + .and change(FormDocument.where(form: current_form, tag: "live", language: "en"), :count).by(1) + .and not_change(FormDocument.where(form: current_form, tag: "live", language: "cy"), :count) + end + + it "does not call the SubmissionEmailMailer" do + expect(SubmissionEmailMailer).not_to receive(:alert_email_change) + make_form_live_service.make_language_live + end + end + end + + context "when the language being made live is Welsh" do + let(:language) { "cy" } + + context "when the form has a live English version" do + let(:current_form) { create :form, :live } + + it "makes the Welsh form live" do + expect { + make_form_live_service.make_language_live + }.to change(FormDocument.where(form: current_form, tag: "live", language: "cy"), :count).by(1) + .and not_change(FormDocument.where(form: current_form, tag: "live", language: "en"), :count) + end + + it "does not call the SubmissionEmailMailer" do + expect(SubmissionEmailMailer).not_to receive(:alert_email_change) + make_form_live_service.make_language_live + end + end + end + end + describe "#page_title" do before do make_form_live_service.make_live diff --git a/spec/state_machines/form_state_machine_spec.rb b/spec/state_machines/form_state_machine_spec.rb index e3abe76476..9b650ce48d 100644 --- a/spec/state_machines/form_state_machine_spec.rb +++ b/spec/state_machines/form_state_machine_spec.rb @@ -7,9 +7,15 @@ class FakeForm < ApplicationRecord # stub the expected interface def ready_for_live; end + def can_make_english_version_live?; end + def can_make_welsh_version_live?; end def after_create_draft; end def before_make_live; end + def before_make_english_live; end + def before_make_welsh_live; end def after_make_live; end + def after_make_english_live; end + def after_make_welsh_live; end def after_archive; end end @@ -105,6 +111,200 @@ def after_archive; end end end + describe ".make_english_version_live" do + shared_examples "transition to live state" do |form_state| + before do + allow(form).to receive_messages(can_make_english_version_live?: true, before_make_english_live: nil, after_make_english_live: nil) + end + + it "transitions to live state" do + expect(form).to transition_from(form_state).to(:live).on_event(:make_english_version_live) + end + + it "calls the before_make_english_live callback" do + form.make_english_version_live + expect(form).to have_received(:before_make_english_live) + end + + it "calls the after_make_english_live callback" do + form.make_english_version_live + expect(form).to have_received(:after_make_english_live) + end + end + + context "when form is draft" do + let(:form) { FakeForm.new(state: :draft) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:draft).to(:live).on_event(:make_english_version_live) + end + + context "when all sections are completed" do + it_behaves_like "transition to live state", :draft + end + end + + context "when form is live" do + let(:form) { FakeForm.new(state: :live) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:live).to(:live).on_event(:make_english_version_live) + end + + context "when all sections are completed" do + it_behaves_like "transition to live state", :live + end + end + + context "when form is live_with_draft" do + let(:form) { FakeForm.new(state: :live_with_draft) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:live_with_draft).to(:live).on_event(:make_english_version_live) + end + + context "when all sections are completed" do + it_behaves_like "transition to live state", :live_with_draft + end + end + + context "when form is archived" do + let(:form) { FakeForm.new(state: :archived) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:archived).to(:live).on_event(:make_english_version_live) + end + + context "when all sections are completed" do + before do + allow(form).to receive_messages(can_make_english_version_live?: true, before_make_english_live: nil, after_make_english_live: nil) + end + + it "does not transition to live state" do + expect(form).not_to transition_from(:archived).to(:live).on_event(:make_english_version_live) + end + end + end + + context "when form is archived_with_draft" do + let(:form) { FakeForm.new(state: :archived_with_draft) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:archived_with_draft).to(:live).on_event(:make_english_version_live) + end + + context "when all sections are completed" do + before do + allow(form).to receive_messages(can_make_english_version_live?: true, before_make_english_live: nil, after_make_english_live: nil) + end + + it "does not transition to live state" do + expect(form).not_to transition_from(:archived).to(:live).on_event(:make_english_version_live) + end + end + end + end + + describe ".make_welsh_version_live" do + shared_examples "transition to live state" do |form_state| + before do + allow(form).to receive_messages(can_make_welsh_version_live?: true, before_make_welsh_live: nil, after_make_welsh_live: nil) + end + + it "transitions to live state" do + expect(form).to transition_from(form_state).to(:live).on_event(:make_welsh_version_live) + end + + it "calls the before_make_welsh_live callback" do + form.make_welsh_version_live + expect(form).to have_received(:before_make_welsh_live) + end + + it "calls the after_make_welsh_live callback" do + form.make_welsh_version_live + expect(form).to have_received(:after_make_welsh_live) + end + end + + context "when form is draft" do + let(:form) { FakeForm.new(state: :draft) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:archived).to(:live).on_event(:make_welsh_version_live) + end + + context "when all sections are completed" do + before do + allow(form).to receive_messages(can_make_welsh_version_live?: true, before_make_welsh_live: nil, after_make_welsh_live: nil) + end + + it "does not transition to live state" do + expect(form).not_to transition_from(:archived).to(:live).on_event(:make_welsh_version_live) + end + end + end + + context "when form is live_with_draft" do + let(:form) { FakeForm.new(state: :live_with_draft) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:live_with_draft).to(:live).on_event(:make_welsh_version_live) + end + + context "when all sections are completed" do + it_behaves_like "transition to live state", :live_with_draft + end + end + + context "when form is live" do + let(:form) { FakeForm.new(state: :live) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:live).to(:live).on_event(:make_welsh_version_live) + end + + context "when all sections are completed" do + it_behaves_like "transition to live state", :live + end + end + + context "when form is archived" do + let(:form) { FakeForm.new(state: :archived) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:archived).to(:live).on_event(:make_welsh_version_live) + end + + context "when all sections are completed" do + before do + allow(form).to receive_messages(can_make_welsh_version_live?: true, before_make_welsh_live: nil, after_make_welsh_live: nil) + end + + it "does not transition to live state" do + expect(form).not_to transition_from(:archived).to(:live).on_event(:make_welsh_version_live) + end + end + end + + context "when form is archived_with_draft" do + let(:form) { FakeForm.new(state: :archived_with_draft) } + + it "does not transition to live state by default" do + expect(form).not_to transition_from(:archived_with_draft).to(:live).on_event(:make_welsh_version_live) + end + + context "when all sections are completed" do + before do + allow(form).to receive_messages(can_make_english_version_live?: true, before_make_english_live: nil, after_make_english_live: nil) + end + + it "does not transition to live state" do + expect(form).not_to transition_from(:archived).to(:live).on_event(:make_welsh_version_live) + end + end + end + end + describe ".create_draft_from_live_form" do let(:form) { FakeForm.new(state: :live) } diff --git a/spec/views/forms/_made_live_form.html.erb_spec.rb b/spec/views/forms/_made_live_form.html.erb_spec.rb index 0e33bb52af..acb28d505f 100644 --- a/spec/views/forms/_made_live_form.html.erb_spec.rb +++ b/spec/views/forms/_made_live_form.html.erb_spec.rb @@ -404,7 +404,8 @@ end context "when the form has a Welsh translation" do - let(:form_metadata) { create :form, :live, :with_welsh_translation, what_happens_next_markdown:, submission_type:, submission_format: } + let(:what_happens_next_markdown_cy) { "Os nad ydych wedi derbyn ymateb o fewn 5 diwrnod gwaith, [cysylltwch â’n tîm cymorth defnyddwyr](https://example.com)." } + let(:form_metadata) { create :form, :live, :with_welsh_translation, what_happens_next_markdown:, what_happens_next_markdown_cy:, submission_type:, submission_format: } let(:welsh_form_document) do form_document_content = FormDocument::Content.from_form_document(form_metadata.live_welsh_form_document) form_document_content.first_made_live_at = 1.week.ago @@ -439,7 +440,7 @@ expect(rendered).to have_css("th", text: "English content") expect(rendered).to include("

If you have not received a response within 5 working days, contact our user support team (opens in new tab).

") expect(rendered).to have_css("th", text: "Welsh content") - expect(rendered).to include("

If you have not received a response within 5 working days, contact our user support team (agor mewn tab newydd).

") + expect(rendered).to include("

Os nad ydych wedi derbyn ymateb o fewn 5 diwrnod gwaith, cysylltwch â’n tîm cymorth defnyddwyr (agor mewn tab newydd).

") end context "when the form has a declaration" do diff --git a/spec/views/forms/make_language_live/confirmation.html.erb_spec.rb b/spec/views/forms/make_language_live/confirmation.html.erb_spec.rb new file mode 100644 index 0000000000..5bc0cc2275 --- /dev/null +++ b/spec/views/forms/make_language_live/confirmation.html.erb_spec.rb @@ -0,0 +1,77 @@ +require "rails_helper" + +describe "forms/make_language_live/confirmation.html.erb" do + let(:has_welsh_translation) { false } + let(:welsh_completed) { false } + let(:go_to_make_welsh_live_input) { Forms::GoToMakeWelshLiveInput.new } + let(:current_form) { OpenStruct.new(id: 1, name: "Form 1", name_cy: "Ffurflen 1", form_slug: "form-1", has_welsh_translation?: has_welsh_translation, welsh_completed:) } + let(:language) { "en" } + + before do + assign(:go_to_make_welsh_live_input, go_to_make_welsh_live_input) + render template: "forms/make_language_live/confirmation", locals: { current_form:, confirmation_page_title: "Your form is live", confirmation_page_body: I18n.t("make_changes_live.confirmation.body_html").html_safe, language: } + end + + context "when the language made live was English" do + it "contains a confirmation panel with a title" do + expect(rendered).to have_css(".govuk-panel--confirmation h1", text: /Your form is live/) + end + + it "contains the URL of the live form" do + expect(rendered).to have_text("runner-host/form/1/form-1") + end + + it "contains a link to the live form details" do + expect(rendered).to have_link("Continue to the live form’s details", href: live_form_path(1)) + end + + it "displays form name as plain text" do + expect(rendered).to have_css("h2", text: "English form name") + expect(rendered).to have_css("p", text: "Form 1") + expect(rendered).not_to have_css(".govuk-summary-list") + end + + it "displays the Form URL heading and button text" do + expect(rendered).to have_css("h2", text: t("make_live.confirmation.english_form_url")) + expect(rendered).to have_css("[data-copy-button-text='#{t('make_live.confirmation.copy_english_url_to_clipboard')}']") + end + + context "when the form has a completed Welsh version" do + let(:has_welsh_translation) { true } + let(:welsh_completed) { true } + + it "renders radio buttons for making the draft changes live" do + expect(rendered).to have_css("legend", text: I18n.t("helpers.legend.forms_go_to_make_welsh_live_input.confirm")) + expect(rendered).to have_field(t("helpers.label.forms_go_to_make_welsh_live_input.confirm_options.yes"), type: "radio") + expect(rendered).to have_field(t("helpers.label.forms_go_to_make_welsh_live_input.confirm_options.no"), type: "radio") + end + end + end + + context "when the language made live was Welsh" do + let(:language) { "cy" } + + it "contains a confirmation panel with a title" do + expect(rendered).to have_css(".govuk-panel--confirmation h1", text: /Your form is live/) + end + + it "contains the URL of the live form" do + expect(rendered).to have_text("runner-host/form/1/form-1.cy") + end + + it "contains a link to the live form details" do + expect(rendered).to have_link("Continue to the live form’s details", href: live_form_path(1)) + end + + it "displays form name as plain text" do + expect(rendered).to have_css("h2", text: "Welsh form name") + expect(rendered).to have_css("p", text: "Ffurflen 1") + expect(rendered).not_to have_css(".govuk-summary-list") + end + + it "displays the Form URL heading and button text" do + expect(rendered).to have_css("h2", text: t("make_live.confirmation.welsh_form_url")) + expect(rendered).to have_css("[data-copy-button-text='#{t('make_live.confirmation.copy_welsh_url_to_clipboard')}']") + end + end +end diff --git a/spec/views/forms/make_language_live/new.html.erb_spec.rb b/spec/views/forms/make_language_live/new.html.erb_spec.rb new file mode 100644 index 0000000000..23ad8356aa --- /dev/null +++ b/spec/views/forms/make_language_live/new.html.erb_spec.rb @@ -0,0 +1,114 @@ +require "rails_helper" + +describe "forms/make_language_live/new.html.erb" do + let(:current_form) { OpenStruct.new(id: 1, name: "Form 1", form_slug: "form-1", submission_email: "example@example.gov.uk") } + let(:make_language_live_input) { Forms::MakeLiveInput.new(form: current_form) } + let(:language) { "en" } + + before do + assign(:make_language_live_input, make_language_live_input) + + without_partial_double_verification do + allow(view).to receive_messages(form_path: "/forms/1", make_language_live_create_path: "forms/1/make-live/#{language}") + end + end + + context "when there are no errors" do + before do + render template: "forms/make_language_live/new", locals: { current_form:, language: } + end + + context "when the language being made live is English" do + let(:language) { "en" } + + it "has the correct page title" do + expect(view.content_for(:title)).to eq t("page_titles.make_language_live.en") + end + + it "contains a heading" do + expect(rendered).to have_css("h1", text: t("page_titles.make_language_live.en")) + end + + it "contains the body text" do + expect(rendered).to include(t("make_language_live.en.new.body_html", submission_email: current_form.submission_email)) + end + + it "renders radio buttons for making the draft changes live" do + expect(rendered).to have_css("legend", text: I18n.t("helpers.label.forms_make_language_live_input.en.confirm")) + expect(rendered).to have_field("Yes", type: "radio") + expect(rendered).to have_field("No", type: "radio") + end + + it "renders a submit button" do + expect(rendered).to have_css("button", text: I18n.t("save_and_continue")) + end + end + + context "when the language being made live is Welsh" do + let(:language) { "cy" } + + it "has the correct page title" do + expect(view.content_for(:title)).to eq t("page_titles.make_language_live.cy") + end + + it "contains a heading" do + expect(rendered).to have_css("h1", text: t("page_titles.make_language_live.cy")) + end + + it "contains the body text" do + expect(rendered).to include(t("make_language_live.cy.new.body_html", submission_email: current_form.submission_email)) + end + + it "renders radio buttons for making the draft changes live" do + expect(rendered).to have_css("legend", text: I18n.t("helpers.label.forms_make_language_live_input.cy.confirm")) + expect(rendered).to have_field("Yes", type: "radio") + expect(rendered).to have_field("No", type: "radio") + end + + it "renders a submit button" do + expect(rendered).to have_css("button", text: I18n.t("save_and_continue")) + end + end + end + + context "when there are errors" do + before do + make_language_live_input.errors.add(:confirm, "An error") + + assign(:make_language_live_input, make_language_live_input) + render template: "forms/make_language_live/new", locals: { current_form:, language: } + end + + context "when the language being made live is English" do + let(:language) { "en" } + + it "displays the error summary" do + expect(rendered).to have_selector(".govuk-error-summary") + end + + it "displays an inline error message" do + expect(rendered).to have_css(".govuk-error-message") + end + + it "sets the page title with error prefix" do + expect(view.content_for(:title)).to eq(title_with_error_prefix(t("page_titles.make_language_live.en"), true)) + end + end + + context "when the language being made live is Welsh" do + let(:language) { "cy" } + + it "displays the error summary" do + expect(rendered).to have_selector(".govuk-error-summary") + end + + it "displays an inline error message" do + expect(rendered).to have_css(".govuk-error-message") + end + + it "sets the page title with error prefix" do + expect(view.content_for(:title)).to eq(title_with_error_prefix(t("page_titles.make_language_live.cy"), true)) + end + end + end +end diff --git a/spec/views/forms/make_live/confirmation.html.erb_spec.rb b/spec/views/forms/make_live/confirmation.html.erb_spec.rb index e585714c2a..1aa68f1b45 100644 --- a/spec/views/forms/make_live/confirmation.html.erb_spec.rb +++ b/spec/views/forms/make_live/confirmation.html.erb_spec.rb @@ -17,7 +17,7 @@ end it "contains a link to the live form details" do - expect(rendered).to have_link("Continue to form details", href: live_form_path(1)) + expect(rendered).to have_link("Continue to the live form’s details", href: live_form_path(1)) end context "when the form has a Welsh translation" do