imap-backup 2.1.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -4
  3. data/.rubocop_todo.yml +29 -11
  4. data/.travis.yml +1 -1
  5. data/README.md +10 -13
  6. data/bin/imap-backup +5 -2
  7. data/docs/01-credentials-screen.png +0 -0
  8. data/docs/02-new-project.png +0 -0
  9. data/docs/03-initial-credentials-for-project.png +0 -0
  10. data/docs/04-credential-type-selection.png +0 -0
  11. data/docs/05-cant-create-without-consent-setup.png +0 -0
  12. data/docs/06-user-type-selection.png +0 -0
  13. data/docs/07-consent-screen-form.png +0 -0
  14. data/docs/08-app-scopes.png +0 -0
  15. data/docs/09-scope-selection.png +0 -0
  16. data/docs/10-updated-app-scopes.png +0 -0
  17. data/docs/11-test-users.png +0 -0
  18. data/docs/12-add-users.png +0 -0
  19. data/docs/13-create-oauth-client.png +0 -0
  20. data/docs/14-application-details.png +0 -0
  21. data/docs/16-initial-menu.png +0 -0
  22. data/docs/17-inputting-the-email-address.png +0 -0
  23. data/docs/18-choose-password.png +0 -0
  24. data/docs/19-supply-client-info.png +0 -0
  25. data/docs/20-choose-gmail-account.png +0 -0
  26. data/docs/21-accept-warnings.png +0 -0
  27. data/docs/22-grant-access.png +0 -0
  28. data/docs/24-confirm-choices.png +0 -0
  29. data/docs/25-success-code.png +0 -0
  30. data/docs/26-type-code-into-imap-backup.png +0 -0
  31. data/docs/27-success.png +0 -0
  32. data/docs/setting-up-gmail.md +166 -0
  33. data/imap-backup.gemspec +3 -9
  34. data/lib/email/mboxrd/message.rb +4 -3
  35. data/lib/email/provider.rb +3 -1
  36. data/lib/gmail/authenticator.rb +160 -0
  37. data/lib/google/auth/stores/in_memory_token_store.rb +9 -0
  38. data/lib/imap/backup.rb +2 -1
  39. data/lib/imap/backup/account/connection.rb +59 -34
  40. data/lib/imap/backup/account/folder.rb +10 -1
  41. data/lib/imap/backup/configuration/account.rb +9 -1
  42. data/lib/imap/backup/configuration/gmail_oauth2.rb +82 -0
  43. data/lib/imap/backup/configuration/setup.rb +4 -1
  44. data/lib/imap/backup/serializer/mbox.rb +4 -0
  45. data/lib/imap/backup/serializer/mbox_enumerator.rb +1 -1
  46. data/lib/imap/backup/serializer/mbox_store.rb +20 -4
  47. data/lib/imap/backup/uploader.rb +10 -2
  48. data/lib/imap/backup/version.rb +5 -4
  49. data/spec/features/backup_spec.rb +3 -3
  50. data/spec/features/helper.rb +1 -1
  51. data/spec/features/restore_spec.rb +75 -27
  52. data/spec/features/support/backup_directory.rb +2 -2
  53. data/spec/features/support/email_server.rb +1 -3
  54. data/spec/features/support/shared/message_fixtures.rb +8 -0
  55. data/spec/spec_helper.rb +1 -1
  56. data/spec/support/fixtures.rb +1 -1
  57. data/spec/unit/email/mboxrd/message_spec.rb +2 -8
  58. data/spec/unit/email/provider_spec.rb +2 -2
  59. data/spec/unit/gmail/authenticator_spec.rb +138 -0
  60. data/spec/unit/google/auth/stores/in_memory_token_store_spec.rb +15 -0
  61. data/spec/unit/imap/backup/account/connection_spec.rb +157 -79
  62. data/spec/unit/imap/backup/account/folder_spec.rb +30 -20
  63. data/spec/unit/imap/backup/configuration/account_spec.rb +65 -46
  64. data/spec/unit/imap/backup/configuration/asker_spec.rb +20 -17
  65. data/spec/unit/imap/backup/configuration/connection_tester_spec.rb +6 -10
  66. data/spec/unit/imap/backup/configuration/folder_chooser_spec.rb +16 -10
  67. data/spec/unit/imap/backup/configuration/gmail_oauth2_spec.rb +84 -0
  68. data/spec/unit/imap/backup/configuration/list_spec.rb +6 -3
  69. data/spec/unit/imap/backup/configuration/setup_spec.rb +89 -54
  70. data/spec/unit/imap/backup/configuration/store_spec.rb +18 -16
  71. data/spec/unit/imap/backup/downloader_spec.rb +14 -14
  72. data/spec/unit/imap/backup/serializer/mbox_enumerator_spec.rb +6 -1
  73. data/spec/unit/imap/backup/serializer/mbox_spec.rb +62 -40
  74. data/spec/unit/imap/backup/serializer/mbox_store_spec.rb +94 -35
  75. data/spec/unit/imap/backup/uploader_spec.rb +23 -7
  76. data/spec/unit/imap/backup/utils_spec.rb +10 -9
  77. metadata +68 -9
