diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-06-10 03:10:09 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-06-10 03:10:09 +0300 |
commit | 26774b8d98581b2f211cd5cf04dcec0e352c04a6 (patch) | |
tree | fe4277340df965a25b73012973016fd26006457f /spec | |
parent | f820d18e56f2bd63dd0f91b076ace59345a036a1 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
9 files changed, 318 insertions, 311 deletions
diff --git a/spec/features/admin/users/user_spec.rb b/spec/features/admin/users/user_spec.rb index 01341398135..3599658ee56 100644 --- a/spec/features/admin/users/user_spec.rb +++ b/spec/features/admin/users/user_spec.rb @@ -356,27 +356,19 @@ RSpec.describe 'Admin::Users::User' do end end - [true, false].each do |vue_admin_users| - context "with vue_admin_users feature flag set to #{vue_admin_users}", js: vue_admin_users do - before do - stub_feature_flags(vue_admin_users: vue_admin_users) - end - - describe 'GET /admin/users' do - context 'user pending approval' do - it 'shows user info', :aggregate_failures do - user = create(:user, :blocked_pending_approval) + describe 'GET /admin/users', :js do + context 'user pending approval' do + it 'shows user info', :aggregate_failures do + user = create(:user, :blocked_pending_approval) - visit admin_users_path - click_link 'Pending approval' - click_link user.name + visit admin_users_path + click_link 'Pending approval' + click_link user.name - expect(page).to have_content(user.name) - expect(page).to have_content('Pending approval') - expect(page).to have_link('Approve user') - expect(page).to have_link('Reject request') - end - end + expect(page).to have_content(user.name) + expect(page).to have_content('Pending approval') + expect(page).to have_link('Approve user') + expect(page).to have_link('Reject request') end end end diff --git a/spec/features/admin/users/users_spec.rb b/spec/features/admin/users/users_spec.rb index d3931373ee3..790c9a4fc74 100644 --- a/spec/features/admin/users/users_spec.rb +++ b/spec/features/admin/users/users_spec.rb @@ -11,291 +11,300 @@ RSpec.describe 'Admin::Users' do gitlab_enable_admin_mode_sign_in(current_user) end - [true, false].each do |vue_admin_users| - context "with vue_admin_users feature flag set to #{vue_admin_users}", js: vue_admin_users do - before do - stub_feature_flags(vue_admin_users: vue_admin_users) - end + describe 'GET /admin/users', :js do + before do + visit admin_users_path + end - describe 'GET /admin/users' do - before do - visit admin_users_path - end + it "is ok" do + expect(current_path).to eq(admin_users_path) + end - it "is ok" do - expect(current_path).to eq(admin_users_path) - end + it "has users list" do + current_user.reload - it "has users list" do - current_user.reload + 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(user.email) + expect(page).to have_content(user.name) + expect(page).to have_content('Projects') - 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(user.email) - expect(page).to have_content(user.name) - expect(page).to have_content('Projects') + click_user_dropdown_toggle(user.id) - click_user_dropdown_toggle(user.id) + expect(page).to have_button('Block') + expect(page).to have_button('Deactivate') + expect(page).to have_button('Delete user') + expect(page).to have_button('Delete user and contributions') + end - expect(page).to have_button('Block') - expect(page).to have_button('Deactivate') - expect(page).to have_button('Delete user') - expect(page).to have_button('Delete user and contributions') - end + it 'clicking edit user takes us to edit page', :aggregate_failures do + page.within("[data-testid='user-actions-#{user.id}']") do + click_link 'Edit' + end - it 'clicking edit user takes us to edit page', :aggregate_failures do - page.within("[data-testid='user-actions-#{user.id}']") do - click_link 'Edit' - end + expect(page).to have_content('Name') + expect(page).to have_content('Password') + end - expect(page).to have_content('Name') - expect(page).to have_content('Password') - end + describe 'view extra user information' do + it 'shows the user popover on hover', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/11290' do + expect(page).not_to have_selector('#__BV_popover_1__') - describe 'view extra user information' do - it 'shows the user popover on hover', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/11290' do - expect(page).not_to have_selector('#__BV_popover_1__') + first_user_link = page.first('.js-user-link') + first_user_link.hover - first_user_link = page.first('.js-user-link') - first_user_link.hover + expect(page).to have_selector('#__BV_popover_1__') + end + end - expect(page).to have_selector('#__BV_popover_1__') - end - end + context 'user project count' do + before do + project = create(:project) + project.add_maintainer(current_user) + end + + it 'displays count of users projects' do + visit admin_users_path - context 'user project count' do - before do - project = create(:project) - project.add_maintainer(current_user) - end + expect(page.find("[data-testid='user-project-count-#{current_user.id}']").text).to eq("1") + end + end - it 'displays count of users projects' do - visit admin_users_path + describe 'tabs' do + it 'has multiple tabs to filter users' do + expect(page).to have_link('Active', href: admin_users_path) + expect(page).to have_link('Admins', href: admin_users_path(filter: 'admins')) + expect(page).to have_link('2FA Enabled', href: admin_users_path(filter: 'two_factor_enabled')) + expect(page).to have_link('2FA Disabled', href: admin_users_path(filter: 'two_factor_disabled')) + expect(page).to have_link('External', href: admin_users_path(filter: 'external')) + expect(page).to have_link('Blocked', href: admin_users_path(filter: 'blocked')) + expect(page).to have_link('Deactivated', href: admin_users_path(filter: 'deactivated')) + expect(page).to have_link('Without projects', href: admin_users_path(filter: 'wop')) + end - expect(page.find("[data-testid='user-project-count-#{current_user.id}']").text).to eq("1") - end + context '`Pending approval` tab' do + before do + visit admin_users_path end - describe 'tabs' do - it 'has multiple tabs to filter users' do - expect(page).to have_link('Active', href: admin_users_path) - expect(page).to have_link('Admins', href: admin_users_path(filter: 'admins')) - expect(page).to have_link('2FA Enabled', href: admin_users_path(filter: 'two_factor_enabled')) - expect(page).to have_link('2FA Disabled', href: admin_users_path(filter: 'two_factor_disabled')) - expect(page).to have_link('External', href: admin_users_path(filter: 'external')) - expect(page).to have_link('Blocked', href: admin_users_path(filter: 'blocked')) - expect(page).to have_link('Banned', href: admin_users_path(filter: 'banned')) - expect(page).to have_link('Deactivated', href: admin_users_path(filter: 'deactivated')) - expect(page).to have_link('Without projects', href: admin_users_path(filter: 'wop')) - end - - context '`Pending approval` tab' do - before do - visit admin_users_path - end - - it 'shows the `Pending approval` tab' do - expect(page).to have_link('Pending approval', href: admin_users_path(filter: 'blocked_pending_approval')) - end - end + it 'shows the `Pending approval` tab' do + expect(page).to have_link('Pending approval', href: admin_users_path(filter: 'blocked_pending_approval')) end + end + end + + describe 'search and sort' do + before_all do + 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 - describe 'search and sort' do - before_all do - 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 + it 'searches users by name' do + visit admin_users_path(search_query: 'Foo') - it 'searches users by name' do - visit admin_users_path(search_query: 'Foo') + expect(page).to have_content('Foo Bar') + expect(page).to have_content('Foo Baz') + expect(page).not_to have_content('Dmitriy') + end - expect(page).to have_content('Foo Bar') - expect(page).to have_content('Foo Baz') - expect(page).not_to have_content('Dmitriy') - end + it 'sorts users by name' do + visit admin_users_path - it 'sorts users by name' do - visit admin_users_path + sort_by('Name') - sort_by('Name') + expect(first_row.text).to include('Dmitriy') + expect(second_row.text).to include('Foo Bar') + end - expect(first_row.text).to include('Dmitriy') - expect(second_row.text).to include('Foo Bar') - end + it 'sorts search results only' do + visit admin_users_path(search_query: 'Foo') - it 'sorts search results only' do - visit admin_users_path(search_query: 'Foo') + sort_by('Name') + expect(page).not_to have_content('Dmitriy') + expect(first_row.text).to include('Foo Bar') + expect(second_row.text).to include('Foo Baz') + end - sort_by('Name') - expect(page).not_to have_content('Dmitriy') - expect(first_row.text).to include('Foo Bar') - expect(second_row.text).to include('Foo Baz') - end + it 'searches with respect of sorting' do + visit admin_users_path(sort: 'Name') + + fill_in :search_query, with: 'Foo' + click_button('Search users') + + expect(first_row.text).to include('Foo Bar') + expect(second_row.text).to include('Foo Baz') + end - it 'searches with respect of sorting' do - visit admin_users_path(sort: 'Name') + it 'sorts users by recent last activity' do + visit admin_users_path(search_query: 'Foo') - fill_in :search_query, with: 'Foo' - click_button('Search users') + sort_by('Recent last activity') - expect(first_row.text).to include('Foo Bar') - expect(second_row.text).to include('Foo Baz') - end + expect(first_row.text).to include('Foo Baz') + expect(second_row.text).to include('Foo Bar') + end - it 'sorts users by recent last activity' do - visit admin_users_path(search_query: 'Foo') + it 'sorts users by oldest last activity' do + visit admin_users_path(search_query: 'Foo') - sort_by('Recent last activity') + sort_by('Oldest last activity') - expect(first_row.text).to include('Foo Baz') - expect(second_row.text).to include('Foo Bar') - end + expect(first_row.text).to include('Foo Bar') + expect(second_row.text).to include('Foo Baz') + end + end - it 'sorts users by oldest last activity' do - visit admin_users_path(search_query: 'Foo') + describe 'Two-factor Authentication filters' do + it 'counts users who have enabled 2FA' do + create(:user, :two_factor) - sort_by('Oldest last activity') + visit admin_users_path - expect(first_row.text).to include('Foo Bar') - expect(second_row.text).to include('Foo Baz') - end + page.within('.filter-two-factor-enabled small') do + expect(page).to have_content('1') end + end - describe 'Two-factor Authentication filters' do - it 'counts users who have enabled 2FA' do - create(:user, :two_factor) + it 'filters by users who have enabled 2FA' do + user = create(:user, :two_factor) - visit admin_users_path + visit admin_users_path + click_link '2FA Enabled' - page.within('.filter-two-factor-enabled small') do - expect(page).to have_content('1') - end - end + expect(page).to have_content(user.email) + end - it 'filters by users who have enabled 2FA' do - user = create(:user, :two_factor) + it 'counts users who have not enabled 2FA' do + visit admin_users_path - visit admin_users_path - click_link '2FA Enabled' + page.within('.filter-two-factor-disabled small') do + expect(page).to have_content('2') # Including admin + end + end - expect(page).to have_content(user.email) - end + it 'filters by users who have not enabled 2FA' do + visit admin_users_path + click_link '2FA Disabled' - it 'counts users who have not enabled 2FA' do - visit admin_users_path + expect(page).to have_content(user.email) + end + end - page.within('.filter-two-factor-disabled small') do - expect(page).to have_content('2') # Including admin - end - end + describe 'Pending approval filter' do + it 'counts users who are pending approval' do + create_list(:user, 2, :blocked_pending_approval) - it 'filters by users who have not enabled 2FA' do - visit admin_users_path - click_link '2FA Disabled' + visit admin_users_path - expect(page).to have_content(user.email) - end + page.within('.filter-blocked-pending-approval small') do + expect(page).to have_content('2') end + end - describe 'Pending approval filter' do - it 'counts users who are pending approval' do - create_list(:user, 2, :blocked_pending_approval) + it 'filters by users who are pending approval' do + user = create(:user, :blocked_pending_approval) - visit admin_users_path + visit admin_users_path + click_link 'Pending approval' - page.within('.filter-blocked-pending-approval small') do - expect(page).to have_content('2') - end - end + expect(page).to have_content(user.email) + end + end - it 'filters by users who are pending approval' do - user = create(:user, :blocked_pending_approval) + context 'when blocking/unblocking a user' do + it 'shows confirmation and allows blocking and unblocking', :js do + expect(page).to have_content(user.email) - visit admin_users_path - click_link 'Pending approval' + click_action_in_user_dropdown(user.id, 'Block') - expect(page).to have_content(user.email) - end - end + wait_for_requests + + expect(page).to have_content('Block user') + expect(page).to have_content('Blocking user has the following effects') + expect(page).to have_content('User will not be able to login') + expect(page).to have_content('Owned groups will be left') - context 'when blocking/unblocking a user' do - it 'shows confirmation and allows blocking and unblocking', :js do - expect(page).to have_content(user.email) + find('.modal-footer button', text: 'Block').click - click_action_in_user_dropdown(user.id, 'Block') + wait_for_requests - wait_for_requests + expect(page).to have_content('Successfully blocked') + expect(page).not_to have_content(user.email) - expect(page).to have_content('Block user') - expect(page).to have_content('Blocking user has the following effects') - expect(page).to have_content('User will not be able to login') - expect(page).to have_content('Owned groups will be left') + click_link 'Blocked' - find('.modal-footer button', text: 'Block').click + wait_for_requests - wait_for_requests + expect(page).to have_content(user.email) - expect(page).to have_content('Successfully blocked') - expect(page).not_to have_content(user.email) + click_action_in_user_dropdown(user.id, 'Unblock') - click_link 'Blocked' + expect(page).to have_content('Unblock user') + expect(page).to have_content('You can always block their account again if needed.') - wait_for_requests + find('.modal-footer button', text: 'Unblock').click - expect(page).to have_content(user.email) + wait_for_requests - click_action_in_user_dropdown(user.id, 'Unblock') + expect(page).to have_content('Successfully unblocked') + expect(page).not_to have_content(user.email) + end + end - expect(page).to have_content('Unblock user') - expect(page).to have_content('You can always block their account again if needed.') + context 'when deactivating/re-activating a user' do + it 'shows confirmation and allows deactivating and re-activating', :js do + expect(page).to have_content(user.email) - find('.modal-footer button', text: 'Unblock').click + click_action_in_user_dropdown(user.id, 'Deactivate') - wait_for_requests + expect(page).to have_content('Deactivate user') + expect(page).to have_content('Deactivating a user has the following effects') + expect(page).to have_content('The user will be logged out') + expect(page).to have_content('Personal projects, group and user history will be left intact') - expect(page).to have_content('Successfully unblocked') - expect(page).not_to have_content(user.email) - end - end + find('.modal-footer button', text: 'Deactivate').click - context 'when deactivating/re-activating a user' do - it 'shows confirmation and allows deactivating and re-activating', :js do - expect(page).to have_content(user.email) + wait_for_requests - click_action_in_user_dropdown(user.id, 'Deactivate') + expect(page).to have_content('Successfully deactivated') + expect(page).not_to have_content(user.email) - expect(page).to have_content('Deactivate user') - expect(page).to have_content('Deactivating a user has the following effects') - expect(page).to have_content('The user will be logged out') - expect(page).to have_content('Personal projects, group and user history will be left intact') + click_link 'Deactivated' - find('.modal-footer button', text: 'Deactivate').click + wait_for_requests - wait_for_requests + expect(page).to have_content(user.email) - expect(page).to have_content('Successfully deactivated') - expect(page).not_to have_content(user.email) + click_action_in_user_dropdown(user.id, 'Activate') - click_link 'Deactivated' + expect(page).to have_content('Activate user') + expect(page).to have_content('You can always deactivate their account again if needed.') - wait_for_requests + find('.modal-footer button', text: 'Activate').click - expect(page).to have_content(user.email) + wait_for_requests - click_action_in_user_dropdown(user.id, 'Activate') + expect(page).to have_content('Successfully activated') + expect(page).not_to have_content(user.email) + end + end - expect(page).to have_content('Activate user') - expect(page).to have_content('You can always deactivate their account again if needed.') + describe 'internal users' do + context 'when showing a `Ghost User`' do + let_it_be(:ghost_user) { create(:user, :ghost) } - find('.modal-footer button', text: 'Activate').click + it 'does not render actions dropdown' do + expect(page).not_to have_css("[data-testid='user-actions-#{ghost_user.id}'] [data-testid='dropdown-toggle']") + end + end - wait_for_requests + context 'when showing a `Bot User`' do + let_it_be(:bot_user) { create(:user, user_type: :alert_bot) } - expect(page).to have_content('Successfully activated') - expect(page).not_to have_content(user.email) - end + it 'does not render actions dropdown' do + expect(page).not_to have_css("[data-testid='user-actions-#{bot_user.id}'] [data-testid='dropdown-toggle']") end end end diff --git a/spec/finders/deployments_finder_spec.rb b/spec/finders/deployments_finder_spec.rb index b294f1117f5..bd03b254f40 100644 --- a/spec/finders/deployments_finder_spec.rb +++ b/spec/finders/deployments_finder_spec.rb @@ -81,16 +81,6 @@ RSpec.describe DeploymentsFinder do it 'returns deployments with matched updated_at' do is_expected.to match_array([deployment_2, deployment_1]) end - - context 'when deployments_finder_implicitly_enforce_ordering_for_updated_at_filter feature flag is disabled' do - before do - stub_feature_flags(deployments_finder_implicitly_enforce_ordering_for_updated_at_filter: false) - end - - it 'returns deployments with matched updated_at' do - is_expected.to match_array([deployment_1, deployment_2]) - end - end end context 'when the environment name is specified' do @@ -244,20 +234,6 @@ RSpec.describe DeploymentsFinder do expect(subject.order_values.first.to_sql).to eq(Deployment.arel_table[:updated_at].asc.to_sql) expect(subject.order_values.second.to_sql).to eq(Deployment.arel_table[:id].asc.to_sql) end - - context 'when deployments_finder_implicitly_enforce_ordering_for_updated_at_filter feature flag is disabled' do - before do - stub_feature_flags(deployments_finder_implicitly_enforce_ordering_for_updated_at_filter: false) - end - - it 'sorts by only one column' do - expect(subject.order_values.size).to eq(1) - end - - it 'sorts by `id`' do - expect(subject.order_values.first.to_sql).to eq(Deployment.arel_table[:id].asc.to_sql) - end - end end context 'when filtering by finished time' do diff --git a/spec/lib/banzai/filter/references/label_reference_filter_spec.rb b/spec/lib/banzai/filter/references/label_reference_filter_spec.rb index db7dda96cad..b18d68c8dd4 100644 --- a/spec/lib/banzai/filter/references/label_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/label_reference_filter_spec.rb @@ -702,4 +702,72 @@ RSpec.describe Banzai::Filter::References::LabelReferenceFilter do expect(result.css('a').first.text).to eq "#{label.name} in #{project.full_name}" end end + + context 'checking N+1' do + let_it_be(:group) { create(:group) } + let_it_be(:group2) { create(:group) } + let_it_be(:project) { create(:project, :public, namespace: group) } + let_it_be(:project2) { create(:project, :public, namespace: group2) } + let_it_be(:project3) { create(:project, :public) } + let_it_be(:project_label) { create(:label, project: project) } + let_it_be(:project_label2) { create(:label, project: project) } + let_it_be(:project2_label) { create(:label, project: project2) } + let_it_be(:group2_label) { create(:group_label, group: group2, color: '#00ff00') } + let_it_be(:project_reference) { "#{project_label.to_reference}" } + let_it_be(:project_reference2) { "#{project_label2.to_reference}" } + let_it_be(:project2_reference) { "#{project2_label.to_reference}" } + let_it_be(:group2_reference) { "#{project2.full_path}~#{group2_label.name}" } + + it 'does not have N+1 per multiple references per project', :use_sql_query_cache do + markdown = "#{project_reference}" + control_count = 1 + + expect do + reference_filter(markdown) + end.not_to exceed_all_query_limit(control_count) + + markdown = "#{project_reference} ~qwert ~werty ~ertyu ~rtyui #{project_reference2}" + + expect do + reference_filter(markdown) + end.not_to exceed_all_query_limit(control_count) + end + + it 'has N+1 for multiple unique project/group references', :use_sql_query_cache do + # reference to already loaded project, only one query + markdown = "#{project_reference}" + control_count = 1 + + expect do + reference_filter(markdown, project: project) + end.not_to exceed_all_query_limit(control_count) + + # Since we're not batching label queries across projects/groups, + # queries increase when a new project/group is added. + # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/330359 + # first reference to already loaded project (1), + # second reference requires project and namespace (2), and label (1) + markdown = "#{project_reference} #{group2_reference}" + max_count = control_count + 3 + + expect do + reference_filter(markdown) + end.not_to exceed_all_query_limit(max_count) + + # third reference to already queried project/namespace, nothing extra (no N+1 here) + markdown = "#{project_reference} #{group2_reference} #{project2_reference}" + + expect do + reference_filter(markdown) + end.not_to exceed_all_query_limit(max_count) + + # last reference needs another namespace and label query (2) + markdown = "#{project_reference} #{group2_reference} #{project2_reference} #{project3.full_path}~test_label" + max_count += 2 + + expect do + reference_filter(markdown) + end.not_to exceed_all_query_limit(max_count) + end + end end diff --git a/spec/lib/banzai/filter/references/reference_cache_spec.rb b/spec/lib/banzai/filter/references/reference_cache_spec.rb index 9e2a6f35910..c9404c381d3 100644 --- a/spec/lib/banzai/filter/references/reference_cache_spec.rb +++ b/spec/lib/banzai/filter/references/reference_cache_spec.rb @@ -55,11 +55,12 @@ RSpec.describe Banzai::Filter::References::ReferenceCache do cache_single.load_records_per_parent end.count + expect(control_count).to eq 1 + # Since this is an issue filter that is not batching issue queries # across projects, we have to account for that. - # 1 for both projects, 1 for issues in each project == 3 - # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/330359 - max_count = control_count + 1 + # 1 for original issue, 2 for second route/project, 1 for other issue + max_count = control_count + 3 expect do cache.load_references_per_parent(filter.nodes) diff --git a/spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb b/spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb index 7ab3b24b1c2..2e324669870 100644 --- a/spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb @@ -233,13 +233,15 @@ RSpec.describe Banzai::Filter::References::SnippetReferenceFilter do reference_filter(markdown) end.count + expect(control_count).to eq 1 + markdown = "#{reference} $9999990 $9999991 $9999992 $9999993 #{reference2} something/cool$12" # Since we're not batching snippet queries across projects, # we have to account for that. # 1 for both projects, 1 for snippets in each project == 3 # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/330359 - max_count = control_count + 1 + max_count = control_count + 2 expect do reference_filter(markdown) diff --git a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb index bc5e6ea7bb3..9f6851ecfbd 100644 --- a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb @@ -600,9 +600,8 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do setup_import_export_config('light') setup_reader(reader) - expect(project) - .to receive(:merge_requests) - .and_raise(exception) + expect(project).to receive(:merge_requests).and_call_original + expect(project).to receive(:merge_requests).and_raise(exception) end it 'report post import error' do @@ -618,12 +617,9 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do setup_import_export_config('light') setup_reader(reader) - expect(project) - .to receive(:merge_requests) - .and_raise(exception) - expect(project) - .to receive(:merge_requests) - .and_call_original + expect(project).to receive(:merge_requests).and_call_original + expect(project).to receive(:merge_requests).and_raise(exception) + expect(project).to receive(:merge_requests).and_call_original expect(restored_project_json).to eq(true) end diff --git a/spec/views/admin/users/_user.html.haml_spec.rb b/spec/views/admin/users/_user.html.haml_spec.rb deleted file mode 100644 index aed05e4ea9b..00000000000 --- a/spec/views/admin/users/_user.html.haml_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'admin/users/_user.html.haml' do - before do - allow(view).to receive(:user).and_return(user) - end - - context 'internal users' do - context 'when showing a `Ghost User`' do - let(:user) { create(:user, :ghost) } - - it 'does not render action buttons' do - render - - expect(rendered).not_to have_selector('.table-action-buttons') - end - end - - context 'when showing a `Bot User`' do - let(:user) { create(:user, user_type: :alert_bot) } - - it 'does not render action buttons' do - render - - expect(rendered).not_to have_selector('.table-action-buttons') - end - end - - context 'when showing a `Migration User`' do - let(:user) { create(:user, user_type: :migration_bot) } - - it 'does not render action buttons' do - render - - expect(rendered).not_to have_selector('.table-action-buttons') - end - end - end - - context 'when showing an external user' do - let(:user) { create(:user) } - - it 'renders action buttons' do - render - - expect(rendered).to have_selector('.table-action-buttons') - end - end -end diff --git a/spec/workers/ssh_keys/expired_notification_worker_spec.rb b/spec/workers/ssh_keys/expired_notification_worker_spec.rb index 0fc999a81d6..84f8f8d7b83 100644 --- a/spec/workers/ssh_keys/expired_notification_worker_spec.rb +++ b/spec/workers/ssh_keys/expired_notification_worker_spec.rb @@ -15,6 +15,20 @@ RSpec.describe SshKeys::ExpiredNotificationWorker, type: :worker do describe '#perform' do let_it_be(:user) { create(:user) } + context 'with a large batch' do + before do + stub_const("SshKeys::ExpiredNotificationWorker::BATCH_SIZE", 5) + end + + let_it_be_with_reload(:keys) { create_list(:key, 20, expires_at: 3.days.ago, user: user) } + + it 'updates all keys regardless of batch size' do + worker.perform + + expect(keys.pluck(:expiry_notification_delivered_at)).not_to include(nil) + end + end + context 'with expiring key today' do let_it_be_with_reload(:expired_today) { create(:key, expires_at: Time.current, user: user) } |