mongoid 7.5.4 → 8.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (298) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +0 -25
  5. data/lib/config/locales/en.yml +46 -30
  6. data/lib/mongoid/association/accessors.rb +32 -3
  7. data/lib/mongoid/association/bindable.rb +48 -0
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  11. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  12. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  14. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  15. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  16. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  17. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  18. data/lib/mongoid/association/macros.rb +2 -1
  19. data/lib/mongoid/association/many.rb +5 -0
  20. data/lib/mongoid/association/nested/many.rb +2 -1
  21. data/lib/mongoid/association/proxy.rb +12 -0
  22. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  23. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  24. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  25. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  26. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  28. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  29. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  30. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  31. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  32. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  33. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  34. data/lib/mongoid/association/relatable.rb +38 -4
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/cacheable.rb +2 -2
  38. data/lib/mongoid/changeable.rb +37 -2
  39. data/lib/mongoid/clients/options.rb +4 -0
  40. data/lib/mongoid/clients/sessions.rb +2 -14
  41. data/lib/mongoid/config.rb +15 -11
  42. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  43. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  44. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  45. data/lib/mongoid/contextual/memory.rb +55 -28
  46. data/lib/mongoid/contextual/mongo.rb +173 -262
  47. data/lib/mongoid/contextual/none.rb +33 -15
  48. data/lib/mongoid/copyable.rb +32 -8
  49. data/lib/mongoid/criteria/includable.rb +24 -20
  50. data/lib/mongoid/criteria/marshalable.rb +10 -2
  51. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  52. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  53. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  54. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  57. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  58. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  59. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  60. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  62. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  65. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  66. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  67. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  68. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  69. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  70. data/lib/mongoid/criteria/queryable.rb +11 -6
  71. data/lib/mongoid/criteria.rb +1 -28
  72. data/lib/mongoid/deprecable.rb +36 -0
  73. data/lib/mongoid/deprecation.rb +25 -0
  74. data/lib/mongoid/document.rb +88 -33
  75. data/lib/mongoid/equality.rb +4 -4
  76. data/lib/mongoid/errors/document_not_found.rb +6 -2
  77. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  78. data/lib/mongoid/errors/invalid_field.rb +5 -1
  79. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  81. data/lib/mongoid/errors.rb +2 -2
  82. data/lib/mongoid/extensions/array.rb +8 -6
  83. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  84. data/lib/mongoid/extensions/binary.rb +42 -0
  85. data/lib/mongoid/extensions/boolean.rb +8 -2
  86. data/lib/mongoid/extensions/date.rb +26 -20
  87. data/lib/mongoid/extensions/date_time.rb +1 -1
  88. data/lib/mongoid/extensions/float.rb +4 -5
  89. data/lib/mongoid/extensions/hash.rb +12 -5
  90. data/lib/mongoid/extensions/integer.rb +4 -5
  91. data/lib/mongoid/extensions/object.rb +2 -0
  92. data/lib/mongoid/extensions/range.rb +41 -10
  93. data/lib/mongoid/extensions/regexp.rb +11 -4
  94. data/lib/mongoid/extensions/set.rb +11 -4
  95. data/lib/mongoid/extensions/string.rb +2 -13
  96. data/lib/mongoid/extensions/symbol.rb +3 -14
  97. data/lib/mongoid/extensions/time.rb +27 -16
  98. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  99. data/lib/mongoid/extensions.rb +1 -0
  100. data/lib/mongoid/factory.rb +42 -7
  101. data/lib/mongoid/fields/foreign_key.rb +7 -0
  102. data/lib/mongoid/fields/validators/macro.rb +3 -9
  103. data/lib/mongoid/fields.rb +49 -7
  104. data/lib/mongoid/findable.rb +21 -16
  105. data/lib/mongoid/indexable/specification.rb +1 -1
  106. data/lib/mongoid/indexable/validators/options.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +69 -9
  108. data/lib/mongoid/persistable/creatable.rb +14 -5
  109. data/lib/mongoid/persistable/updatable.rb +12 -5
  110. data/lib/mongoid/persistence_context.rb +8 -42
  111. data/lib/mongoid/query_cache.rb +6 -258
  112. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  113. data/lib/mongoid/reloadable.rb +7 -3
  114. data/lib/mongoid/scopable.rb +9 -11
  115. data/lib/mongoid/selectable.rb +1 -2
  116. data/lib/mongoid/shardable.rb +11 -35
  117. data/lib/mongoid/stateful.rb +27 -1
  118. data/lib/mongoid/timestamps/created.rb +1 -1
  119. data/lib/mongoid/timestamps/updated.rb +1 -1
  120. data/lib/mongoid/touchable.rb +2 -3
  121. data/lib/mongoid/traversable.rb +1 -0
  122. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  123. data/lib/mongoid/version.rb +1 -1
  124. data/lib/mongoid/warnings.rb +3 -4
  125. data/lib/mongoid.rb +1 -0
  126. data/spec/config/mongoid.yml +16 -0
  127. data/spec/integration/app_spec.rb +8 -12
  128. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  129. data/spec/integration/associations/embedded_spec.rb +15 -0
  130. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  131. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  132. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  133. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  134. data/spec/integration/associations/has_one_spec.rb +97 -1
  135. data/spec/integration/associations/scope_option_spec.rb +1 -1
  136. data/spec/integration/callbacks_models.rb +95 -1
  137. data/spec/integration/callbacks_spec.rb +226 -4
  138. data/spec/integration/criteria/range_spec.rb +95 -1
  139. data/spec/integration/discriminator_key_spec.rb +115 -76
  140. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  141. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  142. data/spec/integration/matcher_examples_spec.rb +20 -13
  143. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  144. data/spec/integration/matcher_operator_spec.rb +3 -5
  145. data/spec/integration/persistence/range_field_spec.rb +350 -0
  146. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  147. data/spec/mongoid/association/depending_spec.rb +9 -9
  148. data/spec/mongoid/association/eager_spec.rb +2 -1
  149. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  150. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  151. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  152. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  153. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  154. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  155. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  156. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  157. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  158. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  159. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  160. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  161. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  162. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  163. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  164. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  165. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  166. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  167. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  168. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  169. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  170. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  171. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  172. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  173. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  174. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  175. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  176. data/spec/mongoid/association/syncable_spec.rb +14 -0
  177. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  178. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  179. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  180. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  181. data/spec/mongoid/attributes_spec.rb +480 -27
  182. data/spec/mongoid/cacheable_spec.rb +3 -3
  183. data/spec/mongoid/changeable_spec.rb +130 -13
  184. data/spec/mongoid/clients/factory_spec.rb +23 -30
  185. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  186. data/spec/mongoid/clients_spec.rb +2 -2
  187. data/spec/mongoid/config_spec.rb +52 -14
  188. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  189. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  190. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  191. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  192. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  193. data/spec/mongoid/contextual/mongo_spec.rb +566 -416
  194. data/spec/mongoid/contextual/none_spec.rb +11 -19
  195. data/spec/mongoid/copyable_spec.rb +451 -1
  196. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  197. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  198. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  199. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  200. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  201. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  202. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  203. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  204. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  205. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  206. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  207. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  208. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  209. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  210. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  211. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  212. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  213. data/spec/mongoid/criteria_spec.rb +469 -1201
  214. data/spec/mongoid/document_fields_spec.rb +173 -24
  215. data/spec/mongoid/document_spec.rb +32 -41
  216. data/spec/mongoid/equality_spec.rb +12 -12
  217. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  218. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  219. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  220. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  221. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  222. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  223. data/spec/mongoid/extensions/array_spec.rb +16 -2
  224. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  225. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  226. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  227. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  228. data/spec/mongoid/extensions/date_spec.rb +71 -1
  229. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  230. data/spec/mongoid/extensions/float_spec.rb +48 -76
  231. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  232. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  233. data/spec/mongoid/extensions/range_spec.rb +255 -54
  234. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  235. data/spec/mongoid/extensions/set_spec.rb +106 -0
  236. data/spec/mongoid/extensions/string_spec.rb +53 -25
  237. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  238. data/spec/mongoid/extensions/time_spec.rb +634 -66
  239. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  240. data/spec/mongoid/factory_spec.rb +61 -1
  241. data/spec/mongoid/fields_spec.rb +321 -50
  242. data/spec/mongoid/findable_spec.rb +64 -29
  243. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  244. data/spec/mongoid/indexable_spec.rb +16 -19
  245. data/spec/mongoid/interceptable_spec.rb +584 -5
  246. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  247. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  248. data/spec/mongoid/mongoizable_spec.rb +285 -0
  249. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  250. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  251. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  252. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  253. data/spec/mongoid/persistence_context_spec.rb +24 -0
  254. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  255. data/spec/mongoid/query_cache_spec.rb +0 -154
  256. data/spec/mongoid/reloadable_spec.rb +35 -2
  257. data/spec/mongoid/scopable_spec.rb +36 -34
  258. data/spec/mongoid/shardable_models.rb +0 -14
  259. data/spec/mongoid/shardable_spec.rb +61 -153
  260. data/spec/mongoid/stateful_spec.rb +28 -0
  261. data/spec/mongoid/timestamps_spec.rb +390 -0
  262. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  263. data/spec/mongoid/touchable_spec.rb +116 -0
  264. data/spec/mongoid/touchable_spec_models.rb +12 -8
  265. data/spec/mongoid/traversable_spec.rb +4 -11
  266. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  267. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  268. data/spec/mongoid/warnings_spec.rb +35 -0
  269. data/spec/mongoid_spec.rb +1 -7
  270. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  271. data/spec/rails/mongoid_spec.rb +4 -16
  272. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  273. data/spec/shared/lib/mrss/lite_constraints.rb +0 -8
  274. data/spec/shared/shlib/server.sh +5 -5
  275. data/spec/support/constraints.rb +24 -0
  276. data/spec/support/macros.rb +30 -0
  277. data/spec/support/models/augmentation.rb +12 -0
  278. data/spec/support/models/band.rb +3 -0
  279. data/spec/support/models/catalog.rb +24 -0
  280. data/spec/support/models/circus.rb +3 -0
  281. data/spec/support/models/fanatic.rb +8 -0
  282. data/spec/support/models/implant.rb +9 -0
  283. data/spec/support/models/label.rb +2 -0
  284. data/spec/support/models/passport.rb +9 -0
  285. data/spec/support/models/person.rb +1 -0
  286. data/spec/support/models/player.rb +2 -0
  287. data/spec/support/models/powerup.rb +12 -0
  288. data/spec/support/models/registry.rb +1 -0
  289. data/spec/support/models/school.rb +14 -0
  290. data/spec/support/models/shield.rb +18 -0
  291. data/spec/support/models/student.rb +14 -0
  292. data/spec/support/models/weapon.rb +12 -0
  293. data.tar.gz.sig +0 -0
  294. metadata +689 -657
  295. metadata.gz.sig +0 -0
  296. data/lib/mongoid/errors/eager_load.rb +0 -23
  297. data/lib/mongoid/errors/invalid_value.rb +0 -17
  298. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -555,6 +555,56 @@ describe Mongoid::Changeable do