@@ -7,37 +7,37 @@ describe Imap::Backup::Downloader do
7
7
  instance_double(
8
8
  Imap::Backup::Account::Folder,
9
9
  fetch: message,
10
- name: "folder"
10
+ name: "folder",
11
+ uids: folder_uids
11
12
  )
12
13
  end
13
14
  let(:folder_uids) { %w(111 222 333) }
14
15
  let(:serializer) do
15
- instance_double(Imap::Backup::Serializer::Mbox, save: nil)
16
- end
17
- let(:serializer_uids) { ["222"] }
18
-
19
- before do
20
- allow(folder).to receive(:uids).and_return(folder_uids)
21
- allow(serializer).to receive(:uids).and_return(serializer_uids)
22
- allow(folder).to receive(:fetch).with("333").and_return(nil)
23
- subject.run
16
+ instance_double(Imap::Backup::Serializer::Mbox, save: nil, uids: ["222"])
24
17
  end
25
18
 
26
19
  context "with fetched messages" do
27
- it "are saved" do
28
- expect(serializer).to have_received(:save).with("111", message)
20
+ specify "are saved" do
21
+ expect(serializer).to receive(:save).with("111", message)
22
+
23
+ subject.run
29
24
  end
30
25
  end
31
26
 
32
27
  context "with messages which are already present" do
33
28
  specify "are skipped" do
34
- expect(serializer).to_not have_received(:save).with("222", anything)
29
+ expect(serializer).to_not receive(:save).with("222", anything)
30
+
31
+ subject.run
35
32
  end
36
33
  end
37
34
 
38
35
  context "with failed fetches" do
39
36
  specify "are skipped" do
40
- expect(serializer).to_not have_received(:save).with("333", anything)
37
+ allow(folder).to receive(:fetch).with("333") { nil }
38
+ expect(serializer).to_not receive(:save).with("333", anything)
39
+
40
+ subject.run
41
41
  end
42
42
  end
43
43
  end
@@ -21,11 +21,16 @@ describe Imap::Backup::Serializer::MboxEnumerator do
21
21
 
22
22
  before do
23
23
  allow(File).to receive(:open).and_call_original
24
- allow(File).to receive(:open).with(mbox_pathname).and_yield(mbox_file)
24
+ allow(File).to receive(:open).with(mbox_pathname, "rb").and_yield(mbox_file)
25
25
  allow(mbox_file).to receive(:gets).and_return(*lines)
26
26
  end
27
27
 
28
28
  describe "#each" do
29
+ it "reads files as binary" do
30
+ expect(File).to receive(:open).with(mbox_pathname, "rb")
31
+ subject.each {}
32
+ end
33
+
29
34
  it "yields messages" do
30
35
  expect { |b| subject.each(&b) }.
31
36
  to yield_successive_args(message1.join, message2.join)
@@ -28,8 +28,6 @@ describe Imap::Backup::Serializer::Mbox do
28
28
  end
29
29
 
30
30
  describe "folder path" do
31
- before { subject.uids }
32
-
33
31
  context "when it has multiple elements" do
34
32
  let(:imap_folder) { "folder/path" }
35
33
 
@@ -37,8 +35,10 @@ describe Imap::Backup::Serializer::Mbox do
37
35
  let(:dir_exists) { false }
38
36
 
39
37
  it "is created" do
40
- expect(Imap::Backup::Utils).to have_received(:make_folder).
38
+ expect(Imap::Backup::Utils).to receive(:make_folder).
41
39
  with(base_path, File.dirname(imap_folder), 0o700)
40
+
41
+ subject.uids
42
42
  end
43
43
  end
44
44
  end
@@ -48,57 +48,66 @@ describe Imap::Backup::Serializer::Mbox do
48
48
 
