mailgun-ruby 1.2.4 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +1 -1
 - data/docs/OptInHandler.md +1 -1
 - data/lib/mailgun/client.rb +17 -3
 - data/lib/mailgun/exceptions/exceptions.rb +9 -1
 - data/lib/mailgun/messages/message_builder.rb +39 -2
 - data/lib/mailgun/version.rb +1 -1
 - data/lib/mailgun-ruby.rb +1 -1
 - data/lib/railgun/mailer.rb +24 -8
 - data/lib/railgun/message.rb +2 -1
 - data/spec/integration/mailer_spec.rb +67 -0
 - data/spec/integration/mailgun_spec.rb +4 -1
 - data/spec/unit/connection/test_client.rb +18 -1
 - data/spec/unit/mailgun_spec.rb +43 -2
 - data/spec/unit/messages/batch_message_spec.rb +56 -41
 - data/spec/unit/messages/message_builder_spec.rb +113 -4
 - data/spec/unit/railgun/mailer_spec.rb +146 -0
 - data/vcr_cassettes/mailer_invalid_domain.yml +109 -0
 - data/vcr_cassettes/message_deliver.yml +149 -0
 - metadata +10 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 9dd7b99f66b317ffcbf86172b1534cdcb0ccf4b0b25a7b2e58599f20ef021f11
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 8b130d3344fe905d20d4230cb8b178d29b092ffa6d21c3dbb085376aa53b50a0
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 34729e98ab4eb8cbfd04bdb5b7a090a30cb4a1961de9ef38e0adcab2d452e5873477d9b45de9703a6c5885b272a3d62429ece40ff6029bff2bbb0d8585a89410
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 235e7aed52a937315019498bbb710e90b97128d9fdfad86bfb0995daf9d25f8185683769fd84b32e4eda4c64774b49a708a57da90ccd473e7d69f0e967eed581
         
     | 
    
        data/README.md
    CHANGED
    
    
    
        data/docs/OptInHandler.md
    CHANGED
    
    | 
         @@ -100,4 +100,4 @@ Available Functions 
     | 
|
| 
       100 
100 
     | 
    
         | 
| 
       101 
101 
     | 
    
         
             
            More Documentation
         
     | 
| 
       102 
102 
     | 
    
         
             
            ------------------
         
     | 
