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,223 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Validations::LengthValidator do
4
+
5
+ describe "#validate_each" do
6
+
7
+ let(:product) do
8
+ Product.new
9
+ end
10
+
11
+ context "when the field is not localized" do
12
+
13
+ let(:validator) do
14
+ described_class.new(attributes: [:brand_name], in: 1..5)
15
+ end
16
+
17
+ context "when the value is valid" do
18
+
19
+ before do
20
+ validator.validate_each(product, :brand_name, "Apple")
21
+ end
22
+
23
+ it "adds no errors" do
24
+ product.errors[:brand_name].should be_empty
25
+ end
26
+ end
27
+
28
+ context "when the value is invalid" do
29
+
30
+ before do
31
+ validator.validate_each(product, :brand_name, "123456")
32
+ end
33
+
34
+ it "adds errors" do
35
+ product.errors[:brand_name].should eq(
36
+ ["is too long (maximum is 5 characters)"]
37
+ )
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when the field is localized" do
43
+
44
+ let(:validator) do
45
+ described_class.new(attributes: [:website], in: 1..5)
46
+ end
47
+
48
+ context "when the localized value is valid" do
49
+
50
+ before do
51
+ validator.validate_each(product, :website, { "en" => "12345" })
52
+ end
53
+
54
+ it "adds no errors" do
55
+ product.errors[:website].should be_empty
56
+ end
57
+ end
58
+
59
+ context "when one of the localized values is invalid" do
60
+
61
+ before do
62
+ validator.validate_each(
63
+ product,
64
+ :website, { "en" => "12345", "fr" => "123456" }
65
+ )
66
+ end
67
+
68
+ it "adds errors" do
69
+ product.errors[:website].should eq(
70
+ ["is too long (maximum is 5 characters)"]
71
+ )
72
+ end
73
+ end
74
+
75
+ context "when the localized value is invalid" do
76
+
77
+ before do
78
+ validator.validate_each(product, :website, { "en" => "123456" })
79
+ end
80
+
81
+ it "adds errors" do
82
+ product.errors[:website].should eq(
83
+ ["is too long (maximum is 5 characters)"]
84
+ )
85
+ end
86
+ end
87
+ end
88
+
89
+ context "when the field is aliased" do
90
+
91
+ context "when the aliased field name is validated" do
92
+
93
+ let(:validator) do
94
+ described_class.new(attributes: [:sku], in: 1..5)
95
+ end
96
+
97
+ context "when the value is valid" do
98
+
99
+ before do
100
+ validator.validate_each(product, :sku, "12345")
101
+ end
102
+
103
+ it "adds no errors" do
104
+ product.errors[:sku].should be_empty
105
+ end
106
+ end
107
+
108
+ context "when the value is invalid" do
109
+
110
+ before do
111
+ validator.validate_each(product, :sku, "123456")
112
+ end
113
+
114
+ it "adds errors" do
115
+ product.errors[:sku].should eq(["is too long (maximum is 5 characters)"])
116
+ end
117
+ end
118
+ end
119
+
120
+ context "when the underlying field name is validated" do
121
+
122
+ let(:validator) do
123
+ described_class.new(attributes: [:stock_keeping_unit], in: 1..5)
124
+ end
125
+
126
+ context "when the value is valid" do
127
+
128
+ before do
129
+ validator.validate_each(product, :stock_keeping_unit, "12345")
130
+ end
131
+
132
+ it "adds no errors" do
133
+ product.errors[:stock_keeping_unit].should be_empty
134
+ end
135
+ end
136
+
137
+ context "when the value is invalid" do
138
+
139
+ before do
140
+ validator.validate_each(product, :stock_keeping_unit, "123456")
141
+ end
142
+
143
+ it "adds errors" do
144
+ product.errors[:stock_keeping_unit].should eq(["is too long (maximum is 5 characters)"])
145
+ end
146
+ end
147
+ end
148
+
149
+ context "when the field is localized" do
150
+
151
+ let(:validator) do
152
+ described_class.new(attributes: [:tagline], in: 1..5)
153
+ end
154
+
155
+ context "when the localized value is valid" do
156
+
157
+ before do
158
+ validator.validate_each(product, :tagline, { "en" => "12345" })
159
+ end
160
+
161
+ it "adds no errors" do
162
+ product.errors[:tagline].should be_empty
163
+ end
164
+ end
165
+
166
+ context "when one of the localized values is invalid" do
167
+
168
+ before do
169
+ validator.validate_each(
170
+ product,
171
+ :tagline, { "en" => "12345", "fr" => "123456" }
172
+ )
173
+ end
174
+
175
+ it "adds errors" do
176
+ product.errors[:tagline].should eq(["is too long (maximum is 5 characters)"])
177
+ end
178
+ end
179
+
180
+ context "when the localized value is invalid" do
181
+
182
+ before do
183
+ validator.validate_each(product, :tagline, { "en" => "123456" })
184
+ end
185
+
186
+ it "adds errors" do
187
+ product.errors[:tagline].should eq(["is too long (maximum is 5 characters)"])
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
193
+
194
+ context "when validating an array" do
195
+
196
+ before do
197
+ Person.validates :aliases, length: { minimum: 2, allow_blank: false }
198
+ end
199
+
200
+ after do
201
+ Person.reset_callbacks(:validate)
202
+ end
203
+
204
+ context "when allow blank is false" do
205
+
206
+ let(:person) do
207
+ Person.new
208
+ end
209
+
210
+ context "when the array is empty" do
211
+
212
+ before do
213
+ person.array = []
214
+ person.valid?
215
+ end
216
+
217
+ it "adds the errors to the document" do
218
+ person.errors[:aliases].should_not be_empty
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveModel::Validations::NumericalityValidator do
4
+
5
+ describe "#validate_each" do
6
+
7
+ before(:all) do
8
+ class TestModel
9
+ include Mongoid::Document
10
+ field :amount, type: BigDecimal
11
+ validates_numericality_of :amount, allow_blank: false
12
+ end
13
+ end
14
+
15
+ after(:all) do
16
+ Object.send(:remove_const, :TestModel)
17
+ end
18
+
19
+ context "when the value is non numeric" do
20
+
21
+ let(:model) do
22
+ TestModel.new(amount: "asdf")
23
+ end
24
+
25
+ it "returns false" do
26
+ model.should_not be_valid
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,592 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Validations::PresenceValidator do
4
+
5
+ describe "#validate_each" do
6
+
7
+ let(:product) do
8
+ Product.new
9
+ end
10
+
11
+ let(:validator) do
12
+ described_class.new(attributes: product.attributes)
13
+ end
14
+
15
+ context "when the field is not localized" do
16
+
17
+ context "when the value is valid" do
18
+
19
+ before do
20
+ validator.validate_each(product, :brand_name, "Apple")
21
+ end
22
+
23
+ it "adds no errors" do
24
+ product.errors[:brand_name].should be_empty
25
+ end
26
+ end
27
+
28
+ context "when the value is nil" do
29
+
30
+ before do
31
+ validator.validate_each(product, :brand_name, nil)
32
+ end
33
+
34
+ it "adds errors" do
35
+ product.errors[:brand_name].should eq(["can't be blank"])
36
+ end
37
+ end
38
+
39
+ context "when the value is empty" do
40
+
41
+ before do
42
+ validator.validate_each(product, :brand_name, "")
43
+ end
44
+
45
+ it "adds errors" do
46
+ product.errors[:brand_name].should eq(["can't be blank"])
47
+ end
48
+ end
49
+ end
50
+
51
+ context "when the field is localized" do
52
+
53
+ context "when the value is valid" do
54
+
55
+ before do
56
+ validator.validate_each(product, :name, { "en" => "iPod Nano 8GB - Black" })
57
+ end
58
+
59
+ it "adds no errors" do
60
+ product.errors[:name].should be_empty
61
+ end
62
+ end
63
+
64
+ context "when the value is nil" do
65
+
66
+ before do
67
+ validator.validate_each(product, :name, nil)
68
+ end
69
+
70
+ it "adds errors" do
71
+ product.errors[:name].should eq(["can't be blank"])
72
+ end
73
+ end
74
+
75
+ context "when the localized value is nil" do
76
+
77
+ before do
78
+ validator.validate_each(product, :name, { "en" => nil })
79
+ end
80
+
81
+ it "adds errors" do
82
+ product.errors[:name].should eq(["can't be blank in en"])
83
+ end
84
+ end
85
+
86
+ context "when the value is empty" do
87
+
88
+ before do
89
+ validator.validate_each(product, :name, { "en" => "" })
90
+ end
91
+
92
+ it "adds errors" do
93
+ product.errors[:name].should eq(["can't be blank in en"])
94
+ end
95
+ end
96
+
97
+ context "when the value is empty for a language" do
98
+
99
+ before do
100
+ validator.validate_each(
101
+ product,
102
+ :name,
103
+ { "en" => "iPod Nano 8GB - Black", "de" => "" }
104
+ )
105
+ end
106
+
107
+ it "adds errors" do
108
+ product.errors[:name].should eq(["can't be blank in de"])
109
+ end
110
+ end
111
+
112
+ context "when the value is empty for all language" do
113
+
114
+ before do
115
+ validator.validate_each(
116
+ product,
117
+ :name,
118
+ { "en" => "", "de" => "" }
119
+ )
120
+ end
121
+
122
+ it "adds errors" do
123
+ product.errors[:name].should eq(["can't be blank in en", "can't be blank in de"])
124
+ end
125
+ end
126
+ end
127
+
128
+ context "when the field is aliased" do
129
+
130
+ context "when the aliased field name is validated" do
131
+
132
+ context "when the value is valid" do
133
+
134
+ before do
135
+ validator.validate_each(product, :sku, "12345")
136
+ end
137
+
138
+ it "adds no errors" do
139
+ product.errors[:sku].should be_empty
140
+ end
141
+ end
142
+
143
+ context "when the value is invalid" do
144
+
145
+ before do
146
+ validator.validate_each(product, :sku, nil)
147
+ end
148
+
149
+ it "adds errors" do
150
+ product.errors[:sku].should eq(["can't be blank"])
151
+ end
152
+ end
153
+ end
154
+
155
+ context "when the underlying field name is validated" do
156
+
157
+ context "when the value is valid" do
158
+
159
+ before do
160
+ validator.validate_each(product, :stock_keeping_unit, "12345")
161
+ end
162
+
163
+ it "adds no errors" do
164
+ product.errors[:stock_keeping_unit].should be_empty
165
+ end
166
+ end
167
+
168
+ context "when the value is invalid" do
169
+
170
+ before do
171
+ validator.validate_each(product, :stock_keeping_unit, nil)
172
+ end
173
+
174
+ it "adds errors" do
175
+ product.errors[:stock_keeping_unit].should eq(["can't be blank"])
176
+ end
177
+ end
178
+ end
179
+
180
+ context "when the field is localized" do
181
+
182
+ context "when the localized value is valid" do
183
+
184
+ before do
185
+ validator.validate_each(product, :tagline, { "en" => "12345" })
186
+ end
187
+
188
+ it "adds no errors" do
189
+ product.errors[:tagline].should be_empty
190
+ end
191
+ end
192
+
193
+ context "when one of the localized values is invalid" do
194
+
195
+ before do
196
+ validator.validate_each(
197
+ product,
198
+ :tagline, { "en" => "12345", "fr" => nil }
199
+ )
200
+ end
201
+
202
+ it "adds errors" do
203
+ product.errors[:tagline].should eq(["can't be blank in fr"])
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
209
+
210
+ context "when validating a relation" do
211
+
212
+ context "when the relation is a has one" do
213
+
214
+ before do
215
+ Person.autosaved_relations.delete_one(:game)
216
+ Person.validates :game, presence: true
217
+ end
218
+
219
+ after do
220
+ Person.autosaved_relations.clear
221
+ Person.reset_callbacks(:save)
222
+ Person.reset_callbacks(:validate)
223
+ end
224
+
225
+ context "when the relation is new" do
226
+
227
+ let(:person) do
228
+ Person.new
229
+ end
230
+
231
+ context "when the base is valid" do
232
+
233
+ let!(:game) do
234
+ person.build_game
235
+ end
236
+
237
+ context "when saving the base" do
238
+
239
+ before do
240
+ person.save
241
+ end
242
+
243
+ it "saves the relation" do
244
+ game.reload.should eq(game)
245
+ end
246
+ end
247
+ end
248
+ end
249
+ end
250
+
251
+ context "when the relation is a has one and autosave is false" do
252
+
253
+ before do
254
+ Person.relations["game"][:autosave] = false
255
+ Person.validates :game, presence: true
256
+ end
257
+
258
+ after do
259
+ Person.reset_callbacks(:validate)
260
+ end
261
+
262
+ it "does not change autosave on the relation" do
263
+ Person.relations["game"][:autosave].should be_false
264
+ end
265
+
266
+ it "does not add any autosaved relations" do
267
+ Person.autosaved_relations.should be_empty
268
+ end
269
+
270
+ context "when the relation is new" do
271
+
272
+ let(:person) do
273
+ Person.new
274
+ end
275
+
276
+ context "when the base is valid" do
277
+
278
+ let!(:game) do
279
+ person.build_game
280
+ end
281
+
282
+ context "when saving the base" do
283
+
284
+ before do
285
+ person.save
286
+ end
287
+
288
+ it "does not save the relation" do
289
+ expect { game.reload }.to raise_error
290
+ end
291
+ end
292
+ end
293
+ end
294
+ end
295
+
296
+ context "when the relation is a belongs to" do
297
+
298
+ let(:product) do
299
+ Product.create(name: "testing")
300
+ end
301
+
302
+ context "when the relation is present" do
303
+
304
+ let(:purchase) do
305
+ Purchase.create
306
+ end
307
+
308
+ let(:line_item) do
309
+ purchase.line_items.create(product: product)
310
+ end
311
+
312
+ context "when the foreign key is nil" do
313
+
314
+ before do
315
+ line_item.attributes["product_id"] = nil
316
+ end
317
+
318
+ it "is not valid" do
319
+ line_item.should_not be_valid
320
+ end
321
+ end
322
+ end
323
+ end
324
+
325
+ context "when the relation is a many to many" do
326
+
327
+ before do
328
+ Person.validates :houses, presence: true
329
+ end
330
+
331
+ after do
332
+ Person.autosaved_relations.clear
333
+ Person.reset_callbacks(:save)
334
+ Person.reset_callbacks(:validate)
335
+ end
336
+
337
+ context "when the relation has documents" do
338
+
339
+ let!(:house) do
340
+ House.create
341
+ end
342
+
343
+ let!(:person) do
344
+ Person.create(houses: [ house ])
345
+ end
346
+
347
+ context "when the relation is loaded from the db" do
348
+
349
+ let(:loaded) do
350
+ Person.find(person.id)
351
+ end
352
+
353
+ it "is valid" do
354
+ loaded.should be_valid
355
+ end
356
+ end
357
+
358
+ context "when the relation is in memory" do
359
+
360
+ it "is valid" do
361
+ person.should be_valid
362
+ end
363
+ end
364
+ end
365
+ end
366
+ end
367
+
368
+ context "when validating a localized field" do
369
+
370
+ context "when any translation is blank" do
371
+
372
+ let(:product) do
373
+ Product.new
374
+ end
375
+
376
+ before do
377
+ product.name_translations = { "de" => "" }
378
+ end
379
+
380
+ it "is not a valid document" do
381
+ product.should_not be_valid
382
+ end
383
+
384
+ it "includes the proper errors" do
385
+ product.valid?
386
+ product.errors[:name].should_not be_empty
387
+ end
388
+ end
389
+
390
+ context "when any translation is nil" do
391
+
392
+ let(:product) do
393
+ Product.new
394
+ end
395
+
396
+ before do
397
+ product.name_translations = { "de" => nil }
398
+ end
399
+
400
+ it "is not a valid document" do
401
+ product.should_not be_valid
402
+ end
403
+
404
+ it "includes the proper errors" do
405
+ product.valid?
406
+ product.errors[:name].should_not be_empty
407
+ end
408
+ end
409
+
410
+ context "when the entire field is nil" do
411
+
412
+ let(:product) do
413
+ Product.new
414
+ end
415
+
416
+ before do
417
+ product.name_translations = nil
418
+ end
419
+
420
+ it "is not a valid document" do
421
+ product.should_not be_valid
422
+ end
423
+
424
+ it "includes the proper errors" do
425
+ product.valid?
426
+ product.errors[:name].should_not be_empty
427
+ end
428
+ end
429
+
430
+ context "when the entire field is empty" do
431
+
432
+ let(:product) do
433
+ Product.new
434
+ end
435
+
436
+ before do
437
+ product.name_translations = {}
438
+ end
439
+
440
+ it "is not a valid document" do
441
+ product.should_not be_valid
442
+ end
443
+
444
+ it "includes the proper errors" do
445
+ product.valid?
446
+ product.errors[:name].should_not be_empty
447
+ end
448
+ end
449
+
450
+ context "when the translations are present" do
451
+
452
+ let(:product) do
453
+ Product.new
454
+ end
455
+
456
+ before do
457
+ product.name_translations = { "en" => "test" }
458
+ end
459
+
460
+ it "is a valid document" do
461
+ product.should be_valid
462
+ end
463
+ end
464
+ end
465
+
466
+ context "when presence_of array attribute is updated and saved" do
467
+
468
+ let(:updated_products) do
469
+ [ "Laptop", "Tablet", "Smartphone", "Desktop" ]
470
+ end
471
+
472
+ let(:manufacturer) do
473
+ Manufacturer.create!(products: [ "Laptop", "Tablet" ])
474
+ end
475
+
476
+ before do
477
+ manufacturer.products = updated_products
478
+ manufacturer.save!
479
+ end
480
+
481
+ let(:reloaded) do
482
+ Manufacturer.find(manufacturer.id)
483
+ end
484
+
485
+ it "persists the changes" do
486
+ reloaded.products.should eq(updated_products)
487
+ end
488
+ end
489
+
490
+ context "when an array attribute has been updated" do
491
+
492
+ let(:updated_products) do
493
+ [ "Laptop", "Tablet", "Smartphone", "Desktop" ]
494
+ end
495
+
496
+ let(:manufacturer) do
497
+ Manufacturer.create!(products: [ "Laptop", "Tablet" ])
498
+ end
499
+
500
+ context "when retrieved, flattened and iterated" do
501
+
502
+ before do
503
+ manufacturer.products = updated_products
504
+ attrs = manufacturer.attributes
505
+ [attrs].flatten.each { |attr| }
506
+ end
507
+
508
+ it "does not destroy the models change list" do
509
+ manufacturer.changes.should_not be_empty
510
+ end
511
+
512
+ it "maintains the list of changes" do
513
+ manufacturer.changes.should eq({
514
+ "products" => [
515
+ [ "Laptop", "Tablet" ],
516
+ [ "Laptop", "Tablet", "Smartphone", "Desktop" ]
517
+ ]
518
+ })
519
+ end
520
+ end
521
+ end
522
+
523
+ context "when validating a boolean false value" do
524
+
525
+ let(:template) do
526
+ Template.new
527
+ end
528
+
529
+ context "when the value is false" do
530
+
531
+ it "is a valid document" do
532
+ template.should be_valid
533
+ end
534
+ end
535
+
536
+ context "when the value is true" do
537
+
538
+ before do
539
+ template.active = true
540
+ end
541
+
542
+ it "is a valid document" do
543
+ template.should be_valid
544
+ end
545
+ end
546
+ end
547
+
548
+ context "when describing validation on the instance level" do
549
+
550
+ let!(:dictionary) do
551
+ Dictionary.create!(name: "en")
552
+ end
553
+
554
+ let(:validators) do
555
+ dictionary.validates_presence_of :name
556
+ end
557
+
558
+ it "adds the validation only to the instance" do
559
+ validators.should eq([ described_class ])
560
+ end
561
+ end
562
+
563
+ context "when validating an array" do
564
+
565
+ before do
566
+ Person.validates :aliases, presence: { allow_blank: false }
567
+ end
568
+
569
+ after do
570
+ Person.reset_callbacks(:validate)
571
+ end
572
+
573
+ context "when allow blank is false" do
574
+
575
+ let(:person) do
576
+ Person.new
577
+ end
578
+
579
+ context "when the array is empty" do
580
+
581
+ before do
582
+ person.array = []
583
+ person.valid?
584
+ end
585
+
586
+ it "adds the errors to the document" do
587
+ person.errors[:aliases].should_not be_empty
588
+ end
589
+ end
590
+ end
591
+ end
592
+ end