imap-backup 2.1.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +0 -1
- data/.rubocop.yml +5 -2
- data/.rubocop_todo.yml +24 -0
- data/.travis.yml +13 -1
- data/README.md +9 -21
- data/Rakefile +6 -2
- data/imap-backup.gemspec +5 -1
- data/lib/email/mboxrd/message.rb +13 -12
- data/lib/imap/backup/account/connection.rb +3 -2
- data/lib/imap/backup/account/folder.rb +2 -0
- data/lib/imap/backup/configuration/account.rb +20 -16
- data/lib/imap/backup/configuration/asker.rb +1 -1
- data/lib/imap/backup/serializer/mbox.rb +39 -25
- data/lib/imap/backup/serializer/mbox_enumerator.rb +31 -0
- data/lib/imap/backup/serializer/mbox_store.rb +6 -27
- data/lib/imap/backup/version.rb +1 -1
- data/spec/features/support/email_server.rb +3 -0
- data/spec/support/fixtures.rb +1 -1
- data/spec/unit/email/mboxrd/message_spec.rb +20 -3
- data/spec/unit/email/provider_spec.rb +1 -1
- data/spec/unit/imap/backup/account/connection_spec.rb +10 -9
- data/spec/unit/imap/backup/account/folder_spec.rb +24 -10
- data/spec/unit/imap/backup/configuration/account_spec.rb +47 -22
- data/spec/unit/imap/backup/configuration/asker_spec.rb +5 -9
- data/spec/unit/imap/backup/configuration/connection_tester_spec.rb +6 -6
- data/spec/unit/imap/backup/configuration/folder_chooser_spec.rb +6 -6
- data/spec/unit/imap/backup/configuration/list_spec.rb +24 -1
- data/spec/unit/imap/backup/configuration/setup_spec.rb +29 -9
- data/spec/unit/imap/backup/configuration/store_spec.rb +5 -5
- data/spec/unit/imap/backup/downloader_spec.rb +11 -13
- data/spec/unit/imap/backup/serializer/mbox_enumerator_spec.rb +40 -0
- data/spec/unit/imap/backup/serializer/mbox_spec.rb +63 -24
- data/spec/unit/imap/backup/serializer/mbox_store_spec.rb +162 -9
- data/spec/unit/imap/backup/utils_spec.rb +3 -3
- data/spec/unit/imap/backup_spec.rb +28 -0
- metadata +8 -2
@@ -14,10 +14,11 @@ describe Imap::Backup::Serializer::MboxStore do
|
|
14
14
|
let(:imap_content) do
|
15
15
|
{
|
16
16
|
version: Imap::Backup::Serializer::MboxStore::CURRENT_VERSION,
|
17
|
-
uid_validity:
|
18
|
-
uids: uids
|
17
|
+
uid_validity: uid_validity,
|
18
|
+
uids: uids
|
19
19
|
}.to_json
|
20
20
|
end
|
21
|
+
let(:uid_validity) { 123 }
|
21
22
|
|
22
23
|
before do
|
23
24
|
allow(File).to receive(:exist?).and_call_original
|
@@ -40,9 +41,30 @@ describe Imap::Backup::Serializer::MboxStore do
|
|
40
41
|
allow(FileUtils).to receive(:chmod)
|
41
42
|
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
describe "#uid_validity=" do
|
45
|
+
let(:new_uid_validity) { "13" }
|
46
|
+
let(:updated_imap_content) do
|
47
|
+
{
|
48
|
+
version: Imap::Backup::Serializer::MboxStore::CURRENT_VERSION,
|
49
|
+
uid_validity: new_uid_validity,
|
50
|
+
uids: uids
|
51
|
+
}.to_json
|
52
|
+
end
|
53
|
+
|
54
|
+
before { subject.uid_validity = new_uid_validity }
|
55
|
+
|
56
|
+
it "sets uid_validity" do
|
57
|
+
expect(subject.uid_validity).to eq(new_uid_validity)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "writes the imap file" do
|
61
|
+
expect(imap_file).to have_received(:write).with(updated_imap_content)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#uids" do
|
66
|
+
it "returns the backed-up uids as integers" do
|
67
|
+
expect(subject.uids).to eq(uids.map(&:to_i))
|
46
68
|
end
|
47
69
|
|
48
70
|
context "when the imap file does not exist" do
|
@@ -53,6 +75,30 @@ describe Imap::Backup::Serializer::MboxStore do
|
|
53
75
|
end
|
54
76
|
end
|
55
77
|
|
78
|
+
context "when the imap file is malformed" do
|
79
|
+
before do
|
80
|
+
allow(JSON).to receive(:parse).and_raise(JSON::ParserError)
|
81
|
+
end
|
82
|
+
|
83
|
+
let!(:result) { subject.uids }
|
84
|
+
|
85
|
+
it "returns an empty Array" do
|
86
|
+
expect(result).to eq([])
|
87
|
+
end
|
88
|
+
|
89
|
+
it "deletes the imap file" do
|
90
|
+
expect(File).to have_received(:unlink).with(imap_pathname)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "deletes the mbox file" do
|
94
|
+
expect(File).to have_received(:unlink).with(mbox_pathname)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "writes a blank mbox file" do
|
98
|
+
expect(mbox_file).to have_received(:write).with("")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
56
102
|
context "when the mbox does not exist" do
|
57
103
|
let(:mbox_exists) { false }
|
58
104
|
|
@@ -62,7 +108,7 @@ describe Imap::Backup::Serializer::MboxStore do
|
|
62
108
|
end
|
63
109
|
end
|
64
110
|
|
65
|
-
|
111
|
+
describe "#add" do
|
66
112
|
let(:mbox_formatted_message) { "message in mbox format" }
|
67
113
|
let(:message_uid) { "999" }
|
68
114
|
let(:message) do
|
@@ -74,15 +120,14 @@ describe Imap::Backup::Serializer::MboxStore do
|
|
74
120
|
let(:updated_imap_content) do
|
75
121
|
{
|
76
122
|
version: Imap::Backup::Serializer::MboxStore::CURRENT_VERSION,
|
77
|
-
uid_validity:
|
78
|
-
uids:
|
123
|
+
uid_validity: uid_validity,
|
124
|
+
uids: uids + [999]
|
79
125
|
}.to_json
|
80
126
|
end
|
81
127
|
|
82
128
|
before do
|
83
129
|
allow(Email::Mboxrd::Message).to receive(:new).and_return(message)
|
84
130
|
allow(File).to receive(:open).with(mbox_pathname, "ab") { mbox_file }
|
85
|
-
subject.uid_validity = 123
|
86
131
|
end
|
87
132
|
|
88
133
|
it "saves the message to the mbox" do
|
@@ -97,6 +142,15 @@ describe Imap::Backup::Serializer::MboxStore do
|
|
97
142
|
expect(imap_file).to have_received(:write).with(updated_imap_content)
|
98
143
|
end
|
99
144
|
|
145
|
+
context "when the message is already downloaded" do
|
146
|
+
let(:uids) { [999] }
|
147
|
+
|
148
|
+
it "skips the message" do
|
149
|
+
subject.add(message_uid, "The\nemail\n")
|
150
|
+
expect(mbox_file).to_not have_received(:write)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
100
154
|
context "when the message causes parsing errors" do
|
101
155
|
before do
|
102
156
|
allow(message).to receive(:to_serialized).and_raise(ArgumentError)
|
@@ -114,4 +168,103 @@ describe Imap::Backup::Serializer::MboxStore do
|
|
114
168
|
end
|
115
169
|
end
|
116
170
|
end
|
171
|
+
|
172
|
+
describe "#load" do
|
173
|
+
let(:uid) { "1" }
|
174
|
+
let(:result) { subject.load(uid) }
|
175
|
+
let(:enumerator) do
|
176
|
+
instance_double(Imap::Backup::Serializer::MboxEnumerator)
|
177
|
+
end
|
178
|
+
let(:enumeration) { instance_double(Enumerator) }
|
179
|
+
|
180
|
+
before do
|
181
|
+
allow(Imap::Backup::Serializer::MboxEnumerator).
|
182
|
+
to receive(:new) { enumerator }
|
183
|
+
allow(enumerator).to receive(:each) { enumeration }
|
184
|
+
allow(enumeration).
|
185
|
+
to receive(:with_index).
|
186
|
+
and_yield("", 0).
|
187
|
+
and_yield("", 1).
|
188
|
+
and_yield("ciao", 2)
|
189
|
+
end
|
190
|
+
|
191
|
+
it "returns the message" do
|
192
|
+
expect(result.supplied_body).to eq("ciao")
|
193
|
+
end
|
194
|
+
|
195
|
+
context "when the UID is unknown" do
|
196
|
+
let(:uid) { "99" }
|
197
|
+
|
198
|
+
it "returns nil" do
|
199
|
+
expect(result).to be_nil
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe "#update_uid" do
|
205
|
+
let(:old_uid) { "2" }
|
206
|
+
let(:updated_imap_content) do
|
207
|
+
{
|
208
|
+
version: Imap::Backup::Serializer::MboxStore::CURRENT_VERSION,
|
209
|
+
uid_validity: uid_validity,
|
210
|
+
uids: [3, 999, 1]
|
211
|
+
}.to_json
|
212
|
+
end
|
213
|
+
|
214
|
+
before { subject.update_uid(old_uid, "999") }
|
215
|
+
|
216
|
+
it "updates the stored UID" do
|
217
|
+
expect(imap_file).to have_received(:write).with(updated_imap_content)
|
218
|
+
end
|
219
|
+
|
220
|
+
context "when the UID is unknown" do
|
221
|
+
let(:old_uid) { "42" }
|
222
|
+
|
223
|
+
it "does nothing" do
|
224
|
+
expect(imap_file).to_not have_received(:write)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
describe "#reset" do
|
230
|
+
before { subject.reset }
|
231
|
+
|
232
|
+
it "deletes the imap file" do
|
233
|
+
expect(File).to have_received(:unlink).with(imap_pathname)
|
234
|
+
end
|
235
|
+
|
236
|
+
it "deletes the mbox file" do
|
237
|
+
expect(File).to have_received(:unlink).with(mbox_pathname)
|
238
|
+
end
|
239
|
+
|
240
|
+
it "writes a blank mbox file" do
|
241
|
+
expect(mbox_file).to have_received(:write).with("")
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
describe "#rename" do
|
246
|
+
let(:new_name) { "new_name" }
|
247
|
+
let(:new_folder_path) { File.join(base_path, new_name) }
|
248
|
+
let(:new_imap_name) { new_folder_path + ".imap" }
|
249
|
+
let(:new_mbox_name) { new_folder_path + ".mbox" }
|
250
|
+
|
251
|
+
before do
|
252
|
+
allow(File).to receive(:rename).and_call_original
|
253
|
+
allow(File).to receive(:rename).with(imap_pathname, new_imap_name)
|
254
|
+
allow(File).to receive(:rename).with(mbox_pathname, new_mbox_name)
|
255
|
+
subject.rename(new_name)
|
256
|
+
end
|
257
|
+
|
258
|
+
it "renames the imap file" do
|
259
|
+
expect(File).to have_received(:rename).with(imap_pathname, new_imap_name)
|
260
|
+
end
|
261
|
+
|
262
|
+
it "renames the mbox file" do
|
263
|
+
expect(File).to have_received(:rename).with(mbox_pathname, new_mbox_name)
|
264
|
+
end
|
265
|
+
|
266
|
+
it "updates the folder name" do
|
267
|
+
expect(subject.folder).to eq(new_name)
|
268
|
+
end
|
269
|
+
end
|
117
270
|
end
|
@@ -9,7 +9,7 @@ describe Imap::Backup::Utils do
|
|
9
9
|
allow(File).to receive(:exist?).with(filename).and_return(exists)
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
describe ".check_permissions" do
|
13
13
|
let(:requested) { 0o345 }
|
14
14
|
|
15
15
|
context "with existing files" do
|
@@ -47,7 +47,7 @@ describe Imap::Backup::Utils do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
|
50
|
+
describe ".mode" do
|
51
51
|
context "with existing files" do
|
52
52
|
let(:mode) { 0o2345 }
|
53
53
|
|
@@ -65,7 +65,7 @@ describe Imap::Backup::Utils do
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
|
68
|
+
describe ".make_folder" do
|
69
69
|
before do
|
70
70
|
allow(FileUtils).to receive(:mkdir_p)
|
71
71
|
allow(FileUtils).to receive(:chmod)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "ostruct"
|
2
|
+
require "imap/backup"
|
3
|
+
|
4
|
+
describe Imap::Backup do
|
5
|
+
describe ".setup_logging" do
|
6
|
+
let!(:previous) { described_class.logger.level }
|
7
|
+
|
8
|
+
before { described_class.setup_logging(config) }
|
9
|
+
|
10
|
+
after { described_class.logger.level = previous }
|
11
|
+
|
12
|
+
context "when config.debug?" do
|
13
|
+
let(:config) { OpenStruct.new(debug?: true) }
|
14
|
+
|
15
|
+
it "sets logger level to debug" do
|
16
|
+
expect(described_class.logger.level).to eq(::Logger::Severity::DEBUG)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when not config.debug?" do
|
21
|
+
let(:config) { OpenStruct.new(debug?: false) }
|
22
|
+
|
23
|
+
it "sets logger level to debug" do
|
24
|
+
expect(described_class.logger.level).to eq(::Logger::Severity::ERROR)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: imap-backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Yates
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- ".rspec"
|
135
135
|
- ".rspec-all"
|
136
136
|
- ".rubocop.yml"
|
137
|
+
- ".rubocop_todo.yml"
|
137
138
|
- ".travis.yml"
|
138
139
|
- Gemfile
|
139
140
|
- LICENSE
|
@@ -158,6 +159,7 @@ files:
|
|
158
159
|
- lib/imap/backup/downloader.rb
|
159
160
|
- lib/imap/backup/serializer.rb
|
160
161
|
- lib/imap/backup/serializer/mbox.rb
|
162
|
+
- lib/imap/backup/serializer/mbox_enumerator.rb
|
161
163
|
- lib/imap/backup/serializer/mbox_store.rb
|
162
164
|
- lib/imap/backup/uploader.rb
|
163
165
|
- lib/imap/backup/utils.rb
|
@@ -188,10 +190,12 @@ files:
|
|
188
190
|
- spec/unit/imap/backup/configuration/setup_spec.rb
|
189
191
|
- spec/unit/imap/backup/configuration/store_spec.rb
|
190
192
|
- spec/unit/imap/backup/downloader_spec.rb
|
193
|
+
- spec/unit/imap/backup/serializer/mbox_enumerator_spec.rb
|
191
194
|
- spec/unit/imap/backup/serializer/mbox_spec.rb
|
192
195
|
- spec/unit/imap/backup/serializer/mbox_store_spec.rb
|
193
196
|
- spec/unit/imap/backup/uploader_spec.rb
|
194
197
|
- spec/unit/imap/backup/utils_spec.rb
|
198
|
+
- spec/unit/imap/backup_spec.rb
|
195
199
|
- tmp/.gitkeep
|
196
200
|
homepage: https://github.com/joeyates/imap-backup
|
197
201
|
licenses: []
|
@@ -246,7 +250,9 @@ test_files:
|
|
246
250
|
- spec/unit/imap/backup/configuration/setup_spec.rb
|
247
251
|
- spec/unit/imap/backup/configuration/store_spec.rb
|
248
252
|
- spec/unit/imap/backup/downloader_spec.rb
|
253
|
+
- spec/unit/imap/backup/serializer/mbox_enumerator_spec.rb
|
249
254
|
- spec/unit/imap/backup/serializer/mbox_spec.rb
|
250
255
|
- spec/unit/imap/backup/serializer/mbox_store_spec.rb
|
251
256
|
- spec/unit/imap/backup/uploader_spec.rb
|
252
257
|
- spec/unit/imap/backup/utils_spec.rb
|
258
|
+
- spec/unit/imap/backup_spec.rb
|