mongoid 5.4.1 → 6.1.1

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 (260) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -3
  3. data/lib/config/locales/en.yml +19 -0
  4. data/lib/mongoid.rb +4 -4
  5. data/lib/mongoid/atomic.rb +2 -2
  6. data/lib/mongoid/atomic/modifiers.rb +8 -12
  7. data/lib/mongoid/attributes.rb +22 -21
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/cacheable.rb +36 -0
  10. data/lib/mongoid/changeable.rb +36 -0
  11. data/lib/mongoid/clients.rb +8 -63
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/storage_options.rb +1 -69
  14. data/lib/mongoid/composable.rb +29 -3
  15. data/lib/mongoid/config.rb +1 -0
  16. data/lib/mongoid/contextual/atomic.rb +5 -8
  17. data/lib/mongoid/contextual/map_reduce.rb +0 -4
  18. data/lib/mongoid/contextual/memory.rb +2 -2
  19. data/lib/mongoid/contextual/mongo.rb +40 -22
  20. data/lib/mongoid/contextual/none.rb +12 -0
  21. data/lib/mongoid/copyable.rb +13 -6
  22. data/lib/mongoid/criteria.rb +5 -2
  23. data/lib/mongoid/criteria/marshalable.rb +2 -2
  24. data/lib/mongoid/criteria/modifiable.rb +17 -1
  25. data/lib/mongoid/criteria/options.rb +25 -0
  26. data/lib/mongoid/criteria/queryable.rb +87 -0
  27. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  28. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  46. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  47. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  49. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  50. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  51. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  52. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  53. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  54. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  55. data/lib/mongoid/document.rb +30 -37
  56. data/lib/mongoid/errors.rb +2 -0
  57. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  58. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  59. data/lib/mongoid/errors/invalid_field.rb +2 -2
  60. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  61. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  62. data/lib/mongoid/evolvable.rb +1 -1
  63. data/lib/mongoid/extensions.rb +0 -4
  64. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  65. data/lib/mongoid/extensions/date.rb +4 -1
  66. data/lib/mongoid/extensions/decimal128.rb +3 -3
  67. data/lib/mongoid/extensions/hash.rb +1 -0
  68. data/lib/mongoid/extensions/string.rb +4 -3
  69. data/lib/mongoid/extensions/time.rb +4 -1
  70. data/lib/mongoid/fields/validators/macro.rb +18 -0
  71. data/lib/mongoid/findable.rb +2 -2
  72. data/lib/mongoid/indexable.rb +15 -13
  73. data/lib/mongoid/interceptable.rb +5 -22
  74. data/lib/mongoid/matchable.rb +13 -7
  75. data/lib/mongoid/matchable/all.rb +2 -2
  76. data/lib/mongoid/matchable/and.rb +3 -3
  77. data/lib/mongoid/matchable/default.rb +2 -2
  78. data/lib/mongoid/matchable/elem_match.rb +28 -0
  79. data/lib/mongoid/matchable/exists.rb +2 -2
  80. data/lib/mongoid/matchable/gt.rb +4 -2
  81. data/lib/mongoid/matchable/gte.rb +4 -2
  82. data/lib/mongoid/matchable/in.rb +2 -2
  83. data/lib/mongoid/matchable/lt.rb +4 -2
  84. data/lib/mongoid/matchable/lte.rb +4 -2
  85. data/lib/mongoid/matchable/ne.rb +2 -2
  86. data/lib/mongoid/matchable/nin.rb +2 -2
  87. data/lib/mongoid/matchable/or.rb +3 -3
  88. data/lib/mongoid/matchable/regexp.rb +3 -3
  89. data/lib/mongoid/matchable/size.rb +2 -2
  90. data/lib/mongoid/persistable.rb +3 -5
  91. data/lib/mongoid/persistable/creatable.rb +2 -2
  92. data/lib/mongoid/persistable/deletable.rb +1 -1
  93. data/lib/mongoid/persistable/settable.rb +1 -1
  94. data/lib/mongoid/persistable/updatable.rb +5 -12
  95. data/lib/mongoid/persistable/upsertable.rb +1 -1
  96. data/lib/mongoid/persistence_context.rb +215 -0
  97. data/lib/mongoid/query_cache.rb +3 -6
  98. data/lib/mongoid/relations/accessors.rb +3 -0
  99. data/lib/mongoid/relations/auto_save.rb +12 -4
  100. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  101. data/lib/mongoid/relations/counter_cache.rb +15 -5
  102. data/lib/mongoid/relations/eager.rb +6 -11
  103. data/lib/mongoid/relations/eager/base.rb +3 -3
  104. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  105. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  106. data/lib/mongoid/relations/embedded/batchable.rb +12 -36
  107. data/lib/mongoid/relations/embedded/in.rb +13 -1
  108. data/lib/mongoid/relations/embedded/many.rb +28 -10
  109. data/lib/mongoid/relations/embedded/one.rb +14 -1
  110. data/lib/mongoid/relations/macros.rb +9 -1
  111. data/lib/mongoid/relations/metadata.rb +3 -3
  112. data/lib/mongoid/relations/options.rb +2 -2
  113. data/lib/mongoid/relations/proxy.rb +1 -31
  114. data/lib/mongoid/relations/referenced/in.rb +19 -10
  115. data/lib/mongoid/relations/referenced/many.rb +23 -17
  116. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  117. data/lib/mongoid/relations/referenced/one.rb +15 -1
  118. data/lib/mongoid/relations/synchronization.rb +11 -11
  119. data/lib/mongoid/relations/touchable.rb +6 -3
  120. data/lib/mongoid/reloadable.rb +1 -1
  121. data/lib/mongoid/serializable.rb +1 -1
  122. data/lib/mongoid/traversable.rb +1 -1
  123. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  124. data/lib/mongoid/version.rb +1 -1
  125. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
  126. data/spec/app/models/album.rb +5 -1
  127. data/spec/app/models/artist.rb +21 -0
  128. data/spec/app/models/book.rb +2 -1
  129. data/spec/app/models/dokument.rb +1 -0
  130. data/spec/app/models/ordered_post.rb +5 -0
  131. data/spec/app/models/oscar.rb +1 -2
  132. data/spec/app/models/page.rb +1 -1
  133. data/spec/app/models/person.rb +3 -3
  134. data/spec/app/models/princess.rb +2 -0
  135. data/spec/app/models/record.rb +1 -0
  136. data/spec/app/models/subscription.rb +1 -0
  137. data/spec/app/models/thing.rb +1 -1
  138. data/spec/config/mongoid.yml +15 -0
  139. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  140. data/spec/mongoid/atomic_spec.rb +17 -17
  141. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  142. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  143. data/spec/mongoid/attributes_spec.rb +90 -5
  144. data/spec/mongoid/cacheable_spec.rb +112 -0
  145. data/spec/mongoid/changeable_spec.rb +58 -0
  146. data/spec/mongoid/clients/factory_spec.rb +31 -3
  147. data/spec/mongoid/clients/options_spec.rb +382 -96
  148. data/spec/mongoid/clients_spec.rb +243 -101
  149. data/spec/mongoid/composable_spec.rb +7 -0
  150. data/spec/mongoid/config_spec.rb +67 -11
  151. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  152. data/spec/mongoid/contextual/mongo_spec.rb +165 -20
  153. data/spec/mongoid/contextual/none_spec.rb +15 -0
  154. data/spec/mongoid/copyable_spec.rb +13 -4
  155. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  156. data/spec/mongoid/criteria/options_spec.rb +29 -0
  157. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  158. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  159. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  160. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  161. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  162. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  163. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  164. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  165. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  166. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  167. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  168. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  169. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  170. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  171. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  172. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  173. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  174. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  175. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  176. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  177. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  178. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  179. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  180. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  181. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  182. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  183. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  184. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  185. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
  186. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  187. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  188. data/spec/mongoid/criteria_spec.rb +152 -21
  189. data/spec/mongoid/document_spec.rb +37 -88
  190. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  191. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  192. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  193. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  194. data/spec/mongoid/extensions/date_spec.rb +2 -6
  195. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  196. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  197. data/spec/mongoid/extensions/float_spec.rb +8 -1
  198. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  199. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  200. data/spec/mongoid/extensions/object_spec.rb +11 -0
  201. data/spec/mongoid/extensions/string_spec.rb +21 -0
  202. data/spec/mongoid/extensions/time_spec.rb +2 -6
  203. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  204. data/spec/mongoid/findable_spec.rb +46 -1
  205. data/spec/mongoid/indexable_spec.rb +15 -3
  206. data/spec/mongoid/interceptable_spec.rb +68 -10
  207. data/spec/mongoid/matchable/all_spec.rb +4 -4
  208. data/spec/mongoid/matchable/and_spec.rb +10 -10
  209. data/spec/mongoid/matchable/default_spec.rb +12 -12
  210. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  211. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  212. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  213. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  214. data/spec/mongoid/matchable/in_spec.rb +5 -5
  215. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  216. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  217. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  218. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  219. data/spec/mongoid/matchable/or_spec.rb +7 -7
  220. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  221. data/spec/mongoid/matchable/size_spec.rb +3 -3
  222. data/spec/mongoid/matchable_spec.rb +173 -53
  223. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  224. data/spec/mongoid/persistable/deletable_spec.rb +16 -1
  225. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  226. data/spec/mongoid/persistable/savable_spec.rb +35 -30
  227. data/spec/mongoid/persistable/settable_spec.rb +45 -29
  228. data/spec/mongoid/persistable/updatable_spec.rb +184 -5
  229. data/spec/mongoid/persistence_context_spec.rb +680 -0
  230. data/spec/mongoid/positional_spec.rb +10 -10
  231. data/spec/mongoid/query_cache_spec.rb +89 -0
  232. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  233. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  234. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  235. data/spec/mongoid/relations/builders_spec.rb +37 -10
  236. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  237. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  238. data/spec/mongoid/relations/eager_spec.rb +40 -0
  239. data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
  240. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  241. data/spec/mongoid/relations/macros_spec.rb +395 -7
  242. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  243. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  247. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  248. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  249. data/spec/mongoid/reloadable_spec.rb +51 -0
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +20 -11
  255. metadata +524 -469
  256. checksums.yaml.gz.sig +0 -0
  257. data.tar.gz.sig +0 -0
  258. data/lib/mongoid/clients/thread_options.rb +0 -19
  259. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  260. metadata.gz.sig +0 -0
