mongoid 7.2.0 → 7.3.0

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.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Rakefile +16 -0
  4. data/lib/config/locales/en.yml +2 -2
  5. data/lib/mongoid/association/accessors.rb +1 -1
  6. data/lib/mongoid/association/constrainable.rb +1 -1
  7. data/lib/mongoid/association/depending.rb +4 -4
  8. data/lib/mongoid/association/embedded/batchable.rb +1 -1
  9. data/lib/mongoid/association/embedded/embedded_in.rb +1 -1
  10. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +10 -3
  11. data/lib/mongoid/association/nested/many.rb +1 -1
  12. data/lib/mongoid/association/nested/one.rb +4 -2
  13. data/lib/mongoid/association/proxy.rb +6 -1
  14. data/lib/mongoid/association/referenced/auto_save.rb +2 -2
  15. data/lib/mongoid/association/referenced/has_many/enumerable.rb +493 -495
  16. data/lib/mongoid/association/referenced/has_many/proxy.rb +2 -2
  17. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +2 -2
  18. data/lib/mongoid/attributes/projector.rb +120 -0
  19. data/lib/mongoid/attributes.rb +32 -14
  20. data/lib/mongoid/cacheable.rb +2 -2
  21. data/lib/mongoid/clients/factory.rb +22 -8
  22. data/lib/mongoid/clients.rb +1 -1
  23. data/lib/mongoid/config.rb +19 -2
  24. data/lib/mongoid/contextual/aggregable/mongo.rb +10 -8
  25. data/lib/mongoid/copyable.rb +1 -1
  26. data/lib/mongoid/criteria/findable.rb +1 -1
  27. data/lib/mongoid/criteria/queryable/expandable.rb +0 -24
  28. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  29. data/lib/mongoid/criteria/queryable/extensions.rb +0 -4
  30. data/lib/mongoid/criteria/queryable/mergeable.rb +46 -20
  31. data/lib/mongoid/criteria/queryable/selectable.rb +8 -8
  32. data/lib/mongoid/criteria/queryable/selector.rb +0 -4
  33. data/lib/mongoid/criteria.rb +4 -5
  34. data/lib/mongoid/document.rb +4 -17
  35. data/lib/mongoid/errors/delete_restriction.rb +8 -9
  36. data/lib/mongoid/evolvable.rb +1 -1
  37. data/lib/mongoid/extensions/boolean.rb +1 -2
  38. data/lib/mongoid/extensions/false_class.rb +1 -1
  39. data/lib/mongoid/extensions/hash.rb +2 -2
  40. data/lib/mongoid/extensions/true_class.rb +1 -1
  41. data/lib/mongoid/fields.rb +43 -5
  42. data/lib/mongoid/inspectable.rb +1 -1
  43. data/lib/mongoid/interceptable.rb +3 -1
  44. data/lib/mongoid/matcher/bits.rb +41 -0
  45. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  46. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  47. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  48. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  49. data/lib/mongoid/matcher/elem_match.rb +2 -1
  50. data/lib/mongoid/matcher/expression.rb +9 -14
  51. data/lib/mongoid/matcher/field_expression.rb +4 -5
  52. data/lib/mongoid/matcher/field_operator.rb +13 -11
  53. data/lib/mongoid/matcher/mod.rb +17 -0
  54. data/lib/mongoid/matcher/type.rb +99 -0
  55. data/lib/mongoid/matcher.rb +26 -43
  56. data/lib/mongoid/persistable/deletable.rb +1 -2
  57. data/lib/mongoid/persistable/destroyable.rb +8 -2
  58. data/lib/mongoid/persistable/updatable.rb +27 -2
  59. data/lib/mongoid/query_cache.rb +35 -29
  60. data/lib/mongoid/reloadable.rb +5 -0
  61. data/lib/mongoid/selectable.rb +5 -7
  62. data/lib/mongoid/shardable.rb +21 -5
  63. data/lib/mongoid/touchable.rb +23 -4
  64. data/lib/mongoid/version.rb +1 -1
  65. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  66. data/spec/integration/app_spec.rb +171 -84
  67. data/spec/integration/associations/embeds_many_spec.rb +44 -0
  68. data/spec/integration/associations/has_one_spec.rb +48 -0
  69. data/spec/integration/callbacks_models.rb +49 -0
  70. data/spec/integration/callbacks_spec.rb +216 -0
  71. data/spec/integration/criteria/date_field_spec.rb +1 -1
  72. data/spec/integration/document_spec.rb +30 -0
  73. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  74. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  75. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  76. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  77. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  78. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  79. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  80. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  81. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  82. data/spec/integration/matcher_operator_data/in.yml +16 -0
  83. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  84. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  85. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  86. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  87. data/spec/integration/matcher_operator_data/type.yml +70 -0
  88. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  89. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  90. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  91. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  92. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  93. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  94. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  95. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  96. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  97. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  98. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  99. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  100. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  101. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  102. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  103. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  104. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  105. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  106. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  107. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  108. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  109. data/spec/lite_spec_helper.rb +5 -4
  110. data/spec/mongoid/association/depending_spec.rb +391 -352
  111. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
  112. data/spec/mongoid/association/nested/one_spec.rb +18 -14
  113. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +25 -8
  114. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -1
  115. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -1
  116. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -1
  117. data/spec/mongoid/association/referenced/has_one_models.rb +8 -0
  118. data/spec/mongoid/atomic/paths_spec.rb +105 -12
  119. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  120. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  121. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  122. data/spec/mongoid/attributes_spec.rb +333 -0
  123. data/spec/mongoid/clients/factory_spec.rb +48 -0
  124. data/spec/mongoid/config_spec.rb +32 -0
  125. data/spec/mongoid/contextual/atomic_spec.rb +17 -4
  126. data/spec/mongoid/contextual/mongo_spec.rb +2 -2
  127. data/spec/mongoid/criteria/modifiable_spec.rb +1 -1
  128. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -73
  129. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -1
  130. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +105 -7
  131. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +265 -24
  132. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  133. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -565
  134. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  135. data/spec/mongoid/criteria_projection_spec.rb +411 -0
  136. data/spec/mongoid/criteria_spec.rb +0 -275
  137. data/spec/mongoid/document_fields_spec.rb +26 -0
  138. data/spec/mongoid/document_spec.rb +13 -13
  139. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  140. data/spec/mongoid/extensions/false_class_spec.rb +1 -1
  141. data/spec/mongoid/extensions/string_spec.rb +5 -5
  142. data/spec/mongoid/extensions/true_class_spec.rb +1 -1
  143. data/spec/mongoid/fields/localized_spec.rb +4 -4
  144. data/spec/mongoid/fields_spec.rb +4 -4
  145. data/spec/mongoid/inspectable_spec.rb +12 -4
  146. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  147. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  148. data/spec/mongoid/matcher/extract_attribute_spec.rb +3 -13
  149. data/spec/mongoid/persistable/deletable_spec.rb +175 -1
  150. data/spec/mongoid/persistable/destroyable_spec.rb +191 -3
  151. data/spec/mongoid/persistable/savable_spec.rb +3 -5
  152. data/spec/mongoid/persistable/settable_spec.rb +30 -0
  153. data/spec/mongoid/persistable/upsertable_spec.rb +1 -1
  154. data/spec/mongoid/query_cache_middleware_spec.rb +8 -0
  155. data/spec/mongoid/reloadable_spec.rb +18 -1
  156. data/spec/mongoid/shardable_spec.rb +44 -0
  157. data/spec/mongoid/touchable_spec.rb +104 -16
  158. data/spec/mongoid/touchable_spec_models.rb +52 -0
  159. data/spec/mongoid/validatable_spec.rb +1 -1
  160. data/spec/shared/bin/get-mongodb-download-url +17 -0
  161. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  162. data/spec/shared/lib/mrss/constraints.rb +51 -0
  163. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  164. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  165. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  166. data/spec/shared/lib/mrss/spec_organizer.rb +14 -1
  167. data/spec/shared/lib/mrss/utils.rb +15 -0
  168. data/spec/shared/share/Dockerfile.erb +231 -0
  169. data/spec/shared/shlib/distro.sh +73 -0
  170. data/spec/shared/shlib/server.sh +290 -0
  171. data/spec/shared/shlib/set_env.sh +128 -0
  172. data/spec/spec_helper.rb +6 -2
  173. data/spec/support/client_registry.rb +9 -0
  174. data/spec/support/models/bolt.rb +8 -0
  175. data/spec/support/models/customer.rb +11 -0
  176. data/spec/support/models/customer_address.rb +12 -0
  177. data/spec/support/models/dictionary.rb +6 -0
  178. data/spec/support/models/hole.rb +13 -0
  179. data/spec/support/models/mop.rb +9 -0
  180. data/spec/support/models/nut.rb +8 -0
  181. data/spec/support/models/person.rb +6 -0
  182. data/spec/support/models/sealer.rb +8 -0
  183. data/spec/support/models/shirt.rb +12 -0
  184. data/spec/support/models/spacer.rb +8 -0
  185. data/spec/support/models/threadlocker.rb +8 -0
  186. data/spec/support/models/washer.rb +8 -0
  187. data/spec/support/spec_config.rb +8 -0
  188. data.tar.gz.sig +0 -0
  189. metadata +146 -14
  190. metadata.gz.sig +5 -2
  191. data/spec/support/cluster_config.rb +0 -158
