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,99 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Builders::Embedded::One do
4
+
5
+ let(:base) do
6
+ stub
7
+ end
8
+
9
+ let(:builder) do
10
+ described_class.new(base, metadata, object)
11
+ end
12
+
13
+ describe "#build" do
14
+
15
+ context "when provided nil" do
16
+
17
+ let(:metadata) do
18
+ stub(klass: Name, name: :name)
19
+ end
20
+
21
+ let(:builder) do
22
+ described_class.new(nil, metadata, nil)
23
+ end
24
+
25
+ let(:document) do
26
+ builder.build
27
+ end
28
+
29
+ it "returns nil" do
30
+ document.should be_nil
31
+ end
32
+ end
33
+
34
+ context "when provided a document" do
35
+
36
+ let(:metadata) do
37
+ stub(klass: Name, name: :name)
38
+ end
39
+
40
+ let(:object) do
41
+ Name.new
42
+ end
43
+
44
+ let(:document) do
45
+ builder.build
46
+ end
47
+
48
+ it "returns the document" do
49
+ document.should eq(object)
50
+ end
51
+ end
52
+
53
+ context "when no type is in the object" do
54
+
55
+ let(:metadata) do
56
+ stub(klass: Name, name: :name)
57
+ end
58
+
59
+ let(:object) do
60
+ { "first_name" => "Corbin" }
61
+ end
62
+
63
+ let(:document) do
64
+ builder.build
65
+ end
66
+
67
+ it "creates the correct type of document" do
68
+ document.should be_a_kind_of(Name)
69
+ end
70
+
71
+ it "sets the object on the document" do
72
+ document.first_name.should eq("Corbin")
73
+ end
74
+ end
75
+
76
+ context "when a type is in the object" do
77
+
78
+ let(:metadata) do
79
+ stub(klass: Writer, name: :writer)
80
+ end
81
+
82
+ let(:object) do
83
+ { "_type" => PdfWriter.name, "speed" => 100 }
84
+ end
85
+
86
+ let(:document) do
87
+ builder.build
88
+ end
89
+
90
+ it "creates the correct type of document" do
91
+ document.should be_a_kind_of(PdfWriter)
92
+ end
93
+
94
+ it "sets the object on the document" do
95
+ document.speed.should eq(100)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,234 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Builders::NestedAttributes::Many do
4
+
5
+ let(:metadata) do
6
+ Mongoid::Relations::Metadata.new(
7
+ name: :addresses,
8
+ relation: Mongoid::Relations::Embedded::Many
9
+ )
10
+ end
11
+
12
+ let(:person) do
13
+ Person.new
14
+ end
15
+
16
+ describe "#allow_destroy?" do
17
+
18
+ context "when the option is provided" do
19
+
20
+ let(:builder) do
21
+ described_class.new(metadata, {}, allow_destroy: true)
22
+ end
23
+
24
+ it "returns the option" do
25
+ builder.allow_destroy?.should be_true
26
+ end
27
+ end
28
+
29
+ context "when the option is not provided" do
30
+
31
+ let(:builder) do
32
+ described_class.new(metadata, {}, {})
33
+ end
34
+
35
+ it "returns false" do
36
+ builder.allow_destroy?.should be_false
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "#build" do
42
+
43
+ let(:attributes) do
44
+ {
45
+ "foo" => { "street" => "Maybachufer" },
46
+ "bar" => { "street" => "Alexander Platz" },
47
+ "baz" => { "street" => "Unter den Linden" }
48
+ }
49
+ end
50
+
51
+ context "when attributes are over limit" do
52
+
53
+ let(:builder) do
54
+ described_class.new(metadata, attributes, limit: 2)
55
+ end
56
+
57
+ it "raises an error" do
58
+ expect {
59
+ builder.build(person)
60
+ }.to raise_error(Mongoid::Errors::TooManyNestedAttributeRecords)
61
+ end
62
+ end
63
+
64
+ context "when rejectable using a proc" do
65
+
66
+ let(:builder) do
67
+ described_class.new(
68
+ metadata,
69
+ attributes,
70
+ reject_if: ->(attrs){ attrs[:city].blank? }
71
+ )
72
+ end
73
+
74
+ before do
75
+ builder.build(person)
76
+ end
77
+
78
+ it "rejects the matching attributes" do
79
+ person.addresses.should be_empty
80
+ end
81
+
82
+ end
83
+
84
+ context "when rejectable using a symbol" do
85
+
86
+ let(:builder) do
87
+ described_class.new(
88
+ metadata,
89
+ attributes,
90
+ reject_if: :reject_if_city_is_empty
91
+ )
92
+ end
93
+
94
+ before do
95
+ builder.build(person)
96
+ end
97
+
98
+ it "rejects the matching attributes" do
99
+ person.addresses.should be_empty
100
+ end
101
+
102
+ end
103
+
104
+ context "when ids are present" do
105
+
106
+ let!(:address) do
107
+ person.addresses.build(street: "Alexander Platz")
108
+ end
109
+
110
+ let(:attributes) do
111
+ { "foo" => { "id" => address.id, "street" => "Maybachufer" } }
112
+ end
113
+
114
+ let(:builder) do
115
+ described_class.new(metadata, attributes)
116
+ end
117
+
118
+ before do
119
+ builder.build(person)
120
+ end
121
+
122
+ it "updates existing documents" do
123
+ person.addresses.first.street.should eq("Maybachufer")
124
+ end
125
+ end
126
+
127
+ context "when ids are not present" do
128
+
129
+ let(:attributes) do
130
+ { "foo" => { "street" => "Maybachufer" } }
131
+ end
132
+
133
+ let(:builder) do
134
+ described_class.new(metadata, attributes)
135
+ end
136
+
137
+ before do
138
+ builder.build(person)
139
+ end
140
+
141
+ it "adds new documents" do
142
+ person.addresses.first.street.should eq("Maybachufer")
143
+ end
144
+ end
145
+ end
146
+
147
+ describe "#initialize" do
148
+
149
+ let(:attributes) do
150
+ {
151
+ "4" => { "street" => "Maybachufer" },
152
+ "1" => { "street" => "Frederichstrasse" },
153
+ "2" => { "street" => "Alexander Platz" }
154
+ }
155
+ end
156
+
157
+ let(:builder) do
158
+ described_class.new(metadata, attributes, {})
159
+ end
160
+
161
+ it "sorts the attributes" do
162
+ builder.attributes.map { |e| e[0] }.should eq([ "1", "2", "4" ])
163
+ end
164
+ end
165
+
166
+ describe "#reject?" do
167
+
168
+ context "when the proc is provided" do
169
+
170
+ let(:options) do
171
+ { reject_if: ->(attrs){ attrs[:first_name].blank? } }
172
+ end
173
+
174
+ context "when the proc matches" do
175
+
176
+ let(:builder) do
177
+ described_class.new(metadata, {}, options)
178
+ end
179
+
180
+ it "returns true" do
181
+ builder.reject?(builder, { last_name: "Lang" }).should be_true
182
+ end
183
+ end
184
+
185
+ context "when the proc does not match" do
186
+
187
+ let(:builder) do
188
+ described_class.new(metadata, {}, options)
189
+ end
190
+
191
+ it "returns false" do
192
+ builder.reject?(builder, { first_name: "Lang" }).should be_false
193
+ end
194
+ end
195
+ end
196
+
197
+ context "when the proc is not provided" do
198
+
199
+ let(:builder) do
200
+ described_class.new(metadata, {}, {})
201
+ end
202
+
203
+ it "returns false" do
204
+ builder.reject?(builder,{ first_name: "Lang" }).should be_false
205
+ end
206
+ end
207
+ end
208
+
209
+ describe "#update_only?" do
210
+
211
+ context "when the option is provided" do
212
+
213
+ let(:builder) do
214
+ described_class.new(metadata, {}, update_only: true)
215
+ end
216
+
217
+ it "returns the option" do
218
+ builder.update_only?.should be_true
219
+ end
220
+ end
221
+
222
+ context "when the option is not provided" do
223
+
224
+ let(:builder) do
225
+ described_class.new(metadata, {}, {})
226
+ end
227
+
228
+ it "returns false" do
229
+ builder.update_only?.should be_false
230
+ end
231
+ end
232
+ end
233
+ end
234
+
@@ -0,0 +1,250 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Builders::NestedAttributes::One do
4
+
5
+ let(:metadata) do
6
+ Mongoid::Relations::Metadata.new(
7
+ name: :name,
8
+ relation: Mongoid::Relations::Embedded::One
9
+ )
10
+ end
11
+
12
+ describe "#allow_destroy?" do
13
+
14
+ context "when the option is provided" do
15
+
16
+ let(:builder) do
17
+ described_class.new(metadata, {}, allow_destroy: true)
18
+ end
19
+
20
+ it "returns the option" do
21
+ builder.allow_destroy?.should be_true
22
+ end
23
+ end
24
+
25
+ context "when the option is not provided" do
26
+
27
+ let(:builder) do
28
+ described_class.new(metadata, {}, {})
29
+ end
30
+
31
+ it "returns false" do
32
+ builder.allow_destroy?.should be_false
33
+ end
34
+ end
35
+ end
36
+
37
+ describe "#build" do
38
+
39
+ let(:person) do
40
+ Person.new
41
+ end
42
+
43
+ context "when attributes are rejectable using a proc" do
44
+
45
+ let(:options) do
46
+ { reject_if: ->(attrs){ attrs[:first_name].blank? } }
47
+ end
48
+
49
+ let(:builder) do
50
+ described_class.new(metadata, { last_name: "Lang" }, options)
51
+ end
52
+
53
+ before do
54
+ builder.build(person)
55
+ end
56
+
57
+ it "does not change the relation" do
58
+ person.name.should be_nil
59
+ end
60
+ end
61
+
62
+ context "when attributes are rejectable using a symbol" do
63
+
64
+ let(:options) do
65
+ { reject_if: :reject_if_name_is_blank }
66
+ end
67
+
68
+ let(:builder) do
69
+ described_class.new(metadata, { last_name: "Lang" }, options)
70
+ end
71
+
72
+ before do
73
+ builder.build(person)
74
+ end
75
+
76
+ it "does not change the relation" do
77
+ person.name.should be_nil
78
+ end
79
+ end
80
+
81
+
82
+
83
+ context "when attributes are updatable" do
84
+
85
+ let(:name) do
86
+ person.build_name(last_name: "Ling")
87
+ end
88
+
89
+ let(:options) do
90
+ {}
91
+ end
92
+
93
+ let(:builder) do
94
+ described_class.new(metadata, {
95
+ _id: name.id,
96
+ last_name: "Lang"
97
+ }, options)
98
+ end
99
+
100
+ before do
101
+ builder.build(person)
102
+ end
103
+
104
+ it "updates the relation" do
105
+ person.name.last_name.should eq("Lang")
106
+ end
107
+ end
108
+
109
+ context "when attributes are replacable" do
110
+
111
+ let(:options) do
112
+ {}
113
+ end
114
+
115
+ let(:builder) do
116
+ described_class.new(metadata, {
117
+ last_name: "Lang"
118
+ }, options)
119
+ end
120
+
121
+ before do
122
+ builder.build(person)
123
+ end
124
+
125
+ it "updates the relation" do
126
+ person.name.last_name.should eq("Lang")
127
+ end
128
+ end
129
+
130
+ context "when attributes are deletable" do
131
+
132
+ let(:name) do
133
+ person.build_name(last_name: "Ling")
134
+ end
135
+
136
+ let(:options) do
137
+ { allow_destroy: true }
138
+ end
139
+
140
+ let(:builder) do
141
+ described_class.new(metadata, {
142
+ id: name.id,
143
+ last_name: "Lang",
144
+ _destroy: true
145
+ }, options)
146
+ end
147
+
148
+ before do
149
+ builder.build(person)
150
+ end
151
+
152
+ it "deletes the relation" do
153
+ person.name.should be_nil
154
+ end
155
+ end
156
+ end
157
+
158
+ describe "#destroy" do
159
+
160
+ context "when the attribute exists" do
161
+
162
+ let(:builder) do
163
+ described_class.new(metadata, { _destroy: true }, {})
164
+ end
165
+
166
+ it "returns the value" do
167
+ builder.destroy.should be_true
168
+ end
169
+ end
170
+
171
+ context "when the attribute does not exist" do
172
+
173
+ let(:builder) do
174
+ described_class.new(metadata, {}, {})
175
+ end
176
+
177
+ it "returns nil" do
178
+ builder.destroy.should be_nil
179
+ end
180
+ end
181
+ end
182
+
183
+ describe "#reject?" do
184
+
185
+ context "when the proc is provided" do
186
+
187
+ let(:options) do
188
+ { reject_if: ->(attrs){ attrs[:first_name].blank? } }
189
+ end
190
+
191
+ context "when the proc matches" do
192
+
193
+ let(:builder) do
194
+ described_class.new(metadata, {}, options)
195
+ end
196
+
197
+ it "returns true" do
198
+ builder.reject?(builder, { last_name: "Lang" }).should be_true
199
+ end
200
+ end
201
+
202
+ context "when the proc does not match" do
203
+
204
+ let(:builder) do
205
+ described_class.new(metadata, {}, options)
206
+ end
207
+
208
+ it "returns false" do
209
+ builder.reject?(builder, { first_name: "Lang" }).should be_false
210
+ end
211
+ end
212
+ end
213
+
214
+ context "when the proc is not provided" do
215
+
216
+ let(:builder) do
217
+ described_class.new(metadata, {}, {})
218
+ end
219
+
220
+ it "returns false" do
221
+ builder.reject?(builder, { first_name: "Lang" }).should be_false
222
+ end
223
+ end
224
+ end
225
+
226
+ describe "#update_only?" do
227
+
228
+ context "when the option is provided" do
229
+
230
+ let(:builder) do
231
+ described_class.new(metadata, {}, update_only: true)
232
+ end
233
+
234
+ it "returns the option" do
235
+ builder.update_only?.should be_true
236
+ end
237
+ end
238
+
239
+ context "when the option is not provided" do
240
+
241
+ let(:builder) do
242
+ described_class.new(metadata, {}, {})
243
+ end
244
+
245
+ it "returns false" do
246
+ builder.update_only?.should be_false
247
+ end
248
+ end
249
+ end
250
+ end