@@ -20,5 +20,12 @@ describe Mongoid::Composable do
20
20
  end
21
21
  end
22
22
  end
23
+
24
+ Mongoid::Composable::RESERVED_METHOD_NAMES.each do |name|
25
+
26
+ it "includes the method names #{name}" do
27
+ expect(methods).to include(name)
28
+ end
29
+ end
23
30
  end
24
31
  end
@@ -9,6 +9,12 @@ describe Mongoid::Config do
9
9
  end
10
10
  end
11
11
 
12
+ after do
13
+ Mongoid.configure do |config|
14
+ config.load_configuration(CONFIG)
15
+ end
16
+ end
17
+
12
18
  describe "#configured?" do
13
19
 
14
20
  after do
@@ -64,7 +70,7 @@ describe Mongoid::Config do
64
70
 
65
71
  before do
66
72
  if defined?(Rails)
67
- RailsTemp = Rails
73
+ RailsTemp = Rails unless defined?(RailsTemp)
68
74
  Object.send(:remove_const, :Rails)
69
75
  end
70
76
 
@@ -82,10 +88,62 @@ describe Mongoid::Config do
82
88
  end
83
89
  end
84
90
 
91
+ context 'when the belongs_to_required_by_default option is not set in the config' do
92
+
93
+ before do
94
+ Mongoid::Config.reset
95
+ Mongoid.configure do |config|
96
+ config.load_configuration(clients: CONFIG[:clients])
97
+ end
98
+ end
99
+
100
+ it 'sets the Mongoid.belongs_to_required_by_default value to true' do
101
+ expect(Mongoid.belongs_to_required_by_default).to be(true)
102
+ end
103
+ end
104
+
105
+ context 'when the belongs_to_required_by_default option is set in the config' do
106
+
107
+ before do
108
+ Mongoid.configure do |config|
109
+ config.load_configuration(conf)
110
+ end
111
+ end
112
+
113
+ context 'when the value is set to true' do
114
+
115
+ let(:conf) do
116
+ CONFIG.merge(options: { belongs_to_required_by_default: true })
117
+ end
118
+
119
+ it 'sets the Mongoid.belongs_to_required_by_default value to true' do
120
+ expect(Mongoid.belongs_to_required_by_default).to be(true)
121
+ end
122
+ end
123
+
124
+ context 'when the value is set to false' do
125
+
126
+ let(:conf) do
127
+ CONFIG.merge(options: { belongs_to_required_by_default: false })
128
+ end
129
+
130
+ before do
131
+ Mongoid::Config.reset
132
+ Mongoid.configure do |config|
133
+ config.load_configuration(conf)
134
+ end
135
+ end
136
+
137
+ it 'sets the Mongoid.belongs_to_required_by_default value to false' do
138
+ expect(Mongoid.belongs_to_required_by_default).to be(false)
139
+ end
140
+ end
141
+ end
142
+
85
143
  context 'when the app_name is set in the config' do
