mongoid 3.1.4 → 3.1.5

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 (429) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/lib/mongoid/contextual.rb +3 -0
  4. data/lib/mongoid/criteria.rb +10 -2
  5. data/lib/mongoid/document.rb +1 -1
  6. data/lib/mongoid/paranoia.rb +4 -0
  7. data/lib/mongoid/persistence/upsertion.rb +1 -0
  8. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +16 -2
  9. data/lib/mongoid/relations/macros.rb +1 -1
  10. data/lib/mongoid/relations/one.rb +12 -0
  11. data/lib/mongoid/relations/referenced/in.rb +18 -1
  12. data/lib/mongoid/relations/referenced/many_to_many.rb +2 -2
  13. data/lib/mongoid/validations.rb +1 -1
  14. data/lib/mongoid/validations/localizable.rb +1 -1
  15. data/lib/mongoid/validations/presence.rb +1 -1
  16. data/lib/mongoid/validations/uniqueness.rb +1 -1
  17. data/lib/mongoid/version.rb +1 -1
  18. data/lib/support/ruby_version.rb +1 -1
  19. data/spec/app/models/account.rb +32 -0
  20. data/spec/app/models/acolyte.rb +16 -0
  21. data/spec/app/models/actor.rb +19 -0
  22. data/spec/app/models/actor_observer.rb +15 -0
  23. data/spec/app/models/actress.rb +2 -0
  24. data/spec/app/models/address.rb +72 -0
  25. data/spec/app/models/address_component.rb +5 -0
  26. data/spec/app/models/address_number.rb +6 -0
  27. data/spec/app/models/agency.rb +5 -0
  28. data/spec/app/models/agent.rb +12 -0
  29. data/spec/app/models/album.rb +14 -0
  30. data/spec/app/models/alert.rb +5 -0
  31. data/spec/app/models/animal.rb +25 -0
  32. data/spec/app/models/answer.rb +4 -0
  33. data/spec/app/models/appointment.rb +7 -0
  34. data/spec/app/models/article.rb +13 -0
  35. data/spec/app/models/artist.rb +66 -0
  36. data/spec/app/models/artwork.rb +4 -0
  37. data/spec/app/models/augmentation.rb +11 -0
  38. data/spec/app/models/author.rb +6 -0
  39. data/spec/app/models/band.rb +25 -0
  40. data/spec/app/models/bar.rb +9 -0
  41. data/spec/app/models/basic.rb +6 -0
  42. data/spec/app/models/bed.rb +1 -0
  43. data/spec/app/models/big_palette.rb +2 -0
  44. data/spec/app/models/birthday.rb +13 -0
  45. data/spec/app/models/book.rb +12 -0
  46. data/spec/app/models/breed.rb +4 -0
  47. data/spec/app/models/browser.rb +6 -0
  48. data/spec/app/models/building.rb +7 -0
  49. data/spec/app/models/building_address.rb +7 -0
  50. data/spec/app/models/bus.rb +7 -0
  51. data/spec/app/models/business.rb +5 -0
  52. data/spec/app/models/callback_recorder.rb +25 -0
  53. data/spec/app/models/callback_test.rb +9 -0
  54. data/spec/app/models/canvas.rb +25 -0
  55. data/spec/app/models/car.rb +1 -0
  56. data/spec/app/models/cat.rb +8 -0
  57. data/spec/app/models/category.rb +8 -0
  58. data/spec/app/models/child.rb +4 -0
  59. data/spec/app/models/child_doc.rb +22 -0
  60. data/spec/app/models/church.rb +4 -0
  61. data/spec/app/models/circle.rb +3 -0
  62. data/spec/app/models/circuit.rb +4 -0
  63. data/spec/app/models/circus.rb +7 -0
  64. data/spec/app/models/code.rb +5 -0
  65. data/spec/app/models/comment.rb +16 -0
  66. data/spec/app/models/contractor.rb +7 -0
  67. data/spec/app/models/cookie.rb +6 -0
  68. data/spec/app/models/country_code.rb +8 -0
  69. data/spec/app/models/definition.rb +8 -0
  70. data/spec/app/models/description.rb +11 -0
  71. data/spec/app/models/dictionary.rb +10 -0
  72. data/spec/app/models/division.rb +10 -0
  73. data/spec/app/models/doctor.rb +12 -0
  74. data/spec/app/models/dog.rb +7 -0
  75. data/spec/app/models/dokument.rb +5 -0
  76. data/spec/app/models/driver.rb +7 -0
  77. data/spec/app/models/drug.rb +8 -0
  78. data/spec/app/models/email.rb +6 -0
  79. data/spec/app/models/employer.rb +5 -0
  80. data/spec/app/models/entry.rb +6 -0
  81. data/spec/app/models/eraser.rb +1 -0
  82. data/spec/app/models/event.rb +22 -0
  83. data/spec/app/models/exhibition.rb +4 -0
  84. data/spec/app/models/exhibitor.rb +5 -0
  85. data/spec/app/models/eye.rb +9 -0
  86. data/spec/app/models/eye_bowl.rb +9 -0
  87. data/spec/app/models/face.rb +8 -0
  88. data/spec/app/models/favorite.rb +6 -0
  89. data/spec/app/models/filesystem.rb +4 -0
  90. data/spec/app/models/fire_hydrant.rb +6 -0
  91. data/spec/app/models/firefox.rb +4 -0
  92. data/spec/app/models/fish.rb +8 -0
  93. data/spec/app/models/folder.rb +7 -0
  94. data/spec/app/models/folder_item.rb +9 -0
  95. data/spec/app/models/fruits.rb +28 -0
  96. data/spec/app/models/game.rb +21 -0
  97. data/spec/app/models/ghost.rb +7 -0
  98. data/spec/app/models/home.rb +4 -0
  99. data/spec/app/models/house.rb +8 -0
  100. data/spec/app/models/html_writer.rb +3 -0
  101. data/spec/app/models/image.rb +22 -0
  102. data/spec/app/models/implant.rb +16 -0
  103. data/spec/app/models/item.rb +12 -0
  104. data/spec/app/models/jar.rb +7 -0
  105. data/spec/app/models/label.rb +40 -0
  106. data/spec/app/models/language.rb +5 -0
  107. data/spec/app/models/lat_lng.rb +15 -0
  108. data/spec/app/models/league.rb +11 -0
  109. data/spec/app/models/learner.rb +2 -0
  110. data/spec/app/models/line_item.rb +6 -0
  111. data/spec/app/models/location.rb +8 -0
  112. data/spec/app/models/login.rb +8 -0
  113. data/spec/app/models/manufacturer.rb +7 -0
  114. data/spec/app/models/meat.rb +4 -0
  115. data/spec/app/models/membership.rb +4 -0
  116. data/spec/app/models/mixed_drink.rb +4 -0
  117. data/spec/app/models/movie.rb +12 -0
  118. data/spec/app/models/my_hash.rb +2 -0
  119. data/spec/app/models/name.rb +23 -0
  120. data/spec/app/models/node.rb +5 -0
  121. data/spec/app/models/note.rb +12 -0
  122. data/spec/app/models/ordered_post.rb +6 -0
  123. data/spec/app/models/ordered_preference.rb +6 -0
  124. data/spec/app/models/oscar.rb +15 -0
  125. data/spec/app/models/override.rb +16 -0
  126. data/spec/app/models/ownable.rb +6 -0
  127. data/spec/app/models/owner.rb +6 -0
  128. data/spec/app/models/pack.rb +3 -0
  129. data/spec/app/models/page.rb +5 -0
  130. data/spec/app/models/page_question.rb +4 -0
  131. data/spec/app/models/palette.rb +7 -0
  132. data/spec/app/models/paranoid_phone.rb +25 -0
  133. data/spec/app/models/paranoid_post.rb +36 -0
  134. data/spec/app/models/parent.rb +5 -0
  135. data/spec/app/models/parent_doc.rb +6 -0
  136. data/spec/app/models/passport.rb +5 -0
  137. data/spec/app/models/patient.rb +9 -0
  138. data/spec/app/models/pdf_writer.rb +3 -0
  139. data/spec/app/models/pencil.rb +1 -0
  140. data/spec/app/models/person.rb +201 -0
  141. data/spec/app/models/pet.rb +23 -0
  142. data/spec/app/models/pet_owner.rb +6 -0
  143. data/spec/app/models/phone.rb +11 -0
  144. data/spec/app/models/phone_observer.rb +6 -0
  145. data/spec/app/models/pizza.rb +7 -0
  146. data/spec/app/models/player.rb +35 -0
  147. data/spec/app/models/post.rb +43 -0
  148. data/spec/app/models/powerup.rb +11 -0
  149. data/spec/app/models/preference.rb +9 -0
  150. data/spec/app/models/princess.rb +8 -0
  151. data/spec/app/models/product.rb +17 -0
  152. data/spec/app/models/profile.rb +5 -0
  153. data/spec/app/models/pronunciation.rb +5 -0
  154. data/spec/app/models/purchase.rb +4 -0
  155. data/spec/app/models/question.rb +8 -0
  156. data/spec/app/models/quiz.rb +10 -0
  157. data/spec/app/models/rating.rb +8 -0
  158. data/spec/app/models/record.rb +46 -0
  159. data/spec/app/models/registry.rb +4 -0
  160. data/spec/app/models/role.rb +7 -0
  161. data/spec/app/models/root_category.rb +4 -0
  162. data/spec/app/models/sandwich.rb +4 -0
  163. data/spec/app/models/scheduler.rb +7 -0
  164. data/spec/app/models/seo.rb +7 -0
  165. data/spec/app/models/series.rb +4 -0
  166. data/spec/app/models/server.rb +13 -0
  167. data/spec/app/models/service.rb +22 -0
  168. data/spec/app/models/shape.rb +12 -0
  169. data/spec/app/models/shelf.rb +5 -0
  170. data/spec/app/models/shipping_container.rb +5 -0
  171. data/spec/app/models/shipping_pack.rb +3 -0
  172. data/spec/app/models/shop.rb +6 -0
  173. data/spec/app/models/short_agent.rb +4 -0
  174. data/spec/app/models/short_quiz.rb +5 -0
  175. data/spec/app/models/slave.rb +6 -0
  176. data/spec/app/models/song.rb +8 -0
  177. data/spec/app/models/square.rb +4 -0
  178. data/spec/app/models/strategy.rb +3 -0
  179. data/spec/app/models/sub_item.rb +3 -0
  180. data/spec/app/models/subscription.rb +4 -0
  181. data/spec/app/models/survey.rb +5 -0
  182. data/spec/app/models/symptom.rb +6 -0
  183. data/spec/app/models/tag.rb +8 -0
  184. data/spec/app/models/target.rb +5 -0
  185. data/spec/app/models/template.rb +5 -0
  186. data/spec/app/models/thing.rb +9 -0
  187. data/spec/app/models/title.rb +4 -0
  188. data/spec/app/models/tool.rb +8 -0
  189. data/spec/app/models/topping.rb +5 -0
  190. data/spec/app/models/track.rb +38 -0
  191. data/spec/app/models/translation.rb +5 -0
  192. data/spec/app/models/tree.rb +9 -0
  193. data/spec/app/models/truck.rb +3 -0
  194. data/spec/app/models/user.rb +21 -0
  195. data/spec/app/models/user_account.rb +10 -0
  196. data/spec/app/models/validation_callback.rb +10 -0
  197. data/spec/app/models/vehicle.rb +11 -0
  198. data/spec/app/models/version.rb +5 -0
  199. data/spec/app/models/vet_visit.rb +5 -0
  200. data/spec/app/models/video.rb +17 -0
  201. data/spec/app/models/video_game.rb +1 -0
  202. data/spec/app/models/weapon.rb +11 -0
  203. data/spec/app/models/wiki_page.rb +17 -0
  204. data/spec/app/models/word.rb +12 -0
  205. data/spec/app/models/word_origin.rb +11 -0
  206. data/spec/app/models/writer.rb +11 -0
  207. data/spec/config/mongoid.yml +40 -0
  208. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  209. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +159 -0
  210. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +152 -0
  211. data/spec/mongoid/atomic/paths/root_spec.rb +106 -0
  212. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  213. data/spec/mongoid/atomic/positionable_spec.rb +227 -0
  214. data/spec/mongoid/atomic_spec.rb +365 -0
  215. data/spec/mongoid/attributes/processing_spec.rb +149 -0
  216. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  217. data/spec/mongoid/attributes_spec.rb +1705 -0
  218. data/spec/mongoid/callbacks_spec.rb +1564 -0
  219. data/spec/mongoid/components_spec.rb +24 -0
  220. data/spec/mongoid/config/environment_spec.rb +83 -0
  221. data/spec/mongoid/config/options_spec.rb +56 -0
  222. data/spec/mongoid/config_spec.rb +334 -0
  223. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  224. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  225. data/spec/mongoid/contextual/atomic_spec.rb +525 -0
  226. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  227. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  228. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  229. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  230. data/spec/mongoid/contextual/mongo_spec.rb +1757 -0
  231. data/spec/mongoid/copyable_spec.rb +393 -0
  232. data/spec/mongoid/criteria_spec.rb +5140 -0
  233. data/spec/mongoid/criterion/destructive_spec.rb +101 -0
  234. data/spec/mongoid/criterion/inspection_spec.rb +27 -0
  235. data/spec/mongoid/criterion/marshalable_spec.rb +28 -0
  236. data/spec/mongoid/criterion/modifiable_spec.rb +409 -0
  237. data/spec/mongoid/criterion/modification_spec.rb +402 -0
  238. data/spec/mongoid/criterion/scoping_spec.rb +391 -0
  239. data/spec/mongoid/dirty_spec.rb +1508 -0
  240. data/spec/mongoid/document_spec.rb +1146 -0
  241. data/spec/mongoid/equality_spec.rb +241 -0
  242. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  243. data/spec/mongoid/errors/callback_spec.rb +29 -0
  244. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  245. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  246. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  247. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  248. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  249. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  250. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  251. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  252. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  253. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  254. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  255. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  256. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  257. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  258. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  259. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  260. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  261. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  262. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  263. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  264. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  265. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  266. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  267. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  268. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  269. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  270. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  271. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  272. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  273. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  274. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  275. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  276. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  277. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  278. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  279. data/spec/mongoid/errors/validations_spec.rb +45 -0
  280. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +29 -0
  281. data/spec/mongoid/extensions/array_spec.rb +638 -0
  282. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  283. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  284. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  285. data/spec/mongoid/extensions/date_spec.rb +235 -0
  286. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  287. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  288. data/spec/mongoid/extensions/float_spec.rb +133 -0
  289. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  290. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  291. data/spec/mongoid/extensions/module_spec.rb +42 -0
  292. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  293. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  294. data/spec/mongoid/extensions/object_spec.rb +292 -0
  295. data/spec/mongoid/extensions/range_spec.rb +105 -0
  296. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  297. data/spec/mongoid/extensions/set_spec.rb +33 -0
  298. data/spec/mongoid/extensions/string_spec.rb +368 -0
  299. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  300. data/spec/mongoid/extensions/time_spec.rb +467 -0
  301. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  302. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  303. data/spec/mongoid/factory_spec.rb +185 -0
  304. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  305. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  306. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  307. data/spec/mongoid/fields/localized_spec.rb +386 -0
  308. data/spec/mongoid/fields/standard_spec.rb +166 -0
  309. data/spec/mongoid/fields_spec.rb +1253 -0
  310. data/spec/mongoid/finders_spec.rb +321 -0
  311. data/spec/mongoid/hierarchy_spec.rb +244 -0
  312. data/spec/mongoid/identity_map_spec.rb +564 -0
  313. data/spec/mongoid/indexes_spec.rb +404 -0
  314. data/spec/mongoid/inspection_spec.rb +57 -0
  315. data/spec/mongoid/json_spec.rb +33 -0
  316. data/spec/mongoid/loggable_spec.rb +21 -0
  317. data/spec/mongoid/matchers/all_spec.rb +31 -0
  318. data/spec/mongoid/matchers/and_spec.rb +162 -0
  319. data/spec/mongoid/matchers/default_spec.rb +130 -0
  320. data/spec/mongoid/matchers/exists_spec.rb +57 -0
  321. data/spec/mongoid/matchers/gt_spec.rb +74 -0
  322. data/spec/mongoid/matchers/gte_spec.rb +74 -0
  323. data/spec/mongoid/matchers/in_spec.rb +25 -0
  324. data/spec/mongoid/matchers/lt_spec.rb +74 -0
  325. data/spec/mongoid/matchers/lte_spec.rb +74 -0
  326. data/spec/mongoid/matchers/ne_spec.rb +25 -0
  327. data/spec/mongoid/matchers/nin_spec.rb +25 -0
  328. data/spec/mongoid/matchers/or_spec.rb +106 -0
  329. data/spec/mongoid/matchers/size_spec.rb +25 -0
  330. data/spec/mongoid/matchers_spec.rb +532 -0
  331. data/spec/mongoid/multi_parameter_attributes_spec.rb +128 -0
  332. data/spec/mongoid/nested_attributes_spec.rb +4945 -0
  333. data/spec/mongoid/observer_spec.rb +290 -0
  334. data/spec/mongoid/paranoia_spec.rb +759 -0
  335. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +262 -0
  336. data/spec/mongoid/persistence/atomic/bit_spec.rb +88 -0
  337. data/spec/mongoid/persistence/atomic/inc_spec.rb +133 -0
  338. data/spec/mongoid/persistence/atomic/pop_spec.rb +111 -0
  339. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +77 -0
  340. data/spec/mongoid/persistence/atomic/pull_spec.rb +80 -0
  341. data/spec/mongoid/persistence/atomic/push_all_spec.rb +77 -0
  342. data/spec/mongoid/persistence/atomic/push_spec.rb +77 -0
  343. data/spec/mongoid/persistence/atomic/rename_spec.rb +42 -0
  344. data/spec/mongoid/persistence/atomic/sets_spec.rb +154 -0
  345. data/spec/mongoid/persistence/atomic/unset_spec.rb +65 -0
  346. data/spec/mongoid/persistence/atomic_spec.rb +216 -0
  347. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +191 -0
  348. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +8 -0
  349. data/spec/mongoid/persistence/operations/insert_spec.rb +149 -0
  350. data/spec/mongoid/persistence/operations/remove_spec.rb +113 -0
  351. data/spec/mongoid/persistence/operations/update_spec.rb +141 -0
  352. data/spec/mongoid/persistence/operations/upsert_spec.rb +59 -0
  353. data/spec/mongoid/persistence/operations_spec.rb +313 -0
  354. data/spec/mongoid/persistence_spec.rb +2279 -0
  355. data/spec/mongoid/railties/document_spec.rb +24 -0
  356. data/spec/mongoid/relations/accessors_spec.rb +844 -0
  357. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  358. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  359. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  360. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  361. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  362. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  363. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  364. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  365. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  366. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  367. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  368. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  369. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  370. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  371. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  372. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  373. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  374. data/spec/mongoid/relations/builders_spec.rb +226 -0
  375. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  376. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  377. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  378. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  379. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  380. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  381. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  382. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  383. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  384. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  385. data/spec/mongoid/relations/embedded/in_spec.rb +580 -0
  386. data/spec/mongoid/relations/embedded/many_spec.rb +3841 -0
  387. data/spec/mongoid/relations/embedded/one_spec.rb +1055 -0
  388. data/spec/mongoid/relations/macros_spec.rb +625 -0
  389. data/spec/mongoid/relations/metadata_spec.rb +2030 -0
  390. data/spec/mongoid/relations/options_spec.rb +35 -0
  391. data/spec/mongoid/relations/polymorphic_spec.rb +132 -0
  392. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  393. data/spec/mongoid/relations/referenced/in_spec.rb +1501 -0
  394. data/spec/mongoid/relations/referenced/many_spec.rb +3632 -0
  395. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3561 -0
  396. data/spec/mongoid/relations/referenced/one_spec.rb +1331 -0
  397. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  398. data/spec/mongoid/relations/synchronization_spec.rb +453 -0
  399. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  400. data/spec/mongoid/relations_spec.rb +188 -0
  401. data/spec/mongoid/reloading_spec.rb +305 -0
  402. data/spec/mongoid/scoping_spec.rb +978 -0
  403. data/spec/mongoid/serialization_spec.rb +833 -0
  404. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  405. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  406. data/spec/mongoid/sessions_spec.rb +1111 -0
  407. data/spec/mongoid/sharding_spec.rb +61 -0
  408. data/spec/mongoid/state_spec.rb +102 -0
  409. data/spec/mongoid/threaded_spec.rb +296 -0
  410. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  411. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  412. data/spec/mongoid/timestamps/timeless_spec.rb +130 -0
  413. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  414. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  415. data/spec/mongoid/timestamps_spec.rb +112 -0
  416. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  417. data/spec/mongoid/validations/associated_spec.rb +183 -0
  418. data/spec/mongoid/validations/format_spec.rb +83 -0
  419. data/spec/mongoid/validations/length_spec.rb +223 -0
  420. data/spec/mongoid/validations/numericality_spec.rb +30 -0
  421. data/spec/mongoid/validations/presence_spec.rb +592 -0
  422. data/spec/mongoid/validations/uniqueness_spec.rb +2399 -0
  423. data/spec/mongoid/validations_spec.rb +309 -0
  424. data/spec/mongoid/versioning_spec.rb +540 -0
  425. data/spec/mongoid_spec.rb +74 -0
  426. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  427. data/spec/rails/mongoid_spec.rb +462 -0
  428. data/spec/spec_helper.rb +93 -0
  429. metadata +826 -6
