diff options
Diffstat (limited to 'spec/experiments/strategy/round_robin_spec.rb')
-rw-r--r-- | spec/experiments/strategy/round_robin_spec.rb | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/spec/experiments/strategy/round_robin_spec.rb b/spec/experiments/strategy/round_robin_spec.rb new file mode 100644 index 00000000000..f837a4701b2 --- /dev/null +++ b/spec/experiments/strategy/round_robin_spec.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Strategy::RoundRobin, :clean_gitlab_redis_shared_state do + subject(:round_robin) { described_class.new('_key_', %i[variant1 variant2]) } + + describe "execute" do + context "when there are 2 variants" do + it "proves out round robin in selection", :aggregate_failures do + expect(round_robin.execute).to eq :variant2 + expect(round_robin.execute).to eq :variant1 + expect(round_robin.execute).to eq :variant2 + end + end + + context "when there are more than 2 variants" do + subject(:round_robin) { described_class.new('_key_', %i[variant1 variant2 variant3]) } + + it "proves out round robin in selection", :aggregate_failures do + expect(round_robin.execute).to eq :variant2 + expect(round_robin.execute).to eq :variant3 + expect(round_robin.execute).to eq :variant1 + + expect(round_robin.execute).to eq :variant2 + expect(round_robin.execute).to eq :variant3 + expect(round_robin.execute).to eq :variant1 + end + end + + context "when writing to cache fails" do + subject(:round_robin) { described_class.new('_key_', []) } + + it "raises an error and logs" do + allow(Gitlab::Redis::SharedState).to receive(:with).and_raise(Strategy::RoundRobin::CacheError) + expect(Gitlab::AppLogger).to receive(:warn) + + expect { round_robin.execute }.to raise_error(Strategy::RoundRobin::CacheError) + end + end + end + + describe "#counter_expires_in" do + it 'displays the expiration time in seconds' do + round_robin.execute + + expect(round_robin.counter_expires_in).to be_between(0, described_class::COUNTER_EXPIRE_TIME) + end + end + + describe '#value' do + it 'get the count' do + expect(round_robin.counter_value).to eq(0) + + round_robin.execute + + expect(round_robin.counter_value).to eq(1) + end + end + + describe '#reset!' do + it 'resets the count down to zero' do + 3.times { round_robin.execute } + + expect { round_robin.reset! }.to change { round_robin.counter_value }.from(3).to(0) + end + end +end |