mongoid 5.4.0 → 6.4.8

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 (301) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +26 -0
  5. data/lib/config/locales/en.yml +40 -0
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic.rb +5 -5
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/attributes.rb +22 -21
  10. data/lib/mongoid/cacheable.rb +36 -0
  11. data/lib/mongoid/changeable.rb +36 -0
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/sessions.rb +113 -0
  14. data/lib/mongoid/clients/storage_options.rb +2 -69
  15. data/lib/mongoid/clients.rb +10 -63
  16. data/lib/mongoid/composable.rb +29 -2
  17. data/lib/mongoid/config.rb +1 -0
  18. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  19. data/lib/mongoid/contextual/atomic.rb +4 -4
  20. data/lib/mongoid/contextual/map_reduce.rb +7 -3
  21. data/lib/mongoid/contextual/memory.rb +9 -4
  22. data/lib/mongoid/contextual/mongo.rb +65 -30
  23. data/lib/mongoid/contextual/none.rb +12 -0
  24. data/lib/mongoid/copyable.rb +13 -6
  25. data/lib/mongoid/criteria/marshalable.rb +2 -2
  26. data/lib/mongoid/criteria/modifiable.rb +29 -3
  27. data/lib/mongoid/criteria/options.rb +25 -0
  28. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -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/extensions.rb +28 -0
  46. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  47. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  48. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  49. data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
  50. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  51. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  52. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  53. data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
  54. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  55. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  56. data/lib/mongoid/criteria/queryable.rb +87 -0
  57. data/lib/mongoid/criteria.rb +6 -2
  58. data/lib/mongoid/document.rb +34 -41
  59. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  60. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  61. data/lib/mongoid/errors/invalid_field.rb +2 -2
  62. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  63. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  64. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  65. data/lib/mongoid/errors.rb +3 -0
  66. data/lib/mongoid/evolvable.rb +1 -1
  67. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  68. data/lib/mongoid/extensions/date.rb +4 -1
  69. data/lib/mongoid/extensions/decimal128.rb +3 -3
  70. data/lib/mongoid/extensions/hash.rb +1 -0
  71. data/lib/mongoid/extensions/regexp.rb +1 -0
  72. data/lib/mongoid/extensions/string.rb +6 -3
  73. data/lib/mongoid/extensions/time.rb +4 -1
  74. data/lib/mongoid/extensions.rb +0 -4
  75. data/lib/mongoid/factory.rb +2 -1
  76. data/lib/mongoid/fields/validators/macro.rb +18 -0
  77. data/lib/mongoid/findable.rb +2 -2
  78. data/lib/mongoid/indexable.rb +16 -14
  79. data/lib/mongoid/interceptable.rb +9 -22
  80. data/lib/mongoid/matchable/all.rb +2 -2
  81. data/lib/mongoid/matchable/and.rb +3 -3
  82. data/lib/mongoid/matchable/default.rb +2 -2
  83. data/lib/mongoid/matchable/elem_match.rb +28 -0
  84. data/lib/mongoid/matchable/exists.rb +2 -2
  85. data/lib/mongoid/matchable/gt.rb +4 -2
  86. data/lib/mongoid/matchable/gte.rb +4 -2
  87. data/lib/mongoid/matchable/in.rb +2 -2
  88. data/lib/mongoid/matchable/lt.rb +4 -2
  89. data/lib/mongoid/matchable/lte.rb +4 -2
  90. data/lib/mongoid/matchable/ne.rb +2 -2
  91. data/lib/mongoid/matchable/nin.rb +2 -2
  92. data/lib/mongoid/matchable/nor.rb +37 -0
  93. data/lib/mongoid/matchable/or.rb +3 -3
  94. data/lib/mongoid/matchable/regexp.rb +3 -3
  95. data/lib/mongoid/matchable/size.rb +2 -2
  96. data/lib/mongoid/matchable.rb +16 -7
  97. data/lib/mongoid/persistable/creatable.rb +5 -3
  98. data/lib/mongoid/persistable/deletable.rb +5 -3
  99. data/lib/mongoid/persistable/destroyable.rb +1 -5
  100. data/lib/mongoid/persistable/settable.rb +5 -5
  101. data/lib/mongoid/persistable/updatable.rb +7 -14
  102. data/lib/mongoid/persistable/upsertable.rb +2 -1
  103. data/lib/mongoid/persistable.rb +4 -6
  104. data/lib/mongoid/persistence_context.rb +220 -0
  105. data/lib/mongoid/query_cache.rb +67 -23
  106. data/lib/mongoid/railtie.rb +17 -1
  107. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  108. data/lib/mongoid/relations/accessors.rb +3 -0
  109. data/lib/mongoid/relations/auto_save.rb +12 -4
  110. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  111. data/lib/mongoid/relations/counter_cache.rb +15 -5
  112. data/lib/mongoid/relations/eager/base.rb +3 -3
  113. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  114. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  115. data/lib/mongoid/relations/eager.rb +6 -11
  116. data/lib/mongoid/relations/embedded/batchable.rb +20 -18
  117. data/lib/mongoid/relations/embedded/in.rb +13 -1
  118. data/lib/mongoid/relations/embedded/many.rb +51 -10
  119. data/lib/mongoid/relations/embedded/one.rb +14 -1
  120. data/lib/mongoid/relations/macros.rb +9 -1
  121. data/lib/mongoid/relations/many.rb +4 -0
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/options.rb +2 -2
  124. data/lib/mongoid/relations/proxy.rb +1 -31
  125. data/lib/mongoid/relations/referenced/in.rb +19 -10
  126. data/lib/mongoid/relations/referenced/many.rb +30 -26
  127. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  128. data/lib/mongoid/relations/referenced/one.rb +15 -1
  129. data/lib/mongoid/relations/synchronization.rb +12 -12
  130. data/lib/mongoid/relations/targets/enumerable.rb +24 -4
  131. data/lib/mongoid/relations/touchable.rb +7 -4
  132. data/lib/mongoid/reloadable.rb +2 -2
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +1 -1
  135. data/lib/mongoid/stateful.rb +1 -0
  136. data/lib/mongoid/tasks/database.rb +3 -2
  137. data/lib/mongoid/threaded.rb +74 -0
  138. data/lib/mongoid/traversable.rb +1 -1
  139. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  140. data/lib/mongoid/version.rb +1 -1
  141. data/lib/mongoid.rb +6 -6
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
  143. data/spec/app/models/agent.rb +2 -0
  144. data/spec/app/models/album.rb +5 -1
  145. data/spec/app/models/array_field.rb +7 -0
  146. data/spec/app/models/artist.rb +21 -0
  147. data/spec/app/models/band.rb +3 -0
  148. data/spec/app/models/book.rb +2 -1
  149. data/spec/app/models/delegating_patient.rb +16 -0
  150. data/spec/app/models/dokument.rb +1 -0
  151. data/spec/app/models/ordered_post.rb +5 -0
  152. data/spec/app/models/oscar.rb +1 -2
  153. data/spec/app/models/page.rb +1 -1
  154. data/spec/app/models/person.rb +3 -3
  155. data/spec/app/models/princess.rb +2 -0
  156. data/spec/app/models/record.rb +1 -0
  157. data/spec/app/models/subscription.rb +1 -0
  158. data/spec/app/models/thing.rb +1 -1
  159. data/spec/config/mongoid.yml +15 -0
  160. data/spec/integration/document_spec.rb +22 -0
  161. data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
  162. data/spec/mongoid/atomic_spec.rb +5 -5
  163. data/spec/mongoid/attributes/nested_spec.rb +18 -14
  164. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  165. data/spec/mongoid/attributes_spec.rb +90 -5
  166. data/spec/mongoid/cacheable_spec.rb +112 -0
  167. data/spec/mongoid/changeable_spec.rb +58 -0
  168. data/spec/mongoid/clients/factory_spec.rb +80 -28
  169. data/spec/mongoid/clients/options_spec.rb +396 -95
  170. data/spec/mongoid/clients/sessions_spec.rb +334 -0
  171. data/spec/mongoid/clients_spec.rb +243 -101
  172. data/spec/mongoid/composable_spec.rb +7 -0
  173. data/spec/mongoid/config_spec.rb +67 -11
  174. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  175. data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
  176. data/spec/mongoid/contextual/mongo_spec.rb +275 -22
  177. data/spec/mongoid/contextual/none_spec.rb +15 -0
  178. data/spec/mongoid/copyable_spec.rb +13 -4
  179. data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
  180. data/spec/mongoid/criteria/options_spec.rb +29 -0
  181. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  182. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  183. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  184. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  185. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  186. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  187. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  188. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  189. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  190. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  191. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  192. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  193. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  194. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  195. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  196. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  197. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  198. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  199. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  200. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  201. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  202. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  203. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  204. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  205. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  206. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  207. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  208. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  209. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
  210. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  211. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  212. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  213. data/spec/mongoid/criteria_spec.rb +156 -22
  214. data/spec/mongoid/document_spec.rb +100 -90
  215. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  216. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  217. data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
  218. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  219. data/spec/mongoid/extensions/date_spec.rb +2 -6
  220. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  221. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  222. data/spec/mongoid/extensions/float_spec.rb +8 -1
  223. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  224. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  225. data/spec/mongoid/extensions/object_spec.rb +11 -0
  226. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  227. data/spec/mongoid/extensions/string_spec.rb +53 -4
  228. data/spec/mongoid/extensions/time_spec.rb +2 -6
  229. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  230. data/spec/mongoid/factory_spec.rb +11 -0
  231. data/spec/mongoid/fields_spec.rb +1 -1
  232. data/spec/mongoid/findable_spec.rb +47 -2
  233. data/spec/mongoid/indexable_spec.rb +15 -3
  234. data/spec/mongoid/interceptable_spec.rb +85 -19
  235. data/spec/mongoid/matchable/all_spec.rb +4 -4
  236. data/spec/mongoid/matchable/and_spec.rb +10 -10
  237. data/spec/mongoid/matchable/default_spec.rb +12 -12
  238. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  239. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  240. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  241. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  242. data/spec/mongoid/matchable/in_spec.rb +5 -5
  243. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  244. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  245. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  246. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  247. data/spec/mongoid/matchable/nor_spec.rb +209 -0
  248. data/spec/mongoid/matchable/or_spec.rb +7 -7
  249. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  250. data/spec/mongoid/matchable/size_spec.rb +3 -3
  251. data/spec/mongoid/matchable_spec.rb +199 -54
  252. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +35 -1
  254. data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
  255. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  256. data/spec/mongoid/persistable/savable_spec.rb +34 -29
  257. data/spec/mongoid/persistable/settable_spec.rb +77 -27
  258. data/spec/mongoid/persistable/updatable_spec.rb +182 -3
  259. data/spec/mongoid/persistable_spec.rb +16 -16
  260. data/spec/mongoid/persistence_context_spec.rb +694 -0
  261. data/spec/mongoid/positional_spec.rb +1 -1
  262. data/spec/mongoid/query_cache_spec.rb +170 -12
  263. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  264. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  265. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  266. data/spec/mongoid/relations/builders_spec.rb +37 -10
  267. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  268. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  269. data/spec/mongoid/relations/eager_spec.rb +40 -0
  270. data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
  271. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  272. data/spec/mongoid/relations/macros_spec.rb +415 -7
  273. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  274. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  275. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  276. data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
  277. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  278. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  279. data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
  280. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  281. data/spec/mongoid/reloadable_spec.rb +51 -0
  282. data/spec/mongoid/scopable_spec.rb +13 -0
  283. data/spec/mongoid/serializable_spec.rb +0 -50
  284. data/spec/mongoid/threaded_spec.rb +68 -0
  285. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  286. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  287. data/spec/mongoid/validatable_spec.rb +16 -0
  288. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  289. data/spec/spec_helper.rb +101 -8
  290. data/spec/support/cluster_config.rb +158 -0
  291. data/spec/support/constraints.rb +101 -0
  292. data/spec/support/macros.rb +20 -0
  293. data/spec/support/session_registry.rb +50 -0
  294. data/spec/support/spec_config.rb +42 -0
  295. data.tar.gz.sig +0 -0
  296. metadata +163 -61
  297. metadata.gz.sig +0 -0
  298. data/lib/mongoid/clients/thread_options.rb +0 -19
  299. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  300. data/lib/mongoid/railties/document.rb +0 -12
  301. data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -15,12 +15,50 @@ 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