555
555
  end
556
556
  end
557
557
 
558
+ describe '#attribute_previously_was' do
559
+ let(:previous_title) do
560
+ "Grand Poobah"
561
+ end
562
+
563
+ let(:age) do
564
+ 10
565
+ end
566
+
567
+ let(:person) do
568
+ Person.create!(title: previous_title, age: age)
569
+ end
570
+
571
+ let(:updated_title) do
572
+ "Captain Obvious"
573
+ end
574
+
575
+ before do
576
+ person.title = updated_title
577
+ person.save!
578
+ end
579
+
580
+ context 'when attribute changed' do
581
+ it "returns the old value" do
582
+ expect(person.send(:attribute_previously_was, "title")).to eq(previous_title)
583
+ end
584
+
585
+ it "allows access via (attribute)_was" do
586
+ expect(person.title_previously_was).to eq(previous_title)
587
+ end
588
+ end
589
+
590
+ context 'when attribute did not change' do
591
+ it "returns the same value" do
592
+ expect(person.send(:attribute_previously_was, "age")).to eq(age)
593
+ end
594
+
595
+ it "allows access via (attribute)_was" do
596
+ expect(person.age_previously_was).to eq(age)
597
+ end
598
+ end
599
+
600
+ it 'clears after reload' do
601
+ person.reload
602
+ expect(person.title_previously_was).to be_nil
603
+ expect(person.age_previously_was).to be_nil
604
+ end
605
+
606
+ end
607
+
558
608
  describe "#attribute_will_change!" do
