actionmailbox 0.1.0 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/{LICENSE → MIT-LICENSE} +1 -1
  4. data/README.md +2 -267
  5. data/app/controllers/action_mailbox/base_controller.rb +26 -31
  6. data/app/controllers/action_mailbox/ingresses/amazon/inbound_emails_controller.rb +48 -44
  7. data/app/controllers/action_mailbox/ingresses/mailgun/inbound_emails_controller.rb +88 -84
  8. data/app/controllers/action_mailbox/ingresses/mandrill/inbound_emails_controller.rb +64 -60
  9. data/app/controllers/action_mailbox/ingresses/postmark/inbound_emails_controller.rb +62 -0
  10. data/app/controllers/action_mailbox/ingresses/relay/inbound_emails_controller.rb +65 -0
  11. data/app/controllers/action_mailbox/ingresses/sendgrid/inbound_emails_controller.rb +51 -47
  12. data/app/controllers/rails/conductor/action_mailbox/inbound_emails_controller.rb +27 -20
  13. data/app/controllers/rails/conductor/action_mailbox/reroutes_controller.rb +15 -11
  14. data/app/controllers/rails/conductor/base_controller.rb +12 -8
  15. data/app/jobs/action_mailbox/incineration_job.rb +17 -13
  16. data/app/jobs/action_mailbox/routing_job.rb +10 -6
  17. data/app/models/action_mailbox/inbound_email.rb +43 -37
  18. data/app/models/action_mailbox/inbound_email/incineratable.rb +5 -3
  19. data/app/models/action_mailbox/inbound_email/incineratable/incineration.rb +21 -17
  20. data/app/models/action_mailbox/inbound_email/message_id.rb +22 -20
  21. data/app/models/action_mailbox/inbound_email/routable.rb +7 -5
  22. data/app/views/rails/conductor/action_mailbox/inbound_emails/new.html.erb +5 -0
  23. data/config/routes.rb +2 -1
  24. data/db/migrate/20180917164000_create_action_mailbox_tables.rb +10 -4
  25. data/lib/action_mailbox.rb +2 -1
  26. data/lib/action_mailbox/base.rb +100 -93
  27. data/lib/action_mailbox/callbacks.rb +3 -1
  28. data/lib/action_mailbox/engine.rb +9 -1
  29. data/lib/action_mailbox/gem_version.rb +17 -0
  30. data/lib/action_mailbox/mail_ext.rb +2 -0
  31. data/lib/action_mailbox/mail_ext/address_equality.rb +7 -3
  32. data/lib/action_mailbox/mail_ext/address_wrapping.rb +7 -3
  33. data/lib/action_mailbox/mail_ext/addresses.rb +22 -18
  34. data/lib/action_mailbox/mail_ext/from_source.rb +2 -0
  35. data/lib/action_mailbox/mail_ext/recipients.rb +7 -3
  36. data/lib/action_mailbox/{postfix_relayer.rb → relayer.rb} +18 -10
  37. data/lib/action_mailbox/router.rb +30 -26
  38. data/lib/action_mailbox/router/route.rb +34 -30
  39. data/lib/action_mailbox/routing.rb +3 -1
  40. data/lib/action_mailbox/test_case.rb +4 -0
  41. data/lib/action_mailbox/test_helper.rb +8 -6
  42. data/lib/action_mailbox/version.rb +8 -1
  43. data/lib/rails/generators/installer.rb +10 -0
  44. data/lib/rails/generators/mailbox/USAGE +12 -0
  45. data/lib/rails/generators/mailbox/mailbox_generator.rb +32 -0
  46. data/lib/{templates/mailboxes/application_mailbox.rb → rails/generators/mailbox/templates/application_mailbox.rb.tt} +1 -1
  47. data/lib/rails/generators/mailbox/templates/mailbox.rb.tt +4 -0
  48. data/lib/rails/generators/test_unit/mailbox_generator.rb +20 -0
  49. data/lib/rails/generators/test_unit/templates/mailbox_test.rb.tt +13 -0
  50. data/lib/tasks/ingress.rake +53 -5
  51. data/lib/tasks/install.rake +1 -1
  52. metadata +66 -237
  53. data/.gitignore +0 -2
  54. data/Gemfile +0 -8
  55. data/Gemfile.lock +0 -159
  56. data/Rakefile +0 -27
  57. data/actionmailbox.gemspec +0 -27
  58. data/app/controllers/action_mailbox/ingresses/postfix/inbound_emails_controller.rb +0 -55
  59. data/bin/test +0 -5
  60. data/lib/templates/installer.rb +0 -4
  61. data/test/controllers/ingresses/amazon/inbound_emails_controller_test.rb +0 -20
  62. data/test/controllers/ingresses/mailgun/inbound_emails_controller_test.rb +0 -89
  63. data/test/controllers/ingresses/mandrill/inbound_emails_controller_test.rb +0 -58
  64. data/test/controllers/ingresses/postfix/inbound_emails_controller_test.rb +0 -54
  65. data/test/controllers/ingresses/sendgrid/inbound_emails_controller_test.rb +0 -44
  66. data/test/dummy/.babelrc +0 -18
  67. data/test/dummy/.gitignore +0 -3
  68. data/test/dummy/.postcssrc.yml +0 -3
  69. data/test/dummy/Rakefile +0 -6
  70. data/test/dummy/app/assets/config/manifest.js +0 -3
  71. data/test/dummy/app/assets/images/.keep +0 -0
  72. data/test/dummy/app/assets/stylesheets/application.css +0 -15
  73. data/test/dummy/app/assets/stylesheets/scaffold.css +0 -80
  74. data/test/dummy/app/channels/application_cable/channel.rb +0 -4
  75. data/test/dummy/app/channels/application_cable/connection.rb +0 -4
  76. data/test/dummy/app/controllers/application_controller.rb +0 -2
  77. data/test/dummy/app/controllers/concerns/.keep +0 -0
  78. data/test/dummy/app/helpers/application_helper.rb +0 -2
  79. data/test/dummy/app/javascript/packs/application.js +0 -0
  80. data/test/dummy/app/jobs/application_job.rb +0 -2
  81. data/test/dummy/app/mailboxes/application_mailbox.rb +0 -2
  82. data/test/dummy/app/mailboxes/messages_mailbox.rb +0 -4
  83. data/test/dummy/app/mailers/application_mailer.rb +0 -4
  84. data/test/dummy/app/models/application_record.rb +0 -3
  85. data/test/dummy/app/models/concerns/.keep +0 -0
  86. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  87. data/test/dummy/app/views/layouts/mailer.html.erb +0 -13
  88. data/test/dummy/app/views/layouts/mailer.text.erb +0 -1
  89. data/test/dummy/bin/bundle +0 -3
  90. data/test/dummy/bin/rails +0 -4
  91. data/test/dummy/bin/rake +0 -4
  92. data/test/dummy/bin/setup +0 -36
  93. data/test/dummy/bin/update +0 -31
  94. data/test/dummy/bin/yarn +0 -11
  95. data/test/dummy/config.ru +0 -5
  96. data/test/dummy/config/application.rb +0 -19
  97. data/test/dummy/config/boot.rb +0 -5
  98. data/test/dummy/config/cable.yml +0 -10
  99. data/test/dummy/config/database.yml +0 -25
  100. data/test/dummy/config/environment.rb +0 -5
  101. data/test/dummy/config/environments/development.rb +0 -63
  102. data/test/dummy/config/environments/production.rb +0 -96
  103. data/test/dummy/config/environments/test.rb +0 -46
  104. data/test/dummy/config/initializers/application_controller_renderer.rb +0 -8
  105. data/test/dummy/config/initializers/assets.rb +0 -14
  106. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  107. data/test/dummy/config/initializers/content_security_policy.rb +0 -22
  108. data/test/dummy/config/initializers/cookies_serializer.rb +0 -5
  109. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  110. data/test/dummy/config/initializers/inflections.rb +0 -16
  111. data/test/dummy/config/initializers/mime_types.rb +0 -4
  112. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  113. data/test/dummy/config/locales/en.yml +0 -33
  114. data/test/dummy/config/puma.rb +0 -34
  115. data/test/dummy/config/routes.rb +0 -4
  116. data/test/dummy/config/spring.rb +0 -6
  117. data/test/dummy/config/storage.yml +0 -35
  118. data/test/dummy/config/webpack/development.js +0 -3
  119. data/test/dummy/config/webpack/environment.js +0 -3
  120. data/test/dummy/config/webpack/production.js +0 -3
  121. data/test/dummy/config/webpack/test.js +0 -3
  122. data/test/dummy/config/webpacker.yml +0 -65
  123. data/test/dummy/db/migrate/20180208205311_create_action_mailroom_tables.rb +0 -11
  124. data/test/dummy/db/migrate/20180212164506_create_active_storage_tables.active_storage.rb +0 -26
  125. data/test/dummy/db/schema.rb +0 -43
  126. data/test/dummy/lib/assets/.keep +0 -0
  127. data/test/dummy/log/.keep +0 -0
  128. data/test/dummy/package.json +0 -11
  129. data/test/dummy/public/404.html +0 -67
  130. data/test/dummy/public/422.html +0 -67
  131. data/test/dummy/public/500.html +0 -66
  132. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  133. data/test/dummy/public/apple-touch-icon.png +0 -0
  134. data/test/dummy/public/favicon.ico +0 -0
  135. data/test/dummy/storage/.keep +0 -0
  136. data/test/dummy/yarn.lock +0 -6071
  137. data/test/fixtures/files/welcome.eml +0 -631
  138. data/test/jobs/incineration_job_test.rb +0 -17
  139. data/test/test_helper.rb +0 -54
  140. data/test/unit/inbound_email/incineration_test.rb +0 -45
  141. data/test/unit/inbound_email/message_id_test.rb +0 -13
  142. data/test/unit/inbound_email_test.rb +0 -13
  143. data/test/unit/mail_ext/address_equality_test.rb +0 -9
  144. data/test/unit/mail_ext/address_wrapping_test.rb +0 -11
  145. data/test/unit/mail_ext/recipients_test.rb +0 -33
  146. data/test/unit/mailbox/bouncing_test.rb +0 -29
  147. data/test/unit/mailbox/callbacks_test.rb +0 -75
  148. data/test/unit/mailbox/routing_test.rb +0 -30
  149. data/test/unit/mailbox/state_test.rb +0 -49
  150. data/test/unit/postfix_relayer_test.rb +0 -90
  151. data/test/unit/router_test.rb +0 -137