86
144
 
87
145
  let(:conf) do
88
- CONFIG.merge(options: {app_name: 'admin-reporting'})
146
+ CONFIG.merge(options: { app_name: 'admin-reporting' })
89
147
  end
90
148
 
91
149
  before do
@@ -137,6 +195,10 @@ describe Mongoid::Config do
137
195
  described_class.load!(file, :test)
138
196
  end
139
197
 
198
+ after do
199
+ client.close
200
+ end
201
+
140
202
  it "clears the previous clients" do
141
203
  expect(Mongoid::Clients.clients[:test]).to be_nil
142
204
  end
@@ -148,12 +210,6 @@ describe Mongoid::Config do
148
210
  described_class.load!(file, :test)
149
211
  end
150
212
 
151
- after do
152
- Mongoid.configure do |config|
153
- config.load_configuration(CONFIG)
154
- end
155
- end
156
-
157
213
  it "sets the Mongoid logger level" do
158
214
  expect(Mongoid.logger.level).to eq(Logger::WARN)
159
215
  end
@@ -176,7 +232,7 @@ describe Mongoid::Config do
176
232
 
177
233
  after do
178
234
  if defined?(Rails)
179
- RailsTemp = Rails
235
+ RailsTemp = Rails unless defined?(RailsTemp)
180
236
  Object.send(:remove_const, :Rails)