559
609
 
560
610
  let(:aliases) do
@@ -962,12 +1012,69 @@ describe Mongoid::Changeable do
962
1012
  person.user_accounts << user_account
963
1013
  end
964
1014
 
965
- it 'returns a hash of changes' do
966
- pending 'https://jira.mongodb.org/browse/MONGOID-4843'
1015
+ it 'should not add to the changes or changed_attributes hash' do
1016
+ person.changes.should == {}
1017
+ person.changed_attributes.should == {}
1018
+ end
1019
+ end
1020
+
1021
+ context 'when habtm association _ids changes' do
967
1022
 
968
- person.changes.should == {
969
- user_account_ids: [[], [user_account.id]]
970
- }
1023
+ let(:person) do
1024
+ Person.create!(title: "Grand Poobah")
1025
+ end
1026
+
1027
+ let(:user_account) do
1028
+ UserAccount.create!
1029
+ end
1030
+
1031
+ before do
1032
+ person.user_account_ids << user_account._id
1033
+ end
1034
+
1035
+ it 'should add to the changes or changed_attributes hash' do
1036
+ person.changes.should == { "user_account_ids" => [ nil, [ user_account._id ] ] }
1037
+ person.changed_attributes.should == { "user_account_ids" => nil }
1038
+ end
1039
+ end
1040
+
1041
+ context 'when assigning empty list to habtm association' do
1042
+
1043
+ let(:person) do
1044
+ Person.create!(title: "Grand Poobah", user_accounts: [user_account])
1045
+ end
1046
+
1047
+ let(:user_account) do
1048
+ UserAccount.create!
1049
+ end
1050
+
1051
+ before do
1052
+ person.user_accounts = []
1053
+ end
1054
+
1055
+ it 'should not add to the changes or changed_attributes hash' do
1056
+ person.changes.should == {}
1057
+ person.changed_attributes.should == {}
1058
+ end
1059
+ end
1060
+
1061
+ context 'when assigning empty list to habtm association _ids' do
1062
+
1063
+ let(:person) do
1064
+ Person.create!(title: "Grand Poobah", user_accounts: [user_account])
1065
+ end
1066
+
1067
+ let(:user_account) do
1068
+ UserAccount.create!
1069
+ end
1070
+
1071
+ before do
1072
+ person.user_account_ids = []
1073
+ end
1074
+
1075
+ it 'should not add to the changes or changed_attributes hash' do
1076
+ person.changes.should == { "user_account_ids" => [ [ user_account._id ], [] ] }
1077
+ person.changed_attributes.should == { "user_account_ids" => [ user_account._id ] }
971
1078
  end
