diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-18 20:02:30 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-18 20:02:30 +0000 |
commit | 41fe97390ceddf945f3d967b8fdb3de4c66b7dea (patch) | |
tree | 9c8d89a8624828992f06d892cd2f43818ff5dcc8 /spec/features/projects | |
parent | 0804d2dc31052fb45a1efecedc8e06ce9bc32862 (diff) | |
download | gitlab-ce-7fd8f62e898848bf3d8f058077d7756742ae3bb0.tar.gz |
Add latest changes from gitlab-org/gitlab@14-9-stable-eev14.9.0-rc42
Diffstat (limited to 'spec/features/projects')
62 files changed, 422 insertions, 1541 deletions
diff --git a/spec/features/projects/artifacts/file_spec.rb b/spec/features/projects/artifacts/file_spec.rb index b61ee623fec..f97c1b0e543 100644 --- a/spec/features/projects/artifacts/file_spec.rb +++ b/spec/features/projects/artifacts/file_spec.rb @@ -73,7 +73,7 @@ RSpec.describe 'Artifact file', :js do end it "redirects to new URL" do - expect(page.current_path).to eq(file_url) + expect(page).to have_current_path(file_url, ignore_query: true) end end end diff --git a/spec/features/projects/artifacts/raw_spec.rb b/spec/features/projects/artifacts/raw_spec.rb index d580262d48b..c10cb56a44b 100644 --- a/spec/features/projects/artifacts/raw_spec.rb +++ b/spec/features/projects/artifacts/raw_spec.rb @@ -21,7 +21,7 @@ RSpec.describe 'Raw artifact' do end it "redirects to new URL" do - expect(page.current_path).to eq(raw_url) + expect(page).to have_current_path(raw_url, ignore_query: true) end end end diff --git a/spec/features/projects/artifacts/user_browses_artifacts_spec.rb b/spec/features/projects/artifacts/user_browses_artifacts_spec.rb index 77e3c7f972d..2d09f5a4263 100644 --- a/spec/features/projects/artifacts/user_browses_artifacts_spec.rb +++ b/spec/features/projects/artifacts/user_browses_artifacts_spec.rb @@ -12,7 +12,7 @@ RSpec.describe "User browses artifacts" do it "redirects to new URL" do visit(browse_url.sub("/-/jobs", "/builds")) - expect(page.current_path).to eq(browse_url) + expect(page).to have_current_path(browse_url, ignore_query: true) end end diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb index 77194fd6ca1..05fd72a8932 100644 --- a/spec/features/projects/blobs/blob_show_spec.rb +++ b/spec/features/projects/blobs/blob_show_spec.rb @@ -1009,6 +1009,29 @@ RSpec.describe 'File blob', :js do stub_application_setting(static_objects_external_storage_url: 'https://cdn.gitlab.com') end + context 'private project' do + let_it_be(:project) { create(:project, :repository, :private) } + let_it_be(:user) { create(:user, static_object_token: 'ABCD1234') } + + before do + project.add_developer(user) + + sign_in(user) + visit_blob('README.md') + end + + it 'shows open raw and download buttons with external storage URL prepended and user token appended to their href' do + path = project_raw_path(project, 'master/README.md') + raw_uri = "https://cdn.gitlab.com#{path}?token=#{user.static_object_token}" + download_uri = "https://cdn.gitlab.com#{path}?token=#{user.static_object_token}&inline=false" + + aggregate_failures do + expect(page).to have_link 'Open raw', href: raw_uri + expect(page).to have_link 'Download', href: download_uri + end + end + end + context 'public project' do before do visit_blob('README.md') @@ -1033,71 +1056,6 @@ RSpec.describe 'File blob', :js do stub_feature_flags(refactor_blob_viewer: false) end - context 'when ref switch' do - # We need to unsre that this test runs with the refactor_blob_viewer feature flag enabled - # This will be addressed in https://gitlab.com/gitlab-org/gitlab/-/issues/351558 - - def switch_ref_to(ref_name) - first('.qa-branches-select').click # rubocop:disable QA/SelectorUsage - - page.within '.project-refs-form' do - click_link ref_name - wait_for_requests - end - end - - context 'when highlighting lines' do - it 'displays single highlighted line number of different ref' do - visit_blob('files/js/application.js', anchor: 'L1') - - switch_ref_to('feature') - - page.within '.blob-content' do - expect(find_by_id('LC1')[:class]).to include("hll") - end - end - - it 'displays multiple highlighted line numbers of different ref' do - visit_blob('files/js/application.js', anchor: 'L1-3') - - switch_ref_to('feature') - - page.within '.blob-content' do - expect(find_by_id('LC1')[:class]).to include("hll") - expect(find_by_id('LC2')[:class]).to include("hll") - expect(find_by_id('LC3')[:class]).to include("hll") - end - end - end - end - - context 'visiting with a line number anchor' do - # We need to unsre that this test runs with the refactor_blob_viewer feature flag enabled - # This will be addressed in https://gitlab.com/gitlab-org/gitlab/-/issues/351558 - - before do - visit_blob('files/markdown/ruby-style-guide.md', anchor: 'L1') - end - - it 'displays the blob using the simple viewer' do - aggregate_failures do - # hides the rich viewer - expect(page).to have_selector('.blob-viewer[data-type="simple"]') - expect(page).not_to have_selector('.blob-viewer[data-type="rich"]') - - # highlights the line in question - expect(page).to have_selector('#LC1.hll') - - # shows highlighted Markdown code - expect(page).to have_css(".js-syntax-highlight") - expect(page).to have_content("[PEP-8](http://www.python.org/dev/peps/pep-0008/)") - - # shows an enabled copy button - expect(page).to have_selector('.js-copy-blob-source-btn:not(.disabled)') - end - end - end - context 'binary file that appears to be text in the first 1024 bytes' do # We need to unsre that this test runs with the refactor_blob_viewer feature flag enabled # This will be addressed in https://gitlab.com/gitlab-org/gitlab/-/issues/351559 @@ -1126,535 +1084,5 @@ RSpec.describe 'File blob', :js do end end end - - context 'when static objects external storage is enabled' do - # We need to unsre that this test runs with the refactor_blob_viewer feature flag enabled - # This will be addressed in https://gitlab.com/gitlab-org/gitlab/-/issues/351555 - - before do - stub_application_setting(static_objects_external_storage_url: 'https://cdn.gitlab.com') - end - - context 'private project' do - let_it_be(:project) { create(:project, :repository, :private) } - let_it_be(:user) { create(:user) } - - before do - project.add_developer(user) - - sign_in(user) - visit_blob('README.md') - end - - it 'shows open raw and download buttons with external storage URL prepended and user token appended to their href' do - path = project_raw_path(project, 'master/README.md') - raw_uri = "https://cdn.gitlab.com#{path}?token=#{user.static_object_token}" - download_uri = "https://cdn.gitlab.com#{path}?inline=false&token=#{user.static_object_token}" - - aggregate_failures do - expect(page).to have_link 'Open raw', href: raw_uri - expect(page).to have_link 'Download', href: download_uri - end - end - end - end - - context 'files with auxiliary viewers' do - # This context is the same as the other 'files with auxiliary viewers' in this file, we just ensure that the auxiliary viewers still work this the refactor_blob_viewer disabled - # It should be safe to remove once we rollout the refactored blob viewer - - describe '.gitlab-ci.yml' do - before do - project.add_maintainer(project.creator) - - Files::CreateService.new( - project, - project.creator, - start_branch: 'master', - branch_name: 'master', - commit_message: "Add .gitlab-ci.yml", - file_path: '.gitlab-ci.yml', - file_content: File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml')) - ).execute - - visit_blob('.gitlab-ci.yml') - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows that configuration is valid - expect(page).to have_content('This GitLab CI configuration is valid.') - - # shows a learn more link - expect(page).to have_link('Learn more') - end - end - end - - describe '.gitlab/route-map.yml' do - before do - project.add_maintainer(project.creator) - - Files::CreateService.new( - project, - project.creator, - start_branch: 'master', - branch_name: 'master', - commit_message: "Add .gitlab/route-map.yml", - file_path: '.gitlab/route-map.yml', - file_content: <<-MAP.strip_heredoc - # Team data - - source: 'data/team.yml' - public: 'team/' - MAP - ).execute - - visit_blob('.gitlab/route-map.yml') - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows that map is valid - expect(page).to have_content('This Route Map is valid.') - - # shows a learn more link - expect(page).to have_link('Learn more') - end - end - end - - describe '.gitlab/dashboards/custom-dashboard.yml' do - before do - project.add_maintainer(project.creator) - - Files::CreateService.new( - project, - project.creator, - start_branch: 'master', - branch_name: 'master', - commit_message: "Add .gitlab/dashboards/custom-dashboard.yml", - file_path: '.gitlab/dashboards/custom-dashboard.yml', - file_content: file_content - ).execute - end - - context 'with metrics_dashboard_exhaustive_validations feature flag off' do - before do - stub_feature_flags(metrics_dashboard_exhaustive_validations: false) - visit_blob('.gitlab/dashboards/custom-dashboard.yml') - end - - context 'valid dashboard file' do - let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) } - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows that dashboard yaml is valid - expect(page).to have_content('Metrics Dashboard YAML definition is valid.') - - # shows a learn more link - expect(page).to have_link('Learn more') - end - end - end - - context 'invalid dashboard file' do - let(:file_content) { "dashboard: 'invalid'" } - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows that dashboard yaml is invalid - expect(page).to have_content('Metrics Dashboard YAML definition is invalid:') - expect(page).to have_content("panel_groups: should be an array of panel_groups objects") - - # shows a learn more link - expect(page).to have_link('Learn more') - end - end - end - end - - context 'with metrics_dashboard_exhaustive_validations feature flag on' do - before do - stub_feature_flags(metrics_dashboard_exhaustive_validations: true) - visit_blob('.gitlab/dashboards/custom-dashboard.yml') - end - - context 'valid dashboard file' do - let(:file_content) { File.read(Rails.root.join('config/prometheus/common_metrics.yml')) } - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows that dashboard yaml is valid - expect(page).to have_content('Metrics Dashboard YAML definition is valid.') - - # shows a learn more link - expect(page).to have_link('Learn more') - end - end - end - - context 'invalid dashboard file' do - let(:file_content) { "dashboard: 'invalid'" } - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows that dashboard yaml is invalid - expect(page).to have_content('Metrics Dashboard YAML definition is invalid:') - expect(page).to have_content("root is missing required keys: panel_groups") - - # shows a learn more link - expect(page).to have_link('Learn more') - end - end - end - end - end - - context 'LICENSE' do - before do - visit_blob('LICENSE') - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows license - expect(page).to have_content('This project is licensed under the MIT License.') - - # shows a learn more link - expect(page).to have_link('Learn more', href: 'http://choosealicense.com/licenses/mit/') - end - end - end - - context '*.gemspec' do - before do - project.add_maintainer(project.creator) - - Files::CreateService.new( - project, - project.creator, - start_branch: 'master', - branch_name: 'master', - commit_message: "Add activerecord.gemspec", - file_path: 'activerecord.gemspec', - file_content: <<-SPEC.strip_heredoc - Gem::Specification.new do |s| - s.platform = Gem::Platform::RUBY - s.name = "activerecord" - end - SPEC - ).execute - - visit_blob('activerecord.gemspec') - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - # shows names of dependency manager and package - expect(page).to have_content('This project manages its dependencies using RubyGems.') - - # shows a learn more link - expect(page).to have_link('Learn more', href: 'https://rubygems.org/') - end - end - end - - context 'CONTRIBUTING.md' do - before do - file_name = 'CONTRIBUTING.md' - - create_file(file_name, '## Contribution guidelines') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("After you've reviewed these contribution guidelines, you'll be all set to contribute to this project.") - end - end - end - - context 'CHANGELOG.md' do - before do - file_name = 'CHANGELOG.md' - - create_file(file_name, '## Changelog for v1.0.0') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("To find the state of this project's repository at the time of any of these versions, check out the tags.") - end - end - end - - context 'Cargo.toml' do - before do - file_name = 'Cargo.toml' - - create_file(file_name, ' - [package] - name = "hello_world" # the name of the package - version = "0.1.0" # the current version, obeying semver - authors = ["Alice <a@example.com>", "Bob <b@example.com>"] - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using Cargo.") - end - end - end - - context 'Cartfile' do - before do - file_name = 'Cartfile' - - create_file(file_name, ' - gitlab "Alamofire/Alamofire" == 4.9.0 - gitlab "Alamofire/AlamofireImage" ~> 3.4 - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using Carthage.") - end - end - end - - context 'composer.json' do - before do - file_name = 'composer.json' - - create_file(file_name, ' - { - "license": "MIT" - } - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using Composer.") - end - end - end - - context 'Gemfile' do - before do - file_name = 'Gemfile' - - create_file(file_name, ' - source "https://rubygems.org" - - # Gems here - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using Bundler.") - end - end - end - - context 'Godeps.json' do - before do - file_name = 'Godeps.json' - - create_file(file_name, ' - { - "GoVersion": "go1.6" - } - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using godep.") - end - end - end - - context 'go.mod' do - before do - file_name = 'go.mod' - - create_file(file_name, ' - module example.com/mymodule - - go 1.14 - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using Go Modules.") - end - end - end - - context 'package.json' do - before do - file_name = 'package.json' - - create_file(file_name, ' - { - "name": "my-awesome-package", - "version": "1.0.0" - } - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using npm.") - end - end - end - - context 'podfile' do - before do - file_name = 'podfile' - - create_file(file_name, 'platform :ios, "8.0"') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using CocoaPods.") - end - end - end - - context 'test.podspec' do - before do - file_name = 'test.podspec' - - create_file(file_name, ' - Pod::Spec.new do |s| - s.name = "TensorFlowLiteC" - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using CocoaPods.") - end - end - end - - context 'JSON.podspec.json' do - before do - file_name = 'JSON.podspec.json' - - create_file(file_name, ' - { - "name": "JSON" - } - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using CocoaPods.") - end - end - end - - context 'requirements.txt' do - before do - file_name = 'requirements.txt' - - create_file(file_name, 'Project requirements') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using pip.") - end - end - end - - context 'yarn.lock' do - before do - file_name = 'yarn.lock' - - create_file(file_name, ' - # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. - # yarn lockfile v1 - ') - visit_blob(file_name) - end - - it 'displays an auxiliary viewer' do - aggregate_failures do - expect(page).to have_content("This project manages its dependencies using Yarn.") - end - end - end - - context 'openapi.yml' do - before do - file_name = 'openapi.yml' - - create_file(file_name, ' - swagger: \'2.0\' - info: - title: Classic API Resource Documentation - description: | - <div class="foo-bar" style="background-color: red;" data-foo-bar="baz"> - <h1>Swagger API documentation</h1> - </div> - version: production - basePath: /JSSResource/ - produces: - - application/xml - - application/json - consumes: - - application/xml - - application/json - security: - - basicAuth: [] - paths: - /accounts: - get: - responses: - \'200\': - description: No response was specified - tags: - - accounts - operationId: findAccounts - summary: Finds all accounts - ') - visit_blob(file_name, useUnsafeMarkdown: '1') - click_button('Display rendered file') - - wait_for_requests - end - - it 'removes `style`, `class`, and `data-*`` attributes from HTML' do - expect(page).to have_css('h1', text: 'Swagger API documentation') - expect(page).not_to have_css('.foo-bar') - expect(page).not_to have_css('[style="background-color: red;"]') - expect(page).not_to have_css('[data-foo-bar="baz"]') - end - end - end end end diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb index 3f1c10b3688..54176378de8 100644 --- a/spec/features/projects/blobs/edit_spec.rb +++ b/spec/features/projects/blobs/edit_spec.rb @@ -183,7 +183,7 @@ RSpec.describe 'Editing file blob', :js do freeze_time do visit project_edit_blob_path(project, tree_join(protected_branch, file_path)) - epoch = Time.now.strftime('%s%L').last(5) + epoch = Time.zone.now.strftime('%s%L').last(5) expect(find('.js-branch-name').value).to eq "#{user.username}-protected-branch-patch-#{epoch}" end diff --git a/spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb b/spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb index b872fa701c8..15e7a495e60 100644 --- a/spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb +++ b/spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb @@ -19,14 +19,14 @@ RSpec.describe 'User views pipeline editor button on root ci config file', :js d project.repository.create_file(user, project.ci_config_path_or_default, 'test', message: 'testing', branch_name: 'master') visit project_blob_path(project, File.join('master', '.my-config.yml')) - expect(page).to have_content('Pipeline Editor') + expect(page).to have_content('Edit in pipeline editor') end it 'does not shows the Pipeline Editor button' do project.repository.create_file(user, '.my-sub-config.yml', 'test', message: 'testing', branch_name: 'master') visit project_blob_path(project, File.join('master', '.my-sub-config.yml')) - expect(page).not_to have_content('Pipeline Editor') + expect(page).not_to have_content('Edit in pipeline editor') end end @@ -36,7 +36,7 @@ RSpec.describe 'User views pipeline editor button on root ci config file', :js d end it 'does not shows the Pipeline Editor button' do visit project_blob_path(project, File.join('master', '.my-config.yml')) - expect(page).not_to have_content('Pipeline Editor') + expect(page).not_to have_content('Edit in pipeline editor') end end end diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb index daf5ac61d73..ad4381a526a 100644 --- a/spec/features/projects/ci/editor_spec.rb +++ b/spec/features/projects/ci/editor_spec.rb @@ -55,6 +55,10 @@ RSpec.describe 'Pipeline Editor', :js do it 'displays new branch as selected after commiting on a new branch' do find('#target-branch-field').set('new_branch', clear: :backspace) + page.within('#source-editor-') do + find('textarea').send_keys '123' + end + click_button 'Commit changes' page.within('[data-testid="branch-selector"]') do @@ -77,8 +81,6 @@ RSpec.describe 'Pipeline Editor', :js do context 'when a change is made' do before do - click_button 'Collapse' - page.within('#source-editor-') do find('textarea').send_keys '123' # It takes some time after sending keys for the vue @@ -123,8 +125,6 @@ RSpec.describe 'Pipeline Editor', :js do describe 'Editor content' do it 'user can reset their CI configuration' do - click_button 'Collapse' - page.within('#source-editor-') do find('textarea').send_keys '123' end @@ -147,8 +147,6 @@ RSpec.describe 'Pipeline Editor', :js do end it 'user can cancel reseting their CI configuration' do - click_button 'Collapse' - page.within('#source-editor-') do find('textarea').send_keys '123' end diff --git a/spec/features/projects/ci/secure_files_spec.rb b/spec/features/projects/ci/secure_files_spec.rb new file mode 100644 index 00000000000..65c41eaf2ac --- /dev/null +++ b/spec/features/projects/ci/secure_files_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Secure Files', :js do + let(:project) { create(:project) } + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit project_ci_secure_files_path(project) + end + + it 'user sees the Secure Files list component' do + expect(page).to have_content('There are no records to show') + end +end diff --git a/spec/features/projects/cluster_agents_spec.rb b/spec/features/projects/cluster_agents_spec.rb index d2b07bbc1de..e9162359940 100644 --- a/spec/features/projects/cluster_agents_spec.rb +++ b/spec/features/projects/cluster_agents_spec.rb @@ -27,7 +27,7 @@ RSpec.describe 'ClusterAgents', :js do end it 'displays empty state', :aggregate_failures do - expect(page).to have_content('Install new Agent') + expect(page).to have_content('Install a new agent') expect(page).to have_selector('.empty-state') end end diff --git a/spec/features/projects/clusters/eks_spec.rb b/spec/features/projects/clusters/eks_spec.rb index a925e3a72f8..0dd6effe551 100644 --- a/spec/features/projects/clusters/eks_spec.rb +++ b/spec/features/projects/clusters/eks_spec.rb @@ -19,8 +19,8 @@ RSpec.describe 'AWS EKS Cluster', :js do before do visit project_clusters_path(project) - click_link 'Certificate' - click_link 'Connect with a certificate' + click_button(class: 'dropdown-toggle-split') + click_link 'Create a new cluster' end context 'when user creates a cluster on AWS EKS' do @@ -28,10 +28,6 @@ RSpec.describe 'AWS EKS Cluster', :js 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 - it 'highlights Amazon EKS logo' do expect(page).to have_css('.js-create-aws-cluster-button.active') end diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb index 0c9db24f1d8..90d7e2d02e9 100644 --- a/spec/features/projects/clusters/gcp_spec.rb +++ b/spec/features/projects/clusters/gcp_spec.rb @@ -33,9 +33,7 @@ RSpec.describe 'Gcp Cluster', :js do before do visit project_clusters_path(project) - click_link 'Certificate' - click_link 'Connect with a certificate' - click_link 'Create new cluster' + visit_create_cluster_page click_link 'Google GKE' end @@ -118,16 +116,7 @@ RSpec.describe 'Gcp Cluster', :js do expect(page.find(:css, '.cluster-name').value).to eq(cluster.name) end - context 'when user disables the cluster' do - before do - page.find(:css, '.js-cluster-enable-toggle-area .js-project-feature-toggle').click - page.within('.js-cluster-details-form') { click_button 'Save changes' } - end - - it 'user sees the successful message' do - expect(page).to have_content('Kubernetes cluster was successfully updated.') - end - end + include_examples "user disables a cluster" context 'when user changes cluster parameters' do before do @@ -145,7 +134,6 @@ RSpec.describe 'Gcp Cluster', :js do before do visit project_clusters_path(project) - click_link 'Certificate' click_button(class: 'dropdown-toggle-split') click_link 'Connect with a certificate' end @@ -175,7 +163,6 @@ RSpec.describe 'Gcp Cluster', :js do context 'when user has not dismissed GCP signup offer' do before do visit project_clusters_path(project) - click_link 'Certificate' end it 'user sees offer on cluster index page' do @@ -183,7 +170,7 @@ RSpec.describe 'Gcp Cluster', :js do end it 'user sees offer on cluster create page' do - click_link 'Connect with a certificate' + visit_create_cluster_page expect(page).to have_css('.gcp-signup-offer') end @@ -201,7 +188,7 @@ RSpec.describe 'Gcp Cluster', :js do find('.gcp-signup-offer .js-close').click wait_for_requests - click_link 'Connect with a certificate' + visit_create_cluster_page expect(page).not_to have_css('.gcp-signup-offer') end @@ -230,4 +217,9 @@ RSpec.describe 'Gcp Cluster', :js do expect(page).not_to have_css('.gcp-signup-offer') end end + + def visit_create_cluster_page + click_button(class: 'dropdown-toggle-split') + click_link 'Create a new cluster' + end end diff --git a/spec/features/projects/clusters/user_spec.rb b/spec/features/projects/clusters/user_spec.rb index d9887ea4fe0..3fd78d338da 100644 --- a/spec/features/projects/clusters/user_spec.rb +++ b/spec/features/projects/clusters/user_spec.rb @@ -27,7 +27,6 @@ RSpec.describe 'User Cluster', :js do click_link 'Certificate' click_link 'Connect with a certificate' - click_link 'Connect existing cluster' end context 'when user filled form with valid parameters' do @@ -82,16 +81,7 @@ RSpec.describe 'User Cluster', :js do expect(page).to have_button('Save changes') end - context 'when user disables the cluster' do - before do - page.find(:css, '.js-cluster-enable-toggle-area .js-project-feature-toggle').click - page.within('.js-cluster-details-form') { click_button 'Save changes' } - end - - it 'user sees the successful message' do - expect(page).to have_content('Kubernetes cluster was successfully updated.') - end - end + include_examples "user disables a cluster" context 'when user changes cluster parameters' do before do diff --git a/spec/features/projects/clusters_spec.rb b/spec/features/projects/clusters_spec.rb index b0406e1f3c4..b9a544144c3 100644 --- a/spec/features/projects/clusters_spec.rb +++ b/spec/features/projects/clusters_spec.rb @@ -34,17 +34,12 @@ RSpec.describe 'Clusters', :js do before do create(:cluster, :provided_by_user, name: 'default-cluster', environment_scope: '*', projects: [project]) visit project_clusters_path(project) - click_link 'Certificate' - click_button(class: 'dropdown-toggle-split') - end - - it 'user sees an add cluster button' do - expect(page).to have_content('Connect with a certificate') end context 'when user filled form with environment scope' do before do - click_link 'Connect with a certificate' + visit_connect_cluster_page + fill_in 'cluster_name', with: 'staging-cluster' fill_in 'cluster_environment_scope', with: 'staging/*' click_button 'Add Kubernetes cluster' @@ -72,7 +67,8 @@ RSpec.describe 'Clusters', :js do context 'when user updates duplicated environment scope' do before do - click_link 'Connect with a certificate' + visit_connect_cluster_page + fill_in 'cluster_name', with: 'staging-cluster' fill_in 'cluster_environment_scope', with: '*' fill_in 'cluster_platform_kubernetes_attributes_api_url', with: 'https://0.0.0.0' @@ -115,8 +111,7 @@ RSpec.describe 'Clusters', :js do context 'when user filled form with environment scope' do before do - click_button(class: 'dropdown-toggle-split') - click_link 'Create a new cluster' + visit_create_cluster_page click_link 'Google GKE' sleep 2 # wait for ajax @@ -160,8 +155,7 @@ RSpec.describe 'Clusters', :js do context 'when user updates duplicated environment scope' do before do - click_button(class: 'dropdown-toggle-split') - click_link 'Create a new cluster' + visit_create_cluster_page click_link 'Google GKE' sleep 2 # wait for ajax @@ -212,11 +206,7 @@ RSpec.describe 'Clusters', :js do context 'user visits create cluster page' do before do - visit project_clusters_path(project) - - click_link 'Certificate' - click_link 'Connect with a certificate' - click_link 'Create new cluster' + visit_create_cluster_page end it 'user sees a link to create a GKE cluster' do @@ -227,4 +217,16 @@ RSpec.describe 'Clusters', :js do expect(page).to have_link('Amazon EKS') end end + + def visit_create_cluster_page + visit project_clusters_path(project) + + click_button(class: 'dropdown-toggle-split') + click_link 'Create a new cluster' + end + + def visit_connect_cluster_page + click_button(class: 'dropdown-toggle-split') + click_link 'Connect with a certificate' + end end diff --git a/spec/features/projects/commits/multi_view_diff_spec.rb b/spec/features/projects/commits/multi_view_diff_spec.rb new file mode 100644 index 00000000000..ecdd398c739 --- /dev/null +++ b/spec/features/projects/commits/multi_view_diff_spec.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.shared_examples "no multiple viewers" do |commit_ref| + let(:ref) { commit_ref } + + it "does not display multiple diff viewers" do + expect(page).not_to have_selector '[data-diff-toggle-entity]' + end +end + +RSpec.describe 'Multiple view Diffs', :js do + let(:user) { create(:user) } + let(:project) { create(:project, :repository, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } + let(:ref) { '5d6ed1503801ca9dc28e95eeb85a7cf863527aee' } + let(:path) { project_commit_path(project, ref) } + let(:feature_flag_on) { false } + + before do + stub_feature_flags(rendered_diffs_viewer: feature_flag_on ? project : false) + + visit path + + wait_for_all_requests + end + + context 'when :rendered_diffs_viewer is off' do + context 'and diff does not have ipynb' do + include_examples "no multiple viewers", 'ddd0f15ae83993f5cb66a927a28673882e99100b' + end + + context 'and diff has ipynb' do + include_examples "no multiple viewers", '5d6ed1503801ca9dc28e95eeb85a7cf863527aee' + + it 'shows the transformed diff' do + diff = page.find('.diff-file, .file-holder', match: :first) + + expect(diff['innerHTML']).to include('%% Cell type:markdown id:0aac5da7-745c-4eda-847a-3d0d07a1bb9b tags:') + end + end + end + + context 'when :rendered_diffs_viewer is on' do + let(:feature_flag_on) { true } + + context 'and diff does not include ipynb' do + include_examples "no multiple viewers", 'ddd0f15ae83993f5cb66a927a28673882e99100b' + end + + context 'and opening a diff with ipynb' do + context 'but the changes are not renderable' do + include_examples "no multiple viewers", 'a867a602d2220e5891b310c07d174fbe12122830' + end + + it 'loads the rendered diff as hidden' do + diff = page.find('.diff-file, .file-holder', match: :first) + + expect(diff).not_to have_selector '[data-diff-toggle-entity="toHide"]' + expect(diff).to have_selector '[data-diff-toggle-entity="toShow"]' + + expect(classes_for_element(diff, 'toHide', visible: false)).to include('hidden') + expect(classes_for_element(diff, 'toShow')).not_to include('hidden') + + expect(classes_for_element(diff, 'toShowBtn')).to include('selected') + expect(classes_for_element(diff, 'toHideBtn')).not_to include('selected') + end + + it 'displays the rendered diff and hides after selection changes' do + diff = page.find('.diff-file, .file-holder', match: :first) + diff.find('[data-diff-toggle-entity="toShowBtn"]').click + + expect(diff).to have_selector '[data-diff-toggle-entity="toShow"]' + expect(diff).not_to have_selector '[data-diff-toggle-entity="toHide"]' + + expect(classes_for_element(diff, 'toHideBtn')).not_to include('selected') + expect(classes_for_element(diff, 'toShowBtn')).to include('selected') + end + end + end + + def classes_for_element(node, data_diff_entity, visible: true) + node.find("[data-diff-toggle-entity=\"#{data_diff_entity}\"]", visible: visible)[:class] + end +end diff --git a/spec/features/projects/container_registry_spec.rb b/spec/features/projects/container_registry_spec.rb index 4ebcb69592b..17eb421191f 100644 --- a/spec/features/projects/container_registry_spec.rb +++ b/spec/features/projects/container_registry_spec.rb @@ -103,6 +103,8 @@ RSpec.describe 'Container Registry', :js do find('.modal .modal-footer .btn-danger').click end + it_behaves_like 'rejecting tags destruction for an importing repository on', tags: ['1'] + it('pagination navigate to the second page') do visit_next_page diff --git a/spec/features/projects/environments/environment_metrics_spec.rb b/spec/features/projects/environments/environment_metrics_spec.rb index 0f858c627bc..f5f4d13dd58 100644 --- a/spec/features/projects/environments/environment_metrics_spec.rb +++ b/spec/features/projects/environments/environment_metrics_spec.rb @@ -18,7 +18,6 @@ RSpec.describe 'Environment > Metrics' do stub_any_prometheus_request sign_in(user) - visit_environment(environment) end around do |example| @@ -27,6 +26,7 @@ RSpec.describe 'Environment > Metrics' do shared_examples 'has environment selector' do it 'has a working environment selector', :js do + visit_environment(environment) click_link 'Monitoring' expect(page).to have_current_path(project_metrics_dashboard_path(project, environment: environment.id)) @@ -56,6 +56,7 @@ RSpec.describe 'Environment > Metrics' do end it 'shows metrics', :js do + visit_environment(environment) click_link 'Monitoring' expect(page).to have_css('[data-qa-selector="prometheus_graphs"]') # rubocop:disable QA/SelectorUsage diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb index 3b83c25b629..99137018d6b 100644 --- a/spec/features/projects/environments/environments_spec.rb +++ b/spec/features/projects/environments/environments_spec.rb @@ -3,12 +3,13 @@ require 'spec_helper' RSpec.describe 'Environments page', :js do + include Spec::Support::Helpers::ModalHelpers + let(:project) { create(:project) } let(:user) { create(:user) } let(:role) { :developer } before do - stub_feature_flags(new_environments_table: false) project.add_role(user, role) sign_in(user) end @@ -33,24 +34,18 @@ RSpec.describe 'Environments page', :js do it 'shows "Available" and "Stopped" tab with links' do visit_environments(project) - expect(page).to have_selector('.js-environments-tab-available') - expect(page).to have_content('Available') - expect(page).to have_selector('.js-environments-tab-stopped') - expect(page).to have_content('Stopped') + expect(page).to have_link(_('Available')) + expect(page).to have_link(_('Stopped')) end describe 'with one available environment' do - before do - create(:environment, project: project, state: :available) - end + let!(:environment) { create(:environment, project: project, state: :available) } describe 'in available tab page' do it 'shows one environment' do visit_environments(project, scope: 'available') - expect(page).to have_css('.environments-container') - expect(page.all('.environment-name').length).to eq(1) - expect(page.all('[data-testid="stop-icon"]').length).to eq(1) + expect(page).to have_link(environment.name, href: project_environment_path(project, environment)) end end @@ -75,7 +70,6 @@ RSpec.describe 'Environments page', :js do it 'shows no environments' do visit_environments(project, scope: 'stopped') - expect(page).to have_css('.environments-container') expect(page).to have_content('You don\'t have any environments right now') end end @@ -93,22 +87,18 @@ RSpec.describe 'Environments page', :js do it 'shows one environment without error' do visit_environments(project, scope: 'available') - expect(page).to have_css('.environments-container') - expect(page.all('.environment-name').length).to eq(1) + expect(page).to have_link(environment.name, href: project_environment_path(project, environment)) end end end describe 'with one stopped environment' do - before do - create(:environment, project: project, state: :stopped) - end + let!(:environment) { create(:environment, project: project, state: :stopped) } describe 'in available tab page' do it 'shows no environments' do visit_environments(project, scope: 'available') - expect(page).to have_css('.environments-container') expect(page).to have_content('You don\'t have any environments right now') end end @@ -117,8 +107,7 @@ RSpec.describe 'Environments page', :js do it 'shows one environment' do visit_environments(project, scope: 'stopped') - expect(page).to have_css('.environments-container') - expect(page.all('.environment-name').length).to eq(1) + expect(page).to have_link(environment.name, href: project_environment_path(project, environment)) expect(page.all('[data-testid="stop-icon"]').length).to eq(0) end end @@ -133,8 +122,8 @@ RSpec.describe 'Environments page', :js do it 'does not show environments and counters are set to zero' do expect(page).to have_content('You don\'t have any environments right now') - expect(page.find('.js-environments-tab-available .badge').text).to eq('0') - expect(page.find('.js-environments-tab-stopped .badge').text).to eq('0') + expect(page).to have_link("#{_('Available')} 0") + expect(page).to have_link("#{_('Stopped')} 0") end end @@ -148,21 +137,23 @@ RSpec.describe 'Environments page', :js do context 'when there are no deployments' do before do visit_environments(project) + + page.click_button _('Expand') end it 'shows environments names and counters' do - expect(page).to have_link(environment.name) + expect(page).to have_link(environment.name, href: project_environment_path(project, environment)) - expect(page.find('.js-environments-tab-available .badge').text).to eq('1') - expect(page.find('.js-environments-tab-stopped .badge').text).to eq('0') + expect(page).to have_link("#{_('Available')} 1") + expect(page).to have_link("#{_('Stopped')} 0") end it 'does not show deployments' do - expect(page).to have_content('No deployments yet') + expect(page).to have_content(s_('Environments|There are no deployments for this environment yet. Learn more about setting up deployments.')) end it 'shows stop button when environment is not stoppable' do - expect(page).to have_selector(stop_button_selector) + expect(page).to have_button('Stop') end end @@ -177,8 +168,10 @@ RSpec.describe 'Environments page', :js do it 'shows deployment SHA and internal ID' do visit_environments(project) + page.click_button _('Expand') - expect(page).to have_link(deployment.short_sha) + expect(page).to have_text(deployment.short_sha) + expect(page).to have_link(deployment.commit.full_title) expect(page).to have_content(deployment.iid) end @@ -216,10 +209,6 @@ RSpec.describe 'Environments page', :js do .not_to change { Ci::Pipeline.count } end - it 'shows build name and id' do - expect(page).to have_link("#{build.name} ##{build.id}") - end - it 'shows a stop button' do expect(page).to have_selector(stop_button_selector) end @@ -346,7 +335,9 @@ RSpec.describe 'Environments page', :js do context 'when user played a delayed job immediately' do before do find(actions_button_selector).click - accept_confirm { find(action_link_selector).click } + accept_gl_confirm do + find(action_link_selector).click + end wait_for_requests end @@ -369,7 +360,8 @@ RSpec.describe 'Environments page', :js do it 'does not show deployments' do visit_environments(project) - expect(page).to have_content('No deployments yet') + page.click_button _('Expand') + expect(page).to have_content(s_('Environments|There are no deployments for this environment yet. Learn more about setting up deployments.')) end end @@ -385,9 +377,10 @@ RSpec.describe 'Environments page', :js do it "renders the upcoming deployment", :aggregate_failures do visit_environments(project) + page.click_button _('Expand') + within(upcoming_deployment_content_selector) do expect(page).to have_content("##{deployment.iid}") - expect(page).to have_selector("a[href=\"#{project_job_path(project, deployment.deployable)}\"]") expect(page).to have_link(href: /#{deployment.user.username}/) end end @@ -409,15 +402,15 @@ RSpec.describe 'Environments page', :js do let(:role) { :developer } it 'developer creates a new environment with a valid name' do - within(".environments-section") { click_link 'New environment' } + click_link 'New environment' fill_in('Name', with: 'production') click_on 'Save' expect(page).to have_content('production') end - it 'developer creates a new environmetn with invalid name' do - within(".environments-section") { click_link 'New environment' } + it 'developer creates a new environment with invalid name' do + click_link 'New environment' fill_in('Name', with: 'name,with,commas') click_on 'Save' @@ -454,20 +447,11 @@ RSpec.describe 'Environments page', :js do expect(page).not_to have_content 'review-2' expect(page).to have_content 'staging 2' - within('.folder-row') do - find('.folder-name', text: 'staging').click - end + page.click_button _('Expand') expect(page).to have_content 'review-1' expect(page).to have_content 'review-2' - within('.ci-table') do - within('[data-qa-selector="environment_item"]', text: 'review-1') do # rubocop:disable QA/SelectorUsage - expect(find('.js-auto-stop').text).not_to be_empty - end - within('[data-qa-selector="environment_item"]', text: 'review-2') do # rubocop:disable QA/SelectorUsage - expect(find('.js-auto-stop').text).not_to be_empty - end - end + expect(page).to have_content 'Auto stop in' end end @@ -490,9 +474,7 @@ RSpec.describe 'Environments page', :js do expect(page).not_to have_content 'review-2' expect(page).to have_content 'staging 2' - within('.folder-row') do - find('.folder-name', text: 'staging').click - end + page.click_button _('Expand') expect(page).to have_content 'review-1' expect(page).to have_content 'review-2' 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 4a0b1f4c548..c9ba8cbd2bb 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 @@ -26,23 +26,23 @@ RSpec.describe 'Projects > Files > Project owner creates a license file', :js do file_content = first('.file-editor') expect(file_content).to have_content('MIT License') - expect(file_content).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}") + expect(file_content).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}") fill_in :commit_message, with: 'Add a LICENSE file', visible: true click_button 'Commit changes' - expect(current_path).to eq( - project_blob_path(project, 'master/LICENSE')) + expect(page).to have_current_path( + project_blob_path(project, 'master/LICENSE'), ignore_query: true) expect(page).to have_content('MIT License') - expect(page).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}") + expect(page).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}") end it 'project maintainer creates a license file from the "Add license" link' do click_link 'Add LICENSE' expect(page).to have_content('New file') - expect(current_path).to eq( - project_new_blob_path(project, 'master')) + expect(page).to have_current_path( + project_new_blob_path(project, 'master'), ignore_query: true) expect(find('#file_name').value).to eq('LICENSE') expect(page).to have_selector('.license-selector') @@ -50,15 +50,15 @@ RSpec.describe 'Projects > Files > Project owner creates a license file', :js do file_content = first('.file-editor') expect(file_content).to have_content('MIT License') - expect(file_content).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}") + expect(file_content).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}") fill_in :commit_message, with: 'Add a LICENSE file', visible: true click_button 'Commit changes' - expect(current_path).to eq( - project_blob_path(project, 'master/LICENSE')) + expect(page).to have_current_path( + project_blob_path(project, 'master/LICENSE'), ignore_query: true) expect(page).to have_content('MIT License') - expect(page).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}") + expect(page).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}") end def select_template(template) 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 ca384291c12..0e87622d3c2 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 @@ -16,24 +16,24 @@ RSpec.describe 'Projects > Files > Project owner sees a link to create a license visit project_path(project) click_on 'Add LICENSE' - expect(current_path).to eq("/-/ide/project/#{project.full_path}/edit/master/-/LICENSE") + expect(page).to have_current_path("/-/ide/project/#{project.full_path}/edit/master/-/LICENSE", ignore_query: true) expect(page).to have_selector('.qa-file-templates-bar') # rubocop:disable QA/SelectorUsage select_template('MIT License') expect(ide_editor_value).to have_content('MIT License') - expect(ide_editor_value).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}") + expect(ide_editor_value).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}") ide_commit - expect(current_path).to eq("/-/ide/project/#{project.full_path}/tree/master/-/LICENSE/") + expect(page).to have_current_path("/-/ide/project/#{project.full_path}/tree/master/-/LICENSE/", ignore_query: true) expect(page).to have_content('All changes are committed') license_file = project.repository.blob_at('master', 'LICENSE').data expect(license_file).to have_content('MIT License') - expect(license_file).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}") + expect(license_file).to have_content("Copyright (c) #{Time.zone.now.year} #{project.namespace.human_name}") end def select_template(template) diff --git a/spec/features/projects/files/user_browses_files_spec.rb b/spec/features/projects/files/user_browses_files_spec.rb index 9b4d1502bc8..53fdd5a15dd 100644 --- a/spec/features/projects/files/user_browses_files_spec.rb +++ b/spec/features/projects/files/user_browses_files_spec.rb @@ -76,7 +76,7 @@ RSpec.describe "User browses files", :js do permalink_path = project_blob_path(project, "#{project.repository.commit.sha}/.gitignore") - expect(current_path).to eq(permalink_path) + expect(page).to have_current_path(permalink_path, ignore_query: true) end end @@ -87,7 +87,7 @@ RSpec.describe "User browses files", :js do end it "shows correct files and links" do - expect(current_path).to eq(project_tree_path(project, "markdown")) + expect(page).to have_current_path(project_tree_path(project, "markdown"), ignore_query: true) expect(page).to have_content("README.md") .and have_content("CHANGELOG") .and have_content("Welcome to GitLab GitLab is a free project and repository management application") @@ -108,7 +108,7 @@ RSpec.describe "User browses files", :js do it "shows correct content of file" do click_link("GitLab API doc") - expect(current_path).to eq(project_blob_path(project, "markdown/doc/api/README.md")) + expect(page).to have_current_path(project_blob_path(project, "markdown/doc/api/README.md"), ignore_query: true) expect(page).to have_content("All API requests require authentication") .and have_content("Contents") .and have_link("Users") @@ -117,19 +117,19 @@ RSpec.describe "User browses files", :js do click_link("Users") - expect(current_path).to eq(project_blob_path(project, "markdown/doc/api/users.md")) + expect(page).to have_current_path(project_blob_path(project, "markdown/doc/api/users.md"), ignore_query: true) expect(page).to have_content("Get a list of users.") page.go_back click_link("Rake tasks") - expect(current_path).to eq(project_tree_path(project, "markdown/doc/raketasks")) + expect(page).to have_current_path(project_tree_path(project, "markdown/doc/raketasks"), ignore_query: true) expect(page).to have_content("backup_restore.md").and have_content("maintenance.md") click_link("maintenance.md") - expect(current_path).to eq(project_blob_path(project, "markdown/doc/raketasks/maintenance.md")) + expect(page).to have_current_path(project_blob_path(project, "markdown/doc/raketasks/maintenance.md"), ignore_query: true) expect(page).to have_content("bundle exec rake gitlab:env:info RAILS_ENV=production") click_link("shop") @@ -156,12 +156,12 @@ RSpec.describe "User browses files", :js do it "shows correct content of directory" do click_link("GitLab API doc directory") - expect(current_path).to eq(project_tree_path(project, "markdown/doc/api")) + expect(page).to have_current_path(project_tree_path(project, "markdown/doc/api"), ignore_query: true) expect(page).to have_content("README.md").and have_content("users.md") click_link("Users") - expect(current_path).to eq(project_blob_path(project, "markdown/doc/api/users.md")) + expect(page).to have_current_path(project_blob_path(project, "markdown/doc/api/users.md"), ignore_query: true) expect(page).to have_content("List users").and have_content("Get a list of users.") end end @@ -267,7 +267,7 @@ RSpec.describe "User browses files", :js do end it "shows files from a repository for `6d39438`" do - expect(current_path).to eq(ref) + expect(page).to have_current_path(ref, ignore_query: true) expect(page).to have_content(".gitignore").and have_content("LICENSE") 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 3976df849fa..56e18871810 100644 --- a/spec/features/projects/files/user_browses_lfs_files_spec.rb +++ b/spec/features/projects/files/user_browses_lfs_files_spec.rb @@ -72,24 +72,7 @@ RSpec.describe 'Projects > Files > User browses LFS files' do expect(page).not_to have_content('Blame') expect(page).not_to have_selector(:link_or_button, text: /^Edit$/) - expect(page).to have_selector(:link_or_button, 'Edit in Web IDE') - end - end - - context 'when feature flag :consolidated_edit_button is off' do - before do - stub_feature_flags(consolidated_edit_button: false) - - click_link('files') - click_link('lfs') - click_link('lfs_object.iso') - end - - it 'does not show single file edit link' do - page.within('.content') do - expect(page).to have_selector(:link_or_button, 'Web IDE') - expect(page).not_to have_css('button[data-testid="edit"') - end + expect(page).to have_selector(:link_or_button, 'Open in Web IDE') end end end diff --git a/spec/features/projects/files/user_creates_directory_spec.rb b/spec/features/projects/files/user_creates_directory_spec.rb index 5ad7641a5be..9e0168d7ef3 100644 --- a/spec/features/projects/files/user_creates_directory_spec.rb +++ b/spec/features/projects/files/user_creates_directory_spec.rb @@ -42,7 +42,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js do click_button('Create directory') expect(page).to have_content('A directory with this name already exists') - expect(current_path).to eq(project_tree_path(project, 'master')) + expect(page).to have_current_path(project_tree_path(project, 'master'), ignore_query: true) end end @@ -81,7 +81,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js do expect(page).to have_content('From new-feature into master') expect(page).to have_content('Add new directory') - expect(current_path).to eq(project_new_merge_request_path(project)) + expect(page).to have_current_path(project_new_merge_request_path(project), ignore_query: true) end end @@ -107,7 +107,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js do fork = user.fork_of(project2.reload) wait_for_requests - expect(current_path).to eq(project_new_merge_request_path(fork)) + expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true) end end end diff --git a/spec/features/projects/files/user_creates_files_spec.rb b/spec/features/projects/files/user_creates_files_spec.rb index 7159418deda..7344c91b6dc 100644 --- a/spec/features/projects/files/user_creates_files_spec.rb +++ b/spec/features/projects/files/user_creates_files_spec.rb @@ -97,7 +97,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do new_file_path = project_blob_path(project, 'master/not_a_file.md') - expect(current_path).to eq(new_file_path) + expect(page).to have_current_path(new_file_path, ignore_query: true) wait_for_requests @@ -115,7 +115,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do new_file_path = project_blob_path(project, 'master/not_a_file.md') - expect(current_path).to eq(new_file_path) + expect(page).to have_current_path(new_file_path, ignore_query: true) click_link('Edit') @@ -133,7 +133,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do fill_in(:commit_message, with: 'New commit message', visible: true) click_button('Commit changes') - expect(current_path).to eq(project_blob_path(project, 'master/foo/bar/baz.txt')) + expect(page).to have_current_path(project_blob_path(project, 'master/foo/bar/baz.txt'), ignore_query: true) wait_for_requests @@ -150,7 +150,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do fill_in(:branch_name, with: 'new_branch_name', visible: true) click_button('Commit changes') - expect(current_path).to eq(project_new_merge_request_path(project)) + expect(page).to have_current_path(project_new_merge_request_path(project), ignore_query: true) click_link('Changes') @@ -187,7 +187,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do fork = user.fork_of(project2.reload) - expect(current_path).to eq(project_new_merge_request_path(fork)) + expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true) expect(page).to have_content('New commit message') end end diff --git a/spec/features/projects/files/user_deletes_files_spec.rb b/spec/features/projects/files/user_deletes_files_spec.rb index c508b2ddba9..806f1e8e9ed 100644 --- a/spec/features/projects/files/user_deletes_files_spec.rb +++ b/spec/features/projects/files/user_deletes_files_spec.rb @@ -15,7 +15,6 @@ RSpec.describe 'Projects > Files > User deletes files', :js do let(:user) { create(:user) } before do - stub_feature_flags(refactor_blob_viewer: false) # This stub will be removed in https://gitlab.com/gitlab-org/gitlab/-/issues/349953 sign_in(user) end @@ -35,7 +34,7 @@ RSpec.describe 'Projects > Files > User deletes files', :js do fill_in(:commit_message, with: 'New commit message', visible: true) click_button('Delete file') - expect(current_path).to eq(project_tree_path(project, 'master/')) + expect(page).to have_current_path(project_tree_path(project, 'master/'), ignore_query: true) expect(page).not_to have_content('.gitignore') end end @@ -67,7 +66,7 @@ RSpec.describe 'Projects > Files > User deletes files', :js do fork = user.fork_of(project2.reload) - expect(current_path).to eq(project_new_merge_request_path(fork)) + expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true) expect(page).to have_content('New commit message') end end diff --git a/spec/features/projects/files/user_edits_files_spec.rb b/spec/features/projects/files/user_edits_files_spec.rb index 2b4ac3dc1d8..1ac45970828 100644 --- a/spec/features/projects/files/user_edits_files_spec.rb +++ b/spec/features/projects/files/user_edits_files_spec.rb @@ -77,7 +77,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do fill_in(:commit_message, with: 'New commit message', visible: true) click_button('Commit changes') - expect(current_path).to eq(project_blob_path(project, 'master/.gitignore')) + expect(page).to have_current_path(project_blob_path(project, 'master/.gitignore'), ignore_query: true) wait_for_requests @@ -97,7 +97,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do fill_in(:branch_name, with: 'new_branch_name', visible: true) click_button('Commit changes') - expect(current_path).to eq(project_new_merge_request_path(project)) + expect(page).to have_current_path(project_new_merge_request_path(project), ignore_query: true) click_link('Changes') @@ -194,7 +194,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do fork = user.fork_of(project2.reload) - expect(current_path).to eq(project_new_merge_request_path(fork)) + expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true) wait_for_requests @@ -223,7 +223,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do fork = user.fork_of(project2) - expect(current_path).to eq(project_new_merge_request_path(fork)) + expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true) wait_for_requests @@ -236,116 +236,5 @@ RSpec.describe 'Projects > Files > User edits files', :js do let(:project) { project2 } end end - - context 'when feature flag :consolidated_edit_button is off' do - before do - stub_feature_flags(consolidated_edit_button: false) - end - - context 'when an user does not have write access', :js do - before do - project2.add_reporter(user) - visit(project2_tree_path_root_ref) - wait_for_requests - end - - it 'inserts a content of a file in a forked project', :sidekiq_might_not_need_inline do - set_default_button('edit') - click_link('.gitignore') - click_link_or_button('Edit') - - expect_fork_prompt - - click_link_or_button('Fork') - - expect_fork_status - - find('.file-editor', match: :first) - - find('#editor') - set_editor_value('*.rbca') - - expect(editor_value).to eq('*.rbca') - end - - it 'opens the Web IDE in a forked project', :sidekiq_might_not_need_inline do - set_default_button('webide') - click_link('.gitignore') - click_link_or_button('Web IDE') - - expect_fork_prompt - - click_link_or_button('Fork') - - expect_fork_status - - expect(page).to have_css('.ide-sidebar-project-title', text: "#{project2.name} #{user.namespace.full_path}/#{project2.path}") - expect(page).to have_css('.ide .multi-file-tab', text: '.gitignore') - end - - it 'commits an edited file in a forked project', :sidekiq_might_not_need_inline do - set_default_button('edit') - click_link('.gitignore') - click_link_or_button('Edit') - - expect_fork_prompt - - click_link_or_button('Fork') - - expect_fork_status - - find('.file-editor', match: :first) - - find('#editor') - set_editor_value('*.rbca') - fill_in(:commit_message, with: 'New commit message', visible: true) - click_button('Commit changes') - - fork = user.fork_of(project2.reload) - - expect(current_path).to eq(project_new_merge_request_path(fork)) - - wait_for_requests - - expect(page).to have_content('New commit message') - end - - context 'when the user already had a fork of the project', :js do - let!(:forked_project) { fork_project(project2, user, namespace: user.namespace, repository: true) } - - before do - visit(project2_tree_path_root_ref) - wait_for_requests - end - - it 'links to the forked project for editing', :sidekiq_might_not_need_inline do - set_default_button('edit') - click_link('.gitignore') - click_link_or_button('Edit') - - expect(page).not_to have_link('Fork') - - find('#editor') - set_editor_value('*.rbca') - fill_in(:commit_message, with: 'Another commit', visible: true) - click_button('Commit changes') - - fork = user.fork_of(project2) - - expect(current_path).to eq(project_new_merge_request_path(fork)) - - wait_for_requests - - expect(page).to have_content('Another commit') - expect(page).to have_content("From #{forked_project.full_path}") - expect(page).to have_content("into #{project2.full_path}") - end - - it_behaves_like 'unavailable for an archived project' do - let(:project) { project2 } - end - end - end - end end end diff --git a/spec/features/projects/files/user_replaces_files_spec.rb b/spec/features/projects/files/user_replaces_files_spec.rb index fe9520fffc8..1ecd50b6463 100644 --- a/spec/features/projects/files/user_replaces_files_spec.rb +++ b/spec/features/projects/files/user_replaces_files_spec.rb @@ -17,7 +17,6 @@ RSpec.describe 'Projects > Files > User replaces files', :js do let(:user) { create(:user) } before do - stub_feature_flags(refactor_blob_viewer: false) # This stub will be removed in https://gitlab.com/gitlab-org/gitlab/-/issues/349953 sign_in(user) end @@ -34,9 +33,9 @@ RSpec.describe 'Projects > Files > User replaces files', :js do expect(page).to have_content('.gitignore') click_on('Replace') - drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt')) + find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt')) - page.within('#modal-upload-blob') do + page.within('#modal-replace-blob') do fill_in(:commit_message, with: 'Replacement file commit message') end @@ -70,9 +69,9 @@ RSpec.describe 'Projects > Files > User replaces files', :js do expect(page).to have_content(fork_message) click_on('Replace') - drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt')) + find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt')) - page.within('#modal-upload-blob') do + page.within('#modal-replace-blob') do fill_in(:commit_message, with: 'Replacement file commit message') end @@ -82,7 +81,7 @@ RSpec.describe 'Projects > Files > User replaces files', :js do fork = user.fork_of(project2.reload) - expect(current_path).to eq(project_new_merge_request_path(fork)) + expect(page).to have_current_path(project_new_merge_request_path(fork), ignore_query: true) click_link('Changes') diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb index f9a6b67e469..fb27f0961b6 100644 --- a/spec/features/projects/fork_spec.rb +++ b/spec/features/projects/fork_spec.rb @@ -164,199 +164,4 @@ RSpec.describe 'Project fork' do end end end - - context 'with fork_project_form feature flag disabled' do - before do - stub_feature_flags(fork_project_form: false) - sign_in(user) - end - - it_behaves_like 'fork button on project page' - - context 'user has exceeded personal project limit' do - before do - user.update!(projects_limit: 0) - end - - context 'with a group to fork to' do - let!(:group) { create(:group).tap { |group| group.add_owner(user) } } - - it 'allows user to fork only to the group on fork page', :js do - visit new_project_fork_path(project) - - to_personal_namespace = find('[data-qa-selector=fork_namespace_button].disabled') # rubocop:disable QA/SelectorUsage - to_group = find(".fork-groups button[data-qa-name=#{group.name}]") # rubocop:disable QA/SelectorUsage - - expect(to_personal_namespace).not_to be_nil - expect(to_group).not_to be_disabled - end - end - end - - it_behaves_like 'create fork page', ' Select a namespace to fork the project ' - - it 'forks the project', :sidekiq_might_not_need_inline do - visit project_path(project) - - click_link 'Fork' - - page.within '.fork-thumbnail-container' do - click_link 'Select' - end - - expect(page).to have_content 'Forked from' - - visit project_path(project) - - expect(page).to have_content(/new merge request/i) - - page.within '.nav-sidebar' do - first(:link, 'Merge requests').click - end - - expect(page).to have_content(/new merge request/i) - - page.within '#content-body' do - click_link('New merge request') - end - - expect(current_path).to have_content(/#{user.namespace.path}/i) - end - - it 'shows avatars when Gravatar is disabled' do - stub_application_setting(gravatar_enabled: false) - - visit project_path(project) - - click_link 'Fork' - - page.within('.fork-thumbnail-container') do - expect(page).to have_css('span.identicon') - end - end - - it 'shows the forked project on the list' do - visit project_path(project) - - click_link 'Fork' - - page.within '.fork-thumbnail-container' do - click_link 'Select' - end - - visit project_forks_path(project) - - forked_project = user.fork_of(project.reload) - - page.within('.js-projects-list-holder') do - expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}") - end - - forked_project.update!(path: 'test-crappy-path') - - visit project_forks_path(project) - - page.within('.js-projects-list-holder') do - expect(page).to have_content("#{forked_project.namespace.human_name} / #{forked_project.name}") - end - end - - context 'when the project is private' do - let(:project) { create(:project, :repository) } - let(:another_user) { create(:user, name: 'Mike') } - - before do - project.add_reporter(user) - project.add_reporter(another_user) - end - - it 'renders private forks of the project' do - visit project_path(project) - - another_project_fork = Projects::ForkService.new(project, another_user).execute - - click_link 'Fork' - - page.within '.fork-thumbnail-container' do - click_link 'Select' - end - - visit project_forks_path(project) - - page.within('.js-projects-list-holder') do - user_project_fork = user.fork_of(project.reload) - expect(page).to have_content("#{user_project_fork.namespace.human_name} / #{user_project_fork.name}") - end - - expect(page).not_to have_content("#{another_project_fork.namespace.human_name} / #{another_project_fork.name}") - end - end - - context 'when the user already forked the project' do - before do - create(:project, :repository, name: project.name, namespace: user.namespace) - end - - it 'renders error' do - visit project_path(project) - - click_link 'Fork' - - page.within '.fork-thumbnail-container' do - click_link 'Select' - end - - expect(page).to have_content "Name has already been taken" - end - end - - context 'maintainer in group' do - let(:group) { create(:group) } - - before do - group.add_maintainer(user) - end - - it 'allows user to fork project to group or to user namespace', :js do - visit project_path(project) - wait_for_requests - - expect(page).not_to have_css('a.disabled', text: 'Fork') - - click_link 'Fork' - - expect(page).to have_css('.fork-thumbnail') - expect(page).to have_css('.group-row') - expect(page).not_to have_css('.fork-thumbnail.disabled') - end - - it 'allows user to fork project to group and not user when exceeded project limit', :js do - user.projects_limit = 0 - user.save! - - visit project_path(project) - wait_for_requests - - expect(page).not_to have_css('a.disabled', text: 'Fork') - - click_link 'Fork' - - expect(page).to have_css('.fork-thumbnail.disabled') - expect(page).to have_css('.group-row') - end - - it 'links to the fork if the project was already forked within that namespace', :sidekiq_might_not_need_inline, :js do - forked_project = fork_project(project, user, namespace: group, repository: true) - - visit new_project_fork_path(project) - wait_for_requests - - expect(page).to have_css('.group-row a.btn', text: 'Go to fork') - - click_link 'Go to fork' - - expect(current_path).to eq(project_path(forked_project)) - end - end - end end diff --git a/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb b/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb index b9c2c539899..2821f35f6a6 100644 --- a/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb +++ b/spec/features/projects/integrations/user_activates_issue_tracker_spec.rb @@ -34,7 +34,7 @@ RSpec.describe 'User activates issue tracker', :js do it 'activates the integration' do expect(page).to have_content("#{tracker} settings saved and active.") - expect(current_path).to eq(edit_project_integration_path(project, tracker.parameterize(separator: '_'))) + expect(page).to have_current_path(edit_project_integration_path(project, tracker.parameterize(separator: '_')), ignore_query: true) end it 'shows the link in the menu' do @@ -58,7 +58,7 @@ RSpec.describe 'User activates issue tracker', :js do end expect(page).to have_content("#{tracker} settings saved and active.") - expect(current_path).to eq(edit_project_integration_path(project, tracker.parameterize(separator: '_'))) + expect(page).to have_current_path(edit_project_integration_path(project, tracker.parameterize(separator: '_')), ignore_query: true) end end end @@ -73,7 +73,7 @@ RSpec.describe 'User activates issue tracker', :js do it 'saves but does not activate the integration' do expect(page).to have_content("#{tracker} settings saved, but not active.") - expect(current_path).to eq(edit_project_integration_path(project, tracker.parameterize(separator: '_'))) + expect(page).to have_current_path(edit_project_integration_path(project, tracker.parameterize(separator: '_')), ignore_query: true) end it 'does not show the external tracker link in the menu' do diff --git a/spec/features/projects/integrations/user_activates_jetbrains_teamcity_ci_spec.rb b/spec/features/projects/integrations/user_activates_jetbrains_teamcity_ci_spec.rb index e6f2e462b8c..f86a1b8a0a4 100644 --- a/spec/features/projects/integrations/user_activates_jetbrains_teamcity_ci_spec.rb +++ b/spec/features/projects/integrations/user_activates_jetbrains_teamcity_ci_spec.rb @@ -12,7 +12,7 @@ RSpec.describe 'User activates JetBrains TeamCity CI' do it 'activates integration', :js do visit_project_integration('JetBrains TeamCity') check('Push') - check('Merge Request') + check('Merge request') fill_in('TeamCity server URL', with: 'http://teamcity.example.com') fill_in('Build type', with: 'GitlabTest_Build') fill_in('Username', with: 'user') diff --git a/spec/features/projects/integrations/user_activates_jira_spec.rb b/spec/features/projects/integrations/user_activates_jira_spec.rb index 7562dc00092..f855d6befe7 100644 --- a/spec/features/projects/integrations/user_activates_jira_spec.rb +++ b/spec/features/projects/integrations/user_activates_jira_spec.rb @@ -20,7 +20,7 @@ RSpec.describe 'User activates Jira', :js do it 'activates the Jira integration' do expect(page).to have_content('Jira settings saved and active.') - expect(current_path).to eq(edit_project_integration_path(project, :jira)) + expect(page).to have_current_path(edit_project_integration_path(project, :jira), ignore_query: true) end unless Gitlab.ee? @@ -55,7 +55,7 @@ RSpec.describe 'User activates Jira', :js do click_test_then_save_integration expect(page).to have_content('Jira settings saved and active.') - expect(current_path).to eq(edit_project_integration_path(project, :jira)) + expect(page).to have_current_path(edit_project_integration_path(project, :jira), ignore_query: true) end end end @@ -72,7 +72,7 @@ RSpec.describe 'User activates Jira', :js do it 'saves but does not activate the Jira integration' do expect(page).to have_content('Jira settings saved, but not active.') - expect(current_path).to eq(edit_project_integration_path(project, :jira)) + expect(page).to have_current_path(edit_project_integration_path(project, :jira), ignore_query: true) end it 'does not show the Jira link in the menu' do diff --git a/spec/features/projects/integrations/user_activates_slack_slash_command_spec.rb b/spec/features/projects/integrations/user_activates_slack_slash_command_spec.rb index 7ec469070ea..0b4c9620bdf 100644 --- a/spec/features/projects/integrations/user_activates_slack_slash_command_spec.rb +++ b/spec/features/projects/integrations/user_activates_slack_slash_command_spec.rb @@ -24,7 +24,7 @@ RSpec.describe 'Slack slash commands', :js do click_active_checkbox click_on 'Save' - expect(current_path).to eq(edit_project_integration_path(project, :slack_slash_commands)) + expect(page).to have_current_path(edit_project_integration_path(project, :slack_slash_commands), ignore_query: true) expect(page).to have_content('Slack slash commands settings saved, but not active.') end @@ -32,7 +32,7 @@ RSpec.describe 'Slack slash commands', :js do fill_in 'Token', with: 'token' click_on 'Save' - expect(current_path).to eq(edit_project_integration_path(project, :slack_slash_commands)) + expect(page).to have_current_path(edit_project_integration_path(project, :slack_slash_commands), ignore_query: true) expect(page).to have_content('Slack slash commands settings saved and active.') end diff --git a/spec/features/projects/jobs/user_browses_job_spec.rb b/spec/features/projects/jobs/user_browses_job_spec.rb index 12e88bbf6a5..e2dc760beda 100644 --- a/spec/features/projects/jobs/user_browses_job_spec.rb +++ b/spec/features/projects/jobs/user_browses_job_spec.rb @@ -15,11 +15,10 @@ RSpec.describe 'User browses a job', :js do stub_feature_flags(bootstrap_confirmation_modals: false) sign_in(user) - - visit(project_job_path(project, build)) end it 'erases the job log', :js do + visit(project_job_path(project, build)) wait_for_requests expect(page).to have_content("Job #{build.name}") @@ -41,6 +40,7 @@ RSpec.describe 'User browses a job', :js do let!(:build) { create(:ci_build, :success, :unarchived_trace_artifact, :coverage, pipeline: pipeline) } it 'shows no trace message', :js do + visit(project_job_path(project, build)) wait_for_requests expect(page).to have_content('This job does not have a trace.') @@ -51,6 +51,7 @@ RSpec.describe 'User browses a job', :js do let!(:build) { create(:ci_build, :failed, :trace_live, pipeline: pipeline) } it 'displays the failure reason' do + visit(project_job_path(project, build)) wait_for_all_requests within('.builds-container') do expect(page).to have_selector( @@ -62,6 +63,7 @@ RSpec.describe 'User browses a job', :js do let!(:artifact) { create(:ci_job_artifact, :unarchived_trace_artifact, job: build) } it 'displays the failure reason from the live trace' do + visit(project_job_path(project, build)) wait_for_all_requests within('.builds-container') do expect(page).to have_selector( @@ -75,6 +77,7 @@ RSpec.describe 'User browses a job', :js do let!(:build_retried) { create(:ci_build, :failed, :retried, :trace_artifact, pipeline: pipeline) } it 'displays the failure reason and retried label' do + visit(project_job_path(project, build)) wait_for_all_requests within('.builds-container') do expect(page).to have_selector( diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb index a47aab1ec70..fde6240d373 100644 --- a/spec/features/projects/jobs/user_browses_jobs_spec.rb +++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb @@ -270,7 +270,7 @@ RSpec.describe 'User browses jobs' do wait_for_requests expect(page).to have_content 'You need to sign in' - expect(page.current_path).to eq("/users/sign_in") + expect(page).to have_current_path("/users/sign_in") end end end diff --git a/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb b/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb index e8a14694d88..eea7e070a35 100644 --- a/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb +++ b/spec/features/projects/jobs/user_triggers_manual_job_with_variables_spec.rb @@ -28,7 +28,7 @@ RSpec.describe 'User triggers manual job with variables', :js do wait_for_requests - expect(build.job_variables.as_json).to contain_exactly( + expect(build.job_variables.as_json(only: [:key, :value])).to contain_exactly( hash_including('key' => 'key_name', 'value' => 'key_value')) end end diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb index a65d2d15c12..b34a615e651 100644 --- a/spec/features/projects/jobs_spec.rb +++ b/spec/features/projects/jobs_spec.rb @@ -103,7 +103,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do end it "redirects to new URL" do - expect(page.current_path).to eq(jobs_url) + expect(page).to have_current_path(jobs_url, ignore_query: true) end end end @@ -313,9 +313,9 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do context 'job is cancelable' do it 'shows cancel button' do - click_link 'Cancel' + find('[data-testid="cancel-button"]').click - expect(page.current_path).to eq(job_url) + expect(page).to have_current_path(job_url, ignore_query: true) end end end @@ -384,7 +384,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do end context 'when expire date is defined' do - let(:expire_at) { Time.now + 7.days } + let(:expire_at) { Time.zone.now + 7.days } context 'when user has ability to update job' do context 'when artifacts are unlocked' do @@ -423,7 +423,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do end context 'when artifacts expired' do - let(:expire_at) { Time.now - 7.days } + let(:expire_at) { Time.zone.now - 7.days } context 'when artifacts are unlocked' do before do @@ -459,7 +459,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do end it "redirects to new URL" do - expect(page.current_path).to eq(job_url) + expect(page).to have_current_path(job_url, ignore_query: true) end end @@ -1031,7 +1031,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do end it 'loads the page and shows all needed controls' do - expect(page).to have_content 'Retry' + expect(page).to have_selector('[data-testid="retry-button"') end end end @@ -1049,7 +1049,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do it 'shows the right status and buttons' do page.within('aside.right-sidebar') do - expect(page).to have_content 'Cancel' + expect(page).to have_selector('[data-testid="cancel-button"') end end end @@ -1179,7 +1179,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do end it "redirects to new URL" do - expect(page.current_path).to eq(raw_job_url) + expect(page).to have_current_path(raw_job_url, ignore_query: true) end end end diff --git a/spec/features/projects/labels/sort_labels_spec.rb b/spec/features/projects/labels/sort_labels_spec.rb index 26b3d08253c..ecbc4b524dc 100644 --- a/spec/features/projects/labels/sort_labels_spec.rb +++ b/spec/features/projects/labels/sort_labels_spec.rb @@ -28,7 +28,7 @@ RSpec.describe 'Sort labels', :js do it 'sorts by date' do click_button 'Name' - sort_options = find('ul.dropdown-menu-sort li').all('a').collect(&:text) + sort_options = find('ul.dropdown-menu').all('li').collect(&:text) expect(sort_options[0]).to eq('Name') expect(sort_options[1]).to eq('Name, descending') @@ -37,7 +37,7 @@ RSpec.describe 'Sort labels', :js do expect(sort_options[4]).to eq('Updated date') expect(sort_options[5]).to eq('Oldest updated') - click_link 'Name, descending' + click_button 'Name, descending' # assert default sorting within '.other-labels' do diff --git a/spec/features/projects/members/group_members_spec.rb b/spec/features/projects/members/group_members_spec.rb index 94ce18fef93..6aa6acbdae4 100644 --- a/spec/features/projects/members/group_members_spec.rb +++ b/spec/features/projects/members/group_members_spec.rb @@ -92,7 +92,6 @@ RSpec.describe 'Projects members', :js do context 'with a group requester' do before do - stub_feature_flags(invite_members_group_modal: false) group.request_access(group_requester) visit project_project_members_path(project) end diff --git a/spec/features/projects/members/invite_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb index 066e0b0d20f..9c256504934 100644 --- a/spec/features/projects/members/invite_group_spec.rb +++ b/spec/features/projects/members/invite_group_spec.rb @@ -3,47 +3,33 @@ require 'spec_helper' RSpec.describe 'Project > Members > Invite group', :js do - include Select2Helper include ActionView::Helpers::DateHelper include Spec::Support::Helpers::Features::MembersHelpers include Spec::Support::Helpers::Features::InviteMembersModalHelper let_it_be(:maintainer) { create(:user) } - using RSpec::Parameterized::TableSyntax + it 'displays the invite group button' do + project = create(:project, namespace: create(:group)) - where(:invite_members_group_modal_enabled, :expected_invite_group_selector) do - true | 'button[data-qa-selector="invite_a_group_button"]' # rubocop:disable QA/SelectorUsage - false | '#invite-group-tab' - end - - with_them do - before do - stub_feature_flags(invite_members_group_modal: invite_members_group_modal_enabled) - end + project.add_maintainer(maintainer) + sign_in(maintainer) - it 'displays either the invite group button or the form with tabs based on the feature flag' do - project = create(:project, namespace: create(:group)) + visit project_project_members_path(project) - project.add_maintainer(maintainer) - sign_in(maintainer) + expect(page).to have_selector('button[data-test-id="invite-group-button"]') + end - visit project_project_members_path(project) + it 'does not display the button when visiting the page not signed in' do + project = create(:project, namespace: create(:group)) - expect(page).to have_selector(expected_invite_group_selector) - end + visit project_project_members_path(project) - it 'does not display either the form or the button when visiting the page not signed in' do - project = create(:project, namespace: create(:group)) - - visit project_project_members_path(project) - - expect(page).not_to have_selector(expected_invite_group_selector) - end + expect(page).not_to have_selector('button[data-test-id="invite-group-button"]') end describe 'Share with group lock' do - let(:invite_group_selector) { 'button[data-qa-selector="invite_a_group_button"]' } # rubocop:disable QA/SelectorUsage + let(:invite_group_selector) { 'button[data-test-id="invite-group-button"]' } shared_examples 'the project can be shared with groups' do it 'the "Invite a group" button exists' do @@ -72,27 +58,7 @@ RSpec.describe 'Project > Members > Invite group', :js do context 'when the group has "Share with group lock" disabled' do it_behaves_like 'the project can be shared with groups' - it 'the project can be shared with another group when the feature flag invite_members_group_modal is disabled' do - stub_feature_flags(invite_members_group_modal: false) - - visit project_project_members_path(project) - - expect(page).not_to have_link 'Groups' - - click_on 'invite-group-tab' - - select2 group_to_share_with.id, from: '#link_group_id' - page.find('body').click - find('.btn-confirm').click - - click_link 'Groups' - - expect(members_table).to have_content(group_to_share_with.name) - end - - it 'the project can be shared with another group when the feature flag invite_members_group_modal is enabled' do - stub_feature_flags(invite_members_group_modal: true) - + it 'the project can be shared with another group' do visit project_project_members_path(project) expect(page).not_to have_link 'Groups' @@ -250,51 +216,6 @@ RSpec.describe 'Project > Members > Invite group', :js do end end - context 'when invite_members_group_modal feature disabled' do - let(:group_invite_dropdown) { find('#select2-results-2') } - - before do - stub_feature_flags(invite_members_group_modal: false) - end - - it 'does not show the groups inherited from projects', :aggregate_failures do - project.add_maintainer(maintainer) - public_sibbling_group.add_maintainer(maintainer) - - visit project_project_members_path(project) - - click_on 'Invite group' - click_on 'Search for a group' - wait_for_requests - - expect(group_invite_dropdown).to have_text(public_membership_group.full_path) - expect(group_invite_dropdown).to have_text(public_sibbling_group.full_path) - expect(group_invite_dropdown).to have_text(private_membership_group.full_path) - expect(group_invite_dropdown).not_to have_text(public_sub_subgroup.full_path) - expect(group_invite_dropdown).not_to have_text(private_sibbling_group.full_path) - expect(group_invite_dropdown).not_to have_text(parent_group.full_path, exact: true) - expect(group_invite_dropdown).not_to have_text(project_group.full_path, exact: true) - end - - it 'does not show the ancestors or project group', :aggregate_failures do - parent_group.add_maintainer(maintainer) - - visit project_project_members_path(project) - - click_on 'Invite group' - click_on 'Search for a group' - wait_for_requests - - expect(group_invite_dropdown).to have_text(public_membership_group.full_path) - expect(group_invite_dropdown).to have_text(public_sub_subgroup.full_path) - expect(group_invite_dropdown).to have_text(public_sibbling_group.full_path) - expect(group_invite_dropdown).to have_text(private_sibbling_group.full_path) - expect(group_invite_dropdown).to have_text(private_membership_group.full_path) - expect(group_invite_dropdown).not_to have_text(parent_group.full_path, exact: true) - expect(group_invite_dropdown).not_to have_text(project_group.full_path, exact: true) - end - end - def expect_to_have_group(group) expect(page).to have_selector("[entity-id='#{group.id}']") end diff --git a/spec/features/projects/members/member_leaves_project_spec.rb b/spec/features/projects/members/member_leaves_project_spec.rb index c38292f81bf..78a0a384d2c 100644 --- a/spec/features/projects/members/member_leaves_project_spec.rb +++ b/spec/features/projects/members/member_leaves_project_spec.rb @@ -19,7 +19,7 @@ RSpec.describe 'Projects > Members > Member leaves project' do click_link 'Leave project' - expect(current_path).to eq(dashboard_projects_path) + expect(page).to have_current_path(dashboard_projects_path, ignore_query: true) expect(project.users.exists?(user.id)).to be_falsey end @@ -29,7 +29,7 @@ RSpec.describe 'Projects > Members > Member leaves project' do page.accept_confirm wait_for_all_requests - expect(current_path).to eq(dashboard_projects_path) + expect(page).to have_current_path(dashboard_projects_path, ignore_query: true) sign_in(project.first_owner) diff --git a/spec/features/projects/members/user_requests_access_spec.rb b/spec/features/projects/members/user_requests_access_spec.rb index 0b00656f87b..370d7b49832 100644 --- a/spec/features/projects/members/user_requests_access_spec.rb +++ b/spec/features/projects/members/user_requests_access_spec.rb @@ -4,12 +4,14 @@ require 'spec_helper' RSpec.describe 'Projects > Members > User requests access', :js do let_it_be(:user) { create(:user) } + let_it_be(:maintainer) { create(:user) } let_it_be(:project) { create(:project, :public, :repository) } - let(:maintainer) { project.first_owner } + let(:owner) { project.first_owner } before do sign_in(user) + project.add_maintainer(maintainer) visit project_path(project) stub_feature_flags(bootstrap_confirmation_modals: false) end @@ -24,7 +26,7 @@ RSpec.describe 'Projects > Members > User requests access', :js do it 'user can request access to a project' do perform_enqueued_jobs { click_link 'Request Access' } - expect(ActionMailer::Base.deliveries.last.to).to eq [maintainer.notification_email_or_default] + expect(ActionMailer::Base.deliveries.map(&:to)).to match_array([[owner.notification_email_or_default], [maintainer.notification_email_or_default]]) 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 diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb index 91e643ff258..5098908857a 100644 --- a/spec/features/projects/navbar_spec.rb +++ b/spec/features/projects/navbar_spec.rb @@ -16,6 +16,7 @@ RSpec.describe 'Project navbar' do sign_in(user) stub_config(registry: { enabled: false }) + stub_feature_flags(harbor_registry_integration: false) insert_package_nav(_('Infrastructure')) insert_infrastructure_registry_nav insert_infrastructure_google_cloud_nav @@ -76,4 +77,16 @@ RSpec.describe 'Project navbar' do it_behaves_like 'verified navigation bar' end + + context 'when harbor registry is available' do + before do + stub_feature_flags(harbor_registry_integration: true) + + insert_harbor_registry_nav(_('Infrastructure Registry')) + + visit project_path(project) + end + + it_behaves_like 'verified navigation bar' + end end diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index b3fbf5d356e..c57e39b6508 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -372,7 +372,7 @@ RSpec.describe 'New project', :js do it 'shows import instructions' do expect(page).to have_content('Authenticate with GitHub') - expect(current_path).to eq new_import_github_path + expect(page).to have_current_path new_import_github_path, ignore_query: true end end @@ -383,7 +383,7 @@ RSpec.describe 'New project', :js do it 'shows import instructions' do expect(page).to have_content('Manifest file import') - expect(current_path).to eq new_import_manifest_path + expect(page).to have_current_path new_import_manifest_path, ignore_query: true end end end @@ -405,46 +405,62 @@ RSpec.describe 'New project', :js do end end - context 'from Bitbucket', :js do - shared_examples 'has a link to bitbucket cloud' do - context 'when bitbucket is not configured' do - before do - allow(Gitlab::Auth::OAuth::Provider).to receive(:enabled?).and_call_original - allow(Gitlab::Auth::OAuth::Provider) - .to receive(:enabled?).with(:bitbucket) - .and_return(false) + shared_examples 'has instructions to enable OAuth' do + context 'when OAuth is not configured' do + before do + sign_in(user) - visit new_project_path - click_link 'Import project' - click_link 'Bitbucket Cloud' - end + allow(Gitlab::Auth::OAuth::Provider).to receive(:enabled?).and_call_original + allow(Gitlab::Auth::OAuth::Provider) + .to receive(:enabled?).with(provider) + .and_return(false) - it 'shows import instructions' do - expect(find('.modal-body')).to have_content(bitbucket_link_content) - end + visit new_project_path + click_link 'Import project' + click_link target_link + end + + it 'shows import instructions' do + expect(find('.modal-body')).to have_content(oauth_config_instructions) end end + end + + context 'from Bitbucket', :js do + let(:target_link) { 'Bitbucket Cloud' } + let(:provider) { :bitbucket } context 'as a user' do let(:user) { create(:user) } - let(:bitbucket_link_content) { 'To enable importing projects from Bitbucket, ask your GitLab administrator to configure OAuth integration' } + let(:oauth_config_instructions) { 'To enable importing projects from Bitbucket, ask your GitLab administrator to configure OAuth integration' } - before do - sign_in(user) - end - - it_behaves_like 'has a link to bitbucket cloud' + it_behaves_like 'has instructions to enable OAuth' end context 'as an admin' do let(:user) { create(:admin) } - let(:bitbucket_link_content) { 'To enable importing projects from Bitbucket, as administrator you need to configure OAuth integration' } + let(:oauth_config_instructions) { 'To enable importing projects from Bitbucket, as administrator you need to configure OAuth integration' } - before do - sign_in(user) - end + it_behaves_like 'has instructions to enable OAuth' + end + end + + context 'from GitLab.com', :js do + let(:target_link) { 'GitLab.com' } + let(:provider) { :gitlab } + + context 'as a user' do + let(:user) { create(:user) } + let(:oauth_config_instructions) { 'To enable importing projects from GitLab.com, ask your GitLab administrator to configure OAuth integration' } + + it_behaves_like 'has instructions to enable OAuth' + end + + context 'as an admin' do + let(:user) { create(:admin) } + let(:oauth_config_instructions) { 'To enable importing projects from GitLab.com, as administrator you need to configure OAuth integration' } - it_behaves_like 'has a link to bitbucket cloud' + it_behaves_like 'has instructions to enable OAuth' end end end diff --git a/spec/features/projects/pages/user_adds_domain_spec.rb b/spec/features/projects/pages/user_adds_domain_spec.rb index bd4cb1aa39b..71bf1c24655 100644 --- a/spec/features/projects/pages/user_adds_domain_spec.rb +++ b/spec/features/projects/pages/user_adds_domain_spec.rb @@ -95,7 +95,7 @@ RSpec.describe 'User adds pages domain', :js do fill_in 'Domain', with: 'my.test.domain.com' - find('.js-auto-ssl-toggle-container .project-feature-toggle').click + find('.js-auto-ssl-toggle-container .js-project-feature-toggle').click fill_in 'Certificate (PEM)', with: certificate_pem fill_in 'Key (PEM)', with: certificate_key diff --git a/spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb b/spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb index a3fc5804e13..bdf280f4fe4 100644 --- a/spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb +++ b/spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb @@ -50,7 +50,7 @@ RSpec.describe "Pages with Let's Encrypt", :https_pages_enabled do 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 + find('.js-auto-ssl-toggle-container .js-project-feature-toggle').click expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'true' expect(page).not_to have_selector '.card-header', text: 'Certificate' @@ -74,7 +74,7 @@ RSpec.describe "Pages with Let's Encrypt", :https_pages_enabled do expect(page).not_to have_field 'Certificate (PEM)', type: 'textarea' expect(page).not_to have_field 'Key (PEM)', type: 'textarea' - find('.js-auto-ssl-toggle-container .project-feature-toggle').click + find('.js-auto-ssl-toggle-container .js-project-feature-toggle').click expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'false' expect(page).to have_field 'Certificate (PEM)', type: 'textarea' diff --git a/spec/features/projects/pipeline_schedules_spec.rb b/spec/features/projects/pipeline_schedules_spec.rb index aae5ab58b5d..63867a7e900 100644 --- a/spec/features/projects/pipeline_schedules_spec.rb +++ b/spec/features/projects/pipeline_schedules_spec.rb @@ -135,8 +135,8 @@ RSpec.describe 'Pipeline Schedules', :js do end it 'shows the pipeline schedule with default ref' do - page.within('.js-target-branch-dropdown') do - expect(first('.dropdown-toggle-text').text).to eq('master') + page.within('[data-testid="schedule-target-ref"]') do + expect(first('.gl-new-dropdown-button-text').text).to eq('master') end end end @@ -148,8 +148,8 @@ RSpec.describe 'Pipeline Schedules', :js do end it 'shows the pipeline schedule with default ref' do - page.within('.js-target-branch-dropdown') do - expect(first('.dropdown-toggle-text').text).to eq('master') + page.within('[data-testid="schedule-target-ref"]') do + expect(first('.gl-new-dropdown-button-text').text).to eq('master') end end end @@ -293,8 +293,8 @@ RSpec.describe 'Pipeline Schedules', :js do end def select_target_branch - find('.js-target-branch-dropdown').click - click_link 'master' + find('[data-testid="schedule-target-ref"] .dropdown-toggle').click + click_button 'master' end def save_pipeline_schedule diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb index 01c942aec4c..6b9dfdf3a7b 100644 --- a/spec/features/projects/pipelines/pipeline_spec.rb +++ b/spec/features/projects/pipelines/pipeline_spec.rb @@ -477,7 +477,7 @@ RSpec.describe 'Pipeline', :js do it 'redirects to pipeline overview page', :sidekiq_inline do expect(page).to have_content('The pipeline has been deleted') - expect(current_path).to eq(project_pipelines_path(project)) + expect(page).to have_current_path(project_pipelines_path(project), ignore_query: true) end end @@ -916,111 +916,7 @@ RSpec.describe 'Pipeline', :js do end end - describe 'GET /:project/-/pipelines/:id/builds with jobs_tab_vue feature flag turned off' do - include_context 'pipeline builds' - - let_it_be(:project) { create(:project, :repository) } - - let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) } - - before do - stub_feature_flags(jobs_tab_vue: false) - visit builds_project_pipeline_path(project, pipeline) - end - - it 'shows a list of jobs' do - expect(page).to have_content('Test') - expect(page).to have_content(build_passed.id) - expect(page).to have_content('Deploy') - expect(page).to have_content(build_failed.id) - expect(page).to have_content(build_running.id) - expect(page).to have_content(build_external.id) - expect(page).to have_content('Retry') - expect(page).to have_content('Cancel running') - expect(page).to have_link('Play') - end - - it 'shows jobs tab pane as active' do - expect(page).to have_css('#js-tab-builds.active') - end - - context 'page tabs' do - it 'shows Pipeline, Jobs and DAG tabs with link' do - expect(page).to have_link('Pipeline') - expect(page).to have_link('Jobs') - expect(page).to have_link('Needs') - end - - it 'shows counter in Jobs tab' do - expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s) - end - - it 'shows Jobs tab as active' do - expect(page).to have_css('li.js-builds-tab-link .active') - end - end - - context 'retrying jobs' do - it { expect(page).not_to have_content('retried') } - - context 'when retrying' do - before do - find('[data-testid="retryPipeline"]').click - end - - it 'does not show a "Retry" button', :sidekiq_might_not_need_inline do - expect(page).not_to have_content('Retry') - end - end - end - - context 'canceling jobs' do - it { expect(page).not_to have_selector('.ci-canceled') } - - context 'when canceling' do - before do - click_on 'Cancel running' - end - - 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 - - context 'playing manual job' do - before do - within '.pipeline-holder' do - click_link('Play') - end - end - - it { expect(build_manual.reload).to be_pending } - end - - context 'when user unschedules a delayed job' do - before do - within '.pipeline-holder' do - click_link('Unschedule') - end - end - - it 'unschedules the delayed job and shows play button as a manual job' do - expect(page).to have_content('Trigger this manual action') - end - end - - context 'failed jobs' do - it 'displays a tooltip with the failure reason' do - page.within('.ci-table') do - failed_job_link = page.find('.ci-failed') - expect(failed_job_link[:title]).to eq('Failed - (unknown failure)') - end - end - end - end - - describe 'GET /:project/-/pipelines/:id/builds with jobs_tab_vue feature flag turned on' do + describe 'GET /:project/-/pipelines/:id/builds' do include_context 'pipeline builds' let_it_be(:project) { create(:project, :repository) } @@ -1228,7 +1124,7 @@ RSpec.describe 'Pipeline', :js do it 'displays the pipeline graph' do subject - expect(current_path).to eq(pipeline_path(pipeline)) + expect(page).to have_current_path(pipeline_path(pipeline), ignore_query: true) expect(page).not_to have_content('Failed Jobs') expect(page).to have_selector('.js-pipeline-graph') end @@ -1413,7 +1309,7 @@ RSpec.describe 'Pipeline', :js do it 'contains badge that indicates detached merge request pipeline' do page.within(all('.well-segment')[1]) do - expect(page).to have_content 'detached' + expect(page).to have_content 'merge request' end end end diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 37ac5a9d5a2..0e1728858ec 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -7,6 +7,7 @@ RSpec.describe 'Pipelines', :js do include Spec::Support::Helpers::ModalHelpers let(:project) { create(:project) } + let(:expected_detached_mr_tag) {'merge request'} context 'when user is logged in' do let(:user) { create(:user) } @@ -160,51 +161,7 @@ RSpec.describe 'Pipelines', :js do end end - context 'when pipeline is detached merge request pipeline, with rearrange_pipelines_table feature flag turned off' do - let(:merge_request) do - create(:merge_request, - :with_detached_merge_request_pipeline, - source_project: source_project, - target_project: target_project) - end - - let!(:pipeline) { merge_request.all_pipelines.first } - let(:source_project) { project } - let(:target_project) { project } - - before do - stub_feature_flags(rearrange_pipelines_table: false) - - visit project_pipelines_path(source_project) - end - - 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 - - within '.branch-commit' do - expect(page).to have_link(merge_request.iid, - href: project_merge_request_path(project, merge_request)) - end - - within '.branch-commit' do - expect(page).not_to have_link(pipeline.ref) - end - end - end - - 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 'detached merge request pipeline' - end - end - - context 'when pipeline is detached merge request pipeline, with rearrange_pipelines_table feature flag turned on' do + context 'when pipeline is detached merge request pipeline' do let(:merge_request) do create(:merge_request, :with_detached_merge_request_pipeline, @@ -217,15 +174,13 @@ RSpec.describe 'Pipelines', :js do let(:target_project) { project } before do - stub_feature_flags(rearrange_pipelines_table: true) - visit project_pipelines_path(source_project) end 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') + expect(page).to have_content(expected_detached_mr_tag) expect(page).to have_link(merge_request.iid, href: project_merge_request_path(project, merge_request)) @@ -244,52 +199,7 @@ RSpec.describe 'Pipelines', :js do end end - context 'when pipeline is merge request pipeline, with rearrange_pipelines_table feature flag turned off' do - let(:merge_request) do - create(:merge_request, - :with_merge_request_pipeline, - source_project: source_project, - target_project: target_project, - merge_sha: target_project.commit.sha) - end - - let!(:pipeline) { merge_request.all_pipelines.first } - let(:source_project) { project } - let(:target_project) { project } - - before do - stub_feature_flags(rearrange_pipelines_table: false) - - visit project_pipelines_path(source_project) - end - - shared_examples_for 'Correct merge request pipeline information' 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 - - within '.branch-commit' do - expect(page).to have_link(merge_request.iid, - href: project_merge_request_path(project, merge_request)) - end - - within '.branch-commit' do - expect(page).not_to have_link(pipeline.ref) - end - end - end - - it_behaves_like 'Correct merge request pipeline information' - - context 'when source project is a forked project' do - let(:source_project) { fork_project(project, user, repository: true) } - - it_behaves_like 'Correct merge request pipeline information' - end - end - - context 'when pipeline is merge request pipeline, with rearrange_pipelines_table feature flag turned on' do + context 'when pipeline is merge request pipeline' do let(:merge_request) do create(:merge_request, :with_merge_request_pipeline, @@ -303,15 +213,13 @@ RSpec.describe 'Pipelines', :js do let(:target_project) { project } before do - stub_feature_flags(rearrange_pipelines_table: true) - visit project_pipelines_path(source_project) end shared_examples_for 'Correct merge request pipeline information' 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') + expect(page).not_to have_content(expected_detached_mr_tag) expect(page).to have_link(merge_request.iid, href: project_merge_request_path(project, merge_request)) @@ -414,7 +322,7 @@ RSpec.describe 'Pipelines', :js do it "has link to the delayed job's action" do find('[data-testid="pipelines-manual-actions-dropdown"]').click - time_diff = [0, delayed_job.scheduled_at - Time.now].max + time_diff = [0, delayed_job.scheduled_at - Time.zone.now].max expect(page).to have_button('delayed job 1') expect(page).to have_content(Time.at(time_diff).utc.strftime("%H:%M:%S")) end @@ -675,28 +583,6 @@ RSpec.describe 'Pipelines', :js do context 'with pipeline key selection' do before do - stub_feature_flags(rearrange_pipelines_table: false) - visit project_pipelines_path(project) - wait_for_requests - end - - it 'changes the Pipeline ID column for Pipeline IID' do - page.find('[data-testid="pipeline-key-dropdown"]').click - - within '.gl-new-dropdown-contents' do - dropdown_options = page.find_all '.gl-new-dropdown-item' - - dropdown_options[1].click - end - - expect(page.find('[data-testid="pipeline-th"]')).to have_content 'Pipeline IID' - expect(page.find('[data-testid="pipeline-url-link"]')).to have_content "##{pipeline.iid}" - end - end - - context 'with pipeline key selection and rearrange_pipelines_table ff on' do - before do - stub_feature_flags(rearrange_pipelines_table: true) visit project_pipelines_path(project) wait_for_requests end @@ -912,7 +798,7 @@ RSpec.describe 'Pipelines', :js do end it 'renders empty state' do - expect(page).to have_content 'Use a sample CI/CD template' + expect(page).to have_content 'Try test template' end end end @@ -936,7 +822,7 @@ RSpec.describe 'Pipelines', :js do it 'redirects the user to sign_in and displays the flash alert' do expect(page).to have_content 'You need to sign in' - expect(page.current_path).to eq("/users/sign_in") + expect(page).to have_current_path("/users/sign_in") end end end diff --git a/spec/features/projects/releases/user_views_edit_release_spec.rb b/spec/features/projects/releases/user_views_edit_release_spec.rb index 561b283ee15..f08f5529472 100644 --- a/spec/features/projects/releases/user_views_edit_release_spec.rb +++ b/spec/features/projects/releases/user_views_edit_release_spec.rb @@ -6,7 +6,7 @@ RSpec.describe 'User edits Release', :js do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } - let(:release) { create(:release, :with_milestones, milestones_count: 1, project: project, name: 'The first release' ) } + let(:release) { create(:release, :with_milestones, milestones_count: 1, project: project, name: 'The first release', tag: "v1.1.0" ) } let(:release_link) { create(:release_link, release: release) } before do diff --git a/spec/features/projects/remote_mirror_spec.rb b/spec/features/projects/remote_mirror_spec.rb index 7bbffe627f6..2c8e895d43d 100644 --- a/spec/features/projects/remote_mirror_spec.rb +++ b/spec/features/projects/remote_mirror_spec.rb @@ -25,7 +25,7 @@ RSpec.describe 'Project remote mirror', :feature do context 'when last_error and last_update_at are present' do it 'renders error message with timestamp' do - remote_mirror.update!(last_error: 'Some new error', last_update_at: Time.now - 5.minutes) + remote_mirror.update!(last_error: 'Some new error', last_update_at: Time.zone.now - 5.minutes) visit project_mirror_path(project) diff --git a/spec/features/projects/settings/registry_settings_spec.rb b/spec/features/projects/settings/registry_settings_spec.rb index 509729d526d..ff28d59ed08 100644 --- a/spec/features/projects/settings/registry_settings_spec.rb +++ b/spec/features/projects/settings/registry_settings_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration policy', :js do - using RSpec::Parameterized::TableSyntax - let_it_be(:user) { create(:user) } let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) } @@ -63,31 +61,34 @@ RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration p end context 'with a project without expiration policy' do - where(:application_setting, :feature_flag, :result) do - true | true | :available_section - true | false | :available_section - false | true | :available_section - false | false | :disabled_message + before do + project.container_expiration_policy.destroy! + end + + context 'with container_expiration_policies_enable_historic_entries enabled' do + before do + stub_application_setting(container_expiration_policies_enable_historic_entries: true) + end + + it 'displays the related section' do + subject + + within '[data-testid="registry-settings-app"]' do + expect(find('[data-testid="enable-toggle"]')).to have_content('Disabled - Tags will not be automatically deleted.') + end + end end - with_them do + context 'with container_expiration_policies_enable_historic_entries disabled' do before do - project.container_expiration_policy.destroy! - stub_feature_flags(container_expiration_policies_historic_entry: false) - stub_application_setting(container_expiration_policies_enable_historic_entries: application_setting) - stub_feature_flags(container_expiration_policies_historic_entry: project) if feature_flag + stub_application_setting(container_expiration_policies_enable_historic_entries: false) end - it 'displays the expected result' do + it 'does not display the related section' do subject within '[data-testid="registry-settings-app"]' do - case result - when :available_section - expect(find('[data-testid="enable-toggle"]')).to have_content('Disabled - Tags will not be automatically deleted.') - when :disabled_message - expect(find('.gl-alert-title')).to have_content('Cleanup policy for tags is disabled') - end + expect(find('.gl-alert-title')).to have_content('Cleanup policy for tags is disabled') end end end diff --git a/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb b/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb index d16295aedbe..0fc12f93850 100644 --- a/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb +++ b/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb @@ -20,7 +20,7 @@ RSpec.describe "User interacts with deploy keys", :js do click_button("Enable") expect(page).not_to have_selector(".gl-spinner") - expect(current_path).to eq(project_settings_repository_path(project)) + expect(page).to have_current_path(project_settings_repository_path(project), ignore_query: true) find(".js-deployKeys-tab-enabled_keys").click @@ -96,7 +96,7 @@ RSpec.describe "User interacts with deploy keys", :js do click_button("Add key") - expect(current_path).to eq(project_settings_repository_path(project)) + expect(page).to have_current_path(project_settings_repository_path(project), ignore_query: true) page.within(".deploy-keys") do expect(page).to have_content(deploy_key_title) diff --git a/spec/features/projects/settings/user_manages_project_members_spec.rb b/spec/features/projects/settings/user_manages_project_members_spec.rb index 31dc939e6b8..2fe06414b32 100644 --- a/spec/features/projects/settings/user_manages_project_members_spec.rb +++ b/spec/features/projects/settings/user_manages_project_members_spec.rb @@ -4,7 +4,6 @@ require 'spec_helper' RSpec.describe 'Projects > Settings > User manages project members' do include Spec::Support::Helpers::Features::MembersHelpers - include Select2Helper include Spec::Support::Helpers::ModalHelpers let(:group) { create(:group, name: 'OpenSource') } @@ -57,28 +56,6 @@ RSpec.describe 'Projects > Settings > User manages project members' do expect(find_member_row(user_mike)).to have_content('Reporter') end - describe 'when the :invite_members_group_modal is disabled' do - before do - stub_feature_flags(invite_members_group_modal: false) - end - - it 'imports a team from another project', :js do - project2.add_maintainer(user) - project2.add_reporter(user_mike) - - visit(project_project_members_path(project)) - - page.within('.invite-users-form') do - click_link('Import') - end - - select2(project2.id, from: '#source_project_id') - click_button('Import project members') - - expect(find_member_row(user_mike)).to have_content('Reporter') - end - end - it 'shows all members of project shared group', :js do group.add_owner(user) group.add_developer(user_dmitriy) diff --git a/spec/features/projects/settings/user_renames_a_project_spec.rb b/spec/features/projects/settings/user_renames_a_project_spec.rb index 1ff976eb800..2e2d7119e2e 100644 --- a/spec/features/projects/settings/user_renames_a_project_spec.rb +++ b/spec/features/projects/settings/user_renames_a_project_spec.rb @@ -82,7 +82,7 @@ RSpec.describe 'Projects > Settings > User renames a project' do new_path = namespace_project_path(project.namespace, 'bar') visit new_path - expect(current_path).to eq(new_path) + expect(page).to have_current_path(new_path, ignore_query: true) expect(find('.breadcrumbs')).to have_content(project.name) end @@ -92,7 +92,7 @@ RSpec.describe 'Projects > Settings > User renames a project' do new_path = namespace_project_path(project.namespace, 'bar') visit old_path - expect(current_path).to eq(new_path) + expect(page).to have_current_path(new_path, ignore_query: true) expect(find('.breadcrumbs')).to have_content(project.name) end @@ -103,7 +103,7 @@ RSpec.describe 'Projects > Settings > User renames a project' do new_project = create(:project, namespace: user.namespace, path: 'gitlabhq', name: 'quz') visit old_path - expect(current_path).to eq(old_path) + expect(page).to have_current_path(old_path, ignore_query: true) expect(find('.breadcrumbs')).to have_content(new_project.name) end end diff --git a/spec/features/projects/settings/user_transfers_a_project_spec.rb b/spec/features/projects/settings/user_transfers_a_project_spec.rb index a88b9101869..6041dca305b 100644 --- a/spec/features/projects/settings/user_transfers_a_project_spec.rb +++ b/spec/features/projects/settings/user_transfers_a_project_spec.rb @@ -51,13 +51,13 @@ RSpec.describe 'Projects > Settings > User transfers a project', :js do visit new_path wait_for_requests - expect(current_path).to eq(new_path) + expect(page).to have_current_path(new_path, ignore_query: true) expect(find('.breadcrumbs')).to have_content(project.name) visit old_path wait_for_requests - expect(current_path).to eq(new_path) + expect(page).to have_current_path(new_path, ignore_query: true) expect(find('.breadcrumbs')).to have_content(project.name) end @@ -69,7 +69,7 @@ RSpec.describe 'Projects > Settings > User transfers a project', :js do new_project = create(:project, namespace: user.namespace, path: project_path) visit old_path - expect(current_path).to eq(old_path) + expect(page).to have_current_path(old_path, ignore_query: true) expect(find('.breadcrumbs')).to have_content(new_project.name) end end diff --git a/spec/features/projects/settings/webhooks_settings_spec.rb b/spec/features/projects/settings/webhooks_settings_spec.rb index 8d73ffecd46..c84de7fc03f 100644 --- a/spec/features/projects/settings/webhooks_settings_spec.rb +++ b/spec/features/projects/settings/webhooks_settings_spec.rb @@ -86,7 +86,7 @@ RSpec.describe 'Projects > Settings > Webhook Settings' do find('.hook-test-button.dropdown').click click_link 'Push events' - expect(current_path).to eq(webhooks_path) + expect(page).to have_current_path(webhooks_path, ignore_query: true) end context 'delete existing webhook' do @@ -137,7 +137,7 @@ RSpec.describe 'Projects > Settings > Webhook Settings' do click_link 'View details' click_link 'Resend Request' - expect(current_path).to eq(edit_project_hook_path(project, hook)) + expect(page).to have_current_path(edit_project_hook_path(project, hook), ignore_query: true) end end end diff --git a/spec/features/projects/show/redirects_spec.rb b/spec/features/projects/show/redirects_spec.rb index 3ac82244ded..55069cdd6c5 100644 --- a/spec/features/projects/show/redirects_spec.rb +++ b/spec/features/projects/show/redirects_spec.rb @@ -22,13 +22,13 @@ RSpec.describe 'Projects > Show > Redirects' do it 'redirects to sign in page when project is private' do visit project_path(private_project) - expect(current_path).to eq(new_user_session_path) + expect(page).to have_current_path(new_user_session_path, ignore_query: true) end it 'redirects to sign in page when project does not exist' do visit project_path(build(:project, :public)) - expect(current_path).to eq(new_user_session_path) + expect(page).to have_current_path(new_user_session_path, ignore_query: true) end it 'redirects to public project page after signing in' do @@ -41,7 +41,7 @@ RSpec.describe 'Projects > Show > Redirects' do click_button 'Sign in' expect(status_code).to eq(200) - expect(current_path).to eq("/#{public_project.full_path}") + expect(page).to have_current_path("/#{public_project.full_path}", ignore_query: true) end it 'redirects to private project page after sign in' do @@ -53,7 +53,7 @@ RSpec.describe 'Projects > Show > Redirects' do click_button 'Sign in' expect(status_code).to eq(200) - expect(current_path).to eq("/#{private_project.full_path}") + expect(page).to have_current_path("/#{private_project.full_path}", ignore_query: true) end context 'when signed in' do diff --git a/spec/features/projects/show/user_interacts_with_stars_spec.rb b/spec/features/projects/show/user_interacts_with_stars_spec.rb index 99f84c19bf3..aa61b629d92 100644 --- a/spec/features/projects/show/user_interacts_with_stars_spec.rb +++ b/spec/features/projects/show/user_interacts_with_stars_spec.rb @@ -34,7 +34,7 @@ RSpec.describe 'Projects > Show > User interacts with project stars' do find('.star-btn').click - expect(current_path).to eq(new_user_session_path) + expect(page).to have_current_path(new_user_session_path, ignore_query: true) end end end diff --git a/spec/features/projects/show/user_sees_git_instructions_spec.rb b/spec/features/projects/show/user_sees_git_instructions_spec.rb index 5270939f681..608bb4c5997 100644 --- a/spec/features/projects/show/user_sees_git_instructions_spec.rb +++ b/spec/features/projects/show/user_sees_git_instructions_spec.rb @@ -14,7 +14,7 @@ RSpec.describe 'Projects > Show > User sees Git instructions' do shared_examples_for 'redirects to the sign in page' do it 'redirects to the sign in page' do - expect(current_path).to eq(new_user_session_path) + expect(page).to have_current_path(new_user_session_path, ignore_query: true) end end diff --git a/spec/features/projects/tags/user_views_tags_spec.rb b/spec/features/projects/tags/user_views_tags_spec.rb index ef363ab6158..e1962ad3df5 100644 --- a/spec/features/projects/tags/user_views_tags_spec.rb +++ b/spec/features/projects/tags/user_views_tags_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'User views tags', :feature do it do visit project_tags_path(project, format: :atom) - expect(page.current_path).to eq("/users/sign_in") + expect(page).to have_current_path("/users/sign_in") end end diff --git a/spec/features/projects/tracings_spec.rb b/spec/features/projects/tracings_spec.rb index c4a4f1382ed..b79a0427ef6 100644 --- a/spec/features/projects/tracings_spec.rb +++ b/spec/features/projects/tracings_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe 'Tracings Content Security Policy' do + include ContentSecurityPolicyHelpers + let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } @@ -18,10 +20,7 @@ RSpec.describe 'Tracings Content Security Policy' do context 'when there is no global config' do before do - expect_next_instance_of(Projects::TracingsController) do |controller| - expect(controller).to receive(:current_content_security_policy) - .and_return(ActionDispatch::ContentSecurityPolicy.new) - end + setup_csp_for_controller(Projects::TracingsController) end it 'does not add CSP directives' do @@ -37,9 +36,7 @@ RSpec.describe 'Tracings Content Security Policy' do p.frame_src 'https://global-policy.com' end - expect_next_instance_of(Projects::TracingsController) do |controller| - expect(controller).to receive(:current_content_security_policy).and_return(csp) - end + setup_existing_csp_for_controller(Projects::TracingsController, csp) end context 'when external_url is set' do diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb index c4e2e3353a4..6491a7425f7 100644 --- a/spec/features/projects/user_creates_project_spec.rb +++ b/spec/features/projects/user_creates_project_spec.rb @@ -25,7 +25,7 @@ RSpec.describe 'User creates a project', :js do project = Project.last - expect(current_path).to eq(project_path(project)) + expect(page).to have_current_path(project_path(project), ignore_query: true) expect(page).to have_content('Empty') expect(page).to have_content('git init') expect(page).to have_content('git remote') @@ -47,7 +47,7 @@ RSpec.describe 'User creates a project', :js do project = Project.last - expect(current_path).to eq(project_path(project)) + expect(page).to have_current_path(project_path(project), ignore_query: true) expect(page).to have_content('With initial commits') expect(page).to have_content('Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist') expect(page).to have_content('README.md Initial commit') @@ -72,7 +72,7 @@ RSpec.describe 'User creates a project', :js do project = Project.last - expect(current_path).to eq(project_path(project)) + expect(page).to have_current_path(project_path(project), ignore_query: true) expect(page).to have_content('With initial commits') expect(page).to have_content('Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist') expect(page).to have_content('README.md Initial commit') diff --git a/spec/features/projects/wikis_spec.rb b/spec/features/projects/wikis_spec.rb index 621f8c71b20..879ffd2932b 100644 --- a/spec/features/projects/wikis_spec.rb +++ b/spec/features/projects/wikis_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe 'Project wikis' do +RSpec.describe 'Project wikis', :js do let_it_be(:user) { create(:user) } let(:wiki) { create(:project_wiki, user: user, project: project) } |