RedisCacheMailerDelivery
This gem is inspired by https://github.com/p0deje/action_mailer_cache_delivery.
If you are using Resque for sending mails asynchronously, and you want to test the mail sending asynchronously in your integration tests, then you can use this gem for just that.
The gem adds a new delivery method to the ActionMailer and it stores the marshaled Mail::Message being delivered into a redis list which can be fetched by any other processes.
A separate Resque worker process deliver emails, which being written into a redis storage. The test process (such as a cucumber step can then fetch the mail for examination).
Installation
Add this line to your application's Gemfile:
gem 'redis_cache_mailer_delivery'
And then execute:
$ bundle
Or install it yourself as:
$ gem install redis_cache_mailer_delivery
Usage
In a Rails project, in your environment files such as config/environments/cucumber.rb
config.action_mailer.delivery_method = :redis_cache
config.action_mailer.redis_cache_settings = { :redis_key_name => "a_key_name_for_all_stored_emails",
:marshallable_converters => [:sequel_record_marshallable, Marshallable::Attrubute1] }
You don't have to define the settings, the default redis_key_name
is
"redis_cache_mailer_delivery:mail_messages"
the default marshallable_converters
is an empty array
The meaning of marshallable_converters
will be discussed in the next section.
All the mails being delivered will be written into the redis storage. You can use
RedisCacheMailerDelivery::Deliveries.all
to access all the mails
Marshallable Converters
If you use Sequel and you set a sequel record into the Mail::Message (mail.record = record
), the chances are you will encounter an error where you cannot serialize the message since the record might be a singleton.
The remedy provided by this gem is to provide a mechanism to make the mail to be marshallable before it marshals it, as well as some built-in class for making the object to be marshallable.
marshallable_converters
setting accepts an array. Each element could be a symbol, or a class.
When it is a class, the class must have a class method marshallable
which accpets the mail object as the only param. The method will take the mail and convert it into a marshallable object.
When it is a symbol, it means it is a built-in converter. For example :sequel_record_marshallable
will convert a Mail::Message containg a singlton Sequel record into marshallable one by use Sequel's marshallable!
method.
Currently the built-in only converter is :sequel_record_marshallable
The order of the :marshallable_converters
could be important. The gem always goes through the converters in the order.
So for example, if you have:
config.action_mailer.redis_cache_settings = { :marshallable_converters => [Marshallable::Attrubute2, Marshallable::Attrubute1] }
The gem calls: object1 = Marshallable::Attrubute2.marshallable(mail)
, then it calls object2 = Marshallable::Attrubute1.marshallable(object1)
So if you must have attrubute1
to be marshallable first, then make the attrubute2
marshallable. You have to switch the order in this example.
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request