972
1079
  end
973
1080
 
@@ -1649,21 +1756,26 @@ describe Mongoid::Changeable do
1649
1756
 
1650
1757
  before do
1651
1758
  Acolyte.set_callback(:save, :after, if: :callback_test?) do |doc|
1652
- doc[:changed_in_callback] = doc.changes.dup
1759
+ doc[:changed_in_after_callback] = doc.changes.dup
1760
+ end
1761
+
1762
+ Acolyte.set_callback(:save, :before, if: :callback_test?) do |doc|
1763
+ doc[:changed_in_before_callback] = doc.changes.dup
1653
1764
  end
1654
1765
  end
1655
1766
 
1656
1767
  after do
1657
1768
  Acolyte._save_callbacks.select do |callback|
1658
- callback.kind == :after
1769
+ [:before, :after].include?(callback.kind)
1659
1770
  end.each do |callback|
1660
1771
  Acolyte._save_callbacks.delete(callback)
1661
1772
  end
1662
1773
  end
1663
1774
 
1664
- it "retains the changes until after all callbacks" do
1775
+ it "does not retain the changes until after all callbacks" do
1665
1776
  acolyte.update_attribute(:status, "testing")
1666
- expect(acolyte.changed_in_callback).to eq({ "status" => [ nil, "testing" ] })
1777
+ expect(acolyte.changed_in_before_callback).to eq({"status"=>[nil, "testing"]})
1778
+ expect(acolyte.changed_in_after_callback).to eq({ })
1667
1779
  end
