mongoid 4.0.2 → 5.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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +14 -13
  4. data/lib/config/locales/en.yml +28 -28
  5. data/lib/mongoid.rb +28 -21
  6. data/lib/mongoid/atomic.rb +2 -4
  7. data/lib/mongoid/attributes.rb +7 -7
  8. data/lib/mongoid/attributes/processing.rb +4 -1
  9. data/lib/mongoid/attributes/readonly.rb +2 -2
  10. data/lib/mongoid/changeable.rb +4 -6
  11. data/lib/mongoid/clients.rb +142 -0
  12. data/lib/mongoid/clients/factory.rb +78 -0
  13. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  14. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  15. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  16. data/lib/mongoid/clients/validators.rb +2 -0
  17. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  18. data/lib/mongoid/composable.rb +3 -3
  19. data/lib/mongoid/config.rb +39 -41
  20. data/lib/mongoid/config/environment.rb +1 -1
  21. data/lib/mongoid/config/validators.rb +1 -1
  22. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  23. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  24. data/lib/mongoid/contextual/atomic.rb +11 -11
  25. data/lib/mongoid/contextual/command.rb +9 -6
  26. data/lib/mongoid/contextual/geo_near.rb +17 -1
  27. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  28. data/lib/mongoid/contextual/memory.rb +2 -5
  29. data/lib/mongoid/contextual/mongo.rb +92 -82
  30. data/lib/mongoid/contextual/none.rb +13 -0
  31. data/lib/mongoid/copyable.rb +6 -1
  32. data/lib/mongoid/criteria.rb +36 -3
  33. data/lib/mongoid/document.rb +3 -4
  34. data/lib/mongoid/errors.rb +6 -6
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/no_client_config.rb +22 -0
  37. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  38. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  39. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  40. data/lib/mongoid/errors/no_default_client.rb +23 -0
  41. data/lib/mongoid/extensions/hash.rb +5 -1
  42. data/lib/mongoid/extensions/object.rb +3 -2
  43. data/lib/mongoid/extensions/set.rb +5 -5
  44. data/lib/mongoid/factory.rb +4 -2
  45. data/lib/mongoid/fields.rb +7 -2
  46. data/lib/mongoid/findable.rb +4 -1
  47. data/lib/mongoid/indexable.rb +15 -9
  48. data/lib/mongoid/persistable.rb +1 -2
  49. data/lib/mongoid/persistable/creatable.rb +2 -2
  50. data/lib/mongoid/persistable/deletable.rb +3 -3
  51. data/lib/mongoid/persistable/incrementable.rb +1 -1
  52. data/lib/mongoid/persistable/logical.rb +1 -1
  53. data/lib/mongoid/persistable/poppable.rb +1 -1
  54. data/lib/mongoid/persistable/pullable.rb +2 -2
  55. data/lib/mongoid/persistable/pushable.rb +2 -2
  56. data/lib/mongoid/persistable/renamable.rb +1 -1
  57. data/lib/mongoid/persistable/settable.rb +1 -1
  58. data/lib/mongoid/persistable/unsettable.rb +1 -1
  59. data/lib/mongoid/persistable/updatable.rb +2 -2
  60. data/lib/mongoid/persistable/upsertable.rb +1 -1
  61. data/lib/mongoid/query_cache.rb +98 -104
  62. data/lib/mongoid/railtie.rb +1 -21
  63. data/lib/mongoid/railties/database.rake +1 -1
  64. data/lib/mongoid/relations/builders.rb +3 -1
  65. data/lib/mongoid/relations/counter_cache.rb +1 -1
  66. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  67. data/lib/mongoid/relations/embedded/many.rb +4 -2
  68. data/lib/mongoid/relations/many.rb +1 -0
  69. data/lib/mongoid/relations/proxy.rb +6 -6
  70. data/lib/mongoid/relations/referenced/many.rb +2 -1
  71. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  72. data/lib/mongoid/relations/touchable.rb +1 -1
  73. data/lib/mongoid/reloadable.rb +2 -2
  74. data/lib/mongoid/scopable.rb +6 -17
  75. data/lib/mongoid/selectable.rb +1 -36
  76. data/lib/mongoid/serializable.rb +2 -2
  77. data/lib/mongoid/stateful.rb +0 -1
  78. data/lib/mongoid/tasks/database.rake +2 -2
  79. data/lib/mongoid/tasks/database.rb +23 -16
  80. data/lib/mongoid/threaded.rb +54 -33
  81. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  82. data/lib/mongoid/traversable.rb +16 -1
  83. data/lib/mongoid/validatable.rb +1 -1
  84. data/lib/mongoid/validatable/queryable.rb +1 -1
  85. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  86. data/lib/mongoid/version.rb +1 -1
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  88. data/lib/rails/mongoid.rb +2 -2
  89. data/spec/app/models/audio.rb +1 -1
  90. data/spec/app/models/band.rb +1 -0
  91. data/spec/app/models/company.rb +5 -0
  92. data/spec/app/models/label.rb +7 -0
  93. data/spec/app/models/pub.rb +6 -0
  94. data/spec/app/models/staff.rb +7 -0
  95. data/spec/app/models/store_as_dup_test1.rb +5 -0
  96. data/spec/app/models/store_as_dup_test2.rb +5 -0
  97. data/spec/config/mongoid.yml +7 -25
  98. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  99. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  100. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  101. data/spec/mongoid/attributes_spec.rb +3 -3
  102. data/spec/mongoid/changeable_spec.rb +70 -0
  103. data/spec/mongoid/clients/factory_spec.rb +284 -0
  104. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  105. data/spec/mongoid/clients_spec.rb +739 -0
  106. data/spec/mongoid/config/environment_spec.rb +14 -11
  107. data/spec/mongoid/config_spec.rb +33 -48
  108. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  109. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  110. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  111. data/spec/mongoid/contextual/none_spec.rb +15 -0
  112. data/spec/mongoid/copyable_spec.rb +35 -1
  113. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  114. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  115. data/spec/mongoid/criteria_spec.rb +74 -91
  116. data/spec/mongoid/document_spec.rb +1 -1
  117. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  118. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  119. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  120. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  121. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  122. data/spec/mongoid/fields/localized_spec.rb +1 -0
  123. data/spec/mongoid/fields_spec.rb +1 -0
  124. data/spec/mongoid/findable_spec.rb +2 -23
  125. data/spec/mongoid/indexable_spec.rb +12 -8
  126. data/spec/mongoid/interceptable_spec.rb +15 -0
  127. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  128. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  129. data/spec/mongoid/persistable_spec.rb +4 -4
  130. data/spec/mongoid/query_cache_spec.rb +13 -8
  131. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  132. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  133. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  134. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  135. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  136. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  137. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  138. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  139. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  140. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  141. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  142. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  143. data/spec/mongoid/reloadable_spec.rb +6 -6
  144. data/spec/mongoid/scopable_spec.rb +41 -28
  145. data/spec/mongoid/selectable_spec.rb +6 -16
  146. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  147. data/spec/mongoid/tasks/database_spec.rb +2 -2
  148. data/spec/mongoid/threaded_spec.rb +0 -7
  149. data/spec/mongoid/traversable_spec.rb +2 -2
  150. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  151. data/spec/mongoid_spec.rb +13 -15
  152. data/spec/rails/mongoid_spec.rb +13 -4
  153. data/spec/spec_helper.rb +44 -27
  154. data/spec/support/authorization.rb +12 -0
  155. data/spec/support/expectations.rb +14 -0
  156. metadata +52 -59
  157. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  158. data/lib/mongoid/contextual/text_search.rb +0 -178
  159. data/lib/mongoid/criteria/#findable.rb# +0 -141
  160. data/lib/mongoid/errors/no_default_session.rb +0 -23
  161. data/lib/mongoid/errors/no_session_config.rb +0 -22
  162. data/lib/mongoid/log_subscriber.rb +0 -55
  163. data/lib/mongoid/positional.rb +0 -71
  164. data/lib/mongoid/sessions.rb +0 -125
  165. data/lib/mongoid/sessions/factory.rb +0 -131
  166. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  167. data/lib/mongoid/sessions/validators.rb +0 -2
  168. data/lib/mongoid/support/query_counter.rb +0 -23
  169. data/spec/helpers.rb +0 -18
  170. data/spec/mongoid/#atomic_spec.rb# +0 -365
  171. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  172. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  173. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  174. data/spec/mongoid/positional_spec.rb +0 -222
  175. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  176. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  177. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -65,6 +65,21 @@ describe Mongoid::Contextual::None do
