mongoid_heroku_stable 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3235 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +452 -0
  7. data/lib/mongoid.rb +104 -0
  8. data/lib/mongoid/atomic.rb +384 -0
  9. data/lib/mongoid/atomic/modifiers.rb +317 -0
  10. data/lib/mongoid/atomic/paths.rb +3 -0
  11. data/lib/mongoid/atomic/paths/embedded.rb +28 -0
  12. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  13. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  14. data/lib/mongoid/atomic/paths/root.rb +39 -0
  15. data/lib/mongoid/attributes.rb +305 -0
  16. data/lib/mongoid/attributes/dynamic.rb +154 -0
  17. data/lib/mongoid/attributes/nested.rb +82 -0
  18. data/lib/mongoid/attributes/processing.rb +147 -0
  19. data/lib/mongoid/attributes/readonly.rb +56 -0
  20. data/lib/mongoid/changeable.rb +379 -0
  21. data/lib/mongoid/composable.rb +104 -0
  22. data/lib/mongoid/config.rb +263 -0
  23. data/lib/mongoid/config/environment.rb +44 -0
  24. data/lib/mongoid/config/options.rb +74 -0
  25. data/lib/mongoid/config/validators.rb +3 -0
  26. data/lib/mongoid/config/validators/option.rb +25 -0
  27. data/lib/mongoid/config/validators/session.rb +140 -0
  28. data/lib/mongoid/contextual.rb +54 -0
  29. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  30. data/lib/mongoid/contextual/aggregable/mongo.rb +145 -0
  31. data/lib/mongoid/contextual/atomic.rb +180 -0
  32. data/lib/mongoid/contextual/command.rb +61 -0
  33. data/lib/mongoid/contextual/eager.rb +158 -0
  34. data/lib/mongoid/contextual/find_and_modify.rb +69 -0
  35. data/lib/mongoid/contextual/geo_near.rb +238 -0
  36. data/lib/mongoid/contextual/map_reduce.rb +324 -0
  37. data/lib/mongoid/contextual/memory.rb +440 -0
  38. data/lib/mongoid/contextual/mongo.rb +676 -0
  39. data/lib/mongoid/contextual/queryable.rb +25 -0
  40. data/lib/mongoid/contextual/text_search.rb +180 -0
  41. data/lib/mongoid/copyable.rb +67 -0
  42. data/lib/mongoid/criteria.rb +562 -0
  43. data/lib/mongoid/criteria/findable.rb +179 -0
  44. data/lib/mongoid/criteria/inspectable.rb +25 -0
  45. data/lib/mongoid/criteria/marshalable.rb +50 -0
  46. data/lib/mongoid/criteria/modifiable.rb +189 -0
  47. data/lib/mongoid/criteria/scopable.rb +158 -0
  48. data/lib/mongoid/document.rb +361 -0
  49. data/lib/mongoid/equality.rb +66 -0
  50. data/lib/mongoid/errors.rb +41 -0
  51. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  52. data/lib/mongoid/errors/callback.rb +25 -0
  53. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  54. data/lib/mongoid/errors/document_not_found.rb +111 -0
  55. data/lib/mongoid/errors/eager_load.rb +22 -0
  56. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  57. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  58. data/lib/mongoid/errors/invalid_field.rb +64 -0
  59. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  60. data/lib/mongoid/errors/invalid_find.rb +19 -0
  61. data/lib/mongoid/errors/invalid_includes.rb +32 -0
  62. data/lib/mongoid/errors/invalid_index.rb +28 -0
  63. data/lib/mongoid/errors/invalid_options.rb +28 -0
  64. data/lib/mongoid/errors/invalid_path.rb +21 -0
  65. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  66. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  67. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  68. data/lib/mongoid/errors/invalid_time.rb +22 -0
  69. data/lib/mongoid/errors/invalid_value.rb +16 -0
  70. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  71. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  72. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  73. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  74. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  75. data/lib/mongoid/errors/no_default_session.rb +23 -0
  76. data/lib/mongoid/errors/no_environment.rb +19 -0
  77. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  78. data/lib/mongoid/errors/no_metadata.rb +21 -0
  79. data/lib/mongoid/errors/no_parent.rb +24 -0
  80. data/lib/mongoid/errors/no_session_config.rb +22 -0
  81. data/lib/mongoid/errors/no_session_database.rb +27 -0
  82. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  83. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  84. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  85. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  86. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  87. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  88. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  89. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  90. data/lib/mongoid/errors/validations.rb +29 -0
  91. data/lib/mongoid/evolvable.rb +19 -0
  92. data/lib/mongoid/extensions.rb +35 -0
  93. data/lib/mongoid/extensions/array.rb +180 -0
  94. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  95. data/lib/mongoid/extensions/boolean.rb +21 -0
  96. data/lib/mongoid/extensions/date.rb +77 -0
  97. data/lib/mongoid/extensions/date_time.rb +73 -0
  98. data/lib/mongoid/extensions/false_class.rb +38 -0
  99. data/lib/mongoid/extensions/float.rb +56 -0
  100. data/lib/mongoid/extensions/hash.rb +209 -0
  101. data/lib/mongoid/extensions/integer.rb +67 -0
  102. data/lib/mongoid/extensions/module.rb +28 -0
  103. data/lib/mongoid/extensions/nil_class.rb +33 -0
  104. data/lib/mongoid/extensions/object.rb +274 -0
  105. data/lib/mongoid/extensions/object_id.rb +54 -0
  106. data/lib/mongoid/extensions/range.rb +85 -0
  107. data/lib/mongoid/extensions/regexp.rb +27 -0
  108. data/lib/mongoid/extensions/set.rb +55 -0
  109. data/lib/mongoid/extensions/string.rb +199 -0
  110. data/lib/mongoid/extensions/symbol.rb +54 -0
  111. data/lib/mongoid/extensions/time.rb +88 -0
  112. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  113. data/lib/mongoid/extensions/true_class.rb +38 -0
  114. data/lib/mongoid/factory.rb +46 -0
  115. data/lib/mongoid/fields.rb +542 -0
  116. data/lib/mongoid/fields/foreign_key.rb +174 -0
  117. data/lib/mongoid/fields/localized.rb +73 -0
  118. data/lib/mongoid/fields/standard.rb +273 -0
  119. data/lib/mongoid/fields/validators.rb +2 -0
  120. data/lib/mongoid/fields/validators/macro.rb +92 -0
  121. data/lib/mongoid/findable.rb +133 -0
  122. data/lib/mongoid/identity_map.rb +163 -0
  123. data/lib/mongoid/indexable.rb +147 -0
  124. data/lib/mongoid/indexable/specification.rb +115 -0
  125. data/lib/mongoid/indexable/validators/options.rb +103 -0
  126. data/lib/mongoid/inspectable.rb +59 -0
  127. data/lib/mongoid/interceptable.rb +265 -0
  128. data/lib/mongoid/loggable.rb +69 -0
  129. data/lib/mongoid/matchable.rb +152 -0
  130. data/lib/mongoid/matchable/all.rb +27 -0
  131. data/lib/mongoid/matchable/and.rb +30 -0
  132. data/lib/mongoid/matchable/default.rb +72 -0
  133. data/lib/mongoid/matchable/exists.rb +23 -0
  134. data/lib/mongoid/matchable/gt.rb +21 -0
  135. data/lib/mongoid/matchable/gte.rb +21 -0
  136. data/lib/mongoid/matchable/in.rb +24 -0
  137. data/lib/mongoid/matchable/lt.rb +21 -0
  138. data/lib/mongoid/matchable/lte.rb +21 -0
  139. data/lib/mongoid/matchable/ne.rb +21 -0
  140. data/lib/mongoid/matchable/nin.rb +21 -0
  141. data/lib/mongoid/matchable/or.rb +33 -0
  142. data/lib/mongoid/matchable/size.rb +21 -0
  143. data/lib/mongoid/persistable.rb +207 -0
  144. data/lib/mongoid/persistable/creatable.rb +189 -0
  145. data/lib/mongoid/persistable/deletable.rb +149 -0
  146. data/lib/mongoid/persistable/destroyable.rb +55 -0
  147. data/lib/mongoid/persistable/incrementable.rb +36 -0
  148. data/lib/mongoid/persistable/logical.rb +38 -0
  149. data/lib/mongoid/persistable/poppable.rb +39 -0
  150. data/lib/mongoid/persistable/pullable.rb +55 -0
  151. data/lib/mongoid/persistable/pushable.rb +62 -0
  152. data/lib/mongoid/persistable/renamable.rb +35 -0
  153. data/lib/mongoid/persistable/savable.rb +52 -0
  154. data/lib/mongoid/persistable/settable.rb +33 -0
  155. data/lib/mongoid/persistable/unsettable.rb +36 -0
  156. data/lib/mongoid/persistable/updatable.rb +151 -0
  157. data/lib/mongoid/persistable/upsertable.rb +55 -0
  158. data/lib/mongoid/positional.rb +71 -0
  159. data/lib/mongoid/railtie.rb +156 -0
  160. data/lib/mongoid/railties/database.rake +97 -0
  161. data/lib/mongoid/railties/document.rb +12 -0
  162. data/lib/mongoid/relations.rb +162 -0
  163. data/lib/mongoid/relations/accessors.rb +299 -0
  164. data/lib/mongoid/relations/auto_save.rb +106 -0
  165. data/lib/mongoid/relations/binding.rb +218 -0
  166. data/lib/mongoid/relations/bindings.rb +9 -0
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  174. data/lib/mongoid/relations/builder.rb +57 -0
  175. data/lib/mongoid/relations/builders.rb +104 -0
  176. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  177. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  178. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  181. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  182. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  184. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  185. data/lib/mongoid/relations/cascading.rb +56 -0
  186. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  187. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  188. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  189. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  190. data/lib/mongoid/relations/constraint.rb +49 -0
  191. data/lib/mongoid/relations/conversions.rb +34 -0
  192. data/lib/mongoid/relations/counter_cache.rb +105 -0
  193. data/lib/mongoid/relations/cyclic.rb +107 -0
  194. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  195. data/lib/mongoid/relations/embedded/in.rb +231 -0
  196. data/lib/mongoid/relations/embedded/many.rb +639 -0
  197. data/lib/mongoid/relations/embedded/one.rb +223 -0
  198. data/lib/mongoid/relations/macros.rb +356 -0
  199. data/lib/mongoid/relations/many.rb +208 -0
  200. data/lib/mongoid/relations/marshalable.rb +32 -0
  201. data/lib/mongoid/relations/metadata.rb +1172 -0
  202. data/lib/mongoid/relations/nested_builder.rb +74 -0
  203. data/lib/mongoid/relations/one.rb +60 -0
  204. data/lib/mongoid/relations/options.rb +48 -0
  205. data/lib/mongoid/relations/polymorphic.rb +39 -0
  206. data/lib/mongoid/relations/proxy.rb +270 -0
  207. data/lib/mongoid/relations/referenced/in.rb +297 -0
  208. data/lib/mongoid/relations/referenced/many.rb +787 -0
  209. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  210. data/lib/mongoid/relations/referenced/one.rb +290 -0
  211. data/lib/mongoid/relations/reflections.rb +62 -0
  212. data/lib/mongoid/relations/synchronization.rb +169 -0
  213. data/lib/mongoid/relations/targets.rb +2 -0
  214. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  215. data/lib/mongoid/relations/touchable.rb +94 -0
  216. data/lib/mongoid/reloadable.rb +95 -0
  217. data/lib/mongoid/scopable.rb +379 -0
  218. data/lib/mongoid/selectable.rb +59 -0
  219. data/lib/mongoid/serializable.rb +170 -0
  220. data/lib/mongoid/sessions.rb +330 -0
  221. data/lib/mongoid/sessions/factory.rb +129 -0
  222. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  223. data/lib/mongoid/sessions/options.rb +141 -0
  224. data/lib/mongoid/sessions/validators.rb +2 -0
  225. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  226. data/lib/mongoid/shardable.rb +65 -0
  227. data/lib/mongoid/state.rb +97 -0
  228. data/lib/mongoid/threaded.rb +383 -0
  229. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  230. data/lib/mongoid/timestamps.rb +15 -0
  231. data/lib/mongoid/timestamps/created.rb +30 -0
  232. data/lib/mongoid/timestamps/created/short.rb +19 -0
  233. data/lib/mongoid/timestamps/short.rb +10 -0
  234. data/lib/mongoid/timestamps/updated.rb +39 -0
  235. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  236. data/lib/mongoid/traversable.rb +192 -0
  237. data/lib/mongoid/unit_of_work.rb +61 -0
  238. data/lib/mongoid/validatable.rb +180 -0
  239. data/lib/mongoid/validatable/associated.rb +48 -0
  240. data/lib/mongoid/validatable/format.rb +20 -0
  241. data/lib/mongoid/validatable/length.rb +20 -0
  242. data/lib/mongoid/validatable/localizable.rb +30 -0
  243. data/lib/mongoid/validatable/macros.rb +94 -0
  244. data/lib/mongoid/validatable/presence.rb +86 -0
  245. data/lib/mongoid/validatable/queryable.rb +30 -0
  246. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  247. data/lib/mongoid/version.rb +4 -0
  248. data/lib/rack/mongoid.rb +2 -0
  249. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  250. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  251. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  252. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  253. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  254. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  255. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  256. data/lib/rails/generators/mongoid_generator.rb +65 -0
  257. data/lib/rails/mongoid.rb +180 -0
  258. data/lib/support/ruby_version.rb +26 -0
  259. data/spec/app/models/account.rb +28 -0
  260. data/spec/app/models/acolyte.rb +17 -0
  261. data/spec/app/models/actor.rb +18 -0
  262. data/spec/app/models/actress.rb +2 -0
  263. data/spec/app/models/address.rb +77 -0
  264. data/spec/app/models/address_component.rb +5 -0
  265. data/spec/app/models/address_number.rb +6 -0
  266. data/spec/app/models/agency.rb +5 -0
  267. data/spec/app/models/agent.rb +12 -0
  268. data/spec/app/models/album.rb +14 -0
  269. data/spec/app/models/alert.rb +5 -0
  270. data/spec/app/models/animal.rb +25 -0
  271. data/spec/app/models/answer.rb +4 -0
  272. data/spec/app/models/appointment.rb +7 -0
  273. data/spec/app/models/article.rb +10 -0
  274. data/spec/app/models/artist.rb +66 -0
  275. data/spec/app/models/artwork.rb +4 -0
  276. data/spec/app/models/audio.rb +5 -0
  277. data/spec/app/models/augmentation.rb +11 -0
  278. data/spec/app/models/author.rb +4 -0
  279. data/spec/app/models/band.rb +26 -0
  280. data/spec/app/models/bar.rb +10 -0
  281. data/spec/app/models/basic.rb +6 -0
  282. data/spec/app/models/bed.rb +1 -0
  283. data/spec/app/models/big_palette.rb +2 -0
  284. data/spec/app/models/birthday.rb +13 -0
  285. data/spec/app/models/book.rb +13 -0
  286. data/spec/app/models/breed.rb +4 -0
  287. data/spec/app/models/browser.rb +6 -0
  288. data/spec/app/models/building.rb +5 -0
  289. data/spec/app/models/building_address.rb +5 -0
  290. data/spec/app/models/bus.rb +7 -0
  291. data/spec/app/models/business.rb +5 -0
  292. data/spec/app/models/callback_recorder.rb +25 -0
  293. data/spec/app/models/callback_test.rb +9 -0
  294. data/spec/app/models/canvas.rb +25 -0
  295. data/spec/app/models/car.rb +1 -0
  296. data/spec/app/models/cat.rb +8 -0
  297. data/spec/app/models/category.rb +8 -0
  298. data/spec/app/models/child.rb +4 -0
  299. data/spec/app/models/child_doc.rb +22 -0
  300. data/spec/app/models/church.rb +4 -0
  301. data/spec/app/models/circle.rb +3 -0
  302. data/spec/app/models/circuit.rb +4 -0
  303. data/spec/app/models/circus.rb +7 -0
  304. data/spec/app/models/code.rb +5 -0
  305. data/spec/app/models/comment.rb +16 -0
  306. data/spec/app/models/contractor.rb +5 -0
  307. data/spec/app/models/cookie.rb +6 -0
  308. data/spec/app/models/country_code.rb +8 -0
  309. data/spec/app/models/definition.rb +7 -0
  310. data/spec/app/models/description.rb +11 -0
  311. data/spec/app/models/dictionary.rb +10 -0
  312. data/spec/app/models/division.rb +10 -0
  313. data/spec/app/models/doctor.rb +12 -0
  314. data/spec/app/models/dog.rb +7 -0
  315. data/spec/app/models/dokument.rb +5 -0
  316. data/spec/app/models/dragon.rb +4 -0
  317. data/spec/app/models/driver.rb +7 -0
  318. data/spec/app/models/drug.rb +6 -0
  319. data/spec/app/models/dungeon.rb +4 -0
  320. data/spec/app/models/email.rb +6 -0
  321. data/spec/app/models/employer.rb +5 -0
  322. data/spec/app/models/entry.rb +6 -0
  323. data/spec/app/models/eraser.rb +1 -0
  324. data/spec/app/models/event.rb +22 -0
  325. data/spec/app/models/exhibition.rb +4 -0
  326. data/spec/app/models/exhibitor.rb +5 -0
  327. data/spec/app/models/eye.rb +9 -0
  328. data/spec/app/models/eye_bowl.rb +9 -0
  329. data/spec/app/models/face.rb +8 -0
  330. data/spec/app/models/favorite.rb +6 -0
  331. data/spec/app/models/filesystem.rb +5 -0
  332. data/spec/app/models/fire_hydrant.rb +6 -0
  333. data/spec/app/models/firefox.rb +4 -0
  334. data/spec/app/models/fish.rb +7 -0
  335. data/spec/app/models/folder.rb +7 -0
  336. data/spec/app/models/folder_item.rb +9 -0
  337. data/spec/app/models/fruits.rb +34 -0
  338. data/spec/app/models/game.rb +19 -0
  339. data/spec/app/models/ghost.rb +7 -0
  340. data/spec/app/models/home.rb +4 -0
  341. data/spec/app/models/house.rb +6 -0
  342. data/spec/app/models/html_writer.rb +3 -0
  343. data/spec/app/models/image.rb +22 -0
  344. data/spec/app/models/implant.rb +16 -0
  345. data/spec/app/models/item.rb +8 -0
  346. data/spec/app/models/jar.rb +7 -0
  347. data/spec/app/models/label.rb +40 -0
  348. data/spec/app/models/language.rb +5 -0
  349. data/spec/app/models/lat_lng.rb +15 -0
  350. data/spec/app/models/league.rb +11 -0
  351. data/spec/app/models/learner.rb +2 -0
  352. data/spec/app/models/line_item.rb +6 -0
  353. data/spec/app/models/location.rb +8 -0
  354. data/spec/app/models/login.rb +8 -0
  355. data/spec/app/models/manufacturer.rb +7 -0
  356. data/spec/app/models/meat.rb +4 -0
  357. data/spec/app/models/membership.rb +4 -0
  358. data/spec/app/models/mixed_drink.rb +4 -0
  359. data/spec/app/models/movie.rb +13 -0
  360. data/spec/app/models/my_hash.rb +2 -0
  361. data/spec/app/models/name.rb +23 -0
  362. data/spec/app/models/node.rb +5 -0
  363. data/spec/app/models/note.rb +12 -0
  364. data/spec/app/models/ordered_post.rb +6 -0
  365. data/spec/app/models/ordered_preference.rb +6 -0
  366. data/spec/app/models/oscar.rb +15 -0
  367. data/spec/app/models/override.rb +16 -0
  368. data/spec/app/models/ownable.rb +6 -0
  369. data/spec/app/models/owner.rb +6 -0
  370. data/spec/app/models/pack.rb +3 -0
  371. data/spec/app/models/page.rb +5 -0
  372. data/spec/app/models/page_question.rb +4 -0
  373. data/spec/app/models/palette.rb +7 -0
  374. data/spec/app/models/parent.rb +5 -0
  375. data/spec/app/models/parent_doc.rb +6 -0
  376. data/spec/app/models/passport.rb +5 -0
  377. data/spec/app/models/patient.rb +9 -0
  378. data/spec/app/models/pdf_writer.rb +3 -0
  379. data/spec/app/models/pencil.rb +1 -0
  380. data/spec/app/models/person.rb +206 -0
  381. data/spec/app/models/pet.rb +23 -0
  382. data/spec/app/models/pet_owner.rb +6 -0
  383. data/spec/app/models/phone.rb +11 -0
  384. data/spec/app/models/pizza.rb +7 -0
  385. data/spec/app/models/player.rb +35 -0
  386. data/spec/app/models/post.rb +44 -0
  387. data/spec/app/models/powerup.rb +11 -0
  388. data/spec/app/models/preference.rb +9 -0
  389. data/spec/app/models/princess.rb +8 -0
  390. data/spec/app/models/product.rb +15 -0
  391. data/spec/app/models/profile.rb +5 -0
  392. data/spec/app/models/pronunciation.rb +5 -0
  393. data/spec/app/models/purchase.rb +4 -0
  394. data/spec/app/models/question.rb +8 -0
  395. data/spec/app/models/quiz.rb +7 -0
  396. data/spec/app/models/rating.rb +8 -0
  397. data/spec/app/models/record.rb +46 -0
  398. data/spec/app/models/registry.rb +4 -0
  399. data/spec/app/models/role.rb +7 -0
  400. data/spec/app/models/root_category.rb +4 -0
  401. data/spec/app/models/sandwich.rb +4 -0
  402. data/spec/app/models/scheduler.rb +7 -0
  403. data/spec/app/models/seo.rb +7 -0
  404. data/spec/app/models/series.rb +4 -0
  405. data/spec/app/models/server.rb +13 -0
  406. data/spec/app/models/service.rb +22 -0
  407. data/spec/app/models/shape.rb +12 -0
  408. data/spec/app/models/shelf.rb +5 -0
  409. data/spec/app/models/shipping_container.rb +5 -0
  410. data/spec/app/models/shipping_pack.rb +3 -0
  411. data/spec/app/models/shop.rb +6 -0
  412. data/spec/app/models/short_agent.rb +4 -0
  413. data/spec/app/models/short_quiz.rb +5 -0
  414. data/spec/app/models/slave.rb +6 -0
  415. data/spec/app/models/song.rb +8 -0
  416. data/spec/app/models/sound.rb +5 -0
  417. data/spec/app/models/square.rb +4 -0
  418. data/spec/app/models/strategy.rb +3 -0
  419. data/spec/app/models/sub_item.rb +3 -0
  420. data/spec/app/models/subscription.rb +4 -0
  421. data/spec/app/models/survey.rb +5 -0
  422. data/spec/app/models/symptom.rb +6 -0
  423. data/spec/app/models/tag.rb +8 -0
  424. data/spec/app/models/target.rb +5 -0
  425. data/spec/app/models/template.rb +5 -0
  426. data/spec/app/models/thing.rb +9 -0
  427. data/spec/app/models/title.rb +3 -0
  428. data/spec/app/models/tool.rb +8 -0
  429. data/spec/app/models/topping.rb +5 -0
  430. data/spec/app/models/track.rb +38 -0
  431. data/spec/app/models/translation.rb +5 -0
  432. data/spec/app/models/tree.rb +9 -0
  433. data/spec/app/models/truck.rb +3 -0
  434. data/spec/app/models/user.rb +21 -0
  435. data/spec/app/models/user_account.rb +10 -0
  436. data/spec/app/models/validation_callback.rb +10 -0
  437. data/spec/app/models/vehicle.rb +11 -0
  438. data/spec/app/models/version.rb +5 -0
  439. data/spec/app/models/vet_visit.rb +5 -0
  440. data/spec/app/models/video.rb +13 -0
  441. data/spec/app/models/weapon.rb +11 -0
  442. data/spec/app/models/wiki_page.rb +14 -0
  443. data/spec/app/models/word.rb +15 -0
  444. data/spec/app/models/word_origin.rb +11 -0
  445. data/spec/app/models/writer.rb +11 -0
  446. data/spec/config/mongoid.yml +38 -0
  447. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  448. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  449. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  450. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  451. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  452. data/spec/mongoid/atomic_spec.rb +365 -0
  453. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  454. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  455. data/spec/mongoid/attributes_spec.rb +1467 -0
  456. data/spec/mongoid/changeable_spec.rb +1507 -0
  457. data/spec/mongoid/composable_spec.rb +24 -0
  458. data/spec/mongoid/config/environment_spec.rb +83 -0
  459. data/spec/mongoid/config/options_spec.rb +56 -0
  460. data/spec/mongoid/config_spec.rb +318 -0
  461. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  462. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +495 -0
  463. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  464. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  465. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  466. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  467. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  468. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  469. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  470. data/spec/mongoid/copyable_spec.rb +393 -0
  471. data/spec/mongoid/criteria/findable_spec.rb +1222 -0
  472. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  473. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  474. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  475. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  476. data/spec/mongoid/criteria_spec.rb +3821 -0
  477. data/spec/mongoid/document_spec.rb +1205 -0
  478. data/spec/mongoid/equality_spec.rb +241 -0
  479. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  480. data/spec/mongoid/errors/callback_spec.rb +29 -0
  481. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  482. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  483. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  484. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  485. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  487. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  488. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  489. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  490. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  492. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  493. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  494. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  495. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  496. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  497. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  499. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  500. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  501. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  504. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  505. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  509. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  510. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  511. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  512. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  513. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  514. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  515. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  516. data/spec/mongoid/errors/validations_spec.rb +45 -0
  517. data/spec/mongoid/extensions/array_spec.rb +638 -0
  518. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  519. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  520. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  521. data/spec/mongoid/extensions/date_spec.rb +235 -0
  522. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  523. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  524. data/spec/mongoid/extensions/float_spec.rb +133 -0
  525. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  526. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  527. data/spec/mongoid/extensions/module_spec.rb +42 -0
  528. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  529. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  530. data/spec/mongoid/extensions/object_spec.rb +292 -0
  531. data/spec/mongoid/extensions/range_spec.rb +154 -0
  532. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  533. data/spec/mongoid/extensions/set_spec.rb +33 -0
  534. data/spec/mongoid/extensions/string_spec.rb +357 -0
  535. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  536. data/spec/mongoid/extensions/time_spec.rb +467 -0
  537. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  538. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  539. data/spec/mongoid/extensions_spec.rb +15 -0
  540. data/spec/mongoid/factory_spec.rb +185 -0
  541. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  543. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  544. data/spec/mongoid/fields/localized_spec.rb +386 -0
  545. data/spec/mongoid/fields/standard_spec.rb +166 -0
  546. data/spec/mongoid/fields_spec.rb +1229 -0
  547. data/spec/mongoid/findable_spec.rb +342 -0
  548. data/spec/mongoid/identity_map_spec.rb +564 -0
  549. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  550. data/spec/mongoid/indexable_spec.rb +504 -0
  551. data/spec/mongoid/inspectable_spec.rb +49 -0
  552. data/spec/mongoid/interceptable_spec.rb +1564 -0
  553. data/spec/mongoid/loggable_spec.rb +21 -0
  554. data/spec/mongoid/matchable/all_spec.rb +31 -0
  555. data/spec/mongoid/matchable/and_spec.rb +162 -0
  556. data/spec/mongoid/matchable/default_spec.rb +130 -0
  557. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  558. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  559. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  560. data/spec/mongoid/matchable/in_spec.rb +25 -0
  561. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  562. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  563. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  564. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  565. data/spec/mongoid/matchable/or_spec.rb +106 -0
  566. data/spec/mongoid/matchable/size_spec.rb +25 -0
  567. data/spec/mongoid/matchable_spec.rb +532 -0
  568. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  569. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  570. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  571. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  572. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  573. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  574. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  575. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  576. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  577. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  578. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  579. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  580. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  581. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  582. data/spec/mongoid/persistable_spec.rb +206 -0
  583. data/spec/mongoid/positional_spec.rb +227 -0
  584. data/spec/mongoid/railties/document_spec.rb +24 -0
  585. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  586. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  587. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  588. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  589. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  590. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  592. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  593. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  594. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  595. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  596. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  598. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  599. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  600. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  601. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  602. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  603. data/spec/mongoid/relations/builders_spec.rb +226 -0
  604. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  605. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  606. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  607. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  608. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  609. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  610. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  611. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  612. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  613. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  614. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  615. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  616. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  617. data/spec/mongoid/relations/macros_spec.rb +631 -0
  618. data/spec/mongoid/relations/metadata_spec.rb +1936 -0
  619. data/spec/mongoid/relations/options_spec.rb +35 -0
  620. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  621. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  622. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  623. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  624. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  625. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  626. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  627. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  628. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  629. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  630. data/spec/mongoid/relations_spec.rb +188 -0
  631. data/spec/mongoid/reloadable_spec.rb +305 -0
  632. data/spec/mongoid/scopable_spec.rb +926 -0
  633. data/spec/mongoid/selectable_spec.rb +134 -0
  634. data/spec/mongoid/serializable_spec.rb +862 -0
  635. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  636. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  637. data/spec/mongoid/sessions/options_spec.rb +71 -0
  638. data/spec/mongoid/sessions_spec.rb +1078 -0
  639. data/spec/mongoid/shardable_spec.rb +61 -0
  640. data/spec/mongoid/state_spec.rb +102 -0
  641. data/spec/mongoid/threaded_spec.rb +258 -0
  642. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  643. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  644. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  645. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  646. data/spec/mongoid/timestamps_spec.rb +112 -0
  647. data/spec/mongoid/traversable_spec.rb +244 -0
  648. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  649. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  650. data/spec/mongoid/validatable/format_spec.rb +83 -0
  651. data/spec/mongoid/validatable/length_spec.rb +119 -0
  652. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  653. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  654. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  655. data/spec/mongoid/validatable_spec.rb +309 -0
  656. data/spec/mongoid_spec.rb +74 -0
  657. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  658. data/spec/rails/mongoid_spec.rb +462 -0
  659. data/spec/spec_helper.rb +103 -0
  660. metadata +1160 -0
