mongoid 5.4.1 → 6.0.0.beta

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