summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/looping_batcher_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/looping_batcher_spec.rb')
-rw-r--r--spec/lib/gitlab/looping_batcher_spec.rb71
1 files changed, 71 insertions, 0 deletions
diff --git a/spec/lib/gitlab/looping_batcher_spec.rb b/spec/lib/gitlab/looping_batcher_spec.rb
new file mode 100644
index 00000000000..b03e969c1e7
--- /dev/null
+++ b/spec/lib/gitlab/looping_batcher_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::LoopingBatcher, :use_clean_rails_memory_store_caching do
+ describe '#next_range!' do
+ let(:model_class) { LfsObject }
+ let(:key) { 'looping_batcher_spec' }
+ let(:batch_size) { 2 }
+
+ subject { described_class.new(model_class, key: key, batch_size: batch_size).next_range! }
+
+ context 'when there are no records' do
+ it { is_expected.to be_nil }
+ end
+
+ context 'when there are records' do
+ let!(:records) { create_list(model_class.underscore, 3) }
+
+ context 'when it has never been called before' do
+ it { is_expected.to be_a Range }
+
+ it 'starts from the beginning' do
+ expect(subject.first).to eq(1)
+ end
+
+ it 'ends at a full batch' do
+ expect(subject.last).to eq(records.second.id)
+ end
+
+ context 'when the batch size is greater than the number of records' do
+ let(:batch_size) { 5 }
+
+ it 'ends at the last ID' do
+ expect(subject.last).to eq(records.last.id)
+ end
+ end
+ end
+
+ context 'when it was called before' do
+ context 'when the previous batch included the end of the table' do
+ before do
+ described_class.new(model_class, key: key, batch_size: model_class.count).next_range!
+ end
+
+ it 'starts from the beginning' do
+ expect(subject).to eq(1..records.second.id)
+ end
+ end
+
+ context 'when the previous batch did not include the end of the table' do
+ before do
+ described_class.new(model_class, key: key, batch_size: model_class.count - 1).next_range!
+ end
+
+ it 'starts after the previous batch' do
+ expect(subject).to eq(records.last.id..records.last.id)
+ end
+ end
+
+ context 'if cache is cleared' do
+ it 'starts from the beginning' do
+ Rails.cache.clear
+
+ expect(subject).to eq(1..records.second.id)
+ end
+ end
+ end
+ end
+ end
+end