@@ -96,6 +96,49 @@ describe Mongoid::Attributes do
96
96
  it "does not raise an error" do
97
97
  expect(from_db.map).to eq(map)
98
98
  end
99
+
100
+ context 'when only one of the hash fields is projected' do
101
+
102
+ let(:map) do
103
+ { 'dates' => { 'y' => { '2016' => 'Berlin', '2017' => 'Munich' } } }
104
+ end
105
+
106
+ let(:expected) do
107
+ { 'dates' => { 'y' => {
108
+ '2016' => 'Berlin',
109
+ } } }
110
+ end
111
+
112
+ it 'retrieves only the projected fields' do
113
+ expect(from_db.map).to eq(expected)
114
+ end
115
+ end
116
+
117
+ context 'when several of the hash fields is projected' do
118
+
119
+ let(:map) do
120
+ { 'dates' => { 'y' => {
121
+ '2016' => 'Berlin',
122
+ '2017' => 'Munich',
123
+ '2018' => 'Krakow',
124
+ } } }
125
+ end
126
+
127
+ let(:expected) do
128
+ { 'dates' => { 'y' => {
129
+ '2016' => 'Berlin',
130
+ '2018' => 'Krakow',
131
+ } } }
132
+ end
133
+
134
+ let(:from_db) do
135
+ Person.only('map.dates.y.2016', 'map.dates.y.2018').first
136
+ end
137
+
138
+ it 'retrieves only the projected fields' do
139
+ expect(from_db.map).to eq(expected)
140
+ end
141
+ end
99
142
  end
