mongoid 7.1.7 → 7.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +1 -1
- data/Rakefile +31 -0
- data/lib/config/locales/en.yml +13 -0
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
- data/lib/mongoid/association/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/proxy.rb +1 -1
- data/lib/mongoid/attributes.rb +8 -1
- data/lib/mongoid/config/environment.rb +9 -1
- data/lib/mongoid/contextual/atomic.rb +7 -2
- data/lib/mongoid/contextual/none.rb +3 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +2 -2
- data/lib/mongoid/criteria/queryable/storable.rb +4 -4
- data/lib/mongoid/criteria.rb +1 -1
- data/lib/mongoid/document.rb +3 -2
- data/lib/mongoid/errors/empty_config_file.rb +26 -0
- data/lib/mongoid/errors/invalid_config_file.rb +26 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors.rb +2 -0
- data/lib/mongoid/interceptable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +3 -1
- data/lib/mongoid/reloadable.rb +5 -0
- data/lib/mongoid/tasks/database.rb +1 -1
- data/lib/mongoid/validatable/associated.rb +1 -1
- data/lib/mongoid/validatable/presence.rb +3 -3
- data/lib/mongoid/validatable/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +1 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
- data/spec/app/models/address.rb +4 -0
- data/spec/app/models/mop.rb +26 -0
- data/spec/app/models/person.rb +9 -0
- data/spec/integration/app_spec.rb +144 -87
- data/spec/integration/contextual/empty_spec.rb +142 -0
- data/spec/integration/document_spec.rb +21 -0
- data/spec/lite_spec_helper.rb +5 -5
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +17 -4
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +17 -0
- data/spec/mongoid/attributes_spec.rb +241 -0
- data/spec/mongoid/clients/factory_spec.rb +11 -0
- data/spec/mongoid/clients/options_spec.rb +11 -3
- data/spec/mongoid/config/environment_spec.rb +86 -8
- data/spec/mongoid/contextual/atomic_spec.rb +81 -29
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -1
- data/spec/mongoid/criteria_spec.rb +4 -0
- data/spec/mongoid/document_query_spec.rb +51 -0
- data/spec/mongoid/document_spec.rb +21 -1
- data/spec/mongoid/errors/invalid_config_file_spec.rb +32 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +20 -8
- data/spec/mongoid/factory_spec.rb +2 -2
- data/spec/mongoid/persistable/savable_spec.rb +4 -4
- data/spec/mongoid/persistable/settable_spec.rb +30 -0
- data/spec/mongoid/persistable/updatable_spec.rb +2 -0
- data/spec/mongoid/persistable_spec.rb +2 -2
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +19 -4
- data/spec/shared/lib/mrss/constraints.rb +67 -12
- data/spec/shared/lib/mrss/docker_runner.rb +10 -1
- data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +84 -33
- data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +126 -32
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/server.sh +123 -26
- data/spec/shared/shlib/set_env.sh +4 -1
- data/spec/spec_helper.rb +3 -1
- data/spec/support/constraints.rb +0 -226
- data/spec/support/spec_config.rb +8 -0
- data.tar.gz.sig +0 -0
- metadata +555 -503
- metadata.gz.sig +0 -0
- data/spec/support/child_process_helper.rb +0 -76
- data/spec/support/lite_constraints.rb +0 -22
@@ -19,4 +19,25 @@ describe Mongoid::Document do
|
|
19
19
|
DelegatingPatient.default_client.should be Mongoid.default_client
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
describe '#reload' do
|
24
|
+
context 'when changing shard key value' do
|
25
|
+
require_topology :sharded
|
26
|
+
|
27
|
+
let(:profile) do
|
28
|
+
# Profile shard_key :name
|
29
|
+
Profile.create!(name: "Alice")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "successfully reloads the document after saving an update to the sharded field" do
|
33
|
+
expect(profile.name).to eq("Alice")
|
34
|
+
profile.name = "Bob"
|
35
|
+
profile.save!
|
36
|
+
|
37
|
+
profile.reload
|
38
|
+
|
39
|
+
expect(profile.name).to eq("Bob")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
22
43
|
end
|
data/spec/lite_spec_helper.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
5
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "shared", "lib"))
|
6
7
|
|
7
8
|
# Load byebug before mongoid, to place breakpoints in the lib methods.
|
8
9
|
# But SpecConfig needs the driver code - require the driver here.
|
@@ -15,7 +16,7 @@ require "mongo"
|
|
15
16
|
require 'pp'
|
16
17
|
|
17
18
|
require 'support/spec_config'
|
18
|
-
require '
|
19
|
+
require 'mrss/lite_constraints'
|
19
20
|
require "support/session_registry"
|
20
21
|
|
21
22
|
unless SpecConfig.instance.ci?
|
@@ -52,9 +53,8 @@ RSpec.configure do |config|
|
|
52
53
|
|
53
54
|
if SpecConfig.instance.ci? && !%w(1 true yes).include?(ENV['INTERACTIVE']&.downcase)
|
54
55
|
timeout = if SpecConfig.instance.app_tests?
|
55
|
-
#
|
56
|
-
|
57
|
-
300
|
56
|
+
# App tests under JRuby take a REALLY long time (over 5 minutes per test).
|
57
|
+
500
|
58
58
|
else
|
59
59
|
# Allow a max of 30 seconds per test.
|
60
60
|
# Tests should take under 10 seconds ideally but it seems
|
@@ -68,7 +68,7 @@ RSpec.configure do |config|
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
config.extend(LiteConstraints)
|
71
|
+
config.extend(Mrss::LiteConstraints)
|
72
72
|
end
|
73
73
|
|
74
74
|
# require all shared examples
|
@@ -2416,13 +2416,26 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
2416
2416
|
end
|
2417
2417
|
|
2418
2418
|
context "when providing a criteria class method" do
|
2419
|
+
context "without keyword arguments" do
|
2419
2420
|
|
2420
|
-
|
2421
|
-
|
2421
|
+
let(:addresses) do
|
2422
|
+
person.addresses.california
|
2423
|
+
end
|
2424
|
+
|
2425
|
+
it "applies the criteria to the documents" do
|
2426
|
+
expect(addresses).to eq([ address_one ])
|
2427
|
+
end
|
2422
2428
|
end
|
2423
2429
|
|
2424
|
-
|
2425
|
-
|
2430
|
+
context "with keyword arguments" do
|
2431
|
+
|
2432
|
+
let(:addresses) do
|
2433
|
+
person.addresses.city_and_state(city: "Sacramento", state: "CA")
|
2434
|
+
end
|
2435
|
+
|
2436
|
+
it "applies the criteria to the documents" do
|
2437
|
+
expect(addresses).to eq([])
|
2438
|
+
end
|
2426
2439
|
end
|
2427
2440
|
end
|
2428
2441
|
|
@@ -1332,4 +1332,21 @@ describe Mongoid::Association::Referenced::BelongsTo::Proxy do
|
|
1332
1332
|
end
|
1333
1333
|
end
|
1334
1334
|
end
|
1335
|
+
|
1336
|
+
describe "#method_missing" do
|
1337
|
+
let!(:person) do
|
1338
|
+
Person.create
|
1339
|
+
end
|
1340
|
+
|
1341
|
+
let!(:game) do
|
1342
|
+
Game.create(person: person)
|
1343
|
+
end
|
1344
|
+
|
1345
|
+
it 'handles keyword args' do
|
1346
|
+
expect do
|
1347
|
+
game.person.set_personal_data(ssn: '123', age: 25)
|
1348
|
+
end.not_to raise_error
|
1349
|
+
end
|
1350
|
+
|
1351
|
+
end
|
1335
1352
|
end
|
@@ -245,6 +245,97 @@ describe Mongoid::Attributes do
|
|
245
245
|
end
|
246
246
|
end
|
247
247
|
|
248
|
+
context "when the field was not explicitly defined" do
|
249
|
+
|
250
|
+
context "when excluding with only and the field was not excluded" do
|
251
|
+
|
252
|
+
let(:from_db) do
|
253
|
+
Person.only(:_id).first
|
254
|
+
end
|
255
|
+
|
256
|
+
it "raises an error" do
|
257
|
+
expect {
|
258
|
+
from_db[:undefined_field]
|
259
|
+
}.to raise_error(ActiveModel::MissingAttributeError)
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
context "when excluding with without and the field was excluded" do
|
264
|
+
|
265
|
+
let(:from_db) do
|
266
|
+
Person.without(:title).first
|
267
|
+
end
|
268
|
+
|
269
|
+
it "raises an error" do
|
270
|
+
expect {
|
271
|
+
from_db[:title]
|
272
|
+
}.to raise_error(ActiveModel::MissingAttributeError)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
context "when excluding with without and the field was not excluded" do
|
277
|
+
|
278
|
+
let(:from_db) do
|
279
|
+
Person.without(:title).first
|
280
|
+
end
|
281
|
+
|
282
|
+
it "returns nil" do
|
283
|
+
from_db[:undefined_field].should be nil
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
context 'when projecting with #only' do
|
289
|
+
let!(:person) do
|
290
|
+
Person.create(title: 'sir', name: { first_name: 'Jose', language: { name: 'es' } })
|
291
|
+
end
|
292
|
+
|
293
|
+
context 'when projecting an embedded association' do
|
294
|
+
let(:from_db) do
|
295
|
+
Person.only(:name).first
|
296
|
+
end
|
297
|
+
|
298
|
+
context 'when retrieving a field of the association using the dot notation' do
|
299
|
+
|
300
|
+
it 'retrieves the field' do
|
301
|
+
pending 'MONGOID-5032, fixed in 7.3'
|
302
|
+
|
303
|
+
expect(from_db['name.first_name']).to eq 'Jose'
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
context 'when retrieving a field of a nested association using the dot notation' do
|
308
|
+
it 'retrieves the field' do
|
309
|
+
pending 'MONGOID-5032, fixed in 7.3'
|
310
|
+
|
311
|
+
expect(from_db['name.language.name']).to eq 'es'
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
context 'when projecting a sub-association of an embedded association' do
|
317
|
+
let(:from_db) do
|
318
|
+
Person.only('name.language').first
|
319
|
+
end
|
320
|
+
|
321
|
+
context 'when retrieving a field under the projected sub-association' do
|
322
|
+
it 'retrieves the field' do
|
323
|
+
pending 'MONGOID-5032, fixed in 7.3'
|
324
|
+
|
325
|
+
expect(from_db['name.language.name']).to eq 'es'
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
context 'when retrieving a non-projected field' do
|
330
|
+
it 'raises MissingAttributeError' do
|
331
|
+
expect do
|
332
|
+
from_db['name.first_name']
|
333
|
+
end.to raise_error(ActiveModel::MissingAttributeError)
|
334
|
+
end
|
335
|
+
end
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
248
339
|
context "when the attribute does not exist" do
|
249
340
|
|
250
341
|
before do
|
@@ -329,6 +420,67 @@ describe Mongoid::Attributes do
|
|
329
420
|
expect(terms).to eq(true)
|
330
421
|
end
|
331
422
|
end
|
423
|
+
|
424
|
+
context 'when the field is not explicitly defined' do
|
425
|
+
let(:bar) { Bar.new }
|
426
|
+
|
427
|
+
before do
|
428
|
+
bar['missing_field'] = 42
|
429
|
+
end
|
430
|
+
|
431
|
+
it 'writes the value into attributes' do
|
432
|
+
bar.attributes.should == {'_id' => bar.id, 'missing_field' => 42}
|
433
|
+
end
|
434
|
+
|
435
|
+
it 'makes the attribute accessible via []' do
|
436
|
+
bar['missing_field'].should == 42
|
437
|
+
end
|
438
|
+
|
439
|
+
context 'when writing fields on a document with projection' do
|
440
|
+
|
441
|
+
let!(:person) do
|
442
|
+
Person.create(title: "sir")
|
443
|
+
end
|
444
|
+
|
445
|
+
context "when excluding with only and the field was not excluded" do
|
446
|
+
|
447
|
+
let(:from_db) do
|
448
|
+
Person.only(:_id).first
|
449
|
+
end
|
450
|
+
|
451
|
+
it "raises an error" do
|
452
|
+
expect {
|
453
|
+
from_db[:undefined_field] = 'x'
|
454
|
+
}.to raise_error(ActiveModel::MissingAttributeError)
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
context "when excluding with without and the field was excluded" do
|
459
|
+
|
460
|
+
let(:from_db) do
|
461
|
+
Person.without(:title).first
|
462
|
+
end
|
463
|
+
|
464
|
+
it "raises an error" do
|
465
|
+
expect {
|
466
|
+
from_db[:title] = 'x'
|
467
|
+
}.to raise_error(ActiveModel::MissingAttributeError)
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|
471
|
+
context "when excluding with without and the field was not excluded" do
|
472
|
+
|
473
|
+
let(:from_db) do
|
474
|
+
Person.without(:title).first
|
475
|
+
end
|
476
|
+
|
477
|
+
it "writes the value" do
|
478
|
+
from_db[:undefined_field] = 'x'
|
479
|
+
from_db[:undefined_field].should == 'x'
|
480
|
+
end
|
481
|
+
end
|
482
|
+
end
|
483
|
+
end
|
332
484
|
end
|
333
485
|
|
334
486
|
describe "#_id" do
|
@@ -893,6 +1045,50 @@ describe Mongoid::Attributes do
|
|
893
1045
|
expect(person.age_before_type_cast).to eq("old")
|
894
1046
|
end
|
895
1047
|
end
|
1048
|
+
|
1049
|
+
context 'when reading fields on a document with projection' do
|
1050
|
+
|
1051
|
+
let!(:person) do
|
1052
|
+
Person.create(title: "sir")
|
1053
|
+
end
|
1054
|
+
|
1055
|
+
context "when excluding with only and the field was not excluded" do
|
1056
|
+
|
1057
|
+
let(:from_db) do
|
1058
|
+
Person.only(:_id).first
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
it "raises an error" do
|
1062
|
+
expect {
|
1063
|
+
from_db.read_attribute(:undefined_field)
|
1064
|
+
}.to raise_error(ActiveModel::MissingAttributeError)
|
1065
|
+
end
|
1066
|
+
end
|
1067
|
+
|
1068
|
+
context "when excluding with without and the field was excluded" do
|
1069
|
+
|
1070
|
+
let(:from_db) do
|
1071
|
+
Person.without(:title).first
|
1072
|
+
end
|
1073
|
+
|
1074
|
+
it "raises an error" do
|
1075
|
+
expect {
|
1076
|
+
from_db.read_attribute(:title)
|
1077
|
+
}.to raise_error(ActiveModel::MissingAttributeError)
|
1078
|
+
end
|
1079
|
+
end
|
1080
|
+
|
1081
|
+
context "when excluding with without and the field was not excluded" do
|
1082
|
+
|
1083
|
+
let(:from_db) do
|
1084
|
+
Person.without(:title).first
|
1085
|
+
end
|
1086
|
+
|
1087
|
+
it "returns nil" do
|
1088
|
+
from_db.read_attribute(:undefined_field).should be nil
|
1089
|
+
end
|
1090
|
+
end
|
1091
|
+
end
|
896
1092
|
end
|
897
1093
|
|
898
1094
|
describe "#attribute_present?" do
|
@@ -1398,6 +1594,51 @@ describe Mongoid::Attributes do
|
|
1398
1594
|
expect(dictionary.description).to eq('foo')
|
1399
1595
|
end
|
1400
1596
|
end
|
1597
|
+
|
1598
|
+
context 'when writing fields on a document with projection' do
|
1599
|
+
|
1600
|
+
let!(:person) do
|
1601
|
+
Person.create(title: "sir")
|
1602
|
+
end
|
1603
|
+
|
1604
|
+
context "when excluding with only and the field was not excluded" do
|
1605
|
+
|
1606
|
+
let(:from_db) do
|
1607
|
+
Person.only(:_id).first
|
1608
|
+
end
|
1609
|
+
|
1610
|
+
it "raises an error" do
|
1611
|
+
expect {
|
1612
|
+
from_db.write_attribute(:undefined_field, 'x')
|
1613
|
+
}.to raise_error(ActiveModel::MissingAttributeError)
|
1614
|
+
end
|
1615
|
+
end
|
1616
|
+
|
1617
|
+
context "when excluding with without and the field was excluded" do
|
1618
|
+
|
1619
|
+
let(:from_db) do
|
1620
|
+
Person.without(:title).first
|
1621
|
+
end
|
1622
|
+
|
1623
|
+
it "raises an error" do
|
1624
|
+
expect {
|
1625
|
+
from_db.write_attribute(:title, 'x')
|
1626
|
+
}.to raise_error(ActiveModel::MissingAttributeError)
|
1627
|
+
end
|
1628
|
+
end
|
1629
|
+
|
1630
|
+
context "when excluding with without and the field was not excluded" do
|
1631
|
+
|
1632
|
+
let(:from_db) do
|
1633
|
+
Person.without(:title).first
|
1634
|
+
end
|
1635
|
+
|
1636
|
+
it "writes the value" do
|
1637
|
+
from_db.write_attribute(:undefined_field, 'x')
|
1638
|
+
from_db.read_attribute(:undefined_field).should == 'x'
|
1639
|
+
end
|
1640
|
+
end
|
1641
|
+
end
|
1401
1642
|
end
|
1402
1643
|
|
1403
1644
|
describe "#typed_value_for" do
|
@@ -65,6 +65,17 @@ describe Mongoid::Clients::Factory do
|
|
65
65
|
expect(client).to be_a(Mongo::Client)
|
66
66
|
end
|
67
67
|
|
68
|
+
context 'not JRuby' do
|
69
|
+
# Run this test on JRuby when driver 2.16.0 is released -
|
70
|
+
# see RUBY-2771.
|
71
|
+
fails_on_jruby
|
72
|
+
|
73
|
+
it 'does not produce driver warnings' do
|
74
|
+
Mongo::Logger.logger.should_not receive(:warn)
|
75
|
+
client
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
68
79
|
let(:cluster_addresses) do
|
69
80
|
cluster.addresses.map(&:to_s)
|
70
81
|
end
|
@@ -83,9 +83,11 @@ describe Mongoid::Clients::Options, retry: 3 do
|
|
83
83
|
|
84
84
|
let!(:connections_and_cluster_during) do
|
85
85
|
connections = nil
|
86
|
-
cluster =
|
86
|
+
cluster = nil
|
87
|
+
Minim.with(options) do |klass|
|
87
88
|
klass.where(name: 'emily').to_a
|
88
89
|
connections = Minim.mongo_client.database.command(serverStatus: 1).first['connections']['current']
|
90
|
+
cluster = Minim.collection.cluster
|
89
91
|
end
|
90
92
|
[ connections, cluster ]
|
91
93
|
end
|
@@ -124,7 +126,10 @@ describe Mongoid::Clients::Options, retry: 3 do
|
|
124
126
|
end
|
125
127
|
|
126
128
|
it 'disconnects the new cluster when the block exits' do
|
127
|
-
expect(
|
129
|
+
expect(cluster_after).not_to be(cluster_during)
|
130
|
+
|
131
|
+
cluster_during.connected?.should be false
|
132
|
+
cluster_before.connected?.should be true
|
128
133
|
end
|
129
134
|
end
|
130
135
|
|
@@ -138,11 +143,14 @@ describe Mongoid::Clients::Options, retry: 3 do
|
|
138
143
|
|
139
144
|
it 'does not create a new cluster' do
|
140
145
|
expect(connections_during).to eq(connections_before)
|
146
|
+
|
147
|
+
cluster_during.should be cluster_before
|
141
148
|
end
|
142
149
|
|
143
150
|
it 'does not disconnect the original cluster' do
|
144
|
-
expect(connections_after).to eq(connections_before)
|
145
151
|
expect(cluster_before).to be(cluster_after)
|
152
|
+
|
153
|
+
cluster_before.connected?.should be true
|
146
154
|
end
|
147
155
|
end
|
148
156
|
|
@@ -5,9 +5,19 @@ require "spec_helper"
|
|
5
5
|
|
6
6
|
describe Mongoid::Config::Environment do
|
7
7
|
|
8
|
-
|
9
|
-
Rails
|
10
|
-
|
8
|
+
around do |example|
|
9
|
+
if defined?(Rails)
|
10
|
+
SavedRails = Rails
|
11
|
+
example.run
|
12
|
+
Object.send(:remove_const, :Rails) if defined?(Rails)
|
13
|
+
Rails = SavedRails
|
14
|
+
Object.send(:remove_const, :SavedRails)
|
15
|
+
else
|
16
|
+
example.run
|
17
|
+
if defined?(Rails)
|
18
|
+
Object.send(:remove_const, :Rails)
|
19
|
+
end
|
20
|
+
end
|
11
21
|
end
|
12
22
|
|
13
23
|
describe "#env_name" do
|
@@ -24,11 +34,6 @@ describe Mongoid::Config::Environment do
|
|
24
34
|
end
|
25
35
|
end
|
26
36
|
|
27
|
-
after do
|
28
|
-
RailsTemp = Rails
|
29
|
-
Object.send(:remove_const, :Rails)
|
30
|
-
end
|
31
|
-
|
32
37
|
it "returns the rails environment" do
|
33
38
|
expect(described_class.env_name).to eq("production")
|
34
39
|
end
|
@@ -86,4 +91,77 @@ describe Mongoid::Config::Environment do
|
|
86
91
|
end
|
87
92
|
end
|
88
93
|
end
|
94
|
+
|
95
|
+
describe "#load_yaml" do
|
96
|
+
let(:path) { 'mongoid.yml' }
|
97
|
+
let(:environment) {}
|
98
|
+
before { allow(Rails).to receive('env').and_return('test') }
|
99
|
+
|
100
|
+
subject { described_class.load_yaml(path, environment) }
|
101
|
+
|
102
|
+
context 'when file not found' do
|
103
|
+
let(:path) { 'not/a/valid/path'}
|
104
|
+
|
105
|
+
it { expect { subject }.to raise_error(Errno::ENOENT) }
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when file found' do
|
109
|
+
before do
|
110
|
+
allow(File).to receive(:new).with('mongoid.yml').and_return(StringIO.new(file_contents))
|
111
|
+
end
|
112
|
+
|
113
|
+
let(:file_contents) do
|
114
|
+
<<~FILE
|
115
|
+
test:
|
116
|
+
clients: ['test']
|
117
|
+
development:
|
118
|
+
clients: ['dev']
|
119
|
+
FILE
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'when file cannot be parsed as YAML' do
|
123
|
+
let(:file_contents) { "*\nbad:%123abc" }
|
124
|
+
|
125
|
+
it { expect { subject }.to raise_error(Psych::SyntaxError) }
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when file contains ERB errors' do
|
129
|
+
let(:file_contents) { '<%= foo %>' }
|
130
|
+
|
131
|
+
it { expect { subject }.to raise_error(NameError) }
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when file is empty' do
|
135
|
+
let(:file_contents) { '' }
|
136
|
+
|
137
|
+
it { expect { subject }.to raise_error(Mongoid::Errors::EmptyConfigFile) }
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'when file does not contain a YAML Hash object' do
|
141
|
+
let(:file_contents) { '["this", "is", "an", "array"]' }
|
142
|
+
|
143
|
+
it { expect { subject }.to raise_error(Mongoid::Errors::InvalidConfigFile) }
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'when environment not specified' do
|
147
|
+
it 'uses the rails environment' do
|
148
|
+
is_expected.to eq("clients"=>["test"])
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'when environment is specified' do
|
153
|
+
let(:environment) { 'development' }
|
154
|
+
|
155
|
+
it 'uses the specified environment' do
|
156
|
+
is_expected.to eq("clients"=>["dev"])
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'when environment is missing' do
|
161
|
+
let(:environment) { 'staging' }
|
162
|
+
|
163
|
+
it { is_expected.to be_nil }
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
89
167
|
end
|