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,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe "A document loaded from rails" do
4
+ before(:all) do
5
+ require 'mongoid/railties/document'
6
+ end
7
+
8
+ after(:all) do
9
+ Mongoid::Document.class_eval do
10
+ undef _destroy
11
+ end
12
+ end
13
+
14
+ it "defines a _destroy method" do
15
+ Person.new.should respond_to(:_destroy)
16
+ end
17
+
18
+ describe "#_destroy" do
19
+
20
+ it "always returns false" do
21
+ Person.new._destroy.should be_false
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,844 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Accessors do
4
+
5
+ describe "\#{getter}?" do
6
+
7
+ let(:person) do
8
+ Person.create
9
+ end
10
+
11
+ context "when the relation is a has one" do
12
+
13
+ context "when the relation exists" do
14
+
15
+ let!(:game) do
16
+ person.build_game
17
+ end
18
+
19
+ it "returns true" do
20
+ person.should have_game
21
+ end
22
+ end
23
+
24
+ context "when the relation does not exist" do
25
+
26
+ context "when not autobuilding" do
27
+
28
+ it "returns false" do
29
+ person.should_not have_game
30
+ end
31
+ end
32
+
33
+ context "when autobuilding" do
34
+
35
+ it "returns false" do
36
+ person.should_not have_book
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when the relation is a has many" do
43
+
44
+ context "when the relation has documents" do
45
+
46
+ let!(:post) do
47
+ person.posts.build
48
+ end
49
+
50
+ it "returns true" do
51
+ person.should have_posts
52
+ end
53
+ end
54
+
55
+ context "when the relation does not have documents" do
56
+
57
+ it "returns false" do
58
+ person.should_not have_posts
59
+ end
60
+ end
61
+ end
62
+
63
+ context "when the relation is a has and belongs to many" do
64
+
65
+ context "when the relation has documents" do
66
+
67
+ let!(:preference) do
68
+ person.preferences.build
69
+ end
70
+
71
+ it "returns true" do
72
+ person.should have_preferences
73
+ end
74
+ end
75
+
76
+ context "when the relation does not have documents" do
77
+
78
+ it "returns false" do
79
+ person.should_not have_preferences
80
+ end
81
+ end
82
+ end
83
+
84
+ context "when the relation is a belongs to" do
85
+
86
+ context "when the relation is named next" do
87
+
88
+ let(:user) do
89
+ User.create
90
+ end
91
+
92
+ it "allows the existence check" do
93
+ user.should_not have_next
94
+ end
95
+ end
96
+
97
+ context "when the relation exists" do
98
+
99
+ let!(:game) do
100
+ person.build_game
101
+ end
102
+
103
+ it "returns true" do
104
+ game.should have_person
105
+ end
106
+ end
107
+
108
+ context "when the relation does not exist" do
109
+
110
+ context "when the relation does not autobuild" do
111
+
112
+ let(:game) do
113
+ Game.new
114
+ end
115
+
116
+ it "returns false" do
117
+ game.should_not have_person
118
+ end
119
+ end
120
+
121
+ context "when the relation autobuilds" do
122
+
123
+ let(:book) do
124
+ Book.new
125
+ end
126
+
127
+ it "returns false" do
128
+ book.should_not have_person
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ context "when the relation is an embeds one" do
135
+
136
+ context "when the relation exists" do
137
+
138
+ let!(:name) do
139
+ person.build_name
140
+ end
141
+
142
+ it "returns true" do
143
+ person.should have_name
144
+ end
145
+ end
146
+
147
+ context "when the relation does not exist" do
148
+
149
+ context "when the relation does not autobuild" do
150
+
151
+ it "returns false" do
152
+ person.should_not have_name
153
+ end
154
+ end
155
+
156
+ context "when the relation autobuilds" do
157
+
158
+ let(:person) do
159
+ Person.new
160
+ end
161
+
162
+ it "returns false" do
163
+ person.should_not have_passport
164
+ end
165
+ end
166
+ end
167
+ end
168
+
169
+ context "when the relation is an embeds many" do
170
+
171
+ context "when the relation has documents" do
172
+
173
+ let!(:address) do
174
+ person.addresses.build
175
+ end
176
+
177
+ it "returns true" do
178
+ person.should have_addresses
179
+ end
180
+ end
181
+
182
+ context "when the relation does not have documents" do
183
+
184
+ it "returns false" do
185
+ person.should_not have_addresses
186
+ end
187
+ end
188
+ end
189
+
190
+ context "when the relation is an embedded in" do
191
+
192
+ context "when the relation exists" do
193
+
194
+ let!(:name) do
195
+ person.build_name
196
+ end
197
+
198
+ it "returns true" do
199
+ name.should have_namable
200
+ end
201
+ end
202
+
203
+ context "when the relation does not exist" do
204
+
205
+ context "when the relation does not autobuild" do
206
+
207
+ let(:name) do
208
+ Name.new
209
+ end
210
+
211
+ it "returns false" do
212
+ name.should_not have_namable
213
+ end
214
+ end
215
+
216
+ context "when the relation autobuilds" do
217
+
218
+ let(:passport) do
219
+ Passport.new
220
+ end
221
+
222
+ it "returns false" do
223
+ passport.should_not have_person
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
229
+
230
+ describe "\#{getter}" do
231
+
232
+ let(:person) do
233
+ Person.new
234
+ end
235
+
236
+ context "when autobuilding the relation" do
237
+
238
+ context "when the relation is an embeds one" do
239
+
240
+ context "when the relation does not exist" do
241
+
242
+ let!(:passport) do
243
+ person.passport
244
+ end
245
+
246
+ it "builds the new document" do
247
+ passport.should be_a(Passport)
248
+ end
249
+
250
+ it "stores in the altered attribute" do
251
+ person.as_document["pass"].should eq(passport.attributes)
252
+ end
253
+ end
254
+
255
+ context "when the relation exists" do
256
+
257
+ let!(:passport) do
258
+ person.build_passport(number: "123123321")
259
+ end
260
+
261
+ it "does not build a new document" do
262
+ person.passport.should eq(passport)
263
+ end
264
+ end
265
+ end
266
+
267
+ context "when the relation is an embedded in" do
268
+
269
+ let(:passport) do
270
+ Passport.new
271
+ end
272
+
273
+ context "when the relation does not exist" do
274
+
275
+ let(:person) do
276
+ passport.person
277
+ end
278
+
279
+ it "builds the new document" do
280
+ person.should be_a(Person)
281
+ end
282
+ end
283
+
284
+ context "when the relation exists" do
285
+
286
+ let!(:person) do
287
+ passport.build_person(title: "sir")
288
+ end
289
+
290
+ it "does not build a new document" do
291
+ passport.person.should eq(person)
292
+ end
293
+ end
294
+ end
295
+
296
+ context "when the relation is a has one" do
297
+
298
+ context "when the relation does not exist" do
299
+
300
+ let(:book) do
301
+ person.book
302
+ end
303
+
304
+ it "builds the new document" do
305
+ book.should be_a(Book)
306
+ end
307
+ end
308
+
309
+ context "when the relation exists" do
310
+
311
+ let!(:book) do
312
+ person.build_book(title: "art of war")
313
+ end
314
+
315
+ it "does not build a new document" do
316
+ person.book.should eq(book)
317
+ end
318
+ end
319
+ end
320
+
321
+ context "when the relation is a belongs to" do
322
+
323
+ let(:book) do
324
+ Book.new
325
+ end
326
+
327
+ context "when the relation does not exist" do
328
+
329
+ let(:person) do
330
+ book.person
331
+ end
332
+
333
+ it "builds the new document" do
334
+ person.should be_a(Person)
335
+ end
336
+ end
337
+
338
+ context "when the relation exists" do
339
+
340
+ let!(:person) do
341
+ book.build_person(title: "sir")
342
+ end
343
+
344
+ it "does not build a new document" do
345
+ book.person.should eq(person)
346
+ end
347
+ end
348
+ end
349
+ end
350
+
351
+ context "when the relation is not polymorphic" do
352
+
353
+ let(:person) do
354
+ Person.create
355
+ end
356
+
357
+ context "when the relation is a many to many" do
358
+
359
+ let!(:preference) do
360
+ Preference.create(name: "Setting")
361
+ end
362
+
363
+ before do
364
+ person.preferences << Preference.last
365
+ end
366
+
367
+ context "when reloading the relation directly" do
368
+
369
+ let(:preferences) do
370
+ person.preferences(true)
371
+ end
372
+
373
+ it "reloads the correct documents" do
374
+ preferences.should eq([ preference ])
375
+ end
376
+
377
+ it "reloads a new instance" do
378
+ preferences.first.should_not equal(preference)
379
+ end
380
+ end
381
+
382
+ context "when reloading via the base document" do
383
+
384
+ let(:preferences) do
385
+ person.reload.preferences
386
+ end
387
+
388
+ it "reloads the correct documents" do
389
+ preferences.should eq([ preference ])
390
+ end
391
+
392
+ it "reloads a new instance" do
393
+ preferences.first.should_not equal(preference)
394
+ end
395
+ end
396
+
397
+ context "when performing a fresh find on the base" do
398
+
399
+ let(:preferences) do
400
+ Person.find(person.id).preferences
401
+ end
402
+
403
+ it "reloads the correct documents" do
404
+ preferences.should eq([ preference ])
405
+ end
406
+ end
407
+ end
408
+
409
+ context "when the relation is a many to one" do
410
+
411
+ let!(:post) do
412
+ Post.create(title: "First!")
413
+ end
414
+
415
+ before do
416
+ person.posts << Post.last
417
+ end
418
+
419
+ context "when reloading the relation directly" do
420
+
421
+ let(:posts) do
422
+ person.posts(true)
423
+ end
424
+
425
+ it "reloads the correct documents" do
426
+ posts.should eq([ post ])
427
+ end
428
+
429
+ it "reloads a new instance" do
430
+ posts.first.should_not equal(post)
431
+ end
432
+ end
433
+
434
+ context "when reloading via the base document" do
435
+
436
+ let(:posts) do
437
+ person.reload.posts
438
+ end
439
+
440
+ it "reloads the correct documents" do
441
+ posts.should eq([ post ])
442
+ end
443
+
444
+ it "reloads a new instance" do
445
+ posts.first.should_not equal(post)
446
+ end
447
+ end
448
+
449
+ context "when performing a fresh find on the base" do
450
+
451
+ let(:posts) do
452
+ Person.find(person.id).posts
453
+ end
454
+
455
+ it "reloads the correct documents" do
456
+ posts.should eq([ post ])
457
+ end
458
+ end
459
+ end
460
+
461
+ context "when the relation is a references one" do
462
+
463
+ let!(:game) do
464
+ Game.create(name: "Centipeded")
465
+ end
466
+
467
+ before do
468
+ person.game = Game.last
469
+ end
470
+
471
+ context "when reloading the relation directly" do
472
+
473
+ let(:reloaded_game) do
474
+ person.game(true)
475
+ end
476
+
477
+ it "reloads the correct documents" do
478
+ reloaded_game.should eq(game)
479
+ end
480
+
481
+ it "reloads a new instance" do
482
+ reloaded_game.should_not equal(game)
483
+ end
484
+ end
485
+
486
+ context "when reloading via the base document" do
487
+
488
+ let(:reloaded_game) do
489
+ person.reload.game
490
+ end
491
+
492
+ it "reloads the correct documents" do
493
+ reloaded_game.should eq(game)
494
+ end
495
+
496
+ it "reloads a new instance" do
497
+ reloaded_game.should_not equal(game)
498
+ end
499
+ end
500
+
501
+ context "when performing a fresh find on the base" do
502
+
503
+ let(:reloaded_game) do
504
+ Person.find(person.id).game
505
+ end
506
+
507
+ it "reloads the correct documents" do
508
+ reloaded_game.should eq(game)
509
+ end
510
+ end
511
+ end
512
+ end
513
+
514
+ context "when the relation is polymorphic" do
515
+
516
+ context "when there's a single references many/one" do
517
+
518
+ let!(:movie) do
519
+ Movie.create(title: "Inception")
520
+ end
521
+
522
+ let!(:book) do
523
+ Book.create(title: "Jurassic Park")
524
+ end
525
+
526
+ let!(:movie_rating) do
527
+ movie.ratings.create(value: 10)
528
+ end
529
+
530
+ let!(:book_rating) do
531
+ book.create_rating(value: 5)
532
+ end
533
+
534
+ context "when accessing a referenced in" do
535
+
536
+ let!(:rating) do
537
+ Rating.where(value: 10).first
538
+ end
539
+
540
+ it "returns the correct document" do
541
+ rating.ratable.should eq(movie)
542
+ end
543
+ end
544
+
545
+ context "when accessing a references many" do
546
+
547
+ let(:ratings) do
548
+ Movie.first.ratings
549
+ end
550
+
551
+ it "returns the correct documents" do
552
+ ratings.should eq([ movie_rating ])
553
+ end
554
+ end
555
+
556
+ context "when accessing a references one" do
557
+
558
+ let!(:rating) do
559
+ Book.find(book.id).rating
560
+ end
561
+
562
+ it "returns the correct document" do
563
+ rating.should eq(book_rating)
564
+ end
565
+ end
566
+ end
567
+
568
+ context "when there are multiple references many/one" do
569
+
570
+ let(:face) do
571
+ Face.create
572
+ end
573
+
574
+ let(:eye_bowl) do
575
+ EyeBowl.create
576
+ end
577
+
578
+ let!(:face_left_eye) do
579
+ face.create_left_eye(pupil_dilation: 10)
580
+ end
581
+
582
+ let!(:face_right_eye) do
583
+ face.create_right_eye(pupil_dilation: 5)
584
+ end
585
+
586
+ let!(:eye_bowl_blue_eye) do
587
+ eye_bowl.blue_eyes.create(pupil_dilation: 2)
588
+ end
589
+
590
+ let!(:eye_bowl_brown_eye) do
591
+ eye_bowl.brown_eyes.create(pupil_dilation: 1)
592
+ end
593
+
594
+ context "when accessing a referenced in" do
595
+
596
+ let(:eye) do
597
+ Eye.where(pupil_dilation: 10).first
598
+ end
599
+
600
+ it "returns the correct type" do
601
+ eye.eyeable.should be_a(Face)
602
+ end
603
+
604
+ it "returns the correct document" do
605
+ eye.eyeable.should eq(face)
606
+ end
607
+ end
608
+
609
+ context "when accessing a references many" do
610
+
611
+ context "first references many" do
612
+
613
+ let(:eyes) do
614
+ EyeBowl.first.blue_eyes
615
+ end
616
+
617
+ it "returns the correct documents" do
618
+ eyes.should eq([ eye_bowl_blue_eye ])
619
+ end
620
+ end
621
+
622
+ context "second references many" do
623
+
624
+ let(:eyes) do
625
+ EyeBowl.first.brown_eyes
626
+ end
627
+
628
+ it "returns the correct documents" do
629
+ eyes.should eq([ eye_bowl_brown_eye ])
630
+ end
631
+ end
632
+ end
633
+
634
+ context "when accessing a references one" do
635
+
636
+ context "first references one" do
637
+
638
+ let(:eye) do
639
+ Face.first.left_eye
640
+ end
641
+
642
+ it "returns the correct document" do
643
+ eye.should eq(face_left_eye)
644
+ end
645
+ end
646
+
647
+ context "second references one" do
648
+
649
+ let(:eye) do
650
+ Face.first.right_eye
651
+ end
652
+
653
+ it "returns the correct document" do
654
+ eye.should eq(face_right_eye)
655
+ end
656
+ end
657
+ end
658
+ end
659
+ end
660
+ end
661
+
662
+ context "when setting relations to empty values" do
663
+
664
+ context "when the document is a referenced in" do
665
+
666
+ let(:post) do
667
+ Post.new
668
+ end
669
+
670
+ context "when setting the relation directly" do
671
+
672
+ before do
673
+ post.person = ""
674
+ end
675
+
676
+ it "converts them to nil" do
677
+ post.person.should be_nil
678
+ end
679
+ end
680
+
681
+ context "when setting the foreign key" do
682
+
683
+ before do
684
+ post.person_id = ""
685
+ end
686
+
687
+ it "converts it to nil" do
688
+ post.person_id.should be_nil
689
+ end
690
+ end
691
+ end
692
+
693
+ context "when the document is a references one" do
694
+
695
+ let(:person) do
696
+ Person.new
697
+ end
698
+
699
+ context "when setting the relation directly" do
700
+
701
+ before do
702
+ person.game = ""
703
+ end
704
+
705
+ it "converts them to nil" do
706
+ person.game.should be_nil
707
+ end
708
+ end
709
+
710
+ context "when setting the foreign key" do
711
+
712
+ let(:game) do
713
+ Game.new
714
+ end
715
+
716
+ before do
717
+ game.person_id = ""
718
+ end
719
+
720
+ it "converts it to nil" do
721
+ game.person_id.should be_nil
722
+ end
723
+ end
724
+ end
725
+
726
+ context "when the document is a references many" do
727
+
728
+ let(:person) do
729
+ Person.new
730
+ end
731
+
732
+ context "when setting the foreign key" do
733
+
734
+ let(:post) do
735
+ Post.new
736
+ end
737
+
738
+ before do
739
+ post.person_id = ""
740
+ end
741
+
742
+ it "converts it to nil" do
743
+ post.person.should be_nil
744
+ end
745
+ end
746
+
747
+ context "when setting the _ids accessor" do
748
+
749
+ let(:post) do
750
+ Post.create
751
+ end
752
+
753
+ before do
754
+ person.post_ids = [ "" ]
755
+ end
756
+
757
+ it "ignore blank values" do
758
+ person.post_ids.should be_empty
759
+ end
760
+ end
761
+ end
762
+
763
+ context "when the document is a references many to many" do
764
+
765
+ let(:person) do
766
+ Person.new
767
+ end
768
+
769
+ context "when setting the foreign key" do
770
+
771
+ before do
772
+ person.preference_ids = [ "", "" ]
773
+ end
774
+
775
+ it "does not add them" do
776
+ person.preference_ids.should be_empty
777
+ end
778
+ end
779
+ end
780
+ end
781
+
782
+ context "when setting association foreign keys" do
783
+
784
+ let(:game) do
785
+ Game.new
786
+ end
787
+
788
+ let(:person) do
789
+ Person.create
790
+ end
791
+
792
+ context "when value is an empty string" do
793
+
794
+ before do
795
+ game.person_id = ""
796
+ game.save
797
+ end
798
+
799
+ it "sets the foreign key to empty" do
800
+ expect(game.reload.person_id).to be_blank
801
+ end
802
+ end
803
+
804
+ context "when value is a populated string" do
805
+
806
+ before do
807
+ game.person_id = person.id.to_s
808
+ game.save
809
+ end
810
+
811
+ it "sets the foreign key as ObjectID" do
812
+ expect(game.reload.person_id).to eq(person.id)
813
+ end
814
+ end
815
+
816
+ context "when value is a ObjectID" do
817
+
818
+ before do
819
+ game.person_id = person.id
820
+ game.save
821
+ end
822
+
823
+ it "keeps the the foreign key as ObjectID" do
824
+ expect(game.reload.person_id).to eq(person.id)
825
+ end
826
+ end
827
+
828
+ context "when setting ids multiple times on the relation itself" do
829
+
830
+ before do
831
+ game.person = person.id
832
+ game.person = person.id
833
+ end
834
+
835
+ it "sets the relation foreign key" do
836
+ expect(game.person_id).to eq(person.id)
837
+ end
838
+
839
+ it "sets the appropriate relation" do
840
+ expect(game.person).to eq(person)
841
+ end
842
+ end
843
+ end
844
+ end