diff options
Diffstat (limited to 'spec/features/runners_spec.rb')
-rw-r--r-- | spec/features/runners_spec.rb | 489 |
1 files changed, 240 insertions, 249 deletions
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb index 3c63ec82778..091c318459b 100644 --- a/spec/features/runners_spec.rb +++ b/spec/features/runners_spec.rb @@ -9,396 +9,387 @@ RSpec.describe 'Runners', feature_category: :runner_fleet do sign_in(user) end - context 'when project_runners_vue_ui is disabled' do - before do - stub_feature_flags(project_runners_vue_ui: false) - end + context 'with user as project maintainer' do + let_it_be(:project) { create(:project).tap { |project| project.add_maintainer(user) } } - context 'with user as project maintainer' do - let_it_be(:project) { create(:project).tap { |project| project.add_maintainer(user) } } + context 'when user views runners page', :js do + before do + visit project_runners_path(project) + end - context 'when user views runners page', :js do - before do - visit project_runners_path(project) - end + it 'user can see a link with instructions on how to install GitLab Runner' do + expect(page).to have_link(s_('Runners|New project runner'), href: new_project_runner_path(project)) + end - it 'user can see a link with instructions on how to install GitLab Runner' do - expect(page).to have_link(s_('Runners|New project runner'), href: new_project_runner_path(project)) - end + it_behaves_like "shows and resets runner registration token" do + let(:dropdown_text) { s_('Runners|Register a project runner') } + let(:registration_token) { project.runners_token } + end + end - it_behaves_like "shows and resets runner registration token" do - let(:dropdown_text) { s_('Runners|Register a project runner') } - let(:registration_token) { project.runners_token } - end + context 'when user views new runner page', :js do + before do + visit new_project_runner_path(project) end - context 'when user views new runner page', :js do - before do - visit new_project_runner_path(project) - end + it_behaves_like 'creates runner and shows register page' do + let(:register_path_pattern) { register_project_runner_path(project, '.*') } + end - it_behaves_like 'creates runner and shows register page' do - let(:register_path_pattern) { register_project_runner_path(project, '.*') } - end + it_behaves_like 'shows locked field' + end + end - it 'shows the locked field' do - expect(page).to have_selector('input[type="checkbox"][name="locked"]') - expect(page).to have_content(_('Lock to current projects')) - end - end + context 'when a project has enabled shared_runners' do + let_it_be(:project) { create(:project) } + + before do + project.add_maintainer(user) end - context 'when a project has enabled shared_runners' do - let_it_be(:project) { create(:project) } + context 'when a project_type runner is activated on the project' do + let_it_be(:project_runner) { create(:ci_runner, :project, projects: [project]) } - before do - project.add_maintainer(user) - end + it 'user sees the project runner' do + visit project_runners_path(project) - context 'when a project_type runner is activated on the project' do - let_it_be(:project_runner) { create(:ci_runner, :project, projects: [project]) } + within '[data-testid="assigned_project_runners"]' do + expect(page).to have_content(project_runner.display_name) + end - it 'user sees the project runner' do - visit project_runners_path(project) + click_on project_runner.short_sha - within '[data-testid="assigned_project_runners"]' do - expect(page).to have_content(project_runner.display_name) - end + expect(page).to have_content(project_runner.platform) + end - click_on project_runner.short_sha + it 'user can pause and resume the project runner' do + visit project_runners_path(project) - expect(page).to have_content(project_runner.platform) + within '[data-testid="assigned_project_runners"]' do + expect(page).to have_link('Pause') end - it 'user can pause and resume the project runner' do - visit project_runners_path(project) + click_on 'Pause' - within '[data-testid="assigned_project_runners"]' do - expect(page).to have_link('Pause') - end + within '[data-testid="assigned_project_runners"]' do + expect(page).to have_link('Resume') + end - click_on 'Pause' + click_on 'Resume' - within '[data-testid="assigned_project_runners"]' do - expect(page).to have_link('Resume') - end + within '[data-testid="assigned_project_runners"]' do + expect(page).to have_link('Pause') + end + end - click_on 'Resume' + it 'user removes an activated project runner if this is last project for that runners' do + visit project_runners_path(project) - within '[data-testid="assigned_project_runners"]' do - expect(page).to have_link('Pause') - end + within '[data-testid="assigned_project_runners"]' do + click_on 'Remove runner' end - it 'user removes an activated project runner if this is last project for that runners' do - visit project_runners_path(project) + expect(page).not_to have_content(project_runner.display_name) + end - within '[data-testid="assigned_project_runners"]' do - click_on 'Remove runner' - end + it 'user edits the runner to be protected' do + visit project_runners_path(project) + + within '[data-testid="assigned_project_runners"]' do + first('[data-testid="edit-runner-link"]').click + end + + expect(page.find_field('runner[access_level]')).not_to be_checked + + check 'runner_access_level' + click_button 'Save changes' + + expect(page).to have_content 'Protected Yes' + end - expect(page).not_to have_content(project_runner.display_name) + context 'when a runner has a tag' do + before do + project_runner.update!(tag_list: ['tag']) end - it 'user edits the runner to be protected' do + it 'user edits runner not to run untagged jobs' do visit project_runners_path(project) within '[data-testid="assigned_project_runners"]' do first('[data-testid="edit-runner-link"]').click end - expect(page.find_field('runner[access_level]')).not_to be_checked + expect(page.find_field('runner[run_untagged]')).to be_checked - check 'runner_access_level' + uncheck 'runner_run_untagged' click_button 'Save changes' - expect(page).to have_content 'Protected Yes' + expect(page).to have_content 'Can run untagged jobs No' end + end - context 'when a runner has a tag' do - before do - project_runner.update!(tag_list: ['tag']) - end - - it 'user edits runner not to run untagged jobs' do - visit project_runners_path(project) - - within '[data-testid="assigned_project_runners"]' do - first('[data-testid="edit-runner-link"]').click - end - - expect(page.find_field('runner[run_untagged]')).to be_checked + context 'when a shared runner is activated on the project' do + let!(:shared_runner) { create(:ci_runner, :instance) } - uncheck 'runner_run_untagged' - click_button 'Save changes' + it 'user sees CI/CD setting page' do + visit project_runners_path(project) - expect(page).to have_content 'Can run untagged jobs No' + within '[data-testid="available-shared-runners"]' do + expect(page).to have_content(shared_runner.display_name) end end - context 'when a shared runner is activated on the project' do - let!(:shared_runner) { create(:ci_runner, :instance) } + context 'when multiple shared runners are configured' do + let_it_be(:shared_runner_2) { create(:ci_runner, :instance) } - it 'user sees CI/CD setting page' do + it 'shows the runner count' do visit project_runners_path(project) within '[data-testid="available-shared-runners"]' do - expect(page).to have_content(shared_runner.display_name) + expect(page).to have_content format(_('Available shared runners: %{count}'), { count: 2 }) end end - context 'when multiple shared runners are configured' do - let_it_be(:shared_runner_2) { create(:ci_runner, :instance) } + it 'adds pagination to the shared runner list' do + stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1) - it 'shows the runner count' do - visit project_runners_path(project) + visit project_runners_path(project) - within '[data-testid="available-shared-runners"]' do - expect(page).to have_content format(_('Available shared runners: %{count}'), { count: 2 }) - end + within '[data-testid="available-shared-runners"]' do + expect(find('.pagination')).not_to be_nil end + end + end + end - it 'adds pagination to the shared runner list' do - stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1) + context 'when multiple project runners are configured' do + let!(:project_runner_2) { create(:ci_runner, :project, projects: [project]) } - visit project_runners_path(project) + it 'adds pagination to the runner list' do + stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1) - within '[data-testid="available-shared-runners"]' do - expect(find('.pagination')).not_to be_nil - end - end - end + visit project_runners_path(project) + + expect(find('.pagination')).not_to be_nil end + end + end - context 'when multiple project runners are configured' do - let!(:project_runner_2) { create(:ci_runner, :project, projects: [project]) } + context 'when a project runner exists in another project' do + let(:another_project) { create(:project) } + let!(:project_runner) { create(:ci_runner, :project, projects: [another_project]) } - it 'adds pagination to the runner list' do - stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1) + before do + another_project.add_maintainer(user) + end - visit project_runners_path(project) + it 'user enables and disables a project runner' do + visit project_runners_path(project) - expect(find('.pagination')).not_to be_nil - end + within '[data-testid="available_project_runners"]' do + click_on 'Enable for this project' + end + + expect(page.find('[data-testid="assigned_project_runners"]')).to have_content(project_runner.display_name) + + within '[data-testid="assigned_project_runners"]' do + click_on 'Disable for this project' end + + expect(page.find('[data-testid="available_project_runners"]')).to have_content(project_runner.display_name) end + end - context 'when a project runner exists in another project' do - let(:another_project) { create(:project) } - let!(:project_runner) { create(:ci_runner, :project, projects: [another_project]) } + context 'shared runner text' do + context 'when application settings have shared_runners_text' do + let(:shared_runners_text) { 'custom **shared** runners description' } + let(:shared_runners_html) { 'custom shared runners description' } before do - another_project.add_maintainer(user) + stub_application_setting(shared_runners_text: shared_runners_text) end - it 'user enables and disables a project runner' do + it 'user sees shared runners description' do visit project_runners_path(project) - within '[data-testid="available_project_runners"]' do - click_on 'Enable for this project' + page.within("[data-testid='shared-runners-description']") do + expect(page).not_to have_content('The same shared runner executes code from multiple projects') + expect(page).to have_content(shared_runners_html) end - - expect(page.find('[data-testid="assigned_project_runners"]')).to have_content(project_runner.display_name) - - within '[data-testid="assigned_project_runners"]' do - click_on 'Disable for this project' - end - - expect(page.find('[data-testid="available_project_runners"]')).to have_content(project_runner.display_name) end end - context 'shared runner text' do - context 'when application settings have shared_runners_text' do - let(:shared_runners_text) { 'custom **shared** runners description' } - let(:shared_runners_html) { 'custom shared runners description' } + context 'when application settings have an unsafe link in shared_runners_text' do + let(:shared_runners_text) { '<a href="javascript:alert(\'xss\')">link</a>' } - before do - stub_application_setting(shared_runners_text: shared_runners_text) - end + before do + stub_application_setting(shared_runners_text: shared_runners_text) + end - it 'user sees shared runners description' do - visit project_runners_path(project) + it 'user sees no link' do + visit project_runners_path(project) - page.within("[data-testid='shared-runners-description']") do - expect(page).not_to have_content('The same shared runner executes code from multiple projects') - expect(page).to have_content(shared_runners_html) - end + page.within("[data-testid='shared-runners-description']") do + expect(page).to have_content('link') + expect(page).not_to have_link('link') end end + end - context 'when application settings have an unsafe link in shared_runners_text' do - let(:shared_runners_text) { '<a href="javascript:alert(\'xss\')">link</a>' } + context 'when application settings have an unsafe image in shared_runners_text' do + let(:shared_runners_text) { '<img src="404.png" onerror="alert(\'xss\')"/>' } - before do - stub_application_setting(shared_runners_text: shared_runners_text) - end + before do + stub_application_setting(shared_runners_text: shared_runners_text) + end - it 'user sees no link' do - visit project_runners_path(project) + it 'user sees image safely' do + visit project_runners_path(project) - page.within("[data-testid='shared-runners-description']") do - expect(page).to have_content('link') - expect(page).not_to have_link('link') - end + page.within("[data-testid='shared-runners-description']") do + expect(page).to have_css('img') + expect(page).not_to have_css('img[onerror]') end end + end + end + end - context 'when application settings have an unsafe image in shared_runners_text' do - let(:shared_runners_text) { '<img src="404.png" onerror="alert(\'xss\')"/>' } + context 'enable shared runners in project settings', :js do + before do + project.add_maintainer(user) - before do - stub_application_setting(shared_runners_text: shared_runners_text) - end + visit project_runners_path(project) + end - it 'user sees image safely' do - visit project_runners_path(project) + context 'when a project has enabled shared_runners' do + let(:project) { create(:project, shared_runners_enabled: true) } - page.within("[data-testid='shared-runners-description']") do - expect(page).to have_css('img') - expect(page).not_to have_css('img[onerror]') - end - end - end + it 'shared runners toggle is on' do + expect(page).to have_selector('[data-testid="toggle-shared-runners"]') + expect(page).to have_selector('[data-testid="toggle-shared-runners"] .is-checked') end end - context 'enable shared runners in project settings', :js do - before do - project.add_maintainer(user) + context 'when a project has disabled shared_runners' do + let(:project) { create(:project, shared_runners_enabled: false) } - visit project_runners_path(project) + it 'shared runners toggle is off' do + expect(page).not_to have_selector('[data-testid="toggle-shared-runners"] .is-checked') end + end + end - context 'when a project has enabled shared_runners' do - let(:project) { create(:project, shared_runners_enabled: true) } + context 'group runners in project settings' do + before do + project.add_maintainer(user) + end - it 'shared runners toggle is on' do - expect(page).to have_selector('[data-testid="toggle-shared-runners"]') - expect(page).to have_selector('[data-testid="toggle-shared-runners"] .is-checked') - end + let_it_be(:group) { create :group } + let_it_be(:project) { create :project, group: group } + + context 'as project and group maintainer' do + before do + group.add_maintainer(user) end - context 'when a project has disabled shared_runners' do - let(:project) { create(:project, shared_runners_enabled: false) } + context 'project with a group but no group runner' do + it 'group runners are not available' do + visit project_runners_path(project) - it 'shared runners toggle is off' do - expect(page).not_to have_selector('[data-testid="toggle-shared-runners"] .is-checked') + expect(page).not_to have_content 'To register them, go to the group\'s Runners page.' + expect(page).to have_content 'Ask your group owner to set up a group runner' end end end - context 'group runners in project settings' do + context 'as project maintainer and group owner' do before do - project.add_maintainer(user) + group.add_owner(user) end - let_it_be(:group) { create :group } - let_it_be(:project) { create :project, group: group } + context 'project with a group but no group runner' do + it 'group runners are available' do + visit project_runners_path(project) - context 'as project and group maintainer' do - before do - group.add_maintainer(user) + expect(page).to have_content 'This group does not have any group runners yet.' + + expect(page).to have_content 'To register them, go to the group\'s Runners page.' + expect(page).not_to have_content 'Ask your group owner to set up a group runner' end + end + end - context 'project with a group but no group runner' do - it 'group runners are not available' do - visit project_runners_path(project) + context 'as project maintainer' do + context 'project without a group' do + let(:project) { create :project } - expect(page).not_to have_content 'To register them, go to the group\'s Runners page.' - expect(page).to have_content 'Ask your group owner to set up a group runner' - end + it 'group runners are not available' do + visit project_runners_path(project) + + expect(page).to have_content 'This project does not belong to a group and cannot make use of group runners.' end end - context 'as project maintainer and group owner' do - before do - group.add_owner(user) - end + context 'with group project' do + let_it_be(:group) { create(:group) } + let_it_be(:project) { create(:project, group: group) } context 'project with a group but no group runner' do - it 'group runners are available' do + it 'group runners are not available' do visit project_runners_path(project) expect(page).to have_content 'This group does not have any group runners yet.' - expect(page).to have_content 'To register them, go to the group\'s Runners page.' - expect(page).not_to have_content 'Ask your group owner to set up a group runner' + expect(page).not_to have_content 'To register them, go to the group\'s Runners page.' + expect(page).to have_content 'Ask your group owner to set up a group runner.' end end - end - context 'as project maintainer' do - context 'project without a group' do - let(:project) { create :project } + context 'project with a group and a group runner' do + let_it_be(:group_runner) do + create(:ci_runner, :group, groups: [group], description: 'group-runner') + end - it 'group runners are not available' do + it 'group runners are available' do visit project_runners_path(project) - expect(page).to have_content 'This project does not belong to a group and cannot make use of group runners.' + expect(page).to have_content 'Available group runners: 1' + expect(page).to have_content 'group-runner' end - end - context 'with group project' do - let_it_be(:group) { create(:group) } - let_it_be(:project) { create(:project, group: group) } + it 'group runners may be disabled for a project' do + visit project_runners_path(project) - context 'project with a group but no group runner' do - it 'group runners are not available' do - visit project_runners_path(project) + click_on 'Disable group runners' - expect(page).to have_content 'This group does not have any group runners yet.' + expect(page).to have_content 'Enable group runners' + expect(project.reload.group_runners_enabled).to be false - expect(page).not_to have_content 'To register them, go to the group\'s Runners page.' - expect(page).to have_content 'Ask your group owner to set up a group runner.' - end - end + click_on 'Enable group runners' - context 'project with a group and a group runner' do - let_it_be(:group_runner) do - create(:ci_runner, :group, groups: [group], description: 'group-runner') - end + expect(page).to have_content 'Disable group runners' + expect(project.reload.group_runners_enabled).to be true + end - it 'group runners are available' do - visit project_runners_path(project) + context 'when multiple group runners are configured' do + let_it_be(:group_runner_2) { create(:ci_runner, :group, groups: [group]) } - expect(page).to have_content 'Available group runners: 1' - expect(page).to have_content 'group-runner' - end - - it 'group runners may be disabled for a project' do + it 'shows the runner count' do visit project_runners_path(project) - click_on 'Disable group runners' - - expect(page).to have_content 'Enable group runners' - expect(project.reload.group_runners_enabled).to be false - - click_on 'Enable group runners' - - expect(page).to have_content 'Disable group runners' - expect(project.reload.group_runners_enabled).to be true - end - - context 'when multiple group runners are configured' do - let_it_be(:group_runner_2) { create(:ci_runner, :group, groups: [group]) } - - it 'shows the runner count' do - visit project_runners_path(project) - - within '[data-testid="group-runners"]' do - expect(page).to have_content format(_('Available group runners: %{runners}'), { runners: 2 }) - end + within '[data-testid="group-runners"]' do + expect(page).to have_content format(_('Available group runners: %{runners}'), { runners: 2 }) end + end - it 'adds pagination to the group runner list' do - stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1) + it 'adds pagination to the group runner list' do + stub_const('Projects::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE', 1) - visit project_runners_path(project) + visit project_runners_path(project) - within '[data-testid="group-runners"]' do - expect(find('.pagination')).not_to be_nil - end + within '[data-testid="group-runners"]' do + expect(find('.pagination')).not_to be_nil end end end |