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,293 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Contextual::Aggregable::Memory do
4
+
5
+ describe "#avg" do
6
+
7
+ context "when provided a single field" do
8
+
9
+ context "when there are matching documents" do
10
+
11
+ context "when the types are integers" do
12
+
13
+ let!(:depeche) do
14
+ Band.create(name: "Depeche Mode", likes: 1000)
15
+ end
16
+
17
+ let!(:tool) do
18
+ Band.create(name: "Tool", likes: 500)
19
+ end
20
+
21
+ let(:criteria) do
22
+ Band.all.tap do |criteria|
23
+ criteria.documents = [ depeche, tool ]
24
+ end
25
+ end
26
+
27
+ let(:context) do
28
+ Mongoid::Contextual::Memory.new(criteria)
29
+ end
30
+
31
+ let(:avg) do
32
+ context.avg(:likes)
33
+ end
34
+
35
+ it "returns the avg of the provided field" do
36
+ avg.should eq(750)
37
+ end
38
+ end
39
+
40
+ context "when the types are floats" do
41
+
42
+ let!(:depeche) do
43
+ Band.create(name: "Depeche Mode", rating: 10)
44
+ end
45
+
46
+ let!(:tool) do
47
+ Band.create(name: "Tool", rating: 5)
48
+ end
49
+
50
+ let(:criteria) do
51
+ Band.all.tap do |criteria|
52
+ criteria.documents = [ depeche, tool ]
53
+ end
54
+ end
55
+
56
+ let(:context) do
57
+ Mongoid::Contextual::Memory.new(criteria)
58
+ end
59
+
60
+ let(:avg) do
61
+ context.avg(:rating)
62
+ end
63
+
64
+ it "returns the avg of the provided field" do
65
+ avg.should eq(7.5)
66
+ end
67
+ end
68
+ end
69
+
70
+ context "when no documents match" do
71
+
72
+ let!(:depeche) do
73
+ Band.create(name: "Depeche Mode", likes: 1000)
74
+ end
75
+
76
+ let(:criteria) do
77
+ Band.where(name: "New Order")
78
+ end
79
+
80
+ let(:context) do
81
+ Mongoid::Contextual::Memory.new(criteria)
82
+ end
83
+
84
+ let(:avg) do
85
+ context.avg(:likes)
86
+ end
87
+
88
+ it "returns nil" do
89
+ avg.should be_nil
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ describe "#max" do
96
+
97
+ context "when provided a single field" do
98
+
99
+ let!(:depeche) do
100
+ Band.create(name: "Depeche Mode", likes: 1000)
101
+ end
102
+
103
+ let!(:tool) do
104
+ Band.create(name: "Tool", likes: 500)
105
+ end
106
+
107
+ let(:criteria) do
108
+ Band.all.tap do |crit|
109
+ crit.documents = [ depeche, tool ]
110
+ end
111
+ end
112
+
113
+ let(:context) do
114
+ Mongoid::Contextual::Memory.new(criteria)
115
+ end
116
+
117
+ context "when provided a symbol" do
118
+
119
+ let(:max) do
120
+ context.max(:likes)
121
+ end
122
+
123
+ it "returns the max of the provided field" do
124
+ max.should eq(1000)
125
+ end
126
+
127
+ context "when no documents match" do
128
+
129
+ let(:criteria) do
130
+ Band.where(name: "New Order")
131
+ end
132
+
133
+ let(:context) do
134
+ Mongoid::Contextual::Memory.new(criteria)
135
+ end
136
+
137
+ let(:max) do
138
+ context.max(:likes)
139
+ end
140
+
141
+ it "returns nil" do
142
+ max.should be_nil
143
+ end
144
+ end
145
+ end
146
+
147
+ context "when provided a block" do
148
+
149
+ let(:max) do
150
+ context.max do |a, b|
151
+ a.likes <=> b.likes
152
+ end
153
+ end
154
+
155
+ it "returns the document with the max value for the field" do
156
+ max.should eq(depeche)
157
+ end
158
+ end
159
+ end
160
+ end
161
+
162
+ describe "#min" do
163
+
164
+ context "when provided a single field" do
165
+
166
+ let!(:depeche) do
167
+ Band.create(name: "Depeche Mode", likes: 1000)
168
+ end
169
+
170
+ let!(:tool) do
171
+ Band.create(name: "Tool", likes: 500)
172
+ end
173
+
174
+ let(:criteria) do
175
+ Band.all.tap do |crit|
176
+ crit.documents = [ depeche, tool ]
177
+ end
178
+ end
179
+
180
+ let(:context) do
181
+ Mongoid::Contextual::Memory.new(criteria)
182
+ end
183
+
184
+ context "when provided a symbol" do
185
+
186
+ let(:min) do
187
+ context.min(:likes)
188
+ end
189
+
190
+ it "returns the min of the provided field" do
191
+ min.should eq(500)
192
+ end
193
+
194
+ context "when no documents match" do
195
+
196
+ let(:criteria) do
197
+ Band.where(name: "New Order")
198
+ end
199
+
200
+ let(:context) do
201
+ Mongoid::Contextual::Memory.new(criteria)
202
+ end
203
+
204
+ let(:min) do
205
+ context.min(:likes)
206
+ end
207
+
208
+ it "returns nil" do
209
+ min.should be_nil
210
+ end
211
+ end
212
+ end
213
+
214
+ context "when provided a block" do
215
+
216
+ let(:min) do
217
+ context.min do |a, b|
218
+ a.likes <=> b.likes
219
+ end
220
+ end
221
+
222
+ it "returns the document with the min value for the field" do
223
+ min.should eq(tool)
224
+ end
225
+ end
226
+ end
227
+ end
228
+
229
+ describe "#sum" do
230
+
231
+ context "when provided a single field" do
232
+
233
+ let!(:depeche) do
234
+ Band.create(name: "Depeche Mode", likes: 1000)
235
+ end
236
+
237
+ let!(:tool) do
238
+ Band.create(name: "Tool", likes: 500)
239
+ end
240
+
241
+ let(:criteria) do
242
+ Band.all.tap do |crit|
243
+ crit.documents = [ depeche, tool ]
244
+ end
245
+ end
246
+
247
+ let(:context) do
248
+ Mongoid::Contextual::Memory.new(criteria)
249
+ end
250
+
251
+ context "when provided a symbol" do
252
+
253
+ let(:sum) do
254
+ context.sum(:likes)
255
+ end
256
+
257
+ it "returns the sum of the provided field" do
258
+ sum.should eq(1500)
259
+ end
260
+
261
+ context "when no documents match" do
262
+
263
+ let(:criteria) do
264
+ Band.where(name: "New Order")
265
+ end
266
+
267
+ let(:context) do
268
+ Mongoid::Contextual::Memory.new(criteria)
269
+ end
270
+
271
+ let(:sum) do
272
+ context.sum(:likes)
273
+ end
274
+
275
+ it "returns zero" do
276
+ sum.should eq(0)
277
+ end
278
+ end
279
+ end
280
+
281
+ context "when provided a block" do
282
+
283
+ let(:sum) do
284
+ context.sum(&:likes)
285
+ end
286
+
287
+ it "returns the sum for the provided block" do
288
+ sum.should eq(1500)
289
+ end
290
+ end
291
+ end
292
+ end
293
+ end
@@ -0,0 +1,455 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Contextual::Aggregable::Mongo do
4
+
5
+ describe "#aggregates" do
6
+
7
+ context "when provided a single field" do
8
+
9
+ let!(:depeche) do
10
+ Band.create(name: "Depeche Mode", likes: 1000, years: 1000)
11
+ end
12
+
13
+ let!(:tool) do
14
+ Band.create(name: "Tool", likes: 500, years: 800)
15
+ end
16
+
17
+ let(:criteria) do
18
+ Band.all
19
+ end
20
+
21
+ let(:context) do
22
+ Mongoid::Contextual::Mongo.new(criteria)
23
+ end
24
+
25
+ context "when aggregating on a field that exists" do
26
+
27
+ context "when aggregating on an aliased field" do
28
+
29
+ let(:aggregates) do
30
+ context.aggregates(:years)
31
+ end
32
+
33
+ it "returns an avg" do
34
+ aggregates["avg"].should eq(900)
35
+ end
36
+
37
+ it "returns a count" do
38
+ aggregates["count"].should eq(2)
39
+ end
40
+
41
+ it "returns a max" do
42
+ aggregates["max"].should eq(1000)
43
+ end
44
+
45
+ it "returns a min" do
46
+ aggregates["min"].should eq(800)
47
+ end
48
+
49
+ it "returns a sum" do
50
+ aggregates["sum"].should eq(1800)
51
+ end
52
+ end
53
+
54
+ context "when more than 1 document is emitted" do
55
+
56
+ let(:aggregates) do
57
+ context.aggregates(:likes)
58
+ end
59
+
60
+ it "returns an avg" do
61
+ aggregates["avg"].should eq(750)
62
+ end
63
+
64
+ it "returns a count" do
65
+ aggregates["count"].should eq(2)
66
+ end
67
+
68
+ it "returns a max" do
69
+ aggregates["max"].should eq(1000)
70
+ end
71
+
72
+ it "returns a min" do
73
+ aggregates["min"].should eq(500)
74
+ end
75
+
76
+ it "returns a sum" do
77
+ aggregates["sum"].should eq(1500)
78
+ end
79
+ end
80
+
81
+ context "when only 1 document is emitted" do
82
+
83
+ let(:criteria) do
84
+ Band.where(name: "Depeche Mode")
85
+ end
86
+
87
+ let(:aggregates) do
88
+ context.aggregates(:likes)
89
+ end
90
+
91
+ it "returns an avg" do
92
+ aggregates["avg"].should eq(1000)
93
+ end
94
+
95
+ it "returns a count" do
96
+ aggregates["count"].should eq(1)
97
+ end
98
+
99
+ it "returns a max" do
100
+ aggregates["max"].should eq(1000)
101
+ end
102
+
103
+ it "returns a min" do
104
+ aggregates["min"].should eq(1000)
105
+ end
106
+
107
+ it "returns a sum" do
108
+ aggregates["sum"].should eq(1000)
109
+ end
110
+ end
111
+ end
112
+
113
+ context "when the field does not exist" do
114
+
115
+ let(:aggregates) do
116
+ context.aggregates(:non_existant)
117
+ end
118
+
119
+ it "returns an avg" do
120
+ aggregates["avg"].should eq(0)
121
+ end
122
+
123
+ it "returns a count" do
124
+ aggregates["count"].should eq(2)
125
+ end
126
+
127
+ it "returns a max" do
128
+ aggregates["max"].should be_nil
129
+ end
130
+
131
+ it "returns a min" do
132
+ aggregates["min"].should be_nil
133
+ end
134
+
135
+ it "returns a sum" do
136
+ aggregates["sum"].should eq(0)
137
+ end
138
+ end
139
+
140
+ context "when the field sometimes exists" do
141
+ let!(:oasis) do
142
+ Band.create(name: "Oasis", likes: 50)
143
+ end
144
+
145
+ let!(:radiohead) do
146
+ Band.create(name: "Radiohead")
147
+ end
148
+
149
+ context "and the field doesn't exist on the last document" do
150
+ let(:criteria) do
151
+ Band.all
152
+ end
153
+
154
+ let(:context) do
155
+ Mongoid::Contextual::Mongo.new(criteria)
156
+ end
157
+
158
+ let(:aggregates) do
159
+ context.aggregates(:likes)
160
+ end
161
+
162
+ it "returns a min" do
163
+ aggregates["min"].should eq(50)
164
+ end
165
+ end
166
+
167
+ context "and the field doesn't exist on the before-last document" do
168
+ let!(:u2) do
169
+ Band.create(name: "U2", likes: 100)
170
+ end
171
+
172
+ let(:criteria) do
173
+ Band.all
174
+ end
175
+
176
+ let(:context) do
177
+ Mongoid::Contextual::Mongo.new(criteria)
178
+ end
179
+
180
+ let(:aggregates) do
181
+ context.aggregates(:likes)
182
+ end
183
+
184
+ it "returns a min" do
185
+ aggregates["min"].should eq(50)
186
+ end
187
+ end
188
+ end
189
+
190
+ context "when there are no matching documents" do
191
+
192
+ let(:criteria) do
193
+ Band.where(name: "New Order")
194
+ end
195
+
196
+ let(:aggregates) do
197
+ context.aggregates(:non_existant)
198
+ end
199
+
200
+ it "returns nil" do
201
+ aggregates.should eq({ "count" => 0 })
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ describe "#avg" do
208
+
209
+ context "when provided a single field" do
210
+
211
+ context "when there are matching documents" do
212
+
213
+ let!(:depeche) do
214
+ Band.create(name: "Depeche Mode", likes: 1000)
215
+ end
216
+
217
+ let!(:tool) do
218
+ Band.create(name: "Tool", likes: 500)
219
+ end
220
+
221
+ let(:criteria) do
222
+ Band.all
223
+ end
224
+
225
+ let(:context) do
226
+ Mongoid::Contextual::Mongo.new(criteria)
227
+ end
228
+
229
+ let(:avg) do
230
+ context.avg(:likes)
231
+ end
232
+
233
+ it "returns the avg of the provided field" do
234
+ avg.should eq(750)
235
+ end
236
+ end
237
+
238
+ context "when no documents match" do
239
+
240
+ let!(:depeche) do
241
+ Band.create(name: "Depeche Mode", likes: 1000)
242
+ end
243
+
244
+ let(:criteria) do
245
+ Band.where(name: "New Order")
246
+ end
247
+
248
+ let(:context) do
249
+ Mongoid::Contextual::Mongo.new(criteria)
250
+ end
251
+
252
+ let(:avg) do
253
+ context.avg(:likes)
254
+ end
255
+
256
+ it "returns nil" do
257
+ avg.should be_nil
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ describe "#max" do
264
+
265
+ context "when provided a single field" do
266
+
267
+ let!(:depeche) do
268
+ Band.create(name: "Depeche Mode", likes: 1000)
269
+ end
270
+
271
+ let!(:tool) do
272
+ Band.create(name: "Tool", likes: 500)
273
+ end
274
+
275
+ let(:criteria) do
276
+ Band.all
277
+ end
278
+
279
+ let(:context) do
280
+ Mongoid::Contextual::Mongo.new(criteria)
281
+ end
282
+
283
+ context "when provided a symbol" do
284
+
285
+ let(:max) do
286
+ context.max(:likes)
287
+ end
288
+
289
+ it "returns the max of the provided field" do
290
+ max.should eq(1000)
291
+ end
292
+
293
+ context "when no documents match" do
294
+
295
+ let(:criteria) do
296
+ Band.where(name: "New Order")
297
+ end
298
+
299
+ let(:context) do
300
+ Mongoid::Contextual::Mongo.new(criteria)
301
+ end
302
+
303
+ let(:max) do
304
+ context.max(:likes)
305
+ end
306
+
307
+ it "returns nil" do
308
+ max.should be_nil
309
+ end
310
+ end
311
+ end
312
+
313
+ context "when provided a block" do
314
+
315
+ let(:max) do
316
+ context.max do |a, b|
317
+ a.likes <=> b.likes
318
+ end
319
+ end
320
+
321
+ it "returns the document with the max value for the field" do
322
+ max.should eq(depeche)
323
+ end
324
+ end
325
+ end
326
+ end
327
+
328
+ describe "#min" do
329
+
330
+ context "when provided a single field" do
331
+
332
+ let!(:depeche) do
333
+ Band.create(name: "Depeche Mode", likes: 1000)
334
+ end
335
+
336
+ let!(:tool) do
337
+ Band.create(name: "Tool", likes: 500)
338
+ end
339
+
340
+ let(:criteria) do
341
+ Band.all
342
+ end
343
+
344
+ let(:context) do
345
+ Mongoid::Contextual::Mongo.new(criteria)
346
+ end
347
+
348
+ context "when provided a symbol" do
349
+
350
+ let(:min) do
351
+ context.min(:likes)
352
+ end
353
+
354
+ it "returns the min of the provided field" do
355
+ min.should eq(500)
356
+ end
357
+
358
+ context "when no documents match" do
359
+
360
+ let(:criteria) do
361
+ Band.where(name: "New Order")
362
+ end
363
+
364
+ let(:context) do
365
+ Mongoid::Contextual::Mongo.new(criteria)
366
+ end
367
+
368
+ let(:min) do
369
+ context.min(:likes)
370
+ end
371
+
372
+ it "returns nil" do
373
+ min.should be_nil
374
+ end
375
+ end
376
+ end
377
+
378
+ context "when provided a block" do
379
+
380
+ let(:min) do
381
+ context.min do |a, b|
382
+ a.likes <=> b.likes
383
+ end
384
+ end
385
+
386
+ it "returns the document with the min value for the field" do
387
+ min.should eq(tool)
388
+ end
389
+ end
390
+ end
391
+ end
392
+
393
+ describe "#sum" do
394
+
395
+ context "when provided a single field" do
396
+
397
+ let!(:depeche) do
398
+ Band.create(name: "Depeche Mode", likes: 1000)
399
+ end
400
+
401
+ let!(:tool) do
402
+ Band.create(name: "Tool", likes: 500)
403
+ end
404
+
405
+ let(:criteria) do
406
+ Band.all
407
+ end
408
+
409
+ let(:context) do
410
+ Mongoid::Contextual::Mongo.new(criteria)
411
+ end
412
+
413
+ context "when provided a symbol" do
414
+
415
+ let(:sum) do
416
+ context.sum(:likes)
417
+ end
418
+
419
+ it "returns the sum of the provided field" do
420
+ sum.should eq(1500)
421
+ end
422
+
423
+ context "when no documents match" do
424
+
425
+ let(:criteria) do
426
+ Band.where(name: "New Order")
427
+ end
428
+
429
+ let(:context) do
430
+ Mongoid::Contextual::Mongo.new(criteria)
431
+ end
432
+
433
+ let(:sum) do
434
+ context.sum(:likes)
435
+ end
436
+
437
+ it "returns zero" do
438
+ sum.should eq(0)
439
+ end
440
+ end
441
+ end
442
+
443
+ context "when provided a block" do
444
+
445
+ let(:sum) do
446
+ context.sum(&:likes)
447
+ end
448
+
449
+ it "returns the sum for the provided block" do
450
+ sum.should eq(1500)
451
+ end
452
+ end
453
+ end
454
+ end
455
+ end