181
237
  end
182
238
  end
@@ -282,7 +338,7 @@ describe Mongoid::Config do
282
338
  context "when a default is provided" do
283
339
 
284
340
  before do
285
- described_class.load!(file)
341
+ described_class.load!(file, :test_with_max_staleness)
286
342
  end
287
343
 
288
344
  let(:default) do
@@ -301,7 +357,7 @@ describe Mongoid::Config do
301
357
 
302
358
  it "sets the read option" do
303
359
  expect(options["read"]).to eq({ "mode" => :primary_preferred,
304
- "tag_sets" => [{ "use" => "web" }]})
360
+ "max_staleness" => 100 })
305
361
  end
306
362
  end
307
363
  end
@@ -496,7 +496,7 @@ describe Mongoid::Contextual::Atomic do
496
496
  end
497
497
  end
498
498
 
499
- describe "#push_each" do
499
+ describe "#push_all" do
500
500
 
501
501
  context 'when the criteria does not have a collation' do
502
502
 
@@ -517,7 +517,7 @@ describe Mongoid::Contextual::Atomic do
517
517
  end
518
518
 
519
519
  before do
520
- context.push_each(members: [ "Alan", "Fletch" ])
520
+ context.push_all(members: [ "Alan", "Fletch" ])
521
521
  end
522
522
 
523
523
  it "pushes the values to existing arrays" do
@@ -548,7 +548,7 @@ describe Mongoid::Contextual::Atomic do
548
548
  end
549
549
 
550
550
  before do
551
- context.push_each(members: [ "Alan", "Fletch" ])
551
+ context.push_all(members: [ "Alan", "Fletch" ])
552
552
  end
553
553
 
554
554
  it "pushes the values to existing arrays" do
@@ -228,36 +228,36 @@ describe Mongoid::Contextual::Mongo do
228
228
  it "returns the number of documents deleted" do
229
229
  expect(deleted).to eq(1)
230
230
  end
