44 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| require 'spec_helper'
 | |
| 
 | |
| RSpec.describe Gitlab::Database::MultiThreadedMigration do
 | |
|   let(:migration) do
 | |
|     Class.new { include Gitlab::Database::MultiThreadedMigration }.new
 | |
|   end
 | |
| 
 | |
|   describe '#connection' do
 | |
|     after do
 | |
|       Thread.current[described_class::MULTI_THREAD_AR_CONNECTION] = nil
 | |
|     end
 | |
| 
 | |
|     it 'returns the thread-local connection if present' do
 | |
|       Thread.current[described_class::MULTI_THREAD_AR_CONNECTION] = 10
 | |
| 
 | |
|       expect(migration.connection).to eq(10)
 | |
|     end
 | |
| 
 | |
|     it 'returns the global connection if no thread-local connection was set' do
 | |
|       expect(migration.connection).to eq(ActiveRecord::Base.connection)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe '#with_multiple_threads' do
 | |
|     it 'starts multiple threads and yields the supplied block in every thread' do
 | |
|       output = Queue.new
 | |
| 
 | |
|       migration.with_multiple_threads(2) do
 | |
|         output << migration.connection.execute('SELECT 1')
 | |
|       end
 | |
| 
 | |
|       expect(output.size).to eq(2)
 | |
|     end
 | |
| 
 | |
|     it 'joins the threads when the join parameter is set' do
 | |
|       expect_any_instance_of(Thread).to receive(:join).and_call_original
 | |
| 
 | |
|       migration.with_multiple_threads(1) { }
 | |
|     end
 | |
|   end
 | |
| end
 |