mongoid 5.4.1 → 6.0.0.beta

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 (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -19,7 +19,9 @@ describe Mongoid::Relations::Proxy do
19
19
 
20
20
  it 'uses the new persistence options' do
21
21
  expect {
22
- animal.with(write: { w: 100 }).update_attribute(:name, 'kangaroo')
22
+ animal.with(write: { w: 100 }) do |an|
23
+ an.update_attribute(:name, 'kangaroo')
24
+ end
23
25
  }.to raise_exception(Mongo::Error::OperationFailure)
24
26
  end
25
27
  end
@@ -264,6 +264,44 @@ describe Mongoid::Relations::Referenced::In do
264
264
 
265
265
  context "when the relation is not polymorphic" do
266
266
 
267
+ context 'when the child has persistence options set' do
268
+
269
+ let(:person) do
270
+ Person.new
271
+ end
272
+
273
+ let(:post) do
274
+ Post.new
275
+ end
276
+
277
+ before do
278
+ post.with(collection: 'other-posts') do |p|
279
+ person.with(collection: 'other-people') do |per|
280
+ p.person = person
281
+ per.save
282
+ p.save
283
+ end
284
+ end
285
+ end
286
+
287
+ let(:other_people_count) do
288
+ Person.with(collection: 'other-people') do |person_class|
289
+ person_class.count
290
+ end
291
+ end
292
+
293
+ let(:other_posts_count) do
294
+ Post.with(collection: 'other-posts') do |post_class|
295
+ post_class.count
296
+ end
297
+ end
298
+
299
+ it 'applies the persistence options when saving the child' do
300
+ expect(other_people_count).to eq(1)
301
+ expect(other_posts_count).to eq(1)
302
+ end
303
+ end
304
+
267
305
  context "when the child is a new record" do
268
306
 
269
307
  let(:person) do
@@ -1028,7 +1066,9 @@ describe Mongoid::Relations::Referenced::In do
1028
1066
  :index,
1029
1067
  :polymorphic,
1030
1068
  :primary_key,
1031
- :touch
1069
+ :touch,
1070
+ :optional,
1071
+ :required
1032
1072
  ]
1033
1073
  )
1034
1074
  end
@@ -2936,17 +2936,6 @@ describe Mongoid::Relations::Referenced::Many do
2936
2936
  end
2937
2937
  end
2938
2938
 
2939
- context 'when providing a collation', if: collation_supported? do
2940
-
2941
- let(:posts) do
2942
- person.posts.where(title: "FIRST").collation(locale: 'en_US', strength: 2)
2943
- end
2944
-
2945
- it "applies the collation option to the query" do
2946
- expect(posts).to eq([ post_one ])
2947
- end
2948
- end
2949
-
2950
2939
  context "when providing a criteria class method" do
2951
2940
 
2952
2941
  let(:posts) do
@@ -3504,12 +3493,10 @@ describe Mongoid::Relations::Referenced::Many do
3504
3493
 
3505
3494
  before do
3506
3495
  expect(artist).to receive(:before_add_album).and_raise
3496
+ begin; artist.albums << album; rescue; end
3507
3497
  end
3508
3498
 
3509
3499
  it "does not add the document to the relation" do
3510
- expect {
3511
- artist.albums << album
3512
- }.to raise_error
3513
3500
  expect(artist.albums).to be_empty
3514
3501
  end
3515
3502
  end
@@ -3534,12 +3521,10 @@ describe Mongoid::Relations::Referenced::Many do
3534
3521
 
3535
3522
  before do
3536
3523
  expect(artist).to receive(:after_add_album).and_raise
3524
+ begin; artist.albums << album; rescue; end
3537
3525
  end
3538
3526
 
3539
3527
  it "adds the document to the relation" do
3540
- expect {
3541
- artist.albums << album
3542
- }.to raise_error
3543
3528
  expect(artist.albums).to eq([ album ])
3544
3529
  end
3545
3530
  end
@@ -3618,9 +3603,7 @@ describe Mongoid::Relations::Referenced::Many do
3618
3603
  describe "#delete" do
3619
3604
 
3620
3605
  before do
3621
- expect {
3622
- artist.albums.delete album
3623
- }.to raise_error
3606
+ begin; artist.albums.delete(album); rescue; end
3624
3607
  end
3625
3608
 
