mongoid 3.1.6 → 4.0.2

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 (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
@@ -0,0 +1,991 @@
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 using object ids" do
41
+
42
+ let!(:band) do
43
+ Band.create
44
+ end
45
+
46
+ context "when providing a single id" do
47
+
48
+ context "when the id matches" do
49
+
50
+ let(:found) do
51
+ Band.find(band.id)
52
+ end
53
+
54
+ it "returns the matching document" do
55
+ expect(found).to eq(band)
56
+ end
57
+ end
58
+
59
+ context "when the id does not match" do
60
+
61
+ context "when raising a not found error" do
62
+
63
+ before do
64
+ Mongoid.raise_not_found_error = true
65
+ end
66
+
67
+ let(:found) do
68
+ Band.find(BSON::ObjectId.new)
69
+ end
70
+
71
+ it "raises an error" do
72
+ expect {
73
+ found
74
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
75
+ end
76
+ end
77
+
78
+ context "when raising no error" do
79
+
80
+ before do
81
+ Mongoid.raise_not_found_error = false
82
+ end
83
+
84
+ after do
85
+ Mongoid.raise_not_found_error = true
86
+ end
87
+
88
+ let(:found) do
89
+ Band.find(BSON::ObjectId.new)
90
+ end
91
+
92
+ it "returns nil" do
93
+ expect(found).to be_nil
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ context "when providing a splat of ids" do
100
+
101
+ let!(:band_two) do
102
+ Band.create(name: "Tool")
103
+ end
104
+
105
+ context "when all ids match" do
106
+
107
+ let(:found) do
108
+ Band.find(band.id, band_two.id)
109
+ end
110
+
111
+ it "contains the first match" do
112
+ expect(found).to include(band)
113
+ end
114
+
115
+ it "contains the second match" do
116
+ expect(found).to include(band_two)
117
+ end
118
+
119
+ context "when ids are duplicates" do
120
+
121
+ let(:found) do
122
+ Band.find(band.id, band.id)
123
+ end
124
+
125
+ it "contains only the first match" do
126
+ expect(found).to eq([band])
127
+ end
128
+ end
129
+ end
130
+
131
+ context "when any id does not match" do
132
+
133
+ context "when raising a not found error" do
134
+
135
+ before do
136
+ Mongoid.raise_not_found_error = true
137
+ end
138
+
139
+ let(:found) do
140
+ Band.find(band.id, BSON::ObjectId.new)
141
+ end
142
+
143
+ it "raises an error" do
144
+ expect {
145
+ found
146
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
147
+ end
148
+ end
149
+
150
+ context "when raising no error" do
151
+
152
+ before do
153
+ Mongoid.raise_not_found_error = false
154
+ end
155
+
156
+ after do
157
+ Mongoid.raise_not_found_error = true
158
+ end
159
+
160
+ let(:found) do
161
+ Band.find(band.id, BSON::ObjectId.new)
162
+ end
163
+
164
+ it "returns only the matching documents" do
165
+ expect(found).to eq([ band ])
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+ context "when providing an array of ids" do
172
+
173
+ let!(:band_two) do
174
+ Band.create(name: "Tool")
175
+ end
176
+
177
+ context "when all ids match" do
178
+
179
+ let(:found) do
180
+ Band.find([ band.id, band_two.id ])
181
+ end
182
+
183
+ it "contains the first match" do
184
+ expect(found).to include(band)
185
+ end
186
+
187
+ it "contains the second match" do
188
+ expect(found).to include(band_two)
189
+ end
190
+
191
+ context "when ids are duplicates" do
192
+
193
+ let(:found) do
194
+ Band.find([ band.id, band.id ])
195
+ end
196
+
197
+ it "contains only the first match" do
198
+ expect(found).to eq([band])
199
+ end
200
+ end
201
+ end
202
+
203
+ context "when any id does not match" do
204
+
205
+ context "when raising a not found error" do
206
+
207
+ before do
208
+ Mongoid.raise_not_found_error = true
209
+ end
210
+
211
+ let(:found) do
212
+ Band.find([ band.id, BSON::ObjectId.new ])
213
+ end
214
+
215
+ it "raises an error" do
216
+ expect {
217
+ found
218
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
219
+ end
220
+ end
221
+
222
+ context "when raising no error" do
223
+
224
+ before do
225
+ Mongoid.raise_not_found_error = false
226
+ end
227
+
228
+ after do
229
+ Mongoid.raise_not_found_error = true
230
+ end
231
+
232
+ let(:found) do
233
+ Band.find([ band.id, BSON::ObjectId.new ])
234
+ end
235
+
236
+ it "returns only the matching documents" do
237
+ expect(found).to eq([ band ])
238
+ end
239
+ end
240
+ end
241
+ end
242
+ end
243
+
244
+ context "when using string ids" do
245
+
246
+ before(:all) do
247
+ Band.field :_id, overwrite: true, type: String
248
+ end
249
+
250
+ after(:all) do
251
+ Band.field :_id, overwrite: true, type: BSON::ObjectId, default: ->{ BSON::ObjectId.new }
252
+ end
253
+
254
+ let!(:band) do
255
+ Band.create do |band|
256
+ band.id = "tool"
257
+ end
258
+ end
259
+
260
+ context "when providing a single id" do
261
+
262
+ context "when the id matches" do
263
+
264
+ let(:found) do
265
+ Band.find(band.id)
266
+ end
267
+
268
+ it "returns the matching document" do
269
+ expect(found).to eq(band)
270
+ end
271
+ end
272
+
273
+ context "when the id does not match" do
274
+
275
+ context "when raising a not found error" do
276
+
277
+ before do
278
+ Mongoid.raise_not_found_error = true
279
+ end
280
+
281
+ let(:found) do
282
+ Band.find("depeche-mode")
283
+ end
284
+
285
+ it "raises an error" do
286
+ expect {
287
+ found
288
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
289
+ end
290
+ end
291
+
292
+ context "when raising no error" do
293
+
294
+ before do
295
+ Mongoid.raise_not_found_error = false
296
+ end
297
+
298
+ after do
299
+ Mongoid.raise_not_found_error = true
300
+ end
301
+
302
+ let(:found) do
303
+ Band.find("depeche-mode")
304
+ end
305
+
306
+ it "returns nil" do
307
+ expect(found).to be_nil
308
+ end
309
+ end
310
+ end
311
+ end
312
+
313
+ context "when providing a splat of ids" do
314
+
315
+ let!(:band_two) do
316
+ Band.create do |band|
317
+ band.id = "depeche-mode"
318
+ end
319
+ end
320
+
321
+ context "when all ids match" do
322
+
323
+ let(:found) do
324
+ Band.find(band.id, band_two.id)
325
+ end
326
+
327
+ it "contains the first match" do
328
+ expect(found).to include(band)
329
+ end
330
+
331
+ it "contains the second match" do
332
+ expect(found).to include(band_two)
333
+ end
334
+ end
335
+
336
+ context "when any id does not match" do
337
+
338
+ context "when raising a not found error" do
339
+
340
+ before do
341
+ Mongoid.raise_not_found_error = true
342
+ end
343
+
344
+ let(:found) do
345
+ Band.find(band.id, "new-order")
346
+ end
347
+
348
+ it "raises an error" do
349
+ expect {
350
+ found
351
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
352
+ end
353
+ end
354
+
355
+ context "when raising no error" do
356
+
357
+ before do
358
+ Mongoid.raise_not_found_error = false
359
+ end
360
+
361
+ after do
362
+ Mongoid.raise_not_found_error = true
363
+ end
364
+
365
+ let(:found) do
366
+ Band.find(band.id, "new-order")
367
+ end
368
+
369
+ it "returns only the matching documents" do
370
+ expect(found).to eq([ band ])
371
+ end
372
+ end
373
+ end
374
+ end
375
+
376
+ context "when providing an array of ids" do
377
+
378
+ let!(:band_two) do
379
+ Band.create do |band|
380
+ band.id = "depeche-mode"
381
+ end
382
+ end
383
+
384
+ context "when all ids match" do
385
+
386
+ let(:found) do
387
+ Band.find([ band.id, band_two.id ])
388
+ end
389
+
390
+ it "contains the first match" do
391
+ expect(found).to include(band)
392
+ end
393
+
394
+ it "contains the second match" do
395
+ expect(found).to include(band_two)
396
+ end
397
+ end
398
+
399
+ context "when any id does not match" do
400
+
401
+ context "when raising a not found error" do
402
+
403
+ before do
404
+ Mongoid.raise_not_found_error = true
405
+ end
406
+
407
+ let(:found) do
408
+ Band.find([ band.id, "new-order" ])
409
+ end
410
+
411
+ it "raises an error" do
412
+ expect {
413
+ found
414
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
415
+ end
416
+ end
417
+
418
+ context "when raising no error" do
419
+
420
+ before do
421
+ Mongoid.raise_not_found_error = false
422
+ end
423
+
424
+ after do
425
+ Mongoid.raise_not_found_error = true
426
+ end
427
+
428
+ let(:found) do
429
+ Band.find([ band.id, "new-order" ])
430
+ end
431
+
432
+ it "returns only the matching documents" do
433
+ expect(found).to eq([ band ])
434
+ end
435
+ end
436
+ end
437
+ end
438
+ end
439
+
440
+ context "when using hash ids" do
441
+
442
+ before(:all) do
443
+ Band.field :_id, overwrite: true, type: Hash
444
+ end
445
+
446
+ after(:all) do
447
+ Band.field :_id, overwrite: true, type: BSON::ObjectId, default: ->{ BSON::ObjectId.new }
448
+ end
449
+
450
+ let!(:band) do
451
+ Band.create do |band|
452
+ band.id = {"new-order" => true, "Depeche Mode" => false}
453
+ end
454
+ end
455
+
456
+ context "when providing a single id" do
457
+
458
+ context "when the id matches" do
459
+
460
+ let(:found) do
461
+ Band.find(band.id)
462
+ end
463
+
464
+ it "returns the matching document" do
465
+ expect(found).to eq(band)
466
+ end
467
+ end
468
+
469
+ context "when the id does not match" do
470
+
471
+ context "when raising a not found error" do
472
+
473
+ before do
474
+ Mongoid.raise_not_found_error = true
475
+ end
476
+
477
+ let(:found) do
478
+ Band.find({"new-order" => false, "Faith no More" => true})
479
+ end
480
+
481
+ it "raises an error" do
482
+ expect {
483
+ found
484
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
485
+ end
486
+ end
487
+
488
+ context "when raising no error" do
489
+
490
+ before do
491
+ Mongoid.raise_not_found_error = false
492
+ end
493
+
494
+ after do
495
+ Mongoid.raise_not_found_error = true
496
+ end
497
+
498
+ let(:found) do
499
+ Band.find({"new-order" => false, "Faith no More" => true})
500
+ end
501
+
502
+ it "returns nil" do
503
+ expect(found).to be_nil
504
+ end
505
+ end
506
+ end
507
+ end
508
+
509
+ context "when providing a splat of ids" do
510
+
511
+ let!(:band_two) do
512
+ Band.create do |band|
513
+ band.id = {"Radiohead" => false, "Nirvana"=> true}
514
+ end
515
+ end
516
+
517
+ context "when all ids match" do
518
+
519
+ let(:found) do
520
+ Band.find(band.id, band_two.id)
521
+ end
522
+
523
+ it "contains the first match" do
524
+ expect(found).to include(band)
525
+ end
526
+
527
+ it "contains the second match" do
528
+ expect(found).to include(band_two)
529
+ end
530
+ end
531
+
532
+ context "when any id does not match" do
533
+
534
+ context "when raising a not found error" do
535
+
536
+ before do
537
+ Mongoid.raise_not_found_error = true
538
+ end
539
+
540
+ let(:found) do
541
+ Band.find(band.id, {"Radiohead" => true, "Nirvana"=> false})
542
+ end
543
+
544
+ it "raises an error" do
545
+ expect {
546
+ found
547
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
548
+ end
549
+ end
550
+
551
+ context "when raising no error" do
552
+
553
+ before do
554
+ Mongoid.raise_not_found_error = false
555
+ end
556
+
557
+ after do
558
+ Mongoid.raise_not_found_error = true
559
+ end
560
+
561
+ let(:found) do
562
+ Band.find(band.id, {"Radiohead" => true, "Nirvana"=> false})
563
+ end
564
+
565
+ it "returns only the matching documents" do
566
+ expect(found).to eq([ band ])
567
+ end
568
+ end
569
+ end
570
+ end
571
+
572
+ context "when providing an array of ids" do
573
+
574
+ let!(:band_two) do
575
+ Band.create do |band|
576
+ band.id = {"Radiohead" => false, "Nirvana"=> true}
577
+ end
578
+ end
579
+
580
+ context "when all ids match" do
581
+
582
+ let(:found) do
583
+ Band.find([ band.id, band_two.id ])
584
+ end
585
+
586
+ it "contains the first match" do
587
+ expect(found).to include(band)
588
+ end
589
+
590
+ it "contains the second match" do
591
+ expect(found).to include(band_two)
592
+ end
593
+ end
594
+
595
+ context "when any id does not match" do
596
+
597
+ context "when raising a not found error" do
598
+
599
+ before do
600
+ Mongoid.raise_not_found_error = true
601
+ end
602
+
603
+ let(:found) do
604
+ Band.find([ band.id, {"Radiohead" => true, "Nirvana"=> false} ])
605
+ end
606
+
607
+ it "raises an error" do
608
+ expect {
609
+ found
610
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
611
+ end
612
+ end
613
+
614
+ context "when raising no error" do
615
+
616
+ before do
617
+ Mongoid.raise_not_found_error = false
618
+ end
619
+
620
+ after do
621
+ Mongoid.raise_not_found_error = true
622
+ end
623
+
624
+ let(:found) do
625
+ Band.find([ band.id, {"Radiohead" => true, "Nirvana"=> false} ])
626
+ end
627
+
628
+ it "returns only the matching documents" do
629
+ expect(found).to eq([ band ])
630
+ end
631
+ end
632
+ end
633
+ end
634
+ end
635
+
636
+ context "when using integer ids" do
637
+
638
+ before(:all) do
639
+ Band.field :_id, overwrite: true, type: Integer
640
+ end
641
+
642
+ after(:all) do
643
+ Band.field :_id, overwrite: true, type: BSON::ObjectId, default: ->{ BSON::ObjectId.new }
644
+ end
645
+
646
+ let!(:band) do
647
+ Band.create do |band|
648
+ band.id = 1
649
+ end
650
+ end
651
+
652
+ context "when providing a single id" do
653
+
654
+ context "when the id matches" do
655
+
656
+ let(:found) do
657
+ Band.find(band.id)
658
+ end
659
+
660
+ it "returns the matching document" do
661
+ expect(found).to eq(band)
662
+ end
663
+ end
664
+
665
+ context "when the id does not match" do
666
+
667
+ context "when raising a not found error" do
668
+
669
+ before do
670
+ Mongoid.raise_not_found_error = true
671
+ end
672
+
673
+ let(:found) do
674
+ Band.find(3)
675
+ end
676
+
677
+ it "raises an error" do
678
+ expect {
679
+ found
680
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
681
+ end
682
+ end
683
+
684
+ context "when raising no error" do
685
+
686
+ before do
687
+ Mongoid.raise_not_found_error = false
688
+ end
689
+
690
+ after do
691
+ Mongoid.raise_not_found_error = true
692
+ end
693
+
694
+ let(:found) do
695
+ Band.find(3)
696
+ end
697
+
698
+ it "returns nil" do
699
+ expect(found).to be_nil
700
+ end
701
+ end
702
+ end
703
+ end
704
+
705
+ context "when providing a splat of ids" do
706
+
707
+ let!(:band_two) do
708
+ Band.create do |band|
709
+ band.id = 2
710
+ end
711
+ end
712
+
713
+ context "when all ids match" do
714
+
715
+ let(:found) do
716
+ Band.find(band.id, band_two.id)
717
+ end
718
+
719
+ it "contains the first match" do
720
+ expect(found).to include(band)
721
+ end
722
+
723
+ it "contains the second match" do
724
+ expect(found).to include(band_two)
725
+ end
726
+ end
727
+
728
+ context "when any id does not match" do
729
+
730
+ context "when raising a not found error" do
731
+
732
+ before do
733
+ Mongoid.raise_not_found_error = true
734
+ end
735
+
736
+ let(:found) do
737
+ Band.find(band.id, 3)
738
+ end
739
+
740
+ it "raises an error" do
741
+ expect {
742
+ found
743
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
744
+ end
745
+ end
746
+
747
+ context "when raising no error" do
748
+
749
+ before do
750
+ Mongoid.raise_not_found_error = false
751
+ end
752
+
753
+ after do
754
+ Mongoid.raise_not_found_error = true
755
+ end
756
+
757
+ let(:found) do
758
+ Band.find(band.id, 3)
759
+ end
760
+
761
+ it "returns only the matching documents" do
762
+ expect(found).to eq([ band ])
763
+ end
764
+ end
765
+ end
766
+ end
767
+
768
+ context "when providing an array of ids" do
769
+
770
+ let!(:band_two) do
771
+ Band.create do |band|
772
+ band.id = 2
773
+ end
774
+ end
775
+
776
+ context "when all ids match" do
777
+
778
+ let(:found) do
779
+ Band.find([ band.id, band_two.id ])
780
+ end
781
+
782
+ it "contains the first match" do
783
+ expect(found).to include(band)
784
+ end
785
+
786
+ it "contains the second match" do
787
+ expect(found).to include(band_two)
788
+ end
789
+ end
790
+
791
+ context "when any id does not match" do
792
+
793
+ context "when raising a not found error" do
794
+
795
+ before do
796
+ Mongoid.raise_not_found_error = true
797
+ end
798
+
799
+ let(:found) do
800
+ Band.find([ band.id, 3 ])
801
+ end
802
+
803
+ it "raises an error" do
804
+ expect {
805
+ found
806
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
807
+ end
808
+ end
809
+
810
+ context "when raising no error" do
811
+
812
+ before do
813
+ Mongoid.raise_not_found_error = false
814
+ end
815
+
816
+ after do
817
+ Mongoid.raise_not_found_error = true
818
+ end
819
+
820
+ let(:found) do
821
+ Band.find([ band.id, 3 ])
822
+ end
823
+
824
+ it "returns only the matching documents" do
825
+ expect(found).to eq([ band ])
826
+ end
827
+ end
828
+ end
829
+ end
830
+
831
+ context "when providing a range" do
832
+
833
+ let!(:band_two) do
834
+ Band.create do |band|
835
+ band.id = 2
836
+ end
837
+ end
838
+
839
+ context "when all ids match" do
840
+
841
+ let(:found) do
842
+ Band.find(1..2)
843
+ end
844
+
845
+ it "contains the first match" do
846
+ expect(found).to include(band)
847
+ end
848
+
849
+ it "contains the second match" do
850
+ expect(found).to include(band_two)
851
+ end
852
+ end
853
+
854
+ context "when any id does not match" do
855
+
856
+ context "when raising a not found error" do
857
+
858
+ before do
859
+ Mongoid.raise_not_found_error = true
860
+ end
861
+
862
+ let(:found) do
863
+ Band.find(1..3)
864
+ end
865
+
866
+ it "raises an error" do
867
+ expect {
868
+ found
869
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
870
+ end
871
+ end
872
+
873
+ context "when raising no error" do
874
+
875
+ before do
876
+ Mongoid.raise_not_found_error = false
877
+ end
878
+
879
+ after do
880
+ Mongoid.raise_not_found_error = true
881
+ end
882
+
883
+ let(:found) do
884
+ Band.find(1..3)
885
+ end
886
+
887
+ it "contains the first match" do
888
+ expect(found).to include(band)
889
+ end
890
+
891
+ it "contains the second match" do
892
+ expect(found).to include(band_two)
893
+ end
894
+
895
+ it "returns only the matches" do
896
+ expect(found.count).to eq(2)
897
+ end
898
+ end
899
+ end
900
+ end
901
+ end
902
+
903
+ context "when using string and object ids" do
904
+
905
+ let!(:band) do
906
+ Band.create
907
+ end
908
+
909
+ context "when providing multiple ids" do
910
+
911
+ context "when ids are duplicates" do
912
+
913
+ let(:found) do
914
+ Band.find([ band.id.to_s, band.id ])
915
+ end
916
+
917
+ it "contains only the first match" do
918
+ expect(found).to eq([band])
919
+ end
920
+ end
921
+ end
922
+ end
923
+ end
924
+
925
+ describe "#for_ids" do
926
+
927
+ context "when only 1 id exists" do
928
+
929
+ let(:id) do
930
+ BSON::ObjectId.new
931
+ end
932
+
933
+ let(:criteria) do
934
+ Band.queryable.for_ids([ id ])
935
+ end
936
+
937
+ it "does not turn the selector into an $in" do
938
+ expect(criteria.selector).to eq({ "_id" => id })
939
+ end
940
+ end
941
+ end
942
+
943
+ describe "#multiple_from__db" do
944
+
945
+ let!(:band) do
946
+ Band.create(name: "Depeche Mode")
947
+ end
948
+
949
+ let!(:band_two) do
950
+ Band.create(name: "Tool")
951
+ end
952
+
953
+ context "when providing a single id" do
954
+
955
+ let(:criteria) do
956
+ Band.where(_id: band.id)
957
+ end
958
+
959
+ let(:from_db) do
960
+ criteria.multiple_from_db([ band.id ])
961
+ end
962
+
963
+ it "returns the document from the database" do
964
+ expect(from_db.first).to_not equal(band)
965
+ end
966
+
967
+ it "returns the correct document" do
968
+ expect(from_db.first).to eq(band)
969
+ end
970
+ end
971
+
972
+ context "when providing multiple ids" do
973
+
974
+ let(:criteria) do
975
+ Band.where(:_id.in => [ band.id, band_two.id ])
976
+ end
977
+
978
+ let(:from_db) do
979
+ criteria.multiple_from_db([ band.id, band_two.id ])
980
+ end
981
+
982
+ it "returns the document from the database" do
983
+ expect(from_db.first).to_not equal(band)
984
+ end
985
+
986
+ it "returns the correct document" do
987
+ expect(from_db.first).to eq(band)
988
+ end
989
+ end
990
+ end
991
+ end