mongoid 5.4.1 → 6.1.1

Sign up to get free protection for your applications and to get access to all the features.
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