49
49
  it "corrects them" do
50
50
  path = File.expand_path(File.join(base_path, File.dirname(imap_folder)))
51
- expect(FileUtils).to have_received(:chmod).with(0o700, path)
51
+ expect(FileUtils).to receive(:chmod).with(0o700, path)
52
+
53
+ subject.uids
52
54
  end
53
55
  end
54
56
 
55
57
  context "when permissons are correct" do
56
58
  it "does nothing" do
57
- expect(FileUtils).to_not have_received(:chmod)
59
+ expect(FileUtils).to_not receive(:chmod)
60
+
61
+ subject.uids
58
62
  end
59
63
  end
60
64
 
61
65
  context "when it exists" do
62
66
  it "is not created" do
63
- expect(Imap::Backup::Utils).to_not have_received(:make_folder).
67
+ expect(Imap::Backup::Utils).to_not receive(:make_folder).
64
68
  with(base_path, File.dirname(imap_folder), 0o700)
69
+
70
+ subject.uids
65
71
  end
66
72
  end
67
73
  end
68
74
 
69
75
  describe "#apply_uid_validity" do
70
- let(:result) { subject.apply_uid_validity("aaa") }
71
-
72
76
  context "when the existing uid validity is unset" do
73
- let!(:result) { super() }
74
-
75
77
  it "sets uid validity" do
76
- expect(store).to have_received(:uid_validity=).with("aaa")
78
+ expect(store).to receive(:uid_validity=).with("aaa")
79
+
80
+ subject.apply_uid_validity("aaa")
77
81
  end
78
82
 
79
83
  it "does not rename the store" do
80
- expect(store).to_not have_received(:rename)
84
+ expect(store).to_not receive(:rename)
85
+
86
+ subject.apply_uid_validity("aaa")
81
87
  end
82
88
 
83
89
  it "returns nil" do
84
- expect(result).to be_nil
90
+ expect(subject.apply_uid_validity("aaa")).to be_nil
85
91
  end
86
92
  end
87
93
 
88
94
  context "when the uid validity is unchanged" do
89
- let!(:result) { super() }
90
95
  let(:existing_uid_validity) { "aaa" }
91
96
 
92
97
  it "does not set uid validity" do
93
- expect(store).to_not have_received(:uid_validity=)
98
+ expect(store).to_not receive(:uid_validity=)
99
+
100
+ subject.apply_uid_validity("aaa")
94
101
  end
95
102
 
96
103
  it "does not rename the store" do
97
- expect(store).to_not have_received(:rename)
104
+ expect(store).to_not receive(:rename)
105
+
106
+ subject.apply_uid_validity("aaa")
98
107
  end
99
108
 
100
109
  it "returns nil" do
101
- expect(result).to be_nil
110
+ expect(subject.apply_uid_validity("aaa")).to be_nil
102
111
  end
103
112
  end
104
113
 
@@ -113,20 +122,23 @@ describe Imap::Backup::Serializer::Mbox do
113
122
  allow(Imap::Backup::Serializer::MboxStore).
114
123
  to receive(:new).with(anything, /bbb/) { existing_store }
115
124
  allow(existing_store).to receive(:exist?).and_return(exists, false)
116
- result
117
125
  end
118
126
 
119
127
  it "sets uid validity" do
120
- expect(store).to have_received(:uid_validity=).with("aaa")
128
+ expect(store).to receive(:uid_validity=).with("aaa")
129
+
130
+ subject.apply_uid_validity("aaa")
121
131
  end
122
132
 
123
133
  context "when adding the uid validity does not cause a name clash" do
124
134
  it "renames the store, adding the existing uid validity" do
125
- expect(store).to have_received(:rename).with("folder.bbb")
135
+ expect(store).to receive(:rename).with("folder.bbb")
136
+
137
+ subject.apply_uid_validity("aaa")
126
138
  end
127
139
 
128
140
  it "returns the new name" do
129
- expect(result).to eq("folder.bbb")
141
+ expect(subject.apply_uid_validity("aaa")).to eq("folder.bbb")
130
142
  end
131
143
  end
132
144
 
@@ -134,67 +146,77 @@ describe Imap::Backup::Serializer::Mbox do
134
146
  let(:exists) { true }
135
147
 
136
148
  it "renames the store, adding the existing uid validity and a digit" do