3626
3609
  it "does not remove the document from the relation" do
@@ -3631,9 +3614,7 @@ describe Mongoid::Relations::Referenced::Many do
3631
3614
  describe "#clear" do
3632
3615
 
3633
3616
  before do
3634
- expect {
3635
- artist.albums.clear
3636
- }.to raise_error
3617
+ begin; artist.albums.clear; rescue; end
3637
3618
  end
3638
3619
 
3639
3620
  it "does not clear the relation" do
@@ -3693,9 +3674,7 @@ describe Mongoid::Relations::Referenced::Many do
3693
3674
  describe "#delete" do
3694
3675
 
3695
3676
  before do
3696
- expect {
3697
- artist.albums.delete album
3698
- }.to raise_error
3677
+ begin; artist.albums.delete(album); rescue; end
3699
3678
  end
3700
3679
 
3701
3680
  it "removes the documents from the relation" do
@@ -3706,9 +3685,7 @@ describe Mongoid::Relations::Referenced::Many do
3706
3685
  describe "#clear" do
3707
3686
 
3708
3687
  before do
3709
- expect {
3710
- artist.albums.clear
3711
- }.to raise_error
3688
+ begin; artist.albums.clear; rescue; end
3712
3689
  end
3713
3690
 
3714
3691
  it "removes the documents from the relation" do
@@ -516,12 +516,10 @@ describe Mongoid::Relations::Referenced::ManyToMany do
516
516
 
517
517
  before do
518
518
  expect(post).to receive(:before_add_tag).and_raise
519
+ begin; post.tags.send(method, tag); rescue; end;
519
520
  end
520
521
 
521
522
  it "does not add the document to the relation" do
522
- expect {
523
- post.tags.send(method, tag)
524
- }.to raise_error
525
523
  expect(post.tags).to be_empty
526
524
  end
527
525
  end
@@ -538,12 +536,10 @@ describe Mongoid::Relations::Referenced::ManyToMany do
538
536
 
539
537
  before do
540
538
  expect(post).to receive(:after_add_tag).and_raise
539
+ begin; post.tags.send(method, tag); rescue; end
541
540
  end
542
541
 
543
542
  it "adds the document to the relation" do
544
- expect {
545
- post.tags.send(method, tag)
546
- }.to raise_error
547
543
  expect(post.tags).to eq([ tag ])
548
544
  end
549
545
  end
@@ -1186,12 +1182,10 @@ describe Mongoid::Relations::Referenced::ManyToMany do
1186
1182
 
1187
1183
  before do
1188
1184
  expect(post).to receive(:before_remove_tag).and_raise
1185
+ begin; post.tags.clear; rescue; end
1189
1186
  end
1190
1187
 
1191
1188
  it "does not remove the document from the relation" do
1192
- expect {
1193
- post.tags.clear
1194
- }.to raise_error
1195
1189
  expect(post.tags).to eq([ tag ])
1196
1190
  end
1197
1191
  end
@@ -1218,12 +1212,10 @@ describe Mongoid::Relations::Referenced::ManyToMany do
1218
1212
 
1219
1213
  before do
1220
1214
  expect(post).to receive(:after_remove_tag).and_raise
1215
+ begin; post.tags.clear; rescue; end
1221
1216
  end
1222
1217
 
1223
1218
  it "removes the document from the relation" do
1224
- expect {
1225
- post.tags.clear
1226
- }.to raise_error
1227
1219
  expect(post.tags).to be_empty
1228
1220
  end
1229
1221
  end
@@ -2120,12 +2112,10 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2120
2112
 
2121
2113
  before do
2122
2114
  expect(post).to receive(:before_remove_tag).and_raise
2115
+ begin; post.tags.delete(tag); rescue; end
2123
2116
  end
2124
2117
 
2125
2118
  it "does not remove the document from the relation" do
2126
- expect {
2127
- post.tags.delete tag
2128
- }.to raise_error
2129
2119
  expect(post.tags).to eq([ tag ])
2130
2120
  end
2131
2121
  end
@@ -2152,12 +2142,10 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2152
2142
 
2153
2143
  before do
2154
2144
  expect(post).to receive(:after_remove_tag).and_raise
2145
+ begin; post.tags.delete(tag); rescue; end
2155
2146
  end
2156
2147
 
