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,159 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Atomic::Paths::Embedded::Many do
4
+
5
+ let(:person) do
6
+ Person.new
7
+ end
8
+
9
+ let(:address) do
10
+ Address.new(street: "Strassmannstr.")
11
+ end
12
+
13
+ let(:phone) do
14
+ Phone.new(number: '+33123456789')
15
+ end
16
+
17
+ before do
18
+ person.addresses << address
19
+ end
20
+
21
+ let(:many) do
22
+ described_class.new(address)
23
+ end
24
+
25
+ describe "#delete_modifier" do
26
+
27
+ it "returns $pull" do
28
+ many.delete_modifier.should eq("$pull")
29
+ end
30
+ end
31
+
32
+ describe "#document" do
33
+
34
+ it "returns the document" do
35
+ many.document.should eq(address)
36
+ end
37
+ end
38
+
39
+ describe "#insert_modifier" do
40
+
41
+ it "returns $push" do
42
+ many.insert_modifier.should eq("$push")
43
+ end
44
+ end
45
+
46
+ describe "#path" do
47
+
48
+ context "when the document is embedded one level" do
49
+
50
+ it "returns the name of the relation" do
51
+ many.path.should eq("addresses")
52
+ end
53
+ end
54
+
55
+ context "when the document is embedded multiple levels" do
56
+
57
+ let(:location) do
58
+ Location.new(name: "home")
59
+ end
60
+
61
+ before do
62
+ address.locations << location
63
+ end
64
+
65
+ let(:many) do
66
+ described_class.new(location)
67
+ end
68
+
69
+ it "returns the nested path to the relation" do
70
+ many.path.should eq("addresses.locations")
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "#position" do
76
+
77
+ context "when the document is embedded one level" do
78
+
79
+ context "with a relation with :store_as option" do
80
+ let(:many) do
81
+ described_class.new(phone)
82
+ end
83
+
84
+ before do
85
+ person.phones << phone
86
+ end
87
+ it "return the name of the store_as in relation" do
88
+ many.position.should eq("mobile_phones")
89
+ end
90
+ end
91
+
92
+ it "returns the name of the relation" do
93
+ many.position.should eq("addresses")
94
+ end
95
+ end
96
+
97
+ context "when the document is embedded multiple levels" do
98
+
99
+ let(:location) do
100
+ Location.new(name: "home")
101
+ end
102
+
103
+ before do
104
+ address.locations << location
105
+ address.new_record = false
106
+ location.new_record = false
107
+ end
108
+
109
+ let(:many) do
110
+ described_class.new(location)
111
+ end
112
+
113
+ it "returns the nested position to the relation" do
114
+ many.position.should eq("addresses.0.locations.0")
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "#selector" do
120
+
121
+ context "when the document is embedded one level" do
122
+
123
+ it "returns the the hash with parent selector" do
124
+ many.selector.should eq(
125
+ { "_id" => person._id, "addresses._id" => address._id }
126
+ )
127
+ end
128
+ end
129
+
130
+ context "when the document is embedded multiple levels" do
131
+
132
+ let(:location) do
133
+ Location.new(name: "home")
134
+ end
135
+
136
+ before do
137
+ address.locations << location
138
+ address.new_record = false
139
+ address.post_persist
140
+ location.new_record = false
141
+ location.post_persist
142
+ end
143
+
144
+ let(:many) do
145
+ described_class.new(location)
146
+ end
147
+
148
+ it "returns the hash with all parent selectors" do
149
+ many.selector.should eq(
150
+ {
151
+ "_id" => person._id,
152
+ "addresses._id" => address._id,
153
+ "addresses.0.locations._id" => location._id
154
+ }
155
+ )
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,152 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Atomic::Paths::Embedded::One do
4
+
5
+ let(:person) do
6
+ Person.new
7
+ end
8
+
9
+ let(:name) do
10
+ Name.new(first_name: "Syd")
11
+ end
12
+
13
+ before do
14
+ person.name = name
15
+ end
16
+
17
+ let(:one) do
18
+ described_class.new(name)
19
+ end
20
+
21
+ describe "#delete_modifier" do
22
+
23
+ it "returns $unset" do
24
+ one.delete_modifier.should eq("$unset")
25
+ end
26
+ end
27
+
28
+ describe "#document" do
29
+
30
+ it "returns the document" do
31
+ one.document.should eq(name)
32
+ end
33
+ end
34
+
35
+ describe "#insert_modifier" do
36
+
37
+ it "returns $set" do
38
+ one.insert_modifier.should eq("$set")
39
+ end
40
+ end
41
+
42
+ describe "#path" do
43
+
44
+ context "when the document is embedded one level" do
45
+
46
+ it "returns the name of the relation" do
47
+ one.path.should eq("name")
48
+ end
49
+ end
50
+
51
+ context "when the document is embedded multiple levels" do
52
+
53
+ let(:phone) do
54
+ Phone.new(number: "404-555-1212")
55
+ end
56
+
57
+ let(:country_code) do
58
+ CountryCode.new(code: 1)
59
+ end
60
+
61
+ before do
62
+ phone.country_code = country_code
63
+ person.phone_numbers << phone
64
+ end
65
+
66
+ let(:one) do
67
+ described_class.new(country_code)
68
+ end
69
+
70
+ it "returns the nested path to the relation" do
71
+ one.path.should eq("phone_numbers.country_code")
72
+ end
73
+ end
74
+ end
75
+
76
+ describe "#position" do
77
+
78
+ context "when the document is embedded one level" do
79
+
80
+ it "returns the name of the relation" do
81
+ one.position.should eq("name")
82
+ end
83
+ end
84
+
85
+ context "when the document is embedded multiple levels" do
86
+
87
+ let(:phone) do
88
+ Phone.new(number: "404-555-1212")
89
+ end
90
+
91
+ let(:country_code) do
92
+ CountryCode.new(code: 1)
93
+ end
94
+
95
+ before do
96
+ phone.country_code = country_code
97
+ person.phone_numbers << phone
98
+ phone.new_record = false
99
+ end
100
+
101
+ let(:one) do
102
+ described_class.new(country_code)
103
+ end
104
+
105
+ it "returns the nested position to the relation" do
106
+ one.position.should eq("phone_numbers.0.country_code")
107
+ end
108
+ end
109
+ end
110
+
111
+ describe "#selector" do
112
+
113
+ context "when the document is embedded one level" do
114
+
115
+ it "returns the the hash with parent selector" do
116
+ one.selector.should eq({ "_id" => person._id, "name._id" => name._id })
117
+ end
118
+ end
119
+
120
+ context "when the document is embedded multiple levels" do
121
+
122
+ let(:phone) do
123
+ Phone.new(number: "404-555-1212")
124
+ end
125
+
126
+ let(:country_code) do
127
+ CountryCode.new(code: 1)
128
+ end
129
+
130
+ before do
131
+ phone.country_code = country_code
132
+ person.phone_numbers << phone
133
+ phone.new_record = false
134
+ phone.post_persist
135
+ end
136
+
137
+ let(:one) do
138
+ described_class.new(country_code)
139
+ end
140
+
141
+ it "returns the hash with all parent selectors" do
142
+ one.selector.should eq(
143
+ {
144
+ "_id" => person._id,
145
+ "phone_numbers._id" => phone._id,
146
+ "phone_numbers.0.country_code._id" => country_code._id
147
+ }
148
+ )
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,106 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Atomic::Paths::Root do
4
+
5
+ let(:person) do
6
+ Person.new
7
+ end
8
+
9
+ let(:root) do
10
+ described_class.new(person)
11
+ end
12
+
13
+ describe "#document" do
14
+
15
+ it "returns the document" do
16
+ root.document.should eq(person)
17
+ end
18
+ end
19
+
20
+ describe "#path" do
21
+
22
+ it "returns an empty string" do
23
+ root.path.should be_empty
24
+ end
25
+ end
26
+
27
+ describe "#position" do
28
+
29
+ it "returns an empty string" do
30
+ root.position.should be_empty
31
+ end
32
+ end
33
+
34
+ describe "#insert_modifier" do
35
+
36
+ let(:address) do
37
+ person.addresses.build
38
+ end
39
+
40
+ let(:root) do
41
+ described_class.new(address)
42
+ end
43
+
44
+ it "raises a mixed relations error" do
45
+ expect { root.insert_modifier }.to raise_error(Mongoid::Errors::InvalidPath)
46
+ end
47
+ end
48
+
49
+ describe "#selector" do
50
+
51
+ context "when using a shard key" do
52
+
53
+ let(:profile) do
54
+ Profile.new(name: "google")
55
+ end
56
+
57
+ let(:root) do
58
+ described_class.new(profile)
59
+ end
60
+
61
+ it "returns the id and shard key in the hash" do
62
+ root.selector.should eq({ "_id" => profile.id, "name" => profile.name })
63
+ end
64
+ end
65
+
66
+ context "when not using a shard key" do
67
+
68
+ context "when using object ids" do
69
+
70
+ it "returns the hash with the id" do
71
+ root.selector.should eq({ "_id" => person.id })
72
+ end
73
+ end
74
+
75
+ context "when using a composite key" do
76
+
77
+ let(:account) do
78
+ Account.new(name: "savings")
79
+ end
80
+
81
+ let(:root) do
82
+ described_class.new(account)
83
+ end
84
+
85
+ context "when the composite key has changed" do
86
+
87
+ before do
88
+ account.new_record = false
89
+ account.name = "current"
90
+ end
91
+
92
+ it "returns the hash with the old key" do
93
+ root.selector.should eq({ "_id" => "savings" })
94
+ end
95
+ end
96
+
97
+ context "when the composite key has not changed" do
98
+
99
+ it "returns the hash with the key" do
100
+ root.selector.should eq({ "_id" => "savings" })
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,270 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Atomic::Paths do
4
+
5
+ let(:person) do
6
+ Person.new
7
+ end
8
+
9
+ let(:address) do
10
+ Address.new(street: "testing")
11
+ end
12
+
13
+ let(:location) do
14
+ Location.new
15
+ end
16
+
17
+ let(:name) do
18
+ Name.new
19
+ end
20
+
21
+ describe "#.atomic_delete_modifier" do
22
+
23
+ before do
24
+ person.addresses << address
25
+ person.name = name
26
+ end
27
+
28
+ context "when document is an embeds_one" do
29
+
30
+ it "returns $unset" do
31
+ name.atomic_delete_modifier.should eq("$unset")
32
+ end
33
+ end
34
+
35
+ context "when document is an embeds_many" do
36
+
37
+ it "returns $pull" do
38
+ address.atomic_delete_modifier.should eq("$pull")
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "#.atomic_insert_modifier" do
44
+
45
+ before do
46
+ person.addresses << address
47
+ person.name = name
48
+ end
49
+
50
+ context "when document is an embeds_one" do
51
+
52
+ it "returns $set" do
53
+ name.atomic_insert_modifier.should eq("$set")
54
+ end
55
+ end
56
+
57
+ context "when document is an embeds_many" do
58
+
59
+ it "returns $push" do
60
+ address.atomic_insert_modifier.should eq("$push")
61
+ end
62
+ end
63
+ end
64
+
65
+ describe "#.atomic_path" do
66
+
67
+ context "when the document is a parent" do
68
+
69
+ it "returns an empty string" do
70
+ person.atomic_path.should be_empty
71
+ end
72
+ end
73
+
74
+ context "when the document is embedded" do
75
+
76
+ before do
77
+ person.addresses << address
78
+ end
79
+
80
+ it "returns the inverse_of value of the association" do
81
+ address.atomic_path.should eq("addresses")
82
+ end
83
+ end
84
+
85
+ context "when document embedded multiple levels" do
86
+
87
+ before do
88
+ address.locations << location
89
+ person.addresses << address
90
+ end
91
+
92
+ it "returns the JSON notation to the document" do
93
+ location.atomic_path.should eq("addresses.locations")
94
+ end
95
+ end
96
+ end
97
+
98
+ describe "#.atomic_selector" do
99
+
100
+ context "when the document is a parent" do
101
+
102
+ it "returns an id.atomic_selector" do
103
+ person.atomic_selector.should eq({ "_id" => person.id })
104
+ end
105
+ end
106
+
107
+ context "when the document is embedded" do
108
+
109
+ before do
110
+ person.addresses << address
111
+ end
112
+
113
+ it "returns the association with id.atomic_selector" do
114
+ address.atomic_selector.should eq(
115
+ { "_id" => person.id, "addresses._id" => address.id }
116
+ )
117
+ end
118
+ end
119
+
120
+ context "when document embedded multiple levels" do
121
+
122
+ before do
123
+ address.locations << location
124
+ person.addresses << address
125
+ end
126
+
127
+ it "returns the JSON notation to the document with ids" do
128
+ location.atomic_selector.should eq(
129
+ {
130
+ "_id" => person.id,
131
+ "addresses._id" => address.id,
132
+ "addresses.locations._id" => location.id
133
+ }
134
+ )
135
+ end
136
+ end
137
+ end
138
+
139
+ describe "#.atomic_position" do
140
+
141
+ context "when the document is a parent" do
142
+
143
+ it "returns an empty string" do
144
+ person.atomic_position.should be_empty
145
+ end
146
+ end
147
+
148
+ context "when the document is embedded" do
149
+
150
+ before do
151
+ person.addresses << address
152
+ end
153
+
154
+ context "when the document is new" do
155
+
156
+ it "returns the.atomic_path without index" do
157
+ address.atomic_position.should eq("addresses")
158
+ end
159
+ end
160
+
161
+ context "when the document is not new" do
162
+
163
+ before do
164
+ address.instance_variable_set(:@new_record, false)
165
+ end
166
+
167
+ it "returns the.atomic_path plus index" do
168
+ address.atomic_position.should eq("addresses.0")
169
+ end
170
+ end
171
+ end
172
+
173
+ context "when document embedded multiple levels" do
174
+
175
+ let(:other) do
176
+ Location.new
177
+ end
178
+
179
+ before do
180
+ address.locations << [ other, location ]
181
+ address.instance_variable_set(:@new_record, false)
182
+ person.addresses << address
183
+ end
184
+
185
+ context "when the document is new" do
186
+
187
+ it "returns the.atomic_path with parent indexes" do
188
+ location.atomic_position.should eq("addresses.0.locations")
189
+ end
190
+ end
191
+
192
+ context "when the document is not new" do
193
+
194
+ before do
195
+ location.instance_variable_set(:@new_record, false)
196
+ end
197
+
198
+ it "returns the.atomic_path plus index" do
199
+ location.atomic_position.should eq("addresses.0.locations.1")
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ describe "#.atomic_path" do
206
+
207
+ context "when the document is a parent" do
208
+
209
+ it "returns an empty string" do
210
+ person.atomic_path.should be_empty
211
+ end
212
+ end
213
+
214
+ context "when the document is embedded" do
215
+
216
+ before do
217
+ person.addresses << address
218
+ end
219
+
220
+ context "when the document is not new" do
221
+
222
+ before do
223
+ address.instance_variable_set(:@new_record, false)
224
+ end
225
+
226
+ it "returns the.atomic_path without the index" do
227
+ address.atomic_path.should eq("addresses")
228
+ end
229
+
230
+ context "and there are 10 or more documents" do
231
+
232
+ before do
233
+ 10.times do
234
+ person.addresses << address
235
+ end
236
+ end
237
+
238
+ it "returns the.atomic_path without the index" do
239
+ address.atomic_path.should eq("addresses")
240
+ end
241
+ end
242
+ end
243
+ end
244
+
245
+ context "when document embedded multiple levels" do
246
+
247
+ let(:other) do
248
+ Location.new
249
+ end
250
+
251
+ before do
252
+ address.locations << [ other, location ]
253
+ address.instance_variable_set(:@new_record, false)
254
+ person.addresses << address
255
+ end
256
+
257
+ context "when the document is not new" do
258
+
259
+ before do
260
+ location.instance_variable_set(:@new_record, false)
261
+ end
262
+
263
+ it "returns the.atomic_path plus index" do
264
+ location.atomic_path.should eq("addresses.0.locations")
265
+ end
266
+
267
+ end
268
+ end
269
+ end
270
+ end