defra_ruby_email 0.1.0
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 +7 -0
- data/LICENSE +8 -0
- data/README.md +66 -0
- data/Rakefile +38 -0
- data/app/assets/images/defra_ruby_email/govuk_logotype_email.png +0 -0
- data/app/controllers/defra_ruby_email/application_controller.rb +7 -0
- data/app/controllers/defra_ruby_email/last_email_controller.rb +9 -0
- data/app/mailers/defra_ruby_email/test_mailer.rb +60 -0
- data/config/routes.rb +8 -0
- data/lib/defra_ruby_email.rb +26 -0
- data/lib/defra_ruby_email/configuration.rb +24 -0
- data/lib/defra_ruby_email/engine.rb +15 -0
- data/lib/defra_ruby_email/last_email_cache.rb +48 -0
- data/lib/defra_ruby_email/last_email_observer.rb +13 -0
- data/lib/defra_ruby_email/version.rb +5 -0
- data/lib/tasks/changelog.rake +8 -0
- data/lib/tasks/defra_ruby_email_tasks.rake +8 -0
- data/spec/defra_ruby_email_spec.rb +39 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +29 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +38 -0
- data/spec/dummy/config/environments/production.rb +76 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/to_time_preserves_timezone.rb +10 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +9 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/log/test.log +53 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1W/1WwQOSlYPtmYMlk5m-3Qq4NzEWNH7tYCQhfoslnaLHk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2-/2-japRDu0GHGko1cjVWjELVh5v9nz6Q45a2beIwLUrI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4G/4Gbu6LmPYLfAZQgL2uv1eZwq7EYA0POiSWs6C_vXckg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5L/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AU/AUfMxF1097iBMMdRbzJKjyzoRLp1W-b_VuQ4p0OxWfw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/B5/B5OLh2y7CLTgfdROC0dphxzI0KC-NWuzUoZ5fHcA6Bg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/L4/L46n6ueXJJsYfqBb0tgyq4pu-Pmwghcq4wxrrvue0iI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MG/MGzsWSZq4b8vtnPxO8zkfdIwLVmVdcXFO1l9ao9g8D8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OI/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ps/PsDzIFzt3gBnxeXvfMfYXZ2E6DyEFleyRRfR01u34_8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SN/SN9Q1o1Je1stqGQtozCzZyPlhu1QW0gOSDpTQHrdE40.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SW/SW2WGzrHD6rQ7Iifad3AJjwO-H5MMdk-KgDcDAo2L3w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tz/TzV-x09rf8_JdpcH7oq7Tx0hTs-7K6EpBgN2cGzTBCw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Uz/Uzp0b_uvqxkh0hY1pfL1MUpkNlf4zy_eYSBnRQQFiC0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_D/_DYI9CGjZuQS99rHeuP1Zczax1DlXobV7fQAOlFZbW0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_M/_MsZgIvurUGOXpB0mEZtVC6mrSMcnyTk7p_1psw3G-g.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aj/ajHL7E3SCz-eQbwNQMePJRLVz6OQHk7Xtuvu4SWLiYY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dC/dCKQMRMWehNHUz2uovXPnFyx0OyNUCVPhPvG9tPe0TM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ex/exO17VY09nxxoT76j7M9SboKOezGF_Wx0vTvGHl-vuU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fN/fNIVnfQsXHwqWvodZxIU869b9k7z9k8O8Z5I7waSgbo.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gF/gFPphmPziPhcj5awJ-qSf7kvvYQE-mR6fJoj5Plw17I.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gm/gm8TWq2tpBcsn1xscp-vNMVweRDHm10LXftKrZ3WL3E.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iG/iGr34Svi4uZyFOneReXcDJZvZTJyBzaiZFOm5EcSefM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pP/pPe-s4lIFwyYOpBJcOCFWCqVHJzKmr-bXTMajg0vA0U.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q3/q3Z4d58Hu6dSbyJh-BeC0P0-vMjbI8cfMsHN73-B3gs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qo/qoLNp_jcpq5z2b5ijaCSHBZO7m6FKQHFrXVGHZ9ZoZ8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/s4/s4_2m7OtzbFTNr3n5Zn_xY2uGLRIzpG24UgWUwG3yKA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sQ/sQNMSYgTkDcfTlnbqMpLd6Erufaoxo61qkVPy4YgY3A.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y9/y9pXiDOCIiEqKn-ES0eCNUjJ7cSQFn31eombd1vJzj4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z9/z9x_Zb62GyFCL1ZoYErl-HHrPL6AqOOgaLaDlJ9KaEo.cache +0 -0
- data/spec/examples.txt +8 -0
- data/spec/lib/last_email_cache_spec.rb +221 -0
- data/spec/rails_helper.rb +46 -0
- data/spec/requests/last_email_spec.rb +34 -0
- data/spec/spec_helper.rb +83 -0
- data/spec/support/helpers/configuration.rb +16 -0
- data/spec/support/pry.rb +7 -0
- data/spec/support/simplecov.rb +17 -0
- metadata +297 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 60ee4255b7585ffeb1bf0627b25297617890bc0a
|
|
4
|
+
data.tar.gz: 979836d5d4392fc967b698a97a83290f69681662
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 48f158c118f2c523ede07ac3e6182cf4871cedb45461ec63bc8e72794712b029cc92cad20650e6aea80ba67af23c031517bebbf2e37186668d0e74f00b0084fa
|
|
7
|
+
data.tar.gz: 4030b982847e303196cdea3e55df38ae57843d54ac7e78c8968c83f4f76a5577f2069540e20f797a7a97ae205476e39655a5cc172a5c294f94f49b0b9e05c1ce
|
data/LICENSE
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
The Open Government Licence (OGL) Version 3
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2020 Defra
|
|
4
|
+
|
|
5
|
+
This source code is licensed under the Open Government Licence v3.0. To view this
|
|
6
|
+
licence, visit www.nationalarchives.gov.uk/doc/open-government-licence/version/3
|
|
7
|
+
or write to the Information Policy Team, The National Archives, Kew, Richmond,
|
|
8
|
+
Surrey, TW9 4DU.
|
data/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Defra Ruby Email
|
|
2
|
+
|
|
3
|
+
[](https://travis-ci.com/DEFRA/defra-ruby-email)
|
|
4
|
+
[](https://codeclimate.com/github/DEFRA/defra-ruby-email/maintainability)
|
|
5
|
+
[](https://codeclimate.com/github/DEFRA/defra-ruby-email/test_coverage)
|
|
6
|
+
[](https://hakiri.io/github/DEFRA/defra-ruby-email/master)
|
|
7
|
+
[](http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3)
|
|
8
|
+
|
|
9
|
+
> Work in progress. This project is not yet complete!
|
|
10
|
+
|
|
11
|
+
A Rails Engine used by the [Ruby services team](https://github.com/DEFRA/ruby-services-team) in their digital services.
|
|
12
|
+
|
|
13
|
+
We use it to allow us to access the content of the last email sent by an app. This information is used by our [acceptance tests](https://github.com/DEFRA/waste-carriers-acceptance-tests) to confirm emails are being sent with the expected content.
|
|
14
|
+
|
|
15
|
+
When mounted in an app, it will add a new route which when called, will return details of the last email as JSON.
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
Make sure you already have:
|
|
20
|
+
|
|
21
|
+
- Ruby 2.4.2
|
|
22
|
+
- [Bundler](http://bundler.io/) – for installing Ruby gems
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
You don't need to do this if you're just mounting the engine without making any changes.
|
|
27
|
+
|
|
28
|
+
However, if you want to edit the engine, you'll have to install it locally.
|
|
29
|
+
|
|
30
|
+
Clone the repo and drop into the project:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
git clone https://github.com/DEFRA/defra-ruby-email.git && cd defra-ruby-email
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Then install the dependencies with `bundle install`.
|
|
37
|
+
|
|
38
|
+
## Testing the engine
|
|
39
|
+
|
|
40
|
+
The engine is mounted in a dummy Rails 4 app (in /spec/dummy) so we can properly test its behaviour.
|
|
41
|
+
|
|
42
|
+
The test suite is written in RSpec.
|
|
43
|
+
|
|
44
|
+
To run all the tests, use `bundle exec rspec`.
|
|
45
|
+
|
|
46
|
+
## Contributing to this project
|
|
47
|
+
|
|
48
|
+
If you have an idea you'd like to contribute please log an issue.
|
|
49
|
+
|
|
50
|
+
All contributions should be submitted via a pull request.
|
|
51
|
+
|
|
52
|
+
## License
|
|
53
|
+
|
|
54
|
+
THIS INFORMATION IS LICENSED UNDER THE CONDITIONS OF THE OPEN GOVERNMENT LICENCE found at:
|
|
55
|
+
|
|
56
|
+
<http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3>
|
|
57
|
+
|
|
58
|
+
The following attribution statement MUST be cited in your products and applications when using this information.
|
|
59
|
+
|
|
60
|
+
> Contains public sector information licensed under the Open Government license v3
|
|
61
|
+
|
|
62
|
+
### About the license
|
|
63
|
+
|
|
64
|
+
The Open Government Licence (OGL) was developed by the Controller of Her Majesty's Stationery Office (HMSO) to enable information providers in the public sector to license the use and re-use of their information under a common open licence.
|
|
65
|
+
|
|
66
|
+
It is designed to encourage use and re-use of information freely and flexibly, with only a few conditions.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require "bundler/setup"
|
|
5
|
+
rescue LoadError
|
|
6
|
+
puts "You must `gem install bundler` and `bundle install` to run rake tasks"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
require "rdoc/task"
|
|
10
|
+
|
|
11
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
12
|
+
rdoc.rdoc_dir = "rdoc"
|
|
13
|
+
rdoc.title = "DefraRubyEmail"
|
|
14
|
+
rdoc.options << "--line-numbers"
|
|
15
|
+
rdoc.rdoc_files.include("README.md")
|
|
16
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
load "rails/tasks/statistics.rake"
|
|
20
|
+
|
|
21
|
+
Dir[File.join(File.dirname(__FILE__), "lib/tasks/**/*.rake")].each { |f| load f }
|
|
22
|
+
|
|
23
|
+
Bundler::GemHelper.install_tasks
|
|
24
|
+
|
|
25
|
+
# This is wrapped to prevent an error when rake is called in environments where
|
|
26
|
+
# rspec may not be available, e.g. production. As such we don't need to handle
|
|
27
|
+
# the error.
|
|
28
|
+
# rubocop:disable Lint/SuppressedException
|
|
29
|
+
begin
|
|
30
|
+
require "rspec/core/rake_task"
|
|
31
|
+
|
|
32
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
33
|
+
|
|
34
|
+
task default: :spec
|
|
35
|
+
rescue LoadError
|
|
36
|
+
# no rspec available
|
|
37
|
+
end
|
|
38
|
+
# rubocop:enable Lint/SuppressedException
|
|
Binary file
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DefraRubyEmail
|
|
4
|
+
class TestMailer < ActionMailer::Base
|
|
5
|
+
|
|
6
|
+
FROM_ADDRESS = "defra-ruby-email@example.com"
|
|
7
|
+
|
|
8
|
+
def multipart_email(recipient, add_logo = false)
|
|
9
|
+
add_logo_attachment if add_logo
|
|
10
|
+
|
|
11
|
+
mail(
|
|
12
|
+
to: recipient,
|
|
13
|
+
from: FROM_ADDRESS,
|
|
14
|
+
subject: "Multi-part email"
|
|
15
|
+
) do |format|
|
|
16
|
+
format.html { render html: "<h1>This is the html version of an email</h1>".html_safe }
|
|
17
|
+
format.text { render plain: "This is the text version of an email" }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def html_email(recipient, add_logo = false)
|
|
22
|
+
add_logo_attachment if add_logo
|
|
23
|
+
|
|
24
|
+
mail(
|
|
25
|
+
to: recipient,
|
|
26
|
+
from: FROM_ADDRESS,
|
|
27
|
+
subject: "HTML email"
|
|
28
|
+
) do |format|
|
|
29
|
+
format.html { render html: "<h1>This is the html version of an email</h1>".html_safe }
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def text_email(recipient, add_logo = false)
|
|
34
|
+
add_logo_attachment if add_logo
|
|
35
|
+
|
|
36
|
+
mail(
|
|
37
|
+
to: recipient,
|
|
38
|
+
from: FROM_ADDRESS,
|
|
39
|
+
subject: "Text email"
|
|
40
|
+
) do |format|
|
|
41
|
+
format.text { render plain: "This is the text version of an email" }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def add_logo_attachment
|
|
48
|
+
path = "/app/assets/images/defra_ruby_email/govuk_logotype_email.png"
|
|
49
|
+
|
|
50
|
+
full_path = File.join(Rails.root, path)
|
|
51
|
+
|
|
52
|
+
full_path = "#{Gem.loaded_specs['defra_ruby_email'].full_gem_path}#{path}" unless File.exist?(full_path)
|
|
53
|
+
|
|
54
|
+
attachments["govuk_logotype_email.png"] = {
|
|
55
|
+
data: File.read(full_path),
|
|
56
|
+
mime_type: "image/png"
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "defra_ruby_email/engine"
|
|
4
|
+
|
|
5
|
+
module DefraRubyEmail
|
|
6
|
+
# Enable the ability to configure the gem from its host app, rather than
|
|
7
|
+
# reading directly from env vars. Derived from
|
|
8
|
+
# https://robots.thoughtbot.com/mygem-configure-block
|
|
9
|
+
class << self
|
|
10
|
+
attr_writer :configuration
|
|
11
|
+
|
|
12
|
+
def configuration
|
|
13
|
+
@configuration ||= Configuration.new
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Added for testing. Without we cannot test both a config object with and
|
|
17
|
+
# with set values in the same rspec session
|
|
18
|
+
def reset_configuration
|
|
19
|
+
@configuration = nil
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.configure
|
|
24
|
+
yield(configuration)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DefraRubyEmail
|
|
4
|
+
class Configuration
|
|
5
|
+
|
|
6
|
+
def initialize
|
|
7
|
+
@enable = false
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Controls whether the mocks are enabled. Only if set to true will the mock
|
|
11
|
+
# pages be accessible
|
|
12
|
+
def enable=(arg)
|
|
13
|
+
# We implement our own setter to handle values being passed in as strings
|
|
14
|
+
# rather than booleans
|
|
15
|
+
parsed = arg.to_s.downcase
|
|
16
|
+
|
|
17
|
+
@enable = parsed == "true"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def enabled?
|
|
21
|
+
@enable
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "configuration"
|
|
4
|
+
require_relative "last_email_cache"
|
|
5
|
+
require_relative "last_email_observer"
|
|
6
|
+
|
|
7
|
+
module DefraRubyEmail
|
|
8
|
+
class Engine < ::Rails::Engine
|
|
9
|
+
isolate_namespace DefraRubyEmail
|
|
10
|
+
|
|
11
|
+
config.generators do |g|
|
|
12
|
+
g.test_framework :rspec
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DefraRubyEmail
|
|
4
|
+
class LastEmailCache
|
|
5
|
+
include Singleton
|
|
6
|
+
|
|
7
|
+
EMAIL_ATTRIBUTES = %i[date from to bcc cc reply_to subject].freeze
|
|
8
|
+
|
|
9
|
+
attr_accessor :last_email
|
|
10
|
+
|
|
11
|
+
# This is necessary to properly test the service functionality
|
|
12
|
+
def reset
|
|
13
|
+
@last_email = nil
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def last_email_json
|
|
17
|
+
return JSON.generate(error: "No emails sent.") unless last_email.present?
|
|
18
|
+
|
|
19
|
+
message_hash = {}
|
|
20
|
+
EMAIL_ATTRIBUTES.each do |attribute|
|
|
21
|
+
message_hash[attribute] = last_email.public_send(attribute)
|
|
22
|
+
end
|
|
23
|
+
message_hash[:body] = email_body
|
|
24
|
+
message_hash[:attachments] = last_email.attachments.map(&:filename)
|
|
25
|
+
|
|
26
|
+
JSON.generate(last_email: message_hash)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# If you've set multipart emails then you'll have both a text and a html
|
|
30
|
+
# version (determined by adding the relevant erb views). If you do so then
|
|
31
|
+
# `my_mail.parts.length` will at least equal 2. If you only have one of them
|
|
32
|
+
# e.g. just a text version then parts doesn't get populated.
|
|
33
|
+
#
|
|
34
|
+
# However any attachments will cause ActionMailer to use parts. So for example
|
|
35
|
+
# if we have a text only email with an attached image, then parts will be of
|
|
36
|
+
# length 2; one being the content and the other being the attachment.
|
|
37
|
+
#
|
|
38
|
+
# To cater for all possibilities we have this method to grab the body content
|
|
39
|
+
# https://guides.rubyonrails.org/action_mailer_basics.html#sending-multipart-emails
|
|
40
|
+
# https://stackoverflow.com/a/15818886
|
|
41
|
+
def email_body
|
|
42
|
+
part_to_use = last_email.text_part || last_email.html_part || last_email
|
|
43
|
+
|
|
44
|
+
# return the message body without the header information
|
|
45
|
+
part_to_use.body.decoded
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DefraRubyEmail
|
|
4
|
+
class LastEmailObserver
|
|
5
|
+
|
|
6
|
+
def self.delivered_email(message)
|
|
7
|
+
LastEmailCache.instance.last_email = message
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
ActionMailer::Base.register_observer(DefraRubyEmail::LastEmailObserver)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails_helper"
|
|
4
|
+
|
|
5
|
+
RSpec.describe DefraRubyEmail do
|
|
6
|
+
describe "VERSION" do
|
|
7
|
+
it "is a version string in the correct format" do
|
|
8
|
+
expect(DefraRubyEmail::VERSION).to be_a(String)
|
|
9
|
+
expect(DefraRubyEmail::VERSION).to match(/\d+\.\d+\.\d+/)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "#configuration" do
|
|
14
|
+
before(:each) { Helpers::Configuration.reset_for_tests }
|
|
15
|
+
|
|
16
|
+
context "when the host app has not provided configuration" do
|
|
17
|
+
let(:enabled) { false }
|
|
18
|
+
|
|
19
|
+
it "returns a DefraRubyEmail::Configuration instance with default values" do
|
|
20
|
+
expect(described_class.configuration).to be_an_instance_of(DefraRubyEmail::Configuration)
|
|
21
|
+
|
|
22
|
+
expect(described_class.configuration.enabled?).to eq(enabled)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context "when the host app has provided configuration" do
|
|
27
|
+
let(:enabled) { true }
|
|
28
|
+
|
|
29
|
+
it "returns a DefraRubyEmail::Configuration instance with matching values" do
|
|
30
|
+
described_class.configure do |config|
|
|
31
|
+
config.enable = enabled
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
expect(described_class.configuration).to be_an_instance_of(DefraRubyEmail::Configuration)
|
|
35
|
+
expect(described_class.configuration.enabled?).to eq(enabled)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
== README
|
|
2
|
+
|
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
|
4
|
+
application up and running.
|
|
5
|
+
|
|
6
|
+
Things you may want to cover:
|
|
7
|
+
|
|
8
|
+
* Ruby version
|
|
9
|
+
|
|
10
|
+
* System dependencies
|
|
11
|
+
|
|
12
|
+
* Configuration
|
|
13
|
+
|
|
14
|
+
* Database creation
|
|
15
|
+
|
|
16
|
+
* Database initialization
|
|
17
|
+
|
|
18
|
+
* How to run the test suite
|
|
19
|
+
|
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
|
21
|
+
|
|
22
|
+
* Deployment instructions
|
|
23
|
+
|
|
24
|
+
* ...
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
|
28
|
+
<tt>rake doc:app</tt>.
|