diff --git a/engines/bops_config/app/controllers/bops_config/users_controller.rb b/engines/bops_config/app/controllers/bops_config/users_controller.rb index 4ec22b0359..0dbc94bb03 100644 --- a/engines/bops_config/app/controllers/bops_config/users_controller.rb +++ b/engines/bops_config/app/controllers/bops_config/users_controller.rb @@ -4,7 +4,7 @@ module BopsConfig class UsersController < ApplicationController before_action :set_users, only: %i[index] before_action :build_user, only: %i[new create] - before_action :set_user, only: %i[edit update resend_invite] + before_action :set_user, only: %i[edit update resend_invite destroy reactivate] def index respond_to do |format| @@ -48,6 +48,30 @@ def update end end + def destroy + respond_to do |format| + if @user.discard + format.html do + redirect_to users_path, notice: t(".success") + end + else + format.html { render :edit } + end + end + end + + def reactivate + respond_to do |format| + if @user.undiscard + format.html do + redirect_to users_path, notice: t(".success") + end + else + format.html { render :edit } + end + end + end + def resend_invite respond_to do |format| if @user.send_confirmation_instructions diff --git a/engines/bops_config/app/views/bops_config/users/_form.html.erb b/engines/bops_config/app/views/bops_config/users/_form.html.erb index ddaf0bca4b..1307fe2452 100644 --- a/engines/bops_config/app/views/bops_config/users/_form.html.erb +++ b/engines/bops_config/app/views/bops_config/users/_form.html.erb @@ -15,5 +15,16 @@
<%= form.govuk_submit(t(".submit")) %> <%= back_link %> + <% if @user.persisted? && @user != current_user %> + <% if @user.discarded? %> + <%= govuk_button_link_to("Reactivate user", reactivate_user_path(@user), + warning: true, + method: :patch, data: {confirm: "Are you sure?"}) %> + <% else %> + <%= govuk_button_link_to("Deactivate user", user_path(@user), + warning: true, + method: :delete, data: {confirm: "Are you sure?"}) %> + <% end %> + <% end %>
<% end %> diff --git a/engines/bops_config/app/views/bops_config/users/_table.html.erb b/engines/bops_config/app/views/bops_config/users/_table.html.erb index 4482a2cf6a..cefe5d54fd 100644 --- a/engines/bops_config/app/views/bops_config/users/_table.html.erb +++ b/engines/bops_config/app/views/bops_config/users/_table.html.erb @@ -4,6 +4,9 @@ User details 2FA set up 2FA method + <% if local_assigns[:deactivated] %> + Deactivation date + <% end %> @@ -25,6 +28,11 @@ <%= t(".#{user.otp_delivery_method}") %> + <% if local_assigns[:deactivated] %> + + Deactivated at <%= user.deactivated_at.to_fs %> + + <% end %> <% end %> diff --git a/engines/bops_config/app/views/bops_config/users/index.html.erb b/engines/bops_config/app/views/bops_config/users/index.html.erb index 2141ca0b2f..c267689380 100644 --- a/engines/bops_config/app/views/bops_config/users/index.html.erb +++ b/engines/bops_config/app/views/bops_config/users/index.html.erb @@ -7,7 +7,7 @@ <% content_for :title, t(".users") %> <% if @users.any?(&:unconfirmed?) %> - <%= render("status_prompt", users: @users.select(&:unconfirmed?)) %> + <%= render("status_prompt", users: @users.unconfirmed) %> <% end %>
@@ -27,12 +27,20 @@ Unconfirmed +
  • + + Deactivated + +
  • - <%= render("table", users: @users.select(&:confirmed?)) %> + <%= render("table", users: @users.confirmed) %>
    - <%= render("table", users: @users.select(&:unconfirmed?)) %> + <%= render("table", users: @users.unconfirmed) %> +
    +
    + <%= render("table", users: @users.discarded, deactivated: true) %>
    diff --git a/engines/bops_config/config/locales/en.yml b/engines/bops_config/config/locales/en.yml index d1a09e3fc2..19ff3193e5 100644 --- a/engines/bops_config/config/locales/en.yml +++ b/engines/bops_config/config/locales/en.yml @@ -464,6 +464,8 @@ en: users: create: user_successfully_created: User successfully created + destroy: + success: User successfully deactivated edit: edit_user: Edit user form: @@ -475,6 +477,8 @@ en: users: Manage global admin users new: add_user: Add a new user + reactivate: + success: User successfully reactivated resend_invite: confirmation_failed_to_resend: Unable to send a reminder email - please contact support confirmation_resent: User will receive a reminder email diff --git a/engines/bops_config/config/routes.rb b/engines/bops_config/config/routes.rb index 1925b039cc..b3ce0a73e4 100644 --- a/engines/bops_config/config/routes.rb +++ b/engines/bops_config/config/routes.rb @@ -42,7 +42,8 @@ end end - resources :users, except: %i[show destroy] do + resources :users, except: %i[show] do get :resend_invite, on: :member + patch :reactivate, on: :member end end diff --git a/engines/bops_config/spec/system/users_spec.rb b/engines/bops_config/spec/system/users_spec.rb index 1cf0db8c12..9e2a28f603 100644 --- a/engines/bops_config/spec/system/users_spec.rb +++ b/engines/bops_config/spec/system/users_spec.rb @@ -25,6 +25,17 @@ expect(page).to have_no_field("Role") end + it "does not allow a user to update own role" do + click_link "Users" + + within("#confirmed tbody tr:nth-child(1)") do + expect(page).to have_content("Clark Kent") + click_link("Edit user") + end + + expect(page).to have_no_field("Role") + end + it "allows adding a new user" do click_link "Users" expect(page).to have_selector("h1", text: "Manage global admin users") @@ -227,4 +238,61 @@ expect(last_email.body).to include("http://config.bops.services/users/password/edit?reset_password_token=") end end + + context "when there are deactivated users", :capybara do + before do + create(:user, :global_administrator, local_authority: nil, name: "Dieter Waldbeck") + create(:user, :global_administrator, local_authority: nil, name: "Andrea Khan", deactivated_at: 1.day.ago) + end + + it "lists the deactivated users" do + click_link "Users" + + click_link "Deactivated" + + within("#deactivated table.govuk-table") do + expect(page).to have_selector("tr:nth-child(1)", text: "Andrea Khan") + # only testing for the date, not the time, to avoid a race condition if the minute ticks over + expect(page).to have_selector("tr:nth-child(1)", text: "Deactivated at #{1.day.ago.to_date.to_fs}") + end + end + + it "allows reactivating the deactivated users" do + click_link "Users" + + click_link "Deactivated" + + within("#deactivated table.govuk-table") do + click_on "Edit user" + end + + accept_confirm do + click_on "Reactivate" + end + + expect(page).to have_text("User successfully reactivated") + within("#confirmed table.govuk-table") do + expect(page).to have_selector("tr:nth-child(1)", text: "Andrea Khan") + end + end + end + + context "when user account is deactivated", :capybara do + let(:deactivated_user) { create(:user, :global_administrator, local_authority: nil, deactivated_at: 1.day.ago) } + + before do + sign_out(user) + end + + it "can't sign in" do + click_link "Users" + + fill_in("user[email]", with: deactivated_user.email) + fill_in("user[password]", with: deactivated_user.password) + click_button("Log in") + + expect(page).to have_text("Invalid Email or password.") + expect(page).not_to have_text("Signed in successfully.") + end + end end