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
|