diff options
Diffstat (limited to 'spec/features/projects')
32 files changed, 396 insertions, 143 deletions
diff --git a/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb b/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb index 1990526b5fc..cd7601aa94e 100644 --- a/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb +++ b/spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb @@ -25,8 +25,6 @@ RSpec.describe 'User follows pipeline suggest nudge spec when feature is enabled end it 'displays suggest_gitlab_ci_yml popover' do - page.find(:css, '.gitlab-ci-yml-selector').click - popover_selector = '.suggest-gitlab-ci-yml' expect(page).to have_css(popover_selector, visible: true) diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb index 43da57c16d1..b09aa91f4ab 100644 --- a/spec/features/projects/ci/editor_spec.rb +++ b/spec/features/projects/ci/editor_spec.rb @@ -11,6 +11,7 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d let(:default_branch) { 'main' } let(:other_branch) { 'test' } let(:branch_with_invalid_ci) { 'despair' } + let(:branch_without_ci) { 'empty' } let(:default_content) { 'Default' } @@ -45,6 +46,7 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d project.repository.create_file(user, project.ci_config_path_or_default, default_content, message: 'Create CI file for main', branch_name: default_branch) project.repository.create_file(user, project.ci_config_path_or_default, valid_content, message: 'Create CI file for test', branch_name: other_branch) project.repository.create_file(user, project.ci_config_path_or_default, invalid_content, message: 'Create CI file for test', branch_name: branch_with_invalid_ci) + project.repository.create_file(user, 'index.js', "file", message: 'New js file', branch_name: branch_without_ci) visit project_ci_pipeline_editor_path(project) wait_for_requests @@ -62,6 +64,31 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d end end + describe 'when there are no CI config file' do + before do + visit project_ci_pipeline_editor_path(project, branch_name: branch_without_ci) + end + + it 'renders the empty page', :aggregate_failures do + expect(page).to have_content 'Optimize your workflow with CI/CD Pipelines' + expect(page).to have_selector '[data-testid="create_new_ci_button"]' + end + + context 'when clicking on the create new CI button' do + before do + click_button 'Configure pipeline' + end + + it 'renders the source editor with default content', :aggregate_failures do + expect(page).to have_selector('#source-editor-') + + page.within('#source-editor-') do + expect(page).to have_content('This file is a template, and might need editing before it works on your project.') + end + end + end + end + describe 'When CI yml has valid syntax' do before do visit project_ci_pipeline_editor_path(project, branch_name: other_branch) @@ -149,15 +176,6 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d end shared_examples 'default branch switcher behavior' do - def switch_to_branch(branch) - find('[data-testid="branch-selector"]').click - - page.within '[data-testid="branch-selector"]' do - click_button branch - wait_for_requests - end - end - it 'displays current branch' do page.within('[data-testid="branch-selector"]') do expect(page).to have_content(default_branch) @@ -195,12 +213,20 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d end describe 'Branch Switcher' do + def switch_to_branch(branch) + # close button for the popover + find('[data-testid="close-button"]').click + find('[data-testid="branch-selector"]').click + + page.within '[data-testid="branch-selector"]' do + click_button branch + wait_for_requests + end + end + before do visit project_ci_pipeline_editor_path(project) wait_for_requests - - # close button for the popover - find('[data-testid="close-button"]').click end it_behaves_like 'default branch switcher behavior' @@ -262,6 +288,24 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d end describe 'Commit Form' do + context 'when targetting the main branch' do + it 'does not show the option to create a Merge request', :aggregate_failures do + expect(page).not_to have_selector('[data-testid="new-mr-checkbox"]') + expect(page).not_to have_content('Start a new merge request with these changes') + end + end + + context 'when targetting any non-main branch' do + before do + find('#source-branch-field').set('new_branch', clear: :backspace) + end + + it 'shows the option to create a Merge request', :aggregate_failures do + expect(page).to have_selector('[data-testid="new-mr-checkbox"]') + expect(page).to have_content('Start a new merge request with these changes') + end + end + it 'is preserved when changing tabs' do find('#commit-message').set('message', clear: :backspace) find('#source-branch-field').set('new_branch', clear: :backspace) diff --git a/spec/features/projects/commit/mini_pipeline_graph_spec.rb b/spec/features/projects/commit/mini_pipeline_graph_spec.rb index d2104799e79..5bb3d1af924 100644 --- a/spec/features/projects/commit/mini_pipeline_graph_spec.rb +++ b/spec/features/projects/commit/mini_pipeline_graph_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe 'Mini Pipeline Graph in Commit View', :js, feature_category: :source_code_management do let(:project) { create(:project, :public, :repository) } - context 'when commit has pipelines' do + context 'when commit has pipelines and feature flag is enabled' do let(:pipeline) do create( :ci_pipeline, @@ -24,6 +24,33 @@ RSpec.describe 'Mini Pipeline Graph in Commit View', :js, feature_category: :sou wait_for_requests end + it 'displays the graphql pipeline stage' do + expect(page).to have_selector('[data-testid="pipeline-stage"]') + + build.drop + end + end + + context 'when commit has pipelines and feature flag is disabled' do + let(:pipeline) do + create( + :ci_pipeline, + status: :running, + project: project, + ref: project.default_branch, + sha: project.commit.sha + ) + end + + let(:build) { create(:ci_build, pipeline: pipeline, status: :running) } + + before do + stub_feature_flags(ci_graphql_pipeline_mini_graph: false) + build.run + visit project_commit_path(project, project.commit.id) + wait_for_requests + end + it 'display icon with status' do expect(page).to have_selector('.ci-status-icon-running') end diff --git a/spec/features/projects/container_registry_spec.rb b/spec/features/projects/container_registry_spec.rb index 493435d3439..0a77c671fce 100644 --- a/spec/features/projects/container_registry_spec.rb +++ b/spec/features/projects/container_registry_spec.rb @@ -67,6 +67,7 @@ RSpec.describe 'Container Registry', :js, feature_category: :groups_and_projects it 'list page has a list of images' do visit_container_registry + expect(page).to have_content '1 Image repository' expect(page).to have_content 'my/image' end @@ -189,8 +190,7 @@ RSpec.describe 'Container Registry', :js, feature_category: :groups_and_projects it 'pagination is preserved after navigating back from details' do visit_next_page click_link 'my/image' - breadcrumb = find '.breadcrumbs' - breadcrumb.click_link 'Container Registry' + page.go_back expect(page).to have_content 'my/image' end end diff --git a/spec/features/projects/files/dockerfile_dropdown_spec.rb b/spec/features/projects/files/dockerfile_dropdown_spec.rb index a74cde35be6..55b15ad95d1 100644 --- a/spec/features/projects/files/dockerfile_dropdown_spec.rb +++ b/spec/features/projects/files/dockerfile_dropdown_spec.rb @@ -12,20 +12,16 @@ RSpec.describe 'Projects > Files > User wants to add a Dockerfile file', :js, fe end it 'user can pick a Dockerfile file from the dropdown' do - expect(page).to have_css('.dockerfile-selector') + click_button 'Apply a template' - find('.js-dockerfile-selector').click - - wait_for_requests - - within '.dockerfile-selector' do - find('.dropdown-input-field').set('HTTPd') - find('.dropdown-content li', text: 'HTTPd').click + within '.gl-new-dropdown-panel' do + find('.gl-listbox-search-input').set('HTTPd') + find('.gl-new-dropdown-contents li', text: 'HTTPd').click end wait_for_requests - expect(page).to have_css('.dockerfile-selector .dropdown-toggle-text', text: 'Apply a template') + expect(page).to have_css('.gl-new-dropdown-button-text', text: 'HTTPd') expect(find('.monaco-editor')).to have_content('COPY ./ /usr/local/apache2/htdocs/') end end diff --git a/spec/features/projects/files/gitignore_dropdown_spec.rb b/spec/features/projects/files/gitignore_dropdown_spec.rb index 36b02b9b948..b1f7f1c5716 100644 --- a/spec/features/projects/files/gitignore_dropdown_spec.rb +++ b/spec/features/projects/files/gitignore_dropdown_spec.rb @@ -12,20 +12,16 @@ RSpec.describe 'Projects > Files > User wants to add a .gitignore file', :js, fe end it 'user can pick a .gitignore file from the dropdown' do - expect(page).to have_css('.gitignore-selector') + click_button 'Apply a template' - find('.js-gitignore-selector').click - - wait_for_requests - - within '.gitignore-selector' do - find('.dropdown-input-field').set('rails') - find('.dropdown-content li', text: 'Rails').click + within '.gl-new-dropdown-panel' do + find('.gl-listbox-search-input').set('rails') + find('.gl-new-dropdown-contents li', text: 'Rails').click end wait_for_requests - expect(page).to have_css('.gitignore-selector .dropdown-toggle-text', text: 'Apply a template') + expect(page).to have_css('.gl-new-dropdown-button-text', text: 'Rails') expect(find('.monaco-editor')).to have_content('/.bundle') expect(find('.monaco-editor')).to have_content('config/initializers/secret_token.rb') end diff --git a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb index 929554ff0d6..7bfff6b68e8 100644 --- a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb +++ b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb @@ -16,20 +16,16 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js end it 'user can pick a template from the dropdown' do - expect(page).to have_css('.gitlab-ci-yml-selector') + click_button 'Apply a template' - find('.js-gitlab-ci-yml-selector').click - - wait_for_requests - - within '.gitlab-ci-yml-selector' do - find('.dropdown-input-field').set('Jekyll') - find('.dropdown-content li', text: 'Jekyll').click + within '.gl-new-dropdown-panel' do + find('.gl-listbox-search-input').set('Jekyll') + find('.gl-new-dropdown-contents li', text: 'Jekyll').click end wait_for_requests - expect(page).to have_css('.gitlab-ci-yml-selector .dropdown-toggle-text', text: 'Apply a template') + expect(page).to have_css('.gl-new-dropdown-button-text', text: 'Jekyll') expect(find('.monaco-editor')).to have_content('This file is a template, and might need editing before it works on your project') expect(find('.monaco-editor')).to have_content('jekyll build -d test') end @@ -40,7 +36,7 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js it 'uses the given template' do wait_for_requests - expect(page).to have_css('.gitlab-ci-yml-selector .dropdown-toggle-text', text: 'Apply a template') + expect(page).to have_css('.gl-new-dropdown-button-text', text: 'Jekyll') expect(find('.monaco-editor')).to have_content('This file is a template, and might need editing before it works on your project') expect(find('.monaco-editor')).to have_content('jekyll build -d test') end @@ -52,7 +48,7 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js it 'leaves the editor empty' do wait_for_requests - expect(page).to have_css('.gitlab-ci-yml-selector .dropdown-toggle-text', text: 'Apply a template') + expect(page).to have_css('.gl-new-dropdown-button-text', text: 'Apply a template') expect(find('.monaco-editor')).to have_content('') end end 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 8ec9adaeb9a..95e96159744 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 @@ -20,8 +20,6 @@ RSpec.describe 'Projects > Files > Project owner creates a license file', :js, f fill_in :file_name, with: 'LICENSE' - expect(page).to have_selector('.license-selector') - select_template('MIT License') file_content = first('.file-editor') @@ -44,7 +42,6 @@ RSpec.describe 'Projects > Files > Project owner creates a license file', :js, f 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') select_template('MIT License') @@ -62,9 +59,9 @@ RSpec.describe 'Projects > Files > Project owner creates a license file', :js, f end def select_template(template) - page.within('.js-license-selector-wrap') do + page.within('.gl-new-dropdown') do click_button 'Apply a template' - click_link template + find('.gl-new-dropdown-contents li', text: template).click wait_for_requests end end diff --git a/spec/features/projects/files/template_selector_menu_spec.rb b/spec/features/projects/files/template_selector_menu_spec.rb index 46c4b69bc89..920da6e72ce 100644 --- a/spec/features/projects/files/template_selector_menu_spec.rb +++ b/spec/features/projects/files/template_selector_menu_spec.rb @@ -58,7 +58,7 @@ end def check_template_selector_menu_display(is_visible) count = is_visible ? 1 : 0 - expect(page).to have_css('.template-selectors-menu', count: count) + expect(page).to have_css('[data-testid="template-selector"]', count: count) end def create_and_edit_file(file_name) diff --git a/spec/features/projects/files/undo_template_spec.rb b/spec/features/projects/files/undo_template_spec.rb index 4b6e6b7282c..d6f9acc68a0 100644 --- a/spec/features/projects/files/undo_template_spec.rb +++ b/spec/features/projects/files/undo_template_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'Projects > Files > Template Undo Button', :js, feature_category: context 'editing a matching file and applying a template' do before do visit project_edit_blob_path(project, File.join(project.default_branch, "LICENSE")) - select_file_template('.js-license-selector', 'Apache License 2.0') + select_file_template('Apache License 2.0') end it 'reverts template application' do @@ -42,8 +42,8 @@ def check_content_reverted(template_content) expect(page).not_to have_content(template_content) end -def select_file_template(template_selector_selector, template_name) - find(template_selector_selector).click - find('.dropdown-content li', text: template_name).click +def select_file_template(template_name) + click_button 'Apply a template' + find('.gl-new-dropdown-contents li', text: template_name).click wait_for_requests end diff --git a/spec/features/projects/files/user_browses_files_spec.rb b/spec/features/projects/files/user_browses_files_spec.rb index 3b30a620257..e93c9427c91 100644 --- a/spec/features/projects/files/user_browses_files_spec.rb +++ b/spec/features/projects/files/user_browses_files_spec.rb @@ -155,7 +155,7 @@ RSpec.describe "User browses files", :js, feature_category: :groups_and_projects click_link("d") end - expect(page).to have_link("..", href: project_tree_path(project, "markdown/")) + expect(page).to have_link("..", href: project_tree_path(project, "markdown")) page.within(".tree-table") do click_link("README.md") diff --git a/spec/features/projects/fork_spec.rb b/spec/features/projects/fork_spec.rb index 7d734d5d2df..c159b40003c 100644 --- a/spec/features/projects/fork_spec.rb +++ b/spec/features/projects/fork_spec.rb @@ -14,23 +14,80 @@ RSpec.describe 'Project fork', feature_category: :groups_and_projects do end shared_examples 'fork button on project page' do - it 'allows user to fork project from the project page' do - visit project_path(project) + context 'when the user has access to only one namespace and has already forked the project', :js do + before do + fork_project(project, user, repository: true, namespace: user.namespace) + end - expect(page).not_to have_css('a.disabled', text: 'Fork') - end + it 'allows user to go to their fork' do + visit project_path(project) - context 'user has exceeded personal project limit' do - before do - user.update!(projects_limit: 0) + path = namespace_project_path(user, user.fork_of(project)) + + fork_button = find_link 'Fork' + expect(fork_button['href']).to include(path) + expect(fork_button['class']).not_to include('disabled') end + end - it 'disables fork button on project page' do + shared_examples 'fork button creates new fork' do + it 'allows user to fork the project from the project page' do visit project_path(project) - expect(page).to have_css('a.disabled', text: 'Fork') + path = new_project_fork_path(project) + + fork_button = find_link 'Fork' + expect(fork_button['href']).to include(path) + expect(fork_button['class']).not_to include('disabled') + end + + context 'when the user cannot fork the project' do + let(:project) do + # Disabling the repository makes sure that the user cannot fork the project + create(:project, :public, :repository, :repository_disabled, description: 'some description') + end + + it 'disables fork button on project page' do + visit project_path(project) + + path = new_project_fork_path(project) + + fork_button = find_link 'Fork' + expect(fork_button['href']).to include(path) + expect(fork_button['class']).to include('disabled') + end + end + + context 'user has exceeded personal project limit' do + before do + user.update!(projects_limit: 0) + end + + it 'disables fork button on project page' do + visit project_path(project) + + path = new_project_fork_path(project) + + fork_button = find_link 'Fork' + expect(fork_button['href']).to include(path) + expect(fork_button['class']).to include('disabled') + end end end + + context 'when the user has not already forked the project', :js do + it_behaves_like 'fork button creates new fork' + end + + context 'when the user has access to more than one namespace', :js do + let(:group) { create(:group) } + + before do + group.add_developer(user) + end + + it_behaves_like 'fork button creates new fork' + end end shared_examples 'create fork page' do |fork_page_text| @@ -42,11 +99,11 @@ RSpec.describe 'Project fork', feature_category: :groups_and_projects do context 'forking is enabled' do let(:forking_access_level) { ProjectFeature::ENABLED } - it 'enables fork button' do + it 'enables fork button', :js do visit project_path(project) - expect(page).to have_css('a', text: 'Fork') - expect(page).not_to have_css('a.disabled', text: 'Select') + fork_button = find_link 'Fork' + expect(fork_button['class']).not_to include('disabled') end it 'renders new project fork page' do @@ -60,11 +117,13 @@ RSpec.describe 'Project fork', feature_category: :groups_and_projects do context 'forking is disabled' do let(:forking_access_level) { ProjectFeature::DISABLED } - it 'render a disabled fork button' do + it 'render a disabled fork button', :js do visit project_path(project) - expect(page).to have_css('a.disabled', text: 'Fork') - expect(page).to have_css('a.count', text: '0') + fork_button = find_link 'Fork' + + expect(fork_button['class']).to include('disabled') + expect(page).to have_selector('[data-testid="forks-count"]') end it 'does not render new project fork page' do @@ -82,11 +141,13 @@ RSpec.describe 'Project fork', feature_category: :groups_and_projects do end context 'user is not a team member' do - it 'render a disabled fork button' do + it 'render a disabled fork button', :js do visit project_path(project) - expect(page).to have_css('a.disabled', text: 'Fork') - expect(page).to have_css('a.count', text: '0') + fork_button = find_link 'Fork' + + expect(fork_button['class']).to include('disabled') + expect(page).to have_selector('[data-testid="forks-count"]') end it 'does not render new project fork page' do @@ -101,12 +162,13 @@ RSpec.describe 'Project fork', feature_category: :groups_and_projects do project.add_developer(user) end - it 'enables fork button' do + it 'enables fork button', :js do visit project_path(project) - expect(page).to have_css('a', text: 'Fork') - expect(page).to have_css('a.count', text: '0') - expect(page).not_to have_css('a.disabled', text: 'Fork') + fork_button = find_link 'Fork' + + expect(fork_button['class']).not_to include('disabled') + expect(page).to have_selector('[data-testid="forks-count"]') end it 'renders new project fork page' do @@ -185,7 +247,8 @@ RSpec.describe 'Project fork', feature_category: :groups_and_projects do visit project_path(project) - expect(page).to have_css('.fork-count', text: 2) + forks_count_button = find('[data-testid="forks-count"]') + expect(forks_count_button).to have_content("2") end end end @@ -195,7 +258,9 @@ private def create_fork(group_obj = group) visit project_path(project) - find('.fork-btn').click + + click_link 'Fork' + submit_form(group_obj) wait_for_requests end diff --git a/spec/features/projects/labels/user_edits_labels_spec.rb b/spec/features/projects/labels/user_edits_labels_spec.rb index f90f215f9fc..bf1182cfddd 100644 --- a/spec/features/projects/labels/user_edits_labels_spec.rb +++ b/spec/features/projects/labels/user_edits_labels_spec.rb @@ -36,6 +36,6 @@ RSpec.describe "User edits labels", feature_category: :team_planning do click_link 'Delete label' end - expect(page).to have_content('Label was removed') + expect(page).to have_content("#{label.title} was removed").and have_no_content("#{label.title}</span>") end end diff --git a/spec/features/projects/labels/user_removes_labels_spec.rb b/spec/features/projects/labels/user_removes_labels_spec.rb index 55dc52b8ccf..d0175c53951 100644 --- a/spec/features/projects/labels/user_removes_labels_spec.rb +++ b/spec/features/projects/labels/user_removes_labels_spec.rb @@ -30,7 +30,7 @@ RSpec.describe "User removes labels", feature_category: :team_planning do first(:link, "Delete label").click - expect(page).to have_content("Label was removed").and have_no_content(label.title) + expect(page).to have_content("#{label.title} was removed").and have_no_content("#{label.title}</span>") end end diff --git a/spec/features/projects/members/import_project_members_spec.rb b/spec/features/projects/members/import_project_members_spec.rb new file mode 100644 index 00000000000..20cf42cd135 --- /dev/null +++ b/spec/features/projects/members/import_project_members_spec.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Projects > Members > Import project members', :js, feature_category: :groups_and_projects do + include Features::MembersHelpers + include ListboxHelpers + + let_it_be(:user) { create(:user) } + let_it_be(:user_mike) { create(:user, name: 'Mike') } + let_it_be(:group) { create(:group) } + let_it_be(:project) do + create(:project, group: group).tap do |p| + p.add_maintainer(user) + p.add_developer(create(:user)) + end + end + + let_it_be(:project2) do + create(:project).tap do |p| + p.add_maintainer(user) + p.add_reporter(user_mike) + end + end + + before do + sign_in(user) + + visit(project_project_members_path(project)) + end + + it 'imports a team from another project' do + select_project(project2) + submit_import + + expect(find_member_row(user_mike)).to have_content('Reporter') + end + + it 'fails to import the other team when source project does not exist' do + select_project(project2) + submit_import { project2.destroy! } + + within import_project_members_modal_selector do + expect(page).to have_content('Unable to import project members') + end + end + + it 'fails to import some members' do + group.add_owner(user_mike) + + select_project(project2) + submit_import + + within import_project_members_modal_selector do + expect(page).to have_content "The following 1 out of 2 members could not be added" + expect(page).to have_content "@#{user_mike.username}: Access level should be greater than or equal to " \ + "Owner inherited membership from group #{group.name}" + end + end + + def select_project(source_project) + click_on 'Import from a project' + click_on 'Select a project' + wait_for_requests + + select_listbox_item(source_project.name_with_namespace) + end + + def submit_import + yield if block_given? # rubocop:disable RSpec/AvoidConditionalStatements + + click_button 'Import project members' + wait_for_requests + end + + def import_project_members_modal_selector + '[data-testid="import-project-members-modal"]' + end +end diff --git a/spec/features/projects/settings/user_manages_project_members_spec.rb b/spec/features/projects/members/user_manages_project_members_spec.rb index df571e13979..b1c3132767c 100644 --- a/spec/features/projects/settings/user_manages_project_members_spec.rb +++ b/spec/features/projects/members/user_manages_project_members_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Projects > Settings > User manages project members', feature_category: :groups_and_projects do +RSpec.describe 'Projects > Settings > User manages project members', :js, feature_category: :groups_and_projects do include Features::MembersHelpers include Spec::Support::Helpers::ModalHelpers include ListboxHelpers @@ -20,7 +20,7 @@ RSpec.describe 'Projects > Settings > User manages project members', feature_cat sign_in(user) end - it 'cancels a team member', :js do + it 'cancels a team member' do visit(project_project_members_path(project)) show_actions_for_username(user_dmitriy) @@ -37,24 +37,7 @@ RSpec.describe 'Projects > Settings > User manages project members', feature_cat expect(members_table).not_to have_content(user_dmitriy.username) 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)) - - click_on 'Import from a project' - click_on 'Select a project' - wait_for_requests - - select_listbox_item(project2.name_with_namespace) - click_button 'Import project members' - wait_for_requests - - expect(find_member_row(user_mike)).to have_content('Reporter') - end - - it 'shows all members of project shared group', :js do + it 'shows all members of project shared group' do group.add_owner(user) group.add_developer(user_dmitriy) diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index d05b7649f94..6e6d9ff4af9 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -46,7 +46,8 @@ RSpec.describe 'New project', :js, feature_category: :groups_and_projects do end it 'shows a message if multiple levels are restricted' do - Gitlab::CurrentSettings.update!( + stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::PUBLIC) + stub_application_setting( restricted_visibility_levels: [Gitlab::VisibilityLevel::PRIVATE, Gitlab::VisibilityLevel::INTERNAL] ) @@ -56,15 +57,21 @@ RSpec.describe 'New project', :js, feature_category: :groups_and_projects do expect(page).to have_content 'Other visibility settings have been disabled by the administrator.' end - it 'shows a message if all levels are restricted' do - Gitlab::CurrentSettings.update!( - restricted_visibility_levels: Gitlab::VisibilityLevel.values - ) + context 'with prevent_visibility_restriction feature flag off' do + before do + stub_feature_flags(prevent_visibility_restriction: false) + end - visit new_project_path - click_link 'Create blank project' + it 'shows a message if all levels are restricted' do + Gitlab::CurrentSettings.update!( + restricted_visibility_levels: Gitlab::VisibilityLevel.values + ) - expect(page).to have_content 'Visibility settings have been disabled by the administrator.' + visit new_project_path + click_link 'Create blank project' + + expect(page).to have_content 'Visibility settings have been disabled by the administrator.' + 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 ae459197b38..14b01cb63d2 100644 --- a/spec/features/projects/pages/user_adds_domain_spec.rb +++ b/spec/features/projects/pages/user_adds_domain_spec.rb @@ -178,7 +178,12 @@ RSpec.describe 'User adds pages domain', :js, feature_category: :pages do visit project_pages_path(project) within('#content-body') { click_link 'Edit' } - expect(page).to have_field :domain_dns, with: "#{domain.domain} ALIAS namespace1.example.com." + expect(page).to have_field :domain_dns, with: format( + "%{domain} ALIAS %{namespace}.%{pages_host}.", + domain: domain.domain, + namespace: domain.project.root_namespace.path, + pages_host: Settings.pages.host + ) end end end diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 25eddf64f99..26fcd8ca3ca 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -559,7 +559,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :continuous_integration do find(dropdown_selector).click within('.js-builds-dropdown-list') do - build_element = page.find('.mini-pipeline-graph-dropdown-item') + build_element = page.find('.pipeline-job-item') expect(build_element['title']).to eq('build - failed - (unknown failure)') end end @@ -818,7 +818,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :continuous_integration do describe 'when the `ios_specific_templates` experiment is enabled and the "Set up a runner" button is clicked' do before do stub_experiments(ios_specific_templates: :candidate) - create(:project_setting, project: project, target_platforms: %w(ios)) + project.project_setting.update!(target_platforms: %w(ios)) visit project_pipelines_path(project) click_button 'Set up a runner' end diff --git a/spec/features/projects/settings/access_tokens_spec.rb b/spec/features/projects/settings/access_tokens_spec.rb index 210815f341c..9025bd9052e 100644 --- a/spec/features/projects/settings/access_tokens_spec.rb +++ b/spec/features/projects/settings/access_tokens_spec.rb @@ -49,6 +49,7 @@ RSpec.describe 'Project > Settings > Access Tokens', :js, feature_category: :use it 'shows Owner option' do visit resource_settings_access_tokens_path + click_button 'Add new token' expect(role_dropdown_options).to include('Owner') end end @@ -63,6 +64,7 @@ RSpec.describe 'Project > Settings > Access Tokens', :js, feature_category: :use it 'does not show Owner option for a maintainer' do visit resource_settings_access_tokens_path + click_button 'Add new token' expect(role_dropdown_options).not_to include('Owner') end end @@ -81,6 +83,7 @@ RSpec.describe 'Project > Settings > Access Tokens', :js, feature_category: :use it 'shows access token creation form and text' do visit project_settings_access_tokens_path(personal_project) + click_button 'Add new token' expect(page).to have_selector('#js-new-access-token-form') end end diff --git a/spec/features/projects/settings/packages_settings_spec.rb b/spec/features/projects/settings/packages_settings_spec.rb index 564a71e9a23..5277ede8e52 100644 --- a/spec/features/projects/settings/packages_settings_spec.rb +++ b/spec/features/projects/settings/packages_settings_spec.rb @@ -35,7 +35,7 @@ RSpec.describe 'Projects > Settings > Packages', :js, feature_category: :groups_ let(:packages_enabled) { false } it 'does not show up in UI' do - expect(page).not_to have_selector('[data-testid="toggle-label"]', text: 'Packages') + expect(page).not_to have_selector('[data-testid="toggle-label"]', text: 'Package registry') end end end diff --git a/spec/features/projects/settings/pipelines_settings_spec.rb b/spec/features/projects/settings/pipelines_settings_spec.rb index ef1c03f4f27..59d9e6d105e 100644 --- a/spec/features/projects/settings/pipelines_settings_spec.rb +++ b/spec/features/projects/settings/pipelines_settings_spec.rb @@ -65,6 +65,46 @@ RSpec.describe "Projects > Settings > Pipelines settings", feature_category: :gr expect(checkbox).not_to be_checked end + it 'disables forward deployment rollback allowed when forward deployment enabled is unchecked', :js do + visit project_settings_ci_cd_path(project) + + forward_deployment_checkbox = find_field('project_ci_cd_settings_attributes_forward_deployment_enabled') + forward_deployment_rollback_checkbox = + find_field('project_ci_cd_settings_attributes_forward_deployment_rollback_allowed') + expect(forward_deployment_checkbox).to be_checked + expect(forward_deployment_rollback_checkbox).not_to be_disabled + + forward_deployment_checkbox.click + + expect(forward_deployment_rollback_checkbox).to be_disabled + + forward_deployment_checkbox.click + + expect(forward_deployment_rollback_checkbox).not_to be_disabled + end + + it 'updates forward_deployment_rollback_allowed' do + visit project_settings_ci_cd_path(project) + + checkbox = find_field('project_ci_cd_settings_attributes_forward_deployment_rollback_allowed') + expect(checkbox).to be_checked + + checkbox.set(false) + + page.within '#js-general-pipeline-settings' do + click_on 'Save changes' + end + + expect(page.status_code).to eq(200) + + page.within '#js-general-pipeline-settings' do + expect(page).to have_button('Save changes', disabled: false) + end + + checkbox = find_field('project_ci_cd_settings_attributes_forward_deployment_rollback_allowed') + expect(checkbox).not_to be_checked + end + describe 'Auto DevOps' do context 'when auto devops is turned on instance-wide' do before do diff --git a/spec/features/projects/settings/project_badges_spec.rb b/spec/features/projects/settings/project_badges_spec.rb index 1f170300155..a66bf5cd3a9 100644 --- a/spec/features/projects/settings/project_badges_spec.rb +++ b/spec/features/projects/settings/project_badges_spec.rb @@ -24,7 +24,7 @@ RSpec.describe 'Project Badges', feature_category: :groups_and_projects do page.within '.badge-settings' do wait_for_requests - rows = all('.card-body > div') + rows = all('.gl-card-body tbody tr') expect(rows.length).to eq 2 expect(rows[0]).to have_content group_badge.link_url expect(rows[1]).to have_content project_badge.link_url @@ -33,6 +33,7 @@ RSpec.describe 'Project Badges', feature_category: :groups_and_projects do context 'adding a badge', :js do it 'user can preview a badge' do + click_button 'Add badge' page.within '.badge-settings form' do fill_in 'badge-link-url', with: badge_link_url fill_in 'badge-image-url', with: badge_image_url @@ -44,6 +45,7 @@ RSpec.describe 'Project Badges', feature_category: :groups_and_projects do end it do + click_button 'Add badge' page.within '.badge-settings' do fill_in 'badge-link-url', with: badge_link_url fill_in 'badge-image-url', with: badge_image_url @@ -51,7 +53,7 @@ RSpec.describe 'Project Badges', feature_category: :groups_and_projects do click_button 'Add badge' wait_for_requests - within '.card-body' do + within '.gl-card-body' do expect(find('a')[:href]).to eq badge_link_url expect(find('a img')[:src]).to eq badge_image_url end @@ -63,32 +65,35 @@ RSpec.describe 'Project Badges', feature_category: :groups_and_projects do it 'form is shown when clicking edit button in list' do page.within '.badge-settings' do wait_for_requests - rows = all('.card-body > div') + rows = all('.gl-card-body tbody tr') expect(rows.length).to eq 2 rows[1].find('[aria-label="Edit"]').click + end - within 'form' do - expect(find('#badge-link-url').value).to eq project_badge.link_url - expect(find('#badge-image-url').value).to eq project_badge.image_url - end + page.within '.gl-modal' do + expect(find('#badge-link-url').value).to eq project_badge.link_url + expect(find('#badge-image-url').value).to eq project_badge.image_url end end it 'updates a badge when submitting the edit form' do page.within '.badge-settings' do wait_for_requests - rows = all('.card-body > div') + rows = all('.gl-card-body tbody tr') expect(rows.length).to eq 2 rows[1].find('[aria-label="Edit"]').click - within 'form' do - fill_in 'badge-link-url', with: badge_link_url - fill_in 'badge-image-url', with: badge_image_url + end - click_button 'Save changes' - wait_for_requests - end + page.within '.gl-modal' do + fill_in 'badge-link-url', with: badge_link_url + fill_in 'badge-image-url', with: badge_image_url - rows = all('.card-body > div') + click_button 'Save changes' + wait_for_requests + end + + page.within '.badge-settings' do + rows = all('.gl-card-body tbody tr') expect(rows.length).to eq 2 expect(rows[1]).to have_content badge_link_url end @@ -102,7 +107,7 @@ RSpec.describe 'Project Badges', feature_category: :groups_and_projects do it 'shows a modal when deleting a badge' do wait_for_requests - rows = all('.card-body > div') + rows = all('.gl-card-body tbody tr') expect(rows.length).to eq 2 click_delete_button(rows[1]) @@ -112,14 +117,14 @@ RSpec.describe 'Project Badges', feature_category: :groups_and_projects do it 'deletes a badge when confirming the modal' do wait_for_requests - rows = all('.card-body > div') + rows = all('.gl-card-body tbody tr') expect(rows.length).to eq 2 click_delete_button(rows[1]) find('.modal .btn-danger').click wait_for_requests - rows = all('.card-body > div') + rows = all('.gl-card-body tbody tr') expect(rows.length).to eq 1 expect(rows[0]).to have_content group_badge.link_url end diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb index d53aefe5a4e..838ac67ee3d 100644 --- a/spec/features/projects/settings/repository_settings_spec.rb +++ b/spec/features/projects/settings/repository_settings_spec.rb @@ -156,6 +156,7 @@ RSpec.describe 'Projects > Settings > Repository settings', feature_category: :g before do visit project_settings_repository_path(project) + click_button 'Add new' end it 'shows push mirror settings', :js do diff --git a/spec/features/projects/settings/secure_files_spec.rb b/spec/features/projects/settings/secure_files_spec.rb index 7ff1a5f3568..5f94e215a5f 100644 --- a/spec/features/projects/settings/secure_files_spec.rb +++ b/spec/features/projects/settings/secure_files_spec.rb @@ -46,7 +46,7 @@ RSpec.describe 'Secure Files', :js, feature_category: :groups_and_projects do within '#js-secure-files' do expect(page).to have_content(file.name) - find('button.btn-danger-secondary').click + find('[data-testid="delete-button"]').click end expect(page).to have_content("Delete #{file.name}?") 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 0006762a971..4e8f42ae792 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 @@ -91,6 +91,7 @@ RSpec.describe "User interacts with deploy keys", :js, feature_category: :groups deploy_key_title = attributes_for(:key)[:title] deploy_key_body = attributes_for(:key)[:key] + click_button("Add new key") fill_in("deploy_key_title", with: deploy_key_title) fill_in("deploy_key_key", with: deploy_key_body) @@ -102,6 +103,16 @@ RSpec.describe "User interacts with deploy keys", :js, feature_category: :groups expect(page).to have_content(deploy_key_title) end end + + it "click on cancel hides the form" do + click_button("Add new key") + + expect(page).to have_css('.gl-new-card-add-form') + + click_button("Cancel") + + expect(page).not_to have_css('.gl-new-card-add-form') + end end context "attaching existing keys" do 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 5a58c049601..b7ae595a3a9 100644 --- a/spec/features/projects/settings/user_renames_a_project_spec.rb +++ b/spec/features/projects/settings/user_renames_a_project_spec.rb @@ -61,7 +61,7 @@ RSpec.describe 'Projects > Settings > User renames a project', feature_category: it 'shows error for invalid project name' do change_name(project, '🧮 foo bar ☁️') expect(page).to have_field 'Project name', with: '🧮 foo bar ☁️' - expect(page).not_to have_content "Name can contain only letters, digits, emojis '_', '.', dash and space. It must start with letter, digit, emoji or '_'." + expect(page).not_to have_content "Name can contain only letters, digits, emoji '_', '.', dash and space. It must start with letter, digit, emoji or '_'." end end end diff --git a/spec/features/projects/settings/user_searches_in_settings_spec.rb b/spec/features/projects/settings/user_searches_in_settings_spec.rb index 978b678c334..1ca4b761788 100644 --- a/spec/features/projects/settings/user_searches_in_settings_spec.rb +++ b/spec/features/projects/settings/user_searches_in_settings_spec.rb @@ -31,7 +31,7 @@ RSpec.describe 'User searches project settings', :js, feature_category: :groups_ visit project_settings_access_tokens_path(project) end - it_behaves_like 'can highlight results', 'Expiration date' + it_behaves_like 'can highlight results', 'Token name' end context 'in Repository page' do diff --git a/spec/features/projects/settings/visibility_settings_spec.rb b/spec/features/projects/settings/visibility_settings_spec.rb index 7d41b60199c..890f514d3da 100644 --- a/spec/features/projects/settings/visibility_settings_spec.rb +++ b/spec/features/projects/settings/visibility_settings_spec.rb @@ -30,11 +30,11 @@ RSpec.describe 'Projects > Settings > Visibility settings', :js, feature_categor context 'disable email notifications' do it 'is visible' do - expect(page).to have_selector('.js-emails-disabled', visible: true) + expect(page).to have_selector('.js-emails-enabled', visible: true) end it 'accepts the changed state' do - find('.js-emails-disabled input[type="checkbox"]').click + find('.js-emails-enabled input[type="checkbox"]').click expect { save_permissions_group }.to change { updated_emails_disabled? }.to(true) end @@ -59,7 +59,7 @@ RSpec.describe 'Projects > Settings > Visibility settings', :js, feature_categor context 'disable email notifications' do it 'is not available' do - expect(page).not_to have_selector('.js-emails-disabled', visible: true) + expect(page).not_to have_selector('.js-emails-enabled', visible: true) end end end diff --git a/spec/features/projects/show/user_manages_notifications_spec.rb b/spec/features/projects/show/user_manages_notifications_spec.rb index 455b931e7f3..bbf31c1e1e1 100644 --- a/spec/features/projects/show/user_manages_notifications_spec.rb +++ b/spec/features/projects/show/user_manages_notifications_spec.rb @@ -77,7 +77,7 @@ RSpec.describe 'Projects > Show > User manages notifications', :js, feature_cate end context 'when project emails are disabled' do - let(:project) { create(:project, :public, :repository, emails_disabled: true) } + let_it_be(:project) { create(:project, :public, :repository, emails_enabled: false) } it 'is disabled' do visit project_path(project) diff --git a/spec/features/projects/user_changes_project_visibility_spec.rb b/spec/features/projects/user_changes_project_visibility_spec.rb index f27a659f65f..24f24229f9c 100644 --- a/spec/features/projects/user_changes_project_visibility_spec.rb +++ b/spec/features/projects/user_changes_project_visibility_spec.rb @@ -66,8 +66,8 @@ RSpec.describe 'User changes public project visibility', :js, feature_category: let(:project) { create(:project, :empty_repo, :public) } it 'saves without confirmation' do - expect(page).to have_selector('.js-emails-disabled', visible: true) - find('.js-emails-disabled input[type="checkbox"]').click + expect(page).to have_selector('.js-emails-enabled', visible: true) + find('.js-emails-enabled input[type="checkbox"]').click page.within('#js-shared-permissions') do click_button 'Save changes' diff --git a/spec/features/projects/work_items/work_item_spec.rb b/spec/features/projects/work_items/work_item_spec.rb index e996a76b1c5..618d3e2efd0 100644 --- a/spec/features/projects/work_items/work_item_spec.rb +++ b/spec/features/projects/work_items/work_item_spec.rb @@ -40,7 +40,7 @@ RSpec.describe 'Work item', :js, feature_category: :team_planning do end it_behaves_like 'work items title' - it_behaves_like 'work items status' + it_behaves_like 'work items toggle status button' it_behaves_like 'work items assignees' it_behaves_like 'work items labels' it_behaves_like 'work items comments', :issue |