imap-backup 2.1.0 → 2.1.1
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 +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
|