mongoid 3.1.4 → 3.1.5

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