Skip to content

Commit d8cbf7c

Browse files
authored
Merge pull request #1635 from alphagov/add-route-param-for-language
Add route parameter for localising forms
2 parents 4746515 + 1b4aa8c commit d8cbf7c

File tree

9 files changed

+103
-59
lines changed

9 files changed

+103
-59
lines changed

app/controllers/application_controller.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,15 @@ def locale
103103
end
104104

105105
def locale_param
106+
return nil if is_default_locale?(params[:locale])
107+
106108
params[:locale]
107109
end
110+
111+
def is_default_locale?(locale)
112+
return true if locale.nil?
113+
return true if locale.to_sym == I18n.default_locale
114+
115+
false
116+
end
108117
end

app/controllers/forms/base_controller.rb

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def mode
3636
end
3737

3838
def default_url_options
39-
{ mode: }
39+
{ mode:, locale: locale_param }
4040
end
4141

4242
def set_form
@@ -49,15 +49,5 @@ def set_form
4949

5050
raise ActiveResource::ResourceNotFound, "Not Found" unless @form.start_page
5151
end
52-
53-
def set_locale(&action)
54-
I18n.with_locale(locale, &action)
55-
end
56-
57-
def locale
58-
return @form.language if @form.present? && @form.respond_to?(:language)
59-
60-
I18n.default_locale
61-
end
6252
end
6353
end

app/views/layouts/base.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!DOCTYPE html>
2-
<html lang="en" class="govuk-template govuk-template--rebranded">
2+
<html lang="<%= locale %>" class="govuk-template govuk-template--rebranded">
33
<head>
44
<meta charset="utf-8">
55
<title><%= yield(:title) + " – GOV.UK" %></title>

config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
scope "/:mode", mode: /preview-draft|preview-archived|preview-live|form/ do
1919
get "/:form_id" => "forms/base#redirect_to_friendly_url_start", as: :form_id
20-
scope "/:form_id/:form_slug" do
20+
scope "/:form_id/:form_slug(.:locale)", constraints: { locale: /(en|cy)/ } do
2121
get "/" => "forms/base#redirect_to_friendly_url_start", as: :form
2222
get "/#{CheckYourAnswersStep::CHECK_YOUR_ANSWERS_PAGE_SLUG}" => "forms/check_your_answers#show", as: :check_your_answers
2323
post "/#{CheckYourAnswersStep::CHECK_YOUR_ANSWERS_PAGE_SLUG}" => "forms/check_your_answers#submit_answers", as: :form_submit_answers

spec/requests/forms/add_another_answer_controller_spec.rb

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,63 +40,70 @@
4040
end
4141

4242
describe "GET #show" do
43+
before do
44+
get add_another_answer_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: first_step_in_form.id)
45+
end
46+
4347
it "renders the show template" do
44-
get "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer"
4548
expect(response).to render_template(:show)
4649
end
4750

4851
it "assigns @rows" do
49-
get "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer"
5052
expect(assigns(:rows).count).to eq 2
5153
end
5254

5355
it "adds the change and remove links to each row" do
54-
get "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer"
5556
expect(assigns(:rows).first[:actions].first[:text]).to eq("Change")
5657
expect(assigns(:rows).first[:actions].second[:text]).to eq("Remove")
5758
expect(response.body).to include(form_remove_answer_path(form.id, form.form_slug, first_step_in_form.id, answer_index: 1, changing_existing_answer: nil))
5859
end
5960

6061
it "initializes @add_another_answer_input" do
61-
get "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer"
6262
expect(assigns(:add_another_answer_input)).to be_a(AddAnotherAnswerInput)
6363
end
6464
end
6565

6666
describe "POST #save" do
67+
before do
68+
post add_another_answer_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: first_step_in_form.id), params:
69+
end
70+
6771
context "with valid params" do
6872
context "when adding another answer" do
73+
let(:params) { { add_another_answer_input: { add_another_answer: "yes" } } }
74+
6975
it "redirects to first page to add another" do
70-
post "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer", params: { add_another_answer_input: { add_another_answer: "yes" } }
71-
expect(response).to redirect_to("/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/3")
76+
expect(response).to redirect_to(form_page_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: first_step_in_form.id, answer_index: 3))
7277
end
7378
end
7479

7580
context "when not adding another answer" do
81+
let(:params) { { add_another_answer_input: { add_another_answer: "no" } } }
82+
7683
it "redirects to next page" do
77-
post "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer", params: { add_another_answer_input: { add_another_answer: "no" } }
78-
expect(response).to redirect_to("/preview-draft/#{form.id}/#{form.form_slug}/#{second_step_in_form.id}")
84+
expect(response).to redirect_to(form_page_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: second_step_in_form.id))
7985
end
8086
end
8187
end
8288

