diff options
Diffstat (limited to 'qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb')
-rw-r--r-- | qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb new file mode 100644 index 00000000000..70874e46f27 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb @@ -0,0 +1,149 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Monitor', :orchestrated, :smtp, :requires_admin, product_group: :respond do + describe 'Alert' do + shared_examples 'notification on new alert', :aggregate_failures do + it 'sends email to user' do + expect { email_subjects }.to eventually_include(alert_email_subject).within(max_duration: 60) + expect(recipient_email_addresses).to include(user.email) + end + end + + let!(:admin_api_client) { Runtime::API::Client.as_admin } + + let!(:user) do + Resource::User.fabricate_via_api! do |user| + user.api_client = admin_api_client + user.hard_delete_on_api_removal = true + end + end + + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'project-for-alerts' + project.description = 'Project for alerts' + end + end + + let(:alert_title) { Faker::Lorem.word } + let(:mail_hog_api) { Vendor::MailHog::API.new } + let(:alert_email_subject) { "#{project.name} | Alert: #{alert_title}" } + let(:http_payload) { { title: alert_title, description: alert_title } } + + let(:prometheus_payload) do + { + version: '4', + groupKey: nil, + status: 'firing', + receiver: '', + groupLabels: {}, + commonLabels: {}, + commonAnnotations: {}, + externalURL: '', + alerts: [ + { + startsAt: Time.now, + generatorURL: Faker::Internet.url, + endsAt: nil, + status: 'firing', + labels: { gitlab_environment_name: Faker::Lorem.word }, + annotations: + { + title: alert_title, + gitlab_y_label: 'status' + } + } + ] + } + end + + before do + Flow::Login.sign_in + project.visit! + Flow::AlertSettings.go_to_monitor_settings + Flow::AlertSettings.enable_email_notification + end + + context 'when user is a maintainer' do + before do + project.add_member(user, Resource::Members::AccessLevel::MAINTAINER) + end + + context( + 'when using HTTP endpoint integration', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/389993' + ) do + before do + send_http_alert + end + + it_behaves_like 'notification on new alert' + end + + context( + 'when using Prometheus integration', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/389994' + ) do + before do + send_prometheus_alert + end + + it_behaves_like 'notification on new alert' + end + end + + context 'when user is an owner' do + before do + project.add_member(user, Resource::Members::AccessLevel::OWNER) + end + + context( + 'when using HTTP endpoint integration', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/390145' + ) do + before do + send_http_alert + end + + it_behaves_like 'notification on new alert' + end + + context( + 'when using Prometheus integration', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/390144' + ) do + before do + send_prometheus_alert + end + + it_behaves_like 'notification on new alert' + end + end + + private + + def send_http_alert + Flow::AlertSettings.setup_http_endpoint_integration + Flow::AlertSettings.send_test_alert(payload: http_payload) + end + + def send_prometheus_alert + Flow::AlertSettings.setup_prometheus_integration + Flow::AlertSettings.send_test_alert(payload: prometheus_payload) + end + + def mail_hog_messages + mail_hog_api.fetch_messages + end + + def email_subjects + mail_hog_messages.map(&:subject) + end + + def recipient_email_addresses + mail_hog_messages.map(&:to) + end + end + end +end |