2157
2148
  it "removes the document from the relation" do
2158
- expect {
2159
- post.tags.delete(tag)
2160
- }.to raise_error
2161
2149
  expect(post.tags).to be_empty
2162
2150
  end
2163
2151
  end
@@ -2654,17 +2642,6 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2654
2642
  end
2655
2643
  end
2656
2644
 
2657
- context 'when providing a collation', if: collation_supported? do
2658
-
2659
- let(:preferences) do
2660
- person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
2661
- end
2662
-
2663
- it "applies the collation option to the query" do
2664
- expect(preferences).to eq([ preference_one ])
2665
- end
2666
- end
2667
-
2668
2645
  context "when providing a criteria on id" do
2669
2646
 
2670
2647
  let(:preferences) do
@@ -74,23 +74,23 @@ describe Mongoid::Relations::Reflections do
74
74
  expect(relations.size).to eq(1)
75
75
  end
76
76
  end
77
+ end
77
78
 
78
- context "when no argument supplied" do
79
+ context "when no relations exist for the macros" do
79
80
 
80
- let(:relations) do
81
- klass.reflect_on_all_associations
82
- end
81
+ let(:relations) do
82
+ klass.reflect_on_all_associations(:embeds_one)
83
+ end
83
84
 
84
- it "returns an array of all relations" do
85
- expect(relations.size).to eq(3)
86
- end
85
+ it "returns an empty array" do
86
+ expect(relations).to be_empty
87
87
  end
88
88
  end
89
89
 
90
- context "when no relations exist for the macros" do
90
+ context "when no argument supplied" do
91
91
 
92
92
  let(:relations) do
93
- klass.reflect_on_all_associations(:embeds_one)
93
+ klass.reflect_on_all_associations
94
94
  end
95
95
 
96
96
  it "returns an empty array" do
@@ -4,6 +4,25 @@ describe Mongoid::Reloadable do
4
4
 
5
5
  describe "#reload" do
6
6
 
7
+ context 'when persistence options are set' do
8
+
9
+ let(:person) do
10
+ Person.with(collection: 'other') do |person_class|
11
+ person_class.create
12
+ end
13
+ end
14
+
15
+ let(:reloaded) do
16
+ Person.with(collection: 'other') do |person_class|
17
+ person_class.first
18
+ end
19
+ end
20
+
21
+ it 'applies the persistence options' do
22
+ expect(person).to eq(reloaded)
23
+ end
24
+ end
25
+
7
26
  context "when using bson ids" do
8
27
 
9
28
  let(:person) do
@@ -106,6 +125,38 @@ describe Mongoid::Reloadable do
106
125
 
107
126
  context "when embedded a single level" do
108
127
 
128
+ context 'when persistence options are set' do
129
+
130
+ let(:person) do
131
+ Person.with(collection: 'other') do |person_class|
132
+ person_class.create
133
+ end
134
+ end
135
+
136
+ let!(:address) do
137
+ person.with(collection: 'other') do |person_object|
138
+ person_object.addresses.create(street: "Abbey Road", number: 4)
139
+ end
140
+ end
141
+
142
+ before do
143
+ Person.mongo_client[:other].find(
144
+ { "_id" => person.id }
145
+ ).update_one({ "$set" => { "addresses.0.number" => 3 }})
146
+ end
147
+
148
+ let!(:reloaded) do
149
+ person.with(collection: 'other') do |person_class|
150
+ person.addresses.first.reload
151
+ end
152
+ end
153
+
154
+ it "reloads the embedded document attributes" do
155
+ expect(reloaded.number).to eq(3)
156
+ end
157
+
158
+ end
159
+
109
160
  context "when the relation is an embeds many" do
110
161
 
111
162
  let!(:address) do
@@ -227,18 +227,6 @@ describe Mongoid::Scopable do
227
227
 
228
228
  context "when provided a criteria" do
229
229
 
230
- context 'when a collation is defined on the criteria', if: collation_supported? do
231
-
232
- before do
233
- Band.scope(:tests, ->{ Band.where(name: 'TESTING').collation(locale: 'en_US', strength: 2) })
234
- Band.create(name: 'testing')
235
- end
236
-
237
- it 'applies the collation' do
238
- expect(Band.tests.first['name']).to eq('testing')
239
- end
240
- end
241
-
242
230
  context "when the lambda includes a geo_near query" do
