diff --git a/app/assets/javascripts/alert_management/components/alert_management_table.vue b/app/assets/javascripts/alert_management/components/alert_management_table.vue index c0cac958a4292913ca5e59f1599c4c1cacc5d0c1..fe18b9da560b751ff1c38918c029be9d5aff36ed 100644 --- a/app/assets/javascripts/alert_management/components/alert_management_table.vue +++ b/app/assets/javascripts/alert_management/components/alert_management_table.vue @@ -312,6 +312,7 @@ export default { <template #table> <gl-table class="alert-management-table" + data-qa-selector="alert_table_container" :items=" alerts ? alerts.list diff --git a/app/assets/javascripts/alerts_settings/components/alerts_form.vue b/app/assets/javascripts/alerts_settings/components/alerts_form.vue index 388d925196bc80468a47e35171d91688b96b8d79..a0d5cb7f4c3091a3eee7b7a7af93eefba34fc8b0 100644 --- a/app/assets/javascripts/alerts_settings/components/alerts_form.vue +++ b/app/assets/javascripts/alerts_settings/components/alerts_form.vue @@ -83,7 +83,7 @@ export default { </p> <form ref="settingsForm" @submit.prevent="updateAlertsIntegrationSettings"> <gl-form-group class="gl-pl-0"> - <gl-form-checkbox v-model="createIssueEnabled" data-qa-selector="create_issue_checkbox"> + <gl-form-checkbox v-model="createIssueEnabled" data-qa-selector="create_incident_checkbox"> <span>{{ $options.i18n.createIncident.label }}</span> </gl-form-checkbox> </gl-form-group> diff --git a/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue b/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue index 03bc4b825aefea71deb549076082307a8f01f83f..65c3bc732ed7128253b7d1b6535645a189d1caf7 100644 --- a/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue +++ b/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue @@ -430,6 +430,7 @@ export default { v-model="integrationForm.type" :disabled="isSelectDisabled" class="gl-max-w-full" + data-qa-selector="integration_type_dropdown" :options="integrationTypesOptions" /> @@ -461,6 +462,7 @@ export default { v-model="integrationForm.name" type="text" :placeholder="$options.i18n.integrationFormSteps.nameIntegration.placeholder" + data-qa-selector="integration_name_field" @input="validateName" /> </gl-form-group> @@ -483,6 +485,7 @@ export default { v-model="integrationForm.active" :is-loading="loading" :label="$options.i18n.integrationFormSteps.nameIntegration.activeToggle" + data-qa-selector="active_toggle_container" class="gl-mt-4 gl-font-weight-normal" /> </gl-form-group> @@ -594,6 +597,7 @@ export default { category="secondary" class="gl-ml-3 js-no-auto-disable" data-testid="integration-form-test-and-submit" + data-qa-selector="save_and_create_alert_button" @click="submit(true)" > {{ $options.i18n.saveAndTestIntegration }} @@ -695,6 +699,7 @@ export default { :debounce="$options.JSON_VALIDATE_DELAY" rows="6" max-rows="10" + data-qa-selector="test_payload_field" @input="validateJson(false)" /> </gl-form-group> @@ -706,6 +711,7 @@ export default { data-testid="send-test-alert" variant="confirm" class="js-no-auto-disable" + data-qa-selector="send_test_alert_button" @click="isFormDirty ? null : sendTestAlert()" > {{ $options.i18n.send }} diff --git a/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue b/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue index bf456b6adaa78b9d76bdc8f0f4ebab1b9a20c0d9..010cb5721a1d5aef5007a597fda121c6f5a78dec 100644 --- a/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue +++ b/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue @@ -375,6 +375,7 @@ export default { category="secondary" variant="confirm" data-testid="add-integration-btn" + data-qa-selector="add_integration_button" class="gl-mt-3" @click="setFormVisibility(true)" > diff --git a/app/views/projects/settings/operations/_alert_management.html.haml b/app/views/projects/settings/operations/_alert_management.html.haml index d80f1e4597cda5b3bc4f6465d72ac79401d2e2d0..7433e81c11cde7ba4e5c849d458ea9bba4fb16db 100644 --- a/app/views/projects/settings/operations/_alert_management.html.haml +++ b/app/views/projects/settings/operations/_alert_management.html.haml @@ -3,7 +3,7 @@ - add_page_specific_style 'page_bundles/alert_management_settings' - add_page_specific_style 'page_bundles/incident_management_list' -%section.settings.no-animate#js-alert-management-settings{ class: ('expanded' if expanded) } +%section.settings.no-animate#js-alert-management-settings{ class: ('expanded' if expanded), data: { qa_selector: 'alerts_settings_content' } } .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only = _('Alerts') diff --git a/qa/qa/flow/alert_settings.rb b/qa/qa/flow/alert_settings.rb new file mode 100644 index 0000000000000000000000000000000000000000..0e884f58773d3926bc0d6f2454ebe0b46026f7fb --- /dev/null +++ b/qa/qa/flow/alert_settings.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module QA + module Flow + module AlertSettings + extend self + + def setup_http_endpoint_and_send_alert(integration_name: nil, payload: nil) + integration_name ||= random_word + payload ||= { title: random_word, description: random_word } + Page::Project::Menu.perform(&:go_to_monitor_settings) + Page::Project::Settings::Monitor.perform do |setting| + setting.expand_alerts do |alert| + alert.add_new_integration + alert.select_http_endpoint + alert.enter_integration_name(integration_name) + alert.activate_integration + alert.save_and_create_alert + alert.fill_in_test_payload(payload.to_json) + alert.send_test_alert + end + end + end + + private + + def random_word + Faker::Lorem.word + end + end + end +end diff --git a/qa/qa/page/project/monitor/alerts/index.rb b/qa/qa/page/project/monitor/alerts/index.rb new file mode 100644 index 0000000000000000000000000000000000000000..50b69d59db7fb5ced701046d412182e0a109c2ab --- /dev/null +++ b/qa/qa/page/project/monitor/alerts/index.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module QA + module Page + module Project + module Monitor + module Alerts + class Index < Page::Base + view 'app/assets/javascripts/alert_management/components/alert_management_table.vue' do + element :alert_table_container, required: true + end + + def has_alert_with_title?(title) + has_link?(title) + end + end + end + end + end + end +end diff --git a/qa/qa/page/project/settings/alerts.rb b/qa/qa/page/project/settings/alerts.rb index be9b61ded805d66971cd528c65ca00920517ac5e..a74a227d69759f89215dc0392aa9b1ac7389c7a4 100644 --- a/qa/qa/page/project/settings/alerts.rb +++ b/qa/qa/page/project/settings/alerts.rb @@ -6,14 +6,27 @@ module Project module Settings class Alerts < Page::Base view 'app/assets/javascripts/alerts_settings/components/alerts_form.vue' do - element :create_issue_checkbox + element :create_incident_checkbox element :incident_templates_dropdown element :save_changes_button element :incident_templates_item end - def enable_issues_for_incidents - check_element(:create_issue_checkbox) + view 'app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue' do + element :add_integration_button + end + + view 'app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue' do + element :integration_type_dropdown + element :integration_name_field + element :active_toggle_container + element :save_and_create_alert_button + element :test_payload_field + element :send_test_alert_button + end + + def enable_incident_for_alert + check_element(:create_incident_checkbox) end def select_issue_template(template) @@ -32,6 +45,43 @@ def has_template?(template) has_text?(template) end end + + def add_new_integration + wait_for_requests + click_element(:add_integration_button) + end + + def select_http_endpoint + click_element(:integration_type_dropdown) + find("option[value='HTTP']").click + + # Click outside of the list to close it + click_element(:integration_name_field) + end + + def enter_integration_name(name) + fill_element(:integration_name_field, name) + end + + def activate_integration + within_element(:active_toggle_container) do + find('.gl-toggle').click + end + + wait_for_requests + end + + def save_and_create_alert + click_element(:save_and_create_alert_button) + end + + def fill_in_test_payload(payload) + fill_element(:test_payload_field, payload) + end + + def send_test_alert + click_element(:send_test_alert_button) + end end end end diff --git a/qa/qa/page/project/settings/monitor.rb b/qa/qa/page/project/settings/monitor.rb index 87fb0698897b3a129afae580eb503d5cf5eb6714..8170ae31a139177c19942176b070985751c274d2 100644 --- a/qa/qa/page/project/settings/monitor.rb +++ b/qa/qa/page/project/settings/monitor.rb @@ -11,8 +11,18 @@ class Monitor < Page::Base element :incidents_settings_content end + view 'app/views/projects/settings/operations/_alert_management.html.haml' do + element :alerts_settings_content + end + def expand_incidents(&block) expand_content(:incidents_settings_content) do + # Fill in with incidents settings + end + end + + def expand_alerts(&block) + expand_content(:alerts_settings_content) do Settings::Alerts.perform(&block) end end diff --git a/qa/qa/page/project/sub_menus/monitor.rb b/qa/qa/page/project/sub_menus/monitor.rb index 927b4b6970c0cfc7e37e94bf4b06f0524c5a21a2..27fb58fb146f486cf353a11207b1092e92ab6a9f 100644 --- a/qa/qa/page/project/sub_menus/monitor.rb +++ b/qa/qa/page/project/sub_menus/monitor.rb @@ -23,6 +23,14 @@ def go_to_monitor_incidents end end + def go_to_monitor_alerts + hover_monitor do + within_submenu do + click_element(:sidebar_menu_item_link, menu_item: 'Alerts') + end + end + end + private def hover_monitor diff --git a/qa/qa/specs/features/browser_ui/8_monitor/.gitkeep b/qa/qa/specs/features/browser_ui/8_monitor/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/qa/qa/specs/features/browser_ui/8_monitor/incident_management/http_endpoint_integration_creates_alert_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/incident_management/http_endpoint_integration_creates_alert_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..8ea728ca94c2751f0411c4dc7b138f2a5135d1c8 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/8_monitor/incident_management/http_endpoint_integration_creates_alert_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Monitor', product_group: :respond do + describe 'Http endpoint integration' do + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'project-for-alerts' + project.description = 'Project for alerts' + end + end + + let(:random_word) { Faker::Lorem.word } + + let(:payload) do + { title: random_word, description: random_word } + end + + before do + Flow::Login.sign_in + project.visit! + Flow::AlertSettings.setup_http_endpoint_and_send_alert(payload: payload) + end + + it( + 'can send test alert that creates new alert', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/382803' + ) do + Page::Project::Menu.perform(&:go_to_monitor_alerts) + Page::Project::Monitor::Alerts::Index.perform do |alerts| + expect(alerts).to have_alert_with_title(random_word) + end + end + end + end +end diff --git a/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap b/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap index 4693d5a47e4c9d451975f55b7985ad2bb9e015c1..bff4905a12cd6181f5d52211736c3631f0abcdb2 100644 --- a/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap +++ b/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap @@ -16,7 +16,7 @@ exports[`Alert integration settings form default state should match the default > <gl-form-checkbox-stub checked="true" - data-qa-selector="create_issue_checkbox" + data-qa-selector="create_incident_checkbox" id="2" > <span>