1668
1780
  end
1669
1781
 
@@ -1675,21 +1787,26 @@ describe Mongoid::Changeable do
1675
1787
 
1676
1788
  before do
1677
1789
  Acolyte.set_callback(:save, :after, if: :callback_test?) do |doc|
1678
- doc[:changed_in_callback] = doc.changes.dup
1790
+ doc[:changed_after_in_callback] = doc.changes.dup
1791
+ end
1792
+
1793
+ Acolyte.set_callback(:save, :before, if: :callback_test?) do |doc|
1794
+ doc[:changed_before_in_callback] = doc.changes.dup
1679
1795
  end
1680
1796
  end
1681
1797
 
1682
1798
  after do
1683
1799
  Acolyte._save_callbacks.select do |callback|
1684
- callback.kind == :after
1800
+ [:before, :after].include?(callback.kind)
1685
1801
  end.each do |callback|
1686
1802
  Acolyte._save_callbacks.delete(callback)
1687
1803
  end
1688
1804
  end
1689
1805
 
1690
- it "retains the changes until after all callbacks" do
1806
+ it "does not retain the changes until after all callbacks" do
1691
1807
  acolyte.save!
1692
- expect(acolyte.changed_in_callback["name"]).to eq([ nil, "callback-test" ])
1808
+ expect(acolyte.changed_before_in_callback["name"]).to eq([ nil, "callback-test" ])
1809
+ expect(acolyte.changed_after_in_callback["name"]).to be_nil
1693
1810
  end
1694
1811
  end
1695
1812
  end
@@ -65,10 +65,7 @@ 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
68
+ context 'on driver versions that do not report spurious EOF errors' do
72
69
 
73
70
  it 'does not produce driver warnings' do
74
71
  Mongo::Logger.logger.should_not receive(:warn)
