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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/features')
-rw-r--r--spec/features/abuse_report_spec.rb5
-rw-r--r--spec/features/admin/admin_hooks_spec.rb7
-rw-r--r--spec/features/admin/admin_mode/login_spec.rb6
-rw-r--r--spec/features/admin/admin_runners_spec.rb27
-rw-r--r--spec/features/admin/admin_settings_spec.rb45
-rw-r--r--spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb2
-rw-r--r--spec/features/admin/users/user_spec.rb4
-rw-r--r--spec/features/atom/issues_spec.rb14
-rw-r--r--spec/features/atom/merge_requests_spec.rb14
-rw-r--r--spec/features/atom/topics_spec.rb49
-rw-r--r--spec/features/atom/users_spec.rb36
-rw-r--r--spec/features/boards/boards_spec.rb3
-rw-r--r--spec/features/boards/issue_ordering_spec.rb16
-rw-r--r--spec/features/boards/multi_select_spec.rb16
-rw-r--r--spec/features/boards/new_issue_spec.rb31
-rw-r--r--spec/features/boards/sidebar_assignee_spec.rb5
-rw-r--r--spec/features/boards/sidebar_labels_in_namespaces_spec.rb1
-rw-r--r--spec/features/boards/sidebar_spec.rb2
-rw-r--r--spec/features/boards/user_adds_lists_to_board_spec.rb2
-rw-r--r--spec/features/boards/user_visits_board_spec.rb2
-rw-r--r--spec/features/clusters/create_agent_spec.rb3
-rw-r--r--spec/features/commits_spec.rb39
-rw-r--r--spec/features/dashboard/activity_spec.rb14
-rw-r--r--spec/features/dashboard/datetime_on_tooltips_spec.rb9
-rw-r--r--spec/features/dashboard/issues_filter_spec.rb9
-rw-r--r--spec/features/dashboard/merge_requests_spec.rb55
-rw-r--r--spec/features/dashboard/todos/todos_sorting_spec.rb5
-rw-r--r--spec/features/dashboard/todos/todos_spec.rb25
-rw-r--r--spec/features/discussion_comments/issue_spec.rb3
-rw-r--r--spec/features/error_tracking/user_filters_errors_by_status_spec.rb2
-rw-r--r--spec/features/error_tracking/user_searches_sentry_errors_spec.rb2
-rw-r--r--spec/features/error_tracking/user_sees_error_details_spec.rb2
-rw-r--r--spec/features/error_tracking/user_sees_error_index_spec.rb2
-rw-r--r--spec/features/file_uploads/multipart_invalid_uploads_spec.rb2
-rw-r--r--spec/features/groups/board_spec.rb3
-rw-r--r--spec/features/groups/group_runners_spec.rb15
-rw-r--r--spec/features/groups/milestone_spec.rb8
-rw-r--r--spec/features/groups/milestones/gfm_autocomplete_spec.rb6
-rw-r--r--spec/features/groups/packages_spec.rb2
-rw-r--r--spec/features/groups/participants_autocomplete_spec.rb50
-rw-r--r--spec/features/groups/settings/access_tokens_spec.rb2
-rw-r--r--spec/features/groups_spec.rb8
-rw-r--r--spec/features/help_pages_spec.rb8
-rw-r--r--spec/features/ics/dashboard_issues_spec.rb67
-rw-r--r--spec/features/ics/group_issues_spec.rb11
-rw-r--r--spec/features/ics/project_issues_spec.rb11
-rw-r--r--spec/features/incidents/incident_timeline_events_spec.rb10
-rw-r--r--spec/features/incidents/user_views_incident_spec.rb10
-rw-r--r--spec/features/invites_spec.rb3
-rw-r--r--spec/features/issuables/issuable_list_spec.rb4
-rw-r--r--spec/features/issuables/markdown_references/jira_spec.rb3
-rw-r--r--spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb10
-rw-r--r--spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb7
-rw-r--r--spec/features/issues/filtered_search/filter_issues_spec.rb13
-rw-r--r--spec/features/issues/form_spec.rb4
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb13
-rw-r--r--spec/features/issues/markdown_toolbar_spec.rb16
-rw-r--r--spec/features/issues/note_polling_spec.rb6
-rw-r--r--spec/features/issues/notes_on_issues_spec.rb3
-rw-r--r--spec/features/issues/related_issues_spec.rb4
-rw-r--r--spec/features/issues/service_desk_spec.rb67
-rw-r--r--spec/features/issues/user_comments_on_issue_spec.rb9
-rw-r--r--spec/features/issues/user_creates_branch_and_merge_request_spec.rb20
-rw-r--r--spec/features/issues/user_creates_issue_spec.rb4
-rw-r--r--spec/features/issues/user_edits_issue_spec.rb8
-rw-r--r--spec/features/issues/user_filters_issues_spec.rb12
-rw-r--r--spec/features/issues/user_interacts_with_awards_spec.rb2
-rw-r--r--spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb5
-rw-r--r--spec/features/issues/user_uses_quick_actions_spec.rb2
-rw-r--r--spec/features/labels_hierarchy_spec.rb4
-rw-r--r--spec/features/markdown/keyboard_shortcuts_spec.rb15
-rw-r--r--spec/features/merge_request/maintainer_edits_fork_spec.rb18
-rw-r--r--spec/features/merge_request/user_accepts_merge_request_spec.rb9
-rw-r--r--spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb12
-rw-r--r--spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb2
-rw-r--r--spec/features/merge_request/user_comments_on_diff_spec.rb25
-rw-r--r--spec/features/merge_request/user_creates_merge_request_spec.rb12
-rw-r--r--spec/features/merge_request/user_edits_assignees_sidebar_spec.rb17
-rw-r--r--spec/features/merge_request/user_edits_merge_request_spec.rb4
-rw-r--r--spec/features/merge_request/user_edits_mr_spec.rb6
-rw-r--r--spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb2
-rw-r--r--spec/features/merge_request/user_merges_immediately_spec.rb25
-rw-r--r--spec/features/merge_request/user_merges_merge_request_spec.rb3
-rw-r--r--spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb157
-rw-r--r--spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb201
-rw-r--r--spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb16
-rw-r--r--spec/features/merge_request/user_posts_notes_spec.rb17
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb8
-rw-r--r--spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb22
-rw-r--r--spec/features/merge_request/user_resolves_wip_mr_spec.rb22
-rw-r--r--spec/features/merge_request/user_reverts_merge_request_spec.rb3
-rw-r--r--spec/features/merge_request/user_sees_deployment_widget_spec.rb8
-rw-r--r--spec/features/merge_request/user_sees_diff_spec.rb5
-rw-r--r--spec/features/merge_request/user_sees_discussions_navigation_spec.rb44
-rw-r--r--spec/features/merge_request/user_sees_discussions_spec.rb4
-rw-r--r--spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb90
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb57
-rw-r--r--spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb11
-rw-r--r--spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb20
-rw-r--r--spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb21
-rw-r--r--spec/features/merge_request/user_sees_pipelines_spec.rb25
-rw-r--r--spec/features/merge_request/user_sees_versions_spec.rb24
-rw-r--r--spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb4
-rw-r--r--spec/features/merge_request/user_squashes_merge_request_spec.rb28
-rw-r--r--spec/features/merge_request/user_suggests_changes_on_diff_spec.rb20
-rw-r--r--spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb24
-rw-r--r--spec/features/merge_request/user_uses_quick_actions_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_open_merge_request_spec.rb3
-rw-r--r--spec/features/merge_requests/user_lists_merge_requests_spec.rb87
-rw-r--r--spec/features/merge_requests/user_views_open_merge_requests_spec.rb10
-rw-r--r--spec/features/nav/top_nav_spec.rb2
-rw-r--r--spec/features/participants_autocomplete_spec.rb8
-rw-r--r--spec/features/profiles/user_visits_profile_spec.rb128
-rw-r--r--spec/features/projects/activity/user_sees_activity_spec.rb14
-rw-r--r--spec/features/projects/artifacts/user_downloads_artifacts_spec.rb2
-rw-r--r--spec/features/projects/badges/coverage_spec.rb13
-rw-r--r--spec/features/projects/badges/pipeline_badge_spec.rb2
-rw-r--r--spec/features/projects/blobs/blame_spec.rb2
-rw-r--r--spec/features/projects/blobs/blob_show_spec.rb2
-rw-r--r--spec/features/projects/branches/download_buttons_spec.rb24
-rw-r--r--spec/features/projects/branches_spec.rb23
-rw-r--r--spec/features/projects/ci/editor_spec.rb138
-rw-r--r--spec/features/projects/clusters/gcp_spec.rb2
-rw-r--r--spec/features/projects/clusters/user_spec.rb2
-rw-r--r--spec/features/projects/clusters_spec.rb4
-rw-r--r--spec/features/projects/commit/builds_spec.rb4
-rw-r--r--spec/features/projects/commit/mini_pipeline_graph_spec.rb12
-rw-r--r--spec/features/projects/commits/user_browses_commits_spec.rb10
-rw-r--r--spec/features/projects/compare_spec.rb12
-rw-r--r--spec/features/projects/environments/environment_spec.rb24
-rw-r--r--spec/features/projects/environments/environments_spec.rb68
-rw-r--r--spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb3
-rw-r--r--spec/features/projects/files/download_buttons_spec.rb11
-rw-r--r--spec/features/projects/files/editing_a_file_spec.rb9
-rw-r--r--spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb2
-rw-r--r--spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb2
-rw-r--r--spec/features/projects/files/user_browses_files_spec.rb2
-rw-r--r--spec/features/projects/files/user_creates_directory_spec.rb8
-rw-r--r--spec/features/projects/import_export/export_file_spec.rb2
-rw-r--r--spec/features/projects/integrations/user_activates_prometheus_spec.rb1
-rw-r--r--spec/features/projects/issuable_templates_spec.rb8
-rw-r--r--spec/features/projects/issues/design_management/user_views_design_spec.rb71
-rw-r--r--spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb23
-rw-r--r--spec/features/projects/jobs/user_browses_jobs_spec.rb16
-rw-r--r--spec/features/projects/jobs_spec.rb2
-rw-r--r--spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb2
-rw-r--r--spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb2
-rw-r--r--spec/features/projects/members/user_requests_access_spec.rb8
-rw-r--r--spec/features/projects/milestones/gfm_autocomplete_spec.rb6
-rw-r--r--spec/features/projects/navbar_spec.rb6
-rw-r--r--spec/features/projects/pages/user_adds_domain_spec.rb2
-rw-r--r--spec/features/projects/pages/user_edits_settings_spec.rb40
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb421
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb63
-rw-r--r--spec/features/projects/releases/user_views_release_spec.rb10
-rw-r--r--spec/features/projects/settings/access_tokens_spec.rb2
-rw-r--r--spec/features/projects/settings/external_authorization_service_settings_spec.rb2
-rw-r--r--spec/features/projects/settings/monitor_settings_spec.rb7
-rw-r--r--spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb2
-rw-r--r--spec/features/projects/settings/registry_settings_spec.rb2
-rw-r--r--spec/features/projects/settings/repository_settings_spec.rb1
-rw-r--r--spec/features/projects/settings/service_desk_setting_spec.rb35
-rw-r--r--spec/features/projects/settings/user_searches_in_settings_spec.rb19
-rw-r--r--spec/features/projects/settings/webhooks_settings_spec.rb5
-rw-r--r--spec/features/projects/show/download_buttons_spec.rb24
-rw-r--r--spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb2
-rw-r--r--spec/features/projects/show/user_sees_collaboration_links_spec.rb4
-rw-r--r--spec/features/projects/tags/download_buttons_spec.rb22
-rw-r--r--spec/features/projects/user_sees_user_popover_spec.rb2
-rw-r--r--spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb21
-rw-r--r--spec/features/runners_spec.rb66
-rw-r--r--spec/features/search/user_searches_for_milestones_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_wiki_pages_spec.rb2
-rw-r--r--spec/features/search/user_uses_search_filters_spec.rb8
-rw-r--r--spec/features/snippets/search_snippets_spec.rb4
-rw-r--r--spec/features/snippets/spam_snippets_spec.rb2
-rw-r--r--spec/features/snippets/user_creates_snippet_spec.rb6
-rw-r--r--spec/features/task_lists_spec.rb9
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_group_spec.rb2
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_profile_spec.rb2
-rw-r--r--spec/features/user_sees_revert_modal_spec.rb7
-rw-r--r--spec/features/users/email_verification_on_login_spec.rb12
-rw-r--r--spec/features/users/login_spec.rb17
-rw-r--r--spec/features/users/overview_spec.rb14
-rw-r--r--spec/features/users/rss_spec.rb8
-rw-r--r--spec/features/users/show_spec.rb28
-rw-r--r--spec/features/users/terms_spec.rb15
189 files changed, 1949 insertions, 1597 deletions
diff --git a/spec/features/abuse_report_spec.rb b/spec/features/abuse_report_spec.rb
index 82b7379b67c..ae3859280b1 100644
--- a/spec/features/abuse_report_spec.rb
+++ b/spec/features/abuse_report_spec.rb
@@ -13,6 +13,7 @@ RSpec.describe 'Abuse reports', :js, feature_category: :insider_threat do
before do
sign_in(reporter1)
stub_feature_flags(moved_mr_sidebar: false)
+ stub_feature_flags(user_profile_overflow_menu_vue: false)
end
describe 'report abuse to administrator' do
@@ -122,6 +123,10 @@ RSpec.describe 'Abuse reports', :js, feature_category: :insider_threat do
end
end
+ # TODO: implement tests before the FF "user_profile_overflow_menu_vue" is turned on
+ # See: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122971
+ # Related Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/416983
+
private
def fill_and_submit_abuse_category_form(category = "They're posting spam.")
diff --git a/spec/features/admin/admin_hooks_spec.rb b/spec/features/admin/admin_hooks_spec.rb
index ee8f94d6658..b4f64cbfa7b 100644
--- a/spec/features/admin/admin_hooks_spec.rb
+++ b/spec/features/admin/admin_hooks_spec.rb
@@ -46,10 +46,12 @@ RSpec.describe 'Admin::Hooks', feature_category: :webhooks do
it 'adds new hook' do
visit admin_hooks_path
+
+ click_button 'Add new webhook'
fill_in 'hook_url', with: url
check 'Enable SSL verification'
- expect { click_button 'Add system hook' }.to change(SystemHook, :count).by(1)
+ expect { click_button 'Add webhook' }.to change(SystemHook, :count).by(1)
expect(page).to have_content 'SSL Verification: enabled'
expect(page).to have_current_path(admin_hooks_path, ignore_query: true)
expect(page).to have_content(url)
@@ -119,11 +121,12 @@ RSpec.describe 'Admin::Hooks', feature_category: :webhooks do
it 'adds new hook' do
visit admin_hooks_path
+ click_button 'Add new webhook'
fill_in 'hook_url', with: url
uncheck 'Repository update events'
check 'Merge request events'
- expect { click_button 'Add system hook' }.to change(SystemHook, :count).by(1)
+ expect { click_button 'Add webhook' }.to change(SystemHook, :count).by(1)
expect(page).to have_current_path(admin_hooks_path, ignore_query: true)
expect(page).to have_content(url)
end
diff --git a/spec/features/admin/admin_mode/login_spec.rb b/spec/features/admin/admin_mode/login_spec.rb
index c0c8b12342a..72c7083f459 100644
--- a/spec/features/admin/admin_mode/login_spec.rb
+++ b/spec/features/admin/admin_mode/login_spec.rb
@@ -139,8 +139,10 @@ RSpec.describe 'Admin Mode Login', feature_category: :system_access do
context 'when authn_context is worth two factors' do
let(:mock_saml_response) do
File.read('spec/fixtures/authentication/saml_response.xml')
- .gsub('urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
- 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS')
+ .gsub(
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS'
+ )
end
it 'signs user in without prompting for second factor' do
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index b81703f728b..7fb2202ca1d 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -32,30 +32,13 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do
end
describe "runners registration" do
- context 'when create_runner_workflow_for_namespace is enabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_admin: true)
-
- visit admin_runners_path
- end
-
- it_behaves_like "shows and resets runner registration token" do
- let(:dropdown_text) { s_('Runners|Register an instance runner') }
- let(:registration_token) { Gitlab::CurrentSettings.runners_registration_token }
- end
+ before do
+ visit admin_runners_path
end
- context 'when create_runner_workflow_for_namespace is disabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_admin: false)
-
- visit admin_runners_path
- end
-
- it_behaves_like "shows and resets runner registration token" do
- let(:dropdown_text) { s_('Runners|Register an instance runner') }
- let(:registration_token) { Gitlab::CurrentSettings.runners_registration_token }
- end
+ it_behaves_like "shows and resets runner registration token" do
+ let(:dropdown_text) { s_('Runners|Register an instance runner') }
+ let(:registration_token) { Gitlab::CurrentSettings.runners_registration_token }
end
end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index 3e08d2277c1..b78d6777a1a 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -8,11 +8,9 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
include UsageDataHelpers
let_it_be(:admin) { create(:admin) }
- let(:dot_com?) { false }
context 'application setting :admin_mode is enabled', :request_store do
before do
- allow(Gitlab).to receive(:com?).and_return(dot_com?)
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
sign_in(admin)
gitlab_enable_admin_mode_sign_in(admin)
@@ -147,9 +145,7 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
end
context 'Dormant users', feature_category: :user_management do
- context 'when Gitlab.com' do
- let(:dot_com?) { true }
-
+ context 'when Gitlab.com', :saas do
it 'does not expose the setting section' do
# NOTE: not_to have_content may have false positives for content
# that might not load instantly, so before checking that
@@ -163,8 +159,6 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
end
context 'when not Gitlab.com' do
- let(:dot_com?) { false }
-
it 'exposes the setting section' do
expect(page).to have_content('Dormant users')
expect(page).to have_field('Deactivate dormant users after a period of inactivity')
@@ -366,9 +360,32 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
end
context 'GitLab for Slack app settings', feature_category: :integrations do
+ let(:create_heading) { 'Create your GitLab for Slack app' }
+ let(:configure_heading) { 'Configure the app settings' }
+ let(:update_heading) { 'Update your Slack app' }
+
+ it 'has all sections' do
+ page.within('.as-slack') do
+ expect(page).to have_content(create_heading)
+ expect(page).to have_content(configure_heading)
+ expect(page).to have_content(update_heading)
+ end
+ end
+
+ context 'when GitLab.com', :saas do
+ it 'only has the configure section' do
+ page.within('.as-slack') do
+ expect(page).to have_content(configure_heading)
+
+ expect(page).not_to have_content(create_heading)
+ expect(page).not_to have_content(update_heading)
+ end
+ end
+ end
+
it 'changes the settings' do
page.within('.as-slack') do
- check 'Enable Slack application'
+ check 'Enable GitLab for Slack app'
fill_in 'Client ID', with: 'slack_app_id'
fill_in 'Client secret', with: 'slack_app_secret'
fill_in 'Signing secret', with: 'slack_app_signing_secret'
@@ -775,6 +792,18 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
expect(current_settings.users_get_by_id_limit_allowlist).to eq(%w[someone someone_else])
end
+ it 'changes gitlab shell operation limits settings' do
+ visit network_admin_application_settings_path
+
+ page.within('[data-testid="gitlab-shell-operation-limits"]') do
+ fill_in 'Maximum number of Git operations per minute', with: 100
+ click_button 'Save changes'
+ end
+
+ expect(page).to have_content "Application settings saved successfully"
+ expect(current_settings.gitlab_shell_operation_limit).to eq(100)
+ end
+
it 'changes Projects API rate limits settings' do
visit network_admin_application_settings_path
diff --git a/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb b/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb
index d0ca5d76cc7..881ccec017b 100644
--- a/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb
+++ b/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User activates the instance-level Mattermost Slash Command integration', :js,
-feature_category: :integrations do
+ feature_category: :integrations do
include_context 'instance integration activation'
before do
diff --git a/spec/features/admin/users/user_spec.rb b/spec/features/admin/users/user_spec.rb
index f8f1fdaabb4..a95fd133133 100644
--- a/spec/features/admin/users/user_spec.rb
+++ b/spec/features/admin/users/user_spec.rb
@@ -260,7 +260,7 @@ RSpec.describe 'Admin::Users::User', feature_category: :user_management do
it 'logs in as the user when impersonate is clicked' do
subject
- find('[data-testid="user-menu"]').click
+ find('[data-testid="user-dropdown"]').click
expect(page.find(:css, '[data-testid="user-profile-link"]')['data-user']).to eql(another_user.username)
end
@@ -317,7 +317,7 @@ RSpec.describe 'Admin::Users::User', feature_category: :user_management do
it 'logs out of impersonated user back to original user' do
subject
- find('[data-testid="user-menu"]').click
+ find('[data-testid="user-dropdown"]').click
expect(page.find(:css, '[data-testid="user-profile-link"]')['data-user']).to eq(current_user.username)
end
diff --git a/spec/features/atom/issues_spec.rb b/spec/features/atom/issues_spec.rb
index 89db70c6680..bd5903efe10 100644
--- a/spec/features/atom/issues_spec.rb
+++ b/spec/features/atom/issues_spec.rb
@@ -49,8 +49,11 @@ RSpec.describe 'Issues Feed', feature_category: :devops_reports do
before do
personal_access_token = create(:personal_access_token, user: user)
- visit project_issues_path(project, :atom,
- private_token: personal_access_token.token)
+ visit project_issues_path(
+ project,
+ :atom,
+ private_token: personal_access_token.token
+ )
end
it_behaves_like 'an authenticated issuable atom feed'
@@ -59,8 +62,11 @@ RSpec.describe 'Issues Feed', feature_category: :devops_reports do
context 'when authenticated via feed token' do
before do
- visit project_issues_path(project, :atom,
- feed_token: user.feed_token)
+ visit project_issues_path(
+ project,
+ :atom,
+ feed_token: user.feed_token
+ )
end
it_behaves_like 'an authenticated issuable atom feed'
diff --git a/spec/features/atom/merge_requests_spec.rb b/spec/features/atom/merge_requests_spec.rb
index b9e1c7042b2..0238380da90 100644
--- a/spec/features/atom/merge_requests_spec.rb
+++ b/spec/features/atom/merge_requests_spec.rb
@@ -46,8 +46,11 @@ RSpec.describe 'Merge Requests Feed', feature_category: :devops_reports do
before do
personal_access_token = create(:personal_access_token, user: user)
- visit project_merge_requests_path(project, :atom,
- private_token: personal_access_token.token)
+ visit project_merge_requests_path(
+ project,
+ :atom,
+ private_token: personal_access_token.token
+ )
end
it_behaves_like 'an authenticated issuable atom feed'
@@ -56,8 +59,11 @@ RSpec.describe 'Merge Requests Feed', feature_category: :devops_reports do
context 'when authenticated via feed token' do
before do
- visit project_merge_requests_path(project, :atom,
- feed_token: user.feed_token)
+ visit project_merge_requests_path(
+ project,
+ :atom,
+ feed_token: user.feed_token
+ )
end
it_behaves_like 'an authenticated issuable atom feed'
diff --git a/spec/features/atom/topics_spec.rb b/spec/features/atom/topics_spec.rb
new file mode 100644
index 00000000000..078c5b55eeb
--- /dev/null
+++ b/spec/features/atom/topics_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe "Topic Feed", feature_category: :groups_and_projects do
+ let_it_be(:topic) { create(:topic, name: 'test-topic', title: 'Test topic') }
+ let_it_be(:empty_topic) { create(:topic, name: 'test-empty-topic', title: 'Test empty topic') }
+ let_it_be(:project1) { create(:project, :public, topic_list: topic.name) }
+ let_it_be(:project2) { create(:project, :public, topic_list: topic.name) }
+
+ context 'when topic does not exist' do
+ let(:path) { topic_explore_projects_path(topic_name: 'non-existing', format: 'atom') }
+
+ it 'renders 404' do
+ visit path
+
+ expect(status_code).to eq(404)
+ end
+ end
+
+ context 'when topic exists' do
+ before do
+ visit topic_explore_projects_path(topic_name: topic.name, format: 'atom')
+ end
+
+ it "renders topic atom feed" do
+ expect(body).to have_selector('feed title')
+ end
+
+ it "has project entries" do
+ expect(body).to have_content(project1.name)
+ expect(body).to have_content(project2.name)
+ end
+ end
+
+ context 'when topic is empty' do
+ before do
+ visit topic_explore_projects_path(topic_name: empty_topic.name, format: 'atom')
+ end
+
+ it "renders topic atom feed" do
+ expect(body).to have_selector('feed title')
+ end
+
+ it "has no project entry" do
+ expect(body).to have_no_selector('entry')
+ end
+ end
+end
diff --git a/spec/features/atom/users_spec.rb b/spec/features/atom/users_spec.rb
index b743f900ae7..f801f93686c 100644
--- a/spec/features/atom/users_spec.rb
+++ b/spec/features/atom/users_spec.rb
@@ -25,27 +25,33 @@ RSpec.describe "User Feed", feature_category: :devops_reports do
context 'feed content' do
let(:project) { create(:project, :repository) }
let(:issue) do
- create(:issue,
- project: project,
- author: user,
- description: "Houston, we have a bug!\n\n***\n\nI guess.")
+ create(
+ :issue,
+ project: project,
+ author: user,
+ description: "Houston, we have a bug!\n\n***\n\nI guess."
+ )
end
let(:note) do
- create(:note,
- noteable: issue,
- author: user,
- note: 'Bug confirmed :+1:',
- project: project)
+ create(
+ :note,
+ noteable: issue,
+ author: user,
+ note: 'Bug confirmed :+1:',
+ project: project
+ )
end
let(:merge_request) do
- create(:merge_request,
- title: 'Fix bug',
- author: user,
- source_project: project,
- target_project: project,
- description: "Here is the fix: ![an image](image.png)")
+ create(
+ :merge_request,
+ title: 'Fix bug',
+ author: user,
+ source_project: project,
+ target_project: project,
+ description: "Here is the fix: ![an image](image.png)"
+ )
end
let(:push_event) { create(:push_event, project: project, author: user) }
diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb
index 1ea6e079104..85e54c0f451 100644
--- a/spec/features/boards/boards_spec.rb
+++ b/spec/features/boards/boards_spec.rb
@@ -74,7 +74,6 @@ RSpec.describe 'Project issue boards', :js, feature_category: :team_planning do
let_it_be(:a_plus, reload: true) { create(:label, project: project, name: 'A+') }
let_it_be(:list1, reload: true) { create(:list, board: board, label: planning, position: 0) }
let_it_be(:list2, reload: true) { create(:list, board: board, label: development, position: 1) }
- let_it_be(:backlog_list, reload: true) { create(:backlog_list, board: board) }
let_it_be(:confidential_issue, reload: true) { create(:labeled_issue, :confidential, project: project, author: user, labels: [planning], relative_position: 9) }
let_it_be(:issue1, reload: true) { create(:labeled_issue, project: project, title: 'aaa', description: '111', assignees: [user], labels: [planning], relative_position: 8) }
@@ -591,8 +590,6 @@ RSpec.describe 'Project issue boards', :js, feature_category: :team_planning do
def remove_list
page.within(find('.board:nth-child(2)')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button('Edit list settings')
end
diff --git a/spec/features/boards/issue_ordering_spec.rb b/spec/features/boards/issue_ordering_spec.rb
index b6196fa6a1d..35e387c9d8a 100644
--- a/spec/features/boards/issue_ordering_spec.rb
+++ b/spec/features/boards/issue_ordering_spec.rb
@@ -220,12 +220,14 @@ RSpec.describe 'Issue Boards', :js, feature_category: :team_planning do
end
def drag(selector: '.board-list', list_from_index: 1, from_index: 0, to_index: 0, list_to_index: 1, duration: 1000)
- drag_to(selector: selector,
- scrollable: '#board-app',
- list_from_index: list_from_index,
- from_index: from_index,
- to_index: to_index,
- list_to_index: list_to_index,
- duration: duration)
+ drag_to(
+ selector: selector,
+ scrollable: '#board-app',
+ list_from_index: list_from_index,
+ from_index: from_index,
+ to_index: to_index,
+ list_to_index: list_to_index,
+ duration: duration
+ )
end
end
diff --git a/spec/features/boards/multi_select_spec.rb b/spec/features/boards/multi_select_spec.rb
index 7afe34be3d8..03b1643d7c4 100644
--- a/spec/features/boards/multi_select_spec.rb
+++ b/spec/features/boards/multi_select_spec.rb
@@ -11,13 +11,15 @@ RSpec.describe 'Multi Select Issue', :js, feature_category: :team_planning do
let(:user) { create(:user) }
def drag(selector: '.board-list', list_from_index: 1, from_index: 0, to_index: 0, list_to_index: 1, duration: 1000)
- drag_to(selector: selector,
- scrollable: '#board-app',
- list_from_index: list_from_index,
- from_index: from_index,
- to_index: to_index,
- list_to_index: list_to_index,
- duration: duration)
+ drag_to(
+ selector: selector,
+ scrollable: '#board-app',
+ list_from_index: list_from_index,
+ from_index: from_index,
+ to_index: to_index,
+ list_to_index: list_to_index,
+ duration: duration
+ )
end
def wait_for_board_cards(board_number, expected_cards)
diff --git a/spec/features/boards/new_issue_spec.rb b/spec/features/boards/new_issue_spec.rb
index 1fcea45c7ae..682ccca38bd 100644
--- a/spec/features/boards/new_issue_spec.rb
+++ b/spec/features/boards/new_issue_spec.rb
@@ -5,7 +5,6 @@ require 'spec_helper'
RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning do
let_it_be(:project) { create(:project, :public) }
let_it_be(:board) { create(:board, project: project) }
- let_it_be(:backlog_list) { create(:backlog_list, board: board) }
let_it_be(:label) { create(:label, project: project, name: 'Label 1') }
let_it_be(:list) { create(:list, board: board, label: label, position: 0) }
let_it_be(:user) { create(:user) }
@@ -32,22 +31,17 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
end
it 'displays new issue button' do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
expect(first('.board')).to have_button('Create new issue', count: 1)
end
it 'does not display new issue button in closed list' do
page.within('.board:nth-child(3)') do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(page).not_to have_button('Create new issue')
end
end
it 'shows form when clicking button' do
page.within(first('.board')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
expect(page).to have_selector('.board-new-issue-form')
@@ -56,8 +50,6 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
it 'hides form when clicking cancel' do
page.within(first('.board')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
expect(page).to have_selector('.board-new-issue-form')
@@ -70,8 +62,6 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
it 'creates new issue, places it on top of the list, and opens sidebar' do
page.within(first('.board')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
end
@@ -100,8 +90,6 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
it 'successfuly loads labels to be added to newly created issue' do
page.within(first('.board')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
end
@@ -132,8 +120,6 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
wait_for_all_requests
page.within('.board:nth-child(2)') do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button('Create new issue')
page.within(first('.board-new-issue-form')) do
@@ -157,13 +143,11 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
end
it 'does not display new issue button in open list' do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(first('.board')).not_to have_button('Create new issue')
end
it 'does not display new issue button in label list' do
page.within('.board:nth-child(2)') do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(page).not_to have_button('Create new issue')
end
end
@@ -188,23 +172,18 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
context 'when backlog does not exist' do
it 'does not display new issue button in label list' do
page.within('.board.is-draggable') do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(page).not_to have_button('Create new issue')
end
end
end
context 'when backlog list already exists' do
- let_it_be(:backlog_list) { create(:backlog_list, board: group_board) }
-
it 'does not display new issue button in open list' do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(first('.board')).not_to have_button('Create new issue')
end
it 'does not display new issue button in label list' do
page.within('.board.is-draggable') do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(page).not_to have_button('Create new issue')
end
end
@@ -222,20 +201,18 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
end
context 'when backlog does not exist' do
+ before do
+ group_board.lists.backlog.delete_all
+ end
+
it 'display new issue button in label list' do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
expect(board_list_header).to have_button('Create new issue')
end
end
context 'project select dropdown' do
- let_it_be(:backlog_list) { create(:backlog_list, board: group_board) }
-
before do
page.within(board_list_header) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
end
diff --git a/spec/features/boards/sidebar_assignee_spec.rb b/spec/features/boards/sidebar_assignee_spec.rb
index a912ea28ddc..899ab5863e1 100644
--- a/spec/features/boards/sidebar_assignee_spec.rb
+++ b/spec/features/boards/sidebar_assignee_spec.rb
@@ -2,8 +2,9 @@
require 'spec_helper'
-RSpec.describe 'Project issue boards sidebar assignee', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332078',
- feature_category: :team_planning do
+RSpec.describe 'Project issue boards sidebar assignee', :js,
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332078',
+ feature_category: :team_planning do
include BoardHelpers
let_it_be(:user) { create(:user) }
diff --git a/spec/features/boards/sidebar_labels_in_namespaces_spec.rb b/spec/features/boards/sidebar_labels_in_namespaces_spec.rb
index 39485fe21a9..ffed4a0854f 100644
--- a/spec/features/boards/sidebar_labels_in_namespaces_spec.rb
+++ b/spec/features/boards/sidebar_labels_in_namespaces_spec.rb
@@ -12,7 +12,6 @@ RSpec.describe 'Issue boards sidebar labels select', :js, feature_category: :tea
context 'group boards' do
context 'in the top-level group board' do
let_it_be(:group_board) { create(:board, group: group) }
- let_it_be(:board_list) { create(:backlog_list, board: group_board) }
before do
stub_feature_flags(apollo_boards: false)
diff --git a/spec/features/boards/sidebar_spec.rb b/spec/features/boards/sidebar_spec.rb
index 358da1e1279..4807b691e4f 100644
--- a/spec/features/boards/sidebar_spec.rb
+++ b/spec/features/boards/sidebar_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Project issue boards sidebar', :js, feature_category: :team_planning do
+RSpec.describe 'Project issue boards sidebar', :js, feature_category: :team_planning, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/416414' do
include BoardHelpers
let_it_be(:user) { create(:user) }
diff --git a/spec/features/boards/user_adds_lists_to_board_spec.rb b/spec/features/boards/user_adds_lists_to_board_spec.rb
index a936e14168c..cc2afca7657 100644
--- a/spec/features/boards/user_adds_lists_to_board_spec.rb
+++ b/spec/features/boards/user_adds_lists_to_board_spec.rb
@@ -13,8 +13,6 @@ RSpec.describe 'User adds lists', :js, feature_category: :team_planning do
let_it_be(:group_label) { create(:group_label, group: group) }
let_it_be(:project_label) { create(:label, project: project) }
- let_it_be(:group_backlog_list) { create(:backlog_list, board: group_board) }
- let_it_be(:project_backlog_list) { create(:backlog_list, board: project_board) }
let_it_be(:backlog) { create(:group_label, group: group, name: 'Backlog') }
let_it_be(:closed) { create(:group_label, group: group, name: 'Closed') }
diff --git a/spec/features/boards/user_visits_board_spec.rb b/spec/features/boards/user_visits_board_spec.rb
index 44c691435df..5867ec17070 100644
--- a/spec/features/boards/user_visits_board_spec.rb
+++ b/spec/features/boards/user_visits_board_spec.rb
@@ -62,7 +62,6 @@ RSpec.describe 'User visits issue boards', :js, feature_category: :team_planning
context "project boards" do
stub_feature_flags(apollo_boards: false)
let_it_be(:board) { create_default(:board, project: project) }
- let_it_be(:backlog_list) { create_default(:backlog_list, board: board) }
let(:board_path) { project_boards_path(project, params) }
@@ -72,7 +71,6 @@ RSpec.describe 'User visits issue boards', :js, feature_category: :team_planning
context "group boards" do
stub_feature_flags(apollo_boards: false)
let_it_be(:board) { create_default(:board, group: group) }
- let_it_be(:backlog_list) { create_default(:backlog_list, board: board) }
let(:board_path) { group_boards_path(group, params) }
diff --git a/spec/features/clusters/create_agent_spec.rb b/spec/features/clusters/create_agent_spec.rb
index 93a49151978..d90c43f452c 100644
--- a/spec/features/clusters/create_agent_spec.rb
+++ b/spec/features/clusters/create_agent_spec.rb
@@ -27,7 +27,8 @@ RSpec.describe 'Cluster agent registration', :js, feature_category: :deployment_
end
it 'allows the user to select an agent to install, and displays the resulting agent token' do
- click_button('Connect a cluster')
+ find('[data-testid="clusters-default-action-button"]').click
+
expect(page).to have_content('Register')
click_button('Select an agent or enter a name to create new')
diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb
index fd09a7f7343..b72e08b854e 100644
--- a/spec/features/commits_spec.rb
+++ b/spec/features/commits_spec.rb
@@ -8,20 +8,21 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
describe 'CI' do
before do
- stub_feature_flags(pipeline_details_header_vue: false)
sign_in(user)
stub_ci_pipeline_to_return_yaml_file
end
let(:creator) { create(:user, developer_projects: [project]) }
let!(:pipeline) do
- create(:ci_pipeline,
- project: project,
- user: creator,
- ref: project.default_branch,
- sha: project.commit.sha,
- status: :success,
- created_at: 5.months.ago)
+ create(
+ :ci_pipeline,
+ project: project,
+ user: creator,
+ ref: project.default_branch,
+ sha: project.commit.sha,
+ status: :success,
+ created_at: 5.months.ago
+ )
end
context 'commit status is Generic Commit Status' do
@@ -39,7 +40,11 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
wait_for_requests
end
- it { expect(page).to have_content pipeline.sha[0..7] }
+ it 'contains commit short id' do
+ page.within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_content pipeline.sha[0..7]
+ end
+ end
it 'contains generic commit status build' do
page.within('[data-testid="jobs-tab-table"]') do
@@ -61,11 +66,13 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
describe 'Project commits' do
let!(:pipeline_from_other_branch) do
- create(:ci_pipeline,
- project: project,
- ref: 'fix',
- sha: project.commit.sha,
- status: :failed)
+ create(
+ :ci_pipeline,
+ project: project,
+ ref: 'fix',
+ sha: project.commit.sha,
+ status: :failed
+ )
end
before do
@@ -88,7 +95,6 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
it 'shows pipeline data' do
expect(page).to have_content pipeline.sha[0..7]
- expect(page).to have_content pipeline.git_commit_message.gsub!(/\s+/, ' ')
expect(page).to have_content pipeline.user.name
end
end
@@ -116,7 +122,7 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
describe 'Cancel build' do
it 'cancels build', :js, :sidekiq_might_not_need_inline do
visit pipeline_path(pipeline)
- find('[data-testid="cancelPipeline"]').click
+ find('[data-testid="cancel-pipeline"]').click
expect(page).to have_content 'canceled'
end
end
@@ -132,7 +138,6 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
it 'renders header' do
expect(page).to have_content pipeline.sha[0..7]
- expect(page).to have_content pipeline.git_commit_message.gsub!(/\s+/, ' ')
expect(page).to have_content pipeline.user.name
expect(page).not_to have_link('Cancel pipeline')
expect(page).not_to have_link('Retry')
diff --git a/spec/features/dashboard/activity_spec.rb b/spec/features/dashboard/activity_spec.rb
index 2345e4be722..60621f57bde 100644
--- a/spec/features/dashboard/activity_spec.rb
+++ b/spec/features/dashboard/activity_spec.rb
@@ -59,12 +59,14 @@ RSpec.describe 'Dashboard > Activity', feature_category: :user_profile do
let!(:push_event) do
event = create(:push_event, project: project, author: user)
- create(:push_event_payload,
- event: event,
- action: :created,
- commit_to: '0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e',
- ref: 'new_design',
- commit_count: 1)
+ create(
+ :push_event_payload,
+ event: event,
+ action: :created,
+ commit_to: '0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e',
+ ref: 'new_design',
+ commit_count: 1
+ )
event
end
diff --git a/spec/features/dashboard/datetime_on_tooltips_spec.rb b/spec/features/dashboard/datetime_on_tooltips_spec.rb
index c6e78c8b57c..e84a3c8cc66 100644
--- a/spec/features/dashboard/datetime_on_tooltips_spec.rb
+++ b/spec/features/dashboard/datetime_on_tooltips_spec.rb
@@ -18,8 +18,13 @@ RSpec.describe 'Tooltips on .timeago dates', :js, feature_category: :user_profil
context 'on the activity tab' do
before do
- Event.create!(project: project, author_id: user.id, action: :joined,
- updated_at: created_date, created_at: created_date)
+ Event.create!(
+ project: project,
+ author_id: user.id,
+ action: :joined,
+ updated_at: created_date,
+ created_at: created_date
+ )
sign_in user
visit user_activity_path(user)
diff --git a/spec/features/dashboard/issues_filter_spec.rb b/spec/features/dashboard/issues_filter_spec.rb
index 964ac2f714d..ab3aa29a3aa 100644
--- a/spec/features/dashboard/issues_filter_spec.rb
+++ b/spec/features/dashboard/issues_filter_spec.rb
@@ -61,10 +61,15 @@ RSpec.describe 'Dashboard Issues filtering', :js, feature_category: :team_planni
auto_discovery_link = find('link[type="application/atom+xml"]', visible: false)
auto_discovery_params = CGI.parse(URI.parse(auto_discovery_link[:href]).query)
- expect(params).to include('feed_token' => [user.feed_token])
+ feed_token_param = params['feed_token']
+ expect(feed_token_param).to match([Gitlab::Auth::AuthFinders::PATH_DEPENDENT_FEED_TOKEN_REGEX])
+ expect(feed_token_param.first).to end_with(user.id.to_s)
expect(params).to include('milestone_title' => [''])
expect(params).to include('assignee_username' => [user.username.to_s])
- expect(auto_discovery_params).to include('feed_token' => [user.feed_token])
+
+ feed_token_param = auto_discovery_params['feed_token']
+ expect(feed_token_param).to match([Gitlab::Auth::AuthFinders::PATH_DEPENDENT_FEED_TOKEN_REGEX])
+ expect(feed_token_param.first).to end_with(user.id.to_s)
expect(auto_discovery_params).to include('milestone_title' => [''])
expect(auto_discovery_params).to include('assignee_username' => [user.username.to_s])
end
diff --git a/spec/features/dashboard/merge_requests_spec.rb b/spec/features/dashboard/merge_requests_spec.rb
index d53f5affe64..624f3530f81 100644
--- a/spec/features/dashboard/merge_requests_spec.rb
+++ b/spec/features/dashboard/merge_requests_spec.rb
@@ -79,39 +79,52 @@ RSpec.describe 'Dashboard Merge Requests', feature_category: :code_review_workfl
end
let!(:assigned_merge_request_from_fork) do
- create(:merge_request,
- source_branch: 'markdown', assignees: [current_user],
- target_project: public_project, source_project: forked_project,
- author: author_user)
+ create(
+ :merge_request,
+ source_branch: 'markdown',
+ assignees: [current_user],
+ target_project: public_project,
+ source_project: forked_project,
+ author: author_user
+ )
end
let!(:authored_merge_request) do
- create(:merge_request,
- source_branch: 'markdown',
- source_project: project,
- author: current_user)
+ create(
+ :merge_request,
+ source_branch: 'markdown',
+ source_project: project,
+ author: current_user
+ )
end
let!(:authored_merge_request_from_fork) do
- create(:merge_request,
- source_branch: 'feature_conflict',
- author: current_user,
- target_project: public_project, source_project: forked_project)
+ create(
+ :merge_request,
+ source_branch: 'feature_conflict',
+ author: current_user,
+ target_project: public_project,
+ source_project: forked_project
+ )
end
let!(:labeled_merge_request) do
- create(:labeled_merge_request,
- source_branch: 'labeled',
- labels: [label],
- author: current_user,
- source_project: project)
+ create(
+ :labeled_merge_request,
+ source_branch: 'labeled',
+ labels: [label],
+ author: current_user,
+ source_project: project
+ )
end
let!(:other_merge_request) do
- create(:merge_request,
- source_branch: 'fix',
- source_project: project,
- author: author_user)
+ create(
+ :merge_request,
+ source_branch: 'fix',
+ source_project: project,
+ author: author_user
+ )
end
before do
diff --git a/spec/features/dashboard/todos/todos_sorting_spec.rb b/spec/features/dashboard/todos/todos_sorting_spec.rb
index e449f71878b..e1460e345fc 100644
--- a/spec/features/dashboard/todos/todos_sorting_spec.rb
+++ b/spec/features/dashboard/todos/todos_sorting_spec.rb
@@ -27,8 +27,9 @@ RSpec.describe 'Dashboard > User sorts todos', feature_category: :team_planning
create(:todo, user: user, project: project, target: issue_2, created_at: 4.hours.ago, updated_at: 4.hours.ago)
create(:todo, user: user, project: project, target: issue_3, created_at: 3.hours.ago, updated_at: 2.minutes.ago)
create(:todo, user: user, project: project, target: issue_1, created_at: 2.hours.ago, updated_at: 2.hours.ago)
- create(:todo, user: user, project: project, target: merge_request_1, created_at: 1.hour.ago,
- updated_at: 1.hour.ago)
+ create(
+ :todo, user: user, project: project, target: merge_request_1, created_at: 1.hour.ago, updated_at: 1.hour.ago
+ )
merge_request_1.labels << label_1
issue_3.labels << label_1
diff --git a/spec/features/dashboard/todos/todos_spec.rb b/spec/features/dashboard/todos/todos_spec.rb
index d0003b69415..9d59126df8d 100644
--- a/spec/features/dashboard/todos/todos_spec.rb
+++ b/spec/features/dashboard/todos/todos_spec.rb
@@ -443,12 +443,15 @@ RSpec.describe 'Dashboard Todos', feature_category: :team_planning do
let_it_be(:target) { create(:design, issue: issue, project: project) }
let_it_be(:note) { create(:note, project: project, note: 'I am note, hear me roar') }
let_it_be(:todo) do
- create(:todo, :mentioned,
- user: user,
- project: project,
- target: target,
- author: author,
- note: note)
+ create(
+ :todo,
+ :mentioned,
+ user: user,
+ project: project,
+ target: target,
+ author: author,
+ note: note
+ )
end
before do
@@ -467,10 +470,12 @@ RSpec.describe 'Dashboard Todos', feature_category: :team_planning do
context 'User requested access' do
shared_examples 'has todo present with access request content' do
specify do
- create(:todo, :member_access_requested,
- user: user,
- target: target,
- author: author
+ create(
+ :todo,
+ :member_access_requested,
+ user: user,
+ target: target,
+ author: author
)
target.add_owner(user)
diff --git a/spec/features/discussion_comments/issue_spec.rb b/spec/features/discussion_comments/issue_spec.rb
index 90be3f0760d..b270a4c7600 100644
--- a/spec/features/discussion_comments/issue_spec.rb
+++ b/spec/features/discussion_comments/issue_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Thread Comments Issue', :js, feature_category: :source_code_management do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:issue) { create(:issue, project: project) }
@@ -12,6 +14,7 @@ RSpec.describe 'Thread Comments Issue', :js, feature_category: :source_code_mana
sign_in(user)
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'thread comments for issue, epic and merge request', 'issue'
diff --git a/spec/features/error_tracking/user_filters_errors_by_status_spec.rb b/spec/features/error_tracking/user_filters_errors_by_status_spec.rb
index 168c4f330ca..5efcb5f8b8e 100644
--- a/spec/features/error_tracking/user_filters_errors_by_status_spec.rb
+++ b/spec/features/error_tracking/user_filters_errors_by_status_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'When a user filters Sentry errors by status', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
-feature_category: :error_tracking do
+ feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }
diff --git a/spec/features/error_tracking/user_searches_sentry_errors_spec.rb b/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
index 6026b42f7de..d4c537f1939 100644
--- a/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
+++ b/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'When a user searches for Sentry errors', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
-feature_category: :error_tracking do
+ feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }
diff --git a/spec/features/error_tracking/user_sees_error_details_spec.rb b/spec/features/error_tracking/user_sees_error_details_spec.rb
index d7676d90d21..8fcf5df41c7 100644
--- a/spec/features/error_tracking/user_sees_error_details_spec.rb
+++ b/spec/features/error_tracking/user_sees_error_details_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'View error details page', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
-feature_category: :error_tracking do
+ feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
context 'with current user as project owner' do
diff --git a/spec/features/error_tracking/user_sees_error_index_spec.rb b/spec/features/error_tracking/user_sees_error_index_spec.rb
index f83c8ffe439..e86e89ad058 100644
--- a/spec/features/error_tracking/user_sees_error_index_spec.rb
+++ b/spec/features/error_tracking/user_sees_error_index_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'View error index page', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
-feature_category: :error_tracking do
+ feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }
diff --git a/spec/features/file_uploads/multipart_invalid_uploads_spec.rb b/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
index c4c5eb6b74b..aeb8fd11170 100644
--- a/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
+++ b/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe 'Invalid uploads that must be rejected', :api, :js, feature_categ
# These keys are rejected directly by rack itself.
# The request will not be received by multipart.rb (can't use the 'handling file uploads' shared example)
- it_behaves_like 'rejecting invalid keys', key_name: 'x' * 11000, message: 'Puma caught this error: exceeded available parameter key space (Rack::QueryParser::ParamsTooDeepError)'
+ it_behaves_like 'rejecting invalid keys', key_name: 'x' * 11000, status: 400, message: 'Bad Request'
it_behaves_like 'rejecting invalid keys', key_name: 'package[]test', status: 400, message: 'Bad Request'
it_behaves_like 'handling file uploads', 'by rejecting uploads with an invalid key'
diff --git a/spec/features/groups/board_spec.rb b/spec/features/groups/board_spec.rb
index 25f7d4d968c..c2d6b80b4c0 100644
--- a/spec/features/groups/board_spec.rb
+++ b/spec/features/groups/board_spec.rb
@@ -25,8 +25,6 @@ RSpec.describe 'Group Boards', feature_category: :team_planning do
it 'adds an issue to the backlog' do
page.within(find('.board', match: :first)) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
issue_title = 'Create new issue'
click_button issue_title
@@ -52,7 +50,6 @@ RSpec.describe 'Group Boards', feature_category: :team_planning do
context "when user is a Reporter in one of the group's projects", :js do
let_it_be(:board) { create(:board, group: group) }
- let_it_be(:backlog_list) { create(:backlog_list, board: board) }
let_it_be(:group_label1) { create(:group_label, title: "bug", group: group) }
let_it_be(:group_label2) { create(:group_label, title: "dev", group: group) }
let_it_be(:list1) { create(:list, board: board, label: group_label1, position: 0) }
diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb
index 514110d78ae..e9d2d185e8a 100644
--- a/spec/features/groups/group_runners_spec.rb
+++ b/spec/features/groups/group_runners_spec.rb
@@ -16,21 +16,6 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do
end
describe "Group runners page", :js do
- describe "legacy runners registration" do
- let_it_be(:group_registration_token) { group.runners_token }
-
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
-
- visit group_runners_path(group)
- end
-
- it_behaves_like "shows and resets runner registration token" do
- let(:dropdown_text) { 'Register a group runner' }
- let(:registration_token) { group_registration_token }
- end
- end
-
context "with no runners" do
before do
visit group_runners_path(group)
diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb
index 0a697eaa798..d870471d646 100644
--- a/spec/features/groups/milestone_spec.rb
+++ b/spec/features/groups/milestone_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
+ include ContentEditorHelpers
+
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project_empty_repo, group: group) }
let_it_be(:user) { create(:group_member, :maintainer, user: create(:user), group: group).user }
@@ -18,6 +20,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
context 'create a milestone', :js do
before do
visit new_group_milestone_path(group)
+ close_rich_text_promo_popover_if_present
end
it 'renders description preview' do
@@ -27,7 +30,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
click_button("Preview")
- preview = find('.js-md-preview')
+ preview = find('.js-vue-md-preview')
expect(preview).to have_content('Nothing to preview.')
@@ -66,6 +69,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
context 'when no milestones' do
it 'renders no milestones text' do
visit group_milestones_path(group)
+ close_rich_text_promo_popover_if_present
expect(page).to have_content('Use milestones to track issues and merge requests')
end
end
@@ -95,6 +99,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
before do
visit group_milestones_path(group)
+ close_rich_text_promo_popover_if_present
end
it 'counts milestones correctly' do
@@ -170,6 +175,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
before do
visit group_milestone_path(group, milestone)
+ close_rich_text_promo_popover_if_present
end
it 'renders the issues tab' do
diff --git a/spec/features/groups/milestones/gfm_autocomplete_spec.rb b/spec/features/groups/milestones/gfm_autocomplete_spec.rb
index 8df097dde88..9245323d1f7 100644
--- a/spec/features/groups/milestones/gfm_autocomplete_spec.rb
+++ b/spec/features/groups/milestones/gfm_autocomplete_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
+ include Features::AutocompleteHelpers
+
let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let_it_be(:group) { create(:group, name: 'Ancestor') }
let_it_be(:project) { create(:project, :repository, group: group) }
@@ -69,10 +71,6 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
private
- def find_autocomplete_menu
- find('.atwho-view ul', visible: true)
- end
-
def expect_autocomplete_entry(entry)
page.within('.atwho-container') do
expect(page).to have_content(entry)
diff --git a/spec/features/groups/packages_spec.rb b/spec/features/groups/packages_spec.rb
index b7f9cd3e93a..ec8215928e4 100644
--- a/spec/features/groups/packages_spec.rb
+++ b/spec/features/groups/packages_spec.rb
@@ -52,7 +52,7 @@ RSpec.describe 'Group Packages', feature_category: :package_registry do
it_behaves_like 'package details link'
it 'allows you to navigate to the project page' do
- find('[data-testid="root-link"]', text: project.path).click
+ find('[data-testid="root-link"]', text: project.name).click
expect(page).to have_current_path(project_path(project))
expect(page).to have_content(project.name)
diff --git a/spec/features/groups/participants_autocomplete_spec.rb b/spec/features/groups/participants_autocomplete_spec.rb
new file mode 100644
index 00000000000..a94f95c3ced
--- /dev/null
+++ b/spec/features/groups/participants_autocomplete_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Group member autocomplete', :js, feature_category: :groups_and_projects do
+ include Features::AutocompleteHelpers
+
+ let_it_be(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+
+ before_all do
+ group.add_developer user
+ end
+
+ before do
+ sign_in(user)
+ end
+
+ context 'when editing description of a group milestone' do
+ let_it_be(:noteable) { create(:milestone, group: group) }
+
+ it 'suggests group members' do
+ visit edit_group_milestone_path(group, noteable)
+
+ fill_in 'Description', with: '@'
+
+ expect(find_autocomplete_menu).to have_text(user.username)
+ end
+
+ context 'for a member of a private group invited to the group' do
+ let_it_be(:private_group) { create(:group, :private) }
+ let_it_be(:private_group_member) { create(:user, username: 'private-a') }
+
+ before_all do
+ private_group.add_developer private_group_member
+
+ create(:group_group_link, shared_group: group, shared_with_group: private_group)
+ end
+
+ it 'suggests member of private group as well' do
+ visit edit_group_milestone_path(group, noteable)
+
+ fill_in 'Description', with: '@'
+
+ expect(find_autocomplete_menu).to have_text(private_group_member.username)
+ expect(find_autocomplete_menu).to have_text(user.username)
+ end
+ end
+ end
+end
diff --git a/spec/features/groups/settings/access_tokens_spec.rb b/spec/features/groups/settings/access_tokens_spec.rb
index cb92f9abdf5..c7e81803694 100644
--- a/spec/features/groups/settings/access_tokens_spec.rb
+++ b/spec/features/groups/settings/access_tokens_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe 'Group > Settings > Access Tokens', :js, feature_category: :syste
it_behaves_like 'resource access tokens creation', 'group'
context 'when token creation is not allowed' do
- it_behaves_like 'resource access tokens creation disallowed', 'Group access token creation is disabled in this group. You can still use and manage existing tokens.'
+ it_behaves_like 'resource access tokens creation disallowed', 'Group access token creation is disabled in this group.'
end
end
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index de4b9964b98..67133b1856f 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -461,9 +461,11 @@ RSpec.describe 'Group', feature_category: :groups_and_projects do
describe 'new subgroup / project button' do
let_it_be(:group, reload: true) do
- create(:group,
- project_creation_level: Gitlab::Access::NO_ONE_PROJECT_ACCESS,
- subgroup_creation_level: Gitlab::Access::OWNER_SUBGROUP_ACCESS)
+ create(
+ :group,
+ project_creation_level: Gitlab::Access::NO_ONE_PROJECT_ACCESS,
+ subgroup_creation_level: Gitlab::Access::OWNER_SUBGROUP_ACCESS
+ )
end
before do
diff --git a/spec/features/help_pages_spec.rb b/spec/features/help_pages_spec.rb
index 905c5e25f6e..627326dde18 100644
--- a/spec/features/help_pages_spec.rb
+++ b/spec/features/help_pages_spec.rb
@@ -47,9 +47,11 @@ RSpec.describe 'Help Pages', feature_category: :shared do
describe 'when help page is customized' do
before do
- stub_application_setting(help_page_hide_commercial_content: true,
- help_page_text: 'My Custom Text',
- help_page_support_url: 'http://example.com/help')
+ stub_application_setting(
+ help_page_hide_commercial_content: true,
+ help_page_text: 'My Custom Text',
+ help_page_support_url: 'http://example.com/help'
+ )
sign_in(create(:user))
visit help_path
diff --git a/spec/features/ics/dashboard_issues_spec.rb b/spec/features/ics/dashboard_issues_spec.rb
index 7115bd7dff7..00318f83105 100644
--- a/spec/features/ics/dashboard_issues_spec.rb
+++ b/spec/features/ics/dashboard_issues_spec.rb
@@ -29,9 +29,11 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'with no referer' do
it 'renders calendar feed' do
sign_in user
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date')
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date'
+ )
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -42,9 +44,11 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
it 'renders calendar feed as text/plain' do
sign_in user
page.driver.header('Referer', issues_dashboard_url(host: Settings.gitlab.base_url))
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date')
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date'
+ )
expect(response_headers['Content-Type']).to have_content('text/plain')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -54,10 +58,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'when filtered by milestone' do
it 'renders calendar feed' do
sign_in user
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date',
- milestone_title: milestone.title)
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date',
+ milestone_title: milestone.title
+ )
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -69,10 +75,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
it 'renders calendar feed' do
personal_access_token = create(:personal_access_token, user: user)
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date',
- private_token: personal_access_token.token)
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date',
+ private_token: personal_access_token.token
+ )
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -81,10 +89,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'when authenticated via feed token' do
it 'renders calendar feed' do
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date',
- feed_token: user.feed_token)
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date',
+ feed_token: user.feed_token
+ )
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -93,15 +103,24 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'issue with due date' do
let!(:issue) do
- create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
- description: 'test desc', due_date: Date.tomorrow)
+ create(
+ :issue,
+ author: user,
+ assignees: [assignee],
+ project: project,
+ title: 'test title',
+ description: 'test desc',
+ due_date: Date.tomorrow
+ )
end
it 'renders issue fields' do
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date',
- feed_token: user.feed_token)
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date',
+ feed_token: user.feed_token
+ )
expect(body).to have_text("SUMMARY:test title (in #{project.full_path})")
# line length for ics is 75 chars
diff --git a/spec/features/ics/group_issues_spec.rb b/spec/features/ics/group_issues_spec.rb
index 164f5df7cc5..ce9f5638a00 100644
--- a/spec/features/ics/group_issues_spec.rb
+++ b/spec/features/ics/group_issues_spec.rb
@@ -71,8 +71,15 @@ RSpec.describe 'Group Issues Calendar Feed', feature_category: :groups_and_proje
context 'issue with due date' do
let!(:issue) do
- create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
- description: 'test desc', due_date: Date.tomorrow)
+ create(
+ :issue,
+ author: user,
+ assignees: [assignee],
+ project: project,
+ title: 'test title',
+ description: 'test desc',
+ due_date: Date.tomorrow
+ )
end
it 'renders issue fields' do
diff --git a/spec/features/ics/project_issues_spec.rb b/spec/features/ics/project_issues_spec.rb
index daad6f1df2f..c26147e0310 100644
--- a/spec/features/ics/project_issues_spec.rb
+++ b/spec/features/ics/project_issues_spec.rb
@@ -70,8 +70,15 @@ RSpec.describe 'Project Issues Calendar Feed', feature_category: :groups_and_pro
context 'issue with due date' do
let!(:issue) do
- create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
- description: 'test desc', due_date: Date.tomorrow)
+ create(
+ :issue,
+ author: user,
+ assignees: [assignee],
+ project: project,
+ title: 'test title',
+ description: 'test desc',
+ due_date: Date.tomorrow
+ )
end
it 'renders issue fields' do
diff --git a/spec/features/incidents/incident_timeline_events_spec.rb b/spec/features/incidents/incident_timeline_events_spec.rb
index 4d51ed652c9..bd3658ab60f 100644
--- a/spec/features/incidents/incident_timeline_events_spec.rb
+++ b/spec/features/incidents/incident_timeline_events_spec.rb
@@ -86,14 +86,14 @@ RSpec.describe 'Incident timeline events', :js, feature_category: :incident_mana
def trigger_dropdown_action(text)
click_button _('More actions')
- page.within '.gl-dropdown-contents' do
- page.find('.gl-dropdown-item', text: text).click
+ page.within '[data-testid="disclosure-content"]' do
+ page.find('[data-testid="disclosure-dropdown-item"]', text: text).click
end
end
end
it_behaves_like 'for each incident details route',
- 'add, edit, and delete timeline events',
- tab_text: s_('Incident|Timeline'),
- tab: 'timeline'
+ 'add, edit, and delete timeline events',
+ tab_text: s_('Incident|Timeline'),
+ tab: 'timeline'
end
diff --git a/spec/features/incidents/user_views_incident_spec.rb b/spec/features/incidents/user_views_incident_spec.rb
index 8739c99bdd0..bbf579b09a8 100644
--- a/spec/features/incidents/user_views_incident_spec.rb
+++ b/spec/features/incidents/user_views_incident_spec.rb
@@ -31,10 +31,12 @@ RSpec.describe "User views incident", feature_category: :incident_management do
describe 'user actions' do
it 'shows the merge request and incident actions', :js, :aggregate_failures do
- expected_href = new_project_issue_path(project,
- issuable_template: 'incident',
- issue: { issue_type: 'incident' },
- add_related_issue: incident.iid)
+ expected_href = new_project_issue_path(
+ project,
+ issuable_template: 'incident',
+ issue: { issue_type: 'incident' },
+ add_related_issue: incident.iid
+ )
click_button 'Incident actions'
diff --git a/spec/features/invites_spec.rb b/spec/features/invites_spec.rb
index a1e75a94326..03ec72980e5 100644
--- a/spec/features/invites_spec.rb
+++ b/spec/features/invites_spec.rb
@@ -232,7 +232,8 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate
end
context 'when the user signs up for an account with the invitation email address' do
- it 'redirects to the most recent membership activity page with all invitations automatically accepted' do
+ it 'redirects to the most recent membership activity page with all invitations automatically accepted',
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417092' do
fill_in_sign_up_form(new_user)
fill_in_welcome_form
diff --git a/spec/features/issuables/issuable_list_spec.rb b/spec/features/issuables/issuable_list_spec.rb
index c979aff2147..7bf9620f282 100644
--- a/spec/features/issuables/issuable_list_spec.rb
+++ b/spec/features/issuables/issuable_list_spec.rb
@@ -99,9 +99,7 @@ RSpec.describe 'issuable list', :js, feature_category: :team_planning do
if issuable_type == :issue
issue = Issue.reorder(:iid).first
- merge_request = create(:merge_request,
- source_project: project,
- source_branch: generate(:branch))
+ merge_request = create(:merge_request, source_project: project, source_branch: generate(:branch))
create(:merge_requests_closing_issues, issue: issue, merge_request: merge_request)
end
diff --git a/spec/features/issuables/markdown_references/jira_spec.rb b/spec/features/issuables/markdown_references/jira_spec.rb
index 887bc7d0c87..e072231c6e9 100644
--- a/spec/features/issuables/markdown_references/jira_spec.rb
+++ b/spec/features/issuables/markdown_references/jira_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe "Jira", :js, feature_category: :team_planning do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
let(:actual_project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, target_project: actual_project, source_project: actual_project) }
@@ -24,6 +26,7 @@ RSpec.describe "Jira", :js, feature_category: :team_planning do
sign_in(user)
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
build_note
end
diff --git a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
index 7f6a044a575..d35f037247d 100644
--- a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
+++ b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
@@ -12,9 +12,9 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
url = new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid)
if title.empty?
- %Q{a[href="#{url}"]}
+ %{a[href="#{url}"]}
else
- %Q{a[title="#{title}"][href="#{url}"]}
+ %{a[title="#{title}"][href="#{url}"]}
end
end
@@ -30,7 +30,7 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
end
it 'shows a button to resolve all threads by creating a new issue' do
- find('.discussions-counter .dropdown-toggle').click
+ find('.discussions-counter .gl-new-dropdown-toggle').click
within('.discussions-counter') do
expect(page).to have_link(_("Resolve all with new issue"), href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid))
@@ -49,7 +49,7 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
context 'creating an issue for threads' do
before do
- find('.discussions-counter .dropdown-toggle').click
+ find('.discussions-counter .gl-new-dropdown-toggle').click
find(resolve_all_discussions_link_selector).click
end
@@ -65,7 +65,7 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
before do
project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED)
visit project_merge_request_path(project, merge_request)
- find('.discussions-counter .dropdown-toggle').click
+ find('.discussions-counter .gl-new-dropdown-toggle').click
end
it 'does not show a link to create a new issue' do
diff --git a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
index 3a32bd34af8..73a920421a3 100644
--- a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
+++ b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
@@ -74,8 +74,11 @@ RSpec.describe 'Resolve an open thread in a merge request by creating an issue',
before do
project.add_reporter(user)
sign_in user
- visit new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid,
- discussion_to_resolve: discussion.id)
+ visit new_project_issue_path(
+ project,
+ merge_request_to_resolve_discussions_of: merge_request.iid,
+ discussion_to_resolve: discussion.id
+ )
end
it 'shows a notice to ask someone else to resolve the threads' do
diff --git a/spec/features/issues/filtered_search/filter_issues_spec.rb b/spec/features/issues/filtered_search/filter_issues_spec.rb
index a65befc3115..b9562f12ef2 100644
--- a/spec/features/issues/filtered_search/filter_issues_spec.rb
+++ b/spec/features/issues/filtered_search/filter_issues_spec.rb
@@ -455,19 +455,6 @@ RSpec.describe 'Filter issues', :js, feature_category: :team_planning do
expect(page).to have_content(issue.title)
end
- it 'filters issues by searched text containing special characters' do
- stub_feature_flags(issues_full_text_search: false)
-
- issue = create(:issue, project: project, author: user, title: "issue with !@\#{$%^&*()-+")
-
- search = '!@#{$%^&*()-+'
- submit_search_term(search)
-
- expect_issues_list_count(1)
- expect_search_term(search)
- expect(page).to have_content(issue.title)
- end
-
it 'does not show any issues' do
search = 'testing'
submit_search_term(search)
diff --git a/spec/features/issues/form_spec.rb b/spec/features/issues/form_spec.rb
index 9702e43a559..5f7a4f26a98 100644
--- a/spec/features/issues/form_spec.rb
+++ b/spec/features/issues/form_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do
include ActionView::Helpers::JavaScriptHelper
include ListboxHelpers
+ include ContentEditorHelpers
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
@@ -36,6 +37,7 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do
describe 'new issue' do
before do
visit new_project_issue_path(project)
+ close_rich_text_promo_popover_if_present
end
describe 'shorten users API pagination limit' do
@@ -745,7 +747,7 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do
context 'with the visible_label_selection_on_metadata feature flag enabled', :js do
let(:visible_label_selection_on_metadata) { true }
- it 'creates project label from dropdown' do
+ it 'creates project label from dropdown', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/416585' do
find('[data-testid="labels-select-dropdown-contents"] button').click
wait_for_all_requests
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index 665c7307231..47e9575da54 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -4,6 +4,8 @@ require 'spec_helper'
RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
include CookieHelper
+ include Features::AutocompleteHelpers
+ include ContentEditorHelpers
let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let_it_be(:user2) { create(:user, name: 'Marge Simpson', username: 'msimpson') }
@@ -31,6 +33,7 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
before do
sign_in(user)
visit new_project_issue_path(project)
+ close_rich_text_promo_popover_if_present
wait_for_requests
end
@@ -49,6 +52,7 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
sign_in(user)
set_cookie('new-actions-popover-viewed', 'true')
visit project_issue_path(project, issue_to_edit)
+ close_rich_text_promo_popover_if_present
wait_for_requests
end
@@ -84,6 +88,7 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
before do
sign_in(user)
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
wait_for_requests
end
@@ -453,12 +458,4 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
wait_for_requests
end
-
- def find_autocomplete_menu
- find('.atwho-view ul', visible: true)
- end
-
- def find_highlighted_autocomplete_item
- find('.atwho-view li.cur', visible: true)
- end
end
diff --git a/spec/features/issues/markdown_toolbar_spec.rb b/spec/features/issues/markdown_toolbar_spec.rb
index 5cabaf16960..b7a0949edce 100644
--- a/spec/features/issues/markdown_toolbar_spec.rb
+++ b/spec/features/issues/markdown_toolbar_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Issue markdown toolbar', :js, feature_category: :team_planning do
+ include ContentEditorHelpers
+
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:user) { create(:user) }
@@ -11,6 +13,7 @@ RSpec.describe 'Issue markdown toolbar', :js, feature_category: :team_planning d
sign_in(user)
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it "doesn't include first new line when adding bold" do
@@ -32,4 +35,17 @@ RSpec.describe 'Issue markdown toolbar', :js, feature_category: :team_planning d
expect(find_field('Comment').value).to eq("test\n_underline_\n")
end
+
+ it "makes sure bold works fine after preview" do
+ fill_in 'Comment', with: "test"
+
+ click_button 'Preview'
+ click_button 'Continue editing'
+
+ page.evaluate_script('document.getElementById("note-body").setSelectionRange(0, 4)')
+
+ click_button 'Add bold text'
+
+ expect(find_field('Comment').value).to eq("**test**")
+ end
end
diff --git a/spec/features/issues/note_polling_spec.rb b/spec/features/issues/note_polling_spec.rb
index dae71481352..23f9347d726 100644
--- a/spec/features/issues/note_polling_spec.rb
+++ b/spec/features/issues/note_polling_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Issue notes polling', :js, feature_category: :team_planning do
include NoteInteractionHelpers
+ include ContentEditorHelpers
let(:project) { create(:project, :public) }
let(:issue) { create(:issue, project: project) }
@@ -11,6 +12,7 @@ RSpec.describe 'Issue notes polling', :js, feature_category: :team_planning do
describe 'creates' do
before do
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it 'displays the new comment' do
@@ -31,6 +33,7 @@ RSpec.describe 'Issue notes polling', :js, feature_category: :team_planning do
before do
sign_in(user)
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it 'displays the updated content' do
@@ -59,7 +62,10 @@ RSpec.describe 'Issue notes polling', :js, feature_category: :team_planning do
update_note(existing_note, updated_text)
+ expect(page).to have_selector(".alert")
+
find("#note_#{existing_note.id} .note-edit-cancel").click
+ click_button('Cancel editing')
expect(page).to have_selector("#note_#{existing_note.id}", text: updated_text)
end
diff --git a/spec/features/issues/notes_on_issues_spec.rb b/spec/features/issues/notes_on_issues_spec.rb
index 8d6262efa53..62855c7467f 100644
--- a/spec/features/issues/notes_on_issues_spec.rb
+++ b/spec/features/issues/notes_on_issues_spec.rb
@@ -3,9 +3,12 @@
require 'spec_helper'
RSpec.describe 'Create notes on issues', :js, feature_category: :team_planning do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
def submit_comment(text)
+ close_rich_text_promo_popover_if_present
fill_in 'note[note]', with: text
click_button 'Comment'
wait_for_requests
diff --git a/spec/features/issues/related_issues_spec.rb b/spec/features/issues/related_issues_spec.rb
index f460b4b1c7f..5102eeb2511 100644
--- a/spec/features/issues/related_issues_spec.rb
+++ b/spec/features/issues/related_issues_spec.rb
@@ -22,6 +22,10 @@ RSpec.describe 'Related issues', :js, feature_category: :team_planning do
let_it_be(:private_issue) { create(:issue, project: private_project) }
let_it_be(:public_issue) { create(:issue, project: public_project) }
+ before do
+ stub_feature_flags(move_close_into_dropdown: false)
+ end
+
context 'widget visibility' do
context 'when not logged in' do
it 'does not show widget when internal project' do
diff --git a/spec/features/issues/service_desk_spec.rb b/spec/features/issues/service_desk_spec.rb
index 0cadeb62fa2..923967c52c0 100644
--- a/spec/features/issues/service_desk_spec.rb
+++ b/spec/features/issues/service_desk_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :team_planning do
+RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_desk do
let(:project) { create(:project, :private, service_desk_enabled: true) }
let_it_be(:user) { create(:user) }
@@ -15,6 +15,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :team_planni
project.add_maintainer(user)
sign_in(user)
+ stub_feature_flags(service_desk_vue_list: false)
end
describe 'navigation to service desk' do
@@ -176,5 +177,69 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :team_planni
end
end
end
+
+ context 'when service_desk_vue_list feature flag is enabled' do
+ before do
+ stub_feature_flags(service_desk_vue_list: true)
+ stub_feature_flags(frontend_caching: true)
+ end
+
+ context 'when there are issues' do
+ let_it_be(:project) { create(:project, :private, service_desk_enabled: true) }
+ let_it_be(:other_user) { create(:user) }
+ let_it_be(:service_desk_issue) { create(:issue, project: project, title: 'Help from email', author: support_bot, service_desk_reply_to: 'service.desk@example.com') }
+ let_it_be(:other_user_issue) { create(:issue, project: project, author: other_user) }
+
+ describe 'service desk info content' do
+ before do
+ visit service_desk_project_issues_path(project)
+ end
+
+ it 'displays the small info box, documentation, a button to configure service desk, and the address' do
+ aggregate_failures do
+ expect(page).to have_link('Learn more', href: help_page_path('user/project/service_desk'))
+ expect(page).not_to have_link('Enable Service Desk')
+ expect(page).to have_content(project.service_desk_address)
+ end
+ end
+ end
+
+ describe 'issues list' do
+ before do
+ visit service_desk_project_issues_path(project)
+ end
+
+ it 'only displays issues created by support bot' do
+ expect(page).to have_selector('.issues-list .issue', count: 1)
+ expect(page).to have_text('Help from email')
+ expect(page).not_to have_text('Unrelated issue')
+ end
+
+ it 'shows service_desk_reply_to in issues list' do
+ expect(page).to have_text('by GitLab Support Bot')
+ end
+ end
+ end
+ end
+
+ context 'for feature flags' do
+ let(:service_desk_issue) { create(:issue, project: project, author: support_bot, service_desk_reply_to: 'service.desk@example.com') }
+
+ before do
+ visit project_issue_path(project, service_desk_issue)
+ end
+
+ it 'pushes the service_desk_ticket feature flag to frontend when available' do
+ stub_feature_flags(service_desk_ticket: true)
+
+ expect(page).to have_pushed_frontend_feature_flags(serviceDeskTicket: true)
+ end
+
+ it 'does not push the service_desk_ticket feature flag to frontend when not available' do
+ stub_feature_flags(service_desk_ticket: false)
+
+ expect(page).not_to have_pushed_frontend_feature_flags(serviceDeskTicket: false)
+ end
+ end
end
end
diff --git a/spec/features/issues/user_comments_on_issue_spec.rb b/spec/features/issues/user_comments_on_issue_spec.rb
index 3ace560fb40..f18992325d8 100644
--- a/spec/features/issues/user_comments_on_issue_spec.rb
+++ b/spec/features/issues/user_comments_on_issue_spec.rb
@@ -3,7 +3,9 @@
require "spec_helper"
RSpec.describe "User comments on issue", :js, feature_category: :team_planning do
+ include Features::AutocompleteHelpers
include Features::NotesHelpers
+ include ContentEditorHelpers
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
@@ -14,6 +16,7 @@ RSpec.describe "User comments on issue", :js, feature_category: :team_planning d
sign_in(user)
visit(project_issue_path(project, issue))
+ close_rich_text_promo_popover_if_present
end
context "when adding comments" do
@@ -92,10 +95,4 @@ RSpec.describe "User comments on issue", :js, feature_category: :team_planning d
end
end
end
-
- private
-
- def find_highlighted_autocomplete_item
- find('.atwho-view li.cur', visible: true)
- end
end
diff --git a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
index 1050bc2456f..ecb899a7ca2 100644
--- a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
+++ b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
@@ -137,13 +137,25 @@ RSpec.describe 'User creates branch and merge request on issue page', :js, featu
context "when there is a referenced merge request" do
let!(:note) do
- create(:note, :on_issue, :system, project: project, noteable: issue,
- note: "mentioned in #{referenced_mr.to_reference}")
+ create(
+ :note,
+ :on_issue,
+ :system,
+ project: project,
+ noteable: issue,
+ note: "mentioned in #{referenced_mr.to_reference}"
+ )
end
let(:referenced_mr) do
- create(:merge_request, :simple, source_project: project, target_project: project,
- description: "Fixes #{issue.to_reference}", author: user)
+ create(
+ :merge_request,
+ :simple,
+ source_project: project,
+ target_project: project,
+ description: "Fixes #{issue.to_reference}",
+ author: user
+ )
end
before do
diff --git a/spec/features/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb
index d4148717f0a..76b07d903bc 100644
--- a/spec/features/issues/user_creates_issue_spec.rb
+++ b/spec/features/issues/user_creates_issue_spec.rb
@@ -4,6 +4,7 @@ require "spec_helper"
RSpec.describe "User creates issue", feature_category: :team_planning do
include DropzoneHelper
+ include ContentEditorHelpers
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:user) { create(:user) }
@@ -41,6 +42,7 @@ RSpec.describe "User creates issue", feature_category: :team_planning do
sign_in(user)
visit(new_project_issue_path(project))
+ close_rich_text_promo_popover_if_present
end
context 'available metadata' do
@@ -159,7 +161,7 @@ RSpec.describe "User creates issue", feature_category: :team_planning do
click_button 'Create issue'
page.within '.issuable-sidebar' do
- expect(page).to have_content date.to_s(:medium)
+ expect(page).to have_content date.to_fs(:medium)
end
end
end
diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb
index bc20660d2a0..0938f9c7d12 100644
--- a/spec/features/issues/user_edits_issue_spec.rb
+++ b/spec/features/issues/user_edits_issue_spec.rb
@@ -4,6 +4,7 @@ require "spec_helper"
RSpec.describe "Issues > User edits issue", :js, feature_category: :team_planning do
include CookieHelper
+ include ContentEditorHelpers
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:project_with_milestones) { create(:project_empty_repo, :public) }
@@ -27,6 +28,7 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
before do
stub_licensed_features(multiple_issue_assignees: false)
visit edit_project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'edits content using the content editor'
@@ -82,7 +84,7 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
click_button _('Save changes')
page.within '.issuable-sidebar' do
- expect(page).to have_content date.to_s(:medium)
+ expect(page).to have_content date.to_fs(:medium)
end
end
@@ -125,7 +127,7 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
expect(issuable_form).to have_selector(markdown_field_focused_selector)
page.within issuable_form do
- click_button("Switch to rich text")
+ click_button("Switch to rich text editing")
end
expect(issuable_form).not_to have_selector(content_editor_focused_selector)
@@ -137,7 +139,7 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
expect(issuable_form).to have_selector(content_editor_focused_selector)
page.within issuable_form do
- click_button("Switch to Markdown")
+ click_button("Switch to plain text editing")
end
expect(issuable_form).not_to have_selector(markdown_field_focused_selector)
diff --git a/spec/features/issues/user_filters_issues_spec.rb b/spec/features/issues/user_filters_issues_spec.rb
index 9f69e94b86c..593b43698a2 100644
--- a/spec/features/issues/user_filters_issues_spec.rb
+++ b/spec/features/issues/user_filters_issues_spec.rb
@@ -8,11 +8,13 @@ RSpec.describe 'User filters issues', :js, feature_category: :team_planning do
before do
%w[foobar barbaz].each do |title|
- create(:issue,
- author: user,
- assignees: [user],
- project: project,
- title: title)
+ create(
+ :issue,
+ author: user,
+ assignees: [user],
+ project: project,
+ title: title
+ )
end
@issue = Issue.find_by(title: 'foobar')
diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb
index 539e429534e..e1099ba242e 100644
--- a/spec/features/issues/user_interacts_with_awards_spec.rb
+++ b/spec/features/issues/user_interacts_with_awards_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'User interacts with awards', feature_category: :team_planning do
include MobileHelpers
+ include ContentEditorHelpers
let(:user) { create(:user) }
@@ -16,6 +17,7 @@ RSpec.describe 'User interacts with awards', feature_category: :team_planning do
sign_in(user)
visit(project_issue_path(project, issue))
+ close_rich_text_promo_popover_if_present
end
it 'toggles the thumbsup award emoji', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/27959' do
diff --git a/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb b/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
index 91b18454af5..ef448c06a3f 100644
--- a/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
+++ b/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_category: :team_planning do
+ include ContentEditorHelpers
+
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:user) { create(:user) }
@@ -20,6 +22,7 @@ RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_categor
using_session :other_session do
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
expect(page.find('.assignee')).to have_content 'None'
end
@@ -43,6 +46,7 @@ RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_categor
using_session :other_session do
visit project_issue_path(project, issue)
wait_for_requests
+ close_rich_text_promo_popover_if_present
expect(labels_value).to have_content('None')
end
@@ -50,6 +54,7 @@ RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_categor
visit project_issue_path(project, issue)
wait_for_requests
+ close_rich_text_promo_popover_if_present
expect(labels_value).to have_content('None')
page.within(labels_widget) do
diff --git a/spec/features/issues/user_uses_quick_actions_spec.rb b/spec/features/issues/user_uses_quick_actions_spec.rb
index e85a521e242..dc149ccc698 100644
--- a/spec/features/issues/user_uses_quick_actions_spec.rb
+++ b/spec/features/issues/user_uses_quick_actions_spec.rb
@@ -9,6 +9,7 @@ require 'spec_helper'
# for each existing quick action unless they test something not tested by existing tests.
RSpec.describe 'Issues > User uses quick actions', :js, feature_category: :team_planning do
include Features::NotesHelpers
+ include ContentEditorHelpers
context "issuable common quick actions" do
let(:new_url_opts) { {} }
@@ -34,6 +35,7 @@ RSpec.describe 'Issues > User uses quick actions', :js, feature_category: :team_
sign_in(user)
visit project_issue_path(project, issue)
wait_for_all_requests
+ close_rich_text_promo_popover_if_present
end
after do
diff --git a/spec/features/labels_hierarchy_spec.rb b/spec/features/labels_hierarchy_spec.rb
index e8f40a1ceab..eb79d6e64f3 100644
--- a/spec/features/labels_hierarchy_spec.rb
+++ b/spec/features/labels_hierarchy_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
include FilteredSearchHelpers
+ include ContentEditorHelpers
let!(:user) { create(:user) }
let!(:grandparent) { create(:group) }
@@ -165,6 +166,7 @@ RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
context 'when creating new issuable' do
before do
visit new_project_issue_path(project_1)
+ close_rich_text_promo_popover_if_present
end
it 'is able to assign ancestor group labels' do
@@ -202,6 +204,7 @@ RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
context 'when creating new issuable' do
before do
visit new_project_issue_path(project_1)
+ close_rich_text_promo_popover_if_present
end
it 'is able to assign ancestor group labels' do
@@ -233,6 +236,7 @@ RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
project_1.add_developer(user)
visit project_issue_path(project_1, issue)
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'assigning labels from sidebar'
diff --git a/spec/features/markdown/keyboard_shortcuts_spec.rb b/spec/features/markdown/keyboard_shortcuts_spec.rb
index cfb8e61689f..6f128e16041 100644
--- a/spec/features/markdown/keyboard_shortcuts_spec.rb
+++ b/spec/features/markdown/keyboard_shortcuts_spec.rb
@@ -102,15 +102,16 @@ RSpec.describe 'Markdown keyboard shortcuts', :js, feature_category: :team_plann
it_behaves_like 'keyboard shortcuts'
it_behaves_like 'no side effects'
- end
- context 'Haml markdown editor' do
- let(:path_to_visit) { new_project_issue_path(project) }
- let(:markdown_field) { find_field('Description') }
- let(:non_markdown_field) { find_field('Title') }
+ context 'if preview is toggled before shortcuts' do
+ before do
+ click_button "Preview"
+ click_button "Continue editing"
+ end
- it_behaves_like 'keyboard shortcuts'
- it_behaves_like 'no side effects'
+ it_behaves_like 'keyboard shortcuts'
+ it_behaves_like 'no side effects'
+ end
end
def type_and_select(text)
diff --git a/spec/features/merge_request/maintainer_edits_fork_spec.rb b/spec/features/merge_request/maintainer_edits_fork_spec.rb
index c9aa22e396b..7603696c60c 100644
--- a/spec/features/merge_request/maintainer_edits_fork_spec.rb
+++ b/spec/features/merge_request/maintainer_edits_fork_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'a maintainer edits files on a source-branch of an MR from a fork', :js, :sidekiq_might_not_need_inline,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
include Features::SourceEditorSpecHelpers
include ProjectForksHelper
let(:user) { create(:user, username: 'the-maintainer') }
@@ -12,13 +12,15 @@ feature_category: :code_review_workflow do
let(:source_project) { fork_project(target_project, author, repository: true) }
let(:merge_request) do
- create(:merge_request,
- source_project: source_project,
- target_project: target_project,
- source_branch: 'fix',
- target_branch: 'master',
- author: author,
- allow_collaboration: true)
+ create(
+ :merge_request,
+ source_project: source_project,
+ target_project: target_project,
+ source_branch: 'fix',
+ target_branch: 'master',
+ author: author,
+ allow_collaboration: true
+ )
end
before do
diff --git a/spec/features/merge_request/user_accepts_merge_request_spec.rb b/spec/features/merge_request/user_accepts_merge_request_spec.rb
index e3989a8a192..38291573256 100644
--- a/spec/features/merge_request/user_accepts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_accepts_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inline, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
let(:project) { create(:project, :public, :repository) }
let(:user) { create(:user) }
@@ -15,6 +17,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
context 'presents merged merge request content' do
it 'when merge method is set to merge commit' do
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
click_merge_button
@@ -30,6 +33,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
merge_request = create(:merge_request, :rebased, source_project: project)
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
click_merge_button
@@ -40,6 +44,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
merge_request = create(:merge_request, :rebased, source_project: project, squash: true)
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
click_merge_button
@@ -51,6 +56,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
context 'with removing the source branch' do
before do
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
end
it 'accepts a merge request' do
@@ -69,6 +75,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
context 'without removing the source branch' do
before do
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
end
it 'accepts a merge request' do
@@ -86,6 +93,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
context 'when a URL has an anchor' do
before do
visit(merge_request_path(merge_request, anchor: 'note_123'))
+ close_rich_text_promo_popover_if_present
end
it 'accepts a merge request' do
@@ -106,6 +114,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
merge_request.mark_as_mergeable
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
end
it 'accepts a merge request' do
diff --git a/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb b/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb
index 0ff773ef02d..149b2e2bb0f 100644
--- a/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb
+++ b/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'create a merge request, allowing commits from members who can merge to the target branch', :js,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
include ProjectForksHelper
let(:user) { create(:user) }
let(:target_project) { create(:project, :public, :repository) }
@@ -67,10 +67,12 @@ feature_category: :code_review_workflow do
context 'when a member who can merge tries to edit the option' do
let(:member) { create(:user) }
let(:merge_request) do
- create(:merge_request,
- source_project: source_project,
- target_project: target_project,
- source_branch: 'fixes')
+ create(
+ :merge_request,
+ source_project: source_project,
+ target_project: target_project,
+ source_branch: 'fixes'
+ )
end
before do
diff --git a/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb b/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
index 537702df12d..446f6a470de 100644
--- a/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
+++ b/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User closes/reopens a merge request', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297500',
- feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
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 35e2fa2f89c..215fe1f7521 100644
--- a/spec/features/merge_request/user_comments_on_diff_spec.rb
+++ b/spec/features/merge_request/user_comments_on_diff_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
+ include ContentEditorHelpers
let(:project) { create(:project, :repository) }
let(:merge_request) do
@@ -128,6 +129,30 @@ RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_wo
context 'when adding comments' do
include_examples 'comment on merge request file'
+
+ context 'when adding a diff suggestion in rich text editor' do
+ it 'works on the Overview tab' do
+ click_diff_line(find_by_scrolling("[id='#{sample_commit.line_code}']"))
+
+ page.within('.js-discussion-note-form') do
+ fill_in(:note_note, with: "```suggestion:-0+0\nchanged line\n```")
+ find('.js-comment-button').click
+ end
+
+ visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
+
+ page.within('.notes .discussion') do
+ find('.js-vue-discussion-reply').click
+ click_button "Switch to rich text editing"
+ click_button "Insert suggestion"
+ end
+
+ within '[data-testid="content-editor"]' do
+ expect(page).to have_content('Suggested change From line')
+ end
+ end
+ end
end
context 'when adding multiline comments' do
diff --git a/spec/features/merge_request/user_creates_merge_request_spec.rb b/spec/features/merge_request/user_creates_merge_request_spec.rb
index 97b423f2cc2..eab5cee976e 100644
--- a/spec/features/merge_request/user_creates_merge_request_spec.rb
+++ b/spec/features/merge_request/user_creates_merge_request_spec.rb
@@ -110,11 +110,13 @@ RSpec.describe 'User creates a merge request', :js, feature_category: :code_revi
context 'when project is public and merge requests are private' do
let_it_be(:project) do
- create(:project,
- :public,
- :repository,
- group: group,
- merge_requests_access_level: ProjectFeature::DISABLED)
+ create(
+ :project,
+ :public,
+ :repository,
+ group: group,
+ merge_requests_access_level: ProjectFeature::DISABLED
+ )
end
context 'and user is a guest' do
diff --git a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
index fa713bdbc5d..2fcbb4e70c3 100644
--- a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
+++ b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
@@ -32,6 +32,7 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
end
let(:sidebar_assignee_tooltip) { sidebar_assignee_avatar_link['title'] || '' }
+ let(:sidebar_assignee_merge_ability) { sidebar_assignee_avatar_link['data-cannot-merge'] || '' }
context 'when GraphQL assignees widget feature flag is disabled' do
let(:sidebar_assignee_dropdown_item) do
@@ -57,13 +58,13 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
wait_for_requests
end
- shared_examples 'when assigned' do |expected_tooltip: ''|
+ shared_examples 'when assigned' do |expected_tooltip: '', expected_cannot_merge: ''|
it 'shows assignee name' do
expect(sidebar_assignee_block).to have_text(assignee.name)
end
- it "shows assignee tooltip '#{expected_tooltip}'" do
- expect(sidebar_assignee_tooltip).to eql(expected_tooltip)
+ it "sets data-cannot-merge to '#{expected_cannot_merge}'" do
+ expect(sidebar_assignee_merge_ability).to eql(expected_cannot_merge)
end
context 'when edit is clicked' do
@@ -88,7 +89,7 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
context 'when assigned to developer' do
let(:assignee) { project_developers.last }
- it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge'
+ it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge', expected_cannot_merge: 'true'
end
end
@@ -140,13 +141,13 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
wait_for_requests
end
- shared_examples 'when assigned' do |expected_tooltip: ''|
+ shared_examples 'when assigned' do |expected_tooltip: '', expected_cannot_merge: ''|
it 'shows assignee name' do
expect(sidebar_assignee_block).to have_text(assignee.name)
end
- it "shows assignee tooltip '#{expected_tooltip}'" do
- expect(sidebar_assignee_tooltip).to eql(expected_tooltip)
+ it "sets data-cannot-merge to '#{expected_cannot_merge}'" do
+ expect(sidebar_assignee_merge_ability).to eql(expected_cannot_merge)
end
context 'when edit is clicked' do
@@ -169,7 +170,7 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
context 'when assigned to developer' do
let(:assignee) { project_developers.last }
- it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge'
+ it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge', expected_cannot_merge: 'true'
end
end
diff --git a/spec/features/merge_request/user_edits_merge_request_spec.rb b/spec/features/merge_request/user_edits_merge_request_spec.rb
index 584a17ae33d..b1cff72c374 100644
--- a/spec/features/merge_request/user_edits_merge_request_spec.rb
+++ b/spec/features/merge_request/user_edits_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User edits a merge request', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:user) { create(:user) }
@@ -85,6 +87,8 @@ RSpec.describe 'User edits a merge request', :js, feature_category: :code_review
describe 'changing target branch' do
it 'allows user to change target branch' do
+ close_rich_text_promo_popover_if_present
+
expect(page).to have_content('From master into feature')
first('.js-target-branch').click
diff --git a/spec/features/merge_request/user_edits_mr_spec.rb b/spec/features/merge_request/user_edits_mr_spec.rb
index 76588832ee1..ab7183775b9 100644
--- a/spec/features/merge_request/user_edits_mr_spec.rb
+++ b/spec/features/merge_request/user_edits_mr_spec.rb
@@ -184,7 +184,11 @@ RSpec.describe 'Merge request > User edits MR', feature_category: :code_review_w
it 'allows to unselect "Remove source branch"', :js do
expect(merge_request.merge_params['force_remove_source_branch']).to be_truthy
- visit edit_project_merge_request_path(target_project, merge_request)
+ begin
+ visit edit_project_merge_request_path(target_project, merge_request)
+ rescue Selenium::WebDriver::Error::UnexpectedAlertOpenError
+ end
+
uncheck 'Delete source branch when merge request is accepted'
click_button 'Save changes'
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 a013666a496..a96ec1f68aa 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
@@ -64,7 +64,7 @@ RSpec.describe 'Batch diffs', :js, feature_category: :code_review_workflow do
context 'which is in at least page 2 of the batched pages of diffs' do
it 'scrolls to the correct discussion',
- quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/293814' } do
+ quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/293814' } do
page.within get_first_diff do
click_link('just now')
end
diff --git a/spec/features/merge_request/user_merges_immediately_spec.rb b/spec/features/merge_request/user_merges_immediately_spec.rb
index d47968ebc6b..5fe9947d0df 100644
--- a/spec/features/merge_request/user_merges_immediately_spec.rb
+++ b/spec/features/merge_request/user_merges_immediately_spec.rb
@@ -3,20 +3,28 @@
require 'spec_helper'
RSpec.describe 'Merge requests > User merges immediately', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: project,
- author: user,
- title: 'Bug NS-04',
- head_pipeline: pipeline,
- source_branch: pipeline.ref)
+ create(
+ :merge_request_with_diffs,
+ source_project: project,
+ author: user,
+ title: 'Bug NS-04',
+ head_pipeline: pipeline,
+ source_branch: pipeline.ref
+ )
end
let(:pipeline) do
- create(:ci_pipeline, project: project,
- ref: 'master',
- sha: project.repository.commit('master').id)
+ create(
+ :ci_pipeline,
+ project: project,
+ ref: 'master',
+ sha: project.repository.commit('master').id
+ )
end
context 'when there is active pipeline for merge request' do
@@ -25,6 +33,7 @@ RSpec.describe 'Merge requests > User merges immediately', :js, feature_category
project.add_maintainer(user)
sign_in(user)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'enables merge immediately' do
diff --git a/spec/features/merge_request/user_merges_merge_request_spec.rb b/spec/features/merge_request/user_merges_merge_request_spec.rb
index 6ffb33603d5..402405e1fb6 100644
--- a/spec/features/merge_request/user_merges_merge_request_spec.rb
+++ b/spec/features/merge_request/user_merges_merge_request_spec.rb
@@ -3,6 +3,8 @@
require "spec_helper"
RSpec.describe "User merges a merge request", :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:user) { project.first_owner }
before do
@@ -29,6 +31,7 @@ RSpec.describe "User merges a merge request", :js, feature_category: :code_revie
create(:merge_request, source_project: project, source_branch: 'branch-1')
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
expect(page).to have_css('.js-merge-counter', text: '2')
diff --git a/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb b/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb
index 19b5ad0fa84..62404077cea 100644
--- a/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb
+++ b/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:merge_request) { create(:merge_request_with_diffs) }
let(:project) { merge_request.target_project }
@@ -13,22 +15,6 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea
context 'project does not have CI enabled' do
it 'allows MR to be merged' do
- stub_feature_flags(auto_merge_labels_mr_widget: false)
-
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- page.within('.mr-state-widget') do
- expect(page).to have_button 'Merge'
- end
- end
- end
-
- context 'project does not have CI enabled and auto_merge_labels_mr_widget on' do
- it 'allows MR to be merged' do
- stub_feature_flags(auto_merge_labels_mr_widget: true)
-
visit project_merge_request_path(project, merge_request)
wait_for_requests
@@ -41,89 +27,19 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea
context 'when project has CI enabled' do
let!(:pipeline) do
- create(:ci_empty_pipeline,
- project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- status: status, head_pipeline_of: merge_request)
+ create(
+ :ci_empty_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ status: status,
+ head_pipeline_of: merge_request
+ )
end
context 'when merge requests can only be merged if the pipeline succeeds' do
before do
project.update_attribute(:only_allow_merge_if_pipeline_succeeds, true)
-
- stub_feature_flags(auto_merge_labels_mr_widget: false)
- end
-
- context 'when CI is running' do
- let(:status) { :running }
-
- it 'does not allow to merge immediately' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).to have_button 'Merge when pipeline succeeds'
- expect(page).not_to have_button '.js-merge-moment'
- end
- end
-
- context 'when CI failed' do
- let(:status) { :failed }
-
- it 'does not allow MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).not_to have_button('Merge', exact: true)
- expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure or learn about other solutions.')
- end
- end
-
- context 'when CI canceled' do
- let(:status) { :canceled }
-
- it 'does not allow MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).not_to have_button('Merge', exact: true)
- expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure or learn about other solutions.')
- end
- end
-
- context 'when CI succeeded' do
- let(:status) { :success }
-
- it 'allows MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).to have_button('Merge', exact: true)
- end
- end
-
- context 'when CI skipped' do
- let(:status) { :skipped }
-
- it 'does not allow MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).not_to have_button('Merge', exact: true)
- end
- end
- end
-
- context 'when merge requests can only be merged if the pipeline succeeds with auto_merge_labels_mr_widget on' do
- before do
- project.update_attribute(:only_allow_merge_if_pipeline_succeeds, true)
-
- stub_feature_flags(auto_merge_labels_mr_widget: true)
end
context 'when CI is running' do
@@ -193,58 +109,6 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea
context 'when merge requests can be merged when the build failed' do
before do
project.update_attribute(:only_allow_merge_if_pipeline_succeeds, false)
-
- stub_feature_flags(auto_merge_labels_mr_widget: false)
- end
-
- context 'when CI is running' do
- let(:status) { :running }
-
- it 'allows MR to be merged immediately' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).to have_button 'Merge when pipeline succeeds'
-
- page.find('.js-merge-moment').click
- expect(page).to have_content 'Merge immediately'
- end
- end
-
- context 'when CI failed' do
- let(:status) { :failed }
-
- it 'allows MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
- page.within('.mr-state-widget') do
- expect(page).to have_button 'Merge'
- end
- end
- end
-
- context 'when CI succeeded' do
- let(:status) { :success }
-
- it 'allows MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- page.within('.mr-state-widget') do
- expect(page).to have_button 'Merge'
- end
- end
- end
- end
-
- context 'when merge requests can be merged when the build failed with auto_merge_labels_mr_widget on' do
- before do
- project.update_attribute(:only_allow_merge_if_pipeline_succeeds, false)
-
- stub_feature_flags(auto_merge_labels_mr_widget: true)
end
context 'when CI is running' do
@@ -252,6 +116,7 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea
it 'allows MR to be merged immediately' do
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
wait_for_requests
diff --git a/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb b/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
index e42e4735ee2..ebec8a6d2ea 100644
--- a/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
+++ b/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
@@ -6,17 +6,23 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) do
- create(:merge_request_with_diffs, source_project: project,
- author: user,
- title: 'Bug NS-04',
- merge_params: { force_remove_source_branch: '1' })
+ create(
+ :merge_request_with_diffs,
+ source_project: project,
+ author: user,
+ title: 'Bug NS-04',
+ merge_params: { force_remove_source_branch: '1' }
+ )
end
let(:pipeline) do
- create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- head_pipeline_of: merge_request)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ head_pipeline_of: merge_request
+ )
end
before do
@@ -26,83 +32,6 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur
context 'when there is active pipeline for merge request' do
before do
create(:ci_build, pipeline: pipeline)
- stub_feature_flags(auto_merge_labels_mr_widget: false)
-
- sign_in(user)
- visit project_merge_request_path(project, merge_request)
- end
-
- describe 'enabling Merge when pipeline succeeds' do
- shared_examples 'Merge when pipeline succeeds activator' do
- it 'activates the Merge when pipeline succeeds feature', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/410105' do
- click_button "Merge when pipeline succeeds"
-
- expect(page).to have_content "Set by #{user.name} to be merged automatically when the pipeline succeeds"
- expect(page).to have_content "Source branch will not be deleted"
- expect(page).to have_selector ".js-cancel-auto-merge"
- visit project_merge_request_path(project, merge_request) # Needed to refresh the page
- expect(page).to have_content /enabled an automatic merge when the pipeline for \h{8} succeeds/i
- end
- end
-
- context "when enabled immediately" do
- it_behaves_like 'Merge when pipeline succeeds activator'
- end
-
- context 'when enabled after pipeline status changed', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/258667' do
- before do
- pipeline.run!
-
- # We depend on merge request widget being reloaded
- # so we have to wait for asynchronous call to reload it
- # and have_content expectation handles that.
- #
- expect(page).to have_content "Pipeline ##{pipeline.id} running"
- end
-
- it_behaves_like 'Merge when pipeline succeeds activator'
- end
-
- context 'when enabled after it was previously canceled' do
- before do
- click_button "Merge when pipeline succeeds"
-
- wait_for_requests
-
- click_button "Cancel auto-merge"
-
- wait_for_requests
-
- expect(page).to have_content 'Merge when pipeline succeeds'
- end
-
- it_behaves_like 'Merge when pipeline succeeds activator'
- end
-
- context 'when it was enabled and then canceled' do
- let(:merge_request) do
- create(:merge_request_with_diffs,
- :merge_when_pipeline_succeeds,
- source_project: project,
- title: 'Bug NS-04',
- author: user,
- merge_user: user)
- end
-
- before do
- merge_request.merge_params['force_remove_source_branch'] = '0'
- merge_request.save!
- click_button "Cancel auto-merge"
- end
-
- it_behaves_like 'Merge when pipeline succeeds activator'
- end
- end
- end
-
- context 'when there is active pipeline for merge request with auto_merge_labels_mr_widget on' do
- before do
- create(:ci_build, pipeline: pipeline)
stub_feature_flags(auto_merge_labels_mr_widget: true)
sign_in(user)
@@ -144,12 +73,14 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur
context 'when it was enabled and then canceled' do
let(:merge_request) do
- create(:merge_request_with_diffs,
- :merge_when_pipeline_succeeds,
- source_project: project,
- title: 'Bug NS-04',
- author: user,
- merge_user: user)
+ create(
+ :merge_request_with_diffs,
+ :merge_when_pipeline_succeeds,
+ source_project: project,
+ title: 'Bug NS-04',
+ author: user,
+ merge_user: user
+ )
end
before do
@@ -165,91 +96,15 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur
context 'when merge when pipeline succeeds is enabled' do
let(:merge_request) do
- create(:merge_request_with_diffs, :simple, :merge_when_pipeline_succeeds,
+ create(
+ :merge_request_with_diffs,
+ :simple,
+ :merge_when_pipeline_succeeds,
source_project: project,
author: user,
merge_user: user,
- title: 'MepMep')
- end
-
- let!(:build) do
- create(:ci_build, pipeline: pipeline)
- end
-
- before do
- stub_feature_flags(auto_merge_labels_mr_widget: false)
- sign_in user
- visit project_merge_request_path(project, merge_request)
- end
-
- it 'allows to cancel the automatic merge', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/412416' do
- click_button "Cancel auto-merge"
-
- expect(page).to have_button "Merge when pipeline succeeds"
-
- refresh
-
- expect(page).to have_content "canceled the automatic merge"
- end
-
- context 'when pipeline succeeds' do
- before do
- build.success
- refresh
- end
-
- it 'merges merge request', :sidekiq_might_not_need_inline do
- expect(page).to have_content 'Changes merged'
- expect(merge_request.reload).to be_merged
- end
- end
-
- context 'view merge request with MWPS enabled but automatically merge fails' do
- before do
- merge_request.update!(
- merge_user: merge_request.author,
- merge_error: 'Something went wrong'
- )
- refresh
- end
-
- it 'shows information about the merge error' do
- # Wait for the `ci_status` and `merge_check` requests
- wait_for_requests
-
- page.within('.mr-state-widget') do
- expect(page).to have_content('Something went wrong. Try again.')
- end
- end
- end
-
- context 'view merge request with MWPS enabled but automatically merge fails' do
- before do
- merge_request.update!(
- merge_user: merge_request.author,
- merge_error: 'Something went wrong.'
- )
- refresh
- end
-
- it 'shows information about the merge error' do
- # Wait for the `ci_status` and `merge_check` requests
- wait_for_requests
-
- page.within('.mr-state-widget') do
- expect(page).to have_content('Something went wrong. Try again.')
- end
- end
- end
- end
-
- context 'when merge when pipeline succeeds is enabled and auto_merge_labels_mr_widget on' do
- let(:merge_request) do
- create(:merge_request_with_diffs, :simple, :merge_when_pipeline_succeeds,
- source_project: project,
- author: user,
- merge_user: user,
- title: 'MepMep')
+ title: 'MepMep'
+ )
end
let!(:build) do
diff --git a/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb b/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb
index 601310cbacf..63f03ae64e0 100644
--- a/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb
+++ b/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb
@@ -20,13 +20,15 @@ RSpec.describe 'Merge request > User opens checkout branch modal', :js, feature_
let(:source_project) { fork_project(project, author, repository: true) }
let(:merge_request) do
- create(:merge_request,
- source_project: source_project,
- target_project: project,
- source_branch: 'fix',
- target_branch: 'master',
- author: author,
- allow_collaboration: true)
+ create(
+ :merge_request,
+ source_project: source_project,
+ target_project: project,
+ source_branch: 'fix',
+ target_branch: 'master',
+ author: author,
+ allow_collaboration: true
+ )
end
it 'shows instructions' do
diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb
index a749821b083..0278d2af08f 100644
--- a/spec/features/merge_request/user_posts_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_notes_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_review_workflow do
include NoteInteractionHelpers
+ include ContentEditorHelpers
let_it_be(:project) { create(:project, :repository) }
@@ -13,8 +14,7 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_
end
let!(:note) do
- create(:note_on_merge_request, :with_attachment, noteable: merge_request,
- project: project)
+ create(:note_on_merge_request, :with_attachment, noteable: merge_request, project: project)
end
before do
@@ -22,6 +22,7 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_
sign_in(user)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
subject { page }
@@ -47,8 +48,8 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_
it 'has enable submit button, preview button and saves content to local storage' do
page.within('.js-main-target-form') do
page.within('[data-testid="comment-button"]') do
- expect(page).to have_css('.split-content-button')
- expect(page).not_to have_css('.split-content-button[disabled]')
+ expect(page).to have_css('.gl-button')
+ expect(page).not_to have_css('.disabled')
end
expect(page).to have_css('.js-md-preview-button', visible: true)
end
@@ -131,16 +132,16 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_
describe 'when previewing a note' do
it 'shows the toolbar buttons when editing a note' do
- page.within('.js-main-target-form') do
- expect(page).to have_css('.md-header-toolbar')
+ page.within('.js-main-target-form .md-header-toolbar') do
+ expect(page).to have_css('button', count: 16)
end
end
it 'hides the toolbar buttons when previewing a note' do
wait_for_requests
click_button("Preview")
- page.within('.js-main-target-form') do
- expect(page).not_to have_css('.md-header-toolbar')
+ page.within('.js-main-target-form .md-header-toolbar') do
+ expect(page).to have_css('button', count: 1)
end
end
end
diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
index 5da9f4a1f19..e8ffca43aa2 100644
--- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
+++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Merge request > User resolves diff notes and threads', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:guest) { create(:user) }
@@ -10,9 +12,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js, feat
let!(:note) { create(:diff_note_on_merge_request, project: project, noteable: merge_request, note: "| Markdown | Table |\n|-------|---------|\n| first | second |") }
let(:path) { "files/ruby/popen.rb" }
let(:position) do
- build(:text_diff_position,
- file: path, old_line: nil, new_line: 9,
- diff_refs: merge_request.diff_refs)
+ build(:text_diff_position, file: path, old_line: nil, new_line: 9, diff_refs: merge_request.diff_refs)
end
before do
@@ -543,5 +543,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js, feat
# Wait for MR widget to load
wait_for_requests
+
+ close_rich_text_promo_popover_if_present
end
end
diff --git a/spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb b/spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb
index 5c41ac79552..cb57f1fd549 100644
--- a/spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb
+++ b/spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Merge request > User resolves outdated diff discussions',
- :js, feature_category: :code_review_workflow do
+ :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :repository, :public) }
let(:merge_request) do
@@ -30,17 +30,21 @@ RSpec.describe 'Merge request > User resolves outdated diff discussions',
end
let!(:outdated_discussion) do
- create(:diff_note_on_merge_request,
- project: project,
- noteable: merge_request,
- position: outdated_position).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ project: project,
+ noteable: merge_request,
+ position: outdated_position
+ ).to_discussion
end
let!(:current_discussion) do
- create(:diff_note_on_merge_request,
- noteable: merge_request,
- project: project,
- position: current_position).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ noteable: merge_request,
+ project: project,
+ position: current_position
+ ).to_discussion
end
before do
diff --git a/spec/features/merge_request/user_resolves_wip_mr_spec.rb b/spec/features/merge_request/user_resolves_wip_mr_spec.rb
index 01cc6bd5167..15a7755429b 100644
--- a/spec/features/merge_request/user_resolves_wip_mr_spec.rb
+++ b/spec/features/merge_request/user_resolves_wip_mr_spec.rb
@@ -6,17 +6,23 @@ RSpec.describe 'Merge request > User resolves Draft', :js, feature_category: :co
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) do
- create(:merge_request_with_diffs, source_project: project,
- author: user,
- title: 'Draft: Bug NS-04',
- merge_params: { force_remove_source_branch: '1' })
+ create(
+ :merge_request_with_diffs,
+ source_project: project,
+ author: user,
+ title: 'Draft: Bug NS-04',
+ merge_params: { force_remove_source_branch: '1' }
+ )
end
let(:pipeline) do
- create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- head_pipeline_of: merge_request)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ head_pipeline_of: merge_request
+ )
end
before do
diff --git a/spec/features/merge_request/user_reverts_merge_request_spec.rb b/spec/features/merge_request/user_reverts_merge_request_spec.rb
index 8c782056aa4..68adc4d47b6 100644
--- a/spec/features/merge_request/user_reverts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_reverts_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User reverts a merge request', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
let(:project) { create(:project, :public, :repository) }
let(:user) { create(:user) }
@@ -13,6 +15,7 @@ RSpec.describe 'User reverts a merge request', :js, feature_category: :code_revi
sign_in(user)
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
page.within('.mr-state-widget') do
click_button 'Merge'
diff --git a/spec/features/merge_request/user_sees_deployment_widget_spec.rb b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
index 6dcebad300c..d237faba663 100644
--- a/spec/features/merge_request/user_sees_deployment_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe 'Merge request > User sees deployment widget', :js, feature_categ
wait_for_requests
assert_env_widget("Deployed to", environment.name)
- expect(find('.js-deploy-time')['title']).to eq(deployment.created_at.to_time.in_time_zone.to_s(:medium))
+ expect(find('.js-deploy-time')['title']).to eq(deployment.created_at.to_time.in_time_zone.to_fs(:medium))
end
context 'when a user created a new merge request with the same SHA' do
@@ -115,8 +115,7 @@ RSpec.describe 'Merge request > User sees deployment widget', :js, feature_categ
context 'with stop action' do
let(:manual) do
- create(:ci_build, :manual, pipeline: pipeline,
- name: 'close_app', environment: environment.name)
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app', environment: environment.name)
end
before do
@@ -146,8 +145,7 @@ RSpec.describe 'Merge request > User sees deployment widget', :js, feature_categ
context 'with stop action with the review_apps_redeploy_mr_widget feature flag turned on' do
let(:manual) do
- create(:ci_build, :manual, pipeline: pipeline,
- name: 'close_app', environment: environment.name)
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app', environment: environment.name)
end
before do
diff --git a/spec/features/merge_request/user_sees_diff_spec.rb b/spec/features/merge_request/user_sees_diff_spec.rb
index 3fb3ef12fcc..57f378a86b6 100644
--- a/spec/features/merge_request/user_sees_diff_spec.rb
+++ b/spec/features/merge_request/user_sees_diff_spec.rb
@@ -77,8 +77,9 @@ RSpec.describe 'Merge request > User sees diff', :js, feature_category: :code_re
sign_in(author_user)
visit diffs_project_merge_request_path(project, merge_request)
- # Throws `Capybara::Poltergeist::InvalidSelector` if we try to use `#hash` syntax
- expect(page).to have_selector(".js-edit-blob", visible: false)
+ first(".js-diff-more-actions").click
+
+ expect(page).to have_selector(".js-edit-blob")
end
end
diff --git a/spec/features/merge_request/user_sees_discussions_navigation_spec.rb b/spec/features/merge_request/user_sees_discussions_navigation_spec.rb
index 338e4329190..4cce40972e9 100644
--- a/spec/features/merge_request/user_sees_discussions_navigation_spec.rb
+++ b/spec/features/merge_request/user_sees_discussions_navigation_spec.rb
@@ -13,27 +13,30 @@ RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_
describe 'Code discussions' do
let!(:position) do
- build(:text_diff_position, :added,
- file: "files/images/wm.svg",
- new_line: 1,
- diff_refs: merge_request.diff_refs
+ build(
+ :text_diff_position, :added,
+ file: "files/images/wm.svg",
+ new_line: 1,
+ diff_refs: merge_request.diff_refs
)
end
let!(:first_discussion) do
- create(:diff_note_on_merge_request,
- noteable: merge_request,
- project: project,
- position: position
- ).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ noteable: merge_request,
+ project: project,
+ position: position
+ ).to_discussion
end
let!(:second_discussion) do
- create(:diff_note_on_merge_request,
- noteable: merge_request,
- project: project,
- position: position
- ).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ noteable: merge_request,
+ project: project,
+ position: position
+ ).to_discussion
end
let(:first_discussion_selector) { ".discussion[data-discussion-id='#{first_discussion.id}']" }
@@ -74,11 +77,12 @@ RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_
context 'with resolved threads' do
let!(:resolved_discussion) do
- create(:diff_note_on_merge_request,
- noteable: merge_request,
- project: project,
- position: position
- ).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ noteable: merge_request,
+ project: project,
+ position: position
+ ).to_discussion
end
let(:resolved_discussion_selector) { ".discussion[data-discussion-id='#{resolved_discussion.id}']" }
@@ -92,7 +96,7 @@ RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_
end
it 'excludes resolved threads during navigation',
- quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383687' do
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383687' do
goto_next_thread
goto_next_thread
goto_next_thread
diff --git a/spec/features/merge_request/user_sees_discussions_spec.rb b/spec/features/merge_request/user_sees_discussions_spec.rb
index 3ca5ac23ddb..3482d468bc1 100644
--- a/spec/features/merge_request/user_sees_discussions_spec.rb
+++ b/spec/features/merge_request/user_sees_discussions_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees threads', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project) }
@@ -29,6 +31,7 @@ RSpec.describe 'Merge request > User sees threads', :js, feature_category: :code
before do
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
context 'active threads' do
@@ -71,6 +74,7 @@ RSpec.describe 'Merge request > User sees threads', :js, feature_category: :code
before do
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
# TODO: https://gitlab.com/gitlab-org/gitlab-foss/issues/48034
diff --git a/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb b/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb
index 476be5ab599..9955c13b769 100644
--- a/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees merge button depending on unresolved threads', :js,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
let(:project) { create(:project, :repository) }
let(:user) { project.creator }
let!(:merge_request) { create(:merge_request_with_diff_notes, source_project: project, author: user) }
diff --git a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
index ca12e0e2b65..8c4dbf5ebfd 100644
--- a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
@@ -36,11 +36,13 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
context 'when a user created a merge request in the parent project' do
let!(:merge_request) do
- create(:merge_request,
- source_project: project,
- target_project: project,
- source_branch: 'feature',
- target_branch: 'master')
+ create(
+ :merge_request,
+ source_project: project,
+ target_project: project,
+ source_branch: 'feature',
+ target_branch: 'master'
+ )
end
let!(:push_pipeline) do
@@ -56,8 +58,6 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
end
before do
- stub_feature_flags(auto_merge_labels_mr_widget: false)
-
visit project_merge_request_path(project, merge_request)
page.within('.merge-request-tabs') do
@@ -144,53 +144,8 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
end
end
- context 'when a user merges a merge request in the parent project', :sidekiq_might_not_need_inline do
- before do
- click_link 'Overview'
- click_button 'Merge when pipeline succeeds'
-
- wait_for_requests
- end
-
- context 'when detached merge request pipeline is pending' do
- it 'waits the head pipeline' do
- expect(page).to have_content('to be merged automatically when the pipeline succeeds')
- expect(page).to have_button('Cancel auto-merge')
- end
- end
-
- context 'when detached merge request pipeline succeeds' do
- before do
- detached_merge_request_pipeline.reload.succeed!
-
- wait_for_requests
- end
-
- it 'merges the merge request' do
- expect(page).to have_content('Merged by')
- expect(page).to have_button('Revert')
- end
- end
-
- context 'when branch pipeline succeeds' do
- before do
- click_link 'Overview'
- push_pipeline.reload.succeed!
-
- wait_for_requests
- end
-
- it 'waits the head pipeline' do
- expect(page).to have_content('to be merged automatically when the pipeline succeeds')
- expect(page).to have_button('Cancel auto-merge')
- end
- end
- end
-
- context 'when a user created a merge request in the parent project with auto_merge_labels_mr_widget on' do
+ context 'when a user created a merge request in the parent project' do
before do
- stub_feature_flags(auto_merge_labels_mr_widget: true)
-
visit project_merge_request_path(project, merge_request)
page.within('.merge-request-tabs') do
@@ -263,11 +218,13 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
context 'when a user created a merge request from a forked project to the parent project', :sidekiq_might_not_need_inline do
let(:merge_request) do
- create(:merge_request,
- source_project: forked_project,
- target_project: project,
- source_branch: 'feature',
- target_branch: 'master')
+ create(
+ :merge_request,
+ source_project: forked_project,
+ target_project: project,
+ source_branch: 'feature',
+ target_branch: 'master'
+ )
end
let!(:push_pipeline) do
@@ -390,8 +347,15 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
context 'when the latest pipeline is running in the parent project' do
before do
- Ci::CreatePipelineService.new(project, user, ref: 'feature')
- .execute(:merge_request_event, merge_request: merge_request)
+ create(:ci_pipeline,
+ source: :merge_request_event,
+ project: project,
+ ref: 'feature',
+ sha: merge_request.diff_head_sha,
+ user: user,
+ merge_request: merge_request,
+ status: :running)
+ merge_request.update_head_pipeline
end
context 'when the previous pipeline failed in the fork project' do
@@ -404,10 +368,10 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
project.update!(only_allow_merge_if_pipeline_succeeds: true)
end
- it 'shows MWPS button' do
+ it 'shows Set to auto-merge button' do
visit project_merge_request_path(project, merge_request)
- expect(page).to have_button('Merge when pipeline succeeds')
+ expect(page).to have_button('Set to auto-merge')
end
end
end
@@ -417,7 +381,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
before do
click_link("Overview")
- click_button 'Merge when pipeline succeeds'
+ click_button 'Set to auto-merge'
wait_for_requests
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 cb56e79fcc0..3cac24838a3 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
include ProjectForksHelper
include TestReportsHelper
include ReactiveCachingHelpers
+ include ContentEditorHelpers
let(:project) { create(:project, :repository) }
let(:project_only_mwps) { create(:project, :repository, only_allow_merge_if_pipeline_succeeds: true) }
@@ -57,6 +58,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
merge_request.update!(head_pipeline: pipeline)
deployment.update!(status: :success)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'shows environments link' do
@@ -118,15 +120,19 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
context 'view merge request with failed GitLab CI pipelines' do
before do
commit_status = create(:commit_status, project: project, status: 'failed')
- pipeline = create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- status: 'failed',
- statuses: [commit_status],
- head_pipeline_of: merge_request)
+ pipeline = create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ status: 'failed',
+ statuses: [commit_status],
+ head_pipeline_of: merge_request
+ )
create(:ci_build, :pending, pipeline: pipeline)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'has merge button that shows modal when pipeline does not succeeded' do
@@ -278,12 +284,15 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
context 'view merge request with MWBS button' do
before do
commit_status = create(:commit_status, project: project, status: 'pending')
- pipeline = create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- status: 'pending',
- statuses: [commit_status],
- head_pipeline_of: merge_request)
+ pipeline = create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ status: 'pending',
+ statuses: [commit_status],
+ head_pipeline_of: merge_request
+ )
create(:ci_build, :pending, pipeline: pipeline)
visit project_merge_request_path(project, merge_request)
@@ -298,9 +307,12 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
context 'view merge request where there is no pipeline yet' do
before do
- pipeline = create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch)
+ pipeline = create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch
+ )
create(:ci_build, pipeline: pipeline)
visit project_merge_request_path(project, merge_request)
@@ -394,6 +406,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
before do
allow_any_instance_of(Repository).to receive(:merge).and_return(false)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'updates the MR widget', :sidekiq_might_not_need_inline do
@@ -415,6 +428,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
sign_in(user2)
merge_request.update!(source_project: forked_project)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'user can merge into the target project', :sidekiq_inline do
@@ -452,6 +466,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
allow_any_instance_of(MergeRequest).to receive(:merge_ongoing?).and_return(true)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
wait_for_requests
@@ -510,11 +525,13 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
context 'when merge request has test reports' do
let!(:head_pipeline) do
- create(:ci_pipeline,
- :success,
- project: project,
- ref: merge_request.source_branch,
- sha: merge_request.diff_head_sha)
+ create(
+ :ci_pipeline,
+ :success,
+ project: project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha
+ )
end
let!(:build) { create(:ci_build, :success, pipeline: head_pipeline, project: project) }
diff --git a/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb b/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
index fac0a84f155..7b8ac50f1ae 100644
--- a/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
@@ -3,16 +3,19 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees MR from deleted forked project',
- :js, feature_category: :code_review_workflow do
+ :js, feature_category: :code_review_workflow do
include ProjectForksHelper
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:forked_project) { fork_project(project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: forked_project,
- target_project: project,
- description: 'Test merge request')
+ create(
+ :merge_request_with_diffs,
+ source_project: forked_project,
+ target_project: project,
+ description: 'Test merge request'
+ )
end
before do
diff --git a/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb b/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
index 9b46cf37648..29a76768774 100644
--- a/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
+++ b/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
@@ -6,7 +6,7 @@ require 'spec_helper'
# message to be shown by JavaScript when the source branch was deleted.
# Please do not remove ":js".
RSpec.describe 'Merge request > User sees MR with deleted source branch',
- :js, feature_category: :code_review_workflow do
+ :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project) }
let(:user) { project.creator }
diff --git a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
index ac195dd9873..ad7ed1ceada 100644
--- a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
@@ -4,25 +4,33 @@ require 'spec_helper'
RSpec.describe 'Merge request > User sees notes from forked project', :js, feature_category: :code_review_workflow do
include ProjectForksHelper
+ include ContentEditorHelpers
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:forked_project) { fork_project(project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: forked_project,
- target_project: project,
- description: 'Test merge request')
+ create(
+ :merge_request_with_diffs,
+ source_project: forked_project,
+ target_project: project,
+ description: 'Test merge request'
+ )
end
before do
- create(:note_on_commit, note: 'A commit comment',
- project: forked_project,
- commit_id: merge_request.commit_shas.first)
+ create(
+ :note_on_commit,
+ note: 'A commit comment',
+ project: forked_project,
+ commit_id: merge_request.commit_shas.first
+ )
sign_in(user)
end
it 'user can reply to the comment', :sidekiq_might_not_need_inline do
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
expect(page).to have_content('A commit comment')
diff --git a/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
index 0816b14f9a5..5801e8a1a11 100644
--- a/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
@@ -3,23 +3,28 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees pipelines from forked project', :js,
-feature_category: :continuous_integration do
+ feature_category: :continuous_integration do
include ProjectForksHelper
let(:target_project) { create(:project, :public, :repository) }
let(:user) { target_project.creator }
let(:forked_project) { fork_project(target_project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: forked_project,
- target_project: target_project,
- description: 'Test merge request')
+ create(
+ :merge_request_with_diffs,
+ source_project: forked_project,
+ target_project: target_project,
+ description: 'Test merge request'
+ )
end
let(:pipeline) do
- create(:ci_pipeline,
- project: forked_project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch)
+ create(
+ :ci_pipeline,
+ project: forked_project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch
+ )
end
before do
diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb
index faa46ff4df1..5ce919fe2e6 100644
--- a/spec/features/merge_request/user_sees_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_spec.rb
@@ -15,11 +15,13 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co
context 'with pipelines' do
let!(:pipeline) do
- create(:ci_pipeline,
- :success,
- project: merge_request.source_project,
- ref: merge_request.source_branch,
- sha: merge_request.diff_head_sha)
+ create(
+ :ci_pipeline,
+ :success,
+ project: merge_request.source_project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha
+ )
end
let!(:manual_job) { create(:ci_build, :manual, name: 'job1', stage: 'deploy', pipeline: pipeline) }
@@ -116,9 +118,14 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co
let_it_be(:reporter_in_parent_and_developer_in_fork) { create(:user) }
let(:merge_request) do
- create(:merge_request, :with_detached_merge_request_pipeline,
- source_project: forked_project, source_branch: 'feature',
- target_project: parent_project, target_branch: 'master')
+ create(
+ :merge_request,
+ :with_detached_merge_request_pipeline,
+ source_project: forked_project,
+ source_branch: 'feature',
+ target_project: parent_project,
+ target_branch: 'master'
+ )
end
let(:config) do
@@ -193,7 +200,7 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co
def create_merge_request_pipeline
page.within('.merge-request-tabs') { click_link('Pipelines') }
- click_button('Run pipeline')
+ click_on('Run pipeline')
end
def check_pipeline(expected_project:)
diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb
index 91f8fd13681..715cc2f73be 100644
--- a/spec/features/merge_request/user_sees_versions_spec.rb
+++ b/spec/features/merge_request/user_sees_versions_spec.rb
@@ -57,9 +57,9 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod
end
it_behaves_like 'allows commenting',
- file_name: '.gitmodules',
- line_text: '[submodule "six"]',
- comment: 'Typo, please fix.'
+ file_name: '.gitmodules',
+ line_text: '[submodule "six"]',
+ comment: 'Typo, please fix.'
end
describe 'switch between versions' do
@@ -105,9 +105,9 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod
end
it_behaves_like 'allows commenting',
- file_name: '.gitmodules',
- line_text: 'path = six',
- comment: 'Typo, please fix.'
+ file_name: '.gitmodules',
+ line_text: 'path = six',
+ comment: 'Typo, please fix.'
end
describe 'compare with older version' do
@@ -172,9 +172,9 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod
end
it_behaves_like 'allows commenting',
- file_name: '.gitmodules',
- line_text: '[submodule "gitlab-shell"]',
- comment: 'Typo, please fix.'
+ file_name: '.gitmodules',
+ line_text: '[submodule "gitlab-shell"]',
+ comment: 'Typo, please fix.'
end
describe 'compare with same version' do
@@ -239,8 +239,8 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod
end
it_behaves_like 'allows commenting',
- file_name: 'files/ruby/popen.rb',
- line_text: 'RuntimeError',
- comment: 'Typo, please fix.'
+ file_name: 'files/ruby/popen.rb',
+ line_text: 'RuntimeError',
+ comment: 'Typo, please fix.'
end
end
diff --git a/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
index dae28cbb05c..e3be99254dc 100644
--- a/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
+++ b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
@@ -144,9 +144,7 @@ RSpec.describe 'Merge request > User selects branches for new MR', :js, feature_
context 'when a new merge request has a pipeline' do
let!(:pipeline) do
- create(:ci_pipeline, sha: project.commit('fix').id,
- ref: 'fix',
- project: project)
+ create(:ci_pipeline, sha: project.commit('fix').id, ref: 'fix', project: project)
end
it 'shows pipelines for a new merge request' do
diff --git a/spec/features/merge_request/user_squashes_merge_request_spec.rb b/spec/features/merge_request/user_squashes_merge_request_spec.rb
index 63faf830f7e..200f310d929 100644
--- a/spec/features/merge_request/user_squashes_merge_request_spec.rb
+++ b/spec/features/merge_request/user_squashes_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User squashes a merge request', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
let(:source_branch) { 'csv' }
@@ -12,19 +14,25 @@ RSpec.describe 'User squashes a merge request', :js, feature_category: :code_rev
shared_examples 'squash' do
it 'squashes the commits into a single commit, and adds a merge commit', :sidekiq_might_not_need_inline do
+ close_rich_text_promo_popover_if_present
+
expect(page).to have_content('Merged')
latest_master_commits = project.repository.commits_between(original_head.sha, 'master').map(&:raw)
- squash_commit = an_object_having_attributes(sha: a_string_matching(/\h{40}/),
- message: a_string_starting_with(project.merge_requests.first.default_squash_commit_message),
- author_name: user.name,
- committer_name: user.name)
+ squash_commit = an_object_having_attributes(
+ sha: a_string_matching(/\h{40}/),
+ message: a_string_starting_with(project.merge_requests.first.default_squash_commit_message),
+ author_name: user.name,
+ committer_name: user.name
+ )
- merge_commit = an_object_having_attributes(sha: a_string_matching(/\h{40}/),
- message: a_string_starting_with("Merge branch '#{source_branch}' into 'master'"),
- author_name: user.name,
- committer_name: user.name)
+ merge_commit = an_object_having_attributes(
+ sha: a_string_matching(/\h{40}/),
+ message: a_string_starting_with("Merge branch '#{source_branch}' into 'master'"),
+ author_name: user.name,
+ committer_name: user.name
+ )
expect(project.repository).not_to be_merged_to_root_ref(source_branch)
expect(latest_master_commits).to match([squash_commit, merge_commit])
@@ -33,12 +41,16 @@ RSpec.describe 'User squashes a merge request', :js, feature_category: :code_rev
shared_examples 'no squash' do
it 'accepts the merge request without squashing', :sidekiq_might_not_need_inline do
+ close_rich_text_promo_popover_if_present
+
expect(page).to have_content('Merged')
expect(project.repository).to be_merged_to_root_ref(source_branch)
end
end
def accept_mr
+ close_rich_text_promo_popover_if_present
+
expect(page).to have_button('Merge')
uncheck 'Delete source branch' unless protected_source_branch
diff --git a/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb b/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
index efd88df0f97..1a814aeb89d 100644
--- a/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
+++ b/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
+ include ContentEditorHelpers
def expect_suggestion_has_content(element, expected_changing_content, expected_suggested_content)
changing_content = element.all(:css, '.line_holder.old').map { |el| el.text(normalize_ws: true) }
@@ -35,6 +36,7 @@ RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_wo
context 'single suggestion note' do
it 'hides suggestion popover' do
click_diff_line(find_by_scrolling("[id='#{sample_compare.changes[1][:line_code]}']"))
+ close_rich_text_promo_popover_if_present
expect(page).to have_selector('.diff-suggest-popover')
@@ -303,13 +305,17 @@ RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_wo
"5 # heh"
]
- expect_suggestion_has_content(suggestion_1,
- suggestion_1_expected_changing_content,
- suggestion_1_expected_suggested_content)
-
- expect_suggestion_has_content(suggestion_2,
- suggestion_2_expected_changing_content,
- suggestion_2_expected_suggested_content)
+ expect_suggestion_has_content(
+ suggestion_1,
+ suggestion_1_expected_changing_content,
+ suggestion_1_expected_suggested_content
+ )
+
+ expect_suggestion_has_content(
+ suggestion_2,
+ suggestion_2_expected_changing_content,
+ suggestion_2_expected_suggested_content
+ )
end
end
end
diff --git a/spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb b/spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb
index 5770f5ab94d..1232e19d22b 100644
--- a/spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb
+++ b/spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb
@@ -3,19 +3,27 @@
require 'spec_helper'
RSpec.describe 'Merge Request > User tries to access private project information through the new mr page',
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
let(:current_user) { create(:user) }
let(:private_project) do
- create(:project, :public, :repository,
- path: 'nothing-to-see-here',
- name: 'nothing to see here',
- repository_access_level: ProjectFeature::PRIVATE)
+ create(
+ :project,
+ :public,
+ :repository,
+ path: 'nothing-to-see-here',
+ name: 'nothing to see here',
+ repository_access_level: ProjectFeature::PRIVATE
+ )
end
let(:owned_project) do
- create(:project, :public, :repository,
- namespace: current_user.namespace,
- creator: current_user)
+ create(
+ :project,
+ :public,
+ :repository,
+ namespace: current_user.namespace,
+ creator: current_user
+ )
end
context 'when the user enters the querystring info for the other project' do
diff --git a/spec/features/merge_request/user_uses_quick_actions_spec.rb b/spec/features/merge_request/user_uses_quick_actions_spec.rb
index 1ec86948065..1c63f5b56b0 100644
--- a/spec/features/merge_request/user_uses_quick_actions_spec.rb
+++ b/spec/features/merge_request/user_uses_quick_actions_spec.rb
@@ -8,7 +8,7 @@ require 'spec_helper'
# Because this kind of spec takes more time to run there is no need to add new ones
# for each existing quick action unless they test something not tested by existing tests.
RSpec.describe 'Merge request > User uses quick actions', :js, :use_clean_rails_redis_caching,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
include Features::NotesHelpers
let(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/merge_request/user_views_open_merge_request_spec.rb b/spec/features/merge_request/user_views_open_merge_request_spec.rb
index 1a9d40ae926..cd0ea639d4d 100644
--- a/spec/features/merge_request/user_views_open_merge_request_spec.rb
+++ b/spec/features/merge_request/user_views_open_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User views an open merge request', feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:merge_request) do
create(:merge_request, source_project: project, target_project: project, description: '# Description header')
end
@@ -53,6 +55,7 @@ RSpec.describe 'User views an open merge request', feature_category: :code_revie
sign_in(user)
visit(edit_project_merge_request_path(project, merge_request))
+ close_rich_text_promo_popover_if_present
end
it 'renders empty description preview' do
diff --git a/spec/features/merge_requests/user_lists_merge_requests_spec.rb b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
index 371c40b40a5..f594e39b2b7 100644
--- a/spec/features/merge_requests/user_lists_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
@@ -14,44 +14,52 @@ RSpec.describe 'Merge requests > User lists merge requests', feature_category: :
let(:user5) { create(:user) }
before do
- @fix = create(:merge_request,
- title: 'fix',
- source_project: project,
- source_branch: 'fix',
- assignees: [user],
- reviewers: [user, user2, user3, user4, user5],
- milestone: create(:milestone, project: project, due_date: '2013-12-11'),
- created_at: 1.minute.ago,
- updated_at: 1.minute.ago)
+ @fix = create(
+ :merge_request,
+ title: 'fix',
+ source_project: project,
+ source_branch: 'fix',
+ assignees: [user],
+ reviewers: [user, user2, user3, user4, user5],
+ milestone: create(:milestone, project: project, due_date: '2013-12-11'),
+ created_at: 1.minute.ago,
+ updated_at: 1.minute.ago
+ )
@fix.metrics.update!(merged_at: 10.seconds.ago, latest_closed_at: 20.seconds.ago)
- @markdown = create(:merge_request,
- title: 'markdown',
- source_project: project,
- source_branch: 'markdown',
- assignees: [user],
- reviewers: [user, user2, user3, user4],
- milestone: create(:milestone, project: project, due_date: '2013-12-12'),
- created_at: 2.minutes.ago,
- updated_at: 2.minutes.ago,
- state: 'merged')
+ @markdown = create(
+ :merge_request,
+ title: 'markdown',
+ source_project: project,
+ source_branch: 'markdown',
+ assignees: [user],
+ reviewers: [user, user2, user3, user4],
+ milestone: create(:milestone, project: project, due_date: '2013-12-12'),
+ created_at: 2.minutes.ago,
+ updated_at: 2.minutes.ago,
+ state: 'merged'
+ )
@markdown.metrics.update!(merged_at: 10.minutes.ago, latest_closed_at: 10.seconds.ago)
- @merge_test = create(:merge_request,
- title: 'merge-test',
- source_project: project,
- source_branch: 'merge-test',
- created_at: 3.minutes.ago,
- updated_at: 10.seconds.ago)
+ @merge_test = create(
+ :merge_request,
+ title: 'merge-test',
+ source_project: project,
+ source_branch: 'merge-test',
+ created_at: 3.minutes.ago,
+ updated_at: 10.seconds.ago
+ )
@merge_test.metrics.update!(merged_at: 10.seconds.ago, latest_closed_at: 10.seconds.ago)
- @feature = create(:merge_request,
- title: 'feature',
- source_project: project,
- source_branch: 'feautre',
- created_at: 2.minutes.ago,
- updated_at: 1.minute.ago,
- state: 'merged')
+ @feature = create(
+ :merge_request,
+ title: 'feature',
+ source_project: project,
+ source_branch: 'feautre',
+ created_at: 2.minutes.ago,
+ updated_at: 1.minute.ago,
+ state: 'merged'
+ )
@feature.metrics.update!(merged_at: 10.seconds.ago, latest_closed_at: 10.minutes.ago)
end
@@ -134,8 +142,7 @@ RSpec.describe 'Merge requests > User lists merge requests', feature_category: :
label = create(:label, project: project)
create(:label_link, label: label, target: @fix)
- visit_merge_requests(project, label_name: [label.name],
- sort: sort_value_milestone)
+ visit_merge_requests(project, label_name: [label.name], sort: sort_value_milestone)
expect(first_merge_request).to include('fix')
expect(count_merge_requests).to eq(1)
@@ -160,8 +167,7 @@ RSpec.describe 'Merge requests > User lists merge requests', feature_category: :
end
it 'sorts by milestone due date' do
- visit_merge_requests(project, label_name: [label.name, label2.name],
- sort: sort_value_milestone)
+ visit_merge_requests(project, label_name: [label.name, label2.name], sort: sort_value_milestone)
expect(first_merge_request).to include('fix')
expect(count_merge_requests).to eq(1)
@@ -169,9 +175,12 @@ RSpec.describe 'Merge requests > User lists merge requests', feature_category: :
context 'filter on assignee and' do
it 'sorts by milestone due date' do
- visit_merge_requests(project, label_name: [label.name, label2.name],
- assignee_id: user.id,
- sort: sort_value_milestone)
+ visit_merge_requests(
+ project,
+ label_name: [label.name, label2.name],
+ assignee_id: user.id,
+ sort: sort_value_milestone
+ )
expect(first_merge_request).to include('fix')
expect(count_merge_requests).to eq(1)
diff --git a/spec/features/merge_requests/user_views_open_merge_requests_spec.rb b/spec/features/merge_requests/user_views_open_merge_requests_spec.rb
index 1a2024a5511..0021f701290 100644
--- a/spec/features/merge_requests/user_views_open_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_open_merge_requests_spec.rb
@@ -57,10 +57,12 @@ RSpec.describe 'User views open merge requests', feature_category: :code_review_
let!(:build) { create :ci_build, pipeline: pipeline }
let(:merge_request) do
- create(:merge_request_with_diffs,
- source_project: project,
- target_project: project,
- source_branch: 'merge-test')
+ create(
+ :merge_request_with_diffs,
+ source_project: project,
+ target_project: project,
+ source_branch: 'merge-test'
+ )
end
let(:pipeline) do
diff --git a/spec/features/nav/top_nav_spec.rb b/spec/features/nav/top_nav_spec.rb
index 74022a4a976..ccbf4646273 100644
--- a/spec/features/nav/top_nav_spec.rb
+++ b/spec/features/nav/top_nav_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe 'top nav responsive', :js, feature_category: :navigation do
end
def invite_members_from_menu
- find('[data-testid="new-dropdown"]').click
+ find('[data-testid="new-menu-toggle"]').click
click_link('Invite members')
end
diff --git a/spec/features/participants_autocomplete_spec.rb b/spec/features/participants_autocomplete_spec.rb
index 084bf609a0d..d8501116134 100644
--- a/spec/features/participants_autocomplete_spec.rb
+++ b/spec/features/participants_autocomplete_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Member autocomplete', :js, feature_category: :groups_and_projects do
+ include Features::AutocompleteHelpers
+
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:user) { create(:user) }
let_it_be(:author) { create(:user) }
@@ -85,10 +87,4 @@ RSpec.describe 'Member autocomplete', :js, feature_category: :groups_and_project
include_examples "open suggestions when typing @", 'commit'
end
-
- private
-
- def find_autocomplete_menu
- find('.atwho-view ul', visible: true)
- end
end
diff --git a/spec/features/profiles/user_visits_profile_spec.rb b/spec/features/profiles/user_visits_profile_spec.rb
index 578025e1494..14fc6ed33b3 100644
--- a/spec/features/profiles/user_visits_profile_spec.rb
+++ b/spec/features/profiles/user_visits_profile_spec.rb
@@ -49,43 +49,127 @@ RSpec.describe 'User visits their profile', feature_category: :user_profile do
expect(page).not_to have_selector('.file-content')
end
- context 'when user has groups' do
- let(:group) do
- create :group do |group|
- group.add_owner(user)
+ context 'for tabs' do
+ shared_examples_for 'shows expected content' do
+ it 'shows expected content', :js do
+ visit(user_path(user))
+
+ page.within ".cover-block" do
+ expect(page).to have_content user.name
+ expect(page).to have_content user.username
+ end
+
+ page.within ".content" do
+ click_link link
+ end
+
+ page.within div do
+ expect(page).to have_content expected_content
+ end
end
end
- let!(:project) do
- create(:project, :repository, namespace: group) do |project|
- create(:closed_issue_event, project: project)
- project.add_maintainer(user)
+ context 'for Groups' do
+ let_it_be(:group) do
+ create :group do |group|
+ group.add_owner(user)
+ end
+ end
+
+ let_it_be(:project) do
+ create(:project, :repository, namespace: group) do |project|
+ create(:closed_issue_event, project: project)
+ project.add_maintainer(user)
+ end
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Groups' }
+ let(:div) { '#groups' }
+ let(:expected_content) { group.name }
+ end
+ end
+
+ context 'for Contributed projects' do
+ let_it_be(:project) do
+ create(:project) do |project|
+ project.add_maintainer(user)
+ end
+ end
+
+ before do
+ push_event = create(:push_event, project: project, author: user)
+ create(:push_event_payload, event: push_event)
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Contributed projects' }
+ let(:div) { '#contributed' }
+ let(:expected_content) { project.name }
+ end
+ end
+
+ context 'for personal projects' do
+ let_it_be(:project) do
+ create(:project, namespace: user.namespace)
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Personal projects' }
+ let(:div) { '#projects' }
+ let(:expected_content) { project.name }
end
end
- def click_on_profile_picture
- find(:css, '.header-user-dropdown-toggle').click
+ context 'for starred projects' do
+ let_it_be(:project) { create(:project, :public) }
- page.within ".header-user" do
- click_link user.username
+ before do
+ user.toggle_star(project)
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Starred projects' }
+ let(:div) { '#starred' }
+ let(:expected_content) { project.name }
end
end
- it 'shows user groups', :js do
- visit(profile_path)
- click_on_profile_picture
+ context 'for snippets' do
+ let_it_be(:snippet) { create(:snippet, :public, author: user) }
- page.within ".cover-block" do
- expect(page).to have_content user.name
- expect(page).to have_content user.username
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Snippets' }
+ let(:div) { '#snippets' }
+ let(:expected_content) { snippet.title }
end
+ end
+
+ context 'for followers' do
+ let_it_be(:fan) { create(:user) }
+
+ before do
+ fan.follow(user)
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Followers' }
+ let(:div) { '#followers' }
+ let(:expected_content) { fan.name }
+ end
+ end
+
+ context 'for following' do
+ let_it_be(:star) { create(:user) }
- page.within ".content" do
- click_link "Groups"
+ before do
+ user.follow(star)
end
- page.within "#groups" do
- expect(page).to have_content group.name
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Following' }
+ let(:div) { '#following' }
+ let(:expected_content) { star.name }
end
end
end
diff --git a/spec/features/projects/activity/user_sees_activity_spec.rb b/spec/features/projects/activity/user_sees_activity_spec.rb
index 5335b9d0e95..7940ded41a9 100644
--- a/spec/features/projects/activity/user_sees_activity_spec.rb
+++ b/spec/features/projects/activity/user_sees_activity_spec.rb
@@ -10,12 +10,14 @@ RSpec.describe 'Projects > Activity > User sees activity', feature_category: :gr
before do
create(:event, :created, project: project, target: issue, author: user)
event = create(:push_event, project: project, author: user)
- create(:push_event_payload,
- event: event,
- action: :created,
- commit_to: '6d394385cf567f80a8fd85055db1ab4c5295806f',
- ref: 'fix',
- commit_count: 1)
+ create(
+ :push_event_payload,
+ event: event,
+ action: :created,
+ commit_to: '6d394385cf567f80a8fd85055db1ab4c5295806f',
+ ref: 'fix',
+ commit_count: 1
+ )
end
it 'shows the last push in the activity page', :js do
diff --git a/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb b/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
index 48dcb95e09b..eaf57c566e8 100644
--- a/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
+++ b/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe "User downloads artifacts", feature_category: :build_artifacts do
shared_examples "downloading" do
it "downloads the zip" do
- expect(page.response_headers['Content-Disposition']).to eq(%Q{attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}})
+ expect(page.response_headers['Content-Disposition']).to eq(%{attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}})
expect(page.response_headers['Content-Transfer-Encoding']).to eq("binary")
expect(page.response_headers['Content-Type']).to eq("application/zip")
expect(page.source.b).to eq(job.artifacts_file.file.read.b)
diff --git a/spec/features/projects/badges/coverage_spec.rb b/spec/features/projects/badges/coverage_spec.rb
index 3c8b17607ca..c4f20ff74b2 100644
--- a/spec/features/projects/badges/coverage_spec.rb
+++ b/spec/features/projects/badges/coverage_spec.rb
@@ -190,14 +190,21 @@ RSpec.describe 'test coverage badge', feature_category: :code_testing do
end
def show_test_coverage_badge(job: nil, min_good: nil, min_acceptable: nil, min_medium: nil)
- visit coverage_project_badges_path(project, ref: :master, job: job, min_good: min_good,
- min_acceptable: min_acceptable, min_medium: min_medium, format: :svg)
+ visit coverage_project_badges_path(
+ project,
+ ref: :master,
+ job: job,
+ min_good: min_good,
+ min_acceptable: min_acceptable,
+ min_medium: min_medium,
+ format: :svg
+ )
end
def expect_coverage_badge(coverage)
svg = Nokogiri::XML.parse(page.body)
expect(page.response_headers['Content-Type']).to include('image/svg+xml')
- expect(svg.at(%Q{text:contains("#{coverage}")})).to be_truthy
+ expect(svg.at(%{text:contains("#{coverage}")})).to be_truthy
end
def expect_coverage_badge_color(color)
diff --git a/spec/features/projects/badges/pipeline_badge_spec.rb b/spec/features/projects/badges/pipeline_badge_spec.rb
index c0f5d0ffead..94772c9fc1e 100644
--- a/spec/features/projects/badges/pipeline_badge_spec.rb
+++ b/spec/features/projects/badges/pipeline_badge_spec.rb
@@ -75,7 +75,7 @@ RSpec.describe 'Pipeline Badge', feature_category: :continuous_integration do
def expect_badge(status)
svg = Nokogiri::XML.parse(page.body)
expect(page.response_headers['Content-Type']).to include('image/svg+xml')
- expect(svg.at(%Q{text:contains("#{status}")})).to be_truthy
+ expect(svg.at(%{text:contains("#{status}")})).to be_truthy
end
end
end
diff --git a/spec/features/projects/blobs/blame_spec.rb b/spec/features/projects/blobs/blame_spec.rb
index 798cd401dac..dfda200cded 100644
--- a/spec/features/projects/blobs/blame_spec.rb
+++ b/spec/features/projects/blobs/blame_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'File blame', :js, feature_category: :groups_and_projects do
+RSpec.describe 'File blame', :js, feature_category: :source_code_management do
include TreeHelper
let_it_be(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb
index 62cd9fd9a56..30a81ccc071 100644
--- a/spec/features/projects/blobs/blob_show_spec.rb
+++ b/spec/features/projects/blobs/blob_show_spec.rb
@@ -943,7 +943,7 @@ RSpec.describe 'File blob', :js, feature_category: :groups_and_projects do
page.within('.commit-actions') do
expect(page).to have_css('.ci-status-icon')
expect(page).to have_css('.ci-status-icon-running')
- expect(page).to have_css('.js-ci-status-icon-running')
+ expect(page).to have_selector('[data-testid="status_running-icon"]')
end
end
end
diff --git a/spec/features/projects/branches/download_buttons_spec.rb b/spec/features/projects/branches/download_buttons_spec.rb
index 2092af537e8..a888b5b977d 100644
--- a/spec/features/projects/branches/download_buttons_spec.rb
+++ b/spec/features/projects/branches/download_buttons_spec.rb
@@ -9,18 +9,24 @@ RSpec.describe 'Download buttons in branches page', feature_category: :groups_an
let(:project) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- sha: project.commit('binary-encoding').sha,
- ref: 'binary-encoding', # make sure the branch is in the 1st page!
- status: status)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: project.commit('binary-encoding').sha,
+ ref: 'binary-encoding', # make sure the branch is in the 1st page!
+ status: status
+ )
end
let!(:build) do
- create(:ci_build, :success, :artifacts,
- pipeline: pipeline,
- status: pipeline.status,
- name: 'build')
+ create(
+ :ci_build,
+ :success,
+ :artifacts,
+ pipeline: pipeline,
+ status: pipeline.status,
+ name: 'build'
+ )
end
before do
diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb
index 6a13d5637af..50df7bb7ca5 100644
--- a/spec/features/projects/branches_spec.rb
+++ b/spec/features/projects/branches_spec.rb
@@ -95,15 +95,22 @@ RSpec.describe 'Branches', feature_category: :groups_and_projects do
it 'shows only default_per_page active branches sorted by last updated' do
visit project_branches_filtered_path(project, state: 'active')
- expect(page).to have_content(sorted_branches(repository, count: Kaminari.config.default_per_page,
- sort_by: :updated_desc, state: 'active'))
+ expect(page).to have_content(sorted_branches(
+ repository,
+ count: Kaminari.config.default_per_page,
+ sort_by: :updated_desc,
+ state: 'active'
+ ))
end
it 'shows only default_per_page branches sorted by last updated on All branches' do
visit project_branches_filtered_path(project, state: 'all')
- expect(page).to have_content(sorted_branches(repository, count: Kaminari.config.default_per_page,
- sort_by: :updated_desc))
+ expect(page).to have_content(sorted_branches(
+ repository,
+ count: Kaminari.config.default_per_page,
+ sort_by: :updated_desc
+ ))
end
end
end
@@ -161,11 +168,15 @@ RSpec.describe 'Branches', feature_category: :groups_and_projects do
end
it 'avoids a N+1 query in branches index' do
+ new_branches_count = 20
+ sql_queries_count_threshold = 10
+
control_count = ActiveRecord::QueryRecorder.new { visit project_branches_path(project) }.count
- %w[one two three four five].each { |ref| repository.add_branch(user, ref, 'master') }
+ (1..new_branches_count).each { |number| repository.add_branch(user, "new-branch-#{number}", 'master') }
- expect { visit project_branches_filtered_path(project, state: 'all') }.not_to exceed_query_limit(control_count)
+ expect { visit project_branches_filtered_path(project, state: 'all') }
+ .not_to exceed_query_limit(control_count).with_threshold(sql_queries_count_threshold)
end
end
diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb
index 9851194bd3c..43da57c16d1 100644
--- a/spec/features/projects/ci/editor_spec.rb
+++ b/spec/features/projects/ci/editor_spec.rb
@@ -10,18 +10,144 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
let(:default_branch) { 'main' }
let(:other_branch) { 'test' }
+ let(:branch_with_invalid_ci) { 'despair' }
+
+ let(:default_content) { 'Default' }
+
+ let(:valid_content) do
+ <<~YAML
+ ---
+ stages:
+ - Build
+ - Test
+ job_a:
+ script: echo hello
+ stage: Build
+ job_b:
+ script: echo hello from job b
+ stage: Test
+ YAML
+ end
+
+ let(:invalid_content) do
+ <<~YAML
+
+ job3:
+ stage: stage_foo
+ script: echo 'Done.'
+ YAML
+ end
before do
sign_in(user)
project.add_developer(user)
- project.repository.create_file(user, project.ci_config_path_or_default, 'Default Content', message: 'Create CI file for main', branch_name: default_branch)
- project.repository.create_file(user, project.ci_config_path_or_default, 'Other Content', message: 'Create CI file for test', branch_name: other_branch)
+ project.repository.create_file(user, project.ci_config_path_or_default, default_content, message: 'Create CI file for main', branch_name: default_branch)
+ project.repository.create_file(user, project.ci_config_path_or_default, valid_content, message: 'Create CI file for test', branch_name: other_branch)
+ project.repository.create_file(user, project.ci_config_path_or_default, invalid_content, message: 'Create CI file for test', branch_name: branch_with_invalid_ci)
visit project_ci_pipeline_editor_path(project)
wait_for_requests
end
+ describe 'Default tabs' do
+ it 'renders the edit tab as the default' do
+ expect(page).to have_selector('[data-testid="editor-tab"]')
+ end
+
+ it 'renders the visualize, validate and full configuration tabs', :aggregate_failures do
+ expect(page).to have_selector('[data-testid="visualization-tab"]', visible: :hidden)
+ expect(page).to have_selector('[data-testid="validate-tab"]', visible: :hidden)
+ expect(page).to have_selector('[data-testid="merged-tab"]', visible: :hidden)
+ end
+ end
+
+ describe 'When CI yml has valid syntax' do
+ before do
+ visit project_ci_pipeline_editor_path(project, branch_name: other_branch)
+ wait_for_requests
+ end
+
+ it 'shows "Pipeline syntax is correct" in the lint widget' do
+ page.within('[data-testid="validation-segment"]') do
+ expect(page).to have_content("Pipeline syntax is correct")
+ end
+ end
+
+ it 'shows the graph in the visualization tab' do
+ click_link "Visualize"
+
+ page.within('[data-testid="graph-container"') do
+ expect(page).to have_content("job_a")
+ end
+ end
+
+ it 'can simulate pipeline in the validate tab' do
+ click_link "Validate"
+
+ click_button "Validate pipeline"
+ wait_for_requests
+
+ expect(page).to have_content("Simulation completed successfully")
+ end
+
+ it 'renders the merged yaml in the full configuration tab' do
+ click_link "Full configuration"
+
+ page.within('[data-testid="merged-tab"') do
+ expect(page).to have_content("job_a")
+ end
+ end
+ end
+
+ describe 'When CI yml has invalid syntax' do
+ before do
+ visit project_ci_pipeline_editor_path(project, branch_name: branch_with_invalid_ci)
+ wait_for_requests
+ end
+
+ it 'shows "Syntax is invalid" in the lint widget' do
+ page.within('[data-testid="validation-segment"]') do
+ expect(page).to have_content("This GitLab CI configuration is invalid")
+ end
+ end
+
+ it 'does not render the graph in the visualization tab and shows error' do
+ click_link "Visualize"
+
+ expect(page).not_to have_selector('[data-testid="graph-container"')
+ expect(page).to have_content("Your CI/CD configuration syntax is invalid. Select the Validate tab for more details.")
+ end
+
+ it 'gets a simulation error in the validate tab' do
+ click_link "Validate"
+
+ click_button "Validate pipeline"
+ wait_for_requests
+
+ expect(page).to have_content("Pipeline simulation completed with errors")
+ end
+
+ it 'renders merged yaml config' do
+ click_link "Full configuration"
+
+ page.within('[data-testid="merged-tab"') do
+ expect(page).to have_content("job3")
+ end
+ end
+ end
+
+ describe 'with unparsable yaml' do
+ it 'renders an error in the merged yaml tab' do
+ click_link "Full configuration"
+
+ page.within('[data-testid="merged-tab"') do
+ expect(page).not_to have_content("job_a")
+ expect(page).to have_content("Could not load full configuration content")
+ end
+ end
+ end
+
shared_examples 'default branch switcher behavior' do
def switch_to_branch(branch)
find('[data-testid="branch-selector"]').click
@@ -109,7 +235,7 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
expect(page).to have_content('Pipeline Editor')
page.within('#source-editor-') do
- expect(page).to have_content('Default Content123')
+ expect(page).to have_content("#{default_content}123")
end
end
@@ -166,8 +292,8 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
end
page.within('#source-editor-') do
- expect(page).to have_content('Default Content')
- expect(page).not_to have_content('Default Content123')
+ expect(page).to have_content(default_content)
+ expect(page).not_to have_content("#{default_content}123")
end
end
@@ -188,7 +314,7 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
end
page.within('#source-editor-') do
- expect(page).to have_content('Default Content123')
+ expect(page).to have_content("#{default_content}123")
end
end
end
diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb
index f9195904ea3..eadcc0e62c4 100644
--- a/spec/features/projects/clusters/gcp_spec.rb
+++ b/spec/features/projects/clusters/gcp_spec.rb
@@ -54,7 +54,7 @@ RSpec.describe 'Gcp Cluster', :js, feature_category: :deployment_management do
before do
visit project_clusters_path(project)
- click_button(class: 'dropdown-toggle-split')
+ click_button(class: 'gl-new-dropdown-toggle')
click_link 'Connect a cluster (certificate - deprecated)'
end
diff --git a/spec/features/projects/clusters/user_spec.rb b/spec/features/projects/clusters/user_spec.rb
index eb2601bb85f..6da8eea687e 100644
--- a/spec/features/projects/clusters/user_spec.rb
+++ b/spec/features/projects/clusters/user_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'User Cluster', :js, feature_category: :deployment_management do
before do
visit project_clusters_path(project)
- click_button(class: 'dropdown-toggle-split')
+ click_button(class: 'gl-new-dropdown-toggle')
click_link 'Connect a cluster (certificate - deprecated)'
end
diff --git a/spec/features/projects/clusters_spec.rb b/spec/features/projects/clusters_spec.rb
index e2737d62749..d40f929d0b2 100644
--- a/spec/features/projects/clusters_spec.rb
+++ b/spec/features/projects/clusters_spec.rb
@@ -125,12 +125,12 @@ RSpec.describe 'Clusters', :js, feature_category: :groups_and_projects do
def visit_create_cluster_page
visit project_clusters_path(project)
- click_button(class: 'dropdown-toggle-split')
+ click_button(class: 'gl-new-dropdown-toggle')
click_link 'Create a cluster'
end
def visit_connect_cluster_page
- click_button(class: 'dropdown-toggle-split')
+ click_button(class: 'gl-new-dropdown-toggle')
click_link 'Connect a cluster (certificate - deprecated)'
end
end
diff --git a/spec/features/projects/commit/builds_spec.rb b/spec/features/projects/commit/builds_spec.rb
index dfd58a99953..54a189692ce 100644
--- a/spec/features/projects/commit/builds_spec.rb
+++ b/spec/features/projects/commit/builds_spec.rb
@@ -6,9 +6,7 @@ RSpec.describe 'project commit pipelines', :js, feature_category: :continuous_in
let(:project) { create(:project, :repository) }
before do
- create(:ci_pipeline, project: project,
- sha: project.commit.sha,
- ref: 'master')
+ create(:ci_pipeline, project: project, sha: project.commit.sha, ref: 'master')
user = create(:user)
project.add_maintainer(user)
diff --git a/spec/features/projects/commit/mini_pipeline_graph_spec.rb b/spec/features/projects/commit/mini_pipeline_graph_spec.rb
index 3611efd1477..d2104799e79 100644
--- a/spec/features/projects/commit/mini_pipeline_graph_spec.rb
+++ b/spec/features/projects/commit/mini_pipeline_graph_spec.rb
@@ -7,11 +7,13 @@ RSpec.describe 'Mini Pipeline Graph in Commit View', :js, feature_category: :sou
context 'when commit has pipelines' do
let(:pipeline) do
- create(:ci_pipeline,
- status: :running,
- project: project,
- ref: project.default_branch,
- sha: project.commit.sha)
+ create(
+ :ci_pipeline,
+ status: :running,
+ project: project,
+ ref: project.default_branch,
+ sha: project.commit.sha
+ )
end
let(:build) { create(:ci_build, pipeline: pipeline, status: :running) }
diff --git a/spec/features/projects/commits/user_browses_commits_spec.rb b/spec/features/projects/commits/user_browses_commits_spec.rb
index 791f626b8d9..3513e249b63 100644
--- a/spec/features/projects/commits/user_browses_commits_spec.rb
+++ b/spec/features/projects/commits/user_browses_commits_spec.rb
@@ -175,9 +175,13 @@ RSpec.describe 'User browses commits', feature_category: :source_code_management
let(:confidential_issue) { create(:issue, confidential: true, title: 'Secret issue!', project: project) }
before do
- project.repository.create_file(user, 'dummy-file', 'dummy content',
- branch_name: 'feature',
- message: "Linking #{confidential_issue.to_reference}")
+ project.repository.create_file(
+ user,
+ 'dummy-file',
+ 'dummy content',
+ branch_name: 'feature',
+ message: "Linking #{confidential_issue.to_reference}"
+ )
end
context 'when the user cannot see confidential issues but was cached with a link', :use_clean_rails_memory_store_fragment_caching do
diff --git a/spec/features/projects/compare_spec.rb b/spec/features/projects/compare_spec.rb
index beb5fa7822b..eff538513c1 100644
--- a/spec/features/projects/compare_spec.rb
+++ b/spec/features/projects/compare_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
click_button 'Compare'
- expect(page).to have_content 'Commits'
+ expect(page).to have_content 'Commits on Source'
expect(page).to have_link 'Create merge request'
end
end
@@ -53,7 +53,7 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
select_using_dropdown('to', RepoHelpers.sample_commit.id, commit: true)
click_button 'Compare'
- expect(page).to have_content 'Commits (1)'
+ expect(page).to have_content 'Commits on Source (1)'
expect(page).to have_content "Showing 2 changed files"
diff = first('.js-unfold')
@@ -85,7 +85,7 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
click_button 'Compare'
- expect(page).to have_content 'Commits (1)'
+ expect(page).to have_content 'Commits on Source (1)'
expect(page).to have_content 'Showing 1 changed file with 5 additions and 0 deletions'
expect(page).to have_link 'View open merge request', href: project_merge_request_path(project, merge_request)
expect(page).not_to have_link 'Create merge request'
@@ -136,14 +136,14 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
visit project_compare_index_path(project, from: "feature", to: "master")
click_button('Compare')
- expect(page).to have_content 'Commits (29)'
+ expect(page).to have_content 'Commits on Source (29)'
# go to the second page
within(".files .gl-pagination") do
click_on("2")
end
- expect(page).not_to have_content 'Commits (29)'
+ expect(page).not_to have_content 'Commits on Source (29)'
end
end
end
@@ -159,7 +159,7 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
expect(find(".js-compare-to-dropdown .gl-dropdown-button-text")).to have_content("v1.1.0")
click_button "Compare"
- expect(page).to have_content "Commits"
+ expect(page).to have_content "Commits on Source"
end
end
diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb
index 0f903901984..11ea72b87a2 100644
--- a/spec/features/projects/environments/environment_spec.rb
+++ b/spec/features/projects/environments/environment_spec.rb
@@ -300,14 +300,12 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
context 'with manual action' do
let(:action) do
- create(:ci_build, :manual, pipeline: pipeline,
- name: 'deploy to production', environment: environment.name)
+ create(:ci_build, :manual, pipeline: pipeline, name: 'deploy to production', environment: environment.name)
end
context 'when user has ability to trigger deployment' do
let(:permissions) do
- create(:protected_branch, :developers_can_merge,
- name: action.ref, project: project)
+ create(:protected_branch, :developers_can_merge, name: action.ref, project: project)
end
it 'does show a play button' do
@@ -331,8 +329,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
context 'when user has no ability to trigger a deployment' do
let(:permissions) do
- create(:protected_branch, :no_one_can_merge,
- name: action.ref, project: project)
+ create(:protected_branch, :no_one_can_merge, name: action.ref, project: project)
end
it 'does not show a play button' do
@@ -391,10 +388,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
end
let(:deployment) do
- create(:deployment, :success,
- environment: environment,
- deployable: build,
- on_stop: 'close_app')
+ create(:deployment, :success, environment: environment, deployable: build, on_stop: 'close_app')
end
context 'when user has ability to stop environment' do
@@ -411,8 +405,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
context 'when user has no ability to stop environment' do
let(:permissions) do
- create(:protected_branch, :no_one_can_merge,
- name: action.ref, project: project)
+ create(:protected_branch, :no_one_can_merge, name: action.ref, project: project)
end
it 'does not allow to stop environment', :js do
@@ -445,9 +438,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
describe 'environment folders', :js do
context 'when folder name contains special charaters' do
before do
- create(:environment, project: project,
- name: 'staging-1.0/review',
- state: :available)
+ create(:environment, project: project, name: 'staging-1.0/review', state: :available)
end
it 'renders a correct environment folder' do
@@ -465,8 +456,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
let(:project) { create(:project, :repository) }
let!(:environment) do
- create(:environment, :with_review_app, project: project,
- ref: 'feature')
+ create(:environment, :with_review_app, project: project, ref: 'feature')
end
it 'user visits environment page', :js do
diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb
index 2490b1fde8e..3a2c7f0ac7b 100644
--- a/spec/features/projects/environments/environments_spec.rb
+++ b/spec/features/projects/environments/environments_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects do
+RSpec.describe 'Environments page', :js, feature_category: :continuous_delivery do
include Spec::Support::Helpers::ModalHelpers
let(:project) { create(:project) }
@@ -159,9 +159,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
let(:project) { create(:project, :repository) }
let!(:deployment) do
- create(:deployment, :success,
- environment: environment,
- sha: project.commit.id)
+ create(:deployment, :success, environment: environment, sha: project.commit.id)
end
it 'shows deployment SHA and internal ID' do
@@ -182,10 +180,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
end
let!(:deployment) do
- create(:deployment, :success,
- environment: environment,
- deployable: build,
- sha: project.commit.id)
+ create(:deployment, :success, environment: environment, deployable: build, sha: project.commit.id)
end
before do
@@ -241,10 +236,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
end
let(:deployment) do
- create(:deployment, :success,
- environment: environment,
- deployable: build,
- on_stop: 'close_app')
+ create(:deployment, :success, environment: environment, deployable: build, on_stop: 'close_app')
end
it 'shows a stop button and dialog' do
@@ -296,18 +288,11 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
let!(:build) { create(:ci_build, pipeline: pipeline) }
let!(:delayed_job) do
- create(:ci_build, :scheduled,
- pipeline: pipeline,
- name: 'delayed job',
- stage: 'test')
+ create(:ci_build, :scheduled, pipeline: pipeline, name: 'delayed job', stage: 'test')
end
let!(:deployment) do
- create(:deployment,
- :success,
- environment: environment,
- deployable: build,
- sha: project.commit.id)
+ create(:deployment, :success, environment: environment, deployable: build, sha: project.commit.id)
end
before do
@@ -327,10 +312,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
context 'when delayed job is expired already' do
let!(:delayed_job) do
- create(:ci_build, :expired_scheduled,
- pipeline: pipeline,
- name: 'delayed job',
- stage: 'test')
+ create(:ci_build, :expired_scheduled, pipeline: pipeline, name: 'delayed job', stage: 'test')
end
it "shows 00:00:00 as the remaining time" do
@@ -365,9 +347,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
let(:project) { create(:project, :repository) }
let!(:deployment) do
- create(:deployment, :failed,
- environment: environment,
- sha: project.commit.id)
+ create(:deployment, :failed, environment: environment, sha: project.commit.id)
end
it 'does not show deployments', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/409990' do
@@ -382,9 +362,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
let_it_be(:project) { create(:project, :repository) }
let!(:deployment) do
- create(:deployment, :running,
- environment: environment,
- sha: project.commit.id)
+ create(:deployment, :running, environment: environment, sha: project.commit.id)
end
it "renders the upcoming deployment", :aggregate_failures do
@@ -443,14 +421,8 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
describe 'environments folders' do
describe 'available environments' do
before do
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-1',
- state: :available)
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-2',
- state: :available)
+ create(:environment, :will_auto_stop, project: project, name: 'staging/review-1', state: :available)
+ create(:environment, :will_auto_stop, project: project, name: 'staging/review-2', state: :available)
end
it 'users unfurls an environment folder' do
@@ -470,14 +442,8 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
describe 'stopped environments' do
before do
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-1',
- state: :stopped)
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-2',
- state: :stopped)
+ create(:environment, :will_auto_stop, project: project, name: 'staging/review-1', state: :stopped)
+ create(:environment, :will_auto_stop, project: project, name: 'staging/review-2', state: :stopped)
end
it 'users unfurls an environment folder' do
@@ -497,12 +463,8 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
describe 'environments folders view' do
before do
- create(:environment, project: project,
- name: 'staging.review/review-1',
- state: :available)
- create(:environment, project: project,
- name: 'staging.review/review-2',
- state: :available)
+ create(:environment, project: project, name: 'staging.review/review-1', state: :available)
+ create(:environment, project: project, name: 'staging.review/review-2', state: :available)
end
it 'user opens folder view' do
diff --git a/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb b/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
index 852d7bca96a..2c8d7275fbf 100644
--- a/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
+++ b/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
@@ -9,8 +9,7 @@ RSpec.describe 'User deletes feature flag', :js, feature_category: :feature_flag
let(:project) { create(:project, namespace: user.namespace) }
let!(:feature_flag) do
- create_flag(project, 'ci_live_trace', false,
- description: 'For live trace feature')
+ create_flag(project, 'ci_live_trace', false, description: 'For live trace feature')
end
before do
diff --git a/spec/features/projects/files/download_buttons_spec.rb b/spec/features/projects/files/download_buttons_spec.rb
index 9b3d19cfea3..81bd0523c70 100644
--- a/spec/features/projects/files/download_buttons_spec.rb
+++ b/spec/features/projects/files/download_buttons_spec.rb
@@ -7,18 +7,11 @@ RSpec.describe 'Projects > Files > Download buttons in files tree', feature_cate
let(:user) { project.creator }
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- sha: project.commit.sha,
- ref: project.default_branch,
- status: 'success')
+ create(:ci_pipeline, project: project, sha: project.commit.sha, ref: project.default_branch, status: 'success')
end
let!(:build) do
- create(:ci_build, :success, :artifacts,
- pipeline: pipeline,
- status: pipeline.status,
- name: 'build')
+ create(:ci_build, :success, :artifacts, pipeline: pipeline, status: pipeline.status, name: 'build')
end
before do
diff --git a/spec/features/projects/files/editing_a_file_spec.rb b/spec/features/projects/files/editing_a_file_spec.rb
index b4edd5c2729..6efe1eb1ad1 100644
--- a/spec/features/projects/files/editing_a_file_spec.rb
+++ b/spec/features/projects/files/editing_a_file_spec.rb
@@ -13,16 +13,14 @@ RSpec.describe 'Projects > Files > User wants to edit a file', feature_category:
commit_message: "Committing First Update",
file_path: ".gitignore",
file_content: "First Update",
- last_commit_sha: Gitlab::Git::Commit.last_for_path(project.repository, project.default_branch,
- ".gitignore").sha
+ last_commit_sha: Gitlab::Git::Commit.last_for_path(project.repository, project.default_branch, ".gitignore").sha
}
end
context 'when the user has write access' do
before do
sign_in user
- visit project_edit_blob_path(project,
- File.join(project.default_branch, '.gitignore'))
+ visit project_edit_blob_path(project, File.join(project.default_branch, '.gitignore'))
end
it 'file has been updated since the user opened the edit page' do
@@ -43,8 +41,7 @@ RSpec.describe 'Projects > Files > User wants to edit a file', feature_category:
before do
forked_project
sign_in user
- visit project_edit_blob_path(project,
- File.join(project.default_branch, '.gitignore'))
+ visit project_edit_blob_path(project, File.join(project.default_branch, '.gitignore'))
end
context 'and the forked project is ahead of the upstream project' do
diff --git a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
index bfe1fd073c5..c8543764d15 100644
--- a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
+++ b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Files > Project owner sees a link to create a license file in empty project', :js,
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
include Features::WebIdeSpecHelpers
let(:project) { create(:project_empty_repo) }
diff --git a/spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb b/spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb
index 645bfeb14e3..37b718061c6 100644
--- a/spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb
+++ b/spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
# This is a regression test for https://gitlab.com/gitlab-org/gitlab-foss/issues/37569
RSpec.describe 'Projects > Files > User browses a tree with a folder containing only a folder', :js,
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:project) { create(:project, :empty_repo) }
let(:user) { project.first_owner }
diff --git a/spec/features/projects/files/user_browses_files_spec.rb b/spec/features/projects/files/user_browses_files_spec.rb
index bb14b9c4e31..3b30a620257 100644
--- a/spec/features/projects/files/user_browses_files_spec.rb
+++ b/spec/features/projects/files/user_browses_files_spec.rb
@@ -134,7 +134,7 @@ RSpec.describe "User browses files", :js, feature_category: :groups_and_projects
click_link("Rake tasks")
expect(page).to have_current_path(project_tree_path(project, "markdown/doc/raketasks"), ignore_query: true)
- expect(page).to have_content("backup_restore.md").and have_content("maintenance.md")
+ expect(page).to have_content("maintenance.md")
click_link("maintenance.md")
diff --git a/spec/features/projects/files/user_creates_directory_spec.rb b/spec/features/projects/files/user_creates_directory_spec.rb
index 070b6dbec7d..d824b3b1759 100644
--- a/spec/features/projects/files/user_creates_directory_spec.rb
+++ b/spec/features/projects/files/user_creates_directory_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js, feature_categ
context 'with default target branch' do
before do
first('.add-to-tree').click
- click_link('New directory')
+ click_button('New directory')
end
it 'creates the directory in the default branch' do
@@ -55,7 +55,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js, feature_categ
end
first('.add-to-tree').click
- click_link('New directory')
+ click_button('New directory')
fill_in(:dir_name, with: 'new_directory')
click_button('Create directory')
@@ -68,7 +68,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js, feature_categ
context 'with a new target branch' do
before do
first('.add-to-tree').click
- click_link('New directory')
+ click_button('New directory')
fill_in(:dir_name, with: 'new_directory')
fill_in(:branch_name, with: 'new-feature')
click_button('Create directory')
@@ -99,7 +99,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js, feature_categ
find('.add-to-tree').click
wait_for_requests
- click_link('New directory')
+ click_button('New directory')
fill_in(:dir_name, with: 'new_directory')
fill_in(:commit_message, with: 'New commit message', visible: true)
click_button('Create directory')
diff --git a/spec/features/projects/import_export/export_file_spec.rb b/spec/features/projects/import_export/export_file_spec.rb
index 3c39d8745a4..ad2fccc14bf 100644
--- a/spec/features/projects/import_export/export_file_spec.rb
+++ b/spec/features/projects/import_export/export_file_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
# Integration test that exports a file using the Import/Export feature
# It looks up for any sensitive word inside the JSON, so if a sensitive word is found
# we'll have to either include it adding the model that includes it to the +safe_list+
-# or make sure the attribute is blacklisted in the +import_export.yml+ configuration
+# or make sure the attribute is denylisted in the +import_export.yml+ configuration
RSpec.describe 'Import/Export - project export integration test', :js, feature_category: :importers do
include ExportFileHelper
diff --git a/spec/features/projects/integrations/user_activates_prometheus_spec.rb b/spec/features/projects/integrations/user_activates_prometheus_spec.rb
index a47000672ca..db71256b294 100644
--- a/spec/features/projects/integrations/user_activates_prometheus_spec.rb
+++ b/spec/features/projects/integrations/user_activates_prometheus_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe 'User activates Prometheus', feature_category: :integrations do
it 'saves and activates integration', :js do
visit_project_integration('Prometheus')
check('Active')
- fill_in('API URL', with: 'http://prometheus.example.com')
click_button('Save changes')
diff --git a/spec/features/projects/issuable_templates_spec.rb b/spec/features/projects/issuable_templates_spec.rb
index 72695680809..4221fa26e00 100644
--- a/spec/features/projects/issuable_templates_spec.rb
+++ b/spec/features/projects/issuable_templates_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects do
include ProjectForksHelper
include CookieHelper
+ include ContentEditorHelpers
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
@@ -18,7 +19,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
context 'user creates an issue using templates' do
let(:template_content) { 'this is a test "bug" template' }
- let(:longtemplate_content) { %Q(this\n\n\n\n\nis\n\n\n\n\na\n\n\n\n\nbug\n\n\n\n\ntemplate) }
+ let(:longtemplate_content) { %(this\n\n\n\n\nis\n\n\n\n\na\n\n\n\n\nbug\n\n\n\n\ntemplate) }
let(:issue) { create(:issue, author: user, assignees: [user], project: project) }
let(:description_addition) { ' appending to description' }
@@ -36,6 +37,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
message: 'added issue template',
branch_name: 'master')
visit project_issue_path project, issue
+ close_rich_text_promo_popover_if_present
page.find('.js-issuable-edit').click
fill_in :'issuable-title', with: 'test issue title'
end
@@ -79,6 +81,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
message: 'added issue template',
branch_name: 'master')
visit project_issue_path project, issue
+ close_rich_text_promo_popover_if_present
page.find('.js-issuable-edit').click
fill_in :'issuable-title', with: 'test issue title'
fill_in :'issue-description', with: prior_description
@@ -108,6 +111,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
it 'does not overwrite autosaved description' do
visit new_project_issue_path project
wait_for_requests
+ close_rich_text_promo_popover_if_present
assert_template # default template is loaded the first time
@@ -141,6 +145,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
message: 'added merge request bug template',
branch_name: 'master')
visit edit_project_merge_request_path project, merge_request
+ close_rich_text_promo_popover_if_present
fill_in :'merge_request[title]', with: 'test merge request title'
end
@@ -200,6 +205,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
message: 'added merge request template',
branch_name: 'master')
visit edit_project_merge_request_path project, merge_request
+ close_rich_text_promo_popover_if_present
fill_in :'merge_request[title]', with: 'test merge request title'
end
diff --git a/spec/features/projects/issues/design_management/user_views_design_spec.rb b/spec/features/projects/issues/design_management/user_views_design_spec.rb
index 268c209cba1..bd9d1092e17 100644
--- a/spec/features/projects/issues/design_management/user_views_design_spec.rb
+++ b/spec/features/projects/issues/design_management/user_views_design_spec.rb
@@ -5,16 +5,67 @@ require 'spec_helper'
RSpec.describe 'User views issue designs', :js, feature_category: :design_management do
include DesignManagementTestHelpers
+ let_it_be(:user) { create(:user) }
+ let_it_be(:guest_user) { create(:user) }
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:design) { create(:design, :with_file, issue: issue) }
+ let_it_be(:note) { create(:diff_note_on_design, noteable: design, author: user) }
+
+ def add_diff_note_emoji(diff_note, emoji_name)
+ page.within(first(".image-notes li#note_#{diff_note.id}.design-note")) do
+ page.find('[data-testid="note-emoji-button"] .note-emoji-button').click
+
+ page.within('ul.dropdown-menu') do
+ page.find('input[type="search"]').set(emoji_name)
+ page.find('button[data-testid="emoji-button"]:first-child').click
+ end
+ end
+ end
+
+ def remove_diff_note_emoji(diff_note, emoji_name)
+ page.within(first(".image-notes li#note_#{diff_note.id}.design-note")) do
+ page.find(".awards button[data-emoji-name='#{emoji_name}']").click
+ end
+ end
+
+ before_all do
+ project.add_maintainer(user)
+ project.add_guest(guest_user)
+ end
before do
enable_design_management
+ sign_in(user)
+
visit project_issue_path(project, issue)
end
+ shared_examples 'design discussion emoji awards' do
+ it 'allows user to add emoji reaction to a comment' do
+ click_link design.filename
+
+ add_diff_note_emoji(note, 'thumbsup')
+
+ expect(page.find("li#note_#{note.id} .awards")).to have_selector('button[title="You reacted with :thumbsup:"]')
+ end
+
+ it 'allows user to remove emoji reaction from a comment' do
+ click_link design.filename
+
+ add_diff_note_emoji(note, 'thumbsup')
+
+ # Wait for emoji to be added
+ wait_for_requests
+
+ remove_diff_note_emoji(note, 'thumbsup')
+
+ # Only award emoji that was present has been removed
+ expect(page.find("li#note_#{note.id}")).not_to have_selector('.awards')
+ end
+ end
+
it 'opens design detail' do
click_link design.filename
@@ -25,6 +76,26 @@ RSpec.describe 'User views issue designs', :js, feature_category: :design_manage
expect(page).to have_selector('.js-design-image')
end
+ it 'shows a comment within design' do
+ click_link design.filename
+
+ expect(page.find('.image-notes .design-note .note-text')).to have_content(note.note)
+ end
+
+ it_behaves_like 'design discussion emoji awards'
+
+ context 'when user is guest' do
+ before do
+ enable_design_management
+
+ sign_in(guest_user)
+
+ visit project_issue_path(project, issue)
+ end
+
+ it_behaves_like 'design discussion emoji awards'
+ end
+
context 'when svg file is loaded in design detail' do
let_it_be(:file) { Rails.root.join('spec/fixtures/svg_without_attr.svg') }
let_it_be(:design) { create(:design, :with_file, filename: 'svg_without_attr.svg', file: file, issue: issue) }
diff --git a/spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb b/spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb
index 3d40bae8544..bf1b2f7e5cd 100644
--- a/spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb
+++ b/spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb
@@ -8,26 +8,19 @@ RSpec.describe 'viewing an issue with cross project references' do
let(:user) { create(:user) }
let(:other_project) do
- create(:project, :public,
- external_authorization_classification_label: 'other_label')
+ create(:project, :public, external_authorization_classification_label: 'other_label')
end
let(:other_issue) do
- create(:issue, :closed,
- title: 'I am in another project',
- project: other_project)
+ create(:issue, :closed, title: 'I am in another project', project: other_project)
end
let(:other_confidential_issue) do
- create(:issue, :confidential, :closed,
- title: 'I am in another project and confidential',
- project: other_project)
+ create(:issue, :confidential, :closed, title: 'I am in another project and confidential', project: other_project)
end
let(:other_merge_request) do
- create(:merge_request, :closed,
- title: 'I am a merge request in another project',
- source_project: other_project)
+ create(:merge_request, :closed, title: 'I am a merge request in another project', source_project: other_project)
end
let(:description_referencing_other_issue) do
@@ -39,15 +32,11 @@ RSpec.describe 'viewing an issue with cross project references' do
let(:project) { create(:project) }
let(:issue) do
- create(:issue,
- project: project,
- description: description_referencing_other_issue)
+ create(:issue, project: project, description: description_referencing_other_issue)
end
let(:confidential_issue) do
- create(:issue, :confidential, :closed,
- title: "I am in the same project and confidential",
- project: project)
+ create(:issue, :confidential, :closed, title: "I am in the same project and confidential", project: project)
end
before do
diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb
index aeba53c22b6..77f95827d88 100644
--- a/spec/features/projects/jobs/user_browses_jobs_spec.rb
+++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb
@@ -79,8 +79,7 @@ RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do
context 'when a job can be retried' do
let!(:job) do
- create(:ci_build, pipeline: pipeline,
- stage: 'test')
+ create(:ci_build, pipeline: pipeline, stage: 'test')
end
before do
@@ -148,10 +147,7 @@ RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do
context 'with downloadable artifacts' do
let!(:with_artifacts) do
- build = create(:ci_build, :success,
- pipeline: pipeline,
- name: 'rspec tests',
- stage: 'test')
+ build = create(:ci_build, :success, pipeline: pipeline, name: 'rspec tests', stage: 'test')
create(:ci_job_artifact, :archive, job: build)
end
@@ -167,10 +163,7 @@ RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do
context 'with artifacts expired' do
let!(:with_artifacts_expired) do
- create(:ci_build, :expired, :success,
- pipeline: pipeline,
- name: 'rspec',
- stage: 'test')
+ create(:ci_build, :expired, :success, pipeline: pipeline, name: 'rspec', stage: 'test')
end
before do
@@ -188,8 +181,7 @@ RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do
context 'column links' do
let!(:job) do
- create(:ci_build, pipeline: pipeline,
- stage: 'test')
+ create(:ci_build, pipeline: pipeline, stage: 'test')
end
before do
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index fcd07d33535..c203e644280 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -306,7 +306,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :grou
artifact_request = requests.find { |req| req.url.include?('artifacts/download') }
- expect(artifact_request.response_headers['Content-Disposition']).to eq(%Q{attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}})
+ expect(artifact_request.response_headers['Content-Disposition']).to eq(%{attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}})
expect(artifact_request.response_headers['Content-Transfer-Encoding']).to eq("binary")
expect(artifact_request.response_headers['Content-Type']).to eq("image/gif")
expect(artifact_request.body).to eq(job.artifacts_file.file.read.b)
diff --git a/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb b/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb
index 6656ca3ef18..2780326cd35 100644
--- a/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb
+++ b/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Members > Group member cannot request access to their group project',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:user) { create(:user) }
let(:group) { create(:group) }
let(:project) { create(:project, namespace: group) }
diff --git a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
index 9db34cee5d6..47cd0d612b5 100644
--- a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
+++ b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Members > Group requester cannot request access to project', :js,
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:user) { create(:user) }
let(:owner) { create(:user) }
let(:group) { create(:group, :public) }
diff --git a/spec/features/projects/members/user_requests_access_spec.rb b/spec/features/projects/members/user_requests_access_spec.rb
index 6f76424e377..9af36b4b2a9 100644
--- a/spec/features/projects/members/user_requests_access_spec.rb
+++ b/spec/features/projects/members/user_requests_access_spec.rb
@@ -38,9 +38,11 @@ RSpec.describe 'Projects > Members > User requests access', :js, feature_categor
context 'code access is restricted' do
it 'user can request access' do
- project.project_feature.update!(repository_access_level: ProjectFeature::PRIVATE,
- builds_access_level: ProjectFeature::PRIVATE,
- merge_requests_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(
+ repository_access_level: ProjectFeature::PRIVATE,
+ builds_access_level: ProjectFeature::PRIVATE,
+ merge_requests_access_level: ProjectFeature::PRIVATE
+ )
visit project_path(project)
expect(page).to have_content 'Request Access'
diff --git a/spec/features/projects/milestones/gfm_autocomplete_spec.rb b/spec/features/projects/milestones/gfm_autocomplete_spec.rb
index d4ce10b5cb5..0705cdd0d9e 100644
--- a/spec/features/projects/milestones/gfm_autocomplete_spec.rb
+++ b/spec/features/projects/milestones/gfm_autocomplete_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
+ include Features::AutocompleteHelpers
+
let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let_it_be(:group) { create(:group, name: 'Ancestor') }
let_it_be(:project) { create(:project, :repository, group: group) }
@@ -68,10 +70,6 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
private
- def find_autocomplete_menu
- find('.atwho-view ul', visible: true)
- end
-
def expect_autocomplete_entry(entry)
page.within('.atwho-container') do
expect(page).to have_content(entry)
diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb
index 97dfeb6fd06..b6645e9b710 100644
--- a/spec/features/projects/navbar_spec.rb
+++ b/spec/features/projects/navbar_spec.rb
@@ -15,8 +15,6 @@ RSpec.describe 'Project navbar', :with_license, feature_category: :groups_and_pr
before do
sign_in(user)
- stub_feature_flags(show_pages_in_deployments_menu: false)
-
stub_config(registry: { enabled: false })
stub_feature_flags(harbor_registry_integration: false)
stub_feature_flags(ml_experiment_tracking: false)
@@ -53,8 +51,8 @@ RSpec.describe 'Project navbar', :with_license, feature_category: :groups_and_pr
stub_config(pages: { enabled: true })
insert_after_sub_nav_item(
- _('Packages and registries'),
- within: _('Settings'),
+ _('Releases'),
+ within: _('Deployments'),
new_sub_nav_item_name: _('Pages')
)
diff --git a/spec/features/projects/pages/user_adds_domain_spec.rb b/spec/features/projects/pages/user_adds_domain_spec.rb
index 708210e669c..ae459197b38 100644
--- a/spec/features/projects/pages/user_adds_domain_spec.rb
+++ b/spec/features/projects/pages/user_adds_domain_spec.rb
@@ -178,7 +178,7 @@ RSpec.describe 'User adds pages domain', :js, feature_category: :pages do
visit project_pages_path(project)
within('#content-body') { click_link 'Edit' }
- expect(page).to have_field :domain_dns, with: "#{domain.domain} ALIAS #{domain.project.pages_subdomain}.#{Settings.pages.host}."
+ expect(page).to have_field :domain_dns, with: "#{domain.domain} ALIAS namespace1.example.com."
end
end
end
diff --git a/spec/features/projects/pages/user_edits_settings_spec.rb b/spec/features/projects/pages/user_edits_settings_spec.rb
index 8c713b6f73a..eec9f2befb6 100644
--- a/spec/features/projects/pages/user_edits_settings_spec.rb
+++ b/spec/features/projects/pages/user_edits_settings_spec.rb
@@ -10,8 +10,6 @@ RSpec.describe 'Pages edits pages settings', :js, feature_category: :pages do
before do
allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
- stub_feature_flags(show_pages_in_deployments_menu: false)
-
project.add_maintainer(user)
sign_in(user)
@@ -82,25 +80,39 @@ RSpec.describe 'Pages edits pages settings', :js, feature_category: :pages do
end
end
- describe 'project settings page' do
- it 'renders "Pages" tab' do
- visit edit_project_path(project)
+ describe 'menu entry' do
+ describe 'on the pages page' do
+ it 'renders "Pages" tab' do
+ visit project_pages_path(project)
- page.within '.nav-sidebar' do
- expect(page).to have_link('Pages')
+ page.within '.nav-sidebar' do
+ expect(page).to have_link('Pages')
+ end
end
end
- context 'when pages are disabled' do
- before do
- allow(Gitlab.config.pages).to receive(:enabled).and_return(false)
+ describe 'in another menu entry under deployments' do
+ context 'when pages are enabled' do
+ it 'renders "Pages" tab' do
+ visit project_environments_path(project)
+
+ page.within '.nav-sidebar' do
+ expect(page).to have_link('Pages')
+ end
+ end
end
- it 'does not render "Pages" tab' do
- visit edit_project_path(project)
+ context 'when pages are disabled' do
+ before do
+ allow(Gitlab.config.pages).to receive(:enabled).and_return(false)
+ end
- page.within '.nav-sidebar' do
- expect(page).not_to have_link('Pages')
+ it 'does not render "Pages" tab' do
+ visit project_environments_path(project)
+
+ page.within '.nav-sidebar' do
+ expect(page).not_to have_link('Pages')
+ end
end
end
end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index abc9e3d30fc..bb49fb734d7 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let(:role) { :developer }
before do
- stub_feature_flags(pipeline_details_header_vue: false)
sign_in(user)
project.add_role(user, role)
end
@@ -22,42 +21,39 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let!(:external_stage) { create(:ci_stage, name: 'external', pipeline: pipeline) }
let!(:build_passed) do
- create(:ci_build, :success,
- pipeline: pipeline, stage: 'build', stage_idx: 0, name: 'build')
+ create(:ci_build, :success, pipeline: pipeline, stage: 'build', stage_idx: 0, name: 'build')
end
let!(:build_failed) do
- create(:ci_build, :failed,
- pipeline: pipeline, stage: 'test', stage_idx: 1, name: 'test')
+ create(:ci_build, :failed, pipeline: pipeline, stage: 'test', stage_idx: 1, name: 'test')
end
let!(:build_preparing) do
- create(:ci_build, :preparing,
- pipeline: pipeline, stage: 'deploy', stage_idx: 2, name: 'prepare')
+ create(:ci_build, :preparing, pipeline: pipeline, stage: 'deploy', stage_idx: 2, name: 'prepare')
end
let!(:build_running) do
- create(:ci_build, :running,
- pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'deploy')
+ create(:ci_build, :running, pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'deploy')
end
let!(:build_manual) do
- create(:ci_build, :manual,
- pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'manual-build')
+ create(:ci_build, :manual, pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'manual-build')
end
let!(:build_scheduled) do
- create(:ci_build, :scheduled,
- pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'delayed-job')
+ create(:ci_build, :scheduled, pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'delayed-job')
end
let!(:build_external) do
- create(:generic_commit_status, status: 'success',
- pipeline: pipeline,
- name: 'jenkins',
- ci_stage: external_stage,
- ref: 'master',
- target_url: 'http://gitlab.com/status')
+ create(
+ :generic_commit_status,
+ status: 'success',
+ pipeline: pipeline,
+ name: 'jenkins',
+ ci_stage: external_stage,
+ ref: 'master',
+ target_url: 'http://gitlab.com/status'
+ )
end
end
@@ -93,9 +89,9 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows the pipeline information' do
visit_pipeline
- within '.pipeline-info' do
- expect(page).to have_content("#{pipeline.statuses.count} jobs " \
- "for #{pipeline.ref}")
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("For #{pipeline.ref}")
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
expect(page).to have_link(pipeline.ref,
href: project_commits_path(pipeline.project, pipeline.ref))
end
@@ -104,135 +100,63 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'displays pipeline name instead of commit title' do
visit_pipeline
- within 'h3' do
+ within '[data-testid="pipeline-details-header"]' do
expect(page).to have_content(pipeline.name)
+ expect(page).to have_content(project.commit.short_id)
+ expect(page).not_to have_selector('[data-testid="pipeline-commit-title"]')
end
+ end
- within '.well-segment[data-testid="commit-row"]' do
- expect(page).to have_content(project.commit.title)
- expect(page).to have_content(project.commit.short_id)
+ context 'without pipeline name' do
+ let(:pipeline) do
+ create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id, user: user)
+ end
+
+ it 'displays commit title' do
+ visit_pipeline
+
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content(project.commit.title)
+ expect(page).not_to have_selector('[data-testid="pipeline-name"]')
+ end
end
end
describe 'pipeline stats text' do
let(:finished_pipeline) do
- create(:ci_pipeline, :success, project: project,
- ref: 'master', sha: project.commit.id, user: user)
+ create(:ci_pipeline, :success, project: project, ref: 'master', sha: project.commit.id, user: user)
end
before do
- finished_pipeline.update!(started_at: "2023-01-01 01:01:05", created_at: "2023-01-01 01:01:01",
- finished_at: "2023-01-01 01:01:10", duration: 9)
+ finished_pipeline.update!(
+ started_at: "2023-01-01 01:01:05",
+ created_at: "2023-01-01 01:01:01",
+ finished_at: "2023-01-01 01:01:10",
+ duration: 9
+ )
end
context 'pipeline has finished' do
- it 'shows pipeline stats with flag on' do
+ it 'shows time ago' do
visit project_pipeline_path(project, finished_pipeline)
- within '.pipeline-info' do
- expect(page).to have_content("in #{finished_pipeline.duration} seconds")
- expect(page).to have_content("and was queued for #{finished_pipeline.queued_duration} seconds")
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_selector('[data-testid="pipeline-finished-time-ago"]')
end
end
end
context 'pipeline has not finished' do
- it 'does not show pipeline stats' do
- visit_pipeline
-
- within '.pipeline-info' do
- expect(page).not_to have_selector('[data-testid="pipeline-stats-text"]')
- end
- end
- end
- end
-
- describe 'related merge requests' do
- context 'when there are no related merge requests' do
- it 'shows a "no related merge requests" message' do
- visit_pipeline
-
- within '.related-merge-request-info' do
- expect(page).to have_content('No related merge requests found.')
- end
- end
- end
-
- context 'when there is one related merge request' do
- let!(:merge_request) do
- create(:merge_request,
- source_project: project,
- source_branch: pipeline.ref)
- end
-
- it 'shows a link to the merge request' do
- visit_pipeline
-
- within '.related-merge-requests' do
- expect(page).to have_content('1 related merge request: ')
- expect(page).to have_selector('.js-truncated-mr-list')
- expect(page).to have_link("#{merge_request.to_reference} #{merge_request.title}")
-
- expect(page).not_to have_selector('.js-full-mr-list')
- expect(page).not_to have_selector('.text-expander')
- end
- end
- end
-
- context 'when there are two related merge requests' do
- let!(:merge_request1) do
- create(:merge_request,
- source_project: project,
- source_branch: pipeline.ref)
- end
-
- let!(:merge_request2) do
- create(:merge_request,
- source_project: project,
- source_branch: pipeline.ref,
- target_branch: 'fix')
- end
-
- it 'links to the most recent related merge request' do
- visit_pipeline
-
- within '.related-merge-requests' do
- expect(page).to have_content('2 related merge requests: ')
- expect(page).to have_link("#{merge_request2.to_reference} #{merge_request2.title}")
- expect(page).to have_selector('.text-expander')
- expect(page).to have_selector('.js-full-mr-list', visible: false)
- end
- end
-
- it 'expands to show links to all related merge requests' do
+ it 'does not show time ago' do
visit_pipeline
- within '.related-merge-requests' do
- find('.text-expander').click
-
- expect(page).to have_selector('.js-full-mr-list', visible: true)
-
- pipeline.all_merge_requests.map do |merge_request|
- expect(page).to have_link(href: project_merge_request_path(project, merge_request))
- end
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).not_to have_selector('[data-testid="pipeline-finished-time-ago"]')
end
end
end
end
- describe 'pipelines details view' do
- let!(:status) { create(:user_status, user: pipeline.user, emoji: 'smirk', message: 'Authoring this object') }
-
- it 'pipeline header shows the user status and emoji' do
- visit project_pipeline_path(project, pipeline)
-
- within '[data-testid="ci-header-content"]' do
- expect(page).to have_selector("[data-testid='#{status.message}']")
- expect(page).to have_selector("[data-name='#{status.emoji}']")
- end
- end
- end
-
describe 'pipeline graph' do
context 'when pipeline has running builds' do
before do
@@ -241,7 +165,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows a running icon and a cancel action for the running build' do
page.within('#ci-badge-deploy') do
- expect(page).to have_selector('.js-ci-status-icon-running')
+ expect(page).to have_selector('[data-testid="status_running-icon"]')
expect(page).to have_selector('.js-icon-cancel')
expect(page).to have_content('deploy')
end
@@ -263,7 +187,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows a preparing icon and a cancel action' do
page.within('#ci-badge-prepare') do
- expect(page).to have_selector('.js-ci-status-icon-preparing')
+ expect(page).to have_selector('[data-testid="status_preparing-icon"]')
expect(page).to have_selector('.js-icon-cancel')
expect(page).to have_content('prepare')
end
@@ -285,7 +209,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows the success icon and a retry action for the successful build' do
page.within('#ci-badge-build') do
- expect(page).to have_selector('.js-ci-status-icon-success')
+ expect(page).to have_selector('[data-testid="status_success-icon"]')
expect(page).to have_content('build')
end
@@ -299,8 +223,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
wait_for_requests
expect(page).not_to have_content('Retry job')
- within('.js-pipeline-header-container') do
- expect(page).to have_selector('.js-ci-status-icon-running')
+ within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_selector('[data-testid="ci-badge-running"]')
end
end
end
@@ -314,7 +238,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows the scheduled icon and an unschedule action for the delayed job' do
page.within('#ci-badge-delayed-job') do
- expect(page).to have_selector('.js-ci-status-icon-scheduled')
+ expect(page).to have_selector('[data-testid="status_scheduled-icon"]')
expect(page).to have_content('delayed-job')
end
@@ -339,7 +263,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows the failed icon and a retry action for the failed build' do
page.within('#ci-badge-test') do
- expect(page).to have_selector('.js-ci-status-icon-failed')
+ expect(page).to have_selector('[data-testid="status_failed-icon"]')
expect(page).to have_content('test')
end
@@ -353,8 +277,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
wait_for_requests
expect(page).not_to have_content('Retry job')
- within('.js-pipeline-header-container') do
- expect(page).to have_selector('.js-ci-status-icon-running')
+ within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_selector('[data-testid="ci-badge-running"]')
end
end
@@ -373,7 +297,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows the skipped icon and a play action for the manual build' do
page.within('#ci-badge-manual-build') do
- expect(page).to have_selector('.js-ci-status-icon-manual')
+ expect(page).to have_selector('[data-testid="status_manual-icon"]')
expect(page).to have_content('manual')
end
@@ -387,8 +311,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
wait_for_requests
expect(page).not_to have_content('Play job')
- within('.js-pipeline-header-container') do
- expect(page).to have_selector('.js-ci-status-icon-running')
+ within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_selector('[data-testid="ci-badge-running"]')
end
end
end
@@ -399,7 +323,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'shows the success icon and the generic comit status build' do
- expect(page).to have_selector('.js-ci-status-icon-success')
+ expect(page).to have_selector('[data-testid="status_success-icon"]')
expect(page).to have_content('jenkins')
expect(page).to have_link('jenkins', href: 'http://gitlab.com/status')
end
@@ -408,13 +332,15 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
context 'when pipeline has a downstream pipeline' do
let(:downstream_project) { create(:project, :repository, group: group) }
let(:downstream_pipeline) do
- create(:ci_pipeline,
- status,
- user: user,
- project: downstream_project,
- ref: 'master',
- sha: downstream_project.commit.id,
- child_of: pipeline)
+ create(
+ :ci_pipeline,
+ status,
+ user: user,
+ project: downstream_project,
+ ref: 'master',
+ sha: downstream_project.commit.id,
+ child_of: pipeline
+ )
end
let!(:build) { create(:ci_build, status, pipeline: downstream_pipeline, user: user) }
@@ -601,7 +527,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
context 'when retrying' do
before do
- find('[data-testid="retryPipeline"]').click
+ find('[data-testid="retry-pipeline"]').click
wait_for_requests
end
@@ -610,8 +536,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'shows running status in pipeline header', :sidekiq_might_not_need_inline do
- within('.js-pipeline-header-container') do
- expect(page).to have_selector('.js-ci-status-icon-running')
+ within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_selector('[data-testid="ci-badge-running"]')
end
end
end
@@ -661,10 +587,13 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
context 'when pipeline ref does not exist in repository anymore' do
let(:pipeline) do
- create(:ci_empty_pipeline, project: project,
- ref: 'non-existent',
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_empty_pipeline,
+ project: project,
+ ref: 'non-existent',
+ sha: project.commit.id,
+ user: user
+ )
end
before do
@@ -677,7 +606,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'does not render render raw HTML to the pipeline ref' do
- page.within '.pipeline-info' do
+ page.within '[data-testid="pipeline-details-header"]' do
expect(page).not_to have_content('<span class="ref-name"')
end
end
@@ -688,10 +617,12 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let(:target_project) { project }
let(:merge_request) do
- create(:merge_request,
+ create(
+ :merge_request,
:with_detached_merge_request_pipeline,
source_project: source_project,
- target_project: target_project)
+ target_project: target_project
+ )
end
let(:pipeline) do
@@ -701,10 +632,10 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows the pipeline information' do
visit_pipeline
- within '.pipeline-info' do
- expect(page).to have_content("#{pipeline.statuses.count} jobs " \
- "for !#{merge_request.iid} " \
- "with #{merge_request.source_branch}")
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
+ expect(page).to have_content("Related merge request !#{merge_request.iid} " \
+ "to merge #{merge_request.source_branch}")
expect(page).to have_link("!#{merge_request.iid}",
href: project_merge_request_path(project, merge_request))
expect(page).to have_link(merge_request.source_branch,
@@ -720,7 +651,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'does not link to the source branch commit path' do
visit_pipeline
- within '.pipeline-info' do
+ within '[data-testid="pipeline-details-header"]' do
expect(page).not_to have_link(merge_request.source_branch)
expect(page).to have_content(merge_request.source_branch)
end
@@ -735,10 +666,10 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'shows the pipeline information', :sidekiq_might_not_need_inline do
- within '.pipeline-info' do
- expect(page).to have_content("#{pipeline.statuses.count} jobs " \
- "for !#{merge_request.iid} " \
- "with #{merge_request.source_branch}")
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
+ expect(page).to have_content("Related merge request !#{merge_request.iid} " \
+ "to merge #{merge_request.source_branch}")
expect(page).to have_link("!#{merge_request.iid}",
href: project_merge_request_path(project, merge_request))
expect(page).to have_link(merge_request.source_branch,
@@ -772,10 +703,10 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows the pipeline information' do
visit_pipeline
- within '.pipeline-info' do
- expect(page).to have_content("#{pipeline.statuses.count} jobs " \
- "for !#{merge_request.iid} " \
- "with #{merge_request.source_branch} " \
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
+ expect(page).to have_content("Related merge request !#{merge_request.iid} " \
+ "to merge #{merge_request.source_branch} " \
"into #{merge_request.target_branch}")
expect(page).to have_link("!#{merge_request.iid}",
href: project_merge_request_path(project, merge_request))
@@ -794,7 +725,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'does not link to the target branch commit path' do
visit_pipeline
- within '.pipeline-info' do
+ within '[data-testid="pipeline-details-header"]' do
expect(page).not_to have_link(merge_request.target_branch)
expect(page).to have_content(merge_request.target_branch)
end
@@ -809,10 +740,10 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'shows the pipeline information', :sidekiq_might_not_need_inline do
- within '.pipeline-info' do
- expect(page).to have_content("#{pipeline.statuses.count} jobs " \
- "for !#{merge_request.iid} " \
- "with #{merge_request.source_branch} " \
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
+ expect(page).to have_content("Related merge request !#{merge_request.iid} " \
+ "to merge #{merge_request.source_branch} " \
"into #{merge_request.target_branch}")
expect(page).to have_link("!#{merge_request.iid}",
href: project_merge_request_path(project, merge_request))
@@ -864,17 +795,23 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let(:downstream) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_pipeline, project: project,
- ref: 'master',
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_pipeline,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user
+ )
end
let!(:bridge) do
- create(:ci_bridge, pipeline: pipeline,
- name: 'cross-build',
- user: user,
- downstream: downstream)
+ create(
+ :ci_bridge,
+ pipeline: pipeline,
+ name: 'cross-build',
+ user: user,
+ downstream: downstream
+ )
end
describe 'GET /:project/-/pipelines/:id' do
@@ -942,13 +879,20 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let(:resource_group) { create(:ci_resource_group, project: project) }
let!(:test_job) do
- create(:ci_build, :pending, stage: 'test', name: 'test',
- stage_idx: 1, pipeline: pipeline, project: project)
+ create(:ci_build, :pending, stage: 'test', name: 'test', stage_idx: 1, pipeline: pipeline, project: project)
end
let!(:deploy_job) do
- create(:ci_build, :created, stage: 'deploy', name: 'deploy',
- stage_idx: 2, pipeline: pipeline, project: project, resource_group: resource_group)
+ create(
+ :ci_build,
+ :created,
+ stage: 'deploy',
+ name: 'deploy',
+ stage_idx: 2,
+ pipeline: pipeline,
+ project: project,
+ resource_group: resource_group
+ )
end
describe 'GET /:project/-/pipelines/:id' do
@@ -957,7 +901,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as created' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('pending')
end
@@ -982,7 +926,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as pending' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('running')
end
@@ -1011,7 +955,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as waiting for resource' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('waiting')
end
@@ -1031,7 +975,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as pending' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('running')
end
@@ -1059,7 +1003,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as waiting for resource' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('waiting')
end
@@ -1207,8 +1151,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
context 'when user does have permission to retry build' do
before do
- create(:protected_branch, :developers_can_merge,
- name: pipeline.ref, project: project)
+ create(:protected_branch, :developers_can_merge, name: pipeline.ref, project: project)
end
it 'shows retry button for failed build' do
@@ -1315,11 +1258,13 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
include_context 'pipeline builds'
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- ref: 'master',
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_pipeline,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user
+ )
end
before do
@@ -1327,7 +1272,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates it is the latest build' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'latest'
end
end
@@ -1335,12 +1280,14 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
context 'when pipeline has configuration errors' do
let(:pipeline) do
- create(:ci_pipeline,
- :invalid,
- project: project,
- ref: 'master',
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_pipeline,
+ :invalid,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user
+ )
end
before do
@@ -1348,7 +1295,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates errors' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'yaml invalid'
end
end
@@ -1356,9 +1303,9 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'contains badge with tooltip which contains error' do
expect(pipeline).to have_yaml_errors
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_selector(
- %Q{span[title="#{pipeline.yaml_errors}"]})
+ %{span[title="#{pipeline.yaml_errors}"]})
end
end
@@ -1369,26 +1316,16 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'contains badge with tooltip which contains failure reason' do
expect(pipeline.failure_reason?).to eq true
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_selector(
- %Q{span[title="#{pipeline.present.failure_reason}"]})
+ %{span[title="#{pipeline.present.failure_reason}"]})
end
end
-
- it 'contains a pipeline header with title' do
- expect(page).to have_content "Pipeline ##{pipeline.id}"
- end
end
context 'when pipeline is stuck' do
- include_context 'pipeline builds'
-
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- ref: 'master',
- sha: project.commit.id,
- user: user)
+ create(:ci_pipeline, project: project, status: :created, user: user)
end
before do
@@ -1397,7 +1334,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates being stuck' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'stuck'
end
end
@@ -1408,12 +1345,14 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let(:project) { create(:project, :repository, auto_devops_attributes: { enabled: true }) }
let(:pipeline) do
- create(:ci_pipeline,
- :auto_devops_source,
- project: project,
- ref: 'master',
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_pipeline,
+ :auto_devops_source,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user
+ )
end
before do
@@ -1421,7 +1360,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates using auto devops' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'Auto DevOps'
end
end
@@ -1431,21 +1370,25 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
include_context 'pipeline builds'
let(:pipeline) do
- create(:ci_pipeline,
- source: :merge_request_event,
- project: merge_request.source_project,
- ref: 'feature',
- sha: merge_request.diff_head_sha,
- user: user,
- merge_request: merge_request)
+ create(
+ :ci_pipeline,
+ source: :merge_request_event,
+ project: merge_request.source_project,
+ ref: 'feature',
+ sha: merge_request.diff_head_sha,
+ user: user,
+ merge_request: merge_request
+ )
end
let(:merge_request) do
- create(:merge_request,
- source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ create(
+ :merge_request,
+ source_project: project,
+ source_branch: 'feature',
+ target_project: project,
+ target_branch: 'master'
+ )
end
before do
@@ -1453,7 +1396,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates detached merge request pipeline' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'merge request'
end
end
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index 441f39e6999..25eddf64f99 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
+RSpec.describe 'Pipelines', :js, feature_category: :continuous_integration do
include ListboxHelpers
include ProjectForksHelper
include Spec::Support::Helpers::ModalHelpers
@@ -10,10 +10,6 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
let(:project) { create(:project) }
let(:expected_detached_mr_tag) { 'merge request' }
- before do
- stub_feature_flags(pipeline_details_header_vue: false)
- end
-
context 'when user is logged in' do
let(:user) { create(:user) }
@@ -109,8 +105,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'when pipeline is cancelable' do
let!(:build) do
- create(:ci_build, pipeline: pipeline,
- stage: 'test')
+ create(:ci_build, pipeline: pipeline, stage: 'test')
end
before do
@@ -139,8 +134,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'when pipeline is retryable', :sidekiq_might_not_need_inline do
let!(:build) do
- create(:ci_build, pipeline: pipeline,
- stage: 'test')
+ create(:ci_build, pipeline: pipeline, stage: 'test')
end
before do
@@ -168,10 +162,12 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'when pipeline is detached merge request pipeline' do
let(:merge_request) do
- create(:merge_request,
- :with_detached_merge_request_pipeline,
- source_project: source_project,
- target_project: target_project)
+ create(
+ :merge_request,
+ :with_detached_merge_request_pipeline,
+ source_project: source_project,
+ target_project: target_project
+ )
end
let!(:pipeline) { merge_request.all_pipelines.first }
@@ -187,8 +183,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
within '.pipeline-tags' do
expect(page).to have_content(expected_detached_mr_tag)
- expect(page).to have_link(merge_request.iid,
- href: project_merge_request_path(project, merge_request))
+ expect(page).to have_link(merge_request.iid, href: project_merge_request_path(project, merge_request))
expect(page).not_to have_link(pipeline.ref)
end
@@ -206,11 +201,13 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'when pipeline is merge request pipeline' do
let(:merge_request) do
- create(:merge_request,
- :with_merge_request_pipeline,
- source_project: source_project,
- target_project: target_project,
- merge_sha: target_project.commit.sha)
+ create(
+ :merge_request,
+ :with_merge_request_pipeline,
+ source_project: source_project,
+ target_project: target_project,
+ merge_sha: target_project.commit.sha
+ )
end
let!(:pipeline) { merge_request.all_pipelines.first }
@@ -226,8 +223,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
within '.pipeline-tags' do
expect(page).not_to have_content(expected_detached_mr_tag)
- expect(page).to have_link(merge_request.iid,
- href: project_merge_request_path(project, merge_request))
+ expect(page).to have_link(merge_request.iid, href: project_merge_request_path(project, merge_request))
expect(page).not_to have_link(pipeline.ref)
end
@@ -259,7 +255,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
it 'contains badge with tooltip which contains error' do
expect(pipeline).to have_yaml_errors
expect(page).to have_selector(
- %Q{span[title="#{pipeline.yaml_errors}"]})
+ %{span[title="#{pipeline.yaml_errors}"]})
end
it 'contains badge that indicates failure reason' do
@@ -269,7 +265,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
it 'contains badge with tooltip which contains failure reason' do
expect(pipeline.failure_reason?).to eq true
expect(page).to have_selector(
- %Q{span[title="#{pipeline.present.failure_reason}"]})
+ %{span[title="#{pipeline.present.failure_reason}"]})
end
end
@@ -524,9 +520,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'mini pipeline graph' do
let!(:build) do
- create(:ci_build, :pending, pipeline: pipeline,
- stage: 'build',
- name: 'build')
+ create(:ci_build, :pending, pipeline: pipeline, stage: 'build', name: 'build')
end
dropdown_selector = '[data-testid="mini-pipeline-graph-dropdown"]'
@@ -558,9 +552,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'for a failed pipeline' do
let!(:build) do
- create(:ci_build, :failed, pipeline: pipeline,
- stage: 'build',
- name: 'build')
+ create(:ci_build, :failed, pipeline: pipeline, stage: 'build', name: 'build')
end
it 'displays the failure reason' do
@@ -628,10 +620,12 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
let(:project) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_empty_pipeline,
- project: project,
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_empty_pipeline,
+ project: project,
+ sha: project.commit.id,
+ user: user
+ )
end
let(:external_stage) { create(:ci_stage, name: 'external', pipeline: pipeline) }
@@ -656,7 +650,6 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
# header
expect(page).to have_text("##{pipeline.id}")
- expect(page).to have_selector(%Q(img[src="#{pipeline.user.avatar_url}"]))
expect(page).to have_link(pipeline.user.name, href: user_path(pipeline.user))
# stages
diff --git a/spec/features/projects/releases/user_views_release_spec.rb b/spec/features/projects/releases/user_views_release_spec.rb
index efa0ebd761d..282b8958814 100644
--- a/spec/features/projects/releases/user_views_release_spec.rb
+++ b/spec/features/projects/releases/user_views_release_spec.rb
@@ -7,10 +7,12 @@ RSpec.describe 'User views Release', :js, feature_category: :continuous_delivery
let(:user) { create(:user) }
let(:release) do
- create(:release,
- project: project,
- name: 'The first release',
- description: '**Lorem** _ipsum_ dolor sit [amet](https://example.com)')
+ create(
+ :release,
+ project: project,
+ name: 'The first release',
+ description: '**Lorem** _ipsum_ dolor sit [amet](https://example.com)'
+ )
end
before do
diff --git a/spec/features/projects/settings/access_tokens_spec.rb b/spec/features/projects/settings/access_tokens_spec.rb
index a38c10c6bab..210815f341c 100644
--- a/spec/features/projects/settings/access_tokens_spec.rb
+++ b/spec/features/projects/settings/access_tokens_spec.rb
@@ -69,7 +69,7 @@ RSpec.describe 'Project > Settings > Access Tokens', :js, feature_category: :use
end
context 'when token creation is not allowed' do
- it_behaves_like 'resource access tokens creation disallowed', 'Project access token creation is disabled in this group. You can still use and manage existing tokens.'
+ it_behaves_like 'resource access tokens creation disallowed', 'Project access token creation is disabled in this group.'
context 'with a project in a personal namespace' do
let(:personal_project) { create(:project) }
diff --git a/spec/features/projects/settings/external_authorization_service_settings_spec.rb b/spec/features/projects/settings/external_authorization_service_settings_spec.rb
index 4a56e6c8bbf..4214e6fc767 100644
--- a/spec/features/projects/settings/external_authorization_service_settings_spec.rb
+++ b/spec/features/projects/settings/external_authorization_service_settings_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Settings > External Authorization Classification Label setting',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:user) { create(:user) }
let(:project) { create(:project_empty_repo) }
diff --git a/spec/features/projects/settings/monitor_settings_spec.rb b/spec/features/projects/settings/monitor_settings_spec.rb
index c5a5826a778..b46451f4255 100644
--- a/spec/features/projects/settings/monitor_settings_spec.rb
+++ b/spec/features/projects/settings/monitor_settings_spec.rb
@@ -18,8 +18,11 @@ RSpec.describe 'Projects > Settings > For a forked project', :js, feature_catego
visit project_path(project)
wait_for_requests
- expect(page).to have_selector('.sidebar-sub-level-items a[aria-label="Error Tracking"]',
- text: 'Error Tracking', visible: :hidden)
+ expect(page).to have_selector(
+ '.sidebar-sub-level-items a[aria-label="Error Tracking"]',
+ text: 'Error Tracking',
+ visible: :hidden
+ )
end
end
diff --git a/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb b/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb
index 50693dda685..1ab88ec0fff 100644
--- a/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb
+++ b/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Project > Settings > Packages and registries > Container registry tag expiration policy',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) }
diff --git a/spec/features/projects/settings/registry_settings_spec.rb b/spec/features/projects/settings/registry_settings_spec.rb
index b8016a5d2df..9df82e447aa 100644
--- a/spec/features/projects/settings/registry_settings_spec.rb
+++ b/spec/features/projects/settings/registry_settings_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Project > Settings > Packages and registries > Container registry tag expiration policy',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) }
diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb
index 2439e624dd6..d53aefe5a4e 100644
--- a/spec/features/projects/settings/repository_settings_spec.rb
+++ b/spec/features/projects/settings/repository_settings_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe 'Projects > Settings > Repository settings', feature_category: :g
let(:role) { :developer }
before do
- stub_feature_flags(mirror_only_branches_match_regex: false)
project.add_role(user, role)
sign_in(user)
end
diff --git a/spec/features/projects/settings/service_desk_setting_spec.rb b/spec/features/projects/settings/service_desk_setting_spec.rb
index c18da56f3ee..d068cb219f1 100644
--- a/spec/features/projects/settings/service_desk_setting_spec.rb
+++ b/spec/features/projects/settings/service_desk_setting_spec.rb
@@ -2,18 +2,20 @@
require 'spec_helper'
-RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_category: :groups_and_projects do
- let(:project) { create(:project_empty_repo, :private, service_desk_enabled: false) }
+RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_category: :service_desk do
+ let_it_be_with_reload(:project) { create(:project_empty_repo, :private, service_desk_enabled: false) }
let(:presenter) { project.present(current_user: user) }
- let(:user) { create(:user) }
+ let_it_be_with_reload(:user) { create(:user) }
before do
project.add_maintainer(user)
sign_in(user)
- allow_any_instance_of(Project).to receive(:present).with(current_user: user).and_return(presenter)
- allow(::Gitlab::Email::IncomingEmail).to receive(:enabled?) { true }
- allow(::Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?) { true }
+ allow_next_instance_of(Project) do |project|
+ allow(project).to receive(:present).with(current_user: user).and_return(presenter)
+ end
+ allow(::Gitlab::Email::IncomingEmail).to receive(:enabled?).and_return(true)
+ allow(::Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?).and_return(true)
end
it 'shows activation checkbox' do
@@ -43,8 +45,8 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c
context 'when service_desk_email is enabled' do
before do
- allow(::Gitlab::Email::ServiceDeskEmail).to receive(:enabled?) { true }
- allow(::Gitlab::Email::ServiceDeskEmail).to receive(:address_for_key) { 'address-suffix@example.com' }
+ allow(::Gitlab::Email::ServiceDeskEmail).to receive(:enabled?).and_return(true)
+ allow(::Gitlab::Email::ServiceDeskEmail).to receive(:address_for_key).and_return('address-suffix@example.com')
visit edit_project_path(project)
end
@@ -66,7 +68,7 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c
expect(find('[data-testid="incoming-email"]').value).to eq('address-suffix@example.com')
end
- context 'issue description templates' do
+ describe 'issue description templates' do
let_it_be(:issuable_project_template_files) do
{
'.gitlab/issue_templates/project-issue-bar.md' => 'Project Issue Template Bar',
@@ -82,8 +84,13 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c
end
let_it_be_with_reload(:group) { create(:group) }
- let_it_be_with_reload(:project) { create(:project, :custom_repo, group: group, files: issuable_project_template_files) }
- let_it_be(:group_template_repo) { create(:project, :custom_repo, group: group, files: issuable_group_template_files) }
+ let_it_be_with_reload(:project) do
+ create(:project, :custom_repo, group: group, files: issuable_project_template_files)
+ end
+
+ let_it_be(:group_template_repo) do
+ create(:project, :custom_repo, group: group, files: issuable_group_template_files)
+ end
before do
stub_licensed_features(custom_file_templates_for_namespace: false, custom_file_templates: false)
@@ -94,4 +101,10 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c
it_behaves_like 'issue description templates from current project only'
end
end
+
+ it 'pushes service_desk_custom_email feature flag to frontend' do
+ visit edit_project_path(project)
+
+ expect(page).to have_pushed_frontend_feature_flags(serviceDeskCustomEmail: true)
+ end
end
diff --git a/spec/features/projects/settings/user_searches_in_settings_spec.rb b/spec/features/projects/settings/user_searches_in_settings_spec.rb
index f0ef4a285ad..978b678c334 100644
--- a/spec/features/projects/settings/user_searches_in_settings_spec.rb
+++ b/spec/features/projects/settings/user_searches_in_settings_spec.rb
@@ -26,14 +26,6 @@ RSpec.describe 'User searches project settings', :js, feature_category: :groups_
it_behaves_like 'can highlight results', 'third-party applications'
end
- context 'in Webhooks page' do
- before do
- visit project_hooks_path(project)
- end
-
- it_behaves_like 'can highlight results', 'Secret token'
- end
-
context 'in Access Tokens page' do
before do
visit project_settings_access_tokens_path(project)
@@ -65,15 +57,4 @@ RSpec.describe 'User searches project settings', :js, feature_category: :groups_
it_behaves_like 'can search settings', 'Alerts', 'Error tracking'
end
-
- context 'in Pages page' do
- before do
- stub_feature_flags(show_pages_in_deployments_menu: false)
- allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
-
- visit project_pages_path(project)
- end
-
- it_behaves_like 'can highlight results', 'static website'
- end
end
diff --git a/spec/features/projects/settings/webhooks_settings_spec.rb b/spec/features/projects/settings/webhooks_settings_spec.rb
index 5d345c63d60..af7c790c692 100644
--- a/spec/features/projects/settings/webhooks_settings_spec.rb
+++ b/spec/features/projects/settings/webhooks_settings_spec.rb
@@ -31,7 +31,6 @@ RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :grou
it 'show list of webhooks' do
hook
-
visit webhooks_path
expect(page.status_code).to eq(200)
@@ -46,11 +45,13 @@ RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :grou
expect(page).to have_content('Pipeline events')
expect(page).to have_content('Wiki page events')
expect(page).to have_content('Releases events')
+ expect(page).to have_content('Emoji events')
end
it 'create webhook', :js do
visit webhooks_path
+ click_button 'Add new webhook'
fill_in 'URL', with: url
check 'Tag push events'
check 'Enable SSL verification'
@@ -59,10 +60,10 @@ RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :grou
click_button 'Add webhook'
expect(page).to have_content(url)
+ expect(page).to have_content('Webhook was created')
expect(page).to have_content('SSL Verification: enabled')
expect(page).to have_content('Tag push events')
expect(page).to have_content('Job events')
- expect(page).to have_content('Push events')
end
it 'edit existing webhook', :js do
diff --git a/spec/features/projects/show/download_buttons_spec.rb b/spec/features/projects/show/download_buttons_spec.rb
index a4df6a56e02..8e27b4b2ede 100644
--- a/spec/features/projects/show/download_buttons_spec.rb
+++ b/spec/features/projects/show/download_buttons_spec.rb
@@ -9,18 +9,24 @@ RSpec.describe 'Projects > Show > Download buttons', feature_category: :groups_a
let(:project) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- sha: project.commit.sha,
- ref: project.default_branch,
- status: status)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: project.commit.sha,
+ ref: project.default_branch,
+ status: status
+ )
end
let!(:build) do
- create(:ci_build, :success, :artifacts,
- pipeline: pipeline,
- status: pipeline.status,
- name: 'build')
+ create(
+ :ci_build,
+ :success,
+ :artifacts,
+ pipeline: pipeline,
+ status: pipeline.status,
+ name: 'build'
+ )
end
before do
diff --git a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
index 997a804e6ac..98714da34f2 100644
--- a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
+++ b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Project > Show > User interacts with auto devops implicitly enabled banner',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
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 29fb20841fd..ee017336acc 100644
--- a/spec/features/projects/show/user_sees_collaboration_links_spec.rb
+++ b/spec/features/projects/show/user_sees_collaboration_links_spec.rb
@@ -43,8 +43,8 @@ RSpec.describe 'Projects > Show > Collaboration links', :js, feature_category: :
aggregate_failures 'dropdown links above the repo tree' do
expect(page).to have_link('New file')
- expect(page).to have_link('Upload file')
- expect(page).to have_link('New directory')
+ expect(page).to have_button('Upload file')
+ expect(page).to have_button('New directory')
expect(page).to have_link('New branch')
expect(page).to have_link('New tag')
end
diff --git a/spec/features/projects/tags/download_buttons_spec.rb b/spec/features/projects/tags/download_buttons_spec.rb
index 570721fc951..275d364f267 100644
--- a/spec/features/projects/tags/download_buttons_spec.rb
+++ b/spec/features/projects/tags/download_buttons_spec.rb
@@ -10,18 +10,22 @@ RSpec.describe 'Download buttons in tags page', feature_category: :source_code_m
let(:project) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- sha: project.commit(tag).sha,
- ref: tag,
- status: status)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: project.commit(tag).sha,
+ ref: tag,
+ status: status
+ )
end
let!(:build) do
- create(:ci_build, :success, :artifacts,
- pipeline: pipeline,
- status: pipeline.status,
- name: 'build')
+ create(
+ :ci_build, :success, :artifacts,
+ pipeline: pipeline,
+ status: pipeline.status,
+ name: 'build'
+ )
end
before do
diff --git a/spec/features/projects/user_sees_user_popover_spec.rb b/spec/features/projects/user_sees_user_popover_spec.rb
index 523f1366a14..be7d3daa24f 100644
--- a/spec/features/projects/user_sees_user_popover_spec.rb
+++ b/spec/features/projects/user_sees_user_popover_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe 'User sees user popover', :js, feature_category: :groups_and_proj
end
it 'displays user popover' do
- find('.js-user-link').hover
+ find('.detail-page-description .js-user-link').hover
expect(page).to have_css(popover_selector, visible: true)
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 79744633d0c..9a772ff8e44 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
@@ -9,11 +9,13 @@ RSpec.describe 'Projects > Wiki > User views wiki in project page', feature_cate
context 'when repository is disabled for project' do
let(:project) do
- create(:project,
- :wiki_repo,
- :repository_disabled,
- :merge_requests_disabled,
- :builds_disabled)
+ create(
+ :project,
+ :wiki_repo,
+ :repository_disabled,
+ :merge_requests_disabled,
+ :builds_disabled
+ )
end
context 'when wiki homepage contains a link' do
@@ -37,8 +39,13 @@ RSpec.describe 'Projects > Wiki > User views wiki in project page', feature_cate
context 'when using asciidoc' do
before do
- create(:wiki_page, wiki: project.wiki, title: 'home', content: 'link:other-page[some link]',
- format: :asciidoc)
+ 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'
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 4df9109875e..3c63ec82778 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -14,17 +14,11 @@ RSpec.describe 'Runners', feature_category: :runner_fleet do
stub_feature_flags(project_runners_vue_ui: false)
end
- context 'when user views runners page' do
- let_it_be(:project) { create(:project) }
-
- before do
- project.add_maintainer(user)
- end
+ context 'with user as project maintainer' do
+ let_it_be(:project) { create(:project).tap { |project| project.add_maintainer(user) } }
- context 'when create_runner_workflow_for_namespace is enabled', :js do
+ context 'when user views runners page', :js do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
-
visit project_runners_path(project)
end
@@ -38,58 +32,18 @@ RSpec.describe 'Runners', feature_category: :runner_fleet do
end
end
- context 'when user views new runner page' do
- context 'when create_runner_workflow_for_namespace is enabled', :js do
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
-
- visit new_project_runner_path(project)
- end
-
- it_behaves_like 'creates runner and shows register page' do
- let(:register_path_pattern) { register_project_runner_path(project, '.*') }
- end
-
- it 'shows the locked field' do
- expect(page).to have_selector('input[type="checkbox"][name="locked"]')
- expect(page).to have_content(_('Lock to current projects'))
- end
- end
- end
-
- context 'when create_runner_workflow_for_namespace is disabled' do
+ context 'when user views new runner page', :js do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ visit new_project_runner_path(project)
end
- it 'user can see a link with instructions on how to install GitLab Runner' do
- visit project_runners_path(project)
-
- expect(page).to have_link('Install GitLab Runner and ensure it\'s running.', href: "https://docs.gitlab.com/runner/install/")
+ it_behaves_like 'creates runner and shows register page' do
+ let(:register_path_pattern) { register_project_runner_path(project, '.*') }
end
- describe 'runners registration token' do
- let!(:token) { project.runners_token }
-
- before do
- visit project_runners_path(project)
- end
-
- it 'has a registration token' do
- expect(page.find('#registration_token')).to have_content(token)
- end
-
- describe 'reload registration token' do
- let(:page_token) { find('#registration_token').text }
-
- before do
- click_link 'Reset registration token'
- end
-
- it 'changes registration token' do
- expect(page_token).not_to eq token
- end
- end
+ it 'shows the locked field' do
+ expect(page).to have_selector('input[type="checkbox"][name="locked"]')
+ expect(page).to have_content(_('Lock to current projects'))
end
end
end
diff --git a/spec/features/search/user_searches_for_milestones_spec.rb b/spec/features/search/user_searches_for_milestones_spec.rb
index 238e59be940..7ca7958f61b 100644
--- a/spec/features/search/user_searches_for_milestones_spec.rb
+++ b/spec/features/search/user_searches_for_milestones_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User searches for milestones', :js, :clean_gitlab_redis_rate_limiting,
-feature_category: :global_search do
+ feature_category: :global_search do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) }
let_it_be(:milestone1) { create(:milestone, title: 'Foo', project: project) }
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 1d8bdc58ce6..65f262075f9 100644
--- a/spec/features/search/user_searches_for_wiki_pages_spec.rb
+++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User searches for wiki pages', :js, :clean_gitlab_redis_rate_limiting,
-feature_category: :global_search do
+ feature_category: :global_search do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) }
let_it_be(:wiki_page) do
diff --git a/spec/features/search/user_uses_search_filters_spec.rb b/spec/features/search/user_uses_search_filters_spec.rb
index 2e3aaab563d..5e553cb0869 100644
--- a/spec/features/search/user_uses_search_filters_spec.rb
+++ b/spec/features/search/user_uses_search_filters_spec.rb
@@ -50,7 +50,9 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search
wait_for_requests
- expect(page).to have_current_path(search_path(search: "test"))
+ expect(page).to have_current_path(search_path, ignore_query: true) do |uri|
+ uri.normalized_query(:sorted) == "scope=blobs&search=test"
+ end
end
end
end
@@ -83,7 +85,9 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search
find('[data-testid="project-filter"] [data-testid="clear-icon"]').click
wait_for_requests
- expect(page).to have_current_path(search_path(search: "test"))
+ expect(page).to have_current_path(search_path, ignore_query: true) do |uri|
+ uri.normalized_query(:sorted) == "scope=blobs&search=test"
+ end
end
end
end
diff --git a/spec/features/snippets/search_snippets_spec.rb b/spec/features/snippets/search_snippets_spec.rb
index 98842f54015..afb53c563de 100644
--- a/spec/features/snippets/search_snippets_spec.rb
+++ b/spec/features/snippets/search_snippets_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Search Snippets', :js, feature_category: :source_code_management do
+RSpec.describe 'Search Snippets', :js, feature_category: :global_search do
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')
@@ -11,7 +11,7 @@ RSpec.describe 'Search Snippets', :js, feature_category: :source_code_management
visit dashboard_snippets_path
submit_search('Middle')
- select_search_scope('Titles and Descriptions')
+ select_search_scope(_("Snippets"))
expect(page).to have_link(public_snippet.title)
expect(page).to have_link(private_snippet.title)
diff --git a/spec/features/snippets/spam_snippets_spec.rb b/spec/features/snippets/spam_snippets_spec.rb
index 0e3f96906de..c2ac33a3b8f 100644
--- a/spec/features/snippets/spam_snippets_spec.rb
+++ b/spec/features/snippets/spam_snippets_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'snippet editor with spam', skip: "Will be handled in https://gitlab.com/gitlab-org/gitlab/-/issues/217722",
- feature_category: :source_code_management do
+ feature_category: :source_code_management do
include_context 'includes Spam constants'
let_it_be(:user) { create(:user) }
diff --git a/spec/features/snippets/user_creates_snippet_spec.rb b/spec/features/snippets/user_creates_snippet_spec.rb
index f4b6b552d46..090d854081a 100644
--- a/spec/features/snippets/user_creates_snippet_spec.rb
+++ b/spec/features/snippets/user_creates_snippet_spec.rb
@@ -81,8 +81,10 @@ RSpec.describe 'User creates snippet', :js, feature_category: :source_code_manag
context 'when snippets default visibility level is restricted' do
before do
- stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PRIVATE],
- default_snippet_visibility: Gitlab::VisibilityLevel::PRIVATE)
+ stub_application_setting(
+ restricted_visibility_levels: [Gitlab::VisibilityLevel::PRIVATE],
+ default_snippet_visibility: Gitlab::VisibilityLevel::PRIVATE
+ )
end
it 'creates a snippet using the lowest available visibility level as default' do
diff --git a/spec/features/task_lists_spec.rb b/spec/features/task_lists_spec.rb
index 8a9d2ff42d9..beadeab1736 100644
--- a/spec/features/task_lists_spec.rb
+++ b/spec/features/task_lists_spec.rb
@@ -137,8 +137,7 @@ RSpec.describe 'Task Lists', :js, feature_category: :team_planning do
describe 'multiple tasks' do
let!(:note) do
- create(:note, note: markdown, noteable: issue,
- project: project, author: user)
+ create(:note, note: markdown, noteable: issue, project: project, author: user)
end
it 'renders for note body' do
@@ -171,8 +170,7 @@ RSpec.describe 'Task Lists', :js, feature_category: :team_planning do
describe 'single incomplete task' do
let!(:note) do
- create(:note, note: single_incomplete_markdown, noteable: issue,
- project: project, author: user)
+ create(:note, note: single_incomplete_markdown, noteable: issue, project: project, author: user)
end
it 'renders for note body' do
@@ -186,8 +184,7 @@ RSpec.describe 'Task Lists', :js, feature_category: :team_planning do
describe 'single complete task' do
let!(:note) do
- create(:note, note: single_complete_markdown, noteable: issue,
- project: project, author: user)
+ create(:note, note: single_complete_markdown, noteable: issue, project: project, author: user)
end
it 'renders for note body' do
diff --git a/spec/features/uploads/user_uploads_avatar_to_group_spec.rb b/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
index 02e98905662..2872446ed6b 100644
--- a/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'User uploads avatar to group', feature_category: :user_profile d
visit group_path(group)
- expect(page).to have_selector(%Q(img[data-src$="/uploads/-/system/group/avatar/#{group.id}/dk.png"]))
+ expect(page).to have_selector(%(img[data-src$="/uploads/-/system/group/avatar/#{group.id}/dk.png"]))
# Cheating here to verify something that isn't user-facing, but is important
expect(group.reload.avatar.file).to exist
diff --git a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
index 03b072ea417..cc296259b80 100644
--- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'User uploads avatar to profile', feature_category: :user_profile
visit user_path(user)
- expect(page).to have_selector(%Q(img[src$="/uploads/-/system/user/avatar/#{user.id}/dk.png?width=96"]))
+ expect(page).to have_selector(%(img[src$="/uploads/-/system/user/avatar/#{user.id}/dk.png?width=96"]))
# Cheating here to verify something that isn't user-facing, but is important
expect(user.reload.avatar.file).to exist
diff --git a/spec/features/user_sees_revert_modal_spec.rb b/spec/features/user_sees_revert_modal_spec.rb
index aca32d26bdb..9ee3fe846a6 100644
--- a/spec/features/user_sees_revert_modal_spec.rb
+++ b/spec/features/user_sees_revert_modal_spec.rb
@@ -3,7 +3,9 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees revert modal', :js, :sidekiq_might_not_need_inline,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project) }
@@ -22,6 +24,8 @@ feature_category: :code_review_workflow do
stub_feature_flags(unbatch_graphql_queries: false)
sign_in(user)
visit(project_merge_request_path(project, merge_request))
+ close_rich_text_promo_popover_if_present
+
page.within('.mr-state-widget') do
click_button 'Merge'
end
@@ -36,6 +40,7 @@ feature_category: :code_review_workflow do
context 'with page reload validates js correctly loaded' do
before do
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'showing the revert modal'
diff --git a/spec/features/users/email_verification_on_login_spec.rb b/spec/features/users/email_verification_on_login_spec.rb
index 481ff52b800..1854e812b73 100644
--- a/spec/features/users/email_verification_on_login_spec.rb
+++ b/spec/features/users/email_verification_on_login_spec.rb
@@ -358,10 +358,12 @@ RSpec.describe 'Email Verification On Login', :clean_gitlab_redis_rate_limiting,
def expect_log_message(event = nil, times = 1, reason: '', message: nil)
expect(Gitlab::AppLogger).to have_received(:info)
.exactly(times).times
- .with(message || hash_including(message: 'Email Verification',
- event: event,
- username: user.username,
- ip: '127.0.0.1',
- reason: reason))
+ .with(message || hash_including(
+ message: 'Email Verification',
+ event: event,
+ username: user.username,
+ ip: '127.0.0.1',
+ reason: reason
+ ))
end
end
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 5529f0fa49e..047590fb3aa 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -390,8 +390,12 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_
end
before do
- stub_omniauth_saml_config(enabled: true, auto_link_saml_user: true, allow_single_sign_on: ['saml'],
- providers: [mock_saml_config_with_upstream_two_factor_authn_contexts])
+ stub_omniauth_saml_config(
+ enabled: true,
+ auto_link_saml_user: true,
+ allow_single_sign_on: ['saml'],
+ providers: [mock_saml_config_with_upstream_two_factor_authn_contexts]
+ )
end
it 'displays the remember me checkbox' do
@@ -415,8 +419,10 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_
context 'when authn_context is worth two factors' do
let(:mock_saml_response) do
File.read('spec/fixtures/authentication/saml_response.xml')
- .gsub('urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
- 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS')
+ .gsub(
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS'
+ )
end
it 'signs user in without prompting for second factor' do
@@ -991,8 +997,7 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_
context 'when the user already enabled 2FA' do
before do
- user.update!(otp_required_for_login: true,
- otp_secret: User.generate_otp_secret(32))
+ user.update!(otp_required_for_login: true, otp_secret: User.generate_otp_secret(32))
end
it 'asks the user to accept the terms' do
diff --git a/spec/features/users/overview_spec.rb b/spec/features/users/overview_spec.rb
index ff903358931..fdd0c38a718 100644
--- a/spec/features/users/overview_spec.rb
+++ b/spec/features/users/overview_spec.rb
@@ -9,12 +9,14 @@ RSpec.describe 'Overview tab on a user profile', :js, feature_category: :user_pr
def push_code_contribution
event = create(:push_event, project: contributed_project, author: user)
- create(:push_event_payload,
- event: event,
- commit_from: '11f9ac0a48b62cef25eedede4c1819964f08d5ce',
- commit_to: '1cf19a015df3523caf0a1f9d40c98a267d6a2fc2',
- commit_count: 3,
- ref: 'master')
+ create(
+ :push_event_payload,
+ event: event,
+ commit_from: '11f9ac0a48b62cef25eedede4c1819964f08d5ce',
+ commit_to: '1cf19a015df3523caf0a1f9d40c98a267d6a2fc2',
+ commit_count: 3,
+ ref: 'master'
+ )
end
before do
diff --git a/spec/features/users/rss_spec.rb b/spec/features/users/rss_spec.rb
index bc37c9941ce..39b6d049e43 100644
--- a/spec/features/users/rss_spec.rb
+++ b/spec/features/users/rss_spec.rb
@@ -6,6 +6,10 @@ RSpec.describe 'User RSS', feature_category: :user_profile do
let(:user) { create(:user) }
let(:path) { user_path(create(:user)) }
+ before do
+ stub_feature_flags(user_profile_overflow_menu_vue: false)
+ end
+
context 'when signed in' do
before do
sign_in(user)
@@ -22,4 +26,8 @@ RSpec.describe 'User RSS', feature_category: :user_profile do
it_behaves_like "it has an RSS button without a feed token"
end
+
+ # TODO: implement tests before the FF "user_profile_overflow_menu_vue" is turned on
+ # See: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122971
+ # Related Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/416974
end
diff --git a/spec/features/users/show_spec.rb b/spec/features/users/show_spec.rb
index 9c4a1b36ecc..f8653b22377 100644
--- a/spec/features/users/show_spec.rb
+++ b/spec/features/users/show_spec.rb
@@ -9,10 +9,32 @@ RSpec.describe 'User page', feature_category: :user_profile do
subject(:visit_profile) { visit(user_path(user)) }
- it 'shows user id' do
- subject
+ context 'with "user_profile_overflow_menu_vue" feature flag enabled', :js do
+ it 'does not show the user id in the profile info' do
+ subject
+
+ expect(page).not_to have_content("User ID: #{user.id}")
+ end
+
+ it 'shows copy user id action in the dropdown' do
+ subject
+
+ find('[data-testid="base-dropdown-toggle"').click
+
+ expect(page).to have_content("Copy user ID: #{user.id}")
+ end
+ end
+
+ context 'with "user_profile_overflow_menu_vue" feature flag disabled', :js do
+ before do
+ stub_feature_flags(user_profile_overflow_menu_vue: false)
+ end
+
+ it 'shows user id' do
+ subject
- expect(page).to have_content("User ID: #{user.id}")
+ expect(page).to have_content("User ID: #{user.id}")
+ end
end
it 'shows name on breadcrumbs' do
diff --git a/spec/features/users/terms_spec.rb b/spec/features/users/terms_spec.rb
index 5c61843e558..cf62ccaf999 100644
--- a/spec/features/users/terms_spec.rb
+++ b/spec/features/users/terms_spec.rb
@@ -41,6 +41,21 @@ RSpec.describe 'Users > Terms', :js, feature_category: :user_profile do
end
end
+ context 'when user is a service account' do
+ let(:service_account) { create(:user, :service_account) }
+
+ before do
+ enforce_terms
+ end
+
+ it 'auto accepts the terms' do
+ visit terms_path
+
+ expect(page).not_to have_content('Accept terms')
+ expect(service_account.terms_accepted?).to be(true)
+ end
+ end
+
context 'when signed in' do
let(:user) { create(:user) }