@@ -0,0 +1,1222 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criteria::Findable do
4
+
5
+ describe "#find" do
6
+
7
+ context "when finding by a document" do
8
+
9
+ let(:band) do
10
+ Band.create(name: "Tool")
11
+ end
12
+
13
+ let!(:record) do
14
+ band.records.create(name: "Undertow")
15
+ end
16
+
17
+ context "when the document is the root" do
18
+
19
+ let(:found) do
20
+ Band.find(band)
21
+ end
22
+
23
+ it "returns the matching document" do
24
+ expect(found).to eq(band)
25
+ end
26
+ end
27
+
28
+ context "when the document is the proxy" do
29
+
30
+ let(:found) do
31
+ Band.find(band.records.first.band)
32
+ end
33
+
34
+ it "returns the matching document" do
35
+ expect(found).to eq(band)
36
+ end
37
+ end
38
+ end
39
+
40
+ context "when the identity map is enabled" do
41
+
42
+ before(:all) do
43
+ Mongoid.identity_map_enabled = true
44
+ end
45
+
46
+ after(:all) do
47
+ Mongoid.identity_map_enabled = false
48
+ end
49
+
50
+ let!(:depeche) do
51
+ Band.create(name: "Depeche Mode")
52
+ end
53
+
54
+ let!(:placebo) do
55
+ Band.create(name: "Placebo")
56
+ end
57
+
58
+ context "when a parent and a child are in the identity map" do
59
+
60
+ let!(:canvas) do
61
+ Canvas.create
62
+ end
63
+
64
+ let!(:browser) do
65
+ Browser.create
66
+ end
67
+
68
+ context "when fetching a child class by a parent id" do
69
+
70
+ it "raises a not found error" do
71
+ expect {
72
+ Browser.find(canvas.id)
73
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
74
+ end
75
+ end
76
+ end
77
+
78
+ context "when providing a single id" do
79
+
80
+ let(:from_map) do
81
+ Band.find(depeche.id)
82
+ end
83
+
84
+ it "returns the document from the map" do
85
+ expect(from_map).to equal(depeche)
86
+ end
87
+ end
88
+
89
+ context "when providing a single id as a String" do
90
+
91
+ let(:from_map) do
92
+ Band.find(depeche.id.to_s)
93
+ end
94
+
95
+ it "returns the document from the map" do
96
+ expect(from_map).to equal(depeche)
97
+ end
98
+ end
99
+
100
+ context "when providing multiple ids" do
101
+
102
+ let(:from_map) do
103
+ Band.find(depeche.id, placebo.id)
104
+ end
105
+
106
+ it "returns the first match from the map" do
107
+ expect(from_map.first).to equal(depeche)
108
+ end
109
+
110
+ it "returns the second match from the map" do
111
+ expect(from_map.last).to equal(placebo)
112
+ end
113
+ end
114
+ end
115
+
116
+ context "when using object ids" do
117
+
118
+ let!(:band) do
119
+ Band.create
120
+ end
121
+
122
+ context "when a parent and a child are in the identity map" do
123
+
124
+ let!(:canvas) do
125
+ Canvas.create
126
+ end
127
+
128
+ let!(:browser) do
129
+ Browser.create
130
+ end
131
+
132
+ context "when fetching a child class by a parent id" do
133
+
134
+ it "raises a not found error" do
135
+ expect {
136
+ Browser.find(canvas.id)
137
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
138
+ end
139
+ end
140
+ end
141
+
142
+ context "when providing a single id" do
143
+
144
+ context "when the id matches" do
145
+
146
+ let(:found) do
147
+ Band.find(band.id)
148
+ end
149
+
150
+ it "returns the matching document" do
151
+ expect(found).to eq(band)
152
+ end
153
+ end
154
+
155
+ context "when the id does not match" do
156
+
157
+ context "when raising a not found error" do
158
+
159
+ before do
160
+ Mongoid.raise_not_found_error = true
161
+ end
162
+
163
+ let(:found) do
164
+ Band.find(Moped::BSON::ObjectId.new)
165
+ end
166
+
167
+ it "raises an error" do
168
+ expect {
169
+ found
170
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
171
+ end
172
+ end
173
+
174
+ context "when raising no error" do
175
+
176
+ before do
177
+ Mongoid.raise_not_found_error = false
178
+ end
179
+
180
+ after do
181
+ Mongoid.raise_not_found_error = true
182
+ end
183
+
184
+ let(:found) do
185
+ Band.find(Moped::BSON::ObjectId.new)
186
+ end
187
+
188
+ it "returns nil" do
189
+ expect(found).to be_nil
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+ context "when providing a splat of ids" do
196
+
197
+ let!(:band_two) do
198
+ Band.create(name: "Tool")
199
+ end
200
+
201
+ context "when all ids match" do
202
+
203
+ let(:found) do
204
+ Band.find(band.id, band_two.id)
205
+ end
206
+
207
+ it "contains the first match" do
208
+ expect(found).to include(band)
209
+ end
210
+
211
+ it "contains the second match" do
212
+ expect(found).to include(band_two)
213
+ end
214
+
215
+ context "when ids are duplicates" do
216
+ let(:found) do
217
+ Band.find(band.id, band.id)
218
+ end
219
+
220
+ it "contains only the first match" do
221
+ expect(found).to eq([band])
222
+ end
223
+ end
224
+ end
225
+
226
+ context "when any id does not match" do
227
+
228
+ context "when raising a not found error" do
229
+
230
+ before do
231
+ Mongoid.raise_not_found_error = true
232
+ end
233
+
234
+ let(:found) do
235
+ Band.find(band.id, Moped::BSON::ObjectId.new)
236
+ end
237
+
238
+ it "raises an error" do
239
+ expect {
240
+ found
241
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
242
+ end
243
+ end
244
+
245
+ context "when raising no error" do
246
+
247
+ before do
248
+ Mongoid.raise_not_found_error = false
249
+ end
250
+
251
+ after do
252
+ Mongoid.raise_not_found_error = true
253
+ end
254
+
255
+ let(:found) do
256
+ Band.find(band.id, Moped::BSON::ObjectId.new)
257
+ end
258
+
259
+ it "returns only the matching documents" do
260
+ expect(found).to eq([ band ])
261
+ end
262
+ end
263
+ end
264
+ end
265
+
266
+ context "when providing an array of ids" do
267
+
268
+ let!(:band_two) do
269
+ Band.create(name: "Tool")
270
+ end
271
+
272
+ context "when all ids match" do
273
+
274
+ let(:found) do
275
+ Band.find([ band.id, band_two.id ])
276
+ end
277
+
278
+ it "contains the first match" do
279
+ expect(found).to include(band)
280
+ end
281
+
282
+ it "contains the second match" do
283
+ expect(found).to include(band_two)
284
+ end
285
+
286
+ context "when ids are duplicates" do
287
+ let(:found) do
288
+ Band.find([ band.id, band.id ])
289
+ end
290
+
291
+ it "contains only the first match" do
292
+ expect(found).to eq([band])
293
+ end
294
+ end
295
+ end
296
+
297
+ context "when any id does not match" do
298
+
299
+ context "when raising a not found error" do
300
+
301
+ before do
302
+ Mongoid.raise_not_found_error = true
303
+ end
304
+
305
+ let(:found) do
306
+ Band.find([ band.id, Moped::BSON::ObjectId.new ])
307
+ end
308
+
309
+ it "raises an error" do
310
+ expect {
311
+ found
312
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
313
+ end
314
+ end
315
+
316
+ context "when raising no error" do
317
+
318
+ before do
319
+ Mongoid.raise_not_found_error = false
320
+ end
321
+
322
+ after do
323
+ Mongoid.raise_not_found_error = true
324
+ end
325
+
326
+ let(:found) do
327
+ Band.find([ band.id, Moped::BSON::ObjectId.new ])
328
+ end
329
+
330
+ it "returns only the matching documents" do
331
+ expect(found).to eq([ band ])
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end
337
+
338
+ context "when using string ids" do
339
+
340
+ before(:all) do
341
+ Band.field :_id, type: String
342
+ end
343
+
344
+ after(:all) do
345
+ Band.field :_id, type: Moped::BSON::ObjectId, default: ->{ Moped::BSON::ObjectId.new }
346
+ end
347
+
348
+ let!(:band) do
349
+ Band.create do |band|
350
+ band.id = "tool"
351
+ end
352
+ end
353
+
354
+ context "when providing a single id" do
355
+
356
+ context "when the id matches" do
357
+
358
+ let(:found) do
359
+ Band.find(band.id)
360
+ end
361
+
362
+ it "returns the matching document" do
363
+ expect(found).to eq(band)
364
+ end
365
+ end
366
+
367
+ context "when the id does not match" do
368
+
369
+ context "when raising a not found error" do
370
+
371
+ before do
372
+ Mongoid.raise_not_found_error = true
373
+ end
374
+
375
+ let(:found) do
376
+ Band.find("depeche-mode")
377
+ end
378
+
379
+ it "raises an error" do
380
+ expect {
381
+ found
382
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
383
+ end
384
+ end
385
+
386
+ context "when raising no error" do
387
+
388
+ before do
389
+ Mongoid.raise_not_found_error = false
390
+ end
391
+
392
+ after do
393
+ Mongoid.raise_not_found_error = true
394
+ end
395
+
396
+ let(:found) do
397
+ Band.find("depeche-mode")
398
+ end
399
+
400
+ it "returns nil" do
401
+ expect(found).to be_nil
402
+ end
403
+ end
404
+ end
405
+ end
406
+
407
+ context "when providing a splat of ids" do
408
+
409
+ let!(:band_two) do
410
+ Band.create do |band|
411
+ band.id = "depeche-mode"
412
+ end
413
+ end
414
+
415
+ context "when all ids match" do
416
+
417
+ let(:found) do
418
+ Band.find(band.id, band_two.id)
419
+ end
420
+
421
+ it "contains the first match" do
422
+ expect(found).to include(band)
423
+ end
424
+
425
+ it "contains the second match" do
426
+ expect(found).to include(band_two)
427
+ end
428
+ end
429
+
430
+ context "when any id does not match" do
431
+
432
+ context "when raising a not found error" do
433
+
434
+ before do
435
+ Mongoid.raise_not_found_error = true
436
+ end
437
+
438
+ let(:found) do
439
+ Band.find(band.id, "new-order")
440
+ end
441
+
442
+ it "raises an error" do
443
+ expect {
444
+ found
445
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
446
+ end
447
+ end
448
+
449
+ context "when raising no error" do
450
+
451
+ before do
452
+ Mongoid.raise_not_found_error = false
453
+ end
454
+
455
+ after do
456
+ Mongoid.raise_not_found_error = true
457
+ end
458
+
459
+ let(:found) do
460
+ Band.find(band.id, "new-order")
461
+ end
462
+
463
+ it "returns only the matching documents" do
464
+ expect(found).to eq([ band ])
465
+ end
466
+ end
467
+ end
468
+ end
469
+
470
+ context "when providing an array of ids" do
471
+
472
+ let!(:band_two) do
473
+ Band.create do |band|
474
+ band.id = "depeche-mode"
475
+ end
476
+ end
477
+
478
+ context "when all ids match" do
479
+
480
+ let(:found) do
481
+ Band.find([ band.id, band_two.id ])
482
+ end
483
+
484
+ it "contains the first match" do
485
+ expect(found).to include(band)
486
+ end
487
+
488
+ it "contains the second match" do
489
+ expect(found).to include(band_two)
490
+ end
491
+ end
492
+
493
+ context "when any id does not match" do
494
+
495
+ context "when raising a not found error" do
496
+
497
+ before do
498
+ Mongoid.raise_not_found_error = true
499
+ end
500
+
501
+ let(:found) do
502
+ Band.find([ band.id, "new-order" ])
503
+ end
504
+
505
+ it "raises an error" do
506
+ expect {
507
+ found
508
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
509
+ end
510
+ end
511
+
512
+ context "when raising no error" do
513
+
514
+ before do
515
+ Mongoid.raise_not_found_error = false
516
+ end
517
+
518
+ after do
519
+ Mongoid.raise_not_found_error = true
520
+ end
521
+
522
+ let(:found) do
523
+ Band.find([ band.id, "new-order" ])
524
+ end
525
+
526
+ it "returns only the matching documents" do
527
+ expect(found).to eq([ band ])
528
+ end
529
+ end
530
+ end
531
+ end
532
+ end
533
+
534
+ context "when using hash ids" do
535
+
536
+ before(:all) do
537
+ Band.field :_id, type: Hash
538
+ end
539
+
540
+ after(:all) do
541
+ Band.field :_id, type: Moped::BSON::ObjectId, default: ->{ Moped::BSON::ObjectId.new }
542
+ end
543
+
544
+ let!(:band) do
545
+ Band.create do |band|
546
+ band.id = {"new-order" => true, "Depeche Mode" => false}
547
+ end
548
+ end
549
+
550
+ context "when providing a single id" do
551
+
552
+ context "when the id matches" do
553
+
554
+ let(:found) do
555
+ Band.find(band.id)
556
+ end
557
+
558
+ it "returns the matching document" do
559
+ expect(found).to eq(band)
560
+ end
561
+ end
562
+
563
+ context "when the id does not match" do
564
+
565
+ context "when raising a not found error" do
566
+
567
+ before do
568
+ Mongoid.raise_not_found_error = true
569
+ end
570
+
571
+ let(:found) do
572
+ Band.find({"new-order" => false, "Faith no More" => true})
573
+ end
574
+
575
+ it "raises an error" do
576
+ expect {
577
+ found
578
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
579
+ end
580
+ end
581
+
582
+ context "when raising no error" do
583
+
584
+ before do
585
+ Mongoid.raise_not_found_error = false
586
+ end
587
+
588
+ after do
589
+ Mongoid.raise_not_found_error = true
590
+ end
591
+
592
+ let(:found) do
593
+ Band.find({"new-order" => false, "Faith no More" => true})
594
+ end
595
+
596
+ it "returns nil" do
597
+ expect(found).to be_nil
598
+ end
599
+ end
600
+ end
601
+ end
602
+
603
+ context "when providing a splat of ids" do
604
+
605
+ let!(:band_two) do
606
+ Band.create do |band|
607
+ band.id = {"Radiohead" => false, "Nirvana"=> true}
608
+ end
609
+ end
610
+
611
+ context "when all ids match" do
612
+
613
+ let(:found) do
614
+ Band.find(band.id, band_two.id)
615
+ end
616
+
617
+ it "contains the first match" do
618
+ expect(found).to include(band)
619
+ end
620
+
621
+ it "contains the second match" do
622
+ expect(found).to include(band_two)
623
+ end
624
+ end
625
+
626
+ context "when any id does not match" do
627
+
628
+ context "when raising a not found error" do
629
+
630
+ before do
631
+ Mongoid.raise_not_found_error = true
632
+ end
633
+
634
+ let(:found) do
635
+ Band.find(band.id, {"Radiohead" => true, "Nirvana"=> false})
636
+ end
637
+
638
+ it "raises an error" do
639
+ expect {
640
+ found
641
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
642
+ end
643
+ end
644
+
645
+ context "when raising no error" do
646
+
647
+ before do
648
+ Mongoid.raise_not_found_error = false
649
+ end
650
+
651
+ after do
652
+ Mongoid.raise_not_found_error = true
653
+ end
654
+
655
+ let(:found) do
656
+ Band.find(band.id, {"Radiohead" => true, "Nirvana"=> false})
657
+ end
658
+
659
+ it "returns only the matching documents" do
660
+ expect(found).to eq([ band ])
661
+ end
662
+ end
663
+ end
664
+ end
665
+
666
+ context "when providing an array of ids" do
667
+
668
+ let!(:band_two) do
669
+ Band.create do |band|
670
+ band.id = {"Radiohead" => false, "Nirvana"=> true}
671
+ end
672
+ end
673
+
674
+ context "when all ids match" do
675
+
676
+ let(:found) do
677
+ Band.find([ band.id, band_two.id ])
678
+ end
679
+
680
+ it "contains the first match" do
681
+ expect(found).to include(band)
682
+ end
683
+
684
+ it "contains the second match" do
685
+ expect(found).to include(band_two)
686
+ end
687
+ end
688
+
689
+ context "when any id does not match" do
690
+
691
+ context "when raising a not found error" do
692
+
693
+ before do
694
+ Mongoid.raise_not_found_error = true
695
+ end
696
+
697
+ let(:found) do
698
+ Band.find([ band.id, {"Radiohead" => true, "Nirvana"=> false} ])
699
+ end
700
+
701
+ it "raises an error" do
702
+ expect {
703
+ found
704
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
705
+ end
706
+ end
707
+
708
+ context "when raising no error" do
709
+
710
+ before do
711
+ Mongoid.raise_not_found_error = false
712
+ end
713
+
714
+ after do
715
+ Mongoid.raise_not_found_error = true
716
+ end
717
+
718
+ let(:found) do
719
+ Band.find([ band.id, {"Radiohead" => true, "Nirvana"=> false} ])
720
+ end
721
+
722
+ it "returns only the matching documents" do
723
+ expect(found).to eq([ band ])
724
+ end
725
+ end
726
+ end
727
+ end
728
+ end
729
+
730
+ context "when using integer ids" do
731
+
732
+ before(:all) do
733
+ Band.field :_id, type: Integer
734
+ end
735
+
736
+ after(:all) do
737
+ Band.field :_id, type: Moped::BSON::ObjectId, default: ->{ Moped::BSON::ObjectId.new }
738
+ end
739
+
740
+ let!(:band) do
741
+ Band.create do |band|
742
+ band.id = 1
743
+ end
744
+ end
745
+
746
+ context "when providing a single id" do
747
+
748
+ context "when the id matches" do
749
+
750
+ let(:found) do
751
+ Band.find(band.id)
752
+ end
753
+
754
+ it "returns the matching document" do
755
+ expect(found).to eq(band)
756
+ end
757
+ end
758
+
759
+ context "when the id does not match" do
760
+
761
+ context "when raising a not found error" do
762
+
763
+ before do
764
+ Mongoid.raise_not_found_error = true
765
+ end
766
+
767
+ let(:found) do
768
+ Band.find(3)
769
+ end
770
+
771
+ it "raises an error" do
772
+ expect {
773
+ found
774
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
775
+ end
776
+ end
777
+
778
+ context "when raising no error" do
779
+
780
+ before do
781
+ Mongoid.raise_not_found_error = false
782
+ end
783
+
784
+ after do
785
+ Mongoid.raise_not_found_error = true
786
+ end
787
+
788
+ let(:found) do
789
+ Band.find(3)
790
+ end
791
+
792
+ it "returns nil" do
793
+ expect(found).to be_nil
794
+ end
795
+ end
796
+ end
797
+ end
798
+
799
+ context "when providing a splat of ids" do
800
+
801
+ let!(:band_two) do
802
+ Band.create do |band|
803
+ band.id = 2
804
+ end
805
+ end
806
+
807
+ context "when all ids match" do
808
+
809
+ let(:found) do
810
+ Band.find(band.id, band_two.id)
811
+ end
812
+
813
+ it "contains the first match" do
814
+ expect(found).to include(band)
815
+ end
816
+
817
+ it "contains the second match" do
818
+ expect(found).to include(band_two)
819
+ end
820
+ end
821
+
822
+ context "when any id does not match" do
823
+
824
+ context "when raising a not found error" do
825
+
826
+ before do
827
+ Mongoid.raise_not_found_error = true
828
+ end
829
+
830
+ let(:found) do
831
+ Band.find(band.id, 3)
832
+ end
833
+
834
+ it "raises an error" do
835
+ expect {
836
+ found
837
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
838
+ end
839
+ end
840
+
841
+ context "when raising no error" do
842
+
843
+ before do
844
+ Mongoid.raise_not_found_error = false
845
+ end
846
+
847
+ after do
848
+ Mongoid.raise_not_found_error = true
849
+ end
850
+
851
+ let(:found) do
852
+ Band.find(band.id, 3)
853
+ end
854
+
855
+ it "returns only the matching documents" do
856
+ expect(found).to eq([ band ])
857
+ end
858
+ end
859
+ end
860
+ end
861
+
862
+ context "when providing an array of ids" do
863
+
864
+ let!(:band_two) do
865
+ Band.create do |band|
866
+ band.id = 2
867
+ end
868
+ end
869
+
870
+ context "when all ids match" do
871
+
872
+ let(:found) do
873
+ Band.find([ band.id, band_two.id ])
874
+ end
875
+
876
+ it "contains the first match" do
877
+ expect(found).to include(band)
878
+ end
879
+
880
+ it "contains the second match" do
881
+ expect(found).to include(band_two)
882
+ end
883
+ end
884
+
885
+ context "when any id does not match" do
886
+
887
+ context "when raising a not found error" do
888
+
889
+ before do
890
+ Mongoid.raise_not_found_error = true
891
+ end
892
+
893
+ let(:found) do
894
+ Band.find([ band.id, 3 ])
895
+ end
896
+
897
+ it "raises an error" do
898
+ expect {
899
+ found
900
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
901
+ end
902
+ end
903
+
904
+ context "when raising no error" do
905
+
906
+ before do
907
+ Mongoid.raise_not_found_error = false
908
+ end
909
+
910
+ after do
911
+ Mongoid.raise_not_found_error = true
912
+ end
913
+
914
+ let(:found) do
915
+ Band.find([ band.id, 3 ])
916
+ end
917
+
918
+ it "returns only the matching documents" do
919
+ expect(found).to eq([ band ])
920
+ end
921
+ end
922
+ end
923
+ end
924
+
925
+ context "when providing a range" do
926
+
927
+ let!(:band_two) do
928
+ Band.create do |band|
929
+ band.id = 2
930
+ end
931
+ end
932
+
933
+ context "when all ids match" do
934
+
935
+ let(:found) do
936
+ Band.find(1..2)
937
+ end
938
+
939
+ it "contains the first match" do
940
+ expect(found).to include(band)
941
+ end
942
+
943
+ it "contains the second match" do
944
+ expect(found).to include(band_two)
945
+ end
946
+ end
947
+
948
+ context "when any id does not match" do
949
+
950
+ context "when raising a not found error" do
951
+
952
+ before do
953
+ Mongoid.raise_not_found_error = true
954
+ end
955
+
956
+ let(:found) do
957
+ Band.find(1..3)
958
+ end
959
+
960
+ it "raises an error" do
961
+ expect {
962
+ found
963
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
964
+ end
965
+ end
966
+
967
+ context "when raising no error" do
968
+
969
+ before do
970
+ Mongoid.raise_not_found_error = false
971
+ end
972
+
973
+ after do
974
+ Mongoid.raise_not_found_error = true
975
+ end
976
+
977
+ let(:found) do
978
+ Band.find(1..3)
979
+ end
980
+
981
+ it "contains the first match" do
982
+ expect(found).to include(band)
983
+ end
984
+
985
+ it "contains the second match" do
986
+ expect(found).to include(band_two)
987
+ end
988
+
989
+ it "returns only the matches" do
990
+ expect(found.count).to eq(2)
991
+ end
992
+ end
993
+ end
994
+ end
995
+ end
996
+
997
+ context "when using string and object ids" do
998
+
999
+ let!(:band) do
1000
+ Band.create
1001
+ end
1002
+
1003
+ context "when providing multiple ids" do
1004
+
1005
+ context "when ids are duplicates" do
1006
+
1007
+ let(:found) do
1008
+ Band.find([ band.id.to_s, band.id ])
1009
+ end
1010
+
1011
+ it "contains only the first match" do
1012
+ expect(found).to eq([band])
1013
+ end
1014
+ end
1015
+ end
1016
+ end
1017
+ end
1018
+
1019
+ describe "#for_ids" do
1020
+
1021
+ context "when only 1 id exists" do
1022
+
1023
+ let(:id) do
1024
+ Moped::BSON::ObjectId.new
1025
+ end
1026
+
1027
+ let(:criteria) do
1028
+ Band.queryable.for_ids([ id ])
1029
+ end
1030
+
1031
+ it "does not turn the selector into an $in" do
1032
+ expect(criteria.selector).to eq({ "_id" => id })
1033
+ end
1034
+ end
1035
+ end
1036
+
1037
+ describe "#from_map_or_db" do
1038
+
1039
+ before(:all) do
1040
+ Mongoid.identity_map_enabled = true
1041
+ end
1042
+
1043
+ after(:all) do
1044
+ Mongoid.identity_map_enabled = false
1045
+ end
1046
+
1047
+ context "when the document is in the identity map" do
1048
+
1049
+ let!(:band) do
1050
+ Band.create(name: "Depeche Mode")
1051
+ end
1052
+
1053
+ let(:criteria) do
1054
+ Band.where(_id: band.id)
1055
+ end
1056
+
1057
+ let(:from_map) do
1058
+ criteria.from_map_or_db
1059
+ end
1060
+
1061
+ it "returns the document from the map" do
1062
+ expect(from_map).to equal(band)
1063
+ end
1064
+ end
1065
+
1066
+ context "when the document is not in the identity map" do
1067
+
1068
+ let!(:band) do
1069
+ Band.create(name: "Depeche Mode")
1070
+ end
1071
+
1072
+ let(:criteria) do
1073
+ Band.where(_id: band.id)
1074
+ end
1075
+
1076
+ before do
1077
+ Mongoid::IdentityMap.clear
1078
+ end
1079
+
1080
+ let(:from_db) do
1081
+ criteria.from_map_or_db
1082
+ end
1083
+
1084
+ it "returns the document from the database" do
1085
+ expect(from_db).to_not equal(band)
1086
+ end
1087
+
1088
+ it "returns the correct document" do
1089
+ expect(from_db).to eq(band)
1090
+ end
1091
+ end
1092
+
1093
+ context "when the selector is cleared in the identity map" do
1094
+
1095
+ let!(:band) do
1096
+ Band.create(name: "Depeche Mode")
1097
+ end
1098
+
1099
+ let(:criteria) do
1100
+ Band.where(name: "Depeche Mode")
1101
+ end
1102
+
1103
+ before do
1104
+ Mongoid::IdentityMap.clear
1105
+ Mongoid::IdentityMap.clear_many(Band, { "name" => "Depeche Mode" })
1106
+ end
1107
+
1108
+ let(:from_db) do
1109
+ criteria.from_map_or_db
1110
+ end
1111
+
1112
+ it "returns nil" do
1113
+ expect(from_db).to be_nil
1114
+ end
1115
+ end
1116
+ end
1117
+
1118
+ describe "#multiple_from_map_or_db" do
1119
+
1120
+ before(:all) do
1121
+ Mongoid.identity_map_enabled = true
1122
+ end
1123
+
1124
+ after(:all) do
1125
+ Mongoid.identity_map_enabled = false
1126
+ end
1127
+
1128
+ context "when the document is in the identity map" do
1129
+
1130
+ let!(:band) do
1131
+ Band.create(name: "Depeche Mode")
1132
+ end
1133
+
1134
+ let!(:band_two) do
1135
+ Band.create(name: "Tool")
1136
+ end
1137
+
1138
+ context "when providing a single id" do
1139
+
1140
+ let(:criteria) do
1141
+ Band.where(_id: band.id)
1142
+ end
1143
+
1144
+ let(:from_map) do
1145
+ criteria.multiple_from_map_or_db([ band.id ])
1146
+ end
1147
+
1148
+ it "returns the document from the map" do
1149
+ expect(from_map).to include(band)
1150
+ end
1151
+ end
1152
+
1153
+ context "when providing multiple ids" do
1154
+
1155
+ let(:criteria) do
1156
+ Band.where(:_id.in => [ band.id, band_two.id ])
1157
+ end
1158
+
1159
+ let(:from_map) do
1160
+ criteria.multiple_from_map_or_db([ band.id, band_two.id ])
1161
+ end
1162
+
1163
+ it "returns the documents from the map" do
1164
+ expect(from_map).to include(band, band_two)
1165
+ end
1166
+ end
1167
+ end
1168
+
1169
+ context "when the document is not in the identity map" do
1170
+
1171
+ let!(:band) do
1172
+ Band.create(name: "Depeche Mode")
1173
+ end
1174
+
1175
+ let!(:band_two) do
1176
+ Band.create(name: "Tool")
1177
+ end
1178
+
1179
+ before do
1180
+ Mongoid::IdentityMap.clear
1181
+ end
1182
+
1183
+ context "when providing a single id" do
1184
+
1185
+ let(:criteria) do
1186
+ Band.where(_id: band.id)
1187
+ end
1188
+
1189
+ let(:from_db) do
1190
+ criteria.multiple_from_map_or_db([ band.id ])
1191
+ end
1192
+
1193
+ it "returns the document from the database" do
1194
+ expect(from_db.first).to_not equal(band)
1195
+ end
1196
+
1197
+ it "returns the correct document" do
1198
+ expect(from_db.first).to eq(band)
1199
+ end
1200
+ end
1201
+
1202
+ context "when providing multiple ids" do
1203
+
1204
+ let(:criteria) do
1205
+ Band.where(:_id.in => [ band.id, band_two.id ])
1206
+ end
1207
+
1208
+ let(:from_db) do
1209
+ criteria.multiple_from_map_or_db([ band.id, band_two.id ])
1210
+ end
1211
+
1212
+ it "returns the document from the database" do
1213
+ expect(from_db.first).to_not equal(band)
1214
+ end
1215
+
1216
+ it "returns the correct document" do
1217
+ expect(from_db.first).to eq(band)
1218
+ end
1219
+ end
1220
+ end
1221
+ end
1222
+ end