ruby on rails - Cómo probar los encabezados de correo electrónico utilizando RSpec
ruby-on-rails ruby-on-rails-3.1 (1)
Estoy usando la API SMTP de SendGrid en mi aplicación Rails para enviar correos electrónicos. Sin embargo, tengo problemas para probar el encabezado del correo electrónico ("X-SMTPAPI") usando RSpec.
Así es como se ve el correo electrónico (recuperándose de ActionMailer :: Base.deliveries):
#<Mail::Message:2189335760, Multipart: false, Headers:
<Date: Tue, 20 Dec 2011 16:14:25 +0800>,
<From: "Acme Inc" <[email protected]>>,
<To: [email protected]>,
<Message-ID: <[email protected]>>,
<Subject: Your Acme order>, <Mime-Version: 1.0>,
<Content-Type: text/plain>, <Content-Transfer-Encoding: 7bit>,
<X-SMTPAPI: {"sub":{"|last_name|":[Foo],"|first_name|":[Bar]},"to":["[email protected]"]}>>
Aquí está mi código de especificación (que falló):
ActionMailer::Base.deliveries.last.to.should include("[email protected]")
También probé varios métodos para recuperar el encabezado ("X-SMTPAPI") y tampoco funcionó:
mail = ActionMailer::Base.deliveries.last
mail.headers("X-SMTPAPI") #NoMethodError: undefined method `each_pair'' for "X-SMTPAPI":String
¿Ayuda?
Actualizar (respuesta)
Resulta que puedo hacer esto para recuperar el valor del encabezado del correo electrónico:
mail.header[''X-SMTPAPI''].value
Sin embargo, el valor devuelto está en formato JSON. Entonces, todo lo que necesito hacer es decodificarlo:
sendgrid_header = ActiveSupport::JSON.decode(mail.header[''X-SMTPAPI''].value)
que devuelve un hash, donde puedo hacer esto:
sendgrid_header["to"]
para recuperar la matriz de direcciones de correo electrónico.
La gema email_spec tiene un montón de comparadores que hacen esto más fácil, puedes hacer cosas como
mail.should have_header(''X-SMTPAPI'', some_value)
mail.should deliver_to(''[email protected]'')
Y leer la fuente de esa gema debería apuntarle en la dirección correcta si no quiere usarla, por ejemplo.
mail.to.addrs
le devuelve las direcciones de correo electrónico (a diferencia de cosas como ''Bob'')
y
mail.header[''foo'']
obtiene el campo para el encabezado foo (dependiendo de lo que esté verificando, es posible que desee llamar a to_s
para obtener el valor del campo real)