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,402 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criteria do
4
+
5
+ describe "#update" do
6
+
7
+ let!(:person) do
8
+ Person.create!(title: "Sir")
9
+ end
10
+
11
+ let!(:address_one) do
12
+ person.addresses.create(street: "Oranienstr")
13
+ end
14
+
15
+ let!(:address_two) do
16
+ person.addresses.create(street: "Wienerstr")
17
+ end
18
+
19
+ context "when updating the root document" do
20
+
21
+ context "when updating with a criteria" do
22
+
23
+ before do
24
+ Person.where(title: "Sir").update(title: "Madam")
25
+ end
26
+
27
+ it "updates all the matching documents" do
28
+ person.reload.title.should eq("Madam")
29
+ end
30
+ end
31
+
32
+ context "when updating all directly" do
33
+
34
+ before do
35
+ Person.update(title: "Madam")
36
+ end
37
+
38
+ it "updates all the matching documents" do
39
+ person.reload.title.should eq("Madam")
40
+ end
41
+ end
42
+ end
43
+
44
+ context "when updating an embedded document" do
45
+
46
+ before do
47
+ Person.where(title: "Sir").update(
48
+ "addresses.0.city" => "Berlin"
49
+ )
50
+ end
51
+
52
+ let!(:from_db) do
53
+ Person.first
54
+ end
55
+
56
+ it "updates all the matching documents" do
57
+ from_db.addresses.first.city.should eq("Berlin")
58
+ end
59
+
60
+ it "does not update non matching documents" do
61
+ from_db.addresses.last.city.should be_nil
62
+ end
63
+ end
64
+
65
+ context "when updating a relation" do
66
+
67
+ context "when the relation is an embeds many" do
68
+
69
+ let(:from_db) do
70
+ Person.first
71
+ end
72
+
73
+ context "when updating the relation directly" do
74
+
75
+ before do
76
+ person.addresses.update(city: "London")
77
+ end
78
+
79
+ it "updates the first document" do
80
+ from_db.addresses.first.city.should eq("London")
81
+ end
82
+
83
+ it "does not update the last document" do
84
+ from_db.addresses.last.city.should be_nil
85
+ end
86
+ end
87
+
88
+ context "when updating the relation through a criteria" do
89
+
90
+ before do
91
+ person.addresses.where(street: "Oranienstr").update(city: "Berlin")
92
+ end
93
+
94
+ it "updates the matching documents" do
95
+ from_db.addresses.first.city.should eq("Berlin")
96
+ end
97
+
98
+ it "does not update non matching documents" do
99
+ from_db.addresses.last.city.should be_nil
100
+ end
101
+ end
102
+ end
103
+
104
+ context "when the relation is a references many" do
105
+
106
+ let!(:post_one) do
107
+ person.posts.create(title: "First")
108
+ end
109
+
110
+ let!(:post_two) do
111
+ person.posts.create(title: "Second")
112
+ end
113
+
114
+ context "when updating the relation directly" do
115
+
116
+ before do
117
+ person.posts.update(title: "London")
118
+ end
119
+
120
+ let!(:from_db) do
121
+ Person.first
122
+ end
123
+
124
+ it "updates the first document" do
125
+ from_db.posts.first.title.should eq("London")
126
+ end
127
+
128
+ it "does not update the last document" do
129
+ from_db.posts.last.title.should eq("Second")
130
+ end
131
+ end
132
+
133
+ context "when updating the relation through a criteria" do
134
+
135
+ before do
136
+ person.posts.where(title: "First").update(title: "Berlin")
137
+ end
138
+
139
+ let!(:from_db) do
140
+ Person.first
141
+ end
142
+
143
+ it "updates the matching documents" do
144
+ from_db.posts.where(title: "Berlin").count.should eq(1)
145
+ end
146
+
147
+ it "does not update non matching documents" do
148
+ from_db.posts.where(title: "Second").count.should eq(1)
149
+ end
150
+ end
151
+ end
152
+
153
+ context "when the relation is a references many to many" do
154
+
155
+ let(:from_db) do
156
+ Person.first
157
+ end
158
+
159
+ let!(:preference_one) do
160
+ person.preferences.create(name: "First")
161
+ end
162
+
163
+ let!(:preference_two) do
164
+ person.preferences.create(name: "Second")
165
+ end
166
+
167
+ context "when updating the relation directly" do
168
+
169
+ before do
170
+ person.preferences.update(name: "London")
171
+ end
172
+
173
+ it "updates the first document" do
174
+ from_db.preferences.first.name.should eq("London")
175
+ end
176
+
177
+ it "does not update the last document" do
178
+ from_db.preferences.last.name.should eq("Second")
179
+ end
180
+ end
181
+
182
+ context "when updating the relation through a criteria" do
183
+
184
+ before do
185
+ person.preferences.where(name: "First").update(name: "Berlin")
186
+ end
187
+
188
+ it "updates the matching documents" do
189
+ from_db.preferences.first.name.should eq("Berlin")
190
+ end
191
+
192
+ it "does not update non matching documents" do
193
+ from_db.preferences.last.name.should eq("Second")
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
199
+
200
+ describe "#update_all" do
201
+
202
+ let!(:person) do
203
+ Person.create(title: "Sir")
204
+ end
205
+
206
+ let!(:address_one) do
207
+ person.addresses.create(street: "Oranienstr")
208
+ end
209
+
210
+ let!(:address_two) do
211
+ person.addresses.create(street: "Wienerstr")
212
+ end
213
+
214
+ context "when updating the root document" do
215
+
216
+ context "when updating with a criteria" do
217
+
218
+ let(:from_db) do
219
+ Person.first
220
+ end
221
+
222
+ before do
223
+ Person.where(title: "Sir").update_all(title: "Madam")
224
+ end
225
+
226
+ it "updates all the matching documents" do
227
+ from_db.title.should eq("Madam")
228
+ end
229
+ end
230
+
231
+ context "when updating all directly" do
232
+
233
+ let(:from_db) do
234
+ Person.first
235
+ end
236
+
237
+ before do
238
+ Person.update_all(title: "Madam")
239
+ end
240
+
241
+ it "updates all the matching documents" do
242
+ from_db.title.should eq("Madam")
243
+ end
244
+ end
245
+ end
246
+
247
+ context "when updating an embedded document" do
248
+
249
+ before do
250
+ Person.where(title: "Sir").update_all(
251
+ "addresses.0.city" => "Berlin"
252
+ )
253
+ end
254
+
255
+ let!(:from_db) do
256
+ Person.first
257
+ end
258
+
259
+ it "updates all the matching documents" do
260
+ from_db.addresses.first.city.should eq("Berlin")
261
+ end
262
+
263
+ it "does not update non matching documents" do
264
+ from_db.addresses.last.city.should be_nil
265
+ end
266
+ end
267
+
268
+ context "when updating a relation" do
269
+
270
+ context "when the relation is an embeds many" do
271
+
272
+ let(:from_db) do
273
+ Person.first
274
+ end
275
+
276
+ context "when updating the relation directly" do
277
+
278
+ before do
279
+ person.addresses.update_all(city: "London")
280
+ end
281
+
282
+ it "updates the first document" do
283
+ from_db.addresses.first.city.should eq("London")
284
+ end
285
+
286
+ it "updates the last document" do
287
+ from_db.addresses.last.city.should eq("London")
288
+ end
289
+ end
290
+
291
+ context "when updating the relation through a criteria" do
292
+
293
+ before do
294
+ person.addresses.where(street: "Oranienstr").update_all(city: "Berlin")
295
+ end
296
+
297
+ it "updates the matching documents" do
298
+ from_db.addresses.first.city.should eq("Berlin")
299
+ end
300
+
301
+ it "does not update non matching documents" do
302
+ from_db.addresses.last.city.should be_nil
303
+ end
304
+ end
305
+ end
306
+
307
+ context "when the relation is a references many" do
308
+
309
+ let!(:post_one) do
310
+ person.posts.create(title: "First")
311
+ end
312
+
313
+ let!(:post_two) do
314
+ person.posts.create(title: "Second")
315
+ end
316
+
317
+ context "when updating the relation directly" do
318
+
319
+ before do
320
+ person.posts.update_all(title: "London")
321
+ end
322
+
323
+ let!(:from_db) do
324
+ Person.first
325
+ end
326
+
327
+ it "updates the first document" do
328
+ from_db.posts.first.title.should eq("London")
329
+ end
330
+
331
+ it "updates the last document" do
332
+ from_db.posts.last.title.should eq("London")
333
+ end
334
+ end
335
+
336
+ context "when updating the relation through a criteria" do
337
+
338
+ before do
339
+ person.posts.where(title: "First").update_all(title: "Berlin")
340
+ end
341
+
342
+ let!(:from_db) do
343
+ Person.first
344
+ end
345
+
346
+ it "updates the matching documents" do
347
+ from_db.posts.where(title: "Berlin").count.should eq(1)
348
+ end
349
+
350
+ it "does not update non matching documents" do
351
+ from_db.posts.where(title: "Second").count.should eq(1)
352
+ end
353
+ end
354
+ end
355
+
356
+ context "when the relation is a references many to many" do
357
+
358
+ let(:from_db) do
359
+ Person.first
360
+ end
361
+
362
+ let!(:preference_one) do
363
+ person.preferences.create(name: "First")
364
+ end
365
+
366
+ let!(:preference_two) do
367
+ person.preferences.create(name: "Second")
368
+ end
369
+
370
+ context "when updating the relation directly" do
371
+
372
+ before do
373
+ person.preferences.update_all(name: "London")
374
+ end
375
+
376
+ it "updates the first document" do
377
+ from_db.preferences.first.name.should eq("London")
378
+ end
379
+
380
+ it "updates the last document" do
381
+ from_db.preferences.last.name.should eq("London")
382
+ end
383
+ end
384
+
385
+ context "when updating the relation through a criteria" do
386
+
387
+ before do
388
+ person.preferences.where(name: "First").update_all(name: "Berlin")
389
+ end
390
+
391
+ it "updates the matching documents" do
392
+ from_db.preferences.first.name.should eq("Berlin")
393
+ end
394
+
395
+ it "does not update non matching documents" do
396
+ from_db.preferences.last.name.should eq("Second")
397
+ end
398
+ end
399
+ end
400
+ end
401
+ end
402
+ end
@@ -0,0 +1,391 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criterion::Scoping do
4
+
5
+ describe "#apply_default_scope" do
6
+
7
+ context "when the default scope has options" do
8
+
9
+ let(:scope) do
10
+ Band.skip(20)
11
+ end
12
+
13
+ before do
14
+ Band.default_scope scope
15
+ end
16
+
17
+ after do
18
+ Band.default_scoping = nil
19
+ end
20
+
21
+ let(:scoped) do
22
+ Band.all.tap do |criteria|
23
+ criteria.apply_default_scope
24
+ end
25
+ end
26
+
27
+ it "merges in the options" do
28
+ scoped.options.should eq({ skip: 20 })
29
+ end
30
+
31
+ it "sets scoped to true" do
32
+ scoped.should be_scoped
33
+ end
34
+ end
35
+
36
+ context "when the default scope has selection" do
37
+
38
+ let(:scope) do
39
+ Band.where(name: "Depeche Mode")
40
+ end
41
+
42
+ before do
43
+ Band.default_scope scope
44
+ end
45
+
46
+ after do
47
+ Band.default_scoping = nil
48
+ end
49
+
50
+ let(:scoped) do
51
+ Band.all.tap do |criteria|
52
+ criteria.apply_default_scope
53
+ end
54
+ end
55
+
56
+ it "merges in the options" do
57
+ scoped.selector.should eq({ "name" => "Depeche Mode" })
58
+ end
59
+
60
+ it "sets scoped to true" do
61
+ scoped.should be_scoped
62
+ end
63
+ end
64
+
65
+ context "when the default scope has inclusions" do
66
+
67
+ let(:scope) do
68
+ Band.includes(:records)
69
+ end
70
+
71
+ before do
72
+ Band.default_scope scope
73
+ end
74
+
75
+ after do
76
+ Band.default_scoping = nil
77
+ end
78
+
79
+ context "when merging with an empty criteria" do
80
+
81
+ let(:scoped) do
82
+ Band.all.tap do |criteria|
83
+ criteria.apply_default_scope
84
+ end
85
+ end
86
+
87
+ it "merges in the inclusions" do
88
+ scoped.inclusions.should eq(
89
+ [ Band.relations["records"] ]
90
+ )
91
+ end
92
+
93
+ it "sets scoped to true" do
94
+ scoped.should be_scoped
95
+ end
96
+ end
97
+
98
+ context "when merging with a criteria that has inclusions" do
99
+
100
+ let(:scoped) do
101
+ Band.includes(:label).tap do |criteria|
102
+ criteria.apply_default_scope
103
+ end
104
+ end
105
+
106
+ it "merges in the inclusions" do
107
+ scoped.inclusions.should eq(
108
+ [ Band.relations["records"], Band.relations["label"] ]
109
+ )
110
+ end
111
+
112
+ it "sets scoped to true" do
113
+ scoped.should be_scoped
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "#remove_scoping" do
120
+
121
+ context "when the other has selection" do
122
+
123
+ let(:criteria) do
124
+ Band.where(name: "Depeche Mode")
125
+ end
126
+
127
+ before do
128
+ criteria.remove_scoping(criteria)
129
+ end
130
+
131
+ it "removes the selection" do
132
+ criteria.selector.should be_empty
133
+ end
134
+ end
135
+
136
+ context "when the other has options" do
137
+
138
+ context "when both are options only" do
139
+
140
+ let(:criteria) do
141
+ Band.skip(10)
142
+ end
143
+
144
+ before do
145
+ criteria.remove_scoping(criteria)
146
+ end
147
+
148
+ it "removes the options" do
149
+ criteria.options.should be_empty
150
+ end
151
+ end
152
+
153
+ context "when the criteria is selection only with nil" do
154
+
155
+ let(:criteria) do
156
+ Band.where(name: nil)
157
+ end
158
+
159
+ before do
160
+ criteria.remove_scoping(Band.asc(:_id))
161
+ end
162
+
163
+ it "removes the options" do
164
+ criteria.options.should be_empty
165
+ end
166
+
167
+ it "does not remove the selector" do
168
+ criteria.selector.should eq({ "name" => nil })
169
+ end
170
+ end
171
+ end
172
+
173
+ context "when the other has inclusions" do
174
+
175
+ let(:criteria) do
176
+ Band.includes(:records, :label)
177
+ end
178
+
179
+ let(:other) do
180
+ Band.includes(:label)
181
+ end
182
+
183
+ before do
184
+ criteria.remove_scoping(other)
185
+ end
186
+
187
+ it "removes the matching inclusions" do
188
+ criteria.inclusions.should eq([ Band.relations["records"] ])
189
+ end
190
+ end
191
+ end
192
+
193
+ describe "#scoped" do
194
+
195
+ let(:empty) do
196
+ Mongoid::Criteria.new(Band)
197
+ end
198
+
199
+ context "when no options are provided" do
200
+
201
+ let(:scoped) do
202
+ empty.scoped
203
+ end
204
+
205
+ it "returns a criteria" do
206
+ scoped.should be_a(Mongoid::Criteria)
207
+ end
208
+
209
+ it "contains an empty selector" do
210
+ scoped.selector.should be_empty
211
+ end
212
+
213
+ it "contains empty options" do
214
+ scoped.options.should be_empty
215
+ end
216
+ end
217
+
218
+ context "when options are provided" do
219
+
220
+ let(:scoped) do
221
+ empty.scoped(skip: 10, limit: 10)
222
+ end
223
+
224
+ it "returns a criteria" do
225
+ scoped.should be_a(Mongoid::Criteria)
226
+ end
227
+
228
+ it "contains an empty selector" do
229
+ scoped.selector.should be_empty
230
+ end
231
+
232
+ it "contains the options" do
233
+ scoped.options.should eq({ skip: 10, limit: 10 })
234
+ end
235
+ end
236
+
237
+ context "when a default scope exists" do
238
+
239
+ let(:criteria) do
240
+ Band.where(name: "Depeche Mode")
241
+ end
242
+
243
+ before do
244
+ Band.default_scope criteria
245
+ end
246
+
247
+ after do
248
+ Band.default_scoping = nil
249
+ end
250
+
251
+ let(:scoped) do
252
+ empty.scoped
253
+ end
254
+
255
+ it "allows the default scope to be added" do
256
+ scoped.selector.should eq({ "name" => "Depeche Mode" })
257
+ end
258
+
259
+ it "flags as scoped" do
260
+ scoped.should be_scoped
261
+ end
262
+
263
+ context "when chained after an unscoped criteria" do
264
+
265
+ let(:scoped) do
266
+ empty.unscoped.scoped
267
+ end
268
+
269
+ it "reapplies the default scope" do
270
+ scoped.selector.should eq({ "name" => "Depeche Mode" })
271
+ end
272
+ end
273
+ end
274
+ end
275
+
276
+ describe "#scoping_options" do
277
+
278
+ let(:criteria) do
279
+ Band.all
280
+ end
281
+
282
+ before do
283
+ criteria.scoping_options = true, false
284
+ end
285
+
286
+ it "returns the scoping options" do
287
+ criteria.scoping_options.should eq([ true, false ])
288
+ end
289
+ end
290
+
291
+ describe "#scoping_options=" do
292
+
293
+ let(:criteria) do
294
+ Band.all
295
+ end
296
+
297
+ before do
298
+ criteria.scoping_options = true, true
299
+ end
300
+
301
+ it "sets the scoped flag" do
302
+ criteria.should be_scoped
303
+ end
304
+
305
+ it "sets the unscoped flag" do
306
+ criteria.should be_unscoped
307
+ end
308
+ end
309
+
310
+ describe ".unscoped" do
311
+
312
+ let(:empty) do
313
+ Mongoid::Criteria.new(Band)
314
+ end
315
+
316
+ let(:criteria) do
317
+ Band.where(name: "Depeche Mode")
318
+ end
319
+
320
+ before do
321
+ Band.default_scope criteria
322
+ end
323
+
324
+ after do
325
+ Band.default_scoping = nil
326
+ end
327
+
328
+ context "when called directly" do
329
+
330
+ let(:unscoped) do
331
+ empty.unscoped
332
+ end
333
+
334
+ it "removes the default scope from the criteria" do
335
+ unscoped.selector.should be_empty
336
+ end
337
+
338
+ context "when chained after a scoped criteria" do
339
+
340
+ let(:unscoped) do
341
+ empty.scoped.unscoped
342
+ end
343
+
344
+ it "removes all scoping" do
345
+ unscoped.selector.should be_empty
346
+ end
347
+ end
348
+ end
349
+
350
+ context "when used with a block" do
351
+
352
+ context "when a criteria is called in the block" do
353
+
354
+ it "does not allow default scoping to be added in the block" do
355
+ Band.unscoped do
356
+ empty.skip(10).selector.should be_empty
357
+ end
358
+ end
359
+ end
360
+
361
+ context "when a call is made to scoped in the block" do
362
+
363
+ it "does not allow default scoping to be added in the block" do
364
+ Band.unscoped do
365
+ empty.scoped.selector.should be_empty
366
+ end
367
+ end
368
+ end
369
+
370
+ context "when a named scope is called in the block" do
371
+
372
+ before do
373
+ Band.scope(:skipped, Band.skip(10))
374
+ end
375
+
376
+ after do
377
+ class << Band
378
+ undef_method :skipped
379
+ end
380
+ Band._declared_scopes.clear
381
+ end
382
+
383
+ it "does not allow the default scope to be applied" do
384
+ Band.unscoped do
385
+ empty.skipped.selector.should be_empty
386
+ end
387
+ end
388
+ end
389
+ end
390
+ end
391
+ end