+
23
+ describe 'Model loading' do
24
+
25
+ let(:model_associations) do
26
+ class TestModel
27
+ include Mongoid::Document
28
+ field :associations
29
+ end
30
+ end
31
+
32
+ after do
33
+ Object.send(:remove_const, :TestModel)
34
+ end
35
+
36
+ it 'prohibits the use of :associations as an attribute' do
37
+ expect {
38
+ model_associations
39
+ }.to raise_exception(Mongoid::Errors::InvalidField)
40
+ end
41
+ end
42
+
18
43
  describe ".embedded_in" do
19
44
 
20
45
  it "defines the macro" do
21
46
  expect(klass).to respond_to(:embedded_in)
22
47
  end
23
48
 
49
+ context 'when the relation name is invalid' do
50
+
51
+ let(:relation) do
52
+ klass.embedded_in(:fields)
53
+ end
54
+
55
+ it 'raises an InvalidRelation exception' do
56
+ expect {
57
+ relation
58
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
59
+ end
60
+ end
61
+
24
62
  context "when defining the relation" do
25
63
 
26
64
  before do
@@ -74,6 +112,19 @@ describe Mongoid::Relations::Macros do
74
112
 
75
113
  context "when defining the relation" do
76
114
 
115
+ context 'when the relation name is invalid' do
116
+
117
+ let(:relation) do
118
+ klass.embeds_many(:fields)
119
+ end
120
+
121
+ it 'raises an InvalidRelation exception' do
122
+ expect {
123
+ relation
124
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
125
+ end
126
+ end
127
+
77
128
  before do
78
129
  klass.embeds_many(:addresses)
79
130
  end
@@ -132,8 +183,8 @@ describe Mongoid::Relations::Macros do
132
183
  expect(metadata.order).to_not be_nil
133
184
  end
134
185
 
135
- it "returns Origin::Key" do
136
- expect(metadata.order).to be_kind_of(Origin::Key)
186
+ it "returns Mongoid::Criteria::Queryable::Key" do
187
+ expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
137
188
  end
138
189
  end
139
190
 
@@ -157,6 +208,19 @@ describe Mongoid::Relations::Macros do
157
208
 
158
209
  context "when defining the relation" do
159
210
 
211
+ context 'when the relation name is invalid' do
212
+
213
+ let(:relation) do
214
+ klass.embeds_one(:fields)
215
+ end
216
+
217
+ it 'raises an InvalidRelation exception' do
218
+ expect {
219
+ relation
220
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
221
+ end
222
+ end
223
+
160
224
  before do
161
225
  klass.embeds_one(:name)
162
226
  end
@@ -223,8 +287,300 @@ describe Mongoid::Relations::Macros do
223
287
 
224
288
  describe ".belongs_to" do
225
289
 
290
+ let(:_class) do
291
+ class RelationsTestClass
292
+ include Mongoid::Document
293
+ end
294
+ end
295
+
296
+ let(:conf) do
297
+ CONFIG.merge(options: { belongs_to_required_by_default: default_require })
298
+ end
299
+
300
+ let(:relation) do
301
+ _class.new
302
+ end
303
+
304
+ let(:relation_options) { {} }
305
+
306
+ let(:default_require) { Mongoid.belongs_to_required_by_default }
307
+
308
+ before do
309
+ Mongoid.configure do |config|
310
+ config.load_configuration(conf)
311
+ end
312
+ _class.belongs_to(:person, relation_options)
313
+ end
314
+
315
+ after do
316
+ Object.send(:remove_const, _class.name)
317
+ end
318
+
319
+ after(:all) do
320
+ Mongoid.configure do |config|
321
+ config.load_configuration(CONFIG)
322
+ end
323
+ end
324
+
226
325
  it "defines the macro" do
227
- expect(klass).to respond_to(:belongs_to)
326
+ expect(_class).to respond_to(:belongs_to)
327
+ end
328
+
329
+ context 'when the relation has options' do
330
+
331
+ context 'when the relation has the option :required' do
332
+
333
+ context 'when the relation does not have the :optional option' do
334
+
335
+ context 'when :required is true' do
336
+
337
+ let(:relation_options) do
338
+ { required: true }
339
+ end
340
+
341
+ context 'when the default config is to require the association' do
342
+
343
+ let(:default_require) { true }
344
+
345
+ it 'requires the association' do
346
+ expect(relation.save).to be(false)
347
+ end
348
+ end
349
+
350
+ context 'when the default config is to not require the association' do
351
+
352
+ let(:default_require) { false }
353
+
354
+ it 'requires the association' do
355
+ expect(relation.save).to be(false)
356
+ end
357
+ end
358
+ end
359
+
360
+ context 'when :required is false' do
361
+
362
+ let(:relation_options) do
363
+ { required: false }
364
+ end
365
+
366
+ context 'when the default config is to require the association' do
367
+
368
+ let(:default_require) { true }
369
+
370
+ it 'does not require the association' do
371
+ expect(relation.save).to be(true)
372
+ end
373
+ end
374
+
375
+ context 'when the default config is to not require the association' do
376
+
377
+ let(:default_require) { false }
378
+
379
+ it 'does not require the association' do
380
+ expect(relation.save).to be(true)
381
+ end
382
+ end
383
+ end
384
+ end
385
+
386
+ context 'when the relation has the option :optional' do
387
+
388
+ context 'when :required is true' do
389
+
390
+ context 'when :optional is true' do
391
+
392
+ let(:relation_options) do
393
+ {
394
+ required: true,
395
+ optional: true
396
+ }
397
+ end
398
+
399
+ context 'when the default config is to require the association' do
400
+
401
+ let(:default_require) { true }
402
+
403
+ it 'requires the association' do
404
+ expect(relation.save).to be(false)
405
+ end
406
+ end
407
+
408
+ context 'when the default config is to not require the association' do
409
+
410
+ let(:default_require) { false }
411
+
412
+ it 'requires the association' do
413
+ expect(relation.save).to be(false)
414
+ end
415
+ end
416
+ end
417
+
418
+ context 'when :optional is false' do
419
+
420
+ let(:relation_options) do
421
+ {
422
+ required: true,
423
+ optional: false
424
+ }
425
+ end
426
+
427
+ context 'when the default config is to require the association' do
428
+
429
+ let(:default_require) { true }
430
+
431
+ it 'requires the association' do
432
+ expect(relation.save).to be(false)
433
+ end
434
+ end
435
+
436
+ context 'when the default config is to not require the association' do
437
+
438
+ let(:default_require) { false }
439
+
440
+ it 'requires the association' do
441
+ expect(relation.save).to be(false)
442
+ end
443
+ end
444
+ end
445
+ end
446
+
447
+ context 'when :required is false' do
448
+
449
+ context 'when :optional is true' do
450
+
451
+ let(:relation_options) do
452
+ {
453
+ required: false,
454
+ optional: true
455
+ }
456
+ end
457
+
458
+ context 'when the default config is to require the association' do
459
+
460
+ let(:default_require) { true }
461
+
462
+ it 'does not require the association' do
463
+ expect(relation.save).to be(true)
464
+ end
465
+ end
466
+
467
+ context 'when the default config is to not require the association' do
468
+
469
+ let(:default_require) { true }
470
+
471
+ it 'does not require the association' do
472
+ expect(relation.save).to be(true)
473
+ end
474
+ end
475
+ end
476
+
477
+ context 'when :optional is false' do
478
+
479
+ let(:relation_options) do
480
+ {
481
+ required: false,
482
+ optional: false
483
+ }
484
+ end
485
+
486
+ context 'when the default config is to require the association' do
487
+
488
+ let(:default_require) { true }
489
+
490
+ it 'does not require the association' do
491
+ expect(relation.save).to be(true)
492
+ end
493
+ end
494
+
495
+ context 'when the default config is to not require the association' do
496
+
497
+ let(:default_require) { false }
498
+
499
+ it 'does not require the association' do
500
+ expect(relation.save).to be(true)
501
+ end
502
+ end
503
+ end
504
+ end
505
+ end
506
+ end
507
+
508
+ context 'when the relation does not have the option :required' do
509
+
510
+ context 'when the relation has the option :optional' do
511
+
512
+ context 'when :optional is true' do
513
+
514
+ let(:relation_options) do
515
+ { optional: true }
516
+ end
517
+
518
+ context 'when the default config is to require the association' do
519
+
520
+ let(:default_require) { true }
521
+
522
+ it 'does not require the association' do
523
+ expect(relation.save).to be(true)
524
+ end
525
+ end
526
+
527
+ context 'when the default config is to not require the association' do
528
+
529
+ let(:default_require) { false }
530
+
531
+ it 'does not require the association' do
532
+ expect(relation.save).to be(true)
533
+ end
534
+ end
535
+ end
536
+
537
+ context 'when :optional is false' do
538
+
539
+ let(:relation_options) do
540
+ { optional: false }
541
+ end
542
+
543
+ context 'when the default config is to require the association' do
544
+
545
+ let(:default_require) { true }
546
+
547
+ it 'requires the association' do
548
+ expect(relation.save).to be(false)
549
+ end
550
+ end
551
+
552
+ context 'when the default config is to not require the association' do
553
+
554
+ let(:default_require) { false }
555
+
556
+ it 'requires the association' do
557
+ expect(relation.save).to be(false)
558
+ end
559
+ end
560
+ end
561
+ end
562
+ end
563
+ end
564
+
565
+ context 'when the relation does not have options' do
566
+
567
+ context 'when the default config is to require the association' do
568
+
569
+ let(:default_require) { true }
570
+
571
+ it 'requires the association' do
572
+ expect(relation.save).to be(false)
573
+ end
574
+ end
575
+
576
+ context 'when the default config is to not require the association' do
577
+
578
+ let(:default_require) { false }
579
+
580
+ it 'does not require the association' do
581
+ expect(relation.save).to be(true)
582
+ end
583
+ end
228
584
  end
229
585
 
230
586
  context "when the relation is polymorphic" do
@@ -247,6 +603,19 @@ describe Mongoid::Relations::Macros do
247
603
 
248
604
  context "when defining the relation" do
249
605
 
606
+ context 'when the relation name is invalid' do
607
+
608
+ let(:relation) do
609
+ klass.belongs_to(:fields)
610
+ end
611
+
612
+ it 'raises an InvalidRelation exception' do
613
+ expect {
614
+ relation
615
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
616
+ end
617
+ end
618
+
250
619
  before do
251
620
  klass.belongs_to(:person)
252
621
  end
@@ -306,6 +675,19 @@ describe Mongoid::Relations::Macros do
306
675
 
307
676
  context "when defining the relation" do
308
677
 
678
+ context 'when the relation name is invalid' do
679
+
680
+ let(:relation) do
681
+ klass.has_many(:fields)
682
+ end
683
+
684
+ it 'raises an InvalidRelation exception' do
685
+ expect {
686
+ relation
687
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
688
+ end
689
+ end
690
+
309
691
  before do
310
692
  klass.has_many(:posts)
311
693
  end
@@ -364,8 +746,8 @@ describe Mongoid::Relations::Macros do
364
746
  expect(metadata.order).to_not be_nil
365
747
  end
366
748
 
367
- it "returns Origin::Key" do
368
- expect(metadata.order).to be_kind_of(Origin::Key)
749
+ it "returns Mongoid::Criteria::Queryable::Key" do
750
+ expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
369
751
  end
370
752
  end
371
753
 
@@ -389,6 +771,19 @@ describe Mongoid::Relations::Macros do
389
771
 
390
772
  context "when defining the relation" do
391
773
 
774
+ context 'when the relation name is invalid' do
775
+
776
+ let(:relation) do
777
+ klass.has_and_belongs_to_many(:fields)
778
+ end
779
+
780
+ it 'raises an InvalidRelation exception' do
781
+ expect {
782
+ relation
783
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
784
+ end
785
+ end
786
+
392
787
  before do
393
788
  klass.has_and_belongs_to_many(:preferences)
394
789
  end
@@ -429,8 +824,8 @@ describe Mongoid::Relations::Macros do
429
824
  expect(metadata.order).to_not be_nil
430
825
  end
431
826
 
432
- it "returns Origin::Key" do
433
- expect(metadata.order).to be_kind_of(Origin::Key)
827
+ it "returns Mongoid::Criteria::Queryable::Key" do
828
+ expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
434
829
  end
435
830
  end
436
831
 
@@ -459,6 +854,19 @@ describe Mongoid::Relations::Macros do
459
854
 
460
855
  context "when defining the relation" do
461
856
 
857
+ context 'when the relation name is invalid' do
858
+
859
+ let(:relation) do
860
+ klass.has_one(:fields)
861
+ end
862
+
863
+ it 'raises an InvalidRelation exception' do
864
+ expect {
865
+ relation
866
+ }.to raise_exception(Mongoid::Errors::InvalidRelation)
867
+ end
868
+ end
869
+
462
870
  before do
463
871
  klass.has_one(:game)
464
872
  end
@@ -1896,6 +1896,21 @@ describe Mongoid::Relations::Metadata do
1896
1896
  end
1897
1897
  end
1898
1898
 
1899
+ context "when touch specifies additional field" do
1900
+
1901
+ let(:metadata) do
1902
+ described_class.new(
1903
+ name: :versions,
1904
+ relation: Mongoid::Relations::Referenced::In,
1905
+ touch: :changed_at
1906
+ )
1907
+ end
1908
+
1909
+ it "returns true" do
1910
+ expect(metadata).to be_touchable
1911
+ end
1912
+ end
1913
+
1899
1914
  context "when touch is nil" do
1900
1915
 
1901
1916
  let(:metadata) do
@@ -1967,5 +1982,4 @@ describe Mongoid::Relations::Metadata do
1967
1982
  end
1968
1983
  end
1969
1984
  end
1970
-
1971
1985
  end
@@ -19,7 +19,9 @@ describe Mongoid::Relations::Proxy do
19
19
 
20
20
  it 'uses the new persistence options' do
21
21
  expect {
22
- animal.with(write: { w: 100 }).update_attribute(:name, 'kangaroo')
22
+ animal.with(write: { w: 100 }) do |an|
23
+ an.update_attribute(:name, 'kangaroo')
24
+ end
23
25
  }.to raise_exception(Mongo::Error::OperationFailure)
24
26
  end
25
27
  end
@@ -95,4 +97,28 @@ describe Mongoid::Relations::Proxy do
95
97
  end
96
98
  end
97
99
  end
100
+
101
+ describe "equality" do
102
+ let(:messages) do
103
+ Person.create.messages
104
+ end
105
+
106
+ it "is #equal? to itself" do
107
+ expect(messages.equal?(messages)).to eq(true)
108
+ end
109
+
110
+ it "is == to itself" do
111
+ expect(messages == messages).to eq(true)
112
+ end
113
+
114
+ it "is not #equal? to its target" do
115
+ expect(messages.equal?(messages.target)).to eq(false)
116
+ expect(messages.target.equal?(messages)).to eq(false)
117
+ end
118
+
119
+ it "is == to its target" do
120
+ expect(messages == messages.target).to eq(true)
121
+ expect(messages.target == messages).to eq(true)
122
+ end
123
+ end
98
124
  end
@@ -264,6 +264,44 @@ describe Mongoid::Relations::Referenced::In do
264
264
 
265
265
  context "when the relation is not polymorphic" do
266
266
 
267
+ context 'when the child has persistence options set' do
268
+
269
+ let(:person) do
270
+ Person.new
271
+ end
272
+
273
+ let(:post) do
274
+ Post.new
275
+ end
276
+
277
+ before do
278
+ post.with(collection: 'other-posts') do |p|
279
+ person.with(collection: 'other-people') do |per|
280
+ p.person = person
281
+ per.save
282
+ p.save
283
+ end
284
+ end
285
+ end
286
+
287
+ let(:other_people_count) do
288
+ Person.with(collection: 'other-people') do |person_class|
289
+ person_class.count
290
+ end
291
+ end
292
+
293
+ let(:other_posts_count) do
294
+ Post.with(collection: 'other-posts') do |post_class|
295
+ post_class.count
296
+ end
297
+ end
298
+
299
+ it 'applies the persistence options when saving the child' do
300
+ expect(other_people_count).to eq(1)
301
+ expect(other_posts_count).to eq(1)
302
+ end
303
+ end
304
+
267
305
  context "when the child is a new record" do
268
306
 
269
307
  let(:person) do
@@ -1028,7 +1066,9 @@ describe Mongoid::Relations::Referenced::In do
1028
1066
  :index,
1029
1067
  :polymorphic,
1030
1068
  :primary_key,
1031
- :touch
1069
+ :touch,
1070
+ :optional,
1071
+ :required
1032
1072
  ]
1033
1073
  )
1034
1074
  end