100
143
  end
101
144
 
@@ -245,6 +288,91 @@ describe Mongoid::Attributes do
245
288
  end
246
289
  end
247
290
 
291
+ context "when the field was not explicitly defined" do
292
+
293
+ context "when excluding with only and the field was not excluded" do
294
+
295
+ let(:from_db) do
296
+ Person.only(:_id).first
297
+ end
298
+
299
+ it "raises an error" do
300
+ expect {
301
+ from_db[:undefined_field]
302
+ }.to raise_error(ActiveModel::MissingAttributeError)
303
+ end
304
+ end
305
+
306
+ context "when excluding with without and the field was excluded" do
307
+
308
+ let(:from_db) do
309
+ Person.without(:title).first
310
+ end
311
+
312
+ it "raises an error" do
313
+ expect {
314
+ from_db[:title]
315
+ }.to raise_error(ActiveModel::MissingAttributeError)
316
+ end
317
+ end
318
+
319
+ context "when excluding with without and the field was not excluded" do
320
+
321
+ let(:from_db) do
322
+ Person.without(:title).first
323
+ end
324
+
325
+ it "returns nil" do
326
+ from_db[:undefined_field].should be nil
327
+ end
328
+ end
329
+ end
330
+
331
+ context 'when projecting with #only' do
332
+ let!(:person) do
333
+ Person.create(title: 'sir', name: { first_name: 'Jose', language: { name: 'es' } })
334
+ end
335
+
336
+ context 'when projecting an embedded association' do
337
+ let(:from_db) do
338
+ Person.only(:name).first
339
+ end
340
+
341
+ context 'when retrieving a field of the association using the dot notation' do
342
+
343
+ it 'retrieves the field' do
344
+ expect(from_db['name.first_name']).to eq 'Jose'
345
+ end
346
+ end
347
+
348
+ context 'when retrieving a field of a nested association using the dot notation' do
349
+ it 'retrieves the field' do
350
+ expect(from_db['name.language.name']).to eq 'es'
351
+ end
352
+ end
353
+ end
354
+
355
+ context 'when projecting a sub-association of an embedded association' do
356
+ let(:from_db) do
357
+ Person.only('name.language').first
358
+ end
359
+
360
+ context 'when retrieving a field under the projected sub-association' do
361
+ it 'retrieves the field' do
362
+ expect(from_db['name.language.name']).to eq 'es'
363
+ end
364
+ end
365
+
366
+ context 'when retrieving a non-projected field' do
367
+ it 'raises MissingAttributeError' do
368
+ expect do
369
+ from_db['name.first_name']
370
+ end.to raise_error(ActiveModel::MissingAttributeError)
371
+ end
372
+ end
373
+ end
374
+ end
375
+
248
376
  context "when the attribute does not exist" do