231
- end
232
231
 
233
- context 'when the criteria has a collation', if: collation_supported? do
232
+ context 'when the criteria has a collation', if: collation_supported? do
234
233
 
235
- let(:criteria) do
236
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
237
- end
234
+ let(:criteria) do
235
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
236
+ end
238
237
 
239
- let(:context) do
240
- described_class.new(criteria)
241
- end
238
+ let(:context) do
239
+ described_class.new(criteria)
240
+ end
242
241
 
243
- let!(:deleted) do
244
- context.send(method)
245
- end
242
+ let!(:deleted) do
243
+ context.send(method)
244
+ end
246
245
 
247
- it "deletes the matching documents" do
248
- expect(Band.find(new_order.id)).to eq(new_order)
249
- end
246
+ it "deletes the matching documents" do
247
+ expect(Band.find(new_order.id)).to eq(new_order)
248
+ end
250
249
 
251
- it "deletes the correct number of documents" do
252
- expect(Band.count).to eq(1)
253
- end
250
+ it "deletes the correct number of documents" do
251
+ expect(Band.count).to eq(1)
252
+ end
254
253
 
255
- it "returns the number of documents deleted" do
256
- expect(deleted).to eq(1)
254
+ it "returns the number of documents deleted" do
255
+ expect(deleted).to eq(1)
256
+ end
257
257
  end
258
258
  end
259
259
 
260
- context "when the selector is not constraining" do
260
+ context "when the selector is not contraining" do
261
261
 
262
262
  let(:criteria) do
263
263
  Band.all
@@ -1124,6 +1124,92 @@ describe Mongoid::Contextual::Mongo do
1124
1124
  end
1125
1125
  end
1126
1126
 
1127
+ context 'when the criteria has no sort' do
1128
+
1129
+ let(:criteria) do
1130
+ Band.all
1131
+ end
1132
+
1133
+ let(:context) do
1134
+ described_class.new(criteria)
1135
+ end
1136
+
1137
+
1138
+ it 'applies a sort on _id' do
1139
+ expect(context.send(method)).to eq(depeche_mode)
1140
+ end
1141
+
1142
+ context 'when calling #last' do
1143
+
1144
+ it 'returns the last document, sorted by _id' do
1145
+ expect(context.send(method)).to eq(depeche_mode)
1146
+ expect(context.last).to eq(new_order)
1147
+ end
1148
+ end
1149
+
1150
+ context 'with option { sort: :none }' do
1151
+
1152
+ let(:opts) do
1153
+ { id_sort: :none }
1154
+ end
1155
+
1156
+ it 'does not apply the sort on _id' do
1157
+ expect(context.send(method, opts)).to eq(depeche_mode)
1158
+ end
1159
+
1160
+ context 'when calling #last' do
1161
+
1162
+ it 'does not apply a sort on _id' do
1163
+ expect(context.send(method, opts)).to eq(depeche_mode)
1164
+ expect(context.last(opts)).to eq(depeche_mode)
1165
+ end
1166
+ end
1167
+ end
1168
+ end
1169
+
1170
+ context 'when the criteria has a sort' do
1171
+
1172
+ let(:criteria) do
1173
+ Band.desc(:name)
1174
+ end
1175
+
1176
+ let(:context) do
1177
+ described_class.new(criteria)
1178
+ end
1179
+
1180
+
1181
+ it 'applies the criteria sort' do
1182
+ expect(context.send(method)).to eq(new_order)
1183
+ end
1184
+
1185
+ context 'when calling #last' do
1186
+
1187
+ it 'applies the criteria sort' do
1188
+ expect(context.send(method)).to eq(new_order)
1189
+ expect(context.last).to eq(depeche_mode)
1190
+ end
1191
+ end
1192
+
1193
+ context 'with option { sort: :none }' do
1194
+
1195
+ let(:opts) do
1196
+ { id_sort: :none }
1197
+ end
1198
+
1199
+ it 'applies the criteria sort' do
1200
+ expect(context.send(method, opts)).to eq(new_order)
1201
+ end
1202
+
1203
+ context 'when calling #last' do
1204
+
1205
+ it 'applies the criteria sort' do
1206
+ expect(context.send(method, opts)).to eq(new_order)
1207
+ expect(context.last(opts)).to eq(depeche_mode)
1208
+ end
1209
+ end
1210
+ end
1211
+ end
1212
+
1127
1213
  context "when using .sort" do
