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,833 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Serialization do
4
+
5
+ describe "#field_names" do
6
+
7
+ let(:band) do
8
+ Band.new
9
+ end
10
+
11
+ it "does not duplicate fields" do
12
+ band.send(:field_names, {}).should eq(band.fields.except("_type").keys.sort)
13
+ end
14
+ end
15
+
16
+ describe "#serializable_hash" do
17
+
18
+ let(:person) do
19
+ Person.new
20
+ end
21
+
22
+ context "when a dynamic attribute has the same name as a ruby method" do
23
+
24
+ before do
25
+ person[:loop] = "testing"
26
+ end
27
+
28
+ let(:attributes) do
29
+ person.serializable_hash
30
+ end
31
+
32
+ it "grabs the attribute direct from the hash" do
33
+ attributes["loop"].should eq("testing")
34
+ end
35
+ end
36
+
37
+ context "when the method for a declared field is overridden" do
38
+
39
+ before do
40
+ person.override_me = 1
41
+ end
42
+
43
+ let(:attributes) do
44
+ person.serializable_hash
45
+ end
46
+
47
+ it "uses the overridden method" do
48
+ attributes["override_me"].should eq("1")
49
+ end
50
+ end
51
+
52
+ context "when the model has embedded documents" do
53
+
54
+ let!(:address) do
55
+ person.addresses.build(street: "test")
56
+ end
57
+
58
+ context "when providing no custom options" do
59
+
60
+ let(:attributes) do
61
+ person.serializable_hash
62
+ end
63
+
64
+ it "includes the embedded documents" do
65
+ attributes["addresses"].first.should eq(address.serializable_hash)
66
+ end
67
+ end
68
+
69
+ context "when providing options" do
70
+
71
+ let(:attributes) do
72
+ person.serializable_hash(methods: :id, except: :_id)
73
+ end
74
+
75
+ let(:address_attributes) do
76
+ attributes["addresses"].first
77
+ end
78
+
79
+ it "uses the options" do
80
+ attributes["id"].should eq(person.id)
81
+ end
82
+
83
+ it "uses the options on embedded documents" do
84
+ address_attributes["id"].should eq(address.id)
85
+ end
86
+ end
87
+
88
+ context "when nested multiple levels" do
89
+
90
+ let!(:location) do
91
+ address.locations.build(name: "home")
92
+ end
93
+
94
+ let(:attributes) do
95
+ person.serializable_hash
96
+ end
97
+
98
+ it "includes the deeply nested document" do
99
+ attributes["addresses"][0]["locations"].should_not be_empty
100
+ end
101
+ end
102
+ end
103
+
104
+ context "when the model has attributes that need conversion" do
105
+
106
+ let(:date) do
107
+ Date.new(1970, 1, 1)
108
+ end
109
+
110
+ before do
111
+ person.dob = date
112
+ end
113
+
114
+ let(:attributes) do
115
+ person.serializable_hash
116
+ end
117
+
118
+ it "converts the objects to the defined type" do
119
+ attributes["dob"].should eq(date)
120
+ end
121
+ end
122
+
123
+ context "when a model has defined fields" do
124
+
125
+ let(:attributes) do
126
+ { "title" => "President", "security_code" => "1234" }
127
+ end
128
+
129
+ before do
130
+ person.write_attributes(attributes, false)
131
+ end
132
+
133
+ let(:field_names) do
134
+ person.fields.keys.map(&:to_s) - ["_type"]
135
+ end
136
+
137
+ it "serializes assigned attributes" do
138
+ person.serializable_hash.should include attributes
139
+ end
140
+
141
+ it "includes all defined fields except _type" do
142
+ person.serializable_hash.keys.should include(*field_names)
143
+ end
144
+
145
+ it "does not include _type" do
146
+ person.serializable_hash.keys.should_not include "_type"
147
+ end
148
+
149
+ context "when providing options" do
150
+
151
+ let(:options) do
152
+ { only: :name }
153
+ end
154
+
155
+ before do
156
+ person.serializable_hash(options)
157
+ end
158
+
159
+ it "does not modify the options in the argument" do
160
+ options[:except].should be_nil
161
+ end
162
+ end
163
+
164
+ context "when include_type_for_serialization is true" do
165
+
166
+ before do
167
+ Mongoid.include_type_for_serialization = true
168
+ end
169
+
170
+ after do
171
+ Mongoid.include_type_for_serialization = false
172
+ end
173
+
174
+ it "includes _type field" do
175
+ person.serializable_hash.keys.should include '_type'
176
+ end
177
+ end
178
+
179
+ context "when specifying which fields to only include" do
180
+
181
+ it "only includes the specified fields" do
182
+ person.serializable_hash(only: [:title]).should eq(
183
+ { "title" => attributes["title"] }
184
+ )
185
+ end
186
+ end
187
+
188
+ context "when specifying extra inclusions" do
189
+
190
+ it "includes the extra fields" do
191
+ person.serializable_hash(
192
+ methods: [ :_type ]
193
+ ).has_key?("_type").should be_true
194
+ end
195
+ end
196
+
197
+ context "when specifying which fields to exclude" do
198
+
199
+ it "excludes the specified fields" do
200
+ person.serializable_hash(except: [:title]).should_not include(
201
+ "title" => attributes["title"]
202
+ )
203
+ end
204
+ end
205
+ end
206
+
207
+ context "when a model has dynamic fields" do
208
+
209
+ let(:dynamic_field_name) do
210
+ "dynamic_field_name"
211
+ end
212
+
213
+ let(:dynamic_value) do
214
+ "dynamic_value"
215
+ end
216
+
217
+ before do
218
+ person.write_attribute(dynamic_field_name, dynamic_value)
219
+ end
220
+
221
+ it "includes dynamic fields" do
222
+ person.serializable_hash[dynamic_field_name].should eq(dynamic_value)
223
+ end
224
+
225
+ context "when specifying which dynamic fields to only include" do
226
+
227
+ it "only includes the specified dynamic fields" do
228
+ person.serializable_hash(only: [dynamic_field_name]).should eq(
229
+ { dynamic_field_name => dynamic_value }
230
+ )
231
+ end
232
+ end
233
+
234
+ context "when specified which dynamic fields to exclude" do
235
+
236
+ it "excludes the specified fields" do
237
+ person.serializable_hash(except: [dynamic_field_name]).should_not include(
238
+ dynamic_field_name => dynamic_value
239
+ )
240
+ end
241
+ end
242
+ end
243
+
244
+ context "when a model has relations" do
245
+
246
+ let(:attributes) do
247
+ { "title" => "President", "security_code" => "1234" }
248
+ end
249
+
250
+ before do
251
+ person.write_attributes(attributes, false)
252
+ end
253
+
254
+ context "when the model is saved before the relation is added" do
255
+
256
+ before do
257
+ person.save
258
+ end
259
+
260
+ context "when a model has an embeds many" do
261
+
262
+ let!(:address_one) do
263
+ person.addresses.build(street: "Kudamm")
264
+ end
265
+
266
+ before do
267
+ person.save
268
+ end
269
+
270
+ it "includes the relation" do
271
+ person.serializable_hash.keys.should include('addresses')
272
+ end
273
+ end
274
+
275
+ context "when a model has an embeds one" do
276
+ let!(:name) do
277
+ person.build_name(first_name: "Leo", last_name: "Marvin")
278
+ end
279
+
280
+ before do
281
+ person.save
282
+ end
283
+
284
+ it "includes the relation" do
285
+ person.serializable_hash.keys.should include('name')
286
+ end
287
+ end
288
+ end
289
+
290
+ context "when the model is saved after the relation is added" do
291
+
292
+ context "when a model has an embeds many" do
293
+
294
+ let!(:address_one) do
295
+ person.addresses.build(street: "Kudamm")
296
+ end
297
+
298
+ before do
299
+ person.save
300
+ end
301
+
302
+ it "includes the relation" do
303
+ person.serializable_hash.keys.should include('addresses')
304
+ end
305
+ end
306
+
307
+ context "when a model has an embeds one" do
308
+ let!(:name) do
309
+ person.build_name(first_name: "Leo", last_name: "Marvin")
310
+ end
311
+
312
+ before do
313
+ person.save
314
+ end
315
+
316
+ it "includes the relation" do
317
+ person.serializable_hash.keys.should include('name')
318
+ end
319
+ end
320
+ end
321
+ end
322
+
323
+ context "when including methods" do
324
+
325
+ it "includes the method result" do
326
+ person.serializable_hash(methods: [:foo]).should include(
327
+ "foo" => person.foo
328
+ )
329
+ end
330
+ end
331
+
332
+ context "when including relations" do
333
+
334
+ context "when including a single relation" do
335
+
336
+ context "when including an embeds many" do
337
+
338
+ let!(:address_one) do
339
+ person.addresses.build(street: "Kudamm")
340
+ end
341
+
342
+ let!(:address_two) do
343
+ person.addresses.build(street: "Tauentzienstr")
344
+ end
345
+
346
+ let(:relation_hash) do
347
+ hash["addresses"]
348
+ end
349
+
350
+ pending "when the ids were not loaded" do
351
+
352
+ before do
353
+ person.save
354
+ end
355
+
356
+ let(:from_db) do
357
+ Person.only("addresses.street").first
358
+ end
359
+
360
+ let(:hash) do
361
+ from_db.serializable_hash
362
+ end
363
+
364
+ it "does not generate new ids" do
365
+ hash["addresses"].first["_id"].should be_nil
366
+ end
367
+ end
368
+
369
+ context "when providing the include as a symbol" do
370
+
371
+ let(:hash) do
372
+ person.serializable_hash(include: :addresses)
373
+ end
374
+
375
+ it "includes the first relation" do
376
+ relation_hash[0].should include
377
+ { "_id" => "kudamm", "street" => "Kudamm" }
378
+ end
379
+
380
+ it "includes the second relation" do
381
+ relation_hash[1].should include
382
+ { "_id" => "tauentzienstr", "street" => "Tauentzienstr" }
383
+ end
384
+ end
385
+
386
+ context "when providing the include as an array" do
387
+
388
+ let(:hash) do
389
+ person.serializable_hash(include: [ :addresses ])
390
+ end
391
+
392
+ it "includes the first relation" do
393
+ relation_hash[0].should include
394
+ { "_id" => "kudamm", "street" => "Kudamm" }
395
+ end
396
+
397
+ it "includes the second relation" do
398
+ relation_hash[1].should include
399
+ { "_id" => "tauentzienstr", "street" => "Tauentzienstr" }
400
+ end
401
+ end
402
+
403
+ context "when providing the include as a hash" do
404
+
405
+ context "when including one level deep" do
406
+
407
+ let(:hash) do
408
+ person.serializable_hash(include: { addresses: { except: :_id } })
409
+ end
410
+
411
+ it "includes the first relation sans exceptions" do
412
+ relation_hash[0].should include({ "street" => "Kudamm" })
413
+ end
414
+
415
+ it "includes the second relation sans exceptions" do
416
+ relation_hash[1].should include({ "street" => "Tauentzienstr" })
417
+ end
418
+ end
419
+
420
+ context "when including multiple levels deep" do
421
+
422
+ let!(:location) do
423
+ address_one.locations.build(name: "Home")
424
+ end
425
+
426
+ let(:hash) do
427
+ person.serializable_hash(
428
+ include: { addresses: {
429
+ except: :_id, include: { locations: { except: :_id } }
430
+ }
431
+ })
432
+ end
433
+
434
+ it "includes the first relation" do
435
+ relation_hash[0]["locations"].any? do |location|
436
+ location["name"] == "Home"
437
+ end.should be_true
438
+ end
439
+
440
+ context "after retrieved from database" do
441
+
442
+ let(:db_person) do
443
+ Person.all.last
444
+ end
445
+
446
+ let!(:second_location) do
447
+ address_two.locations.build(name: "Hotel")
448
+ end
449
+
450
+ let(:hash) do
451
+ db_person.serializable_hash(
452
+ include: { addresses: {
453
+ except: :_id, include: { locations: { except: :_id } }
454
+ }
455
+ })
456
+ end
457
+
458
+ before do
459
+ person.save
460
+ end
461
+
462
+ it "includes the specific ralations" do
463
+ relation_hash[0]["locations"].map do |location|
464
+ location["name"]
465
+ end.should include "Home"
466
+ relation_hash[1]["locations"].map do |location|
467
+ location["name"]
468
+ end.should include "Hotel"
469
+ end
470
+ end
471
+ end
472
+
473
+ context "when defining a default exclusion" do
474
+
475
+ let!(:name) do
476
+ person.build_name(first_name: "Sebastien")
477
+ end
478
+
479
+ let(:hash) do
480
+ person.serializable_hash(
481
+ except: :_id,
482
+ include: [ :addresses, :name ]
483
+ )
484
+ end
485
+
486
+ it "does not contain the root exclusion" do
487
+ hash["_id"].should be_nil
488
+ end
489
+
490
+ it "does not include the embedded many exclusion" do
491
+ relation_hash[0]["_id"].should be_nil
492
+ end
493
+
494
+ it "does not include the embedded one exclusion" do
495
+ hash["name"]["_id"].should be_nil
496
+ end
497
+ end
498
+ end
499
+ end
500
+
501
+ context "when including an embeds one" do
502
+
503
+ let!(:name) do
504
+ person.build_name(first_name: "Leo", last_name: "Marvin")
505
+ end
506
+
507
+ let(:relation_hash) do
508
+ hash["name"]
509
+ end
510
+
511
+ context "when providing the include as a symbol" do
512
+
513
+ let(:hash) do
514
+ person.serializable_hash(include: :name)
515
+ end
516
+
517
+ it "includes the specified relation" do
518
+ relation_hash.should include
519
+ { "_id" => "leo-marvin", "first_name" => "Leo", "last_name" => "Marvin" }
520
+ end
521
+ end
522
+
523
+ context "when providing the include as an array" do
524
+
525
+ let(:hash) do
526
+ person.serializable_hash(include: [ :name ])
527
+ end
528
+
529
+ it "includes the specified relation" do
530
+ relation_hash.should include
531
+ { "_id" => "leo-marvin", "first_name" => "Leo", "last_name" => "Marvin" }
532
+ end
533
+ end
534
+
535
+ context "when providing the include as a hash" do
536
+
537
+ let(:hash) do
538
+ person.serializable_hash(include: { name: { except: :_id }})
539
+ end
540
+
541
+ it "includes the specified relation sans exceptions" do
542
+ relation_hash.should include
543
+ { "first_name" => "Leo", "last_name" => "Marvin" }
544
+ end
545
+ end
546
+ end
547
+
548
+ context "when including a references many" do
549
+
550
+ let!(:post_one) do
551
+ person.posts.build(title: "First")
552
+ end
553
+
554
+ let!(:post_two) do
555
+ person.posts.build(title: "Second")
556
+ end
557
+
558
+ let(:relation_hash) do
559
+ hash["posts"]
560
+ end
561
+
562
+ context "when providing the include as a symbol" do
563
+
564
+ let(:hash) do
565
+ person.serializable_hash(include: :posts)
566
+ end
567
+
568
+ it "includes the specified relation" do
569
+ relation_hash.should_not be_nil
570
+ end
571
+
572
+ it "includes the first document related fields" do
573
+ relation_hash[0]["title"].should eq("First")
574
+ end
575
+
576
+ it "includes the second document related fields" do
577
+ relation_hash[1]["title"].should eq("Second")
578
+ end
579
+ end
580
+
581
+ context "when providing the include as an array" do
582
+
583
+ let(:hash) do
584
+ person.serializable_hash(include: [ :posts ])
585
+ end
586
+
587
+ it "includes the specified relation" do
588
+ relation_hash.should_not be_nil
589
+ end
590
+
591
+ it "includes the first document related fields" do
592
+ relation_hash[0]["title"].should eq("First")
593
+ end
594
+
595
+ it "includes the second document related fields" do
596
+ relation_hash[1]["title"].should eq("Second")
597
+ end
598
+ end
599
+
600
+ context "when providing the include as a hash" do
601
+
602
+ let(:hash) do
603
+ person.serializable_hash(include: { posts: { except: :_id } })
604
+ end
605
+
606
+ it "includes the specified relation" do
607
+ relation_hash.should_not be_nil
608
+ end
609
+
610
+ it "includes the first document related fields" do
611
+ relation_hash[0]["title"].should eq("First")
612
+ end
613
+
614
+ it "includes the second document related fields" do
615
+ relation_hash[1]["title"].should eq("Second")
616
+ end
617
+
618
+ it "does not include the first document exceptions" do
619
+ relation_hash[0]["_id"].should be_nil
620
+ end
621
+
622
+ it "does not include the second document exceptions" do
623
+ relation_hash[1]["_id"].should be_nil
624
+ end
625
+ end
626
+ end
627
+
628
+ context "when including a references many to many" do
629
+
630
+ let!(:preference_one) do
631
+ person.preferences.build(name: "First")
632
+ end
633
+
634
+ let!(:preference_two) do
635
+ person.preferences.build(name: "Second")
636
+ end
637
+
638
+ let(:relation_hash) do
639
+ hash["preferences"]
640
+ end
641
+
642
+ context "when providing the include as a symbol" do
643
+
644
+ let(:hash) do
645
+ person.serializable_hash(include: :preferences)
646
+ end
647
+
648
+ it "includes the specified relation" do
649
+ relation_hash.should_not be_nil
650
+ end
651
+
652
+ it "includes the first document related fields" do
653
+ relation_hash[0]["name"].should eq("First")
654
+ end
655
+
656
+ it "includes the second document related fields" do
657
+ relation_hash[1]["name"].should eq("Second")
658
+ end
659
+ end
660
+
661
+ context "when providing the include as an array" do
662
+
663
+ let(:hash) do
664
+ person.serializable_hash(include: [ :preferences ])
665
+ end
666
+
667
+ it "includes the specified relation" do
668
+ relation_hash.should_not be_nil
669
+ end
670
+
671
+ it "includes the first document related fields" do
672
+ relation_hash[0]["name"].should eq("First")
673
+ end
674
+
675
+ it "includes the second document related fields" do
676
+ relation_hash[1]["name"].should eq("Second")
677
+ end
678
+ end
679
+
680
+ context "when providing the include as a hash" do
681
+
682
+ let(:hash) do
683
+ person.serializable_hash(
684
+ include: {
685
+ preferences: {
686
+ except: :_id
687
+ }
688
+ },
689
+ except: :preference_ids
690
+ )
691
+ end
692
+
693
+ it "includes the specified relation" do
694
+ relation_hash.should_not be_nil
695
+ end
696
+
697
+ it "includes the first document related fields" do
698
+ relation_hash[0]["name"].should eq("First")
699
+ end
700
+
701
+ it "includes the second document related fields" do
702
+ relation_hash[1]["name"].should eq("Second")
703
+ end
704
+
705
+ it "does not include the first document exceptions" do
706
+ relation_hash[0]["_id"].should be_nil
707
+ end
708
+
709
+ it "does not include the second document exceptions" do
710
+ relation_hash[1]["_id"].should be_nil
711
+ end
712
+
713
+ it "does not include the root exceptions" do
714
+ hash["preference_ids"].should be_nil
715
+ end
716
+ end
717
+ end
718
+ end
719
+ end
720
+ end
721
+
722
+ describe "#to_json" do
723
+
724
+ let(:person) do
725
+ Person.new
726
+ end
727
+
728
+ context "when including root in json" do
729
+
730
+ before do
731
+ Mongoid.include_root_in_json = true
732
+ end
733
+
734
+ it "uses the mongoid configuration" do
735
+ person.to_json.should include("person")
736
+ end
737
+ end
738
+
739
+ context "when not including root in json" do
740
+
741
+ before do
742
+ Mongoid.include_root_in_json = false
743
+ end
744
+
745
+ it "uses the mongoid configuration" do
746
+ person.to_json.should_not include("person")
747
+ end
748
+ end
749
+
750
+ context "when serializing a relation directly" do
751
+
752
+ context "when serializing an embeds many" do
753
+
754
+ let!(:address) do
755
+ person.addresses.build(street: "Kudamm")
756
+ end
757
+
758
+ let(:json) do
759
+ person.addresses.to_json
760
+ end
761
+
762
+ it "serializes only the relation" do
763
+ json.should include(address.street)
764
+ end
765
+ end
766
+
767
+ context "when serializing a references many" do
768
+
769
+ let!(:post) do
770
+ person.posts.build(title: "testing")
771
+ end
772
+
773
+ let(:json) do
774
+ person.posts.to_json
775
+ end
776
+
777
+ it "serializes only the relation" do
778
+ json.should include(post.title)
779
+ end
780
+ end
781
+ end
782
+ end
783
+
784
+ describe "#to_xml" do
785
+
786
+ context "Moped::BSON::ObjectId" do
787
+
788
+ let(:person) do
789
+ Person.new
790
+ end
791
+
792
+ it "serializes as string" do
793
+ person.to_xml.should include("<_id>#{person.id}</_id>")
794
+ end
795
+ end
796
+
797
+ context "when an Array field is defined" do
798
+
799
+ let(:person) do
800
+ Person.new(
801
+ aliases: [ "Kelly", "Machine Gun" ]
802
+ )
803
+ end
804
+
805
+ it "properly types the array" do
806
+ person.to_xml.should include("<aliases type=\"array\">")
807
+ end
808
+
809
+ it "serializes the array" do
810
+ person.to_xml.should include("<alias>Kelly</alias>")
811
+ person.to_xml.should include("<alias>Machine Gun</alias>")
812
+ end
813
+ end
814
+
815
+ context "when a Hash field is defined" do
816
+
817
+ let(:person) do
818
+ Person.new(
819
+ map: { lat: 24.5, long: 22.1 }
820
+ )
821
+ end
822
+
823
+ it "properly types the hash" do
824
+ person.to_xml.should include("<map>")
825
+ end
826
+
827
+ it "serializes the hash" do
828
+ person.to_xml.should include("<lat type=\"float\">24.5</lat>")
829
+ person.to_xml.should include("<long type=\"float\">22.1</long>")
830
+ end
831
+ end
832
+ end
833
+ end