Forum: RSpec Problem spec'ing ActionMailer with attachment, body not getting rendered.

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Rick D. (Guest)
on 2009-03-18 23:04
(Received via mailing list)
I've got a simple ActionMailer::Base subclass:
class InfoMailer < ActionMailer::Base

    def info(user, zip_name)
    recipients user.email
    subject "Requested Info"
    attachment(:content_type => "application/zip",
                :filename => zip_name,
                :body => File.read(zip_name))
    body(:message => "Here is the Info that you Requested")
  end
end

I'm trying to spec this following
http://www.rubytutorials.net/2008/02/26/small-rspe...

describe AssetsInfoMailer do
  before(:each) do
    @user = mock_model(User,
        :email => @user_email = "removed_email_address@domain.invalid",
        :full_name => "The Wicked Witch of the West"
        )
    ActionMailer::Base.delivery_method = :test
    ActionMailer::Base.perform_deliveries = true
    ActionMailer::Base.deliveries = []
  end

  describe ".info" do
    before(:each) do
      @path = 'xyz.zip'
      @attachment_body = 'zip_file_contents'
      File.stub!(:read).and_return(@attachment_body)
      @the_mail = AssetsInfoMailer.deliver_info(@user,@path)
      @attachments = @the_mail.attachments
    end

    it "should have the right body" do
      @the_mail.body.should == ""
    end
  end

The expectation of an empty string is just to see what's actually
getting
returned, the result is:

1)
'AssetsInfoMailer.info should have the right body' FAILED
expected: "",
     got: "Attachment: xyz.zip\n" (using ==)

It's looking like the mail template never got rendered, and body is
giving
me the attachment since it's the only part.

I've got one other mailer method in that mailer which doesn't contain an
attachement, and it's body comes out fine.

I'm not sure what's going on here, and I'd appreciate any
help/insight/condolences...



--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
Rick D. (Guest)
on 2009-03-18 23:17
(Received via mailing list)
On Wed, Mar 18, 2009 at 4:28 PM, Rick DeNatale
<removed_email_address@domain.invalid>wrote:

>   end
>         )
>       @the_mail = AssetsInfoMailer.deliver_info(@user,@path)
>
>
> I'm not sure what's going on here, and I'd appreciate any
> help/insight/condolences...
>
Note that I screwed up in sanitizing the code, the mailer really is
AssetsInfoManager, and that's what's in the spec consistently.
Zach D. (Guest)
on 2009-03-20 17:26
(Received via mailing list)
2009/3/18 Rick DeNatale <removed_email_address@domain.invalid>:
>   end
>     ActionMailer::Base.perform_deliveries = true
>
> It's looking like the mail template never got rendered, and body is giving
> me the attachment since it's the only part.
> I've got one other mailer method in that mailer which doesn't contain an
> attachement, and it's body comes out fine.
> I'm not sure what's going on here, and I'd appreciate any
> help/insight/condolences...
>

When sending attachments emails are sent as multipart messages. The
only part being specified is the attachment. The other call to "body"
is being ignored. Try something like:

def info(user, zip_name)
  recipients user.email
  subject "Requested Info"
  attachment(:content_type => "application/zip",
              :filename => zip_name,
              :body => File.read(zip_name))
  part "text/plain" do |p|
    p.body(:message => "Here is the Info that you Requested")
  end
end

Also when you look at the email you'll have look at its #parts
otherwise @the_mail.body is going to returned the body representation
of each part concatenated.



> removed_email_address@domain.invalid
> http://rubyforge.org/mailman/listinfo/rspec-users
>



--
Zach D.
http://www.continuousthinking.com
http://www.mutuallyhuman.com
Zach D. (Guest)
on 2009-03-20 18:06
(Received via mailing list)
On Fri, Mar 20, 2009 at 11:11 AM, Zach D. <removed_email_address@domain.invalid>
wrote:
>>     body(:message => "Here is the Info that you Requested")
>>     ActionMailer::Base.delivery_method = :test
>>     end
>>      got: "Attachment: xyz.zip\n" (using ==)
> is being ignored. Try something like:
> end
I just tried my out, and while it does work because there are multiple
parts specified, also re-ordering of the initial #body to come before
the attachment doesn't seem to help with the original code either.

I'm curious now what you do find out and which route you decide to go,
keep us posted either way Rick.

>> Blog: http://talklikeaduck.denhaven2.com/
>
>
> --
> Zach D.
> http://www.continuousthinking.com
> http://www.mutuallyhuman.com
>



--
Zach D.
http://www.continuousthinking.com
http://www.mutuallyhuman.com
Rick D. (Guest)
on 2009-03-21 22:54
(Received via mailing list)
On Fri, Mar 20, 2009 at 11:46 AM, Zach D. <removed_email_address@domain.invalid>
wrote:

> >>                 :filename => zip_name,
> >>         :email => @user_email = "removed_email_address@domain.invalid",
> >>       File.stub!(:read).and_return(@attachment_body)
> >> returned, the result is:
> >> help/insight/condolences...
> >              :filename => zip_name,
> I'm curious now what you do find out and which route you decide to go,
> keep us posted either way Rick.


I ende up with pretty much the above, but with

   p.body(render_message('info', :message =>...

since there was a template to render.
This topic is locked and can not be replied to.