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
@@ -17,8 +17,8 @@ describe Mongoid::Positional do
17
17
  "children.0.field" => "value",
18
18
  "children.0.children.1.children.3.field" => "value"
19
19
  },
20
- "$push" => {
21
- "children.0.children.1.children.3.fields" => {'$each' => [ "value", "value" ]}
20
+ "$pushAll" => {
21
+ "children.0.children.1.children.3.fields" => [ "value", "value" ]
22
22
  }
23
23
  }
24
24
  end
@@ -113,8 +113,8 @@ describe Mongoid::Positional do
113
113
  "children.$.field" => "value",
114
114
  "children.0.children.1.children.3.field" => "value"
115
115
  },
116
- "$push" => {
117
- "children.0.children.1.children.3.fields" => { '$each' => [ "value", "value" ] }
116
+ "$pushAll" => {
117
+ "children.0.children.1.children.3.fields" => [ "value", "value" ]
118
118
  }
119
119
  }
120
120
  end
@@ -141,8 +141,8 @@ describe Mongoid::Positional do
141
141
  "children.0.field" => "value",
142
142
  "children.0.children.1.children.3.field" => "value"
143
143
  },
144
- "$push" => {
145
- "children.0.children.1.children.3.fields" => { '$each' => [ "value", "value" ] }
144
+ "$pushAll" => {
145
+ "children.0.children.1.children.3.fields" => [ "value", "value" ]
146
146
  }
147
147
  }
148
148
  end
@@ -170,8 +170,8 @@ describe Mongoid::Positional do
170
170
  "children.$.field" => "value",
171
171
  "children.0.children.1.children.3.field" => "value"
172
172
  },
173
- "$push" => {
174
- "children.0.children.1.children.3.fields" => { '$each' => [ "value", "value" ] }
173
+ "$pushAll" => {
174
+ "children.0.children.1.children.3.fields" => [ "value", "value" ]
175
175
  }
176
176
  }
177
177
  end
@@ -203,8 +203,8 @@ describe Mongoid::Positional do
203
203
  "children.$.field" => "value",
204
204
  "children.0.children.1.children.3.field" => "value"
205
205
  },
206
- "$push" => {
207
- "children.0.children.1.children.3.fields" => { '$each' => [ "value", "value" ] }
206
+ "$pushAll" => {
207
+ "children.0.children.1.children.3.fields" => [ "value", "value" ]
208
208
  }
209
209
  }
210
210
  end
@@ -7,6 +7,95 @@ describe Mongoid::QueryCache do
7
7
  Mongoid::QueryCache.cache { spec.run }
8
8
  end
9
9
 
10
+ context 'when iterating over objects sharing the same base' do
11
+
12
+ let(:server) do
13
+ relations.first.mongo_client.cluster.next_primary
14
+ end
15
+
16
+ before do
17
+ person = Person.create
18
+ 3.times do
19
+ person.send(relation).create
20
+ end
21
+ person.save
22
+ end
23
+
24
+ let!(:relations) do
25
+ Person.first.send(relation).to_a
26
+ end
27
+
28
+ context 'when the association is has-many' do
29
+
30
+ let(:relation) do
31
+ :posts
32
+ end
33
+
34
+ context 'when query cache is disabled' do
35
+
36
+ before do
37
+ Mongoid::QueryCache.enabled = false
38
+ end
39
+
40
+ it 'queries for each access to the base' do
41
+ expect(server).to receive(:context).exactly(relations.size).times.and_call_original
42
+ relations.each do |object|
43
+ object.person
44
+ end
45
+ end
46
+ end
47
+
48
+ context 'when query cache is enabled' do
49
+
50
+ before do
51
+ Mongoid::QueryCache.enabled = true
52
+ end
53
+
54
+ it 'queries only once for the base' do
55
+ expect(server).to receive(:context).exactly(1).times.and_call_original
56
+ relations.each do |object|
57
+ object.person
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ context 'when the association is embeds-many' do
64
+
65
+ let(:relation) do
66
+ :symptoms
67
+ end
68
+
69
+ context 'when query cache is disabled' do
70
+
71
+ before do
72
+ Mongoid::QueryCache.enabled = false
73
+ end
74
+
75
+ it 'does not query for access to the base' do
76
+ expect(server).to receive(:context).exactly(0).times.and_call_original
77
+ relations.each do |object|
78
+ object.person
79
+ end
80
+ end
81
+ end
82
+
83
+ context 'when query cache is enabled' do
84
+
85
+ before do
86
+ Mongoid::QueryCache.enabled = true
87
+ end
88
+
89
+ it 'does not query for access to the base' do
90
+ expect(server).to receive(:context).exactly(0).times.and_call_original
91
+ relations.each do |object|
92
+ object.person
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+
10
99
  context "when querying for a single document" do
11
100
 
12
101
  [ :first, :one, :last ].each do |method|
