mailgun-tracking 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mailgun/tracking.rb +3 -0
- data/lib/mailgun/tracking/middleware.rb +14 -23
- data/lib/mailgun/tracking/payload.rb +48 -0
- data/lib/mailgun/tracking/request.rb +19 -0
- data/lib/mailgun/tracking/signature.rb +3 -3
- data/lib/mailgun/tracking/util.rb +46 -0
- data/lib/mailgun/tracking/version.rb +2 -2
- data/spec/dummy/rack/application.rb +13 -0
- data/spec/dummy/rails/application.rb +21 -0
- data/spec/dummy/rails/logs/test.log +265 -0
- data/spec/dummy/sinatra/application.rb +7 -0
- data/spec/integration/rack/rack_spec.rb +6 -0
- data/spec/integration/rails/rails_spec.rb +6 -0
- data/spec/integration/sinatra/sinatra_spec.rb +6 -0
- data/spec/mailgun/tracking/middleware_spec.rb +42 -26
- data/spec/mailgun/tracking/payload_spec.rb +40 -0
- data/spec/mailgun/tracking/request_spec.rb +25 -0
- data/spec/mailgun/tracking/subscriber/all_messages_spec.rb +1 -1
- data/spec/mailgun/tracking/subscriber/evented_spec.rb +1 -1
- data/spec/mailgun/tracking/util_spec.rb +155 -0
- data/spec/spec_helper.rb +3 -7
- data/spec/support/shared_examples/integration/acts_as_rack.rb +36 -0
- data/spec/support/shared_examples/subscriber.rb +1 -1
- data/spec/support/simplecov.rb +5 -0
- metadata +170 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2f00cf238e43fe1fbe4b3da28f0ba82c14ddb46
|
4
|
+
data.tar.gz: abb5171204c548e64e0088385b0bd8df1da7dd1a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97249174916ea976f68d3f3c4db86efcc3b711751acd3f4d63806e03097c08ceb3916e4a34ea650043b406f1fd46ef231ca9c8658c1e16910e7765f93f8a91a9
|
7
|
+
data.tar.gz: c105354cd61ec52b16fab64eb7daf95af8164723fa451c1a2810887091f8760166f913ecf1c583ddf0dc86360a4e379cc215f9e120b6b043c0795692b84b2447
|
data/lib/mailgun/tracking.rb
CHANGED
@@ -3,10 +3,13 @@ require 'mailgun/tracking/exceptions'
|
|
3
3
|
require 'mailgun/tracking/listener'
|
4
4
|
require 'mailgun/tracking/middleware'
|
5
5
|
require 'mailgun/tracking/notifier'
|
6
|
+
require 'mailgun/tracking/payload'
|
6
7
|
require 'mailgun/tracking/signature'
|
7
8
|
require 'mailgun/tracking/subscriber'
|
9
|
+
require 'mailgun/tracking/util'
|
8
10
|
require 'mailgun/tracking/version'
|
9
11
|
require 'mailgun/tracking/railtie' if defined?(Rails)
|
12
|
+
require 'mailgun/tracking/request'
|
10
13
|
|
11
14
|
# Module for interacting with the Mailgun.
|
12
15
|
module Mailgun
|
@@ -15,37 +15,28 @@ module Mailgun
|
|
15
15
|
#
|
16
16
|
# @return [Array(Numeric,Hash,Array)] The Rack-style response.
|
17
17
|
def call(env)
|
18
|
-
@
|
19
|
-
|
20
|
-
|
21
|
-
Mailgun::Tracking.notifier.broadcast(request.params.fetch('event'), request.params)
|
22
|
-
null_response
|
23
|
-
else
|
24
|
-
@app.call(env)
|
25
|
-
end
|
18
|
+
@request = Request.new(env)
|
19
|
+
return @app.call(env) unless @request.mailgun_tracking?
|
20
|
+
handle_event
|
26
21
|
end
|
27
22
|
|
28
23
|
private
|
29
24
|
|
30
|
-
#
|
31
|
-
|
32
|
-
|
33
|
-
def request
|
34
|
-
::Rack::Request.new(@env)
|
25
|
+
# @return [Array(Numeric,Hash,Array)] The Rack-style response.
|
26
|
+
def null_response
|
27
|
+
[200, {}, []]
|
35
28
|
end
|
36
29
|
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
def mailgun_tracking_request?
|
41
|
-
return false unless request.post?
|
42
|
-
return false unless request.path == Configuration.instance.endpoint
|
43
|
-
true
|
30
|
+
# @return [Array(Numeric,Hash,Array)] The Rack-style response.
|
31
|
+
def bad_request
|
32
|
+
[400, {}, []]
|
44
33
|
end
|
45
34
|
|
46
|
-
|
47
|
-
|
48
|
-
|
35
|
+
def handle_event
|
36
|
+
Mailgun::Tracking.notifier.broadcast(@request.params.fetch('event'), @request.payload)
|
37
|
+
null_response
|
38
|
+
rescue InvalidSignature
|
39
|
+
bad_request
|
49
40
|
end
|
50
41
|
end
|
51
42
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module Mailgun
|
4
|
+
module Tracking
|
5
|
+
# Payload object.
|
6
|
+
class Payload
|
7
|
+
# Initializes a new Payload object.
|
8
|
+
#
|
9
|
+
# @param options [Hash]
|
10
|
+
#
|
11
|
+
# @return [Mailgun::Tracking::Payload]
|
12
|
+
def initialize(options = {})
|
13
|
+
@options = Util.normalize(options)
|
14
|
+
@original = options
|
15
|
+
define_instance_methods(Set.new(@options.keys), @options)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns a value of the original payload with the given key.
|
19
|
+
#
|
20
|
+
# @param key [String]
|
21
|
+
#
|
22
|
+
# @return a value of the original payload.
|
23
|
+
def [](key)
|
24
|
+
@original[key]
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# @return [Class]
|
30
|
+
def __metaclass__
|
31
|
+
class << self
|
32
|
+
self
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [void]
|
37
|
+
def define_instance_methods(keys, options)
|
38
|
+
__metaclass__.instance_eval do
|
39
|
+
keys.each do |key|
|
40
|
+
define_method(key) { @options[key] }
|
41
|
+
next unless [FalseClass, TrueClass].include?(options[key].class)
|
42
|
+
define_method(:"#{key}?") { @options[key] }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Mailgun
|
2
|
+
module Tracking
|
3
|
+
# Provides a convenient interface to a Rack environment.
|
4
|
+
class Request < ::Rack::Request
|
5
|
+
# Checks if the request is respond to the specified URL.
|
6
|
+
#
|
7
|
+
# @return [Boolean]
|
8
|
+
def mailgun_tracking?
|
9
|
+
return false unless post?
|
10
|
+
path == Configuration.instance.endpoint
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [Mailgun::Tracking::Payload]
|
14
|
+
def payload
|
15
|
+
@payload ||= Payload.new(params)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -23,9 +23,9 @@ module Mailgun
|
|
23
23
|
#
|
24
24
|
# @return [Mailgun::Tracking::Signature]
|
25
25
|
def initialize(payload)
|
26
|
-
@token = payload
|
27
|
-
@timestamp = payload
|
28
|
-
@signature = payload
|
26
|
+
@token = payload['token']
|
27
|
+
@timestamp = payload['timestamp']
|
28
|
+
@signature = payload['signature']
|
29
29
|
end
|
30
30
|
|
31
31
|
# @return [Boolean]
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Mailgun
|
2
|
+
module Tracking
|
3
|
+
# Utility methods.
|
4
|
+
module Util
|
5
|
+
class << self
|
6
|
+
# Returns a new hash with all keys converted to symbols in downcase.
|
7
|
+
#
|
8
|
+
# @param options [Hash]
|
9
|
+
#
|
10
|
+
# @return [Hash]
|
11
|
+
def normalize(options = {})
|
12
|
+
object = normalize_keys(options.dup)
|
13
|
+
object
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def normalize_keys(options)
|
19
|
+
return from_h(options) if options.is_a?(Hash)
|
20
|
+
return from_ary(options) if options.is_a?(Array)
|
21
|
+
options
|
22
|
+
end
|
23
|
+
|
24
|
+
def from_h(options)
|
25
|
+
Hash[options.map do |key, value|
|
26
|
+
[underscore(key), normalize_keys(value)]
|
27
|
+
end]
|
28
|
+
end
|
29
|
+
|
30
|
+
def from_ary(options)
|
31
|
+
options.map(&method(:normalize_keys))
|
32
|
+
end
|
33
|
+
|
34
|
+
def underscore(key)
|
35
|
+
return key unless key.respond_to?(:to_sym)
|
36
|
+
|
37
|
+
key.to_s
|
38
|
+
.dup
|
39
|
+
.tr('-', '_')
|
40
|
+
.downcase
|
41
|
+
.to_sym
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
ENV['RAILS_ENV'] = 'test'
|
2
|
+
|
3
|
+
require 'rails'
|
4
|
+
require 'mailgun/tracking/railtie'
|
5
|
+
|
6
|
+
module Dummy
|
7
|
+
class Application < Rails::Application
|
8
|
+
if Gem::Version.new(Rails.version) < Gem::Version.new('5.2')
|
9
|
+
config.secret_token = '6e394142b6fb6349707ea48841f9cb5898c182c855c002689866aac50d6d4bda'
|
10
|
+
config.secret_key_base = '08e540044922f3ecef8e4e1e672d0f7d1cfa56a80d20e5ee68d8006aab5afb83'
|
11
|
+
end
|
12
|
+
|
13
|
+
log_path = File.join(File.dirname(__FILE__), 'logs', 'test.log')
|
14
|
+
config.logger = Logger.new(log_path)
|
15
|
+
Rails.logger = config.logger
|
16
|
+
|
17
|
+
config.eager_load = false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Dummy::Application.initialize!
|
@@ -0,0 +1,265 @@
|
|
1
|
+
# Logfile created on 2018-03-13 02:09:24 +0200 by logger.rb/56438
|
2
|
+
I, [2018-03-13T02:09:24.712282 #62428] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 02:09:24 +0200
|
3
|
+
I, [2018-03-13T02:09:24.722710 #62428] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 02:09:24 +0200
|
4
|
+
F, [2018-03-13T02:09:24.725562 #62428] FATAL -- :
|
5
|
+
Mailgun::Tracking::InvalidSignature (Mailgun::Tracking::InvalidSignature):
|
6
|
+
lib/mailgun/tracking/signature.rb:16:in `verify!'
|
7
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
8
|
+
lib/mailgun/tracking/middleware.rb:21:in `call'
|
9
|
+
|
10
|
+
|
11
|
+
I, [2018-03-13T02:10:59.655696 #62449] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 02:10:59 +0200
|
12
|
+
I, [2018-03-13T02:10:59.667026 #62449] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 02:10:59 +0200
|
13
|
+
F, [2018-03-13T02:10:59.669988 #62449] FATAL -- :
|
14
|
+
Mailgun::Tracking::InvalidSignature (Mailgun::Tracking::InvalidSignature):
|
15
|
+
lib/mailgun/tracking/signature.rb:16:in `verify!'
|
16
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
17
|
+
lib/mailgun/tracking/middleware.rb:21:in `call'
|
18
|
+
|
19
|
+
|
20
|
+
I, [2018-03-13T08:38:40.694094 #64748] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 08:38:40 +0200
|
21
|
+
I, [2018-03-13T08:38:40.704042 #64748] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 08:38:40 +0200
|
22
|
+
F, [2018-03-13T08:38:40.705522 #64748] FATAL -- :
|
23
|
+
Mailgun::Tracking::InvalidSignature (Mailgun::Tracking::InvalidSignature):
|
24
|
+
lib/mailgun/tracking/signature.rb:16:in `verify!'
|
25
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
26
|
+
lib/mailgun/tracking/middleware.rb:21:in `call'
|
27
|
+
|
28
|
+
|
29
|
+
I, [2018-03-13T08:39:03.847726 #64765] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 08:39:03 +0200
|
30
|
+
I, [2018-03-13T08:39:03.852023 #64765] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 08:39:03 +0200
|
31
|
+
F, [2018-03-13T08:39:03.852909 #64765] FATAL -- :
|
32
|
+
Mailgun::Tracking::InvalidSignature (Mailgun::Tracking::InvalidSignature):
|
33
|
+
lib/mailgun/tracking/signature.rb:16:in `verify!'
|
34
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
35
|
+
lib/mailgun/tracking/middleware.rb:21:in `call'
|
36
|
+
|
37
|
+
|
38
|
+
I, [2018-03-13T08:39:17.294931 #64774] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 08:39:17 +0200
|
39
|
+
I, [2018-03-13T08:39:17.298928 #64774] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 08:39:17 +0200
|
40
|
+
F, [2018-03-13T08:39:17.299795 #64774] FATAL -- :
|
41
|
+
Mailgun::Tracking::InvalidSignature (Mailgun::Tracking::InvalidSignature):
|
42
|
+
lib/mailgun/tracking/signature.rb:16:in `verify!'
|
43
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
44
|
+
lib/mailgun/tracking/middleware.rb:21:in `call'
|
45
|
+
|
46
|
+
|
47
|
+
I, [2018-03-13T08:41:25.137308 #64797] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 08:41:25 +0200
|
48
|
+
I, [2018-03-13T08:41:25.142976 #64797] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 08:41:25 +0200
|
49
|
+
F, [2018-03-13T08:41:25.144406 #64797] FATAL -- :
|
50
|
+
Mailgun::Tracking::InvalidSignature (my body):
|
51
|
+
lib/mailgun/tracking/signature.rb:16:in `verify!'
|
52
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
53
|
+
lib/mailgun/tracking/middleware.rb:21:in `call'
|
54
|
+
|
55
|
+
|
56
|
+
I, [2018-03-13T22:25:16.416799 #69766] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 22:25:16 +0200
|
57
|
+
I, [2018-03-13T22:25:16.424802 #69766] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 22:25:16 +0200
|
58
|
+
I, [2018-03-13T22:25:19.501498 #69773] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 22:25:19 +0200
|
59
|
+
I, [2018-03-13T22:25:19.505520 #69773] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 22:25:19 +0200
|
60
|
+
I, [2018-03-13T22:25:22.425417 #69780] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 22:25:22 +0200
|
61
|
+
I, [2018-03-13T22:25:22.429369 #69780] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-03-13 22:25:22 +0200
|
62
|
+
I, [2018-04-24T23:54:45.990614 #56787] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-24 23:54:45 +0300
|
63
|
+
I, [2018-04-24T23:54:46.000997 #56787] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-24 23:54:46 +0300
|
64
|
+
I, [2018-04-24T23:54:51.691821 #56835] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-24 23:54:51 +0300
|
65
|
+
I, [2018-04-24T23:54:51.703559 #56835] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-24 23:54:51 +0300
|
66
|
+
I, [2018-04-24T23:54:55.783263 #56885] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-24 23:54:55 +0300
|
67
|
+
I, [2018-04-24T23:54:55.787896 #56885] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-24 23:54:55 +0300
|
68
|
+
I, [2018-04-25T00:00:15.262401 #59573] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:00:15 +0300
|
69
|
+
I, [2018-04-25T00:00:15.268608 #59573] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:00:15 +0300
|
70
|
+
I, [2018-04-25T00:07:31.673037 #63234] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:07:31 +0300
|
71
|
+
I, [2018-04-25T00:07:31.682855 #63234] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:07:31 +0300
|
72
|
+
I, [2018-04-25T00:08:47.589229 #63857] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:08:47 +0300
|
73
|
+
I, [2018-04-25T00:08:47.596643 #63857] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:08:47 +0300
|
74
|
+
I, [2018-04-25T00:08:58.855994 #63961] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:08:58 +0300
|
75
|
+
I, [2018-04-25T00:08:58.863090 #63961] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:08:58 +0300
|
76
|
+
I, [2018-04-25T00:38:43.511002 #78948] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:38:43 +0300
|
77
|
+
F, [2018-04-25T00:38:43.512861 #78948] FATAL -- :
|
78
|
+
F, [2018-04-25T00:38:43.514548 #78948] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007f8ceba814a0>):
|
79
|
+
F, [2018-04-25T00:38:43.514605 #78948] FATAL -- :
|
80
|
+
F, [2018-04-25T00:38:43.514635 #78948] FATAL -- : lib/mailgun/tracking/signature.rb:26:in `initialize'
|
81
|
+
lib/mailgun/tracking/signature.rb:15:in `new'
|
82
|
+
lib/mailgun/tracking/signature.rb:15:in `verify!'
|
83
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
84
|
+
lib/mailgun/tracking/middleware.rb:36:in `handle_event'
|
85
|
+
lib/mailgun/tracking/middleware.rb:20:in `call'
|
86
|
+
I, [2018-04-25T00:38:43.547794 #78948] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:38:43 +0300
|
87
|
+
F, [2018-04-25T00:38:43.549697 #78948] FATAL -- :
|
88
|
+
F, [2018-04-25T00:38:43.551181 #78948] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007f8cecdae438>):
|
89
|
+
F, [2018-04-25T00:38:43.551248 #78948] FATAL -- :
|
90
|
+
F, [2018-04-25T00:38:43.551277 #78948] FATAL -- : lib/mailgun/tracking/signature.rb:26:in `initialize'
|
91
|
+
lib/mailgun/tracking/signature.rb:15:in `new'
|
92
|
+
lib/mailgun/tracking/signature.rb:15:in `verify!'
|
93
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
94
|
+
lib/mailgun/tracking/middleware.rb:36:in `handle_event'
|
95
|
+
lib/mailgun/tracking/middleware.rb:20:in `call'
|
96
|
+
I, [2018-04-25T00:48:43.869200 #83812] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:48:43 +0300
|
97
|
+
F, [2018-04-25T00:48:43.870774 #83812] FATAL -- :
|
98
|
+
F, [2018-04-25T00:48:43.872805 #83812] FATAL -- : NameError (undefined local variable or method `byebug' for Mailgun::Tracking::Signature:Class):
|
99
|
+
F, [2018-04-25T00:48:43.872870 #83812] FATAL -- :
|
100
|
+
F, [2018-04-25T00:48:43.872901 #83812] FATAL -- : lib/mailgun/tracking/signature.rb:15:in `verify!'
|
101
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
102
|
+
lib/mailgun/tracking/middleware.rb:36:in `handle_event'
|
103
|
+
lib/mailgun/tracking/middleware.rb:20:in `call'
|
104
|
+
I, [2018-04-25T00:48:43.889608 #83812] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:48:43 +0300
|
105
|
+
F, [2018-04-25T00:48:43.890865 #83812] FATAL -- :
|
106
|
+
F, [2018-04-25T00:48:43.893656 #83812] FATAL -- : NameError (undefined local variable or method `byebug' for Mailgun::Tracking::Signature:Class):
|
107
|
+
F, [2018-04-25T00:48:43.893905 #83812] FATAL -- :
|
108
|
+
F, [2018-04-25T00:48:43.893958 #83812] FATAL -- : lib/mailgun/tracking/signature.rb:15:in `verify!'
|
109
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
110
|
+
lib/mailgun/tracking/middleware.rb:36:in `handle_event'
|
111
|
+
lib/mailgun/tracking/middleware.rb:20:in `call'
|
112
|
+
I, [2018-04-25T00:53:34.805027 #86157] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:53:34 +0300
|
113
|
+
F, [2018-04-25T00:53:34.807247 #86157] FATAL -- :
|
114
|
+
F, [2018-04-25T00:53:34.810283 #86157] FATAL -- : NameError (undefined local variable or method `byebug' for Mailgun::Tracking::Signature:Class):
|
115
|
+
F, [2018-04-25T00:53:34.810349 #86157] FATAL -- :
|
116
|
+
F, [2018-04-25T00:53:34.810377 #86157] FATAL -- : lib/mailgun/tracking/signature.rb:15:in `verify!'
|
117
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
118
|
+
lib/mailgun/tracking/middleware.rb:40:in `handle_event'
|
119
|
+
lib/mailgun/tracking/middleware.rb:24:in `call'
|
120
|
+
I, [2018-04-25T00:53:34.843504 #86157] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:53:34 +0300
|
121
|
+
F, [2018-04-25T00:53:34.844661 #86157] FATAL -- :
|
122
|
+
F, [2018-04-25T00:53:34.846829 #86157] FATAL -- : NameError (undefined local variable or method `byebug' for Mailgun::Tracking::Signature:Class):
|
123
|
+
F, [2018-04-25T00:53:34.846880 #86157] FATAL -- :
|
124
|
+
F, [2018-04-25T00:53:34.846916 #86157] FATAL -- : lib/mailgun/tracking/signature.rb:15:in `verify!'
|
125
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
126
|
+
lib/mailgun/tracking/middleware.rb:40:in `handle_event'
|
127
|
+
lib/mailgun/tracking/middleware.rb:24:in `call'
|
128
|
+
I, [2018-04-25T00:53:52.418577 #86317] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:53:52 +0300
|
129
|
+
F, [2018-04-25T00:53:52.421746 #86317] FATAL -- :
|
130
|
+
F, [2018-04-25T00:53:52.422655 #86317] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007f805be0b748>):
|
131
|
+
F, [2018-04-25T00:53:52.422713 #86317] FATAL -- :
|
132
|
+
F, [2018-04-25T00:53:52.422754 #86317] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
133
|
+
I, [2018-04-25T00:53:52.440588 #86317] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:53:52 +0300
|
134
|
+
F, [2018-04-25T00:53:52.442091 #86317] FATAL -- :
|
135
|
+
F, [2018-04-25T00:53:52.443770 #86317] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007f805bbf0e90>):
|
136
|
+
F, [2018-04-25T00:53:52.443907 #86317] FATAL -- :
|
137
|
+
F, [2018-04-25T00:53:52.443978 #86317] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
138
|
+
I, [2018-04-25T00:54:12.690958 #86480] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:54:12 +0300
|
139
|
+
F, [2018-04-25T00:54:12.693626 #86480] FATAL -- :
|
140
|
+
F, [2018-04-25T00:54:12.695061 #86480] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007ff19b999e38>):
|
141
|
+
F, [2018-04-25T00:54:12.695282 #86480] FATAL -- :
|
142
|
+
F, [2018-04-25T00:54:12.695543 #86480] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
143
|
+
I, [2018-04-25T00:54:12.720314 #86480] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:54:12 +0300
|
144
|
+
F, [2018-04-25T00:54:12.724327 #86480] FATAL -- :
|
145
|
+
F, [2018-04-25T00:54:12.726678 #86480] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007ff19aac9728>):
|
146
|
+
F, [2018-04-25T00:54:12.726765 #86480] FATAL -- :
|
147
|
+
F, [2018-04-25T00:54:12.726807 #86480] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
148
|
+
I, [2018-04-25T00:54:35.111183 #86674] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:54:35 +0300
|
149
|
+
F, [2018-04-25T00:54:35.112388 #86674] FATAL -- :
|
150
|
+
F, [2018-04-25T00:54:35.118882 #86674] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007fc9d6beb2a0>):
|
151
|
+
F, [2018-04-25T00:54:35.119460 #86674] FATAL -- :
|
152
|
+
F, [2018-04-25T00:54:35.119694 #86674] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
153
|
+
I, [2018-04-25T00:54:35.162204 #86674] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:54:35 +0300
|
154
|
+
F, [2018-04-25T00:54:35.163190 #86674] FATAL -- :
|
155
|
+
F, [2018-04-25T00:54:35.167260 #86674] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007fc9d72497c8>):
|
156
|
+
F, [2018-04-25T00:54:35.167365 #86674] FATAL -- :
|
157
|
+
F, [2018-04-25T00:54:35.167403 #86674] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
158
|
+
I, [2018-04-25T00:56:19.898594 #87530] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:56:19 +0300
|
159
|
+
F, [2018-04-25T00:56:19.899799 #87530] FATAL -- :
|
160
|
+
F, [2018-04-25T00:56:19.901352 #87530] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007fceee989300>):
|
161
|
+
F, [2018-04-25T00:56:19.901480 #87530] FATAL -- :
|
162
|
+
F, [2018-04-25T00:56:19.901564 #87530] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
163
|
+
I, [2018-04-25T00:56:19.920298 #87530] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:56:19 +0300
|
164
|
+
F, [2018-04-25T00:56:19.921323 #87530] FATAL -- :
|
165
|
+
F, [2018-04-25T00:56:19.923080 #87530] FATAL -- : NoMethodError (undefined method `fetch' for #<Mailgun::Tracking::Payload:0x007fceee15e630>):
|
166
|
+
F, [2018-04-25T00:56:19.923140 #87530] FATAL -- :
|
167
|
+
F, [2018-04-25T00:56:19.923170 #87530] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
168
|
+
I, [2018-04-25T00:56:40.364193 #87701] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:56:40 +0300
|
169
|
+
F, [2018-04-25T00:56:40.369388 #87701] FATAL -- :
|
170
|
+
F, [2018-04-25T00:56:40.372063 #87701] FATAL -- : NameError (undefined local variable or method `byebug' for Mailgun::Tracking::Signature:Class):
|
171
|
+
F, [2018-04-25T00:56:40.372275 #87701] FATAL -- :
|
172
|
+
F, [2018-04-25T00:56:40.372395 #87701] FATAL -- : lib/mailgun/tracking/signature.rb:15:in `verify!'
|
173
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
174
|
+
lib/mailgun/tracking/middleware.rb:40:in `handle_event'
|
175
|
+
lib/mailgun/tracking/middleware.rb:24:in `call'
|
176
|
+
I, [2018-04-25T00:56:40.397076 #87701] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:56:40 +0300
|
177
|
+
F, [2018-04-25T00:56:40.410666 #87701] FATAL -- :
|
178
|
+
F, [2018-04-25T00:56:40.412877 #87701] FATAL -- : NameError (undefined local variable or method `byebug' for Mailgun::Tracking::Signature:Class):
|
179
|
+
F, [2018-04-25T00:56:40.412945 #87701] FATAL -- :
|
180
|
+
F, [2018-04-25T00:56:40.412976 #87701] FATAL -- : lib/mailgun/tracking/signature.rb:15:in `verify!'
|
181
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
182
|
+
lib/mailgun/tracking/middleware.rb:40:in `handle_event'
|
183
|
+
lib/mailgun/tracking/middleware.rb:24:in `call'
|
184
|
+
I, [2018-04-25T00:57:36.260230 #88155] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:57:36 +0300
|
185
|
+
F, [2018-04-25T00:57:36.262725 #88155] FATAL -- :
|
186
|
+
F, [2018-04-25T00:57:36.265357 #88155] FATAL -- : NameError (undefined local variable or method `byebug' for Mailgun::Tracking::Signature:Class):
|
187
|
+
F, [2018-04-25T00:57:36.265430 #88155] FATAL -- :
|
188
|
+
F, [2018-04-25T00:57:36.265463 #88155] FATAL -- : lib/mailgun/tracking/signature.rb:15:in `verify!'
|
189
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
190
|
+
lib/mailgun/tracking/middleware.rb:40:in `handle_event'
|
191
|
+
lib/mailgun/tracking/middleware.rb:24:in `call'
|
192
|
+
I, [2018-04-25T00:57:36.285782 #88155] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 00:57:36 +0300
|
193
|
+
F, [2018-04-25T00:57:36.286942 #88155] FATAL -- :
|
194
|
+
F, [2018-04-25T00:57:36.290573 #88155] FATAL -- : NameError (undefined local variable or method `byebug' for Mailgun::Tracking::Signature:Class):
|
195
|
+
F, [2018-04-25T00:57:36.290683 #88155] FATAL -- :
|
196
|
+
F, [2018-04-25T00:57:36.290738 #88155] FATAL -- : lib/mailgun/tracking/signature.rb:15:in `verify!'
|
197
|
+
lib/mailgun/tracking/notifier.rb:49:in `broadcast'
|
198
|
+
lib/mailgun/tracking/middleware.rb:40:in `handle_event'
|
199
|
+
lib/mailgun/tracking/middleware.rb:24:in `call'
|
200
|
+
I, [2018-04-25T01:00:24.482163 #89518] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:00:24 +0300
|
201
|
+
F, [2018-04-25T01:00:24.483351 #89518] FATAL -- :
|
202
|
+
F, [2018-04-25T01:00:24.484093 #89518] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007f7fec629350>):
|
203
|
+
F, [2018-04-25T01:00:24.484132 #89518] FATAL -- :
|
204
|
+
F, [2018-04-25T01:00:24.484160 #89518] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
205
|
+
I, [2018-04-25T01:00:24.500588 #89518] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:00:24 +0300
|
206
|
+
F, [2018-04-25T01:00:24.501884 #89518] FATAL -- :
|
207
|
+
F, [2018-04-25T01:00:24.503478 #89518] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007f7fec98fd00>):
|
208
|
+
F, [2018-04-25T01:00:24.503569 #89518] FATAL -- :
|
209
|
+
F, [2018-04-25T01:00:24.503604 #89518] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
210
|
+
I, [2018-04-25T01:06:18.020376 #92376] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:06:18 +0300
|
211
|
+
F, [2018-04-25T01:06:18.022654 #92376] FATAL -- :
|
212
|
+
F, [2018-04-25T01:06:18.023686 #92376] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007fe17257e8f0>):
|
213
|
+
F, [2018-04-25T01:06:18.023752 #92376] FATAL -- :
|
214
|
+
F, [2018-04-25T01:06:18.023782 #92376] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
215
|
+
I, [2018-04-25T01:06:18.046236 #92376] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:06:18 +0300
|
216
|
+
F, [2018-04-25T01:06:18.050229 #92376] FATAL -- :
|
217
|
+
F, [2018-04-25T01:06:18.051960 #92376] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007fe17227f6e0>):
|
218
|
+
F, [2018-04-25T01:06:18.052053 #92376] FATAL -- :
|
219
|
+
F, [2018-04-25T01:06:18.052166 #92376] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
220
|
+
I, [2018-04-25T01:08:11.572026 #93296] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:08:11 +0300
|
221
|
+
F, [2018-04-25T01:08:11.573663 #93296] FATAL -- :
|
222
|
+
F, [2018-04-25T01:08:11.574775 #93296] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007faf30b14068>):
|
223
|
+
F, [2018-04-25T01:08:11.574851 #93296] FATAL -- :
|
224
|
+
F, [2018-04-25T01:08:11.574881 #93296] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
225
|
+
I, [2018-04-25T01:08:11.616464 #93296] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:08:11 +0300
|
226
|
+
F, [2018-04-25T01:08:11.618955 #93296] FATAL -- :
|
227
|
+
F, [2018-04-25T01:08:11.621841 #93296] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007faf3121d0f8>):
|
228
|
+
F, [2018-04-25T01:08:11.621983 #93296] FATAL -- :
|
229
|
+
F, [2018-04-25T01:08:11.622034 #93296] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
230
|
+
I, [2018-04-25T01:13:21.005144 #95792] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:13:21 +0300
|
231
|
+
F, [2018-04-25T01:13:21.006914 #95792] FATAL -- :
|
232
|
+
F, [2018-04-25T01:13:21.008123 #95792] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007fd8ffb037b0>):
|
233
|
+
F, [2018-04-25T01:13:21.008248 #95792] FATAL -- :
|
234
|
+
F, [2018-04-25T01:13:21.008302 #95792] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
235
|
+
I, [2018-04-25T01:13:21.038503 #95792] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:13:21 +0300
|
236
|
+
F, [2018-04-25T01:13:21.039845 #95792] FATAL -- :
|
237
|
+
F, [2018-04-25T01:13:21.040729 #95792] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007fd900937958>):
|
238
|
+
F, [2018-04-25T01:13:21.040800 #95792] FATAL -- :
|
239
|
+
F, [2018-04-25T01:13:21.040831 #95792] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
240
|
+
I, [2018-04-25T01:17:15.396272 #97683] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:17:15 +0300
|
241
|
+
F, [2018-04-25T01:17:15.403730 #97683] FATAL -- :
|
242
|
+
F, [2018-04-25T01:17:15.405512 #97683] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007fcde4c50d78>):
|
243
|
+
F, [2018-04-25T01:17:15.405604 #97683] FATAL -- :
|
244
|
+
F, [2018-04-25T01:17:15.405647 #97683] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
245
|
+
I, [2018-04-25T01:17:15.445812 #97683] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:17:15 +0300
|
246
|
+
F, [2018-04-25T01:17:15.447281 #97683] FATAL -- :
|
247
|
+
F, [2018-04-25T01:17:15.448444 #97683] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007fcde621f640>):
|
248
|
+
F, [2018-04-25T01:17:15.448509 #97683] FATAL -- :
|
249
|
+
F, [2018-04-25T01:17:15.448548 #97683] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
250
|
+
I, [2018-04-25T01:21:59.959527 #107] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:21:59 +0300
|
251
|
+
F, [2018-04-25T01:21:59.960780 #107] FATAL -- :
|
252
|
+
F, [2018-04-25T01:21:59.961522 #107] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007ff84c37c6d8>):
|
253
|
+
F, [2018-04-25T01:21:59.961581 #107] FATAL -- :
|
254
|
+
F, [2018-04-25T01:21:59.961614 #107] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
255
|
+
I, [2018-04-25T01:21:59.979076 #107] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:21:59 +0300
|
256
|
+
F, [2018-04-25T01:21:59.980047 #107] FATAL -- :
|
257
|
+
F, [2018-04-25T01:21:59.980745 #107] FATAL -- : NoMethodError (undefined method `aaaaa' for #<Mailgun::Tracking::Payload:0x007ff84bafc2d8>):
|
258
|
+
F, [2018-04-25T01:21:59.980776 #107] FATAL -- :
|
259
|
+
F, [2018-04-25T01:21:59.980798 #107] FATAL -- : lib/mailgun/tracking/middleware.rb:20:in `call'
|
260
|
+
I, [2018-04-25T01:25:18.509356 #1957] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:25:18 +0300
|
261
|
+
I, [2018-04-25T01:25:18.512813 #1957] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-25 01:25:18 +0300
|
262
|
+
I, [2018-04-26T21:42:44.416704 #41944] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-26 21:42:44 +0300
|
263
|
+
I, [2018-04-26T21:42:44.428936 #41944] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-26 21:42:44 +0300
|
264
|
+
I, [2018-04-26T22:52:44.142521 #49169] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-26 22:52:44 +0300
|
265
|
+
I, [2018-04-26T22:52:44.146943 #49169] INFO -- : Started POST "/mailgun" for 127.0.0.1 at 2018-04-26 22:52:44 +0300
|
@@ -3,45 +3,61 @@ require 'spec_helper'
|
|
3
3
|
RSpec.describe Mailgun::Tracking::Middleware do
|
4
4
|
subject(:rack) { described_class.new(app) }
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
before do
|
13
|
-
allow(notifier).to receive(:broadcast)
|
14
|
-
allow(Mailgun::Tracking).to receive(:notifier) { notifier }
|
15
|
-
end
|
6
|
+
let(:app) { proc { [200, {}, []] } }
|
7
|
+
let(:notifier) { instance_double(Mailgun::Tracking::Notifier) }
|
8
|
+
let(:request) { instance_double(Mailgun::Tracking::Request) }
|
9
|
+
let(:env) { env_for('http://localhost:3000') }
|
10
|
+
let(:payload) { instance_double(Mailgun::Tracking::Payload) }
|
16
11
|
|
17
|
-
|
18
|
-
|
12
|
+
before do
|
13
|
+
allow(request).to receive(:payload).and_return(payload)
|
14
|
+
allow(Mailgun::Tracking).to receive(:notifier).and_return(notifier)
|
15
|
+
allow(Mailgun::Tracking::Request).to receive(:new).with(env).and_return(request)
|
16
|
+
end
|
19
17
|
|
20
|
-
|
18
|
+
describe '#call' do
|
19
|
+
context 'when request is not respond to the specified URL' do
|
20
|
+
before do
|
21
|
+
allow(request).to receive(:mailgun_tracking?).and_return(false)
|
22
|
+
allow(notifier).to receive(:broadcast)
|
23
|
+
end
|
24
|
+
|
25
|
+
it { expect(rack.call(env)).to include(200) }
|
21
26
|
it do
|
22
|
-
|
23
|
-
expect(
|
27
|
+
rack.call(env)
|
28
|
+
expect(Mailgun::Tracking).not_to have_received(:notifier)
|
24
29
|
end
|
25
30
|
end
|
26
31
|
|
27
|
-
context 'when
|
28
|
-
let(:
|
32
|
+
context 'when request is respond to the specified URL and the signature comparison is unsuccessful' do
|
33
|
+
let(:params) { fixture('delivered.json') }
|
29
34
|
|
30
|
-
|
35
|
+
before do
|
36
|
+
allow(notifier).to receive(:broadcast).and_raise(Mailgun::Tracking::InvalidSignature)
|
37
|
+
allow(request).to receive(:mailgun_tracking?).and_return(true)
|
38
|
+
allow(request).to receive(:params).and_return(params)
|
39
|
+
end
|
40
|
+
|
41
|
+
it { expect(rack.call(env)).to include(400) }
|
31
42
|
it do
|
32
|
-
|
33
|
-
expect(Mailgun::Tracking).
|
43
|
+
rack.call(env)
|
44
|
+
expect(Mailgun::Tracking).to have_received(:notifier)
|
34
45
|
end
|
35
46
|
end
|
36
47
|
|
37
|
-
context 'when
|
38
|
-
let(:
|
39
|
-
let(:code) { rack.call(env)[0] }
|
48
|
+
context 'when request is respond to the specified URL and the signature comparison is successful' do
|
49
|
+
let(:params) { fixture('delivered.json') }
|
40
50
|
|
41
|
-
|
51
|
+
before do
|
52
|
+
allow(request).to receive(:mailgun_tracking?).and_return(true)
|
53
|
+
allow(request).to receive(:params).and_return(params)
|
54
|
+
allow(notifier).to receive(:broadcast)
|
55
|
+
end
|
56
|
+
|
57
|
+
it { expect(rack.call(env)).to include(200) }
|
42
58
|
it do
|
43
|
-
|
44
|
-
expect(Mailgun::Tracking).
|
59
|
+
rack.call(env)
|
60
|
+
expect(Mailgun::Tracking).to have_received(:notifier)
|
45
61
|
end
|
46
62
|
end
|
47
63
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Mailgun::Tracking::Payload do
|
4
|
+
subject(:payload) { described_class.new(options) }
|
5
|
+
|
6
|
+
describe '#[]' do
|
7
|
+
let(:options) do
|
8
|
+
{
|
9
|
+
'Message-Id' => '<payload@mailgun-tracking.com>'
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns the value object from original payload' do
|
14
|
+
expect(payload['Message-Id']).to eq(options['Message-Id'])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#respond_to?' do
|
19
|
+
let(:options) do
|
20
|
+
{
|
21
|
+
'Message-Id' => '<payload@mailgun-tracking.com>'
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
it { is_expected.to respond_to(:message_id) }
|
26
|
+
it { expect(payload.message_id).to eq(options['Message-Id']) }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when the options include a boolean data type' do
|
30
|
+
let(:options) do
|
31
|
+
{
|
32
|
+
boolean: true,
|
33
|
+
string: 'string'
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
it { is_expected.to be_boolean }
|
38
|
+
it { is_expected.to respond_to(:boolean?) }
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Mailgun::Tracking::Request do
|
4
|
+
subject(:request) { described_class.new(env) }
|
5
|
+
|
6
|
+
describe '#mailgun_tracking?' do
|
7
|
+
context 'when a request to a endpoint with a POST method' do
|
8
|
+
let(:env) { env_for('http://localhost:3000/mailgun', method: :post) }
|
9
|
+
|
10
|
+
it { is_expected.to be_mailgun_tracking }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when a request to a endpoint with a POST method' do
|
14
|
+
let(:env) { env_for('http://localhost:3000/mailgun', method: :get) }
|
15
|
+
|
16
|
+
it { is_expected.not_to be_mailgun_tracking }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when the request is not to the endpoint' do
|
20
|
+
let(:env) { env_for('http://localhost:3000') }
|
21
|
+
|
22
|
+
it { is_expected.not_to be_mailgun_tracking }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
RSpec.describe Mailgun::Tracking::Subscriber::Evented do
|
4
4
|
subject(:subscriber) { described_class.new('delivered', callable) }
|
5
5
|
|
6
|
-
it_behaves_like
|
6
|
+
it_behaves_like 'subscriber'
|
7
7
|
|
8
8
|
describe '#subscribed_to?' do
|
9
9
|
let(:callable) { proc {} }
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Mailgun::Tracking::Util do
|
4
|
+
describe '.normalize' do
|
5
|
+
context 'when the keys of the object are strings' do
|
6
|
+
let(:object) do
|
7
|
+
{ 'a' => 1, 'b' => 2 }
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'returns normalized object' do
|
11
|
+
expect(described_class.normalize(object)).to eq(a: 1, b: 2)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when the object has deep string keys' do
|
16
|
+
let(:object) do
|
17
|
+
{ 'a' => { 'b' => { 'c' => 3 } } }
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'returns normalized object' do
|
21
|
+
expect(described_class.normalize(object)).to eq(a: { b: { c: 3 } })
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when the keys of the object are symbols' do
|
26
|
+
let(:object) do
|
27
|
+
{ a: 1, b: 2 }
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns normalized object' do
|
31
|
+
expect(described_class.normalize(object)).to eq(object)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when an object has deep symbol keys' do
|
36
|
+
let(:object) do
|
37
|
+
{ a: { b: { c: 3 } } }
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'returns normalized object' do
|
41
|
+
expect(described_class.normalize(object)).to eq(object)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when the keys of the object are mixed' do
|
46
|
+
let(:object) do
|
47
|
+
{ :a => 1, 'b' => 2 }
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'returns normalized object' do
|
51
|
+
expect(described_class.normalize(object)).to eq(a: 1, b: 2)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when the keys of the object are integers' do
|
56
|
+
let(:object) do
|
57
|
+
{ 0 => 1, 1 => 2 }
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'returns normalized object' do
|
61
|
+
expect(described_class.normalize(object)).to eq(0 => 1, 1 => 2)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'when an object has deep integer keys' do
|
66
|
+
let(:object) do
|
67
|
+
{ 0 => { 1 => { 2 => 3 } } }
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'returns normalized object' do
|
71
|
+
expect(described_class.normalize(object)).to eq(0 => { 1 => { 2 => 3 } })
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when the key of the object is illegal symbol' do
|
76
|
+
let(:object) do
|
77
|
+
{ [] => 3 }
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'returns normalized object' do
|
81
|
+
expect(described_class.normalize(object)).to eq([] => 3)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when an object has deep illegal symbol keys' do
|
86
|
+
let(:object) do
|
87
|
+
{ [] => { [] => 3 } }
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'returns normalized object' do
|
91
|
+
expect(described_class.normalize(object)).to eq([] => { [] => 3 })
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'when the keys of the object are upcase strings' do
|
96
|
+
let(:object) do
|
97
|
+
{ 'A' => 1, 'B' => 2 }
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'returns normalized object' do
|
101
|
+
expect(described_class.normalize(object)).to eq(a: 1, b: 2)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'when an object has deep upcase string keys' do
|
106
|
+
let(:object) do
|
107
|
+
{ 'A' => { 'B' => { 'C' => 3 } } }
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'returns normalized object' do
|
111
|
+
expect(described_class.normalize(object)).to eq(a: { b: { c: 3 } })
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'when the object value is an array of stringified hashes' do
|
116
|
+
let(:object) do
|
117
|
+
{ 'a' => [{ 'b' => 2 }, { 'c' => 3 }, 4] }
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'returns normalized object' do
|
121
|
+
expect(described_class.normalize(object)).to eq(a: [{ b: 2 }, { c: 3 }, 4])
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'when the object value is an array of symbolized hashes' do
|
126
|
+
let(:object) do
|
127
|
+
{ a: [{ b: 2 }, { c: 3 }, 4] }
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'returns normalized object' do
|
131
|
+
expect(described_class.normalize(object)).to eq(object)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'when the object value is an array of mixed hashes' do
|
136
|
+
let(:object) do
|
137
|
+
{ a: [{ b: 2 }, { 'c' => 3 }, 4] }
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'returns normalized object' do
|
141
|
+
expect(described_class.normalize(object)).to eq(a: [{ b: 2 }, { c: 3 }, 4])
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'when the object value is an array of upcased hashes' do
|
146
|
+
let(:object) do
|
147
|
+
{ 'A' => [{ 'B' => 2 }, { 'C' => 3 }, 4] }
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'returns normalized object' do
|
151
|
+
expect(described_class.normalize(object)).to eq(a: [{ b: 2 }, { c: 3 }, 4])
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,16 +1,12 @@
|
|
1
|
-
require 'rack'
|
2
|
-
require 'simplecov'
|
1
|
+
require 'rack/test'
|
3
2
|
require 'bundler/setup'
|
4
3
|
require 'mailgun/tracking'
|
5
4
|
|
6
|
-
|
7
|
-
require_relative 'support/rack_helpers'
|
8
|
-
require_relative 'support/shared_examples/subscriber'
|
9
|
-
|
10
|
-
SimpleCov.start
|
5
|
+
Dir.glob(File.expand_path('support/**/*.rb', __dir__), &method(:require))
|
11
6
|
|
12
7
|
RSpec.configure do |config|
|
13
8
|
config.include(RackHelpers)
|
9
|
+
config.include(Rack::Test::Methods, type: :integration)
|
14
10
|
|
15
11
|
config.before do
|
16
12
|
Mailgun::Tracking.configure do |c|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Delivered
|
2
|
+
def call(payload); end
|
3
|
+
end
|
4
|
+
|
5
|
+
RSpec.shared_examples 'acts as rack' do
|
6
|
+
let(:app) { Dummy::Application }
|
7
|
+
let(:payload) { fixture('delivered.json') }
|
8
|
+
let(:delivered) { instance_double(Delivered) }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(delivered).to receive(:call)
|
12
|
+
allow(Delivered).to receive(:new).and_return(delivered)
|
13
|
+
|
14
|
+
Mailgun::Tracking.notifier.subscribe(:delivered, Delivered.new)
|
15
|
+
|
16
|
+
Mailgun::Tracking.notifier.subscribe :bounced do |payload|
|
17
|
+
Delivered.new.call(payload)
|
18
|
+
end
|
19
|
+
|
20
|
+
Mailgun::Tracking.notifier.all(Delivered.new)
|
21
|
+
end
|
22
|
+
|
23
|
+
it do
|
24
|
+
post('/mailgun', payload)
|
25
|
+
expect(delivered).to have_received(:call).with(instance_of(Mailgun::Tracking::Payload)).twice
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when the signature comparison is unsuccessful' do
|
29
|
+
before { payload['timestamp'] = '' }
|
30
|
+
|
31
|
+
it do
|
32
|
+
post('/mailgun', payload)
|
33
|
+
expect(last_response).to be_bad_request
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailgun-tracking
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Chubchenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
12
|
-
dependencies:
|
11
|
+
date: 2018-05-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: appraisal
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.2'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.16'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.16'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: codeclimate-test-reporter
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 1.0.8
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '1.0'
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.0.8
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rack-test
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rake
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '10.0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '10.0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rspec
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '3.7'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '3.7'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rubocop
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.55.0
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 0.55.0
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: rubocop-rspec
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '1.25'
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 1.25.1
|
127
|
+
type: :development
|
128
|
+
prerelease: false
|
129
|
+
version_requirements: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - "~>"
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '1.25'
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: 1.25.1
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: simplecov
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - "~>"
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: 0.12.0
|
144
|
+
type: :development
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - "~>"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: 0.12.0
|
13
151
|
description: Integration with Mailgun Webhooks
|
14
152
|
email:
|
15
153
|
- artem.chubchenko@gmail.com
|
@@ -25,27 +163,42 @@ files:
|
|
25
163
|
- lib/mailgun/tracking/listener.rb
|
26
164
|
- lib/mailgun/tracking/middleware.rb
|
27
165
|
- lib/mailgun/tracking/notifier.rb
|
166
|
+
- lib/mailgun/tracking/payload.rb
|
28
167
|
- lib/mailgun/tracking/railtie.rb
|
168
|
+
- lib/mailgun/tracking/request.rb
|
29
169
|
- lib/mailgun/tracking/signature.rb
|
30
170
|
- lib/mailgun/tracking/subscriber.rb
|
31
171
|
- lib/mailgun/tracking/subscriber/all_messages.rb
|
32
172
|
- lib/mailgun/tracking/subscriber/evented.rb
|
173
|
+
- lib/mailgun/tracking/util.rb
|
33
174
|
- lib/mailgun/tracking/version.rb
|
175
|
+
- spec/dummy/rack/application.rb
|
176
|
+
- spec/dummy/rails/application.rb
|
177
|
+
- spec/dummy/rails/logs/test.log
|
178
|
+
- spec/dummy/sinatra/application.rb
|
34
179
|
- spec/fixtures/delivered.json
|
180
|
+
- spec/integration/rack/rack_spec.rb
|
181
|
+
- spec/integration/rails/rails_spec.rb
|
182
|
+
- spec/integration/sinatra/sinatra_spec.rb
|
35
183
|
- spec/mailgun/tracking/configuration_spec.rb
|
36
184
|
- spec/mailgun/tracking/listener_spec.rb
|
37
185
|
- spec/mailgun/tracking/middleware_spec.rb
|
38
186
|
- spec/mailgun/tracking/notifier_spec.rb
|
187
|
+
- spec/mailgun/tracking/payload_spec.rb
|
188
|
+
- spec/mailgun/tracking/request_spec.rb
|
39
189
|
- spec/mailgun/tracking/signature_spec.rb
|
40
190
|
- spec/mailgun/tracking/subscriber/all_messages_spec.rb
|
41
191
|
- spec/mailgun/tracking/subscriber/evented_spec.rb
|
42
192
|
- spec/mailgun/tracking/subscriber_spec.rb
|
193
|
+
- spec/mailgun/tracking/util_spec.rb
|
43
194
|
- spec/mailgun/tracking/version_spec.rb
|
44
195
|
- spec/mailgun/tracking_spec.rb
|
45
196
|
- spec/spec_helper.rb
|
46
197
|
- spec/support/fixture.rb
|
47
198
|
- spec/support/rack_helpers.rb
|
199
|
+
- spec/support/shared_examples/integration/acts_as_rack.rb
|
48
200
|
- spec/support/shared_examples/subscriber.rb
|
201
|
+
- spec/support/simplecov.rb
|
49
202
|
homepage: https://github.com/chubchenko/mailgun-tracking
|
50
203
|
licenses:
|
51
204
|
- MIT
|
@@ -58,7 +211,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
211
|
requirements:
|
59
212
|
- - ">="
|
60
213
|
- !ruby/object:Gem::Version
|
61
|
-
version: 2.
|
214
|
+
version: 2.2.0
|
62
215
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
216
|
requirements:
|
64
217
|
- - ">="
|
@@ -66,14 +219,23 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
219
|
version: '0'
|
67
220
|
requirements: []
|
68
221
|
rubyforge_project:
|
69
|
-
rubygems_version: 2.6.
|
222
|
+
rubygems_version: 2.6.12
|
70
223
|
signing_key:
|
71
224
|
specification_version: 4
|
72
225
|
summary: Integration with Mailgun Webhooks
|
73
226
|
test_files:
|
74
227
|
- spec/spec_helper.rb
|
228
|
+
- spec/dummy/sinatra/application.rb
|
229
|
+
- spec/dummy/rack/application.rb
|
230
|
+
- spec/dummy/rails/application.rb
|
231
|
+
- spec/dummy/rails/logs/test.log
|
232
|
+
- spec/integration/sinatra/sinatra_spec.rb
|
233
|
+
- spec/integration/rack/rack_spec.rb
|
234
|
+
- spec/integration/rails/rails_spec.rb
|
235
|
+
- spec/support/simplecov.rb
|
75
236
|
- spec/support/rack_helpers.rb
|
76
237
|
- spec/support/fixture.rb
|
238
|
+
- spec/support/shared_examples/integration/acts_as_rack.rb
|
77
239
|
- spec/support/shared_examples/subscriber.rb
|
78
240
|
- spec/fixtures/delivered.json
|
79
241
|
- spec/mailgun/tracking_spec.rb
|
@@ -83,6 +245,9 @@ test_files:
|
|
83
245
|
- spec/mailgun/tracking/notifier_spec.rb
|
84
246
|
- spec/mailgun/tracking/subscriber_spec.rb
|
85
247
|
- spec/mailgun/tracking/middleware_spec.rb
|
248
|
+
- spec/mailgun/tracking/util_spec.rb
|
86
249
|
- spec/mailgun/tracking/listener_spec.rb
|
250
|
+
- spec/mailgun/tracking/payload_spec.rb
|
251
|
+
- spec/mailgun/tracking/request_spec.rb
|
87
252
|
- spec/mailgun/tracking/subscriber/evented_spec.rb
|
88
253
|
- spec/mailgun/tracking/subscriber/all_messages_spec.rb
|