mongoid 5.4.1 → 6.0.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -21,17 +21,6 @@ describe Mongoid::Relations::Cyclic do
21
21
  it "sets cyclic to true" do
22
22
  expect(document.cyclic).to be true
23
23
  end
24
-
25
- context "when a query is executed" do
26
-
27
- before do
28
- document.save
29
- end
30
-
31
- it "queries the database, not memory" do
32
- expect(Role.first).to be_a(Role)
33
- end
34
- end
35
24
  end
36
25
 
37
26
  context "when the name is not inflected easily" do
@@ -144,17 +133,6 @@ describe Mongoid::Relations::Cyclic do
144
133
  expect(document.class.relations['child_mango']).to be_cascading_callbacks
145
134
  end
146
135
  end
147
-
148
- context "when a query is executed" do
149
-
150
- before do
151
- document.save
152
- end
153
-
154
- it "queries the database, not memory" do
155
- expect(Shelf.first).to be_a(Shelf)
156
- end
157
- end
158
136
  end
159
137
 
160
138
  context "when building a namespaced hierarchy" do
@@ -3761,12 +3761,10 @@ describe Mongoid::Relations::Embedded::Many do
3761
3761
 
3762
3762
  before do
3763
3763
  expect(artist).to receive(:before_add_song).and_raise
3764
+ begin; artist.songs << song; rescue; end
3764
3765
  end
3765
3766
 
3766
3767
  it "does not add the document to the relation" do
3767
- expect {
3768
- artist.songs << song
3769
- }.to raise_error
3770
3768
  expect(artist.songs).to be_empty
3771
3769
  end
3772
3770
  end
@@ -3791,12 +3789,10 @@ describe Mongoid::Relations::Embedded::Many do
3791
3789
 
3792
3790
  before do
3793
3791
  expect(artist).to receive(:after_add_label).and_raise
3792
+ begin; artist.labels << label; rescue; end
3794
3793
  end
3795
3794
 
3796
3795
  it "adds the document to the relation" do
3797
- expect {
3798
- artist.labels << label
3799
- }.to raise_error
3800
3796
  expect(artist.labels).to eq([ label ])
3801
3797
  end
3802
3798
  end
@@ -3857,19 +3853,18 @@ describe Mongoid::Relations::Embedded::Many do
3857
3853
  describe "#delete" do
3858
3854
 
3859
3855
  it "does not remove the document from the relation" do
3860
- expect {
3861
- artist.songs.delete(song)
3862
- }.to raise_error
3856
+ begin; artist.songs.delete(song); rescue; end
3863
3857
  expect(artist.songs).to eq([ song ])
3864
3858
  end
3865
3859
  end
3866
3860
 
3867
3861
  describe "#clear" do
3868
3862
 
3863
+ before do
3864
+ begin; artist.songs.clear; rescue; end
3865
+ end
3866
+
3869
3867
  it "removes the documents from the relation" do
3870
- expect {
3871
- artist.songs.clear
3872
- }.to raise_error
3873
3868
  expect(artist.songs).to eq([ song ])
3874
3869
  end
3875
3870
  end
@@ -3925,9 +3920,7 @@ describe Mongoid::Relations::Embedded::Many do
3925
3920
  describe "#delete" do
3926
3921
 
3927
3922
  before do
3928
- expect {
3929
- artist.labels.delete(label)
3930
- }.to raise_error
3923
+ begin; artist.labels.delete(label); rescue; end
3931
3924
  end
3932
3925
 
3933
3926
  it "removes the document from the relation" do
@@ -3938,9 +3931,7 @@ describe Mongoid::Relations::Embedded::Many do
3938
3931
  describe "#clear" do
3939
3932
 
3940
3933
  before do
3941
- expect {
3942
- artist.labels.clear
3943
- }.to raise_error
3934
+ begin; artist.labels.clear; rescue; end
3944
3935
  end
3945
3936
 
3946
3937
  it "should remove from collection" do
@@ -4019,29 +4010,6 @@ describe Mongoid::Relations::Embedded::Many do
4019
4010
  end
4020
4011
  end
4021
4012
 
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
4013
  context "deleting embedded documents" do
4046
4014
 
4047
4015
  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