mongoid 4.0.2 → 5.0.0.beta

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