diff options
Diffstat (limited to 'spec/features')
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) } |