Skip to content

Commit 0faa4f8

Browse files
committed
Handle multi fetch failure gracefully
1 parent 39cbf3b commit 0faa4f8

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

lib/imap/backup/flag_refresher.rb

+7
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ def run
2828

2929
def refresh_block(uids)
3030
uids_and_flags = folder.fetch_multi(uids, ["FLAGS"])
31+
if !uids_and_flags
32+
Logger.logger.debug(
33+
"[#{folder.name}] failed to fetch flags for #{uids} - " \
34+
"cannot refresh flags"
35+
)
36+
return
37+
end
3138
uids_and_flags.each do |uid_and_flags|
3239
uid = uid_and_flags[:uid]
3340
flags = uid_and_flags[:flags]

spec/unit/flag_refresher_spec.rb

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
require "imap/backup/account/folder"
2+
require "imap/backup/flag_refresher"
3+
require "imap/backup/serializer"
4+
5+
module Imap::Backup
6+
RSpec.describe FlagRefresher do
7+
subject { described_class.new(folder, serializer) }
8+
9+
let(:serializer) { instance_double(Serializer, uids: [1, 2]) }
10+
let(:folder) { instance_double(Account::Folder, uids: [2], name: "my_folder") }
11+
12+
it "refreshes the flags" do
13+
response = [{uid: 1, flags: [:Draft]}, {uid: 2, flags: [:Seen]}]
14+
allow(folder).to receive(:fetch_multi).with([1, 2], ["FLAGS"]) { response }
15+
16+
expect(serializer).to receive(:update).with(1, flags: [:Draft])
17+
expect(serializer).to receive(:update).with(2, flags: [:Seen])
18+
19+
subject.run
20+
end
21+
22+
context "when the fetch fails" do
23+
it "logs a warning" do
24+
allow(folder).to receive(:fetch_multi).with([1, 2], ["FLAGS"]).and_return(nil)
25+
expect(Logger.logger).
26+
to receive(:debug).
27+
with("[#{folder.name}] failed to fetch flags for [1, 2] - cannot refresh flags")
28+
29+
subject.run
30+
end
31+
end
32+
end
33+
end

0 commit comments

Comments
 (0)