243
231
 
244
232
  before do
@@ -829,54 +829,4 @@ describe Mongoid::Serializable do
829
829
  end
830
830
  end
831
831
  end
832
-
833
- describe "#to_xml" do
834
-
835
- context "BSON::ObjectId" do
836
-
837
- let(:person) do
838
- Person.new
839
- end
840
-
841
- it "serializes as string" do
842
- expect(person.to_xml).to include("<_id>#{person.id}</_id>")
843
- end
844
- end
845
-
846
- context "when an Array field is defined" do
847
-
848
- let(:person) do
849
- Person.new(
850
- aliases: [ "Kelly", "Machine Gun" ]
851
- )
852
- end
853
-
854
- it "properly types the array" do
855
- expect(person.to_xml).to include("<aliases type=\"array\">")
856
- end
857
-
858
- it "serializes the array" do
859
- expect(person.to_xml).to include("<alias>Kelly</alias>")
860
- expect(person.to_xml).to include("<alias>Machine Gun</alias>")
861
- end
862
- end
863
-
864
- context "when a Hash field is defined" do
865
-
866
- let(:person) do
867
- Person.new(
868
- map: { lat: 24.5, long: 22.1 }
869
- )
870
- end
871
-
872
- it "properly types the hash" do
873
- expect(person.to_xml).to include("<map>")
874
- end
875
-
876
- it "serializes the hash" do
877
- expect(person.to_xml).to include("<lat type=\"float\">24.5</lat>")
878
- expect(person.to_xml).to include("<long type=\"float\">22.1</long>")
879
- end
880
- end
881
- end
882
832
  end
@@ -280,7 +280,7 @@ describe Mongoid::Validatable::PresenceValidator do
280
280
  end
281
281
 
282
282
  it "does not save the relation" do
283
- expect { game.reload }.to raise_error
283
+ expect { game.reload }.to raise_error(Mongoid::Errors::DocumentNotFound)
284
284
  end
285
285
  end
286
286
  end
@@ -19,34 +19,41 @@ describe Mongoid::Validatable::UniquenessValidator do
19
19
  context "when persisting to another collection" do
20
20
 
21
21
  before do
22
- Dictionary.with(collection: "dicts").create(name: "websters")
22
+ Dictionary.with(collection: "dicts") do |klass|
23
+ klass.create(name: "websters")
24
+ end
23
25
  end
24
26
 
25
27
  context "when the document is not valid" do
26
28
 
27
29
  let(:websters) do
28
- Dictionary.with(collection: "dicts").new(name: "websters")
30
+ object = nil
31
+ valid = Dictionary.with(collection: "dicts") do |klass|
32
+ object = klass.new(name: "websters")
33
+ object.valid?
34
+ end
35
+ { :valid => valid, :object => object }
29
36
  end
30
37
 
31
38
  it "performs the validation on the correct collection" do
32
- expect(websters).to_not be_valid
39
+ expect(websters[:valid]).to be(false)
33
40
  end
34
41
 
35
42
  it "adds the uniqueness error" do
36
- websters.valid?
37
- expect(websters.errors[:name]).to_not be_nil
43
+ expect(websters[:object].errors[:name]).to_not be_nil
38
44
  end
39
45
 
40
46
  it "clears the persistence options in the thread local" do
41
- websters.valid?
42
- expect(Dictionary.persistence_options).to be_nil
47
+ expect(Dictionary.persistence_context).to eq(Mongoid::PersistenceContext.new(Dictionary))
43
48
  end
44
49
  end
45
50
 
46
51
  context "when the document is valid" do
47
52
 
48
53
  let(:oxford) do
49
- Dictionary.with(collection: "dicts").new(name: "oxford")
54
+ Dictionary.with(collection: "dicts") do |klass|
55
+ klass.new(name: "oxford")
56
+ end
50
57
  end
51
58
 
52
59
  it "performs the validation on the correct collection" do
@@ -2431,7 +2438,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2431
2438
  it "transfers the options to the cloned client" do
2432
2439
  expect {
2433
2440
  Person.create!(ssn: "132-11-1111", username: "asdfsdfA")
2434
- }.to raise_error
2441
+ }.to raise_error(Mongo::Error::OperationFailure)
2435
2442
  end
2436
2443
  end
2437
2444
  end