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,694 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Fields::ForeignKey do
4
+
5
+ describe "#add_atomic_changes" do
6
+
7
+ let(:field) do
8
+ described_class.new(
9
+ :vals,
10
+ metadata: Person.relations["preferences"],
11
+ type: Array,
12
+ default: [],
13
+ identity: true
14
+ )
15
+ end
16
+
17
+ let(:person) do
18
+ Person.new
19
+ end
20
+
21
+ let(:preference_one) do
22
+ Preference.new
23
+ end
24
+
25
+ let(:preference_two) do
26
+ Preference.new
27
+ end
28
+
29
+ let(:preference_three) do
30
+ Preference.new
31
+ end
32
+
33
+ let(:mods) do
34
+ {}
35
+ end
36
+
37
+ before do
38
+ person.preferences.concat([ preference_one, preference_three ])
39
+ end
40
+
41
+ context "when adding and removing" do
42
+
43
+ before do
44
+ field.add_atomic_changes(
45
+ person,
46
+ "preference_ids",
47
+ "preference_ids",
48
+ mods,
49
+ [ preference_three.id ],
50
+ [ preference_two.id ]
51
+ )
52
+ end
53
+
54
+ it "adds the current to the modifications" do
55
+ mods["preference_ids"].should eq(
56
+ [ preference_one.id, preference_three.id ]
57
+ )
58
+ end
59
+ end
60
+ end
61
+
62
+ describe "#eval_default" do
63
+
64
+ let(:default) do
65
+ [ Moped::BSON::ObjectId.new ]
66
+ end
67
+
68
+ let(:field) do
69
+ described_class.new(
70
+ :vals,
71
+ metadata: Person.relations["posts"],
72
+ type: Array,
73
+ default: default,
74
+ identity: true
75
+ )
76
+ end
77
+
78
+ it "dups the default value" do
79
+ field.eval_default(Person.new).should_not equal(default)
80
+ end
81
+
82
+ it "returns the correct value" do
83
+ field.eval_default(Person.new).should eq(default)
84
+ end
85
+ end
86
+
87
+ describe "#foreign_key?" do
88
+
89
+ let(:field) do
90
+ described_class.new(
91
+ :vals,
92
+ metadata: Person.relations["posts"],
93
+ type: Array,
94
+ default: [],
95
+ identity: true
96
+ )
97
+ end
98
+
99
+ it "returns true" do
100
+ field.should be_foreign_key
101
+ end
102
+ end
103
+
104
+ describe "#evolve" do
105
+
106
+ let(:metadata) do
107
+ Person.reflect_on_association(:preferences)
108
+ end
109
+
110
+ context "when provided a document" do
111
+
112
+ let(:field) do
113
+ described_class.new(:person_id, type: Object, metadata: metadata)
114
+ end
115
+
116
+ let(:game) do
117
+ Game.new
118
+ end
119
+
120
+ let(:evolved) do
121
+ field.evolve(game)
122
+ end
123
+
124
+ it "returns the id for the document" do
125
+ evolved.should eq(game.id)
126
+ end
127
+ end
128
+
129
+ context "when the type is an array" do
130
+
131
+ let(:field) do
132
+ described_class.new(:preference_ids, type: Array, default: [], metadata: metadata)
133
+ end
134
+
135
+ context "when providing a single value" do
136
+
137
+ context "when the value is an id string" do
138
+
139
+ let(:id) do
140
+ Moped::BSON::ObjectId.new
141
+ end
142
+
143
+ let(:evolved) do
144
+ field.evolve(id.to_s)
145
+ end
146
+
147
+ it "converts the value to an object id" do
148
+ evolved.should eq(id)
149
+ end
150
+ end
151
+
152
+ context "when the value is a normal string" do
153
+
154
+ let(:evolved) do
155
+ field.evolve("testing")
156
+ end
157
+
158
+ it "does not convert the value" do
159
+ evolved.should eq("testing")
160
+ end
161
+ end
162
+
163
+ context "when the value is an empty string" do
164
+
165
+ let(:evolved) do
166
+ field.evolve("")
167
+ end
168
+
169
+ it "does not convert the value" do
170
+ evolved.should be_empty
171
+ end
172
+ end
173
+ end
174
+
175
+ context "when providing an array" do
176
+
177
+ context "when the values are id strings" do
178
+
179
+ context "when the relation stores ids as object ids" do
180
+
181
+ let(:id_one) do
182
+ Moped::BSON::ObjectId.new
183
+ end
184
+
185
+ let(:id_two) do
186
+ Moped::BSON::ObjectId.new
187
+ end
188
+
189
+ let(:evolved) do
190
+ field.evolve([ id_one.to_s, id_two.to_s ])
191
+ end
192
+
193
+ it "converts the value to an object id" do
194
+ evolved.should eq([ id_one, id_two ])
195
+ end
196
+ end
197
+
198
+ context "when the relation stores ids as strings" do
199
+
200
+ let!(:metadata) do
201
+ Agent.reflect_on_association(:accounts)
202
+ end
203
+
204
+ let!(:field) do
205
+ described_class.new(:account_ids, type: Array, default: [], metadata: metadata)
206
+ end
207
+
208
+ let(:id_one) do
209
+ Moped::BSON::ObjectId.new.to_s
210
+ end
211
+
212
+ let(:id_two) do
213
+ Moped::BSON::ObjectId.new.to_s
214
+ end
215
+
216
+ let(:evolved) do
217
+ field.evolve([ id_one, id_two ])
218
+ end
219
+
220
+ it "does not convert the values to object ids" do
221
+ evolved.should eq([ id_one, id_two ])
222
+ end
223
+ end
224
+ end
225
+
226
+ context "when the values are normal strings" do
227
+
228
+ let(:evolved) do
229
+ field.evolve([ "testing" ])
230
+ end
231
+
232
+ it "does not convert the value" do
233
+ evolved.should eq([ "testing" ])
234
+ end
235
+ end
236
+
237
+ context "when the values are empty strings" do
238
+
239
+ let(:evolved) do
240
+ field.evolve([ "" ])
241
+ end
242
+
243
+ it "does not convert the value" do
244
+ evolved.should eq([ "" ])
245
+ end
246
+ end
247
+
248
+ context "when the values are nils" do
249
+
250
+ let(:evolved) do
251
+ field.evolve([ nil ])
252
+ end
253
+
254
+ it "does not convert the value" do
255
+ evolved.should eq([ nil ])
256
+ end
257
+ end
258
+ end
259
+ end
260
+
261
+ context "when the type is an object" do
262
+
263
+ let(:metadata) do
264
+ Game.reflect_on_association(:person)
265
+ end
266
+
267
+ let(:field) do
268
+ described_class.new(:person_id, type: Object, metadata: metadata)
269
+ end
270
+
271
+ context "when providing a single value" do
272
+
273
+ context "when the relation stores object ids" do
274
+
275
+ context "when the value is an id string" do
276
+
277
+ let(:id) do
278
+ Moped::BSON::ObjectId.new
279
+ end
280
+
281
+ let(:evolved) do
282
+ field.evolve(id.to_s)
283
+ end
284
+
285
+ it "converts the value to an object id" do
286
+ evolved.should eq(id)
287
+ end
288
+ end
289
+
290
+ context "when the value is a normal string" do
291
+
292
+ let(:evolved) do
293
+ field.evolve("testing")
294
+ end
295
+
296
+ it "does not convert the value" do
297
+ evolved.should eq("testing")
298
+ end
299
+ end
300
+
301
+ context "when the value is an empty string" do
302
+
303
+ let(:evolved) do
304
+ field.evolve("")
305
+ end
306
+
307
+ it "does not convert the value" do
308
+ evolved.should be_empty
309
+ end
310
+ end
311
+ end
312
+
313
+ context "when the relation stores string ids" do
314
+
315
+ let(:metadata) do
316
+ Comment.reflect_on_association(:account)
317
+ end
318
+
319
+ let(:field) do
320
+ described_class.new(:person_id, type: Object, metadata: metadata)
321
+ end
322
+
323
+ context "when the value is an id string" do
324
+
325
+ let(:id) do
326
+ Moped::BSON::ObjectId.new
327
+ end
328
+
329
+ let(:evolved) do
330
+ field.evolve(id.to_s)
331
+ end
332
+
333
+ it "does not convert the value to an object id" do
334
+ evolved.should eq(id.to_s)
335
+ end
336
+ end
337
+
338
+ context "when the value is a normal string" do
339
+
340
+ let(:evolved) do
341
+ field.evolve("testing")
342
+ end
343
+
344
+ it "does not convert the value" do
345
+ evolved.should eq("testing")
346
+ end
347
+ end
348
+
349
+ context "when the value is an empty string" do
350
+
351
+ let(:evolved) do
352
+ field.evolve("")
353
+ end
354
+
355
+ it "does not convert the value" do
356
+ evolved.should be_empty
357
+ end
358
+ end
359
+ end
360
+ end
361
+
362
+ context "when providing an array" do
363
+
364
+ context "when the values are id strings" do
365
+
366
+ context "when the relation stores ids as object ids" do
367
+
368
+ let(:id_one) do
369
+ Moped::BSON::ObjectId.new
370
+ end
371
+
372
+ let(:id_two) do
373
+ Moped::BSON::ObjectId.new
374
+ end
375
+
376
+ let(:evolved) do
377
+ field.evolve([ id_one.to_s, id_two.to_s ])
378
+ end
379
+
380
+ it "converts the value to an object id" do
381
+ evolved.should eq([ id_one, id_two ])
382
+ end
383
+ end
384
+
385
+ context "when the relation stores ids as strings" do
386
+
387
+ let(:metadata) do
388
+ Comment.reflect_on_association(:account)
389
+ end
390
+
391
+ let(:field) do
392
+ described_class.new(:person_id, type: Object, metadata: metadata)
393
+ end
394
+
395
+ let(:id_one) do
396
+ Moped::BSON::ObjectId.new.to_s
397
+ end
398
+
399
+ let(:id_two) do
400
+ Moped::BSON::ObjectId.new.to_s
401
+ end
402
+
403
+ let(:evolved) do
404
+ field.evolve([ id_one, id_two ])
405
+ end
406
+
407
+ it "does not convert the values to object ids" do
408
+ evolved.should eq([ id_one, id_two ])
409
+ end
410
+ end
411
+ end
412
+
413
+ context "when the values are normal strings" do
414
+
415
+ let(:evolved) do
416
+ field.evolve([ "testing" ])
417
+ end
418
+
419
+ it "does not convert the value" do
420
+ evolved.should eq([ "testing" ])
421
+ end
422
+ end
423
+
424
+ context "when the values are empty strings" do
425
+
426
+ let(:evolved) do
427
+ field.evolve([ "" ])
428
+ end
429
+
430
+ it "does not convert the value" do
431
+ evolved.should eq([ "" ])
432
+ end
433
+ end
434
+
435
+ context "when the values are nils" do
436
+
437
+ let(:evolved) do
438
+ field.evolve([ nil ])
439
+ end
440
+
441
+ it "does not convert the value" do
442
+ evolved.should eq([ nil ])
443
+ end
444
+ end
445
+ end
446
+ end
447
+ end
448
+
449
+ describe "#lazy?" do
450
+
451
+ context "when the key is resizable" do
452
+
453
+ let(:field) do
454
+ described_class.new(:test, type: Array)
455
+ end
456
+
457
+ it "returns true" do
458
+ field.should be_lazy
459
+ end
460
+ end
461
+
462
+ context "when the key is not resizable" do
463
+
464
+ let(:field) do
465
+ described_class.new(:test, type: Moped::BSON::ObjectId)
466
+ end
467
+
468
+ it "returns false" do
469
+ field.should_not be_lazy
470
+ end
471
+ end
472
+ end
473
+
474
+ describe "#mongoize" do
475
+
476
+ context "when the type is array" do
477
+
478
+ context "when the array is object ids" do
479
+
480
+ let(:metadata) do
481
+ Mongoid::Relations::Metadata.new(
482
+ inverse_class_name: "Game",
483
+ name: :person,
484
+ relation: Mongoid::Relations::Referenced::In
485
+ )
486
+ end
487
+
488
+ let(:field) do
489
+ described_class.new(
490
+ :vals,
491
+ type: Array,
492
+ default: [],
493
+ identity: true,
494
+ metadata: metadata
495
+ )
496
+ end
497
+
498
+ context "when provided nil" do
499
+
500
+ it "returns an empty array" do
501
+ field.mongoize(nil).should be_empty
502
+ end
503
+ end
504
+
505
+ context "when provided an empty array" do
506
+
507
+ let(:array) do
508
+ []
509
+ end
510
+
511
+ it "returns an empty array" do
512
+ field.mongoize(array).should eq(array)
513
+ end
514
+
515
+ it "returns the same instance" do
516
+ field.mongoize(array).should equal(array)
517
+ end
518
+ end
519
+
520
+ context "when using object ids" do
521
+
522
+ let(:object_id) do
523
+ Moped::BSON::ObjectId.new
524
+ end
525
+
526
+ it "performs conversion on the ids if strings" do
527
+ field.mongoize([object_id.to_s]).should eq([object_id])
528
+ end
529
+ end
530
+
531
+ context "when not using object ids" do
532
+
533
+ let(:object_id) do
534
+ Moped::BSON::ObjectId.new
535
+ end
536
+
537
+ before do
538
+ Person.field(
539
+ :_id,
540
+ type: String,
541
+ pre_processed: true,
542
+ default: ->{ Moped::BSON::ObjectId.new.to_s }
543
+ )
544
+ end
545
+
546
+ after do
547
+ Person.field(
548
+ :_id,
549
+ type: Moped::BSON::ObjectId,
550
+ pre_processed: true,
551
+ default: ->{ Moped::BSON::ObjectId.new }
552
+ )
553
+ end
554
+
555
+ it "does not convert" do
556
+ field.mongoize([object_id.to_s]).should eq([object_id.to_s])
557
+ end
558
+ end
559
+ end
560
+ end
561
+
562
+ context "when the type is object" do
563
+
564
+ context "when the array is object ids" do
565
+
566
+ let(:metadata) do
567
+ Mongoid::Relations::Metadata.new(
568
+ inverse_class_name: "Game",
569
+ name: :person,
570
+ relation: Mongoid::Relations::Referenced::In
571
+ )
572
+ end
573
+
574
+ let(:field) do
575
+ described_class.new(
576
+ :vals,
577
+ type: Object,
578
+ default: nil,
579
+ identity: true,
580
+ metadata: metadata
581
+ )
582
+ end
583
+
584
+ context "when using object ids" do
585
+
586
+ let(:object_id) do
587
+ Moped::BSON::ObjectId.new
588
+ end
589
+
590
+ it "performs conversion on the ids if strings" do
591
+ field.mongoize(object_id.to_s).should eq(object_id)
592
+ end
593
+ end
594
+
595
+ context "when not using object ids" do
596
+
597
+ context "when using strings" do
598
+
599
+ context "when provided a string" do
600
+
601
+ let(:object_id) do
602
+ Moped::BSON::ObjectId.new
603
+ end
604
+
605
+ before do
606
+ Person.field(
607
+ :_id,
608
+ type: String,
609
+ pre_processed: true,
610
+ default: ->{ Moped::BSON::ObjectId.new.to_s }
611
+ )
612
+ end
613
+
614
+ after do
615
+ Person.field(
616
+ :_id,
617
+ type: Moped::BSON::ObjectId,
618
+ pre_processed: true,
619
+ default: ->{ Moped::BSON::ObjectId.new }
620
+ )
621
+ end
622
+
623
+ it "does not convert" do
624
+ field.mongoize(object_id.to_s).should eq(object_id.to_s)
625
+ end
626
+ end
627
+ end
628
+
629
+ context "when using integers" do
630
+
631
+ context "when provided a string" do
632
+
633
+ before do
634
+ Person.field(:_id, type: Integer)
635
+ end
636
+
637
+ after do
638
+ Person.field(
639
+ :_id,
640
+ type: Moped::BSON::ObjectId,
641
+ pre_processed: true,
642
+ default: ->{ Moped::BSON::ObjectId.new }
643
+ )
644
+ end
645
+
646
+ it "converts the string to an integer" do
647
+ field.mongoize("1").should eq(1)
648
+ end
649
+ end
650
+ end
651
+ end
652
+ end
653
+ end
654
+ end
655
+
656
+ describe "#resizable" do
657
+
658
+ context "when the type is an array" do
659
+
660
+ let(:field) do
661
+ described_class.new(:vals, type: Array, default: [])
662
+ end
663
+
664
+ it "returns true" do
665
+ field.should be_resizable
666
+ end
667
+ end
668
+
669
+ context "when the type is an object" do
670
+
671
+ let(:field) do
672
+ described_class.new(:vals, type: Object, default: [])
673
+ end
674
+
675
+ it "returns false" do
676
+ field.should_not be_resizable
677
+ end
678
+ end
679
+ end
680
+
681
+ context "when the foreign key points is a many to many" do
682
+
683
+ context "when the related document stores non object ids" do
684
+
685
+ let(:agent) do
686
+ Agent.new(account_ids: [ true, false, 1, 2 ])
687
+ end
688
+
689
+ it "casts the ids on the initial set" do
690
+ agent.account_ids.should eq([ "true", "false", "1", "2" ])
691
+ end
692
+ end
693
+ end
694
+ end