From d279cc94088fddd6f6bb2847e456bbf68ae616ea Mon Sep 17 00:00:00 2001 From: Brandon Labuschagne Date: Mon, 7 Jan 2019 13:54:41 +0200 Subject: Add last activity to user administration The columns 'Created on' and 'Last activity' have been added to the admin -> users view. Sorting options have also been added for last activity and the search bar has been moved to match the issues page. --- spec/features/admin/admin_users_spec.rb | 42 +++++++++++-- spec/helpers/users_helper_spec.rb | 68 ++++++++++++++++++++++ .../helpers/features/responsive_table_helpers.rb | 32 ++++++++++ 3 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 spec/support/helpers/features/responsive_table_helpers.rb (limited to 'spec') diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb index 931095936a6..b1c6f308bc6 100644 --- a/spec/features/admin/admin_users_spec.rb +++ b/spec/features/admin/admin_users_spec.rb @@ -1,13 +1,13 @@ require 'spec_helper' describe "Admin::Users" do - include Spec::Support::Helpers::Features::ListRowsHelpers + include Spec::Support::Helpers::Features::ResponsiveTableHelpers let!(:user) do create(:omniauth_user, provider: 'twitter', extern_uid: '123456') end - let!(:current_user) { create(:admin) } + let!(:current_user) { create(:admin, last_activity_on: 5.days.ago) } before do sign_in(current_user) @@ -25,6 +25,8 @@ describe "Admin::Users" do it "has users list" do expect(page).to have_content(current_user.email) expect(page).to have_content(current_user.name) + expect(page).to have_content(current_user.created_at.strftime("%e %b, %Y")) + expect(page).to have_content(current_user.last_activity_on.strftime("%e %b, %Y")) expect(page).to have_content(user.email) expect(page).to have_content(user.name) expect(page).to have_link('Block', href: block_admin_user_path(user)) @@ -32,10 +34,24 @@ describe "Admin::Users" do expect(page).to have_button('Delete user and contributions') end + describe "view extra user information", :js do + it 'does not have the user popover open' do + expect(page).not_to have_selector('#__BV_popover_1__') + end + + it 'shows the user popover on hover' do + first_user_link = page.first('.js-user-link') + + first_user_link.hover + + expect(page).to have_selector('#__BV_popover_1__') + end + end + describe 'search and sort' do before do - create(:user, name: 'Foo Bar') - create(:user, name: 'Foo Baz') + create(:user, name: 'Foo Bar', last_activity_on: 3.days.ago) + create(:user, name: 'Foo Baz', last_activity_on: 2.days.ago) create(:user, name: 'Dmitriy') end @@ -75,6 +91,24 @@ describe "Admin::Users" do expect(first_row.text).to include('Foo Bar') expect(second_row.text).to include('Foo Baz') end + + it 'sorts users by recent last activity' do + visit admin_users_path(search_query: 'Foo') + + sort_by('Recent last activity') + + expect(first_row.text).to include('Foo Baz') + expect(second_row.text).to include('Foo Bar') + end + + it 'sorts users by oldest last activity' do + visit admin_users_path(search_query: 'Foo') + + sort_by('Oldest last activity') + + expect(first_row.text).to include('Foo Bar') + expect(second_row.text).to include('Foo Baz') + end end describe 'Two-factor Authentication filters' do diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb index 34d9115a1f6..b04d94e803b 100644 --- a/spec/helpers/users_helper_spec.rb +++ b/spec/helpers/users_helper_spec.rb @@ -100,4 +100,72 @@ describe UsersHelper do end end end + + describe '#user_badges_in_admin_section' do + before do + allow(helper).to receive(:current_user).and_return(user) + end + + context 'with a blocked user' do + it "returns the blocked badge" do + blocked_user = create(:user, state: 'blocked') + + badges = helper.user_badges_in_admin_section(blocked_user) + + expect(badges).to eq([text: "Blocked", variant: "danger"]) + end + end + + context 'with an admin user' do + it "returns the admin badge" do + admin_user = create(:admin) + + badges = helper.user_badges_in_admin_section(admin_user) + + expect(badges).to eq([text: "Admin", variant: "success"]) + end + end + + context 'with an external user' do + it 'returns the external badge' do + external_user = create(:user, external: true) + + badges = helper.user_badges_in_admin_section(external_user) + + expect(badges).to eq([text: "External", variant: "secondary"]) + end + end + + context 'with the current user' do + it 'returns the "It\'s You" badge' do + badges = helper.user_badges_in_admin_section(user) + + expect(badges).to eq([text: "It's you!", variant: nil]) + end + end + + context 'with an external blocked admin' do + it 'returns the blocked, admin and external badges' do + user = create(:admin, state: 'blocked', external: true) + + badges = helper.user_badges_in_admin_section(user) + + expect(badges).to eq([ + { text: "Blocked", variant: "danger" }, + { text: "Admin", variant: "success" }, + { text: "External", variant: "secondary" } + ]) + end + end + + context 'get badges for normal user' do + it 'returns no badges' do + user = create(:user) + + badges = helper.user_badges_in_admin_section(user) + + expect(badges).to be_empty + end + end + end end diff --git a/spec/support/helpers/features/responsive_table_helpers.rb b/spec/support/helpers/features/responsive_table_helpers.rb new file mode 100644 index 00000000000..7a175219fe9 --- /dev/null +++ b/spec/support/helpers/features/responsive_table_helpers.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true +# These helpers allow you to access rows in a responsive table +# +# Usage: +# describe "..." do +# include Spec::Support::Helpers::Features::ResponsiveTableHelpers +# ... +# +# expect(first_row.text).to include("John Doe") +# expect(second_row.text).to include("John Smith") +# +# Note: +# index starts at 1 as index 0 is expected to be the table header +# +# +module Spec + module Support + module Helpers + module Features + module ResponsiveTableHelpers + def first_row + page.all('.gl-responsive-table-row')[1] + end + + def second_row + page.all('.gl-responsive-table-row')[2] + end + end + end + end + end +end -- cgit v1.2.3