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,1331 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Referenced::One do
4
+
5
+ describe "#=" do
6
+
7
+ context "when the relationship is an illegal embedded reference" do
8
+
9
+ let(:game) do
10
+ Game.new
11
+ end
12
+
13
+ let(:video) do
14
+ Video.new
15
+ end
16
+
17
+ it "raises a mixed relation error" do
18
+ expect {
19
+ game.video = video
20
+ }.to raise_error(Mongoid::Errors::MixedRelations)
21
+ end
22
+ end
23
+
24
+ context "when the relation is cyclic" do
25
+
26
+ let(:user) do
27
+ User.new
28
+ end
29
+
30
+ let(:role) do
31
+ Role.new
32
+ end
33
+
34
+ before do
35
+ user.role = role
36
+ end
37
+
38
+ it "does not raise an error" do
39
+ user.role.should eq(role)
40
+ end
41
+ end
42
+
43
+ context "when the relation is not polymorphic" do
44
+
45
+ context "when the parent is a new record" do
46
+
47
+ let(:person) do
48
+ Person.new
49
+ end
50
+
51
+ let(:game) do
52
+ Game.new
53
+ end
54
+
55
+ let(:metadata) do
56
+ Game.relations["person"]
57
+ end
58
+
59
+ before do
60
+ metadata.should_receive(:criteria).never
61
+ person.game = game
62
+ end
63
+
64
+ it "sets the target of the relation" do
65
+ person.game.target.should eq(game)
66
+ end
67
+
68
+ it "sets the foreign key on the relation" do
69
+ game.person_id.should eq(person.id)
70
+ end
71
+
72
+ it "sets the base on the inverse relation" do
73
+ game.person.should eq(person)
74
+ end
75
+
76
+ it "sets the same instance on the inverse relation" do
77
+ game.person.should eql(person)
78
+ end
79
+
80
+ it "does not save the target" do
81
+ game.should_not be_persisted
82
+ end
83
+ end
84
+
85
+ context "when the parent is not a new record" do
86
+
87
+ let(:person) do
88
+ Person.create
89
+ end
90
+
91
+ let(:game) do
92
+ Game.new
93
+ end
94
+
95
+ before do
96
+ person.game = game
97
+ end
98
+
99
+ it "sets the target of the relation" do
100
+ person.game.target.should eq(game)
101
+ end
102
+
103
+ it "sets the foreign key of the relation" do
104
+ game.person_id.should eq(person.id)
105
+ end
106
+
107
+ it "sets the base on the inverse relation" do
108
+ game.person.should eq(person)
109
+ end
110
+
111
+ it "sets the same instance on the inverse relation" do
112
+ game.person.should eql(person)
113
+ end
114
+
115
+ it "saves the target" do
116
+ game.should be_persisted
117
+ end
118
+
119
+ context "when reloading the parent" do
120
+
121
+ before do
122
+ person.reload
123
+ end
124
+
125
+ context "when setting a new document on the relation" do
126
+
127
+ before do
128
+ person.game = Game.new
129
+ end
130
+
131
+ it "detaches the previous relation" do
132
+ expect {
133
+ game.reload
134
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ context "when relation have a different primary_key" do
141
+
142
+ let(:person) do
143
+ Person.create
144
+ end
145
+
146
+ let(:cat) do
147
+ Cat.new
148
+ end
149
+
150
+ before do
151
+ person.cat = cat
152
+ end
153
+
154
+ it "sets the target of the relation" do
155
+ person.cat.target.should eq(cat)
156
+ end
157
+
158
+ it "sets the foreign key of the relation" do
159
+ cat.person_id.should eq(person.username)
160
+ end
161
+
162
+ it "sets the base on the inverse relation" do
163
+ cat.person.should eq(person)
164
+ end
165
+
166
+ it "sets the same instance on the inverse relation" do
167
+ cat.person.should eql(person)
168
+ end
169
+
170
+ it "saves the target" do
171
+ cat.should be_persisted
172
+ end
173
+ end
174
+ end
175
+
176
+ context "when the relation is polymorphic" do
177
+
178
+ context "when the parent is a new record" do
179
+
180
+ let(:bar) do
181
+ Bar.new
182
+ end
183
+
184
+ let(:rating) do
185
+ Rating.new
186
+ end
187
+
188
+ before do
189
+ bar.rating = rating
190
+ end
191
+
192
+ it "sets the target of the relation" do
193
+ bar.rating.target.should eq(rating)
194
+ end
195
+
196
+ it "sets the foreign key on the relation" do
197
+ rating.ratable_id.should eq(bar.id)
198
+ end
199
+
200
+ it "sets the base on the inverse relation" do
201
+ rating.ratable.should eq(bar)
202
+ end
203
+
204
+ it "sets the same instance on the inverse relation" do
205
+ rating.ratable.should eql(bar)
206
+ end
207
+
208
+ it "does not save the target" do
209
+ rating.should_not be_persisted
210
+ end
211
+ end
212
+
213
+ context "when the parent is not a new record" do
214
+
215
+ let(:bar) do
216
+ Bar.create
217
+ end
218
+
219
+ let(:rating) do
220
+ Rating.new
221
+ end
222
+
223
+ before do
224
+ bar.rating = rating
225
+ end
226
+
227
+ it "sets the target of the relation" do
228
+ bar.rating.target.should eq(rating)
229
+ end
230
+
231
+ it "sets the foreign key of the relation" do
232
+ rating.ratable_id.should eq(bar.id)
233
+ end
234
+
235
+ it "sets the base on the inverse relation" do
236
+ rating.ratable.should eq(bar)
237
+ end
238
+
239
+ it "sets the same instance on the inverse relation" do
240
+ rating.ratable.should eql(bar)
241
+ end
242
+
243
+ it "saves the target" do
244
+ rating.should be_persisted
245
+ end
246
+ end
247
+
248
+ context "when replacing an existing persisted (dependent: :destroy) relation" do
249
+
250
+ let!(:person) do
251
+ Person.create
252
+ end
253
+
254
+ let!(:game) do
255
+ person.create_game(name: "Starcraft")
256
+ end
257
+
258
+ context "with a new one created via the parent" do
259
+
260
+ let!(:new_game) do
261
+ person.create_game(name: "Starcraft 2")
262
+ end
263
+
264
+ it "sets the new relation on the parent" do
265
+ person.game.should eq(new_game)
266
+ end
267
+
268
+ it "removes the old foreign key reference" do
269
+ game.person_id.should be_nil
270
+ end
271
+
272
+ it "removes the reference to the parent" do
273
+ game.person.should be_nil
274
+ end
275
+
276
+ it "destroys the old child" do
277
+ game.should be_destroyed
278
+ end
279
+
280
+ it "leaves the old child unpersisted" do
281
+ game.persisted?.should be_false
282
+ end
283
+
284
+ it "leaves the new child persisted" do
285
+ new_game.persisted?.should be_true
286
+ end
287
+ end
288
+
289
+ context "with a new one built via the parent" do
290
+
291
+ let!(:new_game) do
292
+ person.build_game(name: "Starcraft 2")
293
+ end
294
+
295
+ it "sets the new relation on the parent" do
296
+ person.game.should eq(new_game)
297
+ end
298
+
299
+ it "removes the old foreign key reference" do
300
+ game.person_id.should be_nil
301
+ end
302
+
303
+ it "removes the reference to the parent" do
304
+ game.person.should be_nil
305
+ end
306
+
307
+ it "does not destroy the old child" do
308
+ game.should_not be_destroyed
309
+ end
310
+
311
+ it "leaves the old child persisted" do
312
+ game.persisted?.should be_true
313
+ end
314
+
315
+ it "leaves the new child unpersisted" do
316
+ new_game.persisted?.should be_false
317
+ end
318
+ end
319
+ end
320
+
321
+ context "when replacing an existing unpersisted (dependent: :destroy) relation" do
322
+
323
+ let!(:person) do
324
+ Person.create
325
+ end
326
+
327
+ let!(:game) do
328
+ person.build_game(name: "Starcraft")
329
+ end
330
+
331
+ context "with a new one created via the parent" do
332
+
333
+ let!(:new_game) do
334
+ person.create_game(name: "Starcraft 2")
335
+ end
336
+
337
+ it "sets the new relation on the parent" do
338
+ person.game.should eq(new_game)
339
+ end
340
+
341
+ it "removes the old foreign key reference" do
342
+ game.person_id.should be_nil
343
+ end
344
+
345
+ it "removes the reference to the parent" do
346
+ game.person.should be_nil
347
+ end
348
+
349
+ it "destroys the old child" do
350
+ game.should be_destroyed
351
+ end
352
+
353
+ it "leaves the old child unpersisted" do
354
+ game.persisted?.should be_false
355
+ end
356
+
357
+ it "leaves the new child persisted" do
358
+ new_game.persisted?.should be_true
359
+ end
360
+ end
361
+
362
+ context "with a new one built via the parent" do
363
+
364
+ let!(:new_game) do
365
+ person.build_game(name: "Starcraft 2")
366
+ end
367
+
368
+ it "sets the new relation on the parent" do
369
+ person.game.should eq(new_game)
370
+ end
371
+
372
+ it "removes the old foreign key reference" do
373
+ game.person_id.should be_nil
374
+ end
375
+
376
+ it "removes the reference to the parent" do
377
+ game.person.should be_nil
378
+ end
379
+
380
+ it "does not destroy the old child" do
381
+ game.should_not be_destroyed
382
+ end
383
+
384
+ it "leaves the old child unpersisted" do
385
+ game.persisted?.should be_false
386
+ end
387
+
388
+ it "leaves the new child unpersisted" do
389
+ new_game.persisted?.should be_false
390
+ end
391
+ end
392
+ end
393
+
394
+ context "when replacing an existing persisted (dependent: :nullify) relation" do
395
+
396
+ let!(:person) do
397
+ Person.create
398
+ end
399
+
400
+ let!(:cat) do
401
+ person.create_cat(name: "Cuddles")
402
+ end
403
+
404
+ context "with a new one created via the parent" do
405
+
406
+ let!(:new_cat) do
407
+ person.create_cat(name: "Brutus")
408
+ end
409
+
410
+ it "sets the new relation on the parent" do
411
+ person.cat.should eq(new_cat)
412
+ end
413
+
414
+ it "removes the old foreign key reference" do
415
+ cat.person_id.should be_nil
416
+ end
417
+
418
+ it "removes the reference to the parent" do
419
+ cat.person.should be_nil
420
+ end
421
+
422
+ it "does not destroy the old child" do
423
+ cat.should_not be_destroyed
424
+ end
425
+
426
+ it "leaves the old child persisted" do
427
+ cat.persisted?.should be_true
428
+ end
429
+
430
+ it "leaves the new child persisted" do
431
+ new_cat.persisted?.should be_true
432
+ end
433
+ end
434
+
435
+ context "with a new one built via the parent" do
436
+
437
+ let!(:new_cat) do
438
+ person.build_cat(name: "Brutus")
439
+ end
440
+
441
+ it "sets the new relation on the parent" do
442
+ person.cat.should eq(new_cat)
443
+ end
444
+
445
+ it "removes the old foreign key reference" do
446
+ cat.person_id.should be_nil
447
+ end
448
+
449
+ it "removes the reference to the parent" do
450
+ cat.person.should be_nil
451
+ end
452
+
453
+ it "does not destroy the old child" do
454
+ cat.should_not be_destroyed
455
+ end
456
+
457
+ it "leaves the old child persisted" do
458
+ cat.persisted?.should be_true
459
+ end
460
+
461
+ it "leaves the new child unpersisted" do
462
+ new_cat.persisted?.should be_false
463
+ end
464
+ end
465
+ end
466
+
467
+ context "when replacing an existing unpersisted (dependent: :nullify) relation" do
468
+
469
+ let!(:person) do
470
+ Person.create
471
+ end
472
+
473
+ let!(:cat) do
474
+ person.build_cat(name: "Cuddles")
475
+ end
476
+
477
+ context "with a new one created via the parent" do
478
+
479
+ let!(:new_cat) do
480
+ person.create_cat(name: "Brutus")
481
+ end
482
+
483
+ it "sets the new relation on the parent" do
484
+ person.cat.should eq(new_cat)
485
+ end
486
+
487
+ it "removes the old foreign key reference" do
488
+ cat.person_id.should be_nil
489
+ end
490
+
491
+ it "removes the reference to the parent" do
492
+ cat.person.should be_nil
493
+ end
494
+
495
+ it "does not destroy the old child" do
496
+ cat.should_not be_destroyed
497
+ end
498
+
499
+ it "leaves the old child unpersisted" do
500
+ cat.persisted?.should be_false
501
+ end
502
+
503
+ it "leaves the new child persisted" do
504
+ new_cat.persisted?.should be_true
505
+ end
506
+ end
507
+
508
+ context "with a new one built via the parent" do
509
+
510
+ let!(:new_cat) do
511
+ person.build_cat(name: "Brutus")
512
+ end
513
+
514
+ it "sets the new relation on the parent" do
515
+ person.cat.should eq(new_cat)
516
+ end
517
+
518
+ it "removes the old foreign key reference" do
519
+ cat.person_id.should be_nil
520
+ end
521
+
522
+ it "removes the reference to the parent" do
523
+ cat.person.should be_nil
524
+ end
525
+
526
+ it "does not destroy the old child" do
527
+ cat.should_not be_destroyed
528
+ end
529
+
530
+ it "leaves the old child unpersisted" do
531
+ cat.persisted?.should be_false
532
+ end
533
+
534
+ it "leaves the new child unpersisted" do
535
+ new_cat.persisted?.should be_false
536
+ end
537
+ end
538
+ end
539
+
540
+ context "when replacing an existing relation with a new one" do
541
+
542
+ let!(:person) do
543
+ Person.create
544
+ end
545
+
546
+ context "when dependent is destroy" do
547
+
548
+ let!(:game) do
549
+ person.create_game(name: "Starcraft")
550
+ end
551
+
552
+ let!(:new_game) do
553
+ Game.create(name: "Starcraft 2")
554
+ end
555
+
556
+ before do
557
+ person.game = new_game
558
+ end
559
+
560
+ it "sets the new relation on the parent" do
561
+ person.game.should eq(new_game)
562
+ end
563
+
564
+ it "removes the old foreign key reference" do
565
+ game.person_id.should be_nil
566
+ end
567
+
568
+ it "removes the reference to the parent" do
569
+ game.person.should be_nil
570
+ end
571
+
572
+ it "destroys the old child" do
573
+ game.should be_destroyed
574
+ end
575
+ end
576
+
577
+ context "when dependent is not set" do
578
+
579
+ let!(:account) do
580
+ person.create_account(name: "savings")
581
+ end
582
+
583
+ let!(:new_account) do
584
+ Account.create(name: "checking")
585
+ end
586
+
587
+ before do
588
+ person.account = new_account
589
+ end
590
+
591
+ it "sets the new relation on the parent" do
592
+ person.account.should eq(new_account)
593
+ end
594
+
595
+ it "removes the old foreign key reference" do
596
+ account.person_id.should be_nil
597
+ end
598
+
599
+ it "removes the reference to the parent" do
600
+ account.person.should be_nil
601
+ end
602
+
603
+ it "nullifies the old child" do
604
+ account.should_not be_destroyed
605
+ end
606
+ end
607
+ end
608
+ end
609
+ end
610
+
611
+ describe "#= nil" do
612
+
613
+ context "when the relation is not polymorphic" do
614
+
615
+ context "when the parent is a new record" do
616
+
617
+ let(:person) do
618
+ Person.new
619
+ end
620
+
621
+ let(:game) do
622
+ Game.new
623
+ end
624
+
625
+ before do
626
+ person.game = game
627
+ person.game = nil
628
+ end
629
+
630
+ it "sets the relation to nil" do
631
+ person.game.should be_nil
632
+ end
633
+
634
+ it "removed the inverse relation" do
635
+ game.person.should be_nil
636
+ end
637
+
638
+ it "removes the foreign key value" do
639
+ game.person_id.should be_nil
640
+ end
641
+ end
642
+
643
+ context "when the parent is not a new record" do
644
+
645
+ let(:person) do
646
+ Person.create
647
+ end
648
+
649
+ let(:game) do
650
+ Game.new
651
+ end
652
+
653
+ before do
654
+ person.game = game
655
+ person.game = nil
656
+ end
657
+
658
+ it "sets the relation to nil" do
659
+ person.game.should be_nil
660
+ end
661
+
662
+ it "removed the inverse relation" do
663
+ game.person.should be_nil
664
+ end
665
+
666
+ it "removes the foreign key value" do
667
+ game.person_id.should be_nil
668
+ end
669
+
670
+ it "deletes the target from the database" do
671
+ game.should be_destroyed
672
+ end
673
+ end
674
+ end
675
+
676
+ context "when the relation is polymorphic" do
677
+
678
+ context "when the parent is a new record" do
679
+
680
+ let(:bar) do
681
+ Bar.new
682
+ end
683
+
684
+ let(:rating) do
685
+ Rating.new
686
+ end
687
+
688
+ before do
689
+ bar.rating = rating
690
+ bar.rating = nil
691
+ end
692
+
693
+ it "sets the relation to nil" do
694
+ bar.rating.should be_nil
695
+ end
696
+
697
+ it "removed the inverse relation" do
698
+ rating.ratable.should be_nil
699
+ end
700
+
701
+ it "removes the foreign key value" do
702
+ rating.ratable_id.should be_nil
703
+ end
704
+ end
705
+
706
+ context "when the parent is not a new record" do
707
+
708
+ let(:bar) do
709
+ Bar.create
710
+ end
711
+
712
+ let(:rating) do
713
+ Rating.new
714
+ end
715
+
716
+ before do
717
+ bar.rating = rating
718
+ bar.rating = nil
719
+ end
720
+
721
+ it "sets the relation to nil" do
722
+ bar.rating.should be_nil
723
+ end
724
+
725
+ it "removed the inverse relation" do
726
+ rating.ratable.should be_nil
727
+ end
728
+
729
+ it "removes the foreign key value" do
730
+ rating.ratable_id.should be_nil
731
+ end
732
+
733
+ it "applies the appropriate dependent option" do
734
+ rating.should_not be_destroyed
735
+ end
736
+ end
737
+ end
738
+ end
739
+
740
+ describe "#build_#\{name}" do
741
+
742
+ context "when using mass assignment scoping" do
743
+
744
+ let(:person) do
745
+ Person.new
746
+ end
747
+
748
+ let(:account) do
749
+ person.build_account(
750
+ { name: "bank", balance: "big" }, as: :admin
751
+ )
752
+ end
753
+
754
+ it "allows setting of fields for the role" do
755
+ account.name.should eq("bank")
756
+ end
757
+
758
+ it "does not set fields not allowed for the role" do
759
+ account.balance.should be_nil
760
+ end
761
+ end
762
+
763
+ context "when the relationship is an illegal embedded reference" do
764
+
765
+ let(:game) do
766
+ Game.new
767
+ end
768
+
769
+ it "raises a mixed relation error" do
770
+ expect {
771
+ game.build_video(title: "Tron")
772
+ }.to raise_error(Mongoid::Errors::MixedRelations)
773
+ end
774
+ end
775
+
776
+ context "when the relation is not polymorphic" do
777
+
778
+ context "when using object ids" do
779
+
780
+ let(:person) do
781
+ Person.create
782
+ end
783
+
784
+ let(:game) do
785
+ person.build_game(score: 50)
786
+ end
787
+
788
+ it "returns a new document" do
789
+ game.score.should eq(50)
790
+ end
791
+
792
+ it "sets the foreign key on the document" do
793
+ game.person_id.should eq(person.id)
794
+ end
795
+
796
+ it "sets the inverse relation" do
797
+ game.person.should eq(person)
798
+ end
799
+
800
+ it "does not save the built document" do
801
+ game.should_not be_persisted
802
+ end
803
+ end
804
+
805
+ context "when providing no attributes" do
806
+
807
+ let(:person) do
808
+ Person.create
809
+ end
810
+
811
+ let(:game) do
812
+ person.build_game
813
+ end
814
+
815
+ it "sets the foreign key on the document" do
816
+ game.person_id.should eq(person.id)
817
+ end
818
+
819
+ it "sets the inverse relation" do
820
+ game.person.should eq(person)
821
+ end
822
+
823
+ it "does not save the built document" do
824
+ game.should_not be_persisted
825
+ end
826
+ end
827
+
828
+ context "when providing nil attributes" do
829
+
830
+ let(:person) do
831
+ Person.create
832
+ end
833
+
834
+ let(:game) do
835
+ person.build_game(nil)
836
+ end
837
+
838
+ it "sets the foreign key on the document" do
839
+ game.person_id.should eq(person.id)
840
+ end
841
+
842
+ it "sets the inverse relation" do
843
+ game.person.should eq(person)
844
+ end
845
+
846
+ it "does not save the built document" do
847
+ game.should_not be_persisted
848
+ end
849
+ end
850
+ end
851
+
852
+ context "when the relation is polymorphic" do
853
+
854
+ context "when using object ids" do
855
+
856
+ let(:bar) do
857
+ Bar.create
858
+ end
859
+
860
+ let(:rating) do
861
+ bar.build_rating(value: 5)
862
+ end
863
+
864
+ it "returns a new document" do
865
+ rating.value.should eq(5)
866
+ end
867
+
868
+ it "sets the foreign key on the document" do
869
+ rating.ratable_id.should eq(bar.id)
870
+ end
871
+
872
+ it "sets the inverse relation" do
873
+ rating.ratable.should eq(bar)
874
+ end
875
+
876
+ it "does not save the built document" do
877
+ rating.should_not be_persisted
878
+ end
879
+ end
880
+ end
881
+ end
882
+
883
+ describe ".builder" do
884
+
885
+ let(:builder_klass) do
886
+ Mongoid::Relations::Builders::Referenced::One
887
+ end
888
+
889
+ let(:document) do
890
+ stub
891
+ end
892
+
893
+ let(:metadata) do
894
+ stub(extension?: false)
895
+ end
896
+
897
+ it "returns the embedded in builder" do
898
+ described_class.builder(nil, metadata, document).should
899
+ be_a_kind_of(builder_klass)
900
+ end
901
+ end
902
+
903
+ describe "#create_#\{name}" do
904
+
905
+ context "when using mass assignment scoping" do
906
+
907
+ let(:person) do
908
+ Person.create
909
+ end
910
+
911
+ let(:account) do
912
+ person.create_account(
913
+ { name: "bank", balance: "big" }, as: :admin
914
+ )
915
+ end
916
+
917
+ it "allows setting of fields for the role" do
918
+ account.name.should eq("bank")
919
+ end
920
+
921
+ it "does not set fields not allowed for the role" do
922
+ account.balance.should be_nil
923
+ end
924
+ end
925
+
926
+ context "when the relationship is an illegal embedded reference" do
927
+
928
+ let(:game) do
929
+ Game.new
930
+ end
931
+
932
+ it "raises a mixed relation error" do
933
+ expect {
934
+ game.create_video(title: "Tron")
935
+ }.to raise_error(Mongoid::Errors::MixedRelations)
936
+ end
937
+ end
938
+
939
+ context "when the relation is not polymorphic" do
940
+
941
+ let(:person) do
942
+ Person.create
943
+ end
944
+
945
+ let(:game) do
946
+ person.create_game(score: 50)
947
+ end
948
+
949
+ it "returns a new document" do
950
+ game.score.should eq(50)
951
+ end
952
+
953
+ it "sets the foreign key on the document" do
954
+ game.person_id.should eq(person.id)
955
+ end
956
+
957
+ it "sets the inverse relation" do
958
+ game.person.should eq(person)
959
+ end
960
+
961
+ it "saves the document" do
962
+ game.should be_persisted
963
+ end
964
+ end
965
+
966
+ context "when providing no attributes" do
967
+
968
+ let(:person) do
969
+ Person.create
970
+ end
971
+
972
+ let(:game) do
973
+ person.create_game
974
+ end
975
+
976
+ it "sets the foreign key on the document" do
977
+ game.person_id.should eq(person.id)
978
+ end
979
+
980
+ it "sets the inverse relation" do
981
+ game.person.should eq(person)
982
+ end
983
+
984
+ it "saves the document" do
985
+ game.should be_persisted
986
+ end
987
+ end
988
+
989
+ context "when providing nil attributes" do
990
+
991
+ let(:person) do
992
+ Person.create
993
+ end
994
+
995
+ let(:game) do
996
+ person.create_game(nil)
997
+ end
998
+
999
+ it "sets the foreign key on the document" do
1000
+ game.person_id.should eq(person.id)
1001
+ end
1002
+
1003
+ it "sets the inverse relation" do
1004
+ game.person.should eq(person)
1005
+ end
1006
+
1007
+ it "saves the document" do
1008
+ game.should be_persisted
1009
+ end
1010
+ end
1011
+
1012
+ context "when the relation is polymorphic" do
1013
+
1014
+ let(:bar) do
1015
+ Bar.create
1016
+ end
1017
+
1018
+ let(:rating) do
1019
+ bar.create_rating(value: 5)
1020
+ end
1021
+
1022
+ it "returns a new document" do
1023
+ rating.value.should eq(5)
1024
+ end
1025
+
1026
+ it "sets the foreign key on the document" do
1027
+ rating.ratable_id.should eq(bar.id)
1028
+ end
1029
+
1030
+ it "sets the inverse relation" do
1031
+ rating.ratable.should eq(bar)
1032
+ end
1033
+
1034
+ it "saves the document" do
1035
+ rating.should be_persisted
1036
+ end
1037
+ end
1038
+ end
1039
+
1040
+ describe ".criteria" do
1041
+
1042
+ let(:id) do
1043
+ Moped::BSON::ObjectId.new
1044
+ end
1045
+
1046
+ context "when the relation is polymorphic" do
1047
+
1048
+ let(:metadata) do
1049
+ Book.relations["rating"]
1050
+ end
1051
+
1052
+ let(:criteria) do
1053
+ described_class.criteria(metadata, id, Book)
1054
+ end
1055
+
1056
+ it "includes the type in the criteria" do
1057
+ criteria.selector.should eq(
1058
+ {
1059
+ "ratable_id" => id,
1060
+ "ratable_type" => "Book",
1061
+ "ratable_field" => { "$in" => [ :rating, nil ] }
1062
+ }
1063
+ )
1064
+ end
1065
+ end
1066
+
1067
+ context "when the relation is not polymorphic" do
1068
+
1069
+ let(:metadata) do
1070
+ Person.relations["game"]
1071
+ end
1072
+
1073
+ let(:criteria) do
1074
+ described_class.criteria(metadata, id, Person)
1075
+ end
1076
+
1077
+ it "does not include the type in the criteria" do
1078
+ criteria.selector.should eq({ "person_id" => id })
1079
+ end
1080
+ end
1081
+ end
1082
+
1083
+ describe ".eager_load" do
1084
+
1085
+ before do
1086
+ Mongoid.identity_map_enabled = true
1087
+ end
1088
+
1089
+ after do
1090
+ Mongoid.identity_map_enabled = false
1091
+ end
1092
+
1093
+ context "when the relation is not polymorphic" do
1094
+
1095
+ let!(:person) do
1096
+ Person.create
1097
+ end
1098
+
1099
+ let!(:game) do
1100
+ person.create_game(name: "Tron")
1101
+ end
1102
+
1103
+ let(:metadata) do
1104
+ Person.relations["game"]
1105
+ end
1106
+
1107
+ let!(:eager) do
1108
+ described_class.eager_load(metadata, Person.all.map(&:_id))
1109
+ end
1110
+
1111
+ let(:map) do
1112
+ Mongoid::IdentityMap.get(Game, {"person_id" => person.id})
1113
+ end
1114
+
1115
+ it "puts the documents in the identity map" do
1116
+ map.should eq(game)
1117
+ end
1118
+ end
1119
+
1120
+ context "when the relation is polymorphic" do
1121
+
1122
+ let!(:book) do
1123
+ Book.create(name: "Game of Thrones")
1124
+ end
1125
+
1126
+ let!(:movie) do
1127
+ Movie.create(name: "Bladerunner")
1128
+ end
1129
+
1130
+ let!(:movie_rating) do
1131
+ movie.ratings.create(value: 10)
1132
+ end
1133
+
1134
+ let!(:book_rating) do
1135
+ book.create_rating(value: 10)
1136
+ end
1137
+
1138
+ let(:metadata) do
1139
+ Book.relations["rating"]
1140
+ end
1141
+
1142
+ let!(:eager) do
1143
+ described_class.eager_load(metadata, Book.all.map(&:_id))
1144
+ end
1145
+
1146
+ let(:map) do
1147
+ Mongoid::IdentityMap.get(Rating, {"ratable_id" => book.id})
1148
+ end
1149
+
1150
+ it "puts the documents in the identity map" do
1151
+ map.should eq(book_rating)
1152
+ end
1153
+ end
1154
+ end
1155
+
1156
+ describe ".embedded?" do
1157
+
1158
+ it "returns false" do
1159
+ described_class.should_not be_embedded
1160
+ end
1161
+ end
1162
+
1163
+ describe ".foreign_key_suffix" do
1164
+
1165
+ it "returns _id" do
1166
+ described_class.foreign_key_suffix.should eq("_id")
1167
+ end
1168
+ end
1169
+
1170
+ describe ".macro" do
1171
+
1172
+ it "returns has_one" do
1173
+ described_class.macro.should eq(:has_one)
1174
+ end
1175
+ end
1176
+
1177
+ describe "#nullify" do
1178
+
1179
+ let(:person) do
1180
+ Person.create
1181
+ end
1182
+
1183
+ let!(:game) do
1184
+ person.create_game(name: "Starcraft II")
1185
+ end
1186
+
1187
+ context "when the instance has been set" do
1188
+
1189
+ before do
1190
+ person.game.nullify
1191
+ end
1192
+
1193
+ it "removes the foreign key from the target" do
1194
+ game.person_id.should be_nil
1195
+ end
1196
+
1197
+ it "removes the reference from the target" do
1198
+ game.person.should be_nil
1199
+ end
1200
+ end
1201
+
1202
+ context "when the instance has been reloaded" do
1203
+
1204
+ let(:from_db) do
1205
+ Person.find(person.id)
1206
+ end
1207
+
1208
+ let(:game_reloaded) do
1209
+ Game.find(game.id)
1210
+ end
1211
+
1212
+ before do
1213
+ from_db.game.nullify
1214
+ end
1215
+
1216
+ it "removes the foreign key from the target" do
1217
+ game_reloaded.person_id.should be_nil
1218
+ end
1219
+
1220
+ it "removes the reference from the target" do
1221
+ game_reloaded.person.should be_nil
1222
+ end
1223
+ end
1224
+ end
1225
+
1226
+ describe "#respond_to?" do
1227
+
1228
+ let(:person) do
1229
+ Person.new
1230
+ end
1231
+
1232
+ let!(:game) do
1233
+ person.build_game(name: "Tron")
1234
+ end
1235
+
1236
+ let(:document) do
1237
+ person.game
1238
+ end
1239
+
1240
+ Mongoid::Document.public_instance_methods(true).each do |method|
1241
+
1242
+ context "when checking #{method}" do
1243
+
1244
+ it "returns true" do
1245
+ document.respond_to?(method).should be_true
1246
+ end
1247
+ end
1248
+ end
1249
+ end
1250
+
1251
+ describe ".stores_foreign_key?" do
1252
+
1253
+ it "returns false" do
1254
+ described_class.stores_foreign_key?.should be_false
1255
+ end
1256
+ end
1257
+
1258
+ describe ".valid_options" do
1259
+
1260
+ it "returns the valid options" do
1261
+ described_class.valid_options.should eq(
1262
+ [ :as, :autobuild, :autosave, :dependent, :foreign_key, :primary_key ]
1263
+ )
1264
+ end
1265
+ end
1266
+
1267
+ describe ".validation_default" do
1268
+
1269
+ it "returns true" do
1270
+ described_class.validation_default.should be_true
1271
+ end
1272
+ end
1273
+
1274
+ context "when reloading the relation" do
1275
+
1276
+ let!(:person) do
1277
+ Person.create
1278
+ end
1279
+
1280
+ let!(:game_one) do
1281
+ Game.create(name: "Warcraft 3")
1282
+ end
1283
+
1284
+ let!(:game_two) do
1285
+ Game.create(name: "Starcraft 2")
1286
+ end
1287
+
1288
+ before do
1289
+ person.game = game_one
1290
+ end
1291
+
1292
+ context "when the relation references the same document" do
1293
+
1294
+ before do
1295
+ Game.collection.find({ _id: game_one.id }).
1296
+ update({ "$set" => { name: "Diablo 2" }})
1297
+ end
1298
+
1299
+ let(:reloaded) do
1300
+ person.game(true)
1301
+ end
1302
+
1303
+ it "reloads the document from the database" do
1304
+ reloaded.name.should eq("Diablo 2")
1305
+ end
1306
+
1307
+ it "sets a new document instance" do
1308
+ reloaded.should_not equal(game_one)
1309
+ end
1310
+ end
1311
+
1312
+ context "when the relation references a different document" do
1313
+
1314
+ before do
1315
+ person.game = game_two
1316
+ end
1317
+
1318
+ let(:reloaded) do
1319
+ person.game(true)
1320
+ end
1321
+
1322
+ it "reloads the new document from the database" do
1323
+ reloaded.name.should eq("Starcraft 2")
1324
+ end
1325
+
1326
+ it "sets a new document instance" do
1327
+ reloaded.should_not equal(game_one)
1328
+ end
1329
+ end
1330
+ end
1331
+ end