diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-10-20 15:10:59 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-10-20 15:10:59 +0300 |
commit | 34c88d512f2697cd96dd3788e8ffaf1b9c8935b4 (patch) | |
tree | e7fb4118737b248dedc4111e71fc9514490cb6ea /spec | |
parent | 9fa24e4f9c5440e2ddc27cd787df5f5e669bed25 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
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 |