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,136 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Extensions::Integer do
4
+
5
+ let(:number) do
6
+ 118347652312341
7
+ end
8
+
9
+ describe "#__mongoize_time__" do
10
+
11
+ let(:integer) do
12
+ 1335532685
13
+ end
14
+
15
+ let(:mongoized) do
16
+ integer.__mongoize_time__
17
+ end
18
+
19
+ it "returns the float as a time" do
20
+ mongoized.should eq(Time.at(integer))
21
+ end
22
+ end
23
+
24
+ describe ".demongoize" do
25
+
26
+ context "when the the value is an integer" do
27
+
28
+ it "returns a integer" do
29
+ Integer.demongoize(number).should eq(number)
30
+ end
31
+ end
32
+
33
+ context "when the value is nil" do
34
+
35
+ it "returns nil" do
36
+ Integer.demongoize(nil).should be_nil
37
+ end
38
+ end
39
+
40
+ context "when the value is not an integer" do
41
+
42
+ it "converts the value to an integer" do
43
+ Integer.demongoize("1.0").should eq(1)
44
+ end
45
+ end
46
+ end
47
+
48
+ describe ".mongoize" do
49
+
50
+ context "when the value is a number" do
51
+
52
+ context "when the value is an integer" do
53
+
54
+ context "when the value is small" do
55
+
56
+ it "it returns the integer" do
57
+ Integer.mongoize(3).should eq(3)
58
+ end
59
+ end
60
+
61
+ context "when the value is large" do
62
+
63
+ it "returns the integer" do
64
+ Integer.mongoize(1024**2).to_s.should eq("1048576")
65
+ end
66
+ end
67
+ end
68
+
69
+ context "when the value is a decimal" do
70
+
71
+ it "casts to integer" do
72
+ Integer.mongoize(2.5).should eq(2)
73
+ end
74
+ end
75
+
76
+ context "when the value is floating point zero" do
77
+
78
+ it "returns the integer zero" do
79
+ Integer.mongoize(0.00000).should eq(0)
80
+ end
81
+ end
82
+
83
+ context "when the value is a floating point integer" do
84
+
85
+ it "returns the integer number" do
86
+ Integer.mongoize(4.00000).should eq(4)
87
+ end
88
+ end
89
+
90
+ context "when the value has leading zeros" do
91
+
92
+ it "returns the stripped integer" do
93
+ Integer.mongoize("000011").should eq(11)
94
+ end
95
+ end
96
+ end
97
+
98
+ context "when the string is not a number" do
99
+
100
+ context "when the string is non numerical" do
101
+
102
+ it "returns 0" do
103
+ Integer.mongoize("foo").should eq(0)
104
+ end
105
+ end
106
+
107
+ context "when the string is numerical" do
108
+
109
+ it "returns the integer value for the string" do
110
+ Integer.mongoize("3").should eq(3)
111
+ end
112
+ end
113
+
114
+ context "when the string is empty" do
115
+
116
+ it "returns nil" do
117
+ Integer.mongoize("").should be_nil
118
+ end
119
+ end
120
+
121
+ context "when the string is nil" do
122
+
123
+ it "returns nil" do
124
+ Integer.mongoize(nil).should be_nil
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ describe "#mongoize" do
131
+
132
+ it "returns self" do
133
+ number.mongoize.should eq(number)
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Extensions::Module do
4
+
5
+ describe "#re_define_method" do
6
+
7
+ context "when the method already exists" do
8
+
9
+ class Smoochy
10
+ def sing
11
+ "singing"
12
+ end
13
+ end
14
+
15
+ before do
16
+ Smoochy.re_define_method("sing") do
17
+ "singing again"
18
+ end
19
+ end
20
+
21
+ it "redefines the existing method" do
22
+ Smoochy.new.sing.should eq("singing again")
23
+ end
24
+ end
25
+
26
+ context "when the method does not exist" do
27
+
28
+ class Rhino
29
+ end
30
+
31
+ before do
32
+ Rhino.re_define_method("sing") do
33
+ "singing"
34
+ end
35
+ end
36
+
37
+ it "redefines the existing method" do
38
+ Rhino.new.sing.should eq("singing")
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Extensions::NilClass do
4
+
5
+ describe "#collectionize" do
6
+
7
+ it "returns ''" do
8
+ nil.collectionize.should be_empty
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,946 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Extensions::ObjectId do
4
+
5
+ let(:object_id) do
6
+ Moped::BSON::ObjectId.new
7
+ end
8
+
9
+ let(:composite_key) do
10
+ "21-jump-street"
11
+ end
12
+
13
+ describe "#__evolve_object_id__" do
14
+
15
+ it "returns self" do
16
+ object_id.__evolve_object_id__.should eq(object_id)
17
+ end
18
+
19
+ it "returns the same instance" do
20
+ object_id.__evolve_object_id__.should equal(object_id)
21
+ end
22
+ end
23
+
24
+ describe ".evolve" do
25
+
26
+ context "when the class is using object ids" do
27
+
28
+ context "when provided a single object id" do
29
+
30
+ let(:evolved) do
31
+ Moped::BSON::ObjectId.evolve(object_id)
32
+ end
33
+
34
+ it "returns the object id" do
35
+ evolved.should eq(object_id)
36
+ end
37
+ end
38
+
39
+ context "when provided an array of object ids" do
40
+
41
+ let(:other_id) do
42
+ Moped::BSON::ObjectId.new
43
+ end
44
+
45
+ let(:evolved) do
46
+ Moped::BSON::ObjectId.evolve([ object_id, other_id ])
47
+ end
48
+
49
+ it "returns the array of object ids" do
50
+ evolved.should eq([ object_id, other_id ])
51
+ end
52
+ end
53
+
54
+ context "when provided a single string" do
55
+
56
+ context "when the string is a valid object id" do
57
+
58
+ let(:evolved) do
59
+ Moped::BSON::ObjectId.evolve(object_id.to_s)
60
+ end
61
+
62
+ it "evolves to an object id" do
63
+ evolved.should eq(object_id)
64
+ end
65
+ end
66
+
67
+ context "when the string is not a valid object id" do
68
+
69
+ it "returns the key" do
70
+ Moped::BSON::ObjectId.evolve(composite_key).should eq(
71
+ composite_key
72
+ )
73
+ end
74
+ end
75
+
76
+ context "when the string is empty" do
77
+
78
+ let(:evolved) do
79
+ Moped::BSON::ObjectId.evolve("")
80
+ end
81
+
82
+ it "evolves to an empty string" do
83
+ evolved.should be_empty
84
+ end
85
+ end
86
+ end
87
+
88
+ context "when provided an array" do
89
+
90
+ context "when array key of nils" do
91
+
92
+ let(:evolved) do
93
+ Moped::BSON::ObjectId.evolve([ nil, nil ])
94
+ end
95
+
96
+ it "returns the array with nils" do
97
+ evolved.should eq([ nil, nil ])
98
+ end
99
+ end
100
+
101
+ context "when the array key is empty strings" do
102
+
103
+ let(:evolved) do
104
+ Moped::BSON::ObjectId.evolve([ "", "" ])
105
+ end
106
+
107
+ it "returns the array with empty strings" do
108
+ evolved.should eq([ "", "" ])
109
+ end
110
+ end
111
+
112
+ context "when the array key is full of strings" do
113
+
114
+ context "when the strings are valid object ids" do
115
+
116
+ let(:other_id) do
117
+ Moped::BSON::ObjectId.new
118
+ end
119
+
120
+ let(:evolved) do
121
+ Moped::BSON::ObjectId.evolve([ object_id.to_s, other_id.to_s ])
122
+ end
123
+
124
+ it "evolves to an array of object ids" do
125
+ evolved.should eq([ object_id, other_id ])
126
+ end
127
+ end
128
+
129
+ context "when the strings are not valid object ids" do
130
+
131
+ let(:other_key) do
132
+ "hawaii-five-o"
133
+ end
134
+
135
+ let(:evolved) do
136
+ Moped::BSON::ObjectId.evolve([ composite_key, other_key ])
137
+ end
138
+
139
+ it "returns the key" do
140
+ Moped::BSON::ObjectId.evolve(composite_key).should eq(
141
+ composite_key
142
+ )
143
+ end
144
+ end
145
+ end
146
+ end
147
+
148
+ context "when provided a hash" do
149
+
150
+ context "when the hash key is _id" do
151
+
152
+ context "when the value is an object id" do
153
+
154
+ let(:hash) do
155
+ { _id: object_id }
156
+ end
157
+
158
+ let(:evolved) do
159
+ Moped::BSON::ObjectId.evolve(hash)
160
+ end
161
+
162
+ it "returns the hash" do
163
+ evolved.should eq(hash)
164
+ end
165
+ end
166
+
167
+ context "when the value is an array of object ids" do
168
+
169
+ let(:other_id) do
170
+ Moped::BSON::ObjectId.new
171
+ end
172
+
173
+ let(:hash) do
174
+ { _id: [ object_id, other_id ] }
175
+ end
176
+
177
+ let(:evolved) do
178
+ Moped::BSON::ObjectId.evolve(hash)
179
+ end
180
+
181
+ it "returns the hash" do
182
+ evolved.should eq(hash)
183
+ end
184
+ end
185
+
186
+ context "when the value is a string" do
187
+
188
+ let(:hash) do
189
+ { _id: object_id.to_s }
190
+ end
191
+
192
+ let(:evolved) do
193
+ Moped::BSON::ObjectId.evolve(hash)
194
+ end
195
+
196
+ it "returns the hash with evolved value" do
197
+ evolved.should eq({ _id: object_id })
198
+ end
199
+ end
200
+
201
+ context "when the value is an array of strings" do
202
+
203
+ let(:other_id) do
204
+ Moped::BSON::ObjectId.new
205
+ end
206
+
207
+ let(:hash) do
208
+ { _id: [ object_id.to_s, other_id.to_s ] }
209
+ end
210
+
211
+ let(:evolved) do
212
+ Moped::BSON::ObjectId.evolve(hash)
213
+ end
214
+
215
+ it "returns the hash with evolved values" do
216
+ evolved.should eq({ _id: [ object_id, other_id ] })
217
+ end
218
+ end
219
+ end
220
+
221
+ context "when the hash key is id" do
222
+
223
+ context "when the value is an object id" do
224
+
225
+ let(:hash) do
226
+ { id: object_id }
227
+ end
228
+
229
+ let(:evolved) do
230
+ Moped::BSON::ObjectId.evolve(hash)
231
+ end
232
+
233
+ it "returns the hash" do
234
+ evolved.should eq(hash)
235
+ end
236
+ end
237
+
238
+ context "when the value is an array of object ids" do
239
+
240
+ let(:other_id) do
241
+ Moped::BSON::ObjectId.new
242
+ end
243
+
244
+ let(:hash) do
245
+ { id: [ object_id, other_id ] }
246
+ end
247
+
248
+ let(:evolved) do
249
+ Moped::BSON::ObjectId.evolve(hash)
250
+ end
251
+
252
+ it "returns the hash" do
253
+ evolved.should eq(hash)
254
+ end
255
+ end
256
+
257
+ context "when the value is a string" do
258
+
259
+ let(:hash) do
260
+ { id: object_id.to_s }
261
+ end
262
+
263
+ let(:evolved) do
264
+ Moped::BSON::ObjectId.evolve(hash)
265
+ end
266
+
267
+ it "returns the hash with evolved value" do
268
+ evolved.should eq({ id: object_id })
269
+ end
270
+ end
271
+
272
+ context "when the value is an array of strings" do
273
+
274
+ let(:other_id) do
275
+ Moped::BSON::ObjectId.new
276
+ end
277
+
278
+ let(:hash) do
279
+ { id: [ object_id.to_s, other_id.to_s ] }
280
+ end
281
+
282
+ let(:evolved) do
283
+ Moped::BSON::ObjectId.evolve(hash)
284
+ end
285
+
286
+ it "returns the hash with evolved values" do
287
+ evolved.should eq({ id: [ object_id, other_id ] })
288
+ end
289
+ end
290
+ end
291
+
292
+ context "when the hash key is not an id" do
293
+
294
+ context "when the value is a string" do
295
+
296
+ let(:hash) do
297
+ { key: composite_key }
298
+ end
299
+
300
+ let(:evolved) do
301
+ Moped::BSON::ObjectId.evolve(hash)
302
+ end
303
+
304
+ it "returns the hash" do
305
+ evolved.should eq(hash)
306
+ end
307
+ end
308
+
309
+ context "when the value is an array of strings" do
310
+
311
+ let(:hash) do
312
+ { key: [ composite_key ] }
313
+ end
314
+
315
+ let(:evolved) do
316
+ Moped::BSON::ObjectId.evolve(hash)
317
+ end
318
+
319
+ it "returns the hash" do
320
+ evolved.should eq(hash)
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end
326
+ end
327
+
328
+ describe ".mongoize" do
329
+
330
+ context "when the class is using object ids" do
331
+
332
+ context "when provided a single object id" do
333
+
334
+ let(:mongoized) do
335
+ Moped::BSON::ObjectId.mongoize(object_id)
336
+ end
337
+
338
+ it "returns the object id" do
339
+ mongoized.should eq(object_id)
340
+ end
341
+ end
342
+
343
+ context "when provided an array of object ids" do
344
+
345
+ let(:other_id) do
346
+ Moped::BSON::ObjectId.new
347
+ end
348
+
349
+ let(:mongoized) do
350
+ Moped::BSON::ObjectId.mongoize([ object_id, other_id ])
351
+ end
352
+
353
+ it "returns the array of object ids" do
354
+ mongoized.should eq([ object_id, other_id ])
355
+ end
356
+ end
357
+
358
+ context "when provided a single string" do
359
+
360
+ context "when the string is a valid object id" do
361
+
362
+ let(:mongoized) do
363
+ Moped::BSON::ObjectId.mongoize(object_id.to_s)
364
+ end
365
+
366
+ it "mongoizes to an object id" do
367
+ mongoized.should eq(object_id)
368
+ end
369
+ end
370
+
371
+ context "when the string is not a valid object id" do
372
+
373
+ it "returns the key" do
374
+ Moped::BSON::ObjectId.mongoize(composite_key).should eq(
375
+ composite_key
376
+ )
377
+ end
378
+ end
379
+
380
+ context "when the string is empty" do
381
+
382
+ let(:mongoized) do
383
+ Moped::BSON::ObjectId.mongoize("")
384
+ end
385
+
386
+ it "mongoizes to nil" do
387
+ mongoized.should be_nil
388
+ end
389
+ end
390
+ end
391
+
392
+ context "when provided an array" do
393
+
394
+ context "when array key of nils" do
395
+
396
+ let(:mongoized) do
397
+ Moped::BSON::ObjectId.mongoize([ nil, nil ])
398
+ end
399
+
400
+ it "returns an empty array" do
401
+ mongoized.should be_empty
402
+ end
403
+ end
404
+
405
+ context "when the array key is empty strings" do
406
+
407
+ let(:mongoized) do
408
+ Moped::BSON::ObjectId.mongoize([ "", "" ])
409
+ end
410
+
411
+ it "returns an empty array" do
412
+ mongoized.should be_empty
413
+ end
414
+ end
415
+
416
+ context "when the array key is full of strings" do
417
+
418
+ context "when the strings are valid object ids" do
419
+
420
+ let(:other_id) do
421
+ Moped::BSON::ObjectId.new
422
+ end
423
+
424
+ let(:mongoized) do
425
+ Moped::BSON::ObjectId.mongoize([ object_id.to_s, other_id.to_s ])
426
+ end
427
+
428
+ it "mongoizes to an array of object ids" do
429
+ mongoized.should eq([ object_id, other_id ])
430
+ end
431
+ end
432
+
433
+ context "when the strings are not valid object ids" do
434
+
435
+ let(:other_key) do
436
+ "hawaii-five-o"
437
+ end
438
+
439
+ let(:mongoized) do
440
+ Moped::BSON::ObjectId.mongoize([ composite_key, other_key ])
441
+ end
442
+
443
+ it "returns the key" do
444
+ Moped::BSON::ObjectId.mongoize(composite_key).should eq(
445
+ composite_key
446
+ )
447
+ end
448
+ end
449
+ end
450
+ end
451
+
452
+ context "when provided a hash" do
453
+
454
+ context "when the hash key is _id" do
455
+
456
+ context "when the value is an object id" do
457
+
458
+ let(:hash) do
459
+ { _id: object_id }
460
+ end
461
+
462
+ let(:mongoized) do
463
+ Moped::BSON::ObjectId.mongoize(hash)
464
+ end
465
+
466
+ it "returns the hash" do
467
+ mongoized.should eq(hash)
468
+ end
469
+ end
470
+
471
+ context "when the value is an array of object ids" do
472
+
473
+ let(:other_id) do
474
+ Moped::BSON::ObjectId.new
475
+ end
476
+
477
+ let(:hash) do
478
+ { _id: [ object_id, other_id ] }
479
+ end
480
+
481
+ let(:mongoized) do
482
+ Moped::BSON::ObjectId.mongoize(hash)
483
+ end
484
+
485
+ it "returns the hash" do
486
+ mongoized.should eq(hash)
487
+ end
488
+ end
489
+
490
+ context "when the value is a string" do
491
+
492
+ let(:hash) do
493
+ { _id: object_id.to_s }
494
+ end
495
+
496
+ let(:mongoized) do
497
+ Moped::BSON::ObjectId.mongoize(hash)
498
+ end
499
+
500
+ it "returns the hash with mongoized value" do
501
+ mongoized.should eq({ _id: object_id })
502
+ end
503
+ end
504
+
505
+ context "when the value is an array of strings" do
506
+
507
+ let(:other_id) do
508
+ Moped::BSON::ObjectId.new
509
+ end
510
+
511
+ let(:hash) do
512
+ { _id: [ object_id.to_s, other_id.to_s ] }
513
+ end
514
+
515
+ let(:mongoized) do
516
+ Moped::BSON::ObjectId.mongoize(hash)
517
+ end
518
+
519
+ it "returns the hash with mongoized values" do
520
+ mongoized.should eq({ _id: [ object_id, other_id ] })
521
+ end
522
+ end
523
+ end
524
+
525
+ context "when the hash key is id" do
526
+
527
+ context "when the value is an object id" do
528
+
529
+ let(:hash) do
530
+ { id: object_id }
531
+ end
532
+
533
+ let(:mongoized) do
534
+ Moped::BSON::ObjectId.mongoize(hash)
535
+ end
536
+
537
+ it "returns the hash" do
538
+ mongoized.should eq(hash)
539
+ end
540
+ end
541
+
542
+ context "when the value is an array of object ids" do
543
+
544
+ let(:other_id) do
545
+ Moped::BSON::ObjectId.new
546
+ end
547
+
548
+ let(:hash) do
549
+ { id: [ object_id, other_id ] }
550
+ end
551
+
552
+ let(:mongoized) do
553
+ Moped::BSON::ObjectId.mongoize(hash)
554
+ end
555
+
556
+ it "returns the hash" do
557
+ mongoized.should eq(hash)
558
+ end
559
+ end
560
+
561
+ context "when the value is a string" do
562
+
563
+ let(:hash) do
564
+ { id: object_id.to_s }
565
+ end
566
+
567
+ let(:mongoized) do
568
+ Moped::BSON::ObjectId.mongoize(hash)
569
+ end
570
+
571
+ it "returns the hash with mongoized value" do
572
+ mongoized.should eq({ id: object_id })
573
+ end
574
+ end
575
+
576
+ context "when the value is an array of strings" do
577
+
578
+ let(:other_id) do
579
+ Moped::BSON::ObjectId.new
580
+ end
581
+
582
+ let(:hash) do
583
+ { id: [ object_id.to_s, other_id.to_s ] }
584
+ end
585
+
586
+ let(:mongoized) do
587
+ Moped::BSON::ObjectId.mongoize(hash)
588
+ end
589
+
590
+ it "returns the hash with mongoized values" do
591
+ mongoized.should eq({ id: [ object_id, other_id ] })
592
+ end
593
+ end
594
+ end
595
+
596
+ context "when the hash key is not an id" do
597
+
598
+ context "when the value is a string" do
599
+
600
+ let(:hash) do
601
+ { key: composite_key }
602
+ end
603
+
604
+ let(:mongoized) do
605
+ Moped::BSON::ObjectId.mongoize(hash)
606
+ end
607
+
608
+ it "returns the hash" do
609
+ mongoized.should eq(hash)
610
+ end
611
+ end
612
+
613
+ context "when the value is an array of strings" do
614
+
615
+ let(:hash) do
616
+ { key: [ composite_key ] }
617
+ end
618
+
619
+ let(:mongoized) do
620
+ Moped::BSON::ObjectId.mongoize(hash)
621
+ end
622
+
623
+ it "returns the hash" do
624
+ mongoized.should eq(hash)
625
+ end
626
+ end
627
+ end
628
+ end
629
+ end
630
+ end
631
+
632
+ describe ".mongoize" do
633
+
634
+ context "when the class is using object ids" do
635
+
636
+ context "when provided a single object id" do
637
+
638
+ let(:mongoized) do
639
+ Moped::BSON::ObjectId.mongoize(object_id)
640
+ end
641
+
642
+ it "returns the object id" do
643
+ mongoized.should eq(object_id)
644
+ end
645
+ end
646
+
647
+ context "when provided an array of object ids" do
648
+
649
+ let(:other_id) do
650
+ Moped::BSON::ObjectId.new
651
+ end
652
+
653
+ let(:mongoized) do
654
+ Moped::BSON::ObjectId.mongoize([ object_id, other_id ])
655
+ end
656
+
657
+ it "returns the array of object ids" do
658
+ mongoized.should eq([ object_id, other_id ])
659
+ end
660
+ end
661
+
662
+ context "when provided a single string" do
663
+
664
+ context "when the string is a valid object id" do
665
+
666
+ let(:mongoized) do
667
+ Moped::BSON::ObjectId.mongoize(object_id.to_s)
668
+ end
669
+
670
+ it "mongoizes to an object id" do
671
+ mongoized.should eq(object_id)
672
+ end
673
+ end
674
+
675
+ context "when the string is not a valid object id" do
676
+
677
+ it "returns the key" do
678
+ Moped::BSON::ObjectId.mongoize(composite_key).should eq(
679
+ composite_key
680
+ )
681
+ end
682
+ end
683
+
684
+ context "when the string is empty" do
685
+
686
+ let(:mongoized) do
687
+ Moped::BSON::ObjectId.mongoize("")
688
+ end
689
+
690
+ it "mongoizes to nil" do
691
+ mongoized.should be_nil
692
+ end
693
+ end
694
+ end
695
+
696
+ context "when provided an array" do
697
+
698
+ context "when array key of nils" do
699
+
700
+ let(:mongoized) do
701
+ Moped::BSON::ObjectId.mongoize([ nil, nil ])
702
+ end
703
+
704
+ it "returns an empty array" do
705
+ mongoized.should be_empty
706
+ end
707
+ end
708
+
709
+ context "when the array key is empty strings" do
710
+
711
+ let(:mongoized) do
712
+ Moped::BSON::ObjectId.mongoize([ "", "" ])
713
+ end
714
+
715
+ it "returns an empty array" do
716
+ mongoized.should be_empty
717
+ end
718
+ end
719
+
720
+ context "when the array key is full of strings" do
721
+
722
+ context "when the strings are valid object ids" do
723
+
724
+ let(:other_id) do
725
+ Moped::BSON::ObjectId.new
726
+ end
727
+
728
+ let(:mongoized) do
729
+ Moped::BSON::ObjectId.mongoize([ object_id.to_s, other_id.to_s ])
730
+ end
731
+
732
+ it "mongoizes to an array of object ids" do
733
+ mongoized.should eq([ object_id, other_id ])
734
+ end
735
+ end
736
+
737
+ context "when the strings are not valid object ids" do
738
+
739
+ let(:other_key) do
740
+ "hawaii-five-o"
741
+ end
742
+
743
+ let(:mongoized) do
744
+ Moped::BSON::ObjectId.mongoize([ composite_key, other_key ])
745
+ end
746
+
747
+ it "returns the key" do
748
+ Moped::BSON::ObjectId.mongoize(composite_key).should eq(
749
+ composite_key
750
+ )
751
+ end
752
+ end
753
+ end
754
+ end
755
+
756
+ context "when provided a hash" do
757
+
758
+ context "when the hash key is _id" do
759
+
760
+ context "when the value is an object id" do
761
+
762
+ let(:hash) do
763
+ { _id: object_id }
764
+ end
765
+
766
+ let(:mongoized) do
767
+ Moped::BSON::ObjectId.mongoize(hash)
768
+ end
769
+
770
+ it "returns the hash" do
771
+ mongoized.should eq(hash)
772
+ end
773
+ end
774
+
775
+ context "when the value is an array of object ids" do
776
+
777
+ let(:other_id) do
778
+ Moped::BSON::ObjectId.new
779
+ end
780
+
781
+ let(:hash) do
782
+ { _id: [ object_id, other_id ] }
783
+ end
784
+
785
+ let(:mongoized) do
786
+ Moped::BSON::ObjectId.mongoize(hash)
787
+ end
788
+
789
+ it "returns the hash" do
790
+ mongoized.should eq(hash)
791
+ end
792
+ end
793
+
794
+ context "when the value is a string" do
795
+
796
+ let(:hash) do
797
+ { _id: object_id.to_s }
798
+ end
799
+
800
+ let(:mongoized) do
801
+ Moped::BSON::ObjectId.mongoize(hash)
802
+ end
803
+
804
+ it "returns the hash with mongoized value" do
805
+ mongoized.should eq({ _id: object_id })
806
+ end
807
+ end
808
+
809
+ context "when the value is an array of strings" do
810
+
811
+ let(:other_id) do
812
+ Moped::BSON::ObjectId.new
813
+ end
814
+
815
+ let(:hash) do
816
+ { _id: [ object_id.to_s, other_id.to_s ] }
817
+ end
818
+
819
+ let(:mongoized) do
820
+ Moped::BSON::ObjectId.mongoize(hash)
821
+ end
822
+
823
+ it "returns the hash with mongoized values" do
824
+ mongoized.should eq({ _id: [ object_id, other_id ] })
825
+ end
826
+ end
827
+ end
828
+
829
+ context "when the hash key is id" do
830
+
831
+ context "when the value is an object id" do
832
+
833
+ let(:hash) do
834
+ { id: object_id }
835
+ end
836
+
837
+ let(:mongoized) do
838
+ Moped::BSON::ObjectId.mongoize(hash)
839
+ end
840
+
841
+ it "returns the hash" do
842
+ mongoized.should eq(hash)
843
+ end
844
+ end
845
+
846
+ context "when the value is an array of object ids" do
847
+
848
+ let(:other_id) do
849
+ Moped::BSON::ObjectId.new
850
+ end
851
+
852
+ let(:hash) do
853
+ { id: [ object_id, other_id ] }
854
+ end
855
+
856
+ let(:mongoized) do
857
+ Moped::BSON::ObjectId.mongoize(hash)
858
+ end
859
+
860
+ it "returns the hash" do
861
+ mongoized.should eq(hash)
862
+ end
863
+ end
864
+
865
+ context "when the value is a string" do
866
+
867
+ let(:hash) do
868
+ { id: object_id.to_s }
869
+ end
870
+
871
+ let(:mongoized) do
872
+ Moped::BSON::ObjectId.mongoize(hash)
873
+ end
874
+
875
+ it "returns the hash with mongoized value" do
876
+ mongoized.should eq({ id: object_id })
877
+ end
878
+ end
879
+
880
+ context "when the value is an array of strings" do
881
+
882
+ let(:other_id) do
883
+ Moped::BSON::ObjectId.new
884
+ end
885
+
886
+ let(:hash) do
887
+ { id: [ object_id.to_s, other_id.to_s ] }
888
+ end
889
+
890
+ let(:mongoized) do
891
+ Moped::BSON::ObjectId.mongoize(hash)
892
+ end
893
+
894
+ it "returns the hash with mongoized values" do
895
+ mongoized.should eq({ id: [ object_id, other_id ] })
896
+ end
897
+ end
898
+ end
899
+
900
+ context "when the hash key is not an id" do
901
+
902
+ context "when the value is a string" do
903
+
904
+ let(:hash) do
905
+ { key: composite_key }
906
+ end
907
+
908
+ let(:mongoized) do
909
+ Moped::BSON::ObjectId.mongoize(hash)
910
+ end
911
+
912
+ it "returns the hash" do
913
+ mongoized.should eq(hash)
914
+ end
915
+ end
916
+
917
+ context "when the value is an array of strings" do
918
+
919
+ let(:hash) do
920
+ { key: [ composite_key ] }
921
+ end
922
+
923
+ let(:mongoized) do
924
+ Moped::BSON::ObjectId.mongoize(hash)
925
+ end
926
+
927
+ it "returns the hash" do
928
+ mongoized.should eq(hash)
929
+ end
930
+ end
931
+ end
932
+ end
933
+ end
934
+ end
935
+
936
+ describe "#__mongoize_object_id__" do
937
+
938
+ it "returns self" do
939
+ object_id.__mongoize_object_id__.should eq(object_id)
940
+ end
941
+
942
+ it "returns the same instance" do
943
+ object_id.__mongoize_object_id__.should equal(object_id)
944
+ end
945
+ end
946
+ end