Skip to content

RUBY-2706 Test find related options #2789

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Oct 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/mongo/collection.rb
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,9 @@ def capped?
# inserted or updated documents where the clustered index key value
# matches an existing value in the index.
# - *:name* -- Optional. A name that uniquely identifies the clustered index.
# @option opts [ Hash ] :collation The collation to use.
# @option opts [ Hash ] :collation The collation to use when creating the
# collection. This option will not be sent to the server when calling
# collection methods.
# @option opts [ Hash ] :encrypted_fields Hash describing encrypted fields
# for queryable encryption.
# @option opts [ Integer ] :expire_after Number indicating
Expand Down
1 change: 1 addition & 0 deletions lib/mongo/collection/view/iterable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ def initial_query_op(session)
let: options[:let],
limit: limit,
allow_disk_use: options[:allow_disk_use],
allow_partial_results: options[:allow_partial_results],
read: read,
read_concern: options[:read_concern] || read_concern,
batch_size: batch_size,
Expand Down
190 changes: 190 additions & 0 deletions spec/integration/find_options_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
# frozen_string_literal: true

require 'spec_helper'

describe 'Find operation options' do
require_mri
require_no_auth
min_server_fcv '4.4'

let(:subscriber) { Mrss::EventSubscriber.new }

let(:seeds) do
[ SpecConfig.instance.addresses.first ]
end

let(:client) do
ClientRegistry.instance.new_local_client(
seeds,
SpecConfig.instance.test_options.merge(client_options)
).tap do |client|
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
end
end

let(:collection) do
client['find_options', collection_options]
end

let(:find_command) do
subscriber.started_events.find { |cmd| cmd.command_name == 'find' }
end

before do
ClientRegistry.instance.global_client('authorized')['find_options'].drop
collection.insert_many([ { a: 1 }, { a: 2 }, { a: 3 } ])
end

describe 'collation' do
let(:client_options) do
{}
end

let(:collation) do
{ 'locale' => 'en_US' }
end

context 'when defined on the collection' do
let(:collection_options) do
{ collation: collation }
end

it 'uses the collation defined on the collection' do
collection.find.to_a
expect(find_command.command['collation']).to be_nil
end
end

context 'when defined on the operation' do
let(:collection_options) do
{}
end

it 'uses the collation defined on the collection' do
collection.find({}, collation: collation).to_a
expect(find_command.command['collation']).to eq(collation)
end
end

context 'when defined on both collection and operation' do
let(:collection_options) do
{ 'locale' => 'de_AT' }
end

it 'uses the collation defined on the collection' do
collection.find({}, collation: collation).to_a
expect(find_command.command['collation']).to eq(collation)
end
end
end

describe 'read concern' do
context 'when defined on the client' do
let(:client_options) do
{ read_concern: { level: :local } }
end

let(:collection_options) do
{}
end

it 'uses the read concern defined on the client' do
collection.find.to_a
expect(find_command.command['readConcern']).to eq('level' => 'local')
end

context 'when defined on the collection' do
let(:collection_options) do
{ read_concern: { level: :majority } }
end

it 'uses the read concern defined on the collection' do
collection.find.to_a
expect(find_command.command['readConcern']).to eq('level' => 'majority')
end

context 'when defined on the operation' do
let(:operation_read_concern) do
{ level: :available }
end

it 'uses the read concern defined on the operation' do
collection.find({}, read_concern: operation_read_concern).to_a
expect(find_command.command['readConcern']).to eq('level' => 'available')
end
end
end

context 'when defined on the operation' do
let(:collection_options) do
{}
end

let(:operation_read_concern) do
{ level: :available }
end

it 'uses the read concern defined on the operation' do
collection.find({}, read_concern: operation_read_concern).to_a
expect(find_command.command['readConcern']).to eq('level' => 'available')
end
end
end

context 'when defined on the collection' do
let(:client_options) do
{}
end

let(:collection_options) do
{ read_concern: { level: :majority } }
end

it 'uses the read concern defined on the collection' do
collection.find.to_a
expect(find_command.command['readConcern']).to eq('level' => 'majority')
end

context 'when defined on the operation' do
let(:operation_read_concern) do
{ level: :available }
end

it 'uses the read concern defined on the operation' do
collection.find({}, read_concern: operation_read_concern).to_a
expect(find_command.command['readConcern']).to eq('level' => 'available')
end
end
end
end

describe 'read preference' do
require_topology :replica_set

context 'when defined on the client' do
let(:client_options) do
{ read: { mode: :secondary } }
end

let(:collection_options) do
{}
end

it 'uses the read preference defined on the client' do
collection.find.to_a
expect(find_command.command['$readPreference']).to eq('mode' => 'secondary')
end

context 'when defined on the collection' do
let(:collection_options) do
{ read: { mode: :secondary_preferred } }
end

it 'uses the read concern defined on the collection' do
collection.find.to_a
expect(find_command.command['$readPreference']).to eq('mode' => 'secondaryPreferred')
end
end
end
end
end
12 changes: 12 additions & 0 deletions spec/runners/unified/crud_operations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,18 @@ def get_find_view(op)
if session = args.use('session')
opts[:session] = entities.get(:session, session)
end
if collation = args.use('collation')
opts[:collation] = collation
end
if args.key?('noCursorTimeout')
opts[:no_cursor_timeout] = args.use('noCursorTimeout')
end
if args.key?('oplogReplay')
opts[:oplog_replay] = args.use('oplogReplay')
end
if args.key?('allowPartialResults')
opts[:allow_partial_results] = args.use('allowPartialResults')
end
req = collection.find(args.use!('filter'), **opts)
if batch_size = args.use('batchSize')
req = req.batch_size(batch_size)
Expand Down
Loading