65
65
  end
66
66
  end
67
67
 
68
+ describe "#pluck" 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.pluck(:id)).to eq([])
80
+ end
81
+ end
82
+
68
83
  describe "#first" do
69
84
 
70
85
  let!(:band) do
@@ -42,7 +42,7 @@ describe Mongoid::Copyable do
42
42
  end
43
43
 
44
44
  before do
45
- Band.collection.find(_id: band.id).update("$set" => { "id" => 1234 })
45
+ Band.collection.find(_id: band.id).update_one("$set" => { "id" => 1234 })
46
46
  end
47
47
 
48
48
  let!(:cloned) do
@@ -54,9 +54,43 @@ describe Mongoid::Copyable do
54
54
  end
55
55
  end
56
56
 
57
+ context "when a document has old renamed fields" do
58
+
59
+ let!(:actor) do
60
+ Actor.create(name: "test")
61
+ end
62
+
63
+ before do
64
+ Actor.collection.find(_id: actor.id).update_one("$set" => { "this_is_not_a_field" => 1 })
65
+ end
66
+
67
+ let(:cloned) do
68
+ actor.reload.send(method)
69
+ end
70
+
71
+ it "copies the document without error" do
72
+ expect(cloned.this_is_not_a_field).to eq(1)
73
+ end
74
+ end
75
+
76
+ context "when using store_as" do
77
+
78
+ context "and dynamic attributes are not set" do
79
+
80
+ it "clones" do
81
+ t = StoreAsDupTest1.new(:name => "hi")
82
+ t.build_store_as_dup_test2(:name => "there")
83
+ t.save
84
+ copy = t.send(method)
85
+ expect(copy.store_as_dup_test2.name).to eq(t.store_as_dup_test2.name)
86
+ end
87
+ end
88
+ end
89
+
57
90
  context "when cloning a document with multiple languages field" do
