48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| require 'spec_helper'
 | |
| 
 | |
| describe Gitlab::LoopHelpers do
 | |
|   let(:class_instance) { (Class.new { include ::Gitlab::LoopHelpers }).new }
 | |
| 
 | |
|   describe '#loop_until' do
 | |
|     subject do
 | |
|       class_instance.loop_until(**params) { true }
 | |
|     end
 | |
| 
 | |
|     context 'when limit is not given' do
 | |
|       let(:params) { { limit: nil } }
 | |
| 
 | |
|       it 'raises an error' do
 | |
|         expect { subject }.to raise_error(ArgumentError)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     context 'when timeout is specified' do
 | |
|       let(:params) { { timeout: 1.second } }
 | |
| 
 | |
|       it "returns false after it's expired" do
 | |
|         is_expected.to be_falsy
 | |
|       end
 | |
| 
 | |
|       it 'executes the block at least once' do
 | |
|         expect { |b| class_instance.loop_until(**params, &b) }
 | |
|           .to yield_control.at_least(1)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     context 'when iteration limit is specified' do
 | |
|       let(:params) { { limit: 1 } }
 | |
| 
 | |
|       it "returns false after it's expired" do
 | |
|         is_expected.to be_falsy
 | |
|       end
 | |
| 
 | |
|       it 'executes the block once' do
 | |
|         expect { |b| class_instance.loop_until(**params, &b) }
 | |
|           .to yield_control.once
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |