diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 06f148f84..c22570a2e 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -30,6 +30,10 @@ class UsersController < ApplicationController def show; end + def dpo; end + + def key_contact; end + def edit redirect_to user_path(@user) unless @user.active? end @@ -68,24 +72,17 @@ class UsersController < ApplicationController end def create - @resource = User.new - if user_params["email"].empty? - @resource.errors.add :email, I18n.t("validations.email.blank") - elsif !email_valid?(user_params["email"]) - @resource.errors.add :email, I18n.t("validations.email.invalid") - elsif user_params[:role] && !current_user.assignable_roles.key?(user_params[:role].to_sym) - @resource.errors.add :role, I18n.t("validations.role.invalid") - end - if @resource.errors.present? - render :new, status: :unprocessable_entity + @resource = User.new(user_params.merge(org_params).merge(password_params)) + + validate_attributes + if @resource.errors.empty? && @resource.save + redirect_to created_user_redirect_path else - user = User.create(user_params.merge(org_params).merge(password_params)) - if user.persisted? - redirect_to created_user_redirect_path - else - @resource.errors.add :email, I18n.t("validations.email.taken") - render :new, status: :unprocessable_entity + unless @resource.errors[:organisation].empty? + @resource.errors.add(:organisation_id, message: @resource.errors[:organisation]) + @resource.errors.delete(:organisation) end + render :new, status: :unprocessable_entity end end @@ -112,6 +109,16 @@ class UsersController < ApplicationController private + def validate_attributes + @resource.validate + if user_params[:role].present? && !current_user.assignable_roles.key?(user_params[:role].to_sym) + @resource.errors.add :role, I18n.t("validations.role.invalid") + end + if user_params[:role].empty? + @resource.errors.add :role, I18n.t("activerecord.errors.models.user.attributes.role.blank") + end + end + def format_error_messages errors = @user.errors.to_hash @user.errors.clear @@ -161,7 +168,7 @@ private end def find_resource - @user = params[:id] ? User.find_by(id: params[:id]) : current_user + @user = User.find_by(id: params[:user_id]) || User.find_by(id: params[:id]) || current_user end def authenticate_scope! diff --git a/app/models/form/setup/questions/created_by_id.rb b/app/models/form/setup/questions/created_by_id.rb index f32163a0f..eee7d9485 100644 --- a/app/models/form/setup/questions/created_by_id.rb +++ b/app/models/form/setup/questions/created_by_id.rb @@ -13,9 +13,8 @@ class Form::Setup::Questions::CreatedById < ::Form::Question answer_opts = { "" => "Select an option" } return answer_opts unless ActiveRecord::Base.connected? - User.select(:id, :name, :email).each_with_object(answer_opts) do |user, hsh| - hsh[user.id] = user.name if user.name.present? - hsh[user.id] = user.email if user.name.blank? + User.select(:id, :name).each_with_object(answer_opts) do |user, hsh| + hsh[user.id] = user.name hsh end end diff --git a/app/models/user.rb b/app/models/user.rb index 8b9d3f52f..a664acc8d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,6 +1,7 @@ class User < ApplicationRecord # Include default devise modules. Others available are: # :omniauthable + include Helpers::Email devise :database_authenticatable, :recoverable, :rememberable, :validatable, :trackable, :lockable, :two_factor_authenticatable, :confirmable, :timeoutable @@ -8,6 +9,9 @@ class User < ApplicationRecord has_many :owned_case_logs, through: :organisation has_many :managed_case_logs, through: :organisation + validate :validate_email + validates :name, :email, presence: true + has_paper_trail ignore: %w[last_sign_in_at current_sign_in_at current_sign_in_ip @@ -149,4 +153,16 @@ class User < ApplicationRecord def valid_for_authentication? super && active? end + +private + + def validate_email + unless email_valid?(email) + if User.exists?(["email LIKE ?", "%#{email}%"]) + errors.add :email, I18n.t("activerecord.errors.models.user.attributes.email.taken") + else + errors.add :email, I18n.t("activerecord.errors.models.user.attributes.email.invalid") + end + end + end end diff --git a/app/views/users/dpo.html.erb b/app/views/users/dpo.html.erb new file mode 100644 index 000000000..9678620ad --- /dev/null +++ b/app/views/users/dpo.html.erb @@ -0,0 +1,26 @@ +<% content_for :title, "Is this user your organisation’s data protection officer?" %> + +<% content_for :before_content do %> + <%= govuk_back_link(href: :back) %> +<% end %> + +<%= render partial: "organisations/headings", locals: { main: "Is this user your organisation’s data protection officer?", sub: @user.name } %> + +<%= form_for(@user, as: :user, html: { method: :patch }) do |f| %> +
+
+ <%= f.govuk_error_summary %> + + <% if current_user.data_coordinator? || current_user.support? %> + + <%= f.govuk_collection_radio_buttons :is_dpo, + [OpenStruct.new(id: true, name: "Yes"), OpenStruct.new(id: false, name: "No")], + :id, + :name, + legend: nil %> + <% end %> + + <%= f.govuk_submit "Save changes" %> +
+
+<% end %> diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 1c45b9a67..fb7b10755 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -30,19 +30,6 @@ :id, :name, legend: { text: "Role", size: "m" } %> - - <%= f.govuk_collection_radio_buttons :is_dpo, - [OpenStruct.new(id: true, name: "Yes"), OpenStruct.new(id: false, name: "No")], - :id, - :name, - legend: { text: "#{perspective(@user, current_user)} the organisation’s data protection officer?", size: "m" } %> - - <%= f.govuk_collection_radio_buttons :is_key_contact, - [OpenStruct.new(id: true, name: "Yes"), OpenStruct.new(id: false, name: "No")], - :id, - :name, - legend: { text: "#{perspective(@user, current_user)} a key contact for this service?", size: "m" }, - hint: { text: "This is a person responsible for sharing information about social housing lettings and sales data within the organisation." } %> <% end %> <%= f.govuk_submit "Save changes" %> diff --git a/app/views/users/key_contact.html.erb b/app/views/users/key_contact.html.erb new file mode 100644 index 000000000..e0018592f --- /dev/null +++ b/app/views/users/key_contact.html.erb @@ -0,0 +1,27 @@ +<% content_for :title, "Is this user a key contact for this service?" %> + +<% content_for :before_content do %> + <%= govuk_back_link(href: :back) %> +<% end %> + +<%= render partial: "organisations/headings", locals: { main: "Is this user a key contact for this service?", sub: @user.name } %> + +<%= form_for(@user, as: :user, html: { method: :patch }) do |f| %> +
+
+ <%= f.govuk_error_summary %> + + <% if current_user.data_coordinator? || current_user.support? %> + + <%= f.govuk_collection_radio_buttons :is_key_contact, + [OpenStruct.new(id: true, name: "Yes"), OpenStruct.new(id: false, name: "No")], + :id, + :name, + legend: nil, + hint: { text: "This is a person responsible for sharing information about social housing lettings and sales data within the organisation." } %> + <% end %> + + <%= f.govuk_submit "Save changes" %> +
+
+<% end %> diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index 2b3db667e..cf15c06e0 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb @@ -15,7 +15,7 @@ <%= f.govuk_text_field :name, autocomplete: "name", - label: { text: "Name (optional)", size: "m" } %> + label: { text: "Name", size: "m" } %> <%= f.govuk_email_field :email, label: { text: "Email address", size: "m" }, @@ -27,6 +27,7 @@ <% null_option = [OpenStruct.new(id: "", name: "Select an option")] %> <% organisations = Organisation.all.map { |org| OpenStruct.new(id: org.id, name: org.name) } %> <% answer_options = null_option + organisations %> + <% if @organisation_id %> <% organisation = Organisation.find(@organisation_id) %> <% answer_options = [OpenStruct.new(id: organisation.id, name: organisation.name)] %> @@ -40,26 +41,18 @@ options: { disabled: [""], selected: @organisation_id ? answer_options.first : "" } %> <% end %> - <% roles = current_user.assignable_roles.map { |key, _| OpenStruct.new(id: key, name: key.to_s.humanize) } %> - - <%= f.govuk_collection_radio_buttons :role, - roles, - :id, - :name, - legend: { text: "Role", size: "m" } %> + <% hints_for_roles = { data_provider: ["Default role for this organisation", "Can view and submit logs for this organisation"], data_coordinator: ["Can view and submit logs for this organisation and any of its managing agents", "Can manage details for this organisation", "Can manage users for this organisation"], support: nil } %> - <%= f.govuk_collection_radio_buttons :is_dpo, - [OpenStruct.new(id: true, name: "Yes"), OpenStruct.new(id: false, name: "No")], - :id, - :name, - legend: { text: "#{perspective(@user, current_user)} the organisation’s data protection officer?", size: "m" } %> + <% roles_with_hints = current_user.assignable_roles.map { |key, _| OpenStruct.new(id: key, name: key.to_s.humanize, description: hints_for_roles[key.to_sym]) } %> - <%= f.govuk_collection_radio_buttons :is_key_contact, - [OpenStruct.new(id: true, name: "Yes"), OpenStruct.new(id: false, name: "No")], - :id, - :name, - legend: { text: "#{perspective(@user, current_user)} a key contact for this service?", size: "m" }, - hint: { text: "This is a person responsible for sharing information about social housing lettings and sales data within the organisation." } %> + <%= f.govuk_collection_radio_buttons :role, + roles_with_hints, + :id, + :name, + lambda { |option| + option.description&.map { |hint| content_tag(:li, hint) }&.reduce(:+) + }, + legend: { text: "Role", size: "m" } %> <%= f.govuk_submit "Continue" %> diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 06c528703..e6cb9fd3e 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -81,7 +81,7 @@ if can_edit_dpo?(@user, current_user) row.action( visually_hidden_text: "if data protection officer", - href: aliased_user_edit(@user, current_user), + href: user_edit_dpo_path(@user), html_attributes: { "data-qa": "change-data-protection-officer" }, ) else @@ -95,7 +95,7 @@ if can_edit_key_contact?(@user, current_user) row.action( visually_hidden_text: "if a key contact", - href: aliased_user_edit(@user, current_user), + href: user_edit_key_contact_path(@user), html_attributes: { "data-qa": "change-key-contact" }, ) else diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index 3e6969490..71d184ad6 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -2,5 +2,5 @@ # Configure sensitive parameters which will be filtered from the log file. Rails.application.config.filter_parameters += %i[ - passw secret token _key crypt salt certificate otp ssn + passw secret token crypt salt certificate otp ssn ] diff --git a/config/locales/en.yml b/config/locales/en.yml index b17198172..4fc1c7b61 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -69,13 +69,26 @@ en: attributes: startdate: invalid: "Enter a date in the correct format, for example 31 1 2022" - units: blank: "Enter the total number of units at this location" type_of_unit: blank: "Select the most common type of unit at this location" mobility_type: blank: "Select the mobility standards for the majority of units in this location" + user: + attributes: + organisation_id: + blank: "Enter the existing organisation’s name" + invalid: "Enter the existing organisation’s name" + name: + blank: "Enter a name" + email: + invalid: "Enter an email address in the correct format, like name@example.com" + blank: "Enter an email address" + taken: "Enter an email address that hasn’t already been used to sign up" + role: + invalid: "Role must be data accessor, data provider or data coordinator" + blank: "Select role" validations: organisation: diff --git a/config/routes.rb b/config/routes.rb index dc6588142..a6b0b9654 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -53,6 +53,9 @@ Rails.application.routes.draw do end resources :users do + get "edit-dpo", to: "users#dpo" + get "edit-key-contact", to: "users#key_contact" + member do get "deactivate", to: "users#deactivate" get "reactivate", to: "users#reactivate" diff --git a/db/seeds.rb b/db/seeds.rb index e9cd10b85..8491db6b6 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -83,6 +83,8 @@ unless Rails.env.test? primary_client_group: "O", secondary_client_group: "H", owning_organisation: org, + managing_organisation: org, + arrangement_type: "D", confirmed: true, created_at: Time.zone.now, ) @@ -97,6 +99,8 @@ unless Rails.env.test? primary_client_group: "D", secondary_client_group: "E", owning_organisation: org, + managing_organisation: org, + arrangement_type: "D", confirmed: true, created_at: Time.zone.now, ) @@ -111,6 +115,8 @@ unless Rails.env.test? primary_client_group: "G", secondary_client_group: "R", owning_organisation: dummy_org, + managing_organisation: dummy_org, + arrangement_type: "D", confirmed: true, created_at: Time.zone.now, ) diff --git a/spec/features/user_spec.rb b/spec/features/user_spec.rb index 61f3ce024..3dc6b0cf8 100644 --- a/spec/features/user_spec.rb +++ b/spec/features/user_spec.rb @@ -327,27 +327,20 @@ RSpec.describe "User Features" do fill_in("user[name]", with: "New User") fill_in("user[email]", with: "newuser@example.com") choose("user-role-data-provider-field") - choose("user-is-dpo-true-field") - choose("user-is-key-contact-true-field") click_button("Continue") expect(User.find_by( name: "New User", email: "newuser@example.com", role: "data_provider", - is_dpo: true, - is_key_contact: true, + is_dpo: false, + is_key_contact: false, )).to be_a(User) end - - it "defaults to is_dpo false" do - visit("users/new") - expect(page).to have_field("user[is_dpo]", with: false) - end end context "when editing someone elses account details" do let!(:user) { FactoryBot.create(:user, :data_coordinator, last_sign_in_at: Time.zone.now) } - let!(:other_user) { FactoryBot.create(:user, name: "Other name", is_dpo: true, organisation: user.organisation) } + let!(:other_user) { FactoryBot.create(:user, name: "Other name", is_dpo: false, organisation: user.organisation) } before do visit("/logs") @@ -362,19 +355,36 @@ RSpec.describe "User Features" do click_link(other_user.name) expect(page).to have_title("Other name’s account") first(:link, "Change").click - expect(page).to have_field("user[is_dpo]", with: true) - choose("user-is-dpo-field") - choose("user-is-key-contact-true-field") fill_in("user[name]", with: "Updated new name") click_button("Save changes") expect(page).to have_title("Updated new name’s account") expect(User.find_by( name: "Updated new name", role: "data_provider", - is_dpo: false, - is_key_contact: true, )).to be_a(User) end + + context "when updating other user DPO and key contact information" do + it "allows updating users dpo details" do + visit("/organisations/#{user.organisation.id}") + click_link("Users") + click_link(other_user.name) + find("a[href='#{user_edit_dpo_path(other_user)}']").click + choose("Yes") + click_button("Save changes") + expect(User.find_by(name: "Other name", role: "data_provider", is_dpo: true)).to be_a(User) + end + + it "allows updating users key contact details" do + visit("/organisations/#{user.organisation.id}") + click_link("Users") + click_link(other_user.name) + find("a[href='#{user_edit_key_contact_path(other_user)}']").click + choose("Yes") + click_button("Save changes") + expect(User.find_by(name: "Other name", role: "data_provider", is_key_contact: true)).to be_a(User) + end + end end context "when deactivating a user" do diff --git a/spec/models/form/setup/questions/created_by_id_spec.rb b/spec/models/form/setup/questions/created_by_id_spec.rb index 80744d94b..9b20a02ae 100644 --- a/spec/models/form/setup/questions/created_by_id_spec.rb +++ b/spec/models/form/setup/questions/created_by_id_spec.rb @@ -8,15 +8,13 @@ RSpec.describe Form::Setup::Questions::CreatedById, type: :model do let(:page) { instance_double(Form::Page) } let(:subsection) { instance_double(Form::Subsection) } let(:form) { instance_double(Form) } - let!(:user_1) { FactoryBot.create(:user, name: "first user") } - let!(:user_2) { FactoryBot.create(:user, name: "second user") } - let!(:user_3) { FactoryBot.create(:user, name: nil, email: "madeupmail@example.com") } - let(:expected_answer_options) do + let(:user_1) { FactoryBot.create(:user, name: "first user") } + let(:user_2) { FactoryBot.create(:user, name: "second user") } + let!(:expected_answer_options) do { "" => "Select an option", user_1.id => user_1.name, user_2.id => user_2.name, - user_3.id => user_3.email, } end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 922b4527e..caf8d03d3 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -195,8 +195,8 @@ RSpec.describe User, type: :model do let!(:user_1) { FactoryBot.create(:user, name: "Joe Bloggs", email: "joe@example.com", organisation: organisation_1, role: "support") } let!(:user_3) { FactoryBot.create(:user, name: "Tom Smith", email: "tom@example.com", organisation: organisation_1, role: "data_provider") } let!(:user_2) { FactoryBot.create(:user, name: "Jenny Ford", email: "jenny@smith.com", organisation: organisation_1, role: "data_coordinator") } - let!(:user_4) { FactoryBot.create(:user, name: "Greg Thomas", email: "greg@org_2.com", organisation: organisation_2, role: "data_coordinator") } - let!(:user_5) { FactoryBot.create(:user, name: "Adam Thomas", email: "adam@org_2.com", organisation: organisation_2, role: "data_coordinator") } + let!(:user_4) { FactoryBot.create(:user, name: "Greg Thomas", email: "greg@org2.com", organisation: organisation_2, role: "data_coordinator") } + let!(:user_5) { FactoryBot.create(:user, name: "Adam Thomas", email: "adam@org2.com", organisation: organisation_2, role: "data_coordinator") } context "when searching by name" do it "returns case insensitive matching records" do diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb index 94f5d8fef..a99d1e6c3 100644 --- a/spec/requests/users_controller_spec.rb +++ b/spec/requests/users_controller_spec.rb @@ -423,7 +423,7 @@ RSpec.describe UsersController, type: :request do context "when a search parameter is passed" do let!(:other_user_2) { FactoryBot.create(:user, organisation: user.organisation, name: "joe", email: "other@example.com") } let!(:other_user_3) { FactoryBot.create(:user, name: "User 5", organisation: user.organisation, email: "joe@example.com") } - let!(:other_org_user) { FactoryBot.create(:user, name: "User 4", email: "joe@other_example.com") } + let!(:other_org_user) { FactoryBot.create(:user, name: "User 4", email: "joe@otherexample.com") } before do get "/organisations/#{user.organisation.id}/users?search=#{search_param}" @@ -604,8 +604,6 @@ RSpec.describe UsersController, type: :request do expect(page).to have_field("user[name]") expect(page).to have_field("user[email]") expect(page).to have_field("user[role]") - expect(page).to have_field("user[is_dpo]") - expect(page).to have_field("user[is_key_contact]") end it "does not allow setting the role to `support`" do @@ -632,8 +630,6 @@ RSpec.describe UsersController, type: :request do expect(page).to have_field("user[name]") expect(page).to have_field("user[email]") expect(page).to have_field("user[role]") - expect(page).to have_field("user[is_dpo]") - expect(page).to have_field("user[is_key_contact]") end end @@ -792,19 +788,6 @@ RSpec.describe UsersController, type: :request do expect { patch "/users/#{other_user.id}", headers:, params: } .to change { other_user.reload.active }.from(true).to(false) end - - context "when the user name is missing" do - let(:other_user) { FactoryBot.create(:user, name: nil, organisation: user.organisation) } - - before do - patch "/users/#{other_user.id}", headers:, params: - end - - it "uses the user's email" do - follow_redirect! - expect(page).to have_content(other_user.email) - end - end end context "and tries to activate deactivated user" do @@ -818,19 +801,6 @@ RSpec.describe UsersController, type: :request do expect { patch "/users/#{other_user.id}", headers:, params: } .to change { other_user.reload.active }.from(false).to(true) end - - context "when the user name is missing" do - let(:other_user) { FactoryBot.create(:user, name: nil, organisation: user.organisation) } - - before do - patch "/users/#{other_user.id}", headers:, params: - end - - it "uses the user's email" do - follow_redirect! - expect(page).to have_content(other_user.email) - end - end end end end @@ -935,6 +905,26 @@ RSpec.describe UsersController, type: :request do expect(page).to have_content(I18n.t("validations.role.invalid")) end end + + context "when validating the required fields" do + let(:params) do + { + "user": { + name: "", + email: "", + role: "", + }, + } + end + + it "shows an error" do + request + expect(response).to have_http_status(:unprocessable_entity) + expect(page).to have_content(I18n.t("activerecord.errors.models.user.attributes.name.blank")) + expect(page).to have_content(I18n.t("activerecord.errors.models.user.attributes.email.blank")) + expect(page).to have_content(I18n.t("activerecord.errors.models.user.attributes.role.blank")) + end + end end describe "#new" do @@ -1011,7 +1001,7 @@ RSpec.describe UsersController, type: :request do describe "#index" do let!(:other_user) { FactoryBot.create(:user, organisation: user.organisation, name: "User 2", email: "other@example.com") } let!(:inactive_user) { FactoryBot.create(:user, organisation: user.organisation, active: false, name: "User 3", email: "inactive@example.com") } - let!(:other_org_user) { FactoryBot.create(:user, name: "User 4", email: "other_org@other_example.com") } + let!(:other_org_user) { FactoryBot.create(:user, name: "User 4", email: "otherorg@otherexample.com") } before do sign_in user @@ -1078,7 +1068,7 @@ RSpec.describe UsersController, type: :request do end context "when our search term matches an email" do - let(:search_param) { "other_org@other_example.com" } + let(:search_param) { "otherorg@otherexample.com" } it "returns only matching result" do expect(page).not_to have_content(user.name) @@ -1090,7 +1080,7 @@ RSpec.describe UsersController, type: :request do context "when our search term matches an email and a name" do let!(:other_user) { FactoryBot.create(:user, organisation: user.organisation, name: "joe", email: "other@example.com") } - let!(:other_org_user) { FactoryBot.create(:user, name: "User 4", email: "joe@other_example.com") } + let!(:other_org_user) { FactoryBot.create(:user, name: "User 4", email: "joe@otherexample.com") } let(:search_param) { "joe" } it "returns any results including joe" do @@ -1259,8 +1249,6 @@ RSpec.describe UsersController, type: :request do expect(page).to have_field("user[name]") expect(page).to have_field("user[email]") expect(page).to have_field("user[role]") - expect(page).to have_field("user[is_dpo]") - expect(page).to have_field("user[is_key_contact]") end it "allows setting the role to `support`" do @@ -1287,8 +1275,6 @@ RSpec.describe UsersController, type: :request do expect(page).to have_field("user[name]") expect(page).to have_field("user[email]") expect(page).to have_field("user[role]") - expect(page).to have_field("user[is_dpo]") - expect(page).to have_field("user[is_key_contact]") end end @@ -1307,8 +1293,6 @@ RSpec.describe UsersController, type: :request do expect(page).to have_field("user[name]") expect(page).to have_field("user[email]") expect(page).to have_field("user[role]") - expect(page).to have_field("user[is_dpo]") - expect(page).to have_field("user[is_key_contact]") end end @@ -1587,6 +1571,31 @@ RSpec.describe UsersController, type: :request do expect(response).to redirect_to("/users") end + context "when validations fail" do + let(:params) do + { + "user": { + name: "", + email: "", + role: "", + organisation_id: nil, + }, + } + end + + before do + FactoryBot.create(:user, email: "new_user@example.com") + end + + it "shows an error messages for all failed validations" do + request + expect(response).to have_http_status(:unprocessable_entity) + expect(page).to have_content(I18n.t("activerecord.errors.models.user.attributes.name.blank")) + expect(page).to have_content(I18n.t("activerecord.errors.models.user.attributes.email.blank")) + expect(page).to have_content(I18n.t("activerecord.errors.models.user.attributes.organisation_id.blank")) + end + end + context "when the email is already taken" do before do FactoryBot.create(:user, email: "new_user@example.com") @@ -1595,7 +1604,7 @@ RSpec.describe UsersController, type: :request do it "shows an error" do request expect(response).to have_http_status(:unprocessable_entity) - expect(page).to have_content(I18n.t("validations.email.taken")) + expect(page).to have_content(I18n.t("activerecord.errors.models.user.attributes.email.taken")) end end