249
377
 
250
378
  before do
@@ -329,6 +457,67 @@ describe Mongoid::Attributes do
329
457
  expect(terms).to eq(true)
330
458
  end
331
459
  end
460
+
461
+ context 'when the field is not explicitly defined' do
462
+ let(:bar) { Bar.new }
463
+
464
+ before do
465
+ bar['missing_field'] = 42
466
+ end
467
+
468
+ it 'writes the value into attributes' do
469
+ bar.attributes.should == {'_id' => bar.id, 'missing_field' => 42}
470
+ end
471
+
472
+ it 'makes the attribute accessible via []' do
473
+ bar['missing_field'].should == 42
474
+ end
475
+
476
+ context 'when writing fields on a document with projection' do
477
+
478
+ let!(:person) do
479
+ Person.create(title: "sir")
480
+ end
481
+
482
+ context "when excluding with only and the field was not excluded" do
483
+
484
+ let(:from_db) do
485
+ Person.only(:_id).first
486
+ end
487
+
488
+ it "raises an error" do
489
+ expect {
490
+ from_db[:undefined_field] = 'x'
491
+ }.to raise_error(ActiveModel::MissingAttributeError)
492
+ end
493
+ end
494
+
495
+ context "when excluding with without and the field was excluded" do
496
+
497
+ let(:from_db) do
498
+ Person.without(:title).first
499
+ end
500
+
501
+ it "raises an error" do
502
+ expect {
503
+ from_db[:title] = 'x'
504
+ }.to raise_error(ActiveModel::MissingAttributeError)
505
+ end
506
+ end
507
+
508
+ context "when excluding with without and the field was not excluded" do
509
+
510
+ let(:from_db) do
511
+ Person.without(:title).first
512
+ end
513
+
514
+ it "writes the value" do
515
+ from_db[:undefined_field] = 'x'
516
+ from_db[:undefined_field].should == 'x'
517
+ end
518
+ end
519
+ end
520
+ end
332
521
  end
333
522
 
334
523
  describe "#_id" do
@@ -893,6 +1082,50 @@ describe Mongoid::Attributes do
893
1082
  expect(person.age_before_type_cast).to eq("old")
894
1083
  end
895
1084
  end
1085
+
1086
+ context 'when reading fields on a document with projection' do
1087
+
1088
+ let!(:person) do
1089
+ Person.create(title: "sir")
1090
+ end
1091
+
1092
+ context "when excluding with only and the field was not excluded" do
1093
+
1094
+ let(:from_db) do
1095
+ Person.only(:_id).first
1096
+ end
1097
+
1098
+ it "raises an error" do
1099
+ expect {
1100
+ from_db.read_attribute(:undefined_field)
1101
+ }.to raise_error(ActiveModel::MissingAttributeError)
1102
+ end
1103
+ end
1104
+
1105
+ context "when excluding with without and the field was excluded" do
1106
+
1107
+ let(:from_db) do
1108
+ Person.without(:title).first
1109
+ end
1110
+
1111
+ it "raises an error" do
1112
+ expect {
1113
+ from_db.read_attribute(:title)
1114
+ }.to raise_error(ActiveModel::MissingAttributeError)
1115
+ end
1116
+ end
1117
+
1118
+ context "when excluding with without and the field was not excluded" do
1119
+
1120
+ let(:from_db) do
1121
+ Person.without(:title).first
1122
+ end
1123
+
1124
+ it "returns nil" do
1125
+ from_db.read_attribute(:undefined_field).should be nil
1126
+ end
1127
+ end
1128
+ end
896
1129
  end
897
1130
 