8389
context "with invalid params" do
90+
let(:params) { { add_another_answer_input: { add_another_answer: "" } } }
91+
8492
it "renders the show template" do
85-
post "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer", params: { add_another_answer_input: { add_another_answer: "" } }
8693
expect(response).to render_template(:show)
8794
end
8895

8996
it "assigns @rows" do
90-
post "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer", params: { add_another_answer_input: { add_another_answer: "" } }
9197
expect(assigns(:rows).count).to be_present
9298
end
9399
end
94100

95101
context "with the maximum number of answers" do
96102
let(:stored_answers) { Array.new(RepeatableStep::MAX_ANSWERS) { |i| { text: i.to_s } } }
103+
let(:params) { { add_another_answer_input: { add_another_answer: "yes" } } }
97104

98105
it "renders the show template with an error" do
99-
post "/preview-draft/#{form.id}/#{form.form_slug}/#{first_step_in_form.id}/add-another-answer", params: { add_another_answer_input: { add_another_answer: "yes" } }
106+
post add_another_answer_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: first_step_in_form.id), params: { add_another_answer_input: { add_another_answer: "yes" } }
100107
expect(response).to render_template(:show)
101108
expect(response.body).to include("You cannot add another answer")
102109
end
@@ -106,13 +113,13 @@
106113
describe "redirect_if_not_repeating" do
107114
context "when step is not RepeatableStep" do
108115
it "redirects to form_page when not changing existing answer" do
109-
get "/preview-draft/#{form.id}/#{form.form_slug}/#{second_step_in_form.id}/add-another-answer"
110-
expect(response).to redirect_to("/preview-draft/#{form.id}/#{form.form_slug}/#{second_step_in_form.id}")
116+
get add_another_answer_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: second_step_in_form.id)
117+
expect(response).to redirect_to(form_page_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: second_step_in_form.id))
111118
end
112119

113120
it "redirects to form_change_answer_path when changing existing answer" do
114-
get "/preview-draft/#{form.id}/#{form.form_slug}/#{second_step_in_form.id}/add-another-answer/change"
115-
expect(response).to redirect_to("/preview-draft/#{form.id}/#{form.form_slug}/#{second_step_in_form.id}/change")
121+
get change_add_another_answer_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: second_step_in_form.id)
122+
expect(response).to redirect_to(form_change_answer_path(mode: "preview-draft", form_id: form.id, form_slug: form.form_slug, page_slug: second_step_in_form.id))
116123
end
117124
end
118125
end

spec/requests/forms/base_controller_spec.rb

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -358,23 +358,45 @@
358358
end
359359

360360
describe "locale" do
361+
let(:locale) { nil }
362+
361363
context "when getting a form page that exists" do
362364
before do
363-
get form_page_path(mode: "form", form_id: 2, form_slug: form_response_data.form_slug, page_slug: 1)
365+
get form_page_path(mode: "form", form_id: 2, form_slug: form_response_data.form_slug, page_slug: 1, locale:)
366+
end
367+
368+
context "when the locale param is not set" do
369+
it "renders content in English" do
370+
expect(response.body).to include(I18n.t("support_details.get_help_with_this_form"))
371+
end
372+
373+
it "renders links without the locale scope" do
374+
expect(response.body).to include(form_privacy_path(form_id: 2, form_slug: form_response_data.form_slug))
375+
end
364376
end
365377

366-
context "when the form is English" do
378+
context "when the locale param is set to English" do
379+
let(:locale) { "en" }
380+
367381
it "renders content in English" do
368382
expect(response.body).to include(I18n.t("support_details.get_help_with_this_form"))
369383
end
384+
385+
it "renders links with the default locale scope" do
386+
expect(response.body).to include(form_privacy_path(form_id: 2, form_slug: form_response_data.form_slug))
387+
end
370388
end
371389

372-
context "when the form is Welsh" do
373-
let(:language) { "cy" }
390+
context "when the locale param is set to Welsh" do
391+
let(:locale) { "cy" }
374392

375393
it "renders content in Welsh" do
376394
expect(response.body).to include(I18n.t("support_details.get_help_with_this_form", locale: :cy))
377395
end
396+
397+
it "renders links with the cy locale scope" do
398+
expect(response.body).to include(form_privacy_path(form_id: 2, form_slug: form_response_data.form_slug, locale: :cy))
399+
end
378400
end
379401

380402
context "when the language attribute is not set for the form" do
@@ -401,10 +423,22 @@
401423

