Skip to content

Commit 67f7476

Browse files
MONGOID-5815 Respect client_override for new docs (#5880)
1 parent 4f14e14 commit 67f7476

File tree

2 files changed

+139
-1
lines changed

2 files changed

+139
-1
lines changed

lib/mongoid/clients/options.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def persistence_context
8686
else
8787
PersistenceContext.get(self) ||
8888
PersistenceContext.get(self.class) ||
89-
PersistenceContext.new(self.class, storage_options)
89+
PersistenceContext.new(self.class, default_storage_options)
9090
end
9191
end
9292

@@ -112,6 +112,19 @@ def persistence_context?
112112

113113
private
114114

115+
def default_storage_options
116+
# Nothing is overridden, we use either the default storage_options
117+
# or storage_options defined for the document class.
118+
return storage_options if Threaded.client_override.nil? && Threaded.database_override.nil?
119+
120+
storage_options.tap do |opts|
121+
# Globally overridden client replaces client defined for the document class.
122+
opts[:client] = Threaded.client_override unless Threaded.client_override.nil?
123+
# Globally overridden database replaces database defined for the document class.
124+
opts[:database] = Threaded.database_override unless Threaded.database_override.nil?
125+
end
126+
end
127+
115128
def set_persistence_context(options_or_context)
116129
PersistenceContext.set(self, options_or_context)
117130
end

spec/mongoid/clients/options_spec.rb

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,4 +522,129 @@
522522
end
523523
end
524524
end
525+
526+
context 'with global overrides' do
527+
let(:default_subscriber) do
528+
Mrss::EventSubscriber.new
529+
end
530+
531+
let(:override_subscriber) do
532+
Mrss::EventSubscriber.new
533+
end
534+
535+
context 'when global client is overridden' do
536+
before do
537+
Mongoid.clients['override_client'] = { hosts: SpecConfig.instance.addresses, database: 'default_override_database' }
538+
Mongoid.override_client('override_client')
539+
Mongoid.client(:default).subscribe(Mongo::Monitoring::COMMAND, default_subscriber)
540+
Mongoid.client('override_client').subscribe(Mongo::Monitoring::COMMAND, override_subscriber)
541+
end
542+
543+
after do
544+
Mongoid.client(:default).unsubscribe(Mongo::Monitoring::COMMAND, default_subscriber)
545+
Mongoid.client('override_client').unsubscribe(Mongo::Monitoring::COMMAND, override_subscriber)
546+
Mongoid.override_client(nil)
547+
Mongoid.clients['override_client'] = nil
548+
end
549+
550+
it 'uses the overridden client for create' do
551+
Minim.create!
552+
553+
expect(override_subscriber.single_command_started_event('insert').database_name).to eq('default_override_database')
554+
expect(default_subscriber.command_started_events('insert')).to be_empty
555+
end
556+
557+
it 'uses the overridden client for queries' do
558+
Minim.where(name: 'Dmitry').to_a
559+
560+
expect(override_subscriber.single_command_started_event('find').database_name).to eq('default_override_database')
561+
expect(default_subscriber.command_started_events('find')).to be_empty
562+
end
563+
564+
context 'when the client is set on the model level' do
565+
let(:model_level_subscriber) do
566+
Mrss::EventSubscriber.new
567+
end
568+
569+
around(:example) do |example|
570+
opts = Minim.storage_options
571+
Minim.storage_options = Minim.storage_options.merge( { client: 'model_level_client' } )
572+
Mongoid.clients['model_level_client'] = { hosts: SpecConfig.instance.addresses, database: 'model_level_database' }
573+
Mongoid.client('model_level_client').subscribe(Mongo::Monitoring::COMMAND, override_subscriber)
574+
example.run
575+
Mongoid.client('model_level_client').unsubscribe(Mongo::Monitoring::COMMAND, override_subscriber)
576+
Mongoid.clients['model_level_client'] = nil
577+
Minim.storage_options = opts
578+
end
579+
580+
# This behaviour is consistent with 8.x
581+
it 'uses the overridden client for create' do
582+
Minim.create!
583+
584+
expect(override_subscriber.single_command_started_event('insert').database_name).to eq('default_override_database')
585+
expect(default_subscriber.command_started_events('insert')).to be_empty
586+
expect(model_level_subscriber.command_started_events('insert')).to be_empty
587+
end
588+
589+
# This behaviour is consistent with 8.x
590+
it 'uses the overridden client for queries' do
591+
Minim.where(name: 'Dmitry').to_a
592+
593+
expect(override_subscriber.single_command_started_event('find').database_name).to eq('default_override_database')
594+
expect(default_subscriber.command_started_events('find')).to be_empty
595+
expect(model_level_subscriber.command_started_events('find')).to be_empty
596+
end
597+
end
598+
end
599+
600+
context 'when global database is overridden' do
601+
before do
602+
Mongoid.override_database('override_database')
603+
Mongoid.client(:default).subscribe(Mongo::Monitoring::COMMAND, default_subscriber)
604+
end
605+
606+
after do
607+
Mongoid.client(:default).unsubscribe(Mongo::Monitoring::COMMAND, default_subscriber)
608+
Mongoid.override_database(nil)
609+
end
610+
611+
it 'uses the overridden database for create' do
612+
Minim.create!
613+
614+
expect(default_subscriber.single_command_started_event('insert').database_name).to eq('override_database')
615+
end
616+
617+
it 'uses the overridden database for queries' do
618+
Minim.where(name: 'Dmitry').to_a
619+
620+
expect(default_subscriber.single_command_started_event('find').database_name).to eq('override_database')
621+
end
622+
623+
context 'when the database is set on the model level' do
624+
around(:example) do |example|
625+
opts = Minim.storage_options
626+
Minim.storage_options = Minim.storage_options.merge( { database: 'model_level_database' } )
627+
Mongoid.clients['model_level_client'] = { hosts: SpecConfig.instance.addresses, database: 'model_level_database' }
628+
Mongoid.client(:default).subscribe(Mongo::Monitoring::COMMAND, default_subscriber)
629+
example.run
630+
Mongoid.client(:default).unsubscribe(Mongo::Monitoring::COMMAND, default_subscriber)
631+
Mongoid.clients['model_level_client'] = nil
632+
Minim.storage_options = opts
633+
end
634+
635+
# This behaviour is consistent with 8.x
636+
it 'uses the overridden database for create' do
637+
Minim.create!
638+
639+
expect(default_subscriber.single_command_started_event('insert').database_name).to eq('override_database')
640+
end
641+
642+
it 'uses the overridden database for queries' do
643+
Minim.where(name: 'Dmitry').to_a
644+
645+
expect(default_subscriber.single_command_started_event('find').database_name).to eq('override_database')
646+
end
647+
end
648+
end
649+
end
525650
end

0 commit comments

Comments
 (0)