diff options
Diffstat (limited to 'spec/features/projects')
36 files changed, 423 insertions, 309 deletions
diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb index f5cafa2b2ec..13a4c1b5912 100644 --- a/spec/features/projects/blobs/blob_show_spec.rb +++ b/spec/features/projects/blobs/blob_show_spec.rb @@ -137,7 +137,7 @@ RSpec.describe 'File blob', :js do context 'when ref switch' do def switch_ref_to(ref_name) - first('.qa-branches-select').click # rubocop:disable QA/SelectorUsage + first('[data-testid="branches-select"]').click page.within '.project-refs-form' do click_link ref_name diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb index 54176378de8..f198a1f42e2 100644 --- a/spec/features/projects/blobs/edit_spec.rb +++ b/spec/features/projects/blobs/edit_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe 'Editing file blob', :js do + include Spec::Support::Helpers::Features::SourceEditorSpecHelpers include TreeHelper include BlobSpecHelpers @@ -42,7 +43,7 @@ RSpec.describe 'Editing file blob', :js do def fill_editor(content: 'class NextFeature\\nend\\n') wait_for_requests - execute_script("monaco.editor.getModels()[0].setValue('#{content}')") + editor_set_value(content) end context 'from MR diff' do @@ -98,10 +99,8 @@ RSpec.describe 'Editing file blob', :js do click_link 'Preview changes' wait_for_requests - old_line_count = page.all('.line_holder.old').size new_line_count = page.all('.line_holder.new').size - expect(old_line_count).to be > 0 expect(new_line_count).to be > 0 end end diff --git a/spec/features/projects/ci/lint_spec.rb b/spec/features/projects/ci/lint_spec.rb index 7f10c6afcd5..608511ae5a5 100644 --- a/spec/features/projects/ci/lint_spec.rb +++ b/spec/features/projects/ci/lint_spec.rb @@ -16,16 +16,13 @@ RSpec.describe 'CI Lint', :js do visit project_ci_lint_path(project) editor_set_value(yaml_content) - - wait_for('YAML content') do - find(content_selector).text.present? - end end describe 'YAML parsing' do shared_examples 'validates the YAML' do before do click_on 'Validate' + scroll_to(page.find('[data-testid="ci-lint-status"]')) end context 'YAML is correct' do diff --git a/spec/features/projects/ci/secure_files_spec.rb b/spec/features/projects/ci/secure_files_spec.rb deleted file mode 100644 index 412330eb5d6..00000000000 --- a/spec/features/projects/ci/secure_files_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Secure Files', :js do - let(:project) { create(:project) } - let(:user) { create(:user) } - - before do - stub_feature_flags(ci_secure_files_read_only: false) - project.add_maintainer(user) - sign_in(user) - end - - it 'user sees the Secure Files list component' do - visit project_ci_secure_files_path(project) - expect(page).to have_content('There are no secure files yet.') - end - - it 'prompts the user to confirm before deleting a file' do - file = create(:ci_secure_file, project: project) - - visit project_ci_secure_files_path(project) - - expect(page).to have_content(file.name) - - find('button.btn-danger').click - - expect(page).to have_content("Delete #{file.name}?") - - click_on('Delete secure file') - - visit project_ci_secure_files_path(project) - - expect(page).not_to have_content(file.name) - end - - it 'displays an uploaded file in the file list' do - visit project_ci_secure_files_path(project) - expect(page).to have_content('There are no secure files yet.') - - page.attach_file('spec/fixtures/ci_secure_files/upload-keystore.jks') do - click_button 'Upload File' - end - - expect(page).to have_content('upload-keystore.jks') - end - - it 'displays an error when a duplicate file upload is attempted' do - create(:ci_secure_file, project: project, name: 'upload-keystore.jks') - visit project_ci_secure_files_path(project) - - expect(page).to have_content('upload-keystore.jks') - - page.attach_file('spec/fixtures/ci_secure_files/upload-keystore.jks') do - click_button 'Upload File' - end - - expect(page).to have_content('A file with this name already exists.') - end -end diff --git a/spec/features/projects/cluster_agents_spec.rb b/spec/features/projects/cluster_agents_spec.rb index 5d931afe4a7..8c557a9c37a 100644 --- a/spec/features/projects/cluster_agents_spec.rb +++ b/spec/features/projects/cluster_agents_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe 'ClusterAgents', :js do - let_it_be(:token) { create(:cluster_agent_token, description: 'feature test token')} + let_it_be(:token) { create(:cluster_agent_token, description: 'feature test token') } let(:agent) { token.agent } let(:project) { agent.project } diff --git a/spec/features/projects/commits/user_browses_commits_spec.rb b/spec/features/projects/commits/user_browses_commits_spec.rb index 863fdbdadaa..2719316c5dc 100644 --- a/spec/features/projects/commits/user_browses_commits_spec.rb +++ b/spec/features/projects/commits/user_browses_commits_spec.rb @@ -150,7 +150,7 @@ RSpec.describe 'User browses commits' do let(:ref) { project.repository.root_ref } let(:newrev) { project.repository.commit('master').sha } let(:short_newrev) { project.repository.commit('master').short_id } - let(:message) { 'Glob characters'} + let(:message) { 'Glob characters' } before do create_file_in_repo(project, ref, ref, filename, 'Test file', commit_message: message) diff --git a/spec/features/projects/compare_spec.rb b/spec/features/projects/compare_spec.rb index bc3ef2af9b0..22b0f344606 100644 --- a/spec/features/projects/compare_spec.rb +++ b/spec/features/projects/compare_spec.rb @@ -113,7 +113,7 @@ RSpec.describe "Compare", :js do click_button('Compare') - page.within('.gl-alert') do + page.within('[data-testid="too-many-changes-alert"]') do expect(page).to have_text("Too many changes to show. To preserve performance only 3 of 3+ files are displayed.") end end diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb index 951b24eafac..a53e8beb555 100644 --- a/spec/features/projects/environments/environment_spec.rb +++ b/spec/features/projects/environments/environment_spec.rb @@ -18,10 +18,10 @@ RSpec.describe 'Environment' do describe 'environment details page' do let!(:environment) { create(:environment, project: project) } - let!(:permissions) { } - let!(:deployment) { } - let!(:action) { } - let!(:cluster) { } + let!(:permissions) {} + let!(:deployment) {} + let!(:action) {} + let!(:cluster) {} context 'with auto-stop' do let!(:environment) { create(:environment, :will_auto_stop, name: 'staging', project: project) } 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 6b1e60db5b1..0ad44f31a52 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 @@ -18,7 +18,7 @@ RSpec.describe 'Projects > Files > Project owner sees a link to create a 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 + expect(page).to have_selector('[data-testid="file-templates-bar"]') select_template('MIT License') diff --git a/spec/features/projects/files/user_browses_files_spec.rb b/spec/features/projects/files/user_browses_files_spec.rb index 53fdd5a15dd..0f3ce5a2bad 100644 --- a/spec/features/projects/files/user_browses_files_spec.rb +++ b/spec/features/projects/files/user_browses_files_spec.rb @@ -348,7 +348,7 @@ RSpec.describe "User browses files", :js do end it "shows raw file content in a new tab" do - new_tab = window_opened_by {click_link 'Open raw'} + new_tab = window_opened_by { click_link 'Open raw' } within_window new_tab do expect(page).to have_content("Test file") @@ -366,7 +366,7 @@ RSpec.describe "User browses files", :js do end it "shows raw file content in a new tab" do - new_tab = window_opened_by {click_link 'Open raw'} + new_tab = window_opened_by { click_link 'Open raw' } within_window new_tab do expect(page).to have_content("*.rbc") diff --git a/spec/features/projects/files/user_creates_files_spec.rb b/spec/features/projects/files/user_creates_files_spec.rb index 7344c91b6dc..a81f31d663e 100644 --- a/spec/features/projects/files/user_creates_files_spec.rb +++ b/spec/features/projects/files/user_creates_files_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe 'Projects > Files > User creates files', :js do + include Spec::Support::Helpers::Features::SourceEditorSpecHelpers include BlobSpecHelpers let(:fork_message) do @@ -89,8 +90,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do end it 'creates and commit a new file' do - find('#editor') - execute_script("monaco.editor.getModels()[0].setValue('*.rbca')") + editor_set_value('*.rbca') fill_in(:file_name, with: 'not_a_file.md') fill_in(:commit_message, with: 'New commit message', visible: true) click_button('Commit changes') @@ -107,8 +107,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do it 'creates and commit a new file with new lines at the end of file' do set_default_button('edit') - find('#editor') - execute_script('monaco.editor.getModels()[0].setValue("Sample\n\n\n")') + editor_set_value('Sample\n\n\n') fill_in(:file_name, with: 'not_a_file.md') fill_in(:commit_message, with: 'New commit message', visible: true) click_button('Commit changes') @@ -119,8 +118,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do click_link('Edit') - find('#editor') - expect(evaluate_script('monaco.editor.getModels()[0].getValue()')).to eq("Sample\n\n\n") + expect(find('.monaco-editor')).to have_content('Sample\n\n\n') end it 'creates and commit a new file with a directory name' do @@ -128,8 +126,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do expect(page).to have_selector('.file-editor') - find('#editor') - execute_script("monaco.editor.getModels()[0].setValue('*.rbca')") + editor_set_value('*.rbca') fill_in(:commit_message, with: 'New commit message', visible: true) click_button('Commit changes') @@ -143,8 +140,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do it 'creates and commit a new file specifying a new branch' do expect(page).to have_selector('.file-editor') - find('#editor') - execute_script("monaco.editor.getModels()[0].setValue('*.rbca')") + editor_set_value('*.rbca') fill_in(:file_name, with: 'not_a_file.md') fill_in(:commit_message, with: 'New commit message', visible: true) fill_in(:branch_name, with: 'new_branch_name', visible: true) @@ -178,8 +174,7 @@ RSpec.describe 'Projects > Files > User creates files', :js do it 'creates and commit new file in forked project' do expect(page).to have_selector('.file-editor') - find('#editor') - execute_script("monaco.editor.getModels()[0].setValue('*.rbca')") + editor_set_value('*.rbca') fill_in(:file_name, with: 'not_a_file.md') fill_in(:commit_message, with: 'New commit message', visible: true) diff --git a/spec/features/projects/files/user_edits_files_spec.rb b/spec/features/projects/files/user_edits_files_spec.rb index 1ac45970828..d7460538be9 100644 --- a/spec/features/projects/files/user_edits_files_spec.rb +++ b/spec/features/projects/files/user_edits_files_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe 'Projects > Files > User edits files', :js do + include Spec::Support::Helpers::Features::SourceEditorSpecHelpers include ProjectForksHelper include BlobSpecHelpers @@ -50,10 +51,9 @@ RSpec.describe 'Projects > Files > User edits files', :js do click_link_or_button('Edit') find('.file-editor', match: :first) - find('#editor') - set_editor_value('*.rbca') + editor_set_value('*.rbca') - expect(editor_value).to eq('*.rbca') + expect(find('.monaco-editor')).to have_content('*.rbca') end it 'does not show the edit link if a file is binary' do @@ -72,8 +72,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do click_link_or_button('Edit') find('.file-editor', match: :first) - find('#editor') - set_editor_value('*.rbca') + editor_set_value('*.rbca') fill_in(:commit_message, with: 'New commit message', visible: true) click_button('Commit changes') @@ -91,8 +90,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do find('.file-editor', match: :first) - find('#editor') - set_editor_value('*.rbca') + editor_set_value('*.rbca') fill_in(:commit_message, with: 'New commit message', visible: true) fill_in(:branch_name, with: 'new_branch_name', visible: true) click_button('Commit changes') @@ -110,8 +108,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do click_link_or_button('Edit') find('.file-editor', match: :first) - find('#editor') - set_editor_value('*.rbca') + editor_set_value('*.rbca') click_link('Preview changes') expect(page).to have_css('.line_holder.new') @@ -156,10 +153,9 @@ RSpec.describe 'Projects > Files > User edits files', :js do find('.file-editor', match: :first) - find('#editor') - set_editor_value('*.rbca') + editor_set_value('*.rbca') - expect(editor_value).to eq('*.rbca') + expect(find('.monaco-editor')).to have_content('*.rbca') end it 'opens the Web IDE in a forked project', :sidekiq_might_not_need_inline do @@ -187,8 +183,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do find('.file-editor', match: :first) - find('#editor') - set_editor_value('*.rbca') + editor_set_value('*.rbca') fill_in(:commit_message, with: 'New commit message', visible: true) click_button('Commit changes') @@ -216,8 +211,7 @@ RSpec.describe 'Projects > Files > User edits files', :js do expect(page).not_to have_link('Fork') - find('#editor') - set_editor_value('*.rbca') + editor_set_value('*.rbca') fill_in(:commit_message, with: 'Another commit', visible: true) click_button('Commit changes') diff --git a/spec/features/projects/issuable_templates_spec.rb b/spec/features/projects/issuable_templates_spec.rb index 12c5820a69d..ac83de3e765 100644 --- a/spec/features/projects/issuable_templates_spec.rb +++ b/spec/features/projects/issuable_templates_spec.rb @@ -90,6 +90,34 @@ RSpec.describe 'issuable templates', :js do end end + context 'user creates an issue with a default template from the repo' do + let(:template_content) { 'this is the default template' } + + before do + project.repository.create_file( + user, + '.gitlab/issue_templates/default.md', + template_content, + message: 'added default issue template', + branch_name: 'master' + ) + end + + it 'does not overwrite autosaved description' do + visit new_project_issue_path project + wait_for_requests + + assert_template # default template is loaded the first time + + fill_in 'issue_description', with: 'my own description', fill_options: { clear: :backspace } + + visit new_project_issue_path project + wait_for_requests + + assert_template(expected_content: 'my own description') + end + end + context 'user creates a merge request using templates' do let(:template_content) { 'this is a test "feature-proposal" template' } let(:bug_template_content) { 'this is merge request bug template' } diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb index bb44b70bb3a..289ab8cffa5 100644 --- a/spec/features/projects/jobs/user_browses_jobs_spec.rb +++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb @@ -74,6 +74,7 @@ RSpec.describe 'User browses jobs' do wait_for_requests expect(page).to have_selector('.ci-canceled') + expect(page).not_to have_selector('[data-testid="jobs-table-error-alert"]') end end diff --git a/spec/features/projects/members/manage_groups_spec.rb b/spec/features/projects/members/manage_groups_spec.rb index 006fa3b6eff..e86affbbca1 100644 --- a/spec/features/projects/members/manage_groups_spec.rb +++ b/spec/features/projects/members/manage_groups_spec.rb @@ -162,7 +162,7 @@ RSpec.describe 'Project > Members > Manage groups', :js do let_it_be(:user) { maintainer } let_it_be(:group) { parent_group } let_it_be(:group_within_hierarchy) { create(:group, parent: group) } - let_it_be(:project_within_hierarchy) { create(:project, group: group_within_hierarchy)} + let_it_be(:project_within_hierarchy) { create(:project, group: group_within_hierarchy) } let_it_be(:members_page_path) { project_project_members_path(project) } let_it_be(:members_page_path_within_hierarchy) { project_project_members_path(project_within_hierarchy) } end diff --git a/spec/features/projects/members/manage_members_spec.rb b/spec/features/projects/members/manage_members_spec.rb index 8d229530ef5..56eb02607a5 100644 --- a/spec/features/projects/members/manage_members_spec.rb +++ b/spec/features/projects/members/manage_members_spec.rb @@ -12,106 +12,188 @@ RSpec.describe 'Projects > Members > Manage members', :js do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, :internal, namespace: group) } + let(:project_owner) { create(:user, name: "ProjectOwner", username: "project_owner") } + let(:project_maintainer) { create(:user, name: "ProjectMaintainer", username: "project_maintainer") } + let(:group_owner) { user1 } + let(:project_developer) { user2 } + before do - sign_in(user1) - group.add_owner(user1) + project.add_maintainer(project_maintainer) + project.add_owner(project_owner) + group.add_owner(group_owner) + + sign_in(group_owner) end it 'show members from project and group', :aggregate_failures do - project.add_developer(user2) + project.add_developer(project_developer) visit_members_page - expect(first_row).to have_content(user1.name) - expect(second_row).to have_content(user2.name) + expect(first_row).to have_content(group_owner.name) + expect(second_row).to have_content(project_developer.name) end it 'show user once if member of both group and project', :aggregate_failures do - project.add_developer(user1) + group.add_reporter(project_maintainer) visit_members_page - expect(first_row).to have_content(user1.name) - expect(second_row).to be_blank + expect(first_row).to have_content(group_owner.name) + expect(second_row).to have_content(project_maintainer.name) + expect(third_row).to have_content(project_owner.name) + expect(all_rows[3]).to be_blank end - it 'update user access level' do - project.add_developer(user2) + context 'update user access level' do + before do + sign_in(current_user) + end + + context 'as maintainer' do + let(:current_user) { project_maintainer } - visit_members_page + it 'can update a non-Owner member' do + project.add_developer(project_developer) - page.within find_member_row(user2) do - click_button('Developer') - click_button('Reporter') + visit_members_page + + page.within find_member_row(project_developer) do + click_button('Developer') + + page.within '.dropdown-menu' do + expect(page).not_to have_button('Owner') + end + + click_button('Reporter') + + expect(page).to have_button('Reporter') + end + end - expect(page).to have_button('Reporter') + it 'cannot update an Owner member' do + visit_members_page + + page.within find_member_row(project_owner) do + expect(page).not_to have_button('Owner') + end + end end - end - context 'when owner' do - it 'uses ProjectMember access_level_roles for the invite members modal access option', :aggregate_failures do - visit_members_page + context 'as owner' do + let(:current_user) { group_owner } - click_on 'Invite members' + it 'can update a project Owner member' do + visit_members_page - click_on 'Guest' - wait_for_requests + page.within find_member_row(project_owner) do + click_button('Owner') + click_button('Reporter') - page.within '.dropdown-menu' do - expect(page).to have_button('Guest') - expect(page).to have_button('Reporter') - expect(page).to have_button('Developer') - expect(page).to have_button('Maintainer') - expect(page).to have_button('Owner') + expect(page).to have_button('Reporter') + end end end end - context 'when maintainer' do - let(:maintainer) { create(:user) } - + context 'uses ProjectMember valid_access_level_roles for the invite members modal options', :aggregate_failures do before do - project.add_maintainer(maintainer) - sign_in(maintainer) - end + sign_in(current_user) - it 'uses ProjectMember access_level_roles for the invite members modal access option', :aggregate_failures do visit_members_page click_on 'Invite members' click_on 'Guest' wait_for_requests + end - page.within '.dropdown-menu' do - expect(page).to have_button('Guest') - expect(page).to have_button('Reporter') - expect(page).to have_button('Developer') - expect(page).to have_button('Maintainer') - expect(page).not_to have_button('Owner') + context 'when owner' do + let(:current_user) { project_owner } + + it 'shows Owner in the dropdown' do + page.within '.dropdown-menu' do + expect(page).to have_button('Guest') + expect(page).to have_button('Reporter') + expect(page).to have_button('Developer') + expect(page).to have_button('Maintainer') + expect(page).to have_button('Owner') + end + end + end + + context 'when maintainer' do + let(:current_user) { project_maintainer } + + it 'does not show the Owner option' do + page.within '.dropdown-menu' do + expect(page).to have_button('Guest') + expect(page).to have_button('Reporter') + expect(page).to have_button('Developer') + expect(page).to have_button('Maintainer') + expect(page).not_to have_button('Owner') + end end end end - it 'remove user from project' do - other_user = create(:user) - project.add_developer(other_user) + describe 'remove user from project' do + before do + project.add_developer(project_developer) - visit_members_page + sign_in(current_user) - # Open modal - page.within find_member_row(other_user) do - click_button 'Remove member' + visit_members_page end - within_modal do - expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests' - click_button('Remove member') + context 'when maintainer' do + let(:current_user) { project_maintainer } + + it 'can only remove non-Owner members' do + page.within find_member_row(project_owner) do + expect(page).not_to have_button('Remove member') + end + + # Open modal + page.within find_member_row(project_developer) do + click_button 'Remove member' + end + + within_modal do + expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests' + click_button('Remove member') + end + + wait_for_requests + + expect(members_table).not_to have_content(project_developer.name) + expect(members_table).to have_content(project_owner.name) + end end - wait_for_requests + context 'when owner' do + let(:current_user) { group_owner } + + it 'can remove any direct member' do + page.within find_member_row(project_owner) do + expect(page).to have_button('Remove member') + end + + # Open modal + page.within find_member_row(project_owner) do + click_button 'Remove member' + end - expect(members_table).not_to have_content(other_user.name) + within_modal do + expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests' + click_button('Remove member') + end + + wait_for_requests + + expect(members_table).not_to have_content(project_owner.name) + end + end end it_behaves_like 'inviting members', 'project-members-page' do @@ -130,7 +212,7 @@ RSpec.describe 'Projects > Members > Manage members', :js do external_project_bot = create(:user, :project_bot, name: '_external_project_bot_') external_project = create(:project, group: external_group) external_project.add_maintainer(external_project_bot) - external_project.add_maintainer(user1) + external_project.add_maintainer(group_owner) visit_members_page @@ -143,8 +225,8 @@ RSpec.describe 'Projects > Members > Manage members', :js do wait_for_requests - expect(page).to have_content(user1.name) - expect(page).to have_content(user2.name) + expect(page).to have_content(group_owner.name) + expect(page).to have_content(project_developer.name) expect(page).not_to have_content(internal_project_bot.name) expect(page).not_to have_content(external_project_bot.name) end @@ -155,7 +237,7 @@ RSpec.describe 'Projects > Members > Manage members', :js do let_it_be(:project) { create(:project, :public) } before do - sign_out(user1) + sign_out(group_owner) end it 'does not show the Invite members button when not signed in' do @@ -192,7 +274,7 @@ RSpec.describe 'Projects > Members > Manage members', :js do end it 'shows 2FA badge to user with "Maintainer" access level' do - project.add_maintainer(user1) + sign_in(project_maintainer) visit_members_page @@ -209,7 +291,7 @@ RSpec.describe 'Projects > Members > Manage members', :js do end it 'does not show 2FA badge to users with access level below "Maintainer"' do - group.add_developer(user1) + group.add_developer(group_owner) visit_members_page diff --git a/spec/features/projects/merge_request_button_spec.rb b/spec/features/projects/merge_request_button_spec.rb index 335ae6794b7..eb52a7821f9 100644 --- a/spec/features/projects/merge_request_button_spec.rb +++ b/spec/features/projects/merge_request_button_spec.rb @@ -11,6 +11,8 @@ RSpec.describe 'Merge Request button' do let(:forked_project) { fork_project(project, user, repository: true) } shared_examples 'Merge request button only shown when allowed' do + let(:extra_mr_params) { {} } + context 'not logged in' do it 'does not show Create merge request button' do visit url @@ -31,11 +33,8 @@ RSpec.describe 'Merge Request button' do href = project_new_merge_request_path( project, merge_request: { - source_project_id: project.id, - source_branch: 'feature', - target_project_id: project.id, - target_branch: 'master' - } + source_branch: 'feature' + }.merge(extra_mr_params) ) visit url @@ -90,11 +89,8 @@ RSpec.describe 'Merge Request button' do href = project_new_merge_request_path( forked_project, merge_request: { - source_project_id: forked_project.id, - source_branch: 'feature', - target_project_id: forked_project.id, - target_branch: 'master' - } + source_branch: 'feature' + }.merge(extra_mr_params) ) visit fork_url @@ -121,6 +117,7 @@ RSpec.describe 'Merge Request button' do it_behaves_like 'Merge request button only shown when allowed' do let(:url) { project_compare_path(project, from: 'master', to: 'feature') } let(:fork_url) { project_compare_path(forked_project, from: 'master', to: 'feature') } + let(:extra_mr_params) { { target_project_id: project.id, target_branch: 'master' } } end it 'shows the correct merge request button when viewing across forks', :js do @@ -128,9 +125,8 @@ RSpec.describe 'Merge Request button' do project.add_developer(user) href = project_new_merge_request_path( - project, + forked_project, merge_request: { - source_project_id: forked_project.id, source_branch: 'feature', target_project_id: project.id, target_branch: 'master' diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index 9d2d1454d77..f45025d079a 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -3,16 +3,44 @@ require 'spec_helper' RSpec.describe 'New project', :js do - include Select2Helper include Spec::Support::Helpers::Features::TopNavSpecHelpers context 'as a user' do - let(:user) { create(:user) } + let_it_be(:user) { create(:user) } before do sign_in(user) end + it 'shows the project description field when it should' do + description_label = 'Project description (optional)' + + visit new_project_path + click_link 'Create blank project' + + page.within('#blank-project-pane') do + expect(page).not_to have_content(description_label) + end + + visit new_project_path + click_link 'Import project' + + page.within('#import-project-pane') do + click_button 'Repository by URL' + + expect(page).to have_content(description_label) + end + + visit new_project_path + click_link 'Create from template' + + page.within('#create-from-template-pane') do + find("[data-testid='use_template_#{Gitlab::ProjectTemplate.localized_templates_table.first.name}']").click + + expect(page).to have_content(description_label) + end + end + it 'shows a message if multiple levels are restricted' do Gitlab::CurrentSettings.update!( restricted_visibility_levels: [Gitlab::VisibilityLevel::PRIVATE, Gitlab::VisibilityLevel::INTERNAL] diff --git a/spec/features/projects/pages/user_adds_domain_spec.rb b/spec/features/projects/pages/user_adds_domain_spec.rb index afa3f29ce0d..5cb4fa163c8 100644 --- a/spec/features/projects/pages/user_adds_domain_spec.rb +++ b/spec/features/projects/pages/user_adds_domain_spec.rb @@ -5,7 +5,7 @@ RSpec.describe 'User adds pages domain', :js do include LetsEncryptHelpers include Spec::Support::Helpers::ModalHelpers - let_it_be(:project) { create(:project, pages_https_only: false) } + let_it_be(:project) { create(:project, :pages_published, pages_https_only: false) } let(:user) { create(:user) } @@ -18,8 +18,6 @@ RSpec.describe 'User adds pages domain', :js do end context 'when pages are exposed on external HTTP address', :http_pages_enabled do - let(:project) { create(:project, pages_https_only: false) } - shared_examples 'adds new domain' do it 'adds new domain' do visit new_project_pages_domain_path(project) @@ -42,7 +40,7 @@ RSpec.describe 'User adds pages domain', :js do context 'when project in group namespace' do it_behaves_like 'adds new domain' do let(:group) { create :group } - let(:project) { create(:project, namespace: group, pages_https_only: false) } + let(:project) { create(:project, :pages_published, namespace: group, pages_https_only: false) } end end diff --git a/spec/features/projects/pages/user_configures_pages_pipeline_spec.rb b/spec/features/projects/pages/user_configures_pages_pipeline_spec.rb new file mode 100644 index 00000000000..029479d6b95 --- /dev/null +++ b/spec/features/projects/pages/user_configures_pages_pipeline_spec.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe 'Pages edits pages settings', :js do + include Spec::Support::Helpers::ModalHelpers + + let_it_be(:project) { create(:project, pages_https_only: false) } + let_it_be(:user) { create(:user) } + + before do + allow(Gitlab.config.pages).to receive(:enabled).and_return(true) + + project.add_maintainer(user) + + sign_in(user) + end + + context 'when pipeline wizard feature is enabled' do + before do + Feature.enable(:use_pipeline_wizard_for_pages) + end + + context 'when onboarding is not complete' do + it 'renders onboarding instructions' do + visit project_pages_path(project) + + expect(page).to have_content('Get started with Pages') + end + end + + context 'when onboarding is complete' do + before do + project.mark_pages_onboarding_complete + end + + it 'shows waiting screen' do + visit project_pages_path(project) + + expect(page).to have_content('Waiting for the Pages Pipeline to complete...') + end + end + end + + context 'when pipeline wizard feature is disabled' do + before do + Feature.disable(:use_pipeline_wizard_for_pages) + end + + it 'shows configure pages instructions' do + visit project_pages_path(project) + + expect(page).to have_content('Configure pages') + end + + after do + Feature.enable(:use_pipeline_wizard_for_pages) + end + end +end 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 4c633bea64e..2e28fa20b90 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 @@ -5,7 +5,8 @@ RSpec.describe "Pages with Let's Encrypt", :https_pages_enabled do include LetsEncryptHelpers include Spec::Support::Helpers::ModalHelpers - let(:project) { create(:project, pages_https_only: false) } + let_it_be_with_reload(:project) { create(:project, :pages_published, pages_https_only: false) } + let(:user) { create(:user) } let(:role) { :maintainer } let(:certificate_pem) { attributes_for(:pages_domain)[:certificate] } diff --git a/spec/features/projects/pages/user_edits_settings_spec.rb b/spec/features/projects/pages/user_edits_settings_spec.rb index bd163f4a109..88c27a6adf2 100644 --- a/spec/features/projects/pages/user_edits_settings_spec.rb +++ b/spec/features/projects/pages/user_edits_settings_spec.rb @@ -4,8 +4,8 @@ require 'spec_helper' RSpec.describe 'Pages edits pages settings', :js do include Spec::Support::Helpers::ModalHelpers - let(:project) { create(:project, pages_https_only: false) } - let(:user) { create(:user) } + let_it_be_with_reload(:project) { create(:project, :pages_published, pages_https_only: false) } + let_it_be(:user) { create(:user) } before do allow(Gitlab.config.pages).to receive(:enabled).and_return(true) @@ -80,13 +80,6 @@ RSpec.describe 'Pages edits pages settings', :js do end end - it 'does not see anything to destroy' do - visit project_pages_path(project) - - expect(page).to have_content('Configure pages') - expect(page).not_to have_link('Remove pages') - end - describe 'project settings page' do it 'renders "Pages" tab' do visit edit_project_path(project) @@ -151,7 +144,7 @@ RSpec.describe 'Pages edits pages settings', :js do end context 'non-HTTPS domain exists' do - let(:project) { create(:project, pages_https_only: false) } + let(:project) { create(:project, :pages_published, pages_https_only: false) } before do create(:pages_domain, :without_key, :without_certificate, project: project) diff --git a/spec/features/projects/pipeline_schedules_spec.rb b/spec/features/projects/pipeline_schedules_spec.rb index 8cf6d5bd29b..0711a30e974 100644 --- a/spec/features/projects/pipeline_schedules_spec.rb +++ b/spec/features/projects/pipeline_schedules_spec.rb @@ -109,7 +109,12 @@ RSpec.describe 'Pipeline Schedules', :js do end it 'changes ownership of the pipeline' do - click_link 'Take ownership' + click_button 'Take ownership' + + page.within('#pipeline-take-ownership-modal') do + click_link 'Take ownership' + end + page.within('.pipeline-schedule-table-row') do expect(page).not_to have_content('No owner') expect(page).to have_link('Sidney Jones') diff --git a/spec/features/projects/pipelines/legacy_pipeline_spec.rb b/spec/features/projects/pipelines/legacy_pipeline_spec.rb index db6feecba03..14f60dfe061 100644 --- a/spec/features/projects/pipelines/legacy_pipeline_spec.rb +++ b/spec/features/projects/pipelines/legacy_pipeline_spec.rb @@ -385,6 +385,37 @@ RSpec.describe 'Pipeline', :js do end end + describe 'test tabs' do + let(:pipeline) { create(:ci_pipeline, :with_test_reports, :with_report_results, project: project) } + + before do + stub_feature_flags(pipeline_tabs_vue: false) + visit_pipeline + wait_for_requests + end + + context 'with test reports' do + it 'shows badge counter in Tests tab' do + expect(page.find('.js-test-report-badge-counter').text).to eq(pipeline.test_report_summary.total[:count].to_s) + end + + it 'calls summary.json endpoint', :js do + find('.js-tests-tab-link').click + + expect(page).to have_content('Jobs') + expect(page).to have_selector('[data-testid="tests-detail"]', visible: :all) + end + end + + context 'without test reports' do + let(:pipeline) { create(:ci_pipeline, project: project) } + + it 'shows zero' do + expect(page.find('.js-test-report-badge-counter', visible: :all).text).to eq("0") + end + end + end + context 'retrying jobs' do before do visit_pipeline diff --git a/spec/features/projects/pipelines/legacy_pipelines_spec.rb b/spec/features/projects/pipelines/legacy_pipelines_spec.rb index 15d889933bf..eb8f2de3aba 100644 --- a/spec/features/projects/pipelines/legacy_pipelines_spec.rb +++ b/spec/features/projects/pipelines/legacy_pipelines_spec.rb @@ -7,7 +7,7 @@ RSpec.describe 'Pipelines', :js do include Spec::Support::Helpers::ModalHelpers let(:project) { create(:project) } - let(:expected_detached_mr_tag) {'merge request'} + let(:expected_detached_mr_tag) { 'merge request' } context 'when user is logged in' do let(:user) { create(:user) } @@ -727,6 +727,7 @@ RSpec.describe 'Pipelines', :js do end it { expect(page).to have_content('Missing CI config file') } + it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file' \ 'is available when trying again' do stub_ci_pipeline_to_return_yaml_file diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb index a83d4191f38..cfdd851cb80 100644 --- a/spec/features/projects/pipelines/pipeline_spec.rb +++ b/spec/features/projects/pipelines/pipeline_spec.rb @@ -394,7 +394,7 @@ RSpec.describe 'Pipeline', :js do expect(page).to have_selector('button[aria-label="Cancel downstream pipeline"]') end - context 'when canceling' do + context 'when canceling', :sidekiq_inline do before do find('button[aria-label="Cancel downstream pipeline"]').click wait_for_requests @@ -515,18 +515,17 @@ RSpec.describe 'Pipeline', :js do let(:pipeline) { create(:ci_pipeline, :with_test_reports, :with_report_results, project: project) } before do - stub_feature_flags(pipeline_tabs_vue: false) visit_pipeline wait_for_requests end context 'with test reports' do it 'shows badge counter in Tests tab' do - expect(page.find('.js-test-report-badge-counter').text).to eq(pipeline.test_report_summary.total[:count].to_s) + expect(page.find('[data-testid="tests-counter"]').text).to eq(pipeline.test_report_summary.total[:count].to_s) end it 'calls summary.json endpoint', :js do - find('.js-tests-tab-link').click + find('.gl-tab-nav-item', text: 'Tests').click expect(page).to have_content('Jobs') expect(page).to have_selector('[data-testid="tests-detail"]', visible: :all) @@ -537,7 +536,7 @@ RSpec.describe 'Pipeline', :js do let(:pipeline) { create(:ci_pipeline, project: project) } it 'shows zero' do - expect(page.find('.js-test-report-badge-counter', visible: :all).text).to eq("0") + expect(page.find('[data-testid="tests-counter"]', visible: :all).text).to eq("0") end end end diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 785edc69623..bf521971ae0 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -7,7 +7,7 @@ RSpec.describe 'Pipelines', :js do include Spec::Support::Helpers::ModalHelpers let(:project) { create(:project) } - let(:expected_detached_mr_tag) {'merge request'} + let(:expected_detached_mr_tag) { 'merge request' } context 'when user is logged in' do let(:user) { create(:user) } @@ -710,6 +710,7 @@ RSpec.describe 'Pipelines', :js do end it { expect(page).to have_content('Missing CI config file') } + it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file is available when trying again' do stub_ci_pipeline_to_return_yaml_file diff --git a/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb b/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb new file mode 100644 index 00000000000..5a50b3de772 --- /dev/null +++ b/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Project > Settings > Packages & Registries > Container registry tag expiration policy' do + let_it_be(:user) { create(:user) } + let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) } + + let(:container_registry_enabled) { true } + let(:container_registry_enabled_on_project) { ProjectFeature::ENABLED } + + subject { visit cleanup_image_tags_project_settings_packages_and_registries_path(project) } + + before do + project.project_feature.update!(container_registry_access_level: container_registry_enabled_on_project) + project.container_expiration_policy.update!(enabled: true) + + sign_in(user) + stub_container_registry_config(enabled: container_registry_enabled) + end + + context 'as owner', :js do + it 'shows available section' do + subject + + expect(find('.breadcrumbs')).to have_content('Clean up image tags') + end + end + + context 'when registry is disabled' do + let(:container_registry_enabled) { false } + + it 'does not exists' do + subject + + expect(page).to have_gitlab_http_status(:not_found) + end + end + + context 'when container registry is disabled on project' do + let(:container_registry_enabled_on_project) { ProjectFeature::DISABLED } + + it 'does not exists' do + subject + + expect(page).to have_gitlab_http_status(:not_found) + end + end +end diff --git a/spec/features/projects/settings/registry_settings_spec.rb b/spec/features/projects/settings/registry_settings_spec.rb index 9468540736f..1fb46c669e7 100644 --- a/spec/features/projects/settings/registry_settings_spec.rb +++ b/spec/features/projects/settings/registry_settings_spec.rb @@ -31,7 +31,6 @@ RSpec.describe 'Project > Settings > Packages & Registries > Container registry subject within '[data-testid="container-expiration-policy-project-settings"]' do - click_button('Expand') select('Every day', from: 'Run cleanup') select('50 tags per image name', from: 'Keep the most recent:') fill_in('Keep tags matching:', with: 'stable') @@ -50,7 +49,6 @@ RSpec.describe 'Project > Settings > Packages & Registries > Container registry subject within '[data-testid="container-expiration-policy-project-settings"]' do - click_button('Expand') fill_in('Remove tags matching:', with: '*-production') submit_button = find('[data-testid="save-button"') @@ -76,7 +74,6 @@ RSpec.describe 'Project > Settings > Packages & Registries > Container registry subject within '[data-testid="container-expiration-policy-project-settings"]' do - click_button('Expand') expect(find('[data-testid="enable-toggle"]')).to have_content('Disabled - Tags will not be automatically deleted.') end end @@ -91,7 +88,6 @@ RSpec.describe 'Project > Settings > Packages & Registries > Container registry subject within '[data-testid="container-expiration-policy-project-settings"]' do - click_button('Expand') expect(find('.gl-alert-title')).to have_content('Cleanup policy for tags is disabled') end end diff --git a/spec/features/projects/settings/service_desk_setting_spec.rb b/spec/features/projects/settings/service_desk_setting_spec.rb index 0df4bd3f0d9..86c5c3d2d8c 100644 --- a/spec/features/projects/settings/service_desk_setting_spec.rb +++ b/spec/features/projects/settings/service_desk_setting_spec.rb @@ -81,7 +81,7 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache do } end - let_it_be_with_reload(:group) { create(:group)} + let_it_be_with_reload(:group) { create(:group) } let_it_be_with_reload(:project) { create(:project, :custom_repo, group: group, files: issuable_project_template_files) } let_it_be(:group_template_repo) { create(:project, :custom_repo, group: group, files: issuable_group_template_files) } diff --git a/spec/features/projects/tags/user_edits_tags_spec.rb b/spec/features/projects/tags/user_edits_tags_spec.rb index c8438b73dc3..857d0696659 100644 --- a/spec/features/projects/tags/user_edits_tags_spec.rb +++ b/spec/features/projects/tags/user_edits_tags_spec.rb @@ -15,6 +15,13 @@ RSpec.describe 'Project > Tags', :js do end shared_examples "can create and update release" do + it 'shows tag information' do + visit page_url + + expect(page).to have_content 'v1.1.0' + expect(page).to have_content 'Version 1.1.0' + end + it 'can create new release' do visit page_url page.find("a[href=\"#{new_project_release_path(project, tag_name: 'v1.1.0')}\"]").click @@ -52,71 +59,4 @@ RSpec.describe 'Project > Tags', :js do include_examples "can create and update release" end - - # TODO: remove most of these together with FF https://gitlab.com/gitlab-org/gitlab/-/issues/366244 - describe 'when opening project tags' do - before do - stub_feature_flags(edit_tag_release_notes_via_release_page: false) - visit project_tags_path(project) - end - - context 'page with tags list' do - it 'shows tag name' do - expect(page).to have_content 'v1.1.0' - expect(page).to have_content 'Version 1.1.0' - end - - it 'shows tag edit button' do - page.within '.tags > .content-list' do - edit_btn = page.find("li > .row-fixed-content.controls a.btn-edit[href='/#{project.full_path}/-/tags/v1.1.0/release/edit']") - - expect(edit_btn['href']).to end_with("/#{project.full_path}/-/tags/v1.1.0/release/edit") - end - end - end - - context 'edit tag release notes' do - before do - page.find("li > .row-fixed-content.controls a.btn-edit[href='/#{project.full_path}/-/tags/v1.1.0/release/edit']").click - end - - it 'shows tag name header' do - page.within('.content') do - expect(page.find('.sub-header-block')).to have_content 'Release notes for tag v1.1.0' - end - end - - it 'shows release notes form' do - page.within('.content') do - expect(page).to have_selector('form.release-form') - end - end - - it 'toolbar buttons on release notes form are functional' do - page.within('.content form.release-form') do - note_textarea = page.find('.js-gfm-input') - - # Click on Bold button - page.find('.md-header-toolbar button:first-child').click - - expect(note_textarea.value).to eq('****') - end - end - - it 'release notes form shows "Attach a file" button', :js do - page.within('.content form.release-form') do - expect(page).to have_button('Attach a file') - expect(page).not_to have_selector('.uploading-progress-container', visible: true) - end - end - - it 'shows "Attaching a file" message on uploading 1 file', :js, :capybara_ignore_server_errors do - slow_requests do - dropzone_file([Rails.root.join('spec', 'fixtures', 'dk.png')], 0, false) - - expect(page).to have_selector('.attaching-file-message', visible: true, text: 'Attaching a file -') - end - end - end - end end diff --git a/spec/features/projects/tags/user_views_tag_spec.rb b/spec/features/projects/tags/user_views_tag_spec.rb new file mode 100644 index 00000000000..3978c5b7b78 --- /dev/null +++ b/spec/features/projects/tags/user_views_tag_spec.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe 'User views tag', :feature do + include_examples 'user views tag' do + let(:tag_page) { project_tag_path(project, id: tag_name) } + 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 dfb5d5d9221..d3849df023e 100644 --- a/spec/features/projects/tags/user_views_tags_spec.rb +++ b/spec/features/projects/tags/user_views_tags_spec.rb @@ -2,34 +2,8 @@ require 'spec_helper' RSpec.describe 'User views tags', :feature do - context 'with html' do - let(:project) { create(:project, :repository, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } - let(:user) { create(:user) } - let(:tag_name) { "stable" } - let!(:release) { create(:release, project: project, tag: tag_name) } - - before do - project.add_developer(user) - project.repository.add_tag(user, tag_name, project.default_branch_or_main) - - sign_in(user) - end - - shared_examples 'renders the tag index page' do - it do - visit project_tags_path(project) - - expect(page).to have_content tag_name - end - end - - it_behaves_like 'renders the tag index page' - - context 'when tag name contains a slash' do - let(:tag_name) { "stable/v0.1" } - - it_behaves_like 'renders the tag index page' - end + include_examples 'user views tag' do + let(:tag_page) { project_tags_path(project) } end context 'rss' do diff --git a/spec/features/projects/tree/create_directory_spec.rb b/spec/features/projects/tree/create_directory_spec.rb index f6127b38bd6..074469a9b55 100644 --- a/spec/features/projects/tree/create_directory_spec.rb +++ b/spec/features/projects/tree/create_directory_spec.rb @@ -49,8 +49,8 @@ RSpec.describe 'Multi-file editor new directory', :js do # Compact mode depends on the size of window. If it is shorter than MAX_WINDOW_HEIGHT_COMPACT, # (as it is with WEBDRIVER_HEADLESS=0), this initial commit button will exist. Otherwise, if it is # taller (as it is by default with chrome headless) then the button will not exist. - if page.has_css?('.qa-begin-commit-button') # rubocop:disable QA/SelectorUsage - find('.qa-begin-commit-button').click # rubocop:disable QA/SelectorUsage + if page.has_css?('[data-testid="begin-commit-button"]') + find('[data-testid="begin-commit-button"]').click end fill_in('commit-message', with: 'commit message ide') diff --git a/spec/features/projects/tree/create_file_spec.rb b/spec/features/projects/tree/create_file_spec.rb index 33be02a9121..85c644fa528 100644 --- a/spec/features/projects/tree/create_file_spec.rb +++ b/spec/features/projects/tree/create_file_spec.rb @@ -39,8 +39,8 @@ RSpec.describe 'Multi-file editor new file', :js do # Compact mode depends on the size of window. If it is shorter than MAX_WINDOW_HEIGHT_COMPACT, # (as it is with WEBDRIVER_HEADLESS=0), this initial commit button will exist. Otherwise, if it is # taller (as it is by default with chrome headless) then the button will not exist. - if page.has_css?('.qa-begin-commit-button') # rubocop:disable QA/SelectorUsage - find('.qa-begin-commit-button').click # rubocop:disable QA/SelectorUsage + if page.has_css?('[data-testid="begin-commit-button"]') + find('[data-testid="begin-commit-button"]').click end fill_in('commit-message', with: 'commit message ide') diff --git a/spec/features/projects/tree/tree_show_spec.rb b/spec/features/projects/tree/tree_show_spec.rb index 53e89cd2959..163e347d03d 100644 --- a/spec/features/projects/tree/tree_show_spec.rb +++ b/spec/features/projects/tree/tree_show_spec.rb @@ -54,7 +54,7 @@ RSpec.describe 'Projects tree', :js do let(:filename) { File.join(path, 'test.txt') } let(:newrev) { project.repository.commit('master').sha } let(:short_newrev) { project.repository.commit('master').short_id } - let(:message) { 'Glob characters'} + let(:message) { 'Glob characters' } before do create_file_in_repo(project, 'master', 'master', filename, 'Test file', commit_message: message) |