898
1131
  describe "#attribute_present?" do
@@ -1398,6 +1631,51 @@ describe Mongoid::Attributes do
1398
1631
  expect(dictionary.description).to eq('foo')
1399
1632
  end
1400
1633
  end
1634
+
1635
+ context 'when writing fields on a document with projection' do
1636
+
1637
+ let!(:person) do
1638
+ Person.create(title: "sir")
1639
+ end
1640
+
1641
+ context "when excluding with only and the field was not excluded" do
1642
+
1643
+ let(:from_db) do
1644
+ Person.only(:_id).first
1645
+ end
1646
+
1647
+ it "raises an error" do
1648
+ expect {
1649
+ from_db.write_attribute(:undefined_field, 'x')
1650
+ }.to raise_error(ActiveModel::MissingAttributeError)
1651
+ end
1652
+ end
1653
+
1654
+ context "when excluding with without and the field was excluded" do
1655
+
1656
+ let(:from_db) do
1657
+ Person.without(:title).first
1658
+ end
1659
+
1660
+ it "raises an error" do
1661
+ expect {
1662
+ from_db.write_attribute(:title, 'x')
1663
+ }.to raise_error(ActiveModel::MissingAttributeError)
1664
+ end
1665
+ end
1666
+
1667
+ context "when excluding with without and the field was not excluded" do
1668
+
1669
+ let(:from_db) do
1670
+ Person.without(:title).first
1671
+ end
1672
+
1673
+ it "writes the value" do
1674
+ from_db.write_attribute(:undefined_field, 'x')
1675
+ from_db.read_attribute(:undefined_field).should == 'x'
1676
+ end
1677
+ end
1678
+ end
1401
1679
  end
1402
1680
 
1403
1681
  describe "#typed_value_for" do
@@ -1651,6 +1929,61 @@ describe Mongoid::Attributes do
1651
1929
  end
1652
1930
  end
1653
1931
 
1932
+ describe '#unalias_attribute' do
1933
+ let(:shirt) { Shirt.new }
1934
+ let(:id) { '1234' }
1935
+
1936
+ context 'when creating object' do
1937
+ let(:shirt) { Shirt.new(id: id) }
1938
+
1939
+ it 'id and _id are not the same' do
1940
+ expect(shirt.id).to eq(id)
1941
+ expect(shirt._id).not_to eq(id)
1942
+ end
1943
+ end
1944
+
1945
+ context 'update' do
1946
+ before do
1947
+ shirt.update(id: id)
1948
+ end
1949
+
1950
+ it 'updates id but not_id' do
1951
+ expect(shirt.id).to eq(id)
1952
+ expect(shirt._id).not_to eq(id)
1953
+ end
1954
+ end
1955
+
1956
+ context 'id=' do
1957
+ before do
1958
+ shirt.id = id
1959
+ end
1960
+
1961
+ it 'sets id and not _id' do
1962
+ expect(shirt.id).to eq(id)
1963
+ expect(shirt._id).not_to eq(id)
1964
+ end
1965
+ end
1966
+
1967
+ context 'id?' do
1968
+ context 'with null id' do
1969
+ it 'returns false' do
1970
+ expect(shirt.id?).to be false
1971
+ expect(shirt._id?).to be true
1972
+ end
1973
+ end
1974
+
1975
+ context 'with id' do
1976
+ before do
1977
+ shirt.id = id
1978
+ end
1979
+
1980
+ it 'returns true' do
1981
+ expect(shirt.id?).to be true
1982
+ end
1983
+ end
1984
+ end
1985
+ end
1986
+
1654
1987
  describe "#alias_attribute" do
1655
1988
 
1656
1989
  let(:product) do
@@ -47,6 +47,7 @@ describe Mongoid::Clients::Factory do
47
47
 
48
48
  before do
49
49
  Mongoid::Config.send(:clients=, config)
50
+ # TODO: We should restore overwritten configuration in after block
50
51
  end
51
52
 
52
53
  after do
@@ -124,6 +125,7 @@ describe Mongoid::Clients::Factory do
124
125
 
125
126
  before do
126
127
  Mongoid::Config.send(:clients=, config)
128
+ # TODO: We should restore overwritten configuration in after block
127
129
  end
128
130
 
129
131
  after do
@@ -168,6 +170,7 @@ describe Mongoid::Clients::Factory do
168
170
 
169
171
  before do
