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,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Options do
4
+
5
+ describe ".validate!" do
6
+
7
+ let(:relation) do
8
+ Mongoid::Relations::Embedded::Many
9
+ end
10
+
11
+ context "when the options are valid for the relation" do
12
+
13
+ let(:options) do
14
+ { relation: relation, as: :addressable }
15
+ end
16
+
17
+ it "returns true" do
18
+ described_class.validate!(options).should be_true
19
+ end
20
+ end
21
+
22
+ context "when the options are invalid for the relation" do
23
+
24
+ let(:options) do
25
+ { name: :addresses, relation: relation, polymorphic: true }
26
+ end
27
+
28
+ it "raises an error" do
29
+ expect {
30
+ described_class.validate!(options)
31
+ }.to raise_error(Mongoid::Errors::InvalidOptions)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,132 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Polymorphic do
4
+
5
+ describe "#polymorph" do
6
+
7
+ let(:klass) do
8
+ Class.new.tap { |c| c.send(:include, Mongoid::Document) }
9
+ end
10
+
11
+ context "when the relation is polymorphic" do
12
+
13
+ context "when the relation stores a foreign key" do
14
+
15
+ let(:metadata) do
16
+ Mongoid::Relations::Metadata.new(
17
+ name: :ratable,
18
+ polymorphic: true,
19
+ relation: Mongoid::Relations::Referenced::In
20
+ )
21
+ end
22
+
23
+ let!(:polymorphed) do
24
+ klass.polymorph(metadata)
25
+ end
26
+
27
+ it "sets polymorphic to true" do
28
+ klass.should be_polymorphic
29
+ end
30
+
31
+ it "adds the foreign key type field" do
32
+ klass.fields["ratable_type"].should_not be_nil
33
+ end
34
+
35
+ it "adds the foreign key inverse field field" do
36
+ klass.fields["ratable_field"].should_not be_nil
37
+ end
38
+
39
+ it "returns self" do
40
+ polymorphed.should eq(klass)
41
+ end
42
+ end
43
+
44
+ context "when the relation does not store a foreign key" do
45
+
46
+ let(:metadata) do
47
+ Mongoid::Relations::Metadata.new(
48
+ name: :ratings,
49
+ as: :ratable,
50
+ relation: Mongoid::Relations::Referenced::Many
51
+ )
52
+ end
53
+
54
+ before do
55
+ klass.polymorph(metadata)
56
+ end
57
+
58
+ it "sets polymorphic to true" do
59
+ klass.should be_polymorphic
60
+ end
61
+
62
+ it "does not add the foreign key type field" do
63
+ klass.fields["ratable_type"].should be_nil
64
+ end
65
+
66
+ it "does not add the foreign key inverse field field" do
67
+ klass.fields["ratable_field"].should be_nil
68
+ end
69
+ end
70
+ end
71
+
72
+ context "when the relation is not polymorphic" do
73
+
74
+ let(:metadata) do
75
+ Mongoid::Relations::Metadata.new(
76
+ name: :ratings,
77
+ relation: Mongoid::Relations::Referenced::Many
78
+ )
79
+ end
80
+
81
+ before do
82
+ klass.polymorph(metadata)
83
+ end
84
+
85
+ it "sets polymorphic to false" do
86
+ klass.should_not be_polymorphic
87
+ end
88
+
89
+ it "does not add the foreign key type field" do
90
+ klass.fields["ratable_type"].should be_nil
91
+ end
92
+
93
+ it "does not add the foreign key inverse field field" do
94
+ klass.fields["ratable_field"].should be_nil
95
+ end
96
+ end
97
+ end
98
+
99
+ describe ".polymorphic?" do
100
+
101
+ context "when the document is in a polymorphic relation" do
102
+
103
+ it "returns true" do
104
+ Movie.should be_polymorphic
105
+ end
106
+ end
107
+
108
+ context "when the document is not in a polymorphic relation" do
109
+
110
+ it "returns false" do
111
+ Survey.should_not be_polymorphic
112
+ end
113
+ end
114
+ end
115
+
116
+ describe "#polymorphic?" do
117
+
118
+ context "when the document is in a polymorphic relation" do
119
+
120
+ it "returns true" do
121
+ Movie.new.should be_polymorphic
122
+ end
123
+ end
124
+
125
+ context "when the document is not in a polymorphic relation" do
126
+
127
+ it "returns false" do
128
+ Survey.new.should_not be_polymorphic
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Proxy do
4
+
5
+ describe "#extend" do
6
+
7
+ before(:all) do
8
+ Person.reset_callbacks(:validate)
9
+ module Testable
10
+ end
11
+ end
12
+
13
+ after(:all) do
14
+ Object.send(:remove_const, :Testable)
15
+ end
16
+
17
+ let(:person) do
18
+ Person.create
19
+ end
20
+
21
+ let(:name) do
22
+ person.build_name
23
+ end
24
+
25
+ before do
26
+ name.namable.extend(Testable)
27
+ end
28
+
29
+ it "extends the proxied object" do
30
+ person.should be_a(Testable)
31
+ end
32
+
33
+ context "when extending from the relation definition" do
34
+
35
+ let!(:address) do
36
+ person.addresses.create(street: "hobrecht")
37
+ end
38
+
39
+ let(:found) do
40
+ person.addresses.find_by_street("hobrecht")
41
+ end
42
+
43
+ it "extends the proxy" do
44
+ found.should eq(address)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,1501 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Referenced::In do
4
+
5
+ before(:all) do
6
+ Person.reset_callbacks(:validate)
7
+ end
8
+
9
+ let(:person) do
10
+ Person.create
11
+ end
12
+
13
+ describe "#=" do
14
+
15
+ context "when the relation is named target" do
16
+
17
+ let(:target) do
18
+ User.new
19
+ end
20
+
21
+ context "when the relation is referenced from an embeds many" do
22
+
23
+ context "when setting via create" do
24
+
25
+ let(:service) do
26
+ person.services.create(target: target)
27
+ end
28
+
29
+ it "sets the target relation" do
30
+ service.target.should eq(target)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ context "when the inverse relation has no reference defined" do
37
+
38
+ let(:agent) do
39
+ Agent.new(title: "007")
40
+ end
41
+
42
+ let(:game) do
43
+ Game.new(name: "Donkey Kong")
44
+ end
45
+
46
+ before do
47
+ agent.game = game
48
+ end
49
+
50
+ it "sets the relation" do
51
+ agent.game.should eq(game)
52
+ end
53
+
54
+ it "sets the foreign_key" do
55
+ agent.game_id.should eq(game.id)
56
+ end
57
+ end
58
+
59
+ context "when referencing a document from an embedded document" do
60
+
61
+ let(:person) do
62
+ Person.create
63
+ end
64
+
65
+ let(:address) do
66
+ person.addresses.create(street: "Wienerstr")
67
+ end
68
+
69
+ let(:account) do
70
+ Account.create(name: "1", number: 1000000)
71
+ end
72
+
73
+ before do
74
+ address.account = account
75
+ end
76
+
77
+ it "sets the relation" do
78
+ address.account.should eq(account)
79
+ end
80
+
81
+ it "does not erase the metadata" do
82
+ address.metadata.should_not be_nil
83
+ end
84
+
85
+ it "allows saving of the embedded document" do
86
+ address.save.should be_true
87
+ end
88
+ end
89
+
90
+ context "when the parent is a references one" do
91
+
92
+ context "when the relation is not polymorphic" do
93
+
94
+ context "when the child is a new record" do
95
+
96
+ let(:person) do
97
+ Person.new
98
+ end
99
+
100
+ let(:game) do
101
+ Game.new
102
+ end
103
+
104
+ before do
105
+ game.person = person
106
+ end
107
+
108
+ it "sets the target of the relation" do
109
+ game.person.target.should eq(person)
110
+ end
111
+
112
+ it "sets the foreign key on the relation" do
113
+ game.person_id.should eq(person.id)
114
+ end
115
+
116
+ it "sets the base on the inverse relation" do
117
+ person.game.should eq(game)
118
+ end
119
+
120
+ it "sets the same instance on the inverse relation" do
121
+ person.game.should eql(game)
122
+ end
123
+
124
+ it "does not save the target" do
125
+ person.should_not be_persisted
126
+ end
127
+ end
128
+
129
+ context "when the child is not a new record" do
130
+
131
+ let(:person) do
132
+ Person.new
133
+ end
134
+
135
+ let(:game) do
136
+ Game.create
137
+ end
138
+
139
+ before do
140
+ game.person = person
141
+ end
142
+
143
+ it "sets the target of the relation" do
144
+ game.person.target.should eq(person)
145
+ end
146
+
147
+ it "sets the foreign key of the relation" do
148
+ game.person_id.should eq(person.id)
149
+ end
150
+
151
+ it "sets the base on the inverse relation" do
152
+ person.game.should eq(game)
153
+ end
154
+
155
+ it "sets the same instance on the inverse relation" do
156
+ person.game.should eql(game)
157
+ end
158
+
159
+ it "does not saves the target" do
160
+ person.should_not be_persisted
161
+ end
162
+ end
163
+ end
164
+
165
+ context "when the relation is polymorphic" do
166
+
167
+ context "when the parent is a subclass" do
168
+
169
+ let(:canvas) do
170
+ Canvas::Test.create
171
+ end
172
+
173
+ let(:comment) do
174
+ Comment.create(title: "test")
175
+ end
176
+
177
+ before do
178
+ comment.commentable = canvas
179
+ comment.save
180
+ end
181
+
182
+ it "sets the correct value in the type field" do
183
+ comment.commentable_type.should eq("Canvas::Test")
184
+ end
185
+
186
+ it "can retrieve the document from the database" do
187
+ comment.reload.commentable.should eq(canvas)
188
+ end
189
+ end
190
+
191
+ context "when the child is a new record" do
192
+
193
+ let(:bar) do
194
+ Bar.new
195
+ end
196
+
197
+ let(:rating) do
198
+ Rating.new
199
+ end
200
+
201
+ before do
202
+ rating.ratable = bar
203
+ end
204
+
205
+ it "sets the target of the relation" do
206
+ rating.ratable.target.should eq(bar)
207
+ end
208
+
209
+ it "sets the foreign key on the relation" do
210
+ rating.ratable_id.should eq(bar.id)
211
+ end
212
+
213
+ it "does not set the inverse of field on the relation" do
214
+ rating.ratable_field.should be_nil
215
+ end
216
+
217
+ it "sets the base on the inverse relation" do
218
+ bar.rating.should eq(rating)
219
+ end
220
+
221
+ it "sets the same instance on the inverse relation" do
222
+ bar.rating.should eql(rating)
223
+ end
224
+
225
+ it "does not save the target" do
226
+ bar.should_not be_persisted
227
+ end
228
+ end
229
+
230
+ context "when the child is not a new record" do
231
+
232
+ let(:bar) do
233
+ Bar.new
234
+ end
235
+
236
+ let(:rating) do
237
+ Rating.create
238
+ end
239
+
240
+ before do
241
+ rating.ratable = bar
242
+ end
243
+
244
+ it "sets the target of the relation" do
245
+ rating.ratable.target.should eq(bar)
246
+ end
247
+
248
+ it "sets the foreign key of the relation" do
249
+ rating.ratable_id.should eq(bar.id)
250
+ end
251
+
252
+ it "does not set the inverse of field on the relation" do
253
+ rating.ratable_field.should be_nil
254
+ end
255
+
256
+ it "sets the base on the inverse relation" do
257
+ bar.rating.should eq(rating)
258
+ end
259
+
260
+ it "sets the same instance on the inverse relation" do
261
+ bar.rating.should eql(rating)
262
+ end
263
+
264
+ it "does not saves the target" do
265
+ bar.should_not be_persisted
266
+ end
267
+ end
268
+ end
269
+ end
270
+
271
+ context "when the parent is a references many" do
272
+
273
+ context "when the relation is not polymorphic" do
274
+
275
+ context "when the child is a new record" do
276
+
277
+ let(:person) do
278
+ Person.new
279
+ end
280
+
281
+ let(:post) do
282
+ Post.new
283
+ end
284
+
285
+ before do
286
+ post.person = person
287
+ end
288
+
289
+ it "sets the target of the relation" do
290
+ post.person.target.should eq(person)
291
+ end
292
+
293
+ it "sets the foreign key on the relation" do
294
+ post.person_id.should eq(person.id)
295
+ end
296
+
297
+ it "does not save the target" do
298
+ person.should_not be_persisted
299
+ end
300
+ end
301
+
302
+ context "when the child is not a new record" do
303
+
304
+ let(:person) do
305
+ Person.new
306
+ end
307
+
308
+ let(:post) do
309
+ Post.create
310
+ end
311
+
312
+ before do
313
+ post.person = person
314
+ end
315
+
316
+ it "sets the target of the relation" do
317
+ post.person.target.should eq(person)
318
+ end
319
+
320
+ it "sets the foreign key of the relation" do
321
+ post.person_id.should eq(person.id)
322
+ end
323
+
324
+ it "does not saves the target" do
325
+ person.should_not be_persisted
326
+ end
327
+ end
328
+ end
329
+
330
+ context "when the relation is polymorphic" do
331
+
332
+ context "when multiple relations against the same class exist" do
333
+
334
+ let(:face) do
335
+ Face.new
336
+ end
337
+
338
+ let(:eye) do
339
+ Eye.new
340
+ end
341
+
342
+ it "raises an error" do
343
+ expect {
344
+ eye.eyeable = face
345
+ }.to raise_error(Mongoid::Errors::InvalidSetPolymorphicRelation)
346
+ end
347
+ end
348
+
349
+ context "when multiple relations of the same name but different class exist" do
350
+
351
+ let(:eye) do
352
+ Eye.new
353
+ end
354
+
355
+ let(:eye_bowl) do
356
+ EyeBowl.new
357
+ end
358
+
359
+ it "should assign as expected" do
360
+ eye.suspended_in = eye_bowl
361
+ eye.suspended_in.target.should eq(eye_bowl)
362
+ end
363
+ end
364
+
365
+ context "when one relation against the same class exists" do
366
+
367
+ context "when the child is a new record" do
368
+
369
+ let(:movie) do
370
+ Movie.new
371
+ end
372
+
373
+ let(:rating) do
374
+ Rating.new
375
+ end
376
+
377
+ before do
378
+ rating.ratable = movie
379
+ end
380
+
381
+ it "sets the target of the relation" do
382
+ rating.ratable.target.should eq(movie)
383
+ end
384
+
385
+ it "sets the foreign key on the relation" do
386
+ rating.ratable_id.should eq(movie.id)
387
+ end
388
+
389
+ it "does not save the target" do
390
+ movie.should_not be_persisted
391
+ end
392
+ end
393
+
394
+ context "when the child is not a new record" do
395
+
396
+ let(:movie) do
397
+ Movie.new
398
+ end
399
+
400
+ let(:rating) do
401
+ Rating.create
402
+ end
403
+
404
+ before do
405
+ rating.ratable = movie
406
+ end
407
+
408
+ it "sets the target of the relation" do
409
+ rating.ratable.target.should eq(movie)
410
+ end
411
+
412
+ it "sets the foreign key of the relation" do
413
+ rating.ratable_id.should eq(movie.id)
414
+ end
415
+
416
+ it "does not saves the target" do
417
+ movie.should_not be_persisted
418
+ end
419
+ end
420
+ end
421
+ end
422
+ end
423
+ end
424
+
425
+ describe "#= nil" do
426
+
427
+ context "when dependent is destroy" do
428
+
429
+ let(:account) do
430
+ Account.create
431
+ end
432
+
433
+ let(:drug) do
434
+ Drug.create
435
+ end
436
+
437
+ let(:person) do
438
+ Person.create
439
+ end
440
+
441
+ context "when relation is has_one" do
442
+
443
+ before do
444
+ Account.belongs_to :person, dependent: :destroy
445
+ Person.has_one :account
446
+ person.account = account
447
+ person.save
448
+ end
449
+
450
+ after :all do
451
+ Account.belongs_to :person, dependent: :nullify
452
+ Person.has_one :account, validate: false
453
+ end
454
+
455
+ context "when parent exists" do
456
+
457
+ context "when child is destroyed" do
458
+
459
+ before do
460
+ account.delete
461
+ end
462
+
463
+ it "deletes child" do
464
+ account.should be_destroyed
465
+ end
466
+
467
+ it "deletes parent" do
468
+ person.should be_destroyed
469
+ end
470
+ end
471
+ end
472
+ end
473
+
474
+ context "when relation is has_many" do
475
+
476
+ before do
477
+ Drug.belongs_to :person, dependent: :destroy
478
+ Person.has_many :drugs
479
+ person.drugs = [drug]
480
+ person.save
481
+ end
482
+
483
+ after :all do
484
+ Drug.belongs_to :person, dependent: :nullify
485
+ Person.has_many :drugs, validate: false
486
+ end
487
+
488
+ context "when parent exists" do
489
+
490
+ context "when child is destroyed" do
491
+
492
+ before do
493
+ drug.delete
494
+ end
495
+
496
+ it "deletes child" do
497
+ drug.should be_destroyed
498
+ end
499
+
500
+ it "deletes parent" do
501
+ person.should be_destroyed
502
+ end
503
+ end
504
+ end
505
+ end
506
+ end
507
+
508
+ context "when dependent is delete" do
509
+
510
+ let(:account) do
511
+ Account.create
512
+ end
513
+
514
+ let(:drug) do
515
+ Drug.create
516
+ end
517
+
518
+ let(:person) do
519
+ Person.create
520
+ end
521
+
522
+ context "when relation is has_one" do
523
+
524
+ before do
525
+ Account.belongs_to :person, dependent: :delete
526
+ Person.has_one :account
527
+ person.account = account
528
+ person.save
529
+ end
530
+
531
+ after :all do
532
+ Account.belongs_to :person, dependent: :nullify
533
+ Person.has_one :account, validate: false
534
+ end
535
+
536
+ context "when parent is persisted" do
537
+
538
+ context "when child is deleted" do
539
+
540
+ before do
541
+ account.delete
542
+ end
543
+
544
+ it "deletes child" do
545
+ account.should be_destroyed
546
+ end
547
+
548
+ it "deletes parent" do
549
+ person.should be_destroyed
550
+ end
551
+ end
552
+ end
553
+ end
554
+
555
+ context "when relation is has_many" do
556
+
557
+ before do
558
+ Drug.belongs_to :person, dependent: :delete
559
+ Person.has_many :drugs
560
+ person.drugs = [drug]
561
+ person.save
562
+ end
563
+
564
+ after :all do
565
+ Drug.belongs_to :person, dependent: :nullify
566
+ Person.has_many :drugs, validate: false
567
+ end
568
+
569
+ context "when parent exists" do
570
+
571
+ context "when child is destroyed" do
572
+
573
+ before do
574
+ drug.delete
575
+ end
576
+
577
+ it "deletes child" do
578
+ drug.should be_destroyed
579
+ end
580
+
581
+ it "deletes parent" do
582
+ person.should be_destroyed
583
+ end
584
+ end
585
+ end
586
+ end
587
+ end
588
+
589
+ context "when dependent is nullify" do
590
+
591
+ let(:account) do
592
+ Account.create
593
+ end
594
+
595
+ let(:drug) do
596
+ Drug.create
597
+ end
598
+
599
+ let(:person) do
600
+ Person.create
601
+ end
602
+
603
+ context "when relation is has_one" do
604
+
605
+ before do
606
+ Account.belongs_to :person, dependent: :nullify
607
+ Person.has_one :account
608
+ person.account = account
609
+ person.save
610
+ end
611
+
612
+ context "when parent is persisted" do
613
+
614
+ context "when child is deleted" do
615
+
616
+ before do
617
+ account.delete
618
+ end
619
+
620
+ it "deletes child" do
621
+ account.should be_destroyed
622
+ end
623
+
624
+ it "doesn't delete parent" do
625
+ person.should_not be_destroyed
626
+ end
627
+
628
+ it "removes the link" do
629
+ person.account.should be_nil
630
+ end
631
+ end
632
+ end
633
+ end
634
+
635
+ context "when relation is has_many" do
636
+
637
+ before do
638
+ Drug.belongs_to :person, dependent: :nullify
639
+ Person.has_many :drugs
640
+ person.drugs = [drug]
641
+ person.save
642
+ end
643
+
644
+ context "when parent exists" do
645
+
646
+ context "when child is destroyed" do
647
+
648
+ before do
649
+ drug.delete
650
+ end
651
+
652
+ it "deletes child" do
653
+ drug.should be_destroyed
654
+ end
655
+
656
+ it "doesn't deletes parent" do
657
+ person.should_not be_destroyed
658
+ end
659
+
660
+ it "removes the link" do
661
+ person.drugs.should eq([])
662
+ end
663
+ end
664
+ end
665
+ end
666
+ end
667
+
668
+ context "when the inverse relation has no reference defined" do
669
+
670
+ let(:agent) do
671
+ Agent.new(title: "007")
672
+ end
673
+
674
+ let(:game) do
675
+ Game.new(name: "Donkey Kong")
676
+ end
677
+
678
+ before do
679
+ agent.game = game
680
+ agent.game = nil
681
+ end
682
+
683
+ it "removes the relation" do
684
+ agent.game.should be_nil
685
+ end
686
+
687
+ it "removes the foreign_key" do
688
+ agent.game_id.should be_nil
689
+ end
690
+ end
691
+
692
+ context "when the parent is a references one" do
693
+
694
+ context "when the relation is not polymorphic" do
695
+
696
+ context "when the parent is a new record" do
697
+
698
+ let(:person) do
699
+ Person.new
700
+ end
701
+
702
+ let(:game) do
703
+ Game.new
704
+ end
705
+
706
+ before do
707
+ game.person = person
708
+ game.person = nil
709
+ end
710
+
711
+ it "sets the relation to nil" do
712
+ game.person.should be_nil
713
+ end
714
+
715
+ it "removed the inverse relation" do
716
+ person.game.should be_nil
717
+ end
718
+
719
+ it "removes the foreign key value" do
720
+ game.person_id.should be_nil
721
+ end
722
+ end
723
+
724
+ context "when the parent is not a new record" do
725
+
726
+ let(:person) do
727
+ Person.create
728
+ end
729
+
730
+ let(:game) do
731
+ Game.create
732
+ end
733
+
734
+ before do
735
+ game.person = person
736
+ game.person = nil
737
+ end
738
+
739
+ it "sets the relation to nil" do
740
+ game.person.should be_nil
741
+ end
742
+
743
+ it "removed the inverse relation" do
744
+ person.game.should be_nil
745
+ end
746
+
747
+ it "removes the foreign key value" do
748
+ game.person_id.should be_nil
749
+ end
750
+
751
+ it "does not delete the child" do
752
+ game.should_not be_destroyed
753
+ end
754
+ end
755
+ end
756
+
757
+ context "when the relation is polymorphic" do
758
+
759
+ context "when multiple relations against the same class exist" do
760
+
761
+ context "when the parent is a new record" do
762
+
763
+ let(:face) do
764
+ Face.new
765
+ end
766
+
767
+ let(:eye) do
768
+ Eye.new
769
+ end
770
+
771
+ before do
772
+ face.left_eye = eye
773
+ eye.eyeable = nil
774
+ end
775
+
776
+ it "sets the relation to nil" do
777
+ eye.eyeable.should be_nil
778
+ end
779
+
780
+ it "removed the inverse relation" do
781
+ face.left_eye.should be_nil
782
+ end
783
+
784
+ it "removes the foreign key value" do
785
+ eye.eyeable_id.should be_nil
786
+ end
787
+ end
788
+
789
+ context "when the parent is not a new record" do
790
+
791
+ let(:face) do
792
+ Face.new
793
+ end
794
+
795
+ let(:eye) do
796
+ Eye.create
797
+ end
798
+
799
+ before do
800
+ face.left_eye = eye
801
+ eye.eyeable = nil
802
+ end
803
+
804
+ it "sets the relation to nil" do
805
+ eye.eyeable.should be_nil
806
+ end
807
+
808
+ it "removed the inverse relation" do
809
+ face.left_eye.should be_nil
810
+ end
811
+
812
+ it "removes the foreign key value" do
813
+ eye.eyeable_id.should be_nil
814
+ end
815
+ end
816
+ end
817
+
818
+ context "when one relation against the same class exists" do
819
+
820
+ context "when the parent is a new record" do
821
+
822
+ let(:bar) do
823
+ Bar.new
824
+ end
825
+
826
+ let(:rating) do
827
+ Rating.new
828
+ end
829
+
830
+ before do
831
+ rating.ratable = bar
832
+ rating.ratable = nil
833
+ end
834
+
835
+ it "sets the relation to nil" do
836
+ rating.ratable.should be_nil
837
+ end
838
+
839
+ it "removed the inverse relation" do
840
+ bar.rating.should be_nil
841
+ end
842
+
843
+ it "removes the foreign key value" do
844
+ rating.ratable_id.should be_nil
845
+ end
846
+ end
847
+
848
+ context "when the parent is not a new record" do
849
+
850
+ let(:bar) do
851
+ Bar.new
852
+ end
853
+
854
+ let(:rating) do
855
+ Rating.create
856
+ end
857
+
858
+ before do
859
+ rating.ratable = bar
860
+ rating.ratable = nil
861
+ end
862
+
863
+ it "sets the relation to nil" do
864
+ rating.ratable.should be_nil
865
+ end
866
+
867
+ it "removed the inverse relation" do
868
+ bar.rating.should be_nil
869
+ end
870
+
871
+ it "removes the foreign key value" do
872
+ rating.ratable_id.should be_nil
873
+ end
874
+ end
875
+ end
876
+ end
877
+ end
878
+
879
+ context "when the parent is a references many" do
880
+
881
+ context "when the relation is not polymorphic" do
882
+
883
+ context "when the parent is a new record" do
884
+
885
+ let(:person) do
886
+ Person.new
887
+ end
888
+
889
+ let(:post) do
890
+ Post.new
891
+ end
892
+
893
+ before do
894
+ post.person = person
895
+ post.person = nil
896
+ end
897
+
898
+ it "sets the relation to nil" do
899
+ post.person.should be_nil
900
+ end
901
+
902
+ it "removed the inverse relation" do
903
+ person.posts.should be_empty
904
+ end
905
+
906
+ it "removes the foreign key value" do
907
+ post.person_id.should be_nil
908
+ end
909
+ end
910
+
911
+ context "when the parent is not a new record" do
912
+
913
+ let(:person) do
914
+ Person.new
915
+ end
916
+
917
+ let(:post) do
918
+ Post.create
919
+ end
920
+
921
+ before do
922
+ post.person = person
923
+ post.person = nil
924
+ end
925
+
926
+ it "sets the relation to nil" do
927
+ post.person.should be_nil
928
+ end
929
+
930
+ it "removed the inverse relation" do
931
+ person.posts.should be_empty
932
+ end
933
+
934
+ it "removes the foreign key value" do
935
+ post.person_id.should be_nil
936
+ end
937
+ end
938
+ end
939
+
940
+ context "when the relation is polymorphic" do
941
+
942
+ context "when the parent is a new record" do
943
+
944
+ let(:movie) do
945
+ Movie.new
946
+ end
947
+
948
+ let(:rating) do
949
+ Rating.new
950
+ end
951
+
952
+ before do
953
+ rating.ratable = movie
954
+ rating.ratable = nil
955
+ end
956
+
957
+ it "sets the relation to nil" do
958
+ rating.ratable.should be_nil
959
+ end
960
+
961
+ it "removed the inverse relation" do
962
+ movie.ratings.should be_empty
963
+ end
964
+
965
+ it "removes the foreign key value" do
966
+ rating.ratable_id.should be_nil
967
+ end
968
+ end
969
+
970
+ context "when the parent is not a new record" do
971
+
972
+ let(:movie) do
973
+ Movie.new
974
+ end
975
+
976
+ let(:rating) do
977
+ Rating.create
978
+ end
979
+
980
+ before do
981
+ rating.ratable = movie
982
+ rating.ratable = nil
983
+ end
984
+
985
+ it "sets the relation to nil" do
986
+ rating.ratable.should be_nil
987
+ end
988
+
989
+ it "removed the inverse relation" do
990
+ movie.ratings.should be_empty
991
+ end
992
+
993
+ it "removes the foreign key value" do
994
+ rating.ratable_id.should be_nil
995
+ end
996
+ end
997
+ end
998
+ end
999
+ end
1000
+
1001
+ describe ".builder" do
1002
+
1003
+ let(:builder_klass) do
1004
+ Mongoid::Relations::Builders::Referenced::In
1005
+ end
1006
+
1007
+ let(:document) do
1008
+ stub
1009
+ end
1010
+
1011
+ let(:metadata) do
1012
+ stub(extension?: false)
1013
+ end
1014
+
1015
+ it "returns the embedded in builder" do
1016
+ described_class.builder(nil, metadata, document).should
1017
+ be_a_kind_of(builder_klass)
1018
+ end
1019
+ end
1020
+
1021
+ describe ".eager_load" do
1022
+
1023
+ before do
1024
+ Mongoid.identity_map_enabled = true
1025
+ end
1026
+
1027
+ after do
1028
+ Mongoid.identity_map_enabled = false
1029
+ end
1030
+
1031
+ context "when the relation is not polymorphic" do
1032
+
1033
+ let!(:person) do
1034
+ Person.create
1035
+ end
1036
+
1037
+ let!(:post) do
1038
+ person.posts.create(title: "testing")
1039
+ end
1040
+
1041
+ let(:metadata) do
1042
+ Post.relations["person"]
1043
+ end
1044
+
1045
+ let(:eager) do
1046
+ described_class.eager_load(metadata, Post.all)
1047
+ end
1048
+
1049
+ let!(:map) do
1050
+ Mongoid::IdentityMap.get(Person, person.id)
1051
+ end
1052
+
1053
+ it "puts the document in the identity map" do
1054
+ map.should eq(person)
1055
+ end
1056
+ end
1057
+
1058
+ context "when the relation is polymorphic" do
1059
+
1060
+ let(:metadata) do
1061
+ Rating.relations["ratable"]
1062
+ end
1063
+
1064
+ it "raises an error" do
1065
+ expect {
1066
+ described_class.eager_load(metadata, Rating.all)
1067
+ }.to raise_error(Mongoid::Errors::EagerLoad)
1068
+ end
1069
+ end
1070
+
1071
+ context "when the ids has been duplicated" do
1072
+
1073
+ let!(:person) do
1074
+ Person.create
1075
+ end
1076
+
1077
+ let!(:posts) do
1078
+ 2.times {|i| person.posts.create(title: "testing#{i}") }
1079
+ person.posts
1080
+ end
1081
+
1082
+ let(:metadata) do
1083
+ Post.relations["person"]
1084
+ end
1085
+
1086
+ let(:eager) do
1087
+ described_class.eager_load(metadata, posts.map(&:person_id))
1088
+ end
1089
+
1090
+ it "duplication should be removed" do
1091
+ eager.count.should eq(1)
1092
+ end
1093
+ end
1094
+ end
1095
+
1096
+ describe ".embedded?" do
1097
+
1098
+ it "returns false" do
1099
+ described_class.should_not be_embedded
1100
+ end
1101
+ end
1102
+
1103
+ describe ".foreign_key_suffix" do
1104
+
1105
+ it "returns _id" do
1106
+ described_class.foreign_key_suffix.should eq("_id")
1107
+ end
1108
+ end
1109
+
1110
+ describe ".macro" do
1111
+
1112
+ it "returns belongs_to" do
1113
+ described_class.macro.should eq(:belongs_to)
1114
+ end
1115
+ end
1116
+
1117
+ describe "#respond_to?" do
1118
+
1119
+ let(:person) do
1120
+ Person.new
1121
+ end
1122
+
1123
+ let(:game) do
1124
+ person.build_game(name: "Tron")
1125
+ end
1126
+
1127
+ let(:document) do
1128
+ game.person
1129
+ end
1130
+
1131
+ Mongoid::Document.public_instance_methods(true).each do |method|
1132
+
1133
+ context "when checking #{method}" do
1134
+
1135
+ it "returns true" do
1136
+ document.respond_to?(method).should be_true
1137
+ end
1138
+ end
1139
+ end
1140
+ end
1141
+
1142
+ describe ".stores_foreign_key?" do
1143
+
1144
+ it "returns true" do
1145
+ described_class.stores_foreign_key?.should be_true
1146
+ end
1147
+ end
1148
+
1149
+ describe ".valid_options" do
1150
+
1151
+ it "returns the valid options" do
1152
+ described_class.valid_options.should eq(
1153
+ [
1154
+ :autobuild,
1155
+ :autosave,
1156
+ :dependent,
1157
+ :foreign_key,
1158
+ :index,
1159
+ :polymorphic,
1160
+ :primary_key,
1161
+ :touch
1162
+ ]
1163
+ )
1164
+ end
1165
+ end
1166
+
1167
+ describe ".validation_default" do
1168
+
1169
+ it "returns false" do
1170
+ described_class.validation_default.should be_false
1171
+ end
1172
+ end
1173
+
1174
+ context "when the relation is self referencing" do
1175
+
1176
+ let(:game_one) do
1177
+ Game.new(name: "Diablo")
1178
+ end
1179
+
1180
+ let(:game_two) do
1181
+ Game.new(name: "Warcraft")
1182
+ end
1183
+
1184
+ context "when setting the parent" do
1185
+
1186
+ before do
1187
+ game_one.parent = game_two
1188
+ end
1189
+
1190
+ it "sets the parent" do
1191
+ game_one.parent.should eq(game_two)
1192
+ end
1193
+
1194
+ it "does not set the parent recursively" do
1195
+ game_two.parent.should be_nil
1196
+ end
1197
+ end
1198
+ end
1199
+
1200
+ context "when the relation belongs to a has many and has one" do
1201
+
1202
+ before(:all) do
1203
+ class A
1204
+ include Mongoid::Document
1205
+ has_many :bs, inverse_of: :a
1206
+ end
1207
+
1208
+ class B
1209
+ include Mongoid::Document
1210
+ belongs_to :a, inverse_of: :bs
1211
+ belongs_to :c, inverse_of: :b
1212
+ end
1213
+
1214
+ class C
1215
+ include Mongoid::Document
1216
+ has_one :b, inverse_of: :c
1217
+ end
1218
+ end
1219
+
1220
+ after(:all) do
1221
+ Object.send(:remove_const, :A)
1222
+ Object.send(:remove_const, :B)
1223
+ Object.send(:remove_const, :C)
1224
+ end
1225
+
1226
+ context "when setting the has one" do
1227
+
1228
+ let(:a) do
1229
+ A.new
1230
+ end
1231
+
1232
+ let(:b) do
1233
+ B.new
1234
+ end
1235
+
1236
+ let(:c) do
1237
+ C.new
1238
+ end
1239
+
1240
+ before do
1241
+ b.c = c
1242
+ end
1243
+
1244
+ context "when subsequently setting the has many" do
1245
+
1246
+ before do
1247
+ b.a = a
1248
+ end
1249
+
1250
+ context "when setting the has one again" do
1251
+
1252
+ before do
1253
+ b.c = c
1254
+ end
1255
+
1256
+ it "allows the reset of the has one" do
1257
+ b.c.should eq(c)
1258
+ end
1259
+ end
1260
+ end
1261
+ end
1262
+ end
1263
+
1264
+ context "when replacing the relation with another" do
1265
+
1266
+ let!(:person) do
1267
+ Person.create
1268
+ end
1269
+
1270
+ let!(:post) do
1271
+ Post.create(title: "test")
1272
+ end
1273
+
1274
+ let!(:game) do
1275
+ person.create_game(name: "Tron")
1276
+ end
1277
+
1278
+ before do
1279
+ post.person = game.person
1280
+ post.save
1281
+ end
1282
+
1283
+ it "clones the relation" do
1284
+ post.person.should eq(person)
1285
+ end
1286
+
1287
+ it "sets the foreign key" do
1288
+ post.person_id.should eq(person.id)
1289
+ end
1290
+
1291
+ it "does not remove the previous relation" do
1292
+ game.person.should eq(person)
1293
+ end
1294
+
1295
+ it "does not remove the previous foreign key" do
1296
+ game.person_id.should eq(person.id)
1297
+ end
1298
+
1299
+ context "when reloading" do
1300
+
1301
+ before do
1302
+ post.reload
1303
+ game.reload
1304
+ end
1305
+
1306
+ it "persists the relation" do
1307
+ post.reload.person.should eq(person)
1308
+ end
1309
+
1310
+ it "persists the foreign key" do
1311
+ post.reload.person_id.should eq(game.person_id)
1312
+ end
1313
+
1314
+ it "does not remove the previous relation" do
1315
+ game.person.should eq(person)
1316
+ end
1317
+
1318
+ it "does not remove the previous foreign key" do
1319
+ game.person_id.should eq(person.id)
1320
+ end
1321
+ end
1322
+ end
1323
+
1324
+ context "when the document belongs to a has one and has many" do
1325
+
1326
+ let(:movie) do
1327
+ Movie.create(name: "Infernal Affairs")
1328
+ end
1329
+
1330
+ let(:account) do
1331
+ Account.create(name: "Leung")
1332
+ end
1333
+
1334
+ context "when creating the document" do
1335
+
1336
+ let(:comment) do
1337
+ Comment.create(movie: movie, account: account)
1338
+ end
1339
+
1340
+ it "sets the correct has one" do
1341
+ comment.account.should eq(account)
1342
+ end
1343
+
1344
+ it "sets the correct has many" do
1345
+ comment.movie.should eq(movie)
1346
+ end
1347
+ end
1348
+ end
1349
+
1350
+ context "when reloading the relation" do
1351
+
1352
+ let!(:person_one) do
1353
+ Person.create
1354
+ end
1355
+
1356
+ let!(:person_two) do
1357
+ Person.create(title: "Sir")
1358
+ end
1359
+
1360
+ let!(:game) do
1361
+ Game.create(name: "Starcraft 2")
1362
+ end
1363
+
1364
+ before do
1365
+ game.person = person_one
1366
+ game.save
1367
+ end
1368
+
1369
+ context "when the relation references the same document" do
1370
+
1371
+ before do
1372
+ Person.collection.find({ _id: person_one.id }).
1373
+ update({ "$set" => { title: "Madam" }})
1374
+ end
1375
+
1376
+ let(:reloaded) do
1377
+ game.person(true)
1378
+ end
1379
+
1380
+ it "reloads the document from the database" do
1381
+ reloaded.title.should eq("Madam")
1382
+ end
1383
+
1384
+ it "sets a new document instance" do
1385
+ reloaded.should_not equal(person_one)
1386
+ end
1387
+ end
1388
+
1389
+ context "when the relation references a different document" do
1390
+
1391
+ before do
1392
+ game.person_id = person_two.id
1393
+ game.save
1394
+ end
1395
+
1396
+ let(:reloaded) do
1397
+ game.person(true)
1398
+ end
1399
+
1400
+ it "reloads the new document from the database" do
1401
+ reloaded.title.should eq("Sir")
1402
+ end
1403
+
1404
+ it "sets a new document instance" do
1405
+ reloaded.should_not equal(person_one)
1406
+ end
1407
+ end
1408
+ end
1409
+
1410
+ context "when the parent and child are persisted" do
1411
+
1412
+ context "when the identity map is enabled" do
1413
+
1414
+ before do
1415
+ Mongoid.identity_map_enabled = true
1416
+ end
1417
+
1418
+ after do
1419
+ Mongoid.identity_map_enabled = false
1420
+ end
1421
+
1422
+ let(:series) do
1423
+ Series.create
1424
+ end
1425
+
1426
+ let!(:book_one) do
1427
+ series.books.create
1428
+ end
1429
+
1430
+ let!(:book_two) do
1431
+ series.books.create
1432
+ end
1433
+
1434
+ let(:id) do
1435
+ Book.first.id
1436
+ end
1437
+
1438
+ context "when asking for the inverse multiple times" do
1439
+
1440
+ before do
1441
+ Book.find(id).series.books.to_a
1442
+ end
1443
+
1444
+ it "does not append and save duplicate docs" do
1445
+ Book.find(id).series.books.to_a.length.should eq(2)
1446
+ end
1447
+
1448
+ it "returns the same documents from the map" do
1449
+ Book.find(id).should equal(Book.find(id))
1450
+ end
1451
+ end
1452
+ end
1453
+ end
1454
+
1455
+ context "when creating with a reference to an integer id parent" do
1456
+
1457
+ let!(:jar) do
1458
+ Jar.create do |doc|
1459
+ doc._id = 1
1460
+ end
1461
+ end
1462
+
1463
+ let(:cookie) do
1464
+ Cookie.create(jar_id: "1")
1465
+ end
1466
+
1467
+ it "allows strings to be passed as the id" do
1468
+ cookie.jar.should eq(jar)
1469
+ end
1470
+
1471
+ it "persists the relation" do
1472
+ cookie.reload.jar.should eq(jar)
1473
+ end
1474
+ end
1475
+
1476
+ context "when setting the relation via the foreign key" do
1477
+
1478
+ context "when the relation exists" do
1479
+
1480
+ let!(:person_one) do
1481
+ Person.create
1482
+ end
1483
+
1484
+ let!(:person_two) do
1485
+ Person.create
1486
+ end
1487
+
1488
+ let!(:game) do
1489
+ Game.create(person: person_one)
1490
+ end
1491
+
1492
+ before do
1493
+ game.person_id = person_two.id
1494
+ end
1495
+
1496
+ it "sets the new document on the relation" do
1497
+ game.person.should eq(person_two)
1498
+ end
1499
+ end
1500
+ end
1501
+ end