data/.gitignore DELETED
@@ -1,2 +0,0 @@
1
- .byebug_history
2
- *.sqlite3-journal
data/Gemfile DELETED
@@ -1,8 +0,0 @@
1
- source "https://rubygems.org"
2
- git_source(:github) { |repo_path| "https://github.com/#{repo_path}.git" }
3
-
4
- gemspec
5
-
6
- gem "rails", github: "rails/rails"
7
-
8
- gem "aws-sdk-sns"
@@ -1,159 +0,0 @@
1
- GIT
2
- remote: https://github.com/rails/rails.git
3
- revision: a1ee4a9ff9d4a3cb255365310ead0dc7b739c6be
4
- specs:
5
- actioncable (6.0.0.alpha)
6
- actionpack (= 6.0.0.alpha)
7
- nio4r (~> 2.0)
8
- websocket-driver (>= 0.6.1)
9
- actionmailer (6.0.0.alpha)
10
- actionpack (= 6.0.0.alpha)
11
- actionview (= 6.0.0.alpha)
12
- activejob (= 6.0.0.alpha)
13
- mail (~> 2.5, >= 2.5.4)
14
- rails-dom-testing (~> 2.0)
15
- actionpack (6.0.0.alpha)
16
- actionview (= 6.0.0.alpha)
17
- activesupport (= 6.0.0.alpha)
18
- rack (~> 2.0)
19
- rack-test (>= 0.6.3)
20
- rails-dom-testing (~> 2.0)
21
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
22
- actionview (6.0.0.alpha)
23
- activesupport (= 6.0.0.alpha)
24
- builder (~> 3.1)
25
- erubi (~> 1.4)
26
- rails-dom-testing (~> 2.0)
27
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
28
- activejob (6.0.0.alpha)
29
- activesupport (= 6.0.0.alpha)
30
- globalid (>= 0.3.6)
31
- activemodel (6.0.0.alpha)
32
- activesupport (= 6.0.0.alpha)
33
- activerecord (6.0.0.alpha)
34
- activemodel (= 6.0.0.alpha)
35
- activesupport (= 6.0.0.alpha)
36
- activestorage (6.0.0.alpha)
37
- actionpack (= 6.0.0.alpha)
38
- activerecord (= 6.0.0.alpha)
39
- marcel (~> 0.3.1)
40
- activesupport (6.0.0.alpha)
41
- concurrent-ruby (~> 1.0, >= 1.0.2)
42
- i18n (>= 0.7, < 2)
43
- minitest (~> 5.1)
44
- tzinfo (~> 1.1)
45
- rails (6.0.0.alpha)
46
- actioncable (= 6.0.0.alpha)
47
- actionmailer (= 6.0.0.alpha)
48
- actionpack (= 6.0.0.alpha)
49
- actionview (= 6.0.0.alpha)
50
- activejob (= 6.0.0.alpha)
51
- activemodel (= 6.0.0.alpha)
52
- activerecord (= 6.0.0.alpha)
53
- activestorage (= 6.0.0.alpha)
54
- activesupport (= 6.0.0.alpha)
55
- bundler (>= 1.3.0)
56
- railties (= 6.0.0.alpha)
57
- sprockets-rails (>= 2.0.0)
58
- railties (6.0.0.alpha)
59
- actionpack (= 6.0.0.alpha)
60
- activesupport (= 6.0.0.alpha)
61
- method_source
62
- rake (>= 0.8.7)
63
- thor (>= 0.19.0, < 2.0)
64
-
65
- PATH
66
- remote: .
67
- specs:
68
- actionmailbox (0.1.0)
69
- rails (>= 5.2.0)
70
-
71
- GEM
72
- remote: https://rubygems.org/
73
- specs:
74
- addressable (2.5.2)
75
- public_suffix (>= 2.0.2, < 4.0)
76
- aws-eventstream (1.0.1)
77
- aws-partitions (1.105.0)
78
- aws-sdk-core (3.30.0)
79
- aws-eventstream (~> 1.0)
80
- aws-partitions (~> 1.0)
81
- aws-sigv4 (~> 1.0)
82
- jmespath (~> 1.0)
83
- aws-sdk-sns (1.5.0)
84
- aws-sdk-core (~> 3, >= 3.26.0)
85
- aws-sigv4 (~> 1.0)
86
- aws-sigv4 (1.0.3)
87
- builder (3.2.3)
88
- byebug (10.0.2)
89
- concurrent-ruby (1.0.5)
90
- crack (0.4.3)
91
- safe_yaml (~> 1.0.0)
92
- crass (1.0.4)
93
- erubi (1.7.1)
94
- globalid (0.4.1)
95
- activesupport (>= 4.2.0)
96
- hashdiff (0.3.7)
97
- i18n (1.1.0)
98
- concurrent-ruby (~> 1.0)
99
- jmespath (1.4.0)
100
- loofah (2.2.2)
101
- crass (~> 1.0.2)
102
- nokogiri (>= 1.5.9)
103
- mail (2.7.1)
104
- mini_mime (>= 0.1.1)
105
- marcel (0.3.3)
106
- mimemagic (~> 0.3.2)
107
- method_source (0.9.0)
108
- mimemagic (0.3.2)
109
- mini_mime (1.0.1)
110
- mini_portile2 (2.3.0)
111
- minitest (5.11.3)
112
- nio4r (2.3.1)
113
- nokogiri (1.8.5)
114
- mini_portile2 (~> 2.3.0)
115
- public_suffix (3.0.3)
116
- rack (2.0.5)
117
- rack-test (1.1.0)
118
- rack (>= 1.0, < 3)
119
- rails-dom-testing (2.0.3)
120
- activesupport (>= 4.2.0)
121
- nokogiri (>= 1.6)
122
- rails-html-sanitizer (1.0.4)
123
- loofah (~> 2.2, >= 2.2.2)
124
- rake (12.3.1)
125
- safe_yaml (1.0.4)
126
- sprockets (3.7.2)
127
- concurrent-ruby (~> 1.0)
128
- rack (> 1, < 3)
129
- sprockets-rails (3.2.1)
130
- actionpack (>= 4.0)
131
- activesupport (>= 4.0)
132
- sprockets (>= 3.0.0)
133
- sqlite3 (1.3.13)
134
- thor (0.20.0)
135
- thread_safe (0.3.6)
136
- tzinfo (1.2.5)
137
- thread_safe (~> 0.1)
138
- webmock (3.4.2)
139
- addressable (>= 2.3.6)
140
- crack (>= 0.3.2)
141
- hashdiff
142
- websocket-driver (0.7.0)
143
- websocket-extensions (>= 0.1.0)
144
- websocket-extensions (0.1.3)
145
-
146
- PLATFORMS
147
- ruby
148
-
149
- DEPENDENCIES
150
- actionmailbox!
151
- aws-sdk-sns
152
- bundler (~> 1.15)
153
- byebug
154
- rails!
155
- sqlite3
156
- webmock
157
-
158
- BUNDLED WITH
159
- 1.16.6
data/Rakefile DELETED
@@ -1,27 +0,0 @@
1
- begin
2
- require 'bundler/setup'
3
- rescue LoadError
4
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
- end
6
-
7
- require 'rdoc/task'
8
-
9
- RDoc::Task.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'Action Mailbox'
12
- rdoc.options << '--line-numbers'
13
- rdoc.rdoc_files.include('README.md')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
15
- end
16
-
17
- require 'bundler/gem_tasks'
18
-
19
- require 'rake/testtask'
20
-
21
- Rake::TestTask.new(:test) do |t|
22
- t.libs << 'test'
23
- t.pattern = 'test/**/*_test.rb'
24
- t.verbose = false
25
- end
26
-
27
- task default: :test
@@ -1,27 +0,0 @@
1
- $:.push File.expand_path("lib", __dir__)
2
-
3
- # Maintain your gem's version:
4
- require "action_mailbox/version"
5
-
6
- # Describe your gem and declare its dependencies:
7
- Gem::Specification.new do |s|
8
- s.name = "actionmailbox"
9
- s.version = ActionMailbox::VERSION
10
- s.authors = ["David Heinemeier Hansson", "George Claghorn"]
11
- s.email = ["david@loudthinking.com", "george@basecamp.com"]
12
- s.summary = "Receive and process incoming emails in Rails"
13
- s.homepage = "https://github.com/rails/actionmailbox"
14
- s.license = "MIT"
15
-
16
- s.required_ruby_version = ">= 2.5.0"
17
-
18
- s.add_dependency "rails", ">= 5.2.0"
19
-
20
- s.add_development_dependency "bundler", "~> 1.15"
21
- s.add_development_dependency "sqlite3"
22
- s.add_development_dependency "byebug"
23
- s.add_development_dependency "webmock"
24
-
25
- s.files = `git ls-files`.split("\n")
26
- s.test_files = `git ls-files -- test/*`.split("\n")
27
- end
@@ -1,55 +0,0 @@
1
- # Ingests inbound emails relayed from Postfix.
2
- #
3
- # Authenticates requests using HTTP basic access authentication. The username is always +actionmailbox+, and the
4
- # password is read from the application's encrypted credentials or an environment variable. See the Usage section below.
5
- #
6
- # Note that basic authentication is insecure over unencrypted HTTP. An attacker that intercepts cleartext requests to
7
- # the Postfix ingress can learn its password. You should only use the Postfix ingress over HTTPS.
8
- #
9
- # Returns:
10
- #
11
- # - <tt>204 No Content</tt> if an inbound email is successfully recorded and enqueued for routing to the appropriate mailbox
12
- # - <tt>401 Unauthorized</tt> if the request could not be authenticated
13
- # - <tt>404 Not Found</tt> if Action Mailbox is not configured to accept inbound emails from Postfix
14
- # - <tt>415 Unsupported Media Type</tt> if the request does not contain an RFC 822 message
15
- # - <tt>500 Server Error</tt> if the ingress password is not configured, or if one of the Active Record database,
16
- # the Active Storage service, or the Active Job backend is misconfigured or unavailable
17
- #
18
- # == Usage
19
- #
20
- # 1. Tell Action Mailbox to accept emails from Postfix:
21
- #
22
- # # config/environments/production.rb
23
- # config.action_mailbox.ingress = :postfix
24
- #
25
- # 2. Generate a strong password that Action Mailbox can use to authenticate requests to the Postfix ingress.
26
- #
27
- # Use <tt>rails credentials:edit</tt> to add the password to your application's encrypted credentials under
28
- # +action_mailbox.ingress_password+, where Action Mailbox will automatically find it:
29
- #
30
- # action_mailbox:
31
- # ingress_password: ...
32
- #
33
- # Alternatively, provide the password in the +RAILS_INBOUND_EMAIL_PASSWORD+ environment variable.
34
- #
35
- # 3. {Configure Postfix}{https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script}
36
- # to pipe inbound emails to <tt>bin/rails action_mailbox:ingress:postfix</tt>, providing the +URL+ of the Postfix
37
- # ingress and the +INGRESS_PASSWORD+ you previously generated.
38
- #
39
- # If your application lived at <tt>https://example.com</tt>, the full command would look like this:
40
- #
41
- # URL=https://example.com/rails/action_mailbox/postfix/inbound_emails INGRESS_PASSWORD=... bin/rails action_mailbox:ingress:postfix
42
- class ActionMailbox::Ingresses::Postfix::InboundEmailsController < ActionMailbox::BaseController
43
- before_action :authenticate_by_password, :require_valid_rfc822_message
44
-
45
- def create
46
- ActionMailbox::InboundEmail.create_and_extract_message_id! request.body.read
47
- end
48
-
49
- private
50
- def require_valid_rfc822_message
51
- unless request.content_type == "message/rfc822"
52
- head :unsupported_media_type
53
- end
54
- end
55
- end
data/bin/test DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $: << File.expand_path("../test", __dir__)
3
-
4
- require "bundler/setup"
5
- require "rails/plugin/test"
@@ -1,4 +0,0 @@
1
- say "Copying application_mailbox.rb to app/mailboxes"
2
- copy_file "#{__dir__}/mailboxes/application_mailbox.rb", "app/mailboxes/application_mailbox.rb"
3
-
4
- environment "# Prepare the ingress controller used to receive mail\n# config.action_mailbox.ingress = :amazon\n\n", env: 'production'
@@ -1,20 +0,0 @@
1
- require "test_helper"
2
-
3
- ActionMailbox::Ingresses::Amazon::InboundEmailsController.verifier =
4
- Module.new { def self.authentic?(message); true; end }
5
-
6
- class ActionMailbox::Ingresses::Amazon::InboundEmailsControllerTest < ActionDispatch::IntegrationTest
7
- setup { ActionMailbox.ingress = :amazon }
8
-
9
- test "receiving an inbound email from Amazon" do
10
- assert_difference -> { ActionMailbox::InboundEmail.count }, +1 do
11
- post rails_amazon_inbound_emails_url, params: { content: file_fixture("../files/welcome.eml").read }, as: :json
12
- end
13
-
14
- assert_response :no_content
15
-
16
- inbound_email = ActionMailbox::InboundEmail.last
17
- assert_equal file_fixture("../files/welcome.eml").read, inbound_email.raw_email.download
18
- assert_equal "0CB459E0-0336-41DA-BC88-E6E28C697DDB@37signals.com", inbound_email.message_id
19
- end
20
- end
@@ -1,89 +0,0 @@
1
- require "test_helper"
2
-
3
- ENV["MAILGUN_INGRESS_API_KEY"] = "tbsy84uSV1Kt3ZJZELY2TmShPRs91E3yL4tzf96297vBCkDWgL"
4
-
5
- class ActionMailbox::Ingresses::Mailgun::InboundEmailsControllerTest < ActionDispatch::IntegrationTest
6
- setup { ActionMailbox.ingress = :mailgun }
7
-
8
- test "receiving an inbound email from Mailgun" do
9
- assert_difference -> { ActionMailbox::InboundEmail.count }, +1 do
10
- travel_to "2018-10-09 15:15:00 EDT"
11
- post rails_mailgun_inbound_emails_url, params: {
12
- timestamp: 1539112500,
13
- token: "7VwW7k6Ak7zcTwoSoNm7aTtbk1g67MKAnsYLfUB7PdszbgR5Xi",
14
- signature: "ef24c5225322217bb065b80bb54eb4f9206d764e3e16abab07f0a64d1cf477cc",
15
- "body-mime" => file_fixture("../files/welcome.eml").read
16
- }
17
- end
18
-
19
- assert_response :no_content
20
-
21
- inbound_email = ActionMailbox::InboundEmail.last
22
- assert_equal file_fixture("../files/welcome.eml").read, inbound_email.raw_email.download
23
- assert_equal "0CB459E0-0336-41DA-BC88-E6E28C697DDB@37signals.com", inbound_email.message_id
24
- end
25
-
26
- test "rejecting a delayed inbound email from Mailgun" do
27
- assert_no_difference -> { ActionMailbox::InboundEmail.count } do
28
- travel_to "2018-10-09 15:26:00 EDT"
29
- post rails_mailgun_inbound_emails_url, params: {
30
- timestamp: 1539112500,
31
- token: "7VwW7k6Ak7zcTwoSoNm7aTtbk1g67MKAnsYLfUB7PdszbgR5Xi",
32
- signature: "ef24c5225322217bb065b80bb54eb4f9206d764e3e16abab07f0a64d1cf477cc",
33
- "body-mime" => file_fixture("../files/welcome.eml").read
34
- }
35
- end
36
-
37
- assert_response :unauthorized
38
- end
39
-
40
- test "rejecting a forged inbound email from Mailgun" do
41
- assert_no_difference -> { ActionMailbox::InboundEmail.count } do
42
- travel_to "2018-10-09 15:15:00 EDT"
43
- post rails_mailgun_inbound_emails_url, params: {
44
- timestamp: 1539112500,
45
- token: "Zx8mJBiGmiiyyfWnho3zKyjCg2pxLARoCuBM7X9AKCioShGiMX",
46
- signature: "ef24c5225322217bb065b80bb54eb4f9206d764e3e16abab07f0a64d1cf477cc",
47
- "body-mime" => file_fixture("../files/welcome.eml").read
48
- }
49
- end
50
-
51
- assert_response :unauthorized
52
- end
53
-
54
- test "raising when the configured Mailgun API key is nil" do
55
- switch_key_to nil do
56
- assert_raises ArgumentError do
57
- travel_to "2018-10-09 15:15:00 EDT"
58
- post rails_mailgun_inbound_emails_url, params: {
59
- timestamp: 1539112500,
60
- token: "7VwW7k6Ak7zcTwoSoNm7aTtbk1g67MKAnsYLfUB7PdszbgR5Xi",
61
- signature: "ef24c5225322217bb065b80bb54eb4f9206d764e3e16abab07f0a64d1cf477cc",
62
- "body-mime" => file_fixture("../files/welcome.eml").read
63
- }
64
- end
65
- end
66
- end
67
-
68
- test "raising when the configured Mailgun API key is blank" do
69
- switch_key_to "" do
70
- assert_raises ArgumentError do
71
- travel_to "2018-10-09 15:15:00 EDT"
72
- post rails_mailgun_inbound_emails_url, params: {
73
- timestamp: 1539112500,
74
- token: "7VwW7k6Ak7zcTwoSoNm7aTtbk1g67MKAnsYLfUB7PdszbgR5Xi",
75
- signature: "ef24c5225322217bb065b80bb54eb4f9206d764e3e16abab07f0a64d1cf477cc",
76
- "body-mime" => file_fixture("../files/welcome.eml").read
77
- }
78
- end
79
- end
80
- end
81
-
82
- private
83
- def switch_key_to(new_key)
84
- previous_key, ENV["MAILGUN_INGRESS_API_KEY"] = ENV["MAILGUN_INGRESS_API_KEY"], new_key
85
- yield
86
- ensure
87
- ENV["MAILGUN_INGRESS_API_KEY"] = previous_key
88
- end
89
- end
@@ -1,58 +0,0 @@
1
- require "test_helper"
2
-
3
- ENV["MANDRILL_INGRESS_API_KEY"] = "1l9Qf7lutEf7h73VXfBwhw"
4
-
5
- class ActionMailbox::Ingresses::Mandrill::InboundEmailsControllerTest < ActionDispatch::IntegrationTest
6
- setup do
7
- ActionMailbox.ingress = :mandrill
8
- @events = JSON.generate([{ event: "inbound", msg: { raw_msg: file_fixture("../files/welcome.eml").read } }])
9
- end
10
-
11
- test "receiving an inbound email from Mandrill" do
12
- assert_difference -> { ActionMailbox::InboundEmail.count }, +1 do
13
- post rails_mandrill_inbound_emails_url,
14
- headers: { "X-Mandrill-Signature" => "gldscd2tAb/G+DmpiLcwukkLrC4=" }, params: { mandrill_events: @events }
15
- end
16
-
17
- assert_response :ok
18
-
19
- inbound_email = ActionMailbox::InboundEmail.last
20
- assert_equal file_fixture("../files/welcome.eml").read, inbound_email.raw_email.download
21
- assert_equal "0CB459E0-0336-41DA-BC88-E6E28C697DDB@37signals.com", inbound_email.message_id
22
- end
23
-
24
- test "rejecting a forged inbound email from Mandrill" do
25
- assert_no_difference -> { ActionMailbox::InboundEmail.count } do
26
- post rails_mandrill_inbound_emails_url,
27
- headers: { "X-Mandrill-Signature" => "forged" }, params: { mandrill_events: @events }
28
- end
29
-
30
- assert_response :unauthorized
31
- end
32
-
33
- test "raising when Mandrill API key is nil" do
34
- switch_key_to nil do
35
- assert_raises ArgumentError do
36
- post rails_mandrill_inbound_emails_url,
37
- headers: { "X-Mandrill-Signature" => "gldscd2tAb/G+DmpiLcwukkLrC4=" }, params: { mandrill_events: @events }
38
- end
39
- end
40
- end
41
-
42
- test "raising when Mandrill API key is blank" do
43
- switch_key_to "" do
44
- assert_raises ArgumentError do
45
- post rails_mandrill_inbound_emails_url,
46
- headers: { "X-Mandrill-Signature" => "gldscd2tAb/G+DmpiLcwukkLrC4=" }, params: { mandrill_events: @events }
47
- end
48
- end
49
- end
50
-
51
- private
52
- def switch_key_to(new_key)
53
- previous_key, ENV["MANDRILL_INGRESS_API_KEY"] = ENV["MANDRILL_INGRESS_API_KEY"], new_key
54
- yield
55
- ensure
56
- ENV["MANDRILL_INGRESS_API_KEY"] = previous_key
57
- end
58
- end