diff options
Diffstat (limited to 'spec/features')
172 files changed, 1282 insertions, 777 deletions
diff --git a/spec/features/admin/admin_abuse_reports_spec.rb b/spec/features/admin/admin_abuse_reports_spec.rb index 973988560b3..5e98d2ffcf3 100644 --- a/spec/features/admin/admin_abuse_reports_spec.rb +++ b/spec/features/admin/admin_abuse_reports_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe "Admin::AbuseReports", :js, feature_category: :insider_threat do + include Features::SortingHelpers + let_it_be(:user) { create(:user) } let_it_be(:admin) { create(:admin) } @@ -79,7 +81,7 @@ RSpec.describe "Admin::AbuseReports", :js, feature_category: :insider_threat do expect(report_rows[1].text).to include(report_text(open_report2)) # updated_at asc - sort_by 'Updated date' + sort_by 'Updated date', from: 'Created date' expect(report_rows[0].text).to include(report_text(open_report2)) expect(report_rows[1].text).to include(report_text(open_report)) @@ -120,7 +122,7 @@ RSpec.describe "Admin::AbuseReports", :js, feature_category: :insider_threat do expect(report_rows[1].text).to include(report_text(open_report2)) # created_at desc - sort_by 'Created date' + sort_by 'Created date', from: 'Number of Reports' expect(report_rows[0].text).to include(report_text(open_report2)) expect(report_rows[1].text).to include(aggregated_report_text(open_report, 2)) @@ -131,7 +133,7 @@ RSpec.describe "Admin::AbuseReports", :js, feature_category: :insider_threat do expect(report_rows[0].text).to include(aggregated_report_text(open_report, 2)) expect(report_rows[1].text).to include(report_text(open_report2)) - sort_by 'Updated date' + sort_by 'Updated date', from: 'Created date' # updated_at asc expect(report_rows[0].text).to include(report_text(open_report2)) @@ -193,14 +195,10 @@ RSpec.describe "Admin::AbuseReports", :js, feature_category: :insider_threat do select_tokens(*tokens, submit: true, input_text: 'Filter reports') end - def sort_by(sort) + def sort_by(sort, from: 'Number of Reports') page.within('.vue-filtered-search-bar-container .sort-dropdown-container') do - page.find('.gl-dropdown-toggle').click - - page.within('.dropdown-menu') do - click_button sort - wait_for_requests - end + pajamas_sort_by sort, from: from + wait_for_requests end end end diff --git a/spec/features/admin/admin_mode/login_spec.rb b/spec/features/admin/admin_mode/login_spec.rb index 72c7083f459..f2262464386 100644 --- a/spec/features/admin/admin_mode/login_spec.rb +++ b/spec/features/admin/admin_mode/login_spec.rb @@ -30,7 +30,7 @@ RSpec.describe 'Admin Mode Login', feature_category: :system_access do repeated_otp = user.current_otp enter_code(repeated_otp) - gitlab_enable_admin_mode_sign_in(user) + gitlab_enable_admin_mode_sign_in(user, use_mock_admin_mode: false) expect(page).to have_content(_('Enter verification code')) @@ -47,7 +47,7 @@ RSpec.describe 'Admin Mode Login', feature_category: :system_access do expect(page).to have_content('Enter verification code') enter_code(user.current_otp) - gitlab_enable_admin_mode_sign_in(user) + gitlab_enable_admin_mode_sign_in(user, use_mock_admin_mode: false) expect(page).to have_content(_('Enter verification code')) end diff --git a/spec/features/admin/admin_mode/logout_spec.rb b/spec/features/admin/admin_mode/logout_spec.rb index 7a33256e7a8..584151726a6 100644 --- a/spec/features/admin/admin_mode/logout_spec.rb +++ b/spec/features/admin/admin_mode/logout_spec.rb @@ -12,7 +12,7 @@ RSpec.describe 'Admin Mode Logout', :js, feature_category: :system_access do # TODO: This used to use gitlab_sign_in, instead of sign_in, but that is buggy. See # this issue to look into why: https://gitlab.com/gitlab-org/gitlab/-/issues/331851 sign_in(user) - gitlab_enable_admin_mode_sign_in(user) + gitlab_enable_admin_mode_sign_in(user, use_mock_admin_mode: false) visit admin_root_path end diff --git a/spec/features/admin/admin_mode_spec.rb b/spec/features/admin/admin_mode_spec.rb index b1b44ce143f..2a655cdb1f4 100644 --- a/spec/features/admin/admin_mode_spec.rb +++ b/spec/features/admin/admin_mode_spec.rb @@ -69,7 +69,7 @@ RSpec.describe 'Admin mode', :js, feature_category: :shared do context 'when in admin_mode' do before do - gitlab_enable_admin_mode_sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin, use_mock_admin_mode: false) end it 'contains link to leave admin mode' do diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index 750f5f8d4b9..653458710e3 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe "Admin Runners", feature_category: :runner_fleet do +RSpec.describe "Admin Runners", feature_category: :fleet_visibility do + include Features::SortingHelpers include Features::RunnersHelpers include Spec::Support::Helpers::ModalHelpers @@ -11,8 +12,6 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do before do sign_in(admin) gitlab_enable_admin_mode_sign_in(admin) - - wait_for_requests end describe "Admin Runners page", :js do @@ -21,7 +20,7 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do let_it_be(:namespace) { create(:namespace) } let_it_be(:project) { create(:project, namespace: namespace, creator: user) } - describe "runners creation" do + describe "runners creation and registration" do before do visit admin_runners_path end @@ -29,12 +28,6 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do it 'shows a create button' do expect(page).to have_link s_('Runner|New instance runner'), href: new_admin_runner_path end - end - - describe "runners registration" do - before do - visit admin_runners_path - end it_behaves_like "shows and resets runner registration token" do let(:dropdown_text) { s_('Runners|Register an instance runner') } @@ -50,11 +43,7 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do visit admin_runners_path end - it_behaves_like 'shows runner in list' do - let(:runner) { instance_runner } - end - - it_behaves_like 'shows runner details from list' do + it_behaves_like 'shows runner summary and navigates to details' do let(:runner) { instance_runner } let(:runner_page_path) { admin_runner_path(instance_runner) } end @@ -404,11 +393,8 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do it_behaves_like 'shows no runners found' - it 'shows active tab with no runner' do + it 'shows active tab' do expect(page).to have_link('Instance', class: 'active') - - expect(page).not_to have_content 'runner-project' - expect(page).not_to have_content 'runner-group' end end end @@ -443,10 +429,6 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do end it_behaves_like 'shows no runners found' - - it 'shows no runner' do - expect(page).not_to have_content 'runner-blue' - end end it 'shows correct runner when tag is selected and search term is entered' do @@ -480,8 +462,7 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do end end - click_on 'Created date' # Open "sort by" dropdown - click_on 'Last contact' + pajamas_sort_by 'Last contact', from: 'Created date' click_on 'Sort direction: Descending' within_testid('runner-list') do @@ -602,8 +583,6 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do before do visit edit_admin_runner_path(project_runner) - - wait_for_requests end it_behaves_like 'submits edit runner form' do @@ -633,7 +612,6 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do context 'when a runner is updated', :js do before do click_on _('Save changes') - wait_for_requests end it 'show success alert and redirects to runner page' do diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb index 4e0198b1f2b..77707a67d58 100644 --- a/spec/features/admin/admin_settings_spec.rb +++ b/spec/features/admin/admin_settings_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do before do stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') sign_in(admin) - gitlab_enable_admin_mode_sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin, use_mock_admin_mode: false) end context 'General page' do @@ -261,7 +261,7 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do expect(page).to have_content "Application settings saved successfully" end - it 'terms of Service' do + it 'terms of Service', :js do # Already have the admin accept terms, so they don't need to accept in this spec. _existing_terms = create(:term) accept_terms(admin) @@ -274,7 +274,10 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do expect(current_settings.enforce_terms).to be(true) expect(current_settings.terms).to eq 'Be nice!' - expect(page).to have_content 'Application settings saved successfully' + + click_button 'Accept terms' + + expect(page).to have_current_path(general_admin_application_settings_path, ignore_query: true) end it 'modify oauth providers' do diff --git a/spec/features/admin/users/user_spec.rb b/spec/features/admin/users/user_spec.rb index b8dc725c17f..d0110b3e013 100644 --- a/spec/features/admin/users/user_spec.rb +++ b/spec/features/admin/users/user_spec.rb @@ -11,7 +11,7 @@ RSpec.describe 'Admin::Users::User', feature_category: :user_management do before do sign_in(current_user) - gitlab_enable_admin_mode_sign_in(current_user) + gitlab_enable_admin_mode_sign_in(current_user, use_mock_admin_mode: false) end describe 'GET /admin/users/:id' do diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb index 48b978f7245..314a3fbd5f2 100644 --- a/spec/features/boards/boards_spec.rb +++ b/spec/features/boards/boards_spec.rb @@ -38,8 +38,6 @@ RSpec.describe 'Project issue boards', :js, feature_category: :team_planning do project.add_maintainer(user2) sign_in(user) - - set_cookie('sidebar_collapsed', 'true') end context 'no lists' do diff --git a/spec/features/boards/user_adds_lists_to_board_spec.rb b/spec/features/boards/user_adds_lists_to_board_spec.rb index d202c2a1f7d..22ee43895f4 100644 --- a/spec/features/boards/user_adds_lists_to_board_spec.rb +++ b/spec/features/boards/user_adds_lists_to_board_spec.rb @@ -31,8 +31,6 @@ RSpec.describe 'User adds lists', :js, feature_category: :team_planning do before do sign_in(user) - set_cookie('sidebar_collapsed', 'true') - case board_type when :project visit project_board_path(project, project_board) diff --git a/spec/features/clusters/create_agent_spec.rb b/spec/features/clusters/create_agent_spec.rb index 79eaecdf582..960d5c78d43 100644 --- a/spec/features/clusters/create_agent_spec.rb +++ b/spec/features/clusters/create_agent_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'Cluster agent registration', :js, feature_category: :deployment_ double(agent_name: 'example-agent-1', path: '.gitlab/agents/example-agent-1/config.yaml'), double(agent_name: 'example-agent-2', path: '.gitlab/agents/example-agent-2/config.yaml') ]) - allow(client).to receive(:get_connected_agents).and_return([]) + allow(client).to receive(:get_connected_agents_by_agent_ids).and_return([]) end allow(Devise).to receive(:friendly_token).and_return(token) diff --git a/spec/features/dashboard/issues_filter_spec.rb b/spec/features/dashboard/issues_filter_spec.rb index ab3aa29a3aa..9bc412d6bf4 100644 --- a/spec/features/dashboard/issues_filter_spec.rb +++ b/spec/features/dashboard/issues_filter_spec.rb @@ -111,8 +111,7 @@ RSpec.describe 'Dashboard Issues filtering', :js, feature_category: :team_planni end it 'keeps sorting issues after visiting Projects Issues page' do - click_button 'Created date' - click_button 'Due date' + pajamas_sort_by 'Due date', from: 'Created date' visit project_issues_path(project) diff --git a/spec/features/dashboard/merge_requests_spec.rb b/spec/features/dashboard/merge_requests_spec.rb index 8a7652858b8..ba42b3e099b 100644 --- a/spec/features/dashboard/merge_requests_spec.rb +++ b/spec/features/dashboard/merge_requests_spec.rb @@ -41,6 +41,18 @@ RSpec.describe 'Dashboard Merge Requests', :js, feature_category: :code_review_w expect(page).not_to have_selector('#js-dropdown-target-branch', visible: false) end + it 'disables releases filter' do + visit merge_requests_dashboard_path + + expect(page).not_to have_selector('#js-dropdown-release', visible: false) + end + + it 'disables environments filter' do + visit merge_requests_dashboard_path + + expect(page).not_to have_selector('#js-dropdown-environment', visible: false) + end + context 'new merge request dropdown' do let(:project_with_disabled_merge_requests) { create(:project, :merge_requests_disabled) } @@ -199,19 +211,19 @@ RSpec.describe 'Dashboard Merge Requests', :js, feature_category: :code_review_w end it 'shows sorted merge requests' do - pajamas_sort_by(s_('SortOptions|Created date')) + pajamas_sort_by(s_('SortOptions|Priority'), from: s_('SortOptions|Created date')) visit merge_requests_dashboard_path(assignee_username: current_user.username) - expect(find('.issues-filters')).to have_content('Created date') + expect(find('.issues-filters')).to have_content(s_('SortOptions|Priority')) end it 'keeps sorting merge requests after visiting Projects MR page' do - pajamas_sort_by(s_('SortOptions|Created date')) + pajamas_sort_by(s_('SortOptions|Priority'), from: s_('SortOptions|Created date')) visit project_merge_requests_path(project) - expect(find('.issues-filters')).to have_content('Created date') + expect(find('.issues-filters')).to have_content(s_('SortOptions|Priority')) end end diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb index 5379dabc713..e9b55ab2900 100644 --- a/spec/features/dashboard/projects_spec.rb +++ b/spec/features/dashboard/projects_spec.rb @@ -151,7 +151,7 @@ RSpec.describe 'Dashboard Projects', :js, feature_category: :groups_and_projects it 'shows that the last pipeline passed' do visit dashboard_projects_path - page.within('[data-testid="project_controls"]') do + within_testid('project_controls') do expect(page).to have_xpath("//a[@href='#{pipelines_project_commit_path(project, project.commit, ref: pipeline.ref)}']") expect(page).to have_css("[data-testid='ci-icon']") expect(page).to have_css('[data-testid="status_success_borderless-icon"]') @@ -163,7 +163,7 @@ RSpec.describe 'Dashboard Projects', :js, feature_category: :groups_and_projects it 'does not show the pipeline status' do visit dashboard_projects_path - page.within('[data-testid="project_controls"]') do + within_testid('project_controls') do expect(page).not_to have_xpath("//a[@href='#{pipelines_project_commit_path(project, project.commit, ref: pipeline.ref)}']") expect(page).not_to have_css("[data-testid='ci-icon']") expect(page).not_to have_css('[data-testid="status_success_borderless-icon"]') diff --git a/spec/features/dashboard/todos/todos_spec.rb b/spec/features/dashboard/todos/todos_spec.rb index 59ce873905a..21dfa1cbc0b 100644 --- a/spec/features/dashboard/todos/todos_spec.rb +++ b/spec/features/dashboard/todos/todos_spec.rb @@ -95,7 +95,7 @@ RSpec.describe 'Dashboard Todos', :js, feature_category: :team_planning do shared_examples 'deleting the todo' do before do within first('.todo') do - find('[data-testid="check-icon"]').click + find_by_testid('check-icon').click end end @@ -121,9 +121,9 @@ RSpec.describe 'Dashboard Todos', :js, feature_category: :team_planning do shared_examples 'deleting and restoring the todo' do before do within first('.todo') do - find('[data-testid="check-icon"]').click + find_by_testid('check-icon').click wait_for_requests - find('[data-testid="redo-icon"]').click + find_by_testid('redo-icon').click end end @@ -301,7 +301,7 @@ RSpec.describe 'Dashboard Todos', :js, feature_category: :team_planning do describe 'restoring the todo' do before do within first('.todo') do - find('[data-testid="todo-add-icon"]').click + find_by_testid('todo-add-icon').click end end @@ -407,7 +407,7 @@ RSpec.describe 'Dashboard Todos', :js, feature_category: :team_planning do context 'User has deleted a todo' do before do within first('.todo') do - find('[data-testid="check-icon"]').click + find_by_testid('check-icon').click end end diff --git a/spec/features/environments/environments_folder_spec.rb b/spec/features/environments/environments_folder_spec.rb new file mode 100644 index 00000000000..da9de6fba0c --- /dev/null +++ b/spec/features/environments/environments_folder_spec.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Environments Folder page', :js, feature_category: :environment_management do + let(:folder_name) { 'folder' } + + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let!(:envs) { create_list(:environment, 4, :with_folders, project: project, folder: folder_name) } + let!(:stopped_env) { create(:environment, :stopped, :with_folders, project: project, folder: folder_name) } + + def get_env_name(environment) + environment.name.split('/').last + end + + def find_env_element(environment) + find_by_id(environment.name) + end + + def stop_environment(environment) + environment_item = find_env_element(environment) + within(environment_item) do + click_button 'Stop' + end + + within('.modal') do + click_button 'Stop environment' + end + + wait_for_requests + end + + def redeploy_environment(environment) + environment_item = find_env_element(environment) + within(environment_item) do + click_button 'More actions' + click_button 'Delete environment' + end + + within('.modal') do + click_button 'Delete environment' + end + + wait_for_requests + end + + before_all do + project.add_role(user, :developer) + end + + before do + create(:environment, :production, project: project) + end + + describe 'new folders page' do + before do + sign_in(user) + visit folder_project_environments_path(project, folder_name) + wait_for_requests + end + + it 'renders the header with a folder name' do + expect(page).to have_content("Environments / #{folder_name}") + end + + it 'renders the environments' do + expect(page).not_to have_content('production') + envs.each { |env| expect(page).to have_content(get_env_name(env)) } + end + + it 'shows scope tabs' do + expect(page).to have_content("Active") + expect(page).to have_content("Stopped") + end + + it 'can stop the environment' do + environment_to_stop = envs.first + + stop_environment(environment_to_stop) + + expect(page).not_to have_content(get_env_name(environment_to_stop)) + end + + describe 'stopped environments tab' do + before do + element = find('a', text: 'Stopped') + element.click + wait_for_requests + end + + it 'shows stopped environments on stopped tab' do + expect(page).to have_content(get_env_name(stopped_env)) + end + + it 'can re-start the environment' do + redeploy_environment(stopped_env) + + expect(page).not_to have_content(get_env_name(stopped_env)) + end + end + + describe 'pagination' do + # rubocop:disable RSpec/FactoryBot/ExcessiveCreateList -- need >20 items to test pagination + let!(:envs) { create_list(:environment, 25, :with_folders, project: project, folder: folder_name) } + + # rubocop:enable RSpec/FactoryBot/ExcessiveCreateList + it 'shows pagination' do + pagination = find('.pagination') + + expect(pagination).to have_content('2') + end + + it 'can navigate to the next page and updates the url' do + pagination = find('.pagination') + pagination.scroll_to(:bottom) + within(pagination) do + click_link 'Next' + end + + wait_for_requests + + expect(current_url).to include('page=2') + end + end + end + + describe 'legacy folders page' do + before do + stub_feature_flags(environments_folder_new_look: false) + sign_in(user) + visit folder_project_environments_path(project, folder_name) + wait_for_requests + end + + it 'user opens folder view' do + expect(page).to have_content("Environments / #{folder_name}") + expect(page).not_to have_content('production') + envs.each { |env| expect(page).to have_content(get_env_name(env)) } + end + end +end diff --git a/spec/features/explore/catalog/catalog_settings_spec.rb b/spec/features/explore/catalog/catalog_settings_spec.rb new file mode 100644 index 00000000000..bf324eafd7f --- /dev/null +++ b/spec/features/explore/catalog/catalog_settings_spec.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'CI/CD Catalog settings', :js, feature_category: :pipeline_composition do + let_it_be(:user) { create(:user) } + let_it_be_with_reload(:namespace) { create(:group) } + let_it_be_with_reload(:new_project) { create(:project, :repository, namespace: namespace) } + + context 'when user is not the owner' do + before do + sign_in(user) + visit edit_project_path(new_project) + wait_for_requests + end + + it 'does not show the CI/CD toggle settings' do + expect(page).not_to have_content('CI/CD Catalog resource') + end + end + + context 'when user is the owner' do + before_all do + namespace.add_owner(user) + end + + before do + sign_in(user) + end + + it 'shows the CI/CD toggle settings' do + visit edit_project_path(new_project) + wait_for_requests + + expect(page).to have_content('CI/CD Catalog resource') + end + + describe 'when setting a project as a Catalog resource' do + before do + visit project_path(new_project) + wait_for_requests + end + + it 'adds the project to the CI/CD Catalog' do + expect(page).not_to have_content('CI/CD catalog resource') + + visit edit_project_path(new_project) + + find('[data-testid="catalog-resource-toggle"] button').click + + visit project_path(new_project) + + expect(page).to have_content('CI/CD catalog resource') + end + end + + describe 'when unlisting a project from the CI/CD Catalog' do + before do + create(:ci_catalog_resource, project: new_project, state: :published) + visit project_path(new_project) + wait_for_requests + end + + it 'removes the project to the CI/CD Catalog' do + expect(page).to have_content('CI/CD catalog resource') + + visit edit_project_path(new_project) + + find('[data-testid="catalog-resource-toggle"] button').click + click_button 'Remove from the CI/CD catalog' + + visit project_path(new_project) + + expect(page).not_to have_content('CI/CD catalog resource') + end + end + end +end diff --git a/spec/features/explore/catalog/catalog_spec.rb b/spec/features/explore/catalog/catalog_spec.rb new file mode 100644 index 00000000000..00bbb02ebbf --- /dev/null +++ b/spec/features/explore/catalog/catalog_spec.rb @@ -0,0 +1,137 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'CI/CD Catalog', :js, feature_category: :pipeline_composition do + let_it_be(:namespace) { create(:group) } + let_it_be(:user) { create(:user) } + + before_all do + namespace.add_developer(user) + end + + before do + sign_in(user) + end + + describe 'GET explore/catalog' do + let_it_be(:project) { create(:project, :repository, namespace: namespace) } + + let_it_be(:ci_resource_projects) do + create_list( + :project, + 3, + :repository, + description: 'A simple component', + namespace: namespace + ) + end + + let_it_be(:ci_catalog_resources) do + ci_resource_projects.map do |current_project| + create(:ci_catalog_resource, :published, project: current_project) + end + end + + before do + visit explore_catalog_index_path + wait_for_requests + end + + it 'shows CI Catalog title and description', :aggregate_failures do + expect(page).to have_content('CI/CD Catalog') + expect(page).to have_content( + 'Discover CI/CD components that can improve your pipeline with additional functionality' + ) + end + + it 'renders CI Catalog resources list' do + expect(find_all('[data-testid="catalog-resource-item"]').length).to be(3) + end + + context 'when searching for a resource' do + let(:project_name) { ci_resource_projects[0].name } + + before do + find('input[data-testid="catalog-search-bar"]').send_keys project_name + find('input[data-testid="catalog-search-bar"]').send_keys :enter + wait_for_requests + end + + it 'renders only a subset of items' do + expect(find_all('[data-testid="catalog-resource-item"]').length).to be(1) + within_testid('catalog-resource-item', match: :first) do + expect(page).to have_content(project_name) + end + end + end + + context 'when sorting' do + context 'with the creation date option' do + it 'sorts resources from last to first by default' do + expect(find_all('[data-testid="catalog-resource-item"]').length).to be(3) + expect(find_all('[data-testid="catalog-resource-item"]')[0]).to have_content(ci_resource_projects[2].name) + expect(find_all('[data-testid="catalog-resource-item"]')[2]).to have_content(ci_resource_projects[0].name) + end + + context 'when changing the sort direction' do + before do + find('.sorting-direction-button').click + wait_for_requests + end + + it 'sorts resources from first to last' do + expect(find_all('[data-testid="catalog-resource-item"]').length).to be(3) + expect(find_all('[data-testid="catalog-resource-item"]')[0]).to have_content(ci_resource_projects[0].name) + expect(find_all('[data-testid="catalog-resource-item"]')[2]).to have_content(ci_resource_projects[2].name) + end + end + end + end + + context 'for a single CI/CD catalog resource' do + it 'renders resource details', :aggregate_failures do + within_testid('catalog-resource-item', match: :first) do + expect(page).to have_content(ci_resource_projects[2].name) + expect(page).to have_content(ci_resource_projects[2].description) + expect(page).to have_content(namespace.name) + end + end + + context 'when clicked' do + before do + find_by_testid('ci-resource-link', match: :first).click + end + + it 'navigates to the details page' do + expect(page).to have_content('Go to the project') + end + end + end + end + + describe 'GET explore/catalog/:id' do + let_it_be(:project) { create(:project, :repository, namespace: namespace) } + + before do + visit explore_catalog_path(new_ci_resource) + end + + context 'when the resource is published' do + let(:new_ci_resource) { create(:ci_catalog_resource, :published, project: project) } + + it 'navigates to the details page' do + expect(page).to have_content('Go to the project') + end + end + + context 'when the resource is not published' do + let(:new_ci_resource) { create(:ci_catalog_resource, project: project, state: :draft) } + + it 'returns a 404' do + expect(page).to have_title('Not Found') + expect(page).to have_content('Page Not Found') + end + end + end +end diff --git a/spec/features/explore/catalog_spec.rb b/spec/features/explore/catalog_spec.rb deleted file mode 100644 index 52ce52e43fe..00000000000 --- a/spec/features/explore/catalog_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Global Catalog', :js, feature_category: :pipeline_composition do - let_it_be(:namespace) { create(:group) } - let_it_be(:user) { create(:user) } - - before_all do - namespace.add_developer(user) - end - - before do - sign_in(user) - end - - describe 'GET explore/catalog' do - let_it_be(:project) { create(:project, :repository, namespace: namespace) } - let_it_be(:ci_resource_projects) do - create_list( - :project, - 3, - :repository, - description: 'A simple component', - namespace: namespace - ) - end - - before do - ci_resource_projects.each do |current_project| - create(:ci_catalog_resource, project: current_project) - end - - visit explore_catalog_index_path - wait_for_requests - end - - it 'shows CI Catalog title and description', :aggregate_failures do - expect(page).to have_content('CI/CD Catalog') - expect(page).to have_content('Discover CI configuration resources for a seamless CI/CD experience.') - end - - it 'renders CI Catalog resources list' do - expect(find_all('[data-testid="catalog-resource-item"]').length).to be(3) - end - - context 'for a single CI/CD catalog resource' do - it 'renders resource details', :aggregate_failures do - within_testid('catalog-resource-item', match: :first) do - expect(page).to have_content(ci_resource_projects[2].name) - expect(page).to have_content(ci_resource_projects[2].description) - expect(page).to have_content(namespace.name) - end - end - - context 'when clicked' do - before do - find_by_testid('ci-resource-link', match: :first).click - end - - it 'navigate to the details page' do - expect(page).to have_content('Go to the project') - end - end - end - end - - describe 'GET explore/catalog/:id' do - let_it_be(:project) { create(:project, :repository, namespace: namespace) } - let_it_be(:new_ci_resource) { create(:ci_catalog_resource, project: project) } - - before do - visit explore_catalog_path(id: new_ci_resource["id"]) - end - - it 'navigates to the details page' do - expect(page).to have_content('Go to the project') - end - end -end diff --git a/spec/features/explore/navbar_spec.rb b/spec/features/explore/navbar_spec.rb index c172760eb2c..f8fe9bc9af3 100644 --- a/spec/features/explore/navbar_spec.rb +++ b/spec/features/explore/navbar_spec.rb @@ -7,19 +7,7 @@ RSpec.describe '"Explore" navbar', :js, feature_category: :navigation do it_behaves_like 'verified navigation bar' do before do - stub_feature_flags(global_ci_catalog: false) visit explore_projects_path end end - - context "with 'global_ci_catalog' enabled" do - include_context '"Explore" navbar structure with global_ci_catalog FF' - - it_behaves_like 'verified navigation bar', global_ci_catalog: true do - before do - stub_feature_flags(global_ci_catalog: true) - visit explore_projects_path - end - end - end end diff --git a/spec/features/explore/user_explores_projects_spec.rb b/spec/features/explore/user_explores_projects_spec.rb index e1341824bfd..369297ff04a 100644 --- a/spec/features/explore/user_explores_projects_spec.rb +++ b/spec/features/explore/user_explores_projects_spec.rb @@ -25,7 +25,7 @@ RSpec.describe 'User explores projects', feature_category: :user_profile do describe 'breadcrumbs' do it 'has "Explore" as its root breadcrumb' do - within '.breadcrumbs-list li:first' do + within '.gl-breadcrumb-list li:first' do expect(page).to have_link('Explore', href: explore_root_path) end end diff --git a/spec/features/file_uploads/graphql_add_design_spec.rb b/spec/features/file_uploads/graphql_add_design_spec.rb index 0b61c952b55..714a2a29ee2 100644 --- a/spec/features/file_uploads/graphql_add_design_spec.rb +++ b/spec/features/file_uploads/graphql_add_design_spec.rb @@ -53,7 +53,7 @@ RSpec.describe 'Upload a design through graphQL', :js, feature_category: :design RSpec.shared_examples 'for a design upload through graphQL' do it 'creates proper objects' do expect { subject } - .to change { ::DesignManagement::Design.count }.by(1) + .to change { DesignManagement::Design.count }.by(1) .and change { ::LfsObject.count }.by(1) end diff --git a/spec/features/frequently_visited_projects_and_groups_spec.rb b/spec/features/frequently_visited_projects_and_groups_spec.rb index 514b642a2d4..764e88882a8 100644 --- a/spec/features/frequently_visited_projects_and_groups_spec.rb +++ b/spec/features/frequently_visited_projects_and_groups_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe 'Frequently visited items', :js, feature_category: :shared do - include Features::TopNavSpecHelpers - let_it_be(:user) { create(:user) } before do diff --git a/spec/features/groups/board_sidebar_spec.rb b/spec/features/groups/board_sidebar_spec.rb index 3fe520ea2ea..51d2e85f779 100644 --- a/spec/features/groups/board_sidebar_spec.rb +++ b/spec/features/groups/board_sidebar_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group Issue Boards', :js, feature_category: :groups_and_projects do +RSpec.describe 'Group Issue Boards', :js, feature_category: :team_planning do include BoardHelpers let(:group) { create(:group) } @@ -34,7 +34,7 @@ RSpec.describe 'Group Issue Boards', :js, feature_category: :groups_and_projects wait_for_requests - page.within('[data-testid="dropdown-content"]') do + within_testid('dropdown-content') do expect(page).to have_content(project_1_label.title) expect(page).to have_content(group_label.title) expect(page).not_to have_content(project_2_label.title) diff --git a/spec/features/groups/board_spec.rb b/spec/features/groups/board_spec.rb index e6dc6055e27..1a9a53a7421 100644 --- a/spec/features/groups/board_spec.rb +++ b/spec/features/groups/board_spec.rb @@ -32,7 +32,7 @@ RSpec.describe 'Group Boards', feature_category: :team_planning do fill_in 'issue_title', with: issue_title - page.within("[data-testid='project-select-dropdown']") do + within_testid('project-select-dropdown') do find('button.gl-new-dropdown-toggle').click find('.gl-new-dropdown-item').click diff --git a/spec/features/groups/clusters/user_spec.rb b/spec/features/groups/clusters/user_spec.rb index d876a5804bd..9089fba1886 100644 --- a/spec/features/groups/clusters/user_spec.rb +++ b/spec/features/groups/clusters/user_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User Cluster', :js, feature_category: :user_profile do +RSpec.describe 'User Cluster', :js, feature_category: :environment_management do include GoogleApi::CloudPlatformHelpers let(:group) { create(:group) } @@ -112,14 +112,33 @@ RSpec.describe 'User Cluster', :js, feature_category: :user_profile do context 'when user destroys the cluster' do before do click_link 'Advanced Settings' - find('[data-testid="remove-integration-button"]').click + find_by_testid('remove-integration-button').click fill_in 'confirm_cluster_name_input', with: cluster.name - find('[data-testid="remove-integration-modal-button"]').click + find_by_testid('remove-integration-modal-button').click end it 'user sees creation form with the successful message' do expect(page).to have_content('Kubernetes cluster integration was successfully removed.') end end + + context 'when signed in user is an admin in admin_mode' do + let(:admin) { create(:admin) } + + before do + # signs out the user with `maintainer` role in the project + gitlab_sign_out + + gitlab_sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) + + visit group_clusters_path(group) + end + + it 'can visit the clusters index page', :aggregate_failures do + expect(page).to have_title("Kubernetes Clusters · #{group.name} · #{_('GitLab')}") + expect(page).to have_content('Connect a cluster') + end + end end end diff --git a/spec/features/groups/dependency_proxy_spec.rb b/spec/features/groups/dependency_proxy_spec.rb index 12c480a46b0..136c1ff0335 100644 --- a/spec/features/groups/dependency_proxy_spec.rb +++ b/spec/features/groups/dependency_proxy_spec.rb @@ -62,7 +62,7 @@ RSpec.describe 'Group Dependency Proxy', feature_category: :dependency_proxy do visit settings_path wait_for_requests - proxy_toggle = find('[data-testid="dependency-proxy-setting-toggle"]') + proxy_toggle = find_by_testid('dependency-proxy-setting-toggle') proxy_toggle_button = proxy_toggle.find('button') expect(proxy_toggle).to have_css("button.is-checked") diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb index 4e5d7c6f8e8..b9a68b75962 100644 --- a/spec/features/groups/group_runners_spec.rb +++ b/spec/features/groups/group_runners_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Group Runners", feature_category: :runner_fleet do +RSpec.describe "Group Runners", feature_category: :fleet_visibility do include Features::RunnersHelpers include Spec::Support::Helpers::ModalHelpers @@ -11,7 +11,7 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, group: group) } - before do + before_all do group.add_owner(group_owner) group.add_maintainer(group_maintainer) end @@ -45,11 +45,7 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do visit group_runners_path(group) end - it_behaves_like 'shows runner in list' do - let(:runner) { group_runner } - end - - it_behaves_like 'shows runner details from list' do + it_behaves_like 'shows runner summary and navigates to details' do let(:runner) { group_runner } let(:runner_page_path) { group_runner_path(group, group_runner) } end @@ -66,10 +62,6 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do end it_behaves_like 'shows no runners found' - - it 'shows no runner' do - expect(page).not_to have_content 'runner-foo' - end end end @@ -82,11 +74,7 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do visit group_runners_path(group) end - it_behaves_like 'shows runner in list' do - let(:runner) { project_runner } - end - - it_behaves_like 'shows runner details from list' do + it_behaves_like 'shows runner summary and navigates to details' do let(:runner) { project_runner } let(:runner_page_path) { group_runner_path(group, project_runner) } end @@ -110,15 +98,9 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do context "when selecting 'Show only inherited'" do before do find("[data-testid='runner-membership-toggle'] button").click - - wait_for_requests - end - - it_behaves_like 'shows runner in list' do - let(:runner) { instance_runner } end - it_behaves_like 'shows runner details from list' do + it_behaves_like 'shows runner summary and navigates to details' do let(:runner) { instance_runner } let(:runner_page_path) { group_runner_path(group, instance_runner) } end @@ -287,7 +269,6 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do before do visit edit_group_runner_path(group, group_runner) - wait_for_requests end it_behaves_like 'submits edit runner form' do @@ -301,7 +282,6 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do before do visit edit_group_runner_path(group, project_runner) - wait_for_requests end it_behaves_like 'submits edit runner form' do diff --git a/spec/features/groups/group_settings_spec.rb b/spec/features/groups/group_settings_spec.rb index 0437e5df6e9..a7710ea04ab 100644 --- a/spec/features/groups/group_settings_spec.rb +++ b/spec/features/groups/group_settings_spec.rb @@ -141,8 +141,8 @@ RSpec.describe 'Edit group settings', feature_category: :groups_and_projects do end describe 'transfer group', :js do - let(:namespace_select) { page.find('[data-testid="transfer-group-namespace-select"]') } - let(:confirm_modal) { page.find('[data-testid="confirm-danger-modal"]') } + let(:namespace_select) { find_by_testid('transfer-group-namespace-select') } + let(:confirm_modal) { find_by_testid('confirm-danger-modal') } shared_examples 'can transfer the group' do before do @@ -154,7 +154,7 @@ RSpec.describe 'Edit group settings', feature_category: :groups_and_projects do visit edit_group_path(selected_group) - page.within('[data-testid="transfer-locations-dropdown"]') do + within_testid('transfer-locations-dropdown') do click_button _('Select parent group') fill_in _('Search'), with: target_group&.name || '' wait_for_requests @@ -170,7 +170,7 @@ RSpec.describe 'Edit group settings', feature_category: :groups_and_projects do click_button 'Confirm' end - within('[data-testid="breadcrumb-links"]') do + within_testid('breadcrumb-links') do expect(page).to have_content(target_group.name) if target_group expect(page).to have_content(selected_group.name) end diff --git a/spec/features/groups/import_export/connect_instance_spec.rb b/spec/features/groups/import_export/connect_instance_spec.rb index f6548c035f0..f3c89cce633 100644 --- a/spec/features/groups/import_export/connect_instance_spec.rb +++ b/spec/features/groups/import_export/connect_instance_spec.rb @@ -89,7 +89,7 @@ RSpec.describe 'Import/Export - Connect to another instance', :js, feature_categ end it 'renders fields and button disabled' do - expect(page).to have_field('GitLab source instance URL', disabled: true) + expect(page).to have_field('GitLab source instance base URL', disabled: true) expect(page).to have_field('Personal access token', disabled: true) expect(page).to have_button('Connect instance', disabled: true) end diff --git a/spec/features/groups/import_export/migration_history_spec.rb b/spec/features/groups/import_export/migration_history_spec.rb index 9fc9c7898d1..87b38221ad6 100644 --- a/spec/features/groups/import_export/migration_history_spec.rb +++ b/spec/features/groups/import_export/migration_history_spec.rb @@ -26,7 +26,7 @@ RSpec.describe 'Import/Export - GitLab migration history', :js, feature_category wait_for_requests - expect(page).to have_content 'GitLab Migration history' + expect(page).to have_content 'Direct transfer history' expect(page.find('tbody')).to have_css('tr', count: 2) end end diff --git a/spec/features/groups/issues_spec.rb b/spec/features/groups/issues_spec.rb index 0d7e9df031c..e4f9fe34823 100644 --- a/spec/features/groups/issues_spec.rb +++ b/spec/features/groups/issues_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe 'Group issues page', feature_category: :groups_and_projects do + include Features::SortingHelpers include FilteredSearchHelpers include DragTo @@ -180,8 +181,7 @@ RSpec.describe 'Group issues page', feature_category: :groups_and_projects do end def select_manual_sort - click_button 'Created date' - click_button 'Manual' + pajamas_sort_by 'Manual', from: 'Created date' wait_for_requests end diff --git a/spec/features/groups/members/leave_group_spec.rb b/spec/features/groups/members/leave_group_spec.rb index d864852e0d4..632155cd7e4 100644 --- a/spec/features/groups/members/leave_group_spec.rb +++ b/spec/features/groups/members/leave_group_spec.rb @@ -9,17 +9,22 @@ RSpec.describe 'Groups > Members > Leave group', feature_category: :groups_and_p let(:user) { create(:user) } let(:other_user) { create(:user) } let(:group) { create(:group) } + let(:more_actions_dropdown) do + find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle') + end before do sign_in(user) end - it 'guest leaves the group' do + it 'guest leaves the group', :js do group.add_guest(user) group.add_owner(other_user) visit group_path(group) + more_actions_dropdown.click click_link 'Leave group' + accept_gl_confirm(button_text: 'Leave group') expect(page).to have_current_path(dashboard_groups_path, ignore_query: true) expect(page).to have_content left_group_message(group) @@ -31,31 +36,33 @@ RSpec.describe 'Groups > Members > Leave group', feature_category: :groups_and_p group.add_owner(other_user) visit group_path(group, leave: 1) - accept_gl_confirm(button_text: 'Leave group') - wait_for_all_requests expect(page).to have_current_path(dashboard_groups_path, ignore_query: true) expect(group.users).not_to include(user) end - it 'guest leaves the group as last member' do + it 'guest leaves the group as last member', :js do group.add_guest(user) visit group_path(group) + more_actions_dropdown.click click_link 'Leave group' + accept_gl_confirm(button_text: 'Leave group') expect(page).to have_current_path(dashboard_groups_path, ignore_query: true) expect(page).to have_content left_group_message(group) expect(group.users).not_to include(user) end - it 'owner leaves the group if they are not the last owner' do + it 'owner leaves the group if they are not the last owner', :js do group.add_owner(user) group.add_owner(other_user) visit group_path(group) + more_actions_dropdown.click click_link 'Leave group' + accept_gl_confirm(button_text: 'Leave group') expect(page).to have_current_path(dashboard_groups_path, ignore_query: true) expect(page).to have_content left_group_message(group) @@ -66,6 +73,7 @@ RSpec.describe 'Groups > Members > Leave group', feature_category: :groups_and_p group.add_owner(user) visit group_path(group) + more_actions_dropdown.click expect(page).not_to have_content 'Leave group' @@ -79,7 +87,7 @@ RSpec.describe 'Groups > Members > Leave group', feature_category: :groups_and_p visit group_path(group, leave: 1) - expect(find('[data-testid="alert-danger"]')).to have_content 'You do not have permission to leave this group' + expect(find_by_testid('alert-danger')).to have_content 'You do not have permission to leave this group' end def left_group_message(group) diff --git a/spec/features/groups/members/manage_groups_spec.rb b/spec/features/groups/members/manage_groups_spec.rb index 87de0e2e46b..9531ebd3c35 100644 --- a/spec/features/groups/members/manage_groups_spec.rb +++ b/spec/features/groups/members/manage_groups_spec.rb @@ -106,7 +106,7 @@ RSpec.describe 'Groups > Members > Manage groups', :js, feature_category: :group page.within first_row do expect(page).to have_field('Expiration date', with: expiration_date) - find('[data-testid="clear-button"]').click + find_by_testid('clear-button').click wait_for_requests diff --git a/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb index c2eedfb4063..38eb226690c 100644 --- a/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb +++ b/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb @@ -48,7 +48,7 @@ RSpec.describe 'Groups > Members > Owner adds member with expiration date', :js, page.within second_row do expect(page).to have_field('Expiration date', with: expiration_date) - find('[data-testid="clear-button"]').click + find_by_testid('clear-button').click wait_for_requests diff --git a/spec/features/groups/members/request_access_spec.rb b/spec/features/groups/members/request_access_spec.rb index 2d0b2e483c5..e6da2ce7cec 100644 --- a/spec/features/groups/members/request_access_spec.rb +++ b/spec/features/groups/members/request_access_spec.rb @@ -3,10 +3,15 @@ require 'spec_helper' RSpec.describe 'Groups > Members > Request access', feature_category: :groups_and_projects do + include Spec::Support::Helpers::ModalHelpers + let(:user) { create(:user) } let(:owner) { create(:user) } let(:group) { create(:group, :public) } let!(:project) { create(:project, :private, namespace: group) } + let(:more_actions_dropdown) do + find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle') + end before do group.add_owner(owner) @@ -14,15 +19,19 @@ RSpec.describe 'Groups > Members > Request access', feature_category: :groups_an visit group_path(group) end - it 'request access feature is disabled' do + it 'request access feature is disabled', :js do group.update!(request_access_enabled: false) visit group_path(group) + more_actions_dropdown.click expect(page).not_to have_content 'Request Access' end - it 'user can request access to a group' do - perform_enqueued_jobs { click_link 'Request Access' } + it 'user can request access to a group', :js do + perform_enqueued_jobs do + more_actions_dropdown.click + click_link 'Request Access' + end expect(ActionMailer::Base.deliveries.last.to).to eq [owner.notification_email_or_default] expect(ActionMailer::Base.deliveries.last.subject).to match "Request to join the #{group.name} group" @@ -30,18 +39,26 @@ RSpec.describe 'Groups > Members > Request access', feature_category: :groups_an expect(group.requesters.exists?(user_id: user)).to be_truthy expect(page).to have_content 'Your request for access has been queued for review.' + more_actions_dropdown.click + expect(page).to have_content 'Withdraw Access Request' expect(page).not_to have_content 'Leave group' end - it 'user does not see private projects' do - perform_enqueued_jobs { click_link 'Request Access' } + it 'user does not see private projects', :js do + perform_enqueued_jobs do + more_actions_dropdown.click + click_link 'Request Access' + end expect(page).not_to have_content project.name end - it 'user does not see group in the Dashboard > Groups page' do - perform_enqueued_jobs { click_link 'Request Access' } + it 'user does not see group in the Dashboard > Groups page', :js do + perform_enqueued_jobs do + more_actions_dropdown.click + click_link 'Request Access' + end visit dashboard_groups_path @@ -49,6 +66,7 @@ RSpec.describe 'Groups > Members > Request access', feature_category: :groups_an end it 'user is not listed in the group members page', :js do + more_actions_dropdown.click click_link 'Request Access' expect(group.requesters.exists?(user_id: user)).to be_truthy @@ -63,20 +81,24 @@ RSpec.describe 'Groups > Members > Request access', feature_category: :groups_an end end - it 'user can withdraw its request for access' do + it 'user can withdraw its request for access', :js do + more_actions_dropdown.click click_link 'Request Access' expect(group.requesters.exists?(user_id: user)).to be_truthy + more_actions_dropdown.click click_link 'Withdraw Access Request' + accept_gl_confirm - expect(group.requesters.exists?(user_id: user)).to be_falsey expect(page).to have_content 'Your access request to the group has been withdrawn.' + expect(group.requesters.exists?(user_id: user)).to be_falsey end - it 'member does not see the request access button' do + it 'member does not see the request access button', :js do group.add_owner(user) visit group_path(group) + more_actions_dropdown.click expect(page).not_to have_content 'Request Access' end diff --git a/spec/features/groups/members/search_members_spec.rb b/spec/features/groups/members/search_members_spec.rb index ed2e0cd7b09..5f4ff8023c6 100644 --- a/spec/features/groups/members/search_members_spec.rb +++ b/spec/features/groups/members/search_members_spec.rb @@ -21,7 +21,7 @@ RSpec.describe 'Search group member', :js, feature_category: :groups_and_project end it 'renders member users' do - page.within '[data-testid="members-filtered-search-bar"]' do + within_testid('members-filtered-search-bar') do find_field('Filter members').click find('input').native.send_keys(member.name) click_button 'Search' diff --git a/spec/features/groups/members/sort_members_spec.rb b/spec/features/groups/members/sort_members_spec.rb index ea6f3ae1966..1cc9862ff3b 100644 --- a/spec/features/groups/members/sort_members_spec.rb +++ b/spec/features/groups/members/sort_members_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'Groups > Members > Sort members', :js, feature_category: :groups end def expect_sort_by(text, sort_direction) - within('[data-testid="members-sort-dropdown"]') do + within_testid('members-sort-dropdown') do expect(page).to have_css('button[aria-haspopup="menu"]', text: text) expect(page).to have_button("Sort direction: #{sort_direction == :asc ? 'Ascending' : 'Descending'}") end diff --git a/spec/features/groups/members/tabs_spec.rb b/spec/features/groups/members/tabs_spec.rb index cc97b367313..b96aa9293f2 100644 --- a/spec/features/groups/members/tabs_spec.rb +++ b/spec/features/groups/members/tabs_spec.rb @@ -62,7 +62,7 @@ RSpec.describe 'Groups > Members > Tabs', :js, feature_category: :groups_and_pro click_link 'Invited' - page.within '[data-testid="members-filtered-search-bar"]' do + within_testid('members-filtered-search-bar') do find_field('Search invited').click find('input').native.send_keys('email') click_button 'Search' @@ -75,7 +75,7 @@ RSpec.describe 'Groups > Members > Tabs', :js, feature_category: :groups_and_pro before do click_link 'Members' - page.within '[data-testid="members-filtered-search-bar"]' do + within_testid 'members-filtered-search-bar' do find_field('Filter members').click find('input').native.send_keys('test') click_button 'Search' diff --git a/spec/features/groups/merge_requests_spec.rb b/spec/features/groups/merge_requests_spec.rb index 0a830e6715c..84a6bc96df0 100644 --- a/spec/features/groups/merge_requests_spec.rb +++ b/spec/features/groups/merge_requests_spec.rb @@ -81,7 +81,7 @@ RSpec.describe 'Group merge requests page', feature_category: :code_review_workf it 'shows projects only with merge requests feature enabled', :js do click_button 'Select project to create merge request' - page.within('[data-testid="new-resource-dropdown"]') do + within_testid('new-resource-dropdown') do expect(page).to have_content(project.name_with_namespace) expect(page).not_to have_content(project_with_merge_requests_disabled.name_with_namespace) end diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb index bb7cc3db452..3f03f62604d 100644 --- a/spec/features/groups/milestone_spec.rb +++ b/spec/features/groups/milestone_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group milestones', feature_category: :groups_and_projects do +RSpec.describe 'Group milestones', feature_category: :team_planning do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project_empty_repo, group: group) } let_it_be(:user) { create(:group_member, :maintainer, user: create(:user), group: group).user } @@ -98,7 +98,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do end it 'counts milestones correctly' do - page.within '[data-testid="milestones-filter"]' do + within_testid 'milestones-filter' do expect(page).to have_content('Open 3') expect(page).to have_content('Closed 3') expect(page).to have_content('All 6') diff --git a/spec/features/groups/packages_spec.rb b/spec/features/groups/packages_spec.rb index 7819b1f0ab6..6b2a15daf72 100644 --- a/spec/features/groups/packages_spec.rb +++ b/spec/features/groups/packages_spec.rb @@ -52,7 +52,7 @@ RSpec.describe 'Group Packages', feature_category: :package_registry do it_behaves_like 'package details link' it 'allows you to navigate to the project page' do - find('[data-testid="root-link"]', text: project.name).click + find_by_testid('root-link', text: project.name).click expect(page).to have_current_path(project_path(project)) expect(page).to have_content(project.name) diff --git a/spec/features/groups/settings/ci_cd_spec.rb b/spec/features/groups/settings/ci_cd_spec.rb index a1acb73178b..bf056f535f2 100644 --- a/spec/features/groups/settings/ci_cd_spec.rb +++ b/spec/features/groups/settings/ci_cd_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'Group CI/CD settings', feature_category: :continuous_integration end describe 'Runners section' do - let(:shared_runners_toggle) { page.find('[data-testid="shared-runners-toggle"]') } + let(:shared_runners_toggle) { find_by_testid('shared-runners-toggle') } before do visit group_settings_ci_cd_path(group) diff --git a/spec/features/groups/settings/group_badges_spec.rb b/spec/features/groups/settings/group_badges_spec.rb index 1f16a288882..1ae61853748 100644 --- a/spec/features/groups/settings/group_badges_spec.rb +++ b/spec/features/groups/settings/group_badges_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group Badges', feature_category: :groups_and_projects do +RSpec.describe 'Group Badges', feature_category: :groups_and_projects, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/430713' do include WaitForRequests let(:user) { create(:user) } diff --git a/spec/features/groups/settings/packages_and_registries_spec.rb b/spec/features/groups/settings/packages_and_registries_spec.rb index cbd26441e2b..934234aa171 100644 --- a/spec/features/groups/settings/packages_and_registries_spec.rb +++ b/spec/features/groups/settings/packages_and_registries_spec.rb @@ -65,8 +65,10 @@ RSpec.describe 'Group Package and registry settings', feature_category: :package wait_for_requests + # rubocop:disable Capybara/TestidFinders -- Helper within_testid doesn't cover use case expect(page).to be_axe_clean.within('[data-testid="packages-and-registries-group-settings"]') .skipping :'link-in-text-block', :'heading-order' + # rubocop:enable Capybara/TestidFinders end it 'has a Duplicate packages section', :js do @@ -81,7 +83,7 @@ RSpec.describe 'Group Package and registry settings', feature_category: :package visit_settings_page wait_for_requests - within '[data-testid="maven-settings"]' do + within_testid 'maven-settings' do expect(page).to have_field _('Exceptions'), disabled: true click_button class: 'gl-toggle' @@ -98,7 +100,7 @@ RSpec.describe 'Group Package and registry settings', feature_category: :package visit_settings_page wait_for_requests - within '[data-testid="maven-settings"]' do + within_testid 'maven-settings' do click_button class: 'gl-toggle' fill_in _('Exceptions'), with: ')' @@ -115,7 +117,7 @@ RSpec.describe 'Group Package and registry settings', feature_category: :package visit_sub_group_settings_page wait_for_requests - within '[data-testid="maven-settings"]' do + within_testid 'maven-settings' do expect(page).to have_content('Allow duplicates') expect(page).to have_field _('Exceptions'), disabled: true diff --git a/spec/features/groups/show_spec.rb b/spec/features/groups/show_spec.rb index cf18f3cb4e5..c2ab5edf79c 100644 --- a/spec/features/groups/show_spec.rb +++ b/spec/features/groups/show_spec.rb @@ -38,7 +38,7 @@ RSpec.describe 'Group show page', feature_category: :groups_and_projects do expect(page).to have_content('Collaborate with your team') - page.within(find('[data-testid="invite-members-banner"]')) do + within_testid('invite-members-banner') do click_button('Invite your colleagues') end @@ -48,8 +48,8 @@ RSpec.describe 'Group show page', feature_category: :groups_and_projects do click_button('Cancel') end - page.within(find('[data-testid="invite-members-banner"]')) do - find('[data-testid="close-icon"]').click + within_testid('invite-members-banner') do + find_by_testid('close-icon').click end expect(page).not_to have_content('Collaborate with your team') @@ -119,7 +119,7 @@ RSpec.describe 'Group show page', feature_category: :groups_and_projects do wait_for_requests - page.within("[data-testid=\"group-overview-item-#{public_project.id}\"]") do + within_testid("group-overview-item-#{public_project.id}") do click_button _('Less restrictive visibility') end diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb index 578f39181d1..c0aaa7f818a 100644 --- a/spec/features/groups_spec.rb +++ b/spec/features/groups_spec.rb @@ -485,7 +485,7 @@ RSpec.describe 'Group', feature_category: :groups_and_projects do it 'only displays "New subgroup" button' do visit group_path(group) - page.within '[data-testid="group-buttons"]' do + within_testid 'group-buttons' do expect(page).to have_link('New subgroup') expect(page).not_to have_link('New project') end @@ -502,7 +502,7 @@ RSpec.describe 'Group', feature_category: :groups_and_projects do sign_in(user) visit group_path(group) - page.within '[data-testid="group-buttons"]' do + within_testid 'group-buttons' do expect(page).to have_link('New project') expect(page).not_to have_link('New subgroup') end @@ -515,7 +515,7 @@ RSpec.describe 'Group', feature_category: :groups_and_projects do visit group_path(group) - page.within '[data-testid="group-buttons"]' do + within_testid 'group-buttons' do expect(page).to have_link('New subgroup') expect(page).to have_link('New project') end @@ -542,7 +542,7 @@ RSpec.describe 'Group', feature_category: :groups_and_projects do it 'does not display the "New project" button' do visit group_path(group) - page.within '[data-testid="group-buttons"]' do + within_testid 'group-buttons' do expect(page).not_to have_link('New project') end end diff --git a/spec/features/incidents/incident_details_spec.rb b/spec/features/incidents/incident_details_spec.rb index 693f2599de5..bc0674c4886 100644 --- a/spec/features/incidents/incident_details_spec.rb +++ b/spec/features/incidents/incident_details_spec.rb @@ -46,7 +46,7 @@ RSpec.describe 'Incident details', :js, feature_category: :incident_management d # shows the incident tabs page.within('.issuable-details') do - incident_tabs = find('[data-testid="incident-tabs"]') + incident_tabs = find_by_testid('incident-tabs') expect(find('h1')).to have_content(incident.title) expect(incident_tabs).to have_content('Summary') @@ -66,14 +66,21 @@ RSpec.describe 'Incident details', :js, feature_category: :incident_management d describe 'escalation status' do let(:sidebar) { page.find('.right-sidebar') } - let(:widget) { sidebar.find('[data-testid="escalation_status_container"]') } + let(:widget) do + within sidebar do + find_by_testid('escalation_status_container') + end + end + let(:expected_dropdown_options) { escalation_status.class::STATUSES.keys.take(3).map { |key| key.to_s.titleize } } it 'has an interactable escalation status widget', :aggregate_failures do expect(current_status).to have_text(escalation_status.status_name.to_s.titleize) # list the available statuses - widget.find('[data-testid="edit-button"]').click + within widget do + find_by_testid('edit-button').click + end expect(dropdown_options.map(&:text)).to eq(expected_dropdown_options) expect(widget).not_to have_selector('#escalation-status-help') @@ -95,7 +102,9 @@ RSpec.describe 'Incident details', :js, feature_category: :incident_management d end def current_status - widget.find('[data-testid="collapsed-content"]') + within widget do + find_by_testid('collapsed-content') + end end end end @@ -108,9 +117,9 @@ RSpec.describe 'Incident details', :js, feature_category: :incident_management d click_button 'Edit title and description' wait_for_requests - page.within('[data-testid="issuable-form"]') do + within_testid('issuable-form') do click_button 'Issue' - find('[data-testid="issue-type-list-item"]', text: 'Incident').click + find_by_testid('issue-type-list-item', text: 'Incident').click click_button 'Save changes' end @@ -130,9 +139,9 @@ RSpec.describe 'Incident details', :js, feature_category: :incident_management d click_button 'Edit title and description' wait_for_requests - page.within('[data-testid="issuable-form"]') do + within_testid('issuable-form') do click_button 'Incident' - find('[data-testid="issue-type-list-item"]', text: 'Issue').click + find_by_testid('issue-type-list-item', text: 'Issue').click click_button 'Save changes' end diff --git a/spec/features/incidents/incident_timeline_events_spec.rb b/spec/features/incidents/incident_timeline_events_spec.rb index bd3658ab60f..4ceae0f8780 100644 --- a/spec/features/incidents/incident_timeline_events_spec.rb +++ b/spec/features/incidents/incident_timeline_events_spec.rb @@ -86,8 +86,8 @@ RSpec.describe 'Incident timeline events', :js, feature_category: :incident_mana def trigger_dropdown_action(text) click_button _('More actions') - page.within '[data-testid="disclosure-content"]' do - page.find('[data-testid="disclosure-dropdown-item"]', text: text).click + within_testid 'disclosure-content' do + find_by_testid('disclosure-dropdown-item', text: text).click end end end diff --git a/spec/features/integrations_settings_spec.rb b/spec/features/integrations_settings_spec.rb index 70ce2f55161..f460e051516 100644 --- a/spec/features/integrations_settings_spec.rb +++ b/spec/features/integrations_settings_spec.rb @@ -11,19 +11,17 @@ RSpec.describe 'Integration settings', feature_category: :integrations do sign_in(user) end - context 'with Shimo Zentao integration records' do + context 'with Zentao integration records' do before do - create(:integration, project: project, type_new: 'Integrations::Shimo', category: 'issue_tracker') create(:integration, project: project, type_new: 'Integrations::Zentao', category: 'issue_tracker') end - it 'shows settings without Shimo Zentao', :js do + it 'shows settings without Zentao', :js do visit namespace_project_settings_integrations_path(namespace_id: project.namespace.full_path, project_id: project.path) expect(page).to have_content('Add an integration') expect(page).not_to have_content('ZenTao') - expect(page).not_to have_content('Shimo') end end end diff --git a/spec/features/invites_spec.rb b/spec/features/invites_spec.rb index bc6efb63f6f..04ac94685cf 100644 --- a/spec/features/invites_spec.rb +++ b/spec/features/invites_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_category: :acquisition do let_it_be(:owner) { create(:user, name: 'John Doe') } - # private will ensure we really have access to the group when we land on the activity page + # private will ensure we really have access to the group when we land on the group page let_it_be(:group) { create(:group, :private, name: 'Owned') } let_it_be(:project) { create(:project, :repository, namespace: group) } @@ -17,17 +17,6 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate group.add_owner(owner) end - def confirm_email(new_user) - new_user_token = User.find_by_email(new_user.email).confirmation_token - - visit user_confirmation_path(confirmation_token: new_user_token) - end - - def fill_in_welcome_form - select 'Software Developer', from: 'user_role' - click_button 'Get started!' - end - context 'when inviting a registered user' do let(:invite_email) { 'user@example.com' } @@ -53,8 +42,8 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate expect(find_field('Username or primary email').value).to eq(group_invite.invite_email) end - it 'pre-fills the Email field on the sign up box with the invite_email from the invite' do - expect(find_field('Email').value).to eq(group_invite.invite_email) + it 'shows the Email to be the invite_email from the invite' do + expect(find_by_testid('invite-email').text).to eq(group_invite.invite_email) end end @@ -66,12 +55,12 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate visit invite_path(group_invite.raw_invite_token, invite_type: Emails::Members::INITIAL_INVITE) end - it 'sign in, grants access and redirects to group activity page' do + it 'sign in, grants access and redirects to group page' do click_link 'Sign in' gitlab_sign_in(user, remember: true, visit: false) - expect_to_be_on_group_activity_page(group) + expect_to_be_on_group_page(group) end end @@ -132,8 +121,8 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate end end - def expect_to_be_on_group_activity_page(group) - expect(page).to have_current_path(activity_group_path(group)) + def expect_to_be_on_group_page(group) + expect(page).to have_current_path(group_path(group)) end end end @@ -160,7 +149,7 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate end it 'does not sign the user in' do - fill_in_sign_up_form(new_user) + fill_in_sign_up_form(new_user, invite: true) expect(page).to have_current_path(new_user_session_path, ignore_query: true) sign_up_message = 'You have signed up successfully. However, we could not sign you in because your account ' \ @@ -175,23 +164,13 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate end context 'when the user signs up for an account with the invitation email address' do - it 'redirects to the most recent membership activity page with all invitations automatically accepted' do - fill_in_sign_up_form(new_user) + it 'redirects to the most recent membership group page with all invitations automatically accepted' do + fill_in_sign_up_form(new_user, invite: true) - expect(page).to have_current_path(activity_group_path(group), ignore_query: true) + expect(page).to have_current_path(group_path(group), ignore_query: true) expect(page).to have_content('You have been granted Owner access to group Owned.') end end - - context 'when the user sign-up using a different email address' do - let(:invite_email) { build_stubbed(:user).email } - - it 'signs up and redirects to the projects dashboard' do - fill_in_sign_up_form(new_user) - - expect_to_be_on_projects_dashboard_with_zero_authorized_projects - end - end end context 'with email confirmation enabled' do @@ -199,16 +178,16 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate let(:new_user) { build_stubbed(:user, password: '11111111') } it 'fails sign up and redirects back to sign up', :aggregate_failures do - expect { fill_in_sign_up_form(new_user) }.not_to change { User.count } + expect { fill_in_sign_up_form(new_user, invite: true) }.not_to change { User.count } expect(page).to have_content('prohibited this user from being saved') expect(page).to have_current_path(user_registration_path, ignore_query: true) - expect(find_field('Email').value).to eq(group_invite.invite_email) + expect(find_by_testid('invite-email').text).to eq(group_invite.invite_email) end end context 'with invite email acceptance', :snowplow do it 'tracks the accepted invite' do - fill_in_sign_up_form(new_user) + fill_in_sign_up_form(new_user, invite: true) expect_snowplow_event( category: 'RegistrationsController', @@ -221,51 +200,25 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate end context 'when the user signs up for an account with the invitation email address' do - it 'redirects to the most recent membership activity page with all invitations automatically accepted' do - fill_in_sign_up_form(new_user) + it 'redirects to the most recent membership group page with all invitations automatically accepted' do + fill_in_sign_up_form(new_user, invite: true) - expect(page).to have_current_path(activity_group_path(group), ignore_query: true) + expect(page).to have_current_path(group_path(group), ignore_query: true) end end + end - context 'when the user signs up using a different email address' do - let(:invite_email) { build_stubbed(:user).email } - - context 'when email confirmation is not set to `soft`' do - before do - allow(User).to receive(:allow_unconfirmed_access_for).and_return 0 - stub_feature_flags(identity_verification: false) - end - - it 'signs up and redirects to the projects dashboard' do - fill_in_sign_up_form(new_user) - confirm_email(new_user) - gitlab_sign_in(new_user, remember: true, visit: false) - - expect_to_be_on_projects_dashboard_with_zero_authorized_projects - end - end - - context 'when email confirmation setting is set to `soft`' do - before do - stub_application_setting_enum('email_confirmation_setting', 'soft') - allow(User).to receive(:allow_unconfirmed_access_for).and_return 2.days - end - - it 'signs up and redirects to the projects dashboard' do - fill_in_sign_up_form(new_user) - - expect_to_be_on_projects_dashboard_with_zero_authorized_projects - end - end + context 'when the email is already taken by a registered user' do + before do + create(:user, email: invite_email) end - end - def expect_to_be_on_projects_dashboard_with_zero_authorized_projects - expect(page).to have_current_path(dashboard_projects_path) + it 'shows error state of email already used' do + fill_in_sign_up_form(new_user, invite: true) - expect(page).to have_content _('Welcome to GitLab') - expect(page).to have_content _('Faster releases. Better code. Less pain.') + expect(page).to have_content('Email has already been taken') + expect(find_by_testid('invite-email').text).to eq(group_invite.invite_email) + end end end @@ -275,9 +228,9 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate expect(page).to have_current_path(new_user_registration_path, ignore_query: true) - fill_in_sign_up_form(new_user, 'Register') + fill_in_sign_up_form(new_user, 'Register', invite: true) - expect(page).to have_current_path(activity_group_path(group)) + expect(page).to have_current_path(group_path(group)) expect(page).to have_content('You have been granted Owner access to group Owned.') end end @@ -301,16 +254,16 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate gitlab_sign_in(user) end - it 'does not accept the pending invitation and does not redirect to the groups activity path' do - expect(page).not_to have_current_path(activity_group_path(group), ignore_query: true) + it 'does not accept the pending invitation and does not redirect to the group path' do + expect(page).not_to have_current_path(group_path(group), ignore_query: true) expect(group.reload.users).not_to include(user) end context 'when the secondary email address is confirmed' do let(:secondary_email) { create(:email, :confirmed, user: user) } - it 'accepts the pending invitation and redirects to the groups activity path' do - expect(page).to have_current_path(activity_group_path(group), ignore_query: true) + it 'accepts the pending invitation and redirects to the group path' do + expect(page).to have_current_path(group_path(group), ignore_query: true) expect(group.reload.users).to include(user) end end diff --git a/spec/features/issuables/shortcuts_issuable_spec.rb b/spec/features/issuables/shortcuts_issuable_spec.rb index 6bb453c34e6..13bec61e4da 100644 --- a/spec/features/issuables/shortcuts_issuable_spec.rb +++ b/spec/features/issuables/shortcuts_issuable_spec.rb @@ -86,7 +86,7 @@ RSpec.describe 'Blob shortcuts', :js, feature_category: :team_planning do it "opens milestones dropdown for editing" do find('body').native.send_key('m') - expect(find('[data-testid="milestone-edit"]')).to have_selector('.gl-dropdown-inner') + expect(find_by_testid('milestone-edit')).to have_selector('.gl-dropdown-inner') end end diff --git a/spec/features/issuables/sorting_list_spec.rb b/spec/features/issuables/sorting_list_spec.rb index 9045124cc8c..d960081c517 100644 --- a/spec/features/issuables/sorting_list_spec.rb +++ b/spec/features/issuables/sorting_list_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper' RSpec.describe 'Sort Issuable List', feature_category: :team_planning do + include Features::SortingHelpers include ListboxHelpers let(:project) { create(:project, :public) } @@ -195,8 +196,7 @@ RSpec.describe 'Sort Issuable List', feature_category: :team_planning do it 'supports sorting in asc and desc order' do visit_issues_with_state(project, 'opened') - click_button('Created date') - click_on('Updated date') + pajamas_sort_by 'Updated date', from: 'Created date' expect(page).to have_css('.issue:first-child', text: last_updated_issuable.title) expect(page).to have_css('.issue:last-child', text: first_updated_issuable.title) diff --git a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb index 4c4a5624d00..a671edb3ceb 100644 --- a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb +++ b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb @@ -47,7 +47,7 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j end end - context 'creating an issue for threads' do + context 'creating an issue for threads', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/420845' do before do find('.discussions-counter .gl-new-dropdown-toggle').click find(resolve_all_discussions_link_selector).click @@ -79,7 +79,9 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j end it 'shows a warning that the merge request contains unresolved threads' do - expect(page).to have_content 'all threads must be resolved' + click_button 'Expand merge checks' + + expect(page).to have_content 'Unresolved discussions must be resolved' end end end diff --git a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb index 73a920421a3..52a8f0b105a 100644 --- a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb +++ b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb @@ -57,6 +57,8 @@ RSpec.describe 'Resolve an open thread in a merge request by creating an issue', context 'creating the issue' do before do + allow(Gitlab::QueryLimiting::Transaction).to receive(:threshold).and_return(105) + find(resolve_discussion_selector, match: :first).click end diff --git a/spec/features/issues/discussion_lock_spec.rb b/spec/features/issues/discussion_lock_spec.rb index 04d59854ddc..2ef912061e6 100644 --- a/spec/features/issues/discussion_lock_spec.rb +++ b/spec/features/issues/discussion_lock_spec.rb @@ -6,104 +6,240 @@ RSpec.describe 'Discussion Lock', :js, feature_category: :team_planning do let(:user) { create(:user) } let(:issue) { create(:issue, project: project, author: user) } let(:project) { create(:project, :public) } + let(:more_dropdown) { find_by_testid('desktop-dropdown') } + let(:issuable_lock) { find_by_testid('issuable-lock') } + let(:locked_badge) { '[data-testid="locked-badge"]' } + let(:issuable_note_warning) { '[data-testid="issuable-note-warning"]' } - before do - sign_in(user) - stub_feature_flags(moved_mr_sidebar: false) - end - - context 'when a user is a team member' do + context 'when feature flag is disabled' do before do - project.add_developer(user) + sign_in(user) + stub_feature_flags(moved_mr_sidebar: false) end - context 'when the discussion is unlocked' do - it 'the user can lock the issue' do - visit project_issue_path(project, issue) + context 'when a user is a team member' do + before do + project.add_developer(user) + end - expect(find('.issuable-sidebar')).to have_content('Unlocked') + context 'when the discussion is unlocked' do + it 'the user can lock the issue' do + visit project_issue_path(project, issue) - page.within('.issuable-sidebar') do - find('.lock-edit').click - click_button('Lock') - end + expect(find('.issuable-sidebar')).to have_content('Unlocked') + + page.within('.issuable-sidebar') do + find('.lock-edit').click + click_button('Lock') + end - expect(find('#notes')).to have_content('locked the discussion in this issue') + expect(find('#notes')).to have_content('locked the discussion in this issue') + end end - end - context 'when the discussion is locked' do - before do - issue.update_attribute(:discussion_locked, true) - visit project_issue_path(project, issue) + context 'when the discussion is locked' do + before do + issue.update_attribute(:discussion_locked, true) + visit project_issue_path(project, issue) + end + + it 'the user can unlock the issue' do + expect(find('.issuable-sidebar')).to have_content('Locked') + + page.within('.issuable-sidebar') do + find('.lock-edit').click + click_button('Unlock') + end + + expect(find('#notes')).to have_content('unlocked the discussion in this issue') + expect(find('.issuable-sidebar')).to have_content('Unlocked') + end + + it 'the user can create a comment' do + page.within('#notes .js-main-target-form') do + fill_in 'note[note]', with: 'Some new comment' + click_button 'Comment' + end + + wait_for_requests + + expect(find('div#notes')).to have_content('Some new comment') + end end + end - it 'the user can unlock the issue' do - expect(find('.issuable-sidebar')).to have_content('Locked') + context 'when a user is not a team member' do + context 'when the discussion is unlocked' do + before do + visit project_issue_path(project, issue) + end - page.within('.issuable-sidebar') do - find('.lock-edit').click - click_button('Unlock') + it 'the user can not lock the issue' do + expect(find('.issuable-sidebar')).to have_content('Unlocked') + expect(find('.issuable-sidebar')).not_to have_selector('.lock-edit') end - expect(find('#notes')).to have_content('unlocked the discussion in this issue') - expect(find('.issuable-sidebar')).to have_content('Unlocked') + it 'the user can create a comment' do + page.within('#notes .js-main-target-form') do + fill_in 'note[note]', with: 'Some new comment' + click_button 'Comment' + end + + wait_for_requests + + expect(find('div#notes')).to have_content('Some new comment') + end end - it 'the user can create a comment' do - page.within('#notes .js-main-target-form') do - fill_in 'note[note]', with: 'Some new comment' - click_button 'Comment' + context 'when the discussion is locked' do + before do + issue.update_attribute(:discussion_locked, true) + visit project_issue_path(project, issue) end - wait_for_requests + it 'the user can not unlock the issue' do + expect(find('.issuable-sidebar')).to have_content('Locked') + expect(find('.issuable-sidebar')).not_to have_selector('.lock-edit') + end - expect(find('div#notes')).to have_content('Some new comment') + it 'the user can not create a comment' do + page.within('#notes') do + expect(page).not_to have_selector('.js-main-target-form') + expect(find_by_testid('disabled-comments')) + .to have_content('The discussion in this issue is locked. Only project members can comment.') + end + end end end - end - context 'when a user is not a team member' do - context 'when the discussion is unlocked' do + context 'for axe automated accessibility testing' do before do + project.add_developer(user) + issue.update_attribute(:discussion_locked, true) visit project_issue_path(project, issue) end - it 'the user can not lock the issue' do - expect(find('.issuable-sidebar')).to have_content('Unlocked') - expect(find('.issuable-sidebar')).not_to have_selector('.lock-edit') + it 'passes tests' do + # rubocop:disable Capybara/TestidFinders -- within_testid does not work here + expect(page).to be_axe_clean.within(locked_badge) + expect(page).to be_axe_clean.within(issuable_note_warning) + # rubocop:enable Capybara/TestidFinders + page.within('.issuable-sidebar') do + find('.lock-edit').click + expect(page).to be_axe_clean.within('.lock-edit') + end end + end + end + + context 'when feature flag is enabled' do + before do + sign_in(user) + stub_feature_flags(moved_mr_sidebar: true) + end + + context 'when a user is a team member' do + before do + project.add_developer(user) + end + + context 'when the discussion is unlocked' do + it 'the user can lock the issue' do + visit project_issue_path(project, issue) + + more_dropdown.click + expect(issuable_lock).to have_content('Lock discussion') - it 'the user can create a comment' do - page.within('#notes .js-main-target-form') do - fill_in 'note[note]', with: 'Some new comment' - click_button 'Comment' + issuable_lock.click + expect(find('#notes')).to have_content('locked the discussion in this issue') + end + end + + context 'when the discussion is locked' do + before do + issue.update_attribute(:discussion_locked, true) + visit project_issue_path(project, issue) end - wait_for_requests + it 'the user can unlock the issue' do + more_dropdown.click + expect(issuable_lock).to have_content('Unlock discussion') + + issuable_lock.click + expect(find('#notes')).to have_content('unlocked the discussion in this issue') + expect(issuable_lock).to have_content('Lock discussion') + end - expect(find('div#notes')).to have_content('Some new comment') + it 'the user can create a comment' do + page.within('#notes .js-main-target-form') do + fill_in 'note[note]', with: 'Some new comment' + click_button 'Comment' + end + + wait_for_requests + + expect(find('div#notes')).to have_content('Some new comment') + end end end - context 'when the discussion is locked' do - before do - issue.update_attribute(:discussion_locked, true) - visit project_issue_path(project, issue) - end + context 'when a user is not a team member' do + context 'when the discussion is unlocked' do + before do + visit project_issue_path(project, issue) + end - it 'the user can not unlock the issue' do - expect(find('.issuable-sidebar')).to have_content('Locked') - expect(find('.issuable-sidebar')).not_to have_selector('.lock-edit') + it 'the user can not lock the issue' do + more_dropdown.click + expect(issuable_lock).to have_content('Lock discussion') + end + + it 'the user can create a comment' do + page.within('#notes .js-main-target-form') do + fill_in 'note[note]', with: 'Some new comment' + click_button 'Comment' + end + + wait_for_requests + + expect(find('div#notes')).to have_content('Some new comment') + end end - it 'the user can not create a comment' do - page.within('#notes') do - expect(page).not_to have_selector('js-main-target-form') - expect(page.find('.disabled-comments')) - .to have_content('The discussion in this issue is locked. Only project members can comment.') + context 'when the discussion is locked' do + before do + issue.update_attribute(:discussion_locked, true) + visit project_issue_path(project, issue) + end + + it 'the user can not unlock the issue' do + more_dropdown.click + expect(issuable_lock).to have_content('Unlock discussion') + end + + it 'the user can not create a comment' do + page.within('#notes') do + expect(page).not_to have_selector('js-main-target-form') + expect(find_by_testid('disabled-comments')) + .to have_content('The discussion in this issue is locked. Only project members can comment.') + end end end end + + it 'passes axe automated accessibility testing' do + project.add_developer(user) + issue.update_attribute(:discussion_locked, true) + visit project_issue_path(project, issue) + wait_for_all_requests + + # rubocop:disable Capybara/TestidFinders -- within_testid does not work here + expect(page).to be_axe_clean.within(locked_badge) + expect(page).to be_axe_clean.within(issuable_note_warning) + + more_dropdown.click + expect(page).to be_axe_clean.within('[data-testid="lock-issue-toggle"] button') + # rubocop:enable Capybara/TestidFinders + end end end diff --git a/spec/features/issues/form_spec.rb b/spec/features/issues/form_spec.rb index 2fb30469691..896d86e4004 100644 --- a/spec/features/issues/form_spec.rb +++ b/spec/features/issues/form_spec.rb @@ -148,12 +148,12 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do click_button _('Select label') wait_for_all_requests - page.within '[data-testid="sidebar-labels"]' do + within_testid('sidebar-labels') do click_button label.title click_button label2.title click_button _('Close') wait_for_requests - page.within('[data-testid="embedded-labels-list"]') do + within_testid('embedded-labels-list') do expect(page).to have_content(label.title) expect(page).to have_content(label2.title) end @@ -188,13 +188,13 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do wait_for_all_requests - page.within '[data-testid="sidebar-labels"]' do + within_testid 'sidebar-labels' do click_button label.title click_button _('Close') wait_for_requests - page.within('[data-testid="embedded-labels-list"]') do + within_testid('embedded-labels-list') do expect(page).to have_content(label.title) end @@ -205,7 +205,7 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do wait_for_all_requests - page.within '[data-testid="sidebar-labels"]' do + within_testid 'sidebar-labels' do click_button label.title, class: 'dropdown-item' click_button _('Close') @@ -221,7 +221,7 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do wait_for_all_requests - page.within '[data-testid="sidebar-labels"]' do + within_testid 'sidebar-labels' do search_field = find('input[type="search"]') search_field.native.send_keys(label.title) @@ -238,7 +238,7 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do it 'displays an error message when submitting an invalid form' do click_button 'Create issue' - page.within('[data-testid="issue-title-input-field"]') do + within_testid('issue-title-input-field') do expect(page).to have_text(_('This field is required.')) end end @@ -463,14 +463,14 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do wait_for_all_requests - page.within '[data-testid="sidebar-labels"]' do + within_testid 'sidebar-labels' do click_button label.title click_button label2.title click_button _('Close') wait_for_requests - page.within('[data-testid="embedded-labels-list"]') do + within_testid('embedded-labels-list') do expect(page).to have_content(label.title) expect(page).to have_content(label2.title) end @@ -580,14 +580,14 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do wait_for_all_requests - page.within '[data-testid="sidebar-labels"]' do + within_testid 'sidebar-labels' do click_button _('Create project label') wait_for_requests end page.within '.js-labels-create' do - find('[data-testid="label-title-input"]').fill_in with: 'test label' + find_by_testid('label-title-input').fill_in with: 'test label' first('.suggest-colors-dropdown a').click click_button 'Create' diff --git a/spec/features/issues/incident_issue_spec.rb b/spec/features/issues/incident_issue_spec.rb index 5197f5d1e33..9225ba03003 100644 --- a/spec/features/issues/incident_issue_spec.rb +++ b/spec/features/issues/incident_issue_spec.rb @@ -35,7 +35,7 @@ RSpec.describe 'Incident Detail', :js, feature_category: :team_planning do it 'shows incident and alert data' do page.within('.issuable-details') do - incident_tabs = find('[data-testid="incident-tabs"]') + incident_tabs = find_by_testid('incident-tabs') aggregate_failures 'shows title and Summary tab' do expect(find('h1')).to have_content(incident.title) diff --git a/spec/features/issues/issue_detail_spec.rb b/spec/features/issues/issue_detail_spec.rb index c8802a9cc71..15cb1678c55 100644 --- a/spec/features/issues/issue_detail_spec.rb +++ b/spec/features/issues/issue_detail_spec.rb @@ -138,7 +138,7 @@ RSpec.describe 'Issue Detail', :js, feature_category: :team_planning do it 'cannot see Incident option' do open_issue_edit_form - page.within('[data-testid="issuable-form"]') do + within_testid('issuable-form') do expect(page).to have_content('Issue') expect(page).not_to have_content('Incident') end @@ -151,7 +151,7 @@ RSpec.describe 'Issue Detail', :js, feature_category: :team_planning do it 'routes the user to the incident details page when the `issue_type` is set to incident' do open_issue_edit_form - page.within('[data-testid="issuable-form"]') do + within_testid('issuable-form') do update_type_select('Issue', 'Incident') expect(page).to have_current_path(incident_project_issues_path(project, issue)) @@ -181,7 +181,7 @@ RSpec.describe 'Issue Detail', :js, feature_category: :team_planning do it 'routes the user to the issue details page when the `issue_type` is set to issue' do open_issue_edit_form - page.within('[data-testid="issuable-form"]') do + within_testid('issuable-form') do update_type_select('Incident', 'Issue') expect(page).to have_current_path(project_issue_path(project, incident)) @@ -193,7 +193,7 @@ RSpec.describe 'Issue Detail', :js, feature_category: :team_planning do def update_type_select(from, to) click_button from - find('[data-testid="issue-type-list-item"]', text: to).click + find_by_testid('issue-type-list-item', text: to).click click_button 'Save changes' wait_for_requests diff --git a/spec/features/issues/service_desk_spec.rb b/spec/features/issues/service_desk_spec.rb index 8662f0f98f5..3a2074b9b13 100644 --- a/spec/features/issues/service_desk_spec.rb +++ b/spec/features/issues/service_desk_spec.rb @@ -52,7 +52,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des aggregate_failures do expect(page).to have_css('.empty-state') expect(page).to have_text('Use Service Desk to connect with your users') - expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk')) + expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk/index')) expect(page).not_to have_link('Enable Service Desk') expect(page).to have_content(project.service_desk_address) end @@ -71,7 +71,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des aggregate_failures do expect(page).to have_css('.empty-state') expect(page).to have_text('Use Service Desk to connect with your users') - expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk')) + expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk/index')) expect(page).not_to have_link('Enable Service Desk') expect(page).not_to have_content(project.service_desk_address) end @@ -93,7 +93,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des it 'displays the small info box, documentation, a button to configure service desk, and the address' do aggregate_failures do - expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk')) + expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk/index')) expect(page).not_to have_link('Enable Service Desk') expect(page).to have_content(project.service_desk_address) end diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb index 813fdeea0a1..d47b6535688 100644 --- a/spec/features/issues/user_interacts_with_awards_spec.rb +++ b/spec/features/issues/user_interacts_with_awards_spec.rb @@ -306,18 +306,6 @@ RSpec.describe 'User interacts with awards', feature_category: :team_planning do expect(page).not_to have_selector(emoji_counter) end end - - context 'execute /award quick action' do - xit 'toggles the emoji award on noteable', :js do - execute_quick_action('/award :100:') - - expect(find(noteable_award_counter)).to have_text("1") - - execute_quick_action('/award :100:') - - expect(page).not_to have_selector(noteable_award_counter) - end - end end end diff --git a/spec/features/issues/user_sorts_issues_spec.rb b/spec/features/issues/user_sorts_issues_spec.rb index 206544b32a4..5c6198785d0 100644 --- a/spec/features/issues/user_sorts_issues_spec.rb +++ b/spec/features/issues/user_sorts_issues_spec.rb @@ -3,6 +3,7 @@ require "spec_helper" RSpec.describe "User sorts issues", feature_category: :team_planning do + include Features::SortingHelpers include SortingHelper include IssueHelpers @@ -46,8 +47,7 @@ RSpec.describe "User sorts issues", feature_category: :team_planning do it 'sorts by popularity', :js do visit(project_issues_path(project)) - click_button 'Created date' - click_on 'Popularity' + pajamas_sort_by 'Popularity', from: 'Created date' page.within(".issues-list") do page.within("li.issue:nth-child(1)") do diff --git a/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb b/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb index 78814e36cfe..1a7b72e6809 100644 --- a/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb +++ b/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb @@ -62,7 +62,10 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea wait_for_requests expect(page).not_to have_button('Merge', exact: true) - expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure or learn about other solutions.') + + click_button 'Expand merge checks' + + expect(page).to have_content('Pipeline must succeed.') end end @@ -75,7 +78,10 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea wait_for_requests expect(page).not_to have_button('Merge', exact: true) - expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure or learn about other solutions.') + + click_button 'Expand merge checks' + + expect(page).to have_content('Pipeline must succeed.') end end diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb index f13c68a60ee..e5eabd7e510 100644 --- a/spec/features/merge_request/user_posts_diff_notes_spec.rb +++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb @@ -15,8 +15,6 @@ RSpec.describe 'Merge request > User posts diff notes', :js, feature_category: : let(:test_note_comment) { 'this is a test note!' } before do - set_cookie('sidebar_collapsed', 'true') - project.add_developer(user) sign_in(user) end diff --git a/spec/features/merge_request/user_rebases_merge_request_spec.rb b/spec/features/merge_request/user_rebases_merge_request_spec.rb index 1b46b4e1d7f..1dc785724d3 100644 --- a/spec/features/merge_request/user_rebases_merge_request_spec.rb +++ b/spec/features/merge_request/user_rebases_merge_request_spec.rb @@ -14,11 +14,15 @@ RSpec.describe "User rebases a merge request", :js, feature_category: :code_revi it "rebases" do visit(merge_request_path(merge_request)) + wait_for_requests + + click_button 'Expand merge checks' + expect(page).to have_button("Rebase") click_button("Rebase") - expect(page).to have_content("Rebase in progress") + expect(find_by_testid('standard-rebase-button')).to have_selector(".gl-spinner") end end diff --git a/spec/features/merge_request/user_resolves_conflicts_spec.rb b/spec/features/merge_request/user_resolves_conflicts_spec.rb index 0f283f1194f..2fdd0a7dd51 100644 --- a/spec/features/merge_request/user_resolves_conflicts_spec.rb +++ b/spec/features/merge_request/user_resolves_conflicts_spec.rb @@ -96,6 +96,8 @@ RSpec.describe 'Merge request > User resolves conflicts', :js, feature_category: before do visit project_merge_request_path(project, merge_request) + + click_button 'Expand merge checks' end it 'shows a link to the conflict resolution page' do @@ -127,6 +129,9 @@ RSpec.describe 'Merge request > User resolves conflicts', :js, feature_category: before do visit project_merge_request_path(project, merge_request) + + click_button 'Expand merge checks' + click_link('conflicts', href: %r{/conflicts\Z}) end @@ -169,6 +174,9 @@ RSpec.describe 'Merge request > User resolves conflicts', :js, feature_category: before do visit project_merge_request_path(project, merge_request) + + click_button 'Expand merge checks' + click_link('conflicts', href: %r{/conflicts\Z}) end @@ -193,6 +201,8 @@ RSpec.describe 'Merge request > User resolves conflicts', :js, feature_category: project.add_developer(user) sign_in(user) visit project_merge_request_path(project, merge_request) + + click_button 'Expand merge checks' end it 'does not show a link to the conflict resolution page' do diff --git a/spec/features/merge_request/user_resolves_wip_mr_spec.rb b/spec/features/merge_request/user_resolves_wip_mr_spec.rb index 15a7755429b..dd1e73cf57f 100644 --- a/spec/features/merge_request/user_resolves_wip_mr_spec.rb +++ b/spec/features/merge_request/user_resolves_wip_mr_spec.rb @@ -32,6 +32,9 @@ RSpec.describe 'Merge request > User resolves Draft', :js, feature_category: :co context 'when there is active pipeline for merge request' do before do create(:ci_build, pipeline: pipeline) + + stub_feature_flags(merge_blocked_component: false) + sign_in(user) visit project_merge_request_path(project, merge_request) wait_for_requests diff --git a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb index 98ea72b9569..7c73eed5c1f 100644 --- a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb +++ b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb @@ -29,8 +29,6 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js, feature_c before do sign_in user - - set_cookie('sidebar_collapsed', 'true') end context 'discussion tab' do diff --git a/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb b/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb index 9955c13b769..5843585a95c 100644 --- a/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb +++ b/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb @@ -22,7 +22,10 @@ RSpec.describe 'Merge request > User sees merge button depending on unresolved t context 'with unresolved threads' do it 'does not allow to merge' do expect(page).not_to have_button('Merge', exact: true) - expect(page).to have_content('all threads must be resolved') + + click_button 'Expand merge checks' + + expect(page).to have_content('Unresolved discussions must be resolved') end end diff --git a/spec/features/merge_request/user_sees_merge_request_file_tree_sidebar_spec.rb b/spec/features/merge_request/user_sees_merge_request_file_tree_sidebar_spec.rb index 8caa13c6297..8a039bf9840 100644 --- a/spec/features/merge_request/user_sees_merge_request_file_tree_sidebar_spec.rb +++ b/spec/features/merge_request/user_sees_merge_request_file_tree_sidebar_spec.rb @@ -62,6 +62,11 @@ RSpec.describe 'Merge request > User sees merge request file tree sidebar', :js, context 'when navigating to the next file' do before do click_link 'Next' + wait_for_requests + # when we click the Next button the viewport will be scrolled a bit into the diffs view + # this will cause for the file tree sidebar height to be recalculated + # because this logic is async and debounced twice we have to wait for the layout to stabilize + sleep(1) end it_behaves_like 'last entry clickable' diff --git a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb index 5e683ddf7ba..b5c0c163f98 100644 --- a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb +++ b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb @@ -371,7 +371,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request', sha: merge_request.diff_head_sha, user: user, merge_request: merge_request, - status: :running) + status: :pending) merge_request.update_head_pipeline end diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb index c18b2c97f96..4327a08efb9 100644 --- a/spec/features/merge_request/user_sees_merge_widget_spec.rb +++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb @@ -173,9 +173,10 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category: end it 'shows information about blocked pipeline' do + click_button 'Expand merge checks' + expect(page).to have_content("Merge blocked") - expect(page).to have_content( - "pipeline must succeed. It's waiting for a manual action to continue.") + expect(page).to have_content("Pipeline must succeed.") expect(page).to have_css('[data-testid="status_manual_borderless-icon"]') end end @@ -399,7 +400,9 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category: # Wait for the `ci_status` and `merge_check` requests wait_for_requests - expect(page).to have_content('Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally.') + click_button 'Expand merge checks' + + expect(page).to have_content('Merge request must be rebased, because a fast-forward merge is not possible.') end end diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb index 715cc2f73be..2df9d91c8ee 100644 --- a/spec/features/merge_request/user_sees_versions_spec.rb +++ b/spec/features/merge_request/user_sees_versions_spec.rb @@ -56,6 +56,10 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod expect(page).to have_content '8 files' end + it 'has the correct count for changes' do + expect(page).to have_content 'Changes 8' + end + it_behaves_like 'allows commenting', file_name: '.gitmodules', line_text: '[submodule "six"]', @@ -123,6 +127,10 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod end end + it 'has the correct count for changes' do + expect(page).to have_content 'Changes 4' + end + it 'has a path with comparison context and shows comments that were last relevant at that version' do expect(page).to have_current_path diffs_project_merge_request_path( project, diff --git a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb index 5ccc24ebca1..3c2e1c4b37e 100644 --- a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb +++ b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb @@ -23,7 +23,7 @@ RSpec.describe 'User sorts merge requests', :js, feature_category: :code_review_ end it 'keeps the sort option' do - pajamas_sort_by(s_('SortOptions|Milestone')) + pajamas_sort_by(s_('SortOptions|Milestone'), from: s_('SortOptions|Created date')) visit(merge_requests_dashboard_path(assignee_username: user.username)) @@ -49,7 +49,7 @@ RSpec.describe 'User sorts merge requests', :js, feature_category: :code_review_ it 'separates remember sorting with issues', :js do create(:issue, project: project) - pajamas_sort_by(s_('SortOptions|Milestone')) + pajamas_sort_by(s_('SortOptions|Milestone'), from: s_('SortOptions|Created date')) visit(project_issues_path(project)) @@ -66,7 +66,7 @@ RSpec.describe 'User sorts merge requests', :js, feature_category: :code_review_ end it 'sorts by popularity' do - pajamas_sort_by(s_('SortOptions|Popularity')) + pajamas_sort_by(s_('SortOptions|Popularity'), from: s_('SortOptions|Created date')) page.within('.mr-list') do page.within('li.merge-request:nth-child(1)') do diff --git a/spec/features/profile_spec.rb b/spec/features/profile_spec.rb index b6c96555767..6c6deef5b74 100644 --- a/spec/features/profile_spec.rb +++ b/spec/features/profile_spec.rb @@ -66,7 +66,7 @@ RSpec.describe 'Profile account page', :js, feature_category: :user_profile do end it 'allows resetting of feed token' do - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path previous_token = '' @@ -88,7 +88,7 @@ RSpec.describe 'Profile account page', :js, feature_category: :user_profile do it 'allows resetting of incoming email token' do allow(Gitlab.config.incoming_email).to receive(:enabled).and_return(true) - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path previous_token = '' diff --git a/spec/features/profiles/keys_spec.rb b/spec/features/profiles/keys_spec.rb index cb270b669d3..65b65c356fa 100644 --- a/spec/features/profiles/keys_spec.rb +++ b/spec/features/profiles/keys_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Profile > SSH Keys', feature_category: :user_profile do +RSpec.describe 'Profile > SSH Keys', feature_category: :source_code_management do let(:user) { create(:user) } before do diff --git a/spec/features/profiles/two_factor_auths_spec.rb b/spec/features/profiles/two_factor_auths_spec.rb index 15ab79684d9..cea3172898f 100644 --- a/spec/features/profiles/two_factor_auths_spec.rb +++ b/spec/features/profiles/two_factor_auths_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Two factor auths', feature_category: :user_profile do +RSpec.describe 'Two factor auths', feature_category: :system_access do include Spec::Support::Helpers::ModalHelpers context 'when signed in' do diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb index 439839cfad5..e60589a161b 100644 --- a/spec/features/profiles/user_edit_profile_spec.rb +++ b/spec/features/profiles/user_edit_profile_spec.rb @@ -188,7 +188,7 @@ RSpec.describe 'User edit profile', feature_category: :user_profile do end context 'user status', :js do - def select_emoji(emoji_name, is_modal = false) + def select_emoji(emoji_name) toggle_button = find('.emoji-menu-toggle-button') toggle_button.click emoji_button = find("gl-emoji[data-name=\"#{emoji_name}\"]") @@ -330,10 +330,12 @@ RSpec.describe 'User edit profile', feature_category: :user_profile do find_by_testid('user-dropdown').click within_testid('user-dropdown') do - find('.js-set-status-modal-trigger.ready') + expect(page).to have_button(text: button_text, visible: :visible) click_button button_text end + + expect(page.find('#set-user-status-modal')).to be_visible end def open_user_status_modal @@ -386,7 +388,7 @@ RSpec.describe 'User edit profile', feature_category: :user_profile do it 'adds emoji to user status' do emoji = 'grinning' open_user_status_modal - select_emoji(emoji, true) + select_emoji(emoji) set_user_status_in_modal visit_user @@ -415,7 +417,7 @@ RSpec.describe 'User edit profile', feature_category: :user_profile do it 'opens the emoji modal again after closing it' do open_user_status_modal - select_emoji('grinning', true) + select_emoji('grinning') find('.emoji-menu-toggle-button').click @@ -428,7 +430,7 @@ RSpec.describe 'User edit profile', feature_category: :user_profile do emoji = 'grinning' open_user_status_modal - select_emoji(emoji, true) + select_emoji(emoji) expect(page.all('.award-control .js-counter')).to all(have_content('0')) end @@ -451,7 +453,7 @@ RSpec.describe 'User edit profile', feature_category: :user_profile do emoji = 'grinning' message = 'Playing outside' open_user_status_modal - select_emoji(emoji, true) + select_emoji(emoji) find_field(s_("SetStatusModal|What's your status?")).native.send_keys(message) set_user_status_in_modal diff --git a/spec/features/profiles/user_manages_applications_spec.rb b/spec/features/profiles/user_manages_applications_spec.rb index e3c4a797431..b4010cccbbc 100644 --- a/spec/features/profiles/user_manages_applications_spec.rb +++ b/spec/features/profiles/user_manages_applications_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe 'User manages applications', feature_category: :user_profile do let_it_be(:user) { create(:user) } - let_it_be(:new_application_path) { applications_profile_path } + let_it_be(:new_application_path) { user_settings_applications_path } let_it_be(:index_path) { oauth_applications_path } before do diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb index 36665f2b77d..2089c9df145 100644 --- a/spec/features/projects/blobs/blob_show_spec.rb +++ b/spec/features/projects/blobs/blob_show_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'File blob', :js, feature_category: :groups_and_projects do +RSpec.describe 'File blob', :js, feature_category: :source_code_management do include MobileHelpers let(:project) { create(:project, :public, :repository) } @@ -42,9 +42,6 @@ RSpec.describe 'File blob', :js, feature_category: :groups_and_projects do expect(page).to have_css(".js-syntax-highlight") expect(page).to have_content("require 'fileutils'") - # does not show a viewer switcher - expect(page).not_to have_selector('.js-blob-viewer-switcher') - # shows an enabled copy button expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)') @@ -299,9 +296,6 @@ RSpec.describe 'File blob', :js, feature_category: :groups_and_projects do # shows text expect(page).to have_content('size 1575078') - # does not show a viewer switcher - expect(page).not_to have_selector('.js-blob-viewer-switcher') - # shows an enabled copy button expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)') @@ -430,9 +424,6 @@ RSpec.describe 'File blob', :js, feature_category: :groups_and_projects do # shows text expect(page).to have_content('size 1575078') - # does not show a viewer switcher - expect(page).not_to have_selector('.js-blob-viewer-switcher') - # shows an enabled copy button expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)') diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb index 9c4f70a68b8..e70e155bd01 100644 --- a/spec/features/projects/blobs/edit_spec.rb +++ b/spec/features/projects/blobs/edit_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Editing file blob', :js, feature_category: :groups_and_projects do +RSpec.describe 'Editing file blob', :js, feature_category: :source_code_management do include Features::SourceEditorSpecHelpers include TreeHelper include Features::BlobSpecHelpers diff --git a/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb b/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb index cd7601aa94e..cc819ccb5b9 100644 --- a/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb +++ b/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User follows pipeline suggest nudge spec when feature is enabled', :js, feature_category: :groups_and_projects do +RSpec.describe 'User follows pipeline suggest nudge spec when feature is enabled', :js, feature_category: :source_code_management do include CookieHelper let(:project) { create(:project, :empty_repo) } diff --git a/spec/features/projects/branches/download_buttons_spec.rb b/spec/features/projects/branches/download_buttons_spec.rb index a888b5b977d..89d9cfff1e0 100644 --- a/spec/features/projects/branches/download_buttons_spec.rb +++ b/spec/features/projects/branches/download_buttons_spec.rb @@ -40,15 +40,14 @@ RSpec.describe 'Download buttons in branches page', feature_category: :groups_an let(:path_to_visit) { project_branches_filtered_path(project, state: 'all', search: ref) } end - context 'with artifacts' do + context 'with download source code button' do before do visit project_branches_filtered_path(project, state: 'all', search: 'binary-encoding') end - it 'shows download artifacts button' do - href = latest_succeeded_project_artifacts_path(project, 'binary-encoding/download', job: 'build') - - expect(page).to have_link build.name, href: href + it 'passes axe automated accessibility testing', :js do + find_by_testid('download-source-code-button').click + expect(page).to be_axe_clean.within('.project-action-button') end end end diff --git a/spec/features/projects/branches/new_branch_ref_dropdown_spec.rb b/spec/features/projects/branches/new_branch_ref_dropdown_spec.rb index 0badde99bdb..c1b468a3746 100644 --- a/spec/features/projects/branches/new_branch_ref_dropdown_spec.rb +++ b/spec/features/projects/branches/new_branch_ref_dropdown_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'New Branch Ref Dropdown', :js, feature_category: :groups_and_projects do +RSpec.describe 'New Branch Ref Dropdown', :js, feature_category: :source_code_management do include ListboxHelpers let(:user) { create(:user) } diff --git a/spec/features/projects/branches/user_creates_branch_spec.rb b/spec/features/projects/branches/user_creates_branch_spec.rb index 8d636dacb75..70a387e3ceb 100644 --- a/spec/features/projects/branches/user_creates_branch_spec.rb +++ b/spec/features/projects/branches/user_creates_branch_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User creates branch', :js, feature_category: :groups_and_projects do +RSpec.describe 'User creates branch', :js, feature_category: :source_code_management do include Features::BranchesHelpers let_it_be(:group) { create(:group, :public) } diff --git a/spec/features/projects/branches/user_deletes_branch_spec.rb b/spec/features/projects/branches/user_deletes_branch_spec.rb index 7e7ab4b2a47..d468d3ec7e7 100644 --- a/spec/features/projects/branches/user_deletes_branch_spec.rb +++ b/spec/features/projects/branches/user_deletes_branch_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "User deletes branch", :js, feature_category: :groups_and_projects do +RSpec.describe "User deletes branch", :js, feature_category: :source_code_management do include Spec::Support::Helpers::ModalHelpers let_it_be(:user) { create(:user) } diff --git a/spec/features/projects/branches/user_views_branches_spec.rb b/spec/features/projects/branches/user_views_branches_spec.rb index e396455b371..7cb27abc260 100644 --- a/spec/features/projects/branches/user_views_branches_spec.rb +++ b/spec/features/projects/branches/user_views_branches_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "User views branches", :js, feature_category: :groups_and_projects do +RSpec.describe "User views branches", :js, feature_category: :source_code_management do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb index 7915f446ee0..a29d643b15b 100644 --- a/spec/features/projects/branches_spec.rb +++ b/spec/features/projects/branches_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Branches', feature_category: :groups_and_projects do +RSpec.describe 'Branches', feature_category: :source_code_management do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :public, :repository) } let(:repository) { project.repository } diff --git a/spec/features/projects/cluster_agents_spec.rb b/spec/features/projects/cluster_agents_spec.rb index dcda24eb2e4..ab566b3b433 100644 --- a/spec/features/projects/cluster_agents_spec.rb +++ b/spec/features/projects/cluster_agents_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'ClusterAgents', :js, feature_category: :groups_and_projects do +RSpec.describe 'ClusterAgents', :js, feature_category: :environment_management do let_it_be(:token) { create(:cluster_agent_token, description: 'feature test token') } let(:agent) { token.agent } @@ -12,7 +12,7 @@ RSpec.describe 'ClusterAgents', :js, feature_category: :groups_and_projects do before do allow(Gitlab::Kas).to receive(:enabled?).and_return(true) allow_next_instance_of(Gitlab::Kas::Client) do |client| - allow(client).to receive(:get_connected_agents).and_return([]) + allow(client).to receive(:get_connected_agents_by_agent_ids).and_return([]) end gitlab_sign_in(user) diff --git a/spec/features/projects/clusters/user_spec.rb b/spec/features/projects/clusters/user_spec.rb index e256b44c4dc..067963e06e0 100644 --- a/spec/features/projects/clusters/user_spec.rb +++ b/spec/features/projects/clusters/user_spec.rb @@ -111,4 +111,23 @@ RSpec.describe 'User Cluster', :js, feature_category: :deployment_management do end end end + + context 'when signed in user is an admin in admin_mode' do + let(:admin) { create(:admin) } + + before do + # signs out the user with `maintainer` role in the project + gitlab_sign_out + + gitlab_sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) + + visit project_clusters_path(project) + end + + it 'can visit the clusters index page', :aggregate_failures do + expect(page).to have_title("Kubernetes Clusters · #{project.full_name} · #{_('GitLab')}") + expect(page).to have_content('Connect a cluster') + end + end end diff --git a/spec/features/projects/clusters_spec.rb b/spec/features/projects/clusters_spec.rb index d799fbc49ef..241d18d5223 100644 --- a/spec/features/projects/clusters_spec.rb +++ b/spec/features/projects/clusters_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Clusters', :js, feature_category: :groups_and_projects do +RSpec.describe 'Clusters', :js, feature_category: :environment_management do include GoogleApi::CloudPlatformHelpers let(:project) { create(:project) } diff --git a/spec/features/projects/commits/user_browses_commits_spec.rb b/spec/features/projects/commits/user_browses_commits_spec.rb index 3513e249b63..5a0b70532aa 100644 --- a/spec/features/projects/commits/user_browses_commits_spec.rb +++ b/spec/features/projects/commits/user_browses_commits_spec.rb @@ -42,8 +42,8 @@ RSpec.describe 'User browses commits', feature_category: :source_code_management it 'renders breadcrumbs on specific commit path' do visit project_commits_path(project, project.repository.root_ref + '/files/ruby/regex.rb', limit: 5) - expect(page).to have_selector('ul.breadcrumb') - .and have_selector('ul.breadcrumb a', count: 4) + expect(page).to have_selector('#content-body ul.breadcrumb') + .and have_selector('#content-body ul.breadcrumb a', count: 4) end it 'renders diff links to both the previous and current image', :js do diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb index fdedaa3f469..de4ce3a23b6 100644 --- a/spec/features/projects/environments/environment_spec.rb +++ b/spec/features/projects/environments/environment_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Environment', feature_category: :groups_and_projects do +RSpec.describe 'Environment', feature_category: :environment_management do let_it_be(:project) { create(:project, :repository) } let(:user) { create(:user) } let(:role) { :developer } diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb index 0a54f5923f2..c7e0fdb3fc8 100644 --- a/spec/features/projects/environments/environments_spec.rb +++ b/spec/features/projects/environments/environments_spec.rb @@ -461,22 +461,6 @@ RSpec.describe 'Environments page', :js, feature_category: :continuous_delivery end end - describe 'environments folders view' do - before do - create(:environment, project: project, name: 'staging.review/review-1', state: :available) - create(:environment, project: project, name: 'staging.review/review-2', state: :available) - end - - it 'user opens folder view' do - visit folder_project_environments_path(project, 'staging.review') - wait_for_requests - - expect(page).to have_content('Environments / staging.review') - expect(page).to have_content('review-1') - expect(page).to have_content('review-2') - end - end - def have_terminal_button have_link(_('Terminal'), href: terminal_project_environment_path(project, environment)) end diff --git a/spec/features/projects/files/download_buttons_spec.rb b/spec/features/projects/files/download_buttons_spec.rb index 81bd0523c70..c731cdab1ad 100644 --- a/spec/features/projects/files/download_buttons_spec.rb +++ b/spec/features/projects/files/download_buttons_spec.rb @@ -22,16 +22,4 @@ RSpec.describe 'Projects > Files > Download buttons in files tree', feature_cate it_behaves_like 'archive download buttons' do let(:path_to_visit) { project_tree_path(project, project.default_branch) } end - - context 'with artifacts' do - before do - visit project_tree_path(project, project.default_branch) - end - - it 'shows download artifacts button' do - href = latest_succeeded_project_artifacts_path(project, "#{project.default_branch}/download", job: 'build') - - expect(page).to have_link build.name, href: href - end - end end diff --git a/spec/features/projects/files/find_file_keyboard_spec.rb b/spec/features/projects/files/find_file_keyboard_spec.rb index 85ecd1c2d96..ec2fe146b3f 100644 --- a/spec/features/projects/files/find_file_keyboard_spec.rb +++ b/spec/features/projects/files/find_file_keyboard_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > Find file keyboard shortcuts', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > Find file keyboard shortcuts', :js, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } diff --git a/spec/features/projects/files/project_owner_creates_license_file_spec.rb b/spec/features/projects/files/project_owner_creates_license_file_spec.rb index 18041bbb00a..2e6b470dd7d 100644 --- a/spec/features/projects/files/project_owner_creates_license_file_spec.rb +++ b/spec/features/projects/files/project_owner_creates_license_file_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > Project owner creates a license file', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > Project owner creates a license file', :js, feature_category: :source_code_management do let_it_be(:project_maintainer) { create(:user) } let_it_be(:project) { create(:project, :repository, namespace: project_maintainer.namespace) } diff --git a/spec/features/projects/files/template_selector_menu_spec.rb b/spec/features/projects/files/template_selector_menu_spec.rb index 920da6e72ce..e8aa59a262c 100644 --- a/spec/features/projects/files/template_selector_menu_spec.rb +++ b/spec/features/projects/files/template_selector_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Template selector menu', :js, feature_category: :groups_and_projects do +RSpec.describe 'Template selector menu', :js, feature_category: :team_planning do let(:project) { create(:project, :repository) } let(:user) { create(:user) } diff --git a/spec/features/projects/files/user_browses_files_spec.rb b/spec/features/projects/files/user_browses_files_spec.rb index e93c9427c91..7c7e5811ad9 100644 --- a/spec/features/projects/files/user_browses_files_spec.rb +++ b/spec/features/projects/files/user_browses_files_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "User browses files", :js, feature_category: :groups_and_projects do +RSpec.describe "User browses files", :js, feature_category: :source_code_management do include RepoHelpers include ListboxHelpers diff --git a/spec/features/projects/files/user_browses_lfs_files_spec.rb b/spec/features/projects/files/user_browses_lfs_files_spec.rb index d8c1c8e4f2a..12acb98684c 100644 --- a/spec/features/projects/files/user_browses_lfs_files_spec.rb +++ b/spec/features/projects/files/user_browses_lfs_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User browses LFS files', feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > User browses LFS files', feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } diff --git a/spec/features/projects/files/user_creates_directory_spec.rb b/spec/features/projects/files/user_creates_directory_spec.rb index d824b3b1759..2c3b6e6d2a5 100644 --- a/spec/features/projects/files/user_creates_directory_spec.rb +++ b/spec/features/projects/files/user_creates_directory_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User creates a directory', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > User creates a directory', :js, feature_category: :source_code_management do let(:fork_message) do "You're not allowed to make changes to this project directly. "\ "A fork of this project has been created that you can make changes in, so you can submit a merge request." diff --git a/spec/features/projects/files/user_creates_files_spec.rb b/spec/features/projects/files/user_creates_files_spec.rb index de82f3062a2..edc504240a7 100644 --- a/spec/features/projects/files/user_creates_files_spec.rb +++ b/spec/features/projects/files/user_creates_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User creates files', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > User creates files', :js, feature_category: :source_code_management do include Features::SourceEditorSpecHelpers include Features::BlobSpecHelpers @@ -65,6 +65,11 @@ RSpec.describe 'Projects > Files > User creates files', :js, feature_category: : expect(page).to have_selector('.file-editor') end + it 'shows full path instead of ref when creating a file' do + expect(page).to have_selector('#editor_path') + expect(page).not_to have_selector('#editor_ref') + end + def submit_new_file(options) file_name = find('#file_name') file_name.set options[:file_name] || 'README.md' diff --git a/spec/features/projects/files/user_deletes_files_spec.rb b/spec/features/projects/files/user_deletes_files_spec.rb index c526084b35d..68a996451f6 100644 --- a/spec/features/projects/files/user_deletes_files_spec.rb +++ b/spec/features/projects/files/user_deletes_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User deletes files', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > User deletes files', :js, feature_category: :source_code_management do let(:fork_message) do "You're not allowed to make changes to this project directly. "\ "A fork of this project has been created that you can make changes in, so you can submit a merge request." diff --git a/spec/features/projects/files/user_edits_files_spec.rb b/spec/features/projects/files/user_edits_files_spec.rb index 5612f6a53b2..b7fe8b3e5bb 100644 --- a/spec/features/projects/files/user_edits_files_spec.rb +++ b/spec/features/projects/files/user_edits_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :source_code_management do include Features::SourceEditorSpecHelpers include ProjectForksHelper include Features::BlobSpecHelpers @@ -53,6 +53,14 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :gr expect(find('.monaco-editor')).to have_content('*.rbca') end + it 'shows ref instead of full path when editing a file' do + click_link('.gitignore') + edit_in_single_file_editor + + expect(page).not_to have_selector('#editor_path') + expect(page).to have_selector('#editor_ref') + end + it 'does not show the edit link if a file is binary' do binary_file = File.join(project.repository.root_ref, 'files/images/logo-black.png') visit(project_blob_path(project, binary_file)) diff --git a/spec/features/projects/files/user_find_file_spec.rb b/spec/features/projects/files/user_find_file_spec.rb index b6e739e8082..bf6680cd57a 100644 --- a/spec/features/projects/files/user_find_file_spec.rb +++ b/spec/features/projects/files/user_find_file_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User find project file', feature_category: :groups_and_projects do +RSpec.describe 'User find project file', feature_category: :source_code_management do include ListboxHelpers let(:user) { create :user } diff --git a/spec/features/projects/files/user_reads_pipeline_status_spec.rb b/spec/features/projects/files/user_reads_pipeline_status_spec.rb index 24dd673501c..610c583f060 100644 --- a/spec/features/projects/files/user_reads_pipeline_status_spec.rb +++ b/spec/features/projects/files/user_reads_pipeline_status_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'user reads pipeline status', :js, feature_category: :groups_and_projects do +RSpec.describe 'user reads pipeline status', :js, feature_category: :continuous_integration do let(:project) { create(:project, :repository) } let(:user) { create(:user) } let(:v110_pipeline) { create_pipeline('v1.1.0', 'success') } diff --git a/spec/features/projects/files/user_replaces_files_spec.rb b/spec/features/projects/files/user_replaces_files_spec.rb index bd951b974d1..a5d80c387d5 100644 --- a/spec/features/projects/files/user_replaces_files_spec.rb +++ b/spec/features/projects/files/user_replaces_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User replaces files', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > User replaces files', :js, feature_category: :source_code_management do include DropzoneHelper let(:fork_message) do diff --git a/spec/features/projects/files/user_searches_for_files_spec.rb b/spec/features/projects/files/user_searches_for_files_spec.rb index 030d5a8ec40..587e87a21dd 100644 --- a/spec/features/projects/files/user_searches_for_files_spec.rb +++ b/spec/features/projects/files/user_searches_for_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User searches for files', feature_category: :groups_and_projects do +RSpec.describe 'Projects > Files > User searches for files', feature_category: :source_code_management do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :repository, namespace: user.namespace) } diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb index c159b40003c..e849f110014 100644 --- a/spec/features/projects/fork_spec.rb +++ b/spec/features/projects/fork_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project fork', feature_category: :groups_and_projects do +RSpec.describe 'Project fork', feature_category: :source_code_management do include ListboxHelpers include ProjectForksHelper diff --git a/spec/features/projects/gfm_autocomplete_load_spec.rb b/spec/features/projects/gfm_autocomplete_load_spec.rb index 35ab0094d51..9e23c05a739 100644 --- a/spec/features/projects/gfm_autocomplete_load_spec.rb +++ b/spec/features/projects/gfm_autocomplete_load_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'GFM autocomplete loading', :js, feature_category: :groups_and_projects do +RSpec.describe 'GFM autocomplete loading', :js, feature_category: :team_planning do let(:project) { create(:project) } before do diff --git a/spec/features/projects/graph_spec.rb b/spec/features/projects/graph_spec.rb index e9c05fd7f7f..effe743ac81 100644 --- a/spec/features/projects/graph_spec.rb +++ b/spec/features/projects/graph_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Graph', :js, feature_category: :groups_and_projects do +RSpec.describe 'Project Graph', :js, feature_category: :source_code_management do let(:user) { create(:user) } let(:project) { create(:project, :repository, namespace: user.namespace) } let(:branch_name) { 'master' } diff --git a/spec/features/projects/infrastructure_registry_spec.rb b/spec/features/projects/infrastructure_registry_spec.rb index a648a4fc1ce..10ac61973fb 100644 --- a/spec/features/projects/infrastructure_registry_spec.rb +++ b/spec/features/projects/infrastructure_registry_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Infrastructure Registry', feature_category: :groups_and_projects do +RSpec.describe 'Infrastructure Registry', feature_category: :package_registry do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb b/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb index 944a2c164d5..02cec948127 100644 --- a/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb +++ b/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb @@ -10,10 +10,10 @@ RSpec.describe 'User activates issue tracker', :js, feature_category: :integrati def fill_form(disable: false, skip_new_issue_url: false) click_active_checkbox if disable - fill_in 'service_project_url', with: url - fill_in 'service_issues_url', with: "#{url}/:id" + fill_in 'service-project_url', with: url + fill_in 'service-issues_url', with: "#{url}/:id" - fill_in 'service_new_issue_url', with: url unless skip_new_issue_url + fill_in 'service-new_issue_url', with: url unless skip_new_issue_url end shared_examples 'external issue tracker activation' do |tracker:, skip_new_issue_url: false, skip_test: false| diff --git a/spec/features/projects/integrations/user_activates_jira_spec.rb b/spec/features/projects/integrations/user_activates_jira_spec.rb index cc0d4c6f564..704e959ff0e 100644 --- a/spec/features/projects/integrations/user_activates_jira_spec.rb +++ b/spec/features/projects/integrations/user_activates_jira_spec.rb @@ -39,7 +39,7 @@ RSpec.describe 'User activates Jira', :js, feature_category: :integrations do it 'shows errors when some required fields are not filled in' do visit_project_integration('Jira') - fill_in 'service_password', with: 'password' + fill_in 'service-password', with: 'password' click_test_integration page.within('[data-testid="integration-settings-form"]') do diff --git a/spec/features/projects/integrations/user_activates_mattermost_slash_command_spec.rb b/spec/features/projects/integrations/user_activates_mattermost_slash_command_spec.rb index e490e32149e..14a94152a94 100644 --- a/spec/features/projects/integrations/user_activates_mattermost_slash_command_spec.rb +++ b/spec/features/projects/integrations/user_activates_mattermost_slash_command_spec.rb @@ -143,7 +143,7 @@ RSpec.describe 'Set up Mattermost slash commands', :js, feature_category: :integ end it 'shows a token placeholder' do - token_placeholder = find_field('service_token')['placeholder'] + token_placeholder = find_field('service-token')['placeholder'] expect(token_placeholder).to eq('') end diff --git a/spec/features/projects/issuable_templates_spec.rb b/spec/features/projects/issuable_templates_spec.rb index bc67cdbfad1..59fea7d7265 100644 --- a/spec/features/projects/issuable_templates_spec.rb +++ b/spec/features/projects/issuable_templates_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects do +RSpec.describe 'issuable templates', :js, feature_category: :team_planning do include ProjectForksHelper let(:user) { create(:user) } diff --git a/spec/features/projects/jobs/permissions_spec.rb b/spec/features/projects/jobs/permissions_spec.rb index 73635480b95..7759875c2a5 100644 --- a/spec/features/projects/jobs/permissions_spec.rb +++ b/spec/features/projects/jobs/permissions_spec.rb @@ -89,7 +89,10 @@ RSpec.describe 'Project Jobs Permissions', feature_category: :groups_and_project it_behaves_like 'recent job page details responds with status', 200 do it 'renders job details', :js do expect(page).to have_content(job.name) - expect(page).to have_css '.log-line' + + within_testid('job-log-content') do + expect(page).to have_content('Job succeeded') + end end end diff --git a/spec/features/projects/jobs/user_browses_job_spec.rb b/spec/features/projects/jobs/user_browses_job_spec.rb index 448db8b6d89..1be1a58d212 100644 --- a/spec/features/projects/jobs/user_browses_job_spec.rb +++ b/spec/features/projects/jobs/user_browses_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User browses a job', :js, feature_category: :groups_and_projects do +RSpec.describe 'User browses a job', :js, feature_category: :continuous_integration do include Spec::Support::Helpers::ModalHelpers let(:user) { create(:user) } diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb index 115b3dda5b2..5c1dc36a31c 100644 --- a/spec/features/projects/jobs/user_browses_jobs_spec.rb +++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb @@ -8,7 +8,7 @@ def visit_jobs_page wait_for_requests end -RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do +RSpec.describe 'User browses jobs', feature_category: :continuous_integration do describe 'Jobs', :js do let(:project) { create(:project, :repository) } let(:user) { create(:user) } diff --git a/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb b/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb index 41a21b1155b..21274572352 100644 --- a/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb +++ b/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User triggers manual job with variables', :js, feature_category: :groups_and_projects do +RSpec.describe 'User triggers manual job with variables', :js, feature_category: :continuous_integration do let(:user) { create(:user) } let(:user_access_level) { :developer } let(:project) { create(:project, :repository, namespace: user.namespace) } diff --git a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb index 47cd0d612b5..08de3d95060 100644 --- a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb +++ b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb @@ -8,16 +8,23 @@ RSpec.describe 'Projects > Members > Group requester cannot request access to pr let(:owner) { create(:user) } let(:group) { create(:group, :public) } let(:project) { create(:project, :public, namespace: group) } + let(:more_actions_dropdown) do + find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle') + end before do group.add_owner(owner) sign_in(user) visit group_path(group) - perform_enqueued_jobs { click_link 'Request Access' } + perform_enqueued_jobs do + more_actions_dropdown.click + click_link 'Request Access' + end visit project_path(project) end it 'group requester does not see the request access / withdraw access request button' do + expect(page).not_to have_css '[data-testid="groups-projects-more-actions-dropdown"]' expect(page).not_to have_content 'Request Access' expect(page).not_to have_content 'Withdraw Access Request' end diff --git a/spec/features/projects/members/manage_groups_spec.rb b/spec/features/projects/members/manage_groups_spec.rb index 63ff1ba8455..7bd7c822a5d 100644 --- a/spec/features/projects/members/manage_groups_spec.rb +++ b/spec/features/projects/members/manage_groups_spec.rb @@ -228,6 +228,6 @@ RSpec.describe 'Project > Members > Manage groups', :js, feature_category: :grou end def invite_group_selector - 'button[data-test-id="invite-group-button"]' + 'button[data-testid="invite-group-button"]' end end diff --git a/spec/features/projects/members/manage_members_spec.rb b/spec/features/projects/members/manage_members_spec.rb index 76b2a73e170..3423c636c2b 100644 --- a/spec/features/projects/members/manage_members_spec.rb +++ b/spec/features/projects/members/manage_members_spec.rb @@ -108,7 +108,10 @@ RSpec.describe 'Projects > Members > Manage members', :js, feature_category: :on let(:current_user) { project_owner } it 'shows Owner in the dropdown' do - expect(page).to have_select('Select a role', options: %w[Guest Reporter Developer Maintainer Owner]) + within_modal do + toggle_listbox + expect_listbox_items(%w[Guest Reporter Developer Maintainer Owner]) + end end end @@ -116,8 +119,10 @@ RSpec.describe 'Projects > Members > Manage members', :js, feature_category: :on let(:current_user) { project_maintainer } it 'does not show the Owner option' do - expect(page).to have_select('Select a role', options: %w[Guest Reporter Developer Maintainer]) - expect(page).not_to have_select('Select a role', options: %w[Owner]) + within_modal do + toggle_listbox + expect_listbox_items(%w[Guest Reporter Developer Maintainer]) + end end end end diff --git a/spec/features/projects/members/member_leaves_project_spec.rb b/spec/features/projects/members/member_leaves_project_spec.rb index e0c64547e9f..43c6ba48906 100644 --- a/spec/features/projects/members/member_leaves_project_spec.rb +++ b/spec/features/projects/members/member_leaves_project_spec.rb @@ -8,16 +8,21 @@ RSpec.describe 'Projects > Members > Member leaves project', feature_category: : let(:user) { create(:user) } let(:project) { create(:project, :repository, :with_namespace_settings) } + let(:more_actions_dropdown) do + find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle') + end before do project.add_developer(user) sign_in(user) end - it 'user leaves project' do + it 'user leaves project', :js do visit project_path(project) + more_actions_dropdown.click click_link 'Leave project' + accept_gl_confirm(button_text: 'Leave project') expect(page).to have_current_path(dashboard_projects_path, ignore_query: true) expect(project.users.exists?(user.id)).to be_falsey diff --git a/spec/features/projects/members/user_requests_access_spec.rb b/spec/features/projects/members/user_requests_access_spec.rb index e7f99a4048c..14df7e7bafe 100644 --- a/spec/features/projects/members/user_requests_access_spec.rb +++ b/spec/features/projects/members/user_requests_access_spec.rb @@ -10,6 +10,9 @@ RSpec.describe 'Projects > Members > User requests access', :js, feature_categor let_it_be(:project) { create(:project, :public, :repository) } let(:owner) { project.first_owner } + let(:more_actions_dropdown) do + find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle') + end before do sign_in(user) @@ -17,39 +20,46 @@ RSpec.describe 'Projects > Members > User requests access', :js, feature_categor visit project_path(project) end - it 'request access feature is disabled' do + it 'request access feature is disabled', :js do project.update!(request_access_enabled: false) visit project_path(project) + more_actions_dropdown.click expect(page).not_to have_content 'Request Access' end - it 'user can request access to a project' do - perform_enqueued_jobs { click_link 'Request Access' } + it 'user can request access to a project', :js do + perform_enqueued_jobs do + more_actions_dropdown.click + click_link 'Request Access' + end expect(ActionMailer::Base.deliveries.map(&:to)).to match_array([[owner.notification_email_or_default], [maintainer.notification_email_or_default]]) expect(ActionMailer::Base.deliveries.last.subject).to eq "Request to join the #{project.full_name} project" expect(project.requesters.exists?(user_id: user)).to be_truthy + more_actions_dropdown.click expect(page).to have_content 'Withdraw Access Request' expect(page).not_to have_content 'Leave Project' end context 'code access is restricted' do - it 'user can request access' do + it 'user can request access', :js do project.project_feature.update!( repository_access_level: ProjectFeature::PRIVATE, builds_access_level: ProjectFeature::PRIVATE, merge_requests_access_level: ProjectFeature::PRIVATE ) visit project_path(project) + more_actions_dropdown.click expect(page).to have_content 'Request Access' end end - it 'user is not listed in the project members page' do + it 'user is not listed in the project members page', :js do + more_actions_dropdown.click click_link 'Request Access' expect(project.requesters.exists?(user_id: user)).to be_truthy @@ -64,13 +74,16 @@ RSpec.describe 'Projects > Members > User requests access', :js, feature_categor end end - it 'user can withdraw its request for access' do + it 'user can withdraw its request for access', :js do + more_actions_dropdown.click click_link 'Request Access' expect(project.requesters.exists?(user_id: user)).to be_truthy + more_actions_dropdown.click accept_gl_confirm { click_link 'Withdraw Access Request' } + more_actions_dropdown.click expect(page).not_to have_content 'Withdraw Access Request' expect(page).to have_content 'Request Access' end diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index a3cbb86da2c..a0df18ea6f3 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe 'New project', :js, feature_category: :groups_and_projects do - include Features::TopNavSpecHelpers - before do stub_application_setting(import_sources: Gitlab::ImportSources.values) end @@ -81,21 +79,13 @@ RSpec.describe 'New project', :js, feature_category: :groups_and_projects do expect(page).to have_content 'Other visibility settings have been disabled by the administrator.' end - context 'with prevent_visibility_restriction feature flag off' do - before do - stub_feature_flags(prevent_visibility_restriction: false) - end + it 'shows a message if all levels are restricted' do + stub_application_setting(restricted_visibility_levels: Gitlab::VisibilityLevel.values) - it 'shows a message if all levels are restricted' do - Gitlab::CurrentSettings.update!( - restricted_visibility_levels: Gitlab::VisibilityLevel.values - ) - - visit new_project_path - click_link 'Create blank project' + visit new_project_path + click_link 'Create blank project' - expect(page).to have_content 'Visibility settings have been disabled by the administrator.' - end + expect(page).to have_content 'Visibility settings have been disabled by the administrator.' end end diff --git a/spec/features/projects/packages_spec.rb b/spec/features/projects/packages_spec.rb index 5073c147b6c..4e222a67b87 100644 --- a/spec/features/projects/packages_spec.rb +++ b/spec/features/projects/packages_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Packages', feature_category: :groups_and_projects do +RSpec.describe 'Packages', feature_category: :package_registry do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/features/projects/pipeline_schedules_spec.rb b/spec/features/projects/pipeline_schedules_spec.rb index 5bcd0d28fd9..d481d90792d 100644 --- a/spec/features/projects/pipeline_schedules_spec.rb +++ b/spec/features/projects/pipeline_schedules_spec.rb @@ -111,7 +111,7 @@ RSpec.describe 'Pipeline Schedules', :js, feature_category: :continuous_integrat page.within('[data-testid="pipeline-schedule-table-row"]') do expect(page).to have_content('pipeline schedule') expect(find('[data-testid="next-run-cell"] time')['title']) - .to include(pipeline_schedule.real_next_run.strftime('%b %-d, %Y')) + .to include(pipeline_schedule.real_next_run.strftime('%B %-d, %Y')) expect(page).to have_link('master') expect(find("[data-testid='last-pipeline-status'] a")['href']).to include(pipeline.id.to_s) end diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 30d3303dfbb..d8bb4893831 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -803,15 +803,73 @@ RSpec.describe 'Pipelines', :js, feature_category: :continuous_integration do end describe 'Empty State' do - let(:project) { create(:project, :repository) } + let_it_be_with_reload(:project) { create(:project, :repository) } before do visit project_pipelines_path(project) + + wait_for_requests end it 'renders empty state' do expect(page).to have_content 'Try test template' end + + it 'does not show Jenkins Migration Prompt' do + expect(page).not_to have_content _('Migrate to GitLab CI/CD from Jenkins') + end + end + + describe 'Jenkins migration prompt' do + let_it_be_with_reload(:project) { create(:project, :repository) } + + before do + allow_next_instance_of(Repository) do |instance| + allow(instance).to receive(:jenkinsfile?).and_return(true) + end + end + + context 'when jenkinsfile is present' do + it 'shows Jenkins Migration Prompt' do + visit project_pipelines_path(project) + + wait_for_requests + + expect(page).to have_content _('Migrate to GitLab CI/CD from Jenkins') + expect(page).to have_content _('Start with a migration plan') + end + end + + context 'when gitlab ci file is present' do + before do + allow_next_instance_of(Repository) do |instance| + allow(instance).to receive(:gitlab_ci_yml).and_return(true) + end + end + + it 'does not show migration prompt' do + expect_not_to_show_prompt(project) + end + end + + context 'when AutoDevops is enabled' do + before do + project.update!(auto_devops_attributes: { enabled: true }) + end + + it 'does not show migration prompt' do + expect_not_to_show_prompt(project) + end + end + + def expect_not_to_show_prompt(project) + visit project_pipelines_path(project) + + wait_for_requests + + expect(page).not_to have_content _('Migrate to GitLab CI/CD from Jenkins') + expect(page).not_to have_content _('Start with a migration plan') + end end end diff --git a/spec/features/projects/settings/branch_names_settings_spec.rb b/spec/features/projects/settings/branch_names_settings_spec.rb index cc7396513cb..1b82e8edb00 100644 --- a/spec/features/projects/settings/branch_names_settings_spec.rb +++ b/spec/features/projects/settings/branch_names_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project settings > repositories > Branch names', :js, feature_category: :groups_and_projects do +RSpec.describe 'Project settings > repositories > Branch names', :js, feature_category: :source_code_management do let_it_be(:project) { create(:project, :public) } let(:user) { create(:user) } diff --git a/spec/features/projects/settings/forked_project_settings_spec.rb b/spec/features/projects/settings/forked_project_settings_spec.rb index c2a5b36a81b..e8e22247f04 100644 --- a/spec/features/projects/settings/forked_project_settings_spec.rb +++ b/spec/features/projects/settings/forked_project_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > For a forked project', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Settings > For a forked project', :js, feature_category: :source_code_management do include ProjectForksHelper let(:user) { create(:user) } let(:original_project) { create(:project) } diff --git a/spec/features/projects/settings/merge_requests_settings_spec.rb b/spec/features/projects/settings/merge_requests_settings_spec.rb index 8b5f9b67890..c1b4caae014 100644 --- a/spec/features/projects/settings/merge_requests_settings_spec.rb +++ b/spec/features/projects/settings/merge_requests_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Merge requests', feature_category: :groups_and_projects do +RSpec.describe 'Projects > Settings > Merge requests', feature_category: :code_review_workflow do include ProjectForksHelper let(:user) { create(:user) } diff --git a/spec/features/projects/settings/monitor_settings_spec.rb b/spec/features/projects/settings/monitor_settings_spec.rb index fca10d9c0b0..4baa169238b 100644 --- a/spec/features/projects/settings/monitor_settings_spec.rb +++ b/spec/features/projects/settings/monitor_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > For a forked project', :js, feature_category: :groups_and_projects do +RSpec.describe 'Projects > Settings > For a forked project', :js, feature_category: :incident_management do include ListboxHelpers let_it_be(:user) { create(:user) } diff --git a/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb b/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb index 1b53a6222e6..96ccc061491 100644 --- a/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb +++ b/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe 'Project > Settings > Packages and registries > Container registry tag expiration policy', - feature_category: :groups_and_projects do + feature_category: :container_registry do let_it_be(:user) { create(:user) } let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) } diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb index 838ac67ee3d..8576518666c 100644 --- a/spec/features/projects/settings/repository_settings_spec.rb +++ b/spec/features/projects/settings/repository_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Repository settings', feature_category: :groups_and_projects do +RSpec.describe 'Projects > Settings > Repository settings', feature_category: :source_code_management do include Features::MirroringHelpers let(:project) { create(:project_empty_repo) } diff --git a/spec/features/projects/settings/secure_files_spec.rb b/spec/features/projects/settings/secure_files_spec.rb index 5f94e215a5f..c456e760709 100644 --- a/spec/features/projects/settings/secure_files_spec.rb +++ b/spec/features/projects/settings/secure_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Secure Files', :js, feature_category: :groups_and_projects do +RSpec.describe 'Secure Files', :js, feature_category: :source_code_management do let(:project) { create(:project) } let(:user) { create(:user) } diff --git a/spec/features/projects/settings/service_desk_setting_spec.rb b/spec/features/projects/settings/service_desk_setting_spec.rb index 2cd4d793f9c..540c4691465 100644 --- a/spec/features/projects/settings/service_desk_setting_spec.rb +++ b/spec/features/projects/settings/service_desk_setting_spec.rb @@ -102,12 +102,6 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c end end - it 'pushes service_desk_custom_email feature flag to frontend' do - visit edit_project_path(project) - - expect(page).to have_pushed_frontend_feature_flags(serviceDeskCustomEmail: true) - end - it 'pushes issue_email_participants feature flag to frontend' do visit edit_project_path(project) diff --git a/spec/features/projects/settings/user_changes_default_branch_spec.rb b/spec/features/projects/settings/user_changes_default_branch_spec.rb index 5886699a192..a448daf0e7a 100644 --- a/spec/features/projects/settings/user_changes_default_branch_spec.rb +++ b/spec/features/projects/settings/user_changes_default_branch_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User changes default branch', feature_category: :groups_and_projects do +RSpec.describe 'Projects > Settings > User changes default branch', feature_category: :source_code_management do include ListboxHelpers let(:user) { create(:user) } diff --git a/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb b/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb index 4e8f42ae792..9305467cbe4 100644 --- a/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb +++ b/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "User interacts with deploy keys", :js, feature_category: :groups_and_projects do +RSpec.describe "User interacts with deploy keys", :js, feature_category: :continuous_delivery do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } diff --git a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb index 1189f5590f8..6fe8a2c3f10 100644 --- a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb +++ b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe 'Projects > Settings > User manages merge request settings', feature_category: :groups_and_projects do +RSpec.describe 'Projects > Settings > User manages merge request settings', feature_category: :code_review_workflow do include ProjectForksHelper let(:user) { create(:user) } diff --git a/spec/features/projects/settings/webhooks_settings_spec.rb b/spec/features/projects/settings/webhooks_settings_spec.rb index af7c790c692..506f7666286 100644 --- a/spec/features/projects/settings/webhooks_settings_spec.rb +++ b/spec/features/projects/settings/webhooks_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :groups_and_projects do +RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :webhooks do let(:project) { create(:project) } let(:user) { create(:user) } let(:webhooks_path) { project_hooks_path(project) } diff --git a/spec/features/projects/show/download_buttons_spec.rb b/spec/features/projects/show/download_buttons_spec.rb index 8e27b4b2ede..2616d474991 100644 --- a/spec/features/projects/show/download_buttons_spec.rb +++ b/spec/features/projects/show/download_buttons_spec.rb @@ -36,23 +36,5 @@ RSpec.describe 'Projects > Show > Download buttons', feature_category: :groups_a describe 'when checking project main page' do it_behaves_like 'archive download buttons' - - context 'with artifacts' do - before do - visit project_path(project) - end - - it 'shows download artifacts button' do - href = latest_succeeded_project_artifacts_path(project, "#{project.default_branch}/download", job: 'build') - - expect(page).to have_link build.name, href: href - end - - it 'download links have download attribute' do - page.all('a', text: 'Download').each do |link| - expect(link[:download]).to eq '' - end - end - end end end diff --git a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb index 98714da34f2..52438340312 100644 --- a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb +++ b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe 'Project > Show > User interacts with auto devops implicitly enabled banner', - feature_category: :groups_and_projects do + feature_category: :auto_devops do let(:project) { create(:project, :repository) } let(:user) { create(:user) } diff --git a/spec/features/projects/show/user_sees_git_instructions_spec.rb b/spec/features/projects/show/user_sees_git_instructions_spec.rb index 5e6857843a6..4933b3f239c 100644 --- a/spec/features/projects/show/user_sees_git_instructions_spec.rb +++ b/spec/features/projects/show/user_sees_git_instructions_spec.rb @@ -10,6 +10,7 @@ RSpec.describe 'Projects > Show > User sees Git instructions', feature_category: # validation failure on NotificationSetting. # See https://gitlab.com/gitlab-org/gitlab/-/issues/299822#note_492817174 user.notification_settings.reset + stub_feature_flags(project_overview_reorg: false) end shared_examples_for 'redirects to the sign in page' do diff --git a/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb b/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb index 41eab966895..674c7db83f1 100644 --- a/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb +++ b/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb @@ -17,8 +17,8 @@ RSpec.describe 'Projects > Show > User sees setup shortcut buttons', feature_cat describe 'as a normal user' do before do + stub_feature_flags(project_overview_reorg: false) sign_in(user) - visit project_path(project) end @@ -40,6 +40,7 @@ RSpec.describe 'Projects > Show > User sees setup shortcut buttons', feature_cat describe 'as a maintainer' do before do + stub_feature_flags(project_overview_reorg: false) project.add_maintainer(user) sign_in(user) diff --git a/spec/features/projects/tags/download_buttons_spec.rb b/spec/features/projects/tags/download_buttons_spec.rb index 275d364f267..f025ffba85a 100644 --- a/spec/features/projects/tags/download_buttons_spec.rb +++ b/spec/features/projects/tags/download_buttons_spec.rb @@ -38,17 +38,5 @@ RSpec.describe 'Download buttons in tags page', feature_category: :source_code_m let(:path_to_visit) { project_tags_path(project) } let(:ref) { tag } end - - context 'with artifacts' do - before do - visit project_tags_path(project) - end - - it 'shows download artifacts button' do - href = latest_succeeded_project_artifacts_path(project, "#{tag}/download", job: 'build') - - expect(page).to have_link build.name, href: href - end - end end end diff --git a/spec/features/projects/tags/user_views_tags_spec.rb b/spec/features/projects/tags/user_views_tags_spec.rb index 26f2e81e3df..28a9ced69e6 100644 --- a/spec/features/projects/tags/user_views_tags_spec.rb +++ b/spec/features/projects/tags/user_views_tags_spec.rb @@ -38,6 +38,9 @@ RSpec.describe 'User views tags', :feature, feature_category: :source_code_manag it_behaves_like "it has an RSS button with current_user's feed token" it_behaves_like "an autodiscoverable RSS feed with current_user's feed token" it_behaves_like 'has access to the tags RSS feed' + it 'passes axe automated accessibility testing', :js do + expect(page).to be_axe_clean.within('#content-body') + end end context 'when user signed out' do diff --git a/spec/features/projects/terraform_spec.rb b/spec/features/projects/terraform_spec.rb index 518fa79f003..aefc7be7ced 100644 --- a/spec/features/projects/terraform_spec.rb +++ b/spec/features/projects/terraform_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Terraform', :js, feature_category: :groups_and_projects do +RSpec.describe 'Terraform', :js, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:terraform_state) { create(:terraform_state, :locked, :with_version, project: project) } diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb index 484808dcfd1..a590d637801 100644 --- a/spec/features/projects/user_creates_project_spec.rb +++ b/spec/features/projects/user_creates_project_spec.rb @@ -55,6 +55,45 @@ RSpec.describe 'User creates a project', :js, feature_category: :groups_and_proj expect(page).to have_content('README.md Initial commit') end + context 'when creating a project with SHA256 repository' do + let(:sha256_field) { 'Use SHA-256 as the repository hashing algorithm' } + + it 'creates a new project' do + visit(new_project_path) + + click_link 'Create blank project' + fill_in(:project_name, with: 'With initial commits') + + expect(page).to have_checked_field 'Initialize repository with a README' + expect(page).to have_unchecked_field sha256_field + + check sha256_field + + page.within('#content-body') do + click_button('Create project') + end + + project = Project.last + + expect(page).to have_current_path(project_path(project), ignore_query: true) + expect(page).to have_content('With initial commits') + end + + context 'when "support_sha256_repositories" feature flag is disabled' do + before do + stub_feature_flags(support_sha256_repositories: false) + end + + it 'does not display a SHA256 option' do + visit(new_project_path) + + click_link 'Create blank project' + + expect(page).not_to have_content(sha256_field) + end + end + end + context 'in a subgroup they do not own' do let(:parent) { create(:group) } let!(:subgroup) { create(:group, parent: parent) } diff --git a/spec/features/projects/user_sees_sidebar_spec.rb b/spec/features/projects/user_sees_sidebar_spec.rb index 61225b45760..88c16ab4c9f 100644 --- a/spec/features/projects/user_sees_sidebar_spec.rb +++ b/spec/features/projects/user_sees_sidebar_spec.rb @@ -207,7 +207,7 @@ RSpec.describe 'Projects > User sees sidebar', :js, feature_category: :groups_an visit project_path(project) within('.project-repo-buttons') do - expect(page).not_to have_selector '.project-clone-holder' + expect(page).not_to have_selector '.project-code-holder' end end diff --git a/spec/features/projects/work_items/work_item_children_spec.rb b/spec/features/projects/work_items/work_item_children_spec.rb index 0970752157d..28f7ee2db10 100644 --- a/spec/features/projects/work_items/work_item_children_spec.rb +++ b/spec/features/projects/work_items/work_item_children_spec.rb @@ -23,7 +23,7 @@ RSpec.describe 'Work item children', :js, feature_category: :team_planning do it 'are not displayed when issue does not have work item children', :aggregate_failures do page.within('[data-testid="work-item-links"]') do - expect(find('[data-testid="links-empty"]')).to have_content(_('No tasks are currently assigned.')) + expect(find('[data-testid="links-empty"]')).to have_content(_('No child items are currently assigned.')) expect(page).not_to have_selector('[data-testid="add-links-form"]') expect(page).not_to have_selector('[data-testid="links-child"]') end diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb index c6966e47f0a..1fb1e21ac67 100644 --- a/spec/features/projects_spec.rb +++ b/spec/features/projects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project', feature_category: :groups_and_projects do +RSpec.describe 'Project', feature_category: :source_code_management do include ProjectForksHelper include MobileHelpers @@ -12,6 +12,7 @@ RSpec.describe 'Project', feature_category: :groups_and_projects do before do sign_in user visit new_project_path + stub_feature_flags(project_overview_reorg: false) end shared_examples 'creates from template' do |template, sub_template_tab = nil| @@ -99,6 +100,7 @@ RSpec.describe 'Project', feature_category: :groups_and_projects do before do sign_in(project.first_owner) + stub_feature_flags(project_overview_reorg: false) end it 'parses Markdown' do @@ -164,6 +166,7 @@ RSpec.describe 'Project', feature_category: :groups_and_projects do before do sign_in(project.first_owner) visit path + stub_feature_flags(project_overview_reorg: false) end it 'shows project topics' do @@ -195,6 +198,7 @@ RSpec.describe 'Project', feature_category: :groups_and_projects do before do sign_in(project.first_owner) visit path + stub_feature_flags(project_overview_reorg: false) end context 'desktop component' do @@ -427,6 +431,10 @@ RSpec.describe 'Project', feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { create(:user) } + before do + stub_feature_flags(project_overview_reorg: false) + end + it 'does not contain default branch information in its content', :js do default_branch = 'merge-commit-analyze-side-branch' diff --git a/spec/features/registrations/oauth_registration_spec.rb b/spec/features/registrations/oauth_registration_spec.rb index 98300cbeaaa..eb21d285bd0 100644 --- a/spec/features/registrations/oauth_registration_spec.rb +++ b/spec/features/registrations/oauth_registration_spec.rb @@ -105,12 +105,12 @@ RSpec.describe 'OAuth Registration', :js, :allow_forgery_protection, feature_cat mock_auth_hash(provider, uid, invite_email, additional_info: additional_info) end - it 'redirects to the activity page with all the projects/groups invitations accepted' do + it 'redirects to the group page with all the projects/groups invitations accepted' do visit invite_path(group_invite.raw_invite_token, extra_params) click_link_or_button "oauth-login-#{provider}" expect(page).to have_content('You have been granted Owner access to group Owned.') - expect(page).to have_current_path(activity_group_path(group), ignore_query: true) + expect(page).to have_current_path(group_path(group), ignore_query: true) end end end diff --git a/spec/features/registrations/registration_spec.rb b/spec/features/registrations/registration_spec.rb index 7a409b3934e..b408ef268f2 100644 --- a/spec/features/registrations/registration_spec.rb +++ b/spec/features/registrations/registration_spec.rb @@ -3,11 +3,11 @@ require 'spec_helper' RSpec.describe 'Registrations', feature_category: :system_access do - context 'when the user visits the registration page when already signed in', :clean_gitlab_redis_sessions do - let_it_be(:current_user) { create(:user) } + let_it_be(:user) { create(:user) } + context 'when the user visits the registration page when already signed in', :clean_gitlab_redis_sessions do before do - sign_in(current_user) + sign_in(user) end it 'does not show an "You are already signed in" error message' do @@ -18,4 +18,27 @@ RSpec.describe 'Registrations', feature_category: :system_access do expect(page).not_to have_content(I18n.t('devise.failure.already_authenticated')) end end + + context 'when the user registers having an invitation', :js do + let(:group) { create(:group, :private) } + let(:new_user) { build(:user) } + + before do + stub_application_setting_enum('email_confirmation_setting', 'soft') + stub_application_setting(require_admin_approval_after_user_signup: false) + end + + it 'becomes a member after confirmation' do + create(:group_member, :invited, :developer, source: group, invite_email: new_user.email) + + visit new_user_registration_path + fill_in_sign_up_form(new_user) + + confirm_email(new_user) + visit polymorphic_path(group) + + expect(page).to have_content(group.name) + expect(page).not_to have_content('Page Not Found') + end + end end diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb index 091c318459b..e7047610180 100644 --- a/spec/features/runners_spec.rb +++ b/spec/features/runners_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Runners', feature_category: :runner_fleet do +RSpec.describe 'Runners', feature_category: :fleet_visibility do let_it_be(:user) { create(:user) } before do diff --git a/spec/features/search/user_searches_for_code_spec.rb b/spec/features/search/user_searches_for_code_spec.rb index 976324a5032..9329b1f2a5e 100644 --- a/spec/features/search/user_searches_for_code_spec.rb +++ b/spec/features/search/user_searches_for_code_spec.rb @@ -40,7 +40,7 @@ RSpec.describe 'User searches for code', :js, :disable_rate_limiter, feature_cat wait_for_requests page.within('[data-testid="project-filter"]') do - click_on(project.name) + select_listbox_item(project.name) end end @@ -53,8 +53,8 @@ RSpec.describe 'User searches for code', :js, :disable_rate_limiter, feature_cat let(:expected_result) { 'Update capybara, rspec-rails, poltergeist to recent versions' } before do - fill_in('dashboard_search', with: 'rspec') - find('.gl-search-box-by-click-search-button').click + submit_dashboard_search('rspec') + select_search_scope('Code') end it 'finds code and links to blob' do @@ -81,8 +81,8 @@ RSpec.describe 'User searches for code', :js, :disable_rate_limiter, feature_cat search = 'for naming files' ref_selector = 'v1.0.0' - fill_in('dashboard_search', with: search) - find('.gl-search-box-by-click-search-button').click + submit_dashboard_search(search) + select_search_scope('Code') expect(page).to have_selector('.results', text: expected_result) @@ -99,51 +99,6 @@ RSpec.describe 'User searches for code', :js, :disable_rate_limiter, feature_cat end end - context 'when header search' do - context 'search code within refs' do - let(:ref_name) { 'v1.0.0' } - - before do - visit(project_tree_path(project, ref_name)) - - submit_search('gitlab-grack') - select_search_scope('Code') - end - - it 'shows ref switcher in code result summary' do - expect(find('.ref-selector')).to have_text(ref_name) - end - - it 'persists branch name across search' do - find('.gl-search-box-by-click-search-button').click - expect(find('.ref-selector')).to have_text(ref_name) - end - - # this example is use to test the design that the refs is not - # only represent the branch as well as the tags. - it 'ref switcher list all the branches and tags' do - find('.ref-selector').click - wait_for_requests - - page.within('.ref-selector') do - expect(page).to have_selector('li', text: 'add-ipython-files') - expect(page).to have_selector('li', text: 'v1.0.0') - end - end - - it 'search result changes when refs switched' do - expect(find('.results')).not_to have_content('path = gitlab-grack') - - find('.ref-selector').click - wait_for_requests - - select_listbox_item('add-ipython-files') - - expect(page).to have_selector('.results', text: 'path = gitlab-grack') - end - end - end - it 'no ref switcher shown in issue result summary' do issue = create(:issue, title: 'test', project: project) visit(project_tree_path(project)) diff --git a/spec/features/search/user_searches_for_issues_spec.rb b/spec/features/search/user_searches_for_issues_spec.rb index 9451e337db1..caddf8b698e 100644 --- a/spec/features/search/user_searches_for_issues_spec.rb +++ b/spec/features/search/user_searches_for_issues_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe 'User searches for issues', :js, :clean_gitlab_redis_rate_limiting, feature_category: :global_search do + include ListboxHelpers let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, namespace: user.namespace) } @@ -10,8 +11,7 @@ RSpec.describe 'User searches for issues', :js, :clean_gitlab_redis_rate_limitin let!(:issue2) { create(:issue, :closed, :confidential, title: 'issue Bar', project: project) } def search_for_issue(search) - fill_in('dashboard_search', with: search) - find('.gl-search-box-by-click-search-button').click + submit_dashboard_search(search) select_search_scope('Issues') end @@ -92,7 +92,7 @@ RSpec.describe 'User searches for issues', :js, :clean_gitlab_redis_rate_limitin wait_for_requests page.within('[data-testid="project-filter"]') do - click_on(project.name) + select_listbox_item project.name end search_for_issue(issue1.title) 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 d7b52d9e07a..7819e036f21 100644 --- a/spec/features/search/user_searches_for_merge_requests_spec.rb +++ b/spec/features/search/user_searches_for_merge_requests_spec.rb @@ -3,14 +3,14 @@ require 'spec_helper' RSpec.describe 'User searches for merge requests', :js, :clean_gitlab_redis_rate_limiting, feature_category: :global_search do + include ListboxHelpers 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) } def search_for_mr(search) - fill_in('dashboard_search', with: search) - find('.gl-search-box-by-click-search-button').click + submit_dashboard_search(search) select_search_scope('Merge requests') end @@ -60,7 +60,7 @@ RSpec.describe 'User searches for merge requests', :js, :clean_gitlab_redis_rate wait_for_requests page.within('[data-testid="project-filter"]') do - click_on(project.name) + select_listbox_item project.name end search_for_mr(merge_request1.title) diff --git a/spec/features/search/user_searches_for_milestones_spec.rb b/spec/features/search/user_searches_for_milestones_spec.rb index 7ca7958f61b..334fe6f0170 100644 --- a/spec/features/search/user_searches_for_milestones_spec.rb +++ b/spec/features/search/user_searches_for_milestones_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe 'User searches for milestones', :js, :clean_gitlab_redis_rate_limiting, feature_category: :global_search do + include ListboxHelpers 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) } @@ -20,8 +21,7 @@ RSpec.describe 'User searches for milestones', :js, :clean_gitlab_redis_rate_lim include_examples 'search timeouts', 'milestones' it 'finds a milestone' do - fill_in('dashboard_search', with: milestone1.title) - find('.gl-search-box-by-click-search-button').click + submit_dashboard_search(milestone1.title) select_search_scope('Milestones') page.within('.results') do @@ -37,11 +37,10 @@ RSpec.describe 'User searches for milestones', :js, :clean_gitlab_redis_rate_lim wait_for_requests page.within('[data-testid="project-filter"]') do - click_on(project.name) + select_listbox_item project.name end - fill_in('dashboard_search', with: milestone1.title) - find('.gl-search-box-by-click-search-button').click + submit_dashboard_search(milestone1.title) select_search_scope('Milestones') page.within('.results') do diff --git a/spec/features/search/user_searches_for_projects_spec.rb b/spec/features/search/user_searches_for_projects_spec.rb index 48a94161927..ee5a3ec9806 100644 --- a/spec/features/search/user_searches_for_projects_spec.rb +++ b/spec/features/search/user_searches_for_projects_spec.rb @@ -16,9 +16,7 @@ RSpec.describe 'User searches for projects', :js, :disable_rate_limiter, feature it 'finds a project' do visit(search_path) - - fill_in('dashboard_search', with: project.name[0..3]) - click_button('Search') + submit_dashboard_search(project.name[0..3]) expect(page).to have_link(project.name) end @@ -26,7 +24,7 @@ RSpec.describe 'User searches for projects', :js, :disable_rate_limiter, feature it 'preserves the group being searched in' do visit(search_path(group_id: project.namespace.id)) - submit_search('foo') + submit_dashboard_search('foo') expect(find('#group_id', visible: false).value).to eq(project.namespace.id.to_s) end @@ -34,7 +32,7 @@ RSpec.describe 'User searches for projects', :js, :disable_rate_limiter, feature it 'preserves the project being searched in' do visit(search_path(project_id: project.id)) - submit_search('foo') + submit_dashboard_search('foo') expect(find('#project_id', visible: false).value).to eq(project.id.to_s) end 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 65f262075f9..4de28a99c21 100644 --- a/spec/features/search/user_searches_for_wiki_pages_spec.rb +++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe 'User searches for wiki pages', :js, :clean_gitlab_redis_rate_limiting, feature_category: :global_search do + include ListboxHelpers let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) } let_it_be(:wiki_page) do @@ -29,11 +30,10 @@ RSpec.describe 'User searches for wiki pages', :js, :clean_gitlab_redis_rate_lim wait_for_requests page.within('[data-testid="project-filter"]') do - click_on(project.name) + select_listbox_item project.name end - fill_in('dashboard_search', with: search_term) - find('.gl-search-box-by-click-search-button').click + submit_dashboard_search(search_term) select_search_scope('Wiki') page.within('.results') do diff --git a/spec/features/search/user_uses_header_search_field_spec.rb b/spec/features/search/user_uses_header_search_field_spec.rb index 1ab47f6fd59..e36b04636ce 100644 --- a/spec/features/search/user_uses_header_search_field_spec.rb +++ b/spec/features/search/user_uses_header_search_field_spec.rb @@ -83,7 +83,7 @@ RSpec.describe 'User uses header search field', :js, :disable_rate_limiter, feat end end - context 'when clicking merge requests', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332317' do + context 'when clicking merge requests' do let!(:merge_request) { create(:merge_request, source_project: project, author: user, assignees: [user]) } it 'shows assigned merge requests' do diff --git a/spec/features/search/user_uses_search_filters_spec.rb b/spec/features/search/user_uses_search_filters_spec.rb index 5e553cb0869..b95421fab59 100644 --- a/spec/features/search/user_uses_search_filters_spec.rb +++ b/spec/features/search/user_uses_search_filters_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe 'User uses search filters', :js, feature_category: :global_search do + include ListboxHelpers let(:group) { create(:group) } let!(:group_project) { create(:project, group: group) } let(:project) { create(:project, namespace: user.namespace) } @@ -23,7 +24,7 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search wait_for_requests page.within('[data-testid="group-filter"]') do - click_on(group.name) + select_listbox_item group.name end expect(find('[data-testid="group-filter"]')).to have_content(group.name) @@ -33,7 +34,7 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search wait_for_requests page.within('[data-testid="project-filter"]') do - click_on(group_project.name) + select_listbox_item group_project.name end expect(find('[data-testid="project-filter"]')).to have_content(group_project.name) @@ -46,12 +47,17 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search describe 'clear filter button' do it 'removes Group and Project filters' do - find('[data-testid="group-filter"] [data-testid="clear-icon"]').click + page.within '[data-testid="group-filter"]' do + toggle_listbox + wait_for_requests - wait_for_requests + find('[data-testid="listbox-reset-button"]').click - expect(page).to have_current_path(search_path, ignore_query: true) do |uri| - uri.normalized_query(:sorted) == "scope=blobs&search=test" + wait_for_requests + + expect(page).to have_current_path(search_path, ignore_query: true) do |uri| + uri.normalized_query(:sorted) == "scope=blobs&search=test" + end end end end @@ -67,7 +73,7 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search wait_for_requests page.within('[data-testid="project-filter"]') do - click_on(project.name) + select_listbox_item project.name end expect(find('[data-testid="project-filter"]')).to have_content(project.name) @@ -82,11 +88,17 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search describe 'clear filter button' do it 'removes Project filters' do - find('[data-testid="project-filter"] [data-testid="clear-icon"]').click - wait_for_requests + page.within '[data-testid="project-filter"]' do + toggle_listbox + wait_for_requests + + find('[data-testid="listbox-reset-button"]').click + + wait_for_requests - expect(page).to have_current_path(search_path, ignore_query: true) do |uri| - uri.normalized_query(:sorted) == "scope=blobs&search=test" + expect(page).to have_current_path(search_path, ignore_query: true) do |uri| + uri.normalized_query(:sorted) == "scope=blobs&search=test" + end end end end diff --git a/spec/features/uploads/user_uploads_avatar_to_group_spec.rb b/spec/features/uploads/user_uploads_avatar_to_group_spec.rb index 2872446ed6b..b8fb509c887 100644 --- a/spec/features/uploads/user_uploads_avatar_to_group_spec.rb +++ b/spec/features/uploads/user_uploads_avatar_to_group_spec.rb @@ -22,7 +22,7 @@ RSpec.describe 'User uploads avatar to group', feature_category: :user_profile d visit group_path(group) - expect(page).to have_selector(%(img[data-src$="/uploads/-/system/group/avatar/#{group.id}/dk.png"])) + expect(page).to have_selector(%(img[src$="/uploads/-/system/group/avatar/#{group.id}/dk.png?width=16"])) # Cheating here to verify something that isn't user-facing, but is important expect(group.reload.avatar.file).to exist diff --git a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb index 83eb7cb989e..5d121d9eeba 100644 --- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb +++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb @@ -18,8 +18,10 @@ RSpec.describe 'User uploads avatar to profile', feature_category: :user_profile wait_for_all_requests - data_uri = find('.avatar-image .gl-avatar')['src'] - within_testid('user-dropdown') { expect(find('.gl-avatar')['src']).to eq data_uri } + within_testid('user-dropdown') do + # We are setting a blob URL + expect(find('.gl-avatar')['src']).to start_with 'blob:' + end visit profile_path diff --git a/spec/features/user_sees_active_nav_items_spec.rb b/spec/features/user_sees_active_nav_items_spec.rb index 966b8491374..1e6b2b8f189 100644 --- a/spec/features/user_sees_active_nav_items_spec.rb +++ b/spec/features/user_sees_active_nav_items_spec.rb @@ -32,7 +32,7 @@ RSpec.describe 'User sees correct active nav items in the super sidebar', :js, f context 'when visiting authentication logs' do before do - visit audit_log_profile_path + visit user_settings_authentication_log_path end it 'renders the side navigation with the correct submenu set as active' do diff --git a/spec/features/profiles/active_sessions_spec.rb b/spec/features/user_settings/active_sessions_spec.rb index 2e800ae88b6..5d1d4bc6490 100644 --- a/spec/features/profiles/active_sessions_spec.rb +++ b/spec/features/user_settings/active_sessions_spec.rb @@ -55,7 +55,7 @@ RSpec.describe 'Profile > Active Sessions', :clean_gitlab_redis_shared_state, fe end using_session :session1 do - visit profile_active_sessions_path + visit user_settings_active_sessions_path expect(page).to(have_selector('ul.list-group li.list-group-item', text: 'Signed in on', count: 2)) @@ -93,7 +93,7 @@ RSpec.describe 'Profile > Active Sessions', :clean_gitlab_redis_shared_state, fe using_session :session1 do gitlab_sign_in(user) - visit profile_active_sessions_path + visit user_settings_active_sessions_path expect(page).to have_link('Revoke', count: 1) @@ -105,7 +105,7 @@ RSpec.describe 'Profile > Active Sessions', :clean_gitlab_redis_shared_state, fe end using_session :session2 do - visit profile_active_sessions_path + visit user_settings_active_sessions_path expect(page).to have_content('You need to sign in or sign up before continuing.') end diff --git a/spec/features/profiles/password_spec.rb b/spec/features/user_settings/password_spec.rb index 05e492e7021..76e3f85e021 100644 --- a/spec/features/profiles/password_spec.rb +++ b/spec/features/user_settings/password_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Profile > Password', feature_category: :user_profile do +RSpec.describe 'User Settings > Password', feature_category: :user_profile do let(:user) { create(:user) } def fill_passwords(password, confirmation) @@ -12,16 +12,16 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do click_button 'Save password' end - context 'Password authentication enabled' do + context 'when password authentication enabled' do let(:new_password) { User.random_password } let(:user) { create(:user, password_automatically_set: true) } before do sign_in(user) - visit edit_profile_password_path + visit edit_user_settings_password_path end - context 'User with password automatically set' do + context 'when User with password automatically set' do describe 'User puts different passwords in the field and in the confirmation' do it 'shows an error message' do fill_passwords(new_password, "#{new_password}2") @@ -42,7 +42,7 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do it 'shows a success message' do fill_passwords(new_password, new_password) - page.within('[data-testid="alert-info"]') do + within_testid('alert-info') do expect(page).to have_content('Password was successfully updated. Please sign in again.') end end @@ -50,8 +50,8 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do end end - context 'Password authentication unavailable' do - context 'Regular user' do + context 'when password authentication unavailable' do + context 'with Regular user' do before do gitlab_sign_in(user) end @@ -62,13 +62,13 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do stub_application_setting(password_authentication_enabled_for_web: false) stub_application_setting(password_authentication_enabled_for_git: false) - visit edit_profile_password_path + visit edit_user_settings_password_path expect(page).to have_gitlab_http_status(:not_found) end end - context 'LDAP user' do + context 'with LDAP user' do include LdapHelpers let(:ldap_settings) { { enabled: true } } @@ -87,7 +87,7 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do end it 'renders 404', :js do - visit edit_profile_password_path + visit edit_user_settings_password_path expect(page).to have_title('Not Found') expect(page).to have_content('Page Not Found') @@ -95,12 +95,12 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do end end - context 'Change password' do + context 'when changing password' do let(:new_password) { User.random_password } before do sign_in(user) - visit(edit_profile_password_path) + visit(edit_user_settings_password_path) end shared_examples 'user enters an incorrect current password' do @@ -113,7 +113,8 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do it 'handles the invalid password attempt, and prompts the user to try again', :aggregate_failures do expect(Gitlab::AppLogger).to receive(:info) - .with(message: 'Invalid current password when attempting to update user password', username: user.username, ip: user.current_sign_in_ip) + .with(message: 'Invalid current password when attempting to update user password', username: user.username, + ip: user.current_sign_in_ip) subject @@ -121,7 +122,7 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do expect(user.failed_attempts).to eq(1) expect(user.valid_password?(new_password)).to eq(false) - expect(page).to have_current_path(edit_profile_password_path, ignore_query: true) + expect(page).to have_current_path(edit_user_settings_password_path, ignore_query: true) page.within '.flash-container' do expect(page).to have_content('You must provide a valid current password') @@ -174,7 +175,7 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do expect_snowplow_event( category: 'Gitlab::Tracking::Helpers::WeakPasswordErrorEvent', action: 'track_weak_password_error', - controller: 'Profiles::PasswordsController', + controller: 'UserSettings::PasswordsController', method: 'update' ) end @@ -207,13 +208,12 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do user.update!(password_expires_at: 1.hour.ago) user.identities.delete - expect(user.ldap_user?).to eq false end it 'needs change user password' do - visit edit_profile_password_path + visit edit_user_settings_password_path - expect(page).to have_current_path new_profile_password_path, ignore_query: true + expect(page).to have_current_path new_user_settings_password_path, ignore_query: true fill_in :user_password, with: user.password fill_in :user_new_password, with: new_password @@ -224,9 +224,9 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do end it 'tracks weak password error' do - visit edit_profile_password_path + visit edit_user_settings_password_path - expect(page).to have_current_path new_profile_password_path, ignore_query: true + expect(page).to have_current_path new_user_settings_password_path, ignore_query: true fill_in :user_password, with: user.password fill_in :user_new_password, with: "password" @@ -235,7 +235,7 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do expect_snowplow_event( category: 'Gitlab::Tracking::Helpers::WeakPasswordErrorEvent', action: 'track_weak_password_error', - controller: 'Profiles::PasswordsController', + controller: 'UserSettings::PasswordsController', method: 'create' ) end @@ -246,7 +246,7 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do visit profile_path - expect(page).to have_current_path new_profile_password_path, ignore_query: true + expect(page).to have_current_path new_user_settings_password_path, ignore_query: true end end end diff --git a/spec/features/profiles/personal_access_tokens_spec.rb b/spec/features/user_settings/personal_access_tokens_spec.rb index 094855393be..55f1edfd26a 100644 --- a/spec/features/profiles/personal_access_tokens_spec.rb +++ b/spec/features/user_settings/personal_access_tokens_spec.rb @@ -2,12 +2,15 @@ require 'spec_helper' -RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_profile do +RSpec.describe 'User Settings > Personal Access Tokens', :js, feature_category: :system_access do include Spec::Support::Helpers::ModalHelpers include Features::AccessTokenHelpers let(:user) { create(:user) } - let(:pat_create_service) { double('PersonalAccessTokens::CreateService', execute: ServiceResponse.error(message: 'error', payload: { personal_access_token: PersonalAccessToken.new })) } + let(:pat_create_service) do + instance_double('PersonalAccessTokens::CreateService', + execute: ServiceResponse.error(message: 'error', payload: { personal_access_token: PersonalAccessToken.new })) + end before do sign_in(user) @@ -17,7 +20,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ it "allows creation of a personal access token" do name = 'My PAT' - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path click_button 'Add new token' fill_in "Token name", with: name @@ -44,7 +47,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ context "when creation fails" do it "displays an error message" do number_tokens_before = PersonalAccessToken.count - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path click_button 'Add new token' fill_in "Token name", with: 'My PAT' @@ -64,7 +67,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ let!(:personal_access_token) { create(:personal_access_token, user: user) } it 'only shows personal access tokens' do - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path expect(active_access_tokens).to have_text(personal_access_token.name) expect(active_access_tokens).not_to have_text(impersonation_token.name) @@ -76,7 +79,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ end it 'shows absolute times for expires_at' do - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path expect(active_access_tokens).to have_text(PersonalAccessToken.last.expires_at.strftime('%b %-d')) end @@ -87,7 +90,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ let!(:personal_access_token) { create(:personal_access_token, user: user) } it "allows revocation of an active token" do - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path accept_gl_confirm(button_text: 'Revoke') { click_on "Revoke" } expect(active_access_tokens).to have_text("This user has no active personal access tokens.") @@ -95,7 +98,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ it "removes expired tokens from 'active' section" do personal_access_token.update!(expires_at: 5.days.ago) - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path expect(active_access_tokens).to have_text("This user has no active personal access tokens.") end @@ -105,7 +108,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ allow_next_instance_of(PersonalAccessTokens::RevokeService) do |instance| allow(instance).to receive(:revocation_permitted?).and_return(false) end - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path accept_gl_confirm(button_text: "Revoke") { click_on "Revoke" } expect(active_access_tokens).to have_text(personal_access_token.name) @@ -115,15 +118,16 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ describe "feed token" do def feed_token_description - "Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs." + "Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar\ + application loads a personalized calendar. It is visible in those feed URLs." end context "when enabled" do it "displays feed token" do allow(Gitlab::CurrentSettings).to receive(:disable_feed_token).and_return(false) - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path - within('[data-testid="feed-token-container"]') do + within_testid('feed-token-container') do click_button('Click to reveal') expect(page).to have_field('Feed token', with: user.feed_token) @@ -135,7 +139,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ context "when disabled" do it "does not display feed token" do allow(Gitlab::CurrentSettings).to receive(:disable_feed_token).and_return(true) - visit profile_personal_access_tokens_path + visit user_settings_personal_access_tokens_path expect(page).not_to have_content(feed_token_description) expect(page).not_to have_field('Feed token') @@ -147,7 +151,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js, feature_category: :user_ name = 'My PAT' scopes = 'api,read_user' - visit profile_personal_access_tokens_path({ name: name, scopes: scopes }) + visit user_settings_personal_access_tokens_path({ name: name, scopes: scopes }) click_button 'Add new token' expect(page).to have_field("Token name", with: name) diff --git a/spec/features/user_sorts_things_spec.rb b/spec/features/user_sorts_things_spec.rb index bc377fb1f8f..c53ad961d84 100644 --- a/spec/features/user_sorts_things_spec.rb +++ b/spec/features/user_sorts_things_spec.rb @@ -11,13 +11,13 @@ RSpec.describe "User sorts things", :js do include DashboardHelper let_it_be(:project) { create(:project_empty_repo, :public) } - let_it_be(:current_user) { create(:user) } # Using `current_user` instead of just `user` because of the hardoced call in `assigned_mrs_dashboard_path` which is used below. - let_it_be(:issue) { create(:issue, project: project, author: current_user) } - let_it_be(:merge_request) { create(:merge_request, target_project: project, source_project: project, author: current_user) } + let_it_be(:user) { create(:user) } + let_it_be(:issue) { create(:issue, project: project, author: user) } + let_it_be(:merge_request) { create(:merge_request, target_project: project, source_project: project, author: user) } before do - project.add_developer(current_user) - sign_in(current_user) + project.add_developer(user) + sign_in(user) end it "issues -> project home page -> issues", feature_category: :team_planning do @@ -25,8 +25,7 @@ RSpec.describe "User sorts things", :js do visit(project_issues_path(project)) - click_button s_('SortOptions|Created date') - click_button sort_option + pajamas_sort_by sort_option, from: s_('SortOptions|Created date') visit(project_path(project)) visit(project_issues_path(project)) @@ -39,9 +38,9 @@ RSpec.describe "User sorts things", :js do visit(project_merge_requests_path(project)) - pajamas_sort_by(sort_option) + pajamas_sort_by sort_option, from: s_('SortOptions|Created date') - visit(assigned_mrs_dashboard_path) + visit(merge_requests_dashboard_path(assignee_username: user.username)) expect(find(".issues-filters")).to have_content(sort_option) end diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb index 0f086af227c..87ed4ced684 100644 --- a/spec/features/users/login_spec.rb +++ b/spec/features/users/login_spec.rb @@ -578,7 +578,7 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_ fill_in 'user_password', with: user.password click_button 'Sign in' - expect(page).to have_current_path(new_profile_password_path, ignore_query: true) + expect(page).to have_current_path(new_user_settings_password_path, ignore_query: true) end end end @@ -785,6 +785,13 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_ ensure_no_tabs end + it 'renders logo', :js do + visit new_user_session_path + + image = find('img.js-portrait-logo-detection') + expect(image['class']).to include('gl-h-9') + end + it 'renders link to sign up path' do visit new_user_session_path @@ -1048,7 +1055,7 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_ expect_to_be_on_terms_page click_button 'Accept terms' - expect(page).to have_current_path(new_profile_password_path, ignore_query: true) + expect(page).to have_current_path(new_user_settings_password_path, ignore_query: true) new_password = User.random_password diff --git a/spec/features/users/show_spec.rb b/spec/features/users/show_spec.rb index 2821e8286a4..c56b261fe28 100644 --- a/spec/features/users/show_spec.rb +++ b/spec/features/users/show_spec.rb @@ -410,7 +410,7 @@ RSpec.describe 'User page', feature_category: :user_profile do subject - page.within '.navbar-gitlab' do + within_testid('navbar') do expect(page).to have_link('Sign in') expect(page).not_to have_link('Register') end @@ -423,7 +423,7 @@ RSpec.describe 'User page', feature_category: :user_profile do subject - page.within '.navbar-gitlab' do + within_testid('navbar') do expect(page).to have_link(_('Sign in'), exact: true) expect(page).to have_link(_('Register'), exact: true) end diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb index d873c4846fd..bb08ed7d07d 100644 --- a/spec/features/users/signup_spec.rb +++ b/spec/features/users/signup_spec.rb @@ -62,17 +62,11 @@ RSpec.describe 'Signup', :js, feature_category: :user_management do let(:terms_text) do <<~TEXT.squish By clicking Register or registering through a third party you accept the - Terms of Use and acknowledge the Privacy Policy and Cookie Policy + Terms of Use and acknowledge the Privacy Statement and Cookie Policy TEXT end shared_examples 'signup process' do - def confirm_email - new_user_token = User.find_by_email(new_user.email).confirmation_token - - visit user_confirmation_path(confirmation_token: new_user_token) - end - before do stub_feature_flags(arkose_labs_signup_challenge: false) stub_application_setting(require_admin_approval_after_user_signup: false) @@ -220,7 +214,7 @@ RSpec.describe 'Signup', :js, feature_category: :user_management do expect(page).to have_current_path users_almost_there_path, ignore_query: true expect(page).to have_content("Please check your email (#{new_user.email}) to confirm your account") - confirm_email + confirm_email(new_user) expect(find_field('Username or primary email').value).to eq(new_user.email) end @@ -345,11 +339,24 @@ RSpec.describe 'Signup', :js, feature_category: :user_management do end context 'when invisible captcha detects malicious behaviour' do - it 'prevents from signing up' do - visit new_user_registration_path + context 'with form submitted quicker than timestamp_threshold', :freeze_time do + it 'prevents from signing up' do + visit new_user_registration_path - expect { fill_in_sign_up_form(new_user) }.not_to change { User.count } - expect(page).to have_content('That was a bit too quick! Please resubmit.') + expect { fill_in_sign_up_form(new_user) }.not_to change { User.count } + expect(page).to have_content('That was a bit too quick! Please resubmit.') + end + end + + context 'with honeypot field is filled' do + it 'prevents from signing up' do + visit new_user_registration_path + + find_field('If you are human, please ignore this field.', + visible: false).execute_script("this.value = 'bot'") + + expect { fill_in_sign_up_form(new_user) }.not_to change { User.count } + end end end end @@ -389,7 +396,7 @@ RSpec.describe 'Signup', :js, feature_category: :user_management do let(:terms_text) do <<~TEXT.squish By clicking Register, I agree that I have read and accepted the Terms of - Use and Privacy Policy + Use and Privacy Statement TEXT end |