137
- expect(store).to have_received(:rename).with("folder.bbb.1")
149
+ expect(store).to receive(:rename).with("folder.bbb.1")
150
+
151
+ subject.apply_uid_validity("aaa")
138
152
  end
139
153
 
140
154
  it "returns the new name" do
141
- expect(result).to eq("folder.bbb.1")
155
+ expect(subject.apply_uid_validity("aaa")).to eq("folder.bbb.1")
142
156
  end
143
157
  end
144
158
  end
145
159
  end
146
160
 
147
161
  describe "#force_uid_validity" do
148
- before { subject.force_uid_validity("66") }
149
-
150
162
  it "sets the uid_validity" do
151
- expect(store).to have_received(:uid_validity=).with("66")
163
+ expect(store).to receive(:uid_validity=).with("66")
164
+
165
+ subject.force_uid_validity("66")
152
166
  end
153
167
  end
154
168
 
155
169
  describe "#uids" do
156
170
  it "calls the store" do
157
- subject.uids
171
+ expect(store).to receive(:uids)
158
172
 
159
- expect(store).to have_received(:uids)
173
+ subject.uids
160
174
  end
161
175
  end
162
176
 
163
177
  describe "#load" do
164
- let(:result) { subject.load("66") }
165
-
166
178
  before { allow(store).to receive(:load).with("66") { "xxx" } }
167
179
 
168
180
  it "returns the value loaded by the store" do
169
- expect(result).to eq("xxx")
181
+ expect(subject.load("66")).to eq("xxx")
170
182
  end
171
183
  end
172
184
 
173
- describe "#save" do
174
- before { subject.save("foo", "bar") }
185
+ describe "#each_message" do
186
+ it "calls the store" do
187
+ expect(store).to receive(:each_message).with([1])
188
+
189
+ subject.each_message([1])
190
+ end
191
+ end
175
192
 
193
+ describe "#save" do
176
194
  it "calls the store" do
177
- expect(store).to have_received(:add).with("foo", "bar")
195
+ expect(store).to receive(:add).with("foo", "bar")
196
+
197
+ subject.save("foo", "bar")
178
198
  end
179
199
  end
180
200
 
181
201
  describe "#rename" do
182
- before { subject.rename("foo") }
183
-
184
202
  it "calls the store" do
185
- expect(store).to have_received(:rename).with("foo")
203
+ expect(store).to receive(:rename).with("foo")
204
+
205
+ subject.rename("foo")
186
206
  end
187
207
 
188
208
  it "updates the folder name" do
209
+ subject.rename("foo")
210
+
189
211
  expect(subject.folder).to eq("foo")
190
212
  end
191
213
  end
192
214
 
193
215
  describe "#update_uid" do
194
- before { subject.update_uid("foo", "bar") }
195
-
196
216
  it "calls the store" do
197
- expect(store).to have_received(:update_uid).with("foo", "bar")
217
+ expect(store).to receive(:update_uid).with("foo", "bar")
218
+
219
+ subject.update_uid("foo", "bar")
198
220
  end
199
221
  end
200
222
  end
@@ -4,10 +4,10 @@ describe Imap::Backup::Serializer::MboxStore do
4
4
  let(:base_path) { "/base/path" }
5
5
  let(:folder) { "the/folder" }
6
6
  let(:folder_path) { File.join(base_path, folder) }
7
- let(:imap_pathname) { folder_path + ".imap" }
7
+ let(:imap_pathname) { "#{folder_path}.imap" }
8
8
  let(:imap_exists) { true }
9
9
  let(:imap_file) { instance_double(File, write: nil, close: nil) }
10
- let(:mbox_pathname) { folder_path + ".mbox" }
10
+ let(:mbox_pathname) { "#{folder_path}.mbox" }
11
11
  let(:mbox_exists) { true }
12
12
  let(:mbox_file) { instance_double(File, write: nil, close: nil) }
13
13
  let(:uids) { [3, 2, 1] }
@@ -51,14 +51,16 @@ describe Imap::Backup::Serializer::MboxStore do
51
51
  }.to_json
52
52
  end
53
53
 
54
- before { subject.uid_validity = new_uid_validity }
55
-
56
54
  it "sets uid_validity" do
55
+ subject.uid_validity = new_uid_validity
56
+
57
57
  expect(subject.uid_validity).to eq(new_uid_validity)
58
58
  end
59
59
 
60
60
  it "writes the imap file" do
61
- expect(imap_file).to have_received(:write).with(updated_imap_content)
61
+ expect(imap_file).to receive(:write).with(updated_imap_content)
62
+
63
+ subject.uid_validity = new_uid_validity
62
64
  end