170
172
  Mongoid::Config.send(:clients=, config)
173
+ # TODO: We should restore overwritten configuration in after block
171
174
  end
172
175
 
173
176
  after do
@@ -206,6 +209,7 @@ describe Mongoid::Clients::Factory do
206
209
 
207
210
  before do
208
211
  Mongoid::Config.send(:clients=, config)
212
+ # TODO: We should restore overwritten configuration in after block
209
213
  end
210
214
 
211
215
  after do
@@ -253,6 +257,7 @@ describe Mongoid::Clients::Factory do
253
257
 
254
258
  before do
255
259
  Mongoid::Config.send(:clients=, config)
260
+ # TODO: We should restore overwritten configuration in after block
256
261
  end
257
262
 
258
263
  after do
@@ -284,6 +289,7 @@ describe Mongoid::Clients::Factory do
284
289
 
285
290
  before do
286
291
  Mongoid.clients[:default] = nil
292
+ # TODO: We should restore overwritten configuration in after block
287
293
  end
288
294
 
289
295
  it "raises NoClientsConfig error" do
@@ -300,6 +306,7 @@ describe Mongoid::Clients::Factory do
300
306
 
301
307
  before do
302
308
  Mongoid::Config.send(:clients=, config)
309
+ # TODO: We should restore overwritten configuration in after block
303
310
  end
304
311
 
305
312
  after do
@@ -342,6 +349,7 @@ describe Mongoid::Clients::Factory do
342
349
 
343
350
  before do
344
351
  Mongoid::Config.send(:clients=, config)
352
+ # TODO: We should restore overwritten configuration in after block
345
353
  end
346
354
 
347
355
  after do
