gitlab-mail_room 0.0.2 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +5 -0
- data/.gitlab/issue_templates/Release.md +7 -0
- data/.ruby-version +1 -1
- data/README.md +15 -1
- data/lib/mail_room/cli.rb +4 -2
- data/lib/mail_room/connection.rb +7 -5
- data/lib/mail_room/crash_handler.rb +5 -8
- data/lib/mail_room/mailbox.rb +3 -1
- data/lib/mail_room/mailbox_watcher.rb +6 -1
- data/lib/mail_room/version.rb +2 -2
- data/mail_room.gemspec +2 -3
- data/spec/lib/arbitration/redis_spec.rb +3 -2
- data/spec/lib/cli_spec.rb +30 -15
- data/spec/lib/configuration_spec.rb +1 -2
- data/spec/lib/connection_spec.rb +6 -14
- data/spec/lib/coordinator_spec.rb +11 -9
- data/spec/lib/crash_handler_spec.rb +10 -9
- data/spec/lib/delivery/letter_opener_spec.rb +9 -5
- data/spec/lib/delivery/logger_spec.rb +7 -9
- data/spec/lib/delivery/postback_spec.rb +11 -27
- data/spec/lib/delivery/que_spec.rb +5 -8
- data/spec/lib/mailbox_spec.rb +12 -15
- data/spec/lib/mailbox_watcher_spec.rb +5 -8
- data/spec/spec_helper.rb +0 -1
- metadata +12 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 367b6c3327d94d056144113b001df4d6255ab16c6aedcfdb400b413eadd3e07e
|
4
|
+
data.tar.gz: 31ca4ff3025b9fd3ee67b1bb72203d5da46c3367830623f991bcf7b064043857
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55b4dce8b77c87a550e088344593490190975fffd13a7c6aed28316cd4524054fd209b476eae29d235413f33bbcc0b0abba1ff6eb3b1c2ba9c008dcc611ba20e
|
7
|
+
data.tar.gz: d8245f80b571b7c9a6c42c9280fd5d99db4705b4b067d6baeef6cd9dd623de69b44a75d9504ddf0fab9eb5bd566e11e72caefe9674ffff33b6e673149ed8458c
|
data/.gitlab-ci.yml
CHANGED
@@ -0,0 +1,7 @@
|
|
1
|
+
# GitLab mail_room release checklist
|
2
|
+
|
3
|
+
- [ ] create tag in https://gitlab.com/gitlab-org/gitlab-mail_room/
|
4
|
+
- [ ] publish gem from this tag to rubygems.org
|
5
|
+
- [ ] update https://gitlab.com/gitlab-org/gitlab/-/blob/master/Gemfile to use the new gem version
|
6
|
+
- [ ] update gitlab-org/build/CNG to build container images from the new gem (example: https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/451/diffs)
|
7
|
+
- [ ] to deploy the new version to gitlab.com, update gitlab-com/gl-infra/k8s-workloads/gitlab-com to pin the new mailroom container image version and assign it the [release managers](https://about.gitlab.com/community/release-managers/) (example: https://gitlab.com/gitlab-com/gl-infra/k8s-workloads/gitlab-com/-/merge_requests/236/diffs)
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.7.2
|
data/README.md
CHANGED
@@ -2,7 +2,21 @@
|
|
2
2
|
|
3
3
|
## Fork notice
|
4
4
|
|
5
|
-
mail_room contains some merged functionality that GitLab requires, so this mirror fork is to help us release custom functionality.
|
5
|
+
`mail_room` contains some merged functionality that GitLab requires, so this mirror fork is to help us release custom functionality.
|
6
|
+
|
7
|
+
It needs to be more or less kept up to date with the original, so please feel free to incorporate changes to the upstream repo if you see them.
|
8
|
+
|
9
|
+
### Rationale
|
10
|
+
|
11
|
+
This fork is required to reduce dependency on the upstream releases.
|
12
|
+
|
13
|
+
The [original JSON structured logging PR](https://github.com/tpitale/mail_room/pull/88) was [released](https://github.com/tpitale/mail_room/commit/deb8fe63bab21c5c3003346961a815d137ff6d2d) and we [bumped the version](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/3719) to incorporate it into [omnibus](https://gitlab.com/gitlab-org/omnibus-gitlab).
|
14
|
+
It turned out that when Mailroom crashed out (which it's designed to do), the crash log [wasn't being pulled into elastic in a very useful way](https://github.com/tpitale/mail_room/commits/master) (that is, every line of the stack trace was a new event) so [another PR](https://github.com/tpitale/mail_room/pull/103) was raised.
|
15
|
+
|
16
|
+
Rather than wait for the author (or bugging him more than once), we [opted for bias for action](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19186#note_290758986) and made a fork of the gem.
|
17
|
+
Here it is [in omnibus](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/3960).
|
18
|
+
|
19
|
+
The fork is useful as we can post quick fixes to our own fork and release fixes quickly, and still contribute those fixes upstream to help others.
|
6
20
|
|
7
21
|
## README
|
8
22
|
|
data/lib/mail_room/cli.rb
CHANGED
@@ -26,7 +26,9 @@ module MailRoom
|
|
26
26
|
end
|
27
27
|
|
28
28
|
parser.on('--log-exit-as') do |format|
|
29
|
-
|
29
|
+
# accepts 'json' and 'plain'
|
30
|
+
# 'plain' is equivalent to no format given
|
31
|
+
options[:exit_error_format] = format unless format.nil?
|
30
32
|
end
|
31
33
|
|
32
34
|
# parser.on("-l", "--log FILE") do |path|
|
@@ -55,7 +57,7 @@ module MailRoom
|
|
55
57
|
|
56
58
|
coordinator.run
|
57
59
|
rescue Exception => e # not just Errors, but includes lower-level Exceptions
|
58
|
-
CrashHandler.new(
|
60
|
+
CrashHandler.new.handle(e, @options[:exit_error_format])
|
59
61
|
exit
|
60
62
|
end
|
61
63
|
end
|
data/lib/mail_room/connection.rb
CHANGED
@@ -27,7 +27,7 @@ module MailRoom
|
|
27
27
|
# is the imap connection closed?
|
28
28
|
# @return [Boolean]
|
29
29
|
def disconnected?
|
30
|
-
|
30
|
+
imap.disconnected?
|
31
31
|
end
|
32
32
|
|
33
33
|
# is the connection ready to idle?
|
@@ -49,8 +49,8 @@ module MailRoom
|
|
49
49
|
idle
|
50
50
|
|
51
51
|
process_mailbox
|
52
|
-
rescue Net::IMAP::Error, IOError
|
53
|
-
@mailbox.logger.warn({ context: @mailbox.context, action: "Disconnected. Resetting..." })
|
52
|
+
rescue Net::IMAP::Error, IOError => e
|
53
|
+
@mailbox.logger.warn({ context: @mailbox.context, action: "Disconnected. Resetting...", error: e.message })
|
54
54
|
reset
|
55
55
|
setup
|
56
56
|
end
|
@@ -174,10 +174,12 @@ module MailRoom
|
|
174
174
|
# @return [Array<Integer>] message ids
|
175
175
|
def new_message_ids
|
176
176
|
# uid_search still leaves messages UNSEEN
|
177
|
-
all_unread =
|
177
|
+
all_unread = imap.uid_search(@mailbox.search_command)
|
178
|
+
|
179
|
+
all_unread = all_unread.slice(0, @mailbox.limit_max_unread) unless @mailbox.limit_max_unread.nil? || @mailbox.limit_max_unread == 0
|
178
180
|
|
179
181
|
to_deliver = all_unread.select { |uid| @mailbox.deliver?(uid) }
|
180
|
-
@mailbox.logger.info({ context: @mailbox.context, action: "Getting new messages", unread: {count: all_unread.count, ids: all_unread}, to_be_delivered: { count: to_deliver.count, ids:
|
182
|
+
@mailbox.logger.info({ context: @mailbox.context, action: "Getting new messages", unread: {count: all_unread.count, ids: all_unread}, to_be_delivered: { count: to_deliver.count, ids: to_deliver } })
|
181
183
|
to_deliver
|
182
184
|
end
|
183
185
|
|
@@ -2,18 +2,15 @@
|
|
2
2
|
module MailRoom
|
3
3
|
class CrashHandler
|
4
4
|
|
5
|
-
attr_reader :error, :format
|
6
|
-
|
7
5
|
SUPPORTED_FORMATS = %w[json none]
|
8
6
|
|
9
|
-
def initialize(
|
10
|
-
@
|
11
|
-
@format = format
|
7
|
+
def initialize(stream=STDOUT)
|
8
|
+
@stream = stream
|
12
9
|
end
|
13
10
|
|
14
|
-
def handle
|
11
|
+
def handle(error, format)
|
15
12
|
if format == 'json'
|
16
|
-
puts json
|
13
|
+
@stream.puts json(error)
|
17
14
|
return
|
18
15
|
end
|
19
16
|
|
@@ -22,7 +19,7 @@ module MailRoom
|
|
22
19
|
|
23
20
|
private
|
24
21
|
|
25
|
-
def json
|
22
|
+
def json(error)
|
26
23
|
{ time: Time.now, severity: :fatal, message: error.message, backtrace: error.backtrace }.to_json
|
27
24
|
end
|
28
25
|
end
|
data/lib/mail_room/mailbox.rb
CHANGED
@@ -10,6 +10,7 @@ module MailRoom
|
|
10
10
|
:port,
|
11
11
|
:ssl,
|
12
12
|
:start_tls,
|
13
|
+
:limit_max_unread, #to avoid 'Error in IMAP command UID FETCH: Too long argument'
|
13
14
|
:idle_timeout,
|
14
15
|
:search_command,
|
15
16
|
:name,
|
@@ -50,6 +51,7 @@ module MailRoom
|
|
50
51
|
:port => 993,
|
51
52
|
:ssl => true,
|
52
53
|
:start_tls => false,
|
54
|
+
:limit_max_unread => 0,
|
53
55
|
:idle_timeout => IMAP_IDLE_TIMEOUT,
|
54
56
|
:delete_after_delivery => false,
|
55
57
|
:expunge_deleted => false,
|
@@ -106,7 +108,7 @@ module MailRoom
|
|
106
108
|
body = message.attr['RFC822']
|
107
109
|
return true unless body
|
108
110
|
|
109
|
-
logger.info({context: context, uid: message.attr['UID'], action: "sending to deliverer", deliverer: delivery.class.name, byte_size:
|
111
|
+
logger.info({context: context, uid: message.attr['UID'], action: "sending to deliverer", deliverer: delivery.class.name, byte_size: body.bytesize})
|
110
112
|
delivery.deliver(body)
|
111
113
|
end
|
112
114
|
|
@@ -49,9 +49,14 @@ module MailRoom
|
|
49
49
|
@connection = nil
|
50
50
|
end
|
51
51
|
|
52
|
+
@mailbox.logger.info({ context: @mailbox.context, action: "Terminating watching thread..." })
|
53
|
+
|
52
54
|
if self.watching_thread
|
53
|
-
self.watching_thread.join
|
55
|
+
thr = self.watching_thread.join(60)
|
56
|
+
@mailbox.logger.info({ context: @mailbox.context, action: "Timeout waiting for watching thread" }) unless thr
|
54
57
|
end
|
58
|
+
|
59
|
+
@mailbox.logger.info({ context: @mailbox.context, action: "Done with thread cleanup" })
|
55
60
|
end
|
56
61
|
|
57
62
|
private
|
data/lib/mail_room/version.rb
CHANGED
data/mail_room.gemspec
CHANGED
@@ -18,9 +18,8 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
20
|
gem.add_development_dependency "rake"
|
21
|
-
gem.add_development_dependency "rspec"
|
22
|
-
gem.add_development_dependency "mocha"
|
23
|
-
gem.add_development_dependency "bourne"
|
21
|
+
gem.add_development_dependency "rspec", "~> 3.9"
|
22
|
+
gem.add_development_dependency "mocha", "~> 1.11"
|
24
23
|
gem.add_development_dependency "simplecov"
|
25
24
|
|
26
25
|
# for testing delivery methods
|
@@ -5,7 +5,8 @@ describe MailRoom::Arbitration::Redis do
|
|
5
5
|
let(:mailbox) {
|
6
6
|
build_mailbox(
|
7
7
|
arbitration_options: {
|
8
|
-
namespace: "mail_room"
|
8
|
+
namespace: "mail_room",
|
9
|
+
redis_url: ENV['REDIS_URL']
|
9
10
|
}
|
10
11
|
)
|
11
12
|
}
|
@@ -78,7 +79,7 @@ describe MailRoom::Arbitration::Redis do
|
|
78
79
|
|
79
80
|
context 'redis client connection params' do
|
80
81
|
context 'when only url is present' do
|
81
|
-
let(:redis_url) {
|
82
|
+
let(:redis_url) { ENV.fetch('REDIS_URL', 'redis://localhost:6379') }
|
82
83
|
let(:mailbox) {
|
83
84
|
build_mailbox(
|
84
85
|
arbitration_options: {
|
data/spec/lib/cli_spec.rb
CHANGED
@@ -4,23 +4,35 @@ describe MailRoom::CLI do
|
|
4
4
|
let(:config_path) {File.expand_path('../fixtures/test_config.yml', File.dirname(__FILE__))}
|
5
5
|
let!(:configuration) {MailRoom::Configuration.new({:config_path => config_path})}
|
6
6
|
let(:coordinator) {stub(:run => true, :quit => true)}
|
7
|
+
let(:configuration_args) { anything }
|
8
|
+
let(:coordinator_args) { anything }
|
7
9
|
|
8
10
|
describe '.new' do
|
9
11
|
let(:args) {["-c", "a path"]}
|
10
12
|
|
11
13
|
before :each do
|
12
|
-
MailRoom::Configuration.
|
13
|
-
MailRoom::Coordinator.stubs(:new).returns(coordinator)
|
14
|
+
MailRoom::Configuration.expects(:new).with(configuration_args).returns(configuration)
|
15
|
+
MailRoom::Coordinator.stubs(:new).with(coordinator_args).returns(coordinator)
|
14
16
|
end
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
context 'with configuration args' do
|
19
|
+
let(:configuration_args) do
|
20
|
+
{:config_path => 'a path'}
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'parses arguments into configuration' do
|
24
|
+
expect(MailRoom::CLI.new(args).configuration).to eq configuration
|
25
|
+
end
|
19
26
|
end
|
20
27
|
|
21
|
-
|
22
|
-
|
23
|
-
|
28
|
+
context 'with coordinator args' do
|
29
|
+
let(:coordinator_args) do
|
30
|
+
configuration.mailboxes
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'creates a new coordinator with configuration' do
|
34
|
+
expect(MailRoom::CLI.new(args).coordinator).to eq(coordinator)
|
35
|
+
end
|
24
36
|
end
|
25
37
|
end
|
26
38
|
|
@@ -30,30 +42,33 @@ describe MailRoom::CLI do
|
|
30
42
|
before :each do
|
31
43
|
cli.configuration = configuration
|
32
44
|
cli.coordinator = coordinator
|
45
|
+
cli.stubs(:exit)
|
33
46
|
end
|
34
47
|
|
35
48
|
it 'starts running the coordinator' do
|
36
|
-
|
49
|
+
coordinator.expects(:run)
|
37
50
|
|
38
|
-
|
51
|
+
cli.start
|
39
52
|
end
|
40
53
|
|
41
54
|
context 'on error' do
|
42
|
-
let(:
|
43
|
-
let(:coordinator) {
|
55
|
+
let(:error) { RuntimeError.new("oh noes!") }
|
56
|
+
let(:coordinator) { stub(run: true, quit: true) }
|
57
|
+
let(:crash_handler) { stub(handle: nil) }
|
44
58
|
|
45
59
|
before do
|
46
60
|
cli.instance_variable_set(:@options, {exit_error_format: error_format})
|
47
|
-
coordinator.stubs(:run).raises(
|
61
|
+
coordinator.stubs(:run).raises(error)
|
62
|
+
MailRoom::CrashHandler.stubs(:new).returns(crash_handler)
|
48
63
|
end
|
49
64
|
|
50
65
|
context 'json format provided' do
|
51
66
|
let(:error_format) { 'json' }
|
52
67
|
|
53
68
|
it 'passes onto CrashHandler' do
|
54
|
-
|
69
|
+
crash_handler.expects(:handle).with(error, error_format)
|
55
70
|
|
56
|
-
|
71
|
+
cli.start
|
57
72
|
end
|
58
73
|
end
|
59
74
|
end
|
@@ -19,10 +19,9 @@ describe MailRoom::Configuration do
|
|
19
19
|
|
20
20
|
it 'sets mailboxes to an empty set' do
|
21
21
|
MailRoom::Mailbox.stubs(:new)
|
22
|
+
MailRoom::Mailbox.expects(:new).never
|
22
23
|
|
23
24
|
expect(configuration.mailboxes).to eq([])
|
24
|
-
|
25
|
-
expect(MailRoom::Mailbox).to have_received(:new).never
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
data/spec/lib/connection_spec.rb
CHANGED
@@ -44,22 +44,14 @@ describe MailRoom::Connection do
|
|
44
44
|
true
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
imap.
|
50
|
-
|
51
|
-
imap.
|
52
|
-
imap.
|
53
|
-
imap.stubs(:expunge)
|
47
|
+
imap.expects(:idle)
|
48
|
+
imap.stubs(:uid_search).with(mailbox.search_command).returns([], [1])
|
49
|
+
imap.expects(:uid_fetch).with([1], "RFC822").returns([new_message])
|
50
|
+
mailbox.expects(:deliver?).with(1).returns(true)
|
51
|
+
imap.expects(:store).with(8, "+FLAGS", [Net::IMAP::DELETED])
|
52
|
+
imap.expects(:expunge).once
|
54
53
|
|
55
54
|
connection.wait
|
56
|
-
|
57
|
-
expect(imap).to have_received(:idle)
|
58
|
-
expect(imap).to have_received(:uid_search).with(mailbox.search_command).twice
|
59
|
-
expect(imap).to have_received(:uid_fetch).with([1], "RFC822")
|
60
|
-
expect(mailbox).to have_received(:deliver?).with(1)
|
61
|
-
expect(imap).to have_received(:store).with(8, "+FLAGS", [Net::IMAP::DELETED])
|
62
|
-
expect(imap).to have_received(:expunge).once
|
63
55
|
end
|
64
56
|
end
|
65
57
|
end
|
@@ -3,14 +3,12 @@ require 'spec_helper'
|
|
3
3
|
describe MailRoom::Coordinator do
|
4
4
|
describe '#initialize' do
|
5
5
|
it 'builds a watcher for each mailbox' do
|
6
|
-
MailRoom::MailboxWatcher.
|
6
|
+
MailRoom::MailboxWatcher.expects(:new).with('mailbox1').returns('watcher1')
|
7
|
+
MailRoom::MailboxWatcher.expects(:new).with('mailbox2').returns('watcher2')
|
7
8
|
|
8
9
|
coordinator = MailRoom::Coordinator.new(['mailbox1', 'mailbox2'])
|
9
10
|
|
10
11
|
expect(coordinator.watchers).to eq(['watcher1', 'watcher2'])
|
11
|
-
|
12
|
-
expect(MailRoom::MailboxWatcher).to have_received(:new).with('mailbox1')
|
13
|
-
expect(MailRoom::MailboxWatcher).to have_received(:new).with('mailbox2')
|
14
12
|
end
|
15
13
|
|
16
14
|
it 'makes no watchers when mailboxes is empty' do
|
@@ -27,24 +25,27 @@ describe MailRoom::Coordinator do
|
|
27
25
|
MailRoom::MailboxWatcher.stubs(:new).returns(watcher)
|
28
26
|
coordinator = MailRoom::Coordinator.new(['mailbox1'])
|
29
27
|
coordinator.stubs(:sleep_while_running)
|
28
|
+
watcher.expects(:run)
|
29
|
+
watcher.expects(:quit)
|
30
|
+
|
30
31
|
coordinator.run
|
31
|
-
expect(watcher).to have_received(:run)
|
32
|
-
expect(watcher).to have_received(:quit)
|
33
32
|
end
|
34
33
|
|
35
34
|
it 'should go to sleep after running watchers' do
|
36
35
|
coordinator = MailRoom::Coordinator.new([])
|
37
36
|
coordinator.stubs(:running=)
|
38
37
|
coordinator.stubs(:running?).returns(false)
|
38
|
+
coordinator.expects(:running=).with(true)
|
39
|
+
coordinator.expects(:running?)
|
40
|
+
|
39
41
|
coordinator.run
|
40
|
-
expect(coordinator).to have_received(:running=).with(true)
|
41
|
-
expect(coordinator).to have_received(:running?)
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'should set attribute running to true' do
|
45
45
|
coordinator = MailRoom::Coordinator.new([])
|
46
46
|
coordinator.stubs(:sleep_while_running)
|
47
47
|
coordinator.run
|
48
|
+
|
48
49
|
expect(coordinator.running).to eq(true)
|
49
50
|
end
|
50
51
|
end
|
@@ -54,8 +55,9 @@ describe MailRoom::Coordinator do
|
|
54
55
|
watcher = stub(:quit)
|
55
56
|
MailRoom::MailboxWatcher.stubs(:new).returns(watcher)
|
56
57
|
coordinator = MailRoom::Coordinator.new(['mailbox1'])
|
58
|
+
watcher.expects(:quit)
|
59
|
+
|
57
60
|
coordinator.quit
|
58
|
-
expect(watcher).to have_received(:quit)
|
59
61
|
end
|
60
62
|
end
|
61
63
|
end
|
@@ -4,21 +4,22 @@ describe MailRoom::CrashHandler do
|
|
4
4
|
|
5
5
|
let(:error_message) { "oh noes!" }
|
6
6
|
let(:error) { RuntimeError.new(error_message) }
|
7
|
+
let(:stdout) { StringIO.new }
|
7
8
|
|
8
9
|
describe '#handle' do
|
9
10
|
|
10
|
-
subject{ described_class.new(error
|
11
|
+
subject{ described_class.new(stdout).handle(error, format) }
|
11
12
|
|
12
13
|
context 'when given a json format' do
|
13
14
|
let(:format) { 'json' }
|
14
|
-
let(:fake_json) do
|
15
|
-
{ message: error_message }.to_json
|
16
|
-
end
|
17
15
|
|
18
|
-
it '
|
19
|
-
subject
|
16
|
+
it 'writes a json message to stdout' do
|
17
|
+
subject
|
18
|
+
stdout.rewind
|
19
|
+
output = stdout.read
|
20
20
|
|
21
|
-
expect
|
21
|
+
expect(output).to end_with("\n")
|
22
|
+
expect(JSON.parse(output)['message']).to eq(error_message)
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
@@ -26,7 +27,7 @@ describe MailRoom::CrashHandler do
|
|
26
27
|
let(:format) { "" }
|
27
28
|
|
28
29
|
it 'raises an error as designed' do
|
29
|
-
expect{ subject
|
30
|
+
expect{ subject }.to raise_error(error.class, error_message)
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
@@ -34,7 +35,7 @@ describe MailRoom::CrashHandler do
|
|
34
35
|
let(:format) { "nonsense" }
|
35
36
|
|
36
37
|
it 'raises an error as designed' do
|
37
|
-
expect{ subject
|
38
|
+
expect{ subject }.to raise_error(error.class, error_message)
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
@@ -10,20 +10,24 @@ describe MailRoom::Delivery::LetterOpener do
|
|
10
10
|
before :each do
|
11
11
|
Mail.stubs(:read_from_string).returns(mail)
|
12
12
|
::LetterOpener::DeliveryMethod.stubs(:new).returns(delivery_method)
|
13
|
-
|
14
|
-
MailRoom::Delivery::LetterOpener.new(mailbox).deliver('a message')
|
15
13
|
end
|
16
14
|
|
17
15
|
it 'creates a new LetterOpener::DeliveryMethod' do
|
18
|
-
|
16
|
+
::LetterOpener::DeliveryMethod.expects(:new).with(:location => '/tmp/somewhere').returns(delivery_method)
|
17
|
+
|
18
|
+
MailRoom::Delivery::LetterOpener.new(mailbox).deliver('a message')
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'parses the message string with Mail' do
|
22
|
-
|
22
|
+
::Mail.expects(:read_from_string).with('a message')
|
23
|
+
|
24
|
+
MailRoom::Delivery::LetterOpener.new(mailbox).deliver('a message')
|
23
25
|
end
|
24
26
|
|
25
27
|
it 'delivers the mail message' do
|
26
|
-
|
28
|
+
delivery_method.expects(:deliver!).with(mail)
|
29
|
+
|
30
|
+
MailRoom::Delivery::LetterOpener.new(mailbox).deliver('a message')
|
27
31
|
end
|
28
32
|
end
|
29
33
|
end
|
@@ -9,9 +9,9 @@ describe MailRoom::Delivery::Logger do
|
|
9
9
|
it 'creates a new ruby logger' do
|
10
10
|
::Logger.stubs(:new)
|
11
11
|
|
12
|
-
|
12
|
+
::Logger.expects(:new).with(STDOUT)
|
13
13
|
|
14
|
-
|
14
|
+
MailRoom::Delivery::Logger.new(mailbox)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -19,14 +19,12 @@ describe MailRoom::Delivery::Logger do
|
|
19
19
|
let(:mailbox) {build_mailbox(:log_path => '/var/log/mail-room.log')}
|
20
20
|
|
21
21
|
it 'creates a new file to append to' do
|
22
|
-
::Logger.stubs(:new)
|
23
22
|
file = stub(:sync=)
|
24
|
-
::File.stubs(:open).returns(file)
|
25
23
|
|
26
|
-
|
24
|
+
File.expects(:open).with('/var/log/mail-room.log', 'a').returns(file)
|
25
|
+
::Logger.stubs(:new).with(file)
|
27
26
|
|
28
|
-
|
29
|
-
expect(::Logger).to have_received(:new).with(file)
|
27
|
+
MailRoom::Delivery::Logger.new(mailbox)
|
30
28
|
end
|
31
29
|
end
|
32
30
|
end
|
@@ -38,9 +36,9 @@ describe MailRoom::Delivery::Logger do
|
|
38
36
|
logger = stub(:info)
|
39
37
|
::Logger.stubs(:new).returns(logger)
|
40
38
|
|
41
|
-
|
39
|
+
logger.expects(:info).with('a message')
|
42
40
|
|
43
|
-
|
41
|
+
MailRoom::Delivery::Logger.new(mailbox).deliver('a message')
|
44
42
|
end
|
45
43
|
end
|
46
44
|
end
|
@@ -18,19 +18,13 @@ describe MailRoom::Delivery::Postback do
|
|
18
18
|
request = stub
|
19
19
|
Faraday.stubs(:new).returns(connection)
|
20
20
|
|
21
|
-
connection.
|
22
|
-
connection.
|
21
|
+
connection.expects(:token_auth).with('abcdefg')
|
22
|
+
connection.expects(:post).yields(request)
|
23
23
|
|
24
|
-
request.
|
25
|
-
request.
|
24
|
+
request.expects(:url).with('http://localhost/inbox')
|
25
|
+
request.expects(:body=).with('a message')
|
26
26
|
|
27
27
|
MailRoom::Delivery::Postback.new(delivery_options).deliver('a message')
|
28
|
-
|
29
|
-
expect(connection).to have_received(:token_auth).with('abcdefg')
|
30
|
-
expect(connection).to have_received(:post)
|
31
|
-
|
32
|
-
expect(request).to have_received(:url).with('http://localhost/inbox')
|
33
|
-
expect(request).to have_received(:body=).with('a message')
|
34
28
|
end
|
35
29
|
end
|
36
30
|
|
@@ -52,19 +46,13 @@ describe MailRoom::Delivery::Postback do
|
|
52
46
|
request = stub
|
53
47
|
Faraday.stubs(:new).returns(connection)
|
54
48
|
|
55
|
-
connection.
|
56
|
-
connection.
|
49
|
+
connection.expects(:basic_auth).with('user1', 'password123abc')
|
50
|
+
connection.expects(:post).yields(request)
|
57
51
|
|
58
|
-
request.
|
59
|
-
request.
|
52
|
+
request.expects(:url).with('http://localhost/inbox')
|
53
|
+
request.expects(:body=).with('a message')
|
60
54
|
|
61
55
|
MailRoom::Delivery::Postback.new(delivery_options).deliver('a message')
|
62
|
-
|
63
|
-
expect(connection).to have_received(:basic_auth).with('user1', 'password123abc')
|
64
|
-
expect(connection).to have_received(:post)
|
65
|
-
|
66
|
-
expect(request).to have_received(:url).with('http://localhost/inbox')
|
67
|
-
expect(request).to have_received(:body=).with('a message')
|
68
56
|
end
|
69
57
|
|
70
58
|
context 'with content type in the delivery options' do
|
@@ -86,18 +74,14 @@ describe MailRoom::Delivery::Postback do
|
|
86
74
|
connection = stub
|
87
75
|
request = stub
|
88
76
|
Faraday.stubs(:new).returns(connection)
|
89
|
-
|
90
|
-
connection.
|
91
|
-
connection.stubs(:post).yields(request)
|
92
|
-
|
77
|
+
|
78
|
+
connection.expects(:post).yields(request)
|
93
79
|
request.stubs(:url)
|
94
80
|
request.stubs(:body=)
|
95
81
|
request.stubs(:headers).returns({})
|
82
|
+
connection.expects(:basic_auth).with('user1', 'password123abc')
|
96
83
|
|
97
84
|
MailRoom::Delivery::Postback.new(delivery_options).deliver('a message')
|
98
|
-
|
99
|
-
expect(connection).to have_received(:basic_auth).with('user1', 'password123abc')
|
100
|
-
expect(connection).to have_received(:post)
|
101
85
|
|
102
86
|
expect(request.headers['Content-Type']).to eq('text/plain')
|
103
87
|
end
|
@@ -18,20 +18,15 @@ describe MailRoom::Delivery::Que do
|
|
18
18
|
let(:options) {MailRoom::Delivery::Que::Options.new(mailbox)}
|
19
19
|
|
20
20
|
it 'stores the message in que_jobs table' do
|
21
|
-
PG.
|
22
|
-
connection.stubs(:exec)
|
23
|
-
|
24
|
-
MailRoom::Delivery::Que.new(options).deliver('email')
|
25
|
-
|
26
|
-
expect(PG).to have_received(:connect).with({
|
21
|
+
PG.expects(:connect).with({
|
27
22
|
host: 'localhost',
|
28
23
|
port: 5432,
|
29
24
|
dbname: 'delivery_test',
|
30
25
|
user: 'postgres',
|
31
26
|
password: ''
|
32
|
-
})
|
27
|
+
}).returns(connection)
|
33
28
|
|
34
|
-
|
29
|
+
connection.expects(:exec).with(
|
35
30
|
"INSERT INTO que_jobs (priority, job_class, queue, args) VALUES ($1, $2, $3, $4)",
|
36
31
|
[
|
37
32
|
5,
|
@@ -40,6 +35,8 @@ describe MailRoom::Delivery::Que do
|
|
40
35
|
JSON.dump(['email'])
|
41
36
|
]
|
42
37
|
)
|
38
|
+
|
39
|
+
MailRoom::Delivery::Que.new(options).deliver('email')
|
43
40
|
end
|
44
41
|
end
|
45
42
|
end
|
data/spec/lib/mailbox_spec.rb
CHANGED
@@ -12,9 +12,9 @@ describe MailRoom::Mailbox do
|
|
12
12
|
|
13
13
|
uid = 123
|
14
14
|
|
15
|
-
|
15
|
+
noop.expects(:deliver?).with(uid)
|
16
16
|
|
17
|
-
|
17
|
+
mailbox.deliver?(uid)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -23,12 +23,10 @@ describe MailRoom::Mailbox do
|
|
23
23
|
mailbox = build_mailbox({:arbitration_method => 'redis'})
|
24
24
|
redis = stub(:deliver?)
|
25
25
|
MailRoom::Arbitration['redis'].stubs(:new => redis)
|
26
|
-
|
27
26
|
uid = 123
|
27
|
+
redis.expects(:deliver?).with(uid)
|
28
28
|
|
29
29
|
mailbox.deliver?(uid)
|
30
|
-
|
31
|
-
expect(redis).to have_received(:deliver?).with(uid)
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
@@ -38,9 +36,9 @@ describe MailRoom::Mailbox do
|
|
38
36
|
noop = stub(:deliver)
|
39
37
|
MailRoom::Delivery['noop'].stubs(:new => noop)
|
40
38
|
|
41
|
-
|
39
|
+
noop.expects(:deliver).with('a message')
|
42
40
|
|
43
|
-
|
41
|
+
mailbox.deliver(stub(:attr => sample_message))
|
44
42
|
end
|
45
43
|
end
|
46
44
|
|
@@ -50,9 +48,9 @@ describe MailRoom::Mailbox do
|
|
50
48
|
logger = stub(:deliver)
|
51
49
|
MailRoom::Delivery['logger'].stubs(:new => logger)
|
52
50
|
|
53
|
-
|
51
|
+
logger.expects(:deliver).with('a message')
|
54
52
|
|
55
|
-
|
53
|
+
mailbox.deliver(stub(:attr => sample_message))
|
56
54
|
end
|
57
55
|
end
|
58
56
|
|
@@ -62,9 +60,9 @@ describe MailRoom::Mailbox do
|
|
62
60
|
postback = stub(:deliver)
|
63
61
|
MailRoom::Delivery['postback'].stubs(:new => postback)
|
64
62
|
|
65
|
-
|
63
|
+
postback.expects(:deliver).with('a message')
|
66
64
|
|
67
|
-
|
65
|
+
mailbox.deliver(stub(:attr => sample_message))
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
@@ -74,9 +72,9 @@ describe MailRoom::Mailbox do
|
|
74
72
|
letter_opener = stub(:deliver)
|
75
73
|
MailRoom::Delivery['letter_opener'].stubs(:new => letter_opener)
|
76
74
|
|
77
|
-
|
75
|
+
letter_opener.expects(:deliver).with('a message')
|
78
76
|
|
79
|
-
|
77
|
+
mailbox.deliver(stub(:attr => sample_message))
|
80
78
|
end
|
81
79
|
end
|
82
80
|
|
@@ -85,10 +83,9 @@ describe MailRoom::Mailbox do
|
|
85
83
|
mailbox = build_mailbox({ name: "magic mailbox", delivery_method: 'noop' })
|
86
84
|
noop = stub(:deliver)
|
87
85
|
MailRoom::Delivery['noop'].stubs(:new => noop)
|
86
|
+
noop.expects(:deliver).never
|
88
87
|
|
89
88
|
mailbox.deliver(stub(:attr => {'FLAGS' => [:Seen, :Recent]}))
|
90
|
-
|
91
|
-
expect(noop).to have_received(:deliver).never
|
92
89
|
end
|
93
90
|
end
|
94
91
|
|
@@ -20,19 +20,15 @@ describe MailRoom::MailboxWatcher do
|
|
20
20
|
|
21
21
|
it 'loops over wait while running' do
|
22
22
|
connection = MailRoom::Connection.new(mailbox)
|
23
|
-
connection.stubs(:on_new_message)
|
24
|
-
connection.stubs(:wait)
|
25
23
|
|
26
24
|
MailRoom::Connection.stubs(:new).returns(connection)
|
27
25
|
|
28
|
-
watcher.
|
26
|
+
watcher.expects(:running?).twice.returns(true, false)
|
27
|
+
connection.expects(:wait).once
|
28
|
+
connection.expects(:on_new_message).once
|
29
29
|
|
30
30
|
watcher.run
|
31
31
|
watcher.watching_thread.join # wait for finishing run
|
32
|
-
|
33
|
-
expect(watcher).to have_received(:running?).times(2)
|
34
|
-
expect(connection).to have_received(:wait).once
|
35
|
-
expect(connection).to have_received(:on_new_message).once
|
36
32
|
end
|
37
33
|
end
|
38
34
|
|
@@ -55,9 +51,10 @@ describe MailRoom::MailboxWatcher do
|
|
55
51
|
|
56
52
|
expect(watcher.running?).to eq(true)
|
57
53
|
|
54
|
+
connection.expects(:quit)
|
55
|
+
|
58
56
|
watcher.quit
|
59
57
|
|
60
|
-
expect(connection).to have_received(:quit)
|
61
58
|
expect(watcher.running?).to eq(false)
|
62
59
|
end
|
63
60
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab-mail_room
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Pitale
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -28,44 +28,30 @@ dependencies:
|
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.9'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.9'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mocha
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: bourne
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
45
|
+
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
47
|
+
version: '1.11'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- - "
|
52
|
+
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
54
|
+
version: '1.11'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: simplecov
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -188,6 +174,7 @@ extra_rdoc_files: []
|
|
188
174
|
files:
|
189
175
|
- ".gitignore"
|
190
176
|
- ".gitlab-ci.yml"
|
177
|
+
- ".gitlab/issue_templates/Release.md"
|
191
178
|
- ".ruby-version"
|
192
179
|
- ".travis.yml"
|
193
180
|
- CHANGELOG.md
|
@@ -253,7 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
253
240
|
- !ruby/object:Gem::Version
|
254
241
|
version: '0'
|
255
242
|
requirements: []
|
256
|
-
rubygems_version: 3.1.
|
243
|
+
rubygems_version: 3.1.4
|
257
244
|
signing_key:
|
258
245
|
specification_version: 4
|
259
246
|
summary: mail_room will proxy email (gmail) from IMAP to a callback URL, logger, or
|