@@ -86,35 +83,31 @@ describe Mongoid::Clients::Factory do
86
83
  expect(client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
87
84
  end
88
85
 
89
- context 'driver 2.13+' do
90
- min_driver_version '2.13'
86
+ it 'sets Mongoid as a wrapping library' do
87
+ client.options[:wrapping_libraries].should == [BSON::Document.new(
88
+ Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY)]
89
+ end
91
90
 
92
- it 'sets Mongoid as a wrapping library' do
93
- client.options[:wrapping_libraries].should == [BSON::Document.new(
94
- Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY)]
95
- end
91
+ context 'when configuration specifies a wrapping library' do
96
92
 
97
- context 'when configuration specifies a wrapping library' do
98
-
99
- let(:config) do
100
- {
101
- default: { hosts: SpecConfig.instance.addresses, database: database_id },
102
- analytics: {
103
- hosts: SpecConfig.instance.addresses,
104
- database: database_id,
105
- options: {
106
- wrapping_libraries: [{name: 'Foo'}],
107
- },
108
- }
93
+ let(:config) do
94
+ {
95
+ default: { hosts: SpecConfig.instance.addresses, database: database_id },
96
+ analytics: {
97
+ hosts: SpecConfig.instance.addresses,
98
+ database: database_id,
99
+ options: {
100
+ wrapping_libraries: [{name: 'Foo'}],
101
+ },
109
102
  }
110
- end
111
-
112
- it 'adds Mongoid as another wrapping library' do
113
- client.options[:wrapping_libraries].should == [
114
- BSON::Document.new(Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY),
115
- {'name' => 'Foo'},
116
- ]
117
- end
103
+ }
104
+ end
105
+
106
+ it 'adds Mongoid as another wrapping library' do
107
+ client.options[:wrapping_libraries].should == [
108
+ BSON::Document.new(Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY),
109
+ {'name' => 'Foo'},
110
+ ]
118
111
  end
119
112
  end
120
113
  end
@@ -166,25 +166,6 @@ describe Mongoid::Clients::Sessions do
166
166
  end
167
167
  end
168
168
  end
169
-
170
- context 'when sessions are not supported' do
171
- max_server_version '3.4'
172
-
173
- let!(:error) do
174
- e = nil
175
- begin
176
- Person.with_session {}
177
- rescue => ex
178
- e = ex
179
- end
180
- e
181
- end
182
-
183
- it 'raises a sessions not supported error' do
184
- expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
185
- expect(error.message).to include('not supported')
186
- end
187
- end
188
169
  end
189
170
 
190
171
  context 'when a session is used on a model instance' do
@@ -312,24 +293,5 @@ describe Mongoid::Clients::Sessions do
312
293
  end
313
294
  end
314
295
  end
315
-
316
- context 'when sessions are not supported' do
317
- max_server_version '3.4'
318
-
319
- let!(:error) do
320
- e = nil
321
- begin
322
- person.with_session {}
323
- rescue => ex
324
- e = ex
325
- end
326
- e
327
- end
328
-
329
- it 'raises a sessions not supported error' do
330
- expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
331
- expect(error.message).to include('not supported')
332
- end
333
- end
334
296
  end
335
297
  end
@@ -802,7 +802,7 @@ describe Mongoid::Clients do
802
802
  it "does not persist to the default database" do
803
803
  expect {
804
804
  Band.find(band.id)
805
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
805
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Band with id\(s\)/)
806
806
  end
807
807
 
808
808
  let(:from_db) do
@@ -840,7 +840,7 @@ describe Mongoid::Clients do
840
840
  it "does not persist to the default database" do
841
841
  expect {
842
842
  Band.find(band.id)
843
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
843
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Band with id\(s\)/)
844
844
  end
845
845
 
846
846
  let(:from_db) do
@@ -265,79 +265,86 @@ describe Mongoid::Config do
265
265
  end
266
266
  end
267
267
 
268
+ context 'when setting the map_big_decimal_to_decimal128 option in the config' do
269
+ let(:option) { :map_big_decimal_to_decimal128 }
270
+ let(:default) { true }
271
+
272
+ it_behaves_like "a config option"
273
+ end
274
+
268
275
  context 'when setting the broken_updates option in the config' do
269
276
  let(:option) { :broken_updates }
270
- let(:default) { true }
277
+ let(:default) { false }
271
278
 
272
279
  it_behaves_like "a config option"
273
280
  end
274
281
 
275
282
  context 'when setting the legacy_triple_equals option in the config' do
276
283
  let(:option) { :legacy_triple_equals }
277
- let(:default) { true }
284
+ let(:default) { false }
278
285
 
279
286
  it_behaves_like "a config option"
280
287
  end
281
288
 
282
289
  context 'when setting the broken_scoping option in the config' do
283
290
  let(:option) { :broken_scoping }
284
- let(:default) { true }
291
+ let(:default) { false }
285
292
 
286
293
  it_behaves_like "a config option"
287
294
  end
288
295
 
289
296
  context 'when setting the broken_aggregables option in the config' do
290
297
  let(:option) { :broken_aggregables }
291
- let(:default) { true }
298
+ let(:default) { false }
292
299
 
293
300
  it_behaves_like "a config option"
294
301
  end
295
302
 
296
303
  context 'when setting the broken_alias_handling option in the config' do
297
304
  let(:option) { :broken_alias_handling }
298
- let(:default) { true }
305
+ let(:default) { false }
299
306
 
300
307
  it_behaves_like "a config option"
301
308
  end
302
309
 
303
310
  context 'when setting the broken_and option in the config' do
304
311
  let(:option) { :broken_and }
305
- let(:default) { true }
312
+ let(:default) { false }
306
313
 
307
314
  it_behaves_like "a config option"
308
315
  end
309
316
 
310
317
  context 'when setting the compare_time_by_ms option in the config' do
311
318
  let(:option) { :compare_time_by_ms }
312
- let(:default) { false }
319
+ let(:default) { true }
313
320
 
314
321
  it_behaves_like "a config option"
315
322
  end
316
323
 
317
324
  context 'when setting the object_id_as_json_oid option in the config' do
318
325
  let(:option) { :object_id_as_json_oid }
319
- let(:default) { true }
326
+ let(:default) { false }
320
327
 
321
328
  it_behaves_like "a config option"
322
329
  end
323
330
 
324
331
  context 'when setting the legacy_pluck_distinct option in the config' do
325
332
  let(:option) { :legacy_pluck_distinct }
326
- let(:default) { true }
333
+ let(:default) { false }
327
334
 
328
335
  it_behaves_like "a config option"
329
336
  end
330
337
 
331
338
  context 'when setting the overwrite_chained_operators option in the config' do
332
339
  let(:option) { :overwrite_chained_operators }
333
- let(:default) { true }
340
+ let(:default) { false }
334
341
 
335
342
  it_behaves_like "a config option"
336
343
  end
337
344
 
338
345
  context 'when setting the legacy_attributes option in the config' do
339
346
  let(:option) { :legacy_attributes }
340
- let(:default) { true }
347
+ let(:default) { false }
341
348
 
342
349
  it_behaves_like "a config option"
343
350
  end
@@ -462,6 +469,40 @@ describe Mongoid::Config do
462
469
  end
463
470
  end
464
471
 
472
+ context "when provided an environment with driver options" do
473
+
474
+ before do
475
+ described_class.load!(file, :test)
476
+ end
477
+
478
+ after do
479
+ described_class.reset
480
+ end
481
+
482
+ it "sets the Mongo.broken_view_options option" do
483
+ expect(Mongo.broken_view_options).to eq(false)
484
+ end
485
+
486
+ it "does not override the unset Mongo.validate_update_replace option" do
487
+ expect(Mongo.validate_update_replace).to eq(false)
488
+ end
489
+ end
490
+
491
+ context "when provided an environment with a nil driver option" do
492
+
493
+ before do
494
+ described_class.load!(file, :test_nil)
495
+ end
496
+
497
+ after do
498
+ described_class.reset
499
+ end
500
+
501
+ it "sets the Mongo.broken_view_options option to nil" do
502
+ expect(Mongo.broken_view_options).to be_nil
503
+ end
504
+ end
505
+
465
506
  context "when the rack environment is set" do
466
507
 
467
508
  before do
@@ -556,9 +597,6 @@ describe Mongoid::Config do
556
597
 
557
598
  let(:client) { Mongoid.default_client }
558
599
 
559
- # Wrapping libraries are only recognized by driver 2.13.0+.
560
- min_driver_version '2.13'
561
-
562
600
  it 'passes uuid to driver' do
563
601
  Mongo::Client.should receive(:new).with(SpecConfig.instance.addresses,
564
602
  auto_encryption_options: {