@@ -378,4 +386,44 @@ describe Mongoid::Clients::Factory do
378
386
  expect(client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
379
387
  end
380
388
  end
389
+
390
+ context "unexpected config options" do
391
+ let(:unknown_opts) do
392
+ {
393
+ bad_one: 1,
394
+ another_one: "here"
395
+ }
396
+ end
397
+
398
+ let(:config) do
399
+ {
400
+ default: { hosts: SpecConfig.instance.addresses, database: database_id },
401
+ good_one: { hosts: [ "127.0.0.1:1234" ], database: database_id},
402
+ bad_one: { hosts: [ "127.0.0.1:1234" ], database: database_id}.merge(unknown_opts),
403
+ good_two: { uri: "mongodb://127.0.0.1:1234,127.0.0.1:5678/#{database_id}" },
404
+ bad_two: { uri: "mongodb://127.0.0.1:1234,127.0.0.1:5678/#{database_id}" }.merge(unknown_opts)
405
+ }
406
+ end
407
+
408
+ around(:each) do |example|
409
+ old_config = Mongoid::Config.clients
410
+ Mongoid::Config.send(:clients=, config)
411
+ example.run
412
+ Mongoid::Config.send(:clients=, old_config)
413
+ end
414
+
415
+ [:bad_one, :bad_two].each do |env|
416
+ it 'does not log a warning if none' do
417
+ expect(described_class.send(:default_logger)).not_to receive(:warn)
418
+ described_class.create(env).close
419
+ end
420
+ end
421
+
422
+ [:bad_one, :bad_two].each do |env|
423
+ it 'logs a warning if some' do
424
+ expect(described_class.send(:default_logger)).not_to receive(:warn)
425
+ described_class.create(env).close
426
+ end
427
+ end
428
+ end
381
429
  end
@@ -545,4 +545,36 @@ describe Mongoid::Config do
545
545
  expect(Mongoid::Config.log_level).to eq(2)
546
546
  end
547
547
  end
548
+
549
+ context "with an overridden database" do
550
+ let(:database) do
551
+ "test_purge_#{Time.now.to_i}"
552
+ end
553
+
554
+ before do
555
+ Mongoid.override_database(database)
556
+ end
557
+
558
+ after do
559
+ Mongoid.override_database(nil)
560
+ end
561
+
562
+ describe "#purge!" do
563
+ it 'respects persistence context overrides' do
564
+ House.create!(name: '1', model: 'Big')
565
+ expect(House.count).to eq(1)
566
+ Mongoid.purge!
567
+ expect(House.count).to eq(0)
568
+ end
569
+ end
570
+
571
+ describe "#truncate!" do
572
+ it 'respects persistence context overrides' do
573
+ House.create!(name: '1', model: 'Big')
574
+ expect(House.count).to eq(1)
575
+ Mongoid.truncate!
576
+ expect(House.count).to eq(0)
577
+ end
578
+ end
579
+ end
548
580
  end
@@ -753,12 +753,25 @@ describe Mongoid::Contextual::Atomic do
753
753
  context.set(name: "Recoil")
754
754
  end
755
755
 
756
- it "sets existing fields" do
757
- expect(depeche_mode.reload.name).to eq("Recoil")
756
+ shared_examples 'writes as expected' do
757
+ it "sets existing fields" do
758
+ expect(depeche_mode.reload.name).to eq("Recoil")
759
+ end
760
+
761
+ it "sets non existent fields" do
762
+ expect(smiths.reload.name).to eq("Recoil")
763
+ end
758
764
  end
759
765
 
760
- it "sets non existent fields" do
761
- expect(smiths.reload.name).to eq("Recoil")
766
+ include_examples 'writes as expected'
767
+
768
+ context 'when fields being set have been projected out' do
769
+
770
+ let(:criteria) do
771
+ Band.only(:genres)
772
+ end
773
+
774
+ include_examples 'writes as expected'
762
775
  end
763
776
  end
764
777
 
@@ -1442,8 +1442,8 @@ describe Mongoid::Contextual::Mongo do
1442
1442
  describe "##{method}" do
1443
1443
 
1444
1444
  before do
1445
- Band.create(name: "Depeche Mode")
1446
- Band.create(name: "New Order")
1445
+ Band.create!(name: "Depeche Mode")
1446
+ Band.create!(name: "New Order")
1447
1447
  end
1448
1448
 
1449
1449
  context "when the criteria has a limit" do
@@ -705,7 +705,7 @@ describe Mongoid::Criteria::Modifiable do
705
705
  end
706
706
 
707
707
  it 'uses the values from the attributes' do
708
- expect(document.map).to eq({ foo: :bar })
708
+ expect(document.map).to eq('foo' => :bar )
709
709
  end
710
710
  end
711
711
 
@@ -9,79 +9,6 @@ describe Mongoid::Criteria::Queryable::Expandable do
9
9
  Mongoid::Query.new
10
10
  end
11
11
 
12
- describe '#expand_condition' do
13
-
14
- let(:expanded) do
15
- query.send(:expand_condition, condition)
16
- end
17
-
18
- context 'field name => value' do
19
- shared_examples_for 'expands' do
20
-
21
- it 'expands' do
22
- expanded.should == {'foo' => 'bar'}
23
- end
24
- end
25
-
26
- context 'string key' do
27
- let(:condition) do
28
- {'foo' => 'bar'}
29
- end
30
-
31
- it_behaves_like 'expands'
32
- end
33
-
34
- context 'symbol key' do
35
- let(:condition) do
36
- {foo: 'bar'}
37
- end
38
-
39
- it_behaves_like 'expands'
40
- end
41
- end
42
-
43
- context 'Key instance => value' do
44
- let(:key) do
45
- Mongoid::Criteria::Queryable::Key.new(:foo, :__override__, '$gt')
46
- end
47
-
48
- let(:condition) do
49
- {key => 'bar'}
50
- end
51
-
52
- it 'expands' do
53
- expanded.should == {'foo' => {'$gt' => 'bar'}}
54
- end
55
- end
56
-
57
- =begin
58
- context 'operator => operator value expression' do
59
- shared_examples_for 'expands' do
60
-
61
- it 'expands' do
62
- expanded.should == {'foo' => 'bar'}
63
- end
64
- end
65
-
66
- context 'string key' do
67
- let(:condition) do
68
- {'$in' => %w(bar)}
69
- end
70
-
71
- it_behaves_like 'expands'
72
- end
73
-
74
- context 'symbol key' do
75
- let(:condition) do
76
- {:$in => %w(bar)}
77
- end
78
-
79
- it_behaves_like 'expands'
80
- end
81
- end
82
- =end
83
- end
84
-
85
12
  describe '#expand_condition_to_array_values' do
86
13
  shared_examples_for 'expands' do
87
14
 
@@ -3,7 +3,7 @@
3
3
 
4
4
  require "spec_helper"
5
5
 
6
- describe Boolean do
6
+ describe Mongoid::Boolean do
7
7
 
8
8
  describe ".evolve" do
9
9