From 693c2fc9a023a8ac91cda150be7958d2168745e6 Mon Sep 17 00:00:00 2001 From: Will Meek <wmeek@gitlab.com> Date: Wed, 15 Sep 2021 15:58:09 +0100 Subject: [PATCH] Add an End to End test to configure Dependency Scanning from UI As per https://gitlab.com/gitlab-org/quality/testcases/-/issues/1666 The functionality was introduced, this MR adds an End to End test to test this --- .../components/feature_card.vue | 1 + .../components/manage_via_mr.vue | 1 + .../.gitlab-ci.yml | 9 +- .../Gemfile | 0 .../Gemfile.lock | 0 qa/qa/page/merge_request/new.rb | 7 + qa/qa/page/merge_request/show.rb | 10 +- .../page/project/secure/configuration_form.rb | 12 ++ .../enable_sast_from_configuration_spec.rb | 141 -------------- ...enable_scanning_from_configuration_spec.rb | 176 ++++++++++++++++++ 10 files changed, 208 insertions(+), 149 deletions(-) rename qa/qa/ee/fixtures/{secure_sast_enable_from_ui_files => secure_scanning_enable_from_ui_files}/.gitlab-ci.yml (68%) rename qa/qa/ee/fixtures/{secure_sast_enable_from_ui_files => secure_scanning_enable_from_ui_files}/Gemfile (100%) rename qa/qa/ee/fixtures/{secure_sast_enable_from_ui_files => secure_scanning_enable_from_ui_files}/Gemfile.lock (100%) delete mode 100644 qa/qa/specs/features/ee/browser_ui/secure/enable_sast_from_configuration_spec.rb create mode 100644 qa/qa/specs/features/ee/browser_ui/secure/enable_scanning_from_configuration_spec.rb diff --git a/app/assets/javascripts/security_configuration/components/feature_card.vue b/app/assets/javascripts/security_configuration/components/feature_card.vue index 0ecfdf420dbce..86afdbfeb8c27 100644 --- a/app/assets/javascripts/security_configuration/components/feature_card.vue +++ b/app/assets/javascripts/security_configuration/components/feature_card.vue @@ -128,6 +128,7 @@ export default { variant="confirm" category="primary" class="gl-mt-5" + :data-qa-selector="`${feature.type}_mr_button`" /> <gl-button diff --git a/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue b/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue index 0ff858e6afc72..42272c222fcc3 100644 --- a/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue +++ b/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue @@ -100,6 +100,7 @@ export default { :loading="isLoading" :variant="variant" :category="category" + :data-qa-selector="`${feature.type}_mr_button`" @click="mutate" >{{ $options.i18n.buttonLabel }}</gl-button > diff --git a/qa/qa/ee/fixtures/secure_sast_enable_from_ui_files/.gitlab-ci.yml b/qa/qa/ee/fixtures/secure_scanning_enable_from_ui_files/.gitlab-ci.yml similarity index 68% rename from qa/qa/ee/fixtures/secure_sast_enable_from_ui_files/.gitlab-ci.yml rename to qa/qa/ee/fixtures/secure_scanning_enable_from_ui_files/.gitlab-ci.yml index 93213d8202a92..5e9cbdd23a1be 100644 --- a/qa/qa/ee/fixtures/secure_sast_enable_from_ui_files/.gitlab-ci.yml +++ b/qa/qa/ee/fixtures/secure_scanning_enable_from_ui_files/.gitlab-ci.yml @@ -2,15 +2,20 @@ include: template: License-Scanning.gitlab-ci.yml .sast-analyzer: - tags: [secure_sast] script: - echo "Skipped" artifacts: reports: sast: gl-sast-report.json +.ds-analyzer: + script: + - echo "Skipped" + artifacts: + reports: + dependency_scanning: gl-dependency-scanning-report.json + license_scanning: - tags: [secure_sast] script: - echo "Skipped" artifacts: diff --git a/qa/qa/ee/fixtures/secure_sast_enable_from_ui_files/Gemfile b/qa/qa/ee/fixtures/secure_scanning_enable_from_ui_files/Gemfile similarity index 100% rename from qa/qa/ee/fixtures/secure_sast_enable_from_ui_files/Gemfile rename to qa/qa/ee/fixtures/secure_scanning_enable_from_ui_files/Gemfile diff --git a/qa/qa/ee/fixtures/secure_sast_enable_from_ui_files/Gemfile.lock b/qa/qa/ee/fixtures/secure_scanning_enable_from_ui_files/Gemfile.lock similarity index 100% rename from qa/qa/ee/fixtures/secure_sast_enable_from_ui_files/Gemfile.lock rename to qa/qa/ee/fixtures/secure_scanning_enable_from_ui_files/Gemfile.lock diff --git a/qa/qa/page/merge_request/new.rb b/qa/qa/page/merge_request/new.rb index 71e51ddd504c6..bcc60a8275d49 100644 --- a/qa/qa/page/merge_request/new.rb +++ b/qa/qa/page/merge_request/new.rb @@ -20,6 +20,13 @@ class New < Page::Issuable::New element :file_name_content end + def has_secure_description?(scanner_name) + scanner_url_name = scanner_name.downcase.tr('_', '-') + "Configure #{scanner_name} in `.gitlab-ci.yml` using the GitLab managed template. You can " \ + "[add variable overrides](https://docs.gitlab.com/ee/user/application_security/#{scanner_url_name}/#customizing-the-#{scanner_url_name}-settings) " \ + "to customize #{scanner_name} settings." + end + def create_merge_request click_element(:issuable_create_button, Page::MergeRequest::Show) end diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb index 1d8d9ed685938..7de99a11cf68f 100644 --- a/qa/qa/page/merge_request/show.rb +++ b/qa/qa/page/merge_request/show.rb @@ -288,13 +288,11 @@ def rebase! end def merge_immediately! - merge_moment_dropdown_found = has_element?(:merge_moment_dropdown, wait: 0) - - if merge_moment_dropdown_found - click_element(:merge_moment_dropdown) - click_element(:merge_immediately_menu_item) + if has_element?(:merge_moment_dropdown) + click_element(:merge_moment_dropdown, skip_finished_loading_check: true) + click_element(:merge_immediately_menu_item, skip_finished_loading_check: true) else - click_element(:merge_button) + click_element(:merge_button, skip_finished_loading_check: true) end end diff --git a/qa/qa/page/project/secure/configuration_form.rb b/qa/qa/page/project/secure/configuration_form.rb index 73d1601b61ea2..3e89a57e87081 100644 --- a/qa/qa/page/project/secure/configuration_form.rb +++ b/qa/qa/page/project/secure/configuration_form.rb @@ -9,19 +9,31 @@ class ConfigurationForm < QA::Page::Base include QA::Page::Settings::Common view 'app/assets/javascripts/security_configuration/components/feature_card.vue' do + element :dependency_scanning_status, "`${feature.type}_status`" # rubocop:disable QA/ElementWithPattern element :sast_status, "`${feature.type}_status`" # rubocop:disable QA/ElementWithPattern element :sast_enable_button, "`${feature.type}_enable_button`" # rubocop:disable QA/ElementWithPattern + element :dependency_scanning_mr_button, "`${feature.type}_mr_button`" # rubocop:disable QA/ElementWithPattern end def click_sast_enable_button click_element(:sast_enable_button) end + def click_dependency_scanning_mr_button + click_element(:dependency_scanning_mr_button) + end + def has_sast_status?(status_text) within_element(:sast_status) do has_text?(status_text) end end + + def has_dependency_scanning_status?(status_text) + within_element(:dependency_scanning_status) do + has_text?(status_text) + end + end end end end diff --git a/qa/qa/specs/features/ee/browser_ui/secure/enable_sast_from_configuration_spec.rb b/qa/qa/specs/features/ee/browser_ui/secure/enable_sast_from_configuration_spec.rb deleted file mode 100644 index 4d6adde6c1fa3..0000000000000 --- a/qa/qa/specs/features/ee/browser_ui/secure/enable_sast_from_configuration_spec.rb +++ /dev/null @@ -1,141 +0,0 @@ -# frozen_string_literal: true - -module QA - RSpec.describe 'Secure', :runner do - describe 'Enable SAST from UI' do - let(:merge_request_description) do - <<~DESCRIPTION.tr("\n", ' ').strip - Configure SAST in `.gitlab-ci.yml` using the GitLab managed template. You can - [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) - to customize SAST settings. - DESCRIPTION - end - - let(:test_data_string_fields_array) do - [ - %w(SECURE_ANALYZERS_PREFIX registry.example.com), - %w(SAST_EXCLUDED_PATHS foo,\ bar), - %w(SAST_BANDIT_EXCLUDED_PATHS exclude_path_a,\ exclude_path_b) - ] - end - - let(:test_data_int_fields_array) do - [ - %w(SEARCH_MAX_DEPTH 42), - %w(SAST_BRAKEMAN_LEVEL 43), - %w(SAST_GOSEC_LEVEL 7) - ] - end - - let(:test_data_checkbox_exclude_array) do - %w(eslint kubesec nodejs-scan phpcs-security-audit) - end - - let(:test_stage_name) do - 'test_all_the_things' - end - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-secure' - project.description = 'Project with Secure' - end - end - - let!(:runner) do - Resource::Runner.fabricate! do |runner| - runner.project = project - runner.name = "runner-for-#{project.name}" - runner.tags = ['secure_sast'] - end - end - - after do - runner&.remove_via_api! - end - - before do - # Push fixture to generate Secure reports - Resource::Repository::ProjectPush.fabricate! do |project_push| - project_push.project = project - project_push.directory = Pathname - .new(__dir__) - .join('../../../../../ee/fixtures/secure_sast_enable_from_ui_files') - project_push.commit_message = 'Create Secure compatible application to serve premade reports' - end - - Flow::Login.sign_in_unless_signed_in - project.visit! - end - - it 'runs sast job when enabled from configuration', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1835' do - Flow::Pipeline.visit_latest_pipeline - - # Baseline that we do not initially have a sast job - Page::Project::Pipeline::Show.perform do |pipeline| - expect(pipeline).to have_no_job('brakeman-sast') - end - Page::Project::Menu.perform(&:click_on_security_configuration_link) - - Page::Project::Secure::ConfigurationForm.perform do |config_form| - expect(config_form).to have_sast_status('Not enabled') - - config_form.click_sast_enable_button - config_form.click_expand_button - - test_data_string_fields_array.each do |test_data_string_array| - config_form.fill_dynamic_field(test_data_string_array.first, test_data_string_array[1]) - end - test_data_int_fields_array.each do |test_data_int_array| - config_form.fill_dynamic_field(test_data_int_array.first, test_data_int_array[1]) - end - test_data_checkbox_exclude_array.each do |test_data_checkbox| - config_form.unselect_dynamic_checkbox(test_data_checkbox) - end - config_form.fill_dynamic_field('stage', test_stage_name) - - config_form.click_submit_button - end - - Page::MergeRequest::New.perform do |new_merge_request| - expect(new_merge_request).to have_description(merge_request_description) - - new_merge_request.click_diffs_tab - - aggregate_failures "test Merge Request contents" do - expect(new_merge_request).to have_file('.gitlab-ci.yml') - test_data_string_fields_array.each do |test_data_string_array| - expect(new_merge_request).to have_content("#{test_data_string_array.first}: #{test_data_string_array[1]}") - end - test_data_int_fields_array.each do |test_data_int_array| - expect(new_merge_request).to have_content("#{test_data_int_array.first}: '#{test_data_int_array[1]}'") - end - expect(new_merge_request).to have_content("stages: - test - #{test_stage_name}") - expect(new_merge_request).to have_content("SAST_EXCLUDED_ANALYZERS: #{test_data_checkbox_exclude_array.join(', ')}") - end - - new_merge_request.create_merge_request - end - - Page::MergeRequest::Show.perform do |merge_request| - merge_request.merge_immediately! - end - - Flow::Pipeline.visit_latest_pipeline - - Page::Project::Pipeline::Show.perform do |pipeline| - expect(pipeline).to have_job('brakeman-sast') - end - - Page::Project::Menu.perform(&:click_on_security_configuration_link) - - Page::Project::Secure::ConfigurationForm.perform do |config_form| - aggregate_failures "test SAST status is Enabled" do - expect(config_form).to have_sast_status('Enabled') - expect(config_form).not_to have_sast_status('Not enabled') - end - end - end - end - end -end diff --git a/qa/qa/specs/features/ee/browser_ui/secure/enable_scanning_from_configuration_spec.rb b/qa/qa/specs/features/ee/browser_ui/secure/enable_scanning_from_configuration_spec.rb new file mode 100644 index 0000000000000..e4a6f32c53035 --- /dev/null +++ b/qa/qa/specs/features/ee/browser_ui/secure/enable_scanning_from_configuration_spec.rb @@ -0,0 +1,176 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Secure' do + context 'Enable Scanning from UI' do + let(:test_data_sast_string_fields_array) do + [ + %w(SECURE_ANALYZERS_PREFIX registry.example.com), + %w(SAST_EXCLUDED_PATHS foo,\ bar), + %w(SAST_BANDIT_EXCLUDED_PATHS exclude_path_a,\ exclude_path_b) + ] + end + + let(:test_data_int_fields_array) do + [ + %w(SEARCH_MAX_DEPTH 42), + %w(SAST_BRAKEMAN_LEVEL 43), + %w(SAST_GOSEC_LEVEL 7) + ] + end + + let(:test_data_checkbox_exclude_array) do + %w(eslint kubesec nodejs-scan phpcs-security-audit) + end + + let(:test_stage_name) do + 'test_all_the_things' + end + + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'project-with-secure' + project.description = 'Project with Secure' + end + end + + before do + Resource::Repository::ProjectPush.fabricate! do |project_push| + project_push.project = project + project_push.directory = Pathname + .new(__dir__) + .join('../../../../../ee/fixtures/secure_scanning_enable_from_ui_files') + project_push.commit_message = 'Create Secure compatible application to serve premade reports' + end + + Flow::Login.sign_in_unless_signed_in + project.visit! + end + + after do + project.remove_via_api! if project + end + + describe 'enable dependency scanning from configuration' do + it 'runs dependency scanning job when enabled from configuration', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/2261' do + Flow::Pipeline.visit_latest_pipeline + + # Baseline that we do not initially have a Dependency Scanning job + Page::Project::Pipeline::Show.perform do |pipeline| + aggregate_failures "test Dependency Scanning jobs are not present in pipeline" do + expect(pipeline).to have_no_job('gemnasium-dependency_scanning') + expect(pipeline).to have_no_job('bundler-audit-dependency_scanning') + end + end + + Page::Project::Menu.perform(&:click_on_security_configuration_link) + + Page::Project::Secure::ConfigurationForm.perform do |config_form| + expect(config_form).to have_dependency_scanning_status('Not enabled') + + config_form.click_dependency_scanning_mr_button + end + + Page::MergeRequest::New.perform do |new_merge_request| + expect(new_merge_request).to have_secure_description('Dependency Scanning') + new_merge_request.create_merge_request + end + + Page::MergeRequest::Show.perform do |merge_request| + merge_request.merge_immediately! + end + + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + aggregate_failures "test Dependency Scanning jobs are present in pipeline" do + expect(pipeline).to have_job('gemnasium-dependency_scanning') + expect(pipeline).to have_job('bundler-audit-dependency_scanning') + end + end + + Page::Project::Menu.perform(&:click_on_security_configuration_link) + + Page::Project::Secure::ConfigurationForm.perform do |config_form| + aggregate_failures "test Dependency Scanning status is Enabled" do + expect(config_form).to have_dependency_scanning_status('Enabled') + expect(config_form).not_to have_dependency_scanning_status('Not enabled') + end + end + end + end + + describe 'enable sast from configuration' do + it 'runs sast job when enabled from configuration', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1835' do + Flow::Pipeline.visit_latest_pipeline + + # Baseline that we do not initially have a sast job + Page::Project::Pipeline::Show.perform do |pipeline| + expect(pipeline).to have_no_job('brakeman-sast') + end + + Page::Project::Menu.perform(&:click_on_security_configuration_link) + + Page::Project::Secure::ConfigurationForm.perform do |config_form| + expect(config_form).to have_sast_status('Not enabled') + + config_form.click_sast_enable_button + config_form.click_expand_button + + test_data_sast_string_fields_array.each do |test_data_string_array| + config_form.fill_dynamic_field(test_data_string_array.first, test_data_string_array[1]) + end + test_data_int_fields_array.each do |test_data_int_array| + config_form.fill_dynamic_field(test_data_int_array.first, test_data_int_array[1]) + end + test_data_checkbox_exclude_array.each do |test_data_checkbox| + config_form.unselect_dynamic_checkbox(test_data_checkbox) + end + config_form.fill_dynamic_field('stage', test_stage_name) + + config_form.click_submit_button + end + + Page::MergeRequest::New.perform do |new_merge_request| + expect(new_merge_request).to have_secure_description('SAST') + + new_merge_request.click_diffs_tab + + aggregate_failures "test Merge Request contents" do + expect(new_merge_request).to have_file('.gitlab-ci.yml') + test_data_sast_string_fields_array.each do |test_data_string_array| + expect(new_merge_request).to have_content("#{test_data_string_array.first}: #{test_data_string_array[1]}") + end + test_data_int_fields_array.each do |test_data_int_array| + expect(new_merge_request).to have_content("#{test_data_int_array.first}: '#{test_data_int_array[1]}'") + end + expect(new_merge_request).to have_content("stage: #{test_stage_name}") + expect(new_merge_request).to have_content("SAST_EXCLUDED_ANALYZERS: #{test_data_checkbox_exclude_array.join(', ')}") + end + + new_merge_request.create_merge_request + end + + Page::MergeRequest::Show.perform do |merge_request| + merge_request.merge_immediately! + end + + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + expect(pipeline).to have_job('brakeman-sast') + end + + Page::Project::Menu.perform(&:click_on_security_configuration_link) + + Page::Project::Secure::ConfigurationForm.perform do |config_form| + aggregate_failures "test SAST status is Enabled" do + expect(config_form).to have_sast_status('Enabled') + expect(config_form).not_to have_sast_status('Not enabled') + end + end + end + end + end + end +end -- GitLab