| 
       103 
     | 
    
         
            -
            See the official [Mailgun Docs](https://documentation.mailgun.com/api-sending.html) for more information.
         
     | 
| 
      
 103 
     | 
    
         
            +
            See the official [Mailgun Docs](https://documentation.mailgun.com/en/latest/api-sending.html) for more information.
         
     | 
    
        data/lib/mailgun/client.rb
    CHANGED
    
    | 
         @@ -15,7 +15,8 @@ module Mailgun 
     | 
|
| 
       15 
15 
     | 
    
         
             
                               api_version = 'v3',
         
     | 
| 
       16 
16 
     | 
    
         
             
                               ssl = true,
         
     | 
| 
       17 
17 
     | 
    
         
             
                               test_mode = false,
         
     | 
| 
       18 
     | 
    
         
            -
                               timeout = nil 
     | 
| 
      
 18 
     | 
    
         
            +
                               timeout = nil,
         
     | 
| 
      
 19 
     | 
    
         
            +
                               proxy_url = nil)
         
     | 
| 
       19 
20 
     | 
    
         | 
| 
       20 
21 
     | 
    
         
             
                  rest_client_params = {
         
     | 
| 
       21 
22 
     | 
    
         
             
                    user: 'api',
         
     | 
| 
         @@ -25,6 +26,7 @@ module Mailgun 
     | 
|
| 
       25 
26 
     | 
    
         
             
                  rest_client_params[:timeout] = timeout if timeout
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
                  endpoint = endpoint_generator(api_host, api_version, ssl)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  RestClient.proxy = proxy_url
         
     | 
| 
       28 
30 
     | 
    
         
             
                  @http_client = RestClient::Resource.new(endpoint, rest_client_params)
         
     | 
| 
       29 
31 
     | 
    
         
             
                  @test_mode = test_mode
         
     | 
| 
       30 
32 
     | 
    
         
             
                end
         
     | 
| 
         @@ -64,13 +66,13 @@ module Mailgun 
     | 
|
| 
       64 
66 
     | 
    
         
             
                # containing required parameters for the requested resource.
         
     | 
| 
       65 
67 
     | 
    
         
             
                # @return [Mailgun::Response] A Mailgun::Response object.
         
     | 
| 
       66 
68 
     | 
    
         
             
                def send_message(working_domain, data)
         
     | 
| 
       67 
     | 
    
         
            -
                   
     | 
| 
      
 69 
     | 
    
         
            +
                  perform_data_validation(working_domain, data)
         
     | 
| 
       68 
70 
     | 
    
         | 
| 
       69 
71 
     | 
    
         
             
                  if test_mode? then
         
     | 
| 
       70 
72 
     | 
    
         
             
                    Mailgun::Client.deliveries << data
         
     | 
| 
       71 
73 
     | 
    
         
             
                    return Response.from_hash(
         
     | 
| 
       72 
74 
     | 
    
         
             
                      {
         
     | 
| 
       73 
     | 
    
         
            -
                        :body =>  
     | 
| 
      
 75 
     | 
    
         
            +
                        :body => "{\"id\": \"test-mode-mail-#{SecureRandom.uuid}@localhost\", \"message\": \"Queued. Thank you.\"}",
         
     | 
| 
       74 
76 
     | 
    
         
             
                        :code => 200,
         
     | 
| 
       75 
77 
     | 
    
         
             
                      }
         
     | 
| 
       76 
78 
     | 
    
         
             
                    )
         
     | 
| 
         @@ -202,5 +204,17 @@ module Mailgun 
     | 
|
| 
       202 
204 
     | 
    
         
             
                  CommunicationError.new(e.message)
         
     | 
| 
       203 
205 
     | 
    
         
             
                end
         
     | 
| 
       204 
206 
     | 
    
         | 
| 
      
 207 
     | 
    
         
            +
                def perform_data_validation(working_domain, data)
         
     | 
| 
      
 208 
     | 
    
         
            +
                  message = data.respond_to?(:message) ? data.message : data
         
     | 
| 
      
 209 
     | 
    
         
            +
                  fail ParameterError.new('Missing working domain', working_domain) unless working_domain
         
     | 
| 
      
 210 
     | 
    
         
            +
                  fail ParameterError.new(
         
     | 
| 
      
 211 
     | 
    
         
            +
                    'Missing `to` recipient, message should containg at least 1 recipient',
         
     | 
| 
      
 212 
     | 
    
         
            +
                    working_domain
         
     | 
| 
      
 213 
     | 
    
         
            +
                  ) if message.fetch('to', []).empty? && message.fetch(:to, []).empty?
         
     | 
| 
      
 214 
     | 
    
         
            +
                  fail ParameterError.new(
         
     | 
| 
      
 215 
     | 
    
         
            +
                    'Missing a `from` sender, message should containg at least 1 `from` sender',
         
     | 
| 
      
 216 
     | 
    
         
            +
                    working_domain
         
     | 
| 
      
 217 
     | 
    
         
            +
                  ) if message.fetch('from', []).empty? && message.fetch(:from, []).empty?
         
     | 
| 
      
 218 
     | 
    
         
            +
                end
         
     | 
| 
       205 
219 
     | 
    
         
             
              end
         
     | 
| 
       206 
220 
     | 
    
         
             
            end
         
     | 
| 
         @@ -34,6 +34,7 @@ module Mailgun 
     | 
|
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
                # Public: fallback if there is no response code on the object
         
     | 
| 
       36 
36 
     | 
    
         
             
                NOCODE = 000
         
     | 
| 
      
 37 
     | 
    
         
            +
                FORBIDDEN = 'Forbidden'
         
     | 
| 
       37 
38 
     | 
    
         | 
| 
       38 
39 
     | 
    
         
             
                # Public: initialization of new error given a message and/or object
         
     | 
| 
       39 
40 
     | 
    
         
             
                #
         
     | 
| 
         @@ -42,7 +43,11 @@ module Mailgun 
     | 
|
| 
       42 
43 
     | 
    
         
             
                #
         
     | 
| 
       43 
44 
     | 
    
         
             
                def initialize(message = nil, response = nil)
         
     | 
| 
       44 
45 
     | 
    
         
             
                  @response = response
         
     | 
| 
       45 
     | 
    
         
            -
                  @code = response. 
     | 
| 
      
 46 
     | 
    
         
            +
                  @code = if response.nil?
         
     | 
| 
      
 47 
     | 
    
         
            +
                            NOCODE
         
     | 
| 
      
 48 
     | 
    
         
            +
                          else
         
     | 
| 
      
 49 
     | 
    
         
            +
                            response.code
         
     | 
| 
      
 50 
     | 
    
         
            +
                          end
         
     | 
| 
       46 
51 
     | 
    
         | 
| 
       47 
52 
     | 
    
         
             
                  begin
         
     | 
| 
       48 
53 
     | 
    
         
             
                    api_message = JSON.parse(response.body)['message']
         
     | 
| 
         @@ -50,7 +55,10 @@ module Mailgun 
     | 
|
| 
       50 
55 
     | 
    
         
             
                    api_message = response.body
         
     | 
| 
       51 
56 
     | 
    
         
             
                  rescue NoMethodError
         
     | 
| 
       52 
57 
     | 
    
         
             
                    api_message = "Unknown API error"
         
     | 
| 
      
 58 
     | 
    
         
            +
                  rescue
         
     | 
| 
      
 59 
     | 
    
         
            +
                    api_message = 'Unknown API error'
         
     | 
| 
       53 
60 
     | 
    
         
             
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
                  api_message = api_message + ' - Invalid Domain or API key' if api_message == FORBIDDEN
         
     | 
| 
       54 
62 
     | 
    
         | 
| 
       55 
63 
     | 
    
         
             
                  message = message || ''
         
     | 
| 
       56 
64 
     | 
    
         
             
                  message = message + ': ' + api_message
         
     | 
| 
         @@ -198,7 +198,9 @@ module Mailgun 
     | 
|
| 
       198 
198 
     | 
    
         
             
                # @param [Boolean] tracking Boolean true or false.
         
     | 
| 
       199 
199 
     | 
    
         
             
                # @return [void]
         
     | 
| 
       200 
200 
     | 
    
         
             
                def track_opens(mode)
         
     | 
| 
       201 
     | 
    
         
            -
                   
     | 
| 
      
 201 
     | 
    
         
            +
                  value = bool_lookup(mode)
         
     | 
| 
      
 202 
     | 
    
         
            +
                  set_single('o:tracking-opens', value)
         
     | 
| 
      
 203 
     | 
    
         
            +
                  set_multi_simple('o:tracking', value)
         
     | 
| 
       202 
204 
     | 
    
         
             
                end
         
     | 
| 
       203 
205 
     | 
    
         | 
| 
       204 
206 
     | 
    
         
             
                # Deprecated: 'set_open_tracking' is deprecated. Please use 'track_opens' instead.
         
     | 
| 
         @@ -212,7 +214,9 @@ module Mailgun 
     | 
|
| 
       212 
214 
     | 
    
         
             
                # @param [String] mode True, False, or HTML (for HTML only tracking)
         
     | 
| 
       213 
215 
     | 
    
         
             
                # @return [void]
         
     | 
| 
       214 
216 
     | 
    
         
             
                def track_clicks(mode)
         
     | 
| 
       215 
     | 
    
         
            -
                   
     | 
| 
      
 217 
     | 
    
         
            +
                  value = bool_lookup(mode)
         
     | 
| 
      
 218 
     | 
    
         
            +
                  set_single('o:tracking-clicks', value)
         
     | 
| 
      
 219 
     | 
    
         
            +
                  set_multi_simple('o:tracking', value)
         
     | 
| 
       216 
220 
     | 
    
         
             
                end
         
     | 
| 
       217 
221 
     | 
    
         | 
| 
       218 
222 
     | 
    
         
             
                # Depreciated: 'set_click_tracking. is deprecated. Please use 'track_clicks' instead.
         
     | 
| 
         @@ -308,6 +312,38 @@ module Mailgun 
     | 
|
| 
       308 
312 
     | 
    
         
             
                  message_id data
         
     | 
| 
       309 
313 
     | 
    
         
             
                end
         
     | 
| 
       310 
314 
     | 
    
         | 
| 
      
 315 
     | 
    
         
            +
                # Set name of a template stored via template API. See Templates for more information
         
     | 
| 
      
 316 
     | 
    
         
            +
                # https://documentation.mailgun.com/en/latest/api-templates.html
         
     | 
| 
      
 317 
     | 
    
         
            +
                #
         
     | 
| 
      
 318 
     | 
    
         
            +
                # @param [String] tag A defined template name to use. Passing nil or
         
     | 
| 
      
 319 
     | 
    
         
            +
                #   empty string will delete template key and value from @message hash.
         
     | 
| 
      
 320 
     | 
    
         
            +
                # @return [void]
         
     | 
| 
      
 321 
     | 
    
         
            +
                def template(template_name = nil)
         
     | 
| 
      
 322 
     | 
    
         
            +
                  key = 'template'
         
     | 
| 
      
 323 
     | 
    
         
            +
                  return @message.delete(key) if template_name.to_s.empty?
         
     | 
| 
      
 324 
     | 
    
         
            +
                  set_single(key, template_name)
         
     | 
| 
      
 325 
     | 
    
         
            +
                end
         
     | 
| 
      
 326 
     | 
    
         
            +
             
     | 
| 
      
 327 
     | 
    
         
            +
                # Set specific template version.
         
     | 
| 
      
 328 
     | 
    
         
            +
                #
         
     | 
| 
      
 329 
     | 
    
         
            +
                # @param [String] tag A defined template name to use. Passing nil or
         
     | 
| 
      
 330 
     | 
    
         
            +
                #   empty string will delete template key and value from @message hash.
         
     | 
| 
      
 331 
     | 
    
         
            +
                # @return [void]
         
     | 
| 
      
 332 
     | 
    
         
            +
                def template_version(version = nil)
         
     | 
| 
      
 333 
     | 
    
         
            +
                  key = 't:version'
         
     | 
| 
      
 334 
     | 
    
         
            +
                  return @message.delete(key) if version.to_s.empty?
         
     | 
| 
      
 335 
     | 
    
         
            +
                  set_single(key, version)
         
     | 
| 
      
 336 
     | 
    
         
            +
                end
         
     | 
| 
      
 337 
     | 
    
         
            +
             
     | 
| 
      
 338 
     | 
    
         
            +
                # Turn off or on template rendering in the text part
         
     | 
| 
      
 339 
     | 
    
         
            +
                # of the message in case of template sending.
         
     | 
| 
      
 340 
     | 
    
         
            +
                #
         
     | 
| 
      
 341 
     | 
    
         
            +
                # @param [Boolean] tracking Boolean true or false.
         
     | 
| 
      
 342 
     | 
    
         
            +
                # @return [void]
         
     | 
| 
      
 343 
     | 
    
         
            +
                def template_text(mode)
         
     | 
| 
      
 344 
     | 
    
         
            +
                  set_single('t:text', bool_lookup(mode))
         
     | 
| 
      
 345 
     | 
    
         
            +
                end
         
     | 
| 
      
 346 
     | 
    
         
            +
             
     | 
| 
       311 
347 
     | 
    
         
             
                private
         
     | 
| 
       312 
348 
     | 
    
         | 
| 
       313 
349 
     | 
    
         
             
                # Sets a single value in the message hash where "multidict" features are not needed.
         
     | 
| 
         @@ -347,6 +383,7 @@ module Mailgun 
     | 
|
| 
       347 
383 
     | 
    
         
             
                def bool_lookup(value)
         
     | 
| 
       348 
384 
     | 
    
         
             
                  return 'yes' if %w(true yes yep).include? value.to_s.downcase
         
     | 
| 
       349 
385 
     | 
    
         
             
                  return 'no' if %w(false no nope).include? value.to_s.downcase
         
     | 
| 
      
 386 
     | 
    
         
            +
                  warn 'WARN: for bool type actions next values are prefered: true yes yep | false no nope | htmlonly'
         
     | 
| 
       350 
387 
     | 
    
         
             
                  value
         
     | 
| 
       351 
388 
     | 
    
         
             
                end
         
     | 
| 
       352 
389 
     | 
    
         | 
    
        data/lib/mailgun/version.rb
    CHANGED
    
    
    
        data/lib/mailgun-ruby.rb
    CHANGED
    
    | 
         @@ -1,2 +1,2 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'mailgun'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'railgun' if defined?(Rails)
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'railgun' if defined?(Rails) && defined?(ActionMailer)
         
     | 
    
        data/lib/railgun/mailer.rb
    CHANGED
    
    | 
         @@ -11,7 +11,7 @@ module Railgun 
     | 
|
| 
       11 
11 
     | 
    
         
             
              class Mailer
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
                # List of the headers that will be ignored when copying headers from `mail.header_fields`
         
     | 
| 
       14 
     | 
    
         
            -
                IGNORED_HEADERS = %w[ to from subject reply-to mime-version ]
         
     | 
| 
      
 14 
     | 
    
         
            +
                IGNORED_HEADERS = %w[ to from subject reply-to mime-version template ]
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                # [Hash] config ->
         
     | 
| 
       17 
17 
     | 
    
         
             
                #   Requires *at least* `api_key` and `domain` keys.
         
     | 
| 
         @@ -47,8 +47,11 @@ module Railgun 
     | 
|
| 
       47 
47 
     | 
    
         
             
                end
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         
             
                def deliver!(mail)
         
     | 
| 
      
 50 
     | 
    
         
            +
                  @mg_domain = set_mg_domain(mail)
         
     | 
| 
      
 51 
     | 
    
         
            +
                  mail[:domain] = nil if mail[:domain].present?
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
       50 
53 
     | 
    
         
             
                  mg_message = Railgun.transform_for_mailgun(mail)
         
     | 
| 
       51 
     | 
    
         
            -
                  response = @mg_client.send_message(@ 
     | 
| 
      
 54 
     | 
    
         
            +
                  response = @mg_client.send_message(@mg_domain, mg_message)
         
     | 
| 
       52 
55 
     | 
    
         | 
| 
       53 
56 
     | 
    
         
             
                  if response.code == 200 then
         
     | 
| 
       54 
57 
     | 
    
         
             
                    mg_id = response.to_h['id']
         
     | 
| 
         @@ -61,6 +64,14 @@ module Railgun 
     | 
|
| 
       61 
64 
     | 
    
         
             
                  @mg_client
         
     | 
| 
       62 
65 
     | 
    
         
             
                end
         
     | 
| 
       63 
66 
     | 
    
         | 
| 
      
 67 
     | 
    
         
            +
                private
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                # Set @mg_domain from mail[:domain] header if present, then remove it to prevent being sent.
         
     | 
| 
      
 70 
     | 
    
         
            +
                def set_mg_domain(mail)
         
     | 
| 
      
 71 
     | 
    
         
            +
                  return mail[:domain].value if mail[:domain]
         
     | 
| 
      
 72 
     | 
    
         
            +
                  domain
         
     | 
| 
      
 73 
     | 
    
         
            +
                end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
       64 
75 
     | 
    
         
             
              end
         
     | 
| 
       65 
76 
     | 
    
         | 
| 
       66 
77 
     | 
    
         
             
              module_function
         
     | 
| 
         @@ -78,16 +89,16 @@ module Railgun 
     | 
|
| 
       78 
89 
     | 
    
         
             
              def transform_for_mailgun(mail)
         
     | 
| 
       79 
90 
     | 
    
         
             
                message = build_message_object(mail)
         
     | 
| 
       80 
91 
     | 
    
         | 
| 
       81 
     | 
    
         
            -
                # v:* attributes (variables)
         
     | 
| 
       82 
     | 
    
         
            -
                mail.mailgun_variables.try(:each) do |k, v|
         
     | 
| 
       83 
     | 
    
         
            -
                  message["v:#{k}"] = JSON.dump(v)
         
     | 
| 
       84 
     | 
    
         
            -
                end
         
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
92 
     | 
    
         
             
                # o:* attributes (options)
         
     | 
| 
       87 
93 
     | 
    
         
             
                mail.mailgun_options.try(:each) do |k, v|
         
     | 
| 
       88 
94 
     | 
    
         
             
                  message["o:#{k}"] = v.dup
         
     | 
| 
       89 
95 
     | 
    
         
             
                end
         
     | 
| 
       90 
96 
     | 
    
         | 
| 
      
 97 
     | 
    
         
            +
                # t:* attributes (options)
         
     | 
| 
      
 98 
     | 
    
         
            +
                mail.mailgun_template_variables.try(:each) do |k, v|
         
     | 
| 
      
 99 
     | 
    
         
            +
                  message["t:#{k}"] = v.dup
         
     | 
| 
      
 100 
     | 
    
         
            +
                end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
       91 
102 
     | 
    
         
             
                # support for using ActionMailer's `headers()` inside of the mailer
         
     | 
| 
       92 
103 
     | 
    
         
             
                # note: this will filter out parameters such as `from`, `to`, and so forth
         
     | 
| 
       93 
104 
     | 
    
         
             
                #       as they are accepted as POST parameters on the message endpoint.
         
     | 
| 
         @@ -153,6 +164,7 @@ module Railgun 
     | 
|
| 
       153 
164 
     | 
    
         | 
| 
       154 
165 
     | 
    
         
             
                mb.from mail[:from]
         
     | 
| 
       155 
166 
     | 
    
         
             
                mb.reply_to(mail[:reply_to].to_s) if mail[:reply_to].present?
         
     | 
| 
      
 167 
     | 
    
         
            +
                mb.template(mail[:template].to_s) if mail[:template].present?
         
     | 
| 
       156 
168 
     | 
    
         
             
                mb.subject mail.subject
         
     | 
| 
       157 
169 
     | 
    
         
             
                mb.body_html extract_body_html(mail)
         
     | 
| 
       158 
170 
     | 
    
         
             
                mb.body_text extract_body_text(mail)
         
     | 
| 
         @@ -172,6 +184,11 @@ module Railgun 
     | 
|
| 
       172 
184 
     | 
    
         
             
                  end
         
     | 
| 
       173 
185 
     | 
    
         
             
                end
         
     | 
| 
       174 
186 
     | 
    
         | 
| 
      
 187 
     | 
    
         
            +
                # v:* attributes (variables)
         
     | 
| 
      
 188 
     | 
    
         
            +
                mail.mailgun_variables.try(:each) do |name, value|
         
     | 
| 
      
 189 
     | 
    
         
            +
                  mb.variable(name, value)
         
     | 
| 
      
 190 
     | 
    
         
            +
                end
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
       175 
192 
     | 
    
         
             
                return mb.message if mail.attachments.empty?
         
     | 
| 
       176 
193 
     | 
    
         | 
| 
       177 
194 
     | 
    
         
             
                mail.attachments.each do |attach|
         
     | 
| 
         @@ -233,5 +250,4 @@ module Railgun 
     | 
|
| 
       233 
250 
     | 
    
         
             
                return mail.html_part if mail.multipart?
         
     | 
| 
       234 
251 
     | 
    
         
             
                (mail.mime_type =~ /^text\/html$/i) && mail
         
     | 
| 
       235 
252 
     | 
    
         
             
              end
         
     | 
| 
       236 
     | 
    
         
            -
             
     | 
| 
       237 
253 
     | 
    
         
             
            end
         
     | 
    
        data/lib/railgun/message.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,67 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'json'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'logger'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'railgun'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'mailgun'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'mailgun/exceptions/exceptions'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            ActionMailer::Base.raise_delivery_errors = true
         
     | 
| 
      
 9 
     | 
    
         
            +
            Rails.logger = Logger.new('/dev/null')
         
     | 
| 
      
 10 
     | 
    
         
            +
            Rails.logger.level = Logger::DEBUG
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            class UnitTestMailer < ActionMailer::Base
         
     | 
| 
      
 13 
     | 
    
         
            +
              default from: 'unittest@example.org'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              def plain_message(address, from, subject, headers)
         
     | 
| 
      
 16 
     | 
    
         
            +
                headers(headers)
         
     | 
| 
      
 17 
     | 
    
         
            +
                mail(to: address, from: from, subject: subject) do |format|
         
     | 
| 
      
 18 
     | 
    
         
            +
                  format.text { render plain: 'Test!' }
         
     | 
| 
      
 19 
     | 
    
         
            +
                  format.html { render html: '<p>Test!</p>'.html_safe }
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            vcr_opts = { :cassette_name => 'message_deliver' }
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            describe 'Message deliver', vcr: vcr_opts do
         
     | 
| 
      
 27 
     | 
    
         
            +
              let(:domain) { TESTDOMAIN }
         
     | 
| 
      
 28 
     | 
    
         
            +
              let(:config) do
         
     | 
| 
      
 29 
     | 
    
         
            +
                {
         
     | 
| 
      
 30 
     | 
    
         
            +
                  api_key: APIKEY,
         
     | 
| 
      
 31 
     | 
    
         
            +
                  domain: domain
         
     | 
| 
      
 32 
     | 
    
         
            +
                }
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
              let(:mail) { UnitTestMailer.plain_message("bob@#{domain}", "bob@#{domain}", 'subject', {}) }
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              it 'successfully delivers message' do
         
     | 
| 
      
 37 
     | 
    
         
            +
                result = Railgun::Mailer.new(config).deliver!(mail)
         
     | 
| 
      
 38 
     | 
    
         
            +
                result.to_h!
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                expect(result.body['message']).to eq('Queued. Thank you.')
         
     | 
| 
      
 41 
     | 
    
         
            +
                expect(result.body).to include('id')
         
     | 
| 
      
 42 
     | 
    
         
            +
                expect(result.code).to eq(200)
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            vcr_opts = { :cassette_name => 'mailer_invalid_domain' }
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            describe 'Invalid domain', vcr: vcr_opts do
         
     | 
| 
      
 49 
     | 
    
         
            +
              let(:domain) { 'not-our-doma.in' }
         
     | 
| 
      
 50 
     | 
    
         
            +
              let(:config) do
         
     | 
| 
      
 51 
     | 
    
         
            +
                {
         
     | 
| 
      
 52 
     | 
    
         
            +
                  api_key: APIKEY,
         
     | 
| 
      
 53 
     | 
    
         
            +
                  domain: domain
         
     | 
| 
      
 54 
     | 
    
         
            +
                }
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
              let(:mail) { UnitTestMailer.plain_message("bob@#{domain}", 'sally@not-our-doma.in' 'subject', {}) }
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
              it 'raises expected error' do
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                Railgun::Mailer.new(config).deliver!(mail)
         
     | 
| 
      
 61 
     | 
    
         
            +
              rescue Mailgun::CommunicationError => err
         
     | 
| 
      
 62 
     | 
    
         
            +
                expect(err.message).to eq('401 Unauthorized: Forbidden - Invalid Domain or API key')
         
     | 
| 
      
 63 
     | 
    
         
            +
              else
         
     | 
| 
      
 64 
     | 
    
         
            +
                fail
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              end
         
     | 
| 
      
 67 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -63,6 +63,9 @@ describe 'The method send_message()', vcr: vcr_opts do 
     | 
|
| 
       63 
63 
     | 
    
         
             
                         :to => "bob@#{@domain}",
         
     | 
| 
       64 
64 
     | 
    
         
             
                         :subject => "Test",
         
     | 
| 
       65 
65 
     | 
    
         
             
                         :text => "Test Data" }
         
     | 
| 
      
 66 
     | 
    
         
            +
                uuid = 'uuid'
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                allow(SecureRandom).to receive(:uuid).and_return(uuid)
         
     | 
| 
       66 
69 
     | 
    
         | 
| 
       67 
70 
     | 
    
         
             
                result = @mg_obj.send_message(@domain, data)
         
     | 
| 
       68 
71 
     | 
    
         | 
| 
         @@ -72,7 +75,7 @@ describe 'The method send_message()', vcr: vcr_opts do 
     | 
|
| 
       72 
75 
     | 
    
         
             
                expect(result.body).to include("id")
         
     | 
| 
       73 
76 
     | 
    
         | 
| 
       74 
77 
     | 
    
         
             
                expect(result.code).to eq(200)
         
     | 
| 
       75 
     | 
    
         
            -
                expect(result.body['id']).to eq("test-mode-mail@localhost")
         
     | 
| 
      
 78 
     | 
    
         
            +
                expect(result.body['id']).to eq("test-mode-mail-#{uuid}@localhost")
         
     | 
| 
       76 
79 
     | 
    
         
             
                expect(result.body['message']).to eq("Queued. Thank you.")
         
     | 
| 
       77 
80 
     | 
    
         
             
              end
         
     | 
| 
       78 
81 
     | 
    
         | 
| 
         @@ -23,6 +23,7 @@ module Mailgun 
     | 
|
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                def send_message(working_domain, data)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  perform_data_validation(working_domain, data)
         
     | 
| 
       26 
27 
     | 
    
         
             
                  case data
         
     | 
| 
       27 
28 
     | 
    
         
             
                  when Hash
         
     | 
| 
       28 
29 
     | 
    
         
             
                    if data.has_key?(:message)
         
     | 
| 
         @@ -45,7 +46,8 @@ module Mailgun 
     | 
|
| 
       45 
46 
     | 
    
         
             
                    Mailgun::Response.new(response_generator(@endpoint))
         
     | 
| 
       46 
47 
     | 
    
         
             
                  rescue => e
         
     | 
| 
       47 
48 
     | 
    
         
             
                    p e
         
     | 
| 
       48 
     | 
    
         
            -
                    raise CommunicationError.new(e), e.response
         
     | 
| 
      
 49 
     | 
    
         
            +
                    raise CommunicationError.new(e), e.response if e.respond_to? :response
         
     | 
| 
      
 50 
     | 
    
         
            +
                    raise CommunicationError.new(e.message)
         
     | 
| 
       49 
51 
     | 
    
         
             
                  end
         
     | 
| 
       50 
52 
     | 
    
         
             
                end
         
     | 
| 
       51 
53 
     | 
    
         | 
| 
         @@ -75,6 +77,21 @@ module Mailgun 
     | 
|
| 
       75 
77 
     | 
    
         | 
| 
       76 
78 
     | 
    
         
             
                private
         
     | 
| 
       77 
79 
     | 
    
         | 
| 
      
 80 
     | 
    
         
            +
                def perform_data_validation(working_domain, data)
         
     | 
| 
      
 81 
     | 
    
         
            +
                  fail ParameterError.new('Missing working domain', working_domain) unless working_domain
         
     | 
| 
      
 82 
     | 
    
         
            +
                  return true unless data.is_a?(Hash) && data.present?
         
     | 
| 
      
 83 
     | 
    
         
            +
                  message = data.respond_to?(:message) ? data.message : data
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                  fail ParameterError.new(
         
     | 
| 
      
 86 
     | 
    
         
            +
                    'Missing `to` recipient, message should containg at least 1 recipient',
         
     | 
| 
      
 87 
     | 
    
         
            +
                    working_domain
         
     | 
| 
      
 88 
     | 
    
         
            +
                  ) if message.fetch('to', []).empty? && message.fetch(:to, []).empty?
         
     | 
| 
      
 89 
     | 
    
         
            +
                  fail ParameterError.new(
         
     | 
| 
      
 90 
     | 
    
         
            +
                    'Missing a `from` sender, message should containg at least 1 `from` sender',
         
     | 
| 
      
 91 
     | 
    
         
            +
                    working_domain
         
     | 
| 
      
 92 
     | 
    
         
            +
                  ) if message.fetch('from', []).empty? && message.fetch(:from, []).empty?
         
     | 
| 
      
 93 
     | 
    
         
            +
                end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
       78 
95 
     | 
    
         
             
                def response_generator(resource_endpoint)
         
     | 
| 
       79 
96 
     | 
    
         
             
                  if resource_endpoint == "messages"
         
     | 
| 
       80 
97 
     | 
    
         
             
                    t = Time.now
         
     | 
    
        data/spec/unit/mailgun_spec.rb
    CHANGED
    
    | 
         @@ -37,8 +37,11 @@ describe 'The method send_message()' do 
     | 
|
| 
       37 
37 
     | 
    
         
             
              end
         
     | 
| 
       38 
38 
     | 
    
         | 
| 
       39 
39 
     | 
    
         
             
              it 'opens the message MIME and sends the MIME message.' do
         
     | 
| 
       40 
     | 
    
         
            -
                data = { 
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 40 
     | 
    
         
            +
                data = {
         
     | 
| 
      
 41 
     | 
    
         
            +
                  'to' => 'joe@test.com',
         
     | 
| 
      
 42 
     | 
    
         
            +
                  'message' => 'Sample Data/mime.txt',
         
     | 
| 
      
 43 
     | 
    
         
            +
                  'from' => 'joe@test.com'
         
     | 
| 
      
 44 
     | 
    
         
            +
                }
         
     | 
| 
       42 
45 
     | 
    
         
             
                result = @mg_obj.send_message("testdomain.com", data)
         
     | 
| 
       43 
46 
     | 
    
         | 
| 
       44 
47 
     | 
    
         
             
                result.to_h!
         
     | 
| 
         @@ -46,6 +49,25 @@ describe 'The method send_message()' do 
     | 
|
| 
       46 
49 
     | 
    
         
             
                expect(result.body).to include("message")
         
     | 
| 
       47 
50 
     | 
    
         
             
                expect(result.body).to include("id")
         
     | 
| 
       48 
51 
     | 
    
         
             
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              context 'when domain is missing' do
         
     | 
| 
      
 54 
     | 
    
         
            +
                it 'shows failure message' do
         
     | 
| 
      
 55 
     | 
    
         
            +
                  expect(@mg_obj).to receive(:fail)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  @mg_obj.send_message(nil, {})
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
              end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              context 'when to is missing' do
         
     | 
| 
      
 61 
     | 
    
         
            +
                it 'shows failure message' do
         
     | 
| 
      
 62 
     | 
    
         
            +
                data = {
         
     | 
| 
      
 63 
     | 
    
         
            +
                  'to' => '',
         
     | 
| 
      
 64 
     | 
    
         
            +
                  'message' => 'Sample Data/mime.txt',
         
     | 
| 
      
 65 
     | 
    
         
            +
                  'from' => 'joe@test.com'
         
     | 
| 
      
 66 
     | 
    
         
            +
                }
         
     | 
| 
      
 67 
     | 
    
         
            +
                expect(@mg_obj).to receive(:fail)
         
     | 
| 
      
 68 
     | 
    
         
            +
                @mg_obj.send_message("testdomain.com", data)
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
              end
         
     | 
| 
       49 
71 
     | 
    
         
             
            end
         
     | 
| 
       50 
72 
     | 
    
         | 
| 
       51 
73 
     | 
    
         
             
            describe 'The method post()' do
         
     | 
| 
         @@ -65,6 +87,25 @@ describe 'The method post()' do 
     | 
|
| 
       65 
87 
     | 
    
         
             
                expect(result.body).to include("message")
         
     | 
| 
       66 
88 
     | 
    
         
             
                expect(result.body).to include("id")
         
     | 
| 
       67 
89 
     | 
    
         
             
              end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
              context 'when Unknown API error is raised' do
         
     | 
| 
      
 92 
     | 
    
         
            +
                before do
         
     | 
| 
      
 93 
     | 
    
         
            +
                  allow(Mailgun::Response).to receive(:new).and_raise(StandardError, "message")
         
     | 
| 
      
 94 
     | 
    
         
            +
                  allow(JSON).to receive(:parse).and_raise('Unknown')
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                it 'adds Unknown API error to message' do
         
     | 
| 
      
 98 
     | 
    
         
            +
                  data = {'from' => 'joe@test.com',
         
     | 
| 
      
 99 
     | 
    
         
            +
                                'to' => 'bob@example.com',
         
     | 
| 
      
 100 
     | 
    
         
            +
                                'subject' => 'Test',
         
     | 
| 
      
 101 
     | 
    
         
            +
                                'text' => 'Test Data'}
         
     | 
| 
      
 102 
     | 
    
         
            +
                  @mg_obj.post("#{@domain}/messages", data)
         
     | 
| 
      
 103 
     | 
    
         
            +
                rescue Mailgun::CommunicationError => err
         
     | 
| 
      
 104 
     | 
    
         
            +
                  expect(err.message).to eq('message: Unknown API error')
         
     | 
| 
      
 105 
     | 
    
         
            +
                else
         
     | 
| 
      
 106 
     | 
    
         
            +
                  fail
         
     | 
| 
      
 107 
     | 
    
         
            +
                end
         
     | 
| 
      
 108 
     | 
    
         
            +
              end
         
     | 
| 
       68 
109 
     | 
    
         
             
            end
         
     | 
| 
       69 
110 
     | 
    
         | 
| 
       70 
111 
     | 
    
         
             
            describe 'The method put()' do
         
     | 
| 
         @@ -72,61 +72,76 @@ describe 'The method add_recipient' do 
     | 
|
| 
       72 
72 
     | 
    
         
             
                @address_3   = 'sam@example.com'
         
     | 
| 
       73 
73 
     | 
    
         
             
                @variables_3 = {'first' => 'Sam', 'last' => 'Doe', 'tracking' => 'GHI123'}
         
     | 
| 
       74 
74 
     | 
    
         
             
              end
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
                1000.times do
         
     | 
| 
       79 
     | 
    
         
            -
                  @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 75 
     | 
    
         
            +
              context 'when from is present' do
         
     | 
| 
      
 76 
     | 
    
         
            +
                before(:each) do
         
     | 
| 
      
 77 
     | 
    
         
            +
                  @mb_obj.from('example@email.com')
         
     | 
| 
       80 
78 
     | 
    
         
             
                end
         
     | 
| 
       81 
79 
     | 
    
         | 
| 
       82 
     | 
    
         
            -
                 
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
              end
         
     | 
| 
      
 80 
     | 
    
         
            +
                it 'adds 1,000 recipients to the message body and validates counter is incremented then reset' do
         
     | 
| 
      
 81 
     | 
    
         
            +
                  recipient_type = :to
         
     | 
| 
      
 82 
     | 
    
         
            +
                  1000.times do
         
     | 
| 
      
 83 
     | 
    
         
            +
                    @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 84 
     | 
    
         
            +
                  end
         
     | 
| 
       88 
85 
     | 
    
         | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
                1000.times do
         
     | 
| 
      
 86 
     | 
    
         
            +
                  expect(@mb_obj.counters[:recipients][recipient_type]).to eq(1000)
         
     | 
| 
      
 87 
     | 
    
         
            +
                  
         
     | 
| 
       92 
88 
     | 
    
         
             
                  @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 89 
     | 
    
         
            +
                  
         
     | 
| 
      
 90 
     | 
    
         
            +
                  expect(@mb_obj.counters[:recipients][recipient_type]).to eq(1)
         
     | 
| 
       93 
91 
     | 
    
         
             
                end
         
     | 
| 
       94 
92 
     | 
    
         | 
| 
       95 
     | 
    
         
            -
                 
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
      
 93 
     | 
    
         
            +
                it 'adds recipients to the message, calls finalize, and cleans up' do
         
     | 
| 
      
 94 
     | 
    
         
            +
                  recipient_type = :to
         
     | 
| 
      
 95 
     | 
    
         
            +
                  1000.times do
         
     | 
| 
      
 96 
     | 
    
         
            +
                    @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 97 
     | 
    
         
            +
                  end
         
     | 
| 
       97 
98 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
       100 
     | 
    
         
            -
                expect(@mb_obj.message[:to].length).to eq(0)
         
     | 
| 
       101 
     | 
    
         
            -
                expect(@mb_obj.counters[:recipients][recipient_type]).to eq(0)
         
     | 
| 
       102 
     | 
    
         
            -
              end
         
     | 
| 
      
 99 
     | 
    
         
            +
                  expect(@mb_obj.counters[:recipients][recipient_type]).to eq(1000)
         
     | 
| 
      
 100 
     | 
    
         
            +
                  @mb_obj.finalize
         
     | 
| 
       103 
101 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
                  @mb_obj. 
     | 
| 
      
 102 
     | 
    
         
            +
                  expect(@mb_obj.recipient_variables).to eq({})
         
     | 
| 
      
 103 
     | 
    
         
            +
                  expect(@mb_obj.message['recipient-variables'].length).to eq(0)
         
     | 
| 
      
 104 
     | 
    
         
            +
                  expect(@mb_obj.message[:to].length).to eq(0)
         
     | 
| 
      
 105 
     | 
    
         
            +
                  expect(@mb_obj.counters[:recipients][recipient_type]).to eq(0)
         
     | 
| 
       108 
106 
     | 
    
         
             
                end
         
     | 
| 
       109 
     | 
    
         
            -
                @mb_obj.finalize
         
     | 
| 
       110 
107 
     | 
    
         | 
| 
       111 
     | 
    
         
            -
                 
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
      
 108 
     | 
    
         
            +
                it 'adds 5,005 recipients to the message body and validates we receive message_ids back' do
         
     | 
| 
      
 109 
     | 
    
         
            +
                  recipient_type = :to
         
     | 
| 
      
 110 
     | 
    
         
            +
                  5005.times do
         
     | 
| 
      
 111 
     | 
    
         
            +
                    @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 112 
     | 
    
         
            +
                  end
         
     | 
| 
      
 113 
     | 
    
         
            +
                  @mb_obj.finalize
         
     | 
| 
       113 
114 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
                 
     | 
| 
       116 
     | 
    
         
            -
                @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 115 
     | 
    
         
            +
                  expect(@mb_obj.message_ids.length).to eq(6)
         
     | 
| 
      
 116 
     | 
    
         
            +
                end
         
     | 
| 
       117 
117 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
                 
     | 
| 
      
 118 
     | 
    
         
            +
                it 'sets recipient-variables, for batch expansion' do
         
     | 
| 
      
 119 
     | 
    
         
            +
                  recipient_type = :to
         
     | 
| 
      
 120 
     | 
    
         
            +
                  @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
                  expect(@mb_obj.recipient_variables[@address_1]).to eq(@variables_1)
         
     | 
| 
      
 123 
     | 
    
         
            +
                end
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
                it 'sets multiple recipient-variables, for batch expansion' do
         
     | 
| 
      
 126 
     | 
    
         
            +
                  recipient_type = :to
         
     | 
| 
      
 127 
     | 
    
         
            +
                  @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 128 
     | 
    
         
            +
                  @mb_obj.add_recipient(recipient_type, @address_2, @variables_2)
         
     | 
| 
      
 129 
     | 
    
         
            +
                  @mb_obj.add_recipient(recipient_type, @address_3, @variables_3)
         
     | 
| 
      
 130 
     | 
    
         
            +
                  
         
     | 
| 
      
 131 
     | 
    
         
            +
                  expect(@mb_obj.recipient_variables[@address_1]).to eq(@variables_1)
         
     | 
| 
      
 132 
     | 
    
         
            +
                  expect(@mb_obj.recipient_variables[@address_2]).to eq(@variables_2)
         
     | 
| 
      
 133 
     | 
    
         
            +
                  expect(@mb_obj.recipient_variables[@address_3]).to eq(@variables_3)
         
     | 
| 
      
 134 
     | 
    
         
            +
                end
         
     | 
| 
       119 
135 
     | 
    
         
             
              end
         
     | 
| 
       120 
136 
     | 
    
         | 
| 
       121 
     | 
    
         
            -
               
     | 
| 
       122 
     | 
    
         
            -
                 
     | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
                 
     | 
| 
       129 
     | 
    
         
            -
                expect(@mb_obj.recipient_variables[@address_3]).to eq(@variables_3)
         
     | 
| 
      
 137 
     | 
    
         
            +
              context 'when from is empty' do
         
     | 
| 
      
 138 
     | 
    
         
            +
                it 'shows error message' do
         
     | 
| 
      
 139 
     | 
    
         
            +
                  recipient_type = :to
         
     | 
| 
      
 140 
     | 
    
         
            +
                  @mb_obj.add_recipient(recipient_type, @address_1, @variables_1)
         
     | 
| 
      
 141 
     | 
    
         
            +
                  @mb_obj.add_recipient(recipient_type, @address_2, @variables_2)
         
     | 
| 
      
 142 
     | 
    
         
            +
                  expect(@mb_client).to receive(:fail)
         
     | 
| 
      
 143 
     | 
    
         
            +
                  @mb_obj.finalize
         
     | 
| 
      
 144 
     | 
    
         
            +
                end
         
     | 
| 
       130 
145 
     | 
    
         
             
              end
         
     | 
| 
       131 
146 
     | 
    
         | 
| 
       132 
147 
     | 
    
         
             
            end
         
     | 
| 
         @@ -313,7 +313,7 @@ describe 'The method set_test_mode' do 
     | 
|
| 
       313 
313 
     | 
    
         
             
              it 'warns of set_test_mode deprecation' do
         
     | 
| 
       314 
314 
     | 
    
         
             
                @mb_obj = Mailgun::MessageBuilder.new
         
     | 
| 
       315 
315 
     | 
    
         
             
                expect(@mb_obj).to receive :warn
         
     | 
| 
       316 
     | 
    
         
            -
                @mb_obj.set_test_mode ' 
     | 
| 
      
 316 
     | 
    
         
            +
                @mb_obj.set_test_mode 'Yes'
         
     | 
| 
       317 
317 
     | 
    
         
             
              end
         
     | 
| 
       318 
318 
     | 
    
         
             
            end
         
     | 
| 
       319 
319 
     | 
    
         | 
| 
         @@ -355,7 +355,7 @@ describe 'The method set_dkim' do 
     | 
|
| 
       355 
355 
     | 
    
         
             
              it 'warns of set_dkim deprecation' do
         
     | 
| 
       356 
356 
     | 
    
         
             
                @mb_obj = Mailgun::MessageBuilder.new
         
     | 
| 
       357 
357 
     | 
    
         
             
                expect(@mb_obj).to receive :warn
         
     | 
| 
       358 
     | 
    
         
            -
                @mb_obj.set_dkim ' 
     | 
| 
      
 358 
     | 
    
         
            +
                @mb_obj.set_dkim 'Yes'
         
     | 
| 
       359 
359 
     | 
    
         
             
              end
         
     | 
| 
       360 
360 
     | 
    
         
             
            end
         
     | 
| 
       361 
361 
     | 
    
         | 
| 
         @@ -449,7 +449,7 @@ describe 'The method set_open_tracking' do 
     | 
|
| 
       449 
449 
     | 
    
         
             
              it 'warns of set_open_tracking deprecation' do
         
     | 
| 
       450 
450 
     | 
    
         
             
                @mb_obj = Mailgun::MessageBuilder.new
         
     | 
| 
       451 
451 
     | 
    
         
             
                expect(@mb_obj).to receive :warn
         
     | 
| 
       452 
     | 
    
         
            -
                @mb_obj.set_open_tracking ' 
     | 
| 
      
 452 
     | 
    
         
            +
                @mb_obj.set_open_tracking 'Yes'
         
     | 
| 
       453 
453 
     | 
    
         
             
              end
         
     | 
| 
       454 
454 
     | 
    
         
             
            end
         
     | 
| 
       455 
455 
     | 
    
         | 
| 
         @@ -461,6 +461,7 @@ describe 'The method track_opens' do 
     | 
|
| 
       461 
461 
     | 
    
         
             
                @mb_obj.track_opens('Yes')
         
     | 
| 
       462 
462 
     | 
    
         | 
| 
       463 
463 
     | 
    
         
             
                expect(@mb_obj.message["o:tracking-opens"]).to eq("yes")
         
     | 
| 
      
 464 
     | 
    
         
            +
                expect(@mb_obj.message["o:tracking"]).to eq(["yes"])
         
     | 
| 
       464 
465 
     | 
    
         | 
| 
       465 
466 
     | 
    
         
             
                @mb_obj.track_opens('No')
         
     | 
| 
       466 
467 
     | 
    
         | 
| 
         @@ -480,7 +481,7 @@ describe 'The method set_click_tracking' do 
     | 
|
| 
       480 
481 
     | 
    
         
             
              it 'warns of set_click_tracking deprecation' do
         
     | 
| 
       481 
482 
     | 
    
         
             
                @mb_obj = Mailgun::MessageBuilder.new
         
     | 
| 
       482 
483 
     | 
    
         
             
                expect(@mb_obj).to receive :warn
         
     | 
| 
       483 
     | 
    
         
            -
                @mb_obj.set_click_tracking ' 
     | 
| 
      
 484 
     | 
    
         
            +
                @mb_obj.set_click_tracking 'Yes'
         
     | 
| 
       484 
485 
     | 
    
         
             
              end
         
     | 
| 
       485 
486 
     | 
    
         
             
            end
         
     | 
| 
       486 
487 
     | 
    
         | 
| 
         @@ -492,6 +493,7 @@ describe 'The method track_clicks' do 
     | 
|
| 
       492 
493 
     | 
    
         
             
                @mb_obj.track_clicks('Yes')
         
     | 
| 
       493 
494 
     | 
    
         | 
| 
       494 
495 
     | 
    
         
             
                expect(@mb_obj.message["o:tracking-clicks"]).to eq("yes")
         
     | 
| 
      
 496 
     | 
    
         
            +
                expect(@mb_obj.message["o:tracking"]).to eq(["yes"])
         
     | 
| 
       495 
497 
     | 
    
         | 
| 
       496 
498 
     | 
    
         
             
                @mb_obj.track_clicks('No')
         
     | 
| 
       497 
499 
     | 
    
         | 
| 
         @@ -509,6 +511,13 @@ describe 'The method track_clicks' do 
     | 
|
| 
       509 
511 
     | 
    
         | 
| 
       510 
512 
     | 
    
         
             
                expect(@mb_obj.message["o:tracking-clicks"]).to eq("html")
         
     | 
| 
       511 
513 
     | 
    
         
             
              end
         
     | 
| 
      
 514 
     | 
    
         
            +
             
     | 
| 
      
 515 
     | 
    
         
            +
              context 'when unexpected value is provided' do
         
     | 
| 
      
 516 
     | 
    
         
            +
                it 'warns about prefered values' do
         
     | 
| 
      
 517 
     | 
    
         
            +
                  expect(@mb_obj).to receive :warn
         
     | 
| 
      
 518 
     | 
    
         
            +
                  @mb_obj.track_clicks('random')
         
     | 
| 
      
 519 
     | 
    
         
            +
                end
         
     | 
| 
      
 520 
     | 
    
         
            +
              end
         
     | 
| 
       512 
521 
     | 
    
         
             
            end
         
     | 
| 
       513 
522 
     | 
    
         | 
| 
       514 
523 
     | 
    
         
             
            describe 'The method set_delivery_time' do
         
     | 
| 
         @@ -621,3 +630,103 @@ describe 'The method message_id' do 
     | 
|
| 
       621 
630 
     | 
    
         
             
                expect(@mb_obj.message.has_key?('h:Message-Id')).to eq(false)
         
     | 
| 
       622 
631 
     | 
    
         
             
              end
         
     | 
| 
       623 
632 
     | 
    
         
             
            end
         
     | 
| 
      
 633 
     | 
    
         
            +
             
     | 
| 
      
 634 
     | 
    
         
            +
            describe 'The method template' do
         
     | 
| 
      
 635 
     | 
    
         
            +
              before(:each) do
         
     | 
| 
      
 636 
     | 
    
         
            +
                @mb_obj = Mailgun::MessageBuilder.new
         
     | 
| 
      
 637 
     | 
    
         
            +
              end
         
     | 
| 
      
 638 
     | 
    
         
            +
              context 'when template name is passed' do
         
     | 
| 
      
 639 
     | 
    
         
            +
                it 'sets `template` to the message' do
         
     | 
| 
      
 640 
     | 
    
         
            +
                  template_name = 'template.name'
         
     | 
| 
      
 641 
     | 
    
         
            +
                  @mb_obj.template(template_name)
         
     | 
| 
      
 642 
     | 
    
         
            +
             
     | 
| 
      
 643 
     | 
    
         
            +
                  expect(@mb_obj.message['template']).to eq(template_name)
         
     | 
| 
      
 644 
     | 
    
         
            +
                end
         
     | 
| 
      
 645 
     | 
    
         
            +
              end
         
     | 
| 
      
 646 
     | 
    
         
            +
             
     | 
| 
      
 647 
     | 
    
         
            +
              context 'when multiple values are passed' do
         
     | 
| 
      
 648 
     | 
    
         
            +
                it 'sets the last value as message template' do
         
     | 
| 
      
 649 
     | 
    
         
            +
                  template_name_1 = 'template.name_1'
         
     | 
| 
      
 650 
     | 
    
         
            +
                  template_name_2 = 'template.name_2'
         
     | 
| 
      
 651 
     | 
    
         
            +
             
     | 
| 
      
 652 
     | 
    
         
            +
                  @mb_obj.template(template_name_1)
         
     | 
| 
      
 653 
     | 
    
         
            +
                  @mb_obj.template(template_name_2)
         
     | 
| 
      
 654 
     | 
    
         
            +
             
     | 
| 
      
 655 
     | 
    
         
            +
                  expect(@mb_obj.message['template']).to eq(template_name_2)
         
     | 
| 
      
 656 
     | 
    
         
            +
                end
         
     | 
| 
      
 657 
     | 
    
         
            +
              end
         
     | 
| 
      
 658 
     | 
    
         
            +
             
     | 
| 
      
 659 
     | 
    
         
            +
              context 'when template name is not passed' do
         
     | 
| 
      
 660 
     | 
    
         
            +
                it 'it deletes `template` key from the message' do
         
     | 
| 
      
 661 
     | 
    
         
            +
                  @mb_obj.template('template.name')
         
     | 
| 
      
 662 
     | 
    
         
            +
             
     | 
| 
      
 663 
     | 
    
         
            +
                  expect(@mb_obj.message.has_key?('template')).to eq(true)
         
     | 
| 
      
 664 
     | 
    
         
            +
             
     | 
| 
      
 665 
     | 
    
         
            +
                  @mb_obj.template
         
     | 
| 
      
 666 
     | 
    
         
            +
             
     | 
| 
      
 667 
     | 
    
         
            +
                  expect(@mb_obj.message.has_key?('template')).to eq(false)
         
     | 
| 
      
 668 
     | 
    
         
            +
                end
         
     | 
| 
      
 669 
     | 
    
         
            +
              end
         
     | 
| 
      
 670 
     | 
    
         
            +
            end
         
     | 
| 
      
 671 
     | 
    
         
            +
             
     | 
| 
      
 672 
     | 
    
         
            +
            describe 'The method template_version' do
         
     | 
| 
      
 673 
     | 
    
         
            +
              before(:each) do
         
     | 
| 
      
 674 
     | 
    
         
            +
                @mb_obj = Mailgun::MessageBuilder.new
         
     | 
| 
      
 675 
     | 
    
         
            +
              end
         
     | 
| 
      
 676 
     | 
    
         
            +
              context 'when template version is passed' do
         
     | 
| 
      
 677 
     | 
    
         
            +
                it 'adds `t:version` key value to the message' do
         
     | 
| 
      
 678 
     | 
    
         
            +
                  version = 'version_1'
         
     | 
| 
      
 679 
     | 
    
         
            +
                  @mb_obj.template_version(version)
         
     | 
| 
      
 680 
     | 
    
         
            +
             
     | 
| 
      
 681 
     | 
    
         
            +
                  expect(@mb_obj.message['t:version']).to eq(version)
         
     | 
| 
      
 682 
     | 
    
         
            +
                end
         
     | 
| 
      
 683 
     | 
    
         
            +
              end
         
     | 
| 
      
 684 
     | 
    
         
            +
             
     | 
| 
      
 685 
     | 
    
         
            +
              context 'when multiple values are passed' do
         
     | 
| 
      
 686 
     | 
    
         
            +
                it 'adds the last value as `t:version` key value to the message' do
         
     | 
| 
      
 687 
     | 
    
         
            +
                  version_1 = 'version_1'
         
     | 
| 
      
 688 
     | 
    
         
            +
                  version_2 = 'version_2'
         
     | 
| 
      
 689 
     | 
    
         
            +
             
     | 
| 
      
 690 
     | 
    
         
            +
                  @mb_obj.template_version(version_1)
         
     | 
| 
      
 691 
     | 
    
         
            +
                  @mb_obj.template_version(version_2)
         
     | 
| 
      
 692 
     | 
    
         
            +
             
     | 
| 
      
 693 
     | 
    
         
            +
                  expect(@mb_obj.message['t:version']).to eq(version_2)
         
     | 
| 
      
 694 
     | 
    
         
            +
                end
         
     | 
| 
      
 695 
     | 
    
         
            +
              end
         
     | 
| 
      
 696 
     | 
    
         
            +
             
     | 
| 
      
 697 
     | 
    
         
            +
              context 'when version is not passed' do
         
     | 
| 
      
 698 
     | 
    
         
            +
                it 'it deletes `t:version` key from the message' do
         
     | 
| 
      
 699 
     | 
    
         
            +
                  @mb_obj.template_version('version')
         
     | 
| 
      
 700 
     | 
    
         
            +
             
     | 
| 
      
 701 
     | 
    
         
            +
                  expect(@mb_obj.message.has_key?('t:version')).to eq(true)
         
     | 
| 
      
 702 
     | 
    
         
            +
             
     | 
| 
      
 703 
     | 
    
         
            +
                  @mb_obj.template_version
         
     | 
| 
      
 704 
     | 
    
         
            +
             
     | 
| 
      
 705 
     | 
    
         
            +
                  expect(@mb_obj.message.has_key?('t:version')).to eq(false)
         
     | 
| 
      
 706 
     | 
    
         
            +
                end
         
     | 
| 
      
 707 
     | 
    
         
            +
              end
         
     | 
| 
      
 708 
     | 
    
         
            +
            end
         
     | 
| 
      
 709 
     | 
    
         
            +
             
     | 
| 
      
 710 
     | 
    
         
            +
            describe 'The method template_text' do
         
     | 
| 
      
 711 
     | 
    
         
            +
              before(:each) do
         
     | 
| 
      
 712 
     | 
    
         
            +
                @mb_obj = Mailgun::MessageBuilder.new
         
     | 
| 
      
 713 
     | 
    
         
            +
              end
         
     | 
| 
      
 714 
     | 
    
         
            +
             
     | 
| 
      
 715 
     | 
    
         
            +
              it 'enables/disables rendering in the text part of the message in case of template sending' do
         
     | 
| 
      
 716 
     | 
    
         
            +
                @mb_obj.template_text('Yes')
         
     | 
| 
      
 717 
     | 
    
         
            +
             
     | 
| 
      
 718 
     | 
    
         
            +
                expect(@mb_obj.message["t:text"]).to eq("yes")
         
     | 
| 
      
 719 
     | 
    
         
            +
             
     | 
| 
      
 720 
     | 
    
         
            +
                @mb_obj.template_text('No')
         
     | 
| 
      
 721 
     | 
    
         
            +
             
     | 
| 
      
 722 
     | 
    
         
            +
                expect(@mb_obj.message["t:text"]).to eq("no")
         
     | 
| 
      
 723 
     | 
    
         
            +
             
     | 
| 
      
 724 
     | 
    
         
            +
                @mb_obj.template_text(true)
         
     | 
| 
      
 725 
     | 
    
         
            +
             
     | 
| 
      
 726 
     | 
    
         
            +
                expect(@mb_obj.message["t:text"]).to eq("yes")
         
     | 
| 
      
 727 
     | 
    
         
            +
             
     | 
| 
      
 728 
     | 
    
         
            +
                @mb_obj.template_text(false)
         
     | 
| 
      
 729 
     | 
    
         
            +
             
     | 
| 
      
 730 
     | 
    
         
            +
                expect(@mb_obj.message["t:text"]).to eq("no")
         
     | 
| 
      
 731 
     | 
    
         
            +
              end
         
     | 
| 
      
 732 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -31,6 +31,18 @@ class UnitTestMailer < ActionMailer::Base 
     | 
|
| 
       31 
31 
     | 
    
         
             
                end
         
     | 
| 
       32 
32 
     | 
    
         
             
              end
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
      
 34 
     | 
    
         
            +
              def message_with_template(address, subject, template_name)
         
     | 
| 
      
 35 
     | 
    
         
            +
                mail(to: address, subject: subject, template: template_name) do |format|
         
     | 
| 
      
 36 
     | 
    
         
            +
                  format.text { render plain: "Test!" }
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              def message_with_domain(address, subject, domain)
         
     | 
| 
      
 41 
     | 
    
         
            +
                mail(to: address, subject: subject, domain: domain) do |format|
         
     | 
| 
      
 42 
     | 
    
         
            +
                  format.text { render plain: "Test!" }
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
       34 
46 
     | 
    
         
             
            end
         
     | 
| 
       35 
47 
     | 
    
         | 
| 
       36 
48 
     | 
    
         
             
            describe 'Railgun::Mailer' do
         
     | 
| 
         @@ -45,6 +57,31 @@ describe 'Railgun::Mailer' do 
     | 
|
| 
       45 
57 
     | 
    
         
             
                expect(@mailer_obj.mailgun_client).to be_a(Mailgun::Client)
         
     | 
| 
       46 
58 
     | 
    
         
             
              end
         
     | 
| 
       47 
59 
     | 
    
         | 
| 
      
 60 
     | 
    
         
            +
              context 'when config does not have api_key or domain' do
         
     | 
| 
      
 61 
     | 
    
         
            +
                it 'raises configuration error' do
         
     | 
| 
      
 62 
     | 
    
         
            +
                  config = {
         
     | 
| 
      
 63 
     | 
    
         
            +
                    api_key:  {}
         
     | 
| 
      
 64 
     | 
    
         
            +
                  }
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                expect { Railgun::Mailer.new(config) }.to raise_error(Railgun::ConfigurationError)
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
              context 'when fake_message_send is present in config' do
         
     | 
| 
      
 71 
     | 
    
         
            +
                it 'enables test mode' do
         
     | 
| 
      
 72 
     | 
    
         
            +
                  config = {
         
     | 
| 
      
 73 
     | 
    
         
            +
                    api_key:  {},
         
     | 
| 
      
 74 
     | 
    
         
            +
                    domain:   {},
         
     | 
| 
      
 75 
     | 
    
         
            +
                    fake_message_send: true
         
     | 
| 
      
 76 
     | 
    
         
            +
                  }
         
     | 
| 
      
 77 
     | 
    
         
            +
                  client_double = double(Mailgun::Client)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  allow(Mailgun::Client).to receive(:new).and_return(client_double)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  expect(client_double).to receive(:enable_test_mode!)
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                  Railgun::Mailer.new(config)
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
              end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
       48 
85 
     | 
    
         
             
              it 'properly creates a message body' do
         
     | 
| 
       49 
86 
     | 
    
         
             
                message = UnitTestMailer.plain_message('test@example.org', 'Test!', {})
         
     | 
| 
       50 
87 
     | 
    
         
             
                body = Railgun.transform_for_mailgun(message)
         
     | 
| 
         @@ -157,6 +194,43 @@ describe 'Railgun::Mailer' do 
     | 
|
| 
       157 
194 
     | 
    
         
             
                expect(body['h:x-source']).to eq('unit tests')
         
     | 
| 
       158 
195 
     | 
    
         
             
              end
         
     | 
| 
       159 
196 
     | 
    
         | 
| 
      
 197 
     | 
    
         
            +
              context 'when mailgun_variables are present' do
         
     | 
| 
      
 198 
     | 
    
         
            +
                it 'accepts valid JSON and stores it as message[param].' do
         
     | 
| 
      
 199 
     | 
    
         
            +
                  message = UnitTestMailer.plain_message('test@example.org', '', {}).tap do |message|
         
     | 
| 
      
 200 
     | 
    
         
            +
                    message.mailgun_variables = {
         
     | 
| 
      
 201 
     | 
    
         
            +
                      'my-data' => '{"key":"value"}'
         
     | 
| 
      
 202 
     | 
    
         
            +
                    }
         
     | 
| 
      
 203 
     | 
    
         
            +
                  end
         
     | 
| 
      
 204 
     | 
    
         
            +
                  body = Railgun.transform_for_mailgun(message)
         
     | 
| 
      
 205 
     | 
    
         
            +
                  expect(body["v:my-data"]).to be_kind_of(String)
         
     | 
| 
      
 206 
     | 
    
         
            +
                  expect(body["v:my-data"].to_s).to eq('{"key":"value"}')
         
     | 
| 
      
 207 
     | 
    
         
            +
                end
         
     | 
| 
      
 208 
     | 
    
         
            +
             
     | 
| 
      
 209 
     | 
    
         
            +
                it 'accepts a hash and appends as data to the message.' do
         
     | 
| 
      
 210 
     | 
    
         
            +
                  message = UnitTestMailer.plain_message('test@example.org', '', {}).tap do |message|
         
     | 
| 
      
 211 
     | 
    
         
            +
                    message.mailgun_variables = {
         
     | 
| 
      
 212 
     | 
    
         
            +
                      'my-data' => {'key' => 'value'}
         
     | 
| 
      
 213 
     | 
    
         
            +
                    }
         
     | 
| 
      
 214 
     | 
    
         
            +
                  end
         
     | 
| 
      
 215 
     | 
    
         
            +
                  body = Railgun.transform_for_mailgun(message)
         
     | 
| 
      
 216 
     | 
    
         
            +
             
     | 
| 
      
 217 
     | 
    
         
            +
                  expect(body["v:my-data"]).to be_kind_of(String)
         
     | 
| 
      
 218 
     | 
    
         
            +
                  expect(body["v:my-data"].to_s).to eq('{"key":"value"}')
         
     | 
| 
      
 219 
     | 
    
         
            +
                end
         
     | 
| 
      
 220 
     | 
    
         
            +
             
     | 
| 
      
 221 
     | 
    
         
            +
                it 'accepts string values' do
         
     | 
| 
      
 222 
     | 
    
         
            +
                  message = UnitTestMailer.plain_message('test@example.org', '', {}).tap do |message|
         
     | 
| 
      
 223 
     | 
    
         
            +
                    message.mailgun_variables = {
         
     | 
| 
      
 224 
     | 
    
         
            +
                      'my-data' => 'String Value.'
         
     | 
| 
      
 225 
     | 
    
         
            +
                    }
         
     | 
| 
      
 226 
     | 
    
         
            +
                  end
         
     | 
| 
      
 227 
     | 
    
         
            +
                  body = Railgun.transform_for_mailgun(message)
         
     | 
| 
      
 228 
     | 
    
         
            +
             
     | 
| 
      
 229 
     | 
    
         
            +
                  expect(body["v:my-data"]).to be_kind_of(String)
         
     | 
| 
      
 230 
     | 
    
         
            +
                  expect(body["v:my-data"].to_s).to eq('String Value.')
         
     | 
| 
      
 231 
     | 
    
         
            +
                end
         
     | 
| 
      
 232 
     | 
    
         
            +
              end
         
     | 
| 
      
 233 
     | 
    
         
            +
             
     | 
| 
       160 
234 
     | 
    
         
             
              it 'properly adds attachments' do
         
     | 
| 
       161 
235 
     | 
    
         
             
                message = UnitTestMailer.message_with_attachment('test@example.org', '')
         
     | 
| 
       162 
236 
     | 
    
         
             
                body = Railgun.transform_for_mailgun(message)
         
     | 
| 
         @@ -239,4 +313,76 @@ describe 'Railgun::Mailer' do 
     | 
|
| 
       239 
313 
     | 
    
         
             
                expect(body['h:x-neat-header']).to include('bar')
         
     | 
| 
       240 
314 
     | 
    
         
             
                expect(body['h:x-neat-header']).to include('zoop')
         
     | 
| 
       241 
315 
     | 
    
         
             
              end
         
     | 
| 
      
 316 
     | 
    
         
            +
             
     | 
| 
      
 317 
     | 
    
         
            +
              context 'when message with template' do
         
     | 
| 
      
 318 
     | 
    
         
            +
                it 'adds template header to message from mailer params' do
         
     | 
| 
      
 319 
     | 
    
         
            +
                  template_name = 'template.name'
         
     | 
| 
      
 320 
     | 
    
         
            +
                  message = UnitTestMailer.message_with_template('test@example.org', '', template_name)
         
     | 
| 
      
 321 
     | 
    
         
            +
             
     | 
| 
      
 322 
     | 
    
         
            +
                  body = Railgun.transform_for_mailgun(message)
         
     | 
| 
      
 323 
     | 
    
         
            +
             
     | 
| 
      
 324 
     | 
    
         
            +
                  expect(body).to include('template')
         
     | 
| 
      
 325 
     | 
    
         
            +
                  expect(body['template']).to eq(template_name)
         
     | 
| 
      
 326 
     | 
    
         
            +
                end
         
     | 
| 
      
 327 
     | 
    
         
            +
             
     | 
| 
      
 328 
     | 
    
         
            +
                context 'when mailgun_template_variables are assigned' do
         
     | 
| 
      
 329 
     | 
    
         
            +
                  it 'adds template variables to message body' do
         
     | 
| 
      
 330 
     | 
    
         
            +
                    message = UnitTestMailer.message_with_template('test@example.org', '', 'template.name')
         
     | 
| 
      
 331 
     | 
    
         
            +
                    version = 'version_1'
         
     | 
| 
      
 332 
     | 
    
         
            +
                    message.mailgun_template_variables ||= {
         
     | 
| 
      
 333 
     | 
    
         
            +
                      'version' => version,
         
     | 
| 
      
 334 
     | 
    
         
            +
                      'text' => 'yes'
         
     | 
| 
      
 335 
     | 
    
         
            +
                    }
         
     | 
| 
      
 336 
     | 
    
         
            +
             
     | 
| 
      
 337 
     | 
    
         
            +
                    body = Railgun.transform_for_mailgun(message)
         
     | 
| 
      
 338 
     | 
    
         
            +
             
     | 
| 
      
 339 
     | 
    
         
            +
                    expect(body).to include('t:version')
         
     | 
| 
      
 340 
     | 
    
         
            +
                    expect(body['t:version']).to eq('version_1')
         
     | 
| 
      
 341 
     | 
    
         
            +
                    expect(body).to include('t:text')
         
     | 
| 
      
 342 
     | 
    
         
            +
                    expect(body['t:text']).to eq('yes')
         
     | 
| 
      
 343 
     | 
    
         
            +
                  end
         
     | 
| 
      
 344 
     | 
    
         
            +
                end
         
     | 
| 
      
 345 
     | 
    
         
            +
              end
         
     | 
| 
      
 346 
     | 
    
         
            +
             
     | 
| 
      
 347 
     | 
    
         
            +
              describe 'deliver!' do
         
     | 
| 
      
 348 
     | 
    
         
            +
                let(:config) do
         
     | 
| 
      
 349 
     | 
    
         
            +
                  {
         
     | 
| 
      
 350 
     | 
    
         
            +
                    api_key: 'api_key',
         
     | 
| 
      
 351 
     | 
    
         
            +
                    domain: 'domain'
         
     | 
| 
      
 352 
     | 
    
         
            +
                  }
         
     | 
| 
      
 353 
     | 
    
         
            +
                end
         
     | 
| 
      
 354 
     | 
    
         
            +
                let(:mail) { UnitTestMailer.plain_message('test@example.org', '', {}) }
         
     | 
| 
      
 355 
     | 
    
         
            +
                let(:response) do
         
     | 
| 
      
 356 
     | 
    
         
            +
                  response = Struct.new(:code, :id)
         
     | 
| 
      
 357 
     | 
    
         
            +
                  response.new(200, rand(50..100))
         
     | 
| 
      
 358 
     | 
    
         
            +
                end
         
     | 
| 
      
 359 
     | 
    
         
            +
             
     | 
| 
      
 360 
     | 
    
         
            +
                it 'initiates client message send' do
         
     | 
| 
      
 361 
     | 
    
         
            +
                  result = { from: 'test@example.org' }
         
     | 
| 
      
 362 
     | 
    
         
            +
                  allow(Railgun).to receive(:transform_for_mailgun).and_return(result)
         
     | 
| 
      
 363 
     | 
    
         
            +
             
     | 
| 
      
 364 
     | 
    
         
            +
                  expect_any_instance_of(Mailgun::Client).to receive(:send_message)
         
     | 
| 
      
 365 
     | 
    
         
            +
                    .with(config[:domain], result)
         
     | 
| 
      
 366 
     | 
    
         
            +
                    .and_return(response)
         
     | 
| 
      
 367 
     | 
    
         
            +
                  Railgun::Mailer.new(config).deliver!(mail)
         
     | 
| 
      
 368 
     | 
    
         
            +
                end
         
     | 
| 
      
 369 
     | 
    
         
            +
             
     | 
| 
      
 370 
     | 
    
         
            +
                it 'returns response' do
         
     | 
| 
      
 371 
     | 
    
         
            +
                  expect_any_instance_of(Mailgun::Client).to receive(:send_message).and_return(response)
         
     | 
| 
      
 372 
     | 
    
         
            +
                  expect(Railgun::Mailer.new(config).deliver!(mail)).to eq(response)
         
     | 
| 
      
 373 
     | 
    
         
            +
                end
         
     | 
| 
      
 374 
     | 
    
         
            +
             
     | 
| 
      
 375 
     | 
    
         
            +
                context 'when domain is provided in arguments' do
         
     | 
| 
      
 376 
     | 
    
         
            +
                  let(:new_domain) { 'new_domain' }
         
     | 
| 
      
 377 
     | 
    
         
            +
                  let(:mail) { UnitTestMailer.message_with_domain('test@example.org', '', new_domain) }
         
     | 
| 
      
 378 
     | 
    
         
            +
             
     | 
| 
      
 379 
     | 
    
         
            +
                  it 'uses provided domain' do
         
     | 
| 
      
 380 
     | 
    
         
            +
                    result = { from: 'test@example.org' }
         
     | 
| 
      
 381 
     | 
    
         
            +
                    allow(Railgun).to receive(:transform_for_mailgun).and_return(result)
         
     | 
| 
      
 382 
     | 
    
         
            +
                    expect_any_instance_of(Mailgun::Client).to receive(:send_message)
         
     | 
| 
      
 383 
     | 
    
         
            +
                      .with(new_domain, result).and_return(response)
         
     | 
| 
      
 384 
     | 
    
         
            +
                    Railgun::Mailer.new(config).deliver!(mail)
         
     | 
| 
      
 385 
     | 
    
         
            +
                  end
         
     | 
| 
      
 386 
     | 
    
         
            +
                end
         
     | 
| 
      
 387 
     | 
    
         
            +
              end
         
     | 
| 
       242 
388 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,109 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            http_interactions:
         
     | 
| 
      
 3 
     | 
    
         
            +
            - request:
         
     | 
| 
      
 4 
     | 
    
         
            +
                method: post
         
     | 
| 
      
 5 
     | 
    
         
            +
                uri: https://api.mailgun.net/v3/not-our-doma.in/messages
         
     | 
| 
      
 6 
     | 
    
         
            +
                body:
         
     | 
| 
      
 7 
     | 
    
         
            +
                  encoding: US-ASCII
         
     | 
| 
      
 8 
     | 
    
         
            +
                  string: from[]=sally%40not-our-doma.in&subject[]=subject&html[]=%3Cp%3ETest%21%3C%2Fp%3E&text[]=Test%21&to[]=bob%40DOMAIN.TEST&h%3Acontent-type=multipart%2Falternative%3B+boundary%3D%22--%3D%3D_mimepart_6098fb5a12edf_78633ff4e00521889696a%22%3B+charset%3DUTF-8
         
     | 
| 
      
 9 
     | 
    
         
            +
                headers:
         
     | 
| 
      
 10 
     | 
    
         
            +
                  Accept:
         
     | 
| 
      
 11 
     | 
    
         
            +
                  - "*/*"
         
     | 
| 
      
 12 
     | 
    
         
            +
                  User-Agent:
         
     | 
| 
      
 13 
     | 
    
         
            +
                  - rest-client/2.1.0 (darwin18.7.0 x86_64) ruby/2.2.2p95
         
     | 
| 
      
 14 
     | 
    
         
            +
                  Content-Length:
         
     | 
| 
      
 15 
     | 
    
         
            +
                  - '262'
         
     | 
| 
      
 16 
     | 
    
         
            +
                  Content-Type:
         
     | 
| 
      
 17 
     | 
    
         
            +
                  - application/x-www-form-urlencoded
         
     | 
| 
      
 18 
     | 
    
         
            +
                  Accept-Encoding:
         
     | 
| 
      
 19 
     | 
    
         
            +
                  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
         
     | 
| 
      
 20 
     | 
    
         
            +
                  Host:
         
     | 
| 
      
 21 
     | 
    
         
            +
                  - api.mailgun.net
         
     | 
| 
      
 22 
     | 
    
         
            +
                  Authorization:
         
     | 
| 
      
 23 
     | 
    
         
            +
                  - Basic YXBpOmQ5MTViNWNkYjlhNTgzNjg1ZDhmM2ZiMWJlYzBmMjBmLTA3YmM3YjA1LWZhNDgxNmEx
         
     | 
| 
      
 24 
     | 
    
         
            +
              response:
         
     | 
| 
      
 25 
     | 
    
         
            +
                status:
         
     | 
| 
      
 26 
     | 
    
         
            +
                  code: 401
         
     | 
| 
      
 27 
     | 
    
         
            +
                  message: UNAUTHORIZED
         
     | 
| 
      
 28 
     | 
    
         
            +
                headers:
         
     | 
| 
      
 29 
     | 
    
         
            +
                  Access-Control-Allow-Headers:
         
     | 
| 
      
 30 
     | 
    
         
            +
                  - Content-Type, x-requested-with, Authorization
         
     | 
| 
      
 31 
     | 
    
         
            +
                  Access-Control-Allow-Methods:
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - GET, POST, PUT, DELETE, OPTIONS
         
     | 
| 
      
 33 
     | 
    
         
            +
                  Access-Control-Allow-Origin:
         
     | 
| 
      
 34 
     | 
    
         
            +
                  - "*"
         
     | 
| 
      
 35 
     | 
    
         
            +
                  Access-Control-Max-Age:
         
     | 
| 
      
 36 
     | 
    
         
            +
                  - '600'
         
     | 
| 
      
 37 
     | 
    
         
            +
                  Cache-Control:
         
     | 
| 
      
 38 
     | 
    
         
            +
                  - no-store
         
     | 
| 
      
 39 
     | 
    
         
            +
                  Content-Type:
         
     | 
| 
      
 40 
     | 
    
         
            +
                  - text/html; charset=utf-8
         
     | 
| 
      
 41 
     | 
    
         
            +
                  Date:
         
     | 
| 
      
 42 
     | 
    
         
            +
                  - Mon, 10 May 2021 09:22:34 GMT
         
     | 
| 
      
 43 
     | 
    
         
            +
                  Server:
         
     | 
| 
      
 44 
     | 
    
         
            +
                  - nginx
         
     | 
| 
      
 45 
     | 
    
         
            +
                  Www-Authenticate:
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - Basic realm="MG API"
         
     | 
| 
      
 47 
     | 
    
         
            +
                  Content-Length:
         
     | 
| 
      
 48 
     | 
    
         
            +
                  - '9'
         
     | 
| 
      
 49 
     | 
    
         
            +
                  Connection:
         
     | 
| 
      
 50 
     | 
    
         
            +
                  - keep-alive
         
     | 
| 
      
 51 
     | 
    
         
            +
                body:
         
     | 
| 
      
 52 
     | 
    
         
            +
                  encoding: UTF-8
         
     | 
| 
      
 53 
     | 
    
         
            +
                  string: Forbidden
         
     | 
| 
      
 54 
     | 
    
         
            +
                http_version:
         
     | 
| 
      
 55 
     | 
    
         
            +
              recorded_at: Mon, 10 May 2021 09:22:34 GMT
         
     | 
| 
      
 56 
     | 
    
         
            +
            - request:
         
     | 
| 
      
 57 
     | 
    
         
            +
                method: post
         
     | 
| 
      
 58 
     | 
    
         
            +
                uri: https://api.mailgun.net/v3/not-our-doma.in/messages
         
     | 
| 
      
 59 
     | 
    
         
            +
                body:
         
     | 
| 
      
 60 
     | 
    
         
            +
                  encoding: US-ASCII
         
     | 
| 
      
 61 
     | 
    
         
            +
                  string: from[]=sally%40not-our-doma.in&subject[]=subject&html[]=%3Cp%3ETest%21%3C%2Fp%3E&text[]=Test%21&to[]=bob%40DOMAIN.TEST&h%3Acontent-type=multipart%2Falternative%3B+boundary%3D%22--%3D%3D_mimepart_6098fb5a12edf_78633ff4e00521889696a%22%3B+charset%3DUTF-8
         
     | 
| 
      
 62 
     | 
    
         
            +
                headers:
         
     | 
| 
      
 63 
     | 
    
         
            +
                  Accept:
         
     | 
| 
      
 64 
     | 
    
         
            +
                  - "*/*"
         
     | 
| 
      
 65 
     | 
    
         
            +
                  User-Agent:
         
     | 
| 
      
 66 
     | 
    
         
            +
                  - rest-client/2.1.0 (darwin18.7.0 x86_64) ruby/2.2.2p95
         
     | 
| 
      
 67 
     | 
    
         
            +
                  Content-Length:
         
     | 
| 
      
 68 
     | 
    
         
            +
                  - '262'
         
     | 
| 
      
 69 
     | 
    
         
            +
                  Content-Type:
         
     | 
| 
      
 70 
     | 
    
         
            +
                  - application/x-www-form-urlencoded
         
     | 
| 
      
 71 
     | 
    
         
            +
                  Accept-Encoding:
         
     | 
| 
      
 72 
     | 
    
         
            +
                  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
         
     | 
| 
      
 73 
     | 
    
         
            +
                  Host:
         
     | 
| 
      
 74 
     | 
    
         
            +
                  - api.mailgun.net
         
     | 
| 
      
 75 
     | 
    
         
            +
                  Authorization:
         
     | 
| 
      
 76 
     | 
    
         
            +
                  - Basic YXBpOmQ5MTViNWNkYjlhNTgzNjg1ZDhmM2ZiMWJlYzBmMjBmLTA3YmM3YjA1LWZhNDgxNmEx
         
     | 
| 
      
 77 
     | 
    
         
            +
              response:
         
     | 
| 
      
 78 
     | 
    
         
            +
                status:
         
     | 
| 
      
 79 
     | 
    
         
            +
                  code: 401
         
     | 
| 
      
 80 
     | 
    
         
            +
                  message: UNAUTHORIZED
         
     | 
| 
      
 81 
     | 
    
         
            +
                headers:
         
     | 
| 
      
 82 
     | 
    
         
            +
                  Access-Control-Allow-Headers:
         
     | 
| 
      
 83 
     | 
    
         
            +
                  - Content-Type, x-requested-with, Authorization
         
     | 
| 
      
 84 
     | 
    
         
            +
                  Access-Control-Allow-Methods:
         
     | 
| 
      
 85 
     | 
    
         
            +
                  - GET, POST, PUT, DELETE, OPTIONS
         
     | 
| 
      
 86 
     | 
    
         
            +
                  Access-Control-Allow-Origin:
         
     | 
| 
      
 87 
     | 
    
         
            +
                  - "*"
         
     | 
| 
      
 88 
     | 
    
         
            +
                  Access-Control-Max-Age:
         
     | 
| 
      
 89 
     | 
    
         
            +
                  - '600'
         
     | 
| 
      
 90 
     | 
    
         
            +
                  Cache-Control:
         
     | 
| 
      
 91 
     | 
    
         
            +
                  - no-store
         
     | 
| 
      
 92 
     | 
    
         
            +
                  Content-Type:
         
     | 
| 
      
 93 
     | 
    
         
            +
                  - text/html; charset=utf-8
         
     | 
| 
      
 94 
     | 
    
         
            +
                  Date:
         
     | 
| 
      
 95 
     | 
    
         
            +
                  - Mon, 10 May 2021 09:22:40 GMT
         
     | 
| 
      
 96 
     | 
    
         
            +
                  Server:
         
     | 
| 
      
 97 
     | 
    
         
            +
                  - nginx
         
     | 
| 
      
 98 
     | 
    
         
            +
                  Www-Authenticate:
         
     | 
| 
      
 99 
     | 
    
         
            +
                  - Basic realm="MG API"
         
     | 
| 
      
 100 
     | 
    
         
            +
                  Content-Length:
         
     | 
| 
      
 101 
     | 
    
         
            +
                  - '9'
         
     | 
| 
      
 102 
     | 
    
         
            +
                  Connection:
         
     | 
| 
      
 103 
     | 
    
         
            +
                  - keep-alive
         
     | 
| 
      
 104 
     | 
    
         
            +
                body:
         
     | 
| 
      
 105 
     | 
    
         
            +
                  encoding: UTF-8
         
     | 
| 
      
 106 
     | 
    
         
            +
                  string: Forbidden
         
     | 
| 
      
 107 
     | 
    
         
            +
                http_version:
         
     | 
| 
      
 108 
     | 
    
         
            +
              recorded_at: Mon, 10 May 2021 09:22:40 GMT
         
     | 
| 
      
 109 
     | 
    
         
            +
            recorded_with: VCR 3.0.3
         
     | 
| 
         @@ -0,0 +1,149 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            http_interactions:
         
     | 
| 
      
 3 
     | 
    
         
            +
            - request:
         
     | 
| 
      
 4 
     | 
    
         
            +
                method: post
         
     | 
| 
      
 5 
     | 
    
         
            +
                uri: https://api.mailgun.net/v3/DOMAIN.TEST/messages
         
     | 
| 
      
 6 
     | 
    
         
            +
                body:
         
     | 
| 
      
 7 
     | 
    
         
            +
                  encoding: US-ASCII
         
     | 
| 
      
 8 
     | 
    
         
            +
                  string: from[]=bob%40DOMAIN.TEST&subject[]=subject&html[]=%3Cp%3ETest%21%3C%2Fp%3E&text[]=Test%21&to[]=bob%40DOMAIN.TEST&h%3Acontent-type=multipart%2Falternative%3B+boundary%3D%22--%3D%3D_mimepart_6098f913d64ca_62833fd4d74521802775%22%3B+charset%3DUTF-8
         
     | 
| 
      
 9 
     | 
    
         
            +
                headers:
         
     | 
| 
      
 10 
     | 
    
         
            +
                  Accept:
         
     | 
| 
      
 11 
     | 
    
         
            +
                  - "*/*"
         
     | 
| 
      
 12 
     | 
    
         
            +
                  User-Agent:
         
     | 
| 
      
 13 
     | 
    
         
            +
                  - rest-client/2.1.0 (darwin18.7.0 x86_64) ruby/2.2.2p95
         
     | 
| 
      
 14 
     | 
    
         
            +
                  Content-Length:
         
     | 
| 
      
 15 
     | 
    
         
            +
                  - '261'
         
     | 
| 
      
 16 
     | 
    
         
            +
                  Content-Type:
         
     | 
| 
      
 17 
     | 
    
         
            +
                  - application/x-www-form-urlencoded
         
     | 
| 
      
 18 
     | 
    
         
            +
                  Accept-Encoding:
         
     | 
| 
      
 19 
     | 
    
         
            +
                  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
         
     | 
| 
      
 20 
     | 
    
         
            +
                  Host:
         
     | 
| 
      
 21 
     | 
    
         
            +
                  - api.mailgun.net
         
     | 
| 
      
 22 
     | 
    
         
            +
                  Authorization:
         
     | 
| 
      
 23 
     | 
    
         
            +
                  - Basic YXBpOmQ5MTViNWNkYjlhNTgzNjg1ZDhmM2ZiMWJlYzBmMjBmLTA3YmM3YjA1LWZhNDgxNmEx
         
     | 
| 
      
 24 
     | 
    
         
            +
              response:
         
     | 
| 
      
 25 
     | 
    
         
            +
                status:
         
     | 
| 
      
 26 
     | 
    
         
            +
                  code: 200
         
     | 
| 
      
 27 
     | 
    
         
            +
                  message: OK
         
     | 
| 
      
 28 
     | 
    
         
            +
                headers:
         
     | 
| 
      
 29 
     | 
    
         
            +
                  Access-Control-Allow-Credentials:
         
     | 
| 
      
 30 
     | 
    
         
            +
                  - 'true'
         
     | 
| 
      
 31 
     | 
    
         
            +
                  Access-Control-Allow-Headers:
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - Content-Type, x-requested-with, Authorization
         
     | 
| 
      
 33 
     | 
    
         
            +
                  Access-Control-Allow-Methods:
         
     | 
| 
      
 34 
     | 
    
         
            +
                  - GET, POST, PUT, DELETE, OPTIONS
         
     | 
| 
      
 35 
     | 
    
         
            +
                  Access-Control-Allow-Origin:
         
     | 
| 
      
 36 
     | 
    
         
            +
                  - "*"
         
     | 
| 
      
 37 
     | 
    
         
            +
                  Access-Control-Max-Age:
         
     | 
| 
      
 38 
     | 
    
         
            +
                  - '600'
         
     | 
| 
      
 39 
     | 
    
         
            +
                  Cache-Control:
         
     | 
| 
      
 40 
     | 
    
         
            +
                  - no-store
         
     | 
| 
      
 41 
     | 
    
         
            +
                  Content-Disposition:
         
     | 
| 
      
 42 
     | 
    
         
            +
                  - inline
         
     | 
| 
      
 43 
     | 
    
         
            +
                  Content-Type:
         
     | 
| 
      
 44 
     | 
    
         
            +
                  - application/json
         
     | 
| 
      
 45 
     | 
    
         
            +
                  Date:
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - Mon, 10 May 2021 09:12:52 GMT
         
     | 
| 
      
 47 
     | 
    
         
            +
                  Server:
         
     | 
| 
      
 48 
     | 
    
         
            +
                  - nginx
         
     | 
| 
      
 49 
     | 
    
         
            +
                  Strict-Transport-Security:
         
     | 
| 
      
 50 
     | 
    
         
            +
                  - max-age=63072000; includeSubDomains
         
     | 
| 
      
 51 
     | 
    
         
            +
                  X-Ratelimit-Limit:
         
     | 
| 
      
 52 
     | 
    
         
            +
                  - '2000000'
         
     | 
| 
      
 53 
     | 
    
         
            +
                  X-Ratelimit-Remaining:
         
     | 
| 
      
 54 
     | 
    
         
            +
                  - '1999999'
         
     | 
| 
      
 55 
     | 
    
         
            +
                  X-Ratelimit-Reset:
         
     | 
| 
      
 56 
     | 
    
         
            +
                  - '1620637982656'
         
     | 
| 
      
 57 
     | 
    
         
            +
                  X-Recipient-Limit:
         
     | 
| 
      
 58 
     | 
    
         
            +
                  - '1000000'
         
     | 
| 
      
 59 
     | 
    
         
            +
                  X-Recipient-Remaining:
         
     | 
| 
      
 60 
     | 
    
         
            +
                  - '999999'
         
     | 
| 
      
 61 
     | 
    
         
            +
                  X-Recipient-Reset:
         
     | 
| 
      
 62 
     | 
    
         
            +
                  - '1620637982657'
         
     | 
| 
      
 63 
     | 
    
         
            +
                  Content-Length:
         
     | 
| 
      
 64 
     | 
    
         
            +
                  - '136'
         
     | 
| 
      
 65 
     | 
    
         
            +
                  Connection:
         
     | 
| 
      
 66 
     | 
    
         
            +
                  - keep-alive
         
     | 
| 
      
 67 
     | 
    
         
            +
                body:
         
     | 
| 
      
 68 
     | 
    
         
            +
                  encoding: UTF-8
         
     | 
| 
      
 69 
     | 
    
         
            +
                  string: |-
         
     | 
| 
      
 70 
     | 
    
         
            +
                    {
         
     | 
| 
      
 71 
     | 
    
         
            +
                      "id": "<20210510091252.1.D6347B73DA43962E@DOMAIN.TEST>",
         
     | 
| 
      
 72 
     | 
    
         
            +
                      "message": "Queued. Thank you."
         
     | 
| 
      
 73 
     | 
    
         
            +
                    }
         
     | 
| 
      
 74 
     | 
    
         
            +
                http_version:
         
     | 
| 
      
 75 
     | 
    
         
            +
              recorded_at: Mon, 10 May 2021 09:12:52 GMT
         
     | 
| 
      
 76 
     | 
    
         
            +
            - request:
         
     | 
| 
      
 77 
     | 
    
         
            +
                method: post
         
     | 
| 
      
 78 
     | 
    
         
            +
                uri: https://api.mailgun.net/v3/DOMAIN.TEST/messages
         
     | 
| 
      
 79 
     | 
    
         
            +
                body:
         
     | 
| 
      
 80 
     | 
    
         
            +
                  encoding: US-ASCII
         
     | 
| 
      
 81 
     | 
    
         
            +
                  string: from[]=bob%40DOMAIN.TEST&subject[]=subject&html[]=%3Cp%3ETest%21%3C%2Fp%3E&text[]=Test%21&to[]=bob%40DOMAIN.TEST&h%3Amessage-id=%3C20210510091252.1.D6347B73DA43962E%40DOMAIN.TEST%3E&h%3Acontent-type=multipart%2Falternative%3B+boundary%3D%22--%3D%3D_mimepart_6098f913d64ca_62833fd4d74521802775%22%3B+charset%3DUTF-8
         
     | 
| 
      
 82 
     | 
    
         
            +
                headers:
         
     | 
| 
      
 83 
     | 
    
         
            +
                  Accept:
         
     | 
| 
      
 84 
     | 
    
         
            +
                  - "*/*"
         
     | 
| 
      
 85 
     | 
    
         
            +
                  User-Agent:
         
     | 
| 
      
 86 
     | 
    
         
            +
                  - rest-client/2.1.0 (darwin18.7.0 x86_64) ruby/2.2.2p95
         
     | 
| 
      
 87 
     | 
    
         
            +
                  Content-Length:
         
     | 
| 
      
 88 
     | 
    
         
            +
                  - '370'
         
     | 
| 
      
 89 
     | 
    
         
            +
                  Content-Type:
         
     | 
| 
      
 90 
     | 
    
         
            +
                  - application/x-www-form-urlencoded
         
     | 
| 
      
 91 
     | 
    
         
            +
                  Accept-Encoding:
         
     | 
| 
      
 92 
     | 
    
         
            +
                  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
         
     | 
| 
      
 93 
     | 
    
         
            +
                  Host:
         
     | 
| 
      
 94 
     | 
    
         
            +
                  - api.mailgun.net
         
     | 
| 
      
 95 
     | 
    
         
            +
                  Authorization:
         
     | 
| 
      
 96 
     | 
    
         
            +
                  - Basic YXBpOmQ5MTViNWNkYjlhNTgzNjg1ZDhmM2ZiMWJlYzBmMjBmLTA3YmM3YjA1LWZhNDgxNmEx
         
     | 
| 
      
 97 
     | 
    
         
            +
              response:
         
     | 
| 
      
 98 
     | 
    
         
            +
                status:
         
     | 
| 
      
 99 
     | 
    
         
            +
                  code: 200
         
     | 
| 
      
 100 
     | 
    
         
            +
                  message: OK
         
     | 
| 
      
 101 
     | 
    
         
            +
                headers:
         
     | 
| 
      
 102 
     | 
    
         
            +
                  Access-Control-Allow-Credentials:
         
     | 
| 
      
 103 
     | 
    
         
            +
                  - 'true'
         
     | 
| 
      
 104 
     | 
    
         
            +
                  Access-Control-Allow-Headers:
         
     | 
| 
      
 105 
     | 
    
         
            +
                  - Content-Type, x-requested-with, Authorization
         
     | 
| 
      
 106 
     | 
    
         
            +
                  Access-Control-Allow-Methods:
         
     | 
| 
      
 107 
     | 
    
         
            +
                  - GET, POST, PUT, DELETE, OPTIONS
         
     | 
| 
      
 108 
     | 
    
         
            +
                  Access-Control-Allow-Origin:
         
     | 
| 
      
 109 
     | 
    
         
            +
                  - "*"
         
     | 
| 
      
 110 
     | 
    
         
            +
                  Access-Control-Max-Age:
         
     | 
| 
      
 111 
     | 
    
         
            +
                  - '600'
         
     | 
| 
      
 112 
     | 
    
         
            +
                  Cache-Control:
         
     | 
| 
      
 113 
     | 
    
         
            +
                  - no-store
         
     | 
| 
      
 114 
     | 
    
         
            +
                  Content-Disposition:
         
     | 
| 
      
 115 
     | 
    
         
            +
                  - inline
         
     | 
| 
      
 116 
     | 
    
         
            +
                  Content-Type:
         
     | 
| 
      
 117 
     | 
    
         
            +
                  - application/json
         
     | 
| 
      
 118 
     | 
    
         
            +
                  Date:
         
     | 
| 
      
 119 
     | 
    
         
            +
                  - Mon, 10 May 2021 09:12:56 GMT
         
     | 
| 
      
 120 
     | 
    
         
            +
                  Server:
         
     | 
| 
      
 121 
     | 
    
         
            +
                  - nginx
         
     | 
| 
      
 122 
     | 
    
         
            +
                  Strict-Transport-Security:
         
     | 
| 
      
 123 
     | 
    
         
            +
                  - max-age=63072000; includeSubDomains
         
     | 
| 
      
 124 
     | 
    
         
            +
                  X-Ratelimit-Limit:
         
     | 
| 
      
 125 
     | 
    
         
            +
                  - '2000000'
         
     | 
| 
      
 126 
     | 
    
         
            +
                  X-Ratelimit-Remaining:
         
     | 
| 
      
 127 
     | 
    
         
            +
                  - '1999998'
         
     | 
| 
      
 128 
     | 
    
         
            +
                  X-Ratelimit-Reset:
         
     | 
| 
      
 129 
     | 
    
         
            +
                  - '1620637982656'
         
     | 
| 
      
 130 
     | 
    
         
            +
                  X-Recipient-Limit:
         
     | 
| 
      
 131 
     | 
    
         
            +
                  - '1000000'
         
     | 
| 
      
 132 
     | 
    
         
            +
                  X-Recipient-Remaining:
         
     | 
| 
      
 133 
     | 
    
         
            +
                  - '999998'
         
     | 
| 
      
 134 
     | 
    
         
            +
                  X-Recipient-Reset:
         
     | 
| 
      
 135 
     | 
    
         
            +
                  - '1620637982657'
         
     | 
| 
      
 136 
     | 
    
         
            +
                  Content-Length:
         
     | 
| 
      
 137 
     | 
    
         
            +
                  - '136'
         
     | 
| 
      
 138 
     | 
    
         
            +
                  Connection:
         
     | 
| 
      
 139 
     | 
    
         
            +
                  - keep-alive
         
     | 
| 
      
 140 
     | 
    
         
            +
                body:
         
     | 
| 
      
 141 
     | 
    
         
            +
                  encoding: UTF-8
         
     | 
| 
      
 142 
     | 
    
         
            +
                  string: |-
         
     | 
| 
      
 143 
     | 
    
         
            +
                    {
         
     | 
| 
      
 144 
     | 
    
         
            +
                      "id": "<20210510091252.1.D6347B73DA43962E@DOMAIN.TEST>",
         
     | 
| 
      
 145 
     | 
    
         
            +
                      "message": "Queued. Thank you."
         
     | 
| 
      
 146 
     | 
    
         
            +
                    }
         
     | 
| 
      
 147 
     | 
    
         
            +
                http_version:
         
     | 
| 
      
 148 
     | 
    
         
            +
              recorded_at: Mon, 10 May 2021 09:12:56 GMT
         
     | 
| 
      
 149 
     | 
    
         
            +
            recorded_with: VCR 3.0.3
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,15 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: mailgun-ruby
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.2.6
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Mailgun
         
     | 
| 
       8 
8 
     | 
    
         
             
            - Travis Swientek
         
     | 
| 
       9 
     | 
    
         
            -
            autorequire:
         
     | 
| 
      
 9 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date:  
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2022-11-20 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: bundler
         
     | 
| 
         @@ -192,6 +192,7 @@ files: 
     | 
|
| 
       192 
192 
     | 
    
         
             
            - spec/integration/events_spec.rb
         
     | 
| 
       193 
193 
     | 
    
         
             
            - spec/integration/list_members_spec.rb
         
     | 
| 
       194 
194 
     | 
    
         
             
            - spec/integration/list_spec.rb
         
     | 
| 
      
 195 
     | 
    
         
            +
            - spec/integration/mailer_spec.rb
         
     | 
| 
       195 
196 
     | 
    
         
             
            - spec/integration/mailgun_spec.rb
         
     | 
| 
       196 
197 
     | 
    
         
             
            - spec/integration/messages/sample_data/mime.txt
         
     | 
| 
       197 
198 
     | 
    
         
             
            - spec/integration/routes_spec.rb
         
     | 
| 
         @@ -220,8 +221,10 @@ files: 
     | 
|
| 
       220 
221 
     | 
    
         
             
            - vcr_cassettes/events.yml
         
     | 
| 
       221 
222 
     | 
    
         
             
            - vcr_cassettes/exceptions.yml
         
     | 
| 
       222 
223 
     | 
    
         
             
            - vcr_cassettes/list_members.yml
         
     | 
| 
      
 224 
     | 
    
         
            +
            - vcr_cassettes/mailer_invalid_domain.yml
         
     | 
| 
       223 
225 
     | 
    
         
             
            - vcr_cassettes/mailing_list.todo.yml
         
     | 
| 
       224 
226 
     | 
    
         
             
            - vcr_cassettes/mailing_list.yml
         
     | 
| 
      
 227 
     | 
    
         
            +
            - vcr_cassettes/message_deliver.yml
         
     | 
| 
       225 
228 
     | 
    
         
             
            - vcr_cassettes/routes.yml
         
     | 
| 
       226 
229 
     | 
    
         
             
            - vcr_cassettes/send_message.yml
         
     | 
| 
       227 
230 
     | 
    
         
             
            - vcr_cassettes/stats.yml
         
     | 
| 
         @@ -232,7 +235,7 @@ homepage: http://www.mailgun.com 
     | 
|
| 
       232 
235 
     | 
    
         
             
            licenses:
         
     | 
| 
       233 
236 
     | 
    
         
             
            - Apache-2.0
         
     | 
| 
       234 
237 
     | 
    
         
             
            metadata: {}
         
     | 
| 
       235 
     | 
    
         
            -
            post_install_message:
         
     | 
| 
      
 238 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
       236 
239 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       237 
240 
     | 
    
         
             
            require_paths:
         
     | 
| 
       238 
241 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -247,8 +250,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       247 
250 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       248 
251 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       249 
252 
     | 
    
         
             
            requirements: []
         
     | 
| 
       250 
     | 
    
         
            -
            rubygems_version: 3.0. 
     | 
| 
       251 
     | 
    
         
            -
            signing_key:
         
     | 
| 
      
 253 
     | 
    
         
            +
            rubygems_version: 3.0.3
         
     | 
| 
      
 254 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
       252 
255 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       253 
256 
     | 
    
         
             
            summary: Mailgun's Official Ruby SDK
         
     | 
| 
       254 
257 
     | 
    
         
             
            test_files:
         
     | 
| 
         @@ -260,6 +263,7 @@ test_files: 
     | 
|
| 
       260 
263 
     | 
    
         
             
            - spec/integration/events_spec.rb
         
     | 
| 
       261 
264 
     | 
    
         
             
            - spec/integration/list_members_spec.rb
         
     | 
| 
       262 
265 
     | 
    
         
             
            - spec/integration/list_spec.rb
         
     | 
| 
      
 266 
     | 
    
         
            +
            - spec/integration/mailer_spec.rb
         
     | 
| 
       263 
267 
     | 
    
         
             
            - spec/integration/mailgun_spec.rb
         
     | 
| 
       264 
268 
     | 
    
         
             
            - spec/integration/messages/sample_data/mime.txt
         
     | 
| 
       265 
269 
     | 
    
         
             
            - spec/integration/routes_spec.rb
         
     |