mongoid 3.1.6 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (571) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +479 -8
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid.rb +10 -76
  6. data/lib/mongoid/atomic.rb +3 -14
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  9. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  10. data/lib/mongoid/atomic/paths/root.rb +0 -13
  11. data/lib/mongoid/attributes.rb +65 -101
  12. data/lib/mongoid/attributes/dynamic.rb +154 -0
  13. data/lib/mongoid/attributes/nested.rb +82 -0
  14. data/lib/mongoid/attributes/processing.rb +13 -66
  15. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  16. data/lib/mongoid/composable.rb +105 -0
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/config/options.rb +1 -1
  19. data/lib/mongoid/contextual.rb +2 -0
  20. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  21. data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
  22. data/lib/mongoid/contextual/atomic.rb +53 -53
  23. data/lib/mongoid/contextual/geo_near.rb +1 -1
  24. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  25. data/lib/mongoid/contextual/memory.rb +23 -11
  26. data/lib/mongoid/contextual/mongo.rb +75 -57
  27. data/lib/mongoid/contextual/none.rb +90 -0
  28. data/lib/mongoid/contextual/text_search.rb +178 -0
  29. data/lib/mongoid/copyable.rb +2 -3
  30. data/lib/mongoid/criteria.rb +39 -34
  31. data/lib/mongoid/criteria/#findable.rb# +141 -0
  32. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  33. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  34. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  35. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  36. data/lib/mongoid/criteria/permission.rb +70 -0
  37. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  38. data/lib/mongoid/document.rb +39 -24
  39. data/lib/mongoid/errors.rb +4 -1
  40. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  41. data/lib/mongoid/errors/document_not_found.rb +2 -1
  42. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  43. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  44. data/lib/mongoid/errors/invalid_value.rb +16 -0
  45. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  46. data/lib/mongoid/errors/readonly_document.rb +24 -0
  47. data/lib/mongoid/extensions.rb +15 -7
  48. data/lib/mongoid/extensions/array.rb +3 -3
  49. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  50. data/lib/mongoid/extensions/boolean.rb +15 -17
  51. data/lib/mongoid/extensions/date.rb +1 -1
  52. data/lib/mongoid/extensions/date_time.rb +3 -3
  53. data/lib/mongoid/extensions/float.rb +2 -1
  54. data/lib/mongoid/extensions/hash.rb +3 -3
  55. data/lib/mongoid/extensions/integer.rb +1 -1
  56. data/lib/mongoid/extensions/object.rb +7 -7
  57. data/lib/mongoid/extensions/object_id.rb +5 -5
  58. data/lib/mongoid/extensions/range.rb +9 -3
  59. data/lib/mongoid/extensions/regexp.rb +1 -1
  60. data/lib/mongoid/extensions/set.rb +1 -1
  61. data/lib/mongoid/extensions/string.rb +6 -18
  62. data/lib/mongoid/extensions/symbol.rb +1 -1
  63. data/lib/mongoid/extensions/time.rb +3 -3
  64. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  65. data/lib/mongoid/factory.rb +8 -6
  66. data/lib/mongoid/fields.rb +41 -8
  67. data/lib/mongoid/fields/foreign_key.rb +3 -3
  68. data/lib/mongoid/fields/localized.rb +1 -1
  69. data/lib/mongoid/fields/standard.rb +5 -17
  70. data/lib/mongoid/fields/validators/macro.rb +15 -5
  71. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/indexable/specification.rb +104 -0
  74. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  75. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  76. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  77. data/lib/mongoid/log_subscriber.rb +55 -0
  78. data/lib/mongoid/matchable.rb +152 -0
  79. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  81. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  86. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  87. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  88. data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
  89. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  90. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  91. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  92. data/lib/mongoid/persistable.rb +216 -0
  93. data/lib/mongoid/persistable/creatable.rb +189 -0
  94. data/lib/mongoid/persistable/deletable.rb +149 -0
  95. data/lib/mongoid/persistable/destroyable.rb +60 -0
  96. data/lib/mongoid/persistable/incrementable.rb +36 -0
  97. data/lib/mongoid/persistable/logical.rb +38 -0
  98. data/lib/mongoid/persistable/poppable.rb +39 -0
  99. data/lib/mongoid/persistable/pullable.rb +55 -0
  100. data/lib/mongoid/persistable/pushable.rb +62 -0
  101. data/lib/mongoid/persistable/renamable.rb +35 -0
  102. data/lib/mongoid/persistable/savable.rb +52 -0
  103. data/lib/mongoid/persistable/settable.rb +33 -0
  104. data/lib/mongoid/persistable/unsettable.rb +36 -0
  105. data/lib/mongoid/persistable/updatable.rb +153 -0
  106. data/lib/mongoid/persistable/upsertable.rb +55 -0
  107. data/lib/mongoid/positional.rb +71 -0
  108. data/lib/mongoid/query_cache.rb +255 -0
  109. data/lib/mongoid/railtie.rb +34 -60
  110. data/lib/mongoid/railties/database.rake +9 -25
  111. data/lib/mongoid/relations.rb +11 -25
  112. data/lib/mongoid/relations/accessors.rb +15 -51
  113. data/lib/mongoid/relations/auto_save.rb +15 -36
  114. data/lib/mongoid/relations/binding.rb +2 -25
  115. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  116. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  117. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  118. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  119. data/lib/mongoid/relations/builder.rb +1 -1
  120. data/lib/mongoid/relations/builders.rb +2 -2
  121. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  122. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  123. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  124. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  125. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  126. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  127. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  128. data/lib/mongoid/relations/cascading.rb +3 -5
  129. data/lib/mongoid/relations/constraint.rb +1 -1
  130. data/lib/mongoid/relations/conversions.rb +1 -1
  131. data/lib/mongoid/relations/counter_cache.rb +39 -15
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/eager/base.rb +149 -0
  134. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  135. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  136. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  137. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  138. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  139. data/lib/mongoid/relations/embedded/in.rb +4 -4
  140. data/lib/mongoid/relations/embedded/many.rb +14 -32
  141. data/lib/mongoid/relations/embedded/one.rb +1 -1
  142. data/lib/mongoid/relations/macros.rb +3 -4
  143. data/lib/mongoid/relations/many.rb +51 -31
  144. data/lib/mongoid/relations/marshalable.rb +3 -3
  145. data/lib/mongoid/relations/metadata.rb +14 -79
  146. data/lib/mongoid/relations/nested_builder.rb +2 -2
  147. data/lib/mongoid/relations/one.rb +1 -1
  148. data/lib/mongoid/relations/options.rb +1 -0
  149. data/lib/mongoid/relations/polymorphic.rb +0 -1
  150. data/lib/mongoid/relations/proxy.rb +21 -41
  151. data/lib/mongoid/relations/referenced/in.rb +4 -20
  152. data/lib/mongoid/relations/referenced/many.rb +22 -35
  153. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  154. data/lib/mongoid/relations/referenced/one.rb +6 -25
  155. data/lib/mongoid/relations/synchronization.rb +4 -4
  156. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  157. data/lib/mongoid/relations/touchable.rb +34 -1
  158. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  159. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  160. data/lib/mongoid/selectable.rb +59 -0
  161. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  162. data/lib/mongoid/sessions.rb +37 -345
  163. data/lib/mongoid/sessions/factory.rb +2 -0
  164. data/lib/mongoid/sessions/options.rb +185 -0
  165. data/lib/mongoid/sessions/storage_options.rb +140 -0
  166. data/lib/mongoid/sessions/thread_options.rb +19 -0
  167. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  168. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  169. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  170. data/lib/mongoid/support/query_counter.rb +23 -0
  171. data/lib/mongoid/tasks/database.rake +31 -0
  172. data/lib/mongoid/tasks/database.rb +107 -0
  173. data/lib/mongoid/threaded.rb +26 -172
  174. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  175. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  176. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  177. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  178. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  179. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  180. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  182. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  183. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  184. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  185. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  186. data/lib/mongoid/version.rb +1 -1
  187. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  188. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  189. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  190. data/lib/rails/generators/mongoid_generator.rb +3 -40
  191. data/lib/rails/mongoid.rb +0 -122
  192. data/lib/support/ruby_version.rb +1 -1
  193. data/spec/app/models/account.rb +2 -6
  194. data/spec/app/models/acolyte.rb +2 -1
  195. data/spec/app/models/actor.rb +0 -1
  196. data/spec/app/models/address.rb +8 -3
  197. data/spec/app/models/animal.rb +1 -1
  198. data/spec/app/models/appointment.rb +3 -3
  199. data/spec/app/models/article.rb +1 -4
  200. data/spec/app/models/audio.rb +5 -0
  201. data/spec/app/models/author.rb +0 -2
  202. data/spec/app/models/band.rb +3 -2
  203. data/spec/app/models/bar.rb +1 -0
  204. data/spec/app/models/book.rb +1 -0
  205. data/spec/app/models/building.rb +0 -2
  206. data/spec/app/models/building_address.rb +0 -2
  207. data/spec/app/models/bus.rb +1 -1
  208. data/spec/app/models/canvas.rb +1 -1
  209. data/spec/app/models/contextable_item.rb +5 -0
  210. data/spec/app/models/contractor.rb +0 -2
  211. data/spec/app/models/country_code.rb +1 -1
  212. data/spec/app/models/definition.rb +2 -2
  213. data/spec/app/models/dog.rb +1 -1
  214. data/spec/app/models/draft.rb +9 -0
  215. data/spec/app/models/dragon.rb +4 -0
  216. data/spec/app/models/drug.rb +1 -3
  217. data/spec/app/models/dungeon.rb +4 -0
  218. data/spec/app/models/edit.rb +5 -0
  219. data/spec/app/models/even.rb +7 -0
  220. data/spec/app/models/event.rb +1 -1
  221. data/spec/app/models/filesystem.rb +1 -0
  222. data/spec/app/models/fish.rb +0 -1
  223. data/spec/app/models/fruits.rb +6 -0
  224. data/spec/app/models/game.rb +0 -2
  225. data/spec/app/models/house.rb +1 -3
  226. data/spec/app/models/id_key.rb +6 -0
  227. data/spec/app/models/item.rb +1 -5
  228. data/spec/app/models/jar.rb +1 -1
  229. data/spec/app/models/label.rb +4 -4
  230. data/spec/app/models/line_item.rb +1 -1
  231. data/spec/app/models/login.rb +1 -1
  232. data/spec/app/models/message.rb +8 -0
  233. data/spec/app/models/movie.rb +1 -0
  234. data/spec/app/models/name.rb +3 -3
  235. data/spec/app/models/note.rb +3 -1
  236. data/spec/app/models/odd.rb +7 -0
  237. data/spec/app/models/oscar.rb +1 -1
  238. data/spec/app/models/parent_doc.rb +1 -1
  239. data/spec/app/models/person.rb +16 -10
  240. data/spec/app/models/phone.rb +1 -3
  241. data/spec/app/models/player.rb +3 -3
  242. data/spec/app/models/post.rb +5 -3
  243. data/spec/app/models/preference.rb +1 -1
  244. data/spec/app/models/quiz.rb +0 -3
  245. data/spec/app/models/record.rb +10 -5
  246. data/spec/app/models/registry.rb +1 -1
  247. data/spec/app/models/server.rb +1 -1
  248. data/spec/app/models/service.rb +3 -3
  249. data/spec/app/models/sound.rb +5 -0
  250. data/spec/app/models/symptom.rb +1 -1
  251. data/spec/app/models/template.rb +1 -1
  252. data/spec/app/models/title.rb +0 -1
  253. data/spec/app/models/track.rb +5 -5
  254. data/spec/app/models/tree.rb +3 -3
  255. data/spec/app/models/video.rb +1 -5
  256. data/spec/app/models/wiki_page.rb +2 -5
  257. data/spec/app/models/word.rb +3 -0
  258. data/spec/app/models/word_origin.rb +1 -1
  259. data/spec/config/mongoid.yml +7 -8
  260. data/spec/helpers.rb +18 -0
  261. data/spec/mongoid/#atomic_spec.rb# +365 -0
  262. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  263. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  264. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  265. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  266. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  267. data/spec/mongoid/atomic_spec.rb +19 -19
  268. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  269. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  270. data/spec/mongoid/attributes_spec.rb +349 -434
  271. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  272. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  273. data/spec/mongoid/config/environment_spec.rb +3 -3
  274. data/spec/mongoid/config/options_spec.rb +6 -6
  275. data/spec/mongoid/config_spec.rb +24 -48
  276. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  277. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
  278. data/spec/mongoid/contextual/atomic_spec.rb +60 -56
  279. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  280. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  281. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  282. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  283. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  284. data/spec/mongoid/contextual/none_spec.rb +127 -0
  285. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  286. data/spec/mongoid/copyable_spec.rb +56 -68
  287. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  288. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  289. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  290. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  291. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  292. data/spec/mongoid/criteria_spec.rb +715 -2421
  293. data/spec/mongoid/document_spec.rb +171 -121
  294. data/spec/mongoid/equality_spec.rb +22 -22
  295. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  296. data/spec/mongoid/errors/callback_spec.rb +3 -3
  297. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  298. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  299. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  300. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  308. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  311. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  312. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  313. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  314. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  315. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  316. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  317. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  318. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  325. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  326. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  327. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  328. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  329. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  330. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  331. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  332. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  333. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  334. data/spec/mongoid/errors/validations_spec.rb +7 -7
  335. data/spec/mongoid/extensions/array_spec.rb +61 -61
  336. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  337. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  338. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  339. data/spec/mongoid/extensions/date_spec.rb +13 -13
  340. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  341. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  342. data/spec/mongoid/extensions/float_spec.rb +29 -15
  343. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  344. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  345. data/spec/mongoid/extensions/module_spec.rb +2 -2
  346. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  347. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  348. data/spec/mongoid/extensions/object_spec.rb +26 -26
  349. data/spec/mongoid/extensions/range_spec.rb +61 -12
  350. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  351. data/spec/mongoid/extensions/set_spec.rb +4 -4
  352. data/spec/mongoid/extensions/string_spec.rb +35 -46
  353. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  354. data/spec/mongoid/extensions/time_spec.rb +49 -49
  355. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  356. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  357. data/spec/mongoid/extensions_spec.rb +29 -0
  358. data/spec/mongoid/factory_spec.rb +15 -15
  359. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  360. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  361. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  362. data/spec/mongoid/fields/localized_spec.rb +38 -23
  363. data/spec/mongoid/fields/standard_spec.rb +12 -12
  364. data/spec/mongoid/fields_spec.rb +263 -217
  365. data/spec/mongoid/findable_spec.rb +509 -0
  366. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  367. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  368. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  369. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  370. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  371. data/spec/mongoid/loggable_spec.rb +1 -1
  372. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  373. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  374. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  375. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  376. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  377. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  378. data/spec/mongoid/matchable/in_spec.rb +49 -0
  379. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  380. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  381. data/spec/mongoid/matchable/ne_spec.rb +46 -0
  382. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  383. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  384. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  385. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  386. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  387. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  388. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  389. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  390. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  391. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  392. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  393. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  394. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  395. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  396. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  397. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  398. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  399. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  400. data/spec/mongoid/persistable_spec.rb +206 -0
  401. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
  402. data/spec/mongoid/query_cache_spec.rb +263 -0
  403. data/spec/mongoid/railties/document_spec.rb +2 -2
  404. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  405. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  406. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  407. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  408. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  409. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  410. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  411. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  412. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  413. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  414. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  415. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  416. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  417. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  418. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  419. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  420. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  421. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  422. data/spec/mongoid/relations/builders_spec.rb +21 -21
  423. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  424. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  425. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  426. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  427. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  428. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  429. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  430. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  431. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  432. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  433. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  434. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  435. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  436. data/spec/mongoid/relations/eager_spec.rb +228 -0
  437. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  438. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  439. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  440. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  441. data/spec/mongoid/relations/macros_spec.rb +108 -102
  442. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  443. data/spec/mongoid/relations/options_spec.rb +1 -1
  444. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  445. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  446. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  447. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  448. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  449. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  450. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  451. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  452. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  453. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  454. data/spec/mongoid/relations_spec.rb +16 -15
  455. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  456. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  457. data/spec/mongoid/selectable_spec.rb +134 -0
  458. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  459. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  460. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  461. data/spec/mongoid/sessions/options_spec.rb +108 -0
  462. data/spec/mongoid/sessions_spec.rb +319 -178
  463. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  464. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  465. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  466. data/spec/mongoid/tasks/database_spec.rb +160 -0
  467. data/spec/mongoid/threaded_spec.rb +17 -70
  468. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  469. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  470. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  471. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  472. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  473. data/spec/mongoid/timestamps_spec.rb +9 -13
  474. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  475. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  476. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  477. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  478. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  479. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  480. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  481. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  482. data/spec/mongoid_spec.rb +8 -8
  483. data/spec/rails/mongoid_spec.rb +19 -335
  484. data/spec/spec_helper.rb +31 -13
  485. metadata +303 -283
  486. data/lib/mongoid/atomic/positionable.rb +0 -73
  487. data/lib/mongoid/components.rb +0 -92
  488. data/lib/mongoid/config/inflections.rb +0 -6
  489. data/lib/mongoid/contextual/eager.rb +0 -158
  490. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  491. data/lib/mongoid/identity_map.rb +0 -163
  492. data/lib/mongoid/json.rb +0 -16
  493. data/lib/mongoid/matchers.rb +0 -32
  494. data/lib/mongoid/matchers/strategies.rb +0 -97
  495. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  496. data/lib/mongoid/nested_attributes.rb +0 -78
  497. data/lib/mongoid/observer.rb +0 -192
  498. data/lib/mongoid/paranoia.rb +0 -136
  499. data/lib/mongoid/persistence.rb +0 -357
  500. data/lib/mongoid/persistence/atomic.rb +0 -231
  501. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  502. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  503. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  504. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  505. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  506. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  507. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  508. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  509. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  510. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  511. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  512. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  513. data/lib/mongoid/persistence/deletion.rb +0 -31
  514. data/lib/mongoid/persistence/insertion.rb +0 -38
  515. data/lib/mongoid/persistence/modification.rb +0 -35
  516. data/lib/mongoid/persistence/operations.rb +0 -214
  517. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  518. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  519. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  520. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  521. data/lib/mongoid/persistence/operations/update.rb +0 -59
  522. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  523. data/lib/mongoid/persistence/upsertion.rb +0 -31
  524. data/lib/mongoid/unit_of_work.rb +0 -61
  525. data/lib/mongoid/versioning.rb +0 -217
  526. data/lib/rack/mongoid.rb +0 -2
  527. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  528. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  529. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  530. data/spec/app/models/actor_observer.rb +0 -15
  531. data/spec/app/models/callback_recorder.rb +0 -25
  532. data/spec/app/models/paranoid_phone.rb +0 -25
  533. data/spec/app/models/paranoid_post.rb +0 -36
  534. data/spec/app/models/phone_observer.rb +0 -6
  535. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  536. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  537. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  538. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  539. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  540. data/spec/mongoid/finders_spec.rb +0 -321
  541. data/spec/mongoid/identity_map_spec.rb +0 -564
  542. data/spec/mongoid/json_spec.rb +0 -33
  543. data/spec/mongoid/matchers/in_spec.rb +0 -25
  544. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  545. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  546. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  547. data/spec/mongoid/observer_spec.rb +0 -290
  548. data/spec/mongoid/paranoia_spec.rb +0 -759
  549. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  550. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  551. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  552. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  553. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  554. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  555. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  556. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  557. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  558. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  559. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  560. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  561. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  562. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  563. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  564. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  565. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  566. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  567. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  568. data/spec/mongoid/persistence_spec.rb +0 -2279
  569. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  570. data/spec/mongoid/versioning_spec.rb +0 -540
  571. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Criterion::Scoping do
3
+ describe Mongoid::Criteria::Scopable do
4
4
 
5
5
  describe "#apply_default_scope" do
6
6
 
@@ -11,7 +11,7 @@ describe Mongoid::Criterion::Scoping do
11
11
  end
12
12
 
13
13
  before do
14
- Band.default_scope scope
14
+ Band.default_scope ->{ scope }
15
15
  end
16
16
 
17
17
  after do
@@ -25,11 +25,11 @@ describe Mongoid::Criterion::Scoping do
25
25
  end
26
26
 
27
27
  it "merges in the options" do
28
- scoped.options.should eq({ skip: 20 })
28
+ expect(scoped.options).to eq({ skip: 20 })
29
29
  end
30
30
 
31
31
  it "sets scoped to true" do
32
- scoped.should be_scoped
32
+ expect(scoped).to be_scoped
33
33
  end
34
34
  end
35
35
 
@@ -40,7 +40,7 @@ describe Mongoid::Criterion::Scoping do
40
40
  end
41
41
 
42
42
  before do
43
- Band.default_scope scope
43
+ Band.default_scope ->{ scope }
44
44
  end
45
45
 
46
46
  after do
@@ -54,11 +54,11 @@ describe Mongoid::Criterion::Scoping do
54
54
  end
55
55
 
56
56
  it "merges in the options" do
57
- scoped.selector.should eq({ "name" => "Depeche Mode" })
57
+ expect(scoped.selector).to eq({ "name" => "Depeche Mode" })
58
58
  end
59
59
 
60
60
  it "sets scoped to true" do
61
- scoped.should be_scoped
61
+ expect(scoped).to be_scoped
62
62
  end
63
63
  end
64
64
 