402424
context "when getting a form page that doesn't exist" do
403425
before do
404-
get form_page_path(mode: "form", form_id: 2, form_slug: form_response_data.form_slug, page_slug: 42)
426+
get form_page_path(mode: "form", form_id: 2, form_slug: form_response_data.form_slug, page_slug: 42, locale:)
405427
end
406428

407-
context "when the form is English" do
429+
context "when the locale param is not set" do
430+
it "returns 404" do
431+
expect(response).to have_http_status(:not_found)
432+
end
433+
434+
it "renders the error page in English" do
435+
expect(response.body).to include(I18n.t("errors.not_found.title"))
436+
end
437+
end
438+
439+
context "when the locale param is set to English" do
440+
let(:locale) { "en" }
441+
408442
it "returns 404" do
409443
expect(response).to have_http_status(:not_found)
410444
end
@@ -414,8 +448,8 @@
414448
end
415449
end
416450

417-
context "when the form is Welsh" do
418-
let(:language) { "cy" }
451+
context "when the locale param is set to Welsh" do
452+
let(:locale) { "cy" }
419453

420454
it "returns 404" do
421455
expect(response).to have_http_status(:not_found)

spec/requests/forms/check_your_answers_controller_spec.rb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@
421421
before do
422422
travel_to frozen_time do
423423
perform_enqueued_jobs do
424-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
424+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
425425
end
426426
end
427427
end
@@ -453,7 +453,7 @@
453453
before do
454454
travel_to frozen_time do
455455
perform_enqueued_jobs do
456-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
456+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
457457
end
458458
end
459459
end
@@ -483,7 +483,7 @@
483483
let(:repeat_form_submission) { true }
484484

485485
before do
486-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
486+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
487487
end
488488

489489
it "redirects to repeat submission error page" do
@@ -507,7 +507,7 @@
507507
end
508508

509509
before do
510-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
510+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
511511
end
512512

513513
it "renders the incomplete submission error page" do
@@ -524,7 +524,7 @@
524524
end
525525

526526
before do
527-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
527+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
528528
end
529529

530530
it "return 422 error code" do
@@ -550,7 +550,7 @@
550550
end
551551

552552
before do
553-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
553+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
554554
end
555555

556556
it "return 422 error code" do
@@ -578,7 +578,7 @@
578578
end
579579

580580
before do
581-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
581+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
582582
end
583583

584584
it "redirects to confirmation page" do
@@ -604,7 +604,7 @@
604604
before do
605605
travel_to timestamp_of_request do
606606
perform_enqueued_jobs do
607-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
607+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
608608
end
609609
end
610610
end
@@ -656,7 +656,7 @@
656656
allow(Sentry).to receive(:capture_exception)
657657

658658
travel_to timestamp_of_request do
659-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
659+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
660660
end
661661
end
662662

@@ -681,7 +681,7 @@
681681
allow(FormSubmissionService).to receive(:new).and_return(mock_form_submission_service)
682682
allow(mock_form_submission_service).to receive(:submit).and_raise(FormSubmissionService::ConfirmationEmailToAddressError)
683683

684-
post form_submit_answers_path(2, "form-name", 1, mode:), params: { email_confirmation_input: }
684+
post form_submit_answers_path(form_id: 2, form_slug: "form-name", mode:), params: { email_confirmation_input: }
685685
end
686686

687687
it "return 422 error code" do

spec/requests/forms/page_controller_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
mock.get "/api/v2/forms/200#{api_url_suffix}", req_headers, form_data.to_json, 200
7777
end
7878

79-
get form_page_path(200, form_data.form_slug, page_id, mode:)
79+
get form_page_path(form_id: 200, form_slug: form_data.form_slug, page_slug: page_id, mode:)
8080
end
8181

8282
it "adds the page ID to the instrumentation payload" do
@@ -143,12 +143,12 @@
143143

144144
context "with a change answers page" do
145145
it "Displays a back link to the check your answers page" do
146-
get form_change_answer_path(2, form_data.form_slug, 1, mode:)
146+
get form_change_answer_path(form_id: 2, form_slug: form_data.form_slug, page_slug: 1, mode:)
147147
expect(response.body).to include(check_your_answers_path(2, form_data.form_slug, mode:))
148148
end
149149

150150
it "Passes the changing answers parameter in its submit request" do
151-
get form_change_answer_path(2, form_data.form_slug, 1, mode:)
151+
get form_change_answer_path(form_id: 2, form_slug: form_data.form_slug, page_slug: 1, mode:)
152152
expect(response.body).to include(save_form_page_path(mode:, form_id: 2, form_slug: form_data.form_slug, page_slug: 1, changing_existing_answer: true, answer_index: 1))
153153
end
154154
end

0 commit comments

Comments
 (0)