1128
1214
 
1129
1215
  let(:criteria) do
@@ -1674,6 +1760,65 @@ describe Mongoid::Contextual::Mongo do
1674
1760
  end
1675
1761
  end
1676
1762
 
1763
+ context "when the output specifies a different db" do
1764
+
1765
+ let(:criteria) do
1766
+ Band.limit(1)
1767
+ end
1768
+
1769
+ let(:context) do
1770
+ described_class.new(criteria)
1771
+ end
1772
+
1773
+ after do
1774
+ Band.with(database: 'another-db') do |b|
1775
+ b.all.delete
1776
+ end
1777
+ end
1778
+
1779
+ context 'when db is a string' do
1780
+
1781
+ let(:results) do
1782
+ context.map_reduce(map, reduce).out(merge: :mr_output, db: 'another-db')
1783
+ end
1784
+
1785
+ it "returns the correct number of documents" do
1786
+ expect(results.count).to eq(1)
1787
+ end
1788
+
1789
+ it "contains the entire results" do
1790
+ expect(results).to eq([
1791
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1792
+ ])
1793
+ end
1794
+
1795
+ it 'writes to the specified db' do
1796
+ expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
1797
+ end
1798
+ end
1799
+
1800
+ context 'when db is a symbol' do
1801
+
1802
+ let(:results) do
1803
+ context.map_reduce(map, reduce).out(merge: :mr_output, 'db' => 'another-db')
1804
+ end
1805
+
1806
+ it "returns the correct number of documents" do
1807
+ expect(results.count).to eq(1)
1808
+ end
1809
+
1810
+ it "contains the entire results" do
1811
+ expect(results).to eq([
1812
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1813
+ ])
1814
+ end
1815
+
1816
+ it 'writes to the specified db' do
1817
+ expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
1818
+ end
1819
+ end
1820
+ end
1821
+
1677
1822
  context "when providing no output" do
1678
1823
 
1679
1824
  let(:criteria) do
@@ -65,6 +65,21 @@ describe Mongoid::Contextual::None do
65
65
  end
66
66
  end
67
67
 
68
+ describe "#distinct" do
69
+
70
+ let!(:band) do
71
+ Band.create(name: "Depeche Mode")
72
+ end
73
+
74
+ let(:context) do
75
+ described_class.new(Band.where(name: "Depeche Mode"))
76
+ end
77
+
78
+ it "returns an empty array" do
79
+ expect(context.distinct(:id)).to eq([])
80
+ end
81
+ end
82
+
68
83
  describe "#pluck" do
69
84
 
70
85
  let!(:band) do
@@ -54,22 +54,31 @@ describe Mongoid::Copyable do
54
54
  end
55
55
  end
56
56
 
57
- context "when a document has old renamed fields" do
57
+ context "when a document has fields from a legacy schema" do
58
58
 
59
59
  let!(:actor) do
60
60
  Actor.create(name: "test")
61
61
  end
62
62
 
63
63
  before do
64
- Actor.collection.find(_id: actor.id).update_one("$set" => { "this_is_not_a_field" => 1 })
64
+ legacy_fields = { "this_is_not_a_field" => 1, "this_legacy_field_is_nil" => nil }
65
+ Actor.collection.find(_id: actor.id).update_one("$set" => legacy_fields)
65
66
  end
66
67
 
67
68
  let(:cloned) do
68
69
  actor.reload.send(method)
69
70
  end
70
71
 
71
- it "copies the document without error" do
72
- expect(cloned.this_is_not_a_field).to eq(1)
72
+ it "sets the legacy attribute" do
73
+ expect(cloned.attributes['this_is_not_a_field']).to eq(1)
74
+ end
75
+
76
+ it "contains legacy attributes that are nil" do
77
+ expect(cloned.attributes.key?('this_legacy_field_is_nil')).to eq(true)
78
+ end
79
+
80
+ it "copies the known attributes" do
81
+ expect(cloned.name).to eq('test')
73
82
  end
74
83
  end
75
84