@@ -75,40 +164,6 @@ describe Mongoid::QueryCache do
75
164
  end
76
165
  end
77
166
 
78
- context 'when the first query has a collation', if: collation_supported? do
79
-
80
- before do
81
- Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2).to_a
82
- end
83
-
84
- context "when the next query has the same collation" do
85
-
86
- it "uses the cache" do
87
- expect_no_queries do
88
- Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2).to_a
89
- end
90
- end
91
- end
92
-
93
- context "when the next query does not have the same collation" do
94
-
95
- it "queries again" do
96
- expect_query(1) do
97
- Band.where(name: 'DEPECHE MODE').collation(locale: 'fr', strength: 2).to_a
98
- end
99
- end
100
- end
101
-
102
- context "when the next query does not have a collation" do
103
-
104
- it "queries again" do
105
- expect_query(1) do
106
- Band.where(name: 'DEPECHE MODE').to_a
107
- end
108
- end
109
- end
110
- end
111
-
112
167
  context "when the first query has no limit" do
113
168
 
114
169
  let(:game) do
@@ -305,37 +360,6 @@ describe Mongoid::QueryCache do
305
360
  end
306
361
  end
307
362
 
308
- context "when reloading a document" do
309
-
310
- let!(:band_id) do
311
- Band.create.id
312
- end
313
-
314
- context 'when query cache is disabled' do
315
-
316
- before do
317
- Mongoid::QueryCache.enabled = false
318
- end
319
-
320
- it "queries again" do
321
- band = Band.find(band_id)
322
- expect_query(1) do
323
- band.reload
324
- end
325
- end
326
- end
327
-
328
- context 'when query cache is enabled' do
329
-
330
- it "queries again" do
331
- band = Band.find(band_id)
332
- expect_query(1) do
333
- band.reload
334
- end
335
- end
336
- end
337
- end
338
-
339
363
  context "when querying a very large collection" do
340
364
 
341
365
  before do
@@ -728,7 +728,7 @@ describe Mongoid::Relations::Accessors do
728
728
  game.save
729
729
  end
730
730
 
731
- it "keeps the the foreign key as ObjectID" do
731
+ it "keeps the foreign key as ObjectID" do
732
732
  expect(game.reload.person_id).to eq(person.id)
733
733
  end
734
734
  end
@@ -70,13 +70,44 @@ describe Mongoid::Relations::AutoSave do
70
70
 
71
71
  context "when saving a new parent document" do
72
72
 
73
- before do
74
- person.drugs << drug
75
- person.save
73
+ context 'when persistence options are not set on the parent' do
74
+ before do
75
+ person.drugs << drug
76
+ person.save
77
+ end
78
+
79
+ it "saves the relation" do
80
+ expect(drug).to be_persisted
81
+ end
76
82
  end
77
83
 
78
- it "saves the relation" do
79
- expect(drug).to be_persisted
84
+ context 'when persistence options are set on the parent' do
85
+
86
+ let(:other_database) do
87
+ :other
88
+ end
89
+
90
+ after do
91
+ Person.with(database: other_database) do |person_class|
92
+ person_class.delete_all
93
+ end
94
+ Drug.with(database: other_database) do |drug_class|
95
+ drug_class.delete_all
96
+ end
97
+ end
98
+
99
+ before do
100
+ person.with(database: other_database) do |per|
101
+ per.drugs << drug
102
+ per.save
103
+ end
104
+ end
105
+
106
+ it 'saves the relation with the persistence options' do
107
+ Drug.with(database: other_database) do |drug_class|
108
+ expect(drug_class.count).to eq(1)
109
+ end
110
+ end
80
111
  end
81
112
  end
82
113
 
@@ -160,7 +191,9 @@ describe Mongoid::Relations::AutoSave do
160
191
  it "sends one insert" do
161
192
  account.name = "account"
162
193
  expect_query(1) do
163
- person.with(write: {w:0}).save
194
+ person.with(write: {w:0}) do |_person|
195
+ _person.save
196
+ end
164
197
  end
165
198
  end
166
199
  end
@@ -185,20 +185,47 @@ describe Mongoid::Relations::Builders do
185
185
 
186
186
  context "when a document already exists" do
187
187
 
188
- let!(:game_two) do
189
- person.create_game(name: "Skyrim")
190
- end
188
+ context "when the relation belongs_to is already set" do
191
189
 
192
- it "replaces the existing document" do
193
- expect(person.game).to eq(game_two)
194
- end
190
+ let!(:game_one) do
191
+ game = person.create_game(name: "Starcraft")
192
+ game.person = person
193
+ end
194
+
195
+ let!(:game_two) do
196
+ person.create_game(name: "Skyrim")
197
+ end
198
+
199
+ it "replaces the existing document" do
200
+ expect(person.game).to eq(game_two)
201
+ end
202
+
203
+ it "persists the change" do
204
+ expect(person.game(true)).to eq(game_two)
205
+ end
195
206
 
