diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-19 22:11:55 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-19 22:11:55 +0000 |
commit | 5a8431feceba47fd8e1804d9aa1b1730606b71d5 (patch) | |
tree | e5df8e0ceee60f4af8093f5c4c2f934b8abced05 /spec/features | |
parent | 4d477238500c347c6553d335d920bedfc5a46869 (diff) | |
download | gitlab-ce-5a8431feceba47fd8e1804d9aa1b1730606b71d5.tar.gz |
Add latest changes from gitlab-org/gitlab@12-5-stable-ee
Diffstat (limited to 'spec/features')
124 files changed, 1313 insertions, 438 deletions
diff --git a/spec/features/admin/admin_abuse_reports_spec.rb b/spec/features/admin/admin_abuse_reports_spec.rb index 48fff9e57d3..93051a8a355 100644 --- a/spec/features/admin/admin_abuse_reports_spec.rb +++ b/spec/features/admin/admin_abuse_reports_spec.rb @@ -51,5 +51,29 @@ describe "Admin::AbuseReports", :js do end end end + + describe 'filtering by user' do + let!(:user2) { create(:user) } + let!(:abuse_report) { create(:abuse_report, user: user) } + let!(:abuse_report_2) { create(:abuse_report, user: user2) } + + it 'shows only single user report' do + visit admin_abuse_reports_path + + page.within '.filter-form' do + click_button 'User' + wait_for_requests + + page.within '.dropdown-menu-user' do + click_link user2.name + end + + wait_for_requests + end + + expect(page).to have_content(user2.name) + expect(page).not_to have_content(user.name) + end + end end end diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb index 058e548208f..7c40ac5bde3 100644 --- a/spec/features/admin/admin_projects_spec.rb +++ b/spec/features/admin/admin_projects_spec.rb @@ -73,8 +73,9 @@ describe "Admin::Projects" do before do create(:group, name: 'Web') - allow_any_instance_of(Projects::TransferService) - .to receive(:move_uploads_to_new_namespace).and_return(true) + allow_next_instance_of(Projects::TransferService) do |instance| + allow(instance).to receive(:move_uploads_to_new_namespace).and_return(true) + end end it 'transfers project to group web', :js do diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb index e1c9364067a..99a6165cfc9 100644 --- a/spec/features/admin/admin_settings_spec.rb +++ b/spec/features/admin/admin_settings_spec.rb @@ -5,6 +5,7 @@ require 'spec_helper' describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do include StubENV include TermsHelper + include MobileHelpers let(:admin) { create(:admin) } @@ -450,6 +451,32 @@ describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_not_moc expect(page).to have_link(text: 'Support', href: new_support_url) end end + + it 'Shows admin dashboard links on bigger screen' do + visit root_dashboard_path + + page.within '.navbar' do + expect(page).to have_link(text: 'Admin Area', href: admin_root_path, visible: true) + expect(page).to have_link(text: 'Leave Admin Mode', href: destroy_admin_session_path, visible: true) + end + end + + it 'Relocates admin dashboard links to dropdown list on smaller screen', :js do + resize_screen_xs + visit root_dashboard_path + + page.within '.navbar' do + expect(page).not_to have_link(text: 'Admin Area', href: admin_root_path, visible: true) + expect(page).not_to have_link(text: 'Leave Admin Mode', href: destroy_admin_session_path, visible: true) + end + + find('.header-more').click + + page.within '.navbar' do + expect(page).to have_link(text: 'Admin Area', href: admin_root_path, visible: true) + expect(page).to have_link(text: 'Leave Admin Mode', href: destroy_admin_session_path, visible: true) + end + end end context 'when in admin_mode' do @@ -462,7 +489,7 @@ describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_not_moc it 'can leave admin mode' do page.within('.navbar-sub-nav') do # Select first, link is also included in mobile view list - click_on 'Leave admin mode', match: :first + click_on 'Leave Admin Mode', match: :first expect(page).to have_link(href: new_admin_session_path) end @@ -481,7 +508,7 @@ describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_not_moc before do page.within('.navbar-sub-nav') do # Select first, link is also included in mobile view list - click_on 'Leave admin mode', match: :first + click_on 'Leave Admin Mode', match: :first end end diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb index 29f29e58917..0c8cd895c00 100644 --- a/spec/features/admin/admin_users_spec.rb +++ b/spec/features/admin/admin_users_spec.rb @@ -179,7 +179,9 @@ describe "Admin::Users" do end it "calls send mail" do - expect_any_instance_of(NotificationService).to receive(:new_user) + expect_next_instance_of(NotificationService) do |instance| + expect(instance).to receive(:new_user) + end click_button "Create user" end diff --git a/spec/features/admin/clusters/eks_spec.rb b/spec/features/admin/clusters/eks_spec.rb new file mode 100644 index 00000000000..b262db1ad7c --- /dev/null +++ b/spec/features/admin/clusters/eks_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Instance-level AWS EKS Cluster', :js do + let(:user) { create(:admin) } + + before do + sign_in(user) + end + + context 'when user does not have a cluster and visits group clusters page' do + before do + visit admin_clusters_path + + click_link 'Add Kubernetes cluster' + end + + context 'when user creates a cluster on AWS EKS' do + before do + click_link 'Amazon EKS' + end + + it 'user sees a form to create an EKS cluster' do + expect(page).to have_content('Create new Cluster on EKS') + end + end + end +end diff --git a/spec/features/calendar_spec.rb b/spec/features/calendar_spec.rb index 235b6d0fd40..bac5c9f568e 100644 --- a/spec/features/calendar_spec.rb +++ b/spec/features/calendar_spec.rb @@ -134,11 +134,9 @@ describe 'Contributions Calendar', :js do shared_examples 'a day with activity' do |contribution_count:| include_context 'visit user page' - it 'displays calendar activity square color for 1 contribution' do + it 'displays calendar activity square for 1 contribution', :sidekiq_might_not_need_inline do expect(find('#js-overview')).to have_selector(get_cell_color_selector(contribution_count), count: 1) - end - it 'displays calendar activity square on the correct date' do today = Date.today.strftime(date_format) expect(find('#js-overview')).to have_selector(get_cell_date_selector(contribution_count, today), count: 1) end @@ -154,7 +152,7 @@ describe 'Contributions Calendar', :js do describe 'issue title is shown on activity page' do include_context 'visit user page' - it 'displays calendar activity log' do + it 'displays calendar activity log', :sidekiq_might_not_need_inline do expect(find('#js-overview .overview-content-list .event-target-title')).to have_content issue_title end end @@ -186,11 +184,11 @@ describe 'Contributions Calendar', :js do end include_context 'visit user page' - it 'displays calendar activity squares for both days' do + it 'displays calendar activity squares for both days', :sidekiq_might_not_need_inline do expect(find('#js-overview')).to have_selector(get_cell_color_selector(1), count: 2) end - it 'displays calendar activity square for yesterday' do + it 'displays calendar activity square for yesterday', :sidekiq_might_not_need_inline do yesterday = Date.yesterday.strftime(date_format) expect(find('#js-overview')).to have_selector(get_cell_date_selector(1, yesterday), count: 1) end diff --git a/spec/features/clusters/installing_applications_shared_examples.rb b/spec/features/clusters/installing_applications_shared_examples.rb index cb8fd8c607c..988cd228c1c 100644 --- a/spec/features/clusters/installing_applications_shared_examples.rb +++ b/spec/features/clusters/installing_applications_shared_examples.rb @@ -178,6 +178,37 @@ shared_examples "installing applications on a cluster" do end end + context 'when user installs Elastic Stack' do + before do + allow(ClusterInstallAppWorker).to receive(:perform_async) + allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_in) + allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_async) + + create(:clusters_applications_helm, :installed, cluster: cluster) + create(:clusters_applications_ingress, :installed, external_ip: '127.0.0.1', cluster: cluster) + + page.within('.js-cluster-application-row-elastic_stack') do + click_button 'Install' + end + end + + it 'shows status transition' do + page.within('.js-cluster-application-row-elastic_stack') do + expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installing') + + Clusters::Cluster.last.application_elastic_stack.make_installing! + + expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installing') + + Clusters::Cluster.last.application_elastic_stack.make_installed! + + expect(page).to have_css('.js-cluster-application-uninstall-button', exact_text: 'Uninstall') + end + + expect(page).to have_content('Elastic Stack was successfully installed on your Kubernetes cluster') + end + end + context 'when user installs Ingress' do before do allow(ClusterInstallAppWorker).to receive(:perform_async) diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb index 96d8da845cb..f538df89fd3 100644 --- a/spec/features/commits_spec.rb +++ b/spec/features/commits_spec.rb @@ -102,7 +102,7 @@ describe 'Commits' do end describe 'Cancel all builds' do - it 'cancels commit', :js do + it 'cancels commit', :js, :sidekiq_might_not_need_inline do visit pipeline_path(pipeline) click_on 'Cancel running' expect(page).to have_content 'canceled' @@ -110,7 +110,7 @@ describe 'Commits' do end describe 'Cancel build' do - it 'cancels build', :js do + it 'cancels build', :js, :sidekiq_might_not_need_inline do visit pipeline_path(pipeline) find('.js-btn-cancel-pipeline').click expect(page).to have_content 'canceled' @@ -157,39 +157,6 @@ describe 'Commits' do end end end - - describe '.gitlab-ci.yml not found warning' do - before do - project.add_reporter(user) - end - - context 'ci builds enabled' do - it 'does not show warning' do - visit pipeline_path(pipeline) - - expect(page).not_to have_content '.gitlab-ci.yml not found in this commit' - end - - it 'shows warning' do - stub_ci_pipeline_yaml_file(nil) - - visit pipeline_path(pipeline) - - expect(page).to have_content '.gitlab-ci.yml not found in this commit' - end - end - - context 'ci builds disabled' do - it 'does not show warning' do - stub_ci_builds_disabled - stub_ci_pipeline_yaml_file(nil) - - visit pipeline_path(pipeline) - - expect(page).not_to have_content '.gitlab-ci.yml not found in this commit' - end - end - end end context 'viewing commits for a branch' do diff --git a/spec/features/container_registry_spec.rb b/spec/features/container_registry_spec.rb index 03a2402a2d6..28b68e699e8 100644 --- a/spec/features/container_registry_spec.rb +++ b/spec/features/container_registry_spec.rb @@ -42,7 +42,7 @@ describe 'Container Registry', :js do expect(page).to have_content('my/image') end - it 'user removes entire container repository' do + it 'user removes entire container repository', :sidekiq_might_not_need_inline do visit_container_registry expect_any_instance_of(ContainerRepository).to receive(:delete_tags!).and_return(true) diff --git a/spec/features/cycle_analytics_spec.rb b/spec/features/cycle_analytics_spec.rb index 07f0864fb3b..0fc4841ee0e 100644 --- a/spec/features/cycle_analytics_spec.rb +++ b/spec/features/cycle_analytics_spec.rb @@ -40,7 +40,9 @@ describe 'Cycle Analytics', :js do context "when there's cycle analytics data" do before do - allow_any_instance_of(Gitlab::ReferenceExtractor).to receive(:issues).and_return([issue]) + allow_next_instance_of(Gitlab::ReferenceExtractor) do |instance| + allow(instance).to receive(:issues).and_return([issue]) + end project.add_maintainer(user) @build = create_cycle(user, project, issue, mr, milestone, pipeline) @@ -56,7 +58,7 @@ describe 'Cycle Analytics', :js do expect(deploys_counter).to have_content('1') end - it 'shows data on each stage' do + it 'shows data on each stage', :sidekiq_might_not_need_inline do expect_issue_to_be_present click_stage('Plan') @@ -99,7 +101,9 @@ describe 'Cycle Analytics', :js do project.add_developer(user) project.add_guest(guest) - allow_any_instance_of(Gitlab::ReferenceExtractor).to receive(:issues).and_return([issue]) + allow_next_instance_of(Gitlab::ReferenceExtractor) do |instance| + allow(instance).to receive(:issues).and_return([issue]) + end create_cycle(user, project, issue, mr, milestone, pipeline) deploy_master(user, project) diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb index 973d5a2dcfc..f10cdf6da1e 100644 --- a/spec/features/dashboard/projects_spec.rb +++ b/spec/features/dashboard/projects_spec.rb @@ -216,8 +216,7 @@ describe 'Dashboard Projects' do expect(page).to have_selector('.merge-request-form') expect(current_path).to eq project_new_merge_request_path(project) expect(find('#merge_request_target_project_id', visible: false).value).to eq project.id.to_s - expect(find('input#merge_request_source_branch', visible: false).value).to eq 'feature' - expect(find('input#merge_request_target_branch', visible: false).value).to eq 'master' + expect(page).to have_content "From feature into master" end end diff --git a/spec/features/explore/groups_spec.rb b/spec/features/explore/groups_spec.rb index 81c77a29ecd..eff63d6a788 100644 --- a/spec/features/explore/groups_spec.rb +++ b/spec/features/explore/groups_spec.rb @@ -26,6 +26,10 @@ describe 'Explore Groups', :js do end end + before do + stub_feature_flags({ vue_issuables_list: { enabled: false, thing: group } }) + end + shared_examples 'renders public and internal projects' do it do visit_page diff --git a/spec/features/global_search_spec.rb b/spec/features/global_search_spec.rb index 00fa85930b1..c499fac6bc0 100644 --- a/spec/features/global_search_spec.rb +++ b/spec/features/global_search_spec.rb @@ -21,7 +21,9 @@ describe 'Global search' do describe 'I search through the issues and I see pagination' do before do - allow_any_instance_of(Gitlab::SearchResults).to receive(:per_page).and_return(1) + allow_next_instance_of(Gitlab::SearchResults) do |instance| + allow(instance).to receive(:per_page).and_return(1) + end create_list(:issue, 2, project: project, title: 'initial') end diff --git a/spec/features/groups/clusters/eks_spec.rb b/spec/features/groups/clusters/eks_spec.rb new file mode 100644 index 00000000000..b6942304c22 --- /dev/null +++ b/spec/features/groups/clusters/eks_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Group AWS EKS Cluster', :js do + let(:group) { create(:group) } + let(:user) { create(:user) } + + before do + group.add_maintainer(user) + gitlab_sign_in(user) + + allow(Groups::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 } + allow_any_instance_of(Clusters::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute) + allow_any_instance_of(Clusters::Cluster).to receive(:retrieve_connection_status).and_return(:connected) + end + + context 'when user does not have a cluster and visits group clusters page' do + before do + visit group_clusters_path(group) + + click_link 'Add Kubernetes cluster' + end + + context 'when user creates a cluster on AWS EKS' do + before do + click_link 'Amazon EKS' + end + + it 'user sees a form to create an EKS cluster' do + expect(page).to have_content('Create new Cluster on EKS') + end + end + end +end diff --git a/spec/features/groups/clusters/user_spec.rb b/spec/features/groups/clusters/user_spec.rb index 8891866c1f8..e06f2efe183 100644 --- a/spec/features/groups/clusters/user_spec.rb +++ b/spec/features/groups/clusters/user_spec.rb @@ -13,8 +13,12 @@ describe 'User Cluster', :js do gitlab_sign_in(user) allow(Groups::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 } - allow_any_instance_of(Clusters::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute) - allow_any_instance_of(Clusters::Cluster).to receive(:retrieve_connection_status).and_return(:connected) + allow_next_instance_of(Clusters::Kubernetes::CreateOrUpdateNamespaceService) do |instance| + allow(instance).to receive(:execute) + end + allow_next_instance_of(Clusters::Cluster) do |instance| + allow(instance).to receive(:retrieve_connection_status).and_return(:connected) + end end context 'when user does not have a cluster and visits cluster index page' do 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 c05c3f4f3d6..823c8cc8fad 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 @@ -15,7 +15,7 @@ describe 'The group page' do def expect_all_sidebar_links within('.nav-sidebar') do - expect(page).to have_link('Overview') + expect(page).to have_link('Group overview') expect(page).to have_link('Details') expect(page).to have_link('Activity') expect(page).to have_link('Issues') @@ -44,7 +44,7 @@ describe 'The group page' do visit group_path(group) within('.nav-sidebar') do - expect(page).to have_link('Overview') + expect(page).to have_link('Group overview') expect(page).to have_link('Details') expect(page).not_to have_link('Activity') expect(page).not_to have_link('Contribution Analytics') diff --git a/spec/features/groups/issues_spec.rb b/spec/features/groups/issues_spec.rb index 5d87c9d7be8..b9b233026fd 100644 --- a/spec/features/groups/issues_spec.rb +++ b/spec/features/groups/issues_spec.rb @@ -11,6 +11,10 @@ describe 'Group issues page' do let(:project_with_issues_disabled) { create(:project, :issues_disabled, group: group) } let(:path) { issues_group_path(group) } + before do + stub_feature_flags({ vue_issuables_list: { enabled: false, thing: group } }) + end + context 'with shared examples' do let(:issuable) { create(:issue, project: project, title: "this is my created issuable")} diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb index 17738905e8d..65ef0af5be3 100644 --- a/spec/features/groups/milestone_spec.rb +++ b/spec/features/groups/milestone_spec.rb @@ -3,9 +3,9 @@ require 'spec_helper' describe 'Group milestones' do - let(:group) { create(:group) } - let!(:project) { create(:project_empty_repo, group: group) } - let(:user) { create(:group_member, :maintainer, user: create(:user), group: group ).user } + 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 } around do |example| Timecop.freeze { example.run } @@ -71,9 +71,9 @@ describe 'Group milestones' do end context 'when milestones exists' do - let!(:other_project) { create(:project_empty_repo, group: group) } + let_it_be(:other_project) { create(:project_empty_repo, group: group) } - let!(:active_project_milestone1) do + let_it_be(:active_project_milestone1) do create( :milestone, project: project, @@ -83,12 +83,12 @@ describe 'Group milestones' do description: 'Lorem Ipsum is simply dummy text' ) end - let!(:active_project_milestone2) { create(:milestone, project: other_project, state: 'active', title: 'v1.1') } - let!(:closed_project_milestone1) { create(:milestone, project: project, state: 'closed', title: 'v2.0') } - let!(:closed_project_milestone2) { create(:milestone, project: other_project, state: 'closed', title: 'v2.0') } - let!(:active_group_milestone) { create(:milestone, group: group, state: 'active', title: 'GL-113') } - let!(:closed_group_milestone) { create(:milestone, group: group, state: 'closed') } - let!(:issue) do + let_it_be(:active_project_milestone2) { create(:milestone, project: other_project, state: 'active', title: 'v1.1') } + let_it_be(:closed_project_milestone1) { create(:milestone, project: project, state: 'closed', title: 'v2.0') } + let_it_be(:closed_project_milestone2) { create(:milestone, project: other_project, state: 'closed', title: 'v2.0') } + let_it_be(:active_group_milestone) { create(:milestone, group: group, state: 'active', title: 'GL-113') } + let_it_be(:closed_group_milestone) { create(:milestone, group: group, state: 'closed') } + let_it_be(:issue) do create :issue, project: project, assignees: [user], author: user, milestone: active_project_milestone1 end @@ -143,38 +143,111 @@ describe 'Group milestones' do expect(page).to have_content('Issues 1 Open: 1 Closed: 0') expect(page).to have_link(issue.title, href: project_issue_path(issue.project, issue)) end + end + end + + describe 'milestone tabs', :js do + context 'for a legacy group milestone' do + let_it_be(:milestone) { create(:milestone, project: project) } + let_it_be(:label) { create(:label, project: project) } + let_it_be(:issue) { create(:labeled_issue, project: project, milestone: milestone, labels: [label], assignees: [create(:user)]) } + let_it_be(:mr) { create(:merge_request, source_project: project, milestone: milestone) } + + before do + visit group_milestone_path(group, milestone.title, title: milestone.title) + end + + it 'renders the issues tab' do + within('#tab-issues') do + expect(page).to have_content issue.title + end + end + + it 'renders the merge requests tab' do + within('.js-milestone-tabs') do + click_link('Merge Requests') + end - describe 'labels' do - before do - create(:label, project: project, title: 'bug') do |label| - issue.labels << label - end + within('#tab-merge-requests') do + expect(page).to have_content mr.title + end + end + + it 'renders the participants tab' do + within('.js-milestone-tabs') do + click_link('Participants') + end - create(:label, project: project, title: 'feature') do |label| - issue.labels << label - end + within('#tab-participants') do + expect(page).to have_content issue.assignees.first.name end + end - it 'renders labels' do - click_link 'v1.0' + it 'renders the labels tab' do + within('.js-milestone-tabs') do + click_link('Labels') + end - page.within('#tab-issues') do - expect(page).to have_content 'bug' - expect(page).to have_content 'feature' - end + within('#tab-labels') do + expect(page).to have_content label.title end + end + end + + context 'for a group milestone' do + let_it_be(:other_project) { create(:project_empty_repo, group: group) } + let_it_be(:milestone) { create(:milestone, group: group) } - it 'renders labels list', :js do - click_link 'v1.0' + let_it_be(:project_label) { create(:label, project: project) } + let_it_be(:other_project_label) { create(:label, project: other_project) } - page.within('.content .nav-links') do - page.find(:xpath, "//a[@href='#tab-labels']").click - end + let_it_be(:project_issue) { create(:labeled_issue, project: project, milestone: milestone, labels: [project_label], assignees: [create(:user)]) } + let_it_be(:other_project_issue) { create(:labeled_issue, project: other_project, milestone: milestone, labels: [other_project_label], assignees: [create(:user)]) } + + let_it_be(:project_mr) { create(:merge_request, source_project: project, milestone: milestone) } + let_it_be(:other_project_mr) { create(:merge_request, source_project: other_project, milestone: milestone) } + + before do + visit group_milestone_path(group, milestone) + end + + it 'renders the issues tab' do + within('#tab-issues') do + expect(page).to have_content project_issue.title + expect(page).to have_content other_project_issue.title + end + end + + it 'renders the merge requests tab' do + within('.js-milestone-tabs') do + click_link('Merge Requests') + end + + within('#tab-merge-requests') do + expect(page).to have_content project_mr.title + expect(page).to have_content other_project_mr.title + end + end + + it 'renders the participants tab' do + within('.js-milestone-tabs') do + click_link('Participants') + end + + within('#tab-participants') do + expect(page).to have_content project_issue.assignees.first.name + expect(page).to have_content other_project_issue.assignees.first.name + end + end + + it 'renders the labels tab' do + within('.js-milestone-tabs') do + click_link('Labels') + end - page.within('#tab-labels') do - expect(page).to have_content 'bug' - expect(page).to have_content 'feature' - end + within('#tab-labels') do + expect(page).to have_content project_label.title + expect(page).to have_content other_project_label.title end end end diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb index ca994c95df8..e958ebb1275 100644 --- a/spec/features/groups_spec.rb +++ b/spec/features/groups_spec.rb @@ -189,7 +189,7 @@ describe 'Group' do expect(page).to have_selector '#confirm_name_input:focus' end - it 'removes group' do + it 'removes group', :sidekiq_might_not_need_inline do expect { remove_with_confirm('Remove group', group.path) }.to change {Group.count}.by(-1) expect(group.members.all.count).to be_zero expect(page).to have_content "scheduled for deletion" @@ -237,14 +237,28 @@ describe 'Group' do let!(:group) { create(:group) } let!(:nested_group) { create(:group, parent: group) } let!(:project) { create(:project, namespace: group) } - let!(:path) { group_path(group) } it 'renders projects and groups on the page' do - visit path + visit group_path(group) wait_for_requests expect(page).to have_content(nested_group.name) expect(page).to have_content(project.name) + expect(page).to have_link('Group overview') + end + + it 'renders subgroup page with the text "Subgroup overview"' do + visit group_path(nested_group) + wait_for_requests + + expect(page).to have_link('Subgroup overview') + end + + it 'renders project page with the text "Project overview"' do + visit project_path(project) + wait_for_requests + + expect(page).to have_link('Project overview') end end diff --git a/spec/features/import/manifest_import_spec.rb b/spec/features/import/manifest_import_spec.rb index e9471257544..89bf69dea7d 100644 --- a/spec/features/import/manifest_import_spec.rb +++ b/spec/features/import/manifest_import_spec.rb @@ -24,7 +24,7 @@ describe 'Import multiple repositories by uploading a manifest file', :js do expect(page).to have_content('https://android-review.googlesource.com/platform/build/blueprint') end - it 'imports successfully imports a project' do + it 'imports successfully imports a project', :sidekiq_might_not_need_inline do visit new_import_manifest_path attach_file('manifest', Rails.root.join('spec/fixtures/aosp_manifest.xml')) diff --git a/spec/features/issuables/markdown_references/internal_references_spec.rb b/spec/features/issuables/markdown_references/internal_references_spec.rb index f3b534bca49..efd84cf67b0 100644 --- a/spec/features/issuables/markdown_references/internal_references_spec.rb +++ b/spec/features/issuables/markdown_references/internal_references_spec.rb @@ -64,7 +64,7 @@ describe "Internal references", :js do visit(project_issue_path(public_project, public_project_issue)) end - it "shows references" do + it "shows references", :sidekiq_might_not_need_inline do page.within("#merge-requests .merge-requests-title") do expect(page).to have_content("Related merge requests") expect(page).to have_css(".mr-count-badge") @@ -133,7 +133,7 @@ describe "Internal references", :js do visit(project_merge_request_path(public_project, public_project_merge_request)) end - it "shows references" do + it "shows references", :sidekiq_might_not_need_inline do expect(page).to have_content("mentioned in merge request #{private_project_merge_request.to_reference(public_project)}") .and have_content(private_project_user.name) end diff --git a/spec/features/issuables/markdown_references/jira_spec.rb b/spec/features/issuables/markdown_references/jira_spec.rb index 8085918f533..c5818691b3c 100644 --- a/spec/features/issuables/markdown_references/jira_spec.rb +++ b/spec/features/issuables/markdown_references/jira_spec.rb @@ -17,7 +17,9 @@ describe "Jira", :js do stub_request(:get, "https://jira.example.com/rest/api/2/issue/JIRA-5") stub_request(:post, "https://jira.example.com/rest/api/2/issue/JIRA-5/comment") - allow_any_instance_of(JIRA::Resource::Issue).to receive(:remotelink).and_return(remotelink) + allow_next_instance_of(JIRA::Resource::Issue) do |instance| + allow(instance).to receive(:remotelink).and_return(remotelink) + end sign_in(user) @@ -46,7 +48,7 @@ describe "Jira", :js do end end - it "creates a note on the referenced issues" do + it "creates a note on the referenced issues", :sidekiq_might_not_need_inline do click_button("Comment") wait_for_requests diff --git a/spec/features/issuables/sorting_list_spec.rb b/spec/features/issuables/sorting_list_spec.rb index b4531f5da4e..b7813c8ba30 100644 --- a/spec/features/issuables/sorting_list_spec.rb +++ b/spec/features/issuables/sorting_list_spec.rb @@ -57,7 +57,7 @@ describe 'Sort Issuable List' do it 'is "last updated"' do visit_merge_requests_with_state(project, 'merged') - expect(find('.issues-other-filters')).to have_content('Last updated') + expect(find('.filter-dropdown-container')).to have_content('Last updated') expect(first_merge_request).to include(last_updated_issuable.title) expect(last_merge_request).to include(first_updated_issuable.title) end @@ -69,7 +69,7 @@ describe 'Sort Issuable List' do it 'is "last updated"' do visit_merge_requests_with_state(project, 'closed') - expect(find('.issues-other-filters')).to have_content('Last updated') + expect(find('.filter-dropdown-container')).to have_content('Last updated') expect(first_merge_request).to include(last_updated_issuable.title) expect(last_merge_request).to include(first_updated_issuable.title) end @@ -81,7 +81,7 @@ describe 'Sort Issuable List' do it 'is "created date"' do visit_merge_requests_with_state(project, 'all') - expect(find('.issues-other-filters')).to have_content('Created date') + expect(find('.filter-dropdown-container')).to have_content('Created date') expect(first_merge_request).to include(last_created_issuable.title) expect(last_merge_request).to include(first_created_issuable.title) end @@ -94,7 +94,7 @@ describe 'Sort Issuable List' do it 'supports sorting in asc and desc order' do visit_merge_requests_with_state(project, 'open') - page.within('.issues-other-filters') do + page.within('.filter-dropdown-container') do click_button('Created date') click_link('Last updated') end @@ -102,7 +102,7 @@ describe 'Sort Issuable List' do expect(first_merge_request).to include(last_updated_issuable.title) expect(last_merge_request).to include(first_updated_issuable.title) - find('.issues-other-filters .filter-dropdown-container .rspec-reverse-sort').click + find('.filter-dropdown-container .rspec-reverse-sort').click expect(first_merge_request).to include(first_updated_issuable.title) expect(last_merge_request).to include(last_updated_issuable.title) @@ -133,7 +133,7 @@ describe 'Sort Issuable List' do it 'is "created date"' do visit_issues project - expect(find('.issues-other-filters')).to have_content('Created date') + expect(find('.filter-dropdown-container')).to have_content('Created date') expect(first_issue).to include(last_created_issuable.title) expect(last_issue).to include(first_created_issuable.title) end @@ -145,7 +145,7 @@ describe 'Sort Issuable List' do it 'is "created date"' do visit_issues_with_state(project, 'open') - expect(find('.issues-other-filters')).to have_content('Created date') + expect(find('.filter-dropdown-container')).to have_content('Created date') expect(first_issue).to include(last_created_issuable.title) expect(last_issue).to include(first_created_issuable.title) end @@ -157,7 +157,7 @@ describe 'Sort Issuable List' do it 'is "last updated"' do visit_issues_with_state(project, 'closed') - expect(find('.issues-other-filters')).to have_content('Last updated') + expect(find('.filter-dropdown-container')).to have_content('Last updated') expect(first_issue).to include(last_updated_issuable.title) expect(last_issue).to include(first_updated_issuable.title) end @@ -169,7 +169,7 @@ describe 'Sort Issuable List' do it 'is "created date"' do visit_issues_with_state(project, 'all') - expect(find('.issues-other-filters')).to have_content('Created date') + expect(find('.filter-dropdown-container')).to have_content('Created date') expect(first_issue).to include(last_created_issuable.title) expect(last_issue).to include(first_created_issuable.title) end @@ -183,7 +183,7 @@ describe 'Sort Issuable List' do end it 'shows the sort order as created date' do - expect(find('.issues-other-filters')).to have_content('Created date') + expect(find('.filter-dropdown-container')).to have_content('Created date') expect(first_issue).to include(last_created_issuable.title) expect(last_issue).to include(first_created_issuable.title) end @@ -196,7 +196,7 @@ describe 'Sort Issuable List' do it 'supports sorting in asc and desc order' do visit_issues_with_state(project, 'open') - page.within('.issues-other-filters') do + page.within('.filter-dropdown-container') do click_button('Created date') click_link('Last updated') end @@ -204,7 +204,7 @@ describe 'Sort Issuable List' do expect(first_issue).to include(last_updated_issuable.title) expect(last_issue).to include(first_updated_issuable.title) - find('.issues-other-filters .filter-dropdown-container .rspec-reverse-sort').click + find('.filter-dropdown-container .rspec-reverse-sort').click expect(first_issue).to include(first_updated_issuable.title) expect(last_issue).to include(last_updated_issuable.title) diff --git a/spec/features/issues/filtered_search/dropdown_hint_spec.rb b/spec/features/issues/filtered_search/dropdown_hint_spec.rb index 1c56902a27d..bb57d69148b 100644 --- a/spec/features/issues/filtered_search/dropdown_hint_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_hint_spec.rb @@ -68,7 +68,7 @@ describe 'Dropdown hint', :js do it 'filters with text' do filtered_search.set('a') - expect(find(js_dropdown_hint)).to have_selector('.filter-dropdown .filter-dropdown-item', count: 5) + expect(find(js_dropdown_hint)).to have_selector('.filter-dropdown .filter-dropdown-item', count: 6) end end @@ -104,6 +104,15 @@ describe 'Dropdown hint', :js do expect_filtered_search_input_empty end + it 'opens the release dropdown when you click on release' do + click_hint('release') + + expect(page).to have_css(js_dropdown_hint, visible: false) + expect(page).to have_css('#js-dropdown-release', visible: true) + expect_tokens([{ name: 'Release' }]) + expect_filtered_search_input_empty + end + it 'opens the label dropdown when you click on label' do click_hint('label') diff --git a/spec/features/issues/filtered_search/dropdown_release_spec.rb b/spec/features/issues/filtered_search/dropdown_release_spec.rb new file mode 100644 index 00000000000..eea7f2d7848 --- /dev/null +++ b/spec/features/issues/filtered_search/dropdown_release_spec.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Dropdown release', :js do + include FilteredSearchHelpers + + let!(:project) { create(:project, :repository) } + let!(:user) { create(:user) } + let!(:release) { create(:release, tag: 'v1.0', project: project) } + let!(:crazy_release) { create(:release, tag: '☺!/"#%&\'{}+,-.<>;=@]_`{|}🚀', project: project) } + + def filtered_search + find('.filtered-search') + end + + def filter_dropdown + find('#js-dropdown-release .filter-dropdown') + end + + before do + project.add_maintainer(user) + sign_in(user) + create(:issue, project: project) + + visit project_issues_path(project) + end + + describe 'behavior' do + before do + filtered_search.set('release:') + end + + def expect_results(count) + expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: count) + end + + it 'loads all the releases when opened' do + expect_results(2) + end + + it 'filters by tag name' do + filtered_search.send_keys("☺") + expect_results(1) + end + + it 'fills in the release name when the autocomplete hint is clicked' do + find('#js-dropdown-release .filter-dropdown-item', text: crazy_release.tag).click + + expect(page).to have_css('#js-dropdown-release', visible: false) + expect_tokens([release_token(crazy_release.tag)]) + expect_filtered_search_input_empty + end + end +end diff --git a/spec/features/issues/notes_on_issues_spec.rb b/spec/features/issues/notes_on_issues_spec.rb index 5247baa58a1..74eb699c7ef 100644 --- a/spec/features/issues/notes_on_issues_spec.rb +++ b/spec/features/issues/notes_on_issues_spec.rb @@ -23,7 +23,7 @@ describe 'Create notes on issues', :js do submit_comment(note_text) end - it 'creates a note with reference and cross references the issue' do + it 'creates a note with reference and cross references the issue', :sidekiq_might_not_need_inline do page.within('div#notes li.note div.note-text') do expect(page).to have_content(note_text) expect(page.find('a')).to have_content(mention.to_reference) 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 be31c45b373..8322a6afa04 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 @@ -67,7 +67,7 @@ describe 'User creates branch and merge request on issue page', :js do end context 'when branch name is auto-generated' do - it 'creates a merge request' do + it 'creates a merge request', :sidekiq_might_not_need_inline do perform_enqueued_jobs do select_dropdown_option('create-mr') @@ -96,7 +96,7 @@ describe 'User creates branch and merge request on issue page', :js do context 'when branch name is custom' do let(:branch_name) { 'custom-branch-name' } - it 'creates a merge request' do + it 'creates a merge request', :sidekiq_might_not_need_inline do perform_enqueued_jobs do select_dropdown_option('create-mr', branch_name) diff --git a/spec/features/issues/user_creates_confidential_merge_request_spec.rb b/spec/features/issues/user_creates_confidential_merge_request_spec.rb index 24089bdeb81..838c0a6349c 100644 --- a/spec/features/issues/user_creates_confidential_merge_request_spec.rb +++ b/spec/features/issues/user_creates_confidential_merge_request_spec.rb @@ -42,7 +42,7 @@ describe 'User creates confidential merge request on issue page', :js do visit_confidential_issue end - it 'create merge request in fork' do + it 'create merge request in fork', :sidekiq_might_not_need_inline do click_button 'Create confidential merge request' page.within '.create-confidential-merge-request-dropdown-menu' do diff --git a/spec/features/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb index a71395c0e47..39ce3415727 100644 --- a/spec/features/issues/user_creates_issue_spec.rb +++ b/spec/features/issues/user_creates_issue_spec.rb @@ -92,19 +92,6 @@ describe "User creates issue" do .and have_content(label_titles.first) end end - - context "with Zoom link" do - it "adds Zoom button" do - issue_title = "Issue containing Zoom meeting link" - zoom_url = "https://gitlab.zoom.us/j/123456789" - - fill_in("Title", with: issue_title) - fill_in("Description", with: zoom_url) - click_button("Submit issue") - - expect(page).to have_link('Join Zoom meeting', href: zoom_url) - end - end end context "when signed in as user with special characters in their name" do diff --git a/spec/features/issues/user_toggles_subscription_spec.rb b/spec/features/issues/user_toggles_subscription_spec.rb index 165d41950da..ba167362511 100644 --- a/spec/features/issues/user_toggles_subscription_spec.rb +++ b/spec/features/issues/user_toggles_subscription_spec.rb @@ -33,7 +33,6 @@ describe "User toggles subscription", :js do it 'is disabled' do expect(page).to have_content('Notifications have been disabled by the project or group owner') - expect(page).to have_selector('.js-emails-disabled', visible: true) expect(page).not_to have_selector('.js-issuable-subscribe-button') end end diff --git a/spec/features/markdown/metrics_spec.rb b/spec/features/markdown/metrics_spec.rb index 4de67cfcdbe..e7fec41fae3 100644 --- a/spec/features/markdown/metrics_spec.rb +++ b/spec/features/markdown/metrics_spec.rb @@ -2,8 +2,9 @@ require 'spec_helper' -describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching do +describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching, :sidekiq_might_not_need_inline do include PrometheusHelpers + include GrafanaApiHelpers let(:user) { create(:user) } let(:project) { create(:prometheus_project) } @@ -14,11 +15,7 @@ describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching do before do configure_host - import_common_metrics - stub_any_prometheus_request_with_response - project.add_developer(user) - sign_in(user) end @@ -26,31 +23,58 @@ describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching do restore_host end - it 'shows embedded metrics' do - visit project_issue_path(project, issue) + context 'internal metrics embeds' do + before do + import_common_metrics + stub_any_prometheus_request_with_response + end + + 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)') + end + + context 'when dashboard params are in included the url' do + let(:metrics_url) { metrics_project_environment_url(project, environment, **chart_params) } - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text('Memory Usage (Total)') - expect(page).to have_text('Core Usage (Total)') + 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]) + end + end end - context 'when dashboard params are in included the url' do - let(:metrics_url) { metrics_project_environment_url(project, environment, **chart_params) } + 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) } - let(:chart_params) do - { - group: 'System metrics (Kubernetes)', - title: 'Memory Usage (Pod average)', - y_label: 'Memory Used per Pod (MB)' - } + before do + stub_dashboard_request(grafana_base_url) + stub_datasource_request(grafana_base_url) + stub_all_grafana_proxy_requests(grafana_base_url) end - it 'shows embedded metrics for the specifiec chart' do + it 'shows embedded metrics' 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('Expired / Evicted') + expect(page).to have_text('expired - test-attribute-value') end end diff --git a/spec/features/merge_request/maintainer_edits_fork_spec.rb b/spec/features/merge_request/maintainer_edits_fork_spec.rb index 030638cba71..4e161d530d3 100644 --- a/spec/features/merge_request/maintainer_edits_fork_spec.rb +++ b/spec/features/merge_request/maintainer_edits_fork_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe 'a maintainer edits files on a source-branch of an MR from a fork', :js do +describe 'a maintainer edits files on a source-branch of an MR from a fork', :js, :sidekiq_might_not_need_inline do include ProjectForksHelper let(:user) { create(:user, username: 'the-maintainer') } let(:target_project) { create(:project, :public, :repository) } @@ -20,7 +20,7 @@ describe 'a maintainer edits files on a source-branch of an MR from a fork', :js end before do - stub_feature_flags(web_ide_default: false) + stub_feature_flags(web_ide_default: false, single_mr_diff_view: false) target_project.add_maintainer(user) sign_in(user) @@ -32,6 +32,8 @@ describe 'a maintainer edits files on a source-branch of an MR from a fork', :js wait_for_requests end + it_behaves_like 'rendering a single diff version' + it 'mentions commits will go to the source branch' do expect(page).to have_content('Your changes can be committed to fix because a merge request is open.') end diff --git a/spec/features/merge_request/user_accepts_merge_request_spec.rb b/spec/features/merge_request/user_accepts_merge_request_spec.rb index 4d305d43351..5e1ff232b80 100644 --- a/spec/features/merge_request/user_accepts_merge_request_spec.rb +++ b/spec/features/merge_request/user_accepts_merge_request_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe 'User accepts a merge request', :js do +describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inline do let(:merge_request) { create(:merge_request, :with_diffs, :simple, source_project: project) } let(:project) { create(:project, :public, :repository) } let(:user) { create(:user) } diff --git a/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb b/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb index be403abcc4d..0ecd32565d0 100644 --- a/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb +++ b/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb @@ -23,7 +23,7 @@ describe 'create a merge request, allowing commits from members who can merge to sign_in(user) end - it 'allows setting possible' do + it 'allows setting possible', :sidekiq_might_not_need_inline do visit_new_merge_request check 'Allow commits from members who can merge to the target branch' @@ -35,7 +35,7 @@ describe 'create a merge request, allowing commits from members who can merge to expect(page).to have_content('Allows commits from members who can merge to the target branch') end - it 'shows a message when one of the projects is private' do + it 'shows a message when one of the projects is private', :sidekiq_might_not_need_inline do source_project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) visit_new_merge_request @@ -43,7 +43,7 @@ describe 'create a merge request, allowing commits from members who can merge to expect(page).to have_content('Not available for private projects') end - it 'shows a message when the source branch is protected' do + it 'shows a message when the source branch is protected', :sidekiq_might_not_need_inline do create(:protected_branch, project: source_project, name: 'fix') visit_new_merge_request diff --git a/spec/features/merge_request/user_comments_on_diff_spec.rb b/spec/features/merge_request/user_comments_on_diff_spec.rb index 19b8a7f74b7..6a23b6cdf60 100644 --- a/spec/features/merge_request/user_comments_on_diff_spec.rb +++ b/spec/features/merge_request/user_comments_on_diff_spec.rb @@ -13,12 +13,15 @@ describe 'User comments on a diff', :js do let(:user) { create(:user) } before do + stub_feature_flags(single_mr_diff_view: false) project.add_maintainer(user) sign_in(user) visit(diffs_project_merge_request_path(project, merge_request)) end + it_behaves_like 'rendering a single diff version' + context 'when viewing comments' do context 'when toggling inline comments' do context 'in a single file' do diff --git a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb index e0724a04ea3..e6634a8ff39 100644 --- a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb +++ b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb @@ -9,6 +9,7 @@ describe 'Merge request > User creates image diff notes', :js do let(:user) { project.creator } before do + stub_feature_flags(single_mr_diff_view: false) sign_in(user) # Stub helper to return any blob file as image from public app folder. @@ -17,6 +18,8 @@ describe 'Merge request > User creates image diff notes', :js do allow_any_instance_of(DiffHelper).to receive(:diff_file_old_blob_raw_url).and_return('/favicon.png') end + it_behaves_like 'rendering a single diff version' + context 'create commit diff notes' do commit_id = '2f63565e7aac07bcdadb654e253078b727143ec4' diff --git a/spec/features/merge_request/user_creates_merge_request_spec.rb b/spec/features/merge_request/user_creates_merge_request_spec.rb index f92791cc810..67f6d8ebe32 100644 --- a/spec/features/merge_request/user_creates_merge_request_spec.rb +++ b/spec/features/merge_request/user_creates_merge_request_spec.rb @@ -25,6 +25,11 @@ describe "User creates a merge request", :js do click_button("Compare branches") + page.within('.merge-request-form') do + expect(page.find('#merge_request_title')['placeholder']).to eq 'Title' + expect(page.find('#merge_request_description')['placeholder']).to eq 'Describe the goal of the changes and what reviewers should be aware of.' + end + fill_in("Title", with: title) click_button("Submit merge request") @@ -36,7 +41,7 @@ describe "User creates a merge request", :js do context "to a forked project" do let(:forked_project) { fork_project(project, user, namespace: user.namespace, repository: true) } - it "creates a merge request" do + it "creates a merge request", :sidekiq_might_not_need_inline do visit(project_new_merge_request_path(forked_project)) expect(page).to have_content("Source branch").and have_content("Target branch") diff --git a/spec/features/merge_request/user_edits_merge_request_spec.rb b/spec/features/merge_request/user_edits_merge_request_spec.rb index 81c56855961..821db8a1d5b 100644 --- a/spec/features/merge_request/user_edits_merge_request_spec.rb +++ b/spec/features/merge_request/user_edits_merge_request_spec.rb @@ -17,7 +17,7 @@ describe 'User edits a merge request', :js do end it 'changes the target branch' do - expect(page).to have_content('Target branch') + expect(page).to have_content('From master into feature') select2('merge-test', from: '#merge_request_target_branch') click_button('Save changes') diff --git a/spec/features/merge_request/user_expands_diff_spec.rb b/spec/features/merge_request/user_expands_diff_spec.rb index f7317ec5ca7..ba7abd3af2c 100644 --- a/spec/features/merge_request/user_expands_diff_spec.rb +++ b/spec/features/merge_request/user_expands_diff_spec.rb @@ -7,6 +7,8 @@ describe 'User expands diff', :js do let(:merge_request) { create(:merge_request, source_branch: 'expand-collapse-files', source_project: project, target_project: project) } before do + stub_feature_flags(single_mr_diff_view: false) + allow(Gitlab::Git::Diff).to receive(:size_limit).and_return(100.kilobytes) allow(Gitlab::Git::Diff).to receive(:collapse_limit).and_return(10.kilobytes) @@ -15,6 +17,8 @@ describe 'User expands diff', :js do wait_for_requests end + it_behaves_like 'rendering a single diff version' + it 'allows user to expand diff' do page.within find('[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd"]') do click_link 'Click to expand it.' diff --git a/spec/features/merge_request/user_merges_merge_request_spec.rb b/spec/features/merge_request/user_merges_merge_request_spec.rb index da15a4bda4b..32e40740a61 100644 --- a/spec/features/merge_request/user_merges_merge_request_spec.rb +++ b/spec/features/merge_request/user_merges_merge_request_spec.rb @@ -10,7 +10,7 @@ describe "User merges a merge request", :js do end shared_examples "fast forward merge a merge request" do - it "merges a merge request" do + it "merges a merge request", :sidekiq_might_not_need_inline do expect(page).to have_content("Fast-forward merge without a merge commit").and have_button("Merge") page.within(".mr-state-widget") do diff --git a/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb b/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb index 4afbf30ece4..419f741d0ea 100644 --- a/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb +++ b/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb @@ -89,12 +89,12 @@ describe 'Merge request > User merges only if pipeline succeeds', :js do context 'when CI skipped' do let(:status) { :skipped } - it 'allows MR to be merged' do + it 'does not allow MR to be merged' do visit project_merge_request_path(project, merge_request) wait_for_requests - expect(page).to have_button 'Merge' + expect(page).not_to have_button 'Merge' end end end 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 ffc12ffdbaf..e40276f74e4 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 @@ -142,7 +142,7 @@ describe 'Merge request > User merges when pipeline succeeds', :js do refresh end - it 'merges merge request' do + it 'merges merge request', :sidekiq_might_not_need_inline do expect(page).to have_content 'The changes were merged' expect(merge_request.reload).to be_merged end diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb index 8b16760606c..6328c0a5133 100644 --- a/spec/features/merge_request/user_posts_diff_notes_spec.rb +++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb @@ -14,12 +14,15 @@ describe 'Merge request > User posts diff notes', :js do let(:test_note_comment) { 'this is a test note!' } before do + stub_feature_flags(single_mr_diff_view: false) set_cookie('sidebar_collapsed', 'true') project.add_developer(user) sign_in(user) end + it_behaves_like 'rendering a single diff version' + context 'when hovering over a parallel view diff file' do before do visit diffs_project_merge_request_path(project, merge_request, view: 'parallel') diff --git a/spec/features/merge_request/user_resolves_conflicts_spec.rb b/spec/features/merge_request/user_resolves_conflicts_spec.rb index e3ee80a47d7..f0949fefa3b 100644 --- a/spec/features/merge_request/user_resolves_conflicts_spec.rb +++ b/spec/features/merge_request/user_resolves_conflicts_spec.rb @@ -9,6 +9,7 @@ describe 'Merge request > User resolves conflicts', :js do before do # In order to have the diffs collapsed, we need to disable the increase feature stub_feature_flags(gitlab_git_diff_size_limit_increase: false) + stub_feature_flags(single_mr_diff_view: false) end def create_merge_request(source_branch) @@ -17,7 +18,9 @@ describe 'Merge request > User resolves conflicts', :js do end end - shared_examples "conflicts are resolved in Interactive mode" do + it_behaves_like 'rendering a single diff version' + + shared_examples 'conflicts are resolved in Interactive mode' do it 'conflicts are resolved in Interactive mode' do within find('.files-wrapper .diff-file', text: 'files/ruby/popen.rb') do click_button 'Use ours' diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb index 8b41ef86791..7cb46d90092 100644 --- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb +++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb @@ -19,6 +19,12 @@ describe 'Merge request > User resolves diff notes and threads', :js do ) end + before do + stub_feature_flags(single_mr_diff_view: false) + end + + it_behaves_like 'rendering a single diff version' + context 'no threads' do before do project.add_maintainer(user) diff --git a/spec/features/merge_request/user_reverts_merge_request_spec.rb b/spec/features/merge_request/user_reverts_merge_request_spec.rb index 71270b13c14..906ff1d61b2 100644 --- a/spec/features/merge_request/user_reverts_merge_request_spec.rb +++ b/spec/features/merge_request/user_reverts_merge_request_spec.rb @@ -20,7 +20,7 @@ describe 'User reverts a merge request', :js do visit(merge_request_path(merge_request)) end - it 'reverts a merge request' do + it 'reverts a merge request', :sidekiq_might_not_need_inline do find("a[href='#modal-revert-commit']").click page.within('#modal-revert-commit') do @@ -33,7 +33,7 @@ describe 'User reverts a merge request', :js do wait_for_requests end - it 'does not revert a merge request that was previously reverted' do + it 'does not revert a merge request that was previously reverted', :sidekiq_might_not_need_inline do find("a[href='#modal-revert-commit']").click page.within('#modal-revert-commit') do @@ -51,7 +51,7 @@ describe 'User reverts a merge request', :js do expect(page).to have_content('Sorry, we cannot revert this merge request automatically.') end - it 'reverts a merge request in a new merge request' do + it 'reverts a merge request in a new merge request', :sidekiq_might_not_need_inline do find("a[href='#modal-revert-commit']").click page.within('#modal-revert-commit') do diff --git a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb index baef831c40e..e882b401122 100644 --- a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb +++ b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb @@ -7,8 +7,8 @@ describe 'Merge request > User sees avatars on diff notes', :js do let(:project) { create(:project, :public, :repository) } let(:user) { project.creator } - let(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: "Bug NS-04") } - let(:path) { "files/ruby/popen.rb" } + let(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: 'Bug NS-04') } + let(:path) { 'files/ruby/popen.rb' } let(:position) do Gitlab::Diff::Position.new( old_path: path, @@ -21,12 +21,15 @@ describe 'Merge request > User sees avatars on diff notes', :js do let!(:note) { create(:diff_note_on_merge_request, project: project, noteable: merge_request, position: position) } before do + stub_feature_flags(single_mr_diff_view: false) project.add_maintainer(user) sign_in user set_cookie('sidebar_collapsed', 'true') end + it_behaves_like 'rendering a single diff version' + context 'discussion tab' do before do visit project_merge_request_path(project, merge_request) diff --git a/spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb b/spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb index 1d62f7f0702..d7675cd06a8 100644 --- a/spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb +++ b/spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb @@ -15,7 +15,7 @@ describe 'Merge request > User cherry-picks', :js do context 'Viewing a merged merge request' do before do - service = MergeRequests::MergeService.new(project, user) + service = MergeRequests::MergeService.new(project, user, sha: merge_request.diff_head_sha) perform_enqueued_jobs do service.execute(merge_request) 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 87fb3f5b3e7..cdffd2ae2f6 100644 --- a/spec/features/merge_request/user_sees_deployment_widget_spec.rb +++ b/spec/features/merge_request/user_sees_deployment_widget_spec.rb @@ -11,7 +11,7 @@ describe 'Merge request > User sees deployment widget', :js do let(:role) { :developer } let(:ref) { merge_request.target_branch } let(:sha) { project.commit(ref).id } - let(:pipeline) { create(:ci_pipeline_without_jobs, sha: sha, project: project, ref: ref) } + let(:pipeline) { create(:ci_pipeline, sha: sha, project: project, ref: ref) } let!(:manual) { } before do @@ -33,7 +33,7 @@ describe 'Merge request > User sees deployment widget', :js do end context 'when a user created a new merge request with the same SHA' do - let(:pipeline2) { create(:ci_pipeline_without_jobs, sha: sha, project: project, ref: 'new-patch-1') } + let(:pipeline2) { create(:ci_pipeline, sha: sha, project: project, ref: 'new-patch-1') } let(:build2) { create(:ci_build, :success, pipeline: pipeline2) } let(:environment2) { create(:environment, project: project) } let!(:deployment2) { create(:deployment, environment: environment2, sha: sha, ref: 'new-patch-1', deployable: build2) } diff --git a/spec/features/merge_request/user_sees_diff_spec.rb b/spec/features/merge_request/user_sees_diff_spec.rb index 8eeed7b0843..82dd779577c 100644 --- a/spec/features/merge_request/user_sees_diff_spec.rb +++ b/spec/features/merge_request/user_sees_diff_spec.rb @@ -9,6 +9,12 @@ describe 'Merge request > User sees diff', :js do let(:project) { create(:project, :public, :repository) } let(:merge_request) { create(:merge_request, source_project: project) } + before do + stub_feature_flags(single_mr_diff_view: false) + end + + it_behaves_like 'rendering a single diff version' + context 'when linking to note' do describe 'with unresolved note' do let(:note) { create :diff_note_on_merge_request, project: project, noteable: merge_request } @@ -62,7 +68,7 @@ describe 'Merge request > User sees diff', :js do end context 'as author' do - it 'shows direct edit link' do + it 'shows direct edit link', :sidekiq_might_not_need_inline do sign_in(author_user) visit diffs_project_merge_request_path(project, merge_request) @@ -72,7 +78,7 @@ describe 'Merge request > User sees diff', :js do end context 'as user who needs to fork' do - it 'shows fork/cancel confirmation' do + it 'shows fork/cancel confirmation', :sidekiq_might_not_need_inline do sign_in(user) visit diffs_project_merge_request_path(project, merge_request) 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 dd5662d83f2..abf159949db 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,13 +67,13 @@ describe 'Merge request > User sees pipelines triggered by merge request', :js d end end - it 'sees the latest detached merge request pipeline as the head pipeline' do + it 'sees the latest detached merge request pipeline as the head pipeline', :sidekiq_might_not_need_inline do page.within('.ci-widget-content') do expect(page).to have_content("##{detached_merge_request_pipeline.id}") end end - context 'when a user updated a merge request in the parent project' do + context 'when a user updated a merge request in the parent project', :sidekiq_might_not_need_inline do let!(:push_pipeline_2) do Ci::CreatePipelineService.new(project, user, ref: 'feature') .execute(:push) @@ -133,7 +133,7 @@ describe 'Merge request > User sees pipelines triggered by merge request', :js d end end - context 'when a user merges a merge request in the parent project' do + context 'when a user merges a merge request in the parent project', :sidekiq_might_not_need_inline do before do click_button 'Merge when pipeline succeeds' @@ -196,7 +196,7 @@ describe 'Merge request > User sees pipelines triggered by merge request', :js d end end - it 'sees the latest branch pipeline as the head pipeline' do + it 'sees the latest branch pipeline as the head pipeline', :sidekiq_might_not_need_inline do page.within('.ci-widget-content') do expect(page).to have_content("##{push_pipeline.id}") end @@ -204,7 +204,7 @@ describe 'Merge request > User sees pipelines triggered by merge request', :js d end end - context 'when a user created a merge request from a forked project to the parent project' do + context 'when a user created a merge request from a forked project to the parent project', :sidekiq_might_not_need_inline do let(:merge_request) do create(:merge_request, source_project: forked_project, diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb index 6b6226ad1c5..098f41f120d 100644 --- a/spec/features/merge_request/user_sees_merge_widget_spec.rb +++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb @@ -5,6 +5,7 @@ require 'spec_helper' describe 'Merge request > User sees merge widget', :js do include ProjectForksHelper include TestReportsHelper + include ReactiveCachingHelpers let(:project) { create(:project, :repository) } let(:project_only_mwps) { create(:project, :repository, only_allow_merge_if_pipeline_succeeds: true) } @@ -43,7 +44,7 @@ describe 'Merge request > User sees merge widget', :js do context 'view merge request' do let!(:environment) { create(:environment, project: project) } let(:sha) { project.commit(merge_request.source_branch).sha } - let(:pipeline) { create(:ci_pipeline_without_jobs, status: 'success', sha: sha, project: project, ref: merge_request.source_branch) } + let(:pipeline) { create(:ci_pipeline, status: 'success', sha: sha, project: project, ref: merge_request.source_branch) } let(:build) { create(:ci_build, :success, pipeline: pipeline) } let!(:deployment) do @@ -75,7 +76,7 @@ describe 'Merge request > User sees merge widget', :js do expect(find('.accept-merge-request')['disabled']).not_to be(true) end - it 'allows me to merge, see cherry-pick modal and load branches list' do + it 'allows me to merge, see cherry-pick modal and load branches list', :sidekiq_might_not_need_inline do wait_for_requests click_button 'Merge' @@ -190,7 +191,7 @@ describe 'Merge request > User sees merge widget', :js do end shared_examples 'pipeline widget' do - it 'shows head pipeline information' do + it 'shows head pipeline information', :sidekiq_might_not_need_inline do within '.ci-widget-content' do expect(page).to have_content("Detached merge request pipeline ##{pipeline.id} pending for #{pipeline.short_sha}") end @@ -229,7 +230,7 @@ describe 'Merge request > User sees merge widget', :js do end shared_examples 'pipeline widget' do - it 'shows head pipeline information' do + it 'shows head pipeline information', :sidekiq_might_not_need_inline do within '.ci-widget-content' do expect(page).to have_content("Merged result pipeline ##{pipeline.id} pending for #{pipeline.short_sha}") end @@ -370,7 +371,7 @@ describe 'Merge request > User sees merge widget', :js do visit project_merge_request_path(project, merge_request) end - it 'updates the MR widget' do + it 'updates the MR widget', :sidekiq_might_not_need_inline do click_button 'Merge' page.within('.mr-widget-body') do @@ -416,7 +417,7 @@ describe 'Merge request > User sees merge widget', :js do visit project_merge_request_path(project, merge_request) end - it 'user cannot remove source branch' do + it 'user cannot remove source branch', :sidekiq_might_not_need_inline do expect(page).not_to have_field('remove-source-branch-input') expect(page).to have_content('Deletes source branch') end @@ -435,6 +436,54 @@ describe 'Merge request > User sees merge widget', :js do end end + context 'exposed artifacts' do + subject { visit project_merge_request_path(project, merge_request) } + + context 'when merge request has exposed artifacts' do + let(:merge_request) { create(:merge_request, :with_exposed_artifacts, source_project: project) } + let(:job) { merge_request.head_pipeline.builds.last } + let!(:artifacts_metadata) { create(:ci_job_artifact, :metadata, job: job) } + + context 'when result has not been parsed yet' do + it 'shows parsing status' do + subject + + expect(page).to have_content('Loading artifacts') + end + end + + context 'when result has been parsed' do + before do + allow_any_instance_of(MergeRequest).to receive(:find_exposed_artifacts).and_return( + status: :parsed, data: [ + { + text: "the artifact", + url: "/namespace1/project1/-/jobs/1/artifacts/file/ci_artifacts.txt", + job_path: "/namespace1/project1/-/jobs/1", + job_name: "test" + } + ]) + end + + it 'shows the parsed results' do + subject + + expect(page).to have_content('View exposed artifact') + end + end + end + + context 'when merge request does not have exposed artifacts' do + let(:merge_request) { create(:merge_request, source_project: project) } + + it 'does not show parsing status' do + subject + + expect(page).not_to have_content('Loading artifacts') + end + end + end + context 'when merge request has test reports' do let!(:head_pipeline) do create(:ci_pipeline, @@ -696,7 +745,7 @@ describe 'Merge request > User sees merge widget', :js do context 'when MR has pipeline but user does not have permission' do let(:sha) { project.commit(merge_request.source_branch).sha } - let!(:pipeline) { create(:ci_pipeline_without_jobs, status: 'success', sha: sha, project: project, ref: merge_request.source_branch) } + let!(:pipeline) { create(:ci_pipeline, status: 'success', sha: sha, project: project, ref: merge_request.source_branch) } before do project.update( diff --git a/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb b/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb index db0d632cdf2..3d25611e1ea 100644 --- a/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb +++ b/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb @@ -11,11 +11,14 @@ describe 'Merge request > User sees MR with deleted source branch', :js do let(:user) { project.creator } before do + stub_feature_flags(single_mr_diff_view: false) merge_request.update!(source_branch: 'this-branch-does-not-exist') sign_in(user) visit project_merge_request_path(project, merge_request) end + it_behaves_like 'rendering a single diff version' + it 'shows a message about missing source branch' do expect(page).to have_content('Source branch does not exist.') end diff --git a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb index 0391794649c..9c9e0dacb87 100644 --- a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb +++ b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb @@ -21,7 +21,7 @@ describe 'Merge request > User sees notes from forked project', :js do sign_in(user) end - it 'user can reply to the comment' do + it 'user can reply to the comment', :sidekiq_might_not_need_inline do visit project_merge_request_path(project, merge_request) expect(page).to have_content('A commit comment') diff --git a/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb index 3e15a9c136b..d258b98f4a9 100644 --- a/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb +++ b/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb @@ -28,7 +28,7 @@ describe 'Merge request > User sees pipelines from forked project', :js do visit project_merge_request_path(target_project, merge_request) end - it 'user visits a pipelines page' do + it 'user visits a pipelines page', :sidekiq_might_not_need_inline do page.within('.merge-request-tabs') { click_link 'Pipelines' } page.within('.ci-table') do diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb index 7a8b938486a..f3d8f2b42f8 100644 --- a/spec/features/merge_request/user_sees_pipelines_spec.rb +++ b/spec/features/merge_request/user_sees_pipelines_spec.rb @@ -124,7 +124,7 @@ describe 'Merge request > User sees pipelines', :js do threads.each { |thr| thr.join } end - it 'user sees pipeline in merge request widget' do + it 'user sees pipeline in merge request widget', :sidekiq_might_not_need_inline do visit project_merge_request_path(project, @merge_request) expect(page.find(".ci-widget")).to have_content(TestEnv::BRANCH_SHA['feature']) diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb index 62abcff7bda..c3fce9761df 100644 --- a/spec/features/merge_request/user_sees_versions_spec.rb +++ b/spec/features/merge_request/user_sees_versions_spec.rb @@ -16,11 +16,15 @@ describe 'Merge request > User sees versions', :js do let!(:params) { {} } before do + stub_feature_flags(single_mr_diff_view: false) + project.add_maintainer(user) sign_in(user) visit diffs_project_merge_request_path(project, merge_request, params) end + it_behaves_like 'rendering a single diff version' + shared_examples 'allows commenting' do |file_id:, line_code:, comment:| it do diff_file_selector = ".diff-file[id='#{file_id}']" diff --git a/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb b/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb index 3d26ff3ed94..e2bcdfd1e2b 100644 --- a/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb +++ b/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb @@ -25,12 +25,15 @@ describe 'User comments on a diff', :js do let(:user) { create(:user) } before do + stub_feature_flags(single_mr_diff_view: false) project.add_maintainer(user) sign_in(user) visit(diffs_project_merge_request_path(project, merge_request)) end + it_behaves_like 'rendering a single diff version' + context 'single suggestion note' do it 'hides suggestion popover' do click_diff_line(find("[id='#{sample_compare.changes[1][:line_code]}']")) diff --git a/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb b/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb index 4db067a4e41..5e59bc87e68 100644 --- a/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb +++ b/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb @@ -8,6 +8,7 @@ describe 'Merge request > User toggles whitespace changes', :js do let(:user) { project.creator } before do + stub_feature_flags(single_mr_diff_view: false) project.add_maintainer(user) sign_in(user) visit diffs_project_merge_request_path(project, merge_request) @@ -15,6 +16,8 @@ describe 'Merge request > User toggles whitespace changes', :js do find('.js-show-diff-settings').click end + it_behaves_like 'rendering a single diff version' + it 'has a button to toggle whitespace changes' do expect(page).to have_content 'Show whitespace changes' end diff --git a/spec/features/merge_request/user_views_diffs_spec.rb b/spec/features/merge_request/user_views_diffs_spec.rb index 2d1eb260236..5a29477e597 100644 --- a/spec/features/merge_request/user_views_diffs_spec.rb +++ b/spec/features/merge_request/user_views_diffs_spec.rb @@ -9,6 +9,7 @@ describe 'User views diffs', :js do let(:project) { create(:project, :public, :repository) } before do + stub_feature_flags(single_mr_diff_view: false) visit(diffs_project_merge_request_path(project, merge_request)) wait_for_requests @@ -16,6 +17,8 @@ describe 'User views diffs', :js do find('.js-toggle-tree-list').click end + it_behaves_like 'rendering a single diff version' + shared_examples 'unfold diffs' do it 'unfolds diffs upwards' do first('.js-unfold').click diff --git a/spec/features/merge_requests/user_squashes_merge_request_spec.rb b/spec/features/merge_requests/user_squashes_merge_request_spec.rb index 4fc8c71e47e..a9b96c5bbf5 100644 --- a/spec/features/merge_requests/user_squashes_merge_request_spec.rb +++ b/spec/features/merge_requests/user_squashes_merge_request_spec.rb @@ -10,7 +10,7 @@ describe 'User squashes a merge request', :js do let!(:original_head) { project.repository.commit('master') } shared_examples 'squash' do - it 'squashes the commits into a single commit, and adds a merge commit' do + it 'squashes the commits into a single commit, and adds a merge commit', :sidekiq_might_not_need_inline do expect(page).to have_content('Merged') latest_master_commits = project.repository.commits_between(original_head.sha, 'master').map(&:raw) @@ -31,7 +31,7 @@ describe 'User squashes a merge request', :js do end shared_examples 'no squash' do - it 'accepts the merge request without squashing' do + it 'accepts the merge request without squashing', :sidekiq_might_not_need_inline do expect(page).to have_content('Merged') expect(project.repository).to be_merged_to_root_ref(source_branch) end @@ -47,7 +47,9 @@ describe 'User squashes a merge request', :js do before do # Prevent source branch from being removed so we can use be_merged_to_root_ref # method to check if squash was performed or not - allow_any_instance_of(MergeRequest).to receive(:force_remove_source_branch?).and_return(false) + allow_next_instance_of(MergeRequest) do |instance| + allow(instance).to receive(:force_remove_source_branch?).and_return(false) + end project.add_maintainer(user) sign_in user diff --git a/spec/features/milestones/user_views_milestones_spec.rb b/spec/features/milestones/user_views_milestones_spec.rb index 0b51ca12997..09378cab5e3 100644 --- a/spec/features/milestones/user_views_milestones_spec.rb +++ b/spec/features/milestones/user_views_milestones_spec.rb @@ -34,4 +34,31 @@ describe "User views milestones" do .and have_content(closed_issue.title) end end + + context "with associated releases" do + set(:first_release) { create(:release, project: project, name: "The first release", milestones: [milestone], released_at: Time.zone.parse('2019-10-07')) } + + context "with a single associated release" do + it "shows the associated release" do + expect(page).to have_content("Release #{first_release.name}") + expect(page).to have_link(first_release.name, href: project_releases_path(project, anchor: first_release.tag)) + end + end + + context "with lots of associated releases" do + set(:second_release) { create(:release, project: project, name: "The second release", milestones: [milestone], released_at: first_release.released_at + 1.day) } + set(:third_release) { create(:release, project: project, name: "The third release", milestones: [milestone], released_at: second_release.released_at + 1.day) } + set(:fourth_release) { create(:release, project: project, name: "The fourth release", milestones: [milestone], released_at: third_release.released_at + 1.day) } + set(:fifth_release) { create(:release, project: project, name: "The fifth release", milestones: [milestone], released_at: fourth_release.released_at + 1.day) } + + it "shows the associated releases and the truncation text" do + expect(page).to have_content("Releases #{fifth_release.name} • #{fourth_release.name} • #{third_release.name} • 2 more releases") + + expect(page).to have_link(fifth_release.name, href: project_releases_path(project, anchor: fifth_release.tag)) + expect(page).to have_link(fourth_release.name, href: project_releases_path(project, anchor: fourth_release.tag)) + expect(page).to have_link(third_release.name, href: project_releases_path(project, anchor: third_release.tag)) + expect(page).to have_link("2 more releases", href: project_releases_path(project)) + end + end + end end diff --git a/spec/features/populate_new_pipeline_vars_with_params_spec.rb b/spec/features/populate_new_pipeline_vars_with_params_spec.rb new file mode 100644 index 00000000000..5fe80e73e38 --- /dev/null +++ b/spec/features/populate_new_pipeline_vars_with_params_spec.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe "Populate new pipeline CI variables with url params", :js do + let(:user) { create(:user) } + let(:project) { create(:project) } + let(:page_path) { new_project_pipeline_path(project) } + + before do + sign_in(user) + project.add_maintainer(user) + + visit "#{page_path}?var[key1]=value1&file_var[key2]=value2" + end + + it "var[key1]=value1 populates env_var variable correctly" do + page.within('.ci-variable-list .js-row:nth-child(1)') do + expect(find('.js-ci-variable-input-variable-type').value).to eq('env_var') + expect(find('.js-ci-variable-input-key').value).to eq('key1') + expect(find('.js-ci-variable-input-value').text).to eq('value1') + end + end + + it "file_var[key2]=value2 populates file variable correctly" do + page.within('.ci-variable-list .js-row:nth-child(2)') do + expect(find('.js-ci-variable-input-variable-type').value).to eq('file') + expect(find('.js-ci-variable-input-key').value).to eq('key2') + expect(find('.js-ci-variable-input-value').text).to eq('value2') + end + end +end diff --git a/spec/features/profile_spec.rb b/spec/features/profile_spec.rb index e80a3cd32cc..0147963c0a3 100644 --- a/spec/features/profile_spec.rb +++ b/spec/features/profile_spec.rb @@ -22,7 +22,7 @@ describe 'Profile account page', :js do expect(User.exists?(user.id)).to be_truthy end - it 'deletes user', :js do + it 'deletes user', :js, :sidekiq_might_not_need_inline do click_button 'Delete account' fill_in 'password', with: '12345678' diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb index 0905ab0aef8..9839b3d6c80 100644 --- a/spec/features/profiles/user_edit_profile_spec.rb +++ b/spec/features/profiles/user_edit_profile_spec.rb @@ -23,6 +23,7 @@ describe 'User edit profile' do fill_in 'user_location', with: 'Ukraine' fill_in 'user_bio', with: 'I <3 GitLab' fill_in 'user_organization', with: 'GitLab' + select 'Data Analyst', from: 'user_role' submit_settings expect(user.reload).to have_attributes( @@ -31,7 +32,8 @@ describe 'User edit profile' do twitter: 'testtwitter', website_url: 'testurl', bio: 'I <3 GitLab', - organization: 'GitLab' + organization: 'GitLab', + role: 'data_analyst' ) expect(find('#user_location').value).to eq 'Ukraine' diff --git a/spec/features/project_group_variables_spec.rb b/spec/features/project_group_variables_spec.rb new file mode 100644 index 00000000000..c1f1c442937 --- /dev/null +++ b/spec/features/project_group_variables_spec.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Project group variables', :js do + let(:user) { create(:user) } + let(:group) { create(:group) } + let(:subgroup) { create(:group, parent: group) } + let(:subgroup_nested) { create(:group, parent: subgroup) } + let(:project) { create(:project, group: group) } + let(:project2) { create(:project, group: subgroup) } + let(:project3) { create(:project, group: subgroup_nested) } + 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(: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) } + + before do + sign_in(user) + project.add_maintainer(user) + 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 + + 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) + 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) + end + + it 'project origin keys link to ancestor groups ci_cd settings' do + visit project_path + find('.group-origin-link').click + page.within('.js-ci-variable-list-section .js-row:nth-child(2)') do + expect(find('.js-ci-variable-input-key').value).to eq(key1) + end + end +end diff --git a/spec/features/projects/badges/pipeline_badge_spec.rb b/spec/features/projects/badges/pipeline_badge_spec.rb index f2c57d702a5..af936c80886 100644 --- a/spec/features/projects/badges/pipeline_badge_spec.rb +++ b/spec/features/projects/badges/pipeline_badge_spec.rb @@ -22,7 +22,7 @@ describe 'Pipeline Badge' do let!(:job) { create(:ci_build, pipeline: pipeline) } context 'when the pipeline was successful' do - it 'displays so on the badge' do + it 'displays so on the badge', :sidekiq_might_not_need_inline do job.success visit pipeline_project_badges_path(project, ref: ref, format: :svg) @@ -33,7 +33,7 @@ describe 'Pipeline Badge' do end context 'when the pipeline failed' do - it 'shows displays so on the badge' do + it 'shows displays so on the badge', :sidekiq_might_not_need_inline do job.drop visit pipeline_project_badges_path(project, ref: ref, format: :svg) @@ -52,7 +52,7 @@ describe 'Pipeline Badge' do allow(job).to receive(:prerequisites).and_return([double]) end - it 'displays the preparing badge' do + it 'displays the preparing badge', :sidekiq_might_not_need_inline do job.enqueue visit pipeline_project_badges_path(project, ref: ref, format: :svg) @@ -63,7 +63,7 @@ describe 'Pipeline Badge' do end context 'when the pipeline is running' do - it 'shows displays so on the badge' do + it 'shows displays so on the badge', :sidekiq_might_not_need_inline do create(:ci_build, pipeline: pipeline, name: 'second build', status_event: 'run') visit pipeline_project_badges_path(project, ref: ref, format: :svg) diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb index 3b32d213754..0a5bc64b429 100644 --- a/spec/features/projects/blobs/edit_spec.rb +++ b/spec/features/projects/blobs/edit_spec.rb @@ -12,9 +12,11 @@ describe 'Editing file blob', :js do let(:readme_file_path) { 'README.md' } before do - stub_feature_flags(web_ide_default: false) + stub_feature_flags(web_ide_default: false, single_mr_diff_view: false) end + it_behaves_like 'rendering a single diff version' + context 'as a developer' do let(:user) { create(:user) } let(:role) { :developer } @@ -27,14 +29,14 @@ describe 'Editing file blob', :js do def edit_and_commit(commit_changes: true) wait_for_requests find('.js-edit-blob').click - fill_editor(content: "class NextFeature\\nend\\n") + fill_editor(content: 'class NextFeature\\nend\\n') if commit_changes click_button 'Commit changes' end end - def fill_editor(content: "class NextFeature\\nend\\n") + def fill_editor(content: 'class NextFeature\\nend\\n') wait_for_requests find('#editor') execute_script("ace.edit('editor').setValue('#{content}')") @@ -60,6 +62,13 @@ describe 'Editing file blob', :js do expect(page).to have_content 'NextFeature' end + it 'editing a template file in a sub directory does not change path' do + project.repository.create_file(user, 'ci/.gitlab-ci.yml', 'test', message: 'testing', branch_name: branch) + visit project_edit_blob_path(project, tree_join(branch, 'ci/.gitlab-ci.yml')) + + expect(find_by_id('file_path').value).to eq('ci/.gitlab-ci.yml') + end + context 'from blob file path' do before do visit project_blob_path(project, tree_join(branch, file_path)) @@ -88,13 +97,13 @@ describe 'Editing file blob', :js do context 'when rendering the preview' do it 'renders content with CommonMark' do visit project_edit_blob_path(project, tree_join(branch, readme_file_path)) - fill_editor(content: "1. one\\n - sublist\\n") + fill_editor(content: '1. one\\n - sublist\\n') click_link 'Preview' wait_for_requests # the above generates two separate lists (not embedded) in CommonMark - expect(page).to have_content("sublist") - expect(page).not_to have_xpath("//ol//li//ul") + expect(page).to have_content('sublist') + expect(page).not_to have_xpath('//ol//li//ul') end end end diff --git a/spec/features/projects/clusters/eks_spec.rb b/spec/features/projects/clusters/eks_spec.rb index 758dccd6e49..e0ebccd85ac 100644 --- a/spec/features/projects/clusters/eks_spec.rb +++ b/spec/features/projects/clusters/eks_spec.rb @@ -10,6 +10,7 @@ describe 'AWS EKS Cluster', :js do project.add_maintainer(user) gitlab_sign_in(user) allow(Projects::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 } + stub_application_setting(eks_integration_enabled: true) end context 'when user does not have a cluster and visits cluster index page' do @@ -27,7 +28,7 @@ describe 'AWS EKS Cluster', :js do end it 'user sees a form to create an EKS cluster' do - expect(page).to have_selector(:css, '.js-create-eks-cluster') + expect(page).to have_content('Create new Cluster on EKS') end end end diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb index b5ab9faa14b..bdc946a9c98 100644 --- a/spec/features/projects/clusters/gcp_spec.rb +++ b/spec/features/projects/clusters/gcp_spec.rb @@ -67,17 +67,17 @@ describe 'Gcp Cluster', :js do it 'user sees a cluster details page and creation status' do subject - expect(page).to have_content('Kubernetes cluster is being created on Google Kubernetes Engine...') + expect(page).to have_content('Kubernetes cluster is being created...') Clusters::Cluster.last.provider.make_created! - expect(page).to have_content('Kubernetes cluster was successfully created on Google Kubernetes Engine') + expect(page).to have_content('Kubernetes cluster was successfully created') end it 'user sees a error if something wrong during creation' do subject - expect(page).to have_content('Kubernetes cluster is being created on Google Kubernetes Engine...') + expect(page).to have_content('Kubernetes cluster is being created...') Clusters::Cluster.last.provider.make_errored!('Something wrong!') diff --git a/spec/features/projects/clusters/user_spec.rb b/spec/features/projects/clusters/user_spec.rb index 84f2e3e09ae..bdaeda83926 100644 --- a/spec/features/projects/clusters/user_spec.rb +++ b/spec/features/projects/clusters/user_spec.rb @@ -13,8 +13,12 @@ describe 'User Cluster', :js do gitlab_sign_in(user) allow(Projects::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 } - allow_any_instance_of(Clusters::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute) - allow_any_instance_of(Clusters::Cluster).to receive(:retrieve_connection_status).and_return(:connected) + allow_next_instance_of(Clusters::Kubernetes::CreateOrUpdateNamespaceService) do |instance| + allow(instance).to receive(:execute) + end + allow_next_instance_of(Clusters::Cluster) do |instance| + allow(instance).to receive(:retrieve_connection_status).and_return(:connected) + end end context 'when user does not have a cluster and visits cluster index page' do diff --git a/spec/features/projects/commit/cherry_pick_spec.rb b/spec/features/projects/commit/cherry_pick_spec.rb index 46a6f62ba14..34b15aeaa25 100644 --- a/spec/features/projects/commit/cherry_pick_spec.rb +++ b/spec/features/projects/commit/cherry_pick_spec.rb @@ -55,12 +55,16 @@ describe 'Cherry-pick Commits' do end end - context "I cherry-pick a commit in a new merge request" do + context "I cherry-pick a commit in a new merge request", :js do it do + find('.header-action-buttons a.dropdown-toggle').click find("a[href='#modal-cherry-pick-commit']").click page.within('#modal-cherry-pick-commit') do click_button 'Cherry-pick' end + + wait_for_requests + expect(page).to have_content("The commit has been successfully cherry-picked into cherry-pick-#{master_pickable_commit.short_id}. You can now submit a merge request to get this change into the original branch.") expect(page).to have_content("From cherry-pick-#{master_pickable_commit.short_id} into master") end diff --git a/spec/features/projects/commits/user_browses_commits_spec.rb b/spec/features/projects/commits/user_browses_commits_spec.rb index 131d9097f48..b22715a44f0 100644 --- a/spec/features/projects/commits/user_browses_commits_spec.rb +++ b/spec/features/projects/commits/user_browses_commits_spec.rb @@ -56,8 +56,6 @@ describe 'User browses commits' do project.enable_ci create(:ci_build, pipeline: pipeline) - - allow_any_instance_of(Ci::Pipeline).to receive(:ci_yaml_file).and_return('') end it 'renders commit ci info' do @@ -94,8 +92,12 @@ describe 'User browses commits' do let(:commit) { create(:commit, project: project) } it 'renders successfully' do - allow_any_instance_of(Gitlab::Diff::File).to receive(:blob).and_return(nil) - allow_any_instance_of(Gitlab::Diff::File).to receive(:binary?).and_return(true) + allow_next_instance_of(Gitlab::Diff::File) do |instance| + allow(instance).to receive(:blob).and_return(nil) + end + allow_next_instance_of(Gitlab::Diff::File) do |instance| + allow(instance).to receive(:binary?).and_return(true) + end visit(project_commit_path(project, commit)) diff --git a/spec/features/projects/compare_spec.rb b/spec/features/projects/compare_spec.rb index 34bde29c8da..df5cec80ae4 100644 --- a/spec/features/projects/compare_spec.rb +++ b/spec/features/projects/compare_spec.rb @@ -107,7 +107,9 @@ describe "Compare", :js do visit project_compare_index_path(project, from: "feature", to: "master") allow(Commit).to receive(:max_diff_options).and_return(max_files: 3) - allow_any_instance_of(DiffHelper).to receive(:render_overflow_warning?).and_return(true) + allow_next_instance_of(DiffHelper) do |instance| + allow(instance).to receive(:render_overflow_warning?).and_return(true) + end click_button('Compare') @@ -136,7 +138,7 @@ describe "Compare", :js do def select_using_dropdown(dropdown_type, selection, commit: false) dropdown = find(".js-compare-#{dropdown_type}-dropdown") dropdown.find(".compare-dropdown-toggle").click - # find input before using to wait for the inputs visiblity + # find input before using to wait for the inputs visibility dropdown.find('.dropdown-menu') dropdown.fill_in("Filter by Git revision", with: selection) wait_for_requests @@ -144,7 +146,7 @@ describe "Compare", :js do if commit dropdown.find('input[type="search"]').send_keys(:return) else - # find before all to wait for the items visiblity + # find before all to wait for the items visibility dropdown.find("a[data-ref=\"#{selection}\"]", match: :first) dropdown.all("a[data-ref=\"#{selection}\"]").last.click end diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb index dd690699ff6..3eab13cb820 100644 --- a/spec/features/projects/environments/environment_spec.rb +++ b/spec/features/projects/environments/environment_spec.rb @@ -175,8 +175,9 @@ describe 'Environment' do # # In EE we have to stub EE::Environment since it overwrites # the "terminals" method. - allow_any_instance_of(Gitlab.ee? ? EE::Environment : Environment) - .to receive(:terminals) { nil } + allow_next_instance_of(Gitlab.ee? ? EE::Environment : Environment) do |instance| + allow(instance).to receive(:terminals) { nil } + end visit terminal_project_environment_path(project, environment) end diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb index 1a2302b3d0c..74c2758c30f 100644 --- a/spec/features/projects/environments/environments_spec.rb +++ b/spec/features/projects/environments/environments_spec.rb @@ -71,7 +71,9 @@ describe 'Environments page', :js do let!(:application_prometheus) { create(:clusters_applications_prometheus, :installed, cluster: cluster) } before do - allow_any_instance_of(Kubeclient::Client).to receive(:proxy_url).and_raise(Kubeclient::HttpError.new(401, 'Unauthorized', nil)) + allow_next_instance_of(Kubeclient::Client) do |instance| + allow(instance).to receive(:proxy_url).and_raise(Kubeclient::HttpError.new(401, 'Unauthorized', nil)) + end end it 'shows one environment without error' do diff --git a/spec/features/projects/features_visibility_spec.rb b/spec/features/projects/features_visibility_spec.rb index 9ec61743a11..5553e496e7a 100644 --- a/spec/features/projects/features_visibility_spec.rb +++ b/spec/features/projects/features_visibility_spec.rb @@ -42,7 +42,9 @@ describe 'Edit Project Settings' do context 'When external issue tracker is enabled and issues enabled on project settings' do it 'does not hide issues tab' do - allow_any_instance_of(Project).to receive(:external_issue_tracker).and_return(JiraService.new) + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:external_issue_tracker).and_return(JiraService.new) + end visit project_path(project) @@ -54,7 +56,9 @@ describe 'Edit Project Settings' do it 'hides issues tab' do project.issues_enabled = false project.save! - allow_any_instance_of(Project).to receive(:external_issue_tracker).and_return(JiraService.new) + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:external_issue_tracker).and_return(JiraService.new) + end visit project_path(project) 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 0e43f2fd26b..622764487d8 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 @@ -7,13 +7,11 @@ describe 'Projects > Files > User views files page' do let(:user) { project.owner } before do - stub_feature_flags(vue_file_list: false) - sign_in user visit project_tree_path(project, project.repository.root_ref) end - it 'user sees folders and submodules sorted together, followed by files' do + it 'user sees folders and submodules sorted together, followed by files', :js do rows = all('td.tree-item-file-name').map(&:text) tree = project.repository.tree 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 943c6e0e959..9fccb3441d6 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 @@ -7,7 +7,6 @@ describe 'Projects > Files > Project owner creates a license file', :js do let(:project_maintainer) { project.owner } before do - stub_feature_flags(vue_file_list: false) project.repository.delete_file(project_maintainer, 'LICENSE', message: 'Remove LICENSE', branch_name: 'master') sign_in(project_maintainer) @@ -39,7 +38,7 @@ describe 'Projects > Files > Project owner creates a license file', :js do end it 'project maintainer creates a license file from the "Add license" link' do - click_link 'Add license' + click_link 'Add LICENSE' expect(page).to have_content('New file') expect(current_path).to eq( 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 9f63b312146..ad6c565c8f9 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 @@ -12,7 +12,7 @@ describe 'Projects > Files > Project owner sees a link to create a license file it 'project maintainer creates a license file from a template' do visit project_path(project) - click_on 'Add license' + click_on 'Add LICENSE' expect(page).to have_content('New file') expect(current_path).to eq( diff --git a/spec/features/projects/files/user_browses_files_spec.rb b/spec/features/projects/files/user_browses_files_spec.rb index 0b3f905b5de..10672bbec68 100644 --- a/spec/features/projects/files/user_browses_files_spec.rb +++ b/spec/features/projects/files/user_browses_files_spec.rb @@ -13,23 +13,22 @@ describe "User browses files" do let(:user) { project.owner } before do - stub_feature_flags(vue_file_list: false) sign_in(user) end - it "shows last commit for current directory" do + it "shows last commit for current directory", :js do visit(tree_path_root_ref) click_link("files") last_commit = project.repository.last_commit_for_path(project.default_branch, "files") - page.within(".blob-commit-info") do + page.within(".commit-detail") do expect(page).to have_content(last_commit.short_id).and have_content(last_commit.author_name) end end - context "when browsing the master branch" do + context "when browsing the master branch", :js do before do visit(tree_path_root_ref) end @@ -124,8 +123,7 @@ describe "User browses files" do expect(current_path).to eq(project_tree_path(project, "markdown/doc/raketasks")) expect(page).to have_content("backup_restore.md").and have_content("maintenance.md") - click_link("shop") - click_link("Maintenance") + click_link("maintenance.md") expect(current_path).to eq(project_blob_path(project, "markdown/doc/raketasks/maintenance.md")) expect(page).to have_content("bundle exec rake gitlab:env:info RAILS_ENV=production") @@ -144,7 +142,7 @@ describe "User browses files" do # rubocop:disable Lint/Void # Test the full URLs of links instead of relative paths by `have_link(text: "...", href: "...")`. - find("a", text: /^empty$/)["href"] == project_tree_url(project, "markdown/d") + find("a", text: "..")["href"] == project_tree_url(project, "markdown/d") # rubocop:enable Lint/Void page.within(".tree-table") do @@ -168,7 +166,7 @@ describe "User browses files" do end end - context "when browsing a specific ref" do + context "when browsing a specific ref", :js do let(:ref) { project_tree_path(project, "6d39438") } before do @@ -180,7 +178,7 @@ describe "User browses files" do expect(page).to have_content(".gitignore").and have_content("LICENSE") end - it "shows files from a repository with apostroph in its name", :js do + it "shows files from a repository with apostroph in its name" do first(".js-project-refs-dropdown").click page.within(".project-refs-form") do @@ -191,10 +189,10 @@ describe "User browses files" do visit(project_tree_path(project, "'test'")) - expect(page).to have_css(".tree-commit-link").and have_no_content("Loading commit data...") + expect(page).not_to have_selector(".tree-commit .animation-container") end - it "shows the code with a leading dot in the directory", :js do + it "shows the code with a leading dot in the directory" do first(".js-project-refs-dropdown").click page.within(".project-refs-form") do @@ -203,7 +201,7 @@ describe "User browses files" do visit(project_tree_path(project, "fix/.testdir")) - expect(page).to have_css(".tree-commit-link").and have_no_content("Loading commit data...") + expect(page).not_to have_selector(".tree-commit .animation-container") end it "does not show the permalink link" do @@ -221,7 +219,7 @@ describe "User browses files" do click_link(".gitignore") end - it "shows a file content", :js do + it "shows a file content" do expect(page).to have_content("*.rbc") end 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 08ebeed2cdd..618290416bd 100644 --- a/spec/features/projects/files/user_browses_lfs_files_spec.rb +++ b/spec/features/projects/files/user_browses_lfs_files_spec.rb @@ -7,8 +7,6 @@ describe 'Projects > Files > User browses LFS files' do let(:user) { project.owner } before do - stub_feature_flags(vue_file_list: false) - sign_in(user) end diff --git a/spec/features/projects/files/user_creates_directory_spec.rb b/spec/features/projects/files/user_creates_directory_spec.rb index 19d95c87c6c..b8765066217 100644 --- a/spec/features/projects/files/user_creates_directory_spec.rb +++ b/spec/features/projects/files/user_creates_directory_spec.rb @@ -13,8 +13,6 @@ describe 'Projects > Files > User creates a directory', :js do let(:user) { create(:user) } before do - stub_feature_flags(vue_file_list: false) - project.add_developer(user) sign_in(user) visit project_tree_path(project, 'master') @@ -71,7 +69,7 @@ describe 'Projects > Files > User creates a directory', :js do visit(project2_tree_path_root_ref) end - it 'creates a directory in a forked project' do + it 'creates a directory in a forked project', :sidekiq_might_not_need_inline do find('.add-to-tree').click click_link('New directory') diff --git a/spec/features/projects/files/user_creates_files_spec.rb b/spec/features/projects/files/user_creates_files_spec.rb index 74c037641cd..eb9a4d8cb09 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' -describe 'Projects > Files > User creates files' do +describe 'Projects > Files > User creates files', :js 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." @@ -14,7 +14,6 @@ describe 'Projects > Files > User creates files' do let(:user) { create(:user) } before do - stub_feature_flags(vue_file_list: false) stub_feature_flags(web_ide_default: false) project.add_maintainer(user) @@ -42,7 +41,7 @@ describe 'Projects > Files > User creates files' do visit(project2_tree_path_root_ref) end - it 'opens new file page on a forked project' do + it 'opens new file page on a forked project', :sidekiq_might_not_need_inline do find('.add-to-tree').click click_link('New file') @@ -68,8 +67,7 @@ describe 'Projects > Files > User creates files' do file_name = find('#file_name') file_name.set options[:file_name] || 'README.md' - file_content = find('#file-content', visible: false) - file_content.set options[:file_content] || 'Some content' + find('.ace_text-input', visible: false).send_keys.native.send_keys options[:file_content] || 'Some content' click_button 'Commit changes' end @@ -89,7 +87,7 @@ describe 'Projects > Files > User creates files' do expect(page).to have_content 'Path cannot include directory traversal' end - it 'creates and commit a new file', :js do + it 'creates and commit a new file' do find('#editor') execute_script("ace.edit('editor').setValue('*.rbca')") fill_in(:file_name, with: 'not_a_file.md') @@ -105,7 +103,7 @@ describe 'Projects > Files > User creates files' do expect(page).to have_content('*.rbca') end - it 'creates and commit a new file with new lines at the end of file', :js do + it 'creates and commit a new file with new lines at the end of file' do find('#editor') execute_script('ace.edit("editor").setValue("Sample\n\n\n")') fill_in(:file_name, with: 'not_a_file.md') @@ -122,7 +120,7 @@ describe 'Projects > Files > User creates files' do expect(evaluate_script('ace.edit("editor").getValue()')).to eq("Sample\n\n\n") end - it 'creates and commit a new file with a directory name', :js do + it 'creates and commit a new file with a directory name' do fill_in(:file_name, with: 'foo/bar/baz.txt') expect(page).to have_selector('.file-editor') @@ -139,7 +137,7 @@ describe 'Projects > Files > User creates files' do expect(page).to have_content('*.rbca') end - it 'creates and commit a new file specifying a new branch', :js do + it 'creates and commit a new file specifying a new branch' do expect(page).to have_selector('.file-editor') find('#editor') @@ -159,7 +157,7 @@ describe 'Projects > Files > User creates files' do end end - context 'when an user does not have write access' do + context 'when an user does not have write access', :sidekiq_might_not_need_inline do before do project2.add_reporter(user) visit(project2_tree_path_root_ref) @@ -174,7 +172,7 @@ describe 'Projects > Files > User creates files' do expect(page).to have_content(message) end - it 'creates and commit new file in forked project', :js do + it 'creates and commit new file in forked project' do expect(page).to have_selector('.file-editor') find('#editor') diff --git a/spec/features/projects/files/user_deletes_files_spec.rb b/spec/features/projects/files/user_deletes_files_spec.rb index fd4783cfb6b..0f543e47631 100644 --- a/spec/features/projects/files/user_deletes_files_spec.rb +++ b/spec/features/projects/files/user_deletes_files_spec.rb @@ -14,8 +14,6 @@ describe 'Projects > Files > User deletes files', :js do let(:user) { create(:user) } before do - stub_feature_flags(vue_file_list: false) - sign_in(user) end @@ -47,7 +45,7 @@ describe 'Projects > Files > User deletes files', :js do wait_for_requests end - it 'deletes the file in a forked project', :js do + it 'deletes the file in a forked project', :js, :sidekiq_might_not_need_inline do click_link('.gitignore') expect(page).to have_content('.gitignore') diff --git a/spec/features/projects/files/user_edits_files_spec.rb b/spec/features/projects/files/user_edits_files_spec.rb index 56430721ed6..374a7fb7936 100644 --- a/spec/features/projects/files/user_edits_files_spec.rb +++ b/spec/features/projects/files/user_edits_files_spec.rb @@ -12,7 +12,6 @@ describe 'Projects > Files > User edits files', :js do before do stub_feature_flags(web_ide_default: false) - stub_feature_flags(vue_file_list: false) sign_in(user) end @@ -136,7 +135,7 @@ describe 'Projects > Files > User edits files', :js do ) end - it 'inserts a content of a file in a forked project' do + it 'inserts a content of a file in a forked project', :sidekiq_might_not_need_inline do click_link('.gitignore') click_button('Edit') @@ -154,7 +153,7 @@ describe 'Projects > Files > User edits files', :js do expect(evaluate_script('ace.edit("editor").getValue()')).to eq('*.rbca') end - it 'opens the Web IDE in a forked project' do + it 'opens the Web IDE in a forked project', :sidekiq_might_not_need_inline do click_link('.gitignore') click_button('Web IDE') @@ -168,7 +167,7 @@ describe 'Projects > Files > User edits files', :js do expect(page).to have_css('.ide .multi-file-tab', text: '.gitignore') end - it 'commits an edited file in a forked project' do + it 'commits an edited file in a forked project', :sidekiq_might_not_need_inline do click_link('.gitignore') find('.js-edit-blob').click @@ -199,7 +198,7 @@ describe 'Projects > Files > User edits files', :js do wait_for_requests end - it 'links to the forked project for editing' do + it 'links to the forked project for editing', :sidekiq_might_not_need_inline do click_link('.gitignore') find('.js-edit-blob').click 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 15f8fa7438d..9d38c44b6ef 100644 --- a/spec/features/projects/files/user_reads_pipeline_status_spec.rb +++ b/spec/features/projects/files/user_reads_pipeline_status_spec.rb @@ -9,8 +9,6 @@ describe 'user reads pipeline status', :js do let(:x110_pipeline) { create_pipeline('x1.1.0', 'failed') } before do - stub_feature_flags(vue_file_list: false) - project.add_maintainer(user) project.repository.add_tag(user, 'x1.1.0', 'v1.1.0') @@ -25,7 +23,7 @@ describe 'user reads pipeline status', :js do visit project_tree_path(project, expected_pipeline.ref) wait_for_requests - page.within('.blob-commit-info') do + page.within('.commit-detail') do expect(page).to have_link('', href: project_pipeline_path(project, expected_pipeline)) expect(page).to have_selector(".ci-status-icon-#{expected_pipeline.status}") end diff --git a/spec/features/projects/files/user_replaces_files_spec.rb b/spec/features/projects/files/user_replaces_files_spec.rb index d50bc0a7d18..4c54bbdcd67 100644 --- a/spec/features/projects/files/user_replaces_files_spec.rb +++ b/spec/features/projects/files/user_replaces_files_spec.rb @@ -16,8 +16,6 @@ describe 'Projects > Files > User replaces files', :js do let(:user) { create(:user) } before do - stub_feature_flags(vue_file_list: false) - sign_in(user) end @@ -55,7 +53,7 @@ describe 'Projects > Files > User replaces files', :js do wait_for_requests end - it 'replaces an existed file with a new one in a forked project' do + it 'replaces an existed file with a new one in a forked project', :sidekiq_might_not_need_inline do click_link('.gitignore') expect(page).to have_content('.gitignore') diff --git a/spec/features/projects/files/user_uploads_files_spec.rb b/spec/features/projects/files/user_uploads_files_spec.rb index 74b5d7c5041..35a3835ff12 100644 --- a/spec/features/projects/files/user_uploads_files_spec.rb +++ b/spec/features/projects/files/user_uploads_files_spec.rb @@ -16,8 +16,6 @@ describe 'Projects > Files > User uploads files' do let(:project2_tree_path_root_ref) { project_tree_path(project2, project2.repository.root_ref) } before do - stub_feature_flags(vue_file_list: false) - project.add_maintainer(user) sign_in(user) end @@ -76,7 +74,7 @@ describe 'Projects > Files > User uploads files' do visit(project2_tree_path_root_ref) end - it 'uploads and commit a new file to a forked project', :js do + it 'uploads and commit a new file to a forked project', :js, :sidekiq_might_not_need_inline do find('.add-to-tree').click click_link('Upload file') diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb index 6792a6e2af0..0f97032eefa 100644 --- a/spec/features/projects/fork_spec.rb +++ b/spec/features/projects/fork_spec.rb @@ -27,7 +27,7 @@ describe 'Project fork' do expect(page).to have_css('a.disabled', text: 'Fork') end - it 'forks the project' do + it 'forks the project', :sidekiq_might_not_need_inline do visit project_path(project) click_link 'Fork' @@ -174,7 +174,7 @@ describe 'Project fork' do expect(page).to have_css('.fork-thumbnail.disabled') end - it 'links to the fork if the project was already forked within that namespace' do + it 'links to the fork if the project was already forked within that namespace', :sidekiq_might_not_need_inline do forked_project = fork_project(project, user, namespace: group, repository: true) visit new_project_fork_path(project) diff --git a/spec/features/projects/forks/fork_list_spec.rb b/spec/features/projects/forks/fork_list_spec.rb index 2dbe3d90bad..3b63d9a4c2d 100644 --- a/spec/features/projects/forks/fork_list_spec.rb +++ b/spec/features/projects/forks/fork_list_spec.rb @@ -15,7 +15,7 @@ describe 'listing forks of a project' do sign_in(user) end - it 'shows the forked project in the list with commit as description' do + it 'shows the forked project in the list with commit as description', :sidekiq_might_not_need_inline do visit project_forks_path(source) page.within('li.project-row') do diff --git a/spec/features/projects/graph_spec.rb b/spec/features/projects/graph_spec.rb index 6082eb03374..5dabaf20952 100644 --- a/spec/features/projects/graph_spec.rb +++ b/spec/features/projects/graph_spec.rb @@ -29,12 +29,6 @@ describe 'Project Graph', :js do end end - it 'renders graphs' do - visit project_graph_path(project, 'master') - - expect(page).to have_selector('.stat-graph', visible: false) - end - context 'commits graph' do before do visit commits_project_graph_path(project, 'master') diff --git a/spec/features/projects/import_export/export_file_spec.rb b/spec/features/projects/import_export/export_file_spec.rb index 7618a2bdea3..c15a3250221 100644 --- a/spec/features/projects/import_export/export_file_spec.rb +++ b/spec/features/projects/import_export/export_file_spec.rb @@ -26,7 +26,9 @@ describe 'Import/Export - project export integration test', :js do let(:project) { setup_project } before do - allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + allow_next_instance_of(Gitlab::ImportExport) do |instance| + allow(instance).to receive(:storage_path).and_return(export_path) + end end after do @@ -38,7 +40,7 @@ describe 'Import/Export - project export integration test', :js do sign_in(user) end - it 'exports a project successfully' do + it 'exports a project successfully', :sidekiq_might_not_need_inline do visit edit_project_path(project) expect(page).to have_content('Export project') diff --git a/spec/features/projects/import_export/import_file_spec.rb b/spec/features/projects/import_export/import_file_spec.rb index 6f96da60a31..33c7182c084 100644 --- a/spec/features/projects/import_export/import_file_spec.rb +++ b/spec/features/projects/import_export/import_file_spec.rb @@ -11,7 +11,9 @@ describe 'Import/Export - project import integration test', :js do before do stub_uploads_object_storage(FileUploader) - allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + allow_next_instance_of(Gitlab::ImportExport) do |instance| + allow(instance).to receive(:storage_path).and_return(export_path) + end gitlab_sign_in(user) end @@ -27,7 +29,7 @@ describe 'Import/Export - project import integration test', :js do let(:project_path) { 'test-project-name' + randomHex } context 'prefilled the path' do - it 'user imports an exported project successfully' do + it 'user imports an exported project successfully', :sidekiq_might_not_need_inline do visit new_project_path fill_in :project_name, with: project_name, visible: true @@ -53,7 +55,7 @@ describe 'Import/Export - project import integration test', :js do end context 'path is not prefilled' do - it 'user imports an exported project successfully' do + it 'user imports an exported project successfully', :sidekiq_might_not_need_inline do visit new_project_path click_import_project_tab click_link 'GitLab export' diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb index f5d5bc7f5b9..c9568dbb7ce 100644 --- a/spec/features/projects/jobs_spec.rb +++ b/spec/features/projects/jobs_spec.rb @@ -166,7 +166,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do let(:source_project) { fork_project(project, user, repository: true) } let(:target_project) { project } - it 'shows merge request iid and source branch' do + it 'shows merge request iid and source branch', :sidekiq_might_not_need_inline do visit project_job_path(source_project, job) within '.js-pipeline-info' do @@ -214,7 +214,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do let(:source_project) { fork_project(project, user, repository: true) } let(:target_project) { project } - it 'shows merge request iid and source branch' do + it 'shows merge request iid and source branch', :sidekiq_might_not_need_inline do visit project_job_path(source_project, job) within '.js-pipeline-info' do diff --git a/spec/features/projects/labels/search_labels_spec.rb b/spec/features/projects/labels/search_labels_spec.rb index 2d5a138c3cc..e2eec7400ff 100644 --- a/spec/features/projects/labels/search_labels_spec.rb +++ b/spec/features/projects/labels/search_labels_spec.rb @@ -68,7 +68,7 @@ describe 'Search for labels', :js do find('#label-search').native.send_keys(:enter) page.within('.prioritized-labels') do - expect(page).to have_content('No prioritised labels with such name or description') + expect(page).to have_content('No prioritized labels with such name or description') end page.within('.other-labels') do diff --git a/spec/features/projects/members/member_leaves_project_spec.rb b/spec/features/projects/members/member_leaves_project_spec.rb index fb1165838c7..cb7a405e821 100644 --- a/spec/features/projects/members/member_leaves_project_spec.rb +++ b/spec/features/projects/members/member_leaves_project_spec.rb @@ -20,7 +20,7 @@ describe 'Projects > Members > Member leaves project' do expect(project.users.exists?(user.id)).to be_falsey end - it 'user leaves project by url param', :js do + it 'user leaves project by url param', :js, :quarantine do visit project_path(project, leave: 1) page.accept_confirm diff --git a/spec/features/projects/members/user_requests_access_spec.rb b/spec/features/projects/members/user_requests_access_spec.rb index a77f0bdcbe9..7e7faca9741 100644 --- a/spec/features/projects/members/user_requests_access_spec.rb +++ b/spec/features/projects/members/user_requests_access_spec.rb @@ -26,7 +26,6 @@ describe 'Projects > Members > User requests access', :js do expect(ActionMailer::Base.deliveries.last.subject).to eq "Request to join the #{project.full_name} project" expect(project.requesters.exists?(user_id: user)).to be_truthy - expect(page).to have_content 'Your request for access has been queued for review.' expect(page).to have_content 'Withdraw Access Request' expect(page).not_to have_content 'Leave Project' @@ -64,7 +63,6 @@ describe 'Projects > Members > User requests access', :js do accept_confirm { click_link 'Withdraw Access Request' } - expect(page).to have_content 'Your access request to the project has been withdrawn.' expect(page).not_to have_content 'Withdraw Access Request' expect(page).to have_content 'Request Access' end diff --git a/spec/features/projects/milestones/milestone_spec.rb b/spec/features/projects/milestones/milestone_spec.rb index 5e94b2f721e..fb9667cd67d 100644 --- a/spec/features/projects/milestones/milestone_spec.rb +++ b/spec/features/projects/milestones/milestone_spec.rb @@ -7,6 +7,18 @@ describe 'Project milestone' do let(:project) { create(:project, name: 'test', namespace: user.namespace) } let(:milestone) { create(:milestone, project: project) } + def toggle_sidebar + find('.milestone-sidebar .gutter-toggle').click + end + + def sidebar_release_block + find('.milestone-sidebar .block.releases') + end + + def sidebar_release_block_collapsed_icon + find('.milestone-sidebar .block.releases .sidebar-collapsed-icon') + end + before do sign_in(user) end @@ -39,15 +51,16 @@ describe 'Project milestone' do context 'when project has disabled issues' do before do + create(:issue, project: project, milestone: milestone) project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED) + visit project_milestone_path(project, milestone) end - it 'hides issues tab' do + it 'does not show any issues under the issues tab' do within('#content-body') do - expect(page).not_to have_link 'Issues', href: '#tab-issues' - expect(page).to have_selector '.nav-links li a.active', count: 1 - expect(find('.nav-links li a.active')).to have_content 'Merge Requests' + expect(find('.nav-links li a.active')).to have_content 'Issues' + expect(page).not_to have_selector '.issuable-row' end end @@ -75,17 +88,96 @@ describe 'Project milestone' do describe 'the collapsed sidebar' do before do - find('.milestone-sidebar .gutter-toggle').click + toggle_sidebar end it 'shows the total MR and issue counts' do find('.milestone-sidebar .block', match: :first) aggregate_failures 'MR and issue blocks' do - expect(find('.milestone-sidebar .block.issues')).to have_content 1 - expect(find('.milestone-sidebar .block.merge-requests')).to have_content 0 + expect(find('.milestone-sidebar .block.issues')).to have_content '1' + expect(find('.milestone-sidebar .block.merge-requests')).to have_content '0' end end end end + + context 'when the milestone is not associated with a release' do + before do + visit project_milestone_path(project, milestone) + end + + it 'shows "None" in the "Releases" section' do + expect(sidebar_release_block).to have_content 'Releases None' + end + + describe 'when the sidebar is collapsed' do + before do + toggle_sidebar + end + + it 'shows "0" in the "Releases" section' do + expect(sidebar_release_block).to have_content '0' + end + + it 'has a tooltip that reads "Releases"' do + expect(sidebar_release_block_collapsed_icon['title']).to eq 'Releases' + end + end + end + + context 'when the milestone is associated with one release' do + before do + create(:release, project: project, name: 'Version 5', milestones: [milestone]) + + visit project_milestone_path(project, milestone) + end + + it 'shows "Version 5" in the "Release" section' do + expect(sidebar_release_block).to have_content 'Release Version 5' + end + + describe 'when the sidebar is collapsed' do + before do + toggle_sidebar + end + + it 'shows "1" in the "Releases" section' do + expect(sidebar_release_block).to have_content '1' + end + + it 'has a tooltip that reads "1 release"' do + expect(sidebar_release_block_collapsed_icon['title']).to eq '1 release' + end + end + end + + context 'when the milestone is associated with multiple releases' do + before do + (5..10).each do |num| + released_at = Time.zone.parse('2019-10-04') + num.months + create(:release, project: project, name: "Version #{num}", milestones: [milestone], released_at: released_at) + end + + visit project_milestone_path(project, milestone) + end + + it 'shows a shortened list of releases in the "Releases" section' do + expect(sidebar_release_block).to have_content 'Releases Version 10 • Version 9 • Version 8 • 3 more releases' + end + + describe 'when the sidebar is collapsed' do + before do + toggle_sidebar + end + + it 'shows "6" in the "Releases" section' do + expect(sidebar_release_block).to have_content '6' + end + + it 'has a tooltip that reads "6 releases"' do + expect(sidebar_release_block_collapsed_icon['title']).to eq '6 releases' + end + end + end end diff --git a/spec/features/projects/pages_lets_encrypt_spec.rb b/spec/features/projects/pages_lets_encrypt_spec.rb index 8b5964b2eee..d09014e915d 100644 --- a/spec/features/projects/pages_lets_encrypt_spec.rb +++ b/spec/features/projects/pages_lets_encrypt_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' describe "Pages with Let's Encrypt", :https_pages_enabled do include LetsEncryptHelpers - let(:project) { create(:project) } + let(:project) { create(:project, pages_https_only: false) } let(:user) { create(:user) } let(:role) { :maintainer } let(:certificate_pem) { attributes_for(:pages_domain)[:certificate] } @@ -18,7 +18,21 @@ describe "Pages with Let's Encrypt", :https_pages_enabled do project.add_role(user, role) sign_in(user) project.namespace.update(owner: user) - allow_any_instance_of(Project).to receive(:pages_deployed?) { true } + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:pages_deployed?) { true } + end + end + + it "creates new domain with Let's Encrypt enabled by default" do + visit new_project_pages_domain_path(project) + + fill_in 'Domain', with: 'my.test.domain.com' + + expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'true' + click_button 'Create New Domain' + + expect(page).to have_content('my.test.domain.com') + expect(PagesDomain.find_by_domain('my.test.domain.com').auto_ssl_enabled).to eq(true) end context 'when the auto SSL management is initially disabled' do @@ -32,14 +46,14 @@ describe "Pages with Let's Encrypt", :https_pages_enabled do expect(domain.auto_ssl_enabled).to eq false expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'false' - expect(page).to have_field 'Certificate (PEM)', type: 'textarea' - expect(page).to have_field 'Key (PEM)', type: 'textarea' + expect(page).to have_selector '.card-header', text: 'Certificate' + expect(page).to have_text domain.subject find('.js-auto-ssl-toggle-container .project-feature-toggle').click expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'true' - expect(page).not_to have_field 'Certificate (PEM)', type: 'textarea' - expect(page).not_to have_field 'Key (PEM)', type: 'textarea' + expect(page).not_to have_selector '.card-header', text: 'Certificate' + expect(page).not_to have_text domain.subject click_on 'Save Changes' @@ -65,9 +79,6 @@ describe "Pages with Let's Encrypt", :https_pages_enabled do expect(page).to have_field 'Certificate (PEM)', type: 'textarea' expect(page).to have_field 'Key (PEM)', type: 'textarea' - fill_in 'Certificate (PEM)', with: certificate_pem - fill_in 'Key (PEM)', with: certificate_key - click_on 'Save Changes' expect(domain.reload.auto_ssl_enabled).to eq false @@ -79,7 +90,8 @@ describe "Pages with Let's Encrypt", :https_pages_enabled do it 'user do not see private key' do visit edit_project_pages_domain_path(project, domain) - expect(find_field('Key (PEM)', visible: :all, disabled: :all).value).to be_blank + expect(page).not_to have_selector '.card-header', text: 'Certificate' + expect(page).not_to have_text domain.subject end end @@ -96,12 +108,23 @@ describe "Pages with Let's Encrypt", :https_pages_enabled do end context 'when certificate is provided by user' do - let(:domain) { create(:pages_domain, project: project) } + let(:domain) { create(:pages_domain, project: project, auto_ssl_enabled: false) } + + it 'user sees certificate subject' do + visit edit_project_pages_domain_path(project, domain) + + expect(page).to have_selector '.card-header', text: 'Certificate' + expect(page).to have_text domain.subject + end - it 'user sees private key' do + it 'user can delete the certificate', :js do visit edit_project_pages_domain_path(project, domain) - expect(find_field('Key (PEM)').value).not_to be_blank + expect(page).to have_selector '.card-header', text: 'Certificate' + expect(page).to have_text domain.subject + within('.card') { accept_confirm { click_on 'Remove' } } + expect(page).to have_field 'Certificate (PEM)', with: '' + expect(page).to have_field 'Key (PEM)', with: '' end end end diff --git a/spec/features/projects/pages_spec.rb b/spec/features/projects/pages_spec.rb index d55e9d12801..3c4b5b2c4ca 100644 --- a/spec/features/projects/pages_spec.rb +++ b/spec/features/projects/pages_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' shared_examples 'pages settings editing' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project, pages_https_only: false) } let(:user) { create(:user) } let(:role) { :maintainer } @@ -30,12 +30,52 @@ shared_examples 'pages settings editing' do expect(page).to have_content('Access pages') end + context 'when pages are disabled in the project settings' do + it 'renders disabled warning' do + project.project_feature.update!(pages_access_level: ProjectFeature::DISABLED) + + visit project_pages_path(project) + + expect(page).to have_content('GitLab Pages are disabled for this project') + end + end + it 'renders first deployment warning' do visit project_pages_path(project) expect(page).to have_content('It may take up to 30 minutes before the site is available after the first deployment.') end + shared_examples 'does not render access control warning' do + it 'does not render access control warning' do + visit project_pages_path(project) + + expect(page).not_to have_content('Access Control is enabled for this Pages website') + end + end + + include_examples 'does not render access control warning' + + context 'when access control is enabled in gitlab settings' do + before do + stub_pages_setting(access_control: true) + end + + it 'renders access control warning' do + visit project_pages_path(project) + + expect(page).to have_content('Access Control is enabled for this Pages website') + end + + context 'when pages are public' do + before do + project.project_feature.update!(pages_access_level: ProjectFeature::PUBLIC) + end + + include_examples 'does not render access control warning' + end + end + context 'when support for external domains is disabled' do it 'renders message that support is disabled' do visit project_pages_path(project) @@ -93,7 +133,7 @@ shared_examples 'pages settings editing' do end end - context 'when pages are exposed on external HTTPS address', :https_pages_enabled do + context 'when pages are exposed on external HTTPS address', :https_pages_enabled, :js do let(:certificate_pem) do <<~PEM -----BEGIN CERTIFICATE----- @@ -138,6 +178,11 @@ shared_examples 'pages settings editing' do visit new_project_pages_domain_path(project) fill_in 'Domain', with: 'my.test.domain.com' + + if ::Gitlab::LetsEncrypt.enabled? + find('.js-auto-ssl-toggle-container .project-feature-toggle').click + end + fill_in 'Certificate (PEM)', with: certificate_pem fill_in 'Key (PEM)', with: certificate_key click_button 'Create New Domain' @@ -145,27 +190,49 @@ shared_examples 'pages settings editing' do expect(page).to have_content('my.test.domain.com') end + describe 'with dns verification enabled' do + before do + stub_application_setting(pages_domain_verification_enabled: true) + end + + it 'shows the DNS verification record' do + domain = create(:pages_domain, project: project) + + visit project_pages_path(project) + + within('#content-body') { click_link 'Edit' } + expect(page).to have_field :domain_verification, with: "#{domain.verification_domain} TXT #{domain.keyed_verification_code}" + end + end + describe 'updating the certificate for an existing domain' do let!(:domain) do - create(:pages_domain, project: project) + create(:pages_domain, project: project, auto_ssl_enabled: false) end it 'allows the certificate to be updated' do visit project_pages_path(project) - within('#content-body') { click_link 'Details' } - click_link 'Edit' + within('#content-body') { click_link 'Edit' } click_button 'Save Changes' expect(page).to have_content('Domain was updated') end context 'when the certificate is invalid' do + let!(:domain) do + create(:pages_domain, :without_certificate, :without_key, project: project) + end + it 'tells the user what the problem is' do visit project_pages_path(project) - within('#content-body') { click_link 'Details' } - click_link 'Edit' + within('#content-body') { click_link 'Edit' } + + if ::Gitlab::LetsEncrypt.enabled? + find('.js-auto-ssl-toggle-container .project-feature-toggle').click + end + fill_in 'Certificate (PEM)', with: 'invalid data' click_button 'Save Changes' @@ -174,6 +241,27 @@ shared_examples 'pages settings editing' do expect(page).to have_content("Key doesn't match the certificate") end end + + it 'allows the certificate to be removed', :js do + visit project_pages_path(project) + + within('#content-body') { click_link 'Edit' } + + accept_confirm { click_link 'Remove' } + + expect(page).to have_field('Certificate (PEM)', with: '') + expect(page).to have_field('Key (PEM)', with: '') + domain.reload + expect(domain.certificate).to be_nil + expect(domain.key).to be_nil + end + + it 'shows the DNS CNAME record' do + visit project_pages_path(project) + + within('#content-body') { click_link 'Edit' } + expect(page).to have_field :domain_dns, with: "#{domain.domain} CNAME #{domain.project.pages_subdomain}.#{Settings.pages.host}." + end end end end @@ -210,7 +298,7 @@ shared_examples 'pages settings editing' do end end - describe 'HTTPS settings', :js, :https_pages_enabled do + describe 'HTTPS settings', :https_pages_enabled do before do project.namespace.update(owner: user) @@ -318,18 +406,21 @@ shared_examples 'pages settings editing' do expect(page).to have_link('Remove pages') - click_link 'Remove pages' + accept_confirm { click_link 'Remove pages' } - expect(project.pages_deployed?).to be_falsey + expect(page).to have_content('Pages were removed') + expect(project.reload.pages_deployed?).to be_falsey end end end end -describe 'Pages' do +describe 'Pages', :js do include LetsEncryptHelpers - include_examples 'pages settings editing' + context 'when editing normally' do + include_examples 'pages settings editing' + end context 'when letsencrypt support is enabled' do before do diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb index 04adb1ec6af..94fac9a2eb5 100644 --- a/spec/features/projects/pipelines/pipeline_spec.rb +++ b/spec/features/projects/pipelines/pipeline_spec.rb @@ -128,7 +128,7 @@ describe 'Pipeline', :js do end end - it 'cancels the running build and shows retry button' do + it 'cancels the running build and shows retry button', :sidekiq_might_not_need_inline do find('#ci-badge-deploy .ci-action-icon-container').click page.within('#ci-badge-deploy') do @@ -146,7 +146,7 @@ describe 'Pipeline', :js do end end - it 'cancels the preparing build and shows retry button' do + it 'cancels the preparing build and shows retry button', :sidekiq_might_not_need_inline do find('#ci-badge-deploy .ci-action-icon-container').click page.within('#ci-badge-deploy') do @@ -186,7 +186,7 @@ describe 'Pipeline', :js do end end - it 'unschedules the delayed job and shows play button as a manual job' do + it 'unschedules the delayed job and shows play button as a manual job', :sidekiq_might_not_need_inline do find('#ci-badge-delayed-job .ci-action-icon-container').click page.within('#ci-badge-delayed-job') do @@ -305,7 +305,9 @@ describe 'Pipeline', :js do find('.js-retry-button').click end - it { expect(page).not_to have_content('Retry') } + it 'does not show a "Retry" button', :sidekiq_might_not_need_inline do + expect(page).not_to have_content('Retry') + end end end @@ -321,7 +323,9 @@ describe 'Pipeline', :js do click_on 'Cancel running' end - it { expect(page).not_to have_content('Cancel running') } + it 'does not show a "Cancel running" button', :sidekiq_might_not_need_inline do + expect(page).not_to have_content('Cancel running') + end end end @@ -400,7 +404,7 @@ describe 'Pipeline', :js do visit project_pipeline_path(source_project, pipeline) end - it 'shows the pipeline information' do + it 'shows the pipeline information', :sidekiq_might_not_need_inline do within '.pipeline-info' do expect(page).to have_content("#{pipeline.statuses.count} jobs " \ "for !#{merge_request.iid} " \ @@ -473,7 +477,7 @@ describe 'Pipeline', :js do visit project_pipeline_path(source_project, pipeline) end - it 'shows the pipeline information' do + it 'shows the pipeline information', :sidekiq_might_not_need_inline do within '.pipeline-info' do expect(page).to have_content("#{pipeline.statuses.count} jobs " \ "for !#{merge_request.iid} " \ @@ -651,7 +655,9 @@ describe 'Pipeline', :js do find('.js-retry-button').click end - it { expect(page).not_to have_content('Retry') } + it 'does not show a "Retry" button', :sidekiq_might_not_need_inline do + expect(page).not_to have_content('Retry') + end end end @@ -663,7 +669,9 @@ describe 'Pipeline', :js do click_on 'Cancel running' end - it { expect(page).not_to have_content('Cancel running') } + it 'does not show a "Cancel running" button', :sidekiq_might_not_need_inline do + expect(page).not_to have_content('Cancel running') + end end end @@ -778,10 +786,10 @@ describe 'Pipeline', :js do expect(page).to have_content(failed_build.stage) end - it 'does not show trace' do + it 'does not show log' do subject - expect(page).to have_content('No job trace') + expect(page).to have_content('No job log') end end diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 76d8ad1638b..f6eeb8d7065 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -133,14 +133,14 @@ describe 'Pipelines', :js do wait_for_requests end - it 'indicated that pipelines was canceled' 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') end end end - context 'when pipeline is retryable' do + context 'when pipeline is retryable', :sidekiq_might_not_need_inline do let!(:build) do create(:ci_build, pipeline: pipeline, stage: 'test') @@ -185,33 +185,29 @@ describe 'Pipelines', :js do visit project_pipelines_path(source_project) end - shared_examples_for 'showing detached merge request pipeline information' do - it 'shows detached tag for the pipeline' do + shared_examples_for 'detached merge request pipeline' do + it 'shows pipeline information without pipeline ref', :sidekiq_might_not_need_inline do within '.pipeline-tags' do expect(page).to have_content('detached') end - end - it 'shows the link of the merge request' do within '.branch-commit' do expect(page).to have_link(merge_request.iid, href: project_merge_request_path(project, merge_request)) end - end - it 'does not show the ref of the pipeline' do within '.branch-commit' do expect(page).not_to have_link(pipeline.ref) end end end - it_behaves_like 'showing detached merge request pipeline information' + it_behaves_like 'detached merge request pipeline' context 'when source project is a forked project' do let(:source_project) { fork_project(project, user, repository: true) } - it_behaves_like 'showing detached merge request pipeline information' + it_behaves_like 'detached merge request pipeline' end end @@ -233,20 +229,16 @@ describe 'Pipelines', :js do end shared_examples_for 'Correct merge request pipeline information' do - it 'does not show detached tag for the pipeline' do + it 'does not show detached tag for the pipeline, and shows the link of the merge request, and does not show the ref of the pipeline', :sidekiq_might_not_need_inline do within '.pipeline-tags' do expect(page).not_to have_content('detached') end - end - it 'shows the link of the merge request' do within '.branch-commit' do expect(page).to have_link(merge_request.iid, href: project_merge_request_path(project, merge_request)) end - end - it 'does not show the ref of the pipeline' do within '.branch-commit' do expect(page).not_to have_link(pipeline.ref) end @@ -429,7 +421,7 @@ describe 'Pipelines', :js do find('.js-modal-primary-action').click end - it 'indicates that pipeline was canceled' 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') end @@ -452,7 +444,7 @@ describe 'Pipelines', :js do expect(page).not_to have_selector('.js-pipelines-retry-button') end - it 'has failed pipeline' do + it 'has failed pipeline', :sidekiq_might_not_need_inline do expect(page).to have_selector('.ci-failed') end end diff --git a/spec/features/projects/settings/operations_settings_spec.rb b/spec/features/projects/settings/operations_settings_spec.rb index d96e243d96b..9bbeb0eb260 100644 --- a/spec/features/projects/settings/operations_settings_spec.rb +++ b/spec/features/projects/settings/operations_settings_spec.rb @@ -102,5 +102,30 @@ describe 'Projects > Settings > For a forked project', :js do end end end + + context '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/user_manages_merge_requests_settings_spec.rb b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb index 9f09c5c4501..c0089e3c28c 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 @@ -107,4 +107,27 @@ describe 'Projects > Settings > User manages merge request settings' do expect(project.printing_merge_request_link_enabled).to be(false) end end + + describe 'Checkbox to remove source branch after merge', :js do + it 'is initially checked' do + checkbox = find_field('project_remove_source_branch_after_merge') + expect(checkbox).to be_checked + end + + it 'when unchecked sets :remove_source_branch_after_merge to false' do + uncheck('project_remove_source_branch_after_merge') + within('.merge-request-settings-form') do + find('.qa-save-merge-request-changes') + click_on('Save changes') + end + + find('.flash-notice') + checkbox = find_field('project_remove_source_branch_after_merge') + + expect(checkbox).not_to be_checked + + project.reload + expect(project.remove_source_branch_after_merge).to be(false) + end + end end 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 bbb3a066ed5..ff133b58f89 100644 --- a/spec/features/projects/show/user_sees_collaboration_links_spec.rb +++ b/spec/features/projects/show/user_sees_collaboration_links_spec.rb @@ -2,12 +2,11 @@ require 'spec_helper' -describe 'Projects > Show > Collaboration links' do +describe 'Projects > Show > Collaboration links', :js do let(:project) { create(:project, :repository) } let(:user) { create(:user) } before do - stub_feature_flags(vue_file_list: false) project.add_developer(user) sign_in(user) end @@ -17,15 +16,21 @@ describe 'Projects > Show > Collaboration links' do # The navigation bar page.within('.header-new') do + find('.qa-new-menu-toggle').click + aggregate_failures 'dropdown links in the navigation bar' do expect(page).to have_link('New issue') expect(page).to have_link('New merge request') expect(page).to have_link('New snippet', href: new_project_snippet_path(project)) end + + find('.qa-new-menu-toggle').click end # The dropdown above the tree page.within('.repo-breadcrumb') do + find('.qa-add-to-tree').click + aggregate_failures 'dropdown links above the repo tree' do expect(page).to have_link('New file') expect(page).to have_link('Upload file') @@ -45,23 +50,19 @@ describe 'Projects > Show > Collaboration links' do visit project_path(project) page.within('.header-new') do + find('.qa-new-menu-toggle').click + aggregate_failures 'dropdown links' do expect(page).not_to have_link('New issue') expect(page).not_to have_link('New merge request') expect(page).not_to have_link('New snippet', href: new_project_snippet_path(project)) end - end - page.within('.repo-breadcrumb') do - aggregate_failures 'dropdown links' do - expect(page).not_to have_link('New file') - expect(page).not_to have_link('Upload file') - expect(page).not_to have_link('New directory') - expect(page).not_to have_link('New branch') - expect(page).not_to have_link('New tag') - end + find('.qa-new-menu-toggle').click end + expect(page).not_to have_selector('.qa-add-to-tree') + expect(page).not_to have_link('Web IDE') 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 fdc238d55cf..cf1a679102c 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 @@ -5,10 +5,6 @@ require 'spec_helper' describe 'Projects > Show > User sees last commit CI status' do set(:project) { create(:project, :repository, :public) } - before do - stub_feature_flags(vue_file_list: false) - end - it 'shows the project README', :js do project.enable_ci pipeline = create(:ci_pipeline, project: project, sha: project.commit.sha, ref: 'master') @@ -16,9 +12,9 @@ describe 'Projects > Show > User sees last commit CI status' do visit project_path(project) - page.within '.blob-commit-info' do + page.within '.commit-detail' do expect(page).to have_content(project.commit.sha[0..6]) - expect(page).to have_link('Pipeline: skipped') + expect(page).to have_selector('[aria-label="Commit: skipped"]') end end end 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 c136d7607fd..41c3c6b5770 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 @@ -59,8 +59,8 @@ describe 'Projects > Show > User sees setup shortcut buttons' do end it '"Add license" button linked to new file populated for a license' do - page.within('.project-stats') do - expect(page).to have_link('Add license', href: presenter.add_license_path) + page.within('.project-buttons') do + expect(page).to have_link('Add LICENSE', href: presenter.add_license_path) end end end @@ -175,7 +175,7 @@ describe 'Projects > Show > User sees setup shortcut buttons' do expect(project.repository.license_blob).not_to be_nil page.within('.project-buttons') do - expect(page).not_to have_link('Add license') + expect(page).not_to have_link('Add LICENSE') end end diff --git a/spec/features/projects/tree/tree_show_spec.rb b/spec/features/projects/tree/tree_show_spec.rb index ca616be341d..180ffac4d4d 100644 --- a/spec/features/projects/tree/tree_show_spec.rb +++ b/spec/features/projects/tree/tree_show_spec.rb @@ -10,7 +10,6 @@ describe 'Projects tree', :js do let(:test_sha) { '7975be0116940bf2ad4321f79d02a55c5f7779aa' } before do - stub_feature_flags(vue_file_list: false) project.add_maintainer(user) sign_in(user) end diff --git a/spec/features/projects/view_on_env_spec.rb b/spec/features/projects/view_on_env_spec.rb index beb32104809..832985f1a30 100644 --- a/spec/features/projects/view_on_env_spec.rb +++ b/spec/features/projects/view_on_env_spec.rb @@ -9,9 +9,13 @@ describe 'View on environment', :js do let(:user) { project.creator } before do + stub_feature_flags(single_mr_diff_view: false) + project.add_maintainer(user) end + it_behaves_like 'rendering a single diff version' + context 'when the branch has a route map' do let(:route_map) do <<-MAP.strip_heredoc @@ -26,7 +30,7 @@ describe 'View on environment', :js do user, start_branch: branch_name, branch_name: branch_name, - commit_message: "Add .gitlab/route-map.yml", + commit_message: 'Add .gitlab/route-map.yml', file_path: '.gitlab/route-map.yml', file_content: route_map ).execute @@ -37,9 +41,9 @@ describe 'View on environment', :js do user, start_branch: branch_name, branch_name: branch_name, - commit_message: "Update feature", + commit_message: 'Update feature', file_path: file_path, - file_content: "# Noop" + file_content: '# Noop' ).execute end diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb index 67ae26d8d1e..90e48f3c230 100644 --- a/spec/features/projects_spec.rb +++ b/spec/features/projects_spec.rb @@ -6,10 +6,6 @@ describe 'Project' do include ProjectForksHelper include MobileHelpers - before do - stub_feature_flags(vue_file_list: false) - end - describe 'creating from template' do let(:user) { create(:user) } let(:template) { Gitlab::ProjectTemplate.find(:rails) } @@ -190,7 +186,7 @@ describe 'Project' do sign_in user end - it 'shows a link to the source project when it is available' do + it 'shows a link to the source project when it is available', :sidekiq_might_not_need_inline do visit project_path(forked_project) expect(page).to have_content('Forked from') @@ -206,7 +202,7 @@ describe 'Project' do expect(page).not_to have_content('Forked from') end - it 'shows the name of the deleted project when the source was deleted' do + it 'shows the name of the deleted project when the source was deleted', :sidekiq_might_not_need_inline do forked_project Projects::DestroyService.new(base_project, base_project.owner).execute @@ -218,7 +214,7 @@ describe 'Project' do context 'a fork of a fork' do let(:fork_of_fork) { fork_project(forked_project, user, repository: true) } - it 'links to the base project if the source project is removed' do + it 'links to the base project if the source project is removed', :sidekiq_might_not_need_inline do fork_of_fork Projects::DestroyService.new(forked_project, user).execute @@ -263,7 +259,7 @@ describe 'Project' do expect(page).to have_selector '#confirm_name_input:focus' end - it 'removes a project' do + it 'removes a project', :sidekiq_might_not_need_inline do expect { remove_with_confirm('Remove project', project.path) }.to change { Project.count }.by(-1) expect(page).to have_content "Project '#{project.full_name}' is in the process of being deleted." expect(Project.all.count).to be_zero @@ -272,7 +268,7 @@ describe 'Project' do end end - describe 'tree view (default view is set to Files)' do + describe 'tree view (default view is set to Files)', :js do let(:user) { create(:user, project_view: 'files') } let(:project) { create(:forked_project_with_submodules) } @@ -285,19 +281,19 @@ describe 'Project' do it 'has working links to files' do click_link('PROCESS.md') - expect(page.status_code).to eq(200) + expect(page).to have_selector('.file-holder') end it 'has working links to directories' do click_link('encoding') - expect(page.status_code).to eq(200) + expect(page).to have_selector('.breadcrumb-item', text: 'encoding') end it 'has working links to submodules' do click_link('645f6c4c') - expect(page.status_code).to eq(200) + expect(page).to have_selector('.qa-branches-select', text: '645f6c4c82fd3f5e06f67134450a570b795e55a6') end context 'for signed commit on default branch', :js do diff --git a/spec/features/raven_js_spec.rb b/spec/features/raven_js_spec.rb deleted file mode 100644 index 38699f0cc1b..00000000000 --- a/spec/features/raven_js_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe 'RavenJS' do - let(:raven_path) { '/raven.chunk.js' } - - it 'does not load raven if sentry is disabled' do - visit new_user_session_path - - expect(has_requested_raven).to eq(false) - end - - it 'loads raven if sentry is enabled' do - stub_sentry_settings - - visit new_user_session_path - - expect(has_requested_raven).to eq(true) - end - - def has_requested_raven - page.all('script', visible: false).one? do |elm| - elm[:src] =~ /#{raven_path}$/ - end - end -end diff --git a/spec/features/search/user_uses_header_search_field_spec.rb b/spec/features/search/user_uses_header_search_field_spec.rb index 7e7c09e4a13..7b969aea547 100644 --- a/spec/features/search/user_uses_header_search_field_spec.rb +++ b/spec/features/search/user_uses_header_search_field_spec.rb @@ -26,10 +26,20 @@ describe 'User uses header search field', :js do end end + context 'when using the keyboard shortcut' do + before do + find('#search.js-autocomplete-disabled') + find('body').native.send_keys('s') + end + + it 'shows the category search dropdown' do + expect(page).to have_selector('.dropdown-header', text: /#{scope_name}/i) + end + end + context 'when clicking the search field' do before do - page.find('#search').click - wait_for_all_requests + page.find('#search.js-autocomplete-disabled').click end it 'shows category search dropdown' do @@ -78,15 +88,21 @@ describe 'User uses header search field', :js do end context 'when entering text into the search field' do - before do + it 'does not display the category search dropdown' do page.within('.search-input-wrap') do fill_in('search', with: scope_name.first(4)) end - end - it 'does not display the category search dropdown' do expect(page).not_to have_selector('.dropdown-header', text: /#{scope_name}/i) end + + it 'hides the dropdown when there are no results' do + page.within('.search-input-wrap') do + fill_in('search', with: 'a_search_term_with_no_results') + end + + expect(page).not_to have_selector('.dropdown-menu') + end end end diff --git a/spec/features/security/project/internal_access_spec.rb b/spec/features/security/project/internal_access_spec.rb index 768b883a90e..9c1c81918fa 100644 --- a/spec/features/security/project/internal_access_spec.rb +++ b/spec/features/security/project/internal_access_spec.rb @@ -264,7 +264,9 @@ describe "Internal Project Access" do before do # Speed increase - allow_any_instance_of(Project).to receive(:branches).and_return([]) + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:branches).and_return([]) + end end it { is_expected.to be_allowed_for(:admin) } @@ -283,7 +285,9 @@ describe "Internal Project Access" do before do # Speed increase - allow_any_instance_of(Project).to receive(:tags).and_return([]) + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:tags).and_return([]) + end end it { is_expected.to be_allowed_for(:admin) } diff --git a/spec/features/security/project/private_access_spec.rb b/spec/features/security/project/private_access_spec.rb index c2d44c05a22..dbaf97bc3fd 100644 --- a/spec/features/security/project/private_access_spec.rb +++ b/spec/features/security/project/private_access_spec.rb @@ -236,7 +236,9 @@ describe "Private Project Access" do before do # Speed increase - allow_any_instance_of(Project).to receive(:branches).and_return([]) + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:branches).and_return([]) + end end it { is_expected.to be_allowed_for(:admin) } @@ -255,7 +257,9 @@ describe "Private Project Access" do before do # Speed increase - allow_any_instance_of(Project).to receive(:tags).and_return([]) + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:tags).and_return([]) + end end it { is_expected.to be_allowed_for(:admin) } diff --git a/spec/features/security/project/public_access_spec.rb b/spec/features/security/project/public_access_spec.rb index 19f01257713..35cbc195f4f 100644 --- a/spec/features/security/project/public_access_spec.rb +++ b/spec/features/security/project/public_access_spec.rb @@ -477,7 +477,9 @@ describe "Public Project Access" do before do # Speed increase - allow_any_instance_of(Project).to receive(:branches).and_return([]) + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:branches).and_return([]) + end end it { is_expected.to be_allowed_for(:admin) } @@ -496,7 +498,9 @@ describe "Public Project Access" do before do # Speed increase - allow_any_instance_of(Project).to receive(:tags).and_return([]) + allow_next_instance_of(Project) do |instance| + allow(instance).to receive(:tags).and_return([]) + end end it { is_expected.to be_allowed_for(:admin) } diff --git a/spec/features/sentry_js_spec.rb b/spec/features/sentry_js_spec.rb new file mode 100644 index 00000000000..b39c4f0a0ae --- /dev/null +++ b/spec/features/sentry_js_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Sentry' do + let(:sentry_path) { '/sentry.chunk.js' } + + it 'does not load sentry if sentry is disabled' do + allow(Gitlab.config.sentry).to receive(:enabled).and_return(false) + visit new_user_session_path + + expect(has_requested_sentry).to eq(false) + end + + it 'loads sentry if sentry is enabled' do + stub_sentry_settings + + visit new_user_session_path + + expect(has_requested_sentry).to eq(true) + end + + def has_requested_sentry + page.all('script', visible: false).one? do |elm| + elm[:src] =~ /#{sentry_path}$/ + end + end +end diff --git a/spec/features/signed_commits_spec.rb b/spec/features/signed_commits_spec.rb index 70e6978a7b6..f56bd055224 100644 --- a/spec/features/signed_commits_spec.rb +++ b/spec/features/signed_commits_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' describe 'GPG signed commits' do let(:project) { create(:project, :public, :repository) } - it 'changes from unverified to verified when the user changes his email to match the gpg key' do + it 'changes from unverified to verified when the user changes his email to match the gpg key', :sidekiq_might_not_need_inline do ref = GpgHelpers::SIGNED_AND_AUTHORED_SHA user = create(:user, email: 'unrelated.user@example.org') @@ -30,7 +30,7 @@ describe 'GPG signed commits' do expect(page).to have_button 'Verified' end - it 'changes from unverified to verified when the user adds the missing gpg key' do + it 'changes from unverified to verified when the user adds the missing gpg key', :sidekiq_might_not_need_inline do ref = GpgHelpers::SIGNED_AND_AUTHORED_SHA user = create(:user, email: GpgHelpers::User1.emails.first) @@ -152,4 +152,26 @@ describe 'GPG signed commits' do end end end + + context 'view signed commit on the tree view', :js do + shared_examples 'a commit with a signature' do + before do + visit project_tree_path(project, 'signed-commits') + end + + it 'displays commit signature' do + expect(page).to have_button 'Unverified' + + click_on 'Unverified' + + within '.popover' do + expect(page).to have_content 'This commit was signed with an unverified signature' + end + end + end + + context 'with vue tree view enabled' do + it_behaves_like 'a commit with a signature' + end + end end diff --git a/spec/features/tags/developer_deletes_tag_spec.rb b/spec/features/tags/developer_deletes_tag_spec.rb index 82b416c3a7f..0fc62a578f9 100644 --- a/spec/features/tags/developer_deletes_tag_spec.rb +++ b/spec/features/tags/developer_deletes_tag_spec.rb @@ -39,8 +39,10 @@ describe 'Developer deletes tag' do context 'when pre-receive hook fails', :js do before do - allow_any_instance_of(Gitlab::GitalyClient::OperationService).to receive(:rm_tag) - .and_raise(Gitlab::Git::PreReceiveError, 'GitLab: Do not delete tags') + allow_next_instance_of(Gitlab::GitalyClient::OperationService) do |instance| + allow(instance).to receive(:rm_tag) + .and_raise(Gitlab::Git::PreReceiveError, 'GitLab: Do not delete tags') + end end it 'shows the error message' do diff --git a/spec/features/unsubscribe_links_spec.rb b/spec/features/unsubscribe_links_spec.rb index 2f8b715289c..cf30776786b 100644 --- a/spec/features/unsubscribe_links_spec.rb +++ b/spec/features/unsubscribe_links_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe 'Unsubscribe links' do +describe 'Unsubscribe links', :sidekiq_might_not_need_inline do include Warden::Test::Helpers let(:recipient) { create(:user) } diff --git a/spec/features/user_sees_revert_modal_spec.rb b/spec/features/user_sees_revert_modal_spec.rb index 24b4f8dd4aa..c0cffe885de 100644 --- a/spec/features/user_sees_revert_modal_spec.rb +++ b/spec/features/user_sees_revert_modal_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe 'Merge request > User sees revert modal', :js do +describe 'Merge request > User sees revert modal', :js, :sidekiq_might_not_need_inline do let(:project) { create(:project, :public, :repository) } let(:user) { project.creator } let(:merge_request) { create(:merge_request, source_project: project) } diff --git a/spec/features/users/anonymous_sessions_spec.rb b/spec/features/users/anonymous_sessions_spec.rb new file mode 100644 index 00000000000..e87ee39a3f4 --- /dev/null +++ b/spec/features/users/anonymous_sessions_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Session TTLs', :clean_gitlab_redis_shared_state do + it 'creates a session with a short TTL when login fails' do + visit new_user_session_path + # The session key only gets created after a post + fill_in 'user_login', with: 'non-existant@gitlab.org' + fill_in 'user_password', with: '12345678' + click_button 'Sign in' + + expect(page).to have_content('Invalid Login or password') + + expect_single_session_with_expiration(Settings.gitlab['unauthenticated_session_expire_delay']) + end + + it 'increases the TTL when the login succeeds' do + user = create(:user) + gitlab_sign_in(user) + + expect(page).to have_content(user.name) + + expect_single_session_with_expiration(Settings.gitlab['session_expire_delay'] * 60) + end + + def expect_single_session_with_expiration(expiration) + session_keys = get_session_keys + + expect(session_keys.size).to eq(1) + expect(get_ttl(session_keys.first)).to eq expiration + end + + def get_session_keys + Gitlab::Redis::SharedState.with { |redis| redis.scan_each(match: 'session:gitlab:*').to_a } + end + + def get_ttl(key) + Gitlab::Redis::SharedState.with { |redis| redis.ttl(key) } + end +end diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb index d1f3b3f4076..b7c54bb6de8 100644 --- a/spec/features/users/login_spec.rb +++ b/spec/features/users/login_spec.rb @@ -806,7 +806,7 @@ describe 'Login' do gitlab_sign_in(user) expect(current_path).to eq root_path - expect(page).to have_content("Please check your email (#{user.email}) to verify that you own this address.") + expect(page).to have_content("Please check your email (#{user.email}) to verify that you own this address and unlock the power of CI/CD.") end context "when not having confirmed within Devise's allow_unconfirmed_access_for time" do diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb index 562d6fcab1b..3b19bd423a4 100644 --- a/spec/features/users/signup_spec.rb +++ b/spec/features/users/signup_spec.rb @@ -222,7 +222,7 @@ shared_examples 'Signup' do expect(current_path).to eq users_sign_up_welcome_path else expect(current_path).to eq dashboard_projects_path - expect(page).to have_content("Please check your email (#{new_user.email}) to verify that you own this address.") + expect(page).to have_content("Please check your email (#{new_user.email}) to verify that you own this address and unlock the power of CI/CD.") end end end @@ -379,7 +379,9 @@ shared_examples 'Signup' do before do InvisibleCaptcha.timestamp_enabled = true stub_application_setting(recaptcha_enabled: true) - allow_any_instance_of(RegistrationsController).to receive(:verify_recaptcha).and_return(false) + allow_next_instance_of(RegistrationsController) do |instance| + allow(instance).to receive(:verify_recaptcha).and_return(false) + end end after do @@ -413,6 +415,7 @@ end describe 'With original flow' do before do stub_experiment(signup_flow: false) + stub_experiment_for_user(signup_flow: false) end it_behaves_like 'Signup' @@ -421,6 +424,7 @@ end describe 'With experimental flow' do before do stub_experiment(signup_flow: true) + stub_experiment_for_user(signup_flow: true) end it_behaves_like 'Signup' @@ -439,11 +443,13 @@ describe 'With experimental flow' do fill_in 'user_name', with: 'New name' select 'Software Developer', from: 'user_role' + choose 'user_setup_for_company_true' click_button 'Get started!' new_user = User.find_by_username(new_user.username) expect(new_user.name).to eq 'New name' expect(new_user.software_developer_role?).to be_truthy + expect(new_user.setup_for_company).to be_truthy expect(page).to have_current_path(new_project_path) end end |