discourse/spec/system/page_objects/pages/admin_email_logs.rb
Krzysztof Kotlarek 36ae47edd2
FEATURE: Display bounce details for bounced emails with bounce keys (#35957)
Adds an info button to the bounced email logs table for emails that have
a bounce key. Clicking the button opens a modal showing the incoming
email details including the bounce error message.

This helps administrators diagnose email delivery issues by providing
direct access to bounce information from the bounced emails list.

Button was incorrectly removed during refactoring in this PR -
https://github.com/discourse/discourse/pull/34015
2025-11-12 09:26:27 +08:00

148 lines
3.5 KiB
Ruby
Vendored

# frozen_string_literal: true
module PageObjects
module Pages
class AdminEmailLogs < PageObjects::Pages::AdminBase
class BaseRow
attr_reader :element
def initialize(element)
@element = element
end
end
class IncomingEmailRow < BaseRow
def has_subject_link?(subject, href)
element.has_link?(subject, href:)
end
def has_from_address?(from_address)
element.has_css?("td:nth-of-type(2)", text: from_address)
end
def has_to_address?(to_address)
element.has_css?("td:nth-of-type(3)", text: to_address)
end
def has_subject?(subject)
element.has_css?("td:nth-of-type(4)", text: subject)
end
def has_error?(error)
element.has_css?("td:nth-of-type(5)", text: error)
end
def open_incoming_email
element.find(".incoming-email-link").click
PageObjects::Modals::AdminIncomingEmailDetailsModal.new
end
end
class EmailLogRow < BaseRow
def has_user?(username)
if username.present?
element.has_css?(".email-logs-user", text: username)
else
element.has_no_css?(".email-logs-user")
end
end
def has_to_address?(to_address)
element.has_css?("td:nth-of-type(3)", text: to_address)
end
def has_email_type?(email_type)
element.has_css?("td:nth-of-type(4)", text: email_type)
end
end
class BouncedEmailLogRow < EmailLogRow
def has_info_button?
element.has_css?(".email-details a")
end
def has_no_info_button?
element.has_no_css?(".email-details a")
end
def open_incoming_email
element.find(".email-details a").click
PageObjects::Modals::AdminIncomingEmailDetailsModal.new
end
end
class SentEmailLogRow < EmailLogRow
def has_reply_key?(reply_key)
element.has_css?("td:nth-of-type(5) .reply-key", text: reply_key)
end
def has_post_description?(description)
element.has_css?("td:nth-of-type(6)", text: description)
end
def has_smtp_response?(response)
element.has_css?("td:nth-of-type(6) code", text: response)
end
end
class SkippedEmailLogRow < EmailLogRow
def has_skipped_reason?(reason)
element.has_css?("td:nth-of-type(5)", text: reason)
end
end
def visit_rejected
visit_logs(:rejected)
self
end
def visit_received
visit_logs(:received)
self
end
def visit_bounced
visit_logs(:bounced)
self
end
def visit_skipped
visit_logs(:skipped)
self
end
def visit_sent
visit_logs(:sent)
self
end
def row_for(record)
element = find("[data-test-email-log-row-id=\"#{record.id}\"]")
row_class.new(element)
end
private
def row_class
case @current_log_status
when :rejected, :received
IncomingEmailRow
when :skipped
SkippedEmailLogRow
when :sent
SentEmailLogRow
when :bounced
BouncedEmailLogRow
else
EmailLogRow
end
end
def visit_logs(status)
@current_log_status = status.to_sym
page.visit("/admin/email-logs/#{@current_log_status == :sent ? nil : status}")
self
end
end
end
end