@@ -0,0 +1,978 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Scoping do
4
+
5
+ describe ".default_scope" do
6
+
7
+ context "when provided a criteria" do
8
+
9
+ let(:criteria) do
10
+ Band.where(name: "Depeche Mode")
11
+ end
12
+
13
+ before do
14
+ Band.default_scope criteria
15
+ end
16
+
17
+ after do
18
+ Band.default_scoping = nil
19
+ end
20
+
21
+ it "adds the default scope to the class" do
22
+ Band.default_scoping.call.should eq(criteria)
23
+ end
24
+
25
+ it "flags as being default scoped" do
26
+ Band.should be_default_scoping
27
+ end
28
+ end
29
+
30
+ context "when provided a proc" do
31
+
32
+ let(:criteria) do
33
+ Band.where(name: "Depeche Mode")
34
+ end
35
+
36
+ before do
37
+ Band.default_scope ->{ criteria }
38
+ end
39
+
40
+ after do
41
+ Band.default_scoping = nil
42
+ end
43
+
44
+ it "adds the default scope to the class" do
45
+ Band.default_scoping.call.should eq(criteria)
46
+ end
47
+
48
+ it "flags as being default scoped" do
49
+ Band.should be_default_scoping
50
+ end
51
+ end
52
+
53
+ context "when provided a non proc or criteria" do
54
+
55
+ it "raises an error" do
56
+ expect {
57
+ Band.default_scope({})
58
+ }.to raise_error(Mongoid::Errors::InvalidScope)
59
+ end
60
+ end
61
+
62
+ context "when there is more then one default_scope" do
63
+
64
+ let(:criteria) do
65
+ Band.where(name: "Depeche Mode")
66
+ end
67
+
68
+ let(:additional_criteria) do
69
+ Band.where(origin: "England")
70
+ end
71
+
72
+ let(:proc_criteria) do
73
+ ->{ Band.where(active: true) }
74
+ end
75
+
76
+ let(:rand_criteria) do
77
+ ->{ Band.gt(likes: rand(100)) }
78
+ end
79
+
80
+ before do
81
+ Band.default_scope criteria
82
+ Band.default_scope additional_criteria
83
+ Band.default_scope proc_criteria
84
+ Band.default_scope rand_criteria
85
+ end
86
+
87
+ after do
88
+ Band.default_scoping = nil
89
+ end
90
+
91
+ it "adds the first default scope" do
92
+ Band.default_scoping.call.selector["name"].should eq("Depeche Mode")
93
+ end
94
+
95
+ it "adds the additional default scope" do
96
+ Band.default_scoping.call.selector["origin"].should eq("England")
97
+ end
98
+
99
+ it "adds the proc default scope" do
100
+ Band.default_scoping.call.selector["active"].should be_true
101
+ end
102
+
103
+ it "delays execution of the merge until called" do
104
+ Band.all.selector["likes"].should_not eq(Band.all.selector["likes"])
105
+ end
106
+
107
+ it "flags as being default scoped" do
108
+ Band.should be_default_scoping
109
+ end
110
+ end
111
+ end
112
+
113
+ describe ".default_scopable?" do
114
+
115
+ context "when a default scope exists" do
116
+
117
+ let(:criteria) do
118
+ Band.where(name: "Depeche Mode")
119
+ end
120
+
121
+ before do
122
+ Band.default_scope ->{ criteria }
123
+ end
124
+
125
+ after do
126
+ Band.default_scoping = nil
127
+ end
128
+
129
+ context "when not in an unscoped block" do
130
+
131
+ it "returns true" do
132
+ Band.should be_default_scopable
133
+ end
134
+ end
135
+
136
+ context "when in an unscoped block" do
137
+
138
+ it "returns false" do
139
+ Band.unscoped do
140
+ Band.should_not be_default_scopable
141
+ end
142
+ end
143
+ end
144
+ end
145
+
146
+ context "when a default scope does not exist" do
147
+
148
+ it "returns false" do
149
+ Band.should_not be_default_scopable
150
+ end
151
+ end
152
+ end
153
+
154
+ describe ".queryable" do
155
+
156
+ context "when no criteria exists on the stack" do
157
+
158
+ it "returns an empty criteria" do
159
+ Band.queryable.selector.should be_empty
160
+ end
161
+ end
162
+
163
+ context "when a criteria exists on the stack" do
164
+
165
+ let(:criteria) do
166
+ Band.where(name: "Depeche Mode")
167
+ end
168
+
169
+ before do
170
+ Band.scope_stack.push(criteria)
171
+ end
172
+
173
+ after do
174
+ Band.scope_stack.clear
175
+ end
176
+
177
+ it "returns the criteria on the stack" do
178
+ Band.queryable.should eq(criteria)
179
+ end
180
+ end
181
+ end
182
+
183
+ describe ".scope" do
184
+
185
+ context "when provided a criteria" do
186
+
187
+ context "when a block is provided" do
188
+
189
+ before do
190
+ Band.scope(:active, Band.where(active: true)) do
191
+ def add_origin
192
+ tap { |c| c.selector[:origin] = "Deutschland" }
193
+ end
194
+ end
195
+ end
196
+
197
+ after do
198
+ class << Band
199
+ undef_method :active
200
+ end
201
+ Band._declared_scopes.clear
202
+ end
203
+
204
+ let(:scope) do
205
+ Band.active.add_origin
206
+ end
207
+
208
+ it "adds the extension to the scope" do
209
+ scope.selector.should eq({ "active" => true, "origin" => "Deutschland" })
210
+ end
211
+ end
212
+
213
+ context "when scoping an embedded document" do
214
+
215
+ before do
216
+ Record.scope(
217
+ :tool,
218
+ Record.where(:name.in => [ "undertow", "aenima", "lateralus" ])
219
+ )
220
+ end
221
+
222
+ after do
223
+ class << Record
224
+ undef_method :tool
225
+ end
226
+ Record._declared_scopes.clear
227
+ end
228
+
229
+ context "when calling the scope" do
230
+
231
+ let(:band) do
232
+ Band.new
233
+ end
234
+
235
+ let!(:undertow) do
236
+ band.records.build(name: "undertow")
237
+ end
238
+
239
+ let(:scoped) do
240
+ band.records.tool
241
+ end
242
+
243
+ it "returns the correct documents" do
244
+ scoped.should eq([ undertow ])
245
+ end
246
+ end
247
+ end
248
+
249
+ context "when no block is provided" do
250
+
251
+ before do
252
+ Band.scope(:active, Band.where(active: true).skip(10))
253
+ end
254
+
255
+ after do
256
+ class << Band
257
+ undef_method :active
258
+ end
259
+ Band._declared_scopes.clear
260
+ end
261
+
262
+ it "adds a method for the scope" do
263
+ Band.should respond_to(:active)
264
+ end
265
+
266
+ context "when calling the scope" do
267
+
268
+ context "when calling from the class" do
269
+
270
+ let(:scope) do
271
+ Band.active
272
+ end
273
+
274
+ it "returns a criteria" do
275
+ scope.should be_a(Mongoid::Criteria)
276
+ end
277
+
278
+ it "contains the proper selector" do
279
+ scope.selector.should eq({ "active" => true })
280
+ end
281
+
282
+ it "contains the proper options" do
283
+ scope.options.should eq({ skip: 10 })
284
+ end
285
+ end
286
+
287
+ context "when chained to another scope" do
288
+
289
+ before do
290
+ Band.scope(:english, Band.where(origin: "England"))
291
+ end
292
+
293
+ after do
294
+ class << Band
295
+ undef_method :english
296
+ end
297
+ Band._declared_scopes.clear
298
+ end
299
+
300
+ let(:scope) do
301
+ Band.english.active
302
+ end
303
+
304
+ it "returns a criteria" do
305
+ scope.should be_a(Mongoid::Criteria)
306
+ end
307
+
308
+ it "contains the proper selector" do
309
+ scope.selector.should eq({ "active" => true, "origin" => "England" })
310
+ end
311
+
312
+ it "contains the proper options" do
313
+ scope.options.should eq({ skip: 10 })
314
+ end
315
+
316
+ it "does not modify the original scope" do
317
+ Band.active.selector.should eq({ "active" => true })
318
+ end
319
+ end
320
+
321
+ context "when chained to a criteria" do
322
+
323
+ let(:criteria) do
324
+ Band.where(origin: "England")
325
+ end
326
+
327
+ let(:scope) do
328
+ criteria.active
329
+ end
330
+
331
+ it "returns a criteria" do
332
+ scope.should be_a(Mongoid::Criteria)
333
+ end
334
+
335
+ it "contains the proper selector" do
336
+ scope.selector.should eq({ "origin" => "England", "active" => true })
337
+ end
338
+
339
+ it "contains the proper options" do
340
+ scope.options.should eq({ skip: 10 })
341
+ end
342
+
343
+ it "does not modify the original scope" do
344
+ Band.active.selector.should eq({ "active" => true })
345
+ end
346
+
347
+ it "does not modify the original criteria" do
348
+ criteria.selector.should eq({ "origin" => "England" })
349
+ end
350
+ end
351
+ end
352
+ end
353
+
354
+ context "when the name conflict with an existing method" do
355
+
356
+ context "when raising an error" do
357
+
358
+ before do
359
+ Mongoid.scope_overwrite_exception = true
360
+ end
361
+
362
+ after do
363
+ Mongoid.scope_overwrite_exception = false
364
+ class << Band
365
+ undef_method :active
366
+ end
367
+ Band._declared_scopes.clear
368
+ end
369
+
370
+ it "raises an exception" do
371
+ expect {
372
+ Band.scope(:active, Band.where(active: true))
373
+ Band.scope(:active, Band.where(active: true))
374
+ }.to raise_error(Mongoid::Errors::ScopeOverwrite)
375
+ end
376
+ end
377
+
378
+ context "when not raising an error" do
379
+
380
+ after do
381
+ Mongoid.scope_overwrite_exception = false
382
+ class << Band
383
+ undef_method :active
384
+ end
385
+ Band._declared_scopes.clear
386
+ end
387
+
388
+ it "raises no exception" do
389
+ Band.scope(:active, Band.where(active: true))
390
+ Band.scope(:active, Band.where(active: true))
391
+ end
392
+ end
393
+ end
394
+ end
395
+
396
+ context "when provided a proc" do
397
+
398
+ context "when a block is provided" do
399
+
400
+ before do
401
+ Band.scope(:active, ->{ Band.where(active: true) }) do
402
+ def add_origin
403
+ tap { |c| c.selector[:origin] = "Deutschland" }
404
+ end
405
+ end
406
+ end
407
+
408
+ after do
409
+ class << Band
410
+ undef_method :active
411
+ end
412
+ Band._declared_scopes.clear
413
+ end
414
+
415
+ let(:scope) do
416
+ Band.active.add_origin
417
+ end
418
+
419
+ it "adds the extension to the scope" do
420
+ scope.selector.should eq({ "active" => true, "origin" => "Deutschland" })
421
+ end
422
+ end
423
+
424
+ context "when no block is provided" do
425
+
426
+ before do
427
+ Band.scope(:active, ->{ Band.where(active: true).skip(10) })
428
+ end
429
+
430
+ after do
431
+ class << Band
432
+ undef_method :active
433
+ end
434
+ Band._declared_scopes.clear
435
+ end
436
+
437
+ it "adds a method for the scope" do
438
+ Band.should respond_to(:active)
439
+ end
440
+
441
+ context "when proc return nil" do
442
+ before do
443
+ Band.scope(:named_by, ->(name) { Band.where(name: name) if name})
444
+ end
445
+
446
+ it "return a all criteral" do
447
+ Band.named_by(nil).should be_a(Mongoid::Criteria)
448
+ end
449
+ end
450
+
451
+ context "when calling the scope" do
452
+
453
+ context "when calling from the class" do
454
+
455
+ let(:scope) do
456
+ Band.active
457
+ end
458
+
459
+ it "returns a criteria" do
460
+ scope.should be_a(Mongoid::Criteria)
461
+ end
462
+
463
+ it "contains the proper selector" do
464
+ scope.selector.should eq({ "active" => true })
465
+ end
466
+
467
+ it "contains the proper options" do
468
+ scope.options.should eq({ skip: 10 })
469
+ end
470
+ end
471
+
472
+ context "when chained to another scope" do
473
+
474
+ before do
475
+ Band.scope(:english, ->{ Band.where(origin: "England") })
476
+ end
477
+
478
+ after do
479
+ class << Band
480
+ undef_method :english
481
+ end
482
+ Band._declared_scopes.clear
483
+ end
484
+
485
+ let(:scope) do
486
+ Band.english.active
487
+ end
488
+
489
+ it "returns a criteria" do
490
+ scope.should be_a(Mongoid::Criteria)
491
+ end
492
+
493
+ it "contains the proper selector" do
494
+ scope.selector.should eq({ "active" => true, "origin" => "England" })
495
+ end
496
+
497
+ it "contains the proper options" do
498
+ scope.options.should eq({ skip: 10 })
499
+ end
500
+
501
+ it "does not modify the original scope" do
502
+ Band.active.selector.should eq({ "active" => true })
503
+ end
504
+ end
505
+
506
+ context "when chained to a criteria" do
507
+
508
+ let(:criteria) do
509
+ Band.where(origin: "England")
510
+ end
511
+
512
+ let(:scope) do
513
+ criteria.active
514
+ end
515
+
516
+ it "returns a criteria" do
517
+ scope.should be_a(Mongoid::Criteria)
518
+ end
519
+
520
+ it "contains the proper selector" do
521
+ scope.selector.should eq({ "origin" => "England", "active" => true })
522
+ end
523
+
524
+ it "contains the proper options" do
525
+ scope.options.should eq({ skip: 10 })
526
+ end
527
+
528
+ it "does not modify the original scope" do
529
+ Band.active.selector.should eq({ "active" => true })
530
+ end
531
+
532
+ it "does not modify the original criteria" do
533
+ criteria.selector.should eq({ "origin" => "England" })
534
+ end
535
+ end
536
+ end
537
+ end
538
+
539
+ context "when the name conflict with an existing method" do
540
+
541
+ context "when raising an error" do
542
+
543
+ before do
544
+ Mongoid.scope_overwrite_exception = true
545
+ end
546
+
547
+ after do
548
+ Mongoid.scope_overwrite_exception = false
549
+ class << Band
550
+ undef_method :active
551
+ end
552
+ Band._declared_scopes.clear
553
+ end
554
+
555
+ it "raises an exception" do
556
+ expect {
557
+ Band.scope(:active, ->{ Band.where(active: true) })
558
+ Band.scope(:active, ->{ Band.where(active: true) })
559
+ }.to raise_error(Mongoid::Errors::ScopeOverwrite)
560
+ end
561
+ end
562
+
563
+ context "when not raising an error" do
564
+
565
+ after do
566
+ Mongoid.scope_overwrite_exception = false
567
+ class << Band
568
+ undef_method :active
569
+ end
570
+ Band._declared_scopes.clear
571
+ end
572
+
573
+ it "raises no exception" do
574
+ Band.scope(:active, ->{ Band.where(active: true) })
575
+ Band.scope(:active, ->{ Band.where(active: true) })
576
+ end
577
+ end
578
+ end
579
+ end
580
+
581
+ context "when provided a non proc or criteria" do
582
+
583
+ it "raises an error" do
584
+ expect {
585
+ Band.scope(:active, {})
586
+ }.to raise_error(Mongoid::Errors::InvalidScope)
587
+ end
588
+ end
589
+
590
+ context "when chaining a non proc with a proc" do
591
+
592
+ context "when both scopes are or queries" do
593
+
594
+ let(:time) do
595
+ Time.now
596
+ end
597
+
598
+ before do
599
+ Band.scope(:xxx, Band.any_of({ :aaa.gt => 0 }, { :bbb.gt => 0 }))
600
+ Band.scope(:yyy, ->{ Band.any_of({ :ccc => nil }, { :ccc.gt => time }) })
601
+ end
602
+
603
+ after do
604
+ class << Band
605
+ undef_method :xxx
606
+ undef_method :yyy
607
+ end
608
+ Band._declared_scopes.clear
609
+ end
610
+
611
+ let(:criteria) do
612
+ Band.yyy.xxx
613
+ end
614
+
615
+ it "properly chains the $or queries together" do
616
+ criteria.selector.should eq({
617
+ "$or" => [
618
+ { "ccc" => nil },
619
+ { "ccc" => { "$gt" => time }},
620
+ { "aaa" => { "$gt" => 0.0 }},
621
+ { "bbb" => { "$gt" => 0.0 }}
622
+ ]
623
+ })
624
+ end
625
+ end
626
+ end
627
+
628
+ context "when working with a subclass" do
629
+
630
+ before do
631
+ Shape.scope(:located_at, ->(x,y) {Shape.where(x: x, y: y)})
632
+ Circle.scope(:with_radius, ->(r) {Circle.where(radius: r)})
633
+ end
634
+
635
+ after do
636
+ class << Shape
637
+ undef_method :located_at
638
+ end
639
+ Shape._declared_scopes.clear
640
+
641
+ class << Circle
642
+ undef_method :with_radius
643
+ end
644
+ Circle._declared_scopes.clear
645
+ end
646
+
647
+ let(:shape_scope_keys) do
648
+ Shape.scopes.keys
649
+ end
650
+
651
+ let(:circle_located_at) do
652
+ Circle.located_at(0,0)
653
+ end
654
+
655
+ let(:circle_scope_keys) do
656
+ Circle.scopes.keys
657
+ end
658
+
659
+ it "doesn't include subclass scopes in superclass scope list" do
660
+ expect(shape_scope_keys).to match_array([:located_at])
661
+ end
662
+
663
+ it "includes superclass scope methods on subclass" do
664
+ expect(circle_located_at).to be_a(Mongoid::Criteria)
665
+ end
666
+
667
+ it "includes superclass scopes in subclass scope list" do
668
+ expect(circle_scope_keys).to match_array([:located_at, :with_radius])
669
+ end
670
+ end
671
+ end
672
+
673
+ describe ".scope_stack" do
674
+
675
+ context "when the scope stack has not been accessed" do
676
+
677
+ it "returns an empty array" do
678
+ Band.scope_stack.should eq([])
679
+ end
680
+ end
681
+
682
+ context "when a criteria exists on the current thread" do
683
+
684
+ let(:criteria) do
685
+ Band.where(active: true)
686
+ end
687
+
688
+ before do
689
+ Mongoid::Threaded.scope_stack[Band.object_id] = [ criteria ]
690
+ end
691
+
692
+ after do
693
+ Mongoid::Threaded.scope_stack[Band.object_id].clear
694
+ end
695
+
696
+ it "returns the criteria in the array" do
697
+ Band.scope_stack.should eq([ criteria ])
698
+ end
699
+ end
700
+ end
701
+
702
+ describe ".scoped" do
703
+
704
+ context "when no options are provided" do
705
+
706
+ let(:scoped) do
707
+ Band.scoped
708
+ end
709
+
710
+ it "returns a criteria" do
711
+ scoped.should be_a(Mongoid::Criteria)
712
+ end
713
+
714
+ it "contains an empty selector" do
715
+ scoped.selector.should be_empty
716
+ end
717
+
718
+ it "contains empty options" do
719
+ scoped.options.should be_empty
720
+ end
721
+ end
722
+
723
+ context "when options are provided" do
724
+
725
+ let(:scoped) do
726
+ Band.scoped(skip: 10, limit: 10)
727
+ end
728
+
729
+ it "returns a criteria" do
730
+ scoped.should be_a(Mongoid::Criteria)
731
+ end
732
+
733
+ it "contains an empty selector" do
734
+ scoped.selector.should be_empty
735
+ end
736
+
737
+ it "contains the options" do
738
+ scoped.options.should eq({ skip: 10, limit: 10 })
739
+ end
740
+ end
741
+
742
+ context "when a default scope exists" do
743
+
744
+ let(:criteria) do
745
+ Band.where(name: "Depeche Mode")
746
+ end
747
+
748
+ before do
749
+ Band.default_scope criteria
750
+ end
751
+
752
+ after do
753
+ Band.default_scoping = nil
754
+ end
755
+
756
+ let(:scoped) do
757
+ Band.scoped
758
+ end
759
+
760
+ it "allows the default scope to be added" do
761
+ scoped.selector.should eq({ "name" => "Depeche Mode" })
762
+ end
763
+
764
+ context "when chained after an unscoped criteria" do
765
+
766
+ let(:scoped) do
767
+ Band.unscoped.scoped
768
+ end
769
+
770
+ it "reapplies the default scope" do
771
+ scoped.selector.should eq({ "name" => "Depeche Mode" })
772
+ end
773
+ end
774
+ end
775
+ end
776
+
777
+ describe ".unscoped" do
778
+
779
+ let(:criteria) do
780
+ Band.where(name: "Depeche Mode")
781
+ end
782
+
783
+ before do
784
+ Band.default_scope criteria
785
+ end
786
+
787
+ after do
788
+ Band.default_scoping = nil
789
+ end
790
+
791
+ context "when called directly" do
792
+
793
+ let(:unscoped) do
794
+ Band.unscoped
795
+ end
796
+
797
+ it "removes the default scope from the criteria" do
798
+ unscoped.selector.should be_empty
799
+ end
800
+
801
+ context "when chained after a scoped criteria" do
802
+
803
+ let(:unscoped) do
804
+ Band.scoped.unscoped
805
+ end
806
+
807
+ it "removes all scoping" do
808
+ unscoped.selector.should be_empty
809
+ end
810
+ end
811
+ end
812
+
813
+ context "when used with a block" do
814
+
815
+ context "when a criteria is called in the block" do
816
+
817
+ it "does not allow default scoping to be added in the block" do
818
+ Band.unscoped do
819
+ Band.skip(10).selector.should be_empty
820
+ end
821
+ end
822
+ end
823
+
824
+ context "when a call is made to scoped in the block" do
825
+
826
+ it "does not allow default scoping to be added in the block" do
827
+ Band.unscoped do
828
+ Band.scoped.selector.should be_empty
829
+ end
830
+ end
831
+ end
832
+
833
+ context "when a named scope is called in the block" do
834
+
835
+ before do
836
+ Band.scope(:skipped, Band.skip(10))
837
+ end
838
+
839
+ after do
840
+ class << Band
841
+ undef_method :skipped
842
+ end
843
+ Band._declared_scopes.clear
844
+ end
845
+
846
+ it "does not allow the default scope to be applied" do
847
+ Band.unscoped do
848
+ Band.skipped.selector.should be_empty
849
+ end
850
+ end
851
+ end
852
+ end
853
+ end
854
+
855
+ describe ".with_default_scope" do
856
+
857
+ let(:criteria) do
858
+ Band.where(name: "Depeche Mode")
859
+ end
860
+
861
+ before do
862
+ Band.default_scope criteria
863
+ end
864
+
865
+ after do
866
+ Band.default_scoping = nil
867
+ end
868
+
869
+ context "when inside an unscoped block" do
870
+
871
+ it "returns an empty criteria" do
872
+ Band.unscoped do
873
+ Band.with_default_scope.selector.should be_empty
874
+ end
875
+ end
876
+ end
877
+
878
+ context "when the criteria is unscoped" do
879
+
880
+ let(:scoped) do
881
+ Band.unscoped.with_default_scope
882
+ end
883
+
884
+ it "returns an empty criteria" do
885
+ scoped.selector.should be_empty
886
+ end
887
+ end
888
+
889
+ context "when no unscoping exists" do
890
+
891
+ let(:scoped) do
892
+ Band.with_default_scope
893
+ end
894
+
895
+ it "returns a scoped criteria" do
896
+ scoped.selector.should eq({ "name" => "Depeche Mode" })
897
+ end
898
+ end
899
+ end
900
+
901
+ describe ".with_scope" do
902
+
903
+ let(:criteria) do
904
+ Band.where(active: true)
905
+ end
906
+
907
+ it "yields to the criteria" do
908
+ Band.with_scope(criteria) do |crit|
909
+ crit.selector.should eq({ "active" => true })
910
+ end
911
+ end
912
+
913
+ it "pops the criteria off the stack" do
914
+ Band.with_scope(criteria) {}
915
+ Band.scope_stack.should be_empty
916
+ end
917
+ end
918
+
919
+ describe ".without_default_scope" do
920
+
921
+ it "sets the threading options" do
922
+ Band.without_default_scope do
923
+ Mongoid::Threaded.should be_executing(:without_default_scope)
924
+ end
925
+ end
926
+ end
927
+
928
+ context "when the document is paranoid" do
929
+
930
+ context "when calling a class method" do
931
+
932
+ let(:criteria) do
933
+ Fish.fresh
934
+ end
935
+
936
+ it "includes the deleted_at criteria in the selector" do
937
+ criteria.selector.should eq({
938
+ "deleted_at" => nil, "fresh" => true
939
+ })
940
+ end
941
+ end
942
+
943
+ context "when chaining a class method to unscoped" do
944
+
945
+ let(:criteria) do
946
+ Fish.unscoped.fresh
947
+ end
948
+
949
+ it "does not include the deleted_at in the selector" do
950
+ criteria.selector.should eq({ "fresh" => true })
951
+ end
952
+ end
953
+
954
+ context "when chaining a class method to deleted" do
955
+
956
+ let(:criteria) do
957
+ Fish.deleted.fresh
958
+ end
959
+
960
+ it "includes the deleted_at $ne criteria in the selector" do
961
+ criteria.selector.should eq({
962
+ "deleted_at" => { "$ne" => nil }, "fresh" => true
963
+ })
964
+ end
965
+ end
966
+
967
+ context "when chaining a where to unscoped" do
968
+
969
+ let(:criteria) do
970
+ Fish.unscoped.where(fresh: true)
971
+ end
972
+
973
+ it "includes no default scoping information in the selector" do
974
+ criteria.selector.should eq({ "fresh" => true })
975
+ end
976
+ end
977
+ end
978
+ end