@@ -69,7 +69,7 @@ describe Mongoid::Criterion::Scoping do
69
69
  end
70
70
 
71
71
  before do
72
- Band.default_scope scope
72
+ Band.default_scope ->{ scope }
73
73
  end
74
74
 
75
75
  after do
@@ -85,13 +85,13 @@ describe Mongoid::Criterion::Scoping do
85
85
  end
86
86
 
87
87
  it "merges in the inclusions" do
88
- scoped.inclusions.should eq(
88
+ expect(scoped.inclusions).to eq(
89
89
  [ Band.relations["records"] ]
90
90
  )
91
91
  end
92
92
 
93
93
  it "sets scoped to true" do
94
- scoped.should be_scoped
94
+ expect(scoped).to be_scoped
95
95
  end
96
96
  end
97
97
 
@@ -104,13 +104,13 @@ describe Mongoid::Criterion::Scoping do
104
104
  end
105
105
 
106
106
  it "merges in the inclusions" do
107
- scoped.inclusions.should eq(
107
+ expect(scoped.inclusions).to eq(
108
108
  [ Band.relations["records"], Band.relations["label"] ]
109
109
  )
110
110
  end
111
111
 
112
112
  it "sets scoped to true" do
113
- scoped.should be_scoped
113
+ expect(scoped).to be_scoped
114
114
  end
115
115
  end
116
116
  end
@@ -129,7 +129,7 @@ describe Mongoid::Criterion::Scoping do
129
129
  end
130
130
 
131
131
  it "removes the selection" do
132
- criteria.selector.should be_empty
132
+ expect(criteria.selector).to be_empty
133
133
  end
134
134
  end
135
135
 
@@ -146,7 +146,7 @@ describe Mongoid::Criterion::Scoping do
146
146
  end
147
147
 
148
148
  it "removes the options" do
149
- criteria.options.should be_empty
149
+ expect(criteria.options).to be_empty
150
150
  end
151
151
  end
152
152
 
@@ -161,11 +161,11 @@ describe Mongoid::Criterion::Scoping do
161
161
  end
162
162
 
163
163
  it "removes the options" do
164
- criteria.options.should be_empty
164
+ expect(criteria.options).to be_empty
165
165
  end
166
166
 
167
167
  it "does not remove the selector" do
168
- criteria.selector.should eq({ "name" => nil })
168
+ expect(criteria.selector).to eq({ "name" => nil })
169
169
  end
170
170
  end
171
171
  end
@@ -185,7 +185,7 @@ describe Mongoid::Criterion::Scoping do
185
185
  end
186
186
 
187
187
  it "removes the matching inclusions" do
188
- criteria.inclusions.should eq([ Band.relations["records"] ])
188
+ expect(criteria.inclusions).to eq([ Band.relations["records"] ])
189
189
  end
190
190
  end
191
191
  end
@@ -203,15 +203,15 @@ describe Mongoid::Criterion::Scoping do
203
203
  end
204
204
 
205
205
  it "returns a criteria" do
206
- scoped.should be_a(Mongoid::Criteria)
206
+ expect(scoped).to be_a(Mongoid::Criteria)
207
207
  end
208
208
 
209
209
  it "contains an empty selector" do
210
- scoped.selector.should be_empty
210
+ expect(scoped.selector).to be_empty
211
211
  end
212
212
 
213
213
  it "contains empty options" do
214
- scoped.options.should be_empty
214
+ expect(scoped.options).to be_empty
215
215
  end
216
216
  end
217
217
 
@@ -222,15 +222,15 @@ describe Mongoid::Criterion::Scoping do
222
222
  end
223
223
 
224
224
  it "returns a criteria" do
225
- scoped.should be_a(Mongoid::Criteria)
225
+ expect(scoped).to be_a(Mongoid::Criteria)
226
226
  end
227
227
 
228
228
  it "contains an empty selector" do
229
- scoped.selector.should be_empty
229
+ expect(scoped.selector).to be_empty
230
230
  end
231
231
 
232
232
  it "contains the options" do
233
- scoped.options.should eq({ skip: 10, limit: 10 })
233
+ expect(scoped.options).to eq({ skip: 10, limit: 10 })
234
234
  end
235
235
  end
236
236
 
@@ -241,7 +241,7 @@ describe Mongoid::Criterion::Scoping do
241
241
  end
242
242
 
243
243
  before do
244
- Band.default_scope criteria
244
+ Band.default_scope ->{ criteria }
245
245
  end
246
246
 
247
247
  after do
@@ -253,11 +253,11 @@ describe Mongoid::Criterion::Scoping do
253
253
  end
254
254
 
255
255
  it "allows the default scope to be added" do
256
- scoped.selector.should eq({ "name" => "Depeche Mode" })
256
+ expect(scoped.selector).to eq({ "name" => "Depeche Mode" })
257
257
  end
258
258
 
259
259
  it "flags as scoped" do
260
- scoped.should be_scoped
260
+ expect(scoped).to be_scoped
261
261
  end
262
262
 
263
263
  context "when chained after an unscoped criteria" do
@@ -267,7 +267,7 @@ describe Mongoid::Criterion::Scoping do
267
267
  end
268
268
 
269
269
  it "reapplies the default scope" do
270
- scoped.selector.should eq({ "name" => "Depeche Mode" })
270
+ expect(scoped.selector).to eq({ "name" => "Depeche Mode" })
271
271
  end
272
272
  end
273
273
  end
@@ -284,7 +284,7 @@ describe Mongoid::Criterion::Scoping do
284
284
  end
285
285
 
286
286
  it "returns the scoping options" do
287
- criteria.scoping_options.should eq([ true, false ])
287
+ expect(criteria.scoping_options).to eq([ true, false ])
288
288
  end
289
289
  end
290
290
 
@@ -299,11 +299,11 @@ describe Mongoid::Criterion::Scoping do
299
299
  end
300
300
 
301
301
  it "sets the scoped flag" do
302
- criteria.should be_scoped
302
+ expect(criteria).to be_scoped
303
303
  end
304
304
 
305
305
  it "sets the unscoped flag" do
306
- criteria.should be_unscoped
306
+ expect(criteria).to be_unscoped
307
307
  end
308
308
  end
309
309
 
@@ -318,7 +318,7 @@ describe Mongoid::Criterion::Scoping do
318
318
  end
319
319
 
320
320
  before do
321
- Band.default_scope criteria
321
+ Band.default_scope ->{ criteria }
322
322
  end
323
323
 
324
324
  after do
@@ -332,7 +332,7 @@ describe Mongoid::Criterion::Scoping do
332
332
  end
333
333
 
334
334
  it "removes the default scope from the criteria" do
335
- unscoped.selector.should be_empty
335
+ expect(unscoped.selector).to be_empty
336
336
  end
337
337
 
338
338
  context "when chained after a scoped criteria" do
@@ -342,7 +342,7 @@ describe Mongoid::Criterion::Scoping do
342
342
  end
343
343
 
344
344
  it "removes all scoping" do
345
- unscoped.selector.should be_empty
345
+ expect(unscoped.selector).to be_empty
346
346
  end
347
347
  end
348
348
  end
@@ -353,7 +353,7 @@ describe Mongoid::Criterion::Scoping do
353
353
 
354
354
  it "does not allow default scoping to be added in the block" do
355
355
  Band.unscoped do
356
- empty.skip(10).selector.should be_empty
356
+ expect(empty.skip(10).selector).to be_empty
357
357
  end
358
358
  end
359
359
  end
@@ -362,7 +362,7 @@ describe Mongoid::Criterion::Scoping do
362
362
 
363
363
  it "does not allow default scoping to be added in the block" do
364
364
  Band.unscoped do
365
- empty.scoped.selector.should be_empty
365
+ expect(empty.scoped.selector).to be_empty
366
366
  end
367
367
  end
368
368
  end
@@ -370,7 +370,7 @@ describe Mongoid::Criterion::Scoping do
370
370
  context "when a named scope is called in the block" do
371
371
 
372
372
  before do
373
- Band.scope(:skipped, Band.skip(10))
373
+ Band.scope(:skipped, ->{ Band.skip(10) })
374
374
  end
375
375
 
376
376
  after do
@@ -382,7 +382,7 @@ describe Mongoid::Criterion::Scoping do
382
382
 
383
383
  it "does not allow the default scope to be applied" do
384
384
  Band.unscoped do
385
- empty.skipped.selector.should be_empty
385
+ expect(empty.skipped.selector).to be_empty
386
386
  end
387
387
  end
388
388
  end
@@ -17,7 +17,7 @@ describe Mongoid::Criteria do
17
17
  end
18
18
 
19
19
  it "returns true" do
20
- criteria.should eq(other)
20
+ expect(criteria).to eq(other)
21
21
  end
22
22
  end
23
23
 
@@ -28,7 +28,7 @@ describe Mongoid::Criteria do
28
28
  end
29
29
 
30
30
  it "returns false" do
31
- criteria.should_not eq(other)
31
+ expect(criteria).to_not eq(other)
32
32
  end
33
33
  end
34
34
  end
@@ -46,7 +46,7 @@ describe Mongoid::Criteria do
46
46
  end
47
47
 
48
48
  it "returns true" do
49
- criteria.should eq(other)
49
+ expect(criteria).to eq(other)
50
50
  end
51
51
  end
52
52
 
@@ -65,7 +65,7 @@ describe Mongoid::Criteria do
65
65
  end
66
66
 
67
67
  it "returns false" do
68
- criteria.should_not eq(other)
68
+ expect(criteria).to_not eq(other)
69
69
  end
70
70
  end
71
71
  end
@@ -73,7 +73,7 @@ describe Mongoid::Criteria do
73
73
  context "when the other is neither a criteria or enumerable" do
74
74
 
75
75
  it "returns false" do
76
- criteria.should_not eq("test")
76
+ expect(criteria).to_not eq("test")
77
77
  end
78
78
  end
79
79
  end
@@ -87,14 +87,14 @@ describe Mongoid::Criteria do
87
87
  end
88
88
 
89
89
  it "returns true" do
90
- (described_class === other).should be_true
90
+ expect(described_class === other).to be true
91
91
  end
92
92
  end
93
93
 
94
94
  context "when the other is not a criteria" do
95
95
 
96
96
  it "returns false" do
97
- (described_class === []).should be_false
97
+ expect(described_class === []).to be false
98
98
  end
99
99
  end
100
100
  end
@@ -124,7 +124,7 @@ describe Mongoid::Criteria do
124
124
  end
125
125
 
126
126
  it "returns the sorted documents" do
127
- criteria.should eq([ friedel, hobrecht, pfluger ])
127
+ expect(criteria).to eq([ friedel, hobrecht, pfluger ])
128
128
  end
129
129
  end
130
130
  end
@@ -140,11 +140,11 @@ describe Mongoid::Criteria do
140
140
  end
141
141
 
142
142
  it "adds the batch size option" do
143
- criteria.options[:batch_size].should eq(1000)
143
+ expect(criteria.options[:batch_size]).to eq(1000)
144
144
  end
145
145
 
146
146
  it "returns the correct documents" do
147
- criteria.should eq([ person ])
147
+ expect(criteria).to eq([ person ])
148
148
  end
149
149
  end
150
150
 
@@ -169,23 +169,23 @@ describe Mongoid::Criteria do
169
169
  end
170
170
 
171
171
  it "returns an avg" do
172
- aggregates["avg"].should eq(750)
172
+ expect(aggregates["avg"]).to eq(750)
173
173
  end
174
174
 
175
175
  it "returns a count" do
176
- aggregates["count"].should eq(2)
176
+ expect(aggregates["count"]).to eq(2)
177
177
  end
178
178
 
179
179
  it "returns a max" do
180
- aggregates["max"].should eq(1000)
180
+ expect(aggregates["max"]).to eq(1000)
181
181
  end
182
182
 
183
183
  it "returns a min" do
184
- aggregates["min"].should eq(500)
184
+ expect(aggregates["min"]).to eq(500)
185
185
  end
186
186
 
187
187
  it "returns a sum" do
188
- aggregates["sum"].should eq(1500)
188
+ expect(aggregates["sum"]).to eq(1500)
189
189
  end
190
190
  end
191
191
  end
@@ -211,7 +211,7 @@ describe Mongoid::Criteria do
211
211
  end
212
212
 
213
213
  it "returns the avg of the provided field" do
214
- avg.should eq(750)
214
+ expect(avg).to eq(750)
215
215
  end
216
216
  end
217
217
  end
@@ -233,7 +233,7 @@ describe Mongoid::Criteria do
233
233
  end
234
234
 
235
235
  it "returns the matching documents" do
236
- criteria.should eq([ match ])
236
+ expect(criteria).to eq([ match ])
237
237
  end
238
238
  end
239
239
  end
@@ -255,7 +255,7 @@ describe Mongoid::Criteria do
255
255
  end
256
256
 
257
257
  it "returns the matching documents" do
258
- criteria.should eq([ match ])
258
+ expect(criteria).to eq([ match ])
259
259
  end
260
260
  end
261
261
  end
@@ -271,7 +271,7 @@ describe Mongoid::Criteria do
271
271
  end
272
272
 
273
273
  it "returns the criteria as a json hash" do
274
- criteria.as_json.should eq([ band.serializable_hash ])
274
+ expect(criteria.as_json).to eq([ band.serializable_hash ])
275
275
  end
276
276
  end
277
277
 
@@ -290,7 +290,7 @@ describe Mongoid::Criteria do
290
290
  end
291
291
 
292
292
  it "returns the matching documents" do
293
- criteria.should eq([ match ])
293
+ expect(criteria).to eq([ match ])
294
294
  end
295
295
  end
296
296
 
@@ -309,15 +309,15 @@ describe Mongoid::Criteria do
309
309
  end
310
310
 
311
311
  it "returns the new document" do
312
- band.should be_new_record
312
+ expect(band).to be_new_record
313
313
  end
314
314
 
315
315
  it "sets the criteria attributes" do
316
- band.name.should eq("Depeche Mode")
316
+ expect(band.name).to eq("Depeche Mode")
317
317
  end
318
318
 
319
319
  it "sets the attributes passed to build" do
320
- band.genres.should eq([ "electro" ])
320
+ expect(band.genres).to eq([ "electro" ])
321
321
  end
322
322
  end
323
323
 
@@ -330,15 +330,15 @@ describe Mongoid::Criteria do
330
330
  end
331
331
 
332
332
  it "returns the new document" do
333
- band.should be_new_record
333
+ expect(band).to be_new_record
334
334
  end
335
335
 
336
336
  it "sets the criteria attributes" do
337
- band.name.should eq("Depeche Mode")
337
+ expect(band.name).to eq("Depeche Mode")
338
338
  end
339
339
 
340
340
  it "sets the attributes passed to build" do
341
- band.genres.should eq([ "electro" ])
341
+ expect(band.genres).to eq([ "electro" ])
342
342
  end
343
343
  end
344
344
  end
@@ -362,9 +362,9 @@ describe Mongoid::Criteria do
362
362
  end
363
363
 
364
364
  it "does not hit the database after first iteration" do
365
- criteria.context.query.should_receive(:each).never
365
+ expect(criteria.context.query).to receive(:each).never
366
366
  criteria.each do |doc|
367
- doc.should eq(person)
367
+ expect(doc).to eq(person)
368
368
  end
369
369
  end
370
370
  end
@@ -380,9 +380,9 @@ describe Mongoid::Criteria do
380
380
  end
381
381
 
382
382
  it "does not hit the database after first iteration" do
383
- criteria.context.query.should_receive(:each).never
383
+ expect(criteria.context.query).to receive(:each).never
384
384
  criteria.each do |doc|
385
- doc.should eq(person)
385
+ expect(doc).to eq(person)
386
386
  end
387
387
  end
388
388
  end
@@ -410,47 +410,47 @@ describe Mongoid::Criteria do
410
410
  end
411
411
 
412
412
  it "contains an equal selector" do
413
- clone.selector.should eq({ "name" => "Depeche Mode" })
413
+ expect(clone.selector).to eq({ "name" => "Depeche Mode" })
414
414
  end
415
415
 
416
416
  it "clones the selector" do
417
- clone.selector.should_not equal(criteria.selector)
417
+ expect(clone.selector).to_not equal(criteria.selector)
418
418
  end
419
419
 
420
420
  it "contains equal options" do
421
- clone.options.should eq({ sort: { "name" => 1 }})
421
+ expect(clone.options).to eq({ sort: { "name" => 1 }})
422
422
  end
423
423
 
424
424
  it "clones the options" do
425
- clone.options.should_not equal(criteria.options)
425
+ expect(clone.options).to_not equal(criteria.options)
426
426
  end
427
427
 
428
428
  it "contains equal inclusions" do
429
- clone.inclusions.should eq([ Band.relations["records"] ])
429
+ expect(clone.inclusions).to eq([ Band.relations["records"] ])
430
430
  end
431
431
 
432
432
  it "clones the inclusions" do
433
- clone.inclusions.should_not equal(criteria.inclusions)
433
+ expect(clone.inclusions).to_not equal(criteria.inclusions)
434
434
  end
435
435
 
436
436
  it "contains equal documents" do
437
- clone.documents.should eq([ band ])
437
+ expect(clone.documents).to eq([ band ])
438
438
  end
439
439
 
440
440
  it "clones the documents" do
441
- clone.documents.should_not equal(criteria.documents)
441
+ expect(clone.documents).to_not equal(criteria.documents)
442
442
  end
443
443
 
444
444
  it "contains equal scoping options" do
445
- clone.scoping_options.should eq([ nil, nil ])
445
+ expect(clone.scoping_options).to eq([ nil, nil ])
446
446
  end
447
447
 
448
448
  it "clones the scoping options" do
449
- clone.scoping_options.should_not equal(criteria.scoping_options)
449
+ expect(clone.scoping_options).to_not equal(criteria.scoping_options)
450
450
  end
451
451
 
452
452
  it "sets the context to nil" do
453
- clone.instance_variable_get(:@context).should be_nil
453
+ expect(clone.instance_variable_get(:@context)).to be_nil
454
454
  end
455
455
  end
456
456
  end
@@ -462,7 +462,7 @@ describe Mongoid::Criteria do
462
462
  end
463
463
 
464
464
  it "sets the cache option to true" do
465
- criteria.cache.should be_cached
465
+ expect(criteria.cache).to be_cached
466
466
  end
467
467
  end
468
468
 
@@ -477,7 +477,7 @@ describe Mongoid::Criteria do
477
477
  end
478
478
 
479
479
  it "returns the embedded context" do
480
- criteria.context.should be_a(Mongoid::Contextual::Memory)
480
+ expect(criteria.context).to be_a(Mongoid::Contextual::Memory)
481
481
  end
482
482
  end
483
483
 
@@ -488,71 +488,7 @@ describe Mongoid::Criteria do
488
488
  end
489
489
 
490
490
  it "returns the mongo context" do
491
- criteria.context.should be_a(Mongoid::Contextual::Mongo)
492
- end
493
- end
494
- end
495
-
496
- describe "#create" do
497
-
498
- let(:criteria) do
499
- Band.where(name: "Depeche Mode")
500
- end
501
-
502
- context "when provided valid attributes" do
503
- let(:band) do
504
- criteria.create(genres: [ "electro" ])
505
- end
506
-
507
- it "returns the created document" do
508
- band.should be_persisted
509
- end
510
-
511
- it "sets the criteria attributes" do
512
- band.name.should eq("Depeche Mode")
513
- end
514
-
515
- it "sets the attributes passed to build" do
516
- band.genres.should eq([ "electro" ])
517
- end
518
- end
519
-
520
- context "when provided a block" do
521
- context "when provided valid attributes & using block" do
522
- let(:band) do
523
- criteria.create do |c|
524
- c.genres = [ "electro" ]
525
- end
526
- end
527
-
528
- it "returns the created document" do
529
- band.should be_persisted
530
- end
531
-
532
- it "sets the criteria attributes" do
533
- band.name.should eq("Depeche Mode")
534
- end
535
-
536
- it "sets the attributes passed to build" do
537
- band.genres.should eq([ "electro" ])
538
- end
539
- end
540
- end
541
-
542
- end
543
-
544
- describe "#create!" do
545
-
546
- let(:criteria) do
547
- Account.where(number: "11123213")
548
- end
549
-
550
- context "when provided invalid attributes" do
551
-
552
- it "raises an error" do
553
- expect {
554
- criteria.create!
555
- }.to raise_error(Mongoid::Errors::Validations)
491
+ expect(criteria.context).to be_a(Mongoid::Contextual::Mongo)
556
492
  end
557
493
  end
558
494
  end
@@ -574,7 +510,7 @@ describe Mongoid::Criteria do
574
510
  end
575
511
 
576
512
  it "deletes all the documents from the database" do
577
- Band.count.should eq(0)
513
+ expect(Band.count).to eq(0)
578
514
  end
579
515
  end
580
516
  end
@@ -592,7 +528,7 @@ describe Mongoid::Criteria do
592
528
  end
593
529
 
594
530
  it "returns the documents" do
595
- criteria.documents.should eq([ band ])
531
+ expect(criteria.documents).to eq([ band ])
596
532
  end
597
533
  end
598
534
 
@@ -611,7 +547,7 @@ describe Mongoid::Criteria do
611
547
  end
612
548
 
613
549
  it "sets the documents" do
614
- criteria.documents.should eq([ band ])
550
+ expect(criteria.documents).to eq([ band ])
615
551
  end
616
552
  end
617
553
 
@@ -629,7 +565,7 @@ describe Mongoid::Criteria do
629
565
 
630
566
  it "iterates over the matching documents" do
631
567
  criteria.each do |doc|
632
- doc.should eq(band)
568
+ expect(doc).to eq(band)
633
569
  end
634
570
  end
635
571
  end
@@ -652,7 +588,7 @@ describe Mongoid::Criteria do
652
588
  end
653
589
 
654
590
  it "returns the matching documents" do
655
- criteria.should eq([ match ])
591
+ expect(criteria).to eq([ match ])
656
592
  end
657
593
  end
658
594
 
@@ -669,7 +605,7 @@ describe Mongoid::Criteria do
669
605
  end
670
606
 
671
607
  it "returns true" do
672
- criteria.should be_embedded
608
+ expect(criteria).to be_embedded
673
609
  end
674
610
  end
675
611
 
@@ -680,7 +616,7 @@ describe Mongoid::Criteria do
680
616
  end
681
617
 
682
618
  it "returns false" do
683
- criteria.should_not be_embedded
619
+ expect(criteria).to_not be_embedded
684
620
  end
685
621
  end
686
622
  end
@@ -733,7 +669,7 @@ describe Mongoid::Criteria do
733
669
  end
734
670
 
735
671
  it "returns the matching documents" do
736
- criteria.should eq([ match ])
672
+ expect(criteria).to eq([ match ])
737
673
  end
738
674
  end
739
675
 
@@ -750,7 +686,7 @@ describe Mongoid::Criteria do
750
686
  end
751
687
 
752
688
  it "returns true" do
753
- criteria.exists?.should be_true
689
+ expect(criteria.exists?).to be true
754
690
  end
755
691
  end
756
692
 
@@ -761,7 +697,7 @@ describe Mongoid::Criteria do
761
697
  end
762
698
 
763
699
  it "returns false" do
764
- criteria.exists?.should be_false
700
+ expect(criteria.exists?).to be false
765
701
  end
766
702
  end
767
703
  end
@@ -773,14 +709,14 @@ describe Mongoid::Criteria do
773
709
  end
774
710
 
775
711
  it "returns the criteria explain path" do
776
- criteria.explain["cursor"].should eq("BasicCursor")
712
+ expect(criteria.explain["cursor"]).to eq("BasicCursor")
777
713
  end
778
714
  end
779
715
 
780
716
  describe "#extract_id" do
781
717
 
782
718
  let(:id) do
783
- Moped::BSON::ObjectId.new
719
+ BSON::ObjectId.new
784
720
  end
785
721
 
786
722
  context "when an id exists" do
@@ -792,7 +728,7 @@ describe Mongoid::Criteria do
792
728
  end
793
729
 
794
730
  it "returns the id" do
795
- criteria.extract_id.should eq(id)
731
+ expect(criteria.extract_id).to eq(id)
796
732
  end
797
733
  end
798
734
 
@@ -805,7 +741,7 @@ describe Mongoid::Criteria do
805
741
  end
806
742
 
807
743
  it "returns the _id" do
808
- criteria.extract_id.should eq(id)
744
+ expect(criteria.extract_id).to eq(id)
809
745
  end
810
746
  end
811
747
  end
@@ -817,1612 +753,284 @@ describe Mongoid::Criteria do
817
753
  end
818
754
 
819
755
  it "returns the fields minus type" do
820
- criteria.field_list.should eq([ "name" ])
756
+ expect(criteria.field_list).to eq([ "name" ])
821
757
  end
822
758
  end
823
759
 
824
- describe "#find" do
825
-
826
- context "when finding by a document" do
760
+ describe "#find_and_modify" do
827
761
 
828
- let(:band) do
829
- Band.create(name: "Tool")
830
- end
762
+ let!(:depeche) do
763
+ Band.create(name: "Depeche Mode")
764
+ end
831
765
 
832
- let!(:record) do
833
- band.records.create(name: "Undertow")
834
- end
766
+ let!(:tool) do
767
+ Band.create(name: "Tool")
768
+ end
835
769
 
836
- context "when the document is the root" do
770
+ context "when the selector matches" do
837
771
 
838
- let(:found) do
839
- Band.find(band)
840
- end
772
+ context "when the identity map is enabled" do
841
773
 
842
- it "returns the matching document" do
843
- expect(found).to eq(band)
844
- end
845
- end
774
+ context "when returning the updated document" do
846
775
 
847
- context "when the document is the proxy" do
776
+ let(:criteria) do
777
+ Band.where(name: "Depeche Mode")
778
+ end
848
779
 
849
- let(:found) do
850
- Band.find(band.records.first.band)
851
- end
780
+ let(:result) do
781
+ criteria.find_and_modify({ "$inc" => { likes: 1 }}, new: true)
782
+ end
852
783
 
853
- it "returns the matching document" do
854
- expect(found).to eq(band)
784
+ it "returns the first matching document" do
785
+ expect(result).to eq(depeche)
786
+ end
855
787
  end
856
- end
857
- end
858
788
 
859
- context "when the identity map is enabled" do
789
+ context "when not returning the updated document" do
860
790
 
861
- before(:all) do
862
- Mongoid.identity_map_enabled = true
863
- end
791
+ let(:criteria) do
792
+ Band.where(name: "Depeche Mode")
793
+ end
864
794
 
865
- after(:all) do
866
- Mongoid.identity_map_enabled = false
867
- end
795
+ let!(:result) do
796
+ criteria.find_and_modify("$inc" => { likes: 1 })
797
+ end
868
798
 
869
- let!(:depeche) do
870
- Band.create(name: "Depeche Mode")
871
- end
799
+ before do
800
+ depeche.reload
801
+ end
872
802
 
873
- let!(:placebo) do
874
- Band.create(name: "Placebo")
803
+ it "returns the first matching document" do
804
+ expect(result).to eq(depeche)
805
+ end
806
+ end
875
807
  end
876
808
 
877
- context "when a parent and a child are in the identity map" do
809
+ context "when not providing options" do
878
810
 
879
- let!(:canvas) do
880
- Canvas.create
811
+ let(:criteria) do
812
+ Band.where(name: "Depeche Mode")
881
813
  end
882
814
 
883
- let!(:browser) do
884
- Browser.create
815
+ let!(:result) do
816
+ criteria.find_and_modify("$inc" => { likes: 1 })
885
817
  end
886
818
 
887
- context "when fetching a child class by a parent id" do
819
+ it "returns the first matching document" do
820
+ expect(result).to eq(depeche)
821
+ end
888
822
 
889
- it "raises a not found error" do
890
- expect {
891
- Browser.find(canvas.id)
892
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
893
- end
823
+ it "updates the document in the database" do
824
+ expect(depeche.reload.likes).to eq(1)
894
825
  end
895
826
  end
896
827
 
897
- context "when providing a single id" do
828
+ context "when sorting" do
898
829
 
899
- let(:from_map) do
900
- Band.find(depeche.id)
830
+ let(:criteria) do
831
+ Band.desc(:name)
901
832
  end
902
833
 
903
- it "returns the document from the map" do
904
- from_map.should equal(depeche)
834
+ let!(:result) do
835
+ criteria.find_and_modify("$inc" => { likes: 1 })
905
836
  end
906
- end
907
-
908
- context "when providing a single id as a String" do
909
837
 
910
- let(:from_map) do
911
- Band.find(depeche.id.to_s)
838
+ it "returns the first matching document" do
839
+ expect(result).to eq(tool)
912
840
  end
913
841
 
914
- it "returns the document from the map" do
915
- from_map.should equal(depeche)
842
+ it "updates the document in the database" do
843
+ expect(tool.reload.likes).to eq(1)
916
844
  end
917
845
  end
918
846
 
919
- context "when providing multiple ids" do
847
+ context "when limiting fields" do
920
848
 
921
- let(:from_map) do
922
- Band.find(depeche.id, placebo.id)
849
+ let(:criteria) do
850
+ Band.only(:_id)
923
851
  end
924
852
 
925
- it "returns the first match from the map" do
926
- from_map.first.should equal(depeche)
853
+ let!(:result) do
854
+ criteria.find_and_modify("$inc" => { likes: 1 })
927
855
  end
928
856
 
929
- it "returns the second match from the map" do
930
- from_map.last.should equal(placebo)
857
+ it "returns the first matching document" do
858
+ expect(result).to eq(depeche)
931
859
  end
932
- end
933
- end
934
860
 
935
- context "when using object ids" do
861
+ it "limits the returned fields" do
862
+ expect(result.name).to be_nil
863
+ end
936
864
 
937
- let!(:band) do
938
- Band.create
865
+ it "updates the document in the database" do
866
+ expect(depeche.reload.likes).to eq(1)
867
+ end
939
868
  end
940
869
 
941
- context "when a parent and a child are in the identity map" do
870
+ context "when returning new" do
942
871
 
943
- let!(:canvas) do
944
- Canvas.create
872
+ let(:criteria) do
873
+ Band.where(name: "Depeche Mode")
945
874
  end
946
875
 
947
- let!(:browser) do
948
- Browser.create
876
+ let!(:result) do
877
+ criteria.find_and_modify({ "$inc" => { likes: 1 }}, new: true)
949
878
  end
950
879
 
951
- context "when fetching a child class by a parent id" do
880
+ it "returns the first matching document" do
881
+ expect(result).to eq(depeche)
882
+ end
952
883
 
953
- it "raises a not found error" do
954
- expect {
955
- Browser.find(canvas.id)
956
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
957
- end
884
+ it "returns the updated document" do
885
+ expect(result.likes).to eq(1)
958
886
  end
959
887
  end
960
888
 
961
- context "when providing a single id" do
889
+ context "when removing" do
962
890
 
963
- context "when the id matches" do
891
+ let(:criteria) do
892
+ Band.where(name: "Depeche Mode")
893
+ end
964
894
 
965
- let(:found) do
966
- Band.find(band.id)
967
- end
895
+ let!(:result) do
896
+ criteria.find_and_modify({}, remove: true)
897
+ end
968
898
 
969
- it "returns the matching document" do
970
- found.should eq(band)
971
- end
899
+ it "returns the first matching document" do
900
+ expect(result).to eq(depeche)
972
901
  end
973
902
 
974
- context "when the id does not match" do
903
+ it "deletes the document from the database" do
904
+ expect {
905
+ depeche.reload
906
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
907
+ end
908
+ end
909
+ end
975
910
 
976
- context "when raising a not found error" do
911
+ context "when the selector does not match" do
977
912
 
978
- before do
979
- Mongoid.raise_not_found_error = true
980
- end
913
+ let(:criteria) do
914
+ Band.where(name: "Placebo")
915
+ end
981
916
 
982
- let(:found) do
983
- Band.find(Moped::BSON::ObjectId.new)
984
- end
917
+ let(:result) do
918
+ criteria.find_and_modify("$inc" => { likes: 1 })
919
+ end
985
920
 
986
- it "raises an error" do
987
- expect {
988
- found
989
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
990
- end
991
- end
921
+ it "returns nil" do
922
+ expect(result).to be_nil
923
+ end
924
+ end
925
+ end
992
926
 
993
- context "when raising no error" do
927
+ describe "#freeze" do
994
928
 
995
- before do
996
- Mongoid.raise_not_found_error = false
997
- end
929
+ let(:criteria) do
930
+ Band.all
931
+ end
998
932
 
999
- after do
1000
- Mongoid.raise_not_found_error = true
1001
- end
933
+ before do
934
+ criteria.freeze
935
+ end
1002
936
 
1003
- let(:found) do
1004
- Band.find(Moped::BSON::ObjectId.new)
1005
- end
937
+ it "freezes the criteria" do
938
+ expect(criteria).to be_frozen
939
+ end
1006
940
 
1007
- it "returns nil" do
1008
- found.should be_nil
1009
- end
1010
- end
1011
- end
1012
- end
941
+ it "initializes inclusions" do
942
+ expect(criteria.inclusions).to be_empty
943
+ end
1013
944
 
1014
- context "when providing a splat of ids" do
945
+ it "initializes the context" do
946
+ expect(criteria.context).to_not be_nil
947
+ end
948
+ end
1015
949
 
1016
- let!(:band_two) do
1017
- Band.create(name: "Tool")
1018
- end
950
+ describe "#geo_near" do
1019
951
 
1020
- context "when all ids match" do
952
+ before do
953
+ Bar.create_indexes
954
+ end
1021
955
 
1022
- let(:found) do
1023
- Band.find(band.id, band_two.id)
1024
- end
956
+ let!(:match) do
957
+ Bar.create(location: [ 52.30, 13.25 ])
958
+ end
1025
959
 
1026
- it "contains the first match" do
1027
- found.should include(band)
1028
- end
960
+ let(:criteria) do
961
+ Bar.geo_near([ 52, 13 ]).max_distance(10).spherical
962
+ end
1029
963
 
1030
- it "contains the second match" do
1031
- found.should include(band_two)
1032
- end
964
+ it "returns the matching documents" do
965
+ expect(criteria).to eq([ match ])
966
+ end
967
+ end
1033
968
 
1034
- context "when ids are duplicates" do
1035
- let(:found) do
1036
- Band.find(band.id, band.id)
1037
- end
969
+ describe "#gt" do
1038
970
 
1039
- it "contains only the first match" do
1040
- found.should eq([band])
1041
- end
1042
- end
1043
- end
971
+ let!(:match) do
972
+ Band.create(member_count: 5)
973
+ end
1044
974
 
1045
- context "when any id does not match" do
975
+ let!(:non_match) do
976
+ Band.create(member_count: 1)
977
+ end
1046
978
 
1047
- context "when raising a not found error" do
979
+ let(:criteria) do
980
+ Band.gt(member_count: 4)
981
+ end
1048
982
 
1049
- before do
1050
- Mongoid.raise_not_found_error = true
1051
- end
983
+ it "returns the matching documents" do
984
+ expect(criteria).to eq([ match ])
985
+ end
986
+ end
1052
987
 
1053
- let(:found) do
1054
- Band.find(band.id, Moped::BSON::ObjectId.new)
1055
- end
988
+ describe "#gte" do
1056
989
 
1057
- it "raises an error" do
1058
- expect {
1059
- found
1060
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1061
- end
1062
- end
990
+ let!(:match) do
991
+ Band.create(member_count: 5)
992
+ end
1063
993
 
1064
- context "when raising no error" do
994
+ let!(:non_match) do
995
+ Band.create(member_count: 1)
996
+ end
1065
997
 
1066
- before do
1067
- Mongoid.raise_not_found_error = false
1068
- end
998
+ let(:criteria) do
999
+ Band.gte(member_count: 5)
1000
+ end
1069
1001
 
1070
- after do
1071
- Mongoid.raise_not_found_error = true
1072
- end
1002
+ it "returns the matching documents" do
1003
+ expect(criteria).to eq([ match ])
1004
+ end
1005
+ end
1073
1006
 
1074
- let(:found) do
1075
- Band.find(band.id, Moped::BSON::ObjectId.new)
1076
- end
1007
+ [ :in, :any_in ].each do |method|
1077
1008
 
1078
- it "returns only the matching documents" do
1079
- found.should eq([ band ])
1080
- end
1081
- end
1082
- end
1083
- end
1009
+ describe "\##{method}" do
1084
1010
 
1085
- context "when providing an array of ids" do
1011
+ context "when querying on a normal field" do
1086
1012
 
1087
- let!(:band_two) do
1088
- Band.create(name: "Tool")
1013
+ let!(:match) do
1014
+ Band.create(genres: [ "electro", "dub" ])
1089
1015
  end
1090
1016
 
1091
- context "when all ids match" do
1017
+ let!(:non_match) do
1018
+ Band.create(genres: [ "house" ])
1019
+ end
1092
1020
 
1093
- let(:found) do
1094
- Band.find([ band.id, band_two.id ])
1095
- end
1096
-
1097
- it "contains the first match" do
1098
- found.should include(band)
1099
- end
1100
-
1101
- it "contains the second match" do
1102
- found.should include(band_two)
1103
- end
1104
-
1105
- context "when ids are duplicates" do
1106
- let(:found) do
1107
- Band.find([ band.id, band.id ])
1108
- end
1109
-
1110
- it "contains only the first match" do
1111
- found.should eq([band])
1112
- end
1113
- end
1114
- end
1115
-
1116
- context "when any id does not match" do
1117
-
1118
- context "when raising a not found error" do
1119
-
1120
- before do
1121
- Mongoid.raise_not_found_error = true
1122
- end
1123
-
1124
- let(:found) do
1125
- Band.find([ band.id, Moped::BSON::ObjectId.new ])
1126
- end
1127
-
1128
- it "raises an error" do
1129
- expect {
1130
- found
1131
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1132
- end
1133
- end
1134
-
1135
- context "when raising no error" do
1136
-
1137
- before do
1138
- Mongoid.raise_not_found_error = false
1139
- end
1140
-
1141
- after do
1142
- Mongoid.raise_not_found_error = true
1143
- end
1144
-
1145
- let(:found) do
1146
- Band.find([ band.id, Moped::BSON::ObjectId.new ])
1147
- end
1148
-
1149
- it "returns only the matching documents" do
1150
- found.should eq([ band ])
1151
- end
1152
- end
1153
- end
1154
- end
1155
- end
1156
-
1157
- context "when using string ids" do
1158
-
1159
- before(:all) do
1160
- Band.field :_id, type: String
1161
- end
1162
-
1163
- after(:all) do
1164
- Band.field :_id, type: Moped::BSON::ObjectId, default: ->{ Moped::BSON::ObjectId.new }
1165
- end
1166
-
1167
- let!(:band) do
1168
- Band.create do |band|
1169
- band.id = "tool"
1170
- end
1171
- end
1172
-
1173
- context "when providing a single id" do
1174
-
1175
- context "when the id matches" do
1176
-
1177
- let(:found) do
1178
- Band.find(band.id)
1179
- end
1180
-
1181
- it "returns the matching document" do
1182
- found.should eq(band)
1183
- end
1184
- end
1185
-
1186
- context "when the id does not match" do
1187
-
1188
- context "when raising a not found error" do
1189
-
1190
- before do
1191
- Mongoid.raise_not_found_error = true
1192
- end
1193
-
1194
- let(:found) do
1195
- Band.find("depeche-mode")
1196
- end
1197
-
1198
- it "raises an error" do
1199
- expect {
1200
- found
1201
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1202
- end
1203
- end
1204
-
1205
- context "when raising no error" do
1206
-
1207
- before do
1208
- Mongoid.raise_not_found_error = false
1209
- end
1210
-
1211
- after do
1212
- Mongoid.raise_not_found_error = true
1213
- end
1214
-
1215
- let(:found) do
1216
- Band.find("depeche-mode")
1217
- end
1218
-
1219
- it "returns nil" do
1220
- found.should be_nil
1221
- end
1222
- end
1223
- end
1224
- end
1225
-
1226
- context "when providing a splat of ids" do
1227
-
1228
- let!(:band_two) do
1229
- Band.create do |band|
1230
- band.id = "depeche-mode"
1231
- end
1232
- end
1233
-
1234
- context "when all ids match" do
1235
-
1236
- let(:found) do
1237
- Band.find(band.id, band_two.id)
1238
- end
1239
-
1240
- it "contains the first match" do
1241
- found.should include(band)
1242
- end
1243
-
1244
- it "contains the second match" do
1245
- found.should include(band_two)
1246
- end
1247
- end
1248
-
1249
- context "when any id does not match" do
1250
-
1251
- context "when raising a not found error" do
1252
-
1253
- before do
1254
- Mongoid.raise_not_found_error = true
1255
- end
1256
-
1257
- let(:found) do
1258
- Band.find(band.id, "new-order")
1259
- end
1260
-
1261
- it "raises an error" do
1262
- expect {
1263
- found
1264
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1265
- end
1266
- end
1267
-
1268
- context "when raising no error" do
1269
-
1270
- before do
1271
- Mongoid.raise_not_found_error = false
1272
- end
1273
-
1274
- after do
1275
- Mongoid.raise_not_found_error = true
1276
- end
1277
-
1278
- let(:found) do
1279
- Band.find(band.id, "new-order")
1280
- end
1281
-
1282
- it "returns only the matching documents" do
1283
- found.should eq([ band ])
1284
- end
1285
- end
1286
- end
1287
- end
1288
-
1289
- context "when providing an array of ids" do
1290
-
1291
- let!(:band_two) do
1292
- Band.create do |band|
1293
- band.id = "depeche-mode"
1294
- end
1295
- end
1296
-
1297
- context "when all ids match" do
1298
-
1299
- let(:found) do
1300
- Band.find([ band.id, band_two.id ])
1301
- end
1302
-
1303
- it "contains the first match" do
1304
- found.should include(band)
1305
- end
1306
-
1307
- it "contains the second match" do
1308
- found.should include(band_two)
1309
- end
1310
- end
1311
-
1312
- context "when any id does not match" do
1313
-
1314
- context "when raising a not found error" do
1315
-
1316
- before do
1317
- Mongoid.raise_not_found_error = true
1318
- end
1319
-
1320
- let(:found) do
1321
- Band.find([ band.id, "new-order" ])
1322
- end
1323
-
1324
- it "raises an error" do
1325
- expect {
1326
- found
1327
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1328
- end
1329
- end
1330
-
1331
- context "when raising no error" do
1332
-
1333
- before do
1334
- Mongoid.raise_not_found_error = false
1335
- end
1336
-
1337
- after do
1338
- Mongoid.raise_not_found_error = true
1339
- end
1340
-
1341
- let(:found) do
1342
- Band.find([ band.id, "new-order" ])
1343
- end
1344
-
1345
- it "returns only the matching documents" do
1346
- found.should eq([ band ])
1347
- end
1348
- end
1349
- end
1350
- end
1351
- end
1352
-
1353
- context "when using hash ids" do
1354
-
1355
- before(:all) do
1356
- Band.field :_id, type: Hash
1357
- end
1358
-
1359
- after(:all) do
1360
- Band.field :_id, type: Moped::BSON::ObjectId, default: ->{ Moped::BSON::ObjectId.new }
1361
- end
1362
-
1363
- let!(:band) do
1364
- Band.create do |band|
1365
- band.id = {"new-order" => true, "Depeche Mode" => false}
1366
- end
1367
- end
1368
-
1369
- context "when providing a single id" do
1370
-
1371
- context "when the id matches" do
1372
-
1373
- let(:found) do
1374
- Band.find(band.id)
1375
- end
1376
-
1377
- it "returns the matching document" do
1378
- found.should eq(band)
1379
- end
1380
- end
1381
-
1382
- context "when the id does not match" do
1383
-
1384
- context "when raising a not found error" do
1385
-
1386
- before do
1387
- Mongoid.raise_not_found_error = true
1388
- end
1389
-
1390
- let(:found) do
1391
- Band.find({"new-order" => false, "Faith no More" => true})
1392
- end
1393
-
1394
- it "raises an error" do
1395
- expect {
1396
- found
1397
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1398
- end
1399
- end
1400
-
1401
- context "when raising no error" do
1402
-
1403
- before do
1404
- Mongoid.raise_not_found_error = false
1405
- end
1406
-
1407
- after do
1408
- Mongoid.raise_not_found_error = true
1409
- end
1410
-
1411
- let(:found) do
1412
- Band.find({"new-order" => false, "Faith no More" => true})
1413
- end
1414
-
1415
- it "returns nil" do
1416
- found.should be_nil
1417
- end
1418
- end
1419
- end
1420
- end
1421
-
1422
- context "when providing a splat of ids" do
1423
-
1424
- let!(:band_two) do
1425
- Band.create do |band|
1426
- band.id = {"Radiohead" => false, "Nirvana"=> true}
1427
- end
1428
- end
1429
-
1430
- context "when all ids match" do
1431
-
1432
- let(:found) do
1433
- Band.find(band.id, band_two.id)
1434
- end
1435
-
1436
- it "contains the first match" do
1437
- found.should include(band)
1438
- end
1439
-
1440
- it "contains the second match" do
1441
- found.should include(band_two)
1442
- end
1443
- end
1444
-
1445
- context "when any id does not match" do
1446
-
1447
- context "when raising a not found error" do
1448
-
1449
- before do
1450
- Mongoid.raise_not_found_error = true
1451
- end
1452
-
1453
- let(:found) do
1454
- Band.find(band.id, {"Radiohead" => true, "Nirvana"=> false})
1455
- end
1456
-
1457
- it "raises an error" do
1458
- expect {
1459
- found
1460
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1461
- end
1462
- end
1463
-
1464
- context "when raising no error" do
1465
-
1466
- before do
1467
- Mongoid.raise_not_found_error = false
1468
- end
1469
-
1470
- after do
1471
- Mongoid.raise_not_found_error = true
1472
- end
1473
-
1474
- let(:found) do
1475
- Band.find(band.id, {"Radiohead" => true, "Nirvana"=> false})
1476
- end
1477
-
1478
- it "returns only the matching documents" do
1479
- found.should eq([ band ])
1480
- end
1481
- end
1482
- end
1483
- end
1484
-
1485
- context "when providing an array of ids" do
1486
-
1487
- let!(:band_two) do
1488
- Band.create do |band|
1489
- band.id = {"Radiohead" => false, "Nirvana"=> true}
1490
- end
1491
- end
1492
-
1493
- context "when all ids match" do
1494
-
1495
- let(:found) do
1496
- Band.find([ band.id, band_two.id ])
1497
- end
1498
-
1499
- it "contains the first match" do
1500
- found.should include(band)
1501
- end
1502
-
1503
- it "contains the second match" do
1504
- found.should include(band_two)
1505
- end
1506
- end
1507
-
1508
- context "when any id does not match" do
1509
-
1510
- context "when raising a not found error" do
1511
-
1512
- before do
1513
- Mongoid.raise_not_found_error = true
1514
- end
1515
-
1516
- let(:found) do
1517
- Band.find([ band.id, {"Radiohead" => true, "Nirvana"=> false} ])
1518
- end
1519
-
1520
- it "raises an error" do
1521
- expect {
1522
- found
1523
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1524
- end
1525
- end
1526
-
1527
- context "when raising no error" do
1528
-
1529
- before do
1530
- Mongoid.raise_not_found_error = false
1531
- end
1532
-
1533
- after do
1534
- Mongoid.raise_not_found_error = true
1535
- end
1536
-
1537
- let(:found) do
1538
- Band.find([ band.id, {"Radiohead" => true, "Nirvana"=> false} ])
1539
- end
1540
-
1541
- it "returns only the matching documents" do
1542
- found.should eq([ band ])
1543
- end
1544
- end
1545
- end
1546
- end
1547
- end
1548
-
1549
- context "when using integer ids" do
1550
-
1551
- before(:all) do
1552
- Band.field :_id, type: Integer
1553
- end
1554
-
1555
- after(:all) do
1556
- Band.field :_id, type: Moped::BSON::ObjectId, default: ->{ Moped::BSON::ObjectId.new }
1557
- end
1558
-
1559
- let!(:band) do
1560
- Band.create do |band|
1561
- band.id = 1
1562
- end
1563
- end
1564
-
1565
- context "when providing a single id" do
1566
-
1567
- context "when the id matches" do
1568
-
1569
- let(:found) do
1570
- Band.find(band.id)
1571
- end
1572
-
1573
- it "returns the matching document" do
1574
- found.should eq(band)
1575
- end
1576
- end
1577
-
1578
- context "when the id does not match" do
1579
-
1580
- context "when raising a not found error" do
1581
-
1582
- before do
1583
- Mongoid.raise_not_found_error = true
1584
- end
1585
-
1586
- let(:found) do
1587
- Band.find(3)
1588
- end
1589
-
1590
- it "raises an error" do
1591
- expect {
1592
- found
1593
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1594
- end
1595
- end
1596
-
1597
- context "when raising no error" do
1598
-
1599
- before do
1600
- Mongoid.raise_not_found_error = false
1601
- end
1602
-
1603
- after do
1604
- Mongoid.raise_not_found_error = true
1605
- end
1606
-
1607
- let(:found) do
1608
- Band.find(3)
1609
- end
1610
-
1611
- it "returns nil" do
1612
- found.should be_nil
1613
- end
1614
- end
1615
- end
1616
- end
1617
-
1618
- context "when providing a splat of ids" do
1619
-
1620
- let!(:band_two) do
1621
- Band.create do |band|
1622
- band.id = 2
1623
- end
1624
- end
1625
-
1626
- context "when all ids match" do
1627
-
1628
- let(:found) do
1629
- Band.find(band.id, band_two.id)
1630
- end
1631
-
1632
- it "contains the first match" do
1633
- found.should include(band)
1634
- end
1635
-
1636
- it "contains the second match" do
1637
- found.should include(band_two)
1638
- end
1639
- end
1640
-
1641
- context "when any id does not match" do
1642
-
1643
- context "when raising a not found error" do
1644
-
1645
- before do
1646
- Mongoid.raise_not_found_error = true
1647
- end
1648
-
1649
- let(:found) do
1650
- Band.find(band.id, 3)
1651
- end
1652
-
1653
- it "raises an error" do
1654
- expect {
1655
- found
1656
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1657
- end
1658
- end
1659
-
1660
- context "when raising no error" do
1661
-
1662
- before do
1663
- Mongoid.raise_not_found_error = false
1664
- end
1665
-
1666
- after do
1667
- Mongoid.raise_not_found_error = true
1668
- end
1669
-
1670
- let(:found) do
1671
- Band.find(band.id, 3)
1672
- end
1673
-
1674
- it "returns only the matching documents" do
1675
- found.should eq([ band ])
1676
- end
1677
- end
1678
- end
1679
- end
1680
-
1681
- context "when providing an array of ids" do
1682
-
1683
- let!(:band_two) do
1684
- Band.create do |band|
1685
- band.id = 2
1686
- end
1687
- end
1688
-
1689
- context "when all ids match" do
1690
-
1691
- let(:found) do
1692
- Band.find([ band.id, band_two.id ])
1693
- end
1694
-
1695
- it "contains the first match" do
1696
- found.should include(band)
1697
- end
1698
-
1699
- it "contains the second match" do
1700
- found.should include(band_two)
1701
- end
1702
- end
1703
-
1704
- context "when any id does not match" do
1705
-
1706
- context "when raising a not found error" do
1707
-
1708
- before do
1709
- Mongoid.raise_not_found_error = true
1710
- end
1711
-
1712
- let(:found) do
1713
- Band.find([ band.id, 3 ])
1714
- end
1715
-
1716
- it "raises an error" do
1717
- expect {
1718
- found
1719
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1720
- end
1721
- end
1722
-
1723
- context "when raising no error" do
1724
-
1725
- before do
1726
- Mongoid.raise_not_found_error = false
1727
- end
1728
-
1729
- after do
1730
- Mongoid.raise_not_found_error = true
1731
- end
1732
-
1733
- let(:found) do
1734
- Band.find([ band.id, 3 ])
1735
- end
1736
-
1737
- it "returns only the matching documents" do
1738
- found.should eq([ band ])
1739
- end
1740
- end
1741
- end
1742
- end
1743
-
1744
- context "when providing a range" do
1745
-
1746
- let!(:band_two) do
1747
- Band.create do |band|
1748
- band.id = 2
1749
- end
1750
- end
1751
-
1752
- context "when all ids match" do
1753
-
1754
- let(:found) do
1755
- Band.find(1..2)
1756
- end
1757
-
1758
- it "contains the first match" do
1759
- found.should include(band)
1760
- end
1761
-
1762
- it "contains the second match" do
1763
- found.should include(band_two)
1764
- end
1765
- end
1766
-
1767
- context "when any id does not match" do
1768
-
1769
- context "when raising a not found error" do
1770
-
1771
- before do
1772
- Mongoid.raise_not_found_error = true
1773
- end
1774
-
1775
- let(:found) do
1776
- Band.find(1..3)
1777
- end
1778
-
1779
- it "raises an error" do
1780
- expect {
1781
- found
1782
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1783
- end
1784
- end
1785
-
1786
- context "when raising no error" do
1787
-
1788
- before do
1789
- Mongoid.raise_not_found_error = false
1790
- end
1791
-
1792
- after do
1793
- Mongoid.raise_not_found_error = true
1794
- end
1795
-
1796
- let(:found) do
1797
- Band.find(1..3)
1798
- end
1799
-
1800
- it "contains the first match" do
1801
- found.should include(band)
1802
- end
1803
-
1804
- it "contains the second match" do
1805
- found.should include(band_two)
1806
- end
1807
-
1808
- it "returns only the matches" do
1809
- found.count.should eq(2)
1810
- end
1811
- end
1812
- end
1813
- end
1814
- end
1815
-
1816
- context "when using string and object ids" do
1817
-
1818
- let!(:band) do
1819
- Band.create
1820
- end
1821
-
1822
- context "when providing multiple ids" do
1823
-
1824
- context "when ids are duplicates" do
1825
-
1826
- let(:found) do
1827
- Band.find([ band.id.to_s, band.id ])
1828
- end
1829
-
1830
- it "contains only the first match" do
1831
- found.should eq([band])
1832
- end
1833
- end
1834
- end
1835
- end
1836
- end
1837
-
1838
- describe "#find_and_modify" do
1839
-
1840
- let!(:depeche) do
1841
- Band.create(name: "Depeche Mode")
1842
- end
1843
-
1844
- let!(:tool) do
1845
- Band.create(name: "Tool")
1846
- end
1847
-
1848
- context "when the selector matches" do
1849
-
1850
- context "when the identity map is enabled" do
1851
-
1852
- before(:all) do
1853
- Mongoid.identity_map_enabled = true
1854
- end
1855
-
1856
- after(:all) do
1857
- Mongoid.identity_map_enabled = false
1858
- end
1859
-
1860
- context "when returning the updated document" do
1861
-
1862
- let(:criteria) do
1863
- Band.where(name: "Depeche Mode")
1864
- end
1865
-
1866
- let(:result) do
1867
- criteria.find_and_modify({ "$inc" => { likes: 1 }}, new: true)
1868
- end
1869
-
1870
- it "returns the first matching document" do
1871
- result.should eq(depeche)
1872
- end
1873
-
1874
- it "updates the document in the identity map" do
1875
- Mongoid::IdentityMap.get(Band, result.id).likes.should eq(1)
1876
- end
1877
- end
1878
-
1879
- context "when not returning the updated document" do
1880
-
1881
- let(:criteria) do
1882
- Band.where(name: "Depeche Mode")
1883
- end
1884
-
1885
- let!(:result) do
1886
- criteria.find_and_modify("$inc" => { likes: 1 })
1887
- end
1888
-
1889
- before do
1890
- depeche.reload
1891
- end
1892
-
1893
- it "returns the first matching document" do
1894
- result.should eq(depeche)
1895
- end
1896
-
1897
- it "updates the document in the identity map" do
1898
- Mongoid::IdentityMap.get(Band, depeche.id).likes.should eq(1)
1899
- end
1900
- end
1901
- end
1902
-
1903
- context "when not providing options" do
1904
-
1905
- let(:criteria) do
1906
- Band.where(name: "Depeche Mode")
1907
- end
1908
-
1909
- let!(:result) do
1910
- criteria.find_and_modify("$inc" => { likes: 1 })
1911
- end
1912
-
1913
- it "returns the first matching document" do
1914
- result.should eq(depeche)
1915
- end
1916
-
1917
- it "updates the document in the database" do
1918
- depeche.reload.likes.should eq(1)
1919
- end
1920
- end
1921
-
1922
- context "when sorting" do
1923
-
1924
- let(:criteria) do
1925
- Band.desc(:name)
1926
- end
1927
-
1928
- let!(:result) do
1929
- criteria.find_and_modify("$inc" => { likes: 1 })
1930
- end
1931
-
1932
- it "returns the first matching document" do
1933
- result.should eq(tool)
1934
- end
1935
-
1936
- it "updates the document in the database" do
1937
- tool.reload.likes.should eq(1)
1938
- end
1939
- end
1940
-
1941
- context "when limiting fields" do
1942
-
1943
- let(:criteria) do
1944
- Band.only(:_id)
1945
- end
1946
-
1947
- let!(:result) do
1948
- criteria.find_and_modify("$inc" => { likes: 1 })
1949
- end
1950
-
1951
- it "returns the first matching document" do
1952
- result.should eq(depeche)
1953
- end
1954
-
1955
- it "limits the returned fields" do
1956
- result.name.should be_nil
1957
- end
1958
-
1959
- it "updates the document in the database" do
1960
- depeche.reload.likes.should eq(1)
1961
- end
1962
- end
1963
-
1964
- context "when returning new" do
1965
-
1966
- let(:criteria) do
1967
- Band.where(name: "Depeche Mode")
1968
- end
1969
-
1970
- let!(:result) do
1971
- criteria.find_and_modify({ "$inc" => { likes: 1 }}, new: true)
1972
- end
1973
-
1974
- it "returns the first matching document" do
1975
- result.should eq(depeche)
1976
- end
1977
-
1978
- it "returns the updated document" do
1979
- result.likes.should eq(1)
1980
- end
1981
- end
1982
-
1983
- context "when removing" do
1984
-
1985
- let(:criteria) do
1986
- Band.where(name: "Depeche Mode")
1987
- end
1988
-
1989
- let!(:result) do
1990
- criteria.find_and_modify({}, remove: true)
1991
- end
1992
-
1993
- it "returns the first matching document" do
1994
- result.should eq(depeche)
1995
- end
1996
-
1997
- it "deletes the document from the database" do
1998
- expect {
1999
- depeche.reload
2000
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2001
- end
2002
- end
2003
- end
2004
-
2005
- context "when the selector does not match" do
2006
-
2007
- let(:criteria) do
2008
- Band.where(name: "Placebo")
2009
- end
2010
-
2011
- let(:result) do
2012
- criteria.find_and_modify("$inc" => { likes: 1 })
2013
- end
2014
-
2015
- it "returns nil" do
2016
- result.should be_nil
2017
- end
2018
- end
2019
- end
2020
-
2021
- describe "first_or_initialize" do
2022
-
2023
- let!(:band) do
2024
- Band.create(name: "Depeche Mode")
2025
- end
2026
-
2027
- context "when the document is found" do
2028
-
2029
- let(:found) do
2030
- Band.where(name: "Depeche Mode").first_or_initialize
2031
- end
2032
-
2033
- it "returns the document" do
2034
- found.should eq(band)
2035
- end
2036
- end
2037
-
2038
- context "when the document is not found" do
2039
-
2040
- context "when attributes are provided" do
2041
-
2042
- let(:document) do
2043
- Band.where(name: "Tool").first_or_initialize(origin: "Essex")
2044
- end
2045
-
2046
- it "returns a new document" do
2047
- document.name.should eq("Tool")
2048
- end
2049
-
2050
- it "returns a non persisted document" do
2051
- document.should_not be_persisted
2052
- end
2053
-
2054
- it "sets the additional attributes" do
2055
- document.origin.should eq("Essex")
2056
- end
2057
- end
2058
-
2059
- context "when attributes are not provided" do
2060
-
2061
- let(:document) do
2062
- Band.where(name: "Tool").first_or_initialize
2063
- end
2064
-
2065
- it "returns a new document" do
2066
- document.name.should eq("Tool")
2067
- end
2068
-
2069
- it "returns a non persisted document" do
2070
- document.should_not be_persisted
2071
- end
2072
- end
2073
-
2074
- context "when a block is provided" do
2075
-
2076
- let(:document) do
2077
- Band.where(name: "Tool").first_or_initialize do |doc|
2078
- doc.active = false
2079
- end
2080
- end
2081
-
2082
- it "returns a new document" do
2083
- document.name.should eq("Tool")
2084
- end
2085
-
2086
- it "returns a non persisted document" do
2087
- document.should_not be_persisted
2088
- end
2089
-
2090
- it "yields to the block" do
2091
- document.active.should be_false
2092
- end
2093
- end
2094
-
2095
- context "when the criteria is complex" do
2096
-
2097
- context "when the document is not found" do
2098
-
2099
- let(:document) do
2100
- Band.in(name: [ "New Order" ]).first_or_initialize(active: false)
2101
- end
2102
-
2103
- it "returns a new document" do
2104
- document.active.should be_false
2105
- end
2106
-
2107
- it "returns a non persisted document" do
2108
- document.should_not be_persisted
2109
- end
2110
- end
2111
- end
2112
- end
2113
- end
2114
-
2115
- describe "#freeze" do
2116
-
2117
- let(:criteria) do
2118
- Band.all
2119
- end
2120
-
2121
- before do
2122
- criteria.freeze
2123
- end
2124
-
2125
- it "freezes the criteria" do
2126
- criteria.should be_frozen
2127
- end
2128
-
2129
- it "initializes inclusions" do
2130
- criteria.inclusions.should be_empty
2131
- end
2132
-
2133
- it "initializes the context" do
2134
- criteria.context.should_not be_nil
2135
- end
2136
- end
2137
-
2138
- describe "#for_ids" do
2139
-
2140
- context "when only 1 id exists" do
2141
-
2142
- let(:id) do
2143
- Moped::BSON::ObjectId.new
2144
- end
2145
-
2146
- let(:criteria) do
2147
- Band.queryable.for_ids([ id ])
2148
- end
2149
-
2150
- it "does not turn the selector into an $in" do
2151
- criteria.selector.should eq({ "_id" => id })
2152
- end
2153
- end
2154
- end
2155
-
2156
- describe "#from_map_or_db" do
2157
-
2158
- before(:all) do
2159
- Mongoid.identity_map_enabled = true
2160
- end
2161
-
2162
- after(:all) do
2163
- Mongoid.identity_map_enabled = false
2164
- end
2165
-
2166
- context "when the document is in the identity map" do
2167
-
2168
- let!(:band) do
2169
- Band.create(name: "Depeche Mode")
2170
- end
2171
-
2172
- let(:criteria) do
2173
- Band.where(_id: band.id)
2174
- end
2175
-
2176
- let(:from_map) do
2177
- criteria.from_map_or_db
2178
- end
2179
-
2180
- it "returns the document from the map" do
2181
- from_map.should equal(band)
2182
- end
2183
- end
2184
-
2185
- context "when the document is not in the identity map" do
2186
-
2187
- let!(:band) do
2188
- Band.create(name: "Depeche Mode")
2189
- end
2190
-
2191
- let(:criteria) do
2192
- Band.where(_id: band.id)
2193
- end
2194
-
2195
- before do
2196
- Mongoid::IdentityMap.clear
2197
- end
2198
-
2199
- let(:from_db) do
2200
- criteria.from_map_or_db
2201
- end
2202
-
2203
- it "returns the document from the database" do
2204
- from_db.should_not equal(band)
2205
- end
2206
-
2207
- it "returns the correct document" do
2208
- from_db.should eq(band)
2209
- end
2210
- end
2211
-
2212
- context "when the selector is cleared in the identity map" do
2213
-
2214
- let!(:band) do
2215
- Band.create(name: "Depeche Mode")
2216
- end
2217
-
2218
- let(:criteria) do
2219
- Band.where(name: "Depeche Mode")
2220
- end
2221
-
2222
- before do
2223
- Mongoid::IdentityMap.clear
2224
- Mongoid::IdentityMap.clear_many(Band, { "name" => "Depeche Mode" })
2225
- end
2226
-
2227
- let(:from_db) do
2228
- criteria.from_map_or_db
2229
- end
2230
-
2231
- it "returns nil" do
2232
- from_db.should be_nil
2233
- end
2234
- end
2235
- end
2236
-
2237
- describe "#multiple_from_map_or_db" do
2238
-
2239
- before(:all) do
2240
- Mongoid.identity_map_enabled = true
2241
- end
2242
-
2243
- after(:all) do
2244
- Mongoid.identity_map_enabled = false
2245
- end
2246
-
2247
- context "when the document is in the identity map" do
2248
-
2249
- let!(:band) do
2250
- Band.create(name: "Depeche Mode")
2251
- end
2252
-
2253
- let!(:band_two) do
2254
- Band.create(name: "Tool")
2255
- end
2256
-
2257
- context "when providing a single id" do
2258
-
2259
- let(:criteria) do
2260
- Band.where(_id: band.id)
2261
- end
2262
-
2263
- let(:from_map) do
2264
- criteria.multiple_from_map_or_db([ band.id ])
2265
- end
2266
-
2267
- it "returns the document from the map" do
2268
- from_map.should include(band)
2269
- end
2270
- end
2271
-
2272
- context "when providing multiple ids" do
2273
-
2274
- let(:criteria) do
2275
- Band.where(:_id.in => [ band.id, band_two.id ])
2276
- end
2277
-
2278
- let(:from_map) do
2279
- criteria.multiple_from_map_or_db([ band.id, band_two.id ])
2280
- end
2281
-
2282
- it "returns the documents from the map" do
2283
- from_map.should include(band, band_two)
2284
- end
2285
- end
2286
- end
2287
-
2288
- context "when the document is not in the identity map" do
2289
-
2290
- let!(:band) do
2291
- Band.create(name: "Depeche Mode")
2292
- end
2293
-
2294
- let!(:band_two) do
2295
- Band.create(name: "Tool")
2296
- end
2297
-
2298
- before do
2299
- Mongoid::IdentityMap.clear
2300
- end
2301
-
2302
- context "when providing a single id" do
2303
-
2304
- let(:criteria) do
2305
- Band.where(_id: band.id)
2306
- end
2307
-
2308
- let(:from_db) do
2309
- criteria.multiple_from_map_or_db([ band.id ])
2310
- end
2311
-
2312
- it "returns the document from the database" do
2313
- from_db.first.should_not equal(band)
2314
- end
2315
-
2316
- it "returns the correct document" do
2317
- from_db.first.should eq(band)
2318
- end
2319
- end
2320
-
2321
- context "when providing multiple ids" do
2322
-
2323
- let(:criteria) do
2324
- Band.where(:_id.in => [ band.id, band_two.id ])
2325
- end
2326
-
2327
- let(:from_db) do
2328
- criteria.multiple_from_map_or_db([ band.id, band_two.id ])
2329
- end
2330
-
2331
- it "returns the document from the database" do
2332
- from_db.first.should_not equal(band)
2333
- end
2334
-
2335
- it "returns the correct document" do
2336
- from_db.first.should eq(band)
2337
- end
2338
- end
2339
- end
2340
- end
2341
-
2342
- describe "#geo_near" do
2343
-
2344
- before do
2345
- Bar.create_indexes
2346
- end
2347
-
2348
- let!(:match) do
2349
- Bar.create(location: [ 52.30, 13.25 ])
2350
- end
2351
-
2352
- let(:criteria) do
2353
- Bar.geo_near([ 52, 13 ]).max_distance(10).spherical
2354
- end
2355
-
2356
- it "returns the matching documents" do
2357
- criteria.should eq([ match ])
2358
- end
2359
- end
2360
-
2361
- describe "#gt" do
2362
-
2363
- let!(:match) do
2364
- Band.create(member_count: 5)
2365
- end
2366
-
2367
- let!(:non_match) do
2368
- Band.create(member_count: 1)
2369
- end
2370
-
2371
- let(:criteria) do
2372
- Band.gt(member_count: 4)
2373
- end
2374
-
2375
- it "returns the matching documents" do
2376
- criteria.should eq([ match ])
2377
- end
2378
- end
2379
-
2380
- describe "#gte" do
2381
-
2382
- let!(:match) do
2383
- Band.create(member_count: 5)
2384
- end
2385
-
2386
- let!(:non_match) do
2387
- Band.create(member_count: 1)
2388
- end
2389
-
2390
- let(:criteria) do
2391
- Band.gte(member_count: 5)
2392
- end
2393
-
2394
- it "returns the matching documents" do
2395
- criteria.should eq([ match ])
2396
- end
2397
- end
2398
-
2399
- [ :in, :any_in ].each do |method|
2400
-
2401
- describe "\##{method}" do
2402
-
2403
- context "when querying on a normal field" do
2404
-
2405
- let!(:match) do
2406
- Band.create(genres: [ "electro", "dub" ])
2407
- end
2408
-
2409
- let!(:non_match) do
2410
- Band.create(genres: [ "house" ])
2411
- end
2412
-
2413
- let(:criteria) do
2414
- Band.send(method, genres: [ "dub" ])
2415
- end
1021
+ let(:criteria) do
1022
+ Band.send(method, genres: [ "dub" ])
1023
+ end
2416
1024
 
2417
1025
  it "returns the matching documents" do
2418
- criteria.should eq([ match ])
1026
+ expect(criteria).to eq([ match ])
2419
1027
  end
2420
1028
  end
2421
1029
 
2422
1030
  context "when querying on a foreign key" do
2423
1031
 
2424
1032
  let(:id) do
2425
- Moped::BSON::ObjectId.new
1033
+ BSON::ObjectId.new
2426
1034
  end
2427
1035
 
2428
1036
  let!(:match_one) do
@@ -2436,7 +1044,7 @@ describe Mongoid::Criteria do
2436
1044
  end
2437
1045
 
2438
1046
  it "returns the matching documents" do
2439
- criteria.should eq([ match_one ])
1047
+ expect(criteria).to eq([ match_one ])
2440
1048
  end
2441
1049
  end
2442
1050
 
@@ -2447,7 +1055,7 @@ describe Mongoid::Criteria do
2447
1055
  end
2448
1056
 
2449
1057
  it "returns the matching documents" do
2450
- criteria.should eq([ match_one ])
1058
+ expect(criteria).to eq([ match_one ])
2451
1059
  end
2452
1060
  end
2453
1061
 
@@ -2460,7 +1068,7 @@ describe Mongoid::Criteria do
2460
1068
  end
2461
1069
 
2462
1070
  it "returns the matching documents" do
2463
- criteria.should eq([ match_one ])
1071
+ expect(criteria).to eq([ match_one ])
2464
1072
  end
2465
1073
  end
2466
1074
 
@@ -2475,7 +1083,7 @@ describe Mongoid::Criteria do
2475
1083
  end
2476
1084
 
2477
1085
  it "returns the matching documents" do
2478
- criteria.should eq([ game ])
1086
+ expect(criteria).to eq([ game ])
2479
1087
  end
2480
1088
  end
2481
1089
  end
@@ -2490,30 +1098,22 @@ describe Mongoid::Criteria do
2490
1098
  end
2491
1099
 
2492
1100
  it "sets the class" do
2493
- criteria.klass.should eq(Band)
1101
+ expect(criteria.klass).to eq(Band)
2494
1102
  end
2495
1103
 
2496
1104
  it "sets the aliased fields" do
2497
- criteria.aliased_fields.should eq(Band.aliased_fields)
1105
+ expect(criteria.aliased_fields).to eq(Band.aliased_fields)
2498
1106
  end
2499
1107
 
2500
1108
  it "sets the serializers" do
2501
- criteria.serializers.should eq(Band.fields)
1109
+ expect(criteria.serializers).to eq(Band.fields)
2502
1110
  end
2503
1111
  end
2504
1112
 
2505
1113
  describe "#includes" do
2506
1114
 
2507
- before do
2508
- Mongoid.identity_map_enabled = true
2509
- end
2510
-
2511
- after do
2512
- Mongoid.identity_map_enabled = false
2513
- end
2514
-
2515
1115
  let!(:person) do
2516
- Person.create
1116
+ Person.create(age: 1)
2517
1117
  end
2518
1118
 
2519
1119
  context "when providing a name that is not a relation" do
@@ -2571,30 +1171,20 @@ describe Mongoid::Criteria do
2571
1171
  B.create(c: c_two)
2572
1172
  end
2573
1173
 
2574
- before do
2575
- Mongoid::IdentityMap.clear
2576
- end
2577
-
2578
1174
  let!(:results) do
2579
- C.includes(:b).entries.detect do |c|
1175
+ C.includes(:b).to_a.detect do |c|
2580
1176
  c.id == c_two.id
2581
1177
  end
2582
1178
  end
2583
1179
 
2584
- let(:from_map) do
2585
- Mongoid::IdentityMap[B.collection_name][b.id]
2586
- end
2587
-
2588
1180
  it "returns the correct documents" do
2589
- results.should eq(c_two)
2590
- end
2591
-
2592
- it "inserts the first document into the identity map" do
2593
- from_map.should eq(b)
1181
+ expect(results).to eq(c_two)
2594
1182
  end
2595
1183
 
2596
- it "retrieves the document from the identity map" do
2597
- results.b.should equal(from_map)
1184
+ it "does not query the db" do
1185
+ expect_query(0) do
1186
+ results.b
1187
+ end
2598
1188
  end
2599
1189
  end
2600
1190
  end
@@ -2648,42 +1238,26 @@ describe Mongoid::Criteria do
2648
1238
  C.create(d: d_two)
2649
1239
  end
2650
1240
 
2651
- before do
2652
- Mongoid::IdentityMap.clear
2653
- end
2654
-
2655
1241
  let!(:results) do
2656
1242
  D.includes(:b, :c).entries.detect do |d|
2657
1243
  d.id == d_two.id
2658
1244
  end
2659
1245
  end
2660
1246
 
2661
- let(:from_map_b) do
2662
- Mongoid::IdentityMap[B.collection_name][b.id]
2663
- end
2664
-
2665
- let(:from_map_c) do
2666
- Mongoid::IdentityMap[C.collection_name][c.id]
2667
- end
2668
-
2669
1247
  it "returns the correct documents" do
2670
- results.should eq(d_two)
2671
- end
2672
-
2673
- it "inserts the b document into the identity map" do
2674
- from_map_b.should eq(b)
2675
- end
2676
-
2677
- it "inserts the c document into the identity map" do
2678
- from_map_c.should eq(c)
1248
+ expect(results).to eq(d_two)
2679
1249
  end
2680
1250
 
2681
- it "retrieves the b document from the identity map" do
2682
- results.b.should equal(from_map_b)
1251
+ it "does not query the db on b" do
1252
+ expect_query(0) do
1253
+ results.b
1254
+ end
2683
1255
  end
2684
1256
 
2685
- it "retrieves the c document from the identity map" do
2686
- results.c.should equal(from_map_c)
1257
+ it "does not query the db on c" do
1258
+ expect_query(0) do
1259
+ results.b
1260
+ end
2687
1261
  end
2688
1262
  end
2689
1263
  end
@@ -2735,42 +1309,26 @@ describe Mongoid::Criteria do
2735
1309
  2.times.map { C.create(d: d_two) }
2736
1310
  end
2737
1311
 
2738
- before do
2739
- Mongoid::IdentityMap.clear
2740
- end
2741
-
2742
1312
  let!(:results) do
2743
1313
  D.includes(:b, :c).entries.detect do |d|
2744
1314
  d.id == d_two.id
2745
1315
  end
2746
1316
  end
2747
1317
 
2748
- let(:from_map_bs) do
2749
- bs.map { |b| Mongoid::IdentityMap[B.collection_name][b.id] }
2750
- end
2751
-
2752
- let(:from_map_cs) do
2753
- cs.map { |c| Mongoid::IdentityMap[C.collection_name][c.id] }
2754
- end
2755
-
2756
1318
  it "returns the correct documents" do
2757
- results.should eq(d_two)
2758
- end
2759
-
2760
- it "inserts the b documents into the identity map" do
2761
- from_map_bs.should eq(bs)
1319
+ expect(results).to eq(d_two)
2762
1320
  end
2763
1321
 
2764
- it "inserts the c documents into the identity map" do
2765
- from_map_cs.should eq(cs)
2766
- end
2767
-
2768
- it "retrieves the b documents from the identity map" do
2769
- results.b.should match_array(from_map_bs)
1322
+ it "does not query the db on b" do
1323
+ expect_query(0) do
1324
+ results.b
1325
+ end
2770
1326
  end
2771
1327
 
2772
- it "retrieves the c documents from the identity map" do
2773
- results.c.should match_array(from_map_cs)
1328
+ it "does not query the db on c" do
1329
+ expect_query(0) do
1330
+ results.b
1331
+ end
2774
1332
  end
2775
1333
  end
2776
1334
  end
@@ -2787,35 +1345,102 @@ describe Mongoid::Criteria do
2787
1345
  end
2788
1346
 
2789
1347
  it "does not duplicate the metadata in the inclusions" do
2790
- criteria.inclusions.should eq([ metadata ])
1348
+ expect(criteria.inclusions).to eq([ metadata ])
1349
+ end
1350
+ end
1351
+
1352
+ context "when mapping the results more than once" do
1353
+
1354
+ let!(:post) do
1355
+ person.posts.create(title: "one")
1356
+ end
1357
+
1358
+ let(:criteria) do
1359
+ Post.includes(:person)
1360
+ end
1361
+
1362
+ let!(:results) do
1363
+ criteria.map { |doc| doc }
1364
+ criteria.map { |doc| doc }
1365
+ end
1366
+
1367
+ it "returns the proper results" do
1368
+ expect(results.first.title).to eq("one")
2791
1369
  end
2792
1370
  end
2793
1371
 
2794
- context "when mapping the results more than once" do
1372
+ context "when including a belongs to relation" do
1373
+
1374
+ context "when the criteria is from the root" do
1375
+
1376
+ let!(:person_two) do
1377
+ Person.create(age: 2)
1378
+ end
1379
+
1380
+ let!(:post_one) do
1381
+ person.posts.create(title: "one")
1382
+ end
1383
+
1384
+ let!(:post_two) do
1385
+ person_two.posts.create(title: "two")
1386
+ end
1387
+
1388
+ context "when calling first" do
1389
+
1390
+ let(:criteria) do
1391
+ Post.includes(:person)
1392
+ end
1393
+
1394
+ let!(:document) do
1395
+ criteria.first
1396
+ end
1397
+
1398
+ it "eager loads the first document" do
1399
+ expect_query(0) do
1400
+ expect(document.person).to eq(person)
1401
+ end
1402
+ end
1403
+
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
+ it "returns the first document" do
1412
+ expect(document).to eq(post_one)
1413
+ end
1414
+ end
1415
+
1416
+ context "when calling last" do
2795
1417
 
2796
- before do
2797
- Mongoid::IdentityMap.clear
2798
- end
1418
+ let!(:criteria) do
1419
+ Post.includes(:person)
1420
+ end
2799
1421
 
2800
- let!(:post) do
2801
- person.posts.create(title: "one")
2802
- end
1422
+ let!(:document) do
1423
+ criteria.last
1424
+ end
2803
1425
 
2804
- let(:criteria) do
2805
- Post.includes(:person)
2806
- end
1426
+ it "eager loads the last document" do
1427
+ expect_query(0) do
1428
+ expect(document.person).to eq(person_two)
1429
+ end
1430
+ end
2807
1431
 
2808
- let!(:results) do
2809
- criteria.map { |doc| doc }
2810
- criteria.map { |doc| doc }
2811
- end
1432
+ it "does not eager load the first document" do
1433
+ doc = criteria.first
1434
+ expect_query(1) do
1435
+ expect(doc.person).to eq(person)
1436
+ end
1437
+ end
2812
1438
 
2813
- it "returns the proper results" do
2814
- results.first.title.should eq("one")
1439
+ it "returns the last document" do
1440
+ expect(document).to eq(post_two)
1441
+ end
1442
+ end
2815
1443
  end
2816
- end
2817
-
2818
- context "when including a belongs to relation" do
2819
1444
 
2820
1445
  context "when the criteria is from an embedded relation" do
2821
1446
 
@@ -2848,10 +1473,6 @@ describe Mongoid::Criteria do
2848
1473
 
2849
1474
  context "when calling first" do
2850
1475
 
2851
- before do
2852
- Mongoid::IdentityMap.clear
2853
- end
2854
-
2855
1476
  let(:criteria) do
2856
1477
  peep.reload.addresses.includes(:band)
2857
1478
  end
@@ -2860,37 +1481,30 @@ describe Mongoid::Criteria do
2860
1481
  criteria.context
2861
1482
  end
2862
1483
 
2863
- before do
2864
- context.should_receive(:eager_load_one).with(address_one).once.and_call_original
2865
- end
2866
-
2867
1484
  let!(:document) do
2868
1485
  criteria.first
2869
1486
  end
2870
1487
 
2871
- let(:eager_loaded) do
2872
- Mongoid::IdentityMap[Band.collection_name]
2873
- end
2874
-
2875
1488
  it "eager loads the first document" do
2876
- eager_loaded[depeche.id].should eq(depeche)
1489
+ expect_query(0) do
1490
+ expect(document.band).to eq(depeche)
1491
+ end
2877
1492
  end
2878
1493
 
2879
1494
  it "does not eager load the last document" do
2880
- eager_loaded[tool.id].should be_nil
1495
+ doc = criteria.last
1496
+ expect_query(1) do
1497
+ expect(doc.band).to eq(tool)
1498
+ end
2881
1499
  end
2882
1500
 
2883
1501
  it "returns the document" do
2884
- document.should eq(address_one)
1502
+ expect(document).to eq(address_one)
2885
1503
  end
2886
1504
  end
2887
1505
 
2888
1506
  context "when calling last" do
2889
1507
 
2890
- before do
2891
- Mongoid::IdentityMap.clear
2892
- end
2893
-
2894
1508
  let(:criteria) do
2895
1509
  peep.reload.addresses.includes(:band)
2896
1510
  end
@@ -2899,37 +1513,30 @@ describe Mongoid::Criteria do
2899
1513
  criteria.context
2900
1514
  end
2901
1515
 
2902
- before do
2903
- context.should_receive(:eager_load_one).with(address_two).once.and_call_original
2904
- end
2905
-
2906
1516
  let!(:document) do
2907
1517
  criteria.last
2908
1518
  end
2909
1519
 
2910
- let(:eager_loaded) do
2911
- Mongoid::IdentityMap[Band.collection_name]
1520
+ it "eager loads the last document" do
1521
+ expect_query(0) do
1522
+ expect(document.band).to eq(tool)
1523
+ end
2912
1524
  end
2913
1525
 
2914
1526
  it "does not eager load the first document" do
2915
- eager_loaded[depeche.id].should be_nil
2916
- end
2917
-
2918
- it "eager loads the last document" do
2919
- eager_loaded[tool.id].should eq(tool)
1527
+ doc = criteria.first
1528
+ expect_query(1) do
1529
+ expect(doc.band).to eq(depeche)
1530
+ end
2920
1531
  end
2921
1532
 
2922
1533
  it "returns the document" do
2923
- document.should eq(address_two)
1534
+ expect(document).to eq(address_two)
2924
1535
  end
2925
1536
  end
2926
1537
 
2927
1538
  context "when iterating all documents" do
2928
1539
 
2929
- before do
2930
- Mongoid::IdentityMap.clear
2931
- end
2932
-
2933
1540
  let(:criteria) do
2934
1541
  peep.reload.addresses.includes(:band)
2935
1542
  end
@@ -2938,113 +1545,24 @@ describe Mongoid::Criteria do
2938
1545
  criteria.context
2939
1546
  end
2940
1547
 
2941
- before do
2942
- context.
2943
- should_receive(:eager_load).
2944
- with([ address_one, address_two ]).
2945
- once.
2946
- and_call_original
2947
- end
2948
-
2949
1548
  let!(:documents) do
2950
1549
  criteria.to_a
2951
1550
  end
2952
1551
 
2953
- let(:eager_loaded) do
2954
- Mongoid::IdentityMap[Band.collection_name]
2955
- end
2956
-
2957
1552
  it "eager loads the first document" do
2958
- eager_loaded[depeche.id].should eq(depeche)
1553
+ expect_query(0) do
1554
+ expect(documents.first.band).to eq(depeche)
1555
+ end
2959
1556
  end
2960
1557
 
2961
1558
  it "eager loads the last document" do
2962
- eager_loaded[tool.id].should eq(tool)
1559
+ expect_query(0) do
1560
+ expect(documents.last.band).to eq(tool)
1561
+ end
2963
1562
  end
2964
1563
 
2965
1564
  it "returns the documents" do
2966
- documents.should eq([ address_one, address_two ])
2967
- end
2968
- end
2969
- end
2970
-
2971
- context "when the criteria is from the root" do
2972
-
2973
- let!(:person_two) do
2974
- Person.create
2975
- end
2976
-
2977
- let!(:post_one) do
2978
- person.posts.create(title: "one")
2979
- end
2980
-
2981
- let!(:post_two) do
2982
- person_two.posts.create(title: "two")
2983
- end
2984
-
2985
- before do
2986
- Mongoid::IdentityMap.clear
2987
- end
2988
-
2989
- context "when calling first" do
2990
-
2991
- let!(:criteria) do
2992
- Post.includes(:person)
2993
- end
2994
-
2995
- let!(:context) do
2996
- criteria.context
2997
- end
2998
-
2999
- before do
3000
- context.should_receive(:eager_load_one).with(post_one).once.and_call_original
3001
- end
3002
-
3003
- let!(:document) do
3004
- criteria.first
3005
- end
3006
-
3007
- it "eager loads for the first document" do
3008
- Mongoid::IdentityMap[Person.collection_name][person.id].should eq(person)
3009
- end
3010
-
3011
- it "does not eager loads for the last document" do
3012
- Mongoid::IdentityMap[Person.collection_name][person_two.id].should be_nil
3013
- end
3014
-
3015
- it "returns the first document" do
3016
- document.should eq(post_one)
3017
- end
3018
- end
3019
-
3020
- context "when calling last" do
3021
-
3022
- let!(:criteria) do
3023
- Post.includes(:person)
3024
- end
3025
-
3026
- let!(:context) do
3027
- criteria.context
3028
- end
3029
-
3030
- before do
3031
- context.should_receive(:eager_load_one).with(post_two).once.and_call_original
3032
- end
3033
-
3034
- let!(:document) do
3035
- criteria.last
3036
- end
3037
-
3038
- it "eager loads for the first document" do
3039
- Mongoid::IdentityMap[Person.collection_name][person_two.id].should eq(person_two)
3040
- end
3041
-
3042
- it "does not eager loads for the last document" do
3043
- Mongoid::IdentityMap[Person.collection_name][person.id].should be_nil
3044
- end
3045
-
3046
- it "returns the last document" do
3047
- document.should eq(post_two)
1565
+ expect(documents).to eq([ address_one, address_two ])
3048
1566
  end
3049
1567
  end
3050
1568
  end
@@ -3053,7 +1571,7 @@ describe Mongoid::Criteria do
3053
1571
  context "when providing inclusions to the default scope" do
3054
1572
 
3055
1573
  before do
3056
- Person.default_scope(Person.includes(:posts))
1574
+ Person.default_scope(->{ Person.includes(:posts) })
3057
1575
  end
3058
1576
 
3059
1577
  after do
@@ -3070,20 +1588,8 @@ describe Mongoid::Criteria do
3070
1588
 
3071
1589
  context "when the criteria has no options" do
3072
1590
 
3073
- before do
3074
- Mongoid::IdentityMap.clear
3075
- end
3076
-
3077
1591
  let!(:criteria) do
3078
- Person.all
3079
- end
3080
-
3081
- let!(:context) do
3082
- criteria.context
3083
- end
3084
-
3085
- before do
3086
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
1592
+ Person.asc(:age).all
3087
1593
  end
3088
1594
 
3089
1595
  let!(:documents) do
@@ -3091,15 +1597,19 @@ describe Mongoid::Criteria do
3091
1597
  end
3092
1598
 
3093
1599
  it "returns the correct documents" do
3094
- documents.should eq([ person ])
1600
+ expect(documents).to eq([ person ])
3095
1601
  end
3096
1602
 
3097
- it "inserts the first document into the identity map" do
3098
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
1603
+ it "eager loads the first document" do
1604
+ expect_query(0) do
1605
+ expect(documents.first.posts.first).to eq(post_one)
1606
+ end
3099
1607
  end
3100
1608
 
3101
- it "inserts the second document into the identity map" do
3102
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
1609
+ it "eager loads the last document" do
1610
+ expect_query(0) do
1611
+ expect(documents.first.posts.last).to eq(post_two)
1612
+ end
3103
1613
  end
3104
1614
 
3105
1615
  context "when executing the query twice" do
@@ -3113,43 +1623,23 @@ describe Mongoid::Criteria do
3113
1623
  end
3114
1624
 
3115
1625
  before do
3116
- new_context.should_receive(:eager_load_one).with(person).once.and_call_original
1626
+ expect(new_context).to receive(:eager_load_one).with(person).once.and_call_original
3117
1627
  end
3118
1628
 
3119
1629
  let!(:from_db) do
3120
1630
  new_criteria.first
3121
1631
  end
3122
1632
 
3123
- let(:mapped) do
3124
- Mongoid::IdentityMap[Post.collection_name][{"person_id" => person.id}]
3125
- end
3126
-
3127
1633
  it "does not duplicate documents in the relation" do
3128
- person.posts.size.should eq(2)
3129
- end
3130
-
3131
- it "does not duplicate documents in the map" do
3132
- mapped.size.should eq(2)
1634
+ expect(person.posts.size).to eq(2)
3133
1635
  end
3134
1636
  end
3135
1637
  end
3136
1638
 
3137
1639
  context "when calling first on the criteria" do
3138
1640
 
3139
- before do
3140
- Mongoid::IdentityMap.clear
3141
- end
3142
-
3143
1641
  let(:criteria) do
3144
- Person.all
3145
- end
3146
-
3147
- let!(:context) do
3148
- criteria.context
3149
- end
3150
-
3151
- before do
3152
- context.should_receive(:eager_load_one).with(person).once.and_call_original
1642
+ Person.asc(:age).all
3153
1643
  end
3154
1644
 
3155
1645
  let!(:from_db) do
@@ -3157,26 +1647,26 @@ describe Mongoid::Criteria do
3157
1647
  end
3158
1648
 
3159
1649
  it "returns the correct documents" do
3160
- from_db.should eq(person)
1650
+ expect(from_db).to eq(person)
3161
1651
  end
3162
1652
 
3163
- it "inserts the first document into the identity map" do
3164
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
1653
+ it "eager loads the first document" do
1654
+ expect_query(0) do
1655
+ expect(from_db.posts.first).to eq(post_one)
1656
+ end
3165
1657
  end
3166
1658
 
3167
- it "inserts the second document into the identity map" do
3168
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
1659
+ it "eager loads the last document" do
1660
+ expect_query(0) do
1661
+ expect(from_db.posts.last).to eq(post_two)
1662
+ end
3169
1663
  end
3170
1664
  end
3171
1665
 
3172
1666
  context "when calling last on the criteria" do
3173
1667
 
3174
- before do
3175
- Mongoid::IdentityMap.clear
3176
- end
3177
-
3178
1668
  let(:criteria) do
3179
- Person.all
1669
+ Person.asc(:age).all
3180
1670
  end
3181
1671
 
3182
1672
  let!(:context) do
@@ -3184,7 +1674,7 @@ describe Mongoid::Criteria do
3184
1674
  end
3185
1675
 
3186
1676
  before do
3187
- context.should_receive(:eager_load_one).with(person).once.and_call_original
1677
+ expect(context).to receive(:eager_load_one).with(person).once.and_call_original
3188
1678
  end
3189
1679
 
3190
1680
  let!(:from_db) do
@@ -3192,15 +1682,19 @@ describe Mongoid::Criteria do
3192
1682
  end
3193
1683
 
3194
1684
  it "returns the correct documents" do
3195
- from_db.should eq(person)
1685
+ expect(from_db).to eq(person)
3196
1686
  end
3197
1687
 
3198
- it "inserts the first document into the identity map" do
3199
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
1688
+ it "eager loads the first document" do
1689
+ expect_query(0) do
1690
+ expect(from_db.posts.first).to eq(post_one)
1691
+ end
3200
1692
  end
3201
1693
 
3202
- it "inserts the second document into the identity map" do
3203
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
1694
+ it "eager loads the last document" do
1695
+ expect_query(0) do
1696
+ expect(from_db.posts.last).to eq(post_two)
1697
+ end
3204
1698
  end
3205
1699
  end
3206
1700
 
@@ -3214,20 +1708,8 @@ describe Mongoid::Criteria do
3214
1708
  person_two.posts.create(title: "three")
3215
1709
  end
3216
1710
 
3217
- before do
3218
- Mongoid::IdentityMap.clear
3219
- end
3220
-
3221
1711
  let!(:criteria) do
3222
- Person.asc(:_id).limit(1)
3223
- end
3224
-
3225
- let(:context) do
3226
- criteria.context
3227
- end
3228
-
3229
- before do
3230
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
1712
+ Person.asc(:age).limit(1)
3231
1713
  end
3232
1714
 
3233
1715
  let!(:documents) do
@@ -3235,19 +1717,19 @@ describe Mongoid::Criteria do
3235
1717
  end
3236
1718
 
3237
1719
  it "returns the correct documents" do
3238
- criteria.should eq([ person ])
3239
- end
3240
-
3241
- it "inserts the first document into the identity map" do
3242
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
1720
+ expect(criteria).to eq([ person ])
3243
1721
  end
3244
1722
 
3245
- it "inserts the second document into the identity map" do
3246
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
1723
+ it "eager loads the first document" do
1724
+ expect_query(0) do
1725
+ expect(documents.first.posts.first).to eq(post_one)
1726
+ end
3247
1727
  end
3248
1728
 
3249
- it "does not insert the third post into the identity map" do
3250
- Mongoid::IdentityMap[Post.collection_name][post_three.id].should be_nil
1729
+ it "eager loads the second document" do
1730
+ expect_query(0) do
1731
+ expect(documents.first.posts.last).to eq(post_two)
1732
+ end
3251
1733
  end
3252
1734
  end
3253
1735
  end
@@ -3264,20 +1746,8 @@ describe Mongoid::Criteria do
3264
1746
 
3265
1747
  context "when the criteria has no options" do
3266
1748
 
3267
- before do
3268
- Mongoid::IdentityMap.clear
3269
- end
3270
-
3271
1749
  let!(:criteria) do
3272
- Person.includes(:preferences)
3273
- end
3274
-
3275
- let(:context) do
3276
- criteria.context
3277
- end
3278
-
3279
- before do
3280
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
1750
+ Person.asc(:age).includes(:preferences)
3281
1751
  end
3282
1752
 
3283
1753
  let!(:documents) do
@@ -3285,148 +1755,73 @@ describe Mongoid::Criteria do
3285
1755
  end
3286
1756
 
3287
1757
  it "returns the correct documents" do
3288
- documents.should eq([ person ])
1758
+ expect(documents).to eq([ person ])
3289
1759
  end
3290
1760
 
3291
- let(:preference_map) do
3292
- Mongoid::IdentityMap[Preference.collection_name]
3293
- end
3294
-
3295
- it "inserts the first document into the identity map" do
3296
- preference_map[preference_one.id].should eq(preference_one)
1761
+ it "eager loads the first document" do
1762
+ expect_query(0) do
1763
+ expect(documents.first.preferences.first).to eq(preference_one)
1764
+ end
3297
1765
  end
3298
1766
 
3299
- it "inserts the second document into the identity map" do
3300
- preference_map[preference_two.id].should eq(preference_two)
1767
+ it "eager loads the last document" do
1768
+ expect_query(0) do
1769
+ expect(documents.first.preferences.last).to eq(preference_two)
1770
+ end
3301
1771
  end
3302
1772
  end
3303
1773
 
3304
1774
  context "when calling first on the criteria" do
3305
1775
 
3306
- before do
3307
- Mongoid::IdentityMap.clear
3308
- end
3309
-
3310
- let!(:criteria) do
3311
- Person.includes(:preferences)
3312
- end
3313
-
3314
- let(:context) do
3315
- criteria.context
3316
- end
3317
-
3318
- before do
3319
- context.should_receive(:eager_load_one).with(person).once.and_call_original
3320
- end
3321
-
3322
- let!(:from_db) do
3323
- criteria.first
3324
- end
3325
-
3326
- it "returns the correct documents" do
3327
- from_db.should eq(person)
3328
- end
3329
-
3330
- let(:preference_map) do
3331
- Mongoid::IdentityMap[Preference.collection_name]
3332
- end
3333
-
3334
- it "inserts the first document into the identity map" do
3335
- preference_map[preference_one.id].should eq(preference_one)
3336
- end
3337
-
3338
- it "inserts the second document into the identity map" do
3339
- preference_map[preference_two.id].should eq(preference_two)
3340
- end
3341
- end
3342
-
3343
- context "when calling last on the criteria" do
3344
-
3345
- before do
3346
- Mongoid::IdentityMap.clear
3347
- end
3348
-
3349
1776
  let!(:criteria) do
3350
- Person.includes(:preferences)
3351
- end
3352
-
3353
- let(:context) do
3354
- criteria.context
3355
- end
3356
-
3357
- before do
3358
- context.should_receive(:eager_load_one).with(person).once.and_call_original
3359
- end
3360
-
3361
- let!(:from_db) do
3362
- criteria.last
3363
- end
3364
-
3365
- it "returns the correct documents" do
3366
- from_db.should eq(person)
3367
- end
3368
-
3369
- let(:preference_map) do
3370
- Mongoid::IdentityMap[Preference.collection_name]
3371
- end
3372
-
3373
- it "inserts the first document into the identity map" do
3374
- preference_map[preference_one.id].should eq(preference_one)
3375
- end
3376
-
3377
- it "inserts the second document into the identity map" do
3378
- preference_map[preference_two.id].should eq(preference_two)
3379
- end
3380
- end
3381
-
3382
- context "when the criteria has limiting options" do
3383
-
3384
- let!(:person_two) do
3385
- Person.create
3386
- end
3387
-
3388
- let!(:preference_three) do
3389
- person_two.preferences.create(name: "three")
3390
- end
3391
-
3392
- before do
3393
- Mongoid::IdentityMap.clear
1777
+ Person.asc(:age).includes(:preferences)
3394
1778
  end
3395
1779
 
3396
- let!(:criteria) do
3397
- Person.includes(:preferences).asc(:_id).limit(1)
1780
+ let!(:from_db) do
1781
+ criteria.first
3398
1782
  end
3399
1783
 
3400
- let(:context) do
3401
- criteria.context
1784
+ it "returns the correct documents" do
1785
+ expect(from_db).to eq(person)
3402
1786
  end
3403
1787
 
3404
- before do
3405
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
1788
+ it "eager loads the first document" do
1789
+ expect_query(0) do
1790
+ expect(from_db.preferences.first).to eq(preference_one)
1791
+ end
3406
1792
  end
3407
1793
 
3408
- let!(:documents) do
3409
- criteria.entries
1794
+ it "eager loads the last document" do
1795
+ expect_query(0) do
1796
+ expect(from_db.preferences.last).to eq(preference_two)
1797
+ end
3410
1798
  end
1799
+ end
3411
1800
 
3412
- let(:preference_map) do
3413
- Mongoid::IdentityMap[Preference.collection_name]
1801
+ context "when calling last on the criteria" do
1802
+
1803
+ let!(:criteria) do
1804
+ Person.asc(:age).includes(:preferences)
3414
1805
  end
3415
1806
 
3416
- it "returns the correct documents" do
3417
- documents.should eq([ person ])
1807
+ let!(:from_db) do
1808
+ criteria.last
3418
1809
  end
3419
1810
 
3420
- it "inserts the first document into the identity map" do
3421
- preference_map[preference_one.id].should eq(preference_one)
1811
+ it "returns the correct documents" do
1812
+ expect(from_db).to eq(person)
3422
1813
  end
3423
1814
 
3424
- it "inserts the second document into the identity map" do
3425
- preference_map[preference_two.id].should eq(preference_two)
1815
+ it "eager loads the first document" do
1816
+ expect_query(0) do
1817
+ expect(from_db.preferences.first).to eq(preference_one)
1818
+ end
3426
1819
  end
3427
1820
 
3428
- it "does not insert the third preference into the identity map" do
3429
- preference_map[preference_three.id].should be_nil
1821
+ it "eager loads the last document" do
1822
+ expect_query(0) do
1823
+ expect(from_db.preferences.last).to eq(preference_two)
1824
+ end
3430
1825
  end
3431
1826
  end
3432
1827
  end
@@ -3443,20 +1838,8 @@ describe Mongoid::Criteria do
3443
1838
 
3444
1839
  context "when the criteria has no options" do
3445
1840
 
3446
- before do
3447
- Mongoid::IdentityMap.clear
3448
- end
3449
-
3450
1841
  let!(:criteria) do
3451
- Person.includes(:posts)
3452
- end
3453
-
3454
- let(:context) do
3455
- criteria.context
3456
- end
3457
-
3458
- before do
3459
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
1842
+ Person.asc(:age).includes(:posts)
3460
1843
  end
3461
1844
 
3462
1845
  let!(:documents) do
@@ -3464,34 +1847,26 @@ describe Mongoid::Criteria do
3464
1847
  end
3465
1848
 
3466
1849
  it "returns the correct documents" do
3467
- documents.should eq([ person ])
1850
+ expect(documents).to eq([ person ])
3468
1851
  end
3469
1852
 
3470
- it "inserts the first document into the identity map" do
3471
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
1853
+ it "eager loads the first document" do
1854
+ expect_query(0) do
1855
+ expect(documents.first.posts.first).to eq(post_one)
1856
+ end
3472
1857
  end
3473
1858
 
3474
- it "inserts the second document into the identity map" do
3475
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
1859
+ it "eager loads the last document" do
1860
+ expect_query(0) do
1861
+ expect(documents.first.posts.last).to eq(post_two)
1862
+ end
3476
1863
  end
3477
1864
  end
3478
1865
 
3479
1866
  context "when calling first on the criteria" do
3480
1867
 
3481
- before do
3482
- Mongoid::IdentityMap.clear
3483
- end
3484
-
3485
1868
  let!(:criteria) do
3486
- Person.includes(:posts)
3487
- end
3488
-
3489
- let(:context) do
3490
- criteria.context
3491
- end
3492
-
3493
- before do
3494
- context.should_receive(:eager_load_one).with(person).once.and_call_original
1869
+ Person.asc(:age).includes(:posts)
3495
1870
  end
3496
1871
 
3497
1872
  let!(:from_db) do
@@ -3499,49 +1874,25 @@ describe Mongoid::Criteria do
3499
1874
  end
3500
1875
 
3501
1876
  it "returns the correct documents" do
3502
- from_db.should eq(person)
3503
- end
3504
-
3505
- it "inserts the first document into the identity map" do
3506
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
3507
- end
3508
-
3509
- it "inserts the second document into the identity map" do
3510
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
1877
+ expect(from_db).to eq(person)
3511
1878
  end
3512
1879
 
3513
1880
  context "when subsequently getting all documents" do
3514
1881
 
3515
- before do
3516
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
3517
- end
3518
-
3519
1882
  let!(:documents) do
3520
1883
  criteria.entries
3521
1884
  end
3522
1885
 
3523
1886
  it "returns the correct documents" do
3524
- documents.should eq([ person ])
1887
+ expect(documents).to eq([ person ])
3525
1888
  end
3526
1889
  end
3527
1890
  end
3528
1891
 
3529
1892
  context "when calling last on the criteria" do
3530
1893
 
3531
- before do
3532
- Mongoid::IdentityMap.clear
3533
- end
3534
-
3535
1894
  let!(:criteria) do
3536
- Person.includes(:posts)
3537
- end
3538
-
3539
- let(:context) do
3540
- criteria.context
3541
- end
3542
-
3543
- before do
3544
- context.should_receive(:eager_load_one).with(person).once.and_call_original
1895
+ Person.asc(:age).includes(:posts)
3545
1896
  end
3546
1897
 
3547
1898
  let!(:from_db) do
@@ -3549,29 +1900,17 @@ describe Mongoid::Criteria do
3549
1900
  end
3550
1901
 
3551
1902
  it "returns the correct documents" do
3552
- from_db.should eq(person)
3553
- end
3554
-
3555
- it "inserts the first document into the identity map" do
3556
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
3557
- end
3558
-
3559
- it "inserts the second document into the identity map" do
3560
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
1903
+ expect(from_db).to eq(person)
3561
1904
  end
3562
1905
 
3563
1906
  context "when subsequently getting all documents" do
3564
1907
 
3565
- before do
3566
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
3567
- end
3568
-
3569
1908
  let!(:documents) do
3570
1909
  criteria.entries
3571
1910
  end
3572
1911
 
3573
1912
  it "returns the correct documents" do
3574
- documents.should eq([ person ])
1913
+ expect(documents).to eq([ person ])
3575
1914
  end
3576
1915
  end
3577
1916
  end
@@ -3586,12 +1925,8 @@ describe Mongoid::Criteria do
3586
1925
  person_two.posts.create(title: "three")
3587
1926
  end
3588
1927
 
3589
- before do
3590
- Mongoid::IdentityMap.clear
3591
- end
3592
-
3593
1928
  let!(:criteria) do
3594
- Person.includes(:posts).asc(:_id).limit(1)
1929
+ Person.includes(:posts).asc(:age).limit(1)
3595
1930
  end
3596
1931
 
3597
1932
  let(:context) do
@@ -3599,7 +1934,7 @@ describe Mongoid::Criteria do
3599
1934
  end
3600
1935
 
3601
1936
  before do
3602
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
1937
+ expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
3603
1938
  end
3604
1939
 
3605
1940
  let!(:documents) do
@@ -3607,19 +1942,7 @@ describe Mongoid::Criteria do
3607
1942
  end
3608
1943
 
3609
1944
  it "returns the correct documents" do
3610
- documents.should eq([ person ])
3611
- end
3612
-
3613
- it "inserts the first document into the identity map" do
3614
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
3615
- end
3616
-
3617
- it "inserts the second document into the identity map" do
3618
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
3619
- end
3620
-
3621
- it "does not insert the third post into the identity map" do
3622
- Mongoid::IdentityMap[Post.collection_name][post_three.id].should be_nil
1945
+ expect(documents).to eq([ person ])
3623
1946
  end
3624
1947
  end
3625
1948
  end
@@ -3636,12 +1959,8 @@ describe Mongoid::Criteria do
3636
1959
 
3637
1960
  context "when the criteria has no options" do
3638
1961
 
3639
- before do
3640
- Mongoid::IdentityMap.clear
3641
- end
3642
-
3643
1962
  let!(:criteria) do
3644
- Person.includes(:game)
1963
+ Person.asc(:age).includes(:game)
3645
1964
  end
3646
1965
 
3647
1966
  let(:context) do
@@ -3649,7 +1968,7 @@ describe Mongoid::Criteria do
3649
1968
  end
3650
1969
 
3651
1970
  before do
3652
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
1971
+ expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
3653
1972
  end
3654
1973
 
3655
1974
  let!(:documents) do
@@ -3657,49 +1976,22 @@ describe Mongoid::Criteria do
3657
1976
  end
3658
1977
 
3659
1978
  it "returns the correct documents" do
3660
- documents.should eq([ person ])
3661
- end
3662
-
3663
- it "deletes the replaced document from the identity map" do
3664
- Mongoid::IdentityMap[Game.collection_name][game_one.id].should be_nil
3665
- end
3666
-
3667
- it "inserts the second document into the identity map" do
3668
- Mongoid::IdentityMap[Game.collection_name][game_two.id].should eq(game_two)
3669
- end
3670
-
3671
- context "when asking from map or db" do
3672
-
3673
- let(:in_map) do
3674
- Mongoid::IdentityMap[Game.collection_name][game_two.id]
3675
- end
3676
-
3677
- let(:game) do
3678
- Game.where("person_id" => person.id).from_map_or_db
3679
- end
3680
-
3681
- it "returns the document from the map" do
3682
- game.should equal(in_map)
3683
- end
1979
+ expect(documents).to eq([ person ])
3684
1980
  end
3685
1981
  end
3686
1982
 
3687
1983
  context "when the criteria has limiting options" do
3688
1984
 
3689
1985
  let!(:person_two) do
3690
- Person.create
1986
+ Person.create(age: 2)
3691
1987
  end
3692
1988
 
3693
1989
  let!(:game_three) do
3694
1990
  person_two.create_game(name: "Skyrim")
3695
1991
  end
3696
1992
 
3697
- before do
3698
- Mongoid::IdentityMap.clear
3699
- end
3700
-
3701
1993
  let!(:criteria) do
3702
- Person.where(id: person.id).includes(:game).asc(:_id).limit(1)
1994
+ Person.where(id: person.id).includes(:game).asc(:age).limit(1)
3703
1995
  end
3704
1996
 
3705
1997
  let(:context) do
@@ -3707,7 +1999,7 @@ describe Mongoid::Criteria do
3707
1999
  end
3708
2000
 
3709
2001
  before do
3710
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
2002
+ expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
3711
2003
  end
3712
2004
 
3713
2005
  let!(:documents) do
@@ -3715,15 +2007,7 @@ describe Mongoid::Criteria do
3715
2007
  end
3716
2008
 
3717
2009
  it "returns the correct documents" do
3718
- documents.should eq([ person ])
3719
- end
3720
-
3721
- it "inserts the second document into the identity map" do
3722
- Mongoid::IdentityMap[Game.collection_name][game_two.id].should eq(game_two)
3723
- end
3724
-
3725
- it "does not load the extra child into the map" do
3726
- Mongoid::IdentityMap[Game.collection_name][game_three.id].should be_nil
2010
+ expect(documents).to eq([ person ])
3727
2011
  end
3728
2012
  end
3729
2013
  end
@@ -3731,7 +2015,7 @@ describe Mongoid::Criteria do
3731
2015
  context "when including a belongs to" do
3732
2016
 
3733
2017
  let(:person_two) do
3734
- Person.create
2018
+ Person.create(age: 2)
3735
2019
  end
3736
2020
 
3737
2021
  let!(:game_one) do
@@ -3742,10 +2026,6 @@ describe Mongoid::Criteria do
3742
2026
  person_two.create_game(name: "two")
3743
2027
  end
3744
2028
 
3745
- before do
3746
- Mongoid::IdentityMap.clear
3747
- end
3748
-
3749
2029
  context "when providing no options" do
3750
2030
 
3751
2031
  let!(:criteria) do
@@ -3757,11 +2037,7 @@ describe Mongoid::Criteria do
3757
2037
  end
3758
2038
 
3759
2039
  before do
3760
- context.
3761
- should_receive(:eager_load).
3762
- with([ game_one, game_two ]).
3763
- once.
3764
- and_call_original
2040
+ expect(context).to receive(:eager_load).with([ game_one, game_two ]).once.and_call_original
3765
2041
  end
3766
2042
 
3767
2043
  let!(:documents) do
@@ -3769,15 +2045,7 @@ describe Mongoid::Criteria do
3769
2045
  end
3770
2046
 
3771
2047
  it "returns the correct documents" do
3772
- criteria.should eq([ game_one, game_two ])
3773
- end
3774
-
3775
- it "inserts the first document into the identity map" do
3776
- Mongoid::IdentityMap[Person.collection_name][person.id].should eq(person)
3777
- end
3778
-
3779
- it "inserts the second document into the identity map" do
3780
- Mongoid::IdentityMap[Person.collection_name][person_two.id].should eq(person_two)
2048
+ expect(criteria).to eq([ game_one, game_two ])
3781
2049
  end
3782
2050
  end
3783
2051
 
@@ -3792,7 +2060,7 @@ describe Mongoid::Criteria do
3792
2060
  end
3793
2061
 
3794
2062
  before do
3795
- context.should_receive(:eager_load).with([ game_one ]).once.and_call_original
2063
+ expect(context).to receive(:eager_load).with([ game_one ]).once.and_call_original
3796
2064
  end
3797
2065
 
3798
2066
  let!(:documents) do
@@ -3800,15 +2068,7 @@ describe Mongoid::Criteria do
3800
2068
  end
3801
2069
 
3802
2070
  it "returns the correct documents" do
3803
- documents.should eq([ game_one ])
3804
- end
3805
-
3806
- it "inserts the first document into the identity map" do
3807
- Mongoid::IdentityMap[Person.collection_name][person.id].should eq(person)
3808
- end
3809
-
3810
- it "does not load the documents outside of the limit" do
3811
- Mongoid::IdentityMap[Person.collection_name][person_two.id].should be_nil
2071
+ expect(documents).to eq([ game_one ])
3812
2072
  end
3813
2073
  end
3814
2074
  end
@@ -3831,12 +2091,8 @@ describe Mongoid::Criteria do
3831
2091
  person.create_game(name: "two")
3832
2092
  end
3833
2093
 
3834
- before do
3835
- Mongoid::IdentityMap.clear
3836
- end
3837
-
3838
2094
  let!(:criteria) do
3839
- Person.includes(:posts, :game)
2095
+ Person.includes(:posts, :game).asc(:age)
3840
2096
  end
3841
2097
 
3842
2098
  let(:context) do
@@ -3844,7 +2100,7 @@ describe Mongoid::Criteria do
3844
2100
  end
3845
2101
 
3846
2102
  before do
3847
- context.should_receive(:eager_load).with([ person ]).once.and_call_original
2103
+ expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
3848
2104
  end
3849
2105
 
3850
2106
  let!(:documents) do
@@ -3852,23 +2108,7 @@ describe Mongoid::Criteria do
3852
2108
  end
3853
2109
 
3854
2110
  it "returns the correct documents" do
3855
- criteria.should eq([ person ])
3856
- end
3857
-
3858
- it "inserts the first has many document into the identity map" do
3859
- Mongoid::IdentityMap[Post.collection_name][post_one.id].should eq(post_one)
3860
- end
3861
-
3862
- it "inserts the second has many document into the identity map" do
3863
- Mongoid::IdentityMap[Post.collection_name][post_two.id].should eq(post_two)
3864
- end
3865
-
3866
- it "removes the first has one document from the identity map" do
3867
- Mongoid::IdentityMap[Game.collection_name][game_one.id].should be_nil
3868
- end
3869
-
3870
- it "inserts the second has one document into the identity map" do
3871
- Mongoid::IdentityMap[Game.collection_name][game_two.id].should eq(game_two)
2111
+ expect(criteria).to eq([ person ])
3872
2112
  end
3873
2113
  end
3874
2114
  end
@@ -3884,7 +2124,7 @@ describe Mongoid::Criteria do
3884
2124
  end
3885
2125
 
3886
2126
  it "returns the inclusions" do
3887
- criteria.inclusions.should eq([ metadata ])
2127
+ expect(criteria.inclusions).to eq([ metadata ])
3888
2128
  end
3889
2129
  end
3890
2130
 
@@ -3903,7 +2143,7 @@ describe Mongoid::Criteria do
3903
2143
  end
3904
2144
 
3905
2145
  it "sets the inclusions" do
3906
- criteria.inclusions.should eq([ metadata ])
2146
+ expect(criteria.inclusions).to eq([ metadata ])
3907
2147
  end
3908
2148
  end
3909
2149
 
@@ -3922,7 +2162,7 @@ describe Mongoid::Criteria do
3922
2162
  end
3923
2163
 
3924
2164
  it "returns the matching documents" do
3925
- criteria.should eq([ match ])
2165
+ expect(criteria).to eq([ match ])
3926
2166
  end
3927
2167
  end
3928
2168
 
@@ -3941,7 +2181,7 @@ describe Mongoid::Criteria do
3941
2181
  end
3942
2182
 
3943
2183
  it "returns the matching documents" do
3944
- criteria.should eq([ match ])
2184
+ expect(criteria).to eq([ match ])
3945
2185
  end
3946
2186
  end
3947
2187
 
@@ -3973,15 +2213,29 @@ describe Mongoid::Criteria do
3973
2213
  Band.create(name: "Tool", likes: 100)
3974
2214
  end
3975
2215
 
3976
- let(:map_reduce) do
3977
- Band.limit(2).map_reduce(map, reduce).out(inline: 1)
2216
+ context "when no timeout options are provided" do
2217
+
2218
+ let(:map_reduce) do
2219
+ Band.limit(2).map_reduce(map, reduce).out(inline: 1)
2220
+ end
2221
+
2222
+ it "returns the map/reduce results" do
2223
+ expect(map_reduce).to eq([
2224
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
2225
+ { "_id" => "Tool", "value" => { "likes" => 100 }}
2226
+ ])
2227
+ end
3978
2228
  end
3979
2229
 
3980
- it "returns the map/reduce results" do
3981
- map_reduce.should eq([
3982
- { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
3983
- { "_id" => "Tool", "value" => { "likes" => 100 }}
3984
- ])
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
3985
2239
  end
3986
2240
  end
3987
2241
 
@@ -4008,7 +2262,7 @@ describe Mongoid::Criteria do
4008
2262
  end
4009
2263
 
4010
2264
  it "returns the max of the provided field" do
4011
- max.should eq(1000)
2265
+ expect(max).to eq(1000)
4012
2266
  end
4013
2267
  end
4014
2268
 
@@ -4021,7 +2275,7 @@ describe Mongoid::Criteria do
4021
2275
  end
4022
2276
 
4023
2277
  it "returns the document with the max value for the field" do
4024
- max.should eq(depeche)
2278
+ expect(max).to eq(depeche)
4025
2279
  end
4026
2280
  end
4027
2281
  end
@@ -4046,7 +2300,7 @@ describe Mongoid::Criteria do
4046
2300
  end
4047
2301
 
4048
2302
  it "returns the matching documents" do
4049
- criteria.should eq([ match ])
2303
+ expect(criteria).to eq([ match ])
4050
2304
  end
4051
2305
  end
4052
2306
 
@@ -4077,27 +2331,27 @@ describe Mongoid::Criteria do
4077
2331
  end
4078
2332
 
4079
2333
  it "merges the selector" do
4080
- merged.selector.should eq({ "name" => "Depeche Mode" })
2334
+ expect(merged.selector).to eq({ "name" => "Depeche Mode" })
4081
2335
  end
4082
2336
 
4083
2337
  it "merges the options" do
4084
- merged.options.should eq({ sort: { "name" => 1 }})
2338
+ expect(merged.options).to eq({ sort: { "name" => 1 }})
4085
2339
  end
4086
2340
 
4087
2341
  it "merges the documents" do
4088
- merged.documents.should eq([ band ])
2342
+ expect(merged.documents).to eq([ band ])
4089
2343
  end
4090
2344
 
4091
2345
  it "merges the scoping options" do
4092
- merged.scoping_options.should eq([ nil, nil ])
2346
+ expect(merged.scoping_options).to eq([ nil, nil ])
4093
2347
  end
4094
2348
 
4095
2349
  it "merges the inclusions" do
4096
- merged.inclusions.should eq([ metadata ])
2350
+ expect(merged.inclusions).to eq([ metadata ])
4097
2351
  end
4098
2352
 
4099
2353
  it "returns a new criteria" do
4100
- merged.should_not equal(criteria)
2354
+ expect(merged).to_not equal(criteria)
4101
2355
  end
4102
2356
  end
4103
2357
 
@@ -4116,23 +2370,23 @@ describe Mongoid::Criteria do
4116
2370
  end
4117
2371
 
4118
2372
  it "merges the selector" do
4119
- merged.selector.should eq({ "name" => "Depeche Mode" })
2373
+ expect(merged.selector).to eq({ "name" => "Depeche Mode" })
4120
2374
  end
4121
2375
 
4122
2376
  it "merges the options" do
4123
- merged.options.should eq({ sort: { "name" => 1 }})
2377
+ expect(merged.options).to eq({ sort: { "name" => 1 }})
4124
2378
  end
4125
2379
 
4126
2380
  it "merges the scoping options" do
4127
- merged.scoping_options.should eq([ nil, nil ])
2381
+ expect(merged.scoping_options).to eq([ nil, nil ])
4128
2382
  end
4129
2383
 
4130
2384
  it "merges the inclusions" do
4131
- merged.inclusions.should eq([ metadata ])
2385
+ expect(merged.inclusions).to eq([ metadata ])
4132
2386
  end
4133
2387
 
4134
2388
  it "returns a new criteria" do
4135
- merged.should_not equal(criteria)
2389
+ expect(merged).to_not equal(criteria)
4136
2390
  end
4137
2391
  end
4138
2392
  end
@@ -4162,27 +2416,27 @@ describe Mongoid::Criteria do
4162
2416
  end
4163
2417
 
4164
2418
  it "merges the selector" do
4165
- merged.selector.should eq({ "name" => "Depeche Mode" })
2419
+ expect(merged.selector).to eq({ "name" => "Depeche Mode" })
4166
2420
  end
4167
2421
 
4168
2422
  it "merges the options" do
4169
- merged.options.should eq({ sort: { "name" => 1 }})
2423
+ expect(merged.options).to eq({ sort: { "name" => 1 }})
4170
2424
  end
4171
2425
 
4172
2426
  it "merges the documents" do
4173
- merged.documents.should eq([ band ])
2427
+ expect(merged.documents).to eq([ band ])
4174
2428
  end
4175
2429
 
4176
2430
  it "merges the scoping options" do
4177
- merged.scoping_options.should eq([ nil, nil ])
2431
+ expect(merged.scoping_options).to eq([ nil, nil ])
4178
2432
  end
4179
2433
 
4180
2434
  it "merges the inclusions" do
4181
- merged.inclusions.should eq([ metadata ])
2435
+ expect(merged.inclusions).to eq([ metadata ])
4182
2436
  end
4183
2437
 
4184
2438
  it "returns the same criteria" do
4185
- merged.should equal(criteria)
2439
+ expect(merged).to equal(criteria)
4186
2440
  end
4187
2441
  end
4188
2442
 
@@ -4209,7 +2463,7 @@ describe Mongoid::Criteria do
4209
2463
  end
4210
2464
 
4211
2465
  it "returns the min of the provided field" do
4212
- min.should eq(500)
2466
+ expect(min).to eq(500)
4213
2467
  end
4214
2468
  end
4215
2469
 
@@ -4222,7 +2476,7 @@ describe Mongoid::Criteria do
4222
2476
  end
4223
2477
 
4224
2478
  it "returns the document with the min value for the field" do
4225
- min.should eq(tool)
2479
+ expect(min).to eq(tool)
4226
2480
  end
4227
2481
  end
4228
2482
  end
@@ -4243,7 +2497,7 @@ describe Mongoid::Criteria do
4243
2497
  end
4244
2498
 
4245
2499
  it "returns the matching documents" do
4246
- criteria.should eq([ match ])
2500
+ expect(criteria).to eq([ match ])
4247
2501
  end
4248
2502
  end
4249
2503
 
@@ -4262,7 +2516,7 @@ describe Mongoid::Criteria do
4262
2516
  end
4263
2517
 
4264
2518
  it "returns the matching documents" do
4265
- criteria.should eq([ match ])
2519
+ expect(criteria).to eq([ match ])
4266
2520
  end
4267
2521
  end
4268
2522
 
@@ -4281,7 +2535,7 @@ describe Mongoid::Criteria do
4281
2535
  end
4282
2536
 
4283
2537
  it "returns the matching documents" do
4284
- criteria.should eq([ match ])
2538
+ expect(criteria).to eq([ match ])
4285
2539
  end
4286
2540
  end
4287
2541
 
@@ -4300,7 +2554,7 @@ describe Mongoid::Criteria do
4300
2554
  end
4301
2555
 
4302
2556
  it "returns the matching documents" do
4303
- criteria.should eq([ match ])
2557
+ expect(criteria).to eq([ match ])
4304
2558
  end
4305
2559
  end
4306
2560
 
@@ -4319,7 +2573,7 @@ describe Mongoid::Criteria do
4319
2573
  end
4320
2574
 
4321
2575
  it "returns the matching documents" do
4322
- criteria.should eq([ match ])
2576
+ expect(criteria).to eq([ match ])
4323
2577
  end
4324
2578
  end
4325
2579
 
@@ -4338,7 +2592,7 @@ describe Mongoid::Criteria do
4338
2592
  end
4339
2593
 
4340
2594
  it "returns the matching documents" do
4341
- criteria.should eq([ match ])
2595
+ expect(criteria).to eq([ match ])
4342
2596
  end
4343
2597
  end
4344
2598
 
@@ -4357,11 +2611,13 @@ describe Mongoid::Criteria do
4357
2611
  end
4358
2612
 
4359
2613
  it "limits the returned fields" do
4360
- criteria.first.name.should be_nil
2614
+ expect {
2615
+ criteria.first.name
2616
+ }.to raise_error(ActiveModel::MissingAttributeError)
4361
2617
  end
4362
2618
 
4363
2619
  it "does not add _type to the fields" do
4364
- criteria.options[:fields]["_type"].should be_nil
2620
+ expect(criteria.options[:fields]["_type"]).to be_nil
4365
2621
  end
4366
2622
  end
4367
2623
 
@@ -4372,15 +2628,17 @@ describe Mongoid::Criteria do
4372
2628
  end
4373
2629
 
4374
2630
  it "includes the limited fields" do
4375
- criteria.first.name.should_not be_nil
2631
+ expect(criteria.first.name).to_not be_nil
4376
2632
  end
4377
2633
 
4378
2634
  it "excludes the non included fields" do
4379
- criteria.first.active.should be_nil
2635
+ expect {
2636
+ criteria.first.active
2637
+ }.to raise_error(ActiveModel::MissingAttributeError)
4380
2638
  end
4381
2639
 
4382
2640
  it "does not add _type to the fields" do
4383
- criteria.options[:fields]["_type"].should be_nil
2641
+ expect(criteria.options[:fields]["_type"]).to be_nil
4384
2642
  end
4385
2643
  end
4386
2644
 
@@ -4392,7 +2650,7 @@ describe Mongoid::Criteria do
4392
2650
 
4393
2651
  it "only limits the fields on the correct model" do
4394
2652
  criteria.each do |band|
4395
- Person.new.age.should eq(100)
2653
+ expect(Person.new.age).to eq(100)
4396
2654
  end
4397
2655
  end
4398
2656
  end
@@ -4405,7 +2663,7 @@ describe Mongoid::Criteria do
4405
2663
 
4406
2664
  it "only limits the fields on the correct criteria" do
4407
2665
  criteria.each do |band|
4408
- Band.new.active.should be_true
2666
+ expect(Band.new.active).to be true
4409
2667
  end
4410
2668
  end
4411
2669
  end
@@ -4419,7 +2677,7 @@ describe Mongoid::Criteria do
4419
2677
  it "only limits the fields on the correct criteria" do
4420
2678
  criteria.each do |band|
4421
2679
  Band.all.each do |b|
4422
- b.active.should be_true
2680
+ expect(b.active).to be true
4423
2681
  end
4424
2682
  end
4425
2683
  end
@@ -4433,7 +2691,7 @@ describe Mongoid::Criteria do
4433
2691
  end
4434
2692
 
4435
2693
  it "adds _type to the fields" do
4436
- criteria.options[:fields]["_type"].should eq(1)
2694
+ expect(criteria.options[:fields]["_type"]).to eq(1)
4437
2695
  end
4438
2696
  end
4439
2697
 
@@ -4446,7 +2704,7 @@ describe Mongoid::Criteria do
4446
2704
  end
4447
2705
 
4448
2706
  it "properly uses the database field name" do
4449
- criteria.options.should eq(fields: { "mobile_phones" => 1 })
2707
+ expect(criteria.options).to eq(fields: { "mobile_phones" => 1 })
4450
2708
  end
4451
2709
  end
4452
2710
  end
@@ -4471,7 +2729,7 @@ describe Mongoid::Criteria do
4471
2729
  end
4472
2730
 
4473
2731
  it "returns the matching documents" do
4474
- criteria.should eq([ match ])
2732
+ expect(criteria).to eq([ match ])
4475
2733
  end
4476
2734
  end
4477
2735
 
@@ -4482,7 +2740,7 @@ describe Mongoid::Criteria do
4482
2740
  end
4483
2741
 
4484
2742
  it "returns the matching documents" do
4485
- criteria.should eq([ match ])
2743
+ expect(criteria).to eq([ match ])
4486
2744
  end
4487
2745
  end
4488
2746
  end
@@ -4502,6 +2760,28 @@ describe Mongoid::Criteria do
4502
2760
  Band.create(name: "Photek", likes: 1)
4503
2761
  end
4504
2762
 
2763
+ context "when the field is aliased" do
2764
+
2765
+ let!(:expensive) do
2766
+ Product.create(price: 100000)
2767
+ end
2768
+
2769
+ let!(:cheap) do
2770
+ Product.create(price: 1)
2771
+ end
2772
+
2773
+ context "when using alias_attribute" do
2774
+
2775
+ let(:plucked) do
2776
+ Product.pluck(:price)
2777
+ end
2778
+
2779
+ it "uses the aliases" do
2780
+ expect(plucked).to eq([ 100000, 1 ])
2781
+ end
2782
+ end
2783
+ end
2784
+
4505
2785
  context "when the criteria matches" do
4506
2786
 
4507
2787
  context "when there are no duplicate values" do
@@ -4515,7 +2795,7 @@ describe Mongoid::Criteria do
4515
2795
  end
4516
2796
 
4517
2797
  it "returns the values" do
4518
- plucked.should eq([ "Depeche Mode", "Tool", "Photek" ])
2798
+ expect(plucked).to eq([ "Depeche Mode", "Tool", "Photek" ])
4519
2799
  end
4520
2800
 
4521
2801
  context "when subsequently executing the criteria without a pluck" do
@@ -4526,6 +2806,17 @@ describe Mongoid::Criteria do
4526
2806
  end
4527
2807
  end
4528
2808
 
2809
+ context "when plucking mult-fields" do
2810
+
2811
+ let(:plucked) do
2812
+ Band.where(:name.exists => true).pluck(:name, :likes)
2813
+ end
2814
+
2815
+ it "returns the values" do
2816
+ expect(plucked).to eq([ ["Depeche Mode", 3], ["Tool", 3], ["Photek", 1] ])
2817
+ end
2818
+ end
2819
+
4529
2820
  context "when there are duplicate values" do
4530
2821
 
4531
2822
  let(:plucked) do
@@ -4533,7 +2824,7 @@ describe Mongoid::Criteria do
4533
2824
  end
4534
2825
 
4535
2826
  it "returns the duplicates" do
4536
- plucked.should eq([ 3, 3, 1 ])
2827
+ expect(plucked).to eq([ 3, 3, 1 ])
4537
2828
  end
4538
2829
  end
4539
2830
  end
@@ -4545,7 +2836,7 @@ describe Mongoid::Criteria do
4545
2836
  end
4546
2837
 
4547
2838
  it "returns an empty array" do
4548
- plucked.should be_empty
2839
+ expect(plucked).to be_empty
4549
2840
  end
4550
2841
  end
4551
2842
 
@@ -4556,7 +2847,43 @@ describe Mongoid::Criteria do
4556
2847
  end
4557
2848
 
4558
2849
  it "returns the field values" do
4559
- plucked.should eq([ depeche.id, tool.id, photek.id ])
2850
+ expect(plucked).to eq([ depeche.id, tool.id, photek.id ])
2851
+ end
2852
+ end
2853
+
2854
+ context "when plucking existent and non-existent fields" do
2855
+
2856
+ let(:plucked) do
2857
+ Band.all.pluck(:id, :fooz)
2858
+ end
2859
+
2860
+ it "returns nil for the field that doesnt exist" do
2861
+ expect(plucked).to eq([[depeche.id, nil], [tool.id, nil], [photek.id, nil] ])
2862
+ end
2863
+ end
2864
+
2865
+ context "when plucking a field that doesnt exist" do
2866
+
2867
+ context "when pluck one field" do
2868
+
2869
+ let(:plucked) do
2870
+ Band.all.pluck(:foo)
2871
+ end
2872
+
2873
+ it "returns a array with nil values" do
2874
+ expect(plucked).to eq([nil, nil, nil])
2875
+ end
2876
+ end
2877
+
2878
+ context "when pluck multiple fields" do
2879
+
2880
+ let(:plucked) do
2881
+ Band.all.pluck(:foo, :bar)
2882
+ end
2883
+
2884
+ it "returns a nil arrays" do
2885
+ expect(plucked).to eq([[nil, nil], [nil, nil], [nil, nil]])
2886
+ end
4560
2887
  end
4561
2888
  end
4562
2889
  end
@@ -4576,7 +2903,7 @@ describe Mongoid::Criteria do
4576
2903
  context "when asking about a model public class method" do
4577
2904
 
4578
2905
  it "returns true" do
4579
- criteria.should respond_to(:ages)
2906
+ expect(criteria).to respond_to(:ages)
4580
2907
  end
4581
2908
  end
4582
2909
 
@@ -4585,7 +2912,7 @@ describe Mongoid::Criteria do
4585
2912
  context "when including private methods" do
4586
2913
 
4587
2914
  it "returns true" do
4588
- criteria.respond_to?(:for_ids, true).should be_true
2915
+ expect(criteria.respond_to?(:for_ids, true)).to be true
4589
2916
  end
4590
2917
  end
4591
2918
  end
@@ -4593,7 +2920,7 @@ describe Mongoid::Criteria do
4593
2920
  context "when asking about a model class public instance method" do
4594
2921
 
4595
2922
  it "returns true" do
4596
- criteria.respond_to?(:join).should be_true
2923
+ expect(criteria.respond_to?(:join)).to be true
4597
2924
  end
4598
2925
  end
4599
2926
 
@@ -4602,14 +2929,14 @@ describe Mongoid::Criteria do
4602
2929
  context "when not including private methods" do
4603
2930
 
4604
2931
  it "returns false" do
4605
- criteria.should_not respond_to(:fork)
2932
+ expect(criteria).to_not respond_to(:fork)
4606
2933
  end
4607
2934
  end
4608
2935
 
4609
2936
  context "when including private methods" do
4610
2937
 
4611
2938
  it "returns true" do
4612
- criteria.respond_to?(:fork, true).should be_true
2939
+ expect(criteria.respond_to?(:fork, true)).to be true
4613
2940
  end
4614
2941
  end
4615
2942
  end
@@ -4617,7 +2944,7 @@ describe Mongoid::Criteria do
4617
2944
  context "when asking about a criteria instance method" do
4618
2945
 
4619
2946
  it "returns true" do
4620
- criteria.should respond_to(:context)
2947
+ expect(criteria).to respond_to(:context)
4621
2948
  end
4622
2949
  end
4623
2950
 
@@ -4626,14 +2953,14 @@ describe Mongoid::Criteria do
4626
2953
  context "when not including private methods" do
4627
2954
 
4628
2955
  it "returns false" do
4629
- criteria.should_not respond_to(:puts)
2956
+ expect(criteria).to_not respond_to(:puts)
4630
2957
  end
4631
2958
  end
4632
2959
 
4633
2960
  context "when including private methods" do
4634
2961
 
4635
2962
  it "returns true" do
4636
- criteria.respond_to?(:puts, true).should be_true
2963
+ expect(criteria.respond_to?(:puts, true)).to be true
4637
2964
  end
4638
2965
  end
4639
2966
  end
@@ -4656,7 +2983,7 @@ describe Mongoid::Criteria do
4656
2983
  end
4657
2984
 
4658
2985
  it "sorts the results in memory" do
4659
- sorted.should eq([ tool, depeche ])
2986
+ expect(sorted).to eq([ tool, depeche ])
4660
2987
  end
4661
2988
  end
4662
2989
 
@@ -4683,7 +3010,7 @@ describe Mongoid::Criteria do
4683
3010
  end
4684
3011
 
4685
3012
  it "returns the sum of the provided field" do
4686
- sum.should eq(1500)
3013
+ expect(sum).to eq(1500)
4687
3014
  end
4688
3015
  end
4689
3016
 
@@ -4694,7 +3021,7 @@ describe Mongoid::Criteria do
4694
3021
  end
4695
3022
 
4696
3023
  it "returns the sum for the provided block" do
4697
- sum.should eq(1500)
3024
+ expect(sum).to eq(1500)
4698
3025
  end
4699
3026
  end
4700
3027
  end
@@ -4711,7 +3038,7 @@ describe Mongoid::Criteria do
4711
3038
  end
4712
3039
 
4713
3040
  it "returns the executed criteria" do
4714
- criteria.to_ary.should eq([ band ])
3041
+ expect(criteria.to_ary).to eq([ band ])
4715
3042
  end
4716
3043
  end
4717
3044
 
@@ -4726,7 +3053,7 @@ describe Mongoid::Criteria do
4726
3053
  end
4727
3054
 
4728
3055
  it "executes the criteria while properly giving the hint to Mongo" do
4729
- expect { criteria.to_ary }.to raise_error(Moped::Errors::QueryFailure, %r{failed with error 10113: "bad hint"})
3056
+ expect { criteria.to_ary }.to raise_error(Moped::Errors::QueryFailure)
4730
3057
  end
4731
3058
  end
4732
3059
 
@@ -4741,7 +3068,7 @@ describe Mongoid::Criteria do
4741
3068
  end
4742
3069
 
4743
3070
  it "executes the criteria while properly giving the hint to Mongo" do
4744
- expect { criteria.to_ary }.to raise_error(Moped::Errors::QueryFailure, %r{failed with error 10113: "bad hint"})
3071
+ expect { criteria.to_ary }.to raise_error(Moped::Errors::QueryFailure)
4745
3072
  end
4746
3073
  end
4747
3074
 
@@ -4759,7 +3086,32 @@ describe Mongoid::Criteria do
4759
3086
  end
4760
3087
 
4761
3088
  it "executes the criteria while properly giving the max scan to Mongo" do
4762
- criteria.to_ary.should eq [band]
3089
+ expect(criteria.to_ary).to eq [band]
3090
+ end
3091
+ end
3092
+
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")
4763
3115
  end
4764
3116
  end
4765
3117
 
@@ -4770,7 +3122,7 @@ describe Mongoid::Criteria do
4770
3122
  end
4771
3123
 
4772
3124
  it "returns self" do
4773
- criteria.to_criteria.should eq(criteria)
3125
+ expect(criteria.to_criteria).to eq(criteria)
4774
3126
  end
4775
3127
  end
4776
3128
 
@@ -4781,11 +3133,11 @@ describe Mongoid::Criteria do
4781
3133
  end
4782
3134
 
4783
3135
  it "returns a proc" do
4784
- criteria.to_proc.should be_a(Proc)
3136
+ expect(criteria.to_proc).to be_a(Proc)
4785
3137
  end
4786
3138
 
4787
3139
  it "wraps the criteria in the proc" do
4788
- criteria.to_proc[].should eq(criteria)
3140
+ expect(criteria.to_proc[]).to eq(criteria)
4789
3141
  end
4790
3142
  end
4791
3143
 
@@ -4802,7 +3154,7 @@ describe Mongoid::Criteria do
4802
3154
  end
4803
3155
 
4804
3156
  it "returns documents with the provided type" do
4805
- criteria.should eq([ browser ])
3157
+ expect(criteria).to eq([ browser ])
4806
3158
  end
4807
3159
  end
4808
3160
 
@@ -4817,7 +3169,7 @@ describe Mongoid::Criteria do
4817
3169
  end
4818
3170
 
4819
3171
  it "returns documents with the provided types" do
4820
- criteria.should eq([ browser ])
3172
+ expect(criteria).to eq([ browser ])
4821
3173
  end
4822
3174
  end
4823
3175
  end
@@ -4850,7 +3202,7 @@ describe Mongoid::Criteria do
4850
3202
  end
4851
3203
 
4852
3204
  it "returns the matching documents" do
4853
- criteria.should eq([ match ])
3205
+ expect(criteria).to eq([ match ])
4854
3206
  end
4855
3207
  end
4856
3208
  end
@@ -4864,18 +3216,18 @@ describe Mongoid::Criteria do
4864
3216
  end
4865
3217
 
4866
3218
  it "returns the matching documents" do
4867
- criteria.should eq([ match ])
3219
+ expect(criteria).to eq([ match ])
4868
3220
  end
4869
3221
  end
4870
3222
 
4871
3223
  context "when the criteria is an exact fk array match" do
4872
3224
 
4873
3225
  let(:id_one) do
4874
- Moped::BSON::ObjectId.new
3226
+ BSON::ObjectId.new
4875
3227
  end
4876
3228
 
4877
3229
  let(:id_two) do
4878
- Moped::BSON::ObjectId.new
3230
+ BSON::ObjectId.new
4879
3231
  end
4880
3232
 
4881
3233
  let(:criteria) do
@@ -4883,7 +3235,7 @@ describe Mongoid::Criteria do
4883
3235
  end
4884
3236
 
4885
3237
  it "does not wrap the array in another array" do
4886
- criteria.selector.should eq({ "agent_ids" => [ id_one, id_two ]})
3238
+ expect(criteria.selector).to eq({ "agent_ids" => [ id_one, id_two ]})
4887
3239
  end
4888
3240
  end
4889
3241
  end
@@ -4902,7 +3254,7 @@ describe Mongoid::Criteria do
4902
3254
  end
4903
3255
 
4904
3256
  it "returns the matching documents" do
4905
- criteria.should eq([ match ])
3257
+ expect(criteria).to eq([ match ])
4906
3258
  end
4907
3259
  end
4908
3260
 
@@ -4913,7 +3265,7 @@ describe Mongoid::Criteria do
4913
3265
  end
4914
3266
 
4915
3267
  it "returns the matching documents" do
4916
- criteria.should eq([ match ])
3268
+ expect(criteria).to eq([ match ])
4917
3269
  end
4918
3270
  end
4919
3271
  end
@@ -4927,7 +3279,7 @@ describe Mongoid::Criteria do
4927
3279
  context "when the method exists on the class" do
4928
3280
 
4929
3281
  before do
4930
- Person.should_receive(:minor).and_call_original
3282
+ expect(Person).to receive(:minor).and_call_original
4931
3283
  end
4932
3284
 
4933
3285
  it "calls the method on the class" do
@@ -4938,7 +3290,7 @@ describe Mongoid::Criteria do
4938
3290
  context "when the method exists on the criteria" do
4939
3291
 
4940
3292
  before do
4941
- criteria.should_receive(:to_criteria).and_call_original
3293
+ expect(criteria).to receive(:to_criteria).and_call_original
4942
3294
  end
4943
3295
 
4944
3296
  it "calls the method on the criteria" do
@@ -4949,7 +3301,7 @@ describe Mongoid::Criteria do
4949
3301
  context "when the method exists on array" do
4950
3302
 
4951
3303
  before do
4952
- criteria.should_receive(:entries).and_call_original
3304
+ expect(criteria).to receive(:entries).and_call_original
4953
3305
  end
4954
3306
 
4955
3307
  it "calls the method on the criteria" do
@@ -4960,7 +3312,7 @@ describe Mongoid::Criteria do
4960
3312
  context "when the method does not exist" do
4961
3313
 
4962
3314
  before do
4963
- criteria.should_receive(:entries).never
3315
+ expect(criteria).to receive(:entries).never
4964
3316
  end
4965
3317
 
4966
3318
  it "raises an error" do
@@ -4986,7 +3338,7 @@ describe Mongoid::Criteria do
4986
3338
  end
4987
3339
 
4988
3340
  it "passes the block through method_missing" do
4989
- criteria.uniq(&:name).should eq([ band_one ])
3341
+ expect(criteria.uniq(&:name)).to eq([ band_one ])
4990
3342
  end
4991
3343
  end
4992
3344
 
@@ -4996,94 +3348,36 @@ describe Mongoid::Criteria do
4996
3348
  Band.where(name: "Depeche Mode").with(collection: "artists")
4997
3349
  end
4998
3350
 
4999
- after do
5000
- Band.persistence_options.clear
5001
- end
5002
-
5003
3351
  it "retains the criteria selection" do
5004
- criteria.selector.should eq("name" => "Depeche Mode")
3352
+ expect(criteria.selector).to eq("name" => "Depeche Mode")
5005
3353
  end
5006
3354
 
5007
3355
  it "sets the persistence options" do
5008
- Band.persistence_options.should eq(collection: "artists")
3356
+ expect(criteria.persistence_options).to eq(collection: "artists")
5009
3357
  end
5010
3358
  end
5011
3359
 
5012
- describe "#within_box" do
3360
+ describe "#geo_spacial" do
5013
3361
 
5014
- before do
5015
- Bar.create_indexes
5016
- end
5017
-
5018
- let!(:match) do
5019
- Bar.create(location: [ 52.30, 13.25 ])
5020
- end
5021
-
5022
- let(:criteria) do
5023
- Bar.within_box(location: [[ 50, 10 ], [ 60, 20 ]])
5024
- end
5025
-
5026
- it "returns the matching documents" do
5027
- criteria.should eq([ match ])
5028
- end
5029
- end
5030
-
5031
- describe "#within_circle" do
5032
-
5033
- before do
5034
- Bar.create_indexes
5035
- end
5036
-
5037
- let!(:match) do
5038
- Bar.create(location: [ 52.30, 13.25 ])
5039
- end
5040
-
5041
- let(:criteria) do
5042
- Bar.within_circle(location: [[ 52, 13 ], 0.5 ])
5043
- end
5044
-
5045
- it "returns the matching documents" do
5046
- criteria.should eq([ match ])
5047
- end
5048
- end
5049
-
5050
- describe "#within_polygon" do
5051
-
5052
- before do
5053
- Bar.create_indexes
5054
- end
5055
-
5056
- let!(:match) do
5057
- Bar.create(location: [ 52.30, 13.25 ])
5058
- end
5059
-
5060
- let(:criteria) do
5061
- Bar.within_polygon(
5062
- location: [[ 50, 10 ], [ 50, 20 ], [ 60, 20 ], [ 60, 10 ]]
5063
- )
5064
- end
5065
-
5066
- it "returns the matching documents" do
5067
- criteria.should eq([ match ])
5068
- end
5069
- end
3362
+ context "when checking within a polygon" do
5070
3363
 
5071
- describe "#within_spherical_circle" do
5072
-
5073
- before do
5074
- Bar.create_indexes
5075
- end
3364
+ before do
3365
+ Bar.create_indexes
3366
+ end
5076
3367
 
5077
- let!(:match) do
5078
- Bar.create(location: [ 52.30, 13.25 ])
5079
- end
3368
+ let!(:match) do
3369
+ Bar.create(location: [ 52.30, 13.25 ])
3370
+ end
5080
3371
 
5081
- let(:criteria) do
5082
- Bar.within_spherical_circle(location: [[ 52, 13 ], 0.5 ])
5083
- end
3372
+ let(:criteria) do
3373
+ Bar.geo_spacial(
3374
+ :location.within_polygon => [[[ 50, 10 ], [ 50, 20 ], [ 60, 20 ], [ 60, 10 ], [ 50, 10 ]]]
3375
+ )
3376
+ end
5084
3377
 
5085
- it "returns the matching documents" do
5086
- criteria.should eq([ match ])
3378
+ it "returns the matching documents" do
3379
+ expect(criteria).to eq([ match ])
3380
+ end
5087
3381
  end
5088
3382
  end
5089
3383
 
@@ -5102,7 +3396,7 @@ describe Mongoid::Criteria do
5102
3396
  end
5103
3397
 
5104
3398
  it "returns the matching documents" do
5105
- criteria.should eq([ match ])
3399
+ expect(criteria).to eq([ match ])
5106
3400
  end
5107
3401
  end
5108
3402
 
@@ -5117,7 +3411,7 @@ describe Mongoid::Criteria do
5117
3411
  end
5118
3412
 
5119
3413
  it "returns the matching documents" do
5120
- criteria.should eq([ match ])
3414
+ expect(criteria).to eq([ match ])
5121
3415
  end
5122
3416
  end
5123
3417
 
@@ -5132,7 +3426,7 @@ describe Mongoid::Criteria do
5132
3426
  end
5133
3427
 
5134
3428
  it "properly uses the database field name" do
5135
- criteria.options.should eq(fields: { "mobile_phones" => 0 })
3429
+ expect(criteria.options).to eq(fields: { "mobile_phones" => 0 })
5136
3430
  end
5137
3431
  end
5138
3432
  end