diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-20 13:43:29 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-20 13:43:29 +0300 |
commit | 3b1af5cc7ed2666ff18b718ce5d30fa5a2756674 (patch) | |
tree | 3bc4a40e0ee51ec27eabf917c537033c0c5b14d4 /spec/features | |
parent | 9bba14be3f2c211bf79e15769cd9b77bc73a13bc (diff) |
Add latest changes from gitlab-org/gitlab@16-1-stable-eev16.1.0-rc42
Diffstat (limited to 'spec/features')
276 files changed, 1448 insertions, 1269 deletions
diff --git a/spec/features/admin/admin_appearance_spec.rb b/spec/features/admin/admin_appearance_spec.rb index db0ae79c9c4..71c904b3a19 100644 --- a/spec/features/admin/admin_appearance_spec.rb +++ b/spec/features/admin/admin_appearance_spec.rb @@ -6,6 +6,10 @@ RSpec.describe 'Admin Appearance', feature_category: :shared do let!(:appearance) { create(:appearance) } let(:admin) { create(:admin) } + before do + stub_feature_flags(edit_user_profile_vue: false) + end + flag_values = [true, false] flag_values.each do |val| context "with #{val}" do diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb index 34fe98d22bd..1e3dbd7fea4 100644 --- a/spec/features/admin/admin_groups_spec.rb +++ b/spec/features/admin/admin_groups_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin Groups', feature_category: :subgroups do +RSpec.describe 'Admin Groups', feature_category: :groups_and_projects do include Features::MembersHelpers include Features::InviteMembersModalHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/admin/admin_hook_logs_spec.rb b/spec/features/admin/admin_hook_logs_spec.rb index 34208cca113..0a537e65b99 100644 --- a/spec/features/admin/admin_hook_logs_spec.rb +++ b/spec/features/admin/admin_hook_logs_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin::HookLogs', feature_category: :integrations do +RSpec.describe 'Admin::HookLogs', feature_category: :webhooks do let_it_be(:system_hook) { create(:system_hook) } let_it_be(:hook_log) { create(:web_hook_log, web_hook: system_hook, internal_error_message: 'some error') } let_it_be(:admin) { create(:admin) } diff --git a/spec/features/admin/admin_hooks_spec.rb b/spec/features/admin/admin_hooks_spec.rb index a8aa2680b55..ee8f94d6658 100644 --- a/spec/features/admin/admin_hooks_spec.rb +++ b/spec/features/admin/admin_hooks_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin::Hooks', feature_category: :integrations do +RSpec.describe 'Admin::Hooks', feature_category: :webhooks do include Spec::Support::Helpers::ModalHelpers let_it_be(:user) { create(:admin) } diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb index ac2e9de7aee..3454b7af962 100644 --- a/spec/features/admin/admin_projects_spec.rb +++ b/spec/features/admin/admin_projects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin::Projects", feature_category: :projects do +RSpec.describe "Admin::Projects", feature_category: :groups_and_projects do include Features::MembersHelpers include Features::InviteMembersModalHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index 582535790bd..b81703f728b 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -565,7 +565,7 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do click_on 'Delete runner' within_modal do - click_on 'Delete runner' + click_on 'Permanently delete runner' end end @@ -603,7 +603,9 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do describe 'runner header', :js do it 'contains the runner status, type and id' do - expect(page).to have_content("#{s_('Runners|Never contacted')} Project Runner ##{project_runner.id} created") + expect(page).to have_content( + "##{project_runner.id} (#{project_runner.short_sha}) #{s_('Runners|Never contacted')} Project created" + ) end end diff --git a/spec/features/admin/admin_sees_background_migrations_spec.rb b/spec/features/admin/admin_sees_background_migrations_spec.rb index 77266e65e4c..7d4d3deb6d8 100644 --- a/spec/features/admin/admin_sees_background_migrations_spec.rb +++ b/spec/features/admin/admin_sees_background_migrations_spec.rb @@ -200,7 +200,7 @@ RSpec.describe "Admin > Admin sees background migrations", feature_category: :da before do skip_if_multiple_databases_are_setup - allow(Gitlab::Database).to receive(:db_config_names).and_return(['main']) + allow(Gitlab::Database).to receive(:db_config_names).with(with_schema: :gitlab_shared).and_return(['main']) end it 'does not render the database listbox' do @@ -214,7 +214,7 @@ RSpec.describe "Admin > Admin sees background migrations", feature_category: :da before do skip_if_multiple_databases_not_setup(:ci) - allow(Gitlab::Database).to receive(:db_config_names).and_return(%w[main ci]) + allow(Gitlab::Database).to receive(:db_config_names).with(with_schema: :gitlab_shared).and_return(%w[main ci]) end it 'renders the database listbox' do diff --git a/spec/features/admin/admin_sees_project_statistics_spec.rb b/spec/features/admin/admin_sees_project_statistics_spec.rb index d3d0625ac43..d977735daf8 100644 --- a/spec/features/admin/admin_sees_project_statistics_spec.rb +++ b/spec/features/admin/admin_sees_project_statistics_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin > Admin sees project statistics", feature_category: :projects do +RSpec.describe "Admin > Admin sees project statistics", feature_category: :groups_and_projects do let(:current_user) { create(:admin) } before do @@ -16,7 +16,7 @@ RSpec.describe "Admin > Admin sees project statistics", feature_category: :proje let(:project) { create(:project, :repository) } it "shows project statistics" do - expect(page).to have_content("Storage: 0 Bytes (Repository: 0 Bytes / Wikis: 0 Bytes / Build Artifacts: 0 Bytes / Pipeline Artifacts: 0 Bytes / LFS: 0 Bytes / Snippets: 0 Bytes / Packages: 0 Bytes / Uploads: 0 Bytes)") + expect(page).to have_content("Storage: 0 B (Repository: 0 B / Wikis: 0 B / Build Artifacts: 0 B / Pipeline Artifacts: 0 B / LFS: 0 B / Snippets: 0 B / Packages: 0 B / Uploads: 0 B)") end end diff --git a/spec/features/admin/admin_sees_projects_statistics_spec.rb b/spec/features/admin/admin_sees_projects_statistics_spec.rb index 82361a985ae..3363a67ea90 100644 --- a/spec/features/admin/admin_sees_projects_statistics_spec.rb +++ b/spec/features/admin/admin_sees_projects_statistics_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin > Admin sees projects statistics", feature_category: :projects do +RSpec.describe "Admin > Admin sees projects statistics", feature_category: :groups_and_projects do let(:current_user) { create(:admin) } before do @@ -16,6 +16,6 @@ RSpec.describe "Admin > Admin sees projects statistics", feature_category: :proj end it "shows project statistics for projects that have them" do - expect(page.all('.stats').map(&:text)).to contain_exactly("0 Bytes", "Unknown") + expect(page.all('.stats').map(&:text)).to contain_exactly("0 B", "Unknown") end end diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb index 1f43caf37e7..3e08d2277c1 100644 --- a/spec/features/admin/admin_settings_spec.rb +++ b/spec/features/admin/admin_settings_spec.rb @@ -116,7 +116,7 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do it 'change Maximum export size' do page.within(find('[data-testid="account-limit"]')) do - fill_in 'Maximum export size (MB)', with: 25 + fill_in 'Maximum export size (MiB)', with: 25 click_button 'Save changes' end @@ -126,7 +126,7 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do it 'change Maximum import size' do page.within(find('[data-testid="account-limit"]')) do - fill_in 'Maximum import size (MB)', with: 15 + fill_in 'Maximum import size (MiB)', with: 15 click_button 'Save changes' end @@ -905,7 +905,7 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do it 'change Pages settings' do page.within('.as-pages') do - fill_in 'Maximum size of pages (MB)', with: 15 + fill_in 'Maximum size of pages (MiB)', with: 15 check 'Require users to prove ownership of custom domains' click_button 'Save changes' end @@ -977,14 +977,24 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do end end - context 'Service usage data page' do + context 'Service usage data page', :with_license do before do stub_usage_data_connections stub_database_flavor_check end context 'when service data cached', :use_clean_rails_memory_store_caching do + let(:usage_data) { { uuid: "1111", hostname: "localhost", counts: { issue: 0 } }.deep_stringify_keys } + before do + # We are mocking Gitlab::Usage::ServicePingReport because this dataset generation + # takes a very long time, and is not what we're testing in this context. + # + # See https://gitlab.com/gitlab-org/gitlab/-/issues/414929 + allow(Gitlab::UsageData).to receive(:data).and_return(usage_data) + allow(Gitlab::Usage::ServicePingReport).to receive(:with_instrumentation_classes) + .with(usage_data, :with_value).and_return(usage_data) + visit usage_data_admin_application_settings_path visit service_usage_data_admin_application_settings_path end diff --git a/spec/features/admin/admin_system_info_spec.rb b/spec/features/admin/admin_system_info_spec.rb index 21a001f12c3..71a0b829932 100644 --- a/spec/features/admin/admin_system_info_spec.rb +++ b/spec/features/admin/admin_system_info_spec.rb @@ -22,7 +22,7 @@ RSpec.describe 'Admin System Info', feature_category: :shared do it 'shows system info page' do expect(page).to have_content 'CPU 2 cores' - expect(page).to have_content 'Memory Usage 4 GB / 16 GB' + expect(page).to have_content 'Memory Usage 4 GiB / 16 GiB' expect(page).to have_content 'Disk Usage' expect(page).to have_content 'System started' end @@ -37,7 +37,7 @@ RSpec.describe 'Admin System Info', feature_category: :shared do it 'shows system info page with no CPU info' do expect(page).to have_content 'CPU Unable to collect CPU info' - expect(page).to have_content 'Memory Usage 4 GB / 16 GB' + expect(page).to have_content 'Memory Usage 4 GiB / 16 GiB' expect(page).to have_content 'Disk Usage' expect(page).to have_content 'System started' end diff --git a/spec/features/boards/new_issue_spec.rb b/spec/features/boards/new_issue_spec.rb index 6753f0ea009..1fcea45c7ae 100644 --- a/spec/features/boards/new_issue_spec.rb +++ b/spec/features/boards/new_issue_spec.rb @@ -245,15 +245,15 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d end it 'lists a project which is a direct descendant of the top-level group' do - expect(project_select_dropdown).to have_button("root project") + expect(project_select_dropdown).to have_selector("li", text: "root project") end it 'lists a project that belongs to a subgroup' do - expect(project_select_dropdown).to have_button("sub project1") + expect(project_select_dropdown).to have_selector("li", text: "sub project1") end it "does not list projects to which user doesn't have access" do - expect(project_select_dropdown).not_to have_button("sub project2") + expect(project_select_dropdown).not_to have_selector("li", text: "sub project2") end end end diff --git a/spec/features/boards/sidebar_assignee_spec.rb b/spec/features/boards/sidebar_assignee_spec.rb index e3de594f856..a912ea28ddc 100644 --- a/spec/features/boards/sidebar_assignee_spec.rb +++ b/spec/features/boards/sidebar_assignee_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project issue boards sidebar assignee', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332230', +RSpec.describe 'Project issue boards sidebar assignee', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332078', feature_category: :team_planning do include BoardHelpers diff --git a/spec/features/broadcast_messages_spec.rb b/spec/features/broadcast_messages_spec.rb index 2fad15c8a1f..2e0f4e3b83b 100644 --- a/spec/features/broadcast_messages_spec.rb +++ b/spec/features/broadcast_messages_spec.rb @@ -4,10 +4,11 @@ require 'spec_helper' RSpec.describe 'Broadcast Messages', feature_category: :onboarding do let_it_be(:user) { create(:user) } + let(:path) { explore_projects_path } shared_examples 'a Broadcast Messages' do |type| it 'shows broadcast message' do - visit explore_projects_path + visit path expect(page).to have_content 'SampleMessage' end @@ -15,7 +16,7 @@ RSpec.describe 'Broadcast Messages', feature_category: :onboarding do it 'renders styled links' do create(:broadcast_message, type, message: "<a href='gitlab.com' style='color: purple'>click me</a>") - visit explore_projects_path + visit path expected_html = "<p><a href=\"gitlab.com\" style=\"color: purple\">click me</a></p>" expect(page.body).to include(expected_html) @@ -23,26 +24,28 @@ RSpec.describe 'Broadcast Messages', feature_category: :onboarding do end shared_examples 'a dismissible Broadcast Messages' do - it 'hides broadcast message after dismiss', :js, - quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/390900' do - visit explore_projects_path + it 'hides broadcast message after dismiss', :js do + visit path - find('.js-dismiss-current-broadcast-notification').click + expect_to_be_on_explore_projects_page - expect(page).not_to have_content 'SampleMessage' + find('body.page-initialised .js-dismiss-current-broadcast-notification').click + + expect_message_dismissed end - it 'broadcast message is still hidden after refresh', :js, - quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/391406' do - visit explore_projects_path + it 'broadcast message is still hidden after refresh', :js do + visit path + + expect_to_be_on_explore_projects_page - find('.js-dismiss-current-broadcast-notification').click + find('body.page-initialised .js-dismiss-current-broadcast-notification').click - wait_for_cookie_set("hide_broadcast_message_#{broadcast_message.id}") + expect_message_dismissed - visit explore_projects_path + visit path - expect(page).not_to have_content 'SampleMessage' + expect_message_dismissed end end @@ -52,7 +55,7 @@ RSpec.describe 'Broadcast Messages', feature_category: :onboarding do it_behaves_like 'a Broadcast Messages' it 'is not dismissible' do - visit explore_projects_path + visit path expect(page).not_to have_selector('.js-dismiss-current-broadcast-notification') end @@ -60,9 +63,9 @@ RSpec.describe 'Broadcast Messages', feature_category: :onboarding do it 'does not replace placeholders' do create(:broadcast_message, message: 'Hi {{name}}') - sign_in(user) + gitlab_sign_in(user) - visit explore_projects_path + visit path expect(page).to have_content 'Hi {{name}}' end @@ -86,11 +89,76 @@ RSpec.describe 'Broadcast Messages', feature_category: :onboarding do it 'replaces placeholders' do create(:broadcast_message, :notification, message: 'Hi {{name}}') - sign_in(user) + gitlab_sign_in(user) - visit explore_projects_path + visit path expect(page).to have_content "Hi #{user.name}" end end + + context 'with GitLab revision changes', :js, :use_clean_rails_redis_caching do + it 'properly shows effects of delete from any revision' do + text = 'my_broadcast_message' + message = create(:broadcast_message, broadcast_type: :banner, message: text) + new_strategy_value = { revision: 'abc123', version: '_version_' } + + visit path + + expect_broadcast_message(text) + + # seed the other cache + original_strategy_value = Gitlab::Cache::JsonCache::STRATEGY_KEY_COMPONENTS + stub_const('Gitlab::Cache::JsonCaches::JsonKeyed::STRATEGY_KEY_COMPONENTS', new_strategy_value) + + page.refresh + + expect_broadcast_message(text) + + # delete on original cache + stub_const('Gitlab::Cache::JsonCaches::JsonKeyed::STRATEGY_KEY_COMPONENTS', original_strategy_value) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) + + visit admin_broadcast_messages_path + + page.within('[data-testid="message-row"]', match: :first) do + find("[data-testid='delete-message-#{message.id}']").click + end + + visit path + + expect_no_broadcast_message + + # other revision of GitLab does gets cache destroyed + stub_const('Gitlab::Cache::JsonCaches::JsonKeyed::STRATEGY_KEY_COMPONENTS', new_strategy_value) + + page.refresh + + expect_no_broadcast_message + end + end + + def expect_broadcast_message(text) + page.within('[data-testid="banner-broadcast-message"]') do + expect(page).to have_content text + end + end + + def expect_no_broadcast_message + expect_to_be_on_explore_projects_page + + expect(page).not_to have_selector('[data-testid="banner-broadcast-message"]') + end + + def expect_to_be_on_explore_projects_page + page.within('[data-testid="explore-projects-title"]') do + expect(page).to have_content 'Explore projects' + end + end + + def expect_message_dismissed + expect(page).not_to have_content 'SampleMessage' + end end diff --git a/spec/features/calendar_spec.rb b/spec/features/calendar_spec.rb index 67baed5dc91..8ad27b65f11 100644 --- a/spec/features/calendar_spec.rb +++ b/spec/features/calendar_spec.rb @@ -155,14 +155,12 @@ RSpec.describe 'Contributions Calendar', :js, feature_category: :user_profile do Issues::CreateService.new( container: contributed_project, current_user: user, - params: issue_params, - spam_params: nil + params: issue_params ).execute WorkItems::CreateService.new( container: contributed_project, current_user: user, - params: { title: 'new task' }, - spam_params: nil + params: { title: 'new task' } ).execute end @@ -204,8 +202,7 @@ RSpec.describe 'Contributions Calendar', :js, feature_category: :user_profile do Issues::CreateService.new( container: contributed_project, current_user: user, - params: issue_params, - spam_params: nil + params: issue_params ).execute end end @@ -301,14 +298,12 @@ RSpec.describe 'Contributions Calendar', :js, feature_category: :user_profile do Issues::CreateService.new( container: contributed_project, current_user: user, - params: issue_params, - spam_params: nil + params: issue_params ).execute WorkItems::CreateService.new( container: contributed_project, current_user: user, - params: { title: 'new task' }, - spam_params: nil + params: { title: 'new task' } ).execute end @@ -339,8 +334,7 @@ RSpec.describe 'Contributions Calendar', :js, feature_category: :user_profile do Issues::CreateService.new( container: contributed_project, current_user: user, - params: issue_params, - spam_params: nil + params: issue_params ).execute end end diff --git a/spec/features/clusters/cluster_health_dashboard_spec.rb b/spec/features/clusters/cluster_health_dashboard_spec.rb deleted file mode 100644 index e932f8c6b98..00000000000 --- a/spec/features/clusters/cluster_health_dashboard_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Cluster Health board', :js, :kubeclient, :use_clean_rails_memory_store_caching, :sidekiq_inline, -feature_category: :deployment_management do - include KubernetesHelpers - include PrometheusHelpers - - let_it_be(:current_user) { create(:user) } - let_it_be(:clusterable) { create(:project) } - let_it_be(:cluster) { create(:cluster, :provided_by_gcp, :project, projects: [clusterable]) } - let_it_be(:cluster_path) { project_cluster_path(clusterable, cluster) } - - before do - stub_feature_flags(remove_monitor_metrics: false) - - clusterable.add_maintainer(current_user) - - sign_in(current_user) - end - - it 'shows cluster board section within the page' do - visit cluster_path - - expect(page).to have_text('Health') - - click_link 'Health' - - expect(page).to have_css('.cluster-health-graphs') - end - - context 'feature remove_monitor_metrics enabled' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'does not show the cluster health tab' do - visit cluster_path - - expect(page).not_to have_text('Health') - end - - it 'does not show the cluster health section' do - visit project_cluster_path(clusterable, cluster, { tab: 'health' }) - - expect(page).not_to have_text('you must first enable Prometheus in the Integrations tab') - end - end - - context 'no prometheus available' do - it 'shows enable Prometheus message' do - visit cluster_path - - click_link 'Health' - - expect(page).to have_text('you must first enable Prometheus in the Integrations tab') - end - end - - context 'when there is cluster with enabled prometheus' do - before do - create(:clusters_integrations_prometheus, enabled: true, cluster: cluster) - stub_kubeclient_discover(cluster.platform.api_url) - end - - context 'waiting for data' do - before do - stub_empty_response - end - - it 'shows container and waiting for data message' do - visit cluster_path - - click_link 'Health' - - wait_for_requests - - expect(page).to have_css('.prometheus-graphs') - expect(page).to have_text('Waiting for performance data') - end - end - - context 'connected, prometheus returns data' do - before do - stub_connected - - visit cluster_path - - click_link 'Health' - - wait_for_requests - end - - it 'renders charts' do - expect(page).to have_css('.prometheus-graphs') - expect(page).to have_css('.prometheus-graph') - expect(page).to have_css('.prometheus-graph-title') - expect(page).to have_css('[_echarts_instance_]') - expect(page).to have_css('.prometheus-graph', count: 2) - expect(page).to have_content('Avg') - end - - it 'focuses the single panel on toggle' do - click_button('More actions', match: :first) - click_button('Expand panel') - - expect(page).to have_css('.prometheus-graph', count: 1) - - click_button('Collapse panel') - - expect(page).to have_css('.prometheus-graph', count: 2) - end - end - - def stub_empty_response - stub_prometheus_request(/prometheus-prometheus-server/, status: 204, body: {}) - stub_prometheus_request(%r{prometheus/api/v1}, status: 204, body: {}) - end - - def stub_connected - stub_prometheus_request(/prometheus-prometheus-server/, body: prometheus_values_body) - stub_prometheus_request(%r{prometheus/api/v1}, body: prometheus_values_body) - end - end -end diff --git a/spec/features/commit_spec.rb b/spec/features/commit_spec.rb index dd96b763e55..61792ea5a58 100644 --- a/spec/features/commit_spec.rb +++ b/spec/features/commit_spec.rb @@ -70,7 +70,6 @@ RSpec.describe 'Commit', feature_category: :source_code_management do context "when super sidebar is enabled" do before do user.update!(use_new_navigation: true) - stub_feature_flags(super_sidebar_nav: true) end it_behaves_like "single commit view" diff --git a/spec/features/commits/user_view_commits_spec.rb b/spec/features/commits/user_view_commits_spec.rb index b58d7cf3741..e13bd90ff04 100644 --- a/spec/features/commits/user_view_commits_spec.rb +++ b/spec/features/commits/user_view_commits_spec.rb @@ -7,10 +7,6 @@ RSpec.describe 'Commit > User view commits', feature_category: :source_code_mana let_it_be(:group) { create(:group, :public) } shared_examples 'can view commits' do - it 'displays the correct number of commits per day in the header' do - expect(first('.js-commit-header').find('.commits-count').text).to eq('1 commit') - end - it 'lists the correct number of commits' do expect(page).to have_selector('#commits-list > li:nth-child(2) > ul', count: 1) end diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb index c38ae0c2b0d..fd09a7f7343 100644 --- a/spec/features/commits_spec.rb +++ b/spec/features/commits_spec.rb @@ -8,6 +8,7 @@ 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 @@ -186,6 +187,13 @@ RSpec.describe 'Commits', feature_category: :source_code_management do visit project_commits_path(project, branch_name) end + it 'includes a date on which the commits were authored' do + commits = project.repository.commits(branch_name, limit: 40) + commits.chunk { |c| c.committed_date.in_time_zone.to_date }.each do |day, _daily_commits| + expect(page).to have_content(day.strftime("%b %d, %Y")) + end + end + it 'includes the committed_date for each commit' do commits = project.repository.commits(branch_name, limit: 40) diff --git a/spec/features/dashboard/archived_projects_spec.rb b/spec/features/dashboard/archived_projects_spec.rb index d3992d34506..b56f942d906 100644 --- a/spec/features/dashboard/archived_projects_spec.rb +++ b/spec/features/dashboard/archived_projects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Dashboard Archived Project', feature_category: :projects do +RSpec.describe 'Dashboard Archived Project', feature_category: :groups_and_projects do let(:user) { create :user } let(:project) { create :project } let(:archived_project) { create(:project, :archived) } diff --git a/spec/features/dashboard/group_dashboard_with_external_authorization_service_spec.rb b/spec/features/dashboard/group_dashboard_with_external_authorization_service_spec.rb index 3040c97a16f..c1849cbee83 100644 --- a/spec/features/dashboard/group_dashboard_with_external_authorization_service_spec.rb +++ b/spec/features/dashboard/group_dashboard_with_external_authorization_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'The group dashboard', :js, feature_category: :subgroups do +RSpec.describe 'The group dashboard', :js, feature_category: :groups_and_projects do include ExternalAuthorizationServiceHelpers include Features::TopNavSpecHelpers diff --git a/spec/features/dashboard/group_spec.rb b/spec/features/dashboard/group_spec.rb index f363007f0d7..ea600758607 100644 --- a/spec/features/dashboard/group_spec.rb +++ b/spec/features/dashboard/group_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Dashboard Group', feature_category: :subgroups do +RSpec.describe 'Dashboard Group', feature_category: :groups_and_projects do before do sign_in(create(:user)) end diff --git a/spec/features/dashboard/groups_list_spec.rb b/spec/features/dashboard/groups_list_spec.rb index 7112b30957a..b077b554773 100644 --- a/spec/features/dashboard/groups_list_spec.rb +++ b/spec/features/dashboard/groups_list_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Dashboard Groups page', :js, feature_category: :subgroups do +RSpec.describe 'Dashboard Groups page', :js, feature_category: :groups_and_projects do let(:user) { create :user } let(:group) { create(:group) } let(:nested_group) { create(:group, :nested) } diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb index 32bce32ec6c..04b7f1ca821 100644 --- a/spec/features/dashboard/projects_spec.rb +++ b/spec/features/dashboard/projects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Dashboard Projects', feature_category: :projects do +RSpec.describe 'Dashboard Projects', feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:project, reload: true) { create(:project, :repository, creator: build(:user)) } # ensure creator != owner to avoid N+1 false-positive let_it_be(:project2) { create(:project, :public) } diff --git a/spec/features/dashboard/shortcuts_spec.rb b/spec/features/dashboard/shortcuts_spec.rb index 155f7e93961..2e01c1304de 100644 --- a/spec/features/dashboard/shortcuts_spec.rb +++ b/spec/features/dashboard/shortcuts_spec.rb @@ -20,7 +20,11 @@ RSpec.describe 'Dashboard shortcuts', :js, feature_category: :shared do find('body').send_keys([:shift, 'M']) - check_page_title('Merge requests') + check_page_title('Assigned merge requests') + + find('body').send_keys([:shift, 'R']) + + check_page_title('Review requests') find('body').send_keys([:shift, 'T']) diff --git a/spec/features/dashboard/user_filters_projects_spec.rb b/spec/features/dashboard/user_filters_projects_spec.rb index 8ec9b98c3b3..bf9fe18ee75 100644 --- a/spec/features/dashboard/user_filters_projects_spec.rb +++ b/spec/features/dashboard/user_filters_projects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Dashboard > User filters projects', feature_category: :projects do +RSpec.describe 'Dashboard > User filters projects', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, name: 'Victorialand', namespace: user.namespace, created_at: 2.seconds.ago, updated_at: 2.seconds.ago) } let(:user2) { create(:user) } diff --git a/spec/features/explore/groups_list_spec.rb b/spec/features/explore/groups_list_spec.rb index 3ffa0dc5b64..39cd3c80307 100644 --- a/spec/features/explore/groups_list_spec.rb +++ b/spec/features/explore/groups_list_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Explore Groups page', :js, feature_category: :subgroups do +RSpec.describe 'Explore Groups page', :js, feature_category: :groups_and_projects do let!(:user) { create :user } let!(:group) { create(:group) } let!(:public_group) { create(:group, :public) } diff --git a/spec/features/explore/groups_spec.rb b/spec/features/explore/groups_spec.rb index 57a7e8ea523..9a3ae918bb9 100644 --- a/spec/features/explore/groups_spec.rb +++ b/spec/features/explore/groups_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Explore Groups', :js, feature_category: :subgroups do +RSpec.describe 'Explore Groups', :js, feature_category: :groups_and_projects do let(:user) { create :user } let(:group) { create :group } let!(:private_project) do diff --git a/spec/features/file_uploads/attachment_spec.rb b/spec/features/file_uploads/attachment_spec.rb index cff0c0b52b4..6c433b49b8b 100644 --- a/spec/features/file_uploads/attachment_spec.rb +++ b/spec/features/file_uploads/attachment_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Upload an attachment', :api, :js, feature_category: :projects do +RSpec.describe 'Upload an attachment', :api, :js, feature_category: :groups_and_projects do include_context 'file upload requests helpers' let_it_be(:project) { create(:project) } diff --git a/spec/features/file_uploads/group_import_spec.rb b/spec/features/file_uploads/group_import_spec.rb index f5082e31c06..02e6488f324 100644 --- a/spec/features/file_uploads/group_import_spec.rb +++ b/spec/features/file_uploads/group_import_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Upload a group export archive', :api, :js, feature_category: :subgroups do +RSpec.describe 'Upload a group export archive', :api, :js, feature_category: :groups_and_projects do include_context 'file upload requests helpers' let_it_be(:user) { create(:user, :admin) } diff --git a/spec/features/file_uploads/project_import_spec.rb b/spec/features/file_uploads/project_import_spec.rb index 3934e0319ad..acb4d43a373 100644 --- a/spec/features/file_uploads/project_import_spec.rb +++ b/spec/features/file_uploads/project_import_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Upload a project export archive', :api, :js, feature_category: :projects do +RSpec.describe 'Upload a project export archive', :api, :js, feature_category: :groups_and_projects do include_context 'file upload requests helpers' let_it_be(:user) { create(:user, :admin) } diff --git a/spec/features/file_uploads/user_avatar_spec.rb b/spec/features/file_uploads/user_avatar_spec.rb index 062c47d5310..3f7d69afa0b 100644 --- a/spec/features/file_uploads/user_avatar_spec.rb +++ b/spec/features/file_uploads/user_avatar_spec.rb @@ -8,6 +8,7 @@ RSpec.describe 'Upload a user avatar', :js, feature_category: :user_profile do let(:file) { fixture_file_upload('spec/fixtures/banana_sample.gif') } before do + stub_feature_flags(edit_user_profile_vue: false) sign_in(user) visit(profile_path) attach_file('user_avatar-trigger', file.path, make_visible: true) diff --git a/spec/features/groups/activity_spec.rb b/spec/features/groups/activity_spec.rb index 7e592b3f48b..12224566f35 100644 --- a/spec/features/groups/activity_spec.rb +++ b/spec/features/groups/activity_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group activity page', feature_category: :subgroups do +RSpec.describe 'Group activity page', feature_category: :groups_and_projects do let(:user) { create(:group_member, :developer, user: create(:user), group: group).user } let(:group) { create(:group) } let(:path) { activity_group_path(group) } diff --git a/spec/features/groups/board_sidebar_spec.rb b/spec/features/groups/board_sidebar_spec.rb index 8216bc3249d..6a1b7d20a25 100644 --- a/spec/features/groups/board_sidebar_spec.rb +++ b/spec/features/groups/board_sidebar_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group Issue Boards', :js, feature_category: :subgroups do +RSpec.describe 'Group Issue Boards', :js, feature_category: :groups_and_projects do include BoardHelpers let(:group) { create(:group) } diff --git a/spec/features/groups/board_spec.rb b/spec/features/groups/board_spec.rb index 8acf3ffe441..25f7d4d968c 100644 --- a/spec/features/groups/board_spec.rb +++ b/spec/features/groups/board_spec.rb @@ -37,9 +37,9 @@ RSpec.describe 'Group Boards', feature_category: :team_planning do fill_in 'issue_title', with: issue_title page.within("[data-testid='project-select-dropdown']") do - find('button.gl-dropdown-toggle').click + find('button.gl-new-dropdown-toggle').click - find('.gl-dropdown-item button').click + find('.gl-new-dropdown-item').click end click_button 'Create issue' diff --git a/spec/features/groups/empty_states_spec.rb b/spec/features/groups/empty_states_spec.rb index e123e223ae5..30074f421e5 100644 --- a/spec/features/groups/empty_states_spec.rb +++ b/spec/features/groups/empty_states_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group empty states', feature_category: :subgroups do +RSpec.describe 'Group empty states', feature_category: :groups_and_projects do let(:group) { create(:group) } let(:user) { create(:group_member, :developer, user: create(:user), group: group).user } diff --git a/spec/features/groups/group_page_with_external_authorization_service_spec.rb b/spec/features/groups/group_page_with_external_authorization_service_spec.rb index dce5b67d694..5b373aecce8 100644 --- a/spec/features/groups/group_page_with_external_authorization_service_spec.rb +++ b/spec/features/groups/group_page_with_external_authorization_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'The group page', feature_category: :subgroups do +RSpec.describe 'The group page', feature_category: :groups_and_projects do include ExternalAuthorizationServiceHelpers let(:user) { create(:user) } diff --git a/spec/features/groups/group_settings_spec.rb b/spec/features/groups/group_settings_spec.rb index 6443f4a6c38..a248a2b471a 100644 --- a/spec/features/groups/group_settings_spec.rb +++ b/spec/features/groups/group_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Edit group settings', feature_category: :subgroups do +RSpec.describe 'Edit group settings', feature_category: :groups_and_projects do include Spec::Support::Helpers::ModalHelpers let(:user) { create(:user) } diff --git a/spec/features/groups/integrations/group_integrations_spec.rb b/spec/features/groups/integrations/group_integrations_spec.rb index 8cddda91e89..de6403210bb 100644 --- a/spec/features/groups/integrations/group_integrations_spec.rb +++ b/spec/features/groups/integrations/group_integrations_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group integrations', :js do +RSpec.describe 'Group integrations', :js, feature_category: :integrations do include_context 'group integration activation' before do diff --git a/spec/features/groups/issues_spec.rb b/spec/features/groups/issues_spec.rb index 6d0d768d356..0d7e9df031c 100644 --- a/spec/features/groups/issues_spec.rb +++ b/spec/features/groups/issues_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group issues page', feature_category: :subgroups do +RSpec.describe 'Group issues page', feature_category: :groups_and_projects do include FilteredSearchHelpers include DragTo diff --git a/spec/features/groups/members/filter_members_spec.rb b/spec/features/groups/members/filter_members_spec.rb index c2ec709576b..bf9efd06a03 100644 --- a/spec/features/groups/members/filter_members_spec.rb +++ b/spec/features/groups/members/filter_members_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Filter members', :js, feature_category: :subgroups do +RSpec.describe 'Groups > Members > Filter members', :js, feature_category: :groups_and_projects do include Features::MembersHelpers let(:user) { create(:user) } diff --git a/spec/features/groups/members/leave_group_spec.rb b/spec/features/groups/members/leave_group_spec.rb index e1c2d8c0547..d864852e0d4 100644 --- a/spec/features/groups/members/leave_group_spec.rb +++ b/spec/features/groups/members/leave_group_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Leave group', feature_category: :subgroups do +RSpec.describe 'Groups > Members > Leave group', feature_category: :groups_and_projects do include Features::MembersHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/groups/members/list_members_spec.rb b/spec/features/groups/members/list_members_spec.rb index 6e20f92c16b..b16d61a5fe4 100644 --- a/spec/features/groups/members/list_members_spec.rb +++ b/spec/features/groups/members/list_members_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > List members', :js, feature_category: :subgroups do +RSpec.describe 'Groups > Members > List members', :js, feature_category: :groups_and_projects do include Features::MembersHelpers let(:user1) { create(:user, name: 'John Doe') } diff --git a/spec/features/groups/members/manage_groups_spec.rb b/spec/features/groups/members/manage_groups_spec.rb index f9c11dd0183..87de0e2e46b 100644 --- a/spec/features/groups/members/manage_groups_spec.rb +++ b/spec/features/groups/members/manage_groups_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Manage groups', :js, feature_category: :subgroups do +RSpec.describe 'Groups > Members > Manage groups', :js, feature_category: :groups_and_projects do + include ListboxHelpers include Features::MembersHelpers include Features::InviteMembersModalHelpers include Spec::Support::Helpers::ModalHelpers @@ -75,8 +76,7 @@ RSpec.describe 'Groups > Members > Manage groups', :js, feature_category: :subgr click_groups_tab page.within(first_row) do - click_button('Developer') - click_button('Maintainer') + select_from_listbox('Maintainer', from: 'Developer') wait_for_requests diff --git a/spec/features/groups/members/manage_members_spec.rb b/spec/features/groups/members/manage_members_spec.rb index 2d5a3dbb8f8..138031ffaac 100644 --- a/spec/features/groups/members/manage_members_spec.rb +++ b/spec/features/groups/members/manage_members_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Manage members', feature_category: :subgroups do +RSpec.describe 'Groups > Members > Manage members', feature_category: :groups_and_projects do + include ListboxHelpers include Features::MembersHelpers include Features::InviteMembersModalHelpers include Spec::Support::Helpers::ModalHelpers @@ -35,8 +36,7 @@ RSpec.describe 'Groups > Members > Manage members', feature_category: :subgroups visit group_group_members_path(group) page.within(second_row) do - click_button('Developer') - click_button('Owner') + select_from_listbox('Owner', from: 'Developer') expect(page).to have_button('Owner') end diff --git a/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb index 4f56c807ec8..c2eedfb4063 100644 --- a/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb +++ b/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Owner adds member with expiration date', :js, feature_category: :subgroups do +RSpec.describe 'Groups > Members > Owner adds member with expiration date', :js, feature_category: :groups_and_projects do include Features::MembersHelpers include Features::InviteMembersModalHelpers diff --git a/spec/features/groups/members/master_manages_access_requests_spec.rb b/spec/features/groups/members/master_manages_access_requests_spec.rb index 951dc59feca..1b33a28d823 100644 --- a/spec/features/groups/members/master_manages_access_requests_spec.rb +++ b/spec/features/groups/members/master_manages_access_requests_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Maintainer manages access requests', feature_category: :subgroups do +RSpec.describe 'Groups > Members > Maintainer manages access requests', feature_category: :groups_and_projects do it_behaves_like 'Maintainer manages access requests' do let(:entity) { create(:group, :public) } let(:members_page_path) { group_group_members_path(entity) } diff --git a/spec/features/groups/members/request_access_spec.rb b/spec/features/groups/members/request_access_spec.rb index 35eb085a195..cd0c9bfe3eb 100644 --- a/spec/features/groups/members/request_access_spec.rb +++ b/spec/features/groups/members/request_access_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Request access', feature_category: :subgroups do +RSpec.describe 'Groups > Members > Request access', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:owner) { create(:user) } let(:group) { create(:group, :public) } diff --git a/spec/features/groups/members/search_members_spec.rb b/spec/features/groups/members/search_members_spec.rb index 80de1cabd1e..ed2e0cd7b09 100644 --- a/spec/features/groups/members/search_members_spec.rb +++ b/spec/features/groups/members/search_members_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Search group member', :js, feature_category: :subgroups do +RSpec.describe 'Search group member', :js, feature_category: :groups_and_projects do include Features::MembersHelpers let(:user) { create :user } diff --git a/spec/features/groups/members/sort_members_spec.rb b/spec/features/groups/members/sort_members_spec.rb index d2e5445deae..fd367b8e763 100644 --- a/spec/features/groups/members/sort_members_spec.rb +++ b/spec/features/groups/members/sort_members_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Sort members', :js, feature_category: :subgroups do +RSpec.describe 'Groups > Members > Sort members', :js, feature_category: :groups_and_projects do include Features::MembersHelpers let(:owner) { create(:user, name: 'John Doe', created_at: 5.days.ago, last_activity_on: Date.today) } diff --git a/spec/features/groups/members/tabs_spec.rb b/spec/features/groups/members/tabs_spec.rb index 2dc116842b3..cc97b367313 100644 --- a/spec/features/groups/members/tabs_spec.rb +++ b/spec/features/groups/members/tabs_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > Members > Tabs', :js, feature_category: :subgroups do +RSpec.describe 'Groups > Members > Tabs', :js, feature_category: :groups_and_projects do using RSpec::Parameterized::TableSyntax shared_examples 'active "Members" tab' do diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb index 376e1e6063f..0a697eaa798 100644 --- a/spec/features/groups/milestone_spec.rb +++ b/spec/features/groups/milestone_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group milestones', feature_category: :subgroups do +RSpec.describe 'Group milestones', feature_category: :groups_and_projects do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project_empty_repo, group: group) } let_it_be(:user) { create(:group_member, :maintainer, user: create(:user), group: group).user } diff --git a/spec/features/groups/milestones/milestone_showing_spec.rb b/spec/features/groups/milestones/milestone_showing_spec.rb new file mode 100644 index 00000000000..ca556cf159c --- /dev/null +++ b/spec/features/groups/milestones/milestone_showing_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Group milestone', :js, feature_category: :team_planning do + let_it_be(:group) { create(:group, owner: user) } + let_it_be(:user) { create(:group_member, :maintainer, user: create(:user), group: group).user } + + let(:milestone) { create(:milestone, group: group) } + + before do + sign_in(user) + end + + it_behaves_like 'milestone with interactive markdown task list items in description' do + let(:milestone_path) { group_milestone_path(group, milestone) } + end +end diff --git a/spec/features/groups/new_group_page_spec.rb b/spec/features/groups/new_group_page_spec.rb index 1efdc3fff07..c3731565ddf 100644 --- a/spec/features/groups/new_group_page_spec.rb +++ b/spec/features/groups/new_group_page_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'New group page', :js, feature_category: :subgroups do +RSpec.describe 'New group page', :js, feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:parent_group) { create(:group) } @@ -11,24 +11,6 @@ RSpec.describe 'New group page', :js, feature_category: :subgroups do sign_in(user) end - describe 'new top level group alert' do - context 'when a user visits the new group page' do - it 'shows the new top level group alert' do - visit new_group_path(anchor: 'create-group-pane') - - expect(page).to have_selector('[data-testid="new-top-level-alert"]') - end - end - - context 'when a user visits the new sub group page' do - it 'does not show the new top level group alert' do - visit new_group_path(parent_id: parent_group.id, anchor: 'create-group-pane') - - expect(page).not_to have_selector('[data-testid="new-top-level-alert"]') - end - end - end - describe 'sidebar' do context 'in the current navigation' do before do diff --git a/spec/features/groups/settings/group_badges_spec.rb b/spec/features/groups/settings/group_badges_spec.rb index 07c8451f8fb..4a4cb297fcf 100644 --- a/spec/features/groups/settings/group_badges_spec.rb +++ b/spec/features/groups/settings/group_badges_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group Badges', feature_category: :subgroups do +RSpec.describe 'Group Badges', feature_category: :groups_and_projects do include WaitForRequests let(:user) { create(:user) } diff --git a/spec/features/groups/settings/manage_applications_spec.rb b/spec/features/groups/settings/manage_applications_spec.rb index e7b87cda506..94adeaa14d2 100644 --- a/spec/features/groups/settings/manage_applications_spec.rb +++ b/spec/features/groups/settings/manage_applications_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User manages applications', feature_category: :subgroups do +RSpec.describe 'User manages applications', feature_category: :groups_and_projects do let_it_be(:group) { create(:group) } let_it_be(:user) { create(:user) } let_it_be(:new_application_path) { group_settings_applications_path(group) } diff --git a/spec/features/groups/settings/user_searches_in_settings_spec.rb b/spec/features/groups/settings/user_searches_in_settings_spec.rb index 374ac236e20..6e94042185d 100644 --- a/spec/features/groups/settings/user_searches_in_settings_spec.rb +++ b/spec/features/groups/settings/user_searches_in_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User searches group settings', :js, feature_category: :subgroups do +RSpec.describe 'User searches group settings', :js, feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } diff --git a/spec/features/groups/share_lock_spec.rb b/spec/features/groups/share_lock_spec.rb index 2f5a5e6ba16..34af5ee8b09 100644 --- a/spec/features/groups/share_lock_spec.rb +++ b/spec/features/groups/share_lock_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group share with group lock', feature_category: :subgroups do +RSpec.describe 'Group share with group lock', feature_category: :groups_and_projects do let(:root_owner) { create(:user) } let(:root_group) { create(:group) } diff --git a/spec/features/groups/show_spec.rb b/spec/features/groups/show_spec.rb index 0f936173e5d..8450322945c 100644 --- a/spec/features/groups/show_spec.rb +++ b/spec/features/groups/show_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group show page', feature_category: :subgroups do +RSpec.describe 'Group show page', feature_category: :groups_and_projects do include Features::InviteMembersModalHelpers let_it_be(:user) { create(:user) } diff --git a/spec/features/groups/user_browse_projects_group_page_spec.rb b/spec/features/groups/user_browse_projects_group_page_spec.rb index 38b879bb5b2..c3b8b81da68 100644 --- a/spec/features/groups/user_browse_projects_group_page_spec.rb +++ b/spec/features/groups/user_browse_projects_group_page_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User browse group projects page', feature_category: :subgroups do +RSpec.describe 'User browse group projects page', feature_category: :groups_and_projects do let(:user) { create :user } let(:group) { create :group } diff --git a/spec/features/groups/user_sees_package_sidebar_spec.rb b/spec/features/groups/user_sees_package_sidebar_spec.rb index 64422f5cca5..6a91dfb92bf 100644 --- a/spec/features/groups/user_sees_package_sidebar_spec.rb +++ b/spec/features/groups/user_sees_package_sidebar_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > sidebar', feature_category: :subgroups do +RSpec.describe 'Groups > sidebar', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:group) { create(:group) } diff --git a/spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb b/spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb index e5e30ed1a55..9a3232990ec 100644 --- a/spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb +++ b/spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Groups > User sees users dropdowns in issuables list', :js, feature_category: :subgroups do +RSpec.describe 'Groups > User sees users dropdowns in issuables list', :js, feature_category: :groups_and_projects do include FilteredSearchHelpers let(:group) { create(:group) } diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb index 088b5b11a9a..de4b9964b98 100644 --- a/spec/features/groups_spec.rb +++ b/spec/features/groups_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group', feature_category: :subgroups do +RSpec.describe 'Group', feature_category: :groups_and_projects do let(:user) { create(:user) } before do diff --git a/spec/features/ics/group_issues_spec.rb b/spec/features/ics/group_issues_spec.rb index 70ec156a7b0..164f5df7cc5 100644 --- a/spec/features/ics/group_issues_spec.rb +++ b/spec/features/ics/group_issues_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Group Issues Calendar Feed', feature_category: :subgroups do +RSpec.describe 'Group Issues Calendar Feed', feature_category: :groups_and_projects do describe 'GET /issues' do let!(:user) do user = create(:user, email: 'private1@example.com') diff --git a/spec/features/ics/project_issues_spec.rb b/spec/features/ics/project_issues_spec.rb index 4bbd966d72a..daad6f1df2f 100644 --- a/spec/features/ics/project_issues_spec.rb +++ b/spec/features/ics/project_issues_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Issues Calendar Feed', feature_category: :projects do +RSpec.describe 'Project Issues Calendar Feed', feature_category: :groups_and_projects do describe 'GET /issues' do let!(:user) do user = create(:user, email: 'private1@example.com') diff --git a/spec/features/incidents/user_views_incident_spec.rb b/spec/features/incidents/user_views_incident_spec.rb index 0265960fce7..8739c99bdd0 100644 --- a/spec/features/incidents/user_views_incident_spec.rb +++ b/spec/features/incidents/user_views_incident_spec.rb @@ -18,6 +18,7 @@ RSpec.describe "User views incident", feature_category: :incident_management do before do sign_in(user) + stub_feature_flags(moved_mr_sidebar: false) visit(incident_project_issues_path(project, incident)) end diff --git a/spec/features/invites_spec.rb b/spec/features/invites_spec.rb index a3d4b30b59c..a1e75a94326 100644 --- a/spec/features/invites_spec.rb +++ b/spec/features/invites_spec.rb @@ -195,7 +195,8 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate context 'when the user sign-up using a different email address' do let(:invite_email) { build_stubbed(:user).email } - it 'signs up and redirects to the activity page' do + it 'signs up and redirects to the activity page', + quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/414971' do fill_in_sign_up_form(new_user) fill_in_welcome_form 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 c982052fc0e..7f6a044a575 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 @@ -20,7 +20,6 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j before do stub_feature_flags(moved_mr_sidebar: false) - stub_feature_flags(hide_create_issue_resolve_all: false) end describe 'as a user with access to the project' do @@ -45,7 +44,6 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j it 'hides the link for creating a new issue' do expect(page).not_to have_selector resolve_all_discussions_link_selector - expect(page).not_to have_content "Resolve all with new issue" end end @@ -67,6 +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 end it 'does not show a link to create a new issue' do @@ -82,22 +81,6 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j it 'shows a warning that the merge request contains unresolved threads' do expect(page).to have_content 'all threads must be resolved' end - - it 'has a link to resolve all threads by creating an issue' 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) - end - - context 'creating an issue for threads' do - before do - page.within '.mr-state-widget' do - page.click_link 'Resolve all with new issue', href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid) - - wait_for_all_requests - end - end - - it_behaves_like 'creating an issue for a thread' - end end end end diff --git a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb index a89c36a2b78..57270e8f7c7 100644 --- a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb @@ -110,8 +110,8 @@ RSpec.describe 'Dropdown assignee', :js, feature_category: :team_planning do expect(page).to have_text group_user.name expect(page).to have_text subgroup_user.name expect(page).to have_text invited_to_project_group_user.name + expect(page).to have_text invited_to_group_group_user.name expect(page).not_to have_text subsubgroup_user.name - expect(page).not_to have_text invited_to_group_group_user.name end end end diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb index ee71181fba2..4cf558b04cc 100644 --- a/spec/features/issues/issue_sidebar_spec.rb +++ b/spec/features/issues/issue_sidebar_spec.rb @@ -162,7 +162,7 @@ RSpec.describe 'Issue Sidebar', feature_category: :team_planning do open_assignees_dropdown page.within '.dropdown-menu-user' do - find('.js-dropdown-input-field').find('input').set(user2.name) + find('[data-testid="user-search-input"]').set(user2.name) wait_for_requests @@ -182,7 +182,7 @@ RSpec.describe 'Issue Sidebar', feature_category: :team_planning do it 'keeps your filtered term after filtering and dismissing the dropdown' do open_assignees_dropdown - find('.js-dropdown-input-field').find('input').set(user2.name) + find('[data-testid="user-search-input"]').set(user2.name) wait_for_requests page.within '.dropdown-menu-user' do @@ -199,7 +199,7 @@ RSpec.describe 'Issue Sidebar', feature_category: :team_planning do expect(page.all('[data-testid="selected-participant"]').length).to eq(1) end - expect(find('.js-dropdown-input-field').find('input').value).to eq(user2.name) + expect(find('[data-testid="user-search-input"]').value).to eq(user2.name) end end end diff --git a/spec/features/issues/user_bulk_edits_issues_spec.rb b/spec/features/issues/user_bulk_edits_issues_spec.rb index 3e119d86c05..4c93a8e1c7a 100644 --- a/spec/features/issues/user_bulk_edits_issues_spec.rb +++ b/spec/features/issues/user_bulk_edits_issues_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe 'Multiple issue updating from issues#index', :js, feature_category: :team_planning do + include ListboxHelpers + let!(:project) { create(:project) } let!(:issue) { create(:issue, project: project) } let!(:user) { create(:user) } @@ -18,8 +20,7 @@ RSpec.describe 'Multiple issue updating from issues#index', :js, feature_categor click_button 'Bulk edit' check 'Select all' - click_button 'Select status' - click_button 'Closed' + select_from_listbox('Closed', from: 'Select status') click_update_issues_button expect(page).to have_selector('.issue', count: 0) @@ -31,8 +32,7 @@ RSpec.describe 'Multiple issue updating from issues#index', :js, feature_categor click_button 'Bulk edit' check 'Select all' - click_button 'Select status' - click_button 'Open' + select_from_listbox('Open', from: 'Select status') click_update_issues_button expect(page).to have_selector('.issue', count: 0) 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 6d9eb3a7191..1050bc2456f 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 @@ -31,7 +31,7 @@ RSpec.describe 'User creates branch and merge request on issue page', :js, featu end # In order to improve tests performance, all UI checks are placed in this test. - it 'shows elements', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/27993' do + it 'shows elements' do button_create_merge_request = find('.js-create-merge-request') button_toggle_dropdown = find('.create-mr-dropdown-wrap .dropdown-toggle') diff --git a/spec/features/issues/user_sorts_issue_comments_spec.rb b/spec/features/issues/user_sorts_issue_comments_spec.rb index 153066343f2..8ca9d2003ee 100644 --- a/spec/features/issues/user_sorts_issue_comments_spec.rb +++ b/spec/features/issues/user_sorts_issue_comments_spec.rb @@ -17,7 +17,6 @@ RSpec.describe 'Comment sort direction', feature_category: :team_planning do # open dropdown, and select 'Newest first' page.within('.issuable-details') do click_button('Sort or filter') - click_button('Oldest first') click_button('Newest first') end diff --git a/spec/features/markdown/markdown_spec.rb b/spec/features/markdown/markdown_spec.rb index a31ad5a868e..eb86393d59e 100644 --- a/spec/features/markdown/markdown_spec.rb +++ b/spec/features/markdown/markdown_spec.rb @@ -59,7 +59,7 @@ RSpec.describe 'GitLab Markdown', :aggregate_failures, feature_category: :team_p aggregate_failures 'allows Markdown in tables' do expect(doc.at_css('td:contains("Baz")').children.to_html) - .to eq '<strong>Baz</strong>' + .to eq_no_sourcepos '<strong>Baz</strong>' end aggregate_failures 'parses fenced code blocks' do @@ -167,13 +167,13 @@ RSpec.describe 'GitLab Markdown', :aggregate_failures, feature_category: :team_p it 'allows markup inside link elements' do aggregate_failures do expect(doc.at_css('a[href="#link-emphasis"]').to_html) - .to eq %{<a href="#link-emphasis"><em>text</em></a>} + .to eq_no_sourcepos %{<a href="#link-emphasis"><em>text</em></a>} expect(doc.at_css('a[href="#link-strong"]').to_html) - .to eq %{<a href="#link-strong"><strong>text</strong></a>} + .to eq_no_sourcepos %{<a href="#link-strong"><strong>text</strong></a>} expect(doc.at_css('a[href="#link-code"]').to_html) - .to eq %{<a href="#link-code"><code>text</code></a>} + .to eq_no_sourcepos %{<a href="#link-code"><code>text</code></a>} end end end @@ -221,11 +221,25 @@ RSpec.describe 'GitLab Markdown', :aggregate_failures, feature_category: :team_p context 'default pipeline' do before do + stub_feature_flags(disable_all_mention: false) + @html = markdown(@feat.raw_markdown) end it_behaves_like 'all pipelines' + context 'when `disable_all_mention` FF is enabled' do + before do + stub_feature_flags(disable_all_mention: true) + + @html = markdown(@feat.raw_markdown) + end + + it 'includes custom filters' do + expect(doc).to reference_users_excluding_all + end + end + it 'includes custom filters' do aggregate_failures 'UploadLinkFilter' do expect(doc).to parse_upload_links @@ -308,6 +322,8 @@ RSpec.describe 'GitLab Markdown', :aggregate_failures, feature_category: :team_p context 'wiki pipeline' do before do + stub_feature_flags(disable_all_mention: false) + @wiki = @feat.wiki @wiki_page = @feat.wiki_page @@ -320,6 +336,27 @@ RSpec.describe 'GitLab Markdown', :aggregate_failures, feature_category: :team_p @html = markdown(@feat.raw_markdown, { pipeline: :wiki, wiki: @wiki, page_slug: @wiki_page.slug }) end + context 'when `disable_all_mention` FF is enabled' do + before do + stub_feature_flags(disable_all_mention: true) + + @wiki = @feat.wiki + @wiki_page = @feat.wiki_page + + name = 'example.jpg' + path = "images/#{name}" + blob = double(name: name, path: path, mime_type: 'image/jpeg', data: nil) + expect(@wiki).to receive(:find_file).with(path, load_content: false).and_return(Gitlab::Git::WikiFile.new(blob)) + allow(@wiki).to receive(:wiki_base_path) { '/namespace1/gitlabhq/wikis' } + + @html = markdown(@feat.raw_markdown, { pipeline: :wiki, wiki: @wiki, page_slug: @wiki_page.slug }) + end + + it 'includes custom filters' do + expect(doc).to reference_users_excluding_all + end + end + it_behaves_like 'all pipelines' it 'includes custom filters' do diff --git a/spec/features/markdown/metrics_spec.rb b/spec/features/markdown/metrics_spec.rb deleted file mode 100644 index 1b68f78e993..00000000000 --- a/spec/features/markdown/metrics_spec.rb +++ /dev/null @@ -1,244 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Metrics rendering', :js, :kubeclient, :use_clean_rails_memory_store_caching, :sidekiq_inline, feature_category: :metrics do - include PrometheusHelpers - include KubernetesHelpers - include GrafanaApiHelpers - include MetricsDashboardUrlHelpers - - let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project, :with_prometheus_integration) } - let_it_be(:environment) { create(:environment, project: project) } - - let(:issue) { create(:issue, project: project, description: description) } - let(:description) { "See [metrics dashboard](#{metrics_url}) for info." } - let(:metrics_url) { urls.metrics_project_environment_url(project, environment) } - - before do - stub_feature_flags(remove_monitor_metrics: false) - clear_host_from_memoized_variables - stub_gitlab_domain - - project.add_developer(user) - sign_in(user) - end - - after do - clear_host_from_memoized_variables - end - - shared_examples_for 'metrics dashboard unavailable' do - context 'when metrics dashboard feature is unavailable' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'shows no embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).to have_no_css('div.prometheus-graph') - end - end - end - - context 'internal metrics embeds' do - before do - import_common_metrics - stub_any_prometheus_request_with_response - - allow(Prometheus::ProxyService).to receive(:new).and_call_original - end - - include_examples 'metrics dashboard unavailable' - - it 'shows embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text('Memory Usage (Total)') - expect(page).to have_text('Core Usage (Total)') - - # Ensure that the FE is calling the BE with expected params - expect(Prometheus::ProxyService) - .to have_received(:new) - .with(environment, 'GET', 'query_range', hash_including('start', 'end', 'step')) - .at_least(:once) - end - - context 'with remove_monitor_metrics flag enabled' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'does not show embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).not_to have_css('div.prometheus-graph') - expect(page).not_to have_text('Memory Usage (Total)') - expect(page).not_to have_text('Core Usage (Total)') - end - end - - context 'when dashboard params are in included the url' do - let(:metrics_url) { urls.metrics_project_environment_url(project, environment, **chart_params) } - - let(:chart_params) do - { - group: 'System metrics (Kubernetes)', - title: 'Memory Usage (Pod average)', - y_label: 'Memory Used per Pod (MB)' - } - end - - it 'shows embedded metrics for the specific chart' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text(chart_params[:title]) - expect(page).to have_text(chart_params[:y_label]) - - # Ensure that the FE is calling the BE with expected params - expect(Prometheus::ProxyService) - .to have_received(:new) - .with(environment, 'GET', 'query_range', hash_including('start', 'end', 'step')) - .at_least(:once) - end - - context 'when two dashboard urls are included' do - let(:chart_params_2) do - { - group: 'System metrics (Kubernetes)', - title: 'Core Usage (Total)', - y_label: 'Total Cores' - } - end - - let(:metrics_url_2) { urls.metrics_project_environment_url(project, environment, **chart_params_2) } - let(:description) { "See [metrics dashboard](#{metrics_url}) for info. \n See [metrics dashboard](#{metrics_url_2}) for info." } - let(:issue) { create(:issue, project: project, description: description) } - - it 'shows embedded metrics for both urls' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text(chart_params[:title]) - expect(page).to have_text(chart_params[:y_label]) - expect(page).to have_text(chart_params_2[:title]) - expect(page).to have_text(chart_params_2[:y_label]) - - # Ensure that the FE is calling the BE with expected params - expect(Prometheus::ProxyService) - .to have_received(:new) - .with(environment, 'GET', 'query_range', hash_including('start', 'end', 'step')) - .at_least(:once) - end - end - end - end - - context 'grafana metrics embeds' do - let(:grafana_integration) { create(:grafana_integration, project: project) } - let(:grafana_base_url) { grafana_integration.grafana_url } - let(:metrics_url) { valid_grafana_dashboard_link(grafana_base_url) } - - before do - stub_dashboard_request(grafana_base_url) - stub_datasource_request(grafana_base_url) - stub_all_grafana_proxy_requests(grafana_base_url) - - allow(Grafana::ProxyService).to receive(:new).and_call_original - end - - include_examples 'metrics dashboard unavailable' - - it 'shows embedded metrics', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/402973' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text('Expired / Evicted') - expect(page).to have_text('expired - test-attribute-value') - - # Ensure that the FE is calling the BE with expected params - expect(Grafana::ProxyService) - .to have_received(:new) - .with(project, anything, anything, hash_including('query', 'start', 'end', 'step')) - .at_least(:once) - end - end - - context 'transient metrics embeds' do - let(:metrics_url) { urls.metrics_dashboard_project_environment_url(project, environment, embed_json: embed_json) } - let(:title) { 'Important Metrics' } - let(:embed_json) do - { - panel_groups: [{ - panels: [{ - type: 'area-chart', - title: title, - y_label: 'metric', - metrics: [{ - query_range: 'metric * 0.5 < 1' - }] - }] - }] - }.to_json - end - - before do - stub_any_prometheus_request_with_response - end - - include_examples 'metrics dashboard unavailable' - - it 'shows embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text(title) - end - end - - context 'for GitLab embedded cluster health metrics' do - before do - project.add_maintainer(user) - import_common_metrics - stub_any_prometheus_request_with_response - - allow(Prometheus::ProxyService).to receive(:new).and_call_original - - create(:clusters_integrations_prometheus, cluster: cluster) - stub_kubeclient_discover(cluster.platform.api_url) - stub_prometheus_request(/prometheus-prometheus-server/, body: prometheus_values_body) - stub_prometheus_request(%r{prometheus/api/v1}, body: prometheus_values_body) - end - - let_it_be(:cluster) { create(:cluster, :provided_by_gcp, :project, projects: [project], user: user) } - - let(:params) { [project.namespace.path, project.path, cluster.id] } - let(:query_params) { { group: 'Cluster Health', title: 'CPU Usage', y_label: 'CPU (cores)' } } - let(:metrics_url) { urls.namespace_project_cluster_url(*params, **query_params) } - let(:description) { "# Summary \n[](#{metrics_url})" } - - include_examples 'metrics dashboard unavailable' - - it 'shows embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text(query_params[:title]) - expect(page).to have_text(query_params[:y_label]) - expect(page).not_to have_text(metrics_url) - - expect(Prometheus::ProxyService) - .to have_received(:new) - .with(cluster, 'GET', 'query_range', hash_including('start', 'end', 'step')) - .at_least(:once) - end - end - - def import_common_metrics - ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute - end -end diff --git a/spec/features/merge_request/close_reopen_report_toggle_spec.rb b/spec/features/merge_request/close_reopen_report_toggle_spec.rb index 9b8e50a31e3..07d9ddde910 100644 --- a/spec/features/merge_request/close_reopen_report_toggle_spec.rb +++ b/spec/features/merge_request/close_reopen_report_toggle_spec.rb @@ -15,6 +15,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r before do project.add_maintainer(user) login_as user + stub_feature_flags(moved_mr_sidebar: false) end context 'when user has permission to update', :js do @@ -24,15 +25,16 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r context 'close/reopen/report toggle' do it 'opens a dropdown when toggle is clicked' do - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click - expect(container).to have_link("Close merge request") - expect(container).to have_button('Report abuse to administrator') + expect(container).to have_button("Close merge request") + expect(container).to have_button('Report abuse') end it 'links to Report Abuse' do - find('[data-testid="merge-request-actions"]').click - click_button 'Report abuse to administrator' + find('#new-actions-header-dropdown button').click + + click_button 'Report abuse' expect(page).to have_content('Report abuse to administrator') end @@ -42,13 +44,13 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r let(:issuable) { create(:merge_request, :opened, source_project: project) } it 'shows the `Edit` and `Mark as draft` buttons' do - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click expect(container).to have_link('Edit') - expect(container).to have_link('Mark as draft') - expect(container).to have_link('Close merge request') - expect(container).to have_button('Report abuse to administrator') - expect(container).not_to have_link('Reopen merge request') + expect(container).to have_button('Mark as draft') + expect(container).to have_button('Close merge request') + expect(container).to have_button('Report abuse') + expect(container).not_to have_button('Reopen merge request') end end @@ -56,24 +58,24 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r let(:issuable) { create(:merge_request, :closed, source_project: project) } it 'shows both the `Edit` and `Reopen` button' do - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click expect(container).to have_link('Edit') - expect(container).to have_button('Report abuse to administrator') - expect(container).to have_link('Reopen merge request') - expect(container).not_to have_link('Close merge request') + expect(container).to have_button('Report abuse') + expect(container).to have_button('Reopen merge request') + expect(container).not_to have_button('Close merge request') end context 'when the merge request author is the current user' do let(:issuable) { create(:merge_request, :closed, source_project: project, author: user) } it 'shows both the `Edit` and `Reopen` button' do - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click expect(container).to have_link('Edit') - expect(container).to have_link('Reopen merge request') - expect(container).not_to have_link('Close merge request') - expect(container).not_to have_button('Report abuse to administrator') + expect(container).to have_button('Reopen merge request') + expect(container).not_to have_button('Close merge request') + expect(container).not_to have_button('Report abuse') end end end @@ -83,7 +85,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r it 'shows only the `Edit` button' do expect(container).to have_link(exact_text: 'Edit') - expect(container).not_to have_button('Report abuse to administrator') + expect(container).not_to have_button('Report abuse') expect(container).not_to have_button('Close merge request') expect(container).not_to have_button('Reopen merge request') end @@ -93,7 +95,7 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r it 'shows only the `Edit` button' do expect(container).to have_link(exact_text: 'Edit') - expect(container).not_to have_button('Report abuse to administrator') + expect(container).not_to have_button('Report abuse') expect(container).not_to have_button('Close merge request') expect(container).not_to have_button('Reopen merge request') end @@ -112,9 +114,9 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle', feature_category: :code_r end it 'only shows a `Report abuse` button' do - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click - expect(container).to have_button('Report abuse to administrator') + expect(container).to have_button('Report abuse') expect(container).not_to have_button('Close merge request') expect(container).not_to have_button('Reopen merge request') expect(container).not_to have_link(exact_text: 'Edit') diff --git a/spec/features/merge_request/merge_request_discussion_lock_spec.rb b/spec/features/merge_request/merge_request_discussion_lock_spec.rb index 11ec2a86b43..782c4af58ac 100644 --- a/spec/features/merge_request/merge_request_discussion_lock_spec.rb +++ b/spec/features/merge_request/merge_request_discussion_lock_spec.rb @@ -90,7 +90,7 @@ RSpec.describe 'Merge Request Discussion Lock', :js, feature_category: :code_rev end it 'the user can lock the merge_request' do - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click expect(page).to have_content('Lock merge request') end @@ -103,7 +103,7 @@ RSpec.describe 'Merge Request Discussion Lock', :js, feature_category: :code_rev end it 'the user can unlock the merge_request' do - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click expect(page).to have_content('Unlock merge request') end diff --git a/spec/features/merge_request/user_comments_on_merge_request_spec.rb b/spec/features/merge_request/user_comments_on_merge_request_spec.rb index e113e305af5..3aa2ce2a154 100644 --- a/spec/features/merge_request/user_comments_on_merge_request_spec.rb +++ b/spec/features/merge_request/user_comments_on_merge_request_spec.rb @@ -6,12 +6,15 @@ RSpec.describe 'User comments on a merge request', :js, feature_category: :code_ include RepoHelpers let(:project) { create(:project, :repository) } + let(:diagramsnet_url) { 'https://embed.diagrams.net' } let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } let(:user) { create(:user) } before do project.add_maintainer(user) sign_in(user) + allow(Gitlab::CurrentSettings).to receive(:diagramsnet_enabled).and_return(true) + allow(Gitlab::CurrentSettings).to receive(:diagramsnet_url).and_return(diagramsnet_url) visit(merge_request_path(merge_request)) end diff --git a/spec/features/merge_request/user_comments_on_whitespace_hidden_diff_spec.rb b/spec/features/merge_request/user_comments_on_whitespace_hidden_diff_spec.rb new file mode 100644 index 00000000000..c13fe8d1e45 --- /dev/null +++ b/spec/features/merge_request/user_comments_on_whitespace_hidden_diff_spec.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'User comments on a diff with whitespace changes', :js, feature_category: :code_review_workflow do + include MergeRequestDiffHelpers + + let_it_be(:project) { create(:project, :repository) } + let(:merge_request) do + create(:merge_request_with_diffs, source_project: project, target_project: project, + source_branch: 'changes-with-whitespace') + end + + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(diffs_project_merge_request_path(project, merge_request, view: 'parallel')) + end + + context 'when hiding whitespace changes' do + before do + find('.js-show-diff-settings').click + find('[data-testid="show-whitespace"]').click + wait_for_requests + end + + context 'when commenting on line combinations that are not present in the real diff' do + before do + # Comment on line combination old: 19, new 20 + # This line combination does not exist when whitespace is shown + click_diff_line( + find_by_scrolling('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="19"]').find(:xpath, + '../..'), 'left') + page.within('.js-discussion-note-form') do + fill_in(:note_note, with: 'Comment on diff with whitespace') + click_button('Add comment now') + end + + wait_for_requests + end + + it 'shows the comments in the diff' do + page.within('.notes_holder') do + expect(page).to have_content('Comment on diff with whitespace') + end + end + + it 'allows replies to comments in the diff' do + click_button('Reply to comment') + fill_in(:note_note, with: 'reply to whitespace comment') + click_button('Add comment now') + wait_for_requests + page.within('.notes_holder') do + expect(page).to have_content('reply to whitespace comment') + end + end + end + end +end diff --git a/spec/features/merge_request/user_creates_discussion_on_diff_file_spec.rb b/spec/features/merge_request/user_creates_discussion_on_diff_file_spec.rb new file mode 100644 index 00000000000..bb41ea6f6ed --- /dev/null +++ b/spec/features/merge_request/user_creates_discussion_on_diff_file_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'User creates discussion on diff file', :js, feature_category: :code_review_workflow do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :public, :repository) } + let_it_be(:merge_request) do + create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test') + end + + before do + project.add_maintainer(user) + sign_in(user) + + visit(diffs_project_merge_request_path(project, merge_request)) + end + + it 'creates discussion on diff file' do + first('.diff-file [data-testid="comment-files-button"]').click + + send_keys "Test comment" + + click_button "Add comment now" + + expect(first('.diff-file')).to have_selector('.note-text', text: 'Test comment') + end +end diff --git a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb index faef4f6f517..fa713bdbc5d 100644 --- a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb +++ b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb @@ -5,7 +5,17 @@ require 'spec_helper' RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_category: :code_review_workflow do include Features::InviteMembersModalHelpers - let(:project) { create(:project, :public, :repository) } + let(:owner) { create(:user) } + let(:shared_into_ancestor_user) { create(:user) } + let(:invited_group) { create(:group) { |group| group.add_maintainer(shared_into_ancestor_user) } } + let(:parent_group) do + create(:group) { |group| create(:group_group_link, shared_group: group, shared_with_group: invited_group) } + end + + let(:project) do + create(:project, :public, :repository, group: parent_group) { |project| project.add_owner(owner) } + end + let(:protected_branch) { create(:protected_branch, :maintainers_can_push, name: 'master', project: project) } let(:merge_request) { create(:merge_request, :simple, source_project: project, target_branch: protected_branch.name) } @@ -38,7 +48,7 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate before do stub_const('Autocomplete::UsersFinder::LIMIT', users_find_limit) - sign_in(project.first_owner) + sign_in(owner) merge_request.assignees << assignee @@ -82,6 +92,24 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate end end + context 'with members shared into ancestors of the project' do + before do + sign_in(owner) + + visit project_merge_request_path(project, merge_request) + wait_for_requests + + sidebar_assignee_block.click_link('Edit') + wait_for_requests + end + + it 'contains the members shared into ancestors of the projects' do + page.within '.dropdown-menu-user' do + expect(page).to have_content shared_into_ancestor_user.name + end + end + end + context 'with invite members considerations' do let_it_be(:user) { create(:user) } @@ -103,7 +131,7 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate before do stub_const('Autocomplete::UsersFinder::LIMIT', users_find_limit) - sign_in(project.first_owner) + sign_in(owner) merge_request.assignees << assignee @@ -145,6 +173,23 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate end end + context 'with members shared into ancestors of the project' do + before do + sign_in(owner) + + visit project_merge_request_path(project, merge_request) + wait_for_requests + + open_assignees_dropdown + end + + it 'contains the members shared into ancestors of the projects' do + page.within '.dropdown-menu-user' do + expect(page).to have_content shared_into_ancestor_user.name + end + end + end + context 'with invite members considerations' do let_it_be(:user) { create(:user) } diff --git a/spec/features/merge_request/user_manages_subscription_spec.rb b/spec/features/merge_request/user_manages_subscription_spec.rb index 3bcc8255ab7..84387965989 100644 --- a/spec/features/merge_request/user_manages_subscription_spec.rb +++ b/spec/features/merge_request/user_manages_subscription_spec.rb @@ -45,15 +45,15 @@ RSpec.describe 'User manages subscription', :js, feature_category: :code_review_ it 'toggles subscription' do wait_for_requests - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click expect(page).to have_selector('.gl-toggle:not(.is-checked)') - find('[data-testid="notifications-toggle"] .gl-toggle').click + find('[data-testid="notification-toggle"] .gl-toggle').click wait_for_requests expect(page).to have_selector('.gl-toggle.is-checked') - find('[data-testid="notifications-toggle"] .gl-toggle').click + find('[data-testid="notification-toggle"] .gl-toggle').click wait_for_requests diff --git a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb index 8cbc2b975e4..70962890bc5 100644 --- a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb +++ b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb @@ -16,15 +16,15 @@ RSpec.describe 'Merge request > User marks merge request as draft', :js, feature end it 'toggles draft status' do - find('[data-testid="merge-request-actions"]').click - click_link 'Mark as draft' + find('#new-actions-header-dropdown button').click + click_button 'Mark as draft' expect(page).to have_content("Draft: #{merge_request.title}") - find('[data-testid="merge-request-actions"]').click + find('#new-actions-header-dropdown button').click page.within('.detail-page-header-actions') do - click_link 'Mark as ready' + click_button 'Mark as ready' end expect(page).to have_content(merge_request.title) 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 5c00da1f569..e42e4735ee2 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 @@ -111,7 +111,7 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur describe 'enabling Merge when pipeline succeeds' do shared_examples 'Set to auto-merge activator' do - it 'activates the Merge when pipeline succeeds feature' do + it 'activates the Merge when pipeline succeeds feature', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/410055' do click_button "Set to auto-merge" expect(page).to have_content "Set by #{user.name} to be merged automatically when the pipeline succeeds" @@ -182,7 +182,7 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur visit project_merge_request_path(project, merge_request) end - it 'allows to cancel the automatic merge' do + 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" diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb index 03b01ef4b7a..a749821b083 100644 --- a/spec/features/merge_request/user_posts_notes_spec.rb +++ b/spec/features/merge_request/user_posts_notes_spec.rb @@ -87,7 +87,7 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_ it 'shows a reply button' do reply_button = find('.js-reply-button', match: :first) - expect(reply_button).to have_selector('[data-testid="comment-icon"]') + expect(reply_button).to have_selector('[data-testid="reply-icon"]') end it 'shows reply placeholder when clicking reply button' do 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 40ab06937ff..6dcebad300c 100644 --- a/spec/features/merge_request/user_sees_deployment_widget_spec.rb +++ b/spec/features/merge_request/user_sees_deployment_widget_spec.rb @@ -120,6 +120,7 @@ RSpec.describe 'Merge request > User sees deployment widget', :js, feature_categ end before do + stub_feature_flags(review_apps_redeploy_mr_widget: false) build.success! deployment.update!(on_stop: manual.name) visit project_merge_request_path(project, merge_request) @@ -142,5 +143,56 @@ RSpec.describe 'Merge request > User sees deployment widget', :js, feature_categ end end end + + 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) + end + + before do + stub_feature_flags(review_apps_redeploy_mr_widget: true) + build.success! + deployment.update!(on_stop: manual.name) + visit project_merge_request_path(project, merge_request) + wait_for_requests + end + + it 'displays the re-deploy button' do + accept_gl_confirm(button_text: 'Stop environment') do + find('.js-stop-env').click + end + + expect(page).to have_selector('.js-redeploy-action') + end + + context 'for reporter' do + let(:role) { :reporter } + + it 'does not show stop button' do + expect(page).not_to have_selector('.js-stop-env') + end + end + end + + context 'with redeploy action and with the review_apps_redeploy_mr_widget feature flag turned on' do + before do + stub_feature_flags(review_apps_redeploy_mr_widget: true) + build.success! + environment.update!(state: 'stopped') + visit project_merge_request_path(project, merge_request) + wait_for_requests + end + + it 'begins redeploying the deployment' do + accept_gl_confirm(button_text: 'Re-deploy') do + find('.js-redeploy-action').click + end + + wait_for_requests + + expect(page).to have_content('Will deploy to') + end + end 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 5f815bffb22..338e4329190 100644 --- a/spec/features/merge_request/user_sees_discussions_navigation_spec.rb +++ b/spec/features/merge_request/user_sees_discussions_navigation_spec.rb @@ -1,10 +1,7 @@ # frozen_string_literal: true require 'spec_helper' - -RSpec.describe 'Merge request > User sees discussions navigation', - :js, feature_category: :code_review_workflow, - quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/410678' do +RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_category: :code_review_workflow do let_it_be(:project) { create(:project, :public, :repository) } let_it_be(:user) { project.creator } let_it_be(:merge_request) { create(:merge_request, source_project: project) } @@ -44,7 +41,7 @@ RSpec.describe 'Merge request > User sees discussions navigation', shared_examples 'a page with a thread navigation' do context 'with active threads' do - it 'navigates to the first thread', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/410144' do + it 'navigates to the first thread' do goto_next_thread expect(page).to have_selector(first_discussion_selector, obscured: false) end @@ -54,13 +51,13 @@ RSpec.describe 'Merge request > User sees discussions navigation', expect(page).to have_selector(second_discussion_selector, obscured: false) end - it 'navigates through active threads', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/391912' do + it 'navigates through active threads' do goto_next_thread goto_next_thread expect(page).to have_selector(second_discussion_selector, obscured: false) end - it 'cycles back to the first thread', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/391604' do + it 'cycles back to the first thread' do goto_next_thread goto_next_thread goto_next_thread @@ -135,24 +132,18 @@ RSpec.describe 'Merge request > User sees discussions navigation', end describe 'Merge request discussions' do - shared_examples 'a page with no code discussions' do - let!(:first_discussion) do - create(:discussion_note_on_merge_request, - noteable: merge_request, - project: project - ).to_discussion - end + let_it_be(:first_discussion) do + create(:discussion_note_on_merge_request, noteable: merge_request, project: project).to_discussion + end - let!(:second_discussion) do - create(:discussion_note_on_merge_request, - noteable: merge_request, - project: project - ).to_discussion - end + let_it_be(:second_discussion) do + create(:discussion_note_on_merge_request, noteable: merge_request, project: project).to_discussion + end - let(:first_discussion_selector) { ".discussion[data-discussion-id='#{first_discussion.id}']" } - let(:second_discussion_selector) { ".discussion[data-discussion-id='#{second_discussion.id}']" } + let(:first_discussion_selector) { ".discussion[data-discussion-id='#{first_discussion.id}']" } + let(:second_discussion_selector) { ".discussion[data-discussion-id='#{second_discussion.id}']" } + shared_examples 'a page with no code discussions' do describe "Changes page discussions navigation" do it 'navigates to the first discussion on the Overview page' do goto_next_thread @@ -196,9 +187,13 @@ RSpec.describe 'Merge request > User sees discussions navigation', def goto_next_thread click_button 'Go to next unresolved thread', obscured: false + # Wait for scroll + sleep(1) end def goto_previous_thread click_button 'Go to previous unresolved thread', obscured: false + # Wait for scroll + sleep(1) end end diff --git a/spec/features/merge_request/user_sees_merge_request_file_tree_sidebar_spec.rb b/spec/features/merge_request/user_sees_merge_request_file_tree_sidebar_spec.rb new file mode 100644 index 00000000000..c385def6762 --- /dev/null +++ b/spec/features/merge_request/user_sees_merge_request_file_tree_sidebar_spec.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Merge request > User sees merge request file tree sidebar', :js, feature_category: :code_review_workflow do + include MergeRequestDiffHelpers + + let_it_be(:project) { create(:project, :public, :repository) } + let_it_be(:merge_request) { create(:merge_request, source_project: project) } + let(:user) { project.creator } + let(:sidebar) { find('.diff-tree-list') } + let(:sidebar_scroller) { sidebar.find('.vue-recycle-scroller') } + + before do + sign_in(user) + visit diffs_project_merge_request_path(project, merge_request) + wait_for_requests + scroll_into_view + end + + it 'sees file tree sidebar' do + expect(page).to have_selector('.file-row[role=button]') + end + + # TODO: fix this test + # For some reason the browser in CI doesn't update the file tree sidebar when review bar is shown + # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118378#note_1403906356 + # + # it 'has last entry visible with discussions enabled' do + # add_diff_line_draft_comment('foo', find('.line_holder', match: :first)) + # scroll_into_view + # scroll_to_end + # button = find_all('.file-row[role=button]').last + # expect(button.obscured?).to be_falsy + # end + + shared_examples 'shows last visible file in sidebar' do + it 'shows last file' do + scroll_to_end + button = find_all('.file-row[role=button]').last + title = button.find('[data-testid=file-row-name-container]')[:title] + button.click + expect(page).to have_selector(".file-title-name[title*=\"#{title}\"]") + end + end + + it_behaves_like 'shows last visible file in sidebar' + + context 'when viewing using file-by-file mode' do + let(:user) { create(:user, view_diffs_file_by_file: true) } + + it_behaves_like 'shows last visible file in sidebar' + end + + def scroll_into_view + sidebar.execute_script("this.scrollIntoView({ block: 'end' })") + end + + def scroll_to_end + sidebar_scroller.execute_script('this.scrollBy(0,99999)') + end +end 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 7d024103943..ca12e0e2b65 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 @@ -67,7 +67,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request', it 'sees branch pipelines and detached merge request pipelines in correct order' do page.within('.ci-table') do - expect(page).to have_selector('.ci-created', count: 2) + expect(page).to have_selector('[data-testid="ci-badge-created"]', count: 2) expect(first('[data-testid="pipeline-url-link"]')).to have_content("##{detached_merge_request_pipeline.id}") end end @@ -103,7 +103,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request', it 'sees branch pipelines and detached merge request pipelines in correct order' do page.within('.ci-table') do - expect(page).to have_selector('.ci-pending', count: 4) + expect(page).to have_selector('[data-testid="ci-badge-pending"]', count: 4) expect(all('[data-testid="pipeline-url-link"]')[0]) .to have_content("##{detached_merge_request_pipeline_2.id}") @@ -246,7 +246,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request', it 'sees a branch pipeline in pipeline tab' do page.within('.ci-table') do - expect(page).to have_selector('.ci-created', count: 1) + expect(page).to have_selector('[data-testid="ci-badge-created"]', count: 1) expect(first('[data-testid="pipeline-url-link"]')).to have_content("##{push_pipeline.id}") end end @@ -299,7 +299,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request', it 'sees branch pipelines and detached merge request pipelines in correct order' do page.within('.ci-table') do - expect(page).to have_selector('.ci-pending', count: 2) + expect(page).to have_selector('[data-testid="ci-badge-pending"]', count: 2) expect(first('[data-testid="pipeline-url-link"]')).to have_content("##{detached_merge_request_pipeline.id}") end end @@ -315,7 +315,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request', it 'sees pipeline list in forked project' do visit project_pipelines_path(forked_project) - expect(page).to have_selector('.ci-pending', count: 2) + expect(page).to have_selector('[data-testid="ci-badge-pending"]', count: 2) end context 'when a user updated a merge request from a forked project to the parent project' do @@ -341,7 +341,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request', it 'sees branch pipelines and detached merge request pipelines in correct order' do page.within('.ci-table') do - expect(page).to have_selector('.ci-pending', count: 4) + expect(page).to have_selector('[data-testid="ci-badge-pending"]', count: 4) expect(all('[data-testid="pipeline-url-link"]')[0]) .to have_content("##{detached_merge_request_pipeline_2.id}") @@ -384,7 +384,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request', it 'sees pipeline list in forked project' do visit project_pipelines_path(forked_project) - expect(page).to have_selector('.ci-pending', count: 4) + expect(page).to have_selector('[data-testid="ci-badge-pending"]', count: 4) end end diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb index f92ce3865a9..faa46ff4df1 100644 --- a/spec/features/merge_request/user_sees_pipelines_spec.rb +++ b/spec/features/merge_request/user_sees_pipelines_spec.rb @@ -41,8 +41,8 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co wait_for_requests - page.within('[data-testid="pipeline-table-row"]') do - expect(page).to have_selector('.ci-success') + page.within(find('[data-testid="pipeline-table-row"]', match: :first)) do + expect(page).to have_selector('[data-testid="ci-badge-passed"]') expect(page).to have_content(pipeline.id) expect(page).to have_content('API') expect(page).to have_css('[data-testid="pipeline-mini-graph"]') @@ -161,7 +161,7 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co create_merge_request_pipeline act_on_security_warning(action: 'Cancel') - check_no_pipelines + check_no_new_pipeline_created end end @@ -198,9 +198,9 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co def check_pipeline(expected_project:) page.within('.ci-table') do - expect(page).to have_selector('.commit', count: 2) + expect(page).to have_selector('[data-testid="pipeline-table-row"]', count: 4) - page.within(first('.commit')) do + page.within(first('[data-testid="pipeline-table-row"]')) do page.within('.pipeline-tags') do expect(page.find('[data-testid="pipeline-url-link"]')[:href]).to include(expected_project.full_path) expect(page).to have_content('merge request') @@ -227,9 +227,9 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co end end - def check_no_pipelines + def check_no_new_pipeline_created page.within('.ci-table') do - expect(page).to have_selector('.commit', count: 1) + expect(page).to have_selector('[data-testid="pipeline-table-row"]', count: 2) end end end diff --git a/spec/features/merge_requests/user_mass_updates_spec.rb b/spec/features/merge_requests/user_mass_updates_spec.rb index 45d57cf8374..2fa70b14957 100644 --- a/spec/features/merge_requests/user_mass_updates_spec.rb +++ b/spec/features/merge_requests/user_mass_updates_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe 'Merge requests > User mass updates', :js, feature_category: :code_review_workflow do + include ListboxHelpers + let(:project) { create(:project, :repository) } let(:user) { project.creator } let(:user2) { create(:user) } @@ -110,8 +112,7 @@ RSpec.describe 'Merge requests > User mass updates', :js, feature_category: :cod def change_status(text) click_button 'Bulk edit' check 'Select all' - click_button 'Select status' - click_button text + select_from_listbox(text, from: 'Select status') click_update_merge_requests_button end diff --git a/spec/features/monitor_sidebar_link_spec.rb b/spec/features/monitor_sidebar_link_spec.rb index 6a1413c04f6..6e464cb8752 100644 --- a/spec/features/monitor_sidebar_link_spec.rb +++ b/spec/features/monitor_sidebar_link_spec.rb @@ -11,7 +11,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures, feature_category before do project.add_role(user, role) if role sign_in(user) - stub_feature_flags(remove_monitor_metrics: false) end shared_examples 'shows Monitor menu based on the access level' do @@ -53,7 +52,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures, feature_category expect(page).to have_link('Incidents', href: project_incidents_path(project)) expect(page).to have_link('Environments', href: project_environments_path(project)) - expect(page).not_to have_link('Metrics', href: project_metrics_dashboard_path(project)) expect(page).not_to have_link('Alerts', href: project_alert_management_index_path(project)) expect(page).not_to have_link('Error Tracking', href: project_error_tracking_index_path(project)) expect(page).not_to have_link('Kubernetes', href: project_clusters_path(project)) @@ -85,7 +83,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures, feature_category expect(page).to have_link('Incidents', href: project_incidents_path(project)) expect(page).to have_link('Environments', href: project_environments_path(project)) - expect(page).not_to have_link('Metrics', href: project_metrics_dashboard_path(project)) expect(page).not_to have_link('Alerts', href: project_alert_management_index_path(project)) expect(page).not_to have_link('Error Tracking', href: project_error_tracking_index_path(project)) expect(page).not_to have_link('Kubernetes', href: project_clusters_path(project)) @@ -99,7 +96,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures, feature_category it 'has the correct `Monitor` menu items' do visit project_issues_path(project) - expect(page).to have_link('Metrics', href: project_metrics_dashboard_path(project)) expect(page).to have_link('Incidents', href: project_incidents_path(project)) expect(page).to have_link('Environments', href: project_environments_path(project)) expect(page).to have_link('Error Tracking', href: project_error_tracking_index_path(project)) @@ -116,7 +112,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures, feature_category it 'has the correct `Monitor` menu items' do visit project_issues_path(project) - expect(page).to have_link('Metrics', href: project_metrics_dashboard_path(project)) expect(page).to have_link('Alerts', href: project_alert_management_index_path(project)) expect(page).to have_link('Incidents', href: project_incidents_path(project)) expect(page).to have_link('Environments', href: project_environments_path(project)) @@ -132,7 +127,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures, feature_category it 'has the correct `Monitor` menu items' do visit project_issues_path(project) - expect(page).to have_link('Metrics', href: project_metrics_dashboard_path(project)) expect(page).to have_link('Alerts', href: project_alert_management_index_path(project)) expect(page).to have_link('Incidents', href: project_incidents_path(project)) expect(page).to have_link('Environments', href: project_environments_path(project)) diff --git a/spec/features/nav/new_nav_callout_spec.rb b/spec/features/nav/new_nav_callout_spec.rb new file mode 100644 index 00000000000..22e7fd6b9f9 --- /dev/null +++ b/spec/features/nav/new_nav_callout_spec.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'new navigation callout', :js, feature_category: :navigation do + let_it_be(:callout_title) { _('Welcome to a new navigation experience') } + let(:dot_com) { false } + + before do + allow(Gitlab).to receive(:com?).and_return(dot_com) + sign_in(user) + visit root_path + end + + context 'with new navigation toggled on' do + let_it_be(:user) { create(:user, created_at: Date.new(2023, 6, 1), use_new_navigation: true) } + + it 'shows a callout about the new navigation' do + expect(page).to have_content callout_title + end + + context 'when user dismisses callout' do + it 'hides callout' do + expect(page).to have_content callout_title + + page.within(find('[data-feature-id="new_navigation_callout"]')) do + find('[data-testid="close-icon"]').click + end + + wait_for_requests + + visit root_path + + expect(page).not_to have_content callout_title + end + end + end + + context 'when user registered on or after June 2nd 2023' do + let_it_be(:user) { create(:user, created_at: Date.new(2023, 6, 2), use_new_navigation: true) } + + context 'when on GitLab.com' do + let(:dot_com) { true } + + it 'does not show the callout about the new navigation' do + expect(page).not_to have_content callout_title + end + end + + context 'when on a self-managed instance' do + it 'shows the callout about the new navigation' do + expect(page).to have_content callout_title + end + end + end + + context 'with new navigation toggled off' do + let_it_be(:user) { create(:user, created_at: Date.new(2023, 6, 1), use_new_navigation: false) } + + it 'does not show the callout' do + expect(page).not_to have_content callout_title + end + end +end diff --git a/spec/features/nav/new_nav_toggle_spec.rb b/spec/features/nav/new_nav_toggle_spec.rb index 2cdaf12bb15..6872058be8e 100644 --- a/spec/features/nav/new_nav_toggle_spec.rb +++ b/spec/features/nav/new_nav_toggle_spec.rb @@ -7,75 +7,53 @@ RSpec.describe 'new navigation toggle', :js, feature_category: :navigation do before do user.update!(use_new_navigation: user_preference) - stub_feature_flags(super_sidebar_nav: new_nav_ff) sign_in(user) visit explore_projects_path end - context 'with feature flag off' do - let(:new_nav_ff) { false } + context 'when user has new nav disabled' do + let(:user_preference) { false } - where(:user_preference) do - [true, false] - end + it 'allows to enable new nav', :aggregate_failures do + within '.js-nav-user-dropdown' do + find('a[data-toggle="dropdown"]').click + expect(page).to have_content('Navigation redesign') - with_them do - it 'shows old topbar user dropdown with no way to toggle to new nav' do - within '.js-header-content .js-nav-user-dropdown' do - find('a[data-toggle="dropdown"]').click - expect(page).not_to have_content('Navigation redesign') - end + toggle = page.find('.gl-toggle:not(.is-checked)') + toggle.click # reloads the page end - end - end - - context 'with feature flag on' do - let(:new_nav_ff) { true } - context 'when user has new nav disabled' do - let(:user_preference) { false } + wait_for_requests - it 'allows to enable new nav', :aggregate_failures do - within '.js-nav-user-dropdown' do - find('a[data-toggle="dropdown"]').click - expect(page).to have_content('Navigation redesign') - - toggle = page.find('.gl-toggle:not(.is-checked)') - toggle.click # reloads the page - end - - wait_for_requests - - expect(user.reload.use_new_navigation).to eq true - end + expect(user.reload.use_new_navigation).to eq true + end - it 'shows the old navigation' do - expect(page).to have_selector('.js-navbar') - expect(page).not_to have_selector('[data-testid="super-sidebar"]') - end + it 'shows the old navigation' do + expect(page).to have_selector('.js-navbar') + expect(page).not_to have_selector('[data-testid="super-sidebar"]') end + end - context 'when user has new nav enabled' do - let(:user_preference) { true } + context 'when user has new nav enabled' do + let(:user_preference) { true } - it 'allows to disable new nav', :aggregate_failures do - within '[data-testid="super-sidebar"] [data-testid="user-dropdown"]' do - click_button "#{user.name} user’s menu" - expect(page).to have_content('Navigation redesign') + it 'allows to disable new nav', :aggregate_failures do + within '[data-testid="super-sidebar"] [data-testid="user-dropdown"]' do + click_button "#{user.name} user’s menu" + expect(page).to have_content('Navigation redesign') - toggle = page.find('.gl-toggle.is-checked') - toggle.click # reloads the page - end + toggle = page.find('.gl-toggle.is-checked') + toggle.click # reloads the page + end - wait_for_requests + wait_for_requests - expect(user.reload.use_new_navigation).to eq false - end + expect(user.reload.use_new_navigation).to eq false + end - it 'shows the new navigation' do - expect(page).not_to have_selector('.js-navbar') - expect(page).to have_selector('[data-testid="super-sidebar"]') - end + it 'shows the new navigation' do + expect(page).not_to have_selector('.js-navbar') + expect(page).to have_selector('[data-testid="super-sidebar"]') end end end diff --git a/spec/features/nav/pinned_nav_items_spec.rb b/spec/features/nav/pinned_nav_items_spec.rb index 308350d5166..cf53e0a322a 100644 --- a/spec/features/nav/pinned_nav_items_spec.rb +++ b/spec/features/nav/pinned_nav_items_spec.rb @@ -89,7 +89,7 @@ RSpec.describe 'Navigation menu item pinning', :js, feature_category: :navigatio before do within '#super-sidebar' do click_on 'Operate' - add_pin('Package Registry') + add_pin('Terraform states') add_pin('Terraform modules') wait_for_requests end @@ -97,8 +97,8 @@ RSpec.describe 'Navigation menu item pinning', :js, feature_category: :navigatio it 'can be unpinned from within the pinned section' do within '[data-testid="pinned-nav-items"]' do - remove_pin('Package Registry') - expect(page).not_to have_content 'Package Registry' + remove_pin('Terraform states') + expect(page).not_to have_content 'Terraform states' end end @@ -117,7 +117,7 @@ RSpec.describe 'Navigation menu item pinning', :js, feature_category: :navigatio it 'can be reordered' do within '[data-testid="pinned-nav-items"]' do pinned_items = page.find_all('a').map(&:text) - item2 = page.find('a', text: 'Package Registry') + item2 = page.find('a', text: 'Terraform states') item3 = page.find('a', text: 'Terraform modules') expect(pinned_items[1..2]).to eq [item2.text, item3.text] drag_item(item3, to: item2) diff --git a/spec/features/participants_autocomplete_spec.rb b/spec/features/participants_autocomplete_spec.rb index 272365ac7ee..084bf609a0d 100644 --- a/spec/features/participants_autocomplete_spec.rb +++ b/spec/features/participants_autocomplete_spec.rb @@ -2,12 +2,13 @@ require 'spec_helper' -RSpec.describe 'Member autocomplete', :js, feature_category: :team_planning do +RSpec.describe 'Member autocomplete', :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project, :public, :repository) } let_it_be(:user) { create(:user) } let_it_be(:author) { create(:user) } let(:note) { create(:note, noteable: noteable, project: noteable.project) } + let(:noteable) { create(:issue, author: author, project: project) } before do note # actually create the note @@ -29,9 +30,27 @@ RSpec.describe 'Member autocomplete', :js, feature_category: :team_planning do end end - context 'adding a new note on a Issue' do - let(:noteable) { create(:issue, author: author, project: project) } + context 'for a member of a private group invited to the project' do + let_it_be(:private_group) { create(:group, :private) } + let_it_be(:private_group_member) { create(:user, username: 'private-a') } + + before_all do + project.add_developer user + + private_group.add_developer private_group_member + create(:project_group_link, group: private_group, project: project) + end + + it 'suggests member of private group' do + visit project_issue_path(project, noteable) + fill_in 'Comment', with: '@priv' + + expect(find_autocomplete_menu).to have_text(private_group_member.username) + end + end + + context 'adding a new note on a Issue' do before do visit project_issue_path(project, noteable) end diff --git a/spec/features/profiles/password_spec.rb b/spec/features/profiles/password_spec.rb index c0c573d2f20..05e492e7021 100644 --- a/spec/features/profiles/password_spec.rb +++ b/spec/features/profiles/password_spec.rb @@ -86,10 +86,11 @@ RSpec.describe 'Profile > Password', feature_category: :user_profile do Rails.application.reload_routes! end - it 'renders 404' do + it 'renders 404', :js do visit edit_profile_password_path - expect(page).to have_gitlab_http_status(:not_found) + expect(page).to have_title('Not Found') + expect(page).to have_content('Page Not Found') end end end diff --git a/spec/features/profiles/two_factor_auths_spec.rb b/spec/features/profiles/two_factor_auths_spec.rb index e8ff8416722..b52f66cfcee 100644 --- a/spec/features/profiles/two_factor_auths_spec.rb +++ b/spec/features/profiles/two_factor_auths_spec.rb @@ -62,6 +62,40 @@ RSpec.describe 'Two factor auths', feature_category: :user_profile do expect(page).to have_link('Try the troubleshooting steps here.', href: help_page_path('user/profile/account/two_factor_authentication.md', anchor: 'troubleshooting')) end end + + context 'when two factor is enforced in global settings' do + before do + stub_application_setting(require_two_factor_authentication: true) + end + + context 'when invalid pin is provided' do + let_it_be(:user) { create(:omniauth_user) } + + it 'renders alert for global settings' do + visit profile_two_factor_auth_path + + fill_in 'pin_code', with: '123' + click_button 'Register with two-factor app' + + expect(page).to have_content('The global settings require you to enable Two-Factor Authentication for your account. You need to do this before ') + end + end + + context 'when invalid password is provided' do + let_it_be(:user) { create(:user) } + + it 'renders a error alert with a link to the troubleshooting section' do + visit profile_two_factor_auth_path + + register_2fa(user.current_otp, 'abc') + click_button 'Register with two-factor app' + + expect(page).to have_content( + 'The global settings require you to enable Two-Factor Authentication for your account' + ) + end + end + end end context 'when user has two-factor authentication enabled' do diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb index a6dcbc31dc4..de8719630ee 100644 --- a/spec/features/profiles/user_edit_profile_spec.rb +++ b/spec/features/profiles/user_edit_profile_spec.rb @@ -8,6 +8,7 @@ RSpec.describe 'User edit profile', feature_category: :user_profile do let_it_be(:user) { create(:user) } before do + stub_feature_flags(edit_user_profile_vue: false) sign_in(user) visit(profile_path) end @@ -529,13 +530,13 @@ RSpec.describe 'User edit profile', feature_category: :user_profile do end it 'allows the user to select a time zone from a dropdown list of options' do - expect(page.find('.user-time-preferences .dropdown')).not_to have_css('.show') + expect(page).not_to have_selector('.user-time-preferences [data-testid="base-dropdown-menu"]') - page.find('.user-time-preferences .dropdown').click + page.find('.user-time-preferences .gl-new-dropdown-toggle').click - expect(page.find('.user-time-preferences .dropdown')).to have_css('.show') + expect(page.find('.user-time-preferences [data-testid="base-dropdown-menu"]')).to be_visible - page.find("button", text: "Arizona").click + page.find("li", text: "Arizona").click expect(page).to have_field(:user_timezone, with: 'America/Phoenix', type: :hidden) end diff --git a/spec/features/profiles/user_search_settings_spec.rb b/spec/features/profiles/user_search_settings_spec.rb index 932ea11075a..96fe01cd0c2 100644 --- a/spec/features/profiles/user_search_settings_spec.rb +++ b/spec/features/profiles/user_search_settings_spec.rb @@ -7,6 +7,7 @@ RSpec.describe 'User searches their settings', :js, feature_category: :user_prof before do sign_in(user) + stub_feature_flags(edit_user_profile_vue: false) end context 'in profile page' do diff --git a/spec/features/profiles/user_visits_profile_spec.rb b/spec/features/profiles/user_visits_profile_spec.rb index ad265fbae9e..578025e1494 100644 --- a/spec/features/profiles/user_visits_profile_spec.rb +++ b/spec/features/profiles/user_visits_profile_spec.rb @@ -7,6 +7,7 @@ RSpec.describe 'User visits their profile', feature_category: :user_profile do before do stub_feature_flags(profile_tabs_vue: false) + stub_feature_flags(edit_user_profile_vue: false) sign_in(user) end diff --git a/spec/features/project_group_variables_spec.rb b/spec/features/project_group_variables_spec.rb index 966c05bb4cb..cc01de736cb 100644 --- a/spec/features/project_group_variables_spec.rb +++ b/spec/features/project_group_variables_spec.rb @@ -13,9 +13,22 @@ RSpec.describe 'Project group variables', :js, feature_category: :secrets_manage let(:key1) { 'test_key' } let(:key2) { 'test_key2' } let(:key3) { 'test_key3' } - let!(:ci_variable) { create(:ci_group_variable, group: group, key: key1) } - let!(:ci_variable2) { create(:ci_group_variable, group: subgroup, key: key2) } - let!(:ci_variable3) { create(:ci_group_variable, group: subgroup_nested, key: key3) } + let(:env1) { 'test_env' } + let(:env2) { 'test_env2' } + let(:env3) { 'test_env3' } + let(:attributes1) { 'Expanded' } + let(:attributes2) { 'Protected' } + let(:attributes3) { 'Masked' } + let!(:ci_variable) { create(:ci_group_variable, group: group, key: key1, environment_scope: env1) } + + let!(:ci_variable2) do + create(:ci_group_variable, group: subgroup, key: key2, environment_scope: env2, protected: true, raw: true) + end + + let!(:ci_variable3) do + create(:ci_group_variable, group: subgroup_nested, key: key3, environment_scope: env3, masked: true, raw: true) + end + let(:project_path) { project_settings_ci_cd_path(project) } let(:project2_path) { project_settings_ci_cd_path(project2) } let(:project3_path) { project_settings_ci_cd_path(project3) } @@ -26,39 +39,70 @@ RSpec.describe 'Project group variables', :js, feature_category: :secrets_manage group.add_owner(user) end - it 'project in group shows inherited vars from ancestor group' do - visit project_path - expect(page).to have_content(key1) - expect(page).to have_content(group.name) - end + shared_examples 'renders correct column headers' do + it "shows inherited CI variables table with correct columns" do + page.within('[data-testid="inherited-ci-variable-table"]') do + # Wait for vue app to load + wait_for_requests + + columns = find_all('[role=columnheader]') - it 'project in subgroup shows inherited vars from all ancestor groups' do - visit project2_path - expect(page).to have_content(key1) - expect(page).to have_content(key2) - expect(page).to have_content(group.name) - expect(page).to have_content(subgroup.name) + expect(columns[0].text).to eq('Key') + expect(columns[1].text).to eq('Attributes') + expect(columns[2].text).to eq('Environments') + expect(columns[3].text).to eq('Group') + end + end end - it 'project in nested subgroup shows inherited vars from all ancestor groups' do - visit project3_path - expect(page).to have_content(key1) - expect(page).to have_content(key2) - expect(page).to have_content(key3) - expect(page).to have_content(group.name) - expect(page).to have_content(subgroup.name) - expect(page).to have_content(subgroup_nested.name) + describe 'project in group' do + before do + visit project_path + end + + it_behaves_like 'renders correct column headers' + + it 'shows inherited variable info from ancestor group' do + expect(page).to have_content(key1) + expect(page).to have_content(attributes1) + expect(page).to have_content(group.name) + end end - it 'project origin keys link to ancestor groups ci_cd settings' do - visit project_path + describe 'project in subgroup' do + before do + visit project2_path + end + + it_behaves_like 'renders correct column headers' - find('.group-origin-link').click + it 'shows inherited variable info from all ancestor groups' do + expect(page).to have_content(key1) + expect(page).to have_content(key2) + expect(page).to have_content(attributes1) + expect(page).to have_content(attributes2) + expect(page).to have_content(group.name) + expect(page).to have_content(subgroup.name) + end + end + + describe 'project in nested subgroup' do + before do + visit project3_path + end - wait_for_requests + it_behaves_like 'renders correct column headers' - page.within('[data-testid="ci-variable-table"]') do - expect(find('.js-ci-variable-row:nth-child(1) [data-label="Key"]').text).to eq(key1) + it 'shows inherited variable info from all ancestor groups' do + expect(page).to have_content(key1) + expect(page).to have_content(key2) + expect(page).to have_content(key3) + expect(page).to have_content(attributes1) + expect(page).to have_content(attributes2) + expect(page).to have_content(attributes3) + expect(page).to have_content(group.name) + expect(page).to have_content(subgroup.name) + expect(page).to have_content(subgroup_nested.name) end end end diff --git a/spec/features/projects/active_tabs_spec.rb b/spec/features/projects/active_tabs_spec.rb index c27c9530f61..594c2b442aa 100644 --- a/spec/features/projects/active_tabs_spec.rb +++ b/spec/features/projects/active_tabs_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project active tab', feature_category: :projects do +RSpec.describe 'Project active tab', feature_category: :groups_and_projects do let_it_be(:project) { create(:project, :repository, :with_namespace_settings) } let(:user) { project.first_owner } diff --git a/spec/features/projects/activity/rss_spec.rb b/spec/features/projects/activity/rss_spec.rb index 5297f30220d..fdb70092917 100644 --- a/spec/features/projects/activity/rss_spec.rb +++ b/spec/features/projects/activity/rss_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Activity RSS', feature_category: :projects do +RSpec.describe 'Project Activity RSS', feature_category: :groups_and_projects do let(:project) { create(:project, :public) } let(:user) { project.first_owner } let(:path) { activity_project_path(project) } diff --git a/spec/features/projects/activity/user_sees_activity_spec.rb b/spec/features/projects/activity/user_sees_activity_spec.rb index cfa62415c49..5335b9d0e95 100644 --- a/spec/features/projects/activity/user_sees_activity_spec.rb +++ b/spec/features/projects/activity/user_sees_activity_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Activity > User sees activity', feature_category: :projects do +RSpec.describe 'Projects > Activity > User sees activity', feature_category: :groups_and_projects do let(:project) { create(:project, :repository, :public) } let(:user) { project.creator } let(:issue) { create(:issue, project: project) } diff --git a/spec/features/projects/activity/user_sees_private_activity_spec.rb b/spec/features/projects/activity/user_sees_private_activity_spec.rb index e0aaf1dbbc3..f475cb6d941 100644 --- a/spec/features/projects/activity/user_sees_private_activity_spec.rb +++ b/spec/features/projects/activity/user_sees_private_activity_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project > Activity > User sees private activity', :js, feature_category: :projects do +RSpec.describe 'Project > Activity > User sees private activity', :js, feature_category: :groups_and_projects do let(:project) { create(:project, :public) } let(:author) { create(:user) } let(:user) { create(:user) } diff --git a/spec/features/projects/artifacts/user_browses_artifacts_spec.rb b/spec/features/projects/artifacts/user_browses_artifacts_spec.rb index 6948a26196b..04d93b11ca9 100644 --- a/spec/features/projects/artifacts/user_browses_artifacts_spec.rb +++ b/spec/features/projects/artifacts/user_browses_artifacts_spec.rb @@ -33,8 +33,8 @@ RSpec.describe "User browses artifacts", feature_category: :build_artifacts do page.within(".tree-table") do expect(page).to have_no_content("..") .and have_content("other_artifacts_0.1.2") - .and have_content("ci_artifacts.txt 27 Bytes") - .and have_content("rails_sample.jpg 34.4 KB") + .and have_content("ci_artifacts.txt 27 B") + .and have_content("rails_sample.jpg 34.4 KiB") end page.within(".build-header") do diff --git a/spec/features/projects/blobs/blame_spec.rb b/spec/features/projects/blobs/blame_spec.rb index 9f061a2ff14..798cd401dac 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: :projects do +RSpec.describe 'File blame', :js, feature_category: :groups_and_projects do include TreeHelper let_it_be(:project) { create(:project, :public, :repository) } diff --git a/spec/features/projects/blobs/blob_line_permalink_updater_spec.rb b/spec/features/projects/blobs/blob_line_permalink_updater_spec.rb index 48ee39dad19..f0058e75e52 100644 --- a/spec/features/projects/blobs/blob_line_permalink_updater_spec.rb +++ b/spec/features/projects/blobs/blob_line_permalink_updater_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Blob button line permalinks (BlobLinePermalinkUpdater)', :js, feature_category: :projects do +RSpec.describe 'Blob button line permalinks (BlobLinePermalinkUpdater)', :js, feature_category: :groups_and_projects do include TreeHelper let(: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 cd1dde55e30..62cd9fd9a56 100644 --- a/spec/features/projects/blobs/blob_show_spec.rb +++ b/spec/features/projects/blobs/blob_show_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'File blob', :js, feature_category: :projects do +RSpec.describe 'File blob', :js, feature_category: :groups_and_projects do include MobileHelpers let(:project) { create(:project, :public, :repository) } @@ -579,66 +579,6 @@ RSpec.describe 'File blob', :js, feature_category: :projects do end end - describe '.gitlab/dashboards/custom-dashboard.yml' do - let(:remove_monitor_metrics) { false } - - before do - stub_feature_flags(remove_monitor_metrics: remove_monitor_metrics) - - project.add_maintainer(project.creator) - - Files::CreateService.new( - project, - project.creator, - start_branch: 'master', - branch_name: 'master', - commit_message: "Add .gitlab/dashboards/custom-dashboard.yml", - file_path: '.gitlab/dashboards/custom-dashboard.yml', - file_content: file_content - ).execute - - visit_blob('.gitlab/dashboards/custom-dashboard.yml') - end - - context 'valid dashboard file' do - let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) } - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows that dashboard yaml is valid - expect(page).to have_content('Metrics Dashboard YAML definition is valid.') - - # shows a learn more link - expect(page).to have_link('Learn more') - end - end - - context 'when metrics dashboard feature is unavailable' do - let(:remove_monitor_metrics) { true } - - it 'displays the blob without an auxiliary viewer' do - expect(page).to have_content('Environment metrics') - expect(page).not_to have_content('Metrics Dashboard YAML definition', wait: 0) - end - end - end - - context 'invalid dashboard file' do - let(:file_content) { "dashboard: 'invalid'" } - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows that dashboard yaml is invalid - expect(page).to have_content('Metrics Dashboard YAML definition is invalid:') - expect(page).to have_content("panel_groups: should be an array of panel_groups objects") - - # shows a learn more link - expect(page).to have_link('Learn more') - end - end - end - end - context 'LICENSE' do before do visit_blob('LICENSE') diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb index 6e335871ed1..e8a9edcc0cc 100644 --- a/spec/features/projects/blobs/edit_spec.rb +++ b/spec/features/projects/blobs/edit_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Editing file blob', :js, feature_category: :projects do +RSpec.describe 'Editing file blob', :js, feature_category: :groups_and_projects do include Features::SourceEditorSpecHelpers include TreeHelper include Features::BlobSpecHelpers @@ -23,15 +23,11 @@ RSpec.describe 'Editing file blob', :js, feature_category: :projects do end def edit_and_commit(commit_changes: true, is_diff: false) - set_default_button('edit') - refresh - wait_for_requests - if is_diff first('.js-diff-more-actions').click click_link('Edit in single-file editor') else - click_link('Edit') + edit_in_single_file_editor end fill_editor(content: 'class NextFeature\\nend\\n') @@ -83,29 +79,20 @@ RSpec.describe 'Editing file blob', :js, feature_category: :projects do end context 'blob edit toolbar' do - toolbar_buttons = [ - "Add bold text", - "Add italic text", - "Add strikethrough text", - "Insert a quote", - "Insert code", - "Add a link", - "Add a bullet list", - "Add a numbered list", - "Add a checklist", - "Add a collapsible section", - "Add a table" - ] - - it "does not have any buttons" do - stub_feature_flags(source_editor_toolbar: true) - visit project_edit_blob_path(project, tree_join(branch, readme_file_path)) - buttons = page.all('.file-buttons .md-header-toolbar button[type="button"]') - expect(buttons.length).to eq(0) - end - - it "has defined set of toolbar buttons when the flag is off" do - stub_feature_flags(source_editor_toolbar: false) + def has_toolbar_buttons + toolbar_buttons = [ + "Add bold text", + "Add italic text", + "Add strikethrough text", + "Insert a quote", + "Insert code", + "Add a link", + "Add a bullet list", + "Add a numbered list", + "Add a checklist", + "Add a collapsible section", + "Add a table" + ] visit project_edit_blob_path(project, tree_join(branch, readme_file_path)) buttons = page.all('.file-buttons .md-header-toolbar button[type="button"]') expect(buttons.length).to eq(toolbar_buttons.length) @@ -113,6 +100,16 @@ RSpec.describe 'Editing file blob', :js, feature_category: :projects do expect(buttons[i]['title']).to include(button_title) end end + + it "has defined set of toolbar buttons when the flag is on" do + stub_feature_flags(source_editor_toolbar: true) + has_toolbar_buttons + end + + it "has defined set of toolbar buttons when the flag is off" do + stub_feature_flags(source_editor_toolbar: false) + has_toolbar_buttons + end end context 'from blob file path' do diff --git a/spec/features/projects/blobs/shortcuts_blob_spec.rb b/spec/features/projects/blobs/shortcuts_blob_spec.rb index 03276a737da..162066540d9 100644 --- a/spec/features/projects/blobs/shortcuts_blob_spec.rb +++ b/spec/features/projects/blobs/shortcuts_blob_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Blob shortcuts', :js, feature_category: :projects do +RSpec.describe 'Blob shortcuts', :js, feature_category: :groups_and_projects do include TreeHelper let(:project) { create(:project, :public, :repository) } let(:path) { project.repository.ls_files(project.repository.root_ref)[0] } diff --git a/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb b/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb index b723bd5690a..1990526b5fc 100644 --- a/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb +++ b/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User follows pipeline suggest nudge spec when feature is enabled', :js, feature_category: :projects do +RSpec.describe 'User follows pipeline suggest nudge spec when feature is enabled', :js, feature_category: :groups_and_projects do include CookieHelper let(:project) { create(:project, :empty_repo) } diff --git a/spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb b/spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb index 3b383793de2..bef4e5f89b1 100644 --- a/spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb +++ b/spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User views pipeline editor button on root ci config file', :js, feature_category: :projects do +RSpec.describe 'User views pipeline editor button on root ci config file', :js, feature_category: :groups_and_projects do include Features::BlobSpecHelpers let_it_be(:user) { create(:user) } @@ -19,6 +19,8 @@ RSpec.describe 'User views pipeline editor button on root ci config file', :js, project.repository.create_file(user, project.ci_config_path_or_default, 'test', message: 'testing', branch_name: 'master') visit project_blob_path(project, File.join('master', '.my-config.yml')) + click_button 'Edit' + expect(page).to have_content('Edit in pipeline editor') end @@ -26,6 +28,8 @@ RSpec.describe 'User views pipeline editor button on root ci config file', :js, project.repository.create_file(user, '.my-sub-config.yml', 'test', message: 'testing', branch_name: 'master') visit project_blob_path(project, File.join('master', '.my-sub-config.yml')) + click_button 'Edit' + expect(page).not_to have_content('Edit in pipeline editor') end end @@ -36,6 +40,9 @@ RSpec.describe 'User views pipeline editor button on root ci config file', :js, end it 'does not shows the Pipeline Editor button' do visit project_blob_path(project, File.join('master', '.my-config.yml')) + + click_button 'Edit' + expect(page).not_to have_content('Edit in pipeline editor') end end diff --git a/spec/features/projects/branches/download_buttons_spec.rb b/spec/features/projects/branches/download_buttons_spec.rb index 80ccd9c1417..2092af537e8 100644 --- a/spec/features/projects/branches/download_buttons_spec.rb +++ b/spec/features/projects/branches/download_buttons_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Download buttons in branches page', feature_category: :projects do +RSpec.describe 'Download buttons in branches page', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:role) { :developer } let(:status) { 'success' } diff --git a/spec/features/projects/branches/new_branch_ref_dropdown_spec.rb b/spec/features/projects/branches/new_branch_ref_dropdown_spec.rb index 9afd8b3263a..0badde99bdb 100644 --- a/spec/features/projects/branches/new_branch_ref_dropdown_spec.rb +++ b/spec/features/projects/branches/new_branch_ref_dropdown_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'New Branch Ref Dropdown', :js, feature_category: :projects do +RSpec.describe 'New Branch Ref Dropdown', :js, feature_category: :groups_and_projects do include ListboxHelpers let(:user) { create(:user) } diff --git a/spec/features/projects/branches/user_creates_branch_spec.rb b/spec/features/projects/branches/user_creates_branch_spec.rb index 5aa10a8d4b0..8d636dacb75 100644 --- a/spec/features/projects/branches/user_creates_branch_spec.rb +++ b/spec/features/projects/branches/user_creates_branch_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User creates branch', :js, feature_category: :projects do +RSpec.describe 'User creates branch', :js, feature_category: :groups_and_projects do include Features::BranchesHelpers let_it_be(:group) { create(:group, :public) } diff --git a/spec/features/projects/branches/user_deletes_branch_spec.rb b/spec/features/projects/branches/user_deletes_branch_spec.rb index 92b5f176d2d..7e7ab4b2a47 100644 --- a/spec/features/projects/branches/user_deletes_branch_spec.rb +++ b/spec/features/projects/branches/user_deletes_branch_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "User deletes branch", :js, feature_category: :projects do +RSpec.describe "User deletes branch", :js, feature_category: :groups_and_projects do include Spec::Support::Helpers::ModalHelpers let_it_be(:user) { create(:user) } @@ -23,7 +23,8 @@ RSpec.describe "User deletes branch", :js, feature_category: :projects do branch_search.native.send_keys(:enter) page.within(".js-branch-improve\\/awesome") do - find('.js-delete-branch-button').click + click_button 'More actions' + find('[data-testid="delete-branch-button"]').click end accept_gl_confirm(button_text: 'Yes, delete branch') diff --git a/spec/features/projects/branches/user_views_branches_spec.rb b/spec/features/projects/branches/user_views_branches_spec.rb index f0a1ba84ec6..52327cc6543 100644 --- a/spec/features/projects/branches/user_views_branches_spec.rb +++ b/spec/features/projects/branches/user_views_branches_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "User views branches", :js, feature_category: :projects do +RSpec.describe "User views branches", :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } @@ -10,22 +10,41 @@ RSpec.describe "User views branches", :js, feature_category: :projects do sign_in(user) end - context "all branches", :js do + context "all branches" do before do visit(project_branches_path(project)) - branch_search = find('input[data-testid="branch-search"]') - branch_search.set('master') - branch_search.native.send_keys(:enter) end - it "shows branches" do - expect(page).to have_content("Branches").and have_content("master") + describe 'default branch' do + before do + search_branches('master') + end - expect(page.all(".graph-side")).to all(have_content(/\d+/)) + it "shows the default branch" do + expect(page).to have_content("Branches").and have_content("master") + + expect(page.all(".graph-side")).to all(have_content(/\d+/)) + end + + it "does not show the \"More actions\" dropdown" do + expect(page).not_to have_selector('[data-testid="branch-more-actions"]') + end end - it "displays a disabled button with a tooltip for the default branch that cannot be deleted", :js do - expect(page).to have_button('The default branch cannot be deleted', disabled: true) + describe 'non-default branch' do + before do + search_branches('feature') + end + + it "shows the branches" do + expect(page).to have_content("Branches").and have_content("feature") + + expect(page.all(".graph-side")).to all(have_content(/\d+/)) + end + + it "shows the \"More actions\" dropdown" do + expect(page).to have_button('More actions') + end end end @@ -42,4 +61,10 @@ RSpec.describe "User views branches", :js, feature_category: :projects do end end end + + def search_branches(query) + branch_search = find('input[data-testid="branch-search"]') + branch_search.set(query) + branch_search.native.send_keys(:enter) + end end diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb index e1f1a63565c..6a13d5637af 100644 --- a/spec/features/projects/branches_spec.rb +++ b/spec/features/projects/branches_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Branches', feature_category: :projects do +RSpec.describe 'Branches', feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :public, :repository) } let(:repository) { project.repository } @@ -231,7 +231,7 @@ RSpec.describe 'Branches', feature_category: :projects do visit project_branches_path(project) page.within first('.all-branches li') do - expect(page).to have_content 'Merge request' + expect(page).to have_content 'New' end end @@ -242,7 +242,7 @@ RSpec.describe 'Branches', feature_category: :projects do visit project_branches_path(project) page.within first('.all-branches li') do - expect(page).not_to have_content 'Merge request' + expect(page).not_to have_content 'New' end end @@ -266,7 +266,7 @@ RSpec.describe 'Branches', feature_category: :projects do it 'does not show merge request button' do page.within first('.all-branches li') do - expect(page).not_to have_content 'Merge request' + expect(page).not_to have_content 'New' end end end @@ -294,7 +294,7 @@ RSpec.describe 'Branches', feature_category: :projects do it 'displays a placeholder when not available' do page.all('.all-branches li') do |li| - expect(li).to have_css 'svg.s24' + expect(li).to have_css '.pipeline-status svg.s16' end end end @@ -306,7 +306,7 @@ RSpec.describe 'Branches', feature_category: :projects do it 'does not show placeholder or pipeline status' do page.all('.all-branches') do |branches| - expect(branches).not_to have_css 'svg.s24' + expect(branches).not_to have_css '.pipeline-status svg.s16' end end end @@ -322,6 +322,8 @@ RSpec.describe 'Branches', feature_category: :projects do visit project_branches_path(project) page.within first('.all-branches li') do + wait_for_requests + find('[data-testid="branch-more-actions"] .gl-new-dropdown-toggle').click click_link 'Compare' end @@ -329,7 +331,7 @@ RSpec.describe 'Branches', feature_category: :projects do end end - context 'on a read-only instance' do + context 'on a read-only instance', :js do before do allow(Gitlab::Database).to receive(:read_only?).and_return(true) end @@ -337,7 +339,7 @@ RSpec.describe 'Branches', feature_category: :projects do it_behaves_like 'compares branches' end - context 'on a read-write instance' do + context 'on a read-write instance', :js do it_behaves_like 'compares branches' end end @@ -364,7 +366,9 @@ RSpec.describe 'Branches', feature_category: :projects do end def delete_branch_and_confirm - find('.js-delete-branch-button', match: :first).click + wait_for_requests + find('[data-testid="branch-more-actions"] .gl-new-dropdown-toggle', match: :first).click + find('[data-testid="delete-branch-button"]').click within '.modal-footer' do click_button 'Yes, delete branch' diff --git a/spec/features/projects/classification_label_on_project_pages_spec.rb b/spec/features/projects/classification_label_on_project_pages_spec.rb index 662b2296234..fc3e2993cc8 100644 --- a/spec/features/projects/classification_label_on_project_pages_spec.rb +++ b/spec/features/projects/classification_label_on_project_pages_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Classification label on project pages', feature_category: :projects do +RSpec.describe 'Classification label on project pages', feature_category: :groups_and_projects do let(:project) do create(:project, external_authorization_classification_label: 'authorized label') end diff --git a/spec/features/projects/cluster_agents_spec.rb b/spec/features/projects/cluster_agents_spec.rb index 43046db2b6c..baef26e3e63 100644 --- a/spec/features/projects/cluster_agents_spec.rb +++ b/spec/features/projects/cluster_agents_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'ClusterAgents', :js, feature_category: :projects do +RSpec.describe 'ClusterAgents', :js, feature_category: :groups_and_projects do let_it_be(:token) { create(:cluster_agent_token, description: 'feature test token') } let(:agent) { token.agent } diff --git a/spec/features/projects/clusters_spec.rb b/spec/features/projects/clusters_spec.rb index 3fb586bd143..e2737d62749 100644 --- a/spec/features/projects/clusters_spec.rb +++ b/spec/features/projects/clusters_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Clusters', :js, feature_category: :projects do +RSpec.describe 'Clusters', :js, feature_category: :groups_and_projects do include GoogleApi::CloudPlatformHelpers let(:project) { create(:project) } diff --git a/spec/features/projects/commit/user_sees_pipelines_tab_spec.rb b/spec/features/projects/commit/user_sees_pipelines_tab_spec.rb index da83bbcb63a..e44364c7f2d 100644 --- a/spec/features/projects/commit/user_sees_pipelines_tab_spec.rb +++ b/spec/features/projects/commit/user_sees_pipelines_tab_spec.rb @@ -36,7 +36,7 @@ RSpec.describe 'Commit > Pipelines tab', :js, feature_category: :source_code_man wait_for_requests page.within('[data-testid="pipeline-table-row"]') do - expect(page).to have_selector('.ci-success') + expect(page).to have_selector('[data-testid="ci-badge-passed"]') expect(page).to have_content(pipeline.id) expect(page).to have_content('API') expect(page).to have_css('[data-testid="pipeline-mini-graph"]') diff --git a/spec/features/projects/compare_spec.rb b/spec/features/projects/compare_spec.rb index 4c13d23559b..beb5fa7822b 100644 --- a/spec/features/projects/compare_spec.rb +++ b/spec/features/projects/compare_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "Compare", :js, feature_category: :projects do +RSpec.describe "Compare", :js, feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, :repository) } @@ -189,7 +189,6 @@ RSpec.describe "Compare", :js, feature_category: :projects do context "when super sidebar is enabled" do before do user.update!(use_new_navigation: true) - stub_feature_flags(super_sidebar_nav: true) end it_behaves_like "compare view of branches" diff --git a/spec/features/projects/container_registry_spec.rb b/spec/features/projects/container_registry_spec.rb index 5306a9f15c6..493435d3439 100644 --- a/spec/features/projects/container_registry_spec.rb +++ b/spec/features/projects/container_registry_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Container Registry', :js, feature_category: :projects do +RSpec.describe 'Container Registry', :js, feature_category: :groups_and_projects do include_context 'container registry tags' let(:user) { create(:user) } diff --git a/spec/features/projects/deploy_keys_spec.rb b/spec/features/projects/deploy_keys_spec.rb index bd48fb68304..219e47e3f0e 100644 --- a/spec/features/projects/deploy_keys_spec.rb +++ b/spec/features/projects/deploy_keys_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project deploy keys', :js, feature_category: :projects do +RSpec.describe 'Project deploy keys', :js, feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project_empty_repo) } let_it_be(:deploy_keys_project) { create(:deploy_keys_project, project: project) } diff --git a/spec/features/projects/environments/environment_metrics_spec.rb b/spec/features/projects/environments/environment_metrics_spec.rb deleted file mode 100644 index e212d464029..00000000000 --- a/spec/features/projects/environments/environment_metrics_spec.rb +++ /dev/null @@ -1,86 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Environment > Metrics', feature_category: :projects do - include PrometheusHelpers - - let(:user) { create(:user) } - let(:project) { create(:project, :with_prometheus_integration, :repository) } - let(:pipeline) { create(:ci_pipeline, project: project) } - let(:build) { create(:ci_build, pipeline: pipeline) } - let(:environment) { create(:environment, project: project) } - let(:current_time) { Time.now.utc } - let!(:staging) { create(:environment, name: 'staging', project: project) } - - before do - stub_feature_flags(remove_monitor_metrics: false) - - project.add_developer(user) - stub_any_prometheus_request - - sign_in(user) - stub_feature_flags(remove_monitor_metrics: false) - end - - around do |example| - travel_to(current_time) { example.run } - end - - shared_examples 'has environment selector' do - it 'has a working environment selector', :js do - visit_environment(environment) - click_link 'Monitoring' - - expect(page).to have_current_path(project_metrics_dashboard_path(project, environment: environment.id)) - expect(page).to have_css('[data-testid="environments-dropdown"]') - - within('[data-testid="environments-dropdown"]') do - # Click on the dropdown - click_on(environment.name) - - # Select the staging environment - click_on(staging.name) - end - - expect(page).to have_current_path(project_metrics_dashboard_path(project, environment: staging.id)) - - wait_for_requests - end - end - - context 'without deployments' do - it_behaves_like 'has environment selector' - end - - context 'with deployments and related deployable present' do - before do - create(:deployment, environment: environment, deployable: build) - end - - it 'shows metrics', :js do - visit_environment(environment) - click_link 'Monitoring' - - expect(page).to have_css('[data-testid="prometheus-graphs"]') - end - - it_behaves_like 'has environment selector' - end - - context 'when metrics dashboard feature is unavailable' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'does not provide a link to the monitoring dashboard' do - visit_environment(environment) - - expect(page).not_to have_link('Monitoring') - end - end - - def visit_environment(environment) - visit project_environment_path(environment.project, environment) - end -end diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb index 527a146ff73..0f903901984 100644 --- a/spec/features/projects/environments/environment_spec.rb +++ b/spec/features/projects/environments/environment_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Environment', feature_category: :projects do +RSpec.describe 'Environment', feature_category: :groups_and_projects do let_it_be(:project) { create(:project, :repository) } let(:user) { create(:user) } let(:role) { :developer } @@ -479,7 +479,10 @@ RSpec.describe 'Environment', feature_category: :projects do visit project_branches_filtered_path(project, state: 'all', search: 'feature') remove_branch_with_hooks(project, user, 'feature') do - page.within('.js-branch-feature') { find('.js-delete-branch-button').click } + page.within('.js-branch-feature') do + find('[data-testid="branch-more-actions"] .gl-new-dropdown-toggle').click + find('[data-testid="delete-branch-button"]').click + end end visit_environment(environment) diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb index b50fc59ac32..2490b1fde8e 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: :projects do +RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects do include Spec::Support::Helpers::ModalHelpers let(:project) { create(:project) } diff --git a/spec/features/projects/feature_flag_user_lists/user_deletes_feature_flag_user_list_spec.rb b/spec/features/projects/feature_flag_user_lists/user_deletes_feature_flag_user_list_spec.rb index 6383c3196c4..687af894168 100644 --- a/spec/features/projects/feature_flag_user_lists/user_deletes_feature_flag_user_list_spec.rb +++ b/spec/features/projects/feature_flag_user_lists/user_deletes_feature_flag_user_list_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User deletes feature flag user list', :js, feature_category: :projects do +RSpec.describe 'User deletes feature flag user list', :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } diff --git a/spec/features/projects/feature_flag_user_lists/user_edits_feature_flag_user_list_spec.rb b/spec/features/projects/feature_flag_user_lists/user_edits_feature_flag_user_list_spec.rb index 8ab9e9baab9..8d0052c4ee1 100644 --- a/spec/features/projects/feature_flag_user_lists/user_edits_feature_flag_user_list_spec.rb +++ b/spec/features/projects/feature_flag_user_lists/user_edits_feature_flag_user_list_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User edits feature flag user list', :js, feature_category: :projects do +RSpec.describe 'User edits feature flag user list', :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } diff --git a/spec/features/projects/feature_flag_user_lists/user_sees_feature_flag_user_list_details_spec.rb b/spec/features/projects/feature_flag_user_lists/user_sees_feature_flag_user_list_details_spec.rb index 7614349c5a4..672c4eb714c 100644 --- a/spec/features/projects/feature_flag_user_lists/user_sees_feature_flag_user_list_details_spec.rb +++ b/spec/features/projects/feature_flag_user_lists/user_sees_feature_flag_user_list_details_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User sees feature flag user list details', :js, feature_category: :projects do +RSpec.describe 'User sees feature flag user list details', :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } diff --git a/spec/features/projects/features_visibility_spec.rb b/spec/features/projects/features_visibility_spec.rb index 5e0998412ed..b798524b9c4 100644 --- a/spec/features/projects/features_visibility_spec.rb +++ b/spec/features/projects/features_visibility_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Edit Project Settings', feature_category: :projects do +RSpec.describe 'Edit Project Settings', feature_category: :groups_and_projects do let(:member) { create(:user) } let!(:project) { create(:project, :public, :repository) } let!(:issue) { create(:issue, project: project) } diff --git a/spec/features/projects/files/dockerfile_dropdown_spec.rb b/spec/features/projects/files/dockerfile_dropdown_spec.rb index ec1f03570d9..a74cde35be6 100644 --- a/spec/features/projects/files/dockerfile_dropdown_spec.rb +++ b/spec/features/projects/files/dockerfile_dropdown_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User wants to add a Dockerfile file', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User wants to add a Dockerfile file', :js, feature_category: :groups_and_projects do include Features::SourceEditorSpecHelpers before do diff --git a/spec/features/projects/files/download_buttons_spec.rb b/spec/features/projects/files/download_buttons_spec.rb index 2710e2efa94..9b3d19cfea3 100644 --- a/spec/features/projects/files/download_buttons_spec.rb +++ b/spec/features/projects/files/download_buttons_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > Download buttons in files tree', feature_category: :projects do +RSpec.describe 'Projects > Files > Download buttons in files tree', feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { project.creator } diff --git a/spec/features/projects/files/edit_file_soft_wrap_spec.rb b/spec/features/projects/files/edit_file_soft_wrap_spec.rb index f6342257847..8f7c09aac69 100644 --- a/spec/features/projects/files/edit_file_soft_wrap_spec.rb +++ b/spec/features/projects/files/edit_file_soft_wrap_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User uses soft wrap while editing file', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User uses soft wrap while editing file', :js, feature_category: :groups_and_projects do before do project = create(:project, :repository) user = project.first_owner diff --git a/spec/features/projects/files/editing_a_file_spec.rb b/spec/features/projects/files/editing_a_file_spec.rb index 1f928da0427..b4edd5c2729 100644 --- a/spec/features/projects/files/editing_a_file_spec.rb +++ b/spec/features/projects/files/editing_a_file_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User wants to edit a file', feature_category: :projects do +RSpec.describe 'Projects > Files > User wants to edit a file', feature_category: :groups_and_projects do include ProjectForksHelper let(:project) { create(:project, :repository, :public) } let(:user) { project.first_owner } diff --git a/spec/features/projects/files/files_sort_submodules_with_folders_spec.rb b/spec/features/projects/files/files_sort_submodules_with_folders_spec.rb index d791e22e4f8..ce63afe58d1 100644 --- a/spec/features/projects/files/files_sort_submodules_with_folders_spec.rb +++ b/spec/features/projects/files/files_sort_submodules_with_folders_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User views files page', feature_category: :projects do +RSpec.describe 'Projects > Files > User views files page', feature_category: :groups_and_projects do let(:project) { create(:forked_project_with_submodules) } let(:user) { project.first_owner } diff --git a/spec/features/projects/files/find_file_keyboard_spec.rb b/spec/features/projects/files/find_file_keyboard_spec.rb index 19813396435..85ecd1c2d96 100644 --- a/spec/features/projects/files/find_file_keyboard_spec.rb +++ b/spec/features/projects/files/find_file_keyboard_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > Find file keyboard shortcuts', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > Find file keyboard shortcuts', :js, feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } diff --git a/spec/features/projects/files/gitignore_dropdown_spec.rb b/spec/features/projects/files/gitignore_dropdown_spec.rb index eedb79167bd..36b02b9b948 100644 --- a/spec/features/projects/files/gitignore_dropdown_spec.rb +++ b/spec/features/projects/files/gitignore_dropdown_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User wants to add a .gitignore file', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User wants to add a .gitignore file', :js, feature_category: :groups_and_projects do include Features::SourceEditorSpecHelpers before do diff --git a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb index f2d657b3513..929554ff0d6 100644 --- a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb +++ b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js, feature_category: :groups_and_projects do include Features::SourceEditorSpecHelpers let(:params) { {} } diff --git a/spec/features/projects/files/project_owner_creates_license_file_spec.rb b/spec/features/projects/files/project_owner_creates_license_file_spec.rb index 7ac9cb33060..8ec9adaeb9a 100644 --- a/spec/features/projects/files/project_owner_creates_license_file_spec.rb +++ b/spec/features/projects/files/project_owner_creates_license_file_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > Project owner creates a license file', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > Project owner creates a license file', :js, feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:project_maintainer) { project.first_owner } 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 cfa55eba188..bfe1fd073c5 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: :projects do +feature_category: :groups_and_projects do include Features::WebIdeSpecHelpers let(:project) { create(:project_empty_repo) } diff --git a/spec/features/projects/files/template_selector_menu_spec.rb b/spec/features/projects/files/template_selector_menu_spec.rb index 8dbfa3afb0b..46c4b69bc89 100644 --- a/spec/features/projects/files/template_selector_menu_spec.rb +++ b/spec/features/projects/files/template_selector_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Template selector menu', :js, feature_category: :projects do +RSpec.describe 'Template selector menu', :js, feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { create(:user) } diff --git a/spec/features/projects/files/undo_template_spec.rb b/spec/features/projects/files/undo_template_spec.rb index 0dfed209ce9..4b6e6b7282c 100644 --- a/spec/features/projects/files/undo_template_spec.rb +++ b/spec/features/projects/files/undo_template_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > Template Undo Button', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > Template Undo Button', :js, feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } 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 8b60d21a77e..645bfeb14e3 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: :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 9b9c2158432..bb14b9c4e31 100644 --- a/spec/features/projects/files/user_browses_files_spec.rb +++ b/spec/features/projects/files/user_browses_files_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "User browses files", :js, feature_category: :projects do +RSpec.describe "User browses files", :js, feature_category: :groups_and_projects do include RepoHelpers include ListboxHelpers diff --git a/spec/features/projects/files/user_browses_lfs_files_spec.rb b/spec/features/projects/files/user_browses_lfs_files_spec.rb index 6b401d6d789..d8c1c8e4f2a 100644 --- a/spec/features/projects/files/user_browses_lfs_files_spec.rb +++ b/spec/features/projects/files/user_browses_lfs_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User browses LFS files', feature_category: :projects do +RSpec.describe 'Projects > Files > User browses LFS files', feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } @@ -71,7 +71,9 @@ RSpec.describe 'Projects > Files > User browses LFS files', feature_category: :p expect(page).not_to have_content('Annotate') expect(page).not_to have_content('Blame') - expect(page).not_to have_selector(:link_or_button, text: /^Edit$/) + click_button 'Edit' + + expect(page).not_to have_selector(:link_or_button, text: /^Edit single file$/) expect(page).to have_selector(:link_or_button, 'Open in Web IDE') end end diff --git a/spec/features/projects/files/user_creates_directory_spec.rb b/spec/features/projects/files/user_creates_directory_spec.rb index 4dd579ba8e9..070b6dbec7d 100644 --- a/spec/features/projects/files/user_creates_directory_spec.rb +++ b/spec/features/projects/files/user_creates_directory_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User creates a directory', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User creates a directory', :js, feature_category: :groups_and_projects do let(:fork_message) do "You're not allowed to make changes to this project directly. "\ "A fork of this project has been created that you can make changes in, so you can submit a merge request." diff --git a/spec/features/projects/files/user_creates_files_spec.rb b/spec/features/projects/files/user_creates_files_spec.rb index 42aceef256a..de82f3062a2 100644 --- a/spec/features/projects/files/user_creates_files_spec.rb +++ b/spec/features/projects/files/user_creates_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User creates files', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User creates files', :js, feature_category: :groups_and_projects do include Features::SourceEditorSpecHelpers include Features::BlobSpecHelpers @@ -105,8 +105,6 @@ RSpec.describe 'Projects > Files > User creates files', :js, feature_category: : end it 'creates and commit a new file with new lines at the end of file' do - set_default_button('edit') - editor_set_value('Sample\n\n\n') fill_in(:file_name, with: 'not_a_file.md') fill_in(:commit_message, with: 'New commit message', visible: true) @@ -116,7 +114,7 @@ RSpec.describe 'Projects > Files > User creates files', :js, feature_category: : expect(page).to have_current_path(new_file_path, ignore_query: true) - click_link('Edit') + edit_in_single_file_editor expect(find('.monaco-editor')).to have_content('Sample\n\n\n') end diff --git a/spec/features/projects/files/user_deletes_files_spec.rb b/spec/features/projects/files/user_deletes_files_spec.rb index 61152a8badc..c526084b35d 100644 --- a/spec/features/projects/files/user_deletes_files_spec.rb +++ b/spec/features/projects/files/user_deletes_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User deletes files', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User deletes files', :js, feature_category: :groups_and_projects do let(:fork_message) do "You're not allowed to make changes to this project directly. "\ "A fork of this project has been created that you can make changes in, so you can submit a merge request." diff --git a/spec/features/projects/files/user_edits_files_spec.rb b/spec/features/projects/files/user_edits_files_spec.rb index 779257b2e2b..10fa4a21359 100644 --- a/spec/features/projects/files/user_edits_files_spec.rb +++ b/spec/features/projects/files/user_edits_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :groups_and_projects do include Features::SourceEditorSpecHelpers include ProjectForksHelper include Features::BlobSpecHelpers @@ -19,10 +19,6 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr sign_in(user) end - after do - unset_default_button - end - shared_examples 'unavailable for an archived project' do it 'does not show the edit link for an archived project', :js do project.update!(archived: true) @@ -48,9 +44,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'inserts a content of a file' do - set_default_button('edit') click_link('.gitignore') - click_link_or_button('Edit') + edit_in_single_file_editor find('.file-editor', match: :first) editor_set_value('*.rbca') @@ -69,9 +64,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'commits an edited file' do - set_default_button('edit') click_link('.gitignore') - click_link_or_button('Edit') + edit_in_single_file_editor find('.file-editor', match: :first) editor_set_value('*.rbca') @@ -86,9 +80,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'commits an edited file to a new branch' do - set_default_button('edit') click_link('.gitignore') - click_link_or_button('Edit') + edit_in_single_file_editor find('.file-editor', match: :first) @@ -105,10 +98,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'shows loader on commit changes' do - set_default_button('edit') click_link('.gitignore') - click_link_or_button('Edit') - + edit_in_single_file_editor # why: We don't want the form to actually submit, so that we can assert the button's changed state page.execute_script("document.querySelector('.js-edit-blob-form').addEventListener('submit', e => e.preventDefault())") @@ -120,9 +111,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'shows the diff of an edited file' do - set_default_button('edit') click_link('.gitignore') - click_link_or_button('Edit') + edit_in_single_file_editor find('.file-editor', match: :first) editor_set_value('*.rbca') @@ -158,9 +148,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'inserts a content of a file in a forked project', :sidekiq_might_not_need_inline do - set_default_button('edit') click_link('.gitignore') - click_link_or_button('Edit') + edit_in_single_file_editor expect_fork_prompt @@ -176,9 +165,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'opens the Web IDE in a forked project', :sidekiq_might_not_need_inline do - set_default_button('webide') click_link('.gitignore') - click_link_or_button('Web IDE') + edit_in_web_ide expect_fork_prompt @@ -191,9 +179,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'commits an edited file in a forked project', :sidekiq_might_not_need_inline do - set_default_button('edit') click_link('.gitignore') - click_link_or_button('Edit') + edit_in_single_file_editor expect_fork_prompt click_link_or_button('Fork') @@ -222,9 +209,8 @@ RSpec.describe 'Projects > Files > User edits files', :js, feature_category: :pr end it 'links to the forked project for editing', :sidekiq_might_not_need_inline do - set_default_button('edit') click_link('.gitignore') - click_link_or_button('Edit') + edit_in_single_file_editor expect(page).not_to have_link('Fork') diff --git a/spec/features/projects/files/user_find_file_spec.rb b/spec/features/projects/files/user_find_file_spec.rb index 9cc2ce6a7b4..5406726eb6e 100644 --- a/spec/features/projects/files/user_find_file_spec.rb +++ b/spec/features/projects/files/user_find_file_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User find project file', feature_category: :projects do +RSpec.describe 'User find project file', feature_category: :groups_and_projects do include ListboxHelpers let(:user) { create :user } diff --git a/spec/features/projects/files/user_reads_pipeline_status_spec.rb b/spec/features/projects/files/user_reads_pipeline_status_spec.rb index 18a5fb71b10..ce3f0541139 100644 --- a/spec/features/projects/files/user_reads_pipeline_status_spec.rb +++ b/spec/features/projects/files/user_reads_pipeline_status_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'user reads pipeline status', :js, feature_category: :projects do +RSpec.describe 'user reads pipeline status', :js, feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { create(:user) } let(:v110_pipeline) { create_pipeline('v1.1.0', 'success') } diff --git a/spec/features/projects/files/user_replaces_files_spec.rb b/spec/features/projects/files/user_replaces_files_spec.rb index 9fa3ddf92c6..bd951b974d1 100644 --- a/spec/features/projects/files/user_replaces_files_spec.rb +++ b/spec/features/projects/files/user_replaces_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User replaces files', :js, feature_category: :projects do +RSpec.describe 'Projects > Files > User replaces files', :js, feature_category: :groups_and_projects do include DropzoneHelper let(:fork_message) do diff --git a/spec/features/projects/files/user_searches_for_files_spec.rb b/spec/features/projects/files/user_searches_for_files_spec.rb index b438b203141..25456593fc4 100644 --- a/spec/features/projects/files/user_searches_for_files_spec.rb +++ b/spec/features/projects/files/user_searches_for_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User searches for files', feature_category: :projects do +RSpec.describe 'Projects > Files > User searches for files', feature_category: :groups_and_projects do let(:user) { project.first_owner } before do diff --git a/spec/features/projects/files/user_uploads_files_spec.rb b/spec/features/projects/files/user_uploads_files_spec.rb index 575a6290a32..22c3f73add5 100644 --- a/spec/features/projects/files/user_uploads_files_spec.rb +++ b/spec/features/projects/files/user_uploads_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Files > User uploads files', feature_category: :projects do +RSpec.describe 'Projects > Files > User uploads files', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, :repository, name: 'Shop', creator: user) } let(:project2) { create(:project, :repository, name: 'Another Project', path: 'another-project') } diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb index 39cdc8faa85..7d734d5d2df 100644 --- a/spec/features/projects/fork_spec.rb +++ b/spec/features/projects/fork_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project fork', feature_category: :projects do +RSpec.describe 'Project fork', feature_category: :groups_and_projects do include ListboxHelpers include ProjectForksHelper diff --git a/spec/features/projects/forks/fork_list_spec.rb b/spec/features/projects/forks/fork_list_spec.rb index 18424c18cbc..966147637f5 100644 --- a/spec/features/projects/forks/fork_list_spec.rb +++ b/spec/features/projects/forks/fork_list_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'listing forks of a project', feature_category: :projects do +RSpec.describe 'listing forks of a project', feature_category: :groups_and_projects do include ProjectForksHelper include ExternalAuthorizationServiceHelpers diff --git a/spec/features/projects/gfm_autocomplete_load_spec.rb b/spec/features/projects/gfm_autocomplete_load_spec.rb index bb9f4e121d8..35ab0094d51 100644 --- a/spec/features/projects/gfm_autocomplete_load_spec.rb +++ b/spec/features/projects/gfm_autocomplete_load_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'GFM autocomplete loading', :js, feature_category: :projects do +RSpec.describe 'GFM autocomplete loading', :js, feature_category: :groups_and_projects do let(:project) { create(:project) } before do diff --git a/spec/features/projects/graph_spec.rb b/spec/features/projects/graph_spec.rb index a1f047d9b43..16a3686215f 100644 --- a/spec/features/projects/graph_spec.rb +++ b/spec/features/projects/graph_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Graph', :js, feature_category: :projects do +RSpec.describe 'Project Graph', :js, feature_category: :groups_and_projects do let(:user) { create :user } let(:project) { create(:project, :repository, namespace: user.namespace) } let(:branch_name) { 'master' } diff --git a/spec/features/projects/hook_logs/user_reads_log_spec.rb b/spec/features/projects/hook_logs/user_reads_log_spec.rb index 92ddc559cf4..cffa76924f5 100644 --- a/spec/features/projects/hook_logs/user_reads_log_spec.rb +++ b/spec/features/projects/hook_logs/user_reads_log_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Hook logs', feature_category: :projects do +RSpec.describe 'Hook logs', feature_category: :groups_and_projects do let(:project) { create(:project) } let(:project_hook) { create(:project_hook, project: project) } let(:web_hook_log) { create(:web_hook_log, web_hook: project_hook, response_body: 'Hello World') } diff --git a/spec/features/projects/infrastructure_registry_spec.rb b/spec/features/projects/infrastructure_registry_spec.rb index e1619726c8d..a648a4fc1ce 100644 --- a/spec/features/projects/infrastructure_registry_spec.rb +++ b/spec/features/projects/infrastructure_registry_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Infrastructure Registry', feature_category: :projects do +RSpec.describe 'Infrastructure Registry', feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb b/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb index d2c48cb2af0..9fc91e03c94 100644 --- a/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb +++ b/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb @@ -89,4 +89,5 @@ RSpec.describe 'User activates issue tracker', :js, feature_category: :integrati it_behaves_like 'external issue tracker activation', tracker: 'Bugzilla' it_behaves_like 'external issue tracker activation', tracker: 'Custom issue tracker' it_behaves_like 'external issue tracker activation', tracker: 'EWM', skip_test: true + it_behaves_like 'external issue tracker activation', tracker: 'ClickUp', skip_new_issue_url: true end diff --git a/spec/features/projects/integrations/user_activates_jira_spec.rb b/spec/features/projects/integrations/user_activates_jira_spec.rb index e4b10aeb340..03d5e68d2aa 100644 --- a/spec/features/projects/integrations/user_activates_jira_spec.rb +++ b/spec/features/projects/integrations/user_activates_jira_spec.rb @@ -48,7 +48,7 @@ RSpec.describe 'User activates Jira', :js, feature_category: :integrations do it 'activates the Jira integration' do stub_request(:get, test_url).with(basic_auth: %w(username password)) - .to_raise(JIRA::HTTPError.new(double(message: 'message'))) + .to_raise(JIRA::HTTPError.new(double(message: 'message', code: '200'))) visit_project_integration('Jira') fill_form diff --git a/spec/features/projects/integrations/user_uses_inherited_settings_spec.rb b/spec/features/projects/integrations/user_uses_inherited_settings_spec.rb index 9ff344bcc88..9d9620c1461 100644 --- a/spec/features/projects/integrations/user_uses_inherited_settings_spec.rb +++ b/spec/features/projects/integrations/user_uses_inherited_settings_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe 'User uses inherited settings', :js, feature_category: :integrations do include JiraIntegrationHelpers + include ListboxHelpers include_context 'project integration activation' @@ -22,17 +23,16 @@ RSpec.describe 'User uses inherited settings', :js, feature_category: :integrati expect(page).not_to have_button('Use custom settings') expect(page).to have_field('Web URL', with: parent_settings[:url], readonly: true) - expect(page).to have_field('New API token, password, or Jira personal access token', with: '', readonly: true) + expect(page).to have_field('New API token or password', with: '', readonly: true) - click_on 'Use default settings' - click_on 'Use custom settings' + select_from_listbox('Use custom settings', from: 'Use default settings') expect(page).not_to have_button('Use default settings') expect(page).to have_field('Web URL', with: project_settings[:url], readonly: false) - expect(page).to have_field('New API token, password, or Jira personal access token', with: '', readonly: false) + expect(page).to have_field('New API token or password', with: '', readonly: false) fill_in 'Web URL', with: 'http://custom.com' - fill_in 'New API token, password, or Jira personal access token', with: 'custom' + fill_in 'New API token or password', with: 'custom' click_save_integration @@ -53,14 +53,13 @@ RSpec.describe 'User uses inherited settings', :js, feature_category: :integrati expect(page).not_to have_button('Use default settings') expect(page).to have_field('URL', with: project_settings[:url], readonly: false) - expect(page).to have_field('New API token, password, or Jira personal access token', with: '', readonly: false) + expect(page).to have_field('New API token or password', with: '', readonly: false) - click_on 'Use custom settings' - click_on 'Use default settings' + select_from_listbox('Use default settings', from: 'Use custom settings') expect(page).not_to have_button('Use custom settings') expect(page).to have_field('URL', with: parent_settings[:url], readonly: true) - expect(page).to have_field('New API token, password, or Jira personal access token', with: '', readonly: true) + expect(page).to have_field('New API token or password', with: '', readonly: true) click_save_integration diff --git a/spec/features/projects/issuable_templates_spec.rb b/spec/features/projects/issuable_templates_spec.rb index 77f88994bfb..72695680809 100644 --- a/spec/features/projects/issuable_templates_spec.rb +++ b/spec/features/projects/issuable_templates_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'issuable templates', :js, feature_category: :projects do +RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects do include ProjectForksHelper include CookieHelper diff --git a/spec/features/projects/jobs/permissions_spec.rb b/spec/features/projects/jobs/permissions_spec.rb index dce86c9f0a4..e1bcc160092 100644 --- a/spec/features/projects/jobs/permissions_spec.rb +++ b/spec/features/projects/jobs/permissions_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Jobs Permissions', feature_category: :projects do +RSpec.describe 'Project Jobs Permissions', feature_category: :groups_and_projects do using RSpec::Parameterized::TableSyntax let_it_be_with_reload(:group) { create(:group, name: 'some group') } diff --git a/spec/features/projects/jobs/user_browses_job_spec.rb b/spec/features/projects/jobs/user_browses_job_spec.rb index dd57b4117f9..795084f8008 100644 --- a/spec/features/projects/jobs/user_browses_job_spec.rb +++ b/spec/features/projects/jobs/user_browses_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User browses a job', :js, feature_category: :projects do +RSpec.describe 'User browses a job', :js, feature_category: :groups_and_projects do include Spec::Support::Helpers::ModalHelpers let(:user) { create(:user) } diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb index 1634f6dee74..aeba53c22b6 100644 --- a/spec/features/projects/jobs/user_browses_jobs_spec.rb +++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb @@ -8,7 +8,7 @@ def visit_jobs_page wait_for_requests end -RSpec.describe 'User browses jobs', feature_category: :projects do +RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do describe 'Jobs', :js do let(:project) { create(:project, :repository) } let(:user) { create(:user) } @@ -72,7 +72,7 @@ RSpec.describe 'User browses jobs', feature_category: :projects do wait_for_requests - expect(page).to have_selector('.ci-canceled') + expect(page).to have_selector('[data-testid="ci-badge-canceled"]') expect(page).not_to have_selector('[data-testid="jobs-table-error-alert"]') end end @@ -94,7 +94,7 @@ RSpec.describe 'User browses jobs', feature_category: :projects do wait_for_requests - expect(page).to have_selector('.ci-pending') + expect(page).to have_selector('[data-testid="ci-badge-pending"]') end end @@ -134,7 +134,7 @@ RSpec.describe 'User browses jobs', feature_category: :projects do wait_for_requests - expect(page).to have_selector('.ci-pending') + expect(page).to have_selector('[data-testid="ci-badge-pending"]') end it 'unschedules a job successfully' do @@ -142,7 +142,7 @@ RSpec.describe 'User browses jobs', feature_category: :projects do wait_for_requests - expect(page).to have_selector('.ci-manual') + expect(page).to have_selector('[data-testid="ci-badge-manual"]') end end diff --git a/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb b/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb index e4394010e8c..41a21b1155b 100644 --- a/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb +++ b/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User triggers manual job with variables', :js, feature_category: :projects do +RSpec.describe 'User triggers manual job with variables', :js, feature_category: :groups_and_projects do let(:user) { create(:user) } let(:user_access_level) { :developer } let(:project) { create(:project, :repository, namespace: user.namespace) } diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb index 796bac2e8e7..fcd07d33535 100644 --- a/spec/features/projects/jobs_spec.rb +++ b/spec/features/projects/jobs_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'tempfile' -RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :projects do +RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :groups_and_projects do include Gitlab::Routing include ProjectForksHelper @@ -66,7 +66,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :proj wait_for_requests - expect(page).to have_css('.ci-status.ci-success', text: 'passed') + expect(page).to have_css('[data-testid="ci-badge-passed"]', text: 'passed') end it 'shows commit`s data', :js do @@ -548,24 +548,24 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :proj end context 'when there is a cluster used for the deployment' do - let(:cluster) { create(:cluster, name: 'the-cluster') } - let(:deployment) { create(:deployment, :success, cluster: cluster, environment: environment, project: environment.project) } + let(:deployment) { create(:deployment, :success, :on_cluster, environment: environment) } let(:user_access_level) { :maintainer } + let(:cluster) { deployment.cluster } it 'shows a link to the cluster' do - expect(page).to have_link 'the-cluster' + expect(page).to have_link cluster.name end it 'shows the name of the cluster' do - expect(page).to have_content 'using cluster the-cluster' + expect(page).to have_content "using cluster #{cluster.name}" end context 'when the user is not able to view the cluster' do let(:user_access_level) { :reporter } it 'includes only the name of the cluster without a link' do - expect(page).to have_content 'using cluster the-cluster' - expect(page).not_to have_link 'the-cluster' + expect(page).to have_content "using cluster #{cluster.name}" + expect(page).not_to have_link cluster.name end end end diff --git a/spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb b/spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb index 63dc99efc8f..97b29ee6c91 100644 --- a/spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb +++ b/spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Group member cannot leave group project', feature_category: :subgroups do +RSpec.describe 'Projects > Members > Group member cannot leave group project', 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_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 07886950b95..6656ca3ef18 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: :subgroups 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_members_spec.rb b/spec/features/projects/members/group_members_spec.rb index c0257446a37..3ab84b40e53 100644 --- a/spec/features/projects/members/group_members_spec.rb +++ b/spec/features/projects/members/group_members_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects members', :js, feature_category: :subgroups do +RSpec.describe 'Projects members', :js, feature_category: :groups_and_projects do include Features::MembersHelpers let(:user) { create(:user) } 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 7a11ee61c5f..9db34cee5d6 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: :subgroups 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/groups_with_access_list_spec.rb b/spec/features/projects/members/groups_with_access_list_spec.rb index 8238f95fd47..a2a04ada627 100644 --- a/spec/features/projects/members/groups_with_access_list_spec.rb +++ b/spec/features/projects/members/groups_with_access_list_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Groups with access list', :js, feature_category: :subgroups do +RSpec.describe 'Projects > Members > Groups with access list', :js, feature_category: :groups_and_projects do + include ListboxHelpers include Features::MembersHelpers include Spec::Support::Helpers::ModalHelpers include Features::InviteMembersModalHelpers @@ -26,8 +27,7 @@ RSpec.describe 'Projects > Members > Groups with access list', :js, feature_cate end it 'updates group access level' do - click_button group_link.human_access - click_button 'Guest' + select_from_listbox('Guest', from: group_link.human_access) wait_for_requests diff --git a/spec/features/projects/members/manage_groups_spec.rb b/spec/features/projects/members/manage_groups_spec.rb index 5efb5abefc6..63ff1ba8455 100644 --- a/spec/features/projects/members/manage_groups_spec.rb +++ b/spec/features/projects/members/manage_groups_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project > Members > Manage groups', :js, feature_category: :subgroups do +RSpec.describe 'Project > Members > Manage groups', :js, feature_category: :groups_and_projects do include ActionView::Helpers::DateHelper include Features::MembersHelpers include Features::InviteMembersModalHelpers diff --git a/spec/features/projects/members/manage_members_spec.rb b/spec/features/projects/members/manage_members_spec.rb index 5ae6eb83b6b..0e3ac5ff3ac 100644 --- a/spec/features/projects/members/manage_members_spec.rb +++ b/spec/features/projects/members/manage_members_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe 'Projects > Members > Manage members', :js, feature_category: :onboarding do + include ListboxHelpers include Features::MembersHelpers include Features::InviteMembersModalHelpers include Spec::Support::Helpers::ModalHelpers @@ -61,11 +62,8 @@ RSpec.describe 'Projects > Members > Manage members', :js, feature_category: :on page.within find_member_row(project_developer) do click_button('Developer') - page.within '.dropdown-menu' do - expect(page).not_to have_button('Owner') - end - - click_button('Reporter') + expect_no_listbox_item('Owner') + select_listbox_item('Reporter') expect(page).to have_button('Reporter') end @@ -87,8 +85,7 @@ RSpec.describe 'Projects > Members > Manage members', :js, feature_category: :on visit_members_page page.within find_member_row(project_owner) do - click_button('Owner') - click_button('Reporter') + select_from_listbox('Reporter', from: 'Owner') expect(page).to have_button('Reporter') end diff --git a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb index be778def833..b51259bea23 100644 --- a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb +++ b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Maintainer adds member with expiration date', :js, feature_category: :subgroups do +RSpec.describe 'Projects > Members > Maintainer adds member with expiration date', :js, feature_category: :groups_and_projects do include ActiveSupport::Testing::TimeHelpers include Features::MembersHelpers include Features::InviteMembersModalHelpers diff --git a/spec/features/projects/members/master_manages_access_requests_spec.rb b/spec/features/projects/members/master_manages_access_requests_spec.rb index cea59679226..04d28022b73 100644 --- a/spec/features/projects/members/master_manages_access_requests_spec.rb +++ b/spec/features/projects/members/master_manages_access_requests_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Maintainer manages access requests', feature_category: :subgroups do +RSpec.describe 'Projects > Members > Maintainer manages access requests', feature_category: :groups_and_projects do it_behaves_like 'Maintainer manages access requests' do let(:entity) { create(:project, :public, :with_namespace_settings) } let(:members_page_path) { project_project_members_path(entity) } diff --git a/spec/features/projects/members/member_cannot_request_access_to_his_project_spec.rb b/spec/features/projects/members/member_cannot_request_access_to_his_project_spec.rb index dc18ca88c36..91237c334cc 100644 --- a/spec/features/projects/members/member_cannot_request_access_to_his_project_spec.rb +++ b/spec/features/projects/members/member_cannot_request_access_to_his_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Member cannot request access to their project', feature_category: :subgroups do +RSpec.describe 'Projects > Members > Member cannot request access to their project', feature_category: :groups_and_projects do let(:member) { create(:user) } let(:project) { create(:project) } diff --git a/spec/features/projects/members/member_leaves_project_spec.rb b/spec/features/projects/members/member_leaves_project_spec.rb index 91e30b3396e..e0c64547e9f 100644 --- a/spec/features/projects/members/member_leaves_project_spec.rb +++ b/spec/features/projects/members/member_leaves_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Member leaves project', feature_category: :subgroups do +RSpec.describe 'Projects > Members > Member leaves project', feature_category: :groups_and_projects do include Features::MembersHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/projects/members/owner_cannot_leave_project_spec.rb b/spec/features/projects/members/owner_cannot_leave_project_spec.rb index 7908fd3a98f..c79d227647a 100644 --- a/spec/features/projects/members/owner_cannot_leave_project_spec.rb +++ b/spec/features/projects/members/owner_cannot_leave_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Owner cannot leave project', feature_category: :subgroups do +RSpec.describe 'Projects > Members > Owner cannot leave project', feature_category: :groups_and_projects do let(:project) { create(:project) } before do diff --git a/spec/features/projects/members/owner_cannot_request_access_to_his_project_spec.rb b/spec/features/projects/members/owner_cannot_request_access_to_his_project_spec.rb index b5a862578d3..84cf31b526a 100644 --- a/spec/features/projects/members/owner_cannot_request_access_to_his_project_spec.rb +++ b/spec/features/projects/members/owner_cannot_request_access_to_his_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Owner cannot request access to their own project', feature_category: :subgroups do +RSpec.describe 'Projects > Members > Owner cannot request access to their own project', feature_category: :groups_and_projects do let(:project) { create(:project) } before do diff --git a/spec/features/projects/members/sorting_spec.rb b/spec/features/projects/members/sorting_spec.rb index 85bf381404c..9747d499ae9 100644 --- a/spec/features/projects/members/sorting_spec.rb +++ b/spec/features/projects/members/sorting_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Sorting', :js, feature_category: :subgroups do +RSpec.describe 'Projects > Members > Sorting', :js, feature_category: :groups_and_projects do include Features::MembersHelpers let(:maintainer) { create(:user, name: 'John Doe', created_at: 5.days.ago, last_activity_on: Date.today) } diff --git a/spec/features/projects/members/tabs_spec.rb b/spec/features/projects/members/tabs_spec.rb index 9ee06edc0c1..edd4a51089c 100644 --- a/spec/features/projects/members/tabs_spec.rb +++ b/spec/features/projects/members/tabs_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > Tabs', :js, feature_category: :subgroups do +RSpec.describe 'Projects > Members > Tabs', :js, feature_category: :groups_and_projects do include Features::MembersHelpers using RSpec::Parameterized::TableSyntax diff --git a/spec/features/projects/members/user_requests_access_spec.rb b/spec/features/projects/members/user_requests_access_spec.rb index 11d162fabd4..6f76424e377 100644 --- a/spec/features/projects/members/user_requests_access_spec.rb +++ b/spec/features/projects/members/user_requests_access_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Members > User requests access', :js, feature_category: :subgroups do +RSpec.describe 'Projects > Members > User requests access', :js, feature_category: :groups_and_projects do include Spec::Support::Helpers::ModalHelpers let_it_be(:user) { create(:user) } diff --git a/spec/features/projects/merge_request_button_spec.rb b/spec/features/projects/merge_request_button_spec.rb index 56aee469252..6d6d850342a 100644 --- a/spec/features/projects/merge_request_button_spec.rb +++ b/spec/features/projects/merge_request_button_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Merge Request button', feature_category: :projects do +RSpec.describe 'Merge Request button', feature_category: :groups_and_projects do include ProjectForksHelper let_it_be(:user) { create(:user) } @@ -50,10 +50,17 @@ RSpec.describe 'Merge Request button', feature_category: :projects do end it 'does not show Create merge request button' do + href = project_new_merge_request_path( + project, + merge_request: { + source_branch: 'feature' + }.merge(extra_mr_params) + ) + visit url within('#content-body') do - expect(page).not_to have_link(label) + expect(page).not_to have_link(label, href: href) end end end @@ -105,7 +112,7 @@ RSpec.describe 'Merge Request button', feature_category: :projects do context 'on branches page' do it_behaves_like 'Merge request button only shown when allowed' do - let(:label) { 'Merge request' } + let(:label) { 'New' } let(:url) { project_branches_filtered_path(project, state: 'all', search: 'feature') } let(:fork_url) { project_branches_filtered_path(forked_project, state: 'all', search: 'feature') } end diff --git a/spec/features/projects/milestones/milestone_showing_spec.rb b/spec/features/projects/milestones/milestone_showing_spec.rb new file mode 100644 index 00000000000..b68f569221a --- /dev/null +++ b/spec/features/projects/milestones/milestone_showing_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Project milestone', :js, feature_category: :team_planning do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, namespace: user.namespace) } + + let(:milestone) { create(:milestone, project: project) } + + before do + sign_in(user) + end + + it_behaves_like 'milestone with interactive markdown task list items in description' do + let(:milestone_path) { project_milestone_path(project, milestone) } + end +end diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb index 532dd7d0a84..97dfeb6fd06 100644 --- a/spec/features/projects/navbar_spec.rb +++ b/spec/features/projects/navbar_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project navbar', :with_license, feature_category: :projects do +RSpec.describe 'Project navbar', :with_license, feature_category: :groups_and_projects do include NavbarStructureHelper include WaitForRequests @@ -20,7 +20,6 @@ RSpec.describe 'Project navbar', :with_license, feature_category: :projects do stub_config(registry: { enabled: false }) stub_feature_flags(harbor_registry_integration: false) stub_feature_flags(ml_experiment_tracking: false) - stub_feature_flags(remove_monitor_metrics: false) insert_package_nav(_('Deployments')) insert_infrastructure_registry_nav insert_infrastructure_google_cloud_nav diff --git a/spec/features/projects/network_graph_spec.rb b/spec/features/projects/network_graph_spec.rb index af976b8ffb0..eff0335c891 100644 --- a/spec/features/projects/network_graph_spec.rb +++ b/spec/features/projects/network_graph_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Network Graph', :js, feature_category: :projects do +RSpec.describe 'Project Network Graph', :js, feature_category: :groups_and_projects do let(:user) { create :user } let(:project) { create :project, :repository, namespace: user.namespace } let(:ref_selector) { '.ref-selector' } diff --git a/spec/features/projects/new_project_from_template_spec.rb b/spec/features/projects/new_project_from_template_spec.rb index 97304840010..8e2016ce17e 100644 --- a/spec/features/projects/new_project_from_template_spec.rb +++ b/spec/features/projects/new_project_from_template_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'New project from template', :js, feature_category: :projects do +RSpec.describe 'New project from template', :js, feature_category: :groups_and_projects do let(:user) { create(:user) } before do diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index 351662af217..d05b7649f94 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'New project', :js, feature_category: :projects do +RSpec.describe 'New project', :js, feature_category: :groups_and_projects do include Features::TopNavSpecHelpers before do @@ -99,7 +99,6 @@ RSpec.describe 'New project', :js, feature_category: :projects do context 'when the new navigation is enabled' do before do user.update!(use_new_navigation: true) - stub_feature_flags(super_sidebar_nav: true) end include_examples '"New project" page' diff --git a/spec/features/projects/package_files_spec.rb b/spec/features/projects/package_files_spec.rb index 824b57db7ad..540ad745610 100644 --- a/spec/features/projects/package_files_spec.rb +++ b/spec/features/projects/package_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'PackageFiles', feature_category: :projects do +RSpec.describe 'PackageFiles', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project) } let!(:package) { create(:maven_package, project: project) } diff --git a/spec/features/projects/packages_spec.rb b/spec/features/projects/packages_spec.rb index 5d3ebd8bec6..5073c147b6c 100644 --- a/spec/features/projects/packages_spec.rb +++ b/spec/features/projects/packages_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Packages', feature_category: :projects do +RSpec.describe 'Packages', feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/features/projects/pipeline_schedules_spec.rb b/spec/features/projects/pipeline_schedules_spec.rb index 81e003d7d1c..358c55376d4 100644 --- a/spec/features/projects/pipeline_schedules_spec.rb +++ b/spec/features/projects/pipeline_schedules_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Pipeline Schedules', :js, feature_category: :projects do +RSpec.describe 'Pipeline Schedules', :js, feature_category: :groups_and_projects do include Spec::Support::Helpers::ModalHelpers let!(:project) { create(:project, :repository) } @@ -413,8 +413,8 @@ RSpec.describe 'Pipeline Schedules', :js, feature_category: :projects do end def select_timezone - find('[data-testid="schedule-timezone"] .dropdown-toggle').click - find("button", text: "Arizona").click + find('[data-testid="schedule-timezone"] .gl-new-dropdown-toggle').click + find("li", text: "Arizona").click end def select_target_branch diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb index 7167581eedf..abc9e3d30fc 100644 --- a/spec/features/projects/pipelines/pipeline_spec.rb +++ b/spec/features/projects/pipelines/pipeline_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Pipeline', :js, feature_category: :projects do +RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do include RoutesHelpers include ProjectForksHelper include ::ExclusiveLeaseHelpers @@ -13,6 +13,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :projects do let(:role) { :developer } before do + stub_feature_flags(pipeline_details_header_vue: false) sign_in(user) project.add_role(user, role) end diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index d3ccde3d2e1..441f39e6999 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: :projects do +RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do include ListboxHelpers include ProjectForksHelper include Spec::Support::Helpers::ModalHelpers @@ -10,6 +10,10 @@ RSpec.describe 'Pipelines', :js, feature_category: :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) } @@ -116,7 +120,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do it 'indicates that pipeline can be canceled' do expect(page).to have_selector('.js-pipelines-cancel-button') - expect(page).to have_selector('.ci-running') + expect(page).to have_selector('[data-testid="ci-badge-running"]') end context 'when canceling' do @@ -128,7 +132,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do it 'indicated that pipelines was canceled', :sidekiq_might_not_need_inline do expect(page).not_to have_selector('.js-pipelines-cancel-button') - expect(page).to have_selector('.ci-canceled') + expect(page).to have_selector('[data-testid="ci-badge-canceled"]') end end end @@ -146,7 +150,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do it 'indicates that pipeline can be retried' do expect(page).to have_selector('.js-pipelines-retry-button') - expect(page).to have_selector('.ci-failed') + expect(page).to have_selector('[data-testid="ci-badge-failed"]') end context 'when retrying' do @@ -157,7 +161,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do it 'shows running pipeline that is not retryable' do expect(page).not_to have_selector('.js-pipelines-retry-button') - expect(page).to have_selector('.ci-running') + expect(page).to have_selector('[data-testid="ci-badge-running"]') end end end @@ -396,7 +400,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do end it 'shows the pipeline as preparing' do - expect(page).to have_selector('.ci-preparing') + expect(page).to have_selector('[data-testid="ci-badge-preparing"]') end end @@ -417,7 +421,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do end it 'has pipeline running' do - expect(page).to have_selector('.ci-running') + expect(page).to have_selector('[data-testid="ci-badge-running"]') end context 'when canceling' do @@ -428,7 +432,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do it 'indicates that pipeline was canceled', :sidekiq_might_not_need_inline do expect(page).not_to have_selector('.js-pipelines-cancel-button') - expect(page).to have_selector('.ci-canceled') + expect(page).to have_selector('[data-testid="ci-badge-canceled"]') end end end @@ -450,7 +454,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do end it 'has failed pipeline', :sidekiq_might_not_need_inline do - expect(page).to have_selector('.ci-failed') + expect(page).to have_selector('[data-testid="ci-badge-failed"]') end end end @@ -605,17 +609,17 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do wait_for_requests end - it 'changes the Pipeline ID column for Pipeline IID' do - page.find('[data-testid="pipeline-key-collapsible-box"]').click + it 'changes the Pipeline ID column link to Pipeline IID and persists', :aggregate_failures do + expect(page).to have_link(text: "##{pipeline.id}") - within '.gl-new-dropdown-contents' do - dropdown_options = page.find_all '.gl-new-dropdown-item' + select_from_listbox('Show Pipeline IID', from: 'Show Pipeline ID') - dropdown_options[1].click - end + expect(page).to have_link(text: "##{pipeline.iid}") + + visit project_pipelines_path(project) + wait_for_requests - expect(page.find('[data-testid="pipeline-th"]')).to have_content 'Pipeline' - expect(page.find('[data-testid="pipeline-url-link"]')).to have_content "##{pipeline.iid}" + expect(page).to have_link(text: "##{pipeline.iid}") end end end @@ -686,7 +690,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :projects do click_button project.default_branch wait_for_requests - find('.gl-new-dropdown-item', text: '2-mb-file').click + find('.gl-new-dropdown-item', text: 'spooky-stuff').click wait_for_requests end diff --git a/spec/features/projects/raw/user_interacts_with_raw_endpoint_spec.rb b/spec/features/projects/raw/user_interacts_with_raw_endpoint_spec.rb index fb7814285b8..0cc105353f5 100644 --- a/spec/features/projects/raw/user_interacts_with_raw_endpoint_spec.rb +++ b/spec/features/projects/raw/user_interacts_with_raw_endpoint_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Raw > User interacts with raw endpoint', feature_category: :projects do +RSpec.describe 'Projects > Raw > User interacts with raw endpoint', feature_category: :groups_and_projects do include RepoHelpers let(:user) { create(:user) } diff --git a/spec/features/projects/releases/user_views_releases_spec.rb b/spec/features/projects/releases/user_views_releases_spec.rb index 0a4075be02f..d0111d0b9c8 100644 --- a/spec/features/projects/releases/user_views_releases_spec.rb +++ b/spec/features/projects/releases/user_views_releases_spec.rb @@ -24,6 +24,17 @@ RSpec.describe 'User views releases', :js, feature_category: :continuous_deliver stub_default_url_options(host: 'localhost') end + shared_examples 'when the project does not have releases' do + before do + project.releases.delete_all + visit project_releases_path(project) + end + + it 'sees an empty state' do + expect(page).to have_selector('[data-testid="gl-empty-state-content"]') + end + end + context('when the user is a maintainer') do before do sign_in(maintainer) @@ -110,6 +121,8 @@ RSpec.describe 'User views releases', :js, feature_category: :continuous_deliver it_behaves_like 'releases sort order' end end + + it_behaves_like 'when the project does not have releases' end context('when the user is a guest') do @@ -130,5 +143,7 @@ RSpec.describe 'User views releases', :js, feature_category: :continuous_deliver expect(page).not_to have_content(release_v3.commit.short_id) end end + + it_behaves_like 'when the project does not have releases' end end diff --git a/spec/features/projects/remote_mirror_spec.rb b/spec/features/projects/remote_mirror_spec.rb index aa0c1ead4c0..4f27ba04f37 100644 --- a/spec/features/projects/remote_mirror_spec.rb +++ b/spec/features/projects/remote_mirror_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project remote mirror', :feature, feature_category: :projects do +RSpec.describe 'Project remote mirror', :feature, feature_category: :groups_and_projects do let(:project) { create(:project, :repository, :remote_mirror) } let(:remote_mirror) { project.remote_mirrors.first } let(:user) { create(:user) } diff --git a/spec/features/projects/settings/branch_names_settings_spec.rb b/spec/features/projects/settings/branch_names_settings_spec.rb index 5d82dff1efd..cc7396513cb 100644 --- a/spec/features/projects/settings/branch_names_settings_spec.rb +++ b/spec/features/projects/settings/branch_names_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project settings > repositories > Branch names', :js, feature_category: :projects do +RSpec.describe 'Project settings > repositories > Branch names', :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project, :public) } let(:user) { create(:user) } diff --git a/spec/features/projects/settings/branch_rules_settings_spec.rb b/spec/features/projects/settings/branch_rules_settings_spec.rb index 59609fecd93..5ef80521401 100644 --- a/spec/features/projects/settings/branch_rules_settings_spec.rb +++ b/spec/features/projects/settings/branch_rules_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Repository > Branch rules settings', feature_category: :projects do +RSpec.describe 'Projects > Settings > Repository > Branch rules settings', feature_category: :groups_and_projects do let(:project) { create(:project_empty_repo) } let(:user) { create(:user) } let(:role) { :developer } @@ -45,14 +45,5 @@ RSpec.describe 'Projects > Settings > Repository > Branch rules settings', featu expect(page).to have_content('Branch rules') end end - - context 'branch_rules feature flag disabled' do - it 'does not render branch rules content' do - stub_feature_flags(branch_rules: false) - request - - expect(page).to have_gitlab_http_status(:not_found) - end - end end end 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 a99fd5f9788..4a56e6c8bbf 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: :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/forked_project_settings_spec.rb b/spec/features/projects/settings/forked_project_settings_spec.rb index 6b646bcf7d3..c2a5b36a81b 100644 --- a/spec/features/projects/settings/forked_project_settings_spec.rb +++ b/spec/features/projects/settings/forked_project_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > For a forked project', :js, feature_category: :projects do +RSpec.describe 'Projects > Settings > For a forked project', :js, feature_category: :groups_and_projects do include ProjectForksHelper let(:user) { create(:user) } let(:original_project) { create(:project) } diff --git a/spec/features/projects/settings/lfs_settings_spec.rb b/spec/features/projects/settings/lfs_settings_spec.rb index 1695b49830d..bc5efecfe0d 100644 --- a/spec/features/projects/settings/lfs_settings_spec.rb +++ b/spec/features/projects/settings/lfs_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > LFS settings', feature_category: :projects do +RSpec.describe 'Projects > Settings > LFS settings', feature_category: :groups_and_projects do let(:project) { create(:project) } let(:user) { create(:user) } let(:role) { :maintainer } diff --git a/spec/features/projects/settings/merge_requests_settings_spec.rb b/spec/features/projects/settings/merge_requests_settings_spec.rb index ca90817b0a4..8b5f9b67890 100644 --- a/spec/features/projects/settings/merge_requests_settings_spec.rb +++ b/spec/features/projects/settings/merge_requests_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Merge requests', feature_category: :projects do +RSpec.describe 'Projects > Settings > Merge requests', feature_category: :groups_and_projects do include ProjectForksHelper let(:user) { create(:user) } @@ -98,6 +98,36 @@ RSpec.describe 'Projects > Settings > Merge requests', feature_category: :projec end end + describe 'With the fast_forward_merge_trains_support feature flag turned off' do + before do + sign_in(user) + stub_feature_flags(fast_forward_merge_trains_support: false) + + visit(project_settings_merge_requests_path(project)) + end + + it 'does not display the fast forward merge train message' do + page.within '.merge-request-settings-form' do + expect(page).not_to have_content 'merging is only possible if the branch can be rebased without conflicts.' + end + end + end + + describe 'With the fast_forward_merge_trains_support feature flag turned on' do + before do + sign_in(user) + stub_feature_flags(fast_forward_merge_trains_support: true) + + visit(project_settings_merge_requests_path(project)) + end + + it 'displays the fast forward merge train message' do + page.within '.merge-request-settings-form' do + expect(page).to have_content 'merging is only possible if the branch can be rebased without conflicts.' + end + end + end + context 'when Merge Request are initially disabled', :js do before do project.project_feature.update_attribute('merge_requests_access_level', ProjectFeature::DISABLED) diff --git a/spec/features/projects/settings/monitor_settings_spec.rb b/spec/features/projects/settings/monitor_settings_spec.rb index 1367ffb0009..c5a5826a778 100644 --- a/spec/features/projects/settings/monitor_settings_spec.rb +++ b/spec/features/projects/settings/monitor_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > For a forked project', :js, feature_category: :projects do +RSpec.describe 'Projects > Settings > For a forked project', :js, feature_category: :groups_and_projects do include ListboxHelpers let_it_be(:project) { create(:project, :repository, create_templates: :issue) } @@ -11,7 +11,6 @@ RSpec.describe 'Projects > Settings > For a forked project', :js, feature_catego before do sign_in(user) - stub_feature_flags(remove_monitor_metrics: false) end describe 'Sidebar > Monitor' do @@ -19,8 +18,8 @@ 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="Monitor"]', - text: 'Monitor', visible: :hidden) + expect(page).to have_selector('.sidebar-sub-level-items a[aria-label="Error Tracking"]', + text: 'Error Tracking', visible: :hidden) end end @@ -192,30 +191,5 @@ RSpec.describe 'Projects > Settings > For a forked project', :js, feature_catego end end end - - describe 'grafana integration settings form' do - it 'successfully fills and completes the form' do - visit project_settings_operations_path(project) - - wait_for_requests - - within '.js-grafana-integration' do - click_button('Expand') - end - - expect(page).to have_content('Grafana URL') - expect(page).to have_content('API token') - expect(page).to have_button('Save changes') - - fill_in('grafana-url', with: 'http://gitlab-test.grafana.net') - fill_in('grafana-token', with: 'token') - - click_button('Save changes') - - wait_for_requests - - assert_text('Your changes have been saved') - end - end end end diff --git a/spec/features/projects/settings/packages_settings_spec.rb b/spec/features/projects/settings/packages_settings_spec.rb index bf5c779b109..564a71e9a23 100644 --- a/spec/features/projects/settings/packages_settings_spec.rb +++ b/spec/features/projects/settings/packages_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Packages', :js, feature_category: :projects do +RSpec.describe 'Projects > Settings > Packages', :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project) } let(:user) { project.first_owner } diff --git a/spec/features/projects/settings/pipelines_settings_spec.rb b/spec/features/projects/settings/pipelines_settings_spec.rb index 51858ddf8c5..ef1c03f4f27 100644 --- a/spec/features/projects/settings/pipelines_settings_spec.rb +++ b/spec/features/projects/settings/pipelines_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Projects > Settings > Pipelines settings", feature_category: :projects do +RSpec.describe "Projects > Settings > Pipelines settings", feature_category: :groups_and_projects do let(:project) { create(:project) } let(:user) { create(:user) } let(:role) { :developer } diff --git a/spec/features/projects/settings/project_badges_spec.rb b/spec/features/projects/settings/project_badges_spec.rb index f4c2265c2c2..1f170300155 100644 --- a/spec/features/projects/settings/project_badges_spec.rb +++ b/spec/features/projects/settings/project_badges_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Badges', feature_category: :projects do +RSpec.describe 'Project Badges', feature_category: :groups_and_projects do include WaitForRequests let(:user) { create(:user) } diff --git a/spec/features/projects/settings/project_settings_spec.rb b/spec/features/projects/settings/project_settings_spec.rb index 46a41cfc6f1..1c1bbc7e85c 100644 --- a/spec/features/projects/settings/project_settings_spec.rb +++ b/spec/features/projects/settings/project_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects settings', feature_category: :projects do +RSpec.describe 'Projects settings', feature_category: :groups_and_projects do let_it_be(:project) { create(:project) } let(:user) { project.first_owner } 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 bdfe6a06dd1..50693dda685 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: :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 68e9b0225ea..b8016a5d2df 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: :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 08abade7d18..2439e624dd6 100644 --- a/spec/features/projects/settings/repository_settings_spec.rb +++ b/spec/features/projects/settings/repository_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Repository settings', feature_category: :projects do +RSpec.describe 'Projects > Settings > Repository settings', feature_category: :groups_and_projects do include Features::MirroringHelpers let(:project) { create(:project_empty_repo) } @@ -10,7 +10,6 @@ RSpec.describe 'Projects > Settings > Repository settings', feature_category: :p let(:role) { :developer } before do - stub_feature_flags(branch_rules: false) stub_feature_flags(mirror_only_branches_match_regex: false) project.add_role(user, role) sign_in(user) @@ -43,15 +42,7 @@ RSpec.describe 'Projects > Settings > Repository settings', feature_category: :p end context 'Branch rules', :js do - context 'branch_rules feature flag disabled', :js do - it 'does not render branch rules settings' do - visit project_settings_repository_path(project) - expect(page).not_to have_content('Branch rules') - end - end - it 'renders branch rules settings' do - stub_feature_flags(branch_rules: true) visit project_settings_repository_path(project) expect(page).to have_content('Branch rules') end diff --git a/spec/features/projects/settings/secure_files_spec.rb b/spec/features/projects/settings/secure_files_spec.rb index 9afe1f4de54..7ff1a5f3568 100644 --- a/spec/features/projects/settings/secure_files_spec.rb +++ b/spec/features/projects/settings/secure_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Secure Files', :js, feature_category: :projects do +RSpec.describe 'Secure Files', :js, feature_category: :groups_and_projects do let(:project) { create(:project) } let(:user) { create(:user) } @@ -12,6 +12,17 @@ RSpec.describe 'Secure Files', :js, feature_category: :projects do sign_in(user) end + context 'when disabled at the instance level' do + before do + stub_config(ci_secure_files: { enabled: false }) + end + + it 'does not show the secure files settings' do + visit project_settings_ci_cd_path(project) + expect(page).not_to have_content('Secure Files') + end + end + context 'authenticated user with admin permissions' do it 'shows the secure files settings' do visit project_settings_ci_cd_path(project) diff --git a/spec/features/projects/settings/service_desk_setting_spec.rb b/spec/features/projects/settings/service_desk_setting_spec.rb index 74139aa0d7f..c18da56f3ee 100644 --- a/spec/features/projects/settings/service_desk_setting_spec.rb +++ b/spec/features/projects/settings/service_desk_setting_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_category: :projects do +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) } let(:presenter) { project.present(current_user: user) } let(:user) { create(:user) } diff --git a/spec/features/projects/settings/slack_application_spec.rb b/spec/features/projects/settings/slack_application_spec.rb new file mode 100644 index 00000000000..79291094aae --- /dev/null +++ b/spec/features/projects/settings/slack_application_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Slack application', :js, feature_category: :integrations do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user, maintainer_projects: [project]) } + let_it_be(:integration) { create(:gitlab_slack_application_integration, project: project) } + let(:slack_application_form_path) { edit_project_settings_integration_path(project, integration) } + + before do + stub_application_setting(slack_app_enabled: true) + + gitlab_sign_in(user) + end + + it 'I can edit slack integration' do + visit slack_application_form_path + + within '[data-testid="integration-settings-form"]' do + click_link 'Edit' + end + + fill_in 'slack_integration_alias', with: 'alias-edited' + click_button 'Save changes' + + expect(page).to have_content('The project alias was updated successfully') + + within '[data-testid="integration-settings-form"]' do + expect(page).to have_content('alias-edited') + end + end + + it 'shows the trigger form fields' do + visit slack_application_form_path + + expect(page).to have_selector('[data-testid="trigger-fields-group"]') + end + + context 'when the integration is disabled' do + before do + integration.update!(active: false) + end + + it 'does not show the trigger form fields' do + expect(page).not_to have_selector('[data-testid="trigger-fields-group"]') + end + end +end diff --git a/spec/features/projects/settings/user_archives_project_spec.rb b/spec/features/projects/settings/user_archives_project_spec.rb index a6aac02d272..e4a5249c678 100644 --- a/spec/features/projects/settings/user_archives_project_spec.rb +++ b/spec/features/projects/settings/user_archives_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User archives a project', feature_category: :projects do +RSpec.describe 'Projects > Settings > User archives a project', feature_category: :groups_and_projects do let(:user) { create(:user) } before do diff --git a/spec/features/projects/settings/user_changes_avatar_spec.rb b/spec/features/projects/settings/user_changes_avatar_spec.rb index 87043aec9b6..c589366d3df 100644 --- a/spec/features/projects/settings/user_changes_avatar_spec.rb +++ b/spec/features/projects/settings/user_changes_avatar_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User changes avatar', feature_category: :projects do +RSpec.describe 'Projects > Settings > User changes avatar', feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { project.creator } diff --git a/spec/features/projects/settings/user_changes_default_branch_spec.rb b/spec/features/projects/settings/user_changes_default_branch_spec.rb index 67ba16a2716..5886699a192 100644 --- a/spec/features/projects/settings/user_changes_default_branch_spec.rb +++ b/spec/features/projects/settings/user_changes_default_branch_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User changes default branch', feature_category: :projects do +RSpec.describe 'Projects > Settings > User changes default branch', feature_category: :groups_and_projects do include ListboxHelpers let(:user) { create(:user) } diff --git a/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb b/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb index 3a58de9aa7d..0006762a971 100644 --- a/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb +++ b/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe "User interacts with deploy keys", :js, feature_category: :projects do +RSpec.describe "User interacts with deploy keys", :js, feature_category: :groups_and_projects do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } diff --git a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb index cfefdd54c23..1189f5590f8 100644 --- a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb +++ b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe 'Projects > Settings > User manages merge request settings', feature_category: :projects do +RSpec.describe 'Projects > Settings > User manages merge request settings', feature_category: :groups_and_projects do include ProjectForksHelper let(:user) { create(:user) } diff --git a/spec/features/projects/settings/user_manages_project_members_spec.rb b/spec/features/projects/settings/user_manages_project_members_spec.rb index b7463537fb2..df571e13979 100644 --- a/spec/features/projects/settings/user_manages_project_members_spec.rb +++ b/spec/features/projects/settings/user_manages_project_members_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User manages project members', feature_category: :projects do +RSpec.describe 'Projects > Settings > User manages project members', feature_category: :groups_and_projects do include Features::MembersHelpers include Spec::Support::Helpers::ModalHelpers include ListboxHelpers diff --git a/spec/features/projects/settings/user_renames_a_project_spec.rb b/spec/features/projects/settings/user_renames_a_project_spec.rb index a6b72e7a297..5a58c049601 100644 --- a/spec/features/projects/settings/user_renames_a_project_spec.rb +++ b/spec/features/projects/settings/user_renames_a_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User renames a project', feature_category: :projects do +RSpec.describe 'Projects > Settings > User renames a project', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, namespace: user.namespace, path: 'gitlab', name: 'sample') } 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 923a6a10671..f0ef4a285ad 100644 --- a/spec/features/projects/settings/user_searches_in_settings_spec.rb +++ b/spec/features/projects/settings/user_searches_in_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User searches project settings', :js, feature_category: :projects do +RSpec.describe 'User searches project settings', :js, feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :repository, namespace: user.namespace, pages_https_only: false) } diff --git a/spec/features/projects/settings/user_sees_revoke_deploy_token_modal_spec.rb b/spec/features/projects/settings/user_sees_revoke_deploy_token_modal_spec.rb index 65aed4fd06f..1bc5af39f12 100644 --- a/spec/features/projects/settings/user_sees_revoke_deploy_token_modal_spec.rb +++ b/spec/features/projects/settings/user_sees_revoke_deploy_token_modal_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Repository Settings > User sees revoke deploy token modal', :js, feature_category: :projects do +RSpec.describe 'Repository Settings > User sees revoke deploy token modal', :js, feature_category: :groups_and_projects do let(:project) { create(:project, :public, :repository) } let(:user) { project.creator } let(:role) { :developer } diff --git a/spec/features/projects/settings/user_tags_project_spec.rb b/spec/features/projects/settings/user_tags_project_spec.rb index 43e8e5a2d38..6b616b4abed 100644 --- a/spec/features/projects/settings/user_tags_project_spec.rb +++ b/spec/features/projects/settings/user_tags_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User tags a project', :js, feature_category: :projects do +RSpec.describe 'Projects > Settings > User tags a project', :js, feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, namespace: user.namespace) } let!(:topic) { create(:topic, name: 'topic1') } diff --git a/spec/features/projects/settings/user_transfers_a_project_spec.rb b/spec/features/projects/settings/user_transfers_a_project_spec.rb index 53b4ee881f9..97871eed296 100644 --- a/spec/features/projects/settings/user_transfers_a_project_spec.rb +++ b/spec/features/projects/settings/user_transfers_a_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User transfers a project', :js, feature_category: :projects do +RSpec.describe 'Projects > Settings > User transfers a project', :js, feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, :repository, namespace: user.namespace) } let(:group) { create(:group) } diff --git a/spec/features/projects/settings/visibility_settings_spec.rb b/spec/features/projects/settings/visibility_settings_spec.rb index 5246eda976b..7d41b60199c 100644 --- a/spec/features/projects/settings/visibility_settings_spec.rb +++ b/spec/features/projects/settings/visibility_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Visibility settings', :js, feature_category: :projects do +RSpec.describe 'Projects > Settings > Visibility settings', :js, feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, namespace: user.namespace, visibility_level: 20) } diff --git a/spec/features/projects/settings/webhooks_settings_spec.rb b/spec/features/projects/settings/webhooks_settings_spec.rb index e527d0c9c74..5d345c63d60 100644 --- a/spec/features/projects/settings/webhooks_settings_spec.rb +++ b/spec/features/projects/settings/webhooks_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :projects do +RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :groups_and_projects do let(:project) { create(:project) } let(:user) { create(:user) } let(:webhooks_path) { project_hooks_path(project) } diff --git a/spec/features/projects/show/clone_button_spec.rb b/spec/features/projects/show/clone_button_spec.rb index 48af4bf8277..e3964a37bcf 100644 --- a/spec/features/projects/show/clone_button_spec.rb +++ b/spec/features/projects/show/clone_button_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > Clone button', feature_category: :projects do +RSpec.describe 'Projects > Show > Clone button', feature_category: :groups_and_projects do let_it_be(:admin) { create(:admin) } let_it_be(:guest) { create(:user) } let_it_be(:project) { create(:project, :private, :in_group, :repository) } diff --git a/spec/features/projects/show/download_buttons_spec.rb b/spec/features/projects/show/download_buttons_spec.rb index e4d50daa6f4..a4df6a56e02 100644 --- a/spec/features/projects/show/download_buttons_spec.rb +++ b/spec/features/projects/show/download_buttons_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > Download buttons', feature_category: :projects do +RSpec.describe 'Projects > Show > Download buttons', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:role) { :developer } let(:status) { 'success' } diff --git a/spec/features/projects/show/no_password_spec.rb b/spec/features/projects/show/no_password_spec.rb index 9ead729af83..ff32f779c95 100644 --- a/spec/features/projects/show/no_password_spec.rb +++ b/spec/features/projects/show/no_password_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'No Password Alert', feature_category: :projects do +RSpec.describe 'No Password Alert', feature_category: :groups_and_projects do let_it_be(:message_password_auth_enabled) { 'Your account is authenticated with SSO or SAML. To push and pull over HTTP with Git using this account, you must set a password or set up a Personal Access Token to use instead of a password. For more information, see Clone with HTTPS.' } let_it_be(:message_password_auth_disabled) { 'Your account is authenticated with SSO or SAML. To push and pull over HTTP with Git using this account, you must set up a Personal Access Token to use instead of a password. For more information, see Clone with HTTPS.' } diff --git a/spec/features/projects/show/redirects_spec.rb b/spec/features/projects/show/redirects_spec.rb index d1cb896450f..ef326b92b98 100644 --- a/spec/features/projects/show/redirects_spec.rb +++ b/spec/features/projects/show/redirects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > Redirects', feature_category: :projects do +RSpec.describe 'Projects > Show > Redirects', feature_category: :groups_and_projects do let(:user) { create :user } let(:public_project) { create :project, :public } let(:private_project) { create :project, :private } diff --git a/spec/features/projects/show/rss_spec.rb b/spec/features/projects/show/rss_spec.rb index c2e8a844094..f57bb5e8df3 100644 --- a/spec/features/projects/show/rss_spec.rb +++ b/spec/features/projects/show/rss_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > RSS', feature_category: :projects do +RSpec.describe 'Projects > Show > RSS', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, :repository, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } let(:path) { project_path(project) } diff --git a/spec/features/projects/show/schema_markup_spec.rb b/spec/features/projects/show/schema_markup_spec.rb index 8262245c5cb..5c1b519bb6e 100644 --- a/spec/features/projects/show/schema_markup_spec.rb +++ b/spec/features/projects/show/schema_markup_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > Schema Markup', feature_category: :projects do +RSpec.describe 'Projects > Show > Schema Markup', feature_category: :groups_and_projects do let_it_be(:project) { create(:project, :repository, :public, :with_avatar, description: 'foobar', topic_list: 'topic1, topic2') } it 'shows SoftwareSourceCode structured markup', :js 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 2f33622d218..997a804e6ac 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: :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_interacts_with_stars_spec.rb b/spec/features/projects/show/user_interacts_with_stars_spec.rb index e2166854ba3..e231068cad0 100644 --- a/spec/features/projects/show/user_interacts_with_stars_spec.rb +++ b/spec/features/projects/show/user_interacts_with_stars_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > User interacts with project stars', feature_category: :projects do +RSpec.describe 'Projects > Show > User interacts with project stars', feature_category: :groups_and_projects do let(:project) { create(:project, :public, :repository) } context 'when user is signed in', :js do diff --git a/spec/features/projects/show/user_manages_notifications_spec.rb b/spec/features/projects/show/user_manages_notifications_spec.rb index 8f6535fd4f0..455b931e7f3 100644 --- a/spec/features/projects/show/user_manages_notifications_spec.rb +++ b/spec/features/projects/show/user_manages_notifications_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > User manages notifications', :js, feature_category: :projects do +RSpec.describe 'Projects > Show > User manages notifications', :js, feature_category: :groups_and_projects do let(:project) { create(:project, :public, :repository) } before do 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 145500a4c63..29fb20841fd 100644 --- a/spec/features/projects/show/user_sees_collaboration_links_spec.rb +++ b/spec/features/projects/show/user_sees_collaboration_links_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > Collaboration links', :js, feature_category: :projects do +RSpec.describe 'Projects > Show > Collaboration links', :js, feature_category: :groups_and_projects do using RSpec::Parameterized::TableSyntax let_it_be(:project) { create(:project, :repository, :public) } @@ -51,7 +51,8 @@ RSpec.describe 'Projects > Show > Collaboration links', :js, feature_category: : end # The Web IDE - expect(page).to have_link('Web IDE') + click_button 'Edit' + expect(page).to have_button('Web IDE') end it 'hides the links when the project is archived' do @@ -73,7 +74,7 @@ RSpec.describe 'Projects > Show > Collaboration links', :js, feature_category: : expect(page).not_to have_selector('[data-testid="add-to-tree"]') - expect(page).not_to have_link('Web IDE') + expect(page).not_to have_button('Edit') end end @@ -95,7 +96,7 @@ RSpec.describe 'Projects > Show > Collaboration links', :js, feature_category: : end it "updates Web IDE link" do - expect(page.has_link?('Web IDE')).to be(expect_ide_link) + expect(page.has_button?('Edit')).to be(expect_ide_link) end end end diff --git a/spec/features/projects/show/user_sees_deletion_failure_message_spec.rb b/spec/features/projects/show/user_sees_deletion_failure_message_spec.rb index 876eecfe559..0cc8919d1e9 100644 --- a/spec/features/projects/show/user_sees_deletion_failure_message_spec.rb +++ b/spec/features/projects/show/user_sees_deletion_failure_message_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > User sees a deletion failure message', feature_category: :projects do +RSpec.describe 'Projects > Show > User sees a deletion failure message', feature_category: :groups_and_projects do let(:project) { create(:project, :empty_repo, pending_delete: true) } before do diff --git a/spec/features/projects/show/user_sees_git_instructions_spec.rb b/spec/features/projects/show/user_sees_git_instructions_spec.rb index 022f21f198d..5e6857843a6 100644 --- a/spec/features/projects/show/user_sees_git_instructions_spec.rb +++ b/spec/features/projects/show/user_sees_git_instructions_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > User sees Git instructions', feature_category: :projects do +RSpec.describe 'Projects > Show > User sees Git instructions', feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } before do @@ -26,7 +26,7 @@ RSpec.describe 'Projects > Show > User sees Git instructions', feature_category: expect(page).to have_content('Command line instructions') end - expect(page).to have_content("git push -u origin master") + expect(page).to have_content("git push --set-upstream origin master") end end @@ -84,7 +84,7 @@ RSpec.describe 'Projects > Show > User sees Git instructions', feature_category: it "recommends default_branch_name instead of master" do click_link 'Create empty repository' - expect(page).to have_content("git push -u origin example_branch") + expect(page).to have_content("git push --set-upstream origin example_branch") end end diff --git a/spec/features/projects/show/user_sees_last_commit_ci_status_spec.rb b/spec/features/projects/show/user_sees_last_commit_ci_status_spec.rb index 25d241f004e..70e316983d9 100644 --- a/spec/features/projects/show/user_sees_last_commit_ci_status_spec.rb +++ b/spec/features/projects/show/user_sees_last_commit_ci_status_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > User sees last commit CI status', feature_category: :projects do +RSpec.describe 'Projects > Show > User sees last commit CI status', feature_category: :groups_and_projects do let_it_be(:project) { create(:project, :repository, :public) } it 'shows the project README', :js do diff --git a/spec/features/projects/show/user_sees_readme_spec.rb b/spec/features/projects/show/user_sees_readme_spec.rb index a8c91b30f25..36fa800a7cf 100644 --- a/spec/features/projects/show/user_sees_readme_spec.rb +++ b/spec/features/projects/show/user_sees_readme_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > User sees README', feature_category: :projects do +RSpec.describe 'Projects > Show > User sees README', feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :repository, :public) } diff --git a/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb b/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb index 9eb2d109829..41eab966895 100644 --- a/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb +++ b/spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > User sees setup shortcut buttons', feature_category: :projects do +RSpec.describe 'Projects > Show > User sees setup shortcut buttons', feature_category: :groups_and_projects do # For "New file", "Add license" functionality, # see spec/features/projects/files/project_owner_creates_license_file_spec.rb # see spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb diff --git a/spec/features/projects/show/user_uploads_files_spec.rb b/spec/features/projects/show/user_uploads_files_spec.rb index ed378040ce9..5dde415151b 100644 --- a/spec/features/projects/show/user_uploads_files_spec.rb +++ b/spec/features/projects/show/user_uploads_files_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Show > User uploads files', feature_category: :projects do +RSpec.describe 'Projects > Show > User uploads files', feature_category: :groups_and_projects do include DropzoneHelper let(:user) { create(:user) } diff --git a/spec/features/projects/sourcegraph_csp_spec.rb b/spec/features/projects/sourcegraph_csp_spec.rb index 4c8dd0a7df0..0e1a0c897e8 100644 --- a/spec/features/projects/sourcegraph_csp_spec.rb +++ b/spec/features/projects/sourcegraph_csp_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Sourcegraph Content Security Policy', feature_category: :projects do +RSpec.describe 'Sourcegraph Content Security Policy', feature_category: :groups_and_projects do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :repository, namespace: user.namespace) } diff --git a/spec/features/projects/sub_group_issuables_spec.rb b/spec/features/projects/sub_group_issuables_spec.rb index 2502d969305..601f88708f4 100644 --- a/spec/features/projects/sub_group_issuables_spec.rb +++ b/spec/features/projects/sub_group_issuables_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Subgroup Issuables', :js, feature_category: :projects do +RSpec.describe 'Subgroup Issuables', :js, feature_category: :groups_and_projects do let!(:group) { create(:group, name: 'group') } let!(:subgroup) { create(:group, parent: group, name: 'subgroup') } let!(:project) { create(:project, namespace: subgroup, name: 'project') } diff --git a/spec/features/projects/terraform_spec.rb b/spec/features/projects/terraform_spec.rb index b7500b0cfb7..518fa79f003 100644 --- a/spec/features/projects/terraform_spec.rb +++ b/spec/features/projects/terraform_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Terraform', :js, feature_category: :projects do +RSpec.describe 'Terraform', :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project) } let_it_be(:terraform_state) { create(:terraform_state, :locked, :with_version, project: project) } diff --git a/spec/features/projects/tree/rss_spec.rb b/spec/features/projects/tree/rss_spec.rb index 0b016ee3dd9..176c5d85d93 100644 --- a/spec/features/projects/tree/rss_spec.rb +++ b/spec/features/projects/tree/rss_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Tree RSS', feature_category: :projects do +RSpec.describe 'Project Tree RSS', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, :repository, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } let(:path) { project_tree_path(project, :master) } diff --git a/spec/features/projects/tree/upload_file_spec.rb b/spec/features/projects/tree/upload_file_spec.rb index 6ec57af2590..47139013b67 100644 --- a/spec/features/projects/tree/upload_file_spec.rb +++ b/spec/features/projects/tree/upload_file_spec.rb @@ -27,7 +27,7 @@ RSpec.describe 'Multi-file editor upload file', :js, feature_category: :web_ide set_cookie('new_repo', 'false') end - it 'uploads text file' do + it 'uploads text file', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/415220' do wait_for_all_requests # make the field visible so capybara can use it execute_script('document.querySelector("#file-upload").classList.remove("hidden")') diff --git a/spec/features/projects/user_changes_project_visibility_spec.rb b/spec/features/projects/user_changes_project_visibility_spec.rb index 64af25aea28..f27a659f65f 100644 --- a/spec/features/projects/user_changes_project_visibility_spec.rb +++ b/spec/features/projects/user_changes_project_visibility_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User changes public project visibility', :js, feature_category: :projects do +RSpec.describe 'User changes public project visibility', :js, feature_category: :groups_and_projects do include ProjectForksHelper shared_examples 'changing visibility to private' do diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb index af0bd932095..484808dcfd1 100644 --- a/spec/features/projects/user_creates_project_spec.rb +++ b/spec/features/projects/user_creates_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User creates a project', :js, feature_category: :projects do +RSpec.describe 'User creates a project', :js, feature_category: :groups_and_projects do let(:user) { create(:user) } before do diff --git a/spec/features/projects/user_sees_sidebar_spec.rb b/spec/features/projects/user_sees_sidebar_spec.rb index 3a6e11356a2..5a744be5d81 100644 --- a/spec/features/projects/user_sees_sidebar_spec.rb +++ b/spec/features/projects/user_sees_sidebar_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > User sees sidebar', feature_category: :projects do +RSpec.describe 'Projects > User sees sidebar', feature_category: :groups_and_projects do let(:user) { create(:user) } let(:project) { create(:project, :private, public_builds: false, namespace: user.namespace) } diff --git a/spec/features/projects/user_sees_user_popover_spec.rb b/spec/features/projects/user_sees_user_popover_spec.rb index 9d8d06c514e..523f1366a14 100644 --- a/spec/features/projects/user_sees_user_popover_spec.rb +++ b/spec/features/projects/user_sees_user_popover_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User sees user popover', :js, feature_category: :projects do +RSpec.describe 'User sees user popover', :js, feature_category: :groups_and_projects do include Features::NotesHelpers let_it_be(:user) { create(:user, pronouns: 'they/them') } diff --git a/spec/features/projects/user_sorts_projects_spec.rb b/spec/features/projects/user_sorts_projects_spec.rb index 6a18d95c840..b80caca5810 100644 --- a/spec/features/projects/user_sorts_projects_spec.rb +++ b/spec/features/projects/user_sorts_projects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User sorts projects and order persists', feature_category: :projects do +RSpec.describe 'User sorts projects and order persists', feature_category: :groups_and_projects do include CookieHelper let_it_be(:user) { create(:user) } diff --git a/spec/features/projects/user_uses_shortcuts_spec.rb b/spec/features/projects/user_uses_shortcuts_spec.rb index 1d4ab242308..77f753b92eb 100644 --- a/spec/features/projects/user_uses_shortcuts_spec.rb +++ b/spec/features/projects/user_uses_shortcuts_spec.rb @@ -2,14 +2,13 @@ require 'spec_helper' -RSpec.describe 'User uses shortcuts', :js, feature_category: :projects do +RSpec.describe 'User uses shortcuts', :js, feature_category: :groups_and_projects do let_it_be(:project) { create(:project, :repository) } let(:user) { project.first_owner } before do sign_in(user) - stub_feature_flags(remove_monitor_metrics: false) visit(project_path(project)) @@ -183,16 +182,6 @@ RSpec.describe 'User uses shortcuts', :js, feature_category: :projects do end end - context 'when navigating to the Monitor pages' do - it 'redirects to the Metrics page' do - find('body').native.send_key('g') - find('body').native.send_key('l') - - expect(page).to have_active_navigation('Monitor') - expect(page).to have_active_sub_navigation('Metrics') - end - end - context 'when navigating to the Infrastructure pages' do it 'redirects to the Kubernetes page' do find('body').native.send_key('g') diff --git a/spec/features/projects/user_views_empty_project_spec.rb b/spec/features/projects/user_views_empty_project_spec.rb index e38cfc2273a..ed34b109d29 100644 --- a/spec/features/projects/user_views_empty_project_spec.rb +++ b/spec/features/projects/user_views_empty_project_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User views an empty project', feature_category: :projects do +RSpec.describe 'User views an empty project', feature_category: :groups_and_projects do include Features::InviteMembersModalHelpers let_it_be(:project) { create(:project, :empty_repo) } @@ -14,7 +14,7 @@ RSpec.describe 'User views an empty project', feature_category: :projects do it 'shows push-to-default-branch instructions' do visit project_path(project) - expect(page).to have_content("git push -u origin #{default_branch}") + expect(page).to have_content("git push --set-upstream origin #{default_branch}") end end @@ -53,7 +53,7 @@ RSpec.describe 'User views an empty project', feature_category: :projects do it 'does not show push-to-master instructions' do visit project_path(project) - expect(page).not_to have_content('git push -u origin') + expect(page).not_to have_content('git push --set-upstream origin') end end end @@ -67,7 +67,7 @@ RSpec.describe 'User views an empty project', feature_category: :projects do it 'does not show push-to-master instructions nor invite members link', :aggregate_failures, :js do visit project_path(project) - expect(page).not_to have_content('git push -u origin') + expect(page).not_to have_content('git push --set-upstream origin') expect(page).not_to have_button(text: 'Invite members') end end diff --git a/spec/features/projects/view_on_env_spec.rb b/spec/features/projects/view_on_env_spec.rb index bf32431fc88..5f502c0297a 100644 --- a/spec/features/projects/view_on_env_spec.rb +++ b/spec/features/projects/view_on_env_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'View on environment', :js, feature_category: :projects do +RSpec.describe 'View on environment', :js, feature_category: :groups_and_projects do let(:branch_name) { 'feature' } let(:file_path) { 'files/ruby/feature.rb' } let(:project) { create(:project, :repository) } diff --git a/spec/features/projects/work_items/work_item_spec.rb b/spec/features/projects/work_items/work_item_spec.rb index b706a624fc5..e996a76b1c5 100644 --- a/spec/features/projects/work_items/work_item_spec.rb +++ b/spec/features/projects/work_items/work_item_spec.rb @@ -4,9 +4,11 @@ require 'spec_helper' RSpec.describe 'Work item', :js, feature_category: :team_planning do let_it_be_with_reload(:user) { create(:user) } + let_it_be_with_reload(:user2) { create(:user, name: 'John') } let_it_be(:project) { create(:project, :public) } let_it_be(:work_item) { create(:work_item, project: project) } + let_it_be(:emoji_upvote) { create(:award_emoji, :upvote, awardable: work_item, user: user2) } let_it_be(:milestone) { create(:milestone, project: project) } let_it_be(:milestones) { create_list(:milestone, 25, project: project) } let_it_be(:note) { create(:note, noteable: work_item, project: work_item.project) } @@ -33,6 +35,10 @@ RSpec.describe 'Work item', :js, feature_category: :team_planning do end end + it 'actions dropdown is displayed' do + expect(page).to have_selector('[data-testid="work-item-actions-dropdown"]') + end + it_behaves_like 'work items title' it_behaves_like 'work items status' it_behaves_like 'work items assignees' @@ -74,10 +80,6 @@ RSpec.describe 'Work item', :js, feature_category: :team_planning do visit work_items_path end - it 'actions dropdown is not displayed' do - expect(page).not_to have_selector('[data-testid="work-item-actions-dropdown"]') - end - it 'todos action is not displayed' do expect(page).not_to have_selector('[data-testid="work-item-todos-action"]') end diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb index 73ee250a8b8..d28fafaac45 100644 --- a/spec/features/projects_spec.rb +++ b/spec/features/projects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project', feature_category: :projects do +RSpec.describe 'Project', feature_category: :groups_and_projects do include ProjectForksHelper include MobileHelpers diff --git a/spec/features/protected_branches_spec.rb b/spec/features/protected_branches_spec.rb index e4a64d391b0..9244cafbc0b 100644 --- a/spec/features/protected_branches_spec.rb +++ b/spec/features/protected_branches_spec.rb @@ -27,7 +27,7 @@ RSpec.describe 'Protected Branches', :js, feature_category: :source_code_managem find('input[data-testid="branch-search"]').set('fix') find('input[data-testid="branch-search"]').native.send_keys(:enter) - expect(page).to have_button('Only a project maintainer or owner can delete a protected branch', disabled: true) + expect(page).not_to have_button('Delete protected branch') end end end @@ -64,9 +64,11 @@ RSpec.describe 'Protected Branches', :js, feature_category: :source_code_managem expect(page).to have_content('fix') expect(find('.all-branches')).to have_selector('li', count: 1) + find('[data-testid="branch-more-actions"] button').click + wait_for_requests expect(page).to have_button('Delete protected branch', disabled: false) - page.find('.js-delete-branch-button').click + find('[data-testid="delete-branch-button"]').click fill_in 'delete_branch_input', with: 'fix' click_button 'Yes, delete protected branch' diff --git a/spec/features/oauth_registration_spec.rb b/spec/features/registrations/oauth_registration_spec.rb index c88a018a592..c88a018a592 100644 --- a/spec/features/oauth_registration_spec.rb +++ b/spec/features/registrations/oauth_registration_spec.rb diff --git a/spec/features/registrations/registration_spec.rb b/spec/features/registrations/registration_spec.rb new file mode 100644 index 00000000000..7a409b3934e --- /dev/null +++ b/spec/features/registrations/registration_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Registrations', feature_category: :system_access do + context 'when the user visits the registration page when already signed in', :clean_gitlab_redis_sessions do + let_it_be(:current_user) { create(:user) } + + before do + sign_in(current_user) + end + + it 'does not show an "You are already signed in" error message' do + visit new_user_registration_path + + wait_for_requests + + expect(page).not_to have_content(I18n.t('devise.failure.already_authenticated')) + end + end +end diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb index 452a5700e08..4df9109875e 100644 --- a/spec/features/runners_spec.rb +++ b/spec/features/runners_spec.rb @@ -49,6 +49,11 @@ RSpec.describe 'Runners', feature_category: :runner_fleet do 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 diff --git a/spec/features/snippets/explore_spec.rb b/spec/features/snippets/explore_spec.rb index ef4b75ac3b4..2e06125963e 100644 --- a/spec/features/snippets/explore_spec.rb +++ b/spec/features/snippets/explore_spec.rb @@ -6,16 +6,15 @@ RSpec.describe 'Explore Snippets', feature_category: :source_code_management do let!(:public_snippet) { create(:personal_snippet, :public) } let!(:internal_snippet) { create(:personal_snippet, :internal) } let!(:private_snippet) { create(:personal_snippet, :private) } - let(:user) { nil } - - before do - sign_in(user) if user - visit explore_snippets_path - end context 'User' do let(:user) { create(:user) } + before do + sign_in(user) + visit explore_snippets_path + end + it 'see snippets that are not private' do expect(page).to have_content(public_snippet.title) expect(page).to have_content(internal_snippet.title) @@ -31,6 +30,11 @@ RSpec.describe 'Explore Snippets', feature_category: :source_code_management do context 'External user' do let(:user) { create(:user, :external) } + before do + sign_in(user) + visit explore_snippets_path + end + it 'see only public snippets' do expect(page).to have_content(public_snippet.title) expect(page).not_to have_content(internal_snippet.title) @@ -55,6 +59,10 @@ RSpec.describe 'Explore Snippets', feature_category: :source_code_management do end context 'Not authenticated user' do + before do + visit explore_snippets_path + end + it 'see only public snippets' do expect(page).to have_content(public_snippet.title) expect(page).not_to have_content(internal_snippet.title) diff --git a/spec/features/tags/developer_creates_tag_spec.rb b/spec/features/tags/developer_creates_tag_spec.rb index cb59ee17514..be9f19fe84a 100644 --- a/spec/features/tags/developer_creates_tag_spec.rb +++ b/spec/features/tags/developer_creates_tag_spec.rb @@ -20,7 +20,10 @@ RSpec.describe 'Developer creates tag', :js, feature_category: :source_code_mana end it 'with an invalid name displays an error' do - create_tag_in_form(tag: 'v 1.0', ref: 'master') + fill_in 'tag_name', with: 'v 1.0' + select_ref(ref: 'master') + + click_button 'Create tag' expect(page).to have_content 'Tag name invalid' end @@ -39,13 +42,20 @@ RSpec.describe 'Developer creates tag', :js, feature_category: :source_code_mana end it 'that already exists displays an error' do - create_tag_in_form(tag: 'v1.1.0', ref: 'master') + fill_in 'tag_name', with: 'v1.1.0' + select_ref(ref: 'master') + + click_button 'Create tag' expect(page).to have_content 'Tag v1.1.0 already exists' end it 'with multiline message displays the message in a <pre> block' do - create_tag_in_form(tag: 'v3.0', ref: 'master', message: "Awesome tag message\n\n- hello\n- world") + fill_in 'tag_name', with: 'v3.0' + select_ref(ref: 'master') + fill_in 'message', with: "Awesome tag message\n\n- hello\n- world" + + click_button 'Create tag' expect(page).to have_current_path( project_tag_path(project, 'v3.0'), ignore_query: true) @@ -67,14 +77,6 @@ RSpec.describe 'Developer creates tag', :js, feature_category: :source_code_mana end end - def create_tag_in_form(tag:, ref:, message: nil, desc: nil) - fill_in 'tag_name', with: tag - select_ref(ref: ref) - fill_in 'message', with: message unless message.nil? - fill_in 'release_description', with: desc unless desc.nil? - click_button 'Create tag' - end - def select_ref(ref:) ref_selector = '.ref-selector' find(ref_selector).click diff --git a/spec/features/topic_show_spec.rb b/spec/features/topic_show_spec.rb index 39b8782ea58..7c2c6c2dd12 100644 --- a/spec/features/topic_show_spec.rb +++ b/spec/features/topic_show_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Topic show page', feature_category: :projects do +RSpec.describe 'Topic show page', feature_category: :groups_and_projects do let_it_be(:topic) { create(:topic, name: 'my-topic', title: 'My Topic', description: 'This is **my** topic https://google.com/ :poop: ```\ncode\n```', avatar: fixture_file_upload("spec/fixtures/dk.png", "image/png")) } context 'when topic does not exist' do diff --git a/spec/features/unsubscribe_links_spec.rb b/spec/features/unsubscribe_links_spec.rb index 28699bc2c24..77ef3df97f6 100644 --- a/spec/features/unsubscribe_links_spec.rb +++ b/spec/features/unsubscribe_links_spec.rb @@ -10,7 +10,7 @@ RSpec.describe 'Unsubscribe links', :sidekiq_inline, feature_category: :shared d let_it_be(:recipient) { create(:user) } let(:params) { { title: 'A bug!', description: 'Fix it!', assignee_ids: [recipient.id] } } - let(:issue) { Issues::CreateService.new(container: project, current_user: author, params: params, spam_params: nil).execute[:issue] } + let(:issue) { Issues::CreateService.new(container: project, current_user: author, params: params).execute[:issue] } let(:mail) { ActionMailer::Base.deliveries.last } let(:body) { Capybara::Node::Simple.new(mail.default_part_body.to_s) } diff --git a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb index f1023f17d3e..03b072ea417 100644 --- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb +++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb @@ -7,6 +7,7 @@ RSpec.describe 'User uploads avatar to profile', feature_category: :user_profile let(:avatar_file_path) { Rails.root.join('spec', 'fixtures', 'dk.png') } before do + stub_feature_flags(edit_user_profile_vue: false) sign_in user visit profile_path end diff --git a/spec/features/users/password_spec.rb b/spec/features/users/password_spec.rb index ccd383c8a15..f9d69b3e85a 100644 --- a/spec/features/users/password_spec.rb +++ b/spec/features/users/password_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe 'User password', feature_category: :system_access do + include EmailHelpers + describe 'send password reset' do context 'when recaptcha is enabled' do before do @@ -26,5 +28,43 @@ RSpec.describe 'User password', feature_category: :system_access do expect(page).not_to have_css('.g-recaptcha') end end + + context 'when user has multiple emails' do + let_it_be(:user) { create(:user, email: 'primary@example.com') } + let_it_be(:verified_email) { create(:email, :confirmed, user: user, email: 'second@example.com') } + let_it_be(:unverified_email) { create(:email, user: user, email: 'unverified@example.com') } + + before do + perform_enqueued_jobs do + visit new_user_password_path + fill_in 'user_email', with: email + click_button 'Reset password' + end + end + + context 'when user enters the primary email' do + let(:email) { user.email } + + it 'send the email to the correct email address' do + expect(ActionMailer::Base.deliveries.first.to).to include(email) + end + end + + context 'when user enters a secondary verified email' do + let(:email) { verified_email.email } + + it 'send the email to the correct email address' do + expect(ActionMailer::Base.deliveries.first.to).to include(email) + end + end + + context 'when user enters an unverified email' do + let(:email) { unverified_email.email } + + it 'does not send an email' do + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + end + end end end diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb index d65eea3671c..850dd0bbc5d 100644 --- a/spec/features/users/signup_spec.rb +++ b/spec/features/users/signup_spec.rb @@ -3,10 +3,8 @@ require 'spec_helper' RSpec.shared_examples 'Signup name validation' do |field, max_length, label| - flag_values = [true, false] - flag_values.each do |val| + shared_examples 'signup validation' do before do - stub_feature_flags(restyle_login_page: val) visit new_user_registration_path end @@ -42,6 +40,18 @@ RSpec.shared_examples 'Signup name validation' do |field, max_length, label| end end end + + include_examples 'signup validation' + + # Inline `shared_example 'signup validation'` again after feature flag + # `restyle_login_page` was removed. + context 'with feature flag restyle_login_page disabled' do + before do + stub_feature_flags(restyle_login_page: false) + end + + include_examples 'signup validation' + end end RSpec.describe 'Signup', :js, feature_category: :user_profile do @@ -49,25 +59,32 @@ RSpec.describe 'Signup', :js, feature_category: :user_profile do let(:new_user) { build_stubbed(:user) } - def fill_in_signup_form - fill_in 'new_user_username', with: new_user.username - fill_in 'new_user_email', with: new_user.email - fill_in 'new_user_first_name', with: new_user.first_name - fill_in 'new_user_last_name', with: new_user.last_name - fill_in 'new_user_password', with: new_user.password + let(:terms_text) do + <<~TEXT.squish + By clicking Register or registering through a third party you accept the + Terms of Use and acknowledge the Privacy Policy and Cookie Policy + TEXT end - def confirm_email - new_user_token = User.find_by_email(new_user.email).confirmation_token + shared_examples 'signup process' do + def fill_in_signup_form + fill_in 'new_user_username', with: new_user.username + fill_in 'new_user_email', with: new_user.email + fill_in 'new_user_first_name', with: new_user.first_name + fill_in 'new_user_last_name', with: new_user.last_name + fill_in 'new_user_password', with: new_user.password - visit user_confirmation_path(confirmation_token: new_user_token) - end + wait_for_all_requests + end + + def confirm_email + new_user_token = User.find_by_email(new_user.email).confirmation_token + + visit user_confirmation_path(confirmation_token: new_user_token) + end - flag_values = [true, false] - flag_values.each do |val| before do stub_feature_flags(arkose_labs_signup_challenge: false) - stub_feature_flags(restyle_login_page: val) stub_application_setting(require_admin_approval_after_user_signup: false) end @@ -162,7 +179,8 @@ RSpec.describe 'Signup', :js, feature_category: :user_profile do expect(page).to have_content("Invalid input, please avoid emojis") end - it 'shows a pending message if the username availability is being fetched', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/31484' do + it 'shows a pending message if the username availability is being fetched', + quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/31484' do fill_in 'new_user_username', with: 'new-user' expect(find('.username > .validation-pending')).not_to have_css '.hide' @@ -263,7 +281,10 @@ RSpec.describe 'Signup', :js, feature_category: :user_profile do expect { click_button 'Register' }.to change { User.count }.by(1) expect(page).to have_current_path new_user_session_path, ignore_query: true - expect(page).to have_content("You have signed up successfully. However, we could not sign you in because your account is awaiting approval from your GitLab administrator") + expect(page).to have_content(<<~TEXT.squish) + You have signed up successfully. However, we could not sign you in + because your account is awaiting approval from your GitLab administrator + TEXT end end end @@ -305,13 +326,26 @@ RSpec.describe 'Signup', :js, feature_category: :user_profile do it 'renders text that the user confirms terms by signing in' do visit new_user_registration_path - expect(page).to have_content(/By clicking Register, I agree that I have read and accepted the Terms of Use and Privacy Policy/) + expect(page).to have_content(terms_text) fill_in_signup_form click_button 'Register' - expect(page).to have_current_path users_sign_up_welcome_path, ignore_query: true + expect(page).to have_current_path(users_sign_up_welcome_path), ignore_query: true + visit new_project_path + + select 'Software Developer', from: 'user_role' + click_button 'Get started!' + + created_user = User.find_by_username(new_user.username) + + expect(created_user.software_developer_role?).to be_truthy + expect(created_user.setup_for_company).to be_nil + expect(page).to have_current_path(new_project_path) end + + it_behaves_like 'Signup name validation', 'new_user_first_name', 127, 'First name' + it_behaves_like 'Signup name validation', 'new_user_last_name', 127, 'Last name' end context 'when reCAPTCHA and invisible captcha are enabled' do @@ -337,7 +371,8 @@ RSpec.describe 'Signup', :js, feature_category: :user_profile do expect { click_button 'Register' }.not_to change { User.count } expect(page).to have_content(_('There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.')) - expect(page).to have_content("Minimum length is #{Gitlab::CurrentSettings.minimum_password_length} characters") + expect(page).to have_content( + "Minimum length is #{Gitlab::CurrentSettings.minimum_password_length} characters") end end @@ -357,7 +392,6 @@ RSpec.describe 'Signup', :js, feature_category: :user_profile do visit new_user_registration_path fill_in_signup_form - wait_for_all_requests click_button 'Register' @@ -393,34 +427,22 @@ RSpec.describe 'Signup', :js, feature_category: :user_profile do end end - context 'when terms are enforced' do - before do - enforce_terms - end - - it 'renders text that the user confirms terms by signing in' do - visit new_user_registration_path - - expect(page).to have_content(/By clicking Register, I agree that I have read and accepted the Terms of Use and Privacy Policy/) - - fill_in_signup_form - click_button 'Register' - - visit new_project_path - - expect(page).to have_current_path(users_sign_up_welcome_path) + include_examples 'signup process' - select 'Software Developer', from: 'user_role' - click_button 'Get started!' - - created_user = User.find_by_username(new_user.username) + # Inline `shared_example 'signup process'` again after feature flag + # `restyle_login_page` was removed. + context 'with feature flag restyle_login_page disabled' do + let(:terms_text) do + <<~TEXT.squish + By clicking Register, I agree that I have read and accepted the Terms of + Use and Privacy Policy + TEXT + end - expect(created_user.software_developer_role?).to be_truthy - expect(created_user.setup_for_company).to be_nil - expect(page).to have_current_path(new_project_path) + before do + stub_feature_flags(restyle_login_page: false) end - it_behaves_like 'Signup name validation', 'new_user_first_name', 127, 'First name' - it_behaves_like 'Signup name validation', 'new_user_last_name', 127, 'Last name' + include_examples 'signup process' end end diff --git a/spec/features/users/user_browses_projects_on_user_page_spec.rb b/spec/features/users/user_browses_projects_on_user_page_spec.rb index 52ca2397582..8bdc09f3f87 100644 --- a/spec/features/users/user_browses_projects_on_user_page_spec.rb +++ b/spec/features/users/user_browses_projects_on_user_page_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Users > User browses projects on user page', :js, feature_category: :projects do +RSpec.describe 'Users > User browses projects on user page', :js, feature_category: :groups_and_projects do let!(:user) { create :user } let!(:private_project) do create :project, :private, name: 'private', namespace: user.namespace do |project| @@ -129,7 +129,7 @@ RSpec.describe 'Users > User browses projects on user page', :js, feature_catego end before do - Issues::CreateService.new(container: contributed_project, current_user: user, params: { title: 'Bug in old browser' }, spam_params: nil).execute + Issues::CreateService.new(container: contributed_project, current_user: user, params: { title: 'Bug in old browser' }).execute event = create(:push_event, project: contributed_project, author: user) create(:push_event_payload, event: event, commit_count: 3) end |