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,405 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Extensions::TimeWithZone do
4
+
5
+ describe ".demongoize" do
6
+
7
+ after(:all) do
8
+ Mongoid.use_utc = false
9
+ Mongoid.use_activesupport_time_zone = true
10
+ end
11
+
12
+ let!(:time) do
13
+ Time.local(2010, 11, 19)
14
+ end
15
+
16
+ context "when the time zone is not defined" do
17
+
18
+ before do
19
+ Mongoid.use_utc = false
20
+ end
21
+
22
+ context "when the local time is not observing daylight saving" do
23
+
24
+ let(:time) do
25
+ Time.utc(2010, 11, 19)
26
+ end
27
+
28
+ it "returns the local time" do
29
+ ActiveSupport::TimeWithZone.demongoize(time).utc_offset.should eq(
30
+ Time.local(2010, 11, 19).utc_offset
31
+ )
32
+ end
33
+ end
34
+
35
+ context "when the local time is observing daylight saving" do
36
+
37
+ let(:time) do
38
+ Time.utc(2010, 9, 19)
39
+ end
40
+
41
+ it "returns the local time" do
42
+ ActiveSupport::TimeWithZone.demongoize(time).should eq(time.getlocal)
43
+ end
44
+ end
45
+
46
+ context "when we have a time close to midnight" do
47
+
48
+ let(:time) do
49
+ Time.local(2010, 11, 19, 0, 30).utc
50
+ end
51
+
52
+ it "changes it back to the equivalent local time" do
53
+ ActiveSupport::TimeWithZone.demongoize(time).should eq(time)
54
+ end
55
+ end
56
+
57
+ context "when using the ActiveSupport time zone" do
58
+
59
+ before do
60
+ Mongoid.use_activesupport_time_zone = true
61
+ Time.zone = "Stockholm"
62
+ end
63
+
64
+ after do
65
+ Time.zone = nil
66
+ Mongoid.use_activesupport_time_zone = false
67
+ end
68
+
69
+ it "returns an ActiveSupport::TimeWithZone" do
70
+ ActiveSupport::TimeWithZone.demongoize(time).class.should eq(ActiveSupport::TimeWithZone)
71
+ end
72
+
73
+ context "when the local time is not observing daylight saving" do
74
+
75
+ let(:new_time) do
76
+ Time.utc(2010, 11, 19, 12)
77
+ end
78
+
79
+ it "returns the local time" do
80
+ ActiveSupport::TimeWithZone.demongoize(new_time).should eq(
81
+ Time.zone.local(2010, 11, 19, 13)
82
+ )
83
+ end
84
+ end
85
+
86
+ context "when the local time is observing daylight saving" do
87
+
88
+ let(:new_time) do
89
+ Time.utc(2010, 9, 19, 12)
90
+ end
91
+
92
+ it "returns the local time" do
93
+ ActiveSupport::TimeWithZone.demongoize(new_time).should eq(
94
+ Time.zone.local(2010, 9, 19, 14)
95
+ )
96
+ end
97
+ end
98
+
99
+ context "when we have a time close to midnight" do
100
+
101
+ let(:new_time) do
102
+ Time.utc(2010, 11, 19, 0, 30)
103
+ end
104
+
105
+ it "change it back to the equivalent local time" do
106
+ ActiveSupport::TimeWithZone.demongoize(new_time).should eq(
107
+ Time.zone.local(2010, 11, 19, 1, 30)
108
+ )
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ context "when the time zone is defined as UTC" do
115
+
116
+ before do
117
+ Mongoid.use_utc = true
118
+ end
119
+
120
+ after do
121
+ Mongoid.use_utc = false
122
+ end
123
+
124
+ it "returns utc" do
125
+ ActiveSupport::TimeWithZone.demongoize(time.dup.utc).utc_offset.should eq(0)
126
+ end
127
+
128
+ context "when using the ActiveSupport time zone" do
129
+
130
+ let(:time) do
131
+ Time.utc(2010, 11, 19, 0, 30)
132
+ end
133
+
134
+ before do
135
+ Mongoid.use_activesupport_time_zone = true
136
+ Time.zone = "Stockholm"
137
+ end
138
+
139
+ after do
140
+ Time.zone = nil
141
+ Mongoid.use_activesupport_time_zone = false
142
+ end
143
+
144
+ it "returns utc" do
145
+ ActiveSupport::TimeWithZone.demongoize(time).should eq(
146
+ ActiveSupport::TimeZone['UTC'].local(2010, 11, 19, 0, 30)
147
+ )
148
+ end
149
+
150
+ it "returns an ActiveSupport::TimeWithZone" do
151
+ ActiveSupport::TimeWithZone.demongoize(time).class.should eq(
152
+ ActiveSupport::TimeWithZone
153
+ )
154
+ end
155
+ end
156
+ end
157
+
158
+ context "when time is nil" do
159
+
160
+ it "returns nil" do
161
+ ActiveSupport::TimeWithZone.demongoize(nil).should be_nil
162
+ end
163
+ end
164
+ end
165
+
166
+ describe ".mongoize" do
167
+
168
+ let!(:time) do
169
+ Time.local(2010, 11, 19)
170
+ end
171
+
172
+ context "when given nil" do
173
+
174
+ it "returns nil" do
175
+ ActiveSupport::TimeWithZone.mongoize(nil).should be_nil
176
+ end
177
+ end
178
+
179
+ context "when string is empty" do
180
+
181
+ it "returns nil" do
182
+ ActiveSupport::TimeWithZone.mongoize("").should be_nil
183
+ end
184
+ end
185
+
186
+ context "when given a string" do
187
+
188
+ context "when the string is a valid time" do
189
+
190
+ it "converts to a utc time" do
191
+ ActiveSupport::TimeWithZone.mongoize(time.to_s).utc_offset.should eq(0)
192
+ end
193
+
194
+ it "serializes with time parsing" do
195
+ ActiveSupport::TimeWithZone.mongoize(time.to_s).should eq(Time.parse(time.to_s).utc)
196
+ end
197
+
198
+ it "returns a local date from the string" do
199
+ ActiveSupport::TimeWithZone.mongoize(time.to_s).should eq(
200
+ Time.local(time.year, time.month, time.day, time.hour, time.min, time.sec)
201
+ )
202
+ end
203
+ end
204
+
205
+ context "when the string is an invalid time" do
206
+
207
+ let(:epoch) do
208
+ Time.utc(1970, 1, 1, 0, 0, 0)
209
+ end
210
+
211
+ it "returns epoch" do
212
+ ActiveSupport::TimeWithZone.mongoize("time").should eq(epoch)
213
+ end
214
+ end
215
+
216
+ context "when using the ActiveSupport time zone" do
217
+
218
+ before do
219
+ Mongoid.use_activesupport_time_zone = true
220
+ # if this is actually your time zone, the following tests are useless
221
+ Time.zone = "Stockholm"
222
+ end
223
+
224
+ after do
225
+ Time.zone = nil
226
+ Mongoid.use_activesupport_time_zone = false
227
+ end
228
+
229
+ context "when the local time is not observing daylight saving" do
230
+
231
+ it "returns the local time" do
232
+ ActiveSupport::TimeWithZone.mongoize('2010-11-19 5:00:00').should eq(
233
+ Time.utc(2010, 11, 19, 4)
234
+ )
235
+ end
236
+ end
237
+
238
+ context "when the local time is observing daylight saving" do
239
+
240
+ it "returns the local time" do
241
+ ActiveSupport::TimeWithZone.mongoize('2010-9-19 5:00:00').should eq(
242
+ Time.utc(2010, 9, 19, 3)
243
+ )
244
+ end
245
+ end
246
+ end
247
+ end
248
+
249
+ context "when given a DateTime" do
250
+
251
+ let!(:time) do
252
+ Time.now
253
+ end
254
+
255
+ it "doesn't strip milli- or microseconds" do
256
+ ActiveSupport::TimeWithZone.mongoize(time).to_f.round(4).should eq(
257
+ time.to_f.round(4)
258
+ )
259
+ end
260
+
261
+ context "when using the ActiveSupport time zone" do
262
+
263
+ let(:datetime) do
264
+ DateTime.new(2010, 11, 19)
265
+ end
266
+
267
+ before do
268
+ Mongoid.use_activesupport_time_zone = true
269
+ # if this is actually your time zone, the following tests are useless
270
+ Time.zone = "Stockholm"
271
+ end
272
+
273
+ after do
274
+ Time.zone = nil
275
+ Mongoid.use_activesupport_time_zone = false
276
+ end
277
+
278
+ it "assumes the given time is local" do
279
+ ActiveSupport::TimeWithZone.mongoize(datetime).should eq(
280
+ Time.utc(2010, 11, 19)
281
+ )
282
+ end
283
+ end
284
+ end
285
+
286
+ context "when given a Time" do
287
+
288
+ it "converts to a utc time" do
289
+ ActiveSupport::TimeWithZone.mongoize(time).utc_offset.should eq(0)
290
+ end
291
+
292
+ it "returns utc times unchanged" do
293
+ ActiveSupport::TimeWithZone.mongoize(time.utc).should eq(time.utc)
294
+ end
295
+
296
+ it "returns the time as utc" do
297
+ ActiveSupport::TimeWithZone.mongoize(time).should eq(time.utc)
298
+ end
299
+
300
+ it "doesn't strip milli- or microseconds" do
301
+ ActiveSupport::TimeWithZone.mongoize(time).to_f.should eq(time.to_f)
302
+ end
303
+ end
304
+
305
+ context "when given an ActiveSupport::TimeWithZone" do
306
+
307
+ before do
308
+ 1.hour.ago
309
+ end
310
+
311
+ it "converts it to utc" do
312
+ ActiveSupport::TimeWithZone.mongoize(time.in_time_zone("Alaska")).should eq(
313
+ Time.at(time.to_i).utc
314
+ )
315
+ end
316
+ end
317
+
318
+ context "when given a Date" do
319
+
320
+ let(:date) do
321
+ Date.today
322
+ end
323
+
324
+ it "converts to a utc time" do
325
+ ActiveSupport::TimeWithZone.mongoize(date).should eq(Time.local(date.year, date.month, date.day))
326
+ end
327
+
328
+ it "has a zero utc offset" do
329
+ ActiveSupport::TimeWithZone.mongoize(date).utc_offset.should eq(0)
330
+ end
331
+
332
+ context "when using the ActiveSupport time zone" do
333
+
334
+ let(:date) do
335
+ Date.new(2010, 11, 19)
336
+ end
337
+
338
+ before do
339
+ Mongoid.use_activesupport_time_zone = true
340
+ # if this is actually your time zone, the following tests are useless
341
+ Time.zone = "Stockholm"
342
+ end
343
+
344
+ after do
345
+ Time.zone = nil
346
+ Mongoid.use_activesupport_time_zone = false
347
+ end
348
+
349
+ it "assumes the given time is local" do
350
+ ActiveSupport::TimeWithZone.mongoize(date).should eq(Time.utc(2010, 11, 18, 23))
351
+ end
352
+ end
353
+ end
354
+
355
+ context "when given an array" do
356
+
357
+ let(:array) do
358
+ [ 2010, 11, 19, 00, 24, 49 ]
359
+ end
360
+
361
+ it "returns a time" do
362
+ ActiveSupport::TimeWithZone.mongoize(array).should eq(Time.local(*array))
363
+ end
364
+
365
+ context "when using the ActiveSupport time zone" do
366
+
367
+ before do
368
+ Mongoid.use_activesupport_time_zone = true
369
+ # if this is actually your time zone, the following tests are useless
370
+ Time.zone = "Stockholm"
371
+ end
372
+
373
+ after do
374
+ Time.zone = nil
375
+ Mongoid.use_activesupport_time_zone = false
376
+ end
377
+
378
+ it "assumes the given time is local" do
379
+ ActiveSupport::TimeWithZone.mongoize(array).should eq(
380
+ Time.utc(2010, 11, 18, 23, 24, 49)
381
+ )
382
+ end
383
+ end
384
+ end
385
+ end
386
+
387
+ describe "#mongoize" do
388
+
389
+ let!(:time) do
390
+ Time.local(2010, 11, 19)
391
+ end
392
+
393
+ it "converts to a utc time" do
394
+ time.mongoize.utc_offset.should eq(0)
395
+ end
396
+
397
+ it "returns the time as utc" do
398
+ time.mongoize.should eq(time.utc)
399
+ end
400
+
401
+ it "doesn't strip milli- or microseconds" do
402
+ time.mongoize.to_f.should eq(time.to_f)
403
+ end
404
+ end
405
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Extensions::TrueClass do
4
+
5
+ describe "#__sortable__" do
6
+
7
+ it "returns 1" do
8
+ true.__sortable__.should eq(1)
9
+ end
10
+ end
11
+
12
+ describe "#is_a?" do
13
+
14
+ context "when provided a Boolean" do
15
+
16
+ it "returns true" do
17
+ true.is_a?(Boolean).should be_true
18
+ end
19
+ end
20
+
21
+ context "when provided a FalseClass" do
22
+
23
+ it "returns false" do
24
+ true.is_a?(FalseClass).should be_false
25
+ end
26
+ end
27
+
28
+ context "when provided a TrueClass" do
29
+
30
+ it "returns true" do
31
+ true.is_a?(TrueClass).should be_true
32
+ end
33
+ end
34
+
35
+ context "when provided an invalid class" do
36
+
37
+ it "returns false" do
38
+ false.is_a?(String).should be_false
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,185 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Factory do
4
+
5
+ describe ".build" do
6
+
7
+ context "when the type attribute is present" do
8
+
9
+ let(:attributes) do
10
+ { "_type" => "Person", "title" => "Sir" }
11
+ end
12
+
13
+ context "when the type is a class" do
14
+
15
+ let(:person) do
16
+ described_class.build(Person, attributes)
17
+ end
18
+
19
+ it "instantiates based on the type" do
20
+ person.title.should eq("Sir")
21
+ end
22
+ end
23
+
24
+ context "when the type is a not a subclass" do
25
+
26
+ let(:person) do
27
+ described_class.build(Person, { "_type" => "Canvas" })
28
+ end
29
+
30
+ it "instantiates the provided class" do
31
+ person.class.should eq(Person)
32
+ end
33
+ end
34
+
35
+ context "when the type is a subclass of the provided" do
36
+
37
+ let(:person) do
38
+ described_class.build(Person, { "_type" => "Doctor" })
39
+ end
40
+
41
+ it "instantiates the subclass" do
42
+ person.class.should eq(Doctor)
43
+ end
44
+ end
45
+
46
+ context "when type is an empty string" do
47
+
48
+ let(:attributes) do
49
+ { "title" => "Sir", "_type" => "" }
50
+ end
51
+
52
+ let(:person) do
53
+ described_class.build(Person, attributes)
54
+ end
55
+
56
+ it "instantiates based on the type" do
57
+ person.title.should eq("Sir")
58
+ end
59
+ end
60
+
61
+ context "when type is the lower case class name" do
62
+
63
+ let(:attributes) do
64
+ { "title" => "Sir", "_type" => "person" }
65
+ end
66
+
67
+ let(:person) do
68
+ described_class.build(Person, attributes)
69
+ end
70
+
71
+ it "instantiates based on the type" do
72
+ person.title.should eq("Sir")
73
+ end
74
+ end
75
+ end
76
+
77
+ context "when type is not preset" do
78
+
79
+ let(:attributes) do
80
+ { "title" => "Sir" }
81
+ end
82
+
83
+ let(:person) do
84
+ described_class.build(Person, attributes)
85
+ end
86
+
87
+ it "instantiates based on the provided class" do
88
+ person.title.should eq("Sir")
89
+ end
90
+ end
91
+ end
92
+
93
+ describe ".from_db" do
94
+
95
+ context "when the attributes are nil" do
96
+
97
+ let(:document) do
98
+ described_class.from_db(Address, nil)
99
+ end
100
+
101
+ it "generates based on the provided class" do
102
+ document.should be_a(Address)
103
+ end
104
+
105
+ it "sets the attributes to empty" do
106
+ document.attributes.should be_empty
107
+ end
108
+ end
109
+
110
+ context "when a type is in the attributes" do
111
+
112
+ context "when the type is a class" do
113
+
114
+ let(:attributes) do
115
+ { "_type" => "Person", "title" => "Sir" }
116
+ end
117
+
118
+ let(:document) do
119
+ described_class.from_db(Address, attributes)
120
+ end
121
+
122
+ it "generates based on the type" do
123
+ document.should be_a(Person)
124
+ end
125
+
126
+ it "sets the attributes" do
127
+ document.title.should eq("Sir")
128
+ end
129
+ end
130
+
131
+ context "when the type is empty" do
132
+
133
+ let(:attributes) do
134
+ { "_type" => "", "title" => "Sir" }
135
+ end
136
+
137
+ let(:document) do
138
+ described_class.from_db(Person, attributes)
139
+ end
140
+
141
+ it "generates based on the provided class" do
142
+ document.should be_a(Person)
143
+ end
144
+
145
+ it "sets the attributes" do
146
+ document.title.should eq("Sir")
147
+ end
148
+ end
149
+
150
+ context "when type is the lower case class name" do
151
+
152
+ let(:attributes) do
153
+ { "title" => "Sir", "_type" => "person" }
154
+ end
155
+
156
+ let(:person) do
157
+ described_class.from_db(Person, attributes)
158
+ end
159
+
160
+ it "instantiates based on the type" do
161
+ person.title.should eq("Sir")
162
+ end
163
+ end
164
+ end
165
+
166
+ context "when a type is not in the attributes" do
167
+
168
+ let(:attributes) do
169
+ { "title" => "Sir" }
170
+ end
171
+
172
+ let(:document) do
173
+ described_class.from_db(Person, attributes)
174
+ end
175
+
176
+ it "generates based on the provided class" do
177
+ document.should be_a(Person)
178
+ end
179
+
180
+ it "sets the attributes" do
181
+ document.title.should eq("Sir")
182
+ end
183
+ end
184
+ end
185
+ end