Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'qa/spec/support/repeater_spec.rb')
-rw-r--r--qa/spec/support/repeater_spec.rb302
1 files changed, 76 insertions, 226 deletions
diff --git a/qa/spec/support/repeater_spec.rb b/qa/spec/support/repeater_spec.rb
index 96e780fc9bd..9810456321e 100644
--- a/qa/spec/support/repeater_spec.rb
+++ b/qa/spec/support/repeater_spec.rb
@@ -1,17 +1,23 @@
# frozen_string_literal: true
require 'active_support/core_ext/integer/time'
+require 'active_support/testing/time_helpers'
RSpec.describe QA::Support::Repeater do
+ include ActiveSupport::Testing::TimeHelpers
+
subject do
Module.new do
extend QA::Support::Repeater
end
end
- let(:time_start) { Time.now }
let(:return_value) { "test passed" }
+ after do
+ travel_back
+ end
+
describe '.repeat_until' do
context 'when raise_on_failure is not provided (default: true)' do
context 'when retry_on_exception is not provided (default: false)' do
@@ -19,12 +25,7 @@ RSpec.describe QA::Support::Repeater do
context 'when max duration is reached' do
it 'raises an exception with default message' do
expect do
- Timecop.freeze do
- subject.repeat_until(max_duration: 1) do
- Timecop.travel(2)
- false
- end
- end
+ subject.repeat_until(max_duration: 1) { travel(2.seconds) && false }
end.to raise_error(QA::Support::Repeater::WaitExceededError, "Wait failed after 1 second")
end
@@ -32,12 +33,7 @@ RSpec.describe QA::Support::Repeater do
message = 'Some custom action'
expect do
- Timecop.freeze do
- subject.repeat_until(max_duration: 1, message: message) do
- Timecop.travel(2)
- false
- end
- end
+ subject.repeat_until(max_duration: 1, message: message) { travel(2.seconds) && false }
end.to raise_error(QA::Support::Repeater::WaitExceededError, "#{message} failed after 1 second")
end
@@ -45,16 +41,14 @@ RSpec.describe QA::Support::Repeater do
loop_counter = 0
expect(
- Timecop.freeze do
- subject.repeat_until(max_duration: 1) do
- loop_counter += 1
-
- if loop_counter > 3
- Timecop.travel(1)
- return_value
- else
- false
- end
+ subject.repeat_until(max_duration: 1) do
+ loop_counter += 1
+
+ if loop_counter > 3
+ travel(1.second)
+ return_value
+ else
+ false
end
end
).to eq(return_value)
@@ -64,13 +58,7 @@ RSpec.describe QA::Support::Repeater do
context 'when max duration is not reached' do
it 'returns value from block' do
- Timecop.freeze(time_start) do
- expect(
- subject.repeat_until(max_duration: 1) do
- return_value
- end
- ).to eq(return_value)
- end
+ expect(subject.repeat_until(max_duration: 10) { return_value }).to eq(return_value)
end
end
end
@@ -78,41 +66,31 @@ RSpec.describe QA::Support::Repeater do
context 'when max_attempts is provided' do
context 'when max_attempts is reached' do
it 'raises an exception with default message' do
- expect do
- Timecop.freeze do
- subject.repeat_until(max_attempts: 1) do
- false
- end
- end
- end.to raise_error(QA::Support::Repeater::RetriesExceededError, "Retry failed after 1 attempt")
+ expect { subject.repeat_until(max_attempts: 1) { false } }.to raise_error(
+ QA::Support::Repeater::RetriesExceededError, "Retry failed after 1 attempt"
+ )
end
it 'raises an exception with custom message' do
message = 'Some custom action'
- expect do
- Timecop.freeze do
- subject.repeat_until(max_attempts: 1, message: message) do
- false
- end
- end
- end.to raise_error(QA::Support::Repeater::RetriesExceededError, "#{message} failed after 1 attempt")
+ expect { subject.repeat_until(max_attempts: 1, message: message) { false } }.to raise_error(
+ QA::Support::Repeater::RetriesExceededError, "#{message} failed after 1 attempt"
+ )
end
it 'ignores duration' do
loop_counter = 0
expect(
- Timecop.freeze do
- subject.repeat_until(max_attempts: 2) do
- loop_counter += 1
- Timecop.travel(1.year)
-
- if loop_counter > 1
- return_value
- else
- false
- end
+ subject.repeat_until(max_attempts: 2) do
+ loop_counter += 1
+ travel(1.year)
+
+ if loop_counter > 1
+ return_value
+ else
+ false
end
end
).to eq(return_value)
@@ -122,13 +100,7 @@ RSpec.describe QA::Support::Repeater do
context 'when max_attempts is not reached' do
it 'returns value from block' do
- expect(
- Timecop.freeze do
- subject.repeat_until(max_attempts: 1) do
- return_value
- end
- end
- ).to eq(return_value)
+ expect(subject.repeat_until(max_attempts: 1) { return_value }).to eq(return_value)
end
end
end
@@ -136,31 +108,17 @@ RSpec.describe QA::Support::Repeater do
context 'when both max_attempts and max_duration are provided' do
context 'when max_attempts is reached first' do
it 'raises an exception' do
- loop_counter = 0
- expect do
- Timecop.freeze do
- subject.repeat_until(max_attempts: 1, max_duration: 2) do
- loop_counter += 1
- Timecop.travel(time_start + loop_counter)
- false
- end
- end
- end.to raise_error(QA::Support::Repeater::RetriesExceededError, "Retry failed after 1 attempt")
+ expect { subject.repeat_until(max_attempts: 1, max_duration: 2) { false } }.to(
+ raise_error(QA::Support::Repeater::RetriesExceededError, "Retry failed after 1 attempt")
+ )
end
end
context 'when max_duration is reached first' do
it 'raises an exception' do
- loop_counter = 0
- expect do
- Timecop.freeze do
- subject.repeat_until(max_attempts: 2, max_duration: 1) do
- loop_counter += 1
- Timecop.travel(time_start + loop_counter)
- false
- end
- end
- end.to raise_error(QA::Support::Repeater::WaitExceededError, "Wait failed after 1 second")
+ expect { subject.repeat_until(max_attempts: 2, max_duration: 1) { travel(10.seconds) && false } }.to(
+ raise_error(QA::Support::Repeater::WaitExceededError, "Wait failed after 1 second")
+ )
end
end
end
@@ -169,30 +127,26 @@ RSpec.describe QA::Support::Repeater do
context 'when retry_on_exception is true' do
context 'when max duration is reached' do
it 'raises an exception' do
- Timecop.freeze do
- expect do
- subject.repeat_until(max_duration: 1, retry_on_exception: true) do
- Timecop.travel(2)
+ expect do
+ subject.repeat_until(max_duration: 1, retry_on_exception: true) do
+ travel(10.seconds)
- raise "this should be raised"
- end
- end.to raise_error(RuntimeError, "this should be raised")
- end
+ raise "this should be raised"
+ end
+ end.to raise_error(RuntimeError, "this should be raised")
end
it 'does not raise an exception until max_duration is reached' do
loop_counter = 0
- Timecop.freeze(time_start) do
- expect do
- subject.repeat_until(max_duration: 2, retry_on_exception: true) do
- loop_counter += 1
- Timecop.travel(time_start + loop_counter)
+ expect do
+ subject.repeat_until(max_duration: 5, retry_on_exception: true) do
+ loop_counter += 1
+ travel(10.seconds) if loop_counter == 2
- raise "this should be raised"
- end
- end.to raise_error(RuntimeError, "this should be raised")
- end
+ raise "this should be raised"
+ end
+ end.to raise_error(RuntimeError, "this should be raised")
expect(loop_counter).to eq(2)
end
end
@@ -201,53 +155,18 @@ RSpec.describe QA::Support::Repeater do
it 'returns value from block' do
loop_counter = 0
- Timecop.freeze(time_start) do
- expect(
- subject.repeat_until(max_duration: 3, retry_on_exception: true) do
- loop_counter += 1
- Timecop.travel(time_start + loop_counter)
+ expect(
+ subject.repeat_until(max_duration: 3, retry_on_exception: true) do
+ loop_counter += 1
- raise "this should not be raised" if loop_counter == 1
+ raise "this should not be raised" if loop_counter == 1
- return_value
- end
- ).to eq(return_value)
- end
+ return_value
+ end
+ ).to eq(return_value)
expect(loop_counter).to eq(2)
end
end
-
- context 'when both max_attempts and max_duration are provided' do
- context 'when max_attempts is reached first' do
- it 'raises an exception' do
- loop_counter = 0
- expect do
- Timecop.freeze do
- subject.repeat_until(max_attempts: 1, max_duration: 2, retry_on_exception: true) do
- loop_counter += 1
- Timecop.travel(time_start + loop_counter)
- false
- end
- end
- end.to raise_error(QA::Support::Repeater::RetriesExceededError, "Retry failed after 1 attempt")
- end
- end
-
- context 'when max_duration is reached first' do
- it 'raises an exception' do
- loop_counter = 0
- expect do
- Timecop.freeze do
- subject.repeat_until(max_attempts: 2, max_duration: 1, retry_on_exception: true) do
- loop_counter += 1
- Timecop.travel(time_start + loop_counter)
- false
- end
- end
- end.to raise_error(QA::Support::Repeater::WaitExceededError, "Wait failed after 1 second")
- end
- end
- end
end
end
@@ -255,11 +174,9 @@ RSpec.describe QA::Support::Repeater do
context 'when retry_on_exception is not provided (default: false)' do
context 'when max duration is reached' do
def test_wait
- Timecop.freeze do
- subject.repeat_until(max_duration: 1, raise_on_failure: false) do
- Timecop.travel(2)
- return_value
- end
+ subject.repeat_until(max_duration: 1, raise_on_failure: false) do
+ travel(10.seconds)
+ return_value
end
end
@@ -274,23 +191,15 @@ RSpec.describe QA::Support::Repeater do
context 'when max duration is not reached' do
it 'returns the value from the block' do
- Timecop.freeze do
- expect(
- subject.repeat_until(max_duration: 1, raise_on_failure: false) do
- return_value
- end
- ).to eq(return_value)
- end
+ expect(subject.repeat_until(max_duration: 10, raise_on_failure: false) { return_value }).to eq(return_value)
end
it 'raises an exception' do
- Timecop.freeze do
- expect do
- subject.repeat_until(max_duration: 1, raise_on_failure: false) do
- raise "this should be raised"
- end
- end.to raise_error(RuntimeError, "this should be raised")
- end
+ expect do
+ subject.repeat_until(max_duration: 10, raise_on_failure: false) do
+ raise "this should be raised"
+ end
+ end.to raise_error(RuntimeError, "this should be raised")
end
end
@@ -300,12 +209,10 @@ RSpec.describe QA::Support::Repeater do
loop_counter = 0
expect(
- Timecop.freeze do
- subject.repeat_until(max_attempts: max_attempts, max_duration: max_duration, raise_on_failure: false) do
- loop_counter += 1
- Timecop.travel(time_start + loop_counter)
- false
- end
+ subject.repeat_until(max_attempts: max_attempts, max_duration: max_duration, raise_on_failure: false) do
+ loop_counter += 1
+ travel(max_attempts.seconds)
+ false
end
).to eq(false)
expect(loop_counter).to eq(1)
@@ -313,7 +220,7 @@ RSpec.describe QA::Support::Repeater do
end
context 'when max_attempts is reached first' do
- it_behaves_like 'repeat until', max_attempts: 1, max_duration: 2
+ it_behaves_like 'repeat until', max_attempts: 1, max_duration: 10
end
context 'when max_duration is reached first' do
@@ -325,11 +232,9 @@ RSpec.describe QA::Support::Repeater do
context 'when retry_on_exception is true' do
context 'when max duration is reached' do
def test_wait
- Timecop.freeze do
- subject.repeat_until(max_duration: 1, raise_on_failure: false, retry_on_exception: true) do
- Timecop.travel(2)
- return_value
- end
+ subject.repeat_until(max_duration: 1, raise_on_failure: false, retry_on_exception: true) do
+ travel(10.seconds)
+ return_value
end
end
@@ -341,61 +246,6 @@ RSpec.describe QA::Support::Repeater do
expect(test_wait).to eq(return_value)
end
end
-
- context 'when max duration is not reached' do
- before do
- @loop_counter = 0
- end
-
- def test_wait_with_counter
- Timecop.freeze(time_start) do
- subject.repeat_until(max_duration: 3, raise_on_failure: false, retry_on_exception: true) do
- @loop_counter += 1
- Timecop.travel(time_start + @loop_counter)
-
- raise "this should not be raised" if @loop_counter == 1
-
- return_value
- end
- end
- end
-
- it 'does not raise an exception' do
- expect { test_wait_with_counter }.not_to raise_error
- end
-
- it 'returns the value from the block' do
- expect(test_wait_with_counter).to eq(return_value)
- expect(@loop_counter).to eq(2)
- end
- end
-
- context 'when both max_attempts and max_duration are provided' do
- shared_examples 'repeat until' do |max_attempts:, max_duration:|
- it "returns when #{max_attempts < max_duration ? 'max_attempts' : 'max_duration'} is reached" do
- loop_counter = 0
-
- expect(
- Timecop.freeze do
- subject.repeat_until(max_attempts: max_attempts, max_duration: max_duration, raise_on_failure: false, retry_on_exception: true) do
- loop_counter += 1
- Timecop.travel(time_start + loop_counter)
- false
- end
- end
- ).to eq(false)
- expect(loop_counter).to eq(1)
- end
- end
-
- context 'when max_attempts is reached first' do
- it_behaves_like 'repeat until', max_attempts: 1, max_duration: 2
- end
-
- context 'when max_duration is reached first' do
- it_behaves_like 'repeat until', max_attempts: 2, max_duration: 1
- end
- end
end
end