63
65
  end
64
66
 
@@ -80,22 +82,26 @@ describe Imap::Backup::Serializer::MboxStore do
80
82
  allow(JSON).to receive(:parse).and_raise(JSON::ParserError)
81
83
  end
82
84
 
83
- let!(:result) { subject.uids }
84
-
85
85
  it "returns an empty Array" do
86
- expect(result).to eq([])
86
+ expect(subject.uids).to eq([])
87
87
  end
88
88
 
89
89
  it "deletes the imap file" do
90
- expect(File).to have_received(:unlink).with(imap_pathname)
90
+ expect(File).to receive(:unlink).with(imap_pathname)
91
+
92
+ subject.uids
91
93
  end
92
94
 
93
95
  it "deletes the mbox file" do
94
- expect(File).to have_received(:unlink).with(mbox_pathname)
96
+ expect(File).to receive(:unlink).with(mbox_pathname)
97
+
98
+ subject.uids
95
99
  end
96
100
 
97
101
  it "writes a blank mbox file" do
98
- expect(mbox_file).to have_received(:write).with("")
102
+ expect(mbox_file).to receive(:write).with("")
103
+
104
+ subject.uids
99
105
  end
100
106
  end
101
107
 
@@ -126,28 +132,29 @@ describe Imap::Backup::Serializer::MboxStore do
126
132
  end
127
133
 
128
134
  before do
129
- allow(Email::Mboxrd::Message).to receive(:new).and_return(message)
135
+ allow(Email::Mboxrd::Message).to receive(:new) { message }
130
136
  allow(File).to receive(:open).with(mbox_pathname, "ab") { mbox_file }
131
137
  end
132
138
 
133
139
  it "saves the message to the mbox" do
134
- subject.add(message_uid, "The\nemail\n")
140
+ expect(mbox_file).to receive(:write).with(mbox_formatted_message)
135
141
 
136
- expect(mbox_file).to have_received(:write).with(mbox_formatted_message)
142
+ subject.add(message_uid, "The\nemail\n")
137
143
  end
138
144
 
139
145
  it "saves the uid to the imap file" do
140
- subject.add(message_uid, "The\nemail\n")
146
+ expect(imap_file).to receive(:write).with(updated_imap_content)
141
147
 
142
- expect(imap_file).to have_received(:write).with(updated_imap_content)
148
+ subject.add(message_uid, "The\nemail\n")
143
149
  end
144
150
 
145
151
  context "when the message is already downloaded" do
146
152
  let(:uids) { [999] }
147
153
 
148
154
  it "skips the message" do
155
+ expect(mbox_file).to_not receive(:write)
156
+
149
157
  subject.add(message_uid, "The\nemail\n")
150
- expect(mbox_file).to_not have_received(:write)
151
158
  end
152
159
  end
153
160
 
@@ -157,8 +164,9 @@ describe Imap::Backup::Serializer::MboxStore do
157
164
  end
158
165
 
159
166
  it "skips the message" do
167
+ expect(mbox_file).to_not receive(:write)
168
+
160
169
  subject.add(message_uid, "The\nemail\n")
161
- expect(mbox_file).to_not have_received(:write)
162
170
  end
163
171
 
164
172
  it "does not fail" do
@@ -171,7 +179,6 @@ describe Imap::Backup::Serializer::MboxStore do
171
179
 
172
180
  describe "#load" do
173
181
  let(:uid) { "1" }
174
- let(:result) { subject.load(uid) }
175
182
  let(:enumerator) do
176
183
  instance_double(Imap::Backup::Serializer::MboxEnumerator)
177
184
  end
@@ -189,14 +196,55 @@ describe Imap::Backup::Serializer::MboxStore do
189
196
  end
190
197
 
191
198
  it "returns the message" do
192
- expect(result.supplied_body).to eq("ciao")
199
+ expect(subject.load(uid).supplied_body).to eq("ciao")
193
200
  end
194
201
 
195
202
  context "when the UID is unknown" do
196
203
  let(:uid) { "99" }
197
204
 
198
205
  it "returns nil" do
