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
@@ -428,22 +428,40 @@ describe Mongoid::Relations::Embedded::Many do
428
428
  context "when replacing an existing relation" do
429
429
 
430
430
  let(:person) do
431
- Person.create(addresses: [
431
+ Person.create(addresses: addresses)
432
+ end
433
+
434
+ let(:addresses) do
435
+ [
432
436
  Address.new(street: "1st St"),
433
437
  Address.new(street: "2nd St")
434
- ])
438
+ ]
435
439
  end
436
440
 
437
441
  let(:address) do
438
442
  Address.new(street: "3rd St")
439
443
  end
440
444
 
441
- before do
442
- person.addresses = [ address ]
445
+ context "when the replaced relation is different from the existing relation" do
446
+
447
+ before do
448
+ person.addresses = [ address ]
449
+ end
450
+
451
+ it "deletes the old documents" do
452
+ expect(person.reload.addresses).to eq([ address ])
453
+ end
443
454
  end
444
455
 
445
- it "deletes the old documents" do
446
- expect(person.reload.addresses).to eq([ address ])
456
+ context "when the replaced relation is identical to the existing relation" do
457
+
458
+ before do
459
+ person.addresses = addresses
460
+ end
461
+
462
+ it "does nothing" do
463
+ expect(person.reload.addresses).to eq(addresses)
464
+ end
447
465
  end
448
466
  end
449
467
 
@@ -879,6 +897,36 @@ describe Mongoid::Relations::Embedded::Many do
879
897
  Person.create
880
898
  end
881
899
 
900
+ context 'when a string is used to access an attribute' do
901
+
902
+ let!(:address) do
903
+ person.addresses.create(street: "one")
904
+ end
905
+
906
+ let(:document) do
907
+ person.reload.addresses.as_document.first
908
+ end
909
+
910
+ it "returns the attribute value" do
911
+ expect(document['street']).to eq('one')
912
+ end
913
+ end
914
+
915
+ context 'when a symbol is used to access an attribute' do
916
+
917
+ let!(:address) do
918
+ person.addresses.create(street: "one")
919
+ end
920
+
921
+ let(:document) do
922
+ person.reload.addresses.as_document.first
923
+ end
924
+
925
+ it "returns the attribute value" do
926
+ expect(document[:street]).to eq('one')
927
+ end
928
+ end
929
+
882
930
  context "when the relation has no default scope" do
883
931
 
884
932
  let!(:address) do
@@ -3761,12 +3809,10 @@ describe Mongoid::Relations::Embedded::Many do
3761
3809
 
3762
3810
  before do
3763
3811
  expect(artist).to receive(:before_add_song).and_raise
3812
+ begin; artist.songs << song; rescue; end
3764
3813
  end
3765
3814
 
3766
3815
  it "does not add the document to the relation" do
3767
- expect {
3768
- artist.songs << song
3769
- }.to raise_error
3770
3816
  expect(artist.songs).to be_empty
3771
3817
  end
3772
3818
  end
@@ -3791,12 +3837,10 @@ describe Mongoid::Relations::Embedded::Many do
3791
3837
 
3792
3838
  before do
3793
3839
  expect(artist).to receive(:after_add_label).and_raise
3840
+ begin; artist.labels << label; rescue; end
3794
3841
  end
3795
3842
 
3796
3843
  it "adds the document to the relation" do
3797
- expect {
3798
- artist.labels << label
3799
- }.to raise_error
3800
3844
  expect(artist.labels).to eq([ label ])
3801
3845
  end
3802
3846
  end
@@ -3857,19 +3901,18 @@ describe Mongoid::Relations::Embedded::Many do
3857
3901
  describe "#delete" do
3858
3902
 
3859
3903
  it "does not remove the document from the relation" do
3860
- expect {
3861
- artist.songs.delete(song)
3862
- }.to raise_error
3904
+ begin; artist.songs.delete(song); rescue; end
3863
3905
  expect(artist.songs).to eq([ song ])
3864
3906
  end
3865
3907
  end
3866
3908
 
3867
3909
  describe "#clear" do
3868
3910
 
3911
+ before do
3912
+ begin; artist.songs.clear; rescue; end
3913
+ end
3914
+
3869
3915
  it "removes the documents from the relation" do
3870
- expect {
3871
- artist.songs.clear
3872
- }.to raise_error
3873
3916
  expect(artist.songs).to eq([ song ])
3874
3917
  end
3875
3918
  end
@@ -3925,9 +3968,7 @@ describe Mongoid::Relations::Embedded::Many do
3925
3968
  describe "#delete" do
3926
3969
 
3927
3970
  before do
3928
- expect {
3929
- artist.labels.delete(label)
3930
- }.to raise_error
3971
+ begin; artist.labels.delete(label); rescue; end
3931
3972
  end
3932
3973
 
3933
3974
  it "removes the document from the relation" do
@@ -3938,9 +3979,7 @@ describe Mongoid::Relations::Embedded::Many do
3938
3979
  describe "#clear" do
3939
3980
 
3940
3981
  before do
3941
- expect {
3942
- artist.labels.clear
3943
- }.to raise_error
3982
+ begin; artist.labels.clear; rescue; end
3944
3983
  end
3945
3984
 
3946
3985
  it "should remove from collection" do
@@ -4019,29 +4058,6 @@ describe Mongoid::Relations::Embedded::Many do
4019
4058
  end
4020
4059
  end
4021
4060
 
4022
- context "when embedded documents get marshalled" do
4023
-
4024
- let(:person) do
4025
- Person.create
4026
- end
4027
-
4028
- let!(:addresses) do
4029
- person.addresses
4030
- end
4031
-
4032
- let!(:dumped) do
4033
- Marshal.dump(addresses)
4034
- end
4035
-
4036
- let!(:loaded) do
4037
- Marshal.load(dumped)
4038
- end
4039
-
4040
- it "keeps the proxy extensions when remarshalling" do
4041
- expect(loaded.extension).to eq("Testing")
4042
- end
4043
- end
4044
-
4045
4061
  context "deleting embedded documents" do
4046
4062
 
4047
4063
  it "able to delete embedded documents upon condition" do
@@ -70,7 +70,8 @@ describe Mongoid::Relations::Embedded::One do
70
70
  name_without_default or (self.name = Name.new)
71
71
  end
72
72
  class << person
73
- alias_method_chain :name, :default
73
+ alias_method :name_without_default, :name
74
+ alias_method :name, :name_with_default
74
75
  end
75
76
  end
76
77
 
@@ -15,12 +15,30 @@ describe Mongoid::Relations::Macros do
15
15
  klass._validators.clear
16
16
  end
17
17
 
18
+ after do
19
+ klass.relations.clear
20
+ klass.validators.clear
21
+ end
22
+
18
23
  describe ".embedded_in" do
19
24
 
20
25
  it "defines the macro" do
21
26
  expect(klass).to respond_to(:embedded_in)
22
27
  end
23
28
 
29
+ context 'when the relation name is invalid' do
30
+
31
+ let(:relation) do
32
+ klass.embedded_in(:fields)
33
+ end
34
+
35
+ it 'raises an InvalidRelation exception' do
36
+ expect {
37
+ relation
38
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
39
+ end
40
+ end
41
+
24
42
  context "when defining the relation" do
25
43
 
26
44
  before do
@@ -74,6 +92,19 @@ describe Mongoid::Relations::Macros do
74
92
 
75
93
  context "when defining the relation" do
76
94
 
95
+ context 'when the relation name is invalid' do
96
+
97
+ let(:relation) do
98
+ klass.embeds_many(:fields)
99
+ end
100
+
101
+ it 'raises an InvalidRelation exception' do
102
+ expect {
103
+ relation
104
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
105
+ end
106
+ end
107
+
77
108
  before do
78
109
  klass.embeds_many(:addresses)
79
110
  end
@@ -132,8 +163,8 @@ describe Mongoid::Relations::Macros do
132
163
  expect(metadata.order).to_not be_nil
133
164
  end
134
165
 
135
- it "returns Origin::Key" do
136
- expect(metadata.order).to be_kind_of(Origin::Key)
166
+ it "returns Mongoid::Criteria::Queryable::Key" do
167
+ expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
137
168
  end
138
169
  end
139
170
 
@@ -157,6 +188,19 @@ describe Mongoid::Relations::Macros do
157
188
 
158
189
  context "when defining the relation" do
159
190
 
191
+ context 'when the relation name is invalid' do
192
+
193
+ let(:relation) do
194
+ klass.embeds_one(:fields)
195
+ end
196
+
197
+ it 'raises an InvalidRelation exception' do
198
+ expect {
199
+ relation
200
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
201
+ end
202
+ end
203
+
160
204
  before do
161
205
  klass.embeds_one(:name)
162
206
  end
@@ -223,8 +267,300 @@ describe Mongoid::Relations::Macros do
223
267
 
224
268
  describe ".belongs_to" do
225
269
 
270
+ let(:_class) do
271
+ class RelationsTestClass
272
+ include Mongoid::Document
273
+ end
274
+ end
275
+
276
+ let(:conf) do
277
+ CONFIG.merge(options: { belongs_to_required_by_default: default_require })
278
+ end
279
+
280
+ let(:relation) do
281
+ _class.new
282
+ end
283
+
284
+ let(:relation_options) { {} }
285
+
286
+ let(:default_require) { Mongoid.belongs_to_required_by_default }
287
+
288
+ before do
289
+ Mongoid.configure do |config|
290
+ config.load_configuration(conf)
291
+ end
292
+ _class.belongs_to(:person, relation_options)
293
+ end
294
+
295
+ after do
296
+ Object.send(:remove_const, _class.name)
297
+ end
298
+
299
+ after(:all) do
300
+ Mongoid.configure do |config|
301
+ config.load_configuration(CONFIG)
302
+ end
303
+ end
304
+
226
305
  it "defines the macro" do
227
- expect(klass).to respond_to(:belongs_to)
306
+ expect(_class).to respond_to(:belongs_to)
307
+ end
308
+
309
+ context 'when the relation has options' do
310
+
311
+ context 'when the relation has the option :required' do
312
+
313
+ context 'when the relation does not have the :optional option' do
314
+
315
+ context 'when :required is true' do
316
+
317
+ let(:relation_options) do
318
+ { required: true }
319
+ end
320
+
321
+ context 'when the default config is to require the association' do
322
+
323
+ let(:default_require) { true }
324
+
325
+ it 'requires the association' do
326
+ expect(relation.save).to be(false)
327
+ end
328
+ end
329
+
330
+ context 'when the default config is to not require the association' do
331
+
332
+ let(:default_require) { false }
333
+
334
+ it 'requires the association' do
335
+ expect(relation.save).to be(false)
336
+ end
337
+ end
338
+ end
339
+
340
+ context 'when :required is false' do
341
+
342
+ let(:relation_options) do
343
+ { required: false }
344
+ end
345
+
346
+ context 'when the default config is to require the association' do
347
+
348
+ let(:default_require) { true }
349
+
350
+ it 'does not require the association' do
351
+ expect(relation.save).to be(true)
352
+ end
353
+ end
354
+
355
+ context 'when the default config is to not require the association' do
356
+
357
+ let(:default_require) { false }
358
+
359
+ it 'does not require the association' do
360
+ expect(relation.save).to be(true)
361
+ end
362
+ end
363
+ end
364
+ end
365
+
366
+ context 'when the relation has the option :optional' do
367
+
368
+ context 'when :required is true' do
369
+
370
+ context 'when :optional is true' do
371
+
372
+ let(:relation_options) do
373
+ {
374
+ required: true,
375
+ optional: true
376
+ }
377
+ end
378
+
379
+ context 'when the default config is to require the association' do
380
+
381
+ let(:default_require) { true }
382
+
383
+ it 'requires the association' do
384
+ expect(relation.save).to be(false)
385
+ end
386
+ end
387
+
388
+ context 'when the default config is to not require the association' do
389
+
390
+ let(:default_require) { false }
391
+
392
+ it 'requires the association' do
393
+ expect(relation.save).to be(false)
394
+ end
395
+ end
396
+ end
397
+
398
+ context 'when :optional is false' do
399
+
400
+ let(:relation_options) do
401
+ {
402
+ required: true,
403
+ optional: false
404
+ }
405
+ end
406
+
407
+ context 'when the default config is to require the association' do
408
+
409
+ let(:default_require) { true }
410
+
411
+ it 'requires the association' do
412
+ expect(relation.save).to be(false)
413
+ end
414
+ end
415
+
416
+ context 'when the default config is to not require the association' do
417
+
418
+ let(:default_require) { false }
419
+
420
+ it 'requires the association' do
421
+ expect(relation.save).to be(false)
422
+ end
423
+ end
424
+ end
425
+ end
426
+
427
+ context 'when :required is false' do
428
+
429
+ context 'when :optional is true' do
430
+
431
+ let(:relation_options) do
432
+ {
433
+ required: false,
434
+ optional: true
435
+ }
436
+ end
437
+
438
+ context 'when the default config is to require the association' do
439
+
440
+ let(:default_require) { true }
441
+
442
+ it 'does not require the association' do
443
+ expect(relation.save).to be(true)
444
+ end
445
+ end
446
+
447
+ context 'when the default config is to not require the association' do
448
+
449
+ let(:default_require) { true }
450
+
451
+ it 'does not require the association' do
452
+ expect(relation.save).to be(true)
453
+ end
454
+ end
455
+ end
456
+
457
+ context 'when :optional is false' do
458
+
459
+ let(:relation_options) do
460
+ {
461
+ required: false,
462
+ optional: false
463
+ }
464
+ end
465
+
466
+ context 'when the default config is to require the association' do
467
+
468
+ let(:default_require) { true }
469
+
470
+ it 'does not require the association' do
471
+ expect(relation.save).to be(true)
472
+ end
473
+ end
474
+
475
+ context 'when the default config is to not require the association' do
476
+
477
+ let(:default_require) { false }
478
+
479
+ it 'does not require the association' do
480
+ expect(relation.save).to be(true)
481
+ end
482
+ end
483
+ end
484
+ end
485
+ end
486
+ end
487
+
488
+ context 'when the relation does not have the option :required' do
489
+
490
+ context 'when the relation has the option :optional' do
491
+
492
+ context 'when :optional is true' do
493
+
494
+ let(:relation_options) do
495
+ { optional: true }
496
+ end
497
+
498
+ context 'when the default config is to require the association' do
499
+
500
+ let(:default_require) { true }
501
+
502
+ it 'does not require the association' do
503
+ expect(relation.save).to be(true)
504
+ end
505
+ end
506
+
507
+ context 'when the default config is to not require the association' do
508
+
509
+ let(:default_require) { false }
510
+
511
+ it 'does not require the association' do
512
+ expect(relation.save).to be(true)
513
+ end
514
+ end
515
+ end
516
+
517
+ context 'when :optional is false' do
518
+
519
+ let(:relation_options) do
520
+ { optional: false }
521
+ end
522
+
523
+ context 'when the default config is to require the association' do
524
+
525
+ let(:default_require) { true }
526
+
527
+ it 'requires the association' do
528
+ expect(relation.save).to be(false)
529
+ end
530
+ end
531
+
532
+ context 'when the default config is to not require the association' do
533
+
534
+ let(:default_require) { false }
535
+
536
+ it 'requires the association' do
537
+ expect(relation.save).to be(false)
538
+ end
539
+ end
540
+ end
541
+ end
542
+ end
543
+ end
544
+
545
+ context 'when the relation does not have options' do
546
+
547
+ context 'when the default config is to require the association' do
548
+
549
+ let(:default_require) { true }
550
+
551
+ it 'requires the association' do
552
+ expect(relation.save).to be(false)
553
+ end
554
+ end
555
+
556
+ context 'when the default config is to not require the association' do
557
+
558
+ let(:default_require) { false }
559
+
560
+ it 'does not require the association' do
561
+ expect(relation.save).to be(true)
562
+ end
563
+ end
228
564
  end
229
565
 
230
566
  context "when the relation is polymorphic" do
@@ -247,6 +583,19 @@ describe Mongoid::Relations::Macros do
247
583
 
248
584
  context "when defining the relation" do
249
585
 
586
+ context 'when the relation name is invalid' do
587
+
588
+ let(:relation) do
589
+ klass.belongs_to(:fields)
590
+ end
591
+
592
+ it 'raises an InvalidRelation exception' do
593
+ expect {
594
+ relation
595
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
596
+ end
597
+ end
598
+
250
599
  before do
251
600
  klass.belongs_to(:person)
252
601
  end
@@ -306,6 +655,19 @@ describe Mongoid::Relations::Macros do
306
655
 
307
656
  context "when defining the relation" do
308
657
 
658
+ context 'when the relation name is invalid' do
659
+
660
+ let(:relation) do
661
+ klass.has_many(:fields)
662
+ end
663
+
664
+ it 'raises an InvalidRelation exception' do
665
+ expect {
666
+ relation
667
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
668
+ end
669
+ end
670
+
309
671
  before do
310
672
  klass.has_many(:posts)
311
673
  end
@@ -364,8 +726,8 @@ describe Mongoid::Relations::Macros do
364
726
  expect(metadata.order).to_not be_nil
365
727
  end
366
728
 
367
- it "returns Origin::Key" do
368
- expect(metadata.order).to be_kind_of(Origin::Key)
729
+ it "returns Mongoid::Criteria::Queryable::Key" do
730
+ expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
369
731
  end
370
732
  end
371
733
 
@@ -389,6 +751,19 @@ describe Mongoid::Relations::Macros do
389
751
 
390
752
  context "when defining the relation" do
391
753
 
754
+ context 'when the relation name is invalid' do
755
+
756
+ let(:relation) do
757
+ klass.has_and_belongs_to_many(:fields)
758
+ end
759
+
760
+ it 'raises an InvalidRelation exception' do
761
+ expect {
762
+ relation
763
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
764
+ end
765
+ end
766
+
392
767
  before do
393
768
  klass.has_and_belongs_to_many(:preferences)
394
769
  end
@@ -429,8 +804,8 @@ describe Mongoid::Relations::Macros do
429
804
  expect(metadata.order).to_not be_nil
430
805
  end
431
806
 
432
- it "returns Origin::Key" do
433
- expect(metadata.order).to be_kind_of(Origin::Key)
807
+ it "returns Mongoid::Criteria::Queryable::Key" do
808
+ expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
434
809
  end
435
810
  end
436
811
 
@@ -459,6 +834,19 @@ describe Mongoid::Relations::Macros do
459
834
 
460
835
  context "when defining the relation" do
461
836
 
837
+ context 'when the relation name is invalid' do
838
+
839
+ let(:relation) do
840
+ klass.has_one(:fields)
841
+ end
842
+
843
+ it 'raises an InvalidRelation exception' do
844
+ expect {
845
+ relation
846
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
847
+ end
848
+ end
849
+
462
850
  before do
463
851
  klass.has_one(:game)
464
852
  end