diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8274b93e7..e60f9439f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -12,7 +12,7 @@ class UsersController < ApplicationController redirect_to user_path(@user) elsif user_params.key?("password") format_error_messages - render :edit_password, status: :unprocessable_entity + render "devise/passwords/edit", status: :unprocessable_entity else format_error_messages render :edit, status: :unprocessable_entity @@ -40,7 +40,7 @@ class UsersController < ApplicationController end def edit_password - render :edit_password + render "devise/passwords/edit" end private diff --git a/app/presenters/error_summary_full_messages_presenter.rb b/app/presenters/error_summary_full_messages_presenter.rb new file mode 100644 index 000000000..e499b287e --- /dev/null +++ b/app/presenters/error_summary_full_messages_presenter.rb @@ -0,0 +1,11 @@ +class ErrorSummaryFullMessagesPresenter + def initialize(error_messages) + @error_messages = error_messages + end + + def formatted_error_messages + @error_messages.map do |attribute, messages| + [attribute, [attribute.to_s.humanize, messages.first].join(" ")] + end + end +end diff --git a/app/views/users/edit_password.html.erb b/app/views/devise/passwords/edit.html.erb similarity index 91% rename from app/views/users/edit_password.html.erb rename to app/views/devise/passwords/edit.html.erb index 9c1f29088..6d405ba0f 100644 --- a/app/views/users/edit_password.html.erb +++ b/app/views/devise/passwords/edit.html.erb @@ -10,7 +10,7 @@ <%= form_for(@user, as: :user, html: { method: :patch }) do |f| %>
- <%= f.govuk_error_summary %> + <%= f.govuk_error_summary(presenter: ErrorSummaryFullMessagesPresenter) %>

<%= content_for(:title) %> diff --git a/spec/requests/case_log_controller_spec.rb b/spec/requests/case_log_controller_spec.rb index 05b414614..8128a1dd8 100644 --- a/spec/requests/case_log_controller_spec.rb +++ b/spec/requests/case_log_controller_spec.rb @@ -1,5 +1,4 @@ require "rails_helper" -require_relative "../request_helper" RSpec.describe CaseLogsController, type: :request do let(:owning_organisation) { FactoryBot.create(:organisation) } diff --git a/spec/requests/soft_validations_controller_spec.rb b/spec/requests/soft_validations_controller_spec.rb index 03dd71c06..50ea558ee 100644 --- a/spec/requests/soft_validations_controller_spec.rb +++ b/spec/requests/soft_validations_controller_spec.rb @@ -1,5 +1,4 @@ require "rails_helper" -require_relative "../request_helper" RSpec.describe SoftValidationsController, type: :request do let(:params) { { case_log_id: case_log.id } } diff --git a/spec/requests/user_controller_spec.rb b/spec/requests/user_controller_spec.rb index 5dea28dfd..2830f522b 100644 --- a/spec/requests/user_controller_spec.rb +++ b/spec/requests/user_controller_spec.rb @@ -1,7 +1,6 @@ require "rails_helper" -require_relative "../support/devise" -RSpec.describe UsersController, type: :request do +RSpec.describe "password_reset", type: :request do let(:user) { FactoryBot.create(:user) } let(:unauthorised_user) { FactoryBot.create(:user) } let(:headers) { { "Accept" => "text/html" } } @@ -46,21 +45,48 @@ RSpec.describe UsersController, type: :request do end context "update password" do - let(:params) do - { - id: user.id, user: { password: new_value, password_confirmation: "something_else" } - } + context "valid reset token" do + let(:params) do + { + id: user.id, user: { password: new_value, password_confirmation: "something_else" } + } + end + + before do + sign_in user + put "/users/#{user.id}", headers: headers, params: params + end + + it "shows an error if passwords don't match" do + expect(response).to have_http_status(:unprocessable_entity) + expect(page).to have_selector("#error-summary-title") + expect(page).to have_content("Password confirmation doesn't match Password") + end end - before do - sign_in user - put "/users/#{user.id}", headers: headers, params: params - end - - it "shows an error if passwords don't match" do - expect(response).to have_http_status(:unprocessable_entity) - expect(page).to have_selector("#error-summary-title") - expect(page).to have_content("Password confirmation doesn't match Password") + context "reset token more than 3 hours old" do + let(:raw) { user.send_reset_password_instructions } + let(:params) do + { + id: user.id, + user: { + password: new_value, + password_confirmation: new_value, + reset_password_token: raw, + }, + } + end + + before do + allow_any_instance_of(User).to receive(:reset_password_sent_at).and_return(4.hours.ago) + put "/users/password", headers: headers, params: params + end + + it "shows an error" do + expect(response).to have_http_status(:unprocessable_entity) + expect(page).to have_selector("#error-summary-title") + expect(page).to have_content("Reset password token has expired, please request a new one") + end end end end