Class: Studio::EmailSmoke

Inherits:
Object
  • Object
show all
Defined in:
lib/studio/email_smoke.rb

Defined Under Namespace

Classes: NonExternalDeliveryError, Result

Constant Summary collapse

NON_EXTERNAL_METHODS =
%w[test file].freeze

Class Method Summary collapse

Class Method Details

.deliver(to:, action_mailer: defined?(ActionMailer) ? ActionMailer::Base : nil, env: ENV, app_name: defined?(Studio) && Studio.respond_to?(:app_name) ? Studio.app_name : "Studio", require_external: true, clock: Time) ⇒ Object

Raises:

  • (ArgumentError)


47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/studio/email_smoke.rb', line 47

def deliver(to:,
            action_mailer: defined?(ActionMailer) ? ActionMailer::Base : nil,
            env: ENV,
            app_name: defined?(Studio) && Studio.respond_to?(:app_name) ? Studio.app_name : "Studio",
            require_external: true,
            clock: Time)
  raise ArgumentError, "action_mailer is required" unless action_mailer

  recipient = to.to_s.strip
  raise ArgumentError, "recipient email is required" if recipient.empty?

  from = sender(env)
  subject = "#{app_name} email smoke test"
  body = body_for(
    app_name: app_name,
    to: recipient,
    from: from,
    transport: transport_label(action_mailer: action_mailer, env: env),
    delivery_method: action_mailer.delivery_method,
    perform_deliveries: action_mailer.perform_deliveries,
    sent_at: clock.now.utc
  )
  result = result_for(
    app_name: app_name,
    to: recipient,
    from: from,
    subject: subject,
    action_mailer: action_mailer,
    env: env
  )

  if require_external && !result.external_delivery
    raise NonExternalDeliveryError, result
  end

  message = action_mailer.mail(
    to: recipient,
    from: from,
    subject: subject,
    body: body
  )
  delivered = message.deliver_now
  result.message_id = delivered.message_id if delivered.respond_to?(:message_id)
  result
end

.external_delivery?(action_mailer:, env: ENV) ⇒ Boolean

Returns:

  • (Boolean)


123
124
125
126
127
128
# File 'lib/studio/email_smoke.rb', line 123

def external_delivery?(action_mailer:, env: ENV)
  return false if studio_local_email_capture?

  delivery_method = action_mailer.delivery_method.to_s
  !!action_mailer.perform_deliveries && !NON_EXTERNAL_METHODS.include?(delivery_method)
end

.result_for(app_name:, to:, from:, subject:, action_mailer:, env: ENV) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/studio/email_smoke.rb', line 93

def result_for(app_name:, to:, from:, subject:, action_mailer:, env: ENV)
  delivery_method = action_mailer.delivery_method.to_s
  Result.new(
    app_name: app_name,
    to: to,
    from: from,
    subject: subject,
    transport: transport_label(action_mailer: action_mailer, env: env),
    delivery_method: delivery_method,
    perform_deliveries: !!action_mailer.perform_deliveries,
    external_delivery: external_delivery?(action_mailer: action_mailer, env: env)
  )
end

.sender(env = ENV) ⇒ Object



107
108
109
110
111
# File 'lib/studio/email_smoke.rb', line 107

def sender(env = ENV)
  studio_value(:mailer_from) ||
    env_value(env, "MAILER_FROM") ||
    "McRitchie Studio <team@mcritchie.studio>"
end

.transport_label(action_mailer:, env: ENV) ⇒ Object



113
114
115
116
117
118
119
120
121
# File 'lib/studio/email_smoke.rb', line 113

def transport_label(action_mailer:, env: ENV)
  return "capture" if studio_local_email_capture?
  return "ses" if studio_ses_transport_ready?(env)

  delivery_method = action_mailer.delivery_method.to_s
  return "resend" if delivery_method == "resend"

  delivery_method.empty? ? "unknown" : delivery_method
end