58
91
 
59
92
  before do
93
+ I18n.enforce_available_locales = false
60
94
  I18n.locale = 'pt_BR'
61
95
  person.desc = "descrição"
62
96
  person.save
@@ -239,6 +239,203 @@ describe Mongoid::Criteria::Findable do
239
239
  end
240
240
  end
241
241
  end
242
+
243
+ context "when providing a single id as extended json" do
244
+
245
+ context "when the id matches" do
246
+
247
+ let(:found) do
248
+ Band.find(band.id.as_json)
249
+ end
250
+
251
+ it "returns the matching document" do
252
+ expect(found).to eq(band)
253
+ end
254
+ end
255
+
256
+ context "when the id does not match" do
257
+
258
+ context "when raising a not found error" do
259
+
260
+ before do
261
+ Mongoid.raise_not_found_error = true
262
+ end
263
+
264
+ let(:found) do
265
+ Band.find(BSON::ObjectId.new.as_json)
266
+ end
267
+
268
+ it "raises an error" do
269
+ expect {
270
+ found
271
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
272
+ end
273
+ end
274
+
275
+ context "when raising no error" do
276
+
277
+ before do
278
+ Mongoid.raise_not_found_error = false
279
+ end
280
+
281
+ after do
282
+ Mongoid.raise_not_found_error = true
283
+ end
284
+
285
+ let(:found) do
286
+ Band.find(BSON::ObjectId.new.as_json)
287
+ end
288
+
289
+ it "returns nil" do
290
+ expect(found).to be_nil
291
+ end
292
+ end
293
+ end
294
+ end
295
+
296
+ context "when providing a splat of extended json ids" do
297
+
298
+ let!(:band_two) do
299
+ Band.create(name: "Tool")
300
+ end
301
+
302
+ context "when all ids match" do
303
+
304
+ let(:found) do
305
+ Band.find(band.id.as_json, band_two.id.as_json)
306
+ end
307
+
308
+ it "contains the first match" do
309
+ expect(found).to include(band)
310
+ end
311
+
312
+ it "contains the second match" do
313
+ expect(found).to include(band_two)
314
+ end
315
+
316
+ context "when ids are duplicates" do
317
+
318
+ let(:found) do
319
+ Band.find(band.id, band.id)
320
+ end
321
+
322
+ it "contains only the first match" do
323
+ expect(found).to eq([band])
324
+ end
325
+ end
326
+ end
327
+
328
+ context "when any id does not match" do
329
+
330
+ context "when raising a not found error" do
331
+
332
+ before do
333
+ Mongoid.raise_not_found_error = true
334
+ end
335
+
336
+ let(:found) do
337
+ Band.find(band.id.as_json, BSON::ObjectId.new.as_json)
338
+ end
339
+
340
+ it "raises an error" do
341
+ expect {
342
+ found
343
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
344
+ end
345
+ end
346
+
347
+ context "when raising no error" do
348
+
349
+ before do
350
+ Mongoid.raise_not_found_error = false
351
+ end
352
+
353
+ after do
354
+ Mongoid.raise_not_found_error = true
355
+ end
356
+
357
+ let(:found) do
358
+ Band.find(band.id.as_json, BSON::ObjectId.new.as_json)
359
+ end
360
+
361
+ it "returns only the matching documents" do
362
+ expect(found).to eq([ band ])
363
+ end
364
+ end
365
+ end
366
+ end
367
+
368
+ context "when providing an array of extended json ids" do
369
+
370
+ let!(:band_two) do
371
+ Band.create(name: "Tool")
372
+ end
373
+
374
+ context "when all ids match" do
375
+
376
+ let(:found) do
377
+ Band.find([ band.id.as_json, band_two.id.as_json ])
378
+ end
379
+
380
+ it "contains the first match" do
381
+ expect(found).to include(band)
382
+ end
383
+
384
+ it "contains the second match" do
385
+ expect(found).to include(band_two)
386
+ end
387
+
388
+ context "when ids are duplicates" do
389
+
390
+ let(:found) do
391
+ Band.find([ band.id, band.id ])
392
+ end
393
+
394
+ it "contains only the first match" do
395
+ expect(found).to eq([band])
396
+ end
397
+ end
398
+ end
399
+
400
+ context "when any id does not match" do
401
+
402
+ context "when raising a not found error" do
403
+
404
+ before do
405
+ Mongoid.raise_not_found_error = true
406
+ end
407
+
408
+ let(:found) do
409
+ Band.find([ band.id.as_json, BSON::ObjectId.new.as_json ])
410
+ end
411
+
412
+ it "raises an error" do
413
+ expect {
414
+ found
415
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
416
+ end
417
+ end
418
+
419
+ context "when raising no error" do
420
+
421
+ before do
422
+ Mongoid.raise_not_found_error = false
423
+ end
424
+
425
+ after do
426
+ Mongoid.raise_not_found_error = true
427
+ end
428
+
429
+ let(:found) do
430
+ Band.find([ band.id.as_json, BSON::ObjectId.new.as_json ])
431
+ end
432
+
433
+ it "returns only the matching documents" do
434
+ expect(found).to eq([ band ])
435
+ end
436
+ end
437
+ end
438
+ end
242
439
  end
243
440
 
244
441
  context "when using string ids" do
@@ -954,7 +954,7 @@ describe Mongoid::Criteria::Modifiable do
954
954
  end
955
955
 
956
956
  it "does not update the last document" do
957
- expect(from_db.posts.last.title).to eq("Second")
957
+ expect(from_db.posts[1].title).to eq("Second")
958
958
  end
959
959
  end
960
960
 
@@ -999,11 +999,11 @@ describe Mongoid::Criteria::Modifiable do
999
999
  end
1000
1000
 
1001
1001
  it "updates the first document" do
1002
- expect(from_db.preferences.first.name).to eq("London")
1002
+ expect(from_db.preferences[0].name).to eq("London")
1003
1003
  end
1004
1004
 
1005
1005
  it "does not update the last document" do
1006
- expect(from_db.preferences.last.name).to eq("Second")
1006
+ expect(from_db.preferences[1].name).to eq("Second")
1007
1007
  end
1008
1008
  end
1009
1009
 
@@ -1014,11 +1014,11 @@ describe Mongoid::Criteria::Modifiable do
1014
1014
  end
1015
1015
 
1016
1016
  it "updates the matching documents" do
1017
- expect(from_db.preferences.first.name).to eq("Berlin")
1017
+ expect(from_db.preferences[0].name).to eq("Berlin")
1018
1018
  end
1019
1019
 
1020
1020
  it "does not update non matching documents" do
1021
- expect(from_db.preferences.last.name).to eq("Second")
1021
+ expect(from_db.preferences[1].name).to eq("Second")
1022
1022
  end
1023
1023
  end
1024
1024
  end
@@ -1217,36 +1217,14 @@ describe Mongoid::Criteria::Modifiable do
1217
1217
  end
1218
1218
 
1219
1219
  it "updates the matching documents" do
1220
- expect(from_db.preferences.first.name).to eq("Berlin")
1220
+ expect(from_db.preferences[0].name).to eq("Berlin")
1221
1221
  end
1222
1222
 
1223
1223
  it "does not update non matching documents" do
1224
- expect(from_db.preferences.last.name).to eq("Second")
1224
+ expect(from_db.preferences[1].name).to eq("Second")
1225
1225
  end
1226
1226
  end
1227
1227
  end
1228
1228
  end
1229
-
1230
- context "when update document structure" do
1231
-
1232
- before do
1233
- person = Person.new(username: "user_title", score: 25)
1234
- person.save
1235
- end
1236
-
1237
- let(:from_db) do
1238
- Person.last
1239
- end
1240
-
1241
- it "rename document string field" do
1242
- Person.where(username: "user_title").update_all("$rename" => { username: "title" })
1243
- expect(from_db.title).to eq("user_title")
1244
- end
1245
-
1246
- it "rename document integer field" do
1247
- Person.where(score: 25).update_all("$rename" => { score: "age" })
1248
- expect(from_db.age).to eq( 25 )
1249
- end
1250
- end
1251
1229
  end
1252
1230
  end
@@ -148,6 +148,21 @@ describe Mongoid::Criteria do
148
148
  end
149
149
  end
150
150
 
151
+ describe "#read" do
152
+
153
+ let(:person) do
154
+ Person.create
155
+ end
156
+
157
+ let(:criteria) do
158
+ Person.read(mode: :secondary)
159
+ end
160
+
161
+ it "adds the read option" do
162
+ expect(criteria.options[:read]).to eq(mode: :secondary)
163
+ end
164
+ end
165
+
151
166
  describe "#aggregates" do
152
167
 
153
168
  context "when provided a single field" do
@@ -362,7 +377,7 @@ describe Mongoid::Criteria do
362
377
  end
363
378
 
364
379
  it "does not hit the database after first iteration" do
365
- expect(criteria.context.query).to receive(:each).never
380
+ expect(criteria.context.view).to receive(:each).never
366
381
  criteria.each do |doc|
367
382
  expect(doc).to eq(person)
368
383
  end
@@ -380,7 +395,7 @@ describe Mongoid::Criteria do
380
395
  end
381
396
 
382
397
  it "does not hit the database after first iteration" do
383
- expect(criteria.context.query).to receive(:each).never
398
+ expect(criteria.context.view).to receive(:each).never
384
399
  criteria.each do |doc|
385
400
  expect(doc).to eq(person)
386
401
  end
@@ -709,7 +724,7 @@ describe Mongoid::Criteria do
709
724
  end
710
725
 
711
726
  it "returns the criteria explain path" do
712
- expect(criteria.explain["cursor"]).to eq("BasicCursor")
727
+ expect(criteria.explain).to_not be_empty
713
728
  end
714
729
  end
715
730
 
@@ -752,12 +767,12 @@ describe Mongoid::Criteria do
752
767
  Band.only(:name)
753
768
  end
754
769
 
755
- it "returns the fields minus type" do
756
- expect(criteria.field_list).to eq([ "name" ])
770
+ it "returns the fields with required _id minus type" do
771
+ expect(criteria.field_list).to eq([ "_id", "name" ])
757
772
  end
758
773
  end
759
774
 
760
- describe "#find_and_modify" do
775
+ describe "#find_one_and_update" do
761
776
 
762
777
  let!(:depeche) do
763
778
  Band.create(name: "Depeche Mode")
@@ -778,7 +793,7 @@ describe Mongoid::Criteria do
778
793
  end
779
794
 
780
795
  let(:result) do
781
- criteria.find_and_modify({ "$inc" => { likes: 1 }}, new: true)
796
+ criteria.find_one_and_update({ "$inc" => { likes: 1 }}, return_document: :after)
782
797
  end
783
798
 
784
799
  it "returns the first matching document" do
@@ -793,7 +808,7 @@ describe Mongoid::Criteria do
793
808
  end
794
809
 
795
810
  let!(:result) do
796
- criteria.find_and_modify("$inc" => { likes: 1 })
811
+ criteria.find_one_and_update("$inc" => { likes: 1 })
797
812
  end
798
813
 
799
814
  before do
@@ -813,7 +828,7 @@ describe Mongoid::Criteria do
813
828
  end
814
829
 
815
830
  let!(:result) do
816
- criteria.find_and_modify("$inc" => { likes: 1 })
831
+ criteria.find_one_and_update("$inc" => { likes: 1 })
817
832
  end
818
833
 
819
834
  it "returns the first matching document" do
@@ -832,7 +847,7 @@ describe Mongoid::Criteria do
832
847
  end
833
848
 
834
849
  let!(:result) do
835
- criteria.find_and_modify("$inc" => { likes: 1 })
850
+ criteria.find_one_and_update("$inc" => { likes: 1 })
836
851
  end
837
852
 
838
853
  it "returns the first matching document" do
@@ -851,7 +866,7 @@ describe Mongoid::Criteria do
851
866
  end
852
867
 
853
868
  let!(:result) do
854
- criteria.find_and_modify("$inc" => { likes: 1 })
869
+ criteria.find_one_and_update("$inc" => { likes: 1 })
855
870
  end
856
871
 
857
872
  it "returns the first matching document" do
@@ -874,7 +889,7 @@ describe Mongoid::Criteria do
874
889
  end
875
890
 
876
891
  let!(:result) do
877
- criteria.find_and_modify({ "$inc" => { likes: 1 }}, new: true)
892
+ criteria.find_one_and_update({ "$inc" => { likes: 1 }}, return_document: :after)
878
893
  end
879
894
 
880
895
  it "returns the first matching document" do
@@ -893,7 +908,7 @@ describe Mongoid::Criteria do
893
908
  end
894
909
 
895
910
  let!(:result) do
896
- criteria.find_and_modify({}, remove: true)
911
+ criteria.find_one_and_delete
897
912
  end
898
913
 
899
914
  it "returns the first matching document" do
@@ -915,11 +930,18 @@ describe Mongoid::Criteria do
915
930
  end
916
931
 
917
932
  let(:result) do
918
- criteria.find_and_modify("$inc" => { likes: 1 })
933
+ criteria.find_one_and_update("$inc" => { likes: 1 })
919
934
  end
920
935
 
921
- it "returns nil" do
922
- expect(result).to be_nil
936
+ context "without upsert" do
937
+
938
+ let(:result) do
939
+ criteria.find_one_and_update("$inc" => { likes: 1 })
940
+ end
941
+
942
+ it "returns nil" do
943
+ expect(result).to be_nil
944
+ end
923
945
  end
924
946
  end
925
947
  end
@@ -1401,13 +1423,6 @@ describe Mongoid::Criteria do
1401
1423
  end
1402
1424
  end
1403
1425
 
1404
- it "does not eager load the last document" do
1405
- doc = criteria.last
1406
- expect_query(1) do
1407
- expect(doc.person).to eq(person_two)
1408
- end
1409
- end
1410
-
1411
1426
  it "returns the first document" do
1412
1427
  expect(document).to eq(post_one)
1413
1428
  end
@@ -1416,7 +1431,7 @@ describe Mongoid::Criteria do
1416
1431
  context "when calling last" do
1417
1432
 
1418
1433
  let!(:criteria) do
1419
- Post.includes(:person)
1434
+ Post.asc(:_id).includes(:person)
1420
1435
  end
1421
1436
 
1422
1437
  let!(:document) do
@@ -2226,17 +2241,6 @@ describe Mongoid::Criteria do
2226
2241
  ])
2227
2242
  end
2228
2243
  end
2229
-
2230
- context "when timeout options are provided" do
2231
-
2232
- let(:map_reduce) do
2233
- Band.limit(2).no_timeout.map_reduce(map, reduce).out(replace: "test_bands")
2234
- end
2235
-
2236
- it "sets the timeout option on the query" do
2237
- expect(map_reduce.send(:documents).operation.flags).to eq([ :no_cursor_timeout ])
2238
- end
2239
- end
2240
2244
  end
2241
2245
 
2242
2246
  describe "#max" do
@@ -2621,6 +2625,19 @@ describe Mongoid::Criteria do
2621
2625
  end
2622
2626
  end
2623
2627
 
2628
+ context "when not including id" do
2629
+
2630
+ let(:criteria) do
2631
+ Band.only(:name)
2632
+ end
2633
+
2634
+ it "responds to id anyway" do
2635
+ expect {
2636
+ criteria.first.id
2637
+ }.to_not raise_error
2638
+ end
2639
+ end
2640
+
2624
2641
  context "when passing an array" do
2625
2642
 
2626
2643
  let(:criteria) do
@@ -2704,7 +2721,7 @@ describe Mongoid::Criteria do
2704
2721
  end
2705
2722
 
2706
2723
  it "properly uses the database field name" do
2707
- expect(criteria.options).to eq(fields: { "mobile_phones" => 1 })
2724
+ expect(criteria.options).to eq(fields: { "_id" => 1, "mobile_phones" => 1 })
2708
2725
  end
2709
2726
  end
2710
2727
  end
@@ -3042,36 +3059,6 @@ describe Mongoid::Criteria do
3042
3059
  end
3043
3060
  end
3044
3061
 
3045
- describe "#extras with a hint" do
3046
-
3047
- let!(:band) do
3048
- Band.create(name: "Depeche Mode")
3049
- end
3050
-
3051
- let(:criteria) do
3052
- Band.where(name: "Depeche Mode").extras(:hint => {:bad_hint => 1})
3053
- end
3054
-
3055
- it "executes the criteria while properly giving the hint to Mongo" do
3056
- expect { criteria.to_ary }.to raise_error(Moped::Errors::QueryFailure)
3057
- end
3058
- end
3059
-
3060
- describe "#hint" do
3061
-
3062
- let!(:band) do
3063
- Band.create(name: "Depeche Mode")
3064
- end
3065
-
3066
- let(:criteria) do
3067
- Band.where(name: "Depeche Mode").hint(bad_hint: 1)
3068
- end
3069
-
3070
- it "executes the criteria while properly giving the hint to Mongo" do
3071
- expect { criteria.to_ary }.to raise_error(Moped::Errors::QueryFailure)
3072
- end
3073
- end
3074
-
3075
3062
  describe "#max_scan" do
3076
3063
  let!(:band) do
3077
3064
  Band.create(name: "Depeche Mode")
@@ -3090,31 +3077,6 @@ describe Mongoid::Criteria do
3090
3077
  end
3091
3078
  end
3092
3079
 
3093
- describe "#text_search" do
3094
-
3095
- let(:criteria) do
3096
- Word.all
3097
- end
3098
-
3099
- before do
3100
- Word.with(database: "admin").mongo_session.command(setParameter: 1, textSearchEnabled: true)
3101
- Word.create_indexes
3102
- Word.create!(name: "phase", origin: "latin")
3103
- end
3104
-
3105
- after(:all) do
3106
- Word.remove_indexes
3107
- end
3108
-
3109
- let(:search) do
3110
- criteria.text_search("phase")
3111
- end
3112
-
3113
- it "returns all fields" do
3114
- expect(search.first.origin).to eq("latin")
3115
- end
3116
- end
3117
-
3118
3080
  describe "#to_criteria" do
3119
3081
 
3120
3082
  let(:criteria) do
@@ -3417,6 +3379,10 @@ describe Mongoid::Criteria do
3417
3379
 
3418
3380
  describe "#without" do
3419
3381
 
3382
+ let!(:person) do
3383
+ Person.create!(username: "davinci", age: 50, pets: false)
3384
+ end
3385
+
3420
3386
  context "when omitting to embedded documents" do
3421
3387
 
3422
3388
  context "when the embedded documents are aliased" do
@@ -3430,5 +3396,22 @@ describe Mongoid::Criteria do
3430
3396
  end
3431
3397
  end
3432
3398
  end
3399
+
3400
+ context "when excluding id" do
3401
+
3402
+ let(:criteria) do
3403
+ Person.without(:_id, :id, "_id", "id")
3404
+ end
3405
+
3406
+ it "does not raise error" do
3407
+ expect {
3408
+ criteria.first.id
3409
+ }.to_not raise_error
3410
+ end
3411
+
3412
+ it "returns id anyway" do
3413
+ expect(criteria.first.id).to_not be_nil
3414
+ end
3415
+ end
3433
3416
  end
3434
3417
  end