128 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|  | RSpec.shared_examples 'mongo connector' do |options| | ||
|  |   model_name = options.fetch(:model_name) | ||
|  |   factory_name = options[:factory_name] || model_name | ||
|  |   commands = options.fetch(:only) | ||
|  | 
 | ||
|  |   if commands.include?(:insert) | ||
|  |     insert_method_name = "#{model_name}_insert" | ||
|  | 
 | ||
|  |     describe "##{insert_method_name}" do | ||
|  |       let(:model) { build(factory_name) } | ||
|  |       subject { @connector.send(insert_method_name, model) } | ||
|  | 
 | ||
|  |       before { allow(model).to receive(:validate!).and_return(true) } | ||
|  |       after { @tester_connector.cleanup } | ||
|  | 
 | ||
|  |       it 'inserts new record' do | ||
|  |         expect {subject}.to change {@tester_connector.list.size}.from(0).to(1) | ||
|  |       end | ||
|  | 
 | ||
|  |       it 'validates inserted record' do | ||
|  |         expect(model).to receive(:validate!) | ||
|  |         subject | ||
|  |       end | ||
|  | 
 | ||
|  |       it "doesn't insert nonvalid records" do | ||
|  |         allow(model).to receive(:validate!) { raise InvalidRecord.new('') } | ||
|  |         expect {subject}.to raise_error(InvalidRecord) | ||
|  |       end | ||
|  | 
 | ||
|  |       it 'sets created_at of record' do | ||
|  |         expect(model.created_at).to be nil | ||
|  |         subject | ||
|  |         expect(@tester_connector.list.first['created_at']).not_to be nil | ||
|  |       end | ||
|  | 
 | ||
|  |       it 'raises error if record with such id already exists' do | ||
|  |         @tester_connector.create(id: model.id) | ||
|  |         expect {subject}.to raise_error(InvalidRecord) | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   if commands.include?(:list) | ||
|  |     list_method_name = "#{model_name.to_s.pluralize}" | ||
|  | 
 | ||
|  |     describe "##{list_method_name}" do | ||
|  |       subject { @connector.send(list_method_name) } | ||
|  | 
 | ||
|  |       it 'should be empty if collection is empty' do | ||
|  |         expect(subject).to eq [] | ||
|  |       end | ||
|  | 
 | ||
|  |       it "returns array of #{model_name.to_s.pluralize} if collection isn't empty" do | ||
|  |         @tester_connector.create_list(2) do | ||
|  |           expect(subject).to be_an_array_of(model_class).and have_size(2) | ||
|  |         end | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   if commands.include?(:show) | ||
|  |     show_method_name = model_name | ||
|  | 
 | ||
|  |     describe "##{show_method_name}" do | ||
|  |       subject { @connector.send(show_method_name, 'foo') } | ||
|  | 
 | ||
|  |       it 'raises RecordNotFound when there is no such record' do | ||
|  |         expect { subject }.to raise_error(RecordNotFound) | ||
|  |       end | ||
|  | 
 | ||
|  |       it 'returns record if was found' do | ||
|  |         @tester_connector.create(build(factory_name, id: 'foo').to_mongo_hash) do | ||
|  |           expect(subject).to be_an_instance_of(model_class) | ||
|  |         end | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   if commands.include?(:update) | ||
|  |     update_method_name = "#{model_name}_update" | ||
|  |     field_to_update = options.fetch(:field_to_update).to_s | ||
|  | 
 | ||
|  |     describe "##{update_method_name}" do | ||
|  |       let(:model) { build(model_name, field_to_update => 'new_value') } | ||
|  |       let(:insert_model_to_update) { @tester_connector.create(attributes_for(factory_name)) } | ||
|  |       subject { @connector.send(update_method_name, model) } | ||
|  |       before { allow(model).to receive(:validate!).and_return(true) } | ||
|  |       after { @tester_connector.cleanup } | ||
|  | 
 | ||
|  |       it 'validates updated record' do | ||
|  |         insert_model_to_update | ||
|  |         expect(model).to receive(:validate!) | ||
|  |         subject | ||
|  |       end | ||
|  | 
 | ||
|  |       it 'updates record' do | ||
|  |         insert_model_to_update | ||
|  |         subject | ||
|  |         updated_value = @tester_connector.list.first[field_to_update] | ||
|  |         expect(updated_value).to eq 'new_value' | ||
|  |       end | ||
|  | 
 | ||
|  |       it 'raises RecordNotFound if there is no such record' do | ||
|  |         expect{ subject }.to raise_error(RecordNotFound) | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   if commands.include?(:delete) | ||
|  |     delete_method_name = "#{model_name}_delete" | ||
|  |     describe "##{delete_method_name}" do | ||
|  |       let(:model) { build(factory_name) } | ||
|  |       let(:insert_model_to_delete) { @tester_connector.create(model.to_mongo_hash) } | ||
|  |       subject { @connector.send(delete_method_name, model.id) } | ||
|  | 
 | ||
|  |       it 'deletes record' do | ||
|  |         insert_model_to_delete | ||
|  |         expect {subject}.to change {@tester_connector.list.empty?}.to(true) | ||
|  |         @tester_connector.cleanup | ||
|  |       end | ||
|  | 
 | ||
|  |       it 'raises RecordNotFound if there is no such record' do | ||
|  |         expect { subject }.to raise_error(RecordNotFound) | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | end |