spec/unit/imap/backup/downloader_spec.rb in imap-backup-5.2.0 vs spec/unit/imap/backup/downloader_spec.rb in imap-backup-6.0.0.rc2

- old
+ new

@@ -1,44 +1,96 @@ describe Imap::Backup::Downloader do describe "#run" do - subject { described_class.new(folder, serializer) } + subject { described_class.new(folder, serializer, **options) } let(:body) { "blah" } let(:folder) do instance_double( Imap::Backup::Account::Folder, fetch_multi: [{uid: "111", body: body}], name: "folder", - uids: folder_uids + uids: remote_uids ) end - let(:folder_uids) { %w(111 222 333) } + let(:remote_uids) { %w(111 222 333) } let(:serializer) do - instance_double(Imap::Backup::Serializer::Mbox, save: nil, uids: ["222"]) + instance_double(Imap::Backup::Serializer, append: nil, uids: local_uids) end + let(:local_uids) { ["222"] } + let(:options) { {} } context "with fetched messages" do specify "are saved" do - expect(serializer).to receive(:save).with("111", body) + expect(serializer).to receive(:append).with("111", body) subject.run end end context "with messages which are already present" do specify "are skipped" do - expect(serializer).to_not receive(:save).with("222", anything) + expect(serializer).to_not receive(:append).with("222", anything) subject.run end end context "with failed fetches" do specify "are skipped" do allow(folder).to receive(:fetch_multi) { nil } - expect(serializer).to_not receive(:save) + expect(serializer).to_not receive(:append) subject.run + end + end + + context "when the block size is greater than one" do + let(:remote_uids) { %w(111 999) } + let(:local_uids) { [] } + let(:options) { {multi_fetch_size: 2} } + + context "when the first fetch fails" do + before do + allow(folder).to receive(:fetch_multi).with(["111", "999"]) { nil } + allow(folder).to receive(:fetch_multi).with(["111"]). + and_return([{uid: "111", body: body}]). + and_return([{uid: "999", body: body}]) + + subject.run + end + + it "retries fetching messages singly" do + expect(serializer).to have_received(:append).with("111", body) + expect(serializer).to have_received(:append).with("999", body) + end + end + end + + context "when no body is returned by the fetch" do + let(:remote_uids) { %w(111) } + + before do + allow(folder).to receive(:fetch_multi).with(["111"]) { [{uid: "111", body: nil}] } + + subject.run + end + + it "skips the append" do + expect(serializer).to_not have_received(:append) + end + end + + context "when the UID is not returned by the fetch" do + let(:remote_uids) { %w(111) } + + before do + allow(folder).to receive(:fetch_multi).with(["111"]) { [{uid: nil, body: body}] } + + subject.run + end + + it "skips the append" do + expect(serializer).to_not have_received(:append) end end end end