196
- it "persists the change" do
197
- expect(person.game(true)).to eq(game_two)
207
+ it "removes the old document from the database" do
208
+ expect(Game.collection.find.count).to eq(1)
209
+ end
198
210
  end
199
211
 
200
- it "removes the old document from the database" do
201
- expect(Game.collection.find.count).to eq(1)
212
+ context 'when the relation belongs_to is not already set' do
213
+
214
+ let!(:game_two) do
215
+ person.create_game(name: "Skyrim")
216
+ end
217
+
218
+ it "replaces the existing document" do
219
+ expect(person.game).to eq(game_two)
220
+ end
221
+
222
+ it "persists the change" do
223
+ expect(person.game(true)).to eq(game_two)
224
+ end
225
+
226
+ it "removes the old document from the database" do
227
+ expect(Game.collection.find.count).to eq(1)
228
+ end
202
229
  end
203
230
  end
204
231
  end
@@ -34,7 +34,7 @@ describe Mongoid::Relations::CounterCache do
34
34
  it "expect to raise an error" do
35
35
  expect {
36
36
  person.reset_counters(:not_exist)
37
- }.to raise_error
37
+ }.to raise_error(NoMethodError)
38
38
  end
39
39
  end
40
40
 
@@ -85,6 +85,26 @@ describe Mongoid::Relations::CounterCache do
85
85
  expect(subscription.reload[:packs_count]).to eq(1)
86
86
  end
87
87
  end
88
+
89
+ context 'when there are persistence options set' do
90
+
91
+ let(:subscription) do
92
+ Subscription.new
93
+ end
94
+
95
+ before do
96
+ subscription.with(collection: 'other') do |sub|
97
+ sub.save
98
+ sub.packs.create
99
+ end
100
+ end
101
+
102
+ it 'applies the persistence options when resetting the counter' do
103
+ subscription.with(collection: 'other') do |sub|
104
+ expect(sub.reload[:packs_count]).to eq(1)
105
+ end
106
+ end
107
+ end
88
108
  end
89
109
 
90
110
  describe ".reset_counters" do
@@ -111,7 +131,7 @@ describe Mongoid::Relations::CounterCache do
111
131
  it "expect to raise an error" do
112
132
  expect {
113
133
  Person.reset_counters "1", :drugs
114
- }.to raise_error
134
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
115
135
  end
116
136
  end
117
137
 
@@ -124,7 +144,7 @@ describe Mongoid::Relations::CounterCache do
124
144
  it "expect to raise an error" do
125
145
  expect {
126
146
  Person.reset_counters person.id, :not_exist
127
- }.to raise_error
147
+ }.to raise_error(NoMethodError)
128
148
  end
129
149
  end
130
150
 
@@ -256,6 +276,26 @@ describe Mongoid::Relations::CounterCache do
256
276
  expect(person.reload.drugs_count).to eq(3)
257
277
  end
258
278
  end
279
+
280
+ context 'when there are persistence options set' do
281
+
282
+ let(:person) do
283
+ Person.new
284
+ end
285
+
286
+ before do
287
+ person.with(collection: 'other') do |per|
288
+ per.save
289
+ per.drugs.create
290
+ end
291
+ end
292
+
293
+ it 'applies the persistence options when resetting the counter' do
294
+ person.with(collection: 'other') do |per|
295
+ expect(per.drugs_count).to eq(1)
296
+ end
297
+ end
298
+ end
259
299
  end
260
300
 
261
301
  describe "#decrement_counter" do
@@ -286,6 +326,27 @@ describe Mongoid::Relations::CounterCache do
286
326
  expect(person.reload.drugs_count).to eq(0)
287
327
  end
288
328
  end
329
+
330
+ context 'when there are persistence options set' do
331
+
332
+ let(:person) do
333
+ Person.new
334
+ end
335
+
336
+ before do
337
+ person.with(collection: 'other') do |per|
338
+ per.save
339
+ drug = per.drugs.create
340
+ drug.destroy
341
+ end
342
+ end
343
+
344
+ it 'applies the persistence options when resetting the counter' do
345
+ person.with(collection: 'other') do |per|
346
+ expect(per.reload.drugs_count).to eq(0)
347
+ end
348
+ end
349
+ end
289
350
  end
290
351
 
291
352
  describe "#add_counter_cache_callbacks" do
@@ -351,18 +412,6 @@ describe Mongoid::Relations::CounterCache do
351
412
  it "updates the original object's counter cache" do
352
413
  expect(person1.reload.drugs_count).to eq(1)
353
414
  end
354
-
355
- context 'when foreign_key differs from model name' do
356
-
357
- let(:genre) { PostGenre.create }
358
-
359
- let(:post) { Post.create }
360
-
361
- it 'updates correct counter cache' do
362
- post.update post_genre: genre
363
- expect(genre.reload.posts_count).to eq 1
364
- end
365
- end
366
415
  end
367
416
  end
368
417