Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-10-20 15:10:59 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-10-20 15:10:59 +0300
commit34c88d512f2697cd96dd3788e8ffaf1b9c8935b4 (patch)
treee7fb4118737b248dedc4111e71fc9514490cb6ea /spec
parent9fa24e4f9c5440e2ddc27cd787df5f5e669bed25 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/features/ide/user_opens_merge_request_spec.rb6
-rw-r--r--spec/features/invites_spec.rb3
-rw-r--r--spec/features/issuables/shortcuts_issuable_spec.rb4
-rw-r--r--spec/features/issues/issue_sidebar_spec.rb183
-rw-r--r--spec/features/issues/service_desk_spec.rb8
-rw-r--r--spec/features/issues/todo_spec.rb10
-rw-r--r--spec/features/issues/user_edits_issue_spec.rb181
-rw-r--r--spec/features/merge_request/user_edits_assignees_sidebar_spec.rb207
-rw-r--r--spec/features/search/user_searches_for_code_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_comments_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_commits_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_issues_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_merge_requests_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_milestones_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_projects_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_users_spec.rb6
-rw-r--r--spec/features/search/user_searches_for_wiki_pages_spec.rb2
-rw-r--r--spec/features/snippets/search_snippets_spec.rb2
-rw-r--r--spec/features/users/terms_spec.rb8
-rw-r--r--spec/finders/ci/runners_finder_spec.rb46
-rw-r--r--spec/frontend/sentry/sentry_browser_wrapper_spec.js29
-rw-r--r--spec/graphql/resolvers/ci/runners_resolver_spec.rb26
-rw-r--r--spec/lib/generators/gitlab/snowplow_event_definition_generator_spec.rb95
-rw-r--r--spec/lib/gitlab/job_waiter_spec.rb33
-rw-r--r--spec/models/ci/runner_manager_spec.rb64
-rw-r--r--spec/models/ci/runner_spec.rb20
-rw-r--r--spec/models/commit_status_spec.rb18
-rw-r--r--spec/policies/project_policy_spec.rb22
-rw-r--r--spec/requests/projects/ml/models_controller_spec.rb50
-rw-r--r--spec/spec_helper.rb1
-rw-r--r--spec/support/helpers/features/dom_helpers.rb4
-rw-r--r--spec/support/helpers/search_helpers.rb20
-rw-r--r--spec/support/rspec_order_todo.yml1
-rw-r--r--spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb26
-rw-r--r--spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb2
-rw-r--r--spec/tooling/danger/feature_flag_spec.rb2
36 files changed, 434 insertions, 659 deletions
diff --git a/spec/features/ide/user_opens_merge_request_spec.rb b/spec/features/ide/user_opens_merge_request_spec.rb
index 1d3cada57db..a8a56ffe310 100644
--- a/spec/features/ide/user_opens_merge_request_spec.rb
+++ b/spec/features/ide/user_opens_merge_request_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'IDE merge request', :js, feature_category: :web_ide do
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public, :repository, namespace: user.namespace) }
let_it_be(:merge_request) { create(:merge_request, :simple, source_project: project) }
@@ -16,7 +16,9 @@ RSpec.describe 'IDE merge request', :js, feature_category: :web_ide do
end
it 'user opens merge request' do
- click_button 'Code'
+ within '.merge-request' do
+ click_button 'Code'
+ end
click_link 'Open in Web IDE'
wait_for_requests
diff --git a/spec/features/invites_spec.rb b/spec/features/invites_spec.rb
index c86d4c260ee..bc6efb63f6f 100644
--- a/spec/features/invites_spec.rb
+++ b/spec/features/invites_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate
end
context 'when invite is sent before account is created;ldap or service sign in for manual acceptance edge case' do
- let(:user) { create(:user, :no_super_sidebar, email: 'user@example.com') }
+ let(:user) { create(:user, email: 'user@example.com') }
context 'when invite clicked and not signed in' do
before do
@@ -85,7 +85,6 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate
it 'shows message user already a member' do
expect(page).to have_current_path(invite_path(group_invite.raw_invite_token), ignore_query: true)
- expect(page).to have_link(user.name, href: user_path(user))
expect(page).to have_content('You are already a member of this group.')
end
end
diff --git a/spec/features/issuables/shortcuts_issuable_spec.rb b/spec/features/issuables/shortcuts_issuable_spec.rb
index 06387c14ee2..6bb453c34e6 100644
--- a/spec/features/issuables/shortcuts_issuable_spec.rb
+++ b/spec/features/issuables/shortcuts_issuable_spec.rb
@@ -58,14 +58,13 @@ RSpec.describe 'Blob shortcuts', :js, feature_category: :team_planning do
it "opens assignee dropdown for editing" do
find('body').native.send_key('a')
- expect(find('.block.assignee')).to have_selector('.js-sidebar-assignee-data')
+ expect(find('.block.assignee')).to have_selector('.dropdown-menu-user')
end
end
describe 'pressing "a"' do
describe 'On an Issue' do
before do
- stub_feature_flags(issue_assignees_widget: false)
visit project_issue_path(project, issue)
wait_for_requests
end
@@ -75,7 +74,6 @@ RSpec.describe 'Blob shortcuts', :js, feature_category: :team_planning do
describe 'On a Merge Request' do
before do
- stub_feature_flags(issue_assignees_widget: false)
visit project_merge_request_path(project, merge_request)
wait_for_requests
end
diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb
index a015a83c793..e4df106de07 100644
--- a/spec/features/issues/issue_sidebar_spec.rb
+++ b/spec/features/issues/issue_sidebar_spec.rb
@@ -26,179 +26,66 @@ RSpec.describe 'Issue Sidebar', feature_category: :team_planning do
let(:user2) { create(:user) }
let(:issue2) { create(:issue, project: project, author: user2) }
- context 'when GraphQL assignees widget feature flag is disabled' do
- before do
- stub_feature_flags(issue_assignees_widget: false)
- end
+ include_examples 'issuable invite members' do
+ let(:issuable_path) { project_issue_path(project, issue2) }
+ end
- include_examples 'issuable invite members' do
- let(:issuable_path) { project_issue_path(project, issue2) }
+ context 'when user is a developer' do
+ before do
+ project.add_developer(user)
+ visit_issue(project, issue2)
end
- context 'when user is a developer' do
- before do
- project.add_developer(user)
- visit_issue(project, issue2)
-
- find('.block.assignee .edit-link').click
- wait_for_requests
- end
-
- it 'shows author in assignee dropdown' do
- page.within '.dropdown-menu-user' do
- expect(page).to have_content(user2.name)
- end
- end
-
- it 'shows author when filtering assignee dropdown' do
- page.within '.dropdown-menu-user' do
- find('.dropdown-input-field').set(user2.name)
-
- wait_for_requests
-
- expect(page).to have_content(user2.name)
- end
- end
-
- it 'assigns yourself' do
- find('.block.assignee .dropdown-menu-toggle').click
-
- click_button 'assign yourself'
-
- wait_for_requests
-
- find('.block.assignee .edit-link').click
-
- page.within '.dropdown-menu-user' do
- expect(page.find('.dropdown-header')).to be_visible
- expect(page.find('.dropdown-menu-user-link.is-active')).to have_content(user.name)
- end
- end
-
- it 'keeps your filtered term after filtering and dismissing the dropdown' do
- find('.dropdown-input-field').set(user2.name)
-
- wait_for_requests
-
- page.within '.dropdown-menu-user' do
- expect(page).not_to have_content 'Unassigned'
- click_link user2.name
- end
-
- within '.js-right-sidebar' do
- find('.block.assignee').click(x: 0, y: 0, offset: 0)
- find('.block.assignee .edit-link').click
- end
-
- expect(page.all('.dropdown-menu-user li').length).to eq(6)
- expect(find('.dropdown-input-field').value).to eq('')
- end
-
- it 'shows label text as "Apply" when assignees are changed' do
- project.add_developer(user)
- visit_issue(project, issue2)
-
- find('.block.assignee .edit-link').click
- wait_for_requests
+ it 'shows author in assignee dropdown' do
+ open_assignees_dropdown
- click_on 'Unassigned'
-
- expect(page).to have_link('Apply')
+ page.within '.dropdown-menu-user' do
+ expect(page).to have_content(user2.name)
end
end
- end
-
- context 'when GraphQL assignees widget feature flag is enabled' do
- # TODO: Move to shared examples when feature flag is removed: https://gitlab.com/gitlab-org/gitlab/-/issues/328185
- context 'when a privileged user can invite' do
- it 'shows a link for inviting members and launches invite modal' do
- project.add_maintainer(user)
- visit_issue(project, issue2)
- open_assignees_dropdown
+ it 'shows author when filtering assignee dropdown' do
+ open_assignees_dropdown
- page.within '.dropdown-menu-user' do
- expect(page).to have_link('Invite members')
+ page.within '.dropdown-menu-user' do
+ find('[data-testid="user-search-input"]').set(user2.name)
- click_link 'Invite members'
- end
+ wait_for_requests
- page.within invite_modal_selector do
- expect(page).to have_content("You're inviting members to the #{project.name} project")
- end
+ expect(page).to have_content(user2.name)
end
end
- context 'when user cannot invite members in assignee dropdown' do
- it 'shows author in assignee dropdown and no invite link' do
- project.add_developer(user)
- visit_issue(project, issue2)
-
- open_assignees_dropdown
+ it 'assigns yourself' do
+ click_button 'assign yourself'
+ wait_for_requests
- page.within '.dropdown-menu-user' do
- expect(page).not_to have_link('Invite members')
- end
+ page.within '.assignee' do
+ expect(page).to have_content(user.name)
end
end
- context 'when user is a developer' do
- before do
- project.add_developer(user)
- visit_issue(project, issue2)
- end
+ it 'keeps your filtered term after filtering and dismissing the dropdown' do
+ open_assignees_dropdown
- it 'shows author in assignee dropdown' do
- open_assignees_dropdown
+ find('[data-testid="user-search-input"]').set(user2.name)
+ wait_for_requests
- page.within '.dropdown-menu-user' do
- expect(page).to have_content(user2.name)
- end
+ page.within '.dropdown-menu-user' do
+ expect(page).not_to have_content 'Unassigned'
+ click_button user2.name
end
- it 'shows author when filtering assignee dropdown' do
- open_assignees_dropdown
-
- page.within '.dropdown-menu-user' do
- find('[data-testid="user-search-input"]').set(user2.name)
-
- wait_for_requests
+ find('.participants').click
+ wait_for_requests
- expect(page).to have_content(user2.name)
- end
- end
-
- it 'assigns yourself' do
- click_button 'assign yourself'
- wait_for_requests
+ open_assignees_dropdown
- page.within '.assignee' do
- expect(page).to have_content(user.name)
- end
+ page.within('.assignee') do
+ expect(page.all('[data-testid="selected-participant"]').length).to eq(1)
end
- it 'keeps your filtered term after filtering and dismissing the dropdown' do
- open_assignees_dropdown
-
- find('[data-testid="user-search-input"]').set(user2.name)
- wait_for_requests
-
- page.within '.dropdown-menu-user' do
- expect(page).not_to have_content 'Unassigned'
- click_button user2.name
- end
-
- find('.participants').click
- wait_for_requests
-
- open_assignees_dropdown
-
- page.within('.assignee') do
- expect(page.all('[data-testid="selected-participant"]').length).to eq(1)
- end
-
- expect(find('[data-testid="user-search-input"]').value).to eq(user2.name)
- end
+ expect(find('[data-testid="user-search-input"]').value).to eq(user2.name)
end
end
end
diff --git a/spec/features/issues/service_desk_spec.rb b/spec/features/issues/service_desk_spec.rb
index 8e952a23f05..8662f0f98f5 100644
--- a/spec/features/issues/service_desk_spec.rb
+++ b/spec/features/issues/service_desk_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_desk do
let(:project) { create(:project, :private, service_desk_enabled: true) }
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
let_it_be(:support_bot) { Users::Internal.support_bot }
before do
@@ -21,8 +21,10 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des
describe 'navigation to service desk' do
before do
visit project_path(project)
- find('.sidebar-top-level-items .shortcuts-issues').click
- find('.sidebar-sub-level-items a', text: 'Service Desk').click
+ find('#menu-section-button-monitor').click
+ within('#monitor') do
+ click_link('Service Desk')
+ end
end
it 'can navigate to the service desk from link in the sidebar' do
diff --git a/spec/features/issues/todo_spec.rb b/spec/features/issues/todo_spec.rb
index 2095453ac29..458e3fac517 100644
--- a/spec/features/issues/todo_spec.rb
+++ b/spec/features/issues/todo_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe 'Manually create a todo item from issue', :js, feature_category: :team_planning do
let!(:project) { create(:project) }
let!(:issue) { create(:issue, project: project) }
- let!(:user) { create(:user, :no_super_sidebar) }
+ let!(:user) { create(:user) }
before do
stub_feature_flags(notifications_todos_buttons: false)
@@ -20,13 +20,13 @@ RSpec.describe 'Manually create a todo item from issue', :js, feature_category:
expect(page).to have_content 'Mark as done'
end
- page.within ".header-content span[aria-label='#{_('Todos count')}']" do
+ within_testid 'todos-shortcut-button' do
expect(page).to have_content '1'
end
visit project_issue_path(project, issue)
- page.within ".header-content span[aria-label='#{_('Todos count')}']" do
+ within_testid 'todos-shortcut-button' do
expect(page).to have_content '1'
end
end
@@ -37,10 +37,10 @@ RSpec.describe 'Manually create a todo item from issue', :js, feature_category:
click_button 'Mark as done'
end
- expect(page).to have_selector(".header-content span[aria-label='#{_('Todos count')}']", visible: false)
+ expect(page).to have_selector("[data-testid='todos-shortcut-button']", text: '')
visit project_issue_path(project, issue)
- expect(page).to have_selector(".header-content span[aria-label='#{_('Todos count')}']", visible: false)
+ expect(page).to have_selector("[data-testid='todos-shortcut-button']", text: '')
end
end
diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb
index 7919e8f7ed4..e9bf1ef542b 100644
--- a/spec/features/issues/user_edits_issue_spec.rb
+++ b/spec/features/issues/user_edits_issue_spec.rb
@@ -210,166 +210,79 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
end
describe 'update assignee' do
- context 'when GraphQL assignees widget feature flag is disabled' do
- before do
- stub_feature_flags(issue_assignees_widget: false)
- end
-
- context 'by authorized user' do
- def close_dropdown_menu_if_visible
- find('.dropdown-menu-toggle', visible: :all).tap do |toggle|
- toggle.click if toggle.visible?
- end
- end
-
- it 'allows user to select unassigned' do
- visit project_issue_path(project, issue)
-
- page.within('.assignee') do
- expect(page).to have_content user.name.to_s
-
- click_link 'Edit'
- click_link 'Unassigned'
-
- close_dropdown_menu_if_visible
-
- expect(page).to have_content 'None - assign yourself'
- end
- end
-
- it 'allows user to select an assignee' do
- issue2 = create(:issue, project: project, author: user)
- visit project_issue_path(project, issue2)
-
- page.within('.assignee') do
- expect(page).to have_content "None"
- end
-
- page.within '.assignee' do
- click_link 'Edit'
- end
-
- page.within '.dropdown-menu-user' do
- click_link user.name
- end
-
- page.within('.assignee') do
- expect(page).to have_content user.name
- end
- end
-
- it 'allows user to unselect themselves' do
- issue2 = create(:issue, project: project, author: user, assignees: [user])
-
- visit project_issue_path(project, issue2)
+ context 'by authorized user' do
+ it 'allows user to select unassigned' do
+ visit project_issue_path(project, issue)
- page.within '.assignee' do
- expect(page).to have_content user.name
+ page.within('.assignee') do
+ expect(page).to have_content user.name.to_s
- click_link 'Edit'
- click_link user.name
+ click_button('Edit')
+ wait_for_requests
- close_dropdown_menu_if_visible
+ find('[data-testid="unassign"]').click
+ find('[data-testid="title"]').click
+ wait_for_requests
- page.within '[data-testid="no-value"]' do
- expect(page).to have_content "None"
- end
- end
+ expect(page).to have_content 'None - assign yourself'
end
end
- context 'by unauthorized user' do
- let(:guest) { create(:user) }
-
- before do
- project.add_guest(guest)
- end
-
- it 'shows assignee text' do
- sign_out(:user)
- sign_in(guest)
+ it 'allows user to select an assignee' do
+ issue2 = create(:issue, project: project, author: user)
+ visit project_issue_path(project, issue2)
- visit project_issue_path(project, issue)
- expect(page).to have_content issue.assignees.first.name
+ page.within('.assignee') do
+ expect(page).to have_content "None"
+ click_button('Edit')
+ wait_for_requests
end
- end
- end
-
- context 'when GraphQL assignees widget feature flag is enabled' do
- context 'by authorized user' do
- it 'allows user to select unassigned' do
- visit project_issue_path(project, issue)
-
- page.within('.assignee') do
- expect(page).to have_content user.name.to_s
-
- click_button('Edit')
- wait_for_requests
-
- find('[data-testid="unassign"]').click
- find('[data-testid="title"]').click
- wait_for_requests
- expect(page).to have_content 'None - assign yourself'
- end
+ page.within '.dropdown-menu-user' do
+ click_button user.name
end
- it 'allows user to select an assignee' do
- issue2 = create(:issue, project: project, author: user)
- visit project_issue_path(project, issue2)
-
- page.within('.assignee') do
- expect(page).to have_content "None"
- click_button('Edit')
- wait_for_requests
- end
-
- page.within '.dropdown-menu-user' do
- click_button user.name
- end
-
- page.within('.assignee') do
- find('[data-testid="title"]').click
- wait_for_requests
+ page.within('.assignee') do
+ find('[data-testid="title"]').click
+ wait_for_requests
- expect(page).to have_content user.name
- end
+ expect(page).to have_content user.name
end
+ end
- it 'allows user to unselect themselves' do
- issue2 = create(:issue, project: project, author: user, assignees: [user])
+ it 'allows user to unselect themselves' do
+ issue2 = create(:issue, project: project, author: user, assignees: [user])
- visit project_issue_path(project, issue2)
+ visit project_issue_path(project, issue2)
- page.within '.assignee' do
- expect(page).to have_content user.name
+ page.within '.assignee' do
+ expect(page).to have_content user.name
- click_button('Edit')
- wait_for_requests
- click_button user.name
+ click_button('Edit')
+ wait_for_requests
+ click_button user.name
- find('[data-testid="title"]').click
- wait_for_requests
+ find('[data-testid="title"]').click
+ wait_for_requests
- expect(page).to have_content "None"
- end
+ expect(page).to have_content "None"
end
end
+ end
- context 'by unauthorized user' do
- let(:guest) { create(:user) }
+ context 'by unauthorized user' do
+ let(:guest) { create(:user) }
- before do
- project.add_guest(guest)
- end
+ before do
+ project.add_guest(guest)
+ end
- it 'shows assignee text' do
- sign_out(:user)
- sign_in(guest)
+ it 'shows assignee text' do
+ sign_out(:user)
+ sign_in(guest)
- visit project_issue_path(project, issue)
- expect(page).to have_content issue.assignees.first.name
- end
+ visit project_issue_path(project, issue)
+ expect(page).to have_content issue.assignees.first.name
end
end
end
diff --git a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
index 2fcbb4e70c3..ae95bc3e11f 100644
--- a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
+++ b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
@@ -34,202 +34,81 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
let(:sidebar_assignee_tooltip) { sidebar_assignee_avatar_link['title'] || '' }
let(:sidebar_assignee_merge_ability) { sidebar_assignee_avatar_link['data-cannot-merge'] || '' }
- context 'when GraphQL assignees widget feature flag is disabled' do
- let(:sidebar_assignee_dropdown_item) do
- sidebar_assignee_block.find(".dropdown-menu li[data-user-id=\"#{assignee.id}\"]")
- end
-
- let(:sidebar_assignee_dropdown_tooltip) { sidebar_assignee_dropdown_item.find('a')['data-title'] || '' }
+ let(:sidebar_assignee_dropdown_item) { sidebar_assignee_block.find(".dropdown-item", text: assignee.username) }
+ let(:sidebar_assignee_dropdown_tooltip) { sidebar_assignee_dropdown_item['title'] }
+ context 'when user is an owner' do
before do
- stub_feature_flags(issue_assignees_widget: false)
- end
+ stub_const('Autocomplete::UsersFinder::LIMIT', users_find_limit)
- context 'when user is an owner' do
- before do
- stub_const('Autocomplete::UsersFinder::LIMIT', users_find_limit)
+ sign_in(owner)
- sign_in(owner)
+ merge_request.assignees << assignee
- merge_request.assignees << assignee
+ visit project_merge_request_path(project, merge_request)
- visit project_merge_request_path(project, merge_request)
+ wait_for_requests
+ end
- wait_for_requests
+ shared_examples 'when assigned' do |expected_tooltip: '', expected_cannot_merge: ''|
+ it 'shows assignee name' do
+ expect(sidebar_assignee_block).to have_text(assignee.name)
end
- shared_examples 'when assigned' do |expected_tooltip: '', expected_cannot_merge: ''|
- it 'shows assignee name' do
- expect(sidebar_assignee_block).to have_text(assignee.name)
- end
+ it "sets data-cannot-merge to '#{expected_cannot_merge}'" do
+ expect(sidebar_assignee_merge_ability).to eql(expected_cannot_merge)
+ end
- it "sets data-cannot-merge to '#{expected_cannot_merge}'" do
- expect(sidebar_assignee_merge_ability).to eql(expected_cannot_merge)
+ context 'when edit is clicked' do
+ before do
+ open_assignees_dropdown
end
- context 'when edit is clicked' do
- before do
- sidebar_assignee_block.click_link('Edit')
-
- wait_for_requests
- end
-
- it "shows assignee tooltip '#{expected_tooltip}" do
- expect(sidebar_assignee_dropdown_tooltip).to eql(expected_tooltip)
- end
+ it "shows assignee tooltip '#{expected_tooltip}" do
+ expect(sidebar_assignee_dropdown_tooltip).to eql(expected_tooltip)
end
end
-
- context 'when assigned to maintainer' do
- let(:assignee) { project_maintainers.last }
-
- it_behaves_like 'when assigned', expected_tooltip: ''
- end
-
- context 'when assigned to developer' do
- let(:assignee) { project_developers.last }
-
- it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge', expected_cannot_merge: 'true'
- end
end
- context 'with members shared into ancestors of the project' do
- before do
- sign_in(owner)
-
- visit project_merge_request_path(project, merge_request)
- wait_for_requests
+ context 'when assigned to maintainer' do
+ let(:assignee) { project_maintainers.last }
- sidebar_assignee_block.click_link('Edit')
- wait_for_requests
- end
-
- it 'contains the members shared into ancestors of the projects' do
- page.within '.dropdown-menu-user' do
- expect(page).to have_content shared_into_ancestor_user.name
- end
- end
+ it_behaves_like 'when assigned', expected_tooltip: ''
end
- context 'with invite members considerations' do
- let_it_be(:user) { create(:user) }
+ context 'when assigned to developer' do
+ let(:assignee) { project_developers.last }
- before do
- sign_in(user)
- end
-
- include_examples 'issuable invite members' do
- let(:issuable_path) { project_merge_request_path(project, merge_request) }
- end
+ it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge', expected_cannot_merge: 'true'
end
end
- context 'when GraphQL assignees widget feature flag is enabled' do
- let(:sidebar_assignee_dropdown_item) { sidebar_assignee_block.find(".dropdown-item", text: assignee.username) }
- let(:sidebar_assignee_dropdown_tooltip) { sidebar_assignee_dropdown_item['title'] }
-
- context 'when user is an owner' do
- before do
- stub_const('Autocomplete::UsersFinder::LIMIT', users_find_limit)
-
- sign_in(owner)
-
- merge_request.assignees << assignee
-
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
- end
-
- shared_examples 'when assigned' do |expected_tooltip: '', expected_cannot_merge: ''|
- it 'shows assignee name' do
- expect(sidebar_assignee_block).to have_text(assignee.name)
- end
-
- it "sets data-cannot-merge to '#{expected_cannot_merge}'" do
- expect(sidebar_assignee_merge_ability).to eql(expected_cannot_merge)
- end
-
- context 'when edit is clicked' do
- before do
- open_assignees_dropdown
- end
-
- it "shows assignee tooltip '#{expected_tooltip}" do
- expect(sidebar_assignee_dropdown_tooltip).to eql(expected_tooltip)
- end
- end
- end
-
- context 'when assigned to maintainer' do
- let(:assignee) { project_maintainers.last }
-
- it_behaves_like 'when assigned', expected_tooltip: ''
- end
+ context 'with members shared into ancestors of the project' do
+ before do
+ sign_in(owner)
- context 'when assigned to developer' do
- let(:assignee) { project_developers.last }
+ visit project_merge_request_path(project, merge_request)
+ wait_for_requests
- it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge', expected_cannot_merge: 'true'
- end
+ open_assignees_dropdown
end
- context 'with members shared into ancestors of the project' do
- before do
- sign_in(owner)
-
- visit project_merge_request_path(project, merge_request)
- wait_for_requests
-
- open_assignees_dropdown
- end
-
- it 'contains the members shared into ancestors of the projects' do
- page.within '.dropdown-menu-user' do
- expect(page).to have_content shared_into_ancestor_user.name
- end
+ it 'contains the members shared into ancestors of the projects' do
+ page.within '.dropdown-menu-user' do
+ expect(page).to have_content shared_into_ancestor_user.name
end
end
+ end
- context 'with invite members considerations' do
- let_it_be(:user) { create(:user) }
-
- before do
- sign_in(user)
- end
-
- # TODO: Move to shared examples when feature flag is removed: https://gitlab.com/gitlab-org/gitlab/-/issues/328185
- context 'when a privileged user can invite' do
- it 'shows a link for inviting members and launches invite modal' do
- project.add_maintainer(user)
- visit project_merge_request_path(project, merge_request)
-
- open_assignees_dropdown
-
- page.within '.dropdown-menu-user' do
- expect(page).to have_link('Invite members')
-
- click_link 'Invite members'
- end
-
- page.within invite_modal_selector do
- expect(page).to have_content("You're inviting members to the #{project.name} project")
- end
- end
- end
-
- context 'when user cannot invite members in assignee dropdown' do
- it 'shows author in assignee dropdown and no invite link' do
- project.add_developer(user)
- visit project_merge_request_path(project, merge_request)
+ context 'with invite members considerations' do
+ let_it_be(:user) { create(:user) }
- open_assignees_dropdown
+ before do
+ sign_in(user)
+ end
- page.within '.dropdown-menu-user' do
- expect(page).not_to have_link('Invite members')
- end
- end
- end
+ include_examples 'issuable invite members' do
+ let(:issuable_path) { project_merge_request_path(project, merge_request) }
end
end
diff --git a/spec/features/search/user_searches_for_code_spec.rb b/spec/features/search/user_searches_for_code_spec.rb
index d2847203669..976324a5032 100644
--- a/spec/features/search/user_searches_for_code_spec.rb
+++ b/spec/features/search/user_searches_for_code_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'User searches for code', :js, :disable_rate_limiter, feature_cat
using RSpec::Parameterized::TableSyntax
include ListboxHelpers
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
let_it_be_with_reload(:project) { create(:project, :repository, namespace: user.namespace) }
context 'when signed in' do
diff --git a/spec/features/search/user_searches_for_comments_spec.rb b/spec/features/search/user_searches_for_comments_spec.rb
index f47e692c652..f7af1797c71 100644
--- a/spec/features/search/user_searches_for_comments_spec.rb
+++ b/spec/features/search/user_searches_for_comments_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe 'User searches for comments', :js, :disable_rate_limiter, feature_category: :global_search do
let_it_be(:project) { create(:project, :repository) }
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
before do
project.add_reporter(user)
diff --git a/spec/features/search/user_searches_for_commits_spec.rb b/spec/features/search/user_searches_for_commits_spec.rb
index 140d8763813..724daf9277d 100644
--- a/spec/features/search/user_searches_for_commits_spec.rb
+++ b/spec/features/search/user_searches_for_commits_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User searches for commits', :js, :clean_gitlab_redis_rate_limiting, feature_category: :global_search do
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository) }
let(:sha) { '6d394385cf567f80a8fd85055db1ab4c5295806f' }
diff --git a/spec/features/search/user_searches_for_issues_spec.rb b/spec/features/search/user_searches_for_issues_spec.rb
index d816b393cce..9451e337db1 100644
--- a/spec/features/search/user_searches_for_issues_spec.rb
+++ b/spec/features/search/user_searches_for_issues_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User searches for issues', :js, :clean_gitlab_redis_rate_limiting, feature_category: :global_search do
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) }
let!(:issue1) { create(:issue, title: 'issue Foo', project: project, created_at: 1.hour.ago) }
diff --git a/spec/features/search/user_searches_for_merge_requests_spec.rb b/spec/features/search/user_searches_for_merge_requests_spec.rb
index 61af5e86eea..d7b52d9e07a 100644
--- a/spec/features/search/user_searches_for_merge_requests_spec.rb
+++ b/spec/features/search/user_searches_for_merge_requests_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User searches for merge requests', :js, :clean_gitlab_redis_rate_limiting, feature_category: :global_search do
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) }
let_it_be(:merge_request1) { create(:merge_request, title: 'Merge Request Foo', source_project: project, target_project: project, created_at: 1.hour.ago) }
let_it_be(:merge_request2) { create(:merge_request, :simple, title: 'Merge Request Bar', source_project: project, target_project: project) }
diff --git a/spec/features/search/user_searches_for_milestones_spec.rb b/spec/features/search/user_searches_for_milestones_spec.rb
index ad62c8eb3da..7ca7958f61b 100644
--- a/spec/features/search/user_searches_for_milestones_spec.rb
+++ b/spec/features/search/user_searches_for_milestones_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe 'User searches for milestones', :js, :clean_gitlab_redis_rate_limiting,
feature_category: :global_search do
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) }
let_it_be(:milestone1) { create(:milestone, title: 'Foo', project: project) }
let_it_be(:milestone2) { create(:milestone, title: 'Bar', project: project) }
diff --git a/spec/features/search/user_searches_for_projects_spec.rb b/spec/features/search/user_searches_for_projects_spec.rb
index 51e5ad85e2b..48a94161927 100644
--- a/spec/features/search/user_searches_for_projects_spec.rb
+++ b/spec/features/search/user_searches_for_projects_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe 'User searches for projects', :js, :disable_rate_limiter, feature
context 'when signed out' do
context 'when block_anonymous_global_searches is disabled' do
before do
- stub_feature_flags(block_anonymous_global_searches: false, super_sidebar_logged_out: false)
+ stub_feature_flags(block_anonymous_global_searches: false)
end
include_examples 'top right search form'
diff --git a/spec/features/search/user_searches_for_users_spec.rb b/spec/features/search/user_searches_for_users_spec.rb
index b52f6aeba68..e0a07c5103d 100644
--- a/spec/features/search/user_searches_for_users_spec.rb
+++ b/spec/features/search/user_searches_for_users_spec.rb
@@ -3,9 +3,9 @@
require 'spec_helper'
RSpec.describe 'User searches for users', :js, :clean_gitlab_redis_rate_limiting, feature_category: :global_search do
- let_it_be(:user1) { create(:user, :no_super_sidebar, username: 'gob_bluth', name: 'Gob Bluth') }
- let_it_be(:user2) { create(:user, :no_super_sidebar, username: 'michael_bluth', name: 'Michael Bluth') }
- let_it_be(:user3) { create(:user, :no_super_sidebar, username: 'gob_2018', name: 'George Oscar Bluth') }
+ let_it_be(:user1) { create(:user, username: 'gob_bluth', name: 'Gob Bluth') }
+ let_it_be(:user2) { create(:user, username: 'michael_bluth', name: 'Michael Bluth') }
+ let_it_be(:user3) { create(:user, username: 'gob_2018', name: 'George Oscar Bluth') }
before do
sign_in(user1)
diff --git a/spec/features/search/user_searches_for_wiki_pages_spec.rb b/spec/features/search/user_searches_for_wiki_pages_spec.rb
index a5b63243d0b..65f262075f9 100644
--- a/spec/features/search/user_searches_for_wiki_pages_spec.rb
+++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe 'User searches for wiki pages', :js, :clean_gitlab_redis_rate_limiting,
feature_category: :global_search do
- let_it_be(:user) { create(:user, :no_super_sidebar) }
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) }
let_it_be(:wiki_page) do
create(:wiki_page, wiki: project.wiki, title: 'directory/title', content: 'Some Wiki content')
diff --git a/spec/features/snippets/search_snippets_spec.rb b/spec/features/snippets/search_snippets_spec.rb
index 7a07299a14f..cf6f9825932 100644
--- a/spec/features/snippets/search_snippets_spec.rb
+++ b/spec/features/snippets/search_snippets_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe 'Search Snippets', :js, feature_category: :global_search do
it 'user searches for snippets by title' do
- user = create(:user, :no_super_sidebar)
+ user = create(:user)
public_snippet = create(:personal_snippet, :public, title: 'Beginning and Middle')
private_snippet = create(:personal_snippet, :private, title: 'Middle and End', author: user)
diff --git a/spec/features/users/terms_spec.rb b/spec/features/users/terms_spec.rb
index e51ed3a0e80..28191587572 100644
--- a/spec/features/users/terms_spec.rb
+++ b/spec/features/users/terms_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe 'Users > Terms', :js, feature_category: :user_profile do
end
context 'when user is a project bot' do
- let(:project_bot) { create(:user, :no_super_sidebar, :project_bot) }
+ let(:project_bot) { create(:user, :project_bot) }
before do
enforce_terms
@@ -42,7 +42,7 @@ RSpec.describe 'Users > Terms', :js, feature_category: :user_profile do
end
context 'when user is a service account' do
- let(:service_account) { create(:user, :no_super_sidebar, :service_account) }
+ let(:service_account) { create(:user, :service_account) }
before do
enforce_terms
@@ -57,7 +57,7 @@ RSpec.describe 'Users > Terms', :js, feature_category: :user_profile do
end
context 'when signed in' do
- let(:user) { create(:user, :no_super_sidebar) }
+ let(:user) { create(:user) }
before do
sign_in(user)
@@ -115,7 +115,7 @@ RSpec.describe 'Users > Terms', :js, feature_category: :user_profile do
# Application settings are cached for a minute
travel_to 2.minutes.from_now do
- within('.nav-sidebar') do
+ within('.contextual-nav') do
click_link 'Issues'
end
diff --git a/spec/finders/ci/runners_finder_spec.rb b/spec/finders/ci/runners_finder_spec.rb
index 57a77b08cea..7f680f50297 100644
--- a/spec/finders/ci/runners_finder_spec.rb
+++ b/spec/finders/ci/runners_finder_spec.rb
@@ -156,6 +156,14 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do
described_class.new(current_user: admin, params: { creator_id: '1' }).execute
end
end
+
+ context 'by version' do
+ it 'calls the corresponding scope on Ci::Runner' do
+ expect(Ci::Runner).to receive(:with_version_prefix).with('15.').and_call_original
+
+ described_class.new(current_user: admin, params: { version_prefix: '15.' }).execute
+ end
+ end
end
context 'sorting' do
@@ -299,6 +307,9 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do
let_it_be(:runner_project_5) { create(:ci_runner, :project, contacted_at: 3.minutes.ago, tag_list: %w[runner_tag], projects: [project_4]) }
let_it_be(:runner_project_6) { create(:ci_runner, :project, contacted_at: 2.minutes.ago, projects: [project_5]) }
let_it_be(:runner_project_7) { create(:ci_runner, :project, contacted_at: 1.minute.ago, projects: [project_6]) }
+ let_it_be(:runner_manager_1) { create(:ci_runner_machine, runner: runner_sub_group_1, version: '15.11.0') }
+ let_it_be(:runner_manager_2) { create(:ci_runner_machine, runner: runner_sub_group_2, version: '15.11.1') }
+ let_it_be(:runner_manager_3) { create(:ci_runner_machine, runner: runner_sub_group_3, version: '15.10.1') }
let(:target_group) { nil }
let(:membership) { nil }
@@ -439,6 +450,32 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do
runner_project_3, runner_project_2, runner_project_1])
end
end
+
+ context 'by version prefix' do
+ context 'search by major version' do
+ let(:extra_params) { { version_prefix: '15.' } }
+
+ it 'returns correct runner' do
+ is_expected.to contain_exactly(runner_sub_group_1, runner_sub_group_2, runner_sub_group_3)
+ end
+ end
+
+ context 'search by minor version' do
+ let(:extra_params) { { version_prefix: '15.11.' } }
+
+ it 'returns correct runner' do
+ is_expected.to contain_exactly(runner_sub_group_1, runner_sub_group_2)
+ end
+ end
+
+ context 'search by patch version' do
+ let(:extra_params) { { version_prefix: '15.11.1' } }
+
+ it 'returns correct runner' do
+ is_expected.to contain_exactly(runner_sub_group_2)
+ end
+ end
+ end
end
end
end
@@ -568,6 +605,7 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do
let_it_be(:runner_project_active) { create(:ci_runner, :project, contacted_at: 5.minutes.ago, active: true, projects: [project]) }
let_it_be(:runner_project_inactive) { create(:ci_runner, :project, contacted_at: 5.minutes.ago, active: false, projects: [project]) }
let_it_be(:runner_other_project_inactive) { create(:ci_runner, :project, contacted_at: 5.minutes.ago, active: false, projects: [other_project]) }
+ let_it_be(:runner_manager) { create(:ci_runner_machine, runner: runner_instance_inactive, version: '15.10.0') }
context 'by search term' do
let_it_be(:runner_project_1) { create(:ci_runner, :project, contacted_at: 5.minutes.ago, description: 'runner_project_search', projects: [project]) }
@@ -626,6 +664,14 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do
is_expected.to contain_exactly(runner_creator_1)
end
end
+
+ context 'by version prefix' do
+ let(:extra_params) { { version_prefix: '15.' } }
+
+ it 'returns correct runners' do
+ is_expected.to contain_exactly(runner_instance_inactive)
+ end
+ end
end
end
diff --git a/spec/frontend/sentry/sentry_browser_wrapper_spec.js b/spec/frontend/sentry/sentry_browser_wrapper_spec.js
index d98286e1371..60c441fe83c 100644
--- a/spec/frontend/sentry/sentry_browser_wrapper_spec.js
+++ b/spec/frontend/sentry/sentry_browser_wrapper_spec.js
@@ -1,18 +1,39 @@
+/* eslint-disable no-console */
+
import * as Sentry from '~/sentry/sentry_browser_wrapper';
const mockError = new Error('error!');
describe('SentryBrowserWrapper', () => {
+ beforeAll(() => {
+ process.env.NODE_ENV = 'development';
+ });
+
+ afterAll(() => {
+ process.env.NODE_ENV = 'test';
+ });
+
+ beforeEach(() => {
+ jest.spyOn(console, 'error').mockImplementation();
+ });
+
afterEach(() => {
+ console.error.mockRestore();
+
// eslint-disable-next-line no-underscore-dangle
delete window._Sentry;
});
describe('when _Sentry is not defined', () => {
- it('methods fail silently', () => {
- expect(() => {
- Sentry.captureException(mockError);
- }).not.toThrow();
+ it('captureException will report to console instead', () => {
+ Sentry.captureException(mockError);
+
+ expect(console.error).toHaveBeenCalledTimes(1);
+ expect(console.error).toHaveBeenCalledWith(
+ '[Sentry stub]',
+ 'captureException(...) called with:',
+ { 0: mockError },
+ );
});
});
diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb
index 88316f20c38..7d37d13366c 100644
--- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb
@@ -86,7 +86,8 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :runner_fleet d
tag_list: ['active_runner'],
search: 'abc',
sort: :contacted_asc,
- creator_id: 'gid://gitlab/User/1'
+ creator_id: 'gid://gitlab/User/1',
+ version_prefix: '15.'
}
end
@@ -100,7 +101,8 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :runner_fleet d
preload: false,
search: 'abc',
sort: 'contacted_asc',
- creator_id: '1'
+ creator_id: '1',
+ version_prefix: '15.'
}
end
@@ -171,6 +173,26 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :runner_fleet d
expect(resolve_scope.items.to_a).to contain_exactly :execute_return_value
end
end
+
+ context 'with an invalid version filter parameter' do
+ let(:args) do
+ { version_prefix: 'a.b' }
+ end
+
+ let(:expected_params) do
+ {
+ preload: false,
+ version_prefix: 'a.b'
+ }
+ end
+
+ it 'ignores the parameter and returns runners' do
+ expect(::Ci::RunnersFinder).to receive(:new).with(current_user: user, params: expected_params).once.and_return(finder)
+ allow(finder).to receive(:execute).once.and_return([:execute_return_value])
+
+ expect(resolve_scope.items.to_a).to contain_exactly :execute_return_value
+ end
+ end
end
end
end
diff --git a/spec/lib/generators/gitlab/snowplow_event_definition_generator_spec.rb b/spec/lib/generators/gitlab/snowplow_event_definition_generator_spec.rb
deleted file mode 100644
index 740cfa767e4..00000000000
--- a/spec/lib/generators/gitlab/snowplow_event_definition_generator_spec.rb
+++ /dev/null
@@ -1,95 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::SnowplowEventDefinitionGenerator, :silence_stdout, feature_category: :product_analytics_data_management do
- let(:ce_temp_dir) { Dir.mktmpdir }
- let(:ee_temp_dir) { Dir.mktmpdir }
- let(:timestamp) { Time.now.utc.strftime('%Y%m%d%H%M%S') }
-
- let(:generator_options) do
- { 'category' => 'Projects::Pipelines::EmailCampaignsController', 'action' => 'click' }
- end
-
- before do
- stub_const("#{described_class}::CE_DIR", ce_temp_dir)
- stub_const("#{described_class}::EE_DIR", ee_temp_dir)
- end
-
- around do |example|
- freeze_time { example.run }
- end
-
- after do
- FileUtils.rm_rf([ce_temp_dir, ee_temp_dir])
- end
-
- describe 'Creating event definition file' do
- before do
- stub_const('Gitlab::VERSION', '13.11.0-pre')
- end
-
- let(:sample_event_dir) { 'lib/generators/gitlab/snowplow_event_definition_generator' }
- let(:file_name) { Dir.children(ce_temp_dir).first }
-
- it 'creates CE event definition file using the template' do
- sample_event = ::Gitlab::Config::Loader::Yaml
- .new(fixture_file(File.join(sample_event_dir, 'sample_event.yml'))).load_raw!
-
- described_class.new([], generator_options).invoke_all
-
- event_definition_path = File.join(ce_temp_dir, file_name)
- expect(::Gitlab::Config::Loader::Yaml.new(File.read(event_definition_path)).load_raw!).to eq(sample_event)
- end
-
- describe 'generated filename' do
- it 'includes timestamp' do
- described_class.new([], generator_options).invoke_all
-
- expect(file_name).to include(timestamp.to_s)
- end
-
- it 'removes special characters' do
- generator_options = { 'category' => '"`ui:[mavenpackages | t5%348()-=@ ]`"', 'action' => 'click' }
-
- described_class.new([], generator_options).invoke_all
-
- expect(file_name).to include('uimavenpackagest')
- end
-
- it 'cuts name if longer than 100 characters' do
- generator_options = { 'category' => 'a' * 100, 'action' => 'click' }
-
- described_class.new([], generator_options).invoke_all
-
- expect(file_name.length).to eq(100)
- end
- end
-
- context 'when event definition with same file name already exists' do
- before do
- stub_const('Gitlab::VERSION', '12.11.0-pre')
- described_class.new([], generator_options).invoke_all
- end
-
- it 'raises error' do
- expect { described_class.new([], generator_options.merge('force' => false)).invoke_all }
- .to raise_error(StandardError, /Event definition already exists at/)
- end
- end
-
- describe 'EE' do
- let(:file_name) { Dir.children(ee_temp_dir).first }
-
- it 'creates EE event definition file using the template' do
- sample_event = ::Gitlab::Config::Loader::Yaml
- .new(fixture_file(File.join(sample_event_dir, 'sample_event_ee.yml'))).load_raw!
-
- described_class.new([], generator_options.merge('ee' => true)).invoke_all
-
- event_definition_path = File.join(ee_temp_dir, file_name)
- expect(::Gitlab::Config::Loader::Yaml.new(File.read(event_definition_path)).load_raw!).to eq(sample_event)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/job_waiter_spec.rb b/spec/lib/gitlab/job_waiter_spec.rb
index b000f55e739..4b4c2e954b6 100644
--- a/spec/lib/gitlab/job_waiter_spec.rb
+++ b/spec/lib/gitlab/job_waiter_spec.rb
@@ -82,38 +82,5 @@ RSpec.describe Gitlab::JobWaiter, :redis, feature_category: :shared do
expect(result).to contain_exactly('a')
end
-
- context 'when a label is provided' do
- let(:waiter) { described_class.new(2, worker_label: 'Foo') }
- let(:started_total) { double(:started_total) }
- let(:timeouts_total) { double(:timeouts_total) }
-
- before do
- allow(Gitlab::Metrics).to receive(:counter)
- .with(described_class::STARTED_METRIC, anything)
- .and_return(started_total)
-
- allow(Gitlab::Metrics).to receive(:counter)
- .with(described_class::TIMEOUTS_METRIC, anything)
- .and_return(timeouts_total)
- end
-
- it 'increments just job_waiter_started_total when all jobs complete' do
- expect(started_total).to receive(:increment).with(worker: 'Foo')
- expect(timeouts_total).not_to receive(:increment)
-
- described_class.notify(waiter.key, 'a')
- described_class.notify(waiter.key, 'b')
-
- expect { Timeout.timeout(1) { waiter.wait(2) } }.not_to raise_error
- end
-
- it 'increments job_waiter_started_total and job_waiter_timeouts_total when it times out' do
- expect(started_total).to receive(:increment).with(worker: 'Foo')
- expect(timeouts_total).to receive(:increment).with(worker: 'Foo')
-
- expect { Timeout.timeout(2) { waiter.wait(1) } }.not_to raise_error
- end
- end
end
end
diff --git a/spec/models/ci/runner_manager_spec.rb b/spec/models/ci/runner_manager_spec.rb
index bc1d1a0cc49..01275ffd31c 100644
--- a/spec/models/ci/runner_manager_spec.rb
+++ b/spec/models/ci/runner_manager_spec.rb
@@ -413,4 +413,68 @@ RSpec.describe Ci::RunnerManager, feature_category: :runner_fleet, type: :model
end
end
end
+
+ describe '.with_version_prefix' do
+ subject { described_class.with_version_prefix(version_prefix) }
+
+ let_it_be(:runner_manager1) { create(:ci_runner_machine, version: '15.11.0') }
+ let_it_be(:runner_manager2) { create(:ci_runner_machine, version: '15.9.0') }
+ let_it_be(:runner_manager3) { create(:ci_runner_machine, version: '15.11.5') }
+
+ context 'with a prefix string of "15."' do
+ let(:version_prefix) { "15." }
+
+ it 'returns runner managers' do
+ is_expected.to contain_exactly(runner_manager1, runner_manager2, runner_manager3)
+ end
+ end
+
+ context 'with a prefix string of "15"' do
+ let(:version_prefix) { "15" }
+
+ it 'returns runner managers' do
+ is_expected.to contain_exactly(runner_manager1, runner_manager2, runner_manager3)
+ end
+ end
+
+ context 'with a prefix string of "15.11."' do
+ let(:version_prefix) { "15.11." }
+
+ it 'returns runner managers' do
+ is_expected.to contain_exactly(runner_manager1, runner_manager3)
+ end
+ end
+
+ context 'with a prefix string of "15.11"' do
+ let(:version_prefix) { "15.11" }
+
+ it 'returns runner managers' do
+ is_expected.to contain_exactly(runner_manager1, runner_manager3)
+ end
+ end
+
+ context 'with a prefix string of "15.9"' do
+ let(:version_prefix) { "15.9" }
+
+ it 'returns runner managers' do
+ is_expected.to contain_exactly(runner_manager2)
+ end
+ end
+
+ context 'with a prefix string of "15.11.5"' do
+ let(:version_prefix) { "15.11.5" }
+
+ it 'returns runner managers' do
+ is_expected.to contain_exactly(runner_manager3)
+ end
+ end
+
+ context 'with a malformed prefix of "V2"' do
+ let(:version_prefix) { "V2" }
+
+ it 'returns no runner managers' do
+ is_expected.to be_empty
+ end
+ end
+ end
end
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 6d480badaa2..7a88b133a98 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -537,6 +537,26 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do
end
end
+ describe '.with_version_prefix' do
+ subject { described_class.with_version_prefix('15.11.') }
+
+ let_it_be(:runner1) { create(:ci_runner) }
+ let_it_be(:runner2) { create(:ci_runner) }
+ let_it_be(:runner3) { create(:ci_runner) }
+
+ before_all do
+ create(:ci_runner_machine, runner: runner1, version: '15.11.0')
+ create(:ci_runner_machine, runner: runner2, version: '15.9.0')
+ create(:ci_runner_machine, runner: runner3, version: '15.9.0')
+ # Add another runner_machine to runner3 to ensure edge case is handled (searching multiple machines in a single runner)
+ create(:ci_runner_machine, runner: runner3, version: '15.11.5')
+ end
+
+ it 'returns runners containing runner managers with versions starting with 15.11.' do
+ is_expected.to contain_exactly(runner1, runner3)
+ end
+ end
+
describe '.stale', :freeze_time do
subject { described_class.stale }
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index e9257b08bca..ac356bcd65a 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -44,24 +44,6 @@ RSpec.describe CommitStatus, feature_category: :continuous_integration do
it { is_expected.not_to be_retried }
it { expect(described_class.primary_key).to eq('id') }
- describe '.switch_table_names' do
- before do
- stub_env('USE_CI_BUILDS_ROUTING_TABLE', flag_value)
- end
-
- context 'with the env flag disabled' do
- let(:flag_value) { 'false' }
-
- it { expect(described_class.switch_table_names).to eq(:ci_builds) }
- end
-
- context 'with the env flag enabled' do
- let(:flag_value) { 'true' }
-
- it { expect(described_class.switch_table_names).to eq(:p_ci_builds) }
- end
- end
-
describe '#author' do
subject { commit_status.author }
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index 58355f0f1e9..811a2c00652 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -3251,6 +3251,28 @@ RSpec.describe ProjectPolicy, feature_category: :system_access do
end
end
+ describe 'write_model_registry' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:ff_model_registry_enabled, :current_user, :allowed) do
+ true | ref(:reporter) | true
+ true | ref(:guest) | false
+ false | ref(:owner) | false
+ end
+ with_them do
+ before do
+ stub_feature_flags(model_registry: false)
+ stub_feature_flags(model_registry: project) if ff_model_registry_enabled
+ end
+
+ if params[:allowed]
+ it { expect_allowed(:write_model_registry) }
+ else
+ it { expect_disallowed(:write_model_registry) }
+ end
+ end
+ end
+
describe ':read_model_experiments' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/requests/projects/ml/models_controller_spec.rb b/spec/requests/projects/ml/models_controller_spec.rb
index 936aed59e39..028fde06486 100644
--- a/spec/requests/projects/ml/models_controller_spec.rb
+++ b/spec/requests/projects/ml/models_controller_spec.rb
@@ -10,14 +10,19 @@ RSpec.describe Projects::Ml::ModelsController, feature_category: :mlops do
let_it_be(:model3) { create(:ml_models, project: project) }
let_it_be(:model_in_different_project) { create(:ml_models) }
- let(:model_registry_enabled) { true }
+ let(:read_model_registry) { true }
+ let(:write_model_registry) { true }
+
let(:params) { {} }
before do
allow(Ability).to receive(:allowed?).and_call_original
allow(Ability).to receive(:allowed?)
.with(user, :read_model_registry, project)
- .and_return(model_registry_enabled)
+ .and_return(read_model_registry)
+ allow(Ability).to receive(:allowed?)
+ .with(user, :write_model_registry, project)
+ .and_return(write_model_registry)
sign_in(user)
end
@@ -54,7 +59,7 @@ RSpec.describe Projects::Ml::ModelsController, feature_category: :mlops do
end
context 'when user does not have access' do
- let(:model_registry_enabled) { false }
+ let(:read_model_registry) { false }
it 'renders 404' do
is_expected.to have_gitlab_http_status(:not_found)
@@ -132,7 +137,40 @@ RSpec.describe Projects::Ml::ModelsController, feature_category: :mlops do
end
context 'when user does not have access' do
- let(:model_registry_enabled) { false }
+ let(:read_model_registry) { false }
+
+ it { is_expected.to have_gitlab_http_status(:not_found) }
+ end
+ end
+
+ describe 'destroy' do
+ let(:model_for_deletion) do
+ create(:ml_models, project: project)
+ end
+
+ let(:model_id) { model_for_deletion.id }
+
+ subject(:delete_request) do
+ delete_model
+ response
+ end
+
+ it 'deletes the model', :aggregate_failures do
+ is_expected.to have_gitlab_http_status(:found)
+
+ expect(flash[:notice]).to eq('Model removed')
+ expect(response).to redirect_to("/#{project.full_path}/-/ml/models")
+ expect { Ml::Model.find(id: model_id) }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ context 'when model does not exist' do
+ let(:model_id) { non_existing_record_id }
+
+ it { is_expected.to have_gitlab_http_status(:not_found) }
+ end
+
+ describe 'when user does not have write_model_registry rights' do
+ let(:write_model_registry) { false }
it { is_expected.to have_gitlab_http_status(:not_found) }
end
@@ -147,4 +185,8 @@ RSpec.describe Projects::Ml::ModelsController, feature_category: :mlops do
def show_model
get project_ml_model_path(request_project, model_id)
end
+
+ def delete_model
+ delete project_ml_model_path(project, model_id)
+ end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 02db905b8b1..d08f0f2e2ba 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -24,7 +24,6 @@ CrystalballEnv.start!
ENV["RAILS_ENV"] = 'test'
ENV["IN_MEMORY_APPLICATION_SETTINGS"] = 'true'
ENV["RSPEC_ALLOW_INVALID_URLS"] = 'true'
-ENV['USE_CI_BUILDS_ROUTING_TABLE'] = 'true'
require_relative '../config/environment'
diff --git a/spec/support/helpers/features/dom_helpers.rb b/spec/support/helpers/features/dom_helpers.rb
index cbbb80dde36..619f16f5e6d 100644
--- a/spec/support/helpers/features/dom_helpers.rb
+++ b/spec/support/helpers/features/dom_helpers.rb
@@ -2,6 +2,10 @@
module Features
module DomHelpers
+ def has_testid?(testid, **kwargs)
+ page.has_selector?("[data-testid='#{testid}']", **kwargs)
+ end
+
def find_by_testid(testid, **kwargs)
page.find("[data-testid='#{testid}']", **kwargs)
end
diff --git a/spec/support/helpers/search_helpers.rb b/spec/support/helpers/search_helpers.rb
index d13703776cd..66da0ab2eec 100644
--- a/spec/support/helpers/search_helpers.rb
+++ b/spec/support/helpers/search_helpers.rb
@@ -11,7 +11,19 @@ module SearchHelpers
end
def submit_search(query)
- page.within('.header-search-form, .search-page-form') do
+ # Forms directly on the search page
+ if page.has_css?('.search-page-form')
+ search_form = '.search-page-form'
+ # Open search modal from super sidebar
+ elsif has_testid?('super-sidebar-search-button')
+ find_by_testid('super-sidebar-search-button').click
+ search_form = '#super-sidebar-search-modal'
+ # Open legacy search dropdown in navigation
+ else
+ search_form = '.header-search-form'
+ end
+
+ page.within(search_form) do
field = find_field('search')
field.click
field.fill_in(with: query)
@@ -27,7 +39,7 @@ module SearchHelpers
end
def select_search_scope(scope)
- page.within '[data-testid="search-filter"]' do
+ within_testid('search-filter') do
click_link scope
wait_for_all_requests
@@ -35,9 +47,9 @@ module SearchHelpers
end
def has_search_scope?(scope)
- return false unless page.has_selector?('[data-testid="search-filter"]')
+ return false unless has_testid?('search-filter')
- page.within '[data-testid="search-filter"]' do
+ within_testid('search-filter') do
has_link?(scope)
end
end
diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml
index 51f3ff2c077..d26473539e2 100644
--- a/spec/support/rspec_order_todo.yml
+++ b/spec/support/rspec_order_todo.yml
@@ -5430,7 +5430,6 @@
- './spec/lib/feature_spec.rb'
- './spec/lib/file_size_validator_spec.rb'
- './spec/lib/forever_spec.rb'
-- './spec/lib/generators/gitlab/snowplow_event_definition_generator_spec.rb'
- './spec/lib/generators/gitlab/usage_metric_definition_generator_spec.rb'
- './spec/lib/generators/gitlab/usage_metric_definition/redis_hll_generator_spec.rb'
- './spec/lib/generators/gitlab/usage_metric_generator_spec.rb'
diff --git a/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb b/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb
index b8c6b85adb2..f53aaa4514d 100644
--- a/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb
+++ b/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb
@@ -4,22 +4,17 @@ RSpec.shared_examples 'issuable invite members' do
include Features::InviteMembersModalHelpers
context 'when a privileged user can invite' do
- before do
- project.add_maintainer(user)
- end
-
it 'shows a link for inviting members and launches invite modal' do
+ project.add_maintainer(user)
visit issuable_path
- find('.block.assignee .edit-link').click
-
- wait_for_requests
+ open_assignees_dropdown
page.within '.dropdown-menu-user' do
- expect(page).to have_link('Invite Members')
- end
+ expect(page).to have_link('Invite members')
- click_link 'Invite Members'
+ click_link 'Invite members'
+ end
page.within invite_modal_selector do
expect(page).to have_content("You're inviting members to the #{project.name} project")
@@ -28,19 +23,14 @@ RSpec.shared_examples 'issuable invite members' do
end
context 'when user cannot invite members in assignee dropdown' do
- before do
- project.add_developer(user)
- end
-
it 'shows author in assignee dropdown and no invite link' do
+ project.add_developer(user)
visit issuable_path
- find('.block.assignee .edit-link').click
-
- wait_for_requests
+ open_assignees_dropdown
page.within '.dropdown-menu-user' do
- expect(page).not_to have_link('Invite Members')
+ expect(page).not_to have_link('Invite members')
end
end
end
diff --git a/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb b/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb
index b73f40ff28c..1e7f75d2ac0 100644
--- a/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb
+++ b/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb
@@ -17,7 +17,7 @@ RSpec.shared_examples 'search timeouts' do |scope|
end
it 'sets tab count to 0' do
- expect(page.find('[data-testid="search-filter"] .active')).to have_text('0')
+ expect(page.find('[data-testid="search-filter"] [aria-current="page"]')).to have_text('0')
end
end
end
diff --git a/spec/tooling/danger/feature_flag_spec.rb b/spec/tooling/danger/feature_flag_spec.rb
index 4575d8ca981..4a4bfe50e44 100644
--- a/spec/tooling/danger/feature_flag_spec.rb
+++ b/spec/tooling/danger/feature_flag_spec.rb
@@ -134,7 +134,7 @@ RSpec.describe Tooling::Danger::FeatureFlag do
context 'when group is not nil' do
it 'is true only if MR has the same group label' do
expect(found.group_match_mr_label?(group)).to eq true
- expect(found.group_match_mr_label?('group::authentication and authorization')).to eq false
+ expect(found.group_match_mr_label?('group::authentication')).to eq false
end
end
end