mongoid 5.4.1 → 6.1.1

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