199
- expect(result).to be_nil
206
+ expect(subject.load(uid)).to be_nil
207
+ end
208
+ end
209
+ end
210
+
211
+ describe "#each_message" do
212
+ let(:enumerator) do
213
+ instance_double(Imap::Backup::Serializer::MboxEnumerator)
214
+ end
215
+ let(:enumeration) { instance_double(Enumerator) }
216
+
217
+ before do
218
+ allow(Imap::Backup::Serializer::MboxEnumerator).
219
+ to receive(:new) { enumerator }
220
+ allow(enumerator).to receive(:each) { enumeration }
221
+ allow(enumeration).
222
+ to receive(:with_index).
223
+ and_yield("", 0).
224
+ and_yield("", 1).
225
+ and_yield("ciao", 2)
226
+ end
227
+
228
+ it "yields messages" do
229
+ expect { |b| subject.each_message([1], &b) }.
230
+ to yield_successive_args([1, instance_of(Email::Mboxrd::Message)])
231
+ end
232
+
233
+ it "yields the requested message uid" do
234
+ subject.each_message([1]) do |uid, _message|
235
+ expect(uid).to eq(1)
236
+ end
237
+ end
238
+
239
+ it "yields the requested message" do
240
+ subject.each_message([1]) do |_uid, message|
241
+ expect(message.supplied_body).to eq("ciao")
242
+ end
243
+ end
244
+
245
+ context "without a block" do
246
+ it "returns an Enumerator" do
247
+ expect(subject.each_message([1])).to be_a(Enumerator)
200
248
  end
201
249
  end
202
250
  end
@@ -211,59 +259,70 @@ describe Imap::Backup::Serializer::MboxStore do
211
259
  }.to_json
212
260
  end
213
261
 
214
- before { subject.update_uid(old_uid, "999") }
215
-
216
262
  it "updates the stored UID" do
217
- expect(imap_file).to have_received(:write).with(updated_imap_content)
263
+ expect(imap_file).to receive(:write).with(updated_imap_content)
264
+
265
+ subject.update_uid(old_uid, "999")
218
266
  end
219
267
 
220
268
  context "when the UID is unknown" do
221
269
  let(:old_uid) { "42" }
222
270
 
223
271
  it "does nothing" do
224
- expect(imap_file).to_not have_received(:write)
272
+ expect(imap_file).to_not receive(:write)
273
+
274
+ subject.update_uid(old_uid, "999")
225
275
  end
226
276
  end
227
277
  end
228
278
 
229
279
  describe "#reset" do
230
- before { subject.reset }
231
-
232
280
  it "deletes the imap file" do
233
- expect(File).to have_received(:unlink).with(imap_pathname)
281
+ expect(File).to receive(:unlink).with(imap_pathname)
282
+
283
+ subject.reset
234
284
  end
235
285
 
236
286
  it "deletes the mbox file" do
237
- expect(File).to have_received(:unlink).with(mbox_pathname)
287
+ expect(File).to receive(:unlink).with(mbox_pathname)
288
+
289
+ subject.reset
238
290
  end
239
291
 
240
292
  it "writes a blank mbox file" do
241
- expect(mbox_file).to have_received(:write).with("")
293
+ expect(mbox_file).to receive(:write).with("")
294
+
295
+ subject.reset
242
296
  end
243
297
  end
244
298
 
245
299
  describe "#rename" do
246
300
  let(:new_name) { "new_name" }
247
301
  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" }
302
+ let(:new_imap_name) { "#{new_folder_path}.imap" }
303
+ let(:new_mbox_name) { "#{new_folder_path}.mbox" }
250
304
 
251
305
  before do
252
306
  allow(File).to receive(:rename).and_call_original
253
307
  allow(File).to receive(:rename).with(imap_pathname, new_imap_name)
254
308
  allow(File).to receive(:rename).with(mbox_pathname, new_mbox_name)
255
- subject.rename(new_name)
256
309
  end
257
310
 
258
311
  it "renames the imap file" do
259
- expect(File).to have_received(:rename).with(imap_pathname, new_imap_name)
312
+ expect(File).to receive(:rename).with(imap_pathname, new_imap_name)
313
+
314
+ subject.rename(new_name)
260
315
  end
261
316
 
262
317
  it "renames the mbox file" do
263
- expect(File).to have_received(:rename).with(mbox_pathname, new_mbox_name)
318
+ expect(File).to receive(:rename).with(mbox_pathname, new_mbox_name)
319
+
320
+ subject.rename(new_name)
264
321
  end
265
322
 
266
323
  it "updates the folder name" do
324
+ subject.rename(new_name)
325
+
267
326
  expect(subject.folder).to eq(new_name)
268
327
  end
269
328
  end