mongoid 5.4.1 → 6.1.1

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 (260) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -3
  3. data/lib/config/locales/en.yml +19 -0
  4. data/lib/mongoid.rb +4 -4
  5. data/lib/mongoid/atomic.rb +2 -2
  6. data/lib/mongoid/atomic/modifiers.rb +8 -12
  7. data/lib/mongoid/attributes.rb +22 -21
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/cacheable.rb +36 -0
  10. data/lib/mongoid/changeable.rb +36 -0
  11. data/lib/mongoid/clients.rb +8 -63
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/storage_options.rb +1 -69
  14. data/lib/mongoid/composable.rb +29 -3
  15. data/lib/mongoid/config.rb +1 -0
  16. data/lib/mongoid/contextual/atomic.rb +5 -8
  17. data/lib/mongoid/contextual/map_reduce.rb +0 -4
  18. data/lib/mongoid/contextual/memory.rb +2 -2
  19. data/lib/mongoid/contextual/mongo.rb +40 -22
  20. data/lib/mongoid/contextual/none.rb +12 -0
  21. data/lib/mongoid/copyable.rb +13 -6
  22. data/lib/mongoid/criteria.rb +5 -2
  23. data/lib/mongoid/criteria/marshalable.rb +2 -2
  24. data/lib/mongoid/criteria/modifiable.rb +17 -1
  25. data/lib/mongoid/criteria/options.rb +25 -0
  26. data/lib/mongoid/criteria/queryable.rb +87 -0
  27. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  28. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  46. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  47. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  49. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  50. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  51. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  52. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  53. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  54. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  55. data/lib/mongoid/document.rb +30 -37
  56. data/lib/mongoid/errors.rb +2 -0
  57. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  58. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  59. data/lib/mongoid/errors/invalid_field.rb +2 -2
  60. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  61. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  62. data/lib/mongoid/evolvable.rb +1 -1
  63. data/lib/mongoid/extensions.rb +0 -4
  64. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  65. data/lib/mongoid/extensions/date.rb +4 -1
  66. data/lib/mongoid/extensions/decimal128.rb +3 -3
  67. data/lib/mongoid/extensions/hash.rb +1 -0
  68. data/lib/mongoid/extensions/string.rb +4 -3
  69. data/lib/mongoid/extensions/time.rb +4 -1
  70. data/lib/mongoid/fields/validators/macro.rb +18 -0
  71. data/lib/mongoid/findable.rb +2 -2
  72. data/lib/mongoid/indexable.rb +15 -13
  73. data/lib/mongoid/interceptable.rb +5 -22
  74. data/lib/mongoid/matchable.rb +13 -7
  75. data/lib/mongoid/matchable/all.rb +2 -2
  76. data/lib/mongoid/matchable/and.rb +3 -3
  77. data/lib/mongoid/matchable/default.rb +2 -2
  78. data/lib/mongoid/matchable/elem_match.rb +28 -0
  79. data/lib/mongoid/matchable/exists.rb +2 -2
  80. data/lib/mongoid/matchable/gt.rb +4 -2
  81. data/lib/mongoid/matchable/gte.rb +4 -2
  82. data/lib/mongoid/matchable/in.rb +2 -2
  83. data/lib/mongoid/matchable/lt.rb +4 -2
  84. data/lib/mongoid/matchable/lte.rb +4 -2
  85. data/lib/mongoid/matchable/ne.rb +2 -2
  86. data/lib/mongoid/matchable/nin.rb +2 -2
  87. data/lib/mongoid/matchable/or.rb +3 -3
  88. data/lib/mongoid/matchable/regexp.rb +3 -3
  89. data/lib/mongoid/matchable/size.rb +2 -2
  90. data/lib/mongoid/persistable.rb +3 -5
  91. data/lib/mongoid/persistable/creatable.rb +2 -2
  92. data/lib/mongoid/persistable/deletable.rb +1 -1
  93. data/lib/mongoid/persistable/settable.rb +1 -1
  94. data/lib/mongoid/persistable/updatable.rb +5 -12
  95. data/lib/mongoid/persistable/upsertable.rb +1 -1
  96. data/lib/mongoid/persistence_context.rb +215 -0
  97. data/lib/mongoid/query_cache.rb +3 -6
  98. data/lib/mongoid/relations/accessors.rb +3 -0
  99. data/lib/mongoid/relations/auto_save.rb +12 -4
  100. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  101. data/lib/mongoid/relations/counter_cache.rb +15 -5
  102. data/lib/mongoid/relations/eager.rb +6 -11
  103. data/lib/mongoid/relations/eager/base.rb +3 -3
  104. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  105. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  106. data/lib/mongoid/relations/embedded/batchable.rb +12 -36
  107. data/lib/mongoid/relations/embedded/in.rb +13 -1
  108. data/lib/mongoid/relations/embedded/many.rb +28 -10
  109. data/lib/mongoid/relations/embedded/one.rb +14 -1
  110. data/lib/mongoid/relations/macros.rb +9 -1
  111. data/lib/mongoid/relations/metadata.rb +3 -3
  112. data/lib/mongoid/relations/options.rb +2 -2
  113. data/lib/mongoid/relations/proxy.rb +1 -31
  114. data/lib/mongoid/relations/referenced/in.rb +19 -10
  115. data/lib/mongoid/relations/referenced/many.rb +23 -17
  116. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  117. data/lib/mongoid/relations/referenced/one.rb +15 -1
  118. data/lib/mongoid/relations/synchronization.rb +11 -11
  119. data/lib/mongoid/relations/touchable.rb +6 -3
  120. data/lib/mongoid/reloadable.rb +1 -1
  121. data/lib/mongoid/serializable.rb +1 -1
  122. data/lib/mongoid/traversable.rb +1 -1
  123. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  124. data/lib/mongoid/version.rb +1 -1
  125. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
  126. data/spec/app/models/album.rb +5 -1
  127. data/spec/app/models/artist.rb +21 -0
  128. data/spec/app/models/book.rb +2 -1
  129. data/spec/app/models/dokument.rb +1 -0
  130. data/spec/app/models/ordered_post.rb +5 -0
  131. data/spec/app/models/oscar.rb +1 -2
  132. data/spec/app/models/page.rb +1 -1
  133. data/spec/app/models/person.rb +3 -3
  134. data/spec/app/models/princess.rb +2 -0
  135. data/spec/app/models/record.rb +1 -0
  136. data/spec/app/models/subscription.rb +1 -0
  137. data/spec/app/models/thing.rb +1 -1
  138. data/spec/config/mongoid.yml +15 -0
  139. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  140. data/spec/mongoid/atomic_spec.rb +17 -17
  141. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  142. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  143. data/spec/mongoid/attributes_spec.rb +90 -5
  144. data/spec/mongoid/cacheable_spec.rb +112 -0
  145. data/spec/mongoid/changeable_spec.rb +58 -0
  146. data/spec/mongoid/clients/factory_spec.rb +31 -3
  147. data/spec/mongoid/clients/options_spec.rb +382 -96
  148. data/spec/mongoid/clients_spec.rb +243 -101
  149. data/spec/mongoid/composable_spec.rb +7 -0
  150. data/spec/mongoid/config_spec.rb +67 -11
  151. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  152. data/spec/mongoid/contextual/mongo_spec.rb +165 -20
  153. data/spec/mongoid/contextual/none_spec.rb +15 -0
  154. data/spec/mongoid/copyable_spec.rb +13 -4
  155. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  156. data/spec/mongoid/criteria/options_spec.rb +29 -0
  157. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  158. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  159. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  160. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  161. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  162. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  163. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  164. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  165. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  166. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  167. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  168. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  169. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  170. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  171. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  172. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  173. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  174. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  175. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  176. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  177. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  178. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  179. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  180. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  181. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  182. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  183. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  184. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  185. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
  186. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  187. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  188. data/spec/mongoid/criteria_spec.rb +152 -21
  189. data/spec/mongoid/document_spec.rb +37 -88
  190. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  191. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  192. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  193. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  194. data/spec/mongoid/extensions/date_spec.rb +2 -6
  195. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  196. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  197. data/spec/mongoid/extensions/float_spec.rb +8 -1
  198. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  199. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  200. data/spec/mongoid/extensions/object_spec.rb +11 -0
  201. data/spec/mongoid/extensions/string_spec.rb +21 -0
  202. data/spec/mongoid/extensions/time_spec.rb +2 -6
  203. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  204. data/spec/mongoid/findable_spec.rb +46 -1
  205. data/spec/mongoid/indexable_spec.rb +15 -3
  206. data/spec/mongoid/interceptable_spec.rb +68 -10
  207. data/spec/mongoid/matchable/all_spec.rb +4 -4
  208. data/spec/mongoid/matchable/and_spec.rb +10 -10
  209. data/spec/mongoid/matchable/default_spec.rb +12 -12
  210. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  211. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  212. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  213. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  214. data/spec/mongoid/matchable/in_spec.rb +5 -5
  215. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  216. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  217. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  218. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  219. data/spec/mongoid/matchable/or_spec.rb +7 -7
  220. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  221. data/spec/mongoid/matchable/size_spec.rb +3 -3
  222. data/spec/mongoid/matchable_spec.rb +173 -53
  223. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  224. data/spec/mongoid/persistable/deletable_spec.rb +16 -1
  225. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  226. data/spec/mongoid/persistable/savable_spec.rb +35 -30
  227. data/spec/mongoid/persistable/settable_spec.rb +45 -29
  228. data/spec/mongoid/persistable/updatable_spec.rb +184 -5
  229. data/spec/mongoid/persistence_context_spec.rb +680 -0
  230. data/spec/mongoid/positional_spec.rb +10 -10
  231. data/spec/mongoid/query_cache_spec.rb +89 -0
  232. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  233. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  234. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  235. data/spec/mongoid/relations/builders_spec.rb +37 -10
  236. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  237. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  238. data/spec/mongoid/relations/eager_spec.rb +40 -0
  239. data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
  240. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  241. data/spec/mongoid/relations/macros_spec.rb +395 -7
  242. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  243. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  247. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  248. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  249. data/spec/mongoid/reloadable_spec.rb +51 -0
  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 +18 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +20 -11
  255. metadata +524 -469
  256. checksums.yaml.gz.sig +0 -0
  257. data.tar.gz.sig +0 -0
  258. data/lib/mongoid/clients/thread_options.rb +0 -19
  259. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  260. metadata.gz.sig +0 -0
@@ -1896,6 +1896,21 @@ describe Mongoid::Relations::Metadata do
1896
1896
  end
1897
1897
  end
1898
1898
 
1899
+ context "when touch specifies additional field" do
1900
+
1901
+ let(:metadata) do
1902
+ described_class.new(
1903
+ name: :versions,
1904
+ relation: Mongoid::Relations::Referenced::In,
1905
+ touch: :changed_at
1906
+ )
1907
+ end
1908
+
1909
+ it "returns true" do
1910
+ expect(metadata).to be_touchable
1911
+ end
1912
+ end
1913
+
1899
1914
  context "when touch is nil" do
1900
1915
 
1901
1916
  let(:metadata) do
@@ -1967,5 +1982,4 @@ describe Mongoid::Relations::Metadata do
1967
1982
  end
1968
1983
  end
1969
1984
  end
1970
-
1971
1985
  end
@@ -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
@@ -95,4 +97,28 @@ describe Mongoid::Relations::Proxy do
95
97
  end
96
98
  end
97
99
  end
100
+
101
+ describe "equality" do
102
+ let(:messages) do
103
+ Person.create.messages
104
+ end
105
+
106
+ it "is #equal? to itself" do
107
+ expect(messages.equal?(messages)).to eq(true)
108
+ end
109
+
110
+ it "is == to itself" do
111
+ expect(messages == messages).to eq(true)
112
+ end
113
+
114
+ it "is not #equal? to its target" do
115
+ expect(messages.equal?(messages.target)).to eq(false)
116
+ expect(messages.target.equal?(messages)).to eq(false)
117
+ end
118
+
119
+ it "is == to its target" do
120
+ expect(messages == messages.target).to eq(true)
121
+ expect(messages.target == messages).to eq(true)
122
+ end
123
+ end
98
124
  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
@@ -2934,16 +2934,16 @@ describe Mongoid::Relations::Referenced::Many do
2934
2934
  it "applies the criteria to the documents" do
2935
2935
  expect(posts).to eq([ post_one ])
2936
2936
  end
2937
- end
2938
2937
 
2939
- context 'when providing a collation', if: collation_supported? do
2938
+ context 'when providing a collation', if: collation_supported? do
2940
2939
 
2941
- let(:posts) do
2942
- person.posts.where(title: "FIRST").collation(locale: 'en_US', strength: 2)
2943
- end
2940
+ let(:posts) do
2941
+ person.posts.where(title: "FIRST").collation(locale: 'en_US', strength: 2)
2942
+ end
2944
2943
 
2945
- it "applies the collation option to the query" do
2946
- expect(posts).to eq([ post_one ])
2944
+ it "applies the collation option to the query" do
2945
+ expect(posts).to eq([ post_one ])
2946
+ end
2947
2947
  end
2948
2948
  end
2949
2949
 
@@ -3504,12 +3504,10 @@ describe Mongoid::Relations::Referenced::Many do
3504
3504
 
3505
3505
  before do
3506
3506
  expect(artist).to receive(:before_add_album).and_raise
3507
+ begin; artist.albums << album; rescue; end
3507
3508
  end
3508
3509
 
3509
3510
  it "does not add the document to the relation" do
3510
- expect {
3511
- artist.albums << album
3512
- }.to raise_error
3513
3511
  expect(artist.albums).to be_empty
3514
3512
  end
3515
3513
  end
@@ -3534,12 +3532,10 @@ describe Mongoid::Relations::Referenced::Many do
3534
3532
 
3535
3533
  before do
3536
3534
  expect(artist).to receive(:after_add_album).and_raise
3535
+ begin; artist.albums << album; rescue; end
3537
3536
  end
3538
3537
 
3539
3538
  it "adds the document to the relation" do
3540
- expect {
3541
- artist.albums << album
3542
- }.to raise_error
3543
3539
  expect(artist.albums).to eq([ album ])
3544
3540
  end
3545
3541
  end
@@ -3618,9 +3614,7 @@ describe Mongoid::Relations::Referenced::Many do
3618
3614
  describe "#delete" do
3619
3615
 
3620
3616
  before do
3621
- expect {
3622
- artist.albums.delete album
3623
- }.to raise_error
3617
+ begin; artist.albums.delete(album); rescue; end
3624
3618
  end
3625
3619
 
3626
3620
  it "does not remove the document from the relation" do
@@ -3631,9 +3625,7 @@ describe Mongoid::Relations::Referenced::Many do
3631
3625
  describe "#clear" do
3632
3626
 
3633
3627
  before do
3634
- expect {
3635
- artist.albums.clear
3636
- }.to raise_error
3628
+ begin; artist.albums.clear; rescue; end
3637
3629
  end
3638
3630
 
3639
3631
  it "does not clear the relation" do
@@ -3693,9 +3685,7 @@ describe Mongoid::Relations::Referenced::Many do
3693
3685
  describe "#delete" do
3694
3686
 
3695
3687
  before do
3696
- expect {
3697
- artist.albums.delete album
3698
- }.to raise_error
3688
+ begin; artist.albums.delete(album); rescue; end
3699
3689
  end
3700
3690
 
3701
3691
  it "removes the documents from the relation" do
@@ -3706,9 +3696,7 @@ describe Mongoid::Relations::Referenced::Many do
3706
3696
  describe "#clear" do
3707
3697
 
3708
3698
  before do
3709
- expect {
3710
- artist.albums.clear
3711
- }.to raise_error
3699
+ begin; artist.albums.clear; rescue; end
3712
3700
  end
3713
3701
 
3714
3702
  it "removes the documents from the relation" do
@@ -5,7 +5,7 @@ describe Mongoid::Relations::Referenced::ManyToMany do
5
5
  before(:all) do
6
6
  Mongoid.raise_not_found_error = true
7
7
  Person.autosave(Person.relations["preferences"].merge!(autosave: true))
8
- Person.synced(Person.relations["preferences"])
8
+ Person._synced(Person.relations["preferences"])
9
9
  end
10
10
 
11
11
  after(:all) 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
@@ -2652,16 +2640,16 @@ describe Mongoid::Relations::Referenced::ManyToMany do
2652
2640
  it "applies the criteria to the documents" do
2653
2641
  expect(preferences).to eq([ preference_one ])
2654
2642
  end
2655
- end
2656
2643
 
2657
- context 'when providing a collation', if: collation_supported? do
2644
+ context 'when providing a collation', if: collation_supported? do
2658
2645
 
2659
- let(:preferences) do
2660
- person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
2661
- end
2646
+ let(:preferences) do
2647
+ person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
2648
+ end
2662
2649
 
2663
- it "applies the collation option to the query" do
2664
- expect(preferences).to eq([ preference_one ])
2650
+ it "applies the collation option to the query" do
2651
+ expect(preferences).to eq([ preference_one ])
2652
+ end
2665
2653
  end
2666
2654
  end
2667
2655
 
@@ -4,7 +4,7 @@ describe Mongoid::Relations::Synchronization do
4
4
 
5
5
  before(:all) do
6
6
  Mongoid.raise_not_found_error = true
7
- Person.synced(Person.relations["preferences"])
7
+ Person._synced(Person.relations["preferences"])
8
8
  end
9
9
 
10
10
  after(:all) do
@@ -12,6 +12,52 @@ describe Mongoid::Relations::Synchronization do
12
12
  Person.reset_callbacks(:destroy)
13
13
  end
14
14
 
15
+ describe 'Model loading' do
16
+
17
+ let(:model_synced) do
18
+ class TestModel
19
+ include Mongoid::Document
20
+ field :_synced
21
+ end
22
+ end
23
+
24
+ let(:model_synced?) do
25
+ class TestModel
26
+ include Mongoid::Document
27
+ field :_synced?
28
+ end
29
+ end
30
+
31
+ let(:model_syncable?) do
32
+ class TestModel
33
+ include Mongoid::Document
34
+ field :_syncable?
35
+ end
36
+ end
37
+
38
+ after do
39
+ Object.send(:remove_const, :TestModel)
40
+ end
41
+
42
+ it 'prohibits the use of :_sycned as an attribute' do
43
+ expect {
44
+ model_synced
45
+ }.to raise_exception(Mongoid::Errors::InvalidField)
46
+ end
47
+
48
+ it 'prohibits the use of :_synced? as an attribute' do
49
+ expect {
50
+ model_synced?
51
+ }.to raise_exception(Mongoid::Errors::InvalidField)
52
+ end
53
+
54
+ it 'prohibits the use of :_syncable? as an attribute' do
55
+ expect {
56
+ model_syncable?
57
+ }.to raise_exception(Mongoid::Errors::InvalidField)
58
+ end
59
+ end
60
+
15
61
  describe ".update_inverse_keys" do
16
62
 
17
63
  let(:agent) do
@@ -119,7 +165,7 @@ describe Mongoid::Relations::Synchronization do
119
165
  end
120
166
 
121
167
  it "resets the synced flag" do
122
- expect(person.synced["preference_ids"]).to be false
168
+ expect(person._synced["preference_ids"]).to be false
123
169
  end
124
170
 
125
171
  context "when subsequently setting with keys" do
@@ -227,6 +227,44 @@ describe Mongoid::Relations::Touchable do
227
227
  end
228
228
  end
229
229
 
230
+ context "when the parent of embedded doc has cascade callbacks" do
231
+
232
+ let!(:book) do
233
+ Book.new
234
+ end
235
+
236
+ before do
237
+ book.pages.new
238
+ book.save
239
+ book.unset(:updated_at)
240
+ book.pages.first.touch
241
+ end
242
+
243
+ it "touches the parent document" do
244
+ expect(book.updated_at).to be_within(5).of(Time.now)
245
+ end
246
+ end
247
+
248
+ context "when multiple embedded docs with cascade callbacks" do
249
+
250
+ let!(:book) do
251
+ Book.new
252
+ end
253
+
254
+ before do
255
+ 2.times { book.pages.new }
256
+ book.save
257
+ book.unset(:updated_at)
258
+ book.pages.first.content = "foo"
259
+ book.pages.second.content = "bar"
260
+ book.pages.first.touch
261
+ end
262
+
263
+ it "touches the parent document" do
264
+ expect(book.updated_at).to be_within(5).of(Time.now)
265
+ end
266
+ end
267
+
230
268
  context "when the relation is nil" do
231
269
 
232
270
  let!(:agent) do
@@ -343,6 +381,7 @@ describe Mongoid::Relations::Touchable do
343
381
  end
344
382
 
345
383
  it "does not persist other attribute changes" do
384
+ expect(band.name).to eq('Nocebo')
346
385
  expect(band.reload.name).not_to eq('Nocebo')
347
386
  end
348
387
  end
@@ -354,6 +393,7 @@ describe Mongoid::Relations::Touchable do
354
393
  end
355
394
 
356
395
  it "does not persist other attribute changes" do
396
+ expect(band.name).to eq('Nocebo')
357
397
  expect(band.reload.name).not_to eq('Nocebo')
358
398
  end
359
399
  end