From ee664acb356f8123f4f6b00b73c1e1cf0866c7fb Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 20 Oct 2022 09:40:42 +0000 Subject: Add latest changes from gitlab-org/gitlab@15-5-stable-ee --- .../admin/admin_broadcast_messages_spec.rb | 1 + spec/features/admin/admin_groups_spec.rb | 25 --- spec/features/admin/admin_runners_spec.rb | 64 ++++---- spec/features/admin/admin_settings_spec.rb | 44 ++---- .../admin/admin_users_impersonation_tokens_spec.rb | 14 +- spec/features/admin/users/users_spec.rb | 8 +- spec/features/boards/boards_spec.rb | 1 - .../dashboard/datetime_on_tooltips_spec.rb | 4 +- spec/features/dashboard/issues_filter_spec.rb | 2 +- spec/features/dashboard/projects_spec.rb | 3 +- .../dashboard/user_filters_projects_spec.rb | 7 + spec/features/discussion_comments/issue_spec.rb | 1 - .../discussion_comments/merge_request_spec.rb | 1 - spec/features/expand_collapse_diffs_spec.rb | 5 +- spec/features/global_search_spec.rb | 1 + spec/features/groups/empty_states_spec.rb | 4 +- spec/features/groups/group_runners_spec.rb | 46 +++++- spec/features/groups/labels/sort_labels_spec.rb | 4 +- spec/features/groups/merge_requests_spec.rb | 10 ++ spec/features/groups/milestones_sorting_spec.rb | 4 +- spec/features/groups/new_group_page_spec.rb | 32 ++++ spec/features/groups/settings/repository_spec.rb | 34 +++- spec/features/help_dropdown_spec.rb | 4 + spec/features/ide/user_commits_changes_spec.rb | 35 ----- .../incidents/incident_timeline_events_spec.rb | 1 - .../issuables/markdown_references/jira_spec.rb | 6 +- spec/features/issues/incident_issue_spec.rb | 28 +--- spec/features/issues/related_issues_spec.rb | 116 ++++++-------- spec/features/issues/resource_label_events_spec.rb | 9 +- spec/features/issues/service_desk_spec.rb | 1 - .../issues/user_interacts_with_awards_spec.rb | 2 +- .../issues/user_scrolls_to_deeplinked_note_spec.rb | 1 - .../markdown/gitlab_flavored_markdown_spec.rb | 9 +- spec/features/markdown/metrics_spec.rb | 2 +- spec/features/merge_request/batch_comments_spec.rb | 18 +++ .../close_reopen_report_toggle_spec.rb | 10 +- .../merge_request_discussion_lock_spec.rb | 4 +- .../merge_request/user_comments_on_diff_spec.rb | 1 - .../user_comments_on_merge_request_spec.rb | 1 - .../user_interacts_with_batched_mr_diffs_spec.rb | 4 +- .../merge_request/user_jumps_to_discussion_spec.rb | 29 ---- .../user_manages_subscription_spec.rb | 6 +- .../user_marks_merge_request_as_draft_spec.rb | 4 +- .../merge_request/user_posts_diff_notes_spec.rb | 4 +- .../user_sees_avatar_on_diff_notes_spec.rb | 15 +- .../merge_request/user_sees_merge_widget_spec.rb | 32 ++-- ...user_views_user_status_on_merge_request_spec.rb | 34 ---- spec/features/milestone_spec.rb | 12 +- .../milestones/user_creates_milestone_spec.rb | 99 ++++++++++-- spec/features/oauth_registration_spec.rb | 175 +++++++++++---------- spec/features/profiles/password_spec.rb | 23 ++- spec/features/profiles/two_factor_auths_spec.rb | 8 +- spec/features/profiles/user_edit_profile_spec.rb | 50 +----- spec/features/projects/blobs/blob_show_spec.rb | 2 +- spec/features/projects/blobs/edit_spec.rb | 39 ++++- .../user_creates_new_blob_in_new_project_spec.rb | 63 -------- spec/features/projects/branches_spec.rb | 8 +- spec/features/projects/ci/editor_spec.rb | 13 ++ spec/features/projects/ci/lint_spec.rb | 9 +- .../environments/environment_metrics_spec.rb | 2 +- .../projects/environments/environment_spec.rb | 4 + spec/features/projects/fork_spec.rb | 53 ++++++- .../projects/infrastructure_registry_spec.rb | 2 +- spec/features/projects/labels/sort_labels_spec.rb | 4 +- .../projects/milestones/milestones_sorting_spec.rb | 4 +- spec/features/projects/packages_spec.rb | 2 +- spec/features/projects/pipeline_schedules_spec.rb | 4 + .../projects/pipelines/legacy_pipeline_spec.rb | 2 + spec/features/projects/pipelines/pipeline_spec.rb | 2 + spec/features/projects/pipelines/pipelines_spec.rb | 4 +- .../projects/releases/user_creates_release_spec.rb | 3 + .../projects/settings/repository_settings_spec.rb | 2 +- .../settings/user_changes_default_branch_spec.rb | 13 +- .../settings/user_transfers_a_project_spec.rb | 2 +- .../projects/settings/webhooks_settings_spec.rb | 8 +- .../show/user_interacts_with_stars_spec.rb | 12 ++ .../show/user_sees_collaboration_links_spec.rb | 6 +- spec/features/projects/user_sorts_projects_spec.rb | 20 ++- .../wiki/user_views_wiki_in_project_page_spec.rb | 33 ++-- spec/features/protected_branches_spec.rb | 2 +- spec/features/runners_spec.rb | 10 -- .../features/search/user_searches_for_code_spec.rb | 2 + .../search/user_searches_for_comments_spec.rb | 1 + .../search/user_searches_for_commits_spec.rb | 10 +- .../search/user_searches_for_issues_spec.rb | 3 + .../user_searches_for_merge_requests_spec.rb | 1 + .../search/user_searches_for_milestones_spec.rb | 1 + .../search/user_searches_for_projects_spec.rb | 1 + .../search/user_searches_for_users_spec.rb | 1 + .../search/user_searches_for_wiki_pages_spec.rb | 5 + .../search/user_uses_header_search_field_spec.rb | 1 + spec/features/snippets/search_snippets_spec.rb | 4 + spec/features/tags/developer_creates_tag_spec.rb | 25 --- spec/features/unsubscribe_links_spec.rb | 13 +- .../uploads/user_uploads_avatar_to_profile_spec.rb | 2 +- spec/features/user_opens_link_to_comment_spec.rb | 2 +- spec/features/users/signup_spec.rb | 1 - spec/features/work_items/work_item_spec.rb | 33 ++++ 98 files changed, 802 insertions(+), 690 deletions(-) create mode 100644 spec/features/groups/new_group_page_spec.rb delete mode 100644 spec/features/ide/user_commits_changes_spec.rb delete mode 100644 spec/features/merge_request/user_jumps_to_discussion_spec.rb delete mode 100644 spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb delete mode 100644 spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb create mode 100644 spec/features/work_items/work_item_spec.rb (limited to 'spec/features') diff --git a/spec/features/admin/admin_broadcast_messages_spec.rb b/spec/features/admin/admin_broadcast_messages_spec.rb index 875eb9dd0ce..b5416f539f1 100644 --- a/spec/features/admin/admin_broadcast_messages_spec.rb +++ b/spec/features/admin/admin_broadcast_messages_spec.rb @@ -6,6 +6,7 @@ RSpec.describe 'Admin Broadcast Messages' do before do admin = create(:admin) sign_in(admin) + stub_feature_flags(vue_broadcast_messages: false) gitlab_enable_admin_mode_sign_in(admin) create( :broadcast_message, diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb index 040c6a65b7c..657dd52228e 100644 --- a/spec/features/admin/admin_groups_spec.rb +++ b/spec/features/admin/admin_groups_spec.rb @@ -207,31 +207,6 @@ RSpec.describe 'Admin Groups' do end describe 'add user into a group', :js do - shared_examples 'adds user into a group' do - it do - visit admin_group_path(group) - - select2(user_selector, from: '#user_id', multiple: true) - page.within '#new_project_member' do - select2(Gitlab::Access::REPORTER, from: '#access_level') - end - click_button "Add users to group" - - page.within ".group-users-list" do - expect(page).to have_content(user.name) - expect(page).to have_content('Reporter') - end - end - end - - it_behaves_like 'adds user into a group' do - let(:user_selector) { user.id } - end - - it_behaves_like 'adds user into a group' do - let(:user_selector) { user.email } - end - context 'when membership is set to expire' do it 'renders relative time' do expire_time = Time.current + 2.days diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index fe9fd01d3d5..35e57213bdb 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -66,10 +66,26 @@ RSpec.describe "Admin Runners" do it 'has all necessary texts' do expect(page).to have_text "Register an instance runner" + expect(page).to have_text "#{s_('Runners|All')} 3" expect(page).to have_text "#{s_('Runners|Online')} 1" expect(page).to have_text "#{s_('Runners|Offline')} 2" expect(page).to have_text "#{s_('Runners|Stale')} 1" end + + describe 'delete all runners in bulk' do + before do + check s_('Runners|Select all') + click_button s_('Runners|Delete selected') + + within_modal do + click_on 'Permanently delete 3 runners' + end + + wait_for_requests + end + + it_behaves_like 'shows no runners registered' + end end it 'shows a job count' do @@ -351,14 +367,15 @@ RSpec.describe "Admin Runners" do end describe 'filter by tag' do - before_all do - create(:ci_runner, :instance, description: 'runner-blue', tag_list: ['blue']) - create(:ci_runner, :instance, description: 'runner-red', tag_list: ['red']) - end + let_it_be(:runner_1) { create(:ci_runner, :instance, description: 'runner-blue', tag_list: ['blue']) } + let_it_be(:runner_2) { create(:ci_runner, :instance, description: 'runner-2-blue', tag_list: ['blue']) } + let_it_be(:runner_3) { create(:ci_runner, :instance, description: 'runner-red', tag_list: ['red']) } - it 'shows tags suggestions' do + before do visit admin_runners_path + end + it 'shows tags suggestions' do open_filtered_search_suggestions('Tags') page.within(search_bar_selector) do @@ -367,23 +384,25 @@ RSpec.describe "Admin Runners" do end end - it 'shows correct runner when tag matches' do - visit admin_runners_path + it_behaves_like 'filters by tag' do + let(:tag) { 'blue' } + let(:found_runner) { runner_1.description } + let(:missing_runner) { runner_3.description } + end - expect(page).to have_content 'runner-blue' - expect(page).to have_content 'runner-red' + context 'when tag does not match' do + before do + input_filtered_search_filter_is_only('Tags', 'green') + end - input_filtered_search_filter_is_only('Tags', 'blue') + it_behaves_like 'shows no runners found' - expect(page).to have_content 'runner-blue' - expect(page).not_to have_content 'runner-red' + 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 - create(:ci_runner, :instance, description: 'runner-2-blue', tag_list: ['blue']) - - visit admin_runners_path - input_filtered_search_filter_is_only('Tags', 'blue') expect(page).to have_content 'runner-blue' @@ -396,19 +415,6 @@ RSpec.describe "Admin Runners" do expect(page).not_to have_content 'runner-blue' expect(page).not_to have_content 'runner-red' end - - context 'when tag does not match' do - before do - visit admin_runners_path - input_filtered_search_filter_is_only('Tags', 'green') - end - - it_behaves_like 'shows no runners found' - - it 'shows no runner' do - expect(page).not_to have_content 'runner-blue' - end - end end it 'sorts by last contact date' do diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb index a5df142d188..94c5f397670 100644 --- a/spec/features/admin/admin_settings_spec.rb +++ b/spec/features/admin/admin_settings_spec.rb @@ -7,7 +7,7 @@ RSpec.describe 'Admin updates settings' do include TermsHelper include UsageDataHelpers - let(:admin) { create(:admin) } + let_it_be(:admin) { create(:admin) } let(:dot_com?) { false } context 'application setting :admin_mode is enabled', :request_store do @@ -177,10 +177,10 @@ RSpec.describe 'Admin updates settings' do end it 'change Dormant users period' do - expect(page).to have_field _('Period of inactivity (days)') + expect(page).to have_field _('Days of inactivity before deactivation') page.within(find('[data-testid="account-limit"]')) do - fill_in _('application_setting_deactivate_dormant_users_period'), with: '35' + fill_in _('application_setting_deactivate_dormant_users_period'), with: '90' click_button 'Save changes' end @@ -188,7 +188,7 @@ RSpec.describe 'Admin updates settings' do page.refresh - expect(page).to have_field _('Period of inactivity (days)'), with: '35' + expect(page).to have_field _('Days of inactivity before deactivation'), with: '90' end end end @@ -400,39 +400,19 @@ RSpec.describe 'Admin updates settings' do end context 'Runner Registration' do - context 'when feature is enabled' do - before do - stub_feature_flags(runner_registration_control: true) - end - - it 'allows admins to control who has access to register runners' do - visit ci_cd_admin_application_settings_path - - expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES) + it 'allows admins to control who has access to register runners' do + visit ci_cd_admin_application_settings_path - page.within('.as-runner') do - find_all('input[type="checkbox"]').each(&:click) + expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES) - click_button 'Save changes' - end - - expect(current_settings.valid_runner_registrars).to eq([]) - expect(page).to have_content "Application settings saved successfully" - end - end + page.within('.as-runner') do + find_all('input[type="checkbox"]').each(&:click) - context 'when feature is disabled' do - before do - stub_feature_flags(runner_registration_control: false) + click_button 'Save changes' end - it 'does not allow admins to control who has access to register runners' do - visit ci_cd_admin_application_settings_path - - expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES) - - expect(page).not_to have_css('.as-runner') - end + expect(current_settings.valid_runner_registrars).to eq([]) + expect(page).to have_content "Application settings saved successfully" end end diff --git a/spec/features/admin/admin_users_impersonation_tokens_spec.rb b/spec/features/admin/admin_users_impersonation_tokens_spec.rb index 7e57cffc791..45dccf9921f 100644 --- a/spec/features/admin/admin_users_impersonation_tokens_spec.rb +++ b/spec/features/admin/admin_users_impersonation_tokens_spec.rb @@ -9,15 +9,11 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do let!(:user) { create(:user) } def active_impersonation_tokens - find(".table.active-tokens") - end - - def no_personal_access_tokens_message - find(".settings-message") + find("[data-testid='active-tokens']") end def created_impersonation_token - find("#created-personal-access-token").value + find_field('new-access-token').value end before do @@ -80,8 +76,7 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do accept_gl_confirm(button_text: 'Revoke') { click_on "Revoke" } - expect(page).to have_selector(".settings-message") - expect(no_personal_access_tokens_message).to have_text("This user has no active impersonation tokens.") + expect(active_impersonation_tokens).to have_text("This user has no active impersonation tokens.") end it "removes expired tokens from 'active' section" do @@ -89,8 +84,7 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do visit admin_user_impersonation_tokens_path(user_id: user.username) - expect(page).to have_selector(".settings-message") - expect(no_personal_access_tokens_message).to have_text("This user has no active impersonation tokens.") + expect(active_impersonation_tokens).to have_text("This user has no active impersonation tokens.") end end diff --git a/spec/features/admin/users/users_spec.rb b/spec/features/admin/users/users_spec.rb index 236327ea687..9c59f0226e0 100644 --- a/spec/features/admin/users/users_spec.rb +++ b/spec/features/admin/users/users_spec.rb @@ -366,7 +366,7 @@ RSpec.describe 'Admin::Users' do expect(user.projects_limit) .to eq(Gitlab.config.gitlab.default_projects_limit) expect(user.can_create_group) - .to eq(Gitlab.config.gitlab.default_can_create_group) + .to eq(Gitlab::CurrentSettings.can_create_group) end it 'creates user with valid data' do @@ -481,14 +481,14 @@ RSpec.describe 'Admin::Users' do end it 'lists groups' do - within(:css, '.gl-mb-3 + .card') do + within(:css, '.gl-mb-3 + .gl-card') do expect(page).to have_content 'Groups' expect(page).to have_link group.name, href: admin_group_path(group) end end it 'allows navigation to the group details' do - within(:css, '.gl-mb-3 + .card') do + within(:css, '.gl-mb-3 + .gl-card') do click_link group.name end expect(page).to have_content "Group: #{group.name}" @@ -496,7 +496,7 @@ RSpec.describe 'Admin::Users' do end it 'shows the group access level' do - within(:css, '.gl-mb-3 + .card') do + within(:css, '.gl-mb-3 + .gl-card') do expect(page).to have_content 'Developer' end end diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb index f279af90aa3..a09c9d258dc 100644 --- a/spec/features/boards/boards_spec.rb +++ b/spec/features/boards/boards_spec.rb @@ -23,7 +23,6 @@ RSpec.describe 'Project issue boards', :js do project.add_maintainer(user2) sign_in(user) - stub_feature_flags(gl_avatar_for_all_user_avatars: false) set_cookie('sidebar_collapsed', 'true') end diff --git a/spec/features/dashboard/datetime_on_tooltips_spec.rb b/spec/features/dashboard/datetime_on_tooltips_spec.rb index 48a6976f263..875ae41c55d 100644 --- a/spec/features/dashboard/datetime_on_tooltips_spec.rb +++ b/spec/features/dashboard/datetime_on_tooltips_spec.rb @@ -41,9 +41,9 @@ RSpec.describe 'Tooltips on .timeago dates', :js do end it 'has the datetime formated correctly' do - expect(page).to have_selector('.js-timeago.snippet-created-ago', text: '1 day ago') + expect(page).to have_selector('[data-testid=snippet-created-at] .js-timeago', text: '1 day ago') - page.find('.js-timeago.snippet-created-ago').hover + page.find('[data-testid=snippet-created-at] .js-timeago').hover expect(datetime_in_tooltip).to eq(created_date) end diff --git a/spec/features/dashboard/issues_filter_spec.rb b/spec/features/dashboard/issues_filter_spec.rb index 3c774f8b269..0d10aed955a 100644 --- a/spec/features/dashboard/issues_filter_spec.rb +++ b/spec/features/dashboard/issues_filter_spec.rb @@ -44,7 +44,7 @@ RSpec.describe 'Dashboard Issues filtering', :js do it 'updates atom feed link' do visit_issues(milestone_title: '', assignee_username: user.username) - link = find('.nav-controls a[title="Subscribe to RSS feed"]') + link = find('[data-testid="rss-feed-link"]') params = CGI.parse(URI.parse(link[:href]).query) auto_discovery_link = find('link[type="application/atom+xml"]', visible: false) auto_discovery_params = CGI.parse(URI.parse(auto_discovery_link[:href]).query) diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb index 847d0faf60d..0b468854322 100644 --- a/spec/features/dashboard/projects_spec.rb +++ b/spec/features/dashboard/projects_spec.rb @@ -112,13 +112,12 @@ RSpec.describe 'Dashboard Projects' do end context 'when on Starred projects tab', :js do - it 'shows the empty state when there are no starred projects', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/222357' do + it 'shows the empty state when there are no starred projects' do visit(starred_dashboard_projects_path) element = page.find('.row.empty-state') expect(element).to have_content("You don't have starred projects yet.") - expect(element.find('.svg-content img')['src']).to have_content('illustrations/starred_empty') end it 'shows only starred projects' do diff --git a/spec/features/dashboard/user_filters_projects_spec.rb b/spec/features/dashboard/user_filters_projects_spec.rb index 2cf56f93cf9..e25da5854ab 100644 --- a/spec/features/dashboard/user_filters_projects_spec.rb +++ b/spec/features/dashboard/user_filters_projects_spec.rb @@ -145,7 +145,14 @@ RSpec.describe 'Dashboard > User filters projects' do end it 'filters any project' do + # Selecting the same option in the `GlListbox` does not emit `select` event + # and that is why URL update won't be triggered. Given that `Any` is a default option + # we need to explicitly switch from some other option (e.g. `Internal`) to `Any` + # to trigger the page update + select_dropdown_option '#filtered-search-visibility-dropdown > .dropdown', 'Internal', '.dropdown-item' + select_dropdown_option '#filtered-search-visibility-dropdown > .dropdown', 'Any', '.dropdown-item' + list = page.all('.projects-list .project-name').map(&:text) expect(list).to contain_exactly("Internal project", "Private project", "Treasure", "Victorialand") diff --git a/spec/features/discussion_comments/issue_spec.rb b/spec/features/discussion_comments/issue_spec.rb index 0bb43343ecd..ebb57b37918 100644 --- a/spec/features/discussion_comments/issue_spec.rb +++ b/spec/features/discussion_comments/issue_spec.rb @@ -8,7 +8,6 @@ RSpec.describe 'Thread Comments Issue', :js do let(:issue) { create(:issue, project: project) } before do - stub_feature_flags(remove_user_attributes_projects: false) project.add_maintainer(user) sign_in(user) diff --git a/spec/features/discussion_comments/merge_request_spec.rb b/spec/features/discussion_comments/merge_request_spec.rb index 4fa82de3b4b..a90ff3721d3 100644 --- a/spec/features/discussion_comments/merge_request_spec.rb +++ b/spec/features/discussion_comments/merge_request_spec.rb @@ -8,7 +8,6 @@ RSpec.describe 'Thread Comments Merge Request', :js do let(:merge_request) { create(:merge_request, source_project: project) } before do - stub_feature_flags(remove_user_attributes_projects: false) project.add_maintainer(user) sign_in(user) diff --git a/spec/features/expand_collapse_diffs_spec.rb b/spec/features/expand_collapse_diffs_spec.rb index 98282e47488..c3096677a73 100644 --- a/spec/features/expand_collapse_diffs_spec.rb +++ b/spec/features/expand_collapse_diffs_spec.rb @@ -4,12 +4,13 @@ require 'spec_helper' RSpec.describe 'Expand and collapse diffs', :js do let(:branch) { 'expand-collapse-diffs' } - let(:project) { create(:project, :repository) } + + let_it_be(:project) { create(:project, :repository) } + let_it_be(:admin) { create(:admin) } before do allow(Gitlab::CurrentSettings).to receive(:diff_max_patch_bytes).and_return(100.kilobytes) - admin = create(:admin) sign_in(admin) gitlab_enable_admin_mode_sign_in(admin) diff --git a/spec/features/global_search_spec.rb b/spec/features/global_search_spec.rb index baa691d244e..666bf3594de 100644 --- a/spec/features/global_search_spec.rb +++ b/spec/features/global_search_spec.rb @@ -9,6 +9,7 @@ RSpec.describe 'Global search' do let(:project) { create(:project, namespace: user.namespace) } before do + stub_feature_flags(search_page_vertical_nav: false) project.add_maintainer(user) sign_in(user) end diff --git a/spec/features/groups/empty_states_spec.rb b/spec/features/groups/empty_states_spec.rb index f11e5c56545..84882fc674e 100644 --- a/spec/features/groups/empty_states_spec.rb +++ b/spec/features/groups/empty_states_spec.rb @@ -94,9 +94,7 @@ RSpec.describe 'Group empty states' do end it "shows a new #{issuable_name} button" do - within '.empty-state' do - expect(page).to have_content("create #{issuable_name}") - end + expect(page).to have_content("create #{issuable_name}") end it "the new #{issuable_name} button opens a project dropdown" do diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb index ada03726c97..e9807c487d5 100644 --- a/spec/features/groups/group_runners_spec.rb +++ b/spec/features/groups/group_runners_spec.rb @@ -114,6 +114,35 @@ RSpec.describe "Group Runners" do end end + context "with an online instance runner" do + let!(:instance_runner) do + create(:ci_runner, :instance, description: 'runner-baz', contacted_at: Time.zone.now) + end + + before do + visit group_runners_path(group) + end + + 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 'shows runner details page' do + click_link("##{instance_runner.id} (#{instance_runner.short_sha})") + + expect(current_url).to include(group_runner_path(group, instance_runner)) + expect(page).to have_content "#{s_('Runners|Description')} runner-baz" + end + end + end + context 'with a multi-project runner' do let(:project) { create(:project, group: group) } let(:project_2) { create(:project, group: group) } @@ -123,7 +152,7 @@ RSpec.describe "Group Runners" do visit group_runners_path(group) within_runner_row(runner.id) do - expect(page).to have_button 'Delete runner', disabled: true + expect(page).not_to have_button 'Delete runner' end end end @@ -142,6 +171,21 @@ RSpec.describe "Group Runners" do end end end + + describe 'filter by tag' do + let!(:runner_1) { create(:ci_runner, :group, groups: [group], description: 'runner-blue', tag_list: ['blue']) } + let!(:runner_2) { create(:ci_runner, :group, groups: [group], description: 'runner-red', tag_list: ['red']) } + + before do + visit group_runners_path(group) + end + + it_behaves_like 'filters by tag' do + let(:tag) { 'blue' } + let(:found_runner) { runner_1.description } + let(:missing_runner) { runner_2.description } + end + end end describe "Group runner show page", :js do diff --git a/spec/features/groups/labels/sort_labels_spec.rb b/spec/features/groups/labels/sort_labels_spec.rb index fba166449f8..9d05703aae6 100644 --- a/spec/features/groups/labels/sort_labels_spec.rb +++ b/spec/features/groups/labels/sort_labels_spec.rb @@ -28,7 +28,7 @@ RSpec.describe 'Sort labels', :js do it 'sorts by date' do click_button 'Name' - sort_options = find('ul.dropdown-menu').all('li').collect(&:text) + sort_options = find('ul[role="listbox"]').all('li').collect(&:text) expect(sort_options[0]).to eq('Name') expect(sort_options[1]).to eq('Name, descending') @@ -37,7 +37,7 @@ RSpec.describe 'Sort labels', :js do expect(sort_options[4]).to eq('Updated date') expect(sort_options[5]).to eq('Oldest updated') - click_button 'Name, descending' + find('li', text: 'Name, descending').click # assert default sorting within '.other-labels' do diff --git a/spec/features/groups/merge_requests_spec.rb b/spec/features/groups/merge_requests_spec.rb index be1db970e9d..296b839c8fc 100644 --- a/spec/features/groups/merge_requests_spec.rb +++ b/spec/features/groups/merge_requests_spec.rb @@ -57,6 +57,16 @@ RSpec.describe 'Group merge requests page' do expect(find('#js-dropdown-assignee .filter-dropdown')).to have_content(user.name) expect(find('#js-dropdown-assignee .filter-dropdown')).not_to have_content(user2.name) end + + it 'will still show the navbar with no results' do + search_term = 'some-search-term-that-produces-zero-results' + + filtered_search.set(search_term) + filtered_search.send_keys(:enter) + + expect(page).to have_content('filter produced no results') + expect(page).to have_link('Open', href: "/groups/#{group.name}/-/merge_requests?scope=all&search=#{search_term}&state=opened") + end end describe 'new merge request dropdown' do diff --git a/spec/features/groups/milestones_sorting_spec.rb b/spec/features/groups/milestones_sorting_spec.rb index 22d7ff91d41..125bf9ce3a7 100644 --- a/spec/features/groups/milestones_sorting_spec.rb +++ b/spec/features/groups/milestones_sorting_spec.rb @@ -29,9 +29,9 @@ RSpec.describe 'Milestones sorting', :js do within '[data-testid=milestone_sort_by_dropdown]' do click_button 'Due soon' - expect(find('.gl-new-dropdown-contents').all('.gl-new-dropdown-item-text-wrapper p').map(&:text)).to eq(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending']) + expect(find('ul[role="listbox"]').all('li').map(&:text)).to eq(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending']) - click_button 'Due later' + find('li', text: 'Due later').click expect(page).to have_button('Due later') end diff --git a/spec/features/groups/new_group_page_spec.rb b/spec/features/groups/new_group_page_spec.rb new file mode 100644 index 00000000000..6a8af9c31fd --- /dev/null +++ b/spec/features/groups/new_group_page_spec.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'New group page', :js do + let(:user) { create(:user) } + let(:group) { create(:group) } + + before do + sign_in(user) + end + + describe 'new top level group alert' do + context 'when a user visits the new group page' do + it 'shows the new top level group alert' do + visit new_group_path(anchor: 'create-group-pane') + + expect(page).to have_selector('[data-testid="new-top-level-alert"]') + end + end + + context 'when a user visits the new sub group page' do + let(:parent_group) { create(:group) } + + it 'does not show the new top level group alert' do + visit new_group_path(parent_id: parent_group.id, anchor: 'create-group-pane') + + expect(page).not_to have_selector('[data-testid="new-top-level-alert"]') + end + end + end +end diff --git a/spec/features/groups/settings/repository_spec.rb b/spec/features/groups/settings/repository_spec.rb index 159deb2a4e3..f6b8bbdd35f 100644 --- a/spec/features/groups/settings/repository_spec.rb +++ b/spec/features/groups/settings/repository_spec.rb @@ -2,14 +2,17 @@ require 'spec_helper' -RSpec.describe 'Group Repository settings' do +RSpec.describe 'Group Repository settings', :js do include WaitForRequests - let(:user) { create(:user) } - let(:group) { create(:group) } + let_it_be(:user) { create(:user) } + let_it_be(:group, reload: true) { create(:group) } - before do + before_all do group.add_owner(user) + end + + before do sign_in(user) end @@ -20,9 +23,26 @@ RSpec.describe 'Group Repository settings' do stub_container_registry_config(enabled: true) end - it_behaves_like 'a deploy token in settings' do - let(:entity_type) { 'group' } - let(:page_path) { group_settings_repository_path(group) } + context 'when ajax deploy tokens is enabled' do + before do + stub_feature_flags(ajax_new_deploy_token: true) + end + + it_behaves_like 'a deploy token in settings' do + let(:entity_type) { 'group' } + let(:page_path) { group_settings_repository_path(group) } + end + end + + context 'when ajax deploy tokens is disabled' do + before do + stub_feature_flags(ajax_new_deploy_token: false) + end + + it_behaves_like 'a deploy token in settings' do + let(:entity_type) { 'group' } + let(:page_path) { group_settings_repository_path(group) } + end end end diff --git a/spec/features/help_dropdown_spec.rb b/spec/features/help_dropdown_spec.rb index e64c19d4708..a9c014a9408 100644 --- a/spec/features/help_dropdown_spec.rb +++ b/spec/features/help_dropdown_spec.rb @@ -59,6 +59,10 @@ RSpec.describe "Help Dropdown", :js do expect(page).to have_text('Your GitLab Version') expect(page).to have_text("#{Gitlab.version_info.major}.#{Gitlab.version_info.minor}") expect(page).to have_selector('.version-check-badge') + expect(page).to have_selector( + 'a[data-testid="gitlab-version-container"][href="/help/update/index"]' + ) + expect(page).to have_selector('.version-check-badge[href="/help/update/index"]') expect(page).to have_text(ui_text) end end diff --git a/spec/features/ide/user_commits_changes_spec.rb b/spec/features/ide/user_commits_changes_spec.rb deleted file mode 100644 index 04b215710b3..00000000000 --- a/spec/features/ide/user_commits_changes_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'IDE user commits changes', :js do - include WebIdeSpecHelpers - - let(:project) { create(:project, :public, :repository) } - let(:user) { project.first_owner } - - before do - stub_feature_flags(vscode_web_ide: false) - - sign_in(user) - - ide_visit(project) - end - - it 'user updates nested files' do - content = <<~HEREDOC - Lorem ipsum - Dolar sit - Amit - HEREDOC - - ide_create_new_file('foo/bar/lorem_ipsum.md', content: content) - ide_delete_file('foo/bar/.gitkeep') - - ide_commit - - expect(page).to have_content('All changes are committed') - expect(project.repository.blob_at('master', 'foo/bar/.gitkeep')).to be_nil - expect(project.repository.blob_at('master', 'foo/bar/lorem_ipsum.md').data).to eql(content) - end -end diff --git a/spec/features/incidents/incident_timeline_events_spec.rb b/spec/features/incidents/incident_timeline_events_spec.rb index 6db9f87d6f2..ef0eb27d310 100644 --- a/spec/features/incidents/incident_timeline_events_spec.rb +++ b/spec/features/incidents/incident_timeline_events_spec.rb @@ -12,7 +12,6 @@ RSpec.describe 'Incident timeline events', :js do end before do - stub_feature_flags(incident_timeline: true) sign_in(developer) visit project_issues_incident_path(project, incident) diff --git a/spec/features/issuables/markdown_references/jira_spec.rb b/spec/features/issuables/markdown_references/jira_spec.rb index 9d46b3a274e..66d0022f7e9 100644 --- a/spec/features/issuables/markdown_references/jira_spec.rb +++ b/spec/features/issuables/markdown_references/jira_spec.rb @@ -15,8 +15,6 @@ RSpec.describe "Jira", :js do before do remotelink = double(:remotelink, all: [], build: double(save!: true)) - stub_feature_flags(remove_user_attributes_projects: false) - stub_request(:get, "https://jira.example.com/rest/api/2/issue/JIRA-5") stub_request(:post, "https://jira.example.com/rest/api/2/issue/JIRA-5/comment") allow_next_instance_of(JIRA::Resource::Issue) do |instance| @@ -59,7 +57,7 @@ RSpec.describe "Jira", :js do visit(issue_path(issue_actual_project)) page.within("#notes") do - expect(page).to have_content("#{user.to_reference} mentioned in merge request #{merge_request.to_reference}") + expect(page).to have_content("#{user.name} mentioned in merge request #{merge_request.to_reference}") end end @@ -67,7 +65,7 @@ RSpec.describe "Jira", :js do visit(issue_path(issue_other_project)) page.within("#notes") do - expect(page).to have_content("#{user.to_reference} mentioned in merge request #{merge_request.to_reference(other_project)}") + expect(page).to have_content("#{user.name} mentioned in merge request #{merge_request.to_reference(other_project)}") end end end diff --git a/spec/features/issues/incident_issue_spec.rb b/spec/features/issues/incident_issue_spec.rb index 56be1493ed2..d6cde466d1b 100644 --- a/spec/features/issues/incident_issue_spec.rb +++ b/spec/features/issues/incident_issue_spec.rb @@ -26,7 +26,6 @@ RSpec.describe 'Incident Detail', :js do context 'when user displays the incident' do before do - stub_feature_flags(incident_timeline: project) project.add_developer(user) sign_in(user) @@ -52,8 +51,8 @@ RSpec.describe 'Incident Detail', :js do aggregate_failures 'when on summary tab (default tab)' do hidden_items = find_all('.js-issue-widgets') - # Linked Issues/MRs and comment box - expect(hidden_items.count).to eq(2) + # Linked Issues/MRs and comment box and emoji block + expect(hidden_items.count).to eq(3) expect(hidden_items).to all(be_visible) edit_button = find_all('[aria-label="Edit title and description"]') @@ -67,13 +66,13 @@ RSpec.describe 'Incident Detail', :js do expect(incident_tabs).to have_content('"yet.another": 73') # does not show the linked issues and notes/comment components' do - hidden_items = find_all('.js-issue-widgets') + hidden_items = find_all('.js-issue-widgets', wait: false) # Linked Issues/MRs and comment box are hidden on page expect(hidden_items.count).to eq(0) # does not show the edit title and description button - edit_button = find_all('[aria-label="Edit title and description"]') + edit_button = find_all('[aria-label="Edit title and description"]', wait: false) expect(edit_button.count).to eq(0) end end @@ -83,32 +82,19 @@ RSpec.describe 'Incident Detail', :js do before do visit project_issue_path(project, incident) wait_for_requests + click_link 'Timeline' + wait_for_requests end it 'does not show the linked issues and notes/comment components' do page.within('.issuable-details') do - hidden_items = find_all('.js-issue-widgets') + hidden_items = find_all('.js-issue-widgets', wait: false) # Linked Issues/MRs and comment box are hidden on page expect(hidden_items.count).to eq(0) end end end - - context 'when incident_timeline feature flag is disabled' do - before do - stub_feature_flags(incident_timeline: false) - - visit project_issues_incident_path(project, incident) - wait_for_requests - end - - it 'does not show Timeline tab' do - tabs = find('[data-testid="incident-tabs"]') - - expect(tabs).not_to have_content('Timeline') - end - end end end diff --git a/spec/features/issues/related_issues_spec.rb b/spec/features/issues/related_issues_spec.rb index 818e99f2ec9..62127295a7c 100644 --- a/spec/features/issues/related_issues_spec.rb +++ b/spec/features/issues/related_issues_spec.rb @@ -3,42 +3,41 @@ require 'spec_helper' RSpec.describe 'Related issues', :js do - let(:user) { create(:user) } - let(:project) { create(:project_empty_repo, :public) } - let(:project_b) { create(:project_empty_repo, :public) } - let(:project_unauthorized) { create(:project_empty_repo, :public) } - let(:issue_a) { create(:issue, project: project) } - let(:issue_b) { create(:issue, project: project) } - let(:issue_c) { create(:issue, project: project) } - let(:issue_d) { create(:issue, project: project) } - let(:issue_project_b_a) { create(:issue, project: project_b) } - let(:issue_project_unauthorized_a) { create(:issue, project: project_unauthorized) } + let_it_be(:user) { create(:user) } + + let_it_be(:project) { create(:project_empty_repo, :public) } + let_it_be(:project_b) { create(:project_empty_repo, :public) } + let_it_be(:project_unauthorized) { create(:project_empty_repo, :public) } + let_it_be(:internal_project) { create(:project_empty_repo, :internal) } + let_it_be(:private_project) { create(:project_empty_repo, :private) } + let_it_be(:public_project) { create(:project_empty_repo, :public) } + + let_it_be(:issue_a) { create(:issue, project: project) } + let_it_be(:issue_b) { create(:issue, project: project) } + let_it_be(:issue_c) { create(:issue, project: project) } + let_it_be(:issue_d) { create(:issue, project: project) } + let_it_be(:issue_project_b_a) { create(:issue, project: project_b) } + let_it_be(:issue_project_unauthorized_a) { create(:issue, project: project_unauthorized) } + let_it_be(:internal_issue) { create(:issue, project: internal_project) } + let_it_be(:private_issue) { create(:issue, project: private_project) } + let_it_be(:public_issue) { create(:issue, project: public_project) } context 'widget visibility' do context 'when not logged in' do it 'does not show widget when internal project' do - project = create :project_empty_repo, :internal - issue = create :issue, project: project - - visit project_issue_path(project, issue) + visit project_issue_path(internal_project, internal_issue) expect(page).not_to have_css('.related-issues-block') end it 'does not show widget when private project' do - project = create :project_empty_repo, :private - issue = create :issue, project: project - - visit project_issue_path(project, issue) + visit project_issue_path(private_project, private_issue) expect(page).not_to have_css('.related-issues-block') end it 'shows widget when public project' do - project = create :project_empty_repo, :public - issue = create :issue, project: project - - visit project_issue_path(project, issue) + visit project_issue_path(public_project, public_issue) expect(page).to have_css('.related-issues-block') expect(page).not_to have_button 'Add a related issue' @@ -51,39 +50,29 @@ RSpec.describe 'Related issues', :js do end it 'shows widget when internal project' do - project = create :project_empty_repo, :internal - issue = create :issue, project: project - - visit project_issue_path(project, issue) + visit project_issue_path(internal_project, internal_issue) expect(page).to have_css('.related-issues-block') expect(page).not_to have_button 'Add a related issue' end it 'does not show widget when private project' do - project = create :project_empty_repo, :private - issue = create :issue, project: project - - visit project_issue_path(project, issue) + visit project_issue_path(private_project, private_issue) expect(page).not_to have_css('.related-issues-block') end it 'shows widget when public project' do - project = create :project_empty_repo, :public - issue = create :issue, project: project - - visit project_issue_path(project, issue) + visit project_issue_path(public_project, public_issue) expect(page).to have_css('.related-issues-block') expect(page).not_to have_button 'Add a related issue' end it 'shows widget on their own public issue' do - project = create :project_empty_repo, :public - issue = create :issue, project: project, author: user + issue = create :issue, project: public_project, author: user - visit project_issue_path(project, issue) + visit project_issue_path(public_project, issue) expect(page).to have_css('.related-issues-block') expect(page).not_to have_button 'Add a related issue' @@ -96,33 +85,27 @@ RSpec.describe 'Related issues', :js do end it 'shows widget when internal project' do - project = create :project_empty_repo, :internal - issue = create :issue, project: project - project.add_guest(user) + internal_project.add_guest(user) - visit project_issue_path(project, issue) + visit project_issue_path(internal_project, internal_issue) expect(page).to have_css('.related-issues-block') expect(page).not_to have_button 'Add a related issue' end it 'shows widget when private project' do - project = create :project_empty_repo, :private - issue = create :issue, project: project - project.add_guest(user) + private_project.add_guest(user) - visit project_issue_path(project, issue) + visit project_issue_path(private_project, private_issue) expect(page).to have_css('.related-issues-block') expect(page).not_to have_button 'Add a related issue' end it 'shows widget when public project' do - project = create :project_empty_repo, :public - issue = create :issue, project: project - project.add_guest(user) + public_project.add_guest(user) - visit project_issue_path(project, issue) + visit project_issue_path(public_project, public_issue) expect(page).to have_css('.related-issues-block') expect(page).not_to have_button 'Add a related issue' @@ -135,44 +118,37 @@ RSpec.describe 'Related issues', :js do end it 'shows widget when internal project' do - project = create :project_empty_repo, :internal - issue = create :issue, project: project - project.add_reporter(user) + internal_project.add_reporter(user) - visit project_issue_path(project, issue) + visit project_issue_path(internal_project, internal_issue) expect(page).to have_css('.related-issues-block') expect(page).to have_button 'Add a related issue' end it 'shows widget when private project' do - project = create :project_empty_repo, :private - issue = create :issue, project: project - project.add_reporter(user) + private_project.add_reporter(user) - visit project_issue_path(project, issue) + visit project_issue_path(private_project, private_issue) expect(page).to have_css('.related-issues-block') expect(page).to have_button 'Add a related issue' end it 'shows widget when public project' do - project = create :project_empty_repo, :public - issue = create :issue, project: project - project.add_reporter(user) + public_project.add_reporter(user) - visit project_issue_path(project, issue) + visit project_issue_path(public_project, public_issue) expect(page).to have_css('.related-issues-block') expect(page).to have_button 'Add a related issue' end it 'shows widget on their own public issue' do - project = create :project_empty_repo, :public - issue = create :issue, project: project, author: user - project.add_reporter(user) + issue = create :issue, project: public_project, author: user + public_project.add_reporter(user) - visit project_issue_path(project, issue) + visit project_issue_path(public_project, issue) expect(page).to have_css('.related-issues-block') expect(page).to have_button 'Add a related issue' @@ -184,8 +160,11 @@ RSpec.describe 'Related issues', :js do let!(:issue_link_b) { create :issue_link, source: issue_a, target: issue_b } let!(:issue_link_c) { create :issue_link, source: issue_a, target: issue_c } - before do + before_all do project.add_guest(user) + end + + before do sign_in(user) end @@ -213,9 +192,12 @@ RSpec.describe 'Related issues', :js do end context 'when user has permission to manage related issues' do - before do + before_all do project.add_maintainer(user) project_b.add_maintainer(user) + end + + before do sign_in(user) end diff --git a/spec/features/issues/resource_label_events_spec.rb b/spec/features/issues/resource_label_events_spec.rb index e4da2f67516..e8158b3e2aa 100644 --- a/spec/features/issues/resource_label_events_spec.rb +++ b/spec/features/issues/resource_label_events_spec.rb @@ -14,7 +14,6 @@ RSpec.describe 'List issue resource label events', :js do let!(:event) { create(:resource_label_event, user: user, issue: issue, label: label) } before do - stub_feature_flags(remove_user_attributes_projects: false) visit project_issue_path(project, issue) wait_for_requests end @@ -22,13 +21,7 @@ RSpec.describe 'List issue resource label events', :js do it 'shows both notes and resource label events' do page.within('#notes') do expect(find("#note_#{note.id}")).to have_content 'some note' - expect(find("#note_#{event.discussion_id}")).to have_content 'added foo label' - end - end - - it 'shows the user status on the system note for the label' do - page.within("#note_#{event.discussion_id}") do - expect(page).to show_user_status user_status + expect(find("#note_#{event.reload.discussion_id}")).to have_content 'added foo label' end end end diff --git a/spec/features/issues/service_desk_spec.rb b/spec/features/issues/service_desk_spec.rb index cc0d35afd60..87cd00fac6b 100644 --- a/spec/features/issues/service_desk_spec.rb +++ b/spec/features/issues/service_desk_spec.rb @@ -90,7 +90,6 @@ RSpec.describe 'Service Desk Issue Tracker', :js do it 'displays the small info box, documentation, a button to configure service desk, and the address' do aggregate_failures do - expect(page).to have_css('.non-empty-state') expect(page).to have_link('Learn more.', href: help_page_path('user/project/service_desk')) expect(page).not_to have_link('Enable Service Desk') expect(page).to have_content(project.service_desk_address) diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb index 8ed56108f00..47b28b88108 100644 --- a/spec/features/issues/user_interacts_with_awards_spec.rb +++ b/spec/features/issues/user_interacts_with_awards_spec.rb @@ -218,7 +218,7 @@ RSpec.describe 'User interacts with awards' do expect(first('[data-testid="award-button"]')).to have_content '1' end - it 'removes award from issue' do + it 'removes award from issue', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/375241' do first('[data-testid="award-button"]').click find('[data-testid="award-button"].selected').click diff --git a/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb b/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb index 5aae5abaf10..1fa8f533869 100644 --- a/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb +++ b/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb @@ -10,7 +10,6 @@ RSpec.describe 'User scrolls to deep-linked note' do context 'on issue page', :js do it 'on comment' do - stub_feature_flags(gl_avatar_for_all_user_avatars: false) visit project_issue_path(project, issue, anchor: "note_#{comment_1.id}") wait_for_requests diff --git a/spec/features/markdown/gitlab_flavored_markdown_spec.rb b/spec/features/markdown/gitlab_flavored_markdown_spec.rb index e831d1be608..17fe2dab8f7 100644 --- a/spec/features/markdown/gitlab_flavored_markdown_spec.rb +++ b/spec/features/markdown/gitlab_flavored_markdown_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe "GitLab Flavored Markdown" do - include CycleAnalyticsHelpers - let(:user) { create(:user) } let(:project) { create(:project) } let(:issue) { create(:issue, project: project) } @@ -24,7 +22,12 @@ RSpec.describe "GitLab Flavored Markdown" do let(:commit) { project.commit } before do - create_commit("fix #{issue.to_reference}\n\nask #{fred.to_reference} for details", project, user, 'master') + project.repository.commit_files( + user, + branch_name: 'master', + message: "fix #{issue.to_reference}\n\nask #{fred.to_reference} for details", + actions: [{ action: :create, file_path: 'a/new.file', content: 'This is a file' }] + ) end it "renders title in commits#index" do diff --git a/spec/features/markdown/metrics_spec.rb b/spec/features/markdown/metrics_spec.rb index 44354c9df47..61dd41204f8 100644 --- a/spec/features/markdown/metrics_spec.rb +++ b/spec/features/markdown/metrics_spec.rb @@ -9,7 +9,7 @@ RSpec.describe 'Metrics rendering', :js, :kubeclient, :use_clean_rails_memory_st include MetricsDashboardUrlHelpers let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:prometheus_project) } + let_it_be(:project) { create(:project, :with_prometheus_integration) } let_it_be(:environment) { create(:environment, project: project) } let(:issue) { create(:issue, project: project, description: description) } diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb index bccdc3c4c62..f01217df8c5 100644 --- a/spec/features/merge_request/batch_comments_spec.rb +++ b/spec/features/merge_request/batch_comments_spec.rb @@ -74,6 +74,24 @@ RSpec.describe 'Merge request > Batch comments', :js do expect(page).to have_selector('.draft-note-component', text: 'Testing update') end + context 'multiple times on the same diff line' do + it 'shows both drafts at once' do + write_diff_comment + + # All of the Diff helpers like click_diff_line (or write_diff_comment) + # fail very badly when run a second time. + # This recreates the relevant logic. + line = find_by_scrolling("[id='#{sample_compare.changes[0][:line_code]}']") + line.hover + line.find('.js-add-diff-note-button').click + + write_comment(text: 'A second draft!', button_text: 'Add to review') + + expect(page).to have_text('Line is wrong') + expect(page).to have_text('A second draft!') + end + end + context 'with image and file draft note' do let(:merge_request) { create(:merge_request_with_diffs, :with_image_diffs, source_project: project) } let!(:draft_on_text) { create(:draft_note_on_text_diff, merge_request: merge_request, author: user, path: 'README.md', note: 'Lorem ipsum on text...') } diff --git a/spec/features/merge_request/close_reopen_report_toggle_spec.rb b/spec/features/merge_request/close_reopen_report_toggle_spec.rb index dea9a10a4ec..5e9400935c3 100644 --- a/spec/features/merge_request/close_reopen_report_toggle_spec.rb +++ b/spec/features/merge_request/close_reopen_report_toggle_spec.rb @@ -24,14 +24,14 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do context 'close/reopen/report toggle' do it 'opens a dropdown when toggle is clicked' do - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click expect(container).to have_link("Close merge request") expect(container).to have_link('Report abuse') end it 'links to Report Abuse' do - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click click_link 'Report abuse' expect(page).to have_content('Report abuse to admin') @@ -42,7 +42,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do let(:issuable) { create(:merge_request, :opened, source_project: project) } it 'shows the `Edit` and `Mark as draft` buttons' do - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click expect(container).to have_link('Edit') expect(container).to have_link('Mark as draft') @@ -56,7 +56,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do let(:issuable) { create(:merge_request, :closed, source_project: project) } it 'shows both the `Edit` and `Reopen` button' do - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click expect(container).to have_link('Edit') expect(container).to have_link('Report abuse') @@ -68,7 +68,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do let(:issuable) { create(:merge_request, :closed, source_project: project, author: user) } it 'shows both the `Edit` and `Reopen` button' do - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click expect(container).to have_link('Edit') expect(container).to have_link('Reopen merge request') diff --git a/spec/features/merge_request/merge_request_discussion_lock_spec.rb b/spec/features/merge_request/merge_request_discussion_lock_spec.rb index a7bc2a062af..d69295744f7 100644 --- a/spec/features/merge_request/merge_request_discussion_lock_spec.rb +++ b/spec/features/merge_request/merge_request_discussion_lock_spec.rb @@ -90,7 +90,7 @@ RSpec.describe 'Merge Request Discussion Lock', :js do end it 'the user can lock the merge_request' do - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click expect(page).to have_content('Lock merge request') end @@ -103,7 +103,7 @@ RSpec.describe 'Merge Request Discussion Lock', :js do end it 'the user can unlock the merge_request' do - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click expect(page).to have_content('Unlock merge request') end diff --git a/spec/features/merge_request/user_comments_on_diff_spec.rb b/spec/features/merge_request/user_comments_on_diff_spec.rb index fd33731cb7b..ffaf403e873 100644 --- a/spec/features/merge_request/user_comments_on_diff_spec.rb +++ b/spec/features/merge_request/user_comments_on_diff_spec.rb @@ -14,7 +14,6 @@ RSpec.describe 'User comments on a diff', :js do let(:user) { create(:user) } before do - stub_feature_flags(remove_user_attributes_projects: false) project.add_maintainer(user) sign_in(user) diff --git a/spec/features/merge_request/user_comments_on_merge_request_spec.rb b/spec/features/merge_request/user_comments_on_merge_request_spec.rb index ec1e2fea851..dbcfc2b968f 100644 --- a/spec/features/merge_request/user_comments_on_merge_request_spec.rb +++ b/spec/features/merge_request/user_comments_on_merge_request_spec.rb @@ -10,7 +10,6 @@ RSpec.describe 'User comments on a merge request', :js do let(:user) { create(:user) } before do - stub_feature_flags(remove_user_attributes_projects: false) project.add_maintainer(user) sign_in(user) diff --git a/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb b/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb index f5b5460769e..07d99a786ba 100644 --- a/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb +++ b/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb @@ -6,8 +6,8 @@ RSpec.describe 'Batch diffs', :js do include MergeRequestDiffHelpers include RepoHelpers - let(:project) { create(:project, :repository) } - let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'master', target_branch: 'empty-branch') } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:merge_request) { create(:merge_request, source_project: project, source_branch: 'master', target_branch: 'empty-branch') } before do sign_in(project.first_owner) diff --git a/spec/features/merge_request/user_jumps_to_discussion_spec.rb b/spec/features/merge_request/user_jumps_to_discussion_spec.rb deleted file mode 100644 index 9bded1c5572..00000000000 --- a/spec/features/merge_request/user_jumps_to_discussion_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'User jumps to the next unresolved discussion', :js do - let(:project) { create(:project, :repository) } - let(:merge_request) do - create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test') - end - - let(:user) { create(:user) } - - before do - create(:discussion_note, noteable: merge_request, project: project, author: user) - - project.add_maintainer(user) - sign_in(user) - - visit(diffs_project_merge_request_path(project, merge_request)) - - wait_for_requests - end - - it 'jumps to overview tab' do - find('.discussion-next-btn').click - - expect(page).to have_css('.notes-tab.active') - end -end diff --git a/spec/features/merge_request/user_manages_subscription_spec.rb b/spec/features/merge_request/user_manages_subscription_spec.rb index 9fb85957979..a8d59a6ffb5 100644 --- a/spec/features/merge_request/user_manages_subscription_spec.rb +++ b/spec/features/merge_request/user_manages_subscription_spec.rb @@ -43,22 +43,18 @@ RSpec.describe 'User manages subscription', :js do it 'toggles subscription' do wait_for_requests - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click expect(page).to have_selector('.gl-toggle:not(.is-checked)') find('[data-testid="notifications-toggle"] .gl-toggle').click wait_for_requests - click_button 'Toggle dropdown' - expect(page).to have_selector('.gl-toggle.is-checked') find('[data-testid="notifications-toggle"] .gl-toggle').click wait_for_requests - click_button 'Toggle dropdown' - expect(page).to have_selector('.gl-toggle:not(.is-checked)') end end diff --git a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb index c3a61476442..d85f275b724 100644 --- a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb +++ b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb @@ -16,12 +16,12 @@ RSpec.describe 'Merge request > User marks merge request as draft', :js do end it 'toggles draft status' do - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click click_link 'Mark as draft' expect(page).to have_content("Draft: #{merge_request.title}") - click_button 'Toggle dropdown' + find('[data-testid="merge-request-actions"]').click page.within('.detail-page-header-actions') do click_link 'Mark as ready' 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 1eebb6c2e28..8af0e957c14 100644 --- a/spec/features/merge_request/user_posts_diff_notes_spec.rb +++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb @@ -6,7 +6,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do include MergeRequestDiffHelpers include Spec::Support::Helpers::ModalHelpers - let(:merge_request) { create(:merge_request) } + let_it_be(:merge_request) { create(:merge_request) } let(:project) { merge_request.source_project } let(:user) { project.creator } let(:comment_button_class) { '.add-diff-note' } @@ -219,7 +219,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do end context 'with a match line' do - it 'does not allow commenting' do + it 'does not allow commenting', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/375024' do match_should_not_allow_commenting(find_by_scrolling('.match', match: :first)) end end 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 8225fcbfd89..a6c024be698 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 @@ -8,10 +8,11 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do include Spec::Support::Helpers::ModalHelpers include MergeRequestDiffHelpers - let(:project) { create(:project, :public, :repository) } - let(:user) { project.creator } - let(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: 'Bug NS-04') } - let(:path) { 'files/ruby/popen.rb' } + let_it_be(:project) { create(:project, :public, :repository) } + let_it_be(:user) { project.creator } + let_it_be(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: 'Bug NS-04') } + + let(:path) { 'files/ruby/popen.rb' } let(:position) do build(:text_diff_position, :added, file: path, @@ -22,10 +23,12 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do let!(:note) { create(:diff_note_on_merge_request, project: project, noteable: merge_request, position: position) } - before do + before_all do project.add_maintainer(user) + end + + before do sign_in user - stub_feature_flags(gl_avatar_for_all_user_avatars: false) set_cookie('sidebar_collapsed', 'true') 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 c2a0e528ea7..77ac6fac22f 100644 --- a/spec/features/merge_request/user_sees_merge_widget_spec.rb +++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb @@ -13,13 +13,15 @@ RSpec.describe 'Merge request > User sees merge widget', :js do let(:merge_request) { create(:merge_request, source_project: project) } let(:merge_request_in_only_mwps_project) { create(:merge_request, source_project: project_only_mwps) } + def click_expand_button + find('[data-testid="report-section-expand-button"]').click + end + before do project.add_maintainer(user) project_only_mwps.add_maintainer(user) sign_in(user) - stub_feature_flags(refactor_mr_widgets_extensions: false) - stub_feature_flags(refactor_mr_widgets_extensions_user: false) stub_feature_flags(refactor_mr_widget_test_summary: false) end @@ -606,7 +608,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do it 'shows test reports summary which includes the new failure' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button expect(page).to have_content('Test summary contained 1 failed out of 2 total tests') within(".js-report-section-container") do @@ -621,7 +623,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do context 'when user clicks the new failure' do it 'shows the test report detail' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button within(".js-report-section-container") do click_button 'addTest' @@ -654,7 +656,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do it 'shows test reports summary which includes the existing failure' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button expect(page).to have_content('Test summary contained 1 failed out of 2 total tests') within(".js-report-section-container") do @@ -668,7 +670,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do context 'when user clicks the existing failure' do it 'shows test report detail of it' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button within(".js-report-section-container") do click_button 'Test#sum when a is 1 and b is 3 returns summary' @@ -701,7 +703,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do it 'shows test reports summary which includes the resolved failure' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button expect(page).to have_content('Test summary contained 1 fixed test result out of 2 total tests') within(".js-report-section-container") do @@ -715,7 +717,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do context 'when user clicks the resolved failure' do it 'shows test report detail of it' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button within(".js-report-section-container") do click_button 'addTest' @@ -747,7 +749,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do it 'shows test reports summary which includes the new error' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button expect(page).to have_content('Test summary contained 1 error out of 2 total tests') within(".js-report-section-container") do @@ -762,7 +764,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do context 'when user clicks the new error' do it 'shows the test report detail' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button within(".js-report-section-container") do click_button 'addTest' @@ -794,7 +796,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do it 'shows test reports summary which includes the existing error' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button expect(page).to have_content('Test summary contained 1 error out of 2 total tests') within(".js-report-section-container") do @@ -808,7 +810,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do context 'when user clicks the existing error' do it 'shows test report detail of it' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button within(".js-report-section-container") do click_button 'Test#sum when a is 4 and b is 4 returns summary' @@ -840,7 +842,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do it 'shows test reports summary which includes the resolved error' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button expect(page).to have_content('Test summary contained 1 fixed test result out of 2 total tests') within(".js-report-section-container") do @@ -854,7 +856,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do context 'when user clicks the resolved error' do it 'shows test report detail of it' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button within(".js-report-section-container") do click_button 'addTest' @@ -894,7 +896,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do it 'shows test reports summary which includes the resolved failure' do within(".js-reports-container") do - click_button 'Expand' + click_expand_button expect(page).to have_content('Test summary contained 20 failed out of 20 total tests') within(".js-report-section-container") do diff --git a/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb b/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb deleted file mode 100644 index d3ea8b955f2..00000000000 --- a/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Project > Merge request > View user status' do - let(:project) { create(:project, :public, :repository) } - let(:merge_request) do - create(:merge_request, source_project: project, target_project: project, author: create(:user)) - end - - before do - stub_feature_flags(remove_user_attributes_projects: false) - end - - subject { visit merge_request_path(merge_request) } - - context 'for notes', :js do - describe 'the status of the author of a note on a merge request' do - let(:note) { create(:note, noteable: merge_request, project: project, author: create(:user)) } - - it_behaves_like 'showing user status' do - let(:user_with_status) { note.author } - end - end - - describe 'the status of the author of a diff note on a merge request' do - let(:note) { create(:diff_note_on_merge_request, noteable: merge_request, project: project, author: create(:user)) } - - it_behaves_like 'showing user status' do - let(:user_with_status) { note.author } - end - end - end -end diff --git a/spec/features/milestone_spec.rb b/spec/features/milestone_spec.rb index 2a1ea1a4e73..98d623902a5 100644 --- a/spec/features/milestone_spec.rb +++ b/spec/features/milestone_spec.rb @@ -23,11 +23,17 @@ RSpec.describe 'Milestone' do fill_in "milestone_due_date", with: '2016-12-16' end - find('input[name="commit"]').click + click_button 'Create milestone' expect(find('[data-testid="no-issues-alert"]')).to have_content('Assign some issues to this milestone.') expect(page).to have_content('Nov 16, 2016–Dec 16, 2016') end + + it 'passes redirect_path through to form' do + visit new_project_milestone_path(project, redirect_path: 'new_release') + + expect(find('#redirect_path', visible: :all)[:value]).to eq('new_release') + end end describe 'Open a milestone with closed issues' do @@ -49,7 +55,7 @@ RSpec.describe 'Milestone' do page.within '.milestone-form' do fill_in "milestone_title", with: milestone.title end - find('input[name="commit"]').click + click_button 'Create milestone' expect(find('.gl-alert-danger')).to have_content('already being used for another group or project milestone.') end @@ -62,7 +68,7 @@ RSpec.describe 'Milestone' do page.within '.milestone-form' do fill_in "milestone_title", with: milestone.title end - find('input[name="commit"]').click + click_button 'Create milestone' expect(find('.gl-alert-danger')).to have_content('already being used for another group or project milestone.') end diff --git a/spec/features/milestones/user_creates_milestone_spec.rb b/spec/features/milestones/user_creates_milestone_spec.rb index dd377aa4a26..1ab231632fb 100644 --- a/spec/features/milestones/user_creates_milestone_spec.rb +++ b/spec/features/milestones/user_creates_milestone_spec.rb @@ -3,29 +3,100 @@ require 'spec_helper' RSpec.describe "User creates milestone", :js do - let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project) } + let_it_be(:developer) { create(:user) } + let_it_be(:inherited_guest) { create(:user) } + let_it_be(:inherited_developer) { create(:user) } + let_it_be(:group) { create(:group, :public) } + + shared_examples 'creates milestone' do + specify do + title = "v2.3" + + fill_in("Title", with: title) + fill_in("Description", with: "# Description header") + click_button("Create milestone") + + expect(page).to have_content(title) + .and have_content("Issues") + .and have_header_with_correct_id_and_link(1, "Description header", "description-header") + + visit(activity_project_path(project)) + + expect(page).to have_content("#{user.name} #{user.to_reference} opened milestone") + end + end + + shared_examples 'renders not found' do + specify do + expect(page).to have_title('Not Found') + expect(page).to have_content('Page Not Found') + end + end + + before_all do + group.add_guest(inherited_guest) + group.add_developer(inherited_developer) + end before do - project.add_developer(user) sign_in(user) - visit(new_project_milestone_path(project)) end - it "creates milestone" do - title = "v2.3" + context 'when project is public' do + let_it_be(:project) { create(:project, :public, group: group) } + + context 'and issues and merge requests are private' do + before_all do + project.project_feature.update!( + issues_access_level: ProjectFeature::PRIVATE, + merge_requests_access_level: ProjectFeature::PRIVATE + ) + end + + context 'when user is an inherited member from the group' do + context 'and user is a guest' do + let(:user) { inherited_guest } + + it_behaves_like 'renders not found' + end + + context 'and user is a developer' do + let(:user) { inherited_developer } + + it_behaves_like 'creates milestone' + end + end + end + end + + context 'when project is private' do + let_it_be(:project) { create(:project, :private, group: group) } + + context 'and user is a direct project member' do + before_all do + project.add_developer(developer) + end + + context 'when user is a developer' do + let(:user) { developer } + + it_behaves_like 'creates milestone' + end + end - fill_in("Title", with: title) - fill_in("Description", with: "# Description header") - click_button("Create milestone") + context 'and user is an inherited member from the group' do + context 'when user is a guest' do + let(:user) { inherited_guest } - expect(page).to have_content(title) - .and have_content("Issues") - .and have_header_with_correct_id_and_link(1, "Description header", "description-header") + it_behaves_like 'renders not found' + end - visit(activity_project_path(project)) + context 'when user is a developer' do + let(:user) { inherited_developer } - expect(page).to have_content("#{user.name} #{user.to_reference} opened milestone") + it_behaves_like 'creates milestone' + end + end end end diff --git a/spec/features/oauth_registration_spec.rb b/spec/features/oauth_registration_spec.rb index cb8343b8065..0a35b5a7e42 100644 --- a/spec/features/oauth_registration_spec.rb +++ b/spec/features/oauth_registration_spec.rb @@ -3,126 +3,139 @@ require 'spec_helper' RSpec.describe 'OAuth Registration', :js, :allow_forgery_protection do - include DeviseHelpers include LoginHelpers include TermsHelper using RSpec::Parameterized::TableSyntax + let(:uid) { 'my-uid' } + let(:email) { 'user@example.com' } + around do |example| with_omniauth_full_host { example.run } end - context 'when the user registers using single-sign on provider' do - let(:uid) { 'my-uid' } - let(:email) { 'user@example.com' } - - where(:provider, :additional_info) do - :github | {} - :twitter | {} - :bitbucket | {} - :gitlab | {} - :google_oauth2 | {} - :facebook | {} - :cas3 | {} - :auth0 | {} - :authentiq | {} - :salesforce | { extra: { email_verified: true } } - :dingtalk | {} - :alicloud | {} + where(:provider, :additional_info) do + :github | {} + :twitter | {} + :bitbucket | {} + :gitlab | {} + :google_oauth2 | {} + :facebook | {} + :cas3 | {} + :auth0 | {} + :authentiq | {} + :salesforce | { extra: { email_verified: true } } + :dingtalk | {} + :alicloud | {} + end + + with_them do + before do + stub_omniauth_provider(provider) + stub_feature_flags(update_oauth_registration_flow: true) end - with_them do + context 'when block_auto_created_users is true' do before do - stub_omniauth_provider(provider) - stub_feature_flags(update_oauth_registration_flow: true) + stub_omniauth_setting(block_auto_created_users: true) end - context 'when block_auto_created_users is true' do - before do - stub_omniauth_setting(block_auto_created_users: true) - end + it 'redirects back to the sign-in page' do + register_via(provider, uid, email, additional_info: additional_info) - it 'redirects back to the sign-in page' do - register_via(provider, uid, email, additional_info: additional_info) + expect(page).to have_current_path new_user_session_path + expect(page).to have_content('Your account is pending approval') + end + end - expect(page).to have_current_path new_user_session_path - expect(page).to have_content('Your account is pending approval') - end + context 'when block_auto_created_users is false' do + before do + stub_omniauth_setting(block_auto_created_users: false) + end + + it 'redirects to the initial welcome path' do + register_via(provider, uid, email, additional_info: additional_info) + + expect(page).to have_current_path users_sign_up_welcome_path + expect(page).to have_content('Welcome to GitLab, mockuser!') end - context 'when block_auto_created_users is false' do + context 'when terms are enforced' do before do - stub_omniauth_setting(block_auto_created_users: false) + enforce_terms end - it 'redirects to the initial welcome path' do + it 'auto accepts terms and redirects to the initial welcome path' do register_via(provider, uid, email, additional_info: additional_info) expect(page).to have_current_path users_sign_up_welcome_path expect(page).to have_content('Welcome to GitLab, mockuser!') end + end - context 'when terms are enforced' do - before do - enforce_terms - end + context 'when provider does not send a verified email address' do + let(:email) { 'temp-email-for-oauth@email.com' } - it 'auto accepts terms and redirects to the initial welcome path' do - register_via(provider, uid, email, additional_info: additional_info) + it 'redirects to the profile path' do + register_via(provider, uid, email, additional_info: additional_info) - expect(page).to have_current_path users_sign_up_welcome_path - expect(page).to have_content('Welcome to GitLab, mockuser!') - end + expect(page).to have_current_path profile_path + expect(page).to have_content('Please complete your profile with email address') end + end - context 'when provider does not send a verified email address' do - let(:email) { 'temp-email-for-oauth@email.com' } + context 'when registering via an invitation email' do + let_it_be(:owner) { create(:user) } + let_it_be(:group) { create(:group, name: 'Owned') } + let_it_be(:project) { create(:project, :repository, namespace: group) } + + let(:invite_email) { generate(:email) } + let(:extra_params) { { invite_type: Emails::Members::INITIAL_INVITE } } + let(:group_invite) do + create( + :group_member, :invited, + group: group, + invite_email: invite_email, + created_by: owner + ) + end - it 'redirects to the profile path' do - register_via(provider, uid, email, additional_info: additional_info) + before do + project.add_maintainer(owner) + group.add_owner(owner) + group_invite.generate_invite_token! - expect(page).to have_current_path profile_path - expect(page).to have_content('Please complete your profile with email address') - end + mock_auth_hash(provider, uid, invite_email, additional_info: additional_info) end - context 'when registering via an invitation email' do - let_it_be(:owner) { create(:user) } - let_it_be(:group) { create(:group, name: 'Owned') } - let_it_be(:project) { create(:project, :repository, namespace: group) } - - let(:invite_email) { generate(:email) } - let(:extra_params) { { invite_type: Emails::Members::INITIAL_INVITE } } - let(:group_invite) do - create( - :group_member, :invited, - group: group, - invite_email: invite_email, - created_by: owner - ) - end - - before do - project.add_maintainer(owner) - group.add_owner(owner) - group_invite.generate_invite_token! - - 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 - visit invite_path(group_invite.raw_invite_token, extra_params) - click_link_or_button "oauth-login-#{provider}" - fill_in_welcome_form - - 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) - end + it 'redirects to the activity 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}" + fill_in_welcome_form + + 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) end end end end + context 'when update_oauth_registration_flow is disabled' do + before do + stub_omniauth_provider(:github) + stub_omniauth_setting(block_auto_created_users: false) + stub_feature_flags(update_oauth_registration_flow: false) + + enforce_terms + end + + it 'presents the terms page' do + register_via(:github, uid, email) + + expect(page).to have_content('These are the terms') + end + end + def fill_in_welcome_form select 'Software Developer', from: 'user_role' click_button 'Get started!' diff --git a/spec/features/profiles/password_spec.rb b/spec/features/profiles/password_spec.rb index 1d0db488751..6c860740354 100644 --- a/spec/features/profiles/password_spec.rb +++ b/spec/features/profiles/password_spec.rb @@ -51,11 +51,11 @@ RSpec.describe 'Profile > Password' do end context 'Password authentication unavailable' do - before do - gitlab_sign_in(user) - end - context 'Regular user' do + before do + gitlab_sign_in(user) + end + let(:user) { create(:user) } it 'renders 404 when password authentication is disabled for the web interface and Git' do @@ -69,7 +69,22 @@ RSpec.describe 'Profile > Password' do end context 'LDAP user' do + include LdapHelpers + + let(:ldap_settings) { { enabled: true } } let(:user) { create(:omniauth_user, provider: 'ldapmain') } + let(:provider) { 'ldapmain' } + let(:provider_label) { 'Main LDAP' } + + before do + stub_ldap_setting(ldap_settings) + stub_ldap_access(user, provider, provider_label) + sign_in_using_ldap!(user, provider_label, provider) + end + + after(:all) do + Rails.application.reload_routes! + end it 'renders 404' do visit edit_profile_password_path diff --git a/spec/features/profiles/two_factor_auths_spec.rb b/spec/features/profiles/two_factor_auths_spec.rb index 9a58950b8f3..b4355f2d669 100644 --- a/spec/features/profiles/two_factor_auths_spec.rb +++ b/spec/features/profiles/two_factor_auths_spec.rb @@ -6,6 +6,8 @@ RSpec.describe 'Two factor auths' do include Spec::Support::Helpers::ModalHelpers context 'when signed in' do + let(:invalid_current_pwd_msg) { 'You must provide a valid current password' } + before do sign_in(user) end @@ -18,7 +20,7 @@ RSpec.describe 'Two factor auths' do register_2fa(user.current_otp, '123') - expect(page).to have_content('You must provide a valid current password') + expect(page).to have_selector('.gl-alert-title', text: invalid_current_pwd_msg, count: 1) register_2fa(user.reload.current_otp, user.password) @@ -76,7 +78,7 @@ RSpec.describe 'Two factor auths' do click_button 'Disable' end - expect(page).to have_content('You must provide a valid current password') + expect(page).to have_selector('.gl-alert-title', text: invalid_current_pwd_msg, count: 1) fill_in 'current_password', with: user.password @@ -97,7 +99,7 @@ RSpec.describe 'Two factor auths' do click_button 'Regenerate recovery codes' - expect(page).to have_content('You must provide a valid current password') + expect(page).to have_selector('.gl-alert-title', text: invalid_current_pwd_msg, count: 1) fill_in 'current_password', with: user.password diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb index d887a367fcb..56a70f37779 100644 --- a/spec/features/profiles/user_edit_profile_spec.rb +++ b/spec/features/profiles/user_edit_profile_spec.rb @@ -5,10 +5,9 @@ require 'spec_helper' RSpec.describe 'User edit profile' do include Spec::Support::Helpers::Features::NotesHelpers - let(:user) { create(:user) } + let_it_be(:user) { create(:user) } before do - stub_feature_flags(remove_user_attributes_projects: false) sign_in(user) visit(profile_path) end @@ -456,6 +455,8 @@ RSpec.describe 'User edit profile' do end context 'Remove status button' do + let(:user) { create(:user) } + before do user.status = UserStatus.new(message: 'Eating bread', emoji: 'stuffed_flatbread') @@ -495,45 +496,6 @@ RSpec.describe 'User edit profile' do expect(page).to have_emoji('speech_balloon') end - - context 'note header' do - let(:project) { create(:project_empty_repo, :public) } - let(:issue) { create(:issue, project: project) } - let(:emoji) { "stuffed_flatbread" } - - before do - project.add_guest(user) - create(:user_status, user: user, message: 'Taking notes', emoji: emoji) - - visit(project_issue_path(project, issue)) - - add_note("This is a comment") - visit(project_issue_path(project, issue)) - - wait_for_requests - end - - it 'displays the status emoji' do - first_note = page.find_all(".main-notes-list .timeline-entry").first - - expect(first_note).to have_emoji(emoji) - end - - it 'clears the status emoji' do - open_edit_status_modal - - page.within "#set-user-status-modal" do - click_button 'Remove status' - end - - visit(project_issue_path(project, issue)) - wait_for_requests - - first_note = page.find_all(".main-notes-list .timeline-entry").first - - expect(first_note).not_to have_css('.user-status-emoji') - end - end end context 'User time preferences', :js do @@ -551,13 +513,13 @@ RSpec.describe 'User edit profile' do it 'allows the user to select a time zone from a dropdown list of options' do expect(page.find('.user-time-preferences .dropdown')).not_to have_css('.show') - page.find('.user-time-preferences .js-timezone-dropdown').click + page.find('.user-time-preferences .dropdown').click expect(page.find('.user-time-preferences .dropdown')).to have_css('.show') - page.find("a", text: "Nuku'alofa").click + page.find("button", text: "Arizona").click - expect(page).to have_field(:user_timezone, with: 'Pacific/Tongatapu', type: :hidden) + expect(page).to have_field(:user_timezone, with: 'America/Phoenix', type: :hidden) end it 'timezone defaults to empty' do diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb index 13a4c1b5912..93e5be18229 100644 --- a/spec/features/projects/blobs/blob_show_spec.rb +++ b/spec/features/projects/blobs/blob_show_spec.rb @@ -675,7 +675,7 @@ RSpec.describe 'File blob', :js do expect(page).to have_content('This project is licensed under the MIT License.') # shows a learn more link - expect(page).to have_link('Learn more', href: 'http://choosealicense.com/licenses/mit/') + expect(page).to have_link('Learn more', href: 'https://opensource.org/licenses/MIT') end end end diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb index f198a1f42e2..5587b8abab3 100644 --- a/spec/features/projects/blobs/edit_spec.rb +++ b/spec/features/projects/blobs/edit_spec.rb @@ -7,8 +7,8 @@ RSpec.describe 'Editing file blob', :js do include TreeHelper include BlobSpecHelpers - let(:project) { create(:project, :public, :repository) } - let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master') } + let_it_be(:project) { create(:project, :public, :repository) } + let_it_be(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master') } let(:branch) { 'master' } let(:file_path) { project.repository.ls_files(project.repository.root_ref)[1] } let(:readme_file_path) { 'README.md' } @@ -82,6 +82,34 @@ RSpec.describe 'Editing file blob', :js do end end + context 'blob edit toolbar' do + toolbar_buttons = [ + "Add bold text", + "Add italic text", + "Add strikethrough text", + "Insert a quote", + "Insert code", + "Add a link", + "Add a bullet list", + "Add a numbered list", + "Add a checklist", + "Add a collapsible section", + "Add a table" + ] + + before do + visit project_edit_blob_path(project, tree_join(branch, readme_file_path)) + end + + it "has defined set of toolbar buttons" do + buttons = page.all('.file-buttons .md-header-toolbar button[type="button"]') + expect(buttons.length).to eq(toolbar_buttons.length) + toolbar_buttons.each_with_index do |button_title, i| + expect(buttons[i]['title']).to include(button_title) + end + end + end + context 'from blob file path' do before do visit project_blob_path(project, tree_join(branch, file_path)) @@ -156,11 +184,14 @@ RSpec.describe 'Editing file blob', :js do end context 'as developer' do - let(:user) { create(:user) } + let_it_be(:user) { create(:user) } let(:protected_branch) { 'protected-branch' } - before do + before_all do project.add_developer(user) + end + + before do project.repository.add_branch(user, protected_branch, 'master') create(:protected_branch, project: project, name: protected_branch) sign_in(user) diff --git a/spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb b/spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb deleted file mode 100644 index d2774aa74c9..00000000000 --- a/spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'User creates new blob', :js do - include WebIdeSpecHelpers - - let(:user) { create(:user) } - let(:project) { create(:project, :empty_repo) } - - before do - stub_feature_flags(vscode_web_ide: false) - end - - shared_examples 'creating a file' do - it 'allows the user to add a new file in Web IDE' do - visit project_path(project) - - click_link 'New file' - - wait_for_requests - - ide_create_new_file('dummy-file', content: "Hello world\n") - - ide_commit - - expect(page).to have_content('All changes are committed') - expect(project.repository.blob_at('master', 'dummy-file').data).to eql("Hello world\n") - end - end - - describe 'as a maintainer' do - before do - project.add_maintainer(user) - sign_in(user) - end - - it_behaves_like 'creating a file' - end - - describe 'as an admin' do - let(:user) { create(:user, :admin) } - - before do - sign_in(user) - gitlab_enable_admin_mode_sign_in(user) - end - - it_behaves_like 'creating a file' - end - - describe 'as a developer' do - before do - project.add_developer(user) - sign_in(user) - visit project_path(project) - end - - it 'does not allow pushing to the default branch' do - expect(page).not_to have_content('New file') - end - end -end diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb index 727f9aa486e..361a07ebd0b 100644 --- a/spec/features/projects/branches_spec.rb +++ b/spec/features/projects/branches_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' RSpec.describe 'Branches' do - let(:user) { create(:user) } - let(:project) { create(:project, :public, :repository) } + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :public, :repository) } let(:repository) { project.repository } context 'logged in as developer' do @@ -175,7 +175,7 @@ RSpec.describe 'Branches' do search_for_branch('fix') expect(page).not_to have_content('fix') - expect(all('.all-branches').last).to have_selector('li', count: 0) + expect(all('.all-branches', wait: false).last).to have_selector('li', count: 0) end end @@ -233,7 +233,7 @@ RSpec.describe 'Branches' do end context 'with one or more pipeline', :js do - let(:project) { create(:project, :public, :empty_repo) } + let_it_be(:project) { create(:project, :public, :empty_repo) } before do sha = create_file(branch_name: "branch") diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb index 8197fe46c7b..c96d5f5823f 100644 --- a/spec/features/projects/ci/editor_spec.rb +++ b/spec/features/projects/ci/editor_spec.rb @@ -135,6 +135,19 @@ RSpec.describe 'Pipeline Editor', :js do end end + describe 'Commit Form' do + it 'is preserved when changing tabs' do + find('#commit-message').set('message', clear: :backspace) + find('#source-branch-field').set('new_branch', clear: :backspace) + + click_link 'Validate' + click_link 'Edit' + + expect(find('#commit-message').value).to eq('message') + expect(find('#source-branch-field').value).to eq('new_branch') + end + end + describe 'Editor content' do it 'user can reset their CI configuration' do page.within('#source-editor-') do diff --git a/spec/features/projects/ci/lint_spec.rb b/spec/features/projects/ci/lint_spec.rb index 608511ae5a5..8d5f62d8a06 100644 --- a/spec/features/projects/ci/lint_spec.rb +++ b/spec/features/projects/ci/lint_spec.rb @@ -5,13 +5,16 @@ require 'spec_helper' RSpec.describe 'CI Lint', :js do include Spec::Support::Helpers::Features::SourceEditorSpecHelpers - let(:project) { create(:project, :repository) } - let(:user) { create(:user) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:user) { create(:user) } let(:content_selector) { '.content .view-lines' } - before do + before_all do project.add_developer(user) + end + + before do sign_in(user) visit project_ci_lint_path(project) diff --git a/spec/features/projects/environments/environment_metrics_spec.rb b/spec/features/projects/environments/environment_metrics_spec.rb index bf0949443de..d486d8cf551 100644 --- a/spec/features/projects/environments/environment_metrics_spec.rb +++ b/spec/features/projects/environments/environment_metrics_spec.rb @@ -6,7 +6,7 @@ RSpec.describe 'Environment > Metrics' do include PrometheusHelpers let(:user) { create(:user) } - let(:project) { create(:prometheus_project, :repository) } + let(:project) { create(:project, :with_prometheus_integration, :repository) } let(:pipeline) { create(:ci_pipeline, project: project) } let(:build) { create(:ci_build, pipeline: pipeline) } let(:environment) { create(:environment, project: project) } diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb index be4b21dfff4..dc6e496d081 100644 --- a/spec/features/projects/environments/environment_spec.rb +++ b/spec/features/projects/environments/environment_spec.rb @@ -97,6 +97,10 @@ RSpec.describe 'Environment' do it 'does show deployments' do expect(page).to have_link("#{build.name} (##{build.id})") end + + it 'shows a tooltip on the job name' do + expect(page).to have_css("[title=\"#{build.name} (##{build.id})\"].has-tooltip") + end end context 'when there is a failed deployment' do diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb index b8c127f0078..24943e7dd0f 100644 --- a/spec/features/projects/fork_spec.rb +++ b/spec/features/projects/fork_spec.rb @@ -118,17 +118,28 @@ RSpec.describe 'Project fork' do end end + shared_examples "increments the fork counter on the source project's page" do + specify :sidekiq_might_not_need_inline do + create_forks + + visit project_path(project) + + expect(page).to have_css('.fork-count', text: 2) + end + end + it_behaves_like 'fork button on project page' it_behaves_like 'create fork page', 'Fork project' context 'fork form', :js do let(:group) { create(:group) } + let(:group2) { create(:group) } let(:user) { create(:group_member, :maintainer, user: create(:user), group: group ).user } - def submit_form + def submit_form(group_obj = group) find('[data-testid="select_namespace_dropdown"]').click - find('[data-testid="select_namespace_dropdown_search_field"]').fill_in(with: group.name) - click_button group.name + find('[data-testid="select_namespace_dropdown_search_field"]').fill_in(with: group_obj.name) + click_button group_obj.name click_button 'Fork project' end @@ -166,5 +177,41 @@ RSpec.describe 'Project fork' do expect(page).to have_content("#{group.name} / #{fork_name}") end end + + context 'with cache_home_panel feature flag' do + before do + create(:group_member, :maintainer, user: user, group: group2 ) + end + + context 'when caching is enabled' do + before do + stub_feature_flags(cache_home_panel: project) + end + + it_behaves_like "increments the fork counter on the source project's page" + end + + context 'when caching is disabled' do + before do + stub_feature_flags(cache_home_panel: false) + end + + it_behaves_like "increments the fork counter on the source project's page" + end + end end end + +private + +def create_fork(group_obj = group) + visit project_path(project) + find('.fork-btn').click + submit_form(group_obj) + wait_for_requests +end + +def create_forks + create_fork + create_fork(group2) +end diff --git a/spec/features/projects/infrastructure_registry_spec.rb b/spec/features/projects/infrastructure_registry_spec.rb index 27d0866bc69..aab1cec8762 100644 --- a/spec/features/projects/infrastructure_registry_spec.rb +++ b/spec/features/projects/infrastructure_registry_spec.rb @@ -57,7 +57,7 @@ RSpec.describe 'Infrastructure Registry' do it 'allows you to delete a module', :aggregate_failures do # this is still using the package copy in the UI too click_button('Remove package') - click_button('Delete package') + click_button('Permanently delete') expect(page).to have_content 'Package deleted successfully' expect(page).not_to have_content(terraform_module.name) diff --git a/spec/features/projects/labels/sort_labels_spec.rb b/spec/features/projects/labels/sort_labels_spec.rb index ecbc4b524dc..f2f1acd2348 100644 --- a/spec/features/projects/labels/sort_labels_spec.rb +++ b/spec/features/projects/labels/sort_labels_spec.rb @@ -28,7 +28,7 @@ RSpec.describe 'Sort labels', :js do it 'sorts by date' do click_button 'Name' - sort_options = find('ul.dropdown-menu').all('li').collect(&:text) + sort_options = find('ul[role="listbox"]').all('li').collect(&:text) expect(sort_options[0]).to eq('Name') expect(sort_options[1]).to eq('Name, descending') @@ -37,7 +37,7 @@ RSpec.describe 'Sort labels', :js do expect(sort_options[4]).to eq('Updated date') expect(sort_options[5]).to eq('Oldest updated') - click_button 'Name, descending' + find('li', text: 'Name, descending').click # assert default sorting within '.other-labels' do diff --git a/spec/features/projects/milestones/milestones_sorting_spec.rb b/spec/features/projects/milestones/milestones_sorting_spec.rb index c47350fb663..5ba4289fd11 100644 --- a/spec/features/projects/milestones/milestones_sorting_spec.rb +++ b/spec/features/projects/milestones/milestones_sorting_spec.rb @@ -42,10 +42,10 @@ RSpec.describe 'Milestones sorting', :js do milestones_for_sort_by.each do |sort_by, expected_milestones| within '[data-testid=milestone_sort_by_dropdown]' do click_button selected_sort_order - milestones = find('.gl-new-dropdown-contents').all('.gl-new-dropdown-item-text-wrapper p').map(&:text) + milestones = find('ul[role="listbox"]').all('li').map(&:text) expect(milestones).to eq(ordered_milestones) - click_button sort_by + find('li', text: sort_by).click expect(page).to have_button(sort_by) end diff --git a/spec/features/projects/packages_spec.rb b/spec/features/projects/packages_spec.rb index f518cc1fc63..bbe913cf1e5 100644 --- a/spec/features/projects/packages_spec.rb +++ b/spec/features/projects/packages_spec.rb @@ -49,7 +49,7 @@ RSpec.describe 'Packages' do it 'allows you to delete a package' do find('[data-testid="delete-dropdown"]').click find('[data-testid="action-delete"]').click - click_button('Delete package') + click_button('Permanently delete') expect(page).to have_content 'Package deleted successfully' expect(page).not_to have_content(package.name) diff --git a/spec/features/projects/pipeline_schedules_spec.rb b/spec/features/projects/pipeline_schedules_spec.rb index dcc46f5d223..4ed0a11da38 100644 --- a/spec/features/projects/pipeline_schedules_spec.rb +++ b/spec/features/projects/pipeline_schedules_spec.rb @@ -11,6 +11,10 @@ RSpec.describe 'Pipeline Schedules', :js do let(:scope) { nil } let!(:user) { create(:user) } + before do + stub_feature_flags(pipeline_schedules_vue: false) + end + context 'logged in as the pipeline schedule owner' do before do project.add_developer(user) diff --git a/spec/features/projects/pipelines/legacy_pipeline_spec.rb b/spec/features/projects/pipelines/legacy_pipeline_spec.rb index 250a336469c..d93c951791d 100644 --- a/spec/features/projects/pipelines/legacy_pipeline_spec.rb +++ b/spec/features/projects/pipelines/legacy_pipeline_spec.rb @@ -735,6 +735,8 @@ RSpec.describe 'Pipeline', :js do end it 'displays the PipelineSchedule in an inactive state' do + stub_feature_flags(pipeline_schedules_vue: false) + visit project_pipeline_schedules_path(project) page.click_link('Inactive') diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb index 51a6fbc4d36..0b43e13996f 100644 --- a/spec/features/projects/pipelines/pipeline_spec.rb +++ b/spec/features/projects/pipelines/pipeline_spec.rb @@ -860,6 +860,8 @@ RSpec.describe 'Pipeline', :js do end it 'displays the PipelineSchedule in an inactive state' do + stub_feature_flags(pipeline_schedules_vue: false) + visit project_pipeline_schedules_path(project) page.click_link('Inactive') diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 404e51048bc..1190b0f3558 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -673,7 +673,7 @@ RSpec.describe 'Pipelines', :js do end context 'when variables are specified' do - it 'creates a new pipeline with variables' do + it 'creates a new pipeline with variables', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/375552' do page.within(find("[data-testid='ci-variable-row']")) do find("[data-testid='pipeline-form-ci-variable-key']").set('key_name') find("[data-testid='pipeline-form-ci-variable-value']").set('value') @@ -701,7 +701,7 @@ RSpec.describe 'Pipelines', :js do it { expect(page).to have_content('Missing CI config file') } - it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file is available when trying again' do + it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file is available when trying again', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/375552' do stub_ci_pipeline_to_return_yaml_file expect do diff --git a/spec/features/projects/releases/user_creates_release_spec.rb b/spec/features/projects/releases/user_creates_release_spec.rb index d82c4229b71..4eb7581222e 100644 --- a/spec/features/projects/releases/user_creates_release_spec.rb +++ b/spec/features/projects/releases/user_creates_release_spec.rb @@ -11,6 +11,7 @@ RSpec.describe 'User creates release', :js do let_it_be(:user) { create(:user) } let(:new_page_url) { new_project_release_path(project) } + let(:tag_name) { 'new-tag' } before do project.add_developer(user) @@ -33,6 +34,8 @@ RSpec.describe 'User creates release', :js do end it 'defaults the "Create from" dropdown to the project\'s default branch' do + select_new_tag_name(tag_name) + expect(page.find('[data-testid="create-from-field"] .ref-selector button')).to have_content(project.default_branch) end diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb index 63e0ee4a251..d9bdbf7aa1a 100644 --- a/spec/features/projects/settings/repository_settings_spec.rb +++ b/spec/features/projects/settings/repository_settings_spec.rb @@ -25,7 +25,7 @@ RSpec.describe 'Projects > Settings > Repository settings' do context 'for maintainer' do let(:role) { :maintainer } - context 'Deploy tokens' do + context 'Deploy tokens', :js do let!(:deploy_token) { create(:deploy_token, projects: [project]) } before do 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 84e6c50cf61..508bbcc5327 100644 --- a/spec/features/projects/settings/user_changes_default_branch_spec.rb +++ b/spec/features/projects/settings/user_changes_default_branch_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe 'Projects > Settings > User changes default branch' do - include Select2Helper - let(:user) { create(:user) } before do @@ -17,16 +15,21 @@ RSpec.describe 'Projects > Settings > User changes default branch' do let(:project) { create(:project, :repository, namespace: user.namespace) } it 'allows to change the default branch', :js do + dropdown_selector = '[data-testid="default-branch-dropdown"]' # Otherwise, running JS may overwrite our change to project_default_branch wait_for_requests - select2('fix', from: '#project_default_branch') + expect(page).to have_selector(dropdown_selector) + find(dropdown_selector).click + + fill_in 'Search branch', with: 'fix' + click_button 'fix' page.within '#default-branch-settings' do click_button 'Save changes' end - expect(find('#project_default_branch', visible: false).value).to eq 'fix' + expect(find("#{dropdown_selector} input", visible: false).value).to eq 'fix' end end @@ -34,7 +37,7 @@ RSpec.describe 'Projects > Settings > User changes default branch' do let(:project) { create(:project_empty_repo, namespace: user.namespace) } it 'does not show default branch selector' do - expect(page).not_to have_selector('#project_default_branch') + expect(page).not_to have_selector('[data-testid="default-branch-dropdown"]') end end end diff --git a/spec/features/projects/settings/user_transfers_a_project_spec.rb b/spec/features/projects/settings/user_transfers_a_project_spec.rb index 6041dca305b..23e10a36cee 100644 --- a/spec/features/projects/settings/user_transfers_a_project_spec.rb +++ b/spec/features/projects/settings/user_transfers_a_project_spec.rb @@ -8,7 +8,7 @@ RSpec.describe 'Projects > Settings > User transfers a project', :js do let(:group) { create(:group) } before do - stub_const('Gitlab::QueryLimiting::Transaction::THRESHOLD', 120) + allow(Gitlab::QueryLimiting::Transaction).to receive(:threshold).and_return(120) group.add_owner(user) sign_in(user) diff --git a/spec/features/projects/settings/webhooks_settings_spec.rb b/spec/features/projects/settings/webhooks_settings_spec.rb index d525544ac15..25752bcaf45 100644 --- a/spec/features/projects/settings/webhooks_settings_spec.rb +++ b/spec/features/projects/settings/webhooks_settings_spec.rb @@ -48,10 +48,10 @@ RSpec.describe 'Projects > Settings > Webhook Settings' do expect(page).to have_content('Releases events') end - it 'create webhook' do + it 'create webhook', :js do visit webhooks_path - fill_in 'hook_url', with: url + fill_in 'URL', with: url check 'Tag push events' fill_in 'hook_push_events_branch_filter', with: 'master' check 'Enable SSL verification' @@ -66,12 +66,12 @@ RSpec.describe 'Projects > Settings > Webhook Settings' do expect(page).to have_content('Job events') end - it 'edit existing webhook' do + it 'edit existing webhook', :js do hook visit webhooks_path click_link 'Edit' - fill_in 'hook_url', with: url + fill_in 'URL', with: url check 'Enable SSL verification' click_button 'Save changes' diff --git a/spec/features/projects/show/user_interacts_with_stars_spec.rb b/spec/features/projects/show/user_interacts_with_stars_spec.rb index e0dd4f65010..158b6aa9b46 100644 --- a/spec/features/projects/show/user_interacts_with_stars_spec.rb +++ b/spec/features/projects/show/user_interacts_with_stars_spec.rb @@ -13,6 +13,14 @@ RSpec.describe 'Projects > Show > User interacts with project stars' do visit(project_path(project)) end + it 'retains the star count even after a page reload' do + star_project + + reload_page + + expect(page).to have_css('.star-count', text: 1) + end + it 'toggles the star' do star_project @@ -63,6 +71,10 @@ end private +def reload_page + visit current_path +end + def star_project click_button(_('Star')) wait_for_requests diff --git a/spec/features/projects/show/user_sees_collaboration_links_spec.rb b/spec/features/projects/show/user_sees_collaboration_links_spec.rb index 1440db141a6..c63427e56e6 100644 --- a/spec/features/projects/show/user_sees_collaboration_links_spec.rb +++ b/spec/features/projects/show/user_sees_collaboration_links_spec.rb @@ -5,8 +5,8 @@ require 'spec_helper' RSpec.describe 'Projects > Show > Collaboration links', :js do using RSpec::Parameterized::TableSyntax - let(:project) { create(:project, :repository, :public) } - let(:user) { create(:user) } + let_it_be(:project) { create(:project, :repository, :public) } + let_it_be(:user) { create(:user) } before do sign_in(user) @@ -17,7 +17,7 @@ RSpec.describe 'Projects > Show > Collaboration links', :js do end context 'with developer user' do - before do + before_all do project.add_developer(user) end diff --git a/spec/features/projects/user_sorts_projects_spec.rb b/spec/features/projects/user_sorts_projects_spec.rb index b9b28398279..c40f01f3aa1 100644 --- a/spec/features/projects/user_sorts_projects_spec.rb +++ b/spec/features/projects/user_sorts_projects_spec.rb @@ -24,7 +24,6 @@ RSpec.describe 'User sorts projects and order persists' do end it "is set on the group_canonical_path" do - stub_feature_flags(group_overview_tabs_vue: false) visit(group_canonical_path(group)) within '[data-testid=group_sort_by_dropdown]' do @@ -33,7 +32,6 @@ RSpec.describe 'User sorts projects and order persists' do end it "is set on the details_group_path" do - stub_feature_flags(group_overview_tabs_vue: false) visit(details_group_path(group)) within '[data-testid=group_sort_by_dropdown]' do @@ -42,7 +40,7 @@ RSpec.describe 'User sorts projects and order persists' do end end - context "from explore projects" do + context "from explore projects", :js do before do sign_in(user) visit(explore_projects_path) @@ -50,10 +48,10 @@ RSpec.describe 'User sorts projects and order persists' do first(:link, 'Updated date').click end - it_behaves_like "sort order persists across all views", 'Updated date', 'Updated date' + it_behaves_like "sort order persists across all views", 'Updated date', 'Updated' end - context 'from dashboard projects' do + context 'from dashboard projects', :js do before do sign_in(user) visit(dashboard_projects_path) @@ -66,29 +64,29 @@ RSpec.describe 'User sorts projects and order persists' do context 'from group homepage', :js do before do - stub_feature_flags(group_overview_tabs_vue: false) sign_in(user) visit(group_canonical_path(group)) within '[data-testid=group_sort_by_dropdown]' do find('button.gl-dropdown-toggle').click - first(:button, 'Last created').click + first(:button, 'Created').click + wait_for_requests end end - it_behaves_like "sort order persists across all views", "Created date", "Last created" + it_behaves_like "sort order persists across all views", "Created date", "Created" end context 'from group details', :js do before do - stub_feature_flags(group_overview_tabs_vue: false) sign_in(user) visit(details_group_path(group)) within '[data-testid=group_sort_by_dropdown]' do find('button.gl-dropdown-toggle').click - first(:button, 'Most stars').click + first(:button, 'Stars').click + wait_for_requests end end - it_behaves_like "sort order persists across all views", "Stars", "Most stars" + it_behaves_like "sort order persists across all views", "Stars", "Stars" end end diff --git a/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb b/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb index fbb5c24f6e1..db2b3fc2f4b 100644 --- a/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb +++ b/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb @@ -8,7 +8,7 @@ RSpec.describe 'Projects > Wiki > User views wiki in project page' do end context 'when repository is disabled for project' do - let_it_be(:project) do + let(:project) do create(:project, :wiki_repo, :repository_disabled, @@ -17,16 +17,31 @@ RSpec.describe 'Projects > Wiki > User views wiki in project page' do end context 'when wiki homepage contains a link' do - before do - create(:wiki_page, wiki: project.wiki, title: 'home', content: '[some link](other-page)') + shared_examples 'wiki homepage contains a link' do + it 'displays the correct URL for the link' do + visit project_path(project) + expect(page).to have_link( + 'some link', + href: project_wiki_path(project, 'other-page') + ) + end end - it 'displays the correct URL for the link' do - visit project_path(project) - expect(page).to have_link( - 'some link', - href: project_wiki_path(project, 'other-page') - ) + context 'when using markdown' do + before do + create(:wiki_page, wiki: project.wiki, title: 'home', content: '[some link](other-page)') + end + + it_behaves_like 'wiki homepage contains a link' + end + + context 'when using asciidoc' do + before do + create(:wiki_page, wiki: project.wiki, title: 'home', content: 'link:other-page[some link]', + format: :asciidoc) + end + + it_behaves_like 'wiki homepage contains a link' end end end diff --git a/spec/features/protected_branches_spec.rb b/spec/features/protected_branches_spec.rb index 389a51a10e0..174716d646d 100644 --- a/spec/features/protected_branches_spec.rb +++ b/spec/features/protected_branches_spec.rb @@ -183,7 +183,7 @@ RSpec.describe 'Protected Branches', :js do end include_examples 'Deploy keys with protected branches' do - let(:all_dropdown_sections) { %w(Roles Deploy\ Keys) } + let(:all_dropdown_sections) { ['Roles', 'Deploy Keys'] } end end end diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb index 482f3d62f36..cee0910aef7 100644 --- a/spec/features/runners_spec.rb +++ b/spec/features/runners_spec.rb @@ -160,16 +160,6 @@ RSpec.describe 'Runners' do end context 'shared runner text' do - context 'when application settings have no shared_runners_text' do - it 'user sees default shared runners description' do - visit project_runners_path(project) - - page.within("[data-testid='shared-runners-description']") do - expect(page).to have_content('The same shared runner executes code from multiple projects') - end - end - end - context 'when application settings have shared_runners_text' do let(:shared_runners_text) { 'custom **shared** runners description' } let(:shared_runners_html) { 'custom shared runners description' } diff --git a/spec/features/search/user_searches_for_code_spec.rb b/spec/features/search/user_searches_for_code_spec.rb index e2c8708be78..50e6eb66466 100644 --- a/spec/features/search/user_searches_for_code_spec.rb +++ b/spec/features/search/user_searches_for_code_spec.rb @@ -8,6 +8,7 @@ RSpec.describe 'User searches for code' do context 'when signed in' do before do + stub_feature_flags(search_page_vertical_nav: false) project.add_maintainer(user) sign_in(user) end @@ -214,6 +215,7 @@ RSpec.describe 'User searches for code' do let(:project) { create(:project, :public, :repository) } before do + stub_feature_flags(search_page_vertical_nav: false) visit(project_path(project)) end diff --git a/spec/features/search/user_searches_for_comments_spec.rb b/spec/features/search/user_searches_for_comments_spec.rb index 5185a2460dc..a6793bc3aa7 100644 --- a/spec/features/search/user_searches_for_comments_spec.rb +++ b/spec/features/search/user_searches_for_comments_spec.rb @@ -7,6 +7,7 @@ RSpec.describe 'User searches for comments' do let(:user) { create(:user) } before do + stub_feature_flags(search_page_vertical_nav: false) project.add_reporter(user) sign_in(user) diff --git a/spec/features/search/user_searches_for_commits_spec.rb b/spec/features/search/user_searches_for_commits_spec.rb index 2dceda09d7c..4ec2a9e6cff 100644 --- a/spec/features/search/user_searches_for_commits_spec.rb +++ b/spec/features/search/user_searches_for_commits_spec.rb @@ -3,13 +3,12 @@ require 'spec_helper' RSpec.describe 'User searches for commits', :js do - include CycleAnalyticsHelpers - let(:project) { create(:project, :repository) } let(:sha) { '6d394385cf567f80a8fd85055db1ab4c5295806f' } let(:user) { create(:user) } before do + stub_feature_flags(search_page_vertical_nav: false) project.add_reporter(user) sign_in(user) @@ -34,7 +33,12 @@ RSpec.describe 'User searches for commits', :js do context 'when searching by message' do it 'finds a commit and holds on /search page' do - create_commit('Message referencing another sha: "deadbeef"', project, user, 'master') + project.repository.commit_files( + user, + message: 'Message referencing another sha: "deadbeef"', + branch_name: 'master', + actions: [{ action: :create, file_path: 'a/new.file', contents: 'new file' }] + ) submit_search('deadbeef') diff --git a/spec/features/search/user_searches_for_issues_spec.rb b/spec/features/search/user_searches_for_issues_spec.rb index c23a54594d4..51d2f355848 100644 --- a/spec/features/search/user_searches_for_issues_spec.rb +++ b/spec/features/search/user_searches_for_issues_spec.rb @@ -18,6 +18,7 @@ RSpec.describe 'User searches for issues', :js do before do project.add_maintainer(user) sign_in(user) + stub_feature_flags(search_page_vertical_nav: false) visit(search_path) end @@ -110,6 +111,7 @@ RSpec.describe 'User searches for issues', :js do before do stub_feature_flags(block_anonymous_global_searches: false) + stub_feature_flags(search_page_vertical_nav: false) visit(search_path) end @@ -127,6 +129,7 @@ RSpec.describe 'User searches for issues', :js do context 'when block_anonymous_global_searches is enabled' do before do + stub_feature_flags(search_page_vertical_nav: false) visit(search_path) end 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 61c61d793db..a4fbe3a6e59 100644 --- a/spec/features/search/user_searches_for_merge_requests_spec.rb +++ b/spec/features/search/user_searches_for_merge_requests_spec.rb @@ -15,6 +15,7 @@ RSpec.describe 'User searches for merge requests', :js do end before do + stub_feature_flags(search_page_vertical_nav: false) project.add_maintainer(user) sign_in(user) diff --git a/spec/features/search/user_searches_for_milestones_spec.rb b/spec/features/search/user_searches_for_milestones_spec.rb index 61f2e8e0c8f..6773059830c 100644 --- a/spec/features/search/user_searches_for_milestones_spec.rb +++ b/spec/features/search/user_searches_for_milestones_spec.rb @@ -11,6 +11,7 @@ RSpec.describe 'User searches for milestones', :js do before do project.add_maintainer(user) sign_in(user) + stub_feature_flags(search_page_vertical_nav: false) visit(search_path) end diff --git a/spec/features/search/user_searches_for_projects_spec.rb b/spec/features/search/user_searches_for_projects_spec.rb index 562da56275c..5902859d1f5 100644 --- a/spec/features/search/user_searches_for_projects_spec.rb +++ b/spec/features/search/user_searches_for_projects_spec.rb @@ -8,6 +8,7 @@ RSpec.describe 'User searches for projects', :js do context 'when signed out' do context 'when block_anonymous_global_searches is disabled' do before do + stub_feature_flags(search_page_vertical_nav: false) allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit).and_return(1000) allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit_unauthenticated).and_return(1000) stub_feature_flags(block_anonymous_global_searches: false) diff --git a/spec/features/search/user_searches_for_users_spec.rb b/spec/features/search/user_searches_for_users_spec.rb index a5cf12fa068..e21a66fed92 100644 --- a/spec/features/search/user_searches_for_users_spec.rb +++ b/spec/features/search/user_searches_for_users_spec.rb @@ -8,6 +8,7 @@ RSpec.describe 'User searches for users' do let(:user3) { create(:user, username: 'gob_2018', name: 'George Oscar Bluth') } before do + stub_feature_flags(search_page_vertical_nav: false) sign_in(user1) 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 9808383adb7..2e390309022 100644 --- a/spec/features/search/user_searches_for_wiki_pages_spec.rb +++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb @@ -8,6 +8,7 @@ RSpec.describe 'User searches for wiki pages', :js do let!(:wiki_page) { create(:wiki_page, wiki: project.wiki, title: 'directory/title', content: 'Some Wiki content') } before do + stub_feature_flags(search_page_vertical_nav: false) project.add_maintainer(user) sign_in(user) @@ -18,6 +19,10 @@ RSpec.describe 'User searches for wiki pages', :js do include_examples 'search timeouts', 'wiki_blobs' shared_examples 'search wiki blobs' do + before do + stub_feature_flags(search_page_vertical_nav: false) + end + it 'finds a page' do find('[data-testid="project-filter"]').click 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 41288a34fb2..827e3984896 100644 --- a/spec/features/search/user_uses_header_search_field_spec.rb +++ b/spec/features/search/user_uses_header_search_field_spec.rb @@ -17,6 +17,7 @@ RSpec.describe 'User uses header search field', :js do end before do + stub_feature_flags(search_page_vertical_nav: false) allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).and_return(0) allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit).and_return(1000) allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit_unauthenticated).and_return(1000) diff --git a/spec/features/snippets/search_snippets_spec.rb b/spec/features/snippets/search_snippets_spec.rb index 46bc3b7caad..69b9a0aa64d 100644 --- a/spec/features/snippets/search_snippets_spec.rb +++ b/spec/features/snippets/search_snippets_spec.rb @@ -3,6 +3,10 @@ require 'spec_helper' RSpec.describe 'Search Snippets' do + before do + stub_feature_flags(search_page_vertical_nav: false) + end + it 'user searches for snippets by title' do public_snippet = create(:personal_snippet, :public, title: 'Beginning and Middle') private_snippet = create(:personal_snippet, :private, title: 'Middle and End') diff --git a/spec/features/tags/developer_creates_tag_spec.rb b/spec/features/tags/developer_creates_tag_spec.rb index ca76a94092e..5657115fb3c 100644 --- a/spec/features/tags/developer_creates_tag_spec.rb +++ b/spec/features/tags/developer_creates_tag_spec.rb @@ -46,18 +46,6 @@ RSpec.describe 'Developer creates tag' do end end - it 'with multiline release notes parses the release note as Markdown' do - create_tag_in_form(tag: 'v4.0', ref: 'master', desc: "Awesome release notes\n\n- hello\n- world") - - expect(page).to have_current_path( - project_tag_path(project, 'v4.0'), ignore_query: true) - expect(page).to have_content 'v4.0' - page.within '.description' do - expect(page).to have_content 'Awesome release notes' - expect(page).to have_selector('ul li', count: 2) - end - end - it 'opens dropdown for ref', :js do click_link 'New tag' ref_row = find('.form-group:nth-of-type(2) .col-sm-12') @@ -73,19 +61,6 @@ RSpec.describe 'Developer creates tag' do end end - context 'from new tag page' do - before do - visit new_project_tag_path(project) - end - - it 'description has emoji autocomplete', :js do - find('#release_description').native.send_keys('') - fill_in 'release_description', with: ':' - - expect(page).to have_selector('.atwho-view') - end - end - def create_tag_in_form(tag:, ref:, message: nil, desc: nil) click_link 'New tag' fill_in 'tag_name', with: tag diff --git a/spec/features/unsubscribe_links_spec.rb b/spec/features/unsubscribe_links_spec.rb index 5317f586390..12d2f0a9bb6 100644 --- a/spec/features/unsubscribe_links_spec.rb +++ b/spec/features/unsubscribe_links_spec.rb @@ -2,14 +2,15 @@ require 'spec_helper' -RSpec.describe 'Unsubscribe links', :sidekiq_might_not_need_inline do +RSpec.describe 'Unsubscribe links', :sidekiq_inline do include Warden::Test::Helpers - let(:recipient) { create(:user) } - let(:author) { create(:user) } - let(:project) { create(:project, :public) } - let(:params) { { title: 'A bug!', description: 'Fix it!', assignees: [recipient] } } - let(:issue) { Issues::CreateService.new(project: project, current_user: author, params: params, spam_params: nil).execute } + let_it_be(:project) { create(:project, :public) } + let_it_be(:author) { create(:user).tap { |u| project.add_reporter(u) } } + let_it_be(:recipient) { create(:user) } + + let(:params) { { title: 'A bug!', description: 'Fix it!', assignee_ids: [recipient.id] } } + let(:issue) { Issues::CreateService.new(project: project, current_user: author, params: params, spam_params: nil).execute[:issue] } let(:mail) { ActionMailer::Base.deliveries.last } let(:body) { Capybara::Node::Simple.new(mail.default_part_body.to_s) } 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 cbd2d30d726..02f9d57fcfe 100644 --- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb +++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb @@ -31,7 +31,7 @@ RSpec.describe 'User uploads avatar to profile' do wait_for_all_requests - data_uri = find('.avatar-image .avatar')['src'] + data_uri = find('.avatar-image .gl-avatar')['src'] expect(page.find('.header-user-avatar')['src']).to eq data_uri expect(page.find('[data-testid="sidebar-user-avatar"]')['src']).to eq data_uri end diff --git a/spec/features/user_opens_link_to_comment_spec.rb b/spec/features/user_opens_link_to_comment_spec.rb index 3fb1505ff5b..59dea91c666 100644 --- a/spec/features/user_opens_link_to_comment_spec.rb +++ b/spec/features/user_opens_link_to_comment_spec.rb @@ -20,7 +20,7 @@ RSpec.describe 'User opens link to comment', :js do wait_for_requests - expect(find('#discussion-preferences-dropdown')).to have_content('Sort or filter') + expect(find('#discussion-preferences-dropdown')).to have_content(_('Sort or filter')) expect(page).not_to have_content('Something went wrong while fetching comments') # Auto-switching to show all notes shouldn't be persisted diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb index de53e722603..9b1a102f07b 100644 --- a/spec/features/users/signup_spec.rb +++ b/spec/features/users/signup_spec.rb @@ -349,7 +349,6 @@ RSpec.describe 'Signup' do end it 'redirects to step 2 of the signup process, sets the role and redirects back' do - stub_feature_flags(about_your_company_registration_flow: false) visit new_user_registration_path fill_in_signup_form diff --git a/spec/features/work_items/work_item_spec.rb b/spec/features/work_items/work_item_spec.rb new file mode 100644 index 00000000000..686b82de868 --- /dev/null +++ b/spec/features/work_items/work_item_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Work item', :js do + let_it_be(:project) { create(:project, :public) } + let_it_be(:user) { create(:user) } + let_it_be(:work_item) { create(:work_item, project: project) } + + context 'for signed in user' do + before do + project.add_developer(user) + + sign_in(user) + + visit project_work_items_path(project, work_items_path: work_item.id) + end + + context 'in work item description' do + it 'shows GFM autocomplete', :aggregate_failures do + click_button "Edit description" + + find('[aria-label="Description"]').send_keys("@#{user.username}") + + wait_for_requests + + page.within('.atwho-container') do + expect(page).to have_text(user.name) + end + end + end + end +end -- cgit v1.2.3