mongoid_rails4 4.0.0

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 (659) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3213 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +448 -0
  7. data/lib/mongoid.rb +104 -0
  8. data/lib/mongoid/atomic.rb +384 -0
  9. data/lib/mongoid/atomic/modifiers.rb +317 -0
  10. data/lib/mongoid/atomic/paths.rb +3 -0
  11. data/lib/mongoid/atomic/paths/embedded.rb +28 -0
  12. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  13. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  14. data/lib/mongoid/atomic/paths/root.rb +39 -0
  15. data/lib/mongoid/attributes.rb +284 -0
  16. data/lib/mongoid/attributes/dynamic.rb +154 -0
  17. data/lib/mongoid/attributes/nested.rb +82 -0
  18. data/lib/mongoid/attributes/processing.rb +147 -0
  19. data/lib/mongoid/attributes/readonly.rb +56 -0
  20. data/lib/mongoid/changeable.rb +379 -0
  21. data/lib/mongoid/composable.rb +104 -0
  22. data/lib/mongoid/config.rb +263 -0
  23. data/lib/mongoid/config/environment.rb +44 -0
  24. data/lib/mongoid/config/options.rb +74 -0
  25. data/lib/mongoid/config/validators.rb +3 -0
  26. data/lib/mongoid/config/validators/option.rb +25 -0
  27. data/lib/mongoid/config/validators/session.rb +140 -0
  28. data/lib/mongoid/contextual.rb +54 -0
  29. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  30. data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
  31. data/lib/mongoid/contextual/atomic.rb +180 -0
  32. data/lib/mongoid/contextual/command.rb +61 -0
  33. data/lib/mongoid/contextual/eager.rb +158 -0
  34. data/lib/mongoid/contextual/find_and_modify.rb +69 -0
  35. data/lib/mongoid/contextual/geo_near.rb +238 -0
  36. data/lib/mongoid/contextual/map_reduce.rb +324 -0
  37. data/lib/mongoid/contextual/memory.rb +440 -0
  38. data/lib/mongoid/contextual/mongo.rb +676 -0
  39. data/lib/mongoid/contextual/queryable.rb +25 -0
  40. data/lib/mongoid/contextual/text_search.rb +180 -0
  41. data/lib/mongoid/copyable.rb +67 -0
  42. data/lib/mongoid/criteria.rb +562 -0
  43. data/lib/mongoid/criteria/findable.rb +179 -0
  44. data/lib/mongoid/criteria/inspectable.rb +25 -0
  45. data/lib/mongoid/criteria/marshalable.rb +50 -0
  46. data/lib/mongoid/criteria/modifiable.rb +189 -0
  47. data/lib/mongoid/criteria/scopable.rb +158 -0
  48. data/lib/mongoid/document.rb +361 -0
  49. data/lib/mongoid/equality.rb +66 -0
  50. data/lib/mongoid/errors.rb +40 -0
  51. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  52. data/lib/mongoid/errors/callback.rb +25 -0
  53. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  54. data/lib/mongoid/errors/document_not_found.rb +111 -0
  55. data/lib/mongoid/errors/eager_load.rb +22 -0
  56. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  57. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  58. data/lib/mongoid/errors/invalid_field.rb +64 -0
  59. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  60. data/lib/mongoid/errors/invalid_find.rb +19 -0
  61. data/lib/mongoid/errors/invalid_includes.rb +32 -0
  62. data/lib/mongoid/errors/invalid_index.rb +28 -0
  63. data/lib/mongoid/errors/invalid_options.rb +28 -0
  64. data/lib/mongoid/errors/invalid_path.rb +21 -0
  65. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  66. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  67. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  68. data/lib/mongoid/errors/invalid_time.rb +22 -0
  69. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  70. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  71. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  72. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  73. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  74. data/lib/mongoid/errors/no_default_session.rb +23 -0
  75. data/lib/mongoid/errors/no_environment.rb +19 -0
  76. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  77. data/lib/mongoid/errors/no_metadata.rb +21 -0
  78. data/lib/mongoid/errors/no_parent.rb +24 -0
  79. data/lib/mongoid/errors/no_session_config.rb +22 -0
  80. data/lib/mongoid/errors/no_session_database.rb +27 -0
  81. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  82. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  83. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  84. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  85. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  86. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  87. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  88. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  89. data/lib/mongoid/errors/validations.rb +29 -0
  90. data/lib/mongoid/evolvable.rb +19 -0
  91. data/lib/mongoid/extensions.rb +35 -0
  92. data/lib/mongoid/extensions/array.rb +180 -0
  93. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  94. data/lib/mongoid/extensions/boolean.rb +21 -0
  95. data/lib/mongoid/extensions/date.rb +77 -0
  96. data/lib/mongoid/extensions/date_time.rb +73 -0
  97. data/lib/mongoid/extensions/false_class.rb +38 -0
  98. data/lib/mongoid/extensions/float.rb +56 -0
  99. data/lib/mongoid/extensions/hash.rb +209 -0
  100. data/lib/mongoid/extensions/integer.rb +67 -0
  101. data/lib/mongoid/extensions/module.rb +28 -0
  102. data/lib/mongoid/extensions/nil_class.rb +33 -0
  103. data/lib/mongoid/extensions/object.rb +274 -0
  104. data/lib/mongoid/extensions/object_id.rb +54 -0
  105. data/lib/mongoid/extensions/range.rb +79 -0
  106. data/lib/mongoid/extensions/regexp.rb +27 -0
  107. data/lib/mongoid/extensions/set.rb +55 -0
  108. data/lib/mongoid/extensions/string.rb +199 -0
  109. data/lib/mongoid/extensions/symbol.rb +54 -0
  110. data/lib/mongoid/extensions/time.rb +88 -0
  111. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  112. data/lib/mongoid/extensions/true_class.rb +38 -0
  113. data/lib/mongoid/factory.rb +46 -0
  114. data/lib/mongoid/fields.rb +542 -0
  115. data/lib/mongoid/fields/foreign_key.rb +174 -0
  116. data/lib/mongoid/fields/localized.rb +73 -0
  117. data/lib/mongoid/fields/standard.rb +273 -0
  118. data/lib/mongoid/fields/validators.rb +2 -0
  119. data/lib/mongoid/fields/validators/macro.rb +92 -0
  120. data/lib/mongoid/findable.rb +133 -0
  121. data/lib/mongoid/identity_map.rb +163 -0
  122. data/lib/mongoid/indexable.rb +147 -0
  123. data/lib/mongoid/indexable/specification.rb +115 -0
  124. data/lib/mongoid/indexable/validators/options.rb +103 -0
  125. data/lib/mongoid/inspectable.rb +59 -0
  126. data/lib/mongoid/interceptable.rb +265 -0
  127. data/lib/mongoid/loggable.rb +69 -0
  128. data/lib/mongoid/matchable.rb +152 -0
  129. data/lib/mongoid/matchable/all.rb +27 -0
  130. data/lib/mongoid/matchable/and.rb +30 -0
  131. data/lib/mongoid/matchable/default.rb +72 -0
  132. data/lib/mongoid/matchable/exists.rb +23 -0
  133. data/lib/mongoid/matchable/gt.rb +21 -0
  134. data/lib/mongoid/matchable/gte.rb +21 -0
  135. data/lib/mongoid/matchable/in.rb +24 -0
  136. data/lib/mongoid/matchable/lt.rb +21 -0
  137. data/lib/mongoid/matchable/lte.rb +21 -0
  138. data/lib/mongoid/matchable/ne.rb +21 -0
  139. data/lib/mongoid/matchable/nin.rb +21 -0
  140. data/lib/mongoid/matchable/or.rb +33 -0
  141. data/lib/mongoid/matchable/size.rb +21 -0
  142. data/lib/mongoid/persistable.rb +207 -0
  143. data/lib/mongoid/persistable/creatable.rb +189 -0
  144. data/lib/mongoid/persistable/deletable.rb +149 -0
  145. data/lib/mongoid/persistable/destroyable.rb +55 -0
  146. data/lib/mongoid/persistable/incrementable.rb +36 -0
  147. data/lib/mongoid/persistable/logical.rb +38 -0
  148. data/lib/mongoid/persistable/poppable.rb +39 -0
  149. data/lib/mongoid/persistable/pullable.rb +55 -0
  150. data/lib/mongoid/persistable/pushable.rb +62 -0
  151. data/lib/mongoid/persistable/renamable.rb +35 -0
  152. data/lib/mongoid/persistable/savable.rb +52 -0
  153. data/lib/mongoid/persistable/settable.rb +33 -0
  154. data/lib/mongoid/persistable/unsettable.rb +36 -0
  155. data/lib/mongoid/persistable/updatable.rb +151 -0
  156. data/lib/mongoid/persistable/upsertable.rb +55 -0
  157. data/lib/mongoid/positional.rb +71 -0
  158. data/lib/mongoid/railtie.rb +156 -0
  159. data/lib/mongoid/railties/database.rake +97 -0
  160. data/lib/mongoid/railties/document.rb +12 -0
  161. data/lib/mongoid/relations.rb +162 -0
  162. data/lib/mongoid/relations/accessors.rb +299 -0
  163. data/lib/mongoid/relations/auto_save.rb +106 -0
  164. data/lib/mongoid/relations/binding.rb +218 -0
  165. data/lib/mongoid/relations/bindings.rb +9 -0
  166. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  167. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  168. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  169. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  170. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  171. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  172. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  173. data/lib/mongoid/relations/builder.rb +57 -0
  174. data/lib/mongoid/relations/builders.rb +104 -0
  175. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  176. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  177. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  180. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  181. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  183. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  184. data/lib/mongoid/relations/cascading.rb +56 -0
  185. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  186. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  187. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  188. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  189. data/lib/mongoid/relations/constraint.rb +49 -0
  190. data/lib/mongoid/relations/conversions.rb +34 -0
  191. data/lib/mongoid/relations/counter_cache.rb +105 -0
  192. data/lib/mongoid/relations/cyclic.rb +107 -0
  193. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  194. data/lib/mongoid/relations/embedded/in.rb +231 -0
  195. data/lib/mongoid/relations/embedded/many.rb +639 -0
  196. data/lib/mongoid/relations/embedded/one.rb +223 -0
  197. data/lib/mongoid/relations/macros.rb +356 -0
  198. data/lib/mongoid/relations/many.rb +208 -0
  199. data/lib/mongoid/relations/marshalable.rb +32 -0
  200. data/lib/mongoid/relations/metadata.rb +1174 -0
  201. data/lib/mongoid/relations/nested_builder.rb +74 -0
  202. data/lib/mongoid/relations/one.rb +48 -0
  203. data/lib/mongoid/relations/options.rb +48 -0
  204. data/lib/mongoid/relations/polymorphic.rb +39 -0
  205. data/lib/mongoid/relations/proxy.rb +270 -0
  206. data/lib/mongoid/relations/referenced/in.rb +297 -0
  207. data/lib/mongoid/relations/referenced/many.rb +787 -0
  208. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  209. data/lib/mongoid/relations/referenced/one.rb +290 -0
  210. data/lib/mongoid/relations/reflections.rb +62 -0
  211. data/lib/mongoid/relations/synchronization.rb +169 -0
  212. data/lib/mongoid/relations/targets.rb +2 -0
  213. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  214. data/lib/mongoid/relations/touchable.rb +94 -0
  215. data/lib/mongoid/reloadable.rb +95 -0
  216. data/lib/mongoid/scopable.rb +379 -0
  217. data/lib/mongoid/selectable.rb +59 -0
  218. data/lib/mongoid/serializable.rb +170 -0
  219. data/lib/mongoid/sessions.rb +330 -0
  220. data/lib/mongoid/sessions/factory.rb +129 -0
  221. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  222. data/lib/mongoid/sessions/options.rb +141 -0
  223. data/lib/mongoid/sessions/validators.rb +2 -0
  224. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  225. data/lib/mongoid/shardable.rb +65 -0
  226. data/lib/mongoid/state.rb +97 -0
  227. data/lib/mongoid/threaded.rb +383 -0
  228. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  229. data/lib/mongoid/timestamps.rb +15 -0
  230. data/lib/mongoid/timestamps/created.rb +30 -0
  231. data/lib/mongoid/timestamps/created/short.rb +19 -0
  232. data/lib/mongoid/timestamps/short.rb +10 -0
  233. data/lib/mongoid/timestamps/updated.rb +39 -0
  234. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  235. data/lib/mongoid/traversable.rb +192 -0
  236. data/lib/mongoid/unit_of_work.rb +61 -0
  237. data/lib/mongoid/validatable.rb +180 -0
  238. data/lib/mongoid/validatable/associated.rb +48 -0
  239. data/lib/mongoid/validatable/format.rb +20 -0
  240. data/lib/mongoid/validatable/length.rb +20 -0
  241. data/lib/mongoid/validatable/localizable.rb +30 -0
  242. data/lib/mongoid/validatable/macros.rb +94 -0
  243. data/lib/mongoid/validatable/presence.rb +86 -0
  244. data/lib/mongoid/validatable/queryable.rb +30 -0
  245. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  246. data/lib/mongoid/version.rb +4 -0
  247. data/lib/rack/mongoid.rb +2 -0
  248. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  249. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  250. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  251. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  252. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  253. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  254. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  255. data/lib/rails/generators/mongoid_generator.rb +65 -0
  256. data/lib/rails/mongoid.rb +180 -0
  257. data/lib/support/ruby_version.rb +26 -0
  258. data/spec/app/models/account.rb +28 -0
  259. data/spec/app/models/acolyte.rb +17 -0
  260. data/spec/app/models/actor.rb +18 -0
  261. data/spec/app/models/actress.rb +2 -0
  262. data/spec/app/models/address.rb +77 -0
  263. data/spec/app/models/address_component.rb +5 -0
  264. data/spec/app/models/address_number.rb +6 -0
  265. data/spec/app/models/agency.rb +5 -0
  266. data/spec/app/models/agent.rb +12 -0
  267. data/spec/app/models/album.rb +14 -0
  268. data/spec/app/models/alert.rb +5 -0
  269. data/spec/app/models/animal.rb +25 -0
  270. data/spec/app/models/answer.rb +4 -0
  271. data/spec/app/models/appointment.rb +7 -0
  272. data/spec/app/models/article.rb +10 -0
  273. data/spec/app/models/artist.rb +66 -0
  274. data/spec/app/models/artwork.rb +4 -0
  275. data/spec/app/models/audio.rb +5 -0
  276. data/spec/app/models/augmentation.rb +11 -0
  277. data/spec/app/models/author.rb +4 -0
  278. data/spec/app/models/band.rb +26 -0
  279. data/spec/app/models/bar.rb +10 -0
  280. data/spec/app/models/basic.rb +6 -0
  281. data/spec/app/models/bed.rb +1 -0
  282. data/spec/app/models/big_palette.rb +2 -0
  283. data/spec/app/models/birthday.rb +13 -0
  284. data/spec/app/models/book.rb +13 -0
  285. data/spec/app/models/breed.rb +4 -0
  286. data/spec/app/models/browser.rb +6 -0
  287. data/spec/app/models/building.rb +5 -0
  288. data/spec/app/models/building_address.rb +5 -0
  289. data/spec/app/models/bus.rb +7 -0
  290. data/spec/app/models/business.rb +5 -0
  291. data/spec/app/models/callback_recorder.rb +25 -0
  292. data/spec/app/models/callback_test.rb +9 -0
  293. data/spec/app/models/canvas.rb +25 -0
  294. data/spec/app/models/car.rb +1 -0
  295. data/spec/app/models/cat.rb +8 -0
  296. data/spec/app/models/category.rb +8 -0
  297. data/spec/app/models/child.rb +4 -0
  298. data/spec/app/models/child_doc.rb +22 -0
  299. data/spec/app/models/church.rb +4 -0
  300. data/spec/app/models/circle.rb +3 -0
  301. data/spec/app/models/circuit.rb +4 -0
  302. data/spec/app/models/circus.rb +7 -0
  303. data/spec/app/models/code.rb +5 -0
  304. data/spec/app/models/comment.rb +16 -0
  305. data/spec/app/models/contractor.rb +5 -0
  306. data/spec/app/models/cookie.rb +6 -0
  307. data/spec/app/models/country_code.rb +8 -0
  308. data/spec/app/models/definition.rb +7 -0
  309. data/spec/app/models/description.rb +11 -0
  310. data/spec/app/models/dictionary.rb +10 -0
  311. data/spec/app/models/division.rb +10 -0
  312. data/spec/app/models/doctor.rb +12 -0
  313. data/spec/app/models/dog.rb +7 -0
  314. data/spec/app/models/dokument.rb +5 -0
  315. data/spec/app/models/dragon.rb +4 -0
  316. data/spec/app/models/driver.rb +7 -0
  317. data/spec/app/models/drug.rb +6 -0
  318. data/spec/app/models/dungeon.rb +4 -0
  319. data/spec/app/models/email.rb +6 -0
  320. data/spec/app/models/employer.rb +5 -0
  321. data/spec/app/models/entry.rb +6 -0
  322. data/spec/app/models/eraser.rb +1 -0
  323. data/spec/app/models/event.rb +22 -0
  324. data/spec/app/models/exhibition.rb +4 -0
  325. data/spec/app/models/exhibitor.rb +5 -0
  326. data/spec/app/models/eye.rb +9 -0
  327. data/spec/app/models/eye_bowl.rb +9 -0
  328. data/spec/app/models/face.rb +8 -0
  329. data/spec/app/models/favorite.rb +6 -0
  330. data/spec/app/models/filesystem.rb +5 -0
  331. data/spec/app/models/fire_hydrant.rb +6 -0
  332. data/spec/app/models/firefox.rb +4 -0
  333. data/spec/app/models/fish.rb +7 -0
  334. data/spec/app/models/folder.rb +7 -0
  335. data/spec/app/models/folder_item.rb +9 -0
  336. data/spec/app/models/fruits.rb +28 -0
  337. data/spec/app/models/game.rb +19 -0
  338. data/spec/app/models/ghost.rb +7 -0
  339. data/spec/app/models/home.rb +4 -0
  340. data/spec/app/models/house.rb +6 -0
  341. data/spec/app/models/html_writer.rb +3 -0
  342. data/spec/app/models/image.rb +22 -0
  343. data/spec/app/models/implant.rb +16 -0
  344. data/spec/app/models/item.rb +8 -0
  345. data/spec/app/models/jar.rb +7 -0
  346. data/spec/app/models/label.rb +40 -0
  347. data/spec/app/models/language.rb +5 -0
  348. data/spec/app/models/lat_lng.rb +15 -0
  349. data/spec/app/models/league.rb +11 -0
  350. data/spec/app/models/learner.rb +2 -0
  351. data/spec/app/models/line_item.rb +6 -0
  352. data/spec/app/models/location.rb +8 -0
  353. data/spec/app/models/login.rb +8 -0
  354. data/spec/app/models/manufacturer.rb +7 -0
  355. data/spec/app/models/meat.rb +4 -0
  356. data/spec/app/models/membership.rb +4 -0
  357. data/spec/app/models/mixed_drink.rb +4 -0
  358. data/spec/app/models/movie.rb +13 -0
  359. data/spec/app/models/my_hash.rb +2 -0
  360. data/spec/app/models/name.rb +23 -0
  361. data/spec/app/models/node.rb +5 -0
  362. data/spec/app/models/note.rb +12 -0
  363. data/spec/app/models/ordered_post.rb +6 -0
  364. data/spec/app/models/ordered_preference.rb +6 -0
  365. data/spec/app/models/oscar.rb +15 -0
  366. data/spec/app/models/override.rb +16 -0
  367. data/spec/app/models/ownable.rb +6 -0
  368. data/spec/app/models/owner.rb +6 -0
  369. data/spec/app/models/pack.rb +3 -0
  370. data/spec/app/models/page.rb +5 -0
  371. data/spec/app/models/page_question.rb +4 -0
  372. data/spec/app/models/palette.rb +7 -0
  373. data/spec/app/models/parent.rb +5 -0
  374. data/spec/app/models/parent_doc.rb +6 -0
  375. data/spec/app/models/passport.rb +5 -0
  376. data/spec/app/models/patient.rb +9 -0
  377. data/spec/app/models/pdf_writer.rb +3 -0
  378. data/spec/app/models/pencil.rb +1 -0
  379. data/spec/app/models/person.rb +205 -0
  380. data/spec/app/models/pet.rb +23 -0
  381. data/spec/app/models/pet_owner.rb +6 -0
  382. data/spec/app/models/phone.rb +11 -0
  383. data/spec/app/models/pizza.rb +7 -0
  384. data/spec/app/models/player.rb +35 -0
  385. data/spec/app/models/post.rb +44 -0
  386. data/spec/app/models/powerup.rb +11 -0
  387. data/spec/app/models/preference.rb +9 -0
  388. data/spec/app/models/princess.rb +8 -0
  389. data/spec/app/models/product.rb +15 -0
  390. data/spec/app/models/profile.rb +5 -0
  391. data/spec/app/models/pronunciation.rb +5 -0
  392. data/spec/app/models/purchase.rb +4 -0
  393. data/spec/app/models/question.rb +8 -0
  394. data/spec/app/models/quiz.rb +7 -0
  395. data/spec/app/models/rating.rb +8 -0
  396. data/spec/app/models/record.rb +46 -0
  397. data/spec/app/models/registry.rb +4 -0
  398. data/spec/app/models/role.rb +7 -0
  399. data/spec/app/models/root_category.rb +4 -0
  400. data/spec/app/models/sandwich.rb +4 -0
  401. data/spec/app/models/scheduler.rb +7 -0
  402. data/spec/app/models/seo.rb +7 -0
  403. data/spec/app/models/series.rb +4 -0
  404. data/spec/app/models/server.rb +13 -0
  405. data/spec/app/models/service.rb +22 -0
  406. data/spec/app/models/shape.rb +12 -0
  407. data/spec/app/models/shelf.rb +5 -0
  408. data/spec/app/models/shipping_container.rb +5 -0
  409. data/spec/app/models/shipping_pack.rb +3 -0
  410. data/spec/app/models/shop.rb +6 -0
  411. data/spec/app/models/short_agent.rb +4 -0
  412. data/spec/app/models/short_quiz.rb +5 -0
  413. data/spec/app/models/slave.rb +6 -0
  414. data/spec/app/models/song.rb +8 -0
  415. data/spec/app/models/sound.rb +5 -0
  416. data/spec/app/models/square.rb +4 -0
  417. data/spec/app/models/strategy.rb +3 -0
  418. data/spec/app/models/sub_item.rb +3 -0
  419. data/spec/app/models/subscription.rb +4 -0
  420. data/spec/app/models/survey.rb +5 -0
  421. data/spec/app/models/symptom.rb +6 -0
  422. data/spec/app/models/tag.rb +8 -0
  423. data/spec/app/models/target.rb +5 -0
  424. data/spec/app/models/template.rb +5 -0
  425. data/spec/app/models/thing.rb +9 -0
  426. data/spec/app/models/title.rb +3 -0
  427. data/spec/app/models/tool.rb +8 -0
  428. data/spec/app/models/topping.rb +5 -0
  429. data/spec/app/models/track.rb +38 -0
  430. data/spec/app/models/translation.rb +5 -0
  431. data/spec/app/models/tree.rb +9 -0
  432. data/spec/app/models/truck.rb +3 -0
  433. data/spec/app/models/user.rb +21 -0
  434. data/spec/app/models/user_account.rb +10 -0
  435. data/spec/app/models/validation_callback.rb +10 -0
  436. data/spec/app/models/vehicle.rb +11 -0
  437. data/spec/app/models/version.rb +5 -0
  438. data/spec/app/models/vet_visit.rb +5 -0
  439. data/spec/app/models/video.rb +13 -0
  440. data/spec/app/models/weapon.rb +11 -0
  441. data/spec/app/models/wiki_page.rb +14 -0
  442. data/spec/app/models/word.rb +15 -0
  443. data/spec/app/models/word_origin.rb +11 -0
  444. data/spec/app/models/writer.rb +11 -0
  445. data/spec/config/mongoid.yml +38 -0
  446. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  447. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  448. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  449. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  450. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  451. data/spec/mongoid/atomic_spec.rb +365 -0
  452. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  453. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  454. data/spec/mongoid/attributes_spec.rb +1412 -0
  455. data/spec/mongoid/changeable_spec.rb +1507 -0
  456. data/spec/mongoid/composable_spec.rb +24 -0
  457. data/spec/mongoid/config/environment_spec.rb +83 -0
  458. data/spec/mongoid/config/options_spec.rb +56 -0
  459. data/spec/mongoid/config_spec.rb +318 -0
  460. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  461. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  462. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  463. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  464. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  465. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  466. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  467. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  468. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  469. data/spec/mongoid/copyable_spec.rb +393 -0
  470. data/spec/mongoid/criteria/findable_spec.rb +1189 -0
  471. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  472. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  473. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  474. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  475. data/spec/mongoid/criteria_spec.rb +3821 -0
  476. data/spec/mongoid/document_spec.rb +1205 -0
  477. data/spec/mongoid/equality_spec.rb +241 -0
  478. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  479. data/spec/mongoid/errors/callback_spec.rb +29 -0
  480. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  481. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  482. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  483. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  484. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  485. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  487. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  488. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  489. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  490. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  492. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  493. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  494. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  495. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  496. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  497. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  499. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  500. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  501. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  504. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  505. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  509. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  510. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  511. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  512. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  513. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  514. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  515. data/spec/mongoid/errors/validations_spec.rb +45 -0
  516. data/spec/mongoid/extensions/array_spec.rb +638 -0
  517. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  518. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  519. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  520. data/spec/mongoid/extensions/date_spec.rb +235 -0
  521. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  522. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  523. data/spec/mongoid/extensions/float_spec.rb +133 -0
  524. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  525. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  526. data/spec/mongoid/extensions/module_spec.rb +42 -0
  527. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  528. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  529. data/spec/mongoid/extensions/object_spec.rb +292 -0
  530. data/spec/mongoid/extensions/range_spec.rb +105 -0
  531. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  532. data/spec/mongoid/extensions/set_spec.rb +33 -0
  533. data/spec/mongoid/extensions/string_spec.rb +357 -0
  534. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  535. data/spec/mongoid/extensions/time_spec.rb +467 -0
  536. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  537. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  538. data/spec/mongoid/extensions_spec.rb +15 -0
  539. data/spec/mongoid/factory_spec.rb +185 -0
  540. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  541. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  543. data/spec/mongoid/fields/localized_spec.rb +386 -0
  544. data/spec/mongoid/fields/standard_spec.rb +166 -0
  545. data/spec/mongoid/fields_spec.rb +1229 -0
  546. data/spec/mongoid/findable_spec.rb +342 -0
  547. data/spec/mongoid/identity_map_spec.rb +564 -0
  548. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  549. data/spec/mongoid/indexable_spec.rb +504 -0
  550. data/spec/mongoid/inspectable_spec.rb +49 -0
  551. data/spec/mongoid/interceptable_spec.rb +1564 -0
  552. data/spec/mongoid/loggable_spec.rb +21 -0
  553. data/spec/mongoid/matchable/all_spec.rb +31 -0
  554. data/spec/mongoid/matchable/and_spec.rb +162 -0
  555. data/spec/mongoid/matchable/default_spec.rb +130 -0
  556. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  557. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  558. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  559. data/spec/mongoid/matchable/in_spec.rb +25 -0
  560. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  561. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  562. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  563. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  564. data/spec/mongoid/matchable/or_spec.rb +106 -0
  565. data/spec/mongoid/matchable/size_spec.rb +25 -0
  566. data/spec/mongoid/matchable_spec.rb +532 -0
  567. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  568. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  569. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  570. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  571. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  572. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  573. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  574. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  575. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  576. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  577. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  578. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  579. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  580. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  581. data/spec/mongoid/persistable_spec.rb +206 -0
  582. data/spec/mongoid/positional_spec.rb +227 -0
  583. data/spec/mongoid/railties/document_spec.rb +24 -0
  584. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  585. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  586. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  587. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  588. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  589. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  590. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  592. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  593. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  594. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  595. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  596. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  598. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  599. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  600. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  601. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  602. data/spec/mongoid/relations/builders_spec.rb +226 -0
  603. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  604. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  605. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  606. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  607. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  608. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  609. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  610. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  611. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  612. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  613. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  614. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  615. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  616. data/spec/mongoid/relations/macros_spec.rb +613 -0
  617. data/spec/mongoid/relations/metadata_spec.rb +1917 -0
  618. data/spec/mongoid/relations/options_spec.rb +35 -0
  619. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  620. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  621. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  622. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  623. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  624. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  625. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  626. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  627. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  628. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  629. data/spec/mongoid/relations_spec.rb +188 -0
  630. data/spec/mongoid/reloadable_spec.rb +305 -0
  631. data/spec/mongoid/scopable_spec.rb +926 -0
  632. data/spec/mongoid/selectable_spec.rb +134 -0
  633. data/spec/mongoid/serializable_spec.rb +862 -0
  634. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  635. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  636. data/spec/mongoid/sessions/options_spec.rb +71 -0
  637. data/spec/mongoid/sessions_spec.rb +1078 -0
  638. data/spec/mongoid/shardable_spec.rb +61 -0
  639. data/spec/mongoid/state_spec.rb +102 -0
  640. data/spec/mongoid/threaded_spec.rb +258 -0
  641. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  642. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  643. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  644. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  645. data/spec/mongoid/timestamps_spec.rb +112 -0
  646. data/spec/mongoid/traversable_spec.rb +244 -0
  647. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  648. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  649. data/spec/mongoid/validatable/format_spec.rb +83 -0
  650. data/spec/mongoid/validatable/length_spec.rb +119 -0
  651. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  652. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  653. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  654. data/spec/mongoid/validatable_spec.rb +309 -0
  655. data/spec/mongoid_spec.rb +74 -0
  656. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  657. data/spec/rails/mongoid_spec.rb +462 -0
  658. data/spec/spec_helper.rb +103 -0
  659. metadata +1159 -0
@@ -0,0 +1,1205 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Document do
4
+
5
+ let(:klass) do
6
+ Person
7
+ end
8
+
9
+ let(:person) do
10
+ Person.new
11
+ end
12
+
13
+ it "does not respond to _destroy" do
14
+ expect(person).to_not respond_to(:_destroy)
15
+ end
16
+
17
+ describe ".included" do
18
+
19
+ let(:models) do
20
+ Mongoid.models
21
+ end
22
+
23
+ let(:new_klass_name) do
24
+ 'NewKlassName'
25
+ end
26
+
27
+ let(:new_klass) do
28
+ Class.new do
29
+ class << self; attr_accessor :name; end
30
+ end.tap{|new_klass| new_klass.name = new_klass_name}
31
+ end
32
+
33
+ let(:new_model) do
34
+ new_klass.tap do
35
+ new_klass.send(:include, ::Mongoid::Document)
36
+ end
37
+ end
38
+
39
+ let(:twice_a_new_model) do
40
+ new_klass.tap do
41
+ 2.times{ new_klass.send(:include, ::Mongoid::Document) }
42
+ end
43
+ end
44
+
45
+ context "when Document has been included in a model" do
46
+ it ".models should include that model" do
47
+ expect(models).to include(klass)
48
+ end
49
+ end
50
+
51
+ context "before Document has been included" do
52
+ it ".models should *not* include that model" do
53
+ expect(models).to_not include(new_klass)
54
+ end
55
+ end
56
+
57
+ context "after Document has been included" do
58
+ it ".models should include that model" do
59
+ expect(models).to include(new_model)
60
+ end
61
+ end
62
+
63
+ context "after Document has been included multiple times" do
64
+ it ".models should include that model just once" do
65
+ expect(models.count(twice_a_new_model)).to be_eql(1)
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "._types" do
71
+
72
+ context "when the document is subclassed" do
73
+
74
+ let(:types) do
75
+ Person._types
76
+ end
77
+
78
+ it "includes the root" do
79
+ expect(types).to include("Person")
80
+ end
81
+
82
+ it "includes the subclasses" do
83
+ expect(types).to include("Doctor")
84
+ end
85
+ end
86
+
87
+ context "when the document is not subclassed" do
88
+
89
+ let(:types) do
90
+ Address._types
91
+ end
92
+
93
+ it "returns the document" do
94
+ expect(types).to eq([ "Address" ])
95
+ end
96
+ end
97
+
98
+ context "when ._types had been called before class declaration" do
99
+ let(:descendant) do
100
+ Class.new(Person)
101
+ end
102
+
103
+ before do
104
+ Person._types
105
+ descendant
106
+ end
107
+
108
+ it "should clear descendants' cache" do
109
+ expect(Person._types).to include(descendant.to_s)
110
+ end
111
+ end
112
+ end
113
+
114
+ describe "#attributes" do
115
+
116
+ let(:person) do
117
+ Person.new(title: "Sir")
118
+ end
119
+
120
+ it "returns the attributes with indifferent access" do
121
+ expect(person[:title]).to eq("Sir")
122
+ end
123
+ end
124
+
125
+ describe "#cache_key" do
126
+
127
+ let(:document) do
128
+ Dokument.new
129
+ end
130
+
131
+ context "when the document is new" do
132
+
133
+ it "has a new key name" do
134
+ expect(document.cache_key).to eq("dokuments/new")
135
+ end
136
+ end
137
+
138
+ context "when persisted" do
139
+
140
+ before do
141
+ document.save
142
+ end
143
+
144
+ context "with updated_at" do
145
+
146
+ let!(:updated_at) do
147
+ document.updated_at.utc.to_s(:number)
148
+ end
149
+
150
+ it "has the id and updated_at key name" do
151
+ expect(document.cache_key).to eq("dokuments/#{document.id}-#{updated_at}")
152
+ end
153
+ end
154
+
155
+ context "without updated_at, with Timestamps" do
156
+
157
+ before do
158
+ document.updated_at = nil
159
+ end
160
+
161
+ it "has the id key name" do
162
+ expect(document.cache_key).to eq("dokuments/#{document.id}")
163
+ end
164
+ end
165
+ end
166
+
167
+ context "when model dont have Timestamps" do
168
+
169
+ let(:artist) do
170
+ Artist.create!
171
+ end
172
+
173
+ it "should have the id key name" do
174
+ expect(artist.cache_key).to eq("artists/#{artist.id}")
175
+ end
176
+ end
177
+
178
+ context "when model has Short Timestamps" do
179
+
180
+ let(:agent) do
181
+ ShortAgent.create!
182
+ end
183
+
184
+ let!(:updated_at) do
185
+ agent.updated_at.utc.to_s(:number)
186
+ end
187
+
188
+ it "has the id and updated_at key name" do
189
+ expect(agent.cache_key).to eq("short_agents/#{agent.id}-#{updated_at}")
190
+ end
191
+ end
192
+ end
193
+
194
+ describe "#identity" do
195
+
196
+ let(:person) do
197
+ Person.new
198
+ end
199
+
200
+ it "returns a [doc.class, doc.id] array" do
201
+ expect(person.identity).to eq([person.class, person.id])
202
+ end
203
+ end
204
+
205
+ describe "#hash" do
206
+
207
+ let(:person) do
208
+ Person.new
209
+ end
210
+
211
+ it "returns the identity hash" do
212
+ expect(person.hash).to eq(person.identity.hash)
213
+ end
214
+ end
215
+
216
+ describe "#initialize" do
217
+
218
+ let(:person) do
219
+ Person.new(title: "Sir")
220
+ end
221
+
222
+ it "sets persisted to false" do
223
+ expect(person).to_not be_persisted
224
+ end
225
+
226
+ it "creates an id for the document" do
227
+ expect(person.id).to be_a(Moped::BSON::ObjectId)
228
+ end
229
+
230
+ it "sets the attributes" do
231
+ expect(person.title).to eq("Sir")
232
+ end
233
+
234
+ context "when the model has a default scope" do
235
+
236
+ context "when the default scope is settable" do
237
+
238
+ let(:sound) do
239
+ Sound.new
240
+ end
241
+
242
+ it "sets the default scoping on the model" do
243
+ expect(sound).to be_active
244
+ end
245
+ end
246
+
247
+ context "when the default scope is not settable" do
248
+
249
+ let(:audio) do
250
+ Audio.new
251
+ end
252
+
253
+ it "does not set the default scoping" do
254
+ expect(audio.likes).to be_nil
255
+ end
256
+ end
257
+ end
258
+
259
+ context "when accessing a relation from an overridden setter" do
260
+
261
+ let(:doctor) do
262
+ Doctor.new(specialty: "surgery")
263
+ end
264
+
265
+ it "allows access to the relation" do
266
+ expect(doctor.users.first).to be_a(User)
267
+ end
268
+
269
+ it "properly allows super calls" do
270
+ expect(doctor.specialty).to eq("surgery")
271
+ end
272
+ end
273
+
274
+ context "when initialize callbacks are defined" do
275
+
276
+ context "when accessing attributes" do
277
+
278
+ before do
279
+ Person.set_callback :initialize, :after do |doc|
280
+ doc.title = "Madam"
281
+ end
282
+ end
283
+
284
+ after do
285
+ Person.reset_callbacks(:initialize)
286
+ end
287
+
288
+ it "runs the callbacks" do
289
+ expect(person.title).to eq("Madam")
290
+ end
291
+ end
292
+
293
+ context "when accessing relations" do
294
+
295
+ let(:person) do
296
+ Person.new(game: Game.new)
297
+ end
298
+
299
+ before do
300
+ Person.after_initialize do
301
+ self.game.name = "Ms. Pacman"
302
+ end
303
+ end
304
+
305
+ after do
306
+ Person.reset_callbacks(:initialize)
307
+ end
308
+
309
+ it "runs the callbacks" do
310
+ expect(person.game.name).to eq("Ms. Pacman")
311
+ end
312
+ end
313
+
314
+ context "when instantiating model" do
315
+
316
+ let(:person) do
317
+ Person.instantiate("_id" => Moped::BSON::ObjectId.new, "title" => "Sir")
318
+ end
319
+
320
+ before do
321
+ Person.set_callback :initialize, :after do |doc|
322
+ doc.title = "Madam"
323
+ end
324
+ end
325
+
326
+ after do
327
+ Person.reset_callbacks(:initialize)
328
+ end
329
+
330
+ it "runs the callbacks" do
331
+ expect(person.title).to eq("Madam")
332
+ end
333
+ end
334
+ end
335
+
336
+ context "when defaults are defined" do
337
+
338
+ it "sets the default values" do
339
+ expect(person.age).to eq(100)
340
+ end
341
+ end
342
+
343
+ context "when a block is provided" do
344
+
345
+ let(:person) do
346
+ Person.new do |doc|
347
+ doc.title = "King"
348
+ end
349
+ end
350
+
351
+ it "yields to the block" do
352
+ expect(person.title).to eq("King")
353
+ end
354
+ end
355
+ end
356
+
357
+ describe ".instantiate" do
358
+
359
+ context "when passing a block" do
360
+
361
+ let(:id) do
362
+ Moped::BSON::ObjectId.new
363
+ end
364
+
365
+ let(:document) do
366
+ Band.instantiate("_id" => id, "name" => "Depeche Mode") do |band|
367
+ band.likes = 1000
368
+ end
369
+ end
370
+
371
+ it "yields to the block" do
372
+ expect(document.likes).to eq(1000)
373
+ end
374
+ end
375
+
376
+ context "when an id exists" do
377
+
378
+ before do
379
+ Mongoid.identity_map_enabled = true
380
+ end
381
+
382
+ after do
383
+ Mongoid.identity_map_enabled = false
384
+ end
385
+
386
+ let(:id) do
387
+ Moped::BSON::ObjectId.new
388
+ end
389
+
390
+ let!(:person) do
391
+ Person.instantiate("_id" => id, "title" => "Sir")
392
+ end
393
+
394
+ it "sets the attributes" do
395
+ expect(person.title).to eq("Sir")
396
+ end
397
+
398
+ it "sets persisted to true" do
399
+ expect(person).to be_persisted
400
+ end
401
+
402
+ it "puts the document in the identity map" do
403
+ expect(Mongoid::IdentityMap.get(Person, id)).to eq(person)
404
+ end
405
+ end
406
+
407
+ context "when attributes are nil" do
408
+
409
+ let(:person) do
410
+ Person.instantiate
411
+ end
412
+
413
+ it "creates a new document" do
414
+ expect(person).to be_a(Person)
415
+ end
416
+ end
417
+ end
418
+
419
+ describe "#model_name" do
420
+
421
+ let(:person) do
422
+ Person.new
423
+ end
424
+
425
+ it "returns the class model name" do
426
+ expect(person.model_name).to eq("Person")
427
+ end
428
+ end
429
+
430
+ describe "#raw_attributes" do
431
+
432
+ let(:person) do
433
+ Person.new(title: "Sir")
434
+ end
435
+
436
+ it "returns the internal attributes" do
437
+ expect(person.raw_attributes["title"]).to eq("Sir")
438
+ end
439
+ end
440
+
441
+ describe "#to_a" do
442
+
443
+ let(:person) do
444
+ Person.new
445
+ end
446
+
447
+ let(:people) do
448
+ person.to_a
449
+ end
450
+
451
+ it "returns the document in an array" do
452
+ expect(people).to eq([ person ])
453
+ end
454
+ end
455
+
456
+ describe "#as_document" do
457
+
458
+ let!(:person) do
459
+ Person.new(title: "Sir")
460
+ end
461
+
462
+ let!(:address) do
463
+ person.addresses.build(street: "Upper")
464
+ end
465
+
466
+ let!(:name) do
467
+ person.build_name(first_name: "James")
468
+ end
469
+
470
+ let!(:location) do
471
+ address.locations.build(name: "Home")
472
+ end
473
+
474
+ it "includes embeds one attributes" do
475
+ expect(person.as_document).to have_key("name")
476
+ end
477
+
478
+ it "includes embeds many attributes" do
479
+ expect(person.as_document).to have_key("addresses")
480
+ end
481
+
482
+ it "includes second level embeds many attributes" do
483
+ expect(person.as_document["addresses"].first).to have_key("locations")
484
+ end
485
+
486
+ context "with relation define store_as option in embeded_many" do
487
+
488
+ let!(:phone) do
489
+ person.phones.build(number: '+33123456789')
490
+ end
491
+
492
+ it 'includes the store_as key association' do
493
+ expect(person.as_document).to have_key("mobile_phones")
494
+ end
495
+
496
+ it 'should not include the key of association' do
497
+ expect(person.as_document).to_not have_key("phones")
498
+ end
499
+ end
500
+
501
+ context "when removing an embedded document" do
502
+
503
+ before do
504
+ person.save
505
+ person.addresses.delete(address)
506
+ end
507
+
508
+ it "does not include the document in the hash" do
509
+ expect(person.as_document["addresses"]).to be_empty
510
+ end
511
+ end
512
+
513
+ context "when an embedded relation has been set to nil" do
514
+
515
+ before do
516
+ # Save the doc, then set an embeds_one relation to nil
517
+ person.save
518
+ person.name = nil
519
+ person.save
520
+ end
521
+
522
+ it "does not include the document in the hash" do
523
+ expect(person.as_document).to_not have_key("name")
524
+ end
525
+ end
526
+ end
527
+
528
+ describe "#to_key" do
529
+
530
+ context "when the document is new" do
531
+
532
+ let(:person) do
533
+ Person.new
534
+ end
535
+
536
+ it "returns nil" do
537
+ expect(person.to_key).to be_nil
538
+ end
539
+ end
540
+
541
+ context "when the document is not new" do
542
+
543
+ let(:person) do
544
+ Person.instantiate("_id" => Moped::BSON::ObjectId.new)
545
+ end
546
+
547
+ it "returns the id in an array" do
548
+ expect(person.to_key).to eq([ person.id ])
549
+ end
550
+ end
551
+
552
+ context "when the document is destroyed" do
553
+
554
+ let(:person) do
555
+ Person.instantiate("_id" => Moped::BSON::ObjectId.new).tap do |peep|
556
+ peep.destroyed = true
557
+ end
558
+ end
559
+
560
+ it "returns the id in an array" do
561
+ expect(person.to_key).to eq([ person.id ])
562
+ end
563
+ end
564
+ end
565
+
566
+ describe "#to_param" do
567
+
568
+ context "when the document is new" do
569
+
570
+ let(:person) do
571
+ Person.new
572
+ end
573
+
574
+ it "returns nil" do
575
+ expect(person.to_param).to be_nil
576
+ end
577
+ end
578
+
579
+ context "when the document is not new" do
580
+
581
+ let(:person) do
582
+ Person.instantiate("_id" => Moped::BSON::ObjectId.new)
583
+ end
584
+
585
+ it "returns the id as a string" do
586
+ expect(person.to_param).to eq(person.id.to_s)
587
+ end
588
+ end
589
+ end
590
+
591
+ describe "#frozen?" do
592
+
593
+ let(:person) do
594
+ Person.new
595
+ end
596
+
597
+ context "when attributes are not frozen" do
598
+
599
+ it "return false" do
600
+ expect(person).to_not be_frozen
601
+ expect {
602
+ person.title = "something"
603
+ }.to_not raise_error
604
+ end
605
+ end
606
+
607
+ context "when attributes are frozen" do
608
+ before do
609
+ person.raw_attributes.freeze
610
+ end
611
+
612
+ it "return true" do
613
+ expect(person).to be_frozen
614
+ end
615
+ end
616
+ end
617
+
618
+ describe "#freeze" do
619
+
620
+ let(:person) do
621
+ Person.new
622
+ end
623
+
624
+ context "when not frozen" do
625
+
626
+ it "freezes attributes" do
627
+ expect(person.freeze).to eq(person)
628
+ expect { person.title = "something" }.to raise_error
629
+ end
630
+ end
631
+
632
+ context "when frozen" do
633
+
634
+ before do
635
+ person.raw_attributes.freeze
636
+ end
637
+
638
+ it "keeps things frozen" do
639
+ person.freeze
640
+ expect {
641
+ person.title = "something"
642
+ }.to raise_error
643
+ end
644
+ end
645
+ end
646
+
647
+ describe ".logger" do
648
+
649
+ it "returns the mongoid logger" do
650
+ expect(Person.logger).to eq(Mongoid.logger)
651
+ end
652
+ end
653
+
654
+ describe "#logger" do
655
+
656
+ let(:person) do
657
+ Person.new
658
+ end
659
+
660
+ it "returns the mongoid logger" do
661
+ expect(person.send(:logger)).to eq(Mongoid.logger)
662
+ end
663
+ end
664
+
665
+ context "after including the document module" do
666
+
667
+ let(:movie) do
668
+ Movie.new
669
+ end
670
+
671
+ it "resets to the global scope" do
672
+ expect(movie.global_set).to be_a(::Set)
673
+ end
674
+ end
675
+ context "when a model name conflicts with a mongoid internal" do
676
+
677
+ let(:scheduler) do
678
+ Scheduler.new
679
+ end
680
+
681
+ it "allows the model name" do
682
+ expect(scheduler.strategy).to be_a(Strategy)
683
+ end
684
+ end
685
+
686
+ describe "#initialize" do
687
+
688
+ context "when providing a block" do
689
+
690
+ it "sets the defaults before yielding" do
691
+ Person.new do |person|
692
+ expect(person.age).to eq(100)
693
+ end
694
+ end
695
+ end
696
+ end
697
+
698
+ context "defining a Moped::BSON::ObjectId as a field" do
699
+
700
+ let(:bson_id) do
701
+ Moped::BSON::ObjectId.new
702
+ end
703
+
704
+ let(:person) do
705
+ Person.new(bson_id: bson_id)
706
+ end
707
+
708
+ before do
709
+ person.save
710
+ end
711
+
712
+ it "persists the correct type" do
713
+ expect(person.reload.bson_id).to be_a(Moped::BSON::ObjectId)
714
+ end
715
+
716
+ it "has the correct value" do
717
+ expect(person.bson_id).to eq(bson_id)
718
+ end
719
+ end
720
+
721
+ context "when setting bson id fields to empty strings" do
722
+
723
+ let(:post) do
724
+ Post.new
725
+ end
726
+
727
+ before do
728
+ post.person_id = ""
729
+ end
730
+
731
+ it "converts them to nil" do
732
+ expect(post.person_id).to be_nil
733
+ end
734
+ end
735
+
736
+ context "creating anonymous documents" do
737
+
738
+ context "when defining collection" do
739
+
740
+ let(:model) do
741
+ Class.new do
742
+ include Mongoid::Document
743
+ store_in collection: "anonymous"
744
+ field :gender
745
+ end
746
+ end
747
+
748
+ it "allows the creation" do
749
+ Object.const_set "Anonymous", model
750
+ end
751
+ end
752
+ end
753
+
754
+ describe "#becomes" do
755
+
756
+ before(:all) do
757
+ Person.validates_format_of(:ssn, without: /\$\$\$/)
758
+
759
+ class Manager < Person
760
+ field :level, type: Integer, default: 1
761
+ end
762
+ end
763
+
764
+ after(:all) do
765
+ Person.reset_callbacks(:validate)
766
+ Object.send(:remove_const, :Manager)
767
+ end
768
+
769
+ context "when casting to a superclass" do
770
+
771
+ let(:manager) do
772
+ Manager.new(title: "Sir")
773
+ end
774
+
775
+ context "when no embedded documents are present" do
776
+
777
+ let(:person) do
778
+ manager.becomes(Person)
779
+ end
780
+
781
+ it "copies attributes" do
782
+ expect(person.title).to eq('Sir')
783
+ end
784
+
785
+ it "keeps the same object id" do
786
+ expect(person.id).to eq(manager.id)
787
+ end
788
+
789
+ it "sets the class type" do
790
+ expect(person._type).to eq("Person")
791
+ end
792
+
793
+ it "raises an error when inappropriate class is provided" do
794
+ expect {
795
+ manager.becomes(String)
796
+ }.to raise_error(ArgumentError)
797
+ end
798
+ end
799
+
800
+ context "when the document has embedded documents" do
801
+
802
+ context "when the attribtues are protected" do
803
+
804
+ let!(:appointment) do
805
+ manager.appointments.build
806
+ end
807
+
808
+ let(:person) do
809
+ manager.becomes(Person)
810
+ end
811
+
812
+ it "copies the embedded documents" do
813
+ expect(person.appointments.first).to eq(appointment)
814
+ end
815
+
816
+ it "returns new instances" do
817
+ expect(person.appointments.first).to_not equal(appointment)
818
+ end
819
+ end
820
+
821
+ context "when the attributes are not protected" do
822
+
823
+ context "when embedded doc is not persisted" do
824
+
825
+ let!(:address) do
826
+ manager.addresses.build(street: "hobrecht")
827
+ end
828
+
829
+ let(:person) do
830
+ manager.becomes(Person)
831
+ end
832
+
833
+ it "copies the embedded documents" do
834
+ expect(person.addresses.first).to eq(address)
835
+ end
836
+
837
+ it "returns new instances" do
838
+ expect(person.addresses.first).to_not equal(address)
839
+ end
840
+ end
841
+
842
+ context "when embedded doc is persisted" do
843
+
844
+ let(:manager) do
845
+ Manager.create(title: "Sir")
846
+ end
847
+
848
+ let!(:address) do
849
+ manager.addresses.create(street: "hobrecht")
850
+ end
851
+
852
+ let(:person) do
853
+ manager.becomes(Person)
854
+ end
855
+
856
+ before do
857
+ person.save!
858
+ end
859
+
860
+ it "copies the embedded documents" do
861
+ expect(person.addresses.first).to eq(address)
862
+ end
863
+
864
+ it "copies the embedded documents only once" do
865
+ expect(person.reload.addresses.length).to eq(1)
866
+ end
867
+ end
868
+ end
869
+ end
870
+
871
+ context "when the document has a localize field" do
872
+
873
+ let(:manager) do
874
+ Manager.new(title: "Sir", desc: "description")
875
+ end
876
+
877
+ let(:person) do
878
+ manager.becomes(Person)
879
+ end
880
+
881
+ it "copies the localize attribute" do
882
+ expect(person.desc).to eq("description")
883
+ end
884
+ end
885
+
886
+ context "when the document is new" do
887
+
888
+ let(:person) do
889
+ manager.becomes(Person)
890
+ end
891
+
892
+ it "copies the state" do
893
+ expect(person).to be_a_new_record
894
+ end
895
+ end
896
+
897
+ context "when the document is persisted" do
898
+
899
+ before do
900
+ manager.save
901
+ end
902
+
903
+ let(:person) do
904
+ manager.becomes(Person)
905
+ end
906
+
907
+ it "copies the state" do
908
+ expect(person).to be_persisted
909
+ end
910
+ end
911
+
912
+ context "when the document is destroyed" do
913
+
914
+ before do
915
+ manager.destroy
916
+ end
917
+
918
+ let(:person) do
919
+ manager.becomes(Person)
920
+ end
921
+
922
+ it "copies the state" do
923
+ expect(person).to be_destroyed
924
+ end
925
+ end
926
+
927
+ context "when the document is dirty" do
928
+
929
+ before do
930
+ manager.save
931
+ manager.ssn = "123-22-1234"
932
+ end
933
+
934
+ let(:person) do
935
+ manager.becomes(Person)
936
+ end
937
+
938
+ it "copies over the dirty changes" do
939
+ expect(person.changes["ssn"]).to eq([ nil, "123-22-1234" ])
940
+ end
941
+
942
+ it "adds the _type change" do
943
+ expect(person.changes["_type"]).to eq([ "Manager", "Person" ])
944
+ end
945
+ end
946
+
947
+ context "when the document is invalid" do
948
+
949
+ before do
950
+ manager.ssn = "$$$"
951
+ manager.valid?
952
+ end
953
+
954
+ let(:person) do
955
+ manager.becomes(Person)
956
+ end
957
+
958
+ it "copies the errors" do
959
+ expect(person.errors).to include(:ssn)
960
+ end
961
+ end
962
+ end
963
+
964
+ context "when casting to a subclass" do
965
+
966
+ let(:person) do
967
+ Person.new(title: "Sir")
968
+ end
969
+
970
+ context "when no embedded documents are present" do
971
+
972
+ let(:manager) do
973
+ person.becomes(Manager)
974
+ end
975
+
976
+ it "copies attributes" do
977
+ expect(manager.title).to eq('Sir')
978
+ end
979
+
980
+ it "keeps the same object id" do
981
+ expect(manager.id).to eq(person.id)
982
+ end
983
+
984
+ it "sets the class type" do
985
+ expect(manager._type).to eq("Manager")
986
+ end
987
+
988
+ it "raises an error when inappropriate class is provided" do
989
+ expect {
990
+ person.becomes(String)
991
+ }.to raise_error(ArgumentError)
992
+ end
993
+ end
994
+
995
+ context "when the document has embedded documents" do
996
+
997
+ let!(:address) do
998
+ person.addresses.build(street: "hobrecht")
999
+ end
1000
+
1001
+ let(:manager) do
1002
+ person.becomes(Manager)
1003
+ end
1004
+
1005
+ it "copies the embedded documents" do
1006
+ expect(manager.addresses.first).to eq(address)
1007
+ end
1008
+
1009
+ it "returns new instances" do
1010
+ expect(manager.addresses.first).to_not equal(address)
1011
+ end
1012
+ end
1013
+
1014
+ context "when the document is new" do
1015
+
1016
+ let(:manager) do
1017
+ person.becomes(Manager)
1018
+ end
1019
+
1020
+ it "copies the state" do
1021
+ expect(manager).to be_a_new_record
1022
+ end
1023
+ end
1024
+
1025
+ context "when the document is persisted" do
1026
+
1027
+ before do
1028
+ person.save
1029
+ end
1030
+
1031
+ let(:manager) do
1032
+ person.becomes(Manager)
1033
+ end
1034
+
1035
+ it "copies the state" do
1036
+ expect(manager).to be_persisted
1037
+ end
1038
+
1039
+ context "when downcasted document is saved" do
1040
+
1041
+ before do
1042
+ manager.save
1043
+ end
1044
+
1045
+ it "keeps the type" do
1046
+ expect(manager).to be_an_instance_of(Manager)
1047
+ end
1048
+
1049
+ it "copies over the dirty changes" do
1050
+ expect(manager.changes["ssn"]).to eq(person.changes["ssn"])
1051
+ end
1052
+
1053
+ it "can by queried by the parent class" do
1054
+ expect(Person.find(manager.id)).to be_an_instance_of(Manager)
1055
+ end
1056
+
1057
+ it "can by queried by the main class" do
1058
+ expect(Manager.find(manager.id)).to be_an_instance_of(Manager)
1059
+ end
1060
+ end
1061
+ end
1062
+
1063
+ context "when the document is destroyed" do
1064
+
1065
+ before do
1066
+ person.destroy
1067
+ end
1068
+
1069
+ let(:manager) do
1070
+ person.becomes(Manager)
1071
+ end
1072
+
1073
+ it "copies the state" do
1074
+ expect(manager).to be_destroyed
1075
+ end
1076
+ end
1077
+
1078
+ context "when the document is dirty" do
1079
+
1080
+ before do
1081
+ person.save
1082
+ person.ssn = "123-22-1234"
1083
+ end
1084
+
1085
+ let(:manager) do
1086
+ person.becomes(Manager)
1087
+ end
1088
+
1089
+ it "copies over the dirty changes" do
1090
+ expect(manager.changes["ssn"]).to eq([ nil, "123-22-1234" ])
1091
+ end
1092
+
1093
+ it "adds the _type change" do
1094
+ expect(manager.changes["_type"]).to eq([ "Person", "Manager" ])
1095
+ end
1096
+ end
1097
+
1098
+ context "when the document is invalid" do
1099
+
1100
+ before do
1101
+ person.ssn = "$$$"
1102
+ person.valid?
1103
+ end
1104
+
1105
+ let(:manager) do
1106
+ person.becomes(Manager)
1107
+ end
1108
+
1109
+ it "copies the errors" do
1110
+ expect(manager.errors).to include(:ssn)
1111
+ end
1112
+
1113
+ end
1114
+
1115
+ context "when the subclass validates attributes not present on the parent class" do
1116
+
1117
+ before do
1118
+ Manager.validates_inclusion_of(:level, in: [1, 2])
1119
+ end
1120
+
1121
+ let(:manager) do
1122
+ person.becomes(Manager)
1123
+ end
1124
+
1125
+ it "validates the instance of the subclass" do
1126
+ manager.level = 3
1127
+ expect(manager.valid?).to be_false
1128
+ end
1129
+
1130
+ end
1131
+
1132
+ context "when the subclass has defaults" do
1133
+
1134
+ let(:manager) do
1135
+ Person.new(title: 'Sir').becomes(Manager)
1136
+ end
1137
+
1138
+ it "applies default attributes" do
1139
+ expect(manager.level).to eq(1)
1140
+ end
1141
+ end
1142
+ end
1143
+ end
1144
+
1145
+ context "when marshalling the document" do
1146
+
1147
+ let(:person) do
1148
+ Person.new.tap do |person|
1149
+ person.addresses.extension
1150
+ end
1151
+ end
1152
+
1153
+ let!(:account) do
1154
+ person.create_account(name: "savings")
1155
+ end
1156
+
1157
+ describe Marshal, ".dump" do
1158
+
1159
+ it "successfully dumps the document" do
1160
+ expect {
1161
+ Marshal.dump(person)
1162
+ Marshal.dump(account)
1163
+ }.not_to raise_error
1164
+ end
1165
+ end
1166
+
1167
+ describe Marshal, ".load" do
1168
+
1169
+ it "successfully loads the document" do
1170
+ expect { Marshal.load(Marshal.dump(person)) }.not_to raise_error
1171
+ end
1172
+ end
1173
+ end
1174
+
1175
+ context "when putting a document in the cache" do
1176
+
1177
+ describe ActiveSupport::Cache do
1178
+
1179
+ let(:cache) do
1180
+ ActiveSupport::Cache::MemoryStore.new
1181
+ end
1182
+
1183
+ describe "#fetch" do
1184
+
1185
+ let!(:person) do
1186
+ Person.new
1187
+ end
1188
+
1189
+ let!(:account) do
1190
+ person.create_account(name: "savings")
1191
+ end
1192
+
1193
+ it "stores the parent object" do
1194
+ expect(cache.fetch("key") { person }).to eq(person)
1195
+ expect(cache.fetch("key")).to eq(person)
1196
+ end
1197
+
1198
+ it "stores the embedded object" do
1199
+ expect(cache.fetch("key") { account }).to eq(account)
1200
+ expect(cache.fetch("key")).to eq(account)
1201
+ end
1202
+ end
1203
+ end
1204
+ end
1205
+ end