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,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Options do
4
+
5
+ describe ".validate!" do
6
+
7
+ let(:relation) do
8
+ Mongoid::Relations::Embedded::Many
9
+ end
10
+
11
+ context "when the options are valid for the relation" do
12
+
13
+ let(:options) do
14
+ { relation: relation, as: :addressable }
15
+ end
16
+
17
+ it "returns true" do
18
+ expect(described_class.validate!(options)).to be_true
19
+ end
20
+ end
21
+
22
+ context "when the options are invalid for the relation" do
23
+
24
+ let(:options) do
25
+ { name: :addresses, relation: relation, polymorphic: true }
26
+ end
27
+
28
+ it "raises an error" do
29
+ expect {
30
+ described_class.validate!(options)
31
+ }.to raise_error(Mongoid::Errors::InvalidOptions)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,128 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Polymorphic do
4
+
5
+ describe "#polymorph" do
6
+
7
+ let(:klass) do
8
+ Class.new.tap { |c| c.send(:include, Mongoid::Document) }
9
+ end
10
+
11
+ context "when the relation is polymorphic" do
12
+
13
+ context "when the relation stores a foreign key" do
14
+
15
+ let(:metadata) do
16
+ Mongoid::Relations::Metadata.new(
17
+ name: :ratable,
18
+ polymorphic: true,
19
+ relation: Mongoid::Relations::Referenced::In
20
+ )
21
+ end
22
+
23
+ let!(:polymorphed) do
24
+ klass.polymorph(metadata)
25
+ end
26
+
27
+ it "sets polymorphic to true" do
28
+ expect(klass).to be_polymorphic
29
+ end
30
+
31
+ it "adds the foreign key type field" do
32
+ expect(klass.fields["ratable_type"]).to_not be_nil
33
+ end
34
+
35
+ it "returns self" do
36
+ expect(polymorphed).to eq(klass)
37
+ end
38
+ end
39
+
40
+ context "when the relation does not store a foreign key" do
41
+
42
+ let(:metadata) do
43
+ Mongoid::Relations::Metadata.new(
44
+ name: :ratings,
45
+ as: :ratable,
46
+ relation: Mongoid::Relations::Referenced::Many
47
+ )
48
+ end
49
+
50
+ before do
51
+ klass.polymorph(metadata)
52
+ end
53
+
54
+ it "sets polymorphic to true" do
55
+ expect(klass).to be_polymorphic
56
+ end
57
+
58
+ it "does not add the foreign key type field" do
59
+ expect(klass.fields["ratable_type"]).to be_nil
60
+ end
61
+
62
+ it "does not add the foreign key inverse field field" do
63
+ expect(klass.fields["ratable_field"]).to be_nil
64
+ end
65
+ end
66
+ end
67
+
68
+ context "when the relation is not polymorphic" do
69
+
70
+ let(:metadata) do
71
+ Mongoid::Relations::Metadata.new(
72
+ name: :ratings,
73
+ relation: Mongoid::Relations::Referenced::Many
74
+ )
75
+ end
76
+
77
+ before do
78
+ klass.polymorph(metadata)
79
+ end
80
+
81
+ it "sets polymorphic to false" do
82
+ expect(klass).to_not be_polymorphic
83
+ end
84
+
85
+ it "does not add the foreign key type field" do
86
+ expect(klass.fields["ratable_type"]).to be_nil
87
+ end
88
+
89
+ it "does not add the foreign key inverse field field" do
90
+ expect(klass.fields["ratable_field"]).to be_nil
91
+ end
92
+ end
93
+ end
94
+
95
+ describe ".polymorphic?" do
96
+
97
+ context "when the document is in a polymorphic relation" do
98
+
99
+ it "returns true" do
100
+ expect(Movie).to be_polymorphic
101
+ end
102
+ end
103
+
104
+ context "when the document is not in a polymorphic relation" do
105
+
106
+ it "returns false" do
107
+ expect(Survey).to_not be_polymorphic
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "#polymorphic?" do
113
+
114
+ context "when the document is in a polymorphic relation" do
115
+
116
+ it "returns true" do
117
+ expect(Movie.new).to be_polymorphic
118
+ end
119
+ end
120
+
121
+ context "when the document is not in a polymorphic relation" do
122
+
123
+ it "returns false" do
124
+ expect(Survey.new).to_not be_polymorphic
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Proxy do
4
+
5
+ describe "#extend" do
6
+
7
+ before(:all) do
8
+ Person.reset_callbacks(:validate)
9
+ module Testable
10
+ end
11
+ end
12
+
13
+ after(:all) do
14
+ Object.send(:remove_const, :Testable)
15
+ end
16
+
17
+ let(:person) do
18
+ Person.create
19
+ end
20
+
21
+ let(:name) do
22
+ person.build_name
23
+ end
24
+
25
+ before do
26
+ name.namable.extend(Testable)
27
+ end
28
+
29
+ it "extends the proxied object" do
30
+ expect(person).to be_a(Testable)
31
+ end
32
+
33
+ context "when extending from the relation definition" do
34
+
35
+ let!(:address) do
36
+ person.addresses.create(street: "hobrecht")
37
+ end
38
+
39
+ let(:found) do
40
+ person.addresses.find_by_street("hobrecht")
41
+ end
42
+
43
+ it "extends the proxy" do
44
+ expect(found).to eq(address)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,1435 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Referenced::In do
4
+
5
+ before(:all) do
6
+ Person.reset_callbacks(:validate)
7
+ end
8
+
9
+ let(:person) do
10
+ Person.create
11
+ end
12
+
13
+ describe "#=" do
14
+
15
+ context "when the relation is named target" do
16
+
17
+ let(:target) do
18
+ User.new
19
+ end
20
+
21
+ context "when the relation is referenced from an embeds many" do
22
+
23
+ context "when setting via create" do
24
+
25
+ let(:service) do
26
+ person.services.create(target: target)
27
+ end
28
+
29
+ it "sets the target relation" do
30
+ expect(service.target).to eq(target)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ context "when the inverse relation has no reference defined" do
37
+
38
+ let(:agent) do
39
+ Agent.new(title: "007")
40
+ end
41
+
42
+ let(:game) do
43
+ Game.new(name: "Donkey Kong")
44
+ end
45
+
46
+ before do
47
+ agent.game = game
48
+ end
49
+
50
+ it "sets the relation" do
51
+ expect(agent.game).to eq(game)
52
+ end
53
+
54
+ it "sets the foreign_key" do
55
+ expect(agent.game_id).to eq(game.id)
56
+ end
57
+ end
58
+
59
+ context "when referencing a document from an embedded document" do
60
+
61
+ let(:person) do
62
+ Person.create
63
+ end
64
+
65
+ let(:address) do
66
+ person.addresses.create(street: "Wienerstr")
67
+ end
68
+
69
+ let(:account) do
70
+ Account.create(name: "1", number: 1000000)
71
+ end
72
+
73
+ before do
74
+ address.account = account
75
+ end
76
+
77
+ it "sets the relation" do
78
+ expect(address.account).to eq(account)
79
+ end
80
+
81
+ it "does not erase the metadata" do
82
+ expect(address.metadata).to_not be_nil
83
+ end
84
+
85
+ it "allows saving of the embedded document" do
86
+ expect(address.save).to be_true
87
+ end
88
+ end
89
+
90
+ context "when the parent is a references one" do
91
+
92
+ context "when the relation is not polymorphic" do
93
+
94
+ context "when the child is a new record" do
95
+
96
+ let(:person) do
97
+ Person.new
98
+ end
99
+
100
+ let(:game) do
101
+ Game.new
102
+ end
103
+
104
+ before do
105
+ game.person = person
106
+ end
107
+
108
+ it "sets the target of the relation" do
109
+ expect(game.person.target).to eq(person)
110
+ end
111
+
112
+ it "sets the foreign key on the relation" do
113
+ expect(game.person_id).to eq(person.id)
114
+ end
115
+
116
+ it "sets the base on the inverse relation" do
117
+ expect(person.game).to eq(game)
118
+ end
119
+
120
+ it "sets the same instance on the inverse relation" do
121
+ expect(person.game).to eql(game)
122
+ end
123
+
124
+ it "does not save the target" do
125
+ expect(person).to_not be_persisted
126
+ end
127
+ end
128
+
129
+ context "when the child is not a new record" do
130
+
131
+ let(:person) do
132
+ Person.new
133
+ end
134
+
135
+ let(:game) do
136
+ Game.create
137
+ end
138
+
139
+ before do
140
+ game.person = person
141
+ end
142
+
143
+ it "sets the target of the relation" do
144
+ expect(game.person.target).to eq(person)
145
+ end
146
+
147
+ it "sets the foreign key of the relation" do
148
+ expect(game.person_id).to eq(person.id)
149
+ end
150
+
151
+ it "sets the base on the inverse relation" do
152
+ expect(person.game).to eq(game)
153
+ end
154
+
155
+ it "sets the same instance on the inverse relation" do
156
+ expect(person.game).to eql(game)
157
+ end
158
+
159
+ it "does not saves the target" do
160
+ expect(person).to_not be_persisted
161
+ end
162
+ end
163
+ end
164
+
165
+ context "when the relation is polymorphic" do
166
+
167
+ context "when the parent is a subclass" do
168
+
169
+ let(:canvas) do
170
+ Canvas::Test.create
171
+ end
172
+
173
+ let(:comment) do
174
+ Comment.create(title: "test")
175
+ end
176
+
177
+ before do
178
+ comment.commentable = canvas
179
+ comment.save
180
+ end
181
+
182
+ it "sets the correct value in the type field" do
183
+ expect(comment.commentable_type).to eq("Canvas::Test")
184
+ end
185
+
186
+ it "can retrieve the document from the database" do
187
+ expect(comment.reload.commentable).to eq(canvas)
188
+ end
189
+ end
190
+
191
+ context "when the child is a new record" do
192
+
193
+ let(:bar) do
194
+ Bar.new
195
+ end
196
+
197
+ let(:rating) do
198
+ Rating.new
199
+ end
200
+
201
+ before do
202
+ rating.ratable = bar
203
+ end
204
+
205
+ it "sets the target of the relation" do
206
+ expect(rating.ratable.target).to eq(bar)
207
+ end
208
+
209
+ it "sets the foreign key on the relation" do
210
+ expect(rating.ratable_id).to eq(bar.id)
211
+ end
212
+
213
+ it "sets the base on the inverse relation" do
214
+ expect(bar.rating).to eq(rating)
215
+ end
216
+
217
+ it "sets the same instance on the inverse relation" do
218
+ expect(bar.rating).to eql(rating)
219
+ end
220
+
221
+ it "does not save the target" do
222
+ expect(bar).to_not be_persisted
223
+ end
224
+ end
225
+
226
+ context "when the child is not a new record" do
227
+
228
+ let(:bar) do
229
+ Bar.new
230
+ end
231
+
232
+ let(:rating) do
233
+ Rating.create
234
+ end
235
+
236
+ before do
237
+ rating.ratable = bar
238
+ end
239
+
240
+ it "sets the target of the relation" do
241
+ expect(rating.ratable.target).to eq(bar)
242
+ end
243
+
244
+ it "sets the foreign key of the relation" do
245
+ expect(rating.ratable_id).to eq(bar.id)
246
+ end
247
+
248
+ it "sets the base on the inverse relation" do
249
+ expect(bar.rating).to eq(rating)
250
+ end
251
+
252
+ it "sets the same instance on the inverse relation" do
253
+ expect(bar.rating).to eql(rating)
254
+ end
255
+
256
+ it "does not saves the target" do
257
+ expect(bar).to_not be_persisted
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ context "when the parent is a references many" do
264
+
265
+ context "when the relation is not polymorphic" do
266
+
267
+ context "when the child is a new record" do
268
+
269
+ let(:person) do
270
+ Person.new
271
+ end
272
+
273
+ let(:post) do
274
+ Post.new
275
+ end
276
+
277
+ before do
278
+ post.person = person
279
+ end
280
+
281
+ it "sets the target of the relation" do
282
+ expect(post.person.target).to eq(person)
283
+ end
284
+
285
+ it "sets the foreign key on the relation" do
286
+ expect(post.person_id).to eq(person.id)
287
+ end
288
+
289
+ it "does not save the target" do
290
+ expect(person).to_not be_persisted
291
+ end
292
+ end
293
+
294
+ context "when the child is not a new record" do
295
+
296
+ let(:person) do
297
+ Person.new
298
+ end
299
+
300
+ let(:post) do
301
+ Post.create
302
+ end
303
+
304
+ before do
305
+ post.person = person
306
+ end
307
+
308
+ it "sets the target of the relation" do
309
+ expect(post.person.target).to eq(person)
310
+ end
311
+
312
+ it "sets the foreign key of the relation" do
313
+ expect(post.person_id).to eq(person.id)
314
+ end
315
+
316
+ it "does not saves the target" do
317
+ expect(person).to_not be_persisted
318
+ end
319
+ end
320
+ end
321
+
322
+ context "when the relation is polymorphic" do
323
+
324
+ context "when multiple relations against the same class exist" do
325
+
326
+ let(:face) do
327
+ Face.new
328
+ end
329
+
330
+ let(:eye) do
331
+ Eye.new
332
+ end
333
+
334
+ it "raises an error" do
335
+ expect {
336
+ eye.eyeable = face
337
+ }.to raise_error(Mongoid::Errors::InvalidSetPolymorphicRelation)
338
+ end
339
+ end
340
+
341
+ context "when multiple relations of the same name but different class exist" do
342
+
343
+ let(:eye) do
344
+ Eye.new
345
+ end
346
+
347
+ let(:eye_bowl) do
348
+ EyeBowl.new
349
+ end
350
+
351
+ it "should assign as expected" do
352
+ eye.suspended_in = eye_bowl
353
+ expect(eye.suspended_in.target).to eq(eye_bowl)
354
+ end
355
+ end
356
+
357
+ context "when one relation against the same class exists" do
358
+
359
+ context "when the child is a new record" do
360
+
361
+ let(:movie) do
362
+ Movie.new
363
+ end
364
+
365
+ let(:rating) do
366
+ Rating.new
367
+ end
368
+
369
+ before do
370
+ rating.ratable = movie
371
+ end
372
+
373
+ it "sets the target of the relation" do
374
+ expect(rating.ratable.target).to eq(movie)
375
+ end
376
+
377
+ it "sets the foreign key on the relation" do
378
+ expect(rating.ratable_id).to eq(movie.id)
379
+ end
380
+
381
+ it "does not save the target" do
382
+ expect(movie).to_not be_persisted
383
+ end
384
+ end
385
+
386
+ context "when the child is not a new record" do
387
+
388
+ let(:movie) do
389
+ Movie.new
390
+ end
391
+
392
+ let(:rating) do
393
+ Rating.create
394
+ end
395
+
396
+ before do
397
+ rating.ratable = movie
398
+ end
399
+
400
+ it "sets the target of the relation" do
401
+ expect(rating.ratable.target).to eq(movie)
402
+ end
403
+
404
+ it "sets the foreign key of the relation" do
405
+ expect(rating.ratable_id).to eq(movie.id)
406
+ end
407
+
408
+ it "does not saves the target" do
409
+ expect(movie).to_not be_persisted
410
+ end
411
+ end
412
+ end
413
+ end
414
+ end
415
+ end
416
+
417
+ describe "#= nil" do
418
+
419
+ context "when dependent is destroy" do
420
+
421
+ let(:account) do
422
+ Account.create
423
+ end
424
+
425
+ let(:drug) do
426
+ Drug.create
427
+ end
428
+
429
+ let(:person) do
430
+ Person.create
431
+ end
432
+
433
+ context "when relation is has_one" do
434
+
435
+ before do
436
+ Account.belongs_to :person, dependent: :destroy
437
+ Person.has_one :account
438
+ person.account = account
439
+ person.save
440
+ end
441
+
442
+ after :all do
443
+ Account.belongs_to :person, dependent: :nullify
444
+ Person.has_one :account, validate: false
445
+ end
446
+
447
+ context "when parent exists" do
448
+
449
+ context "when child is destroyed" do
450
+
451
+ before do
452
+ account.delete
453
+ end
454
+
455
+ it "deletes child" do
456
+ expect(account).to be_destroyed
457
+ end
458
+
459
+ it "deletes parent" do
460
+ expect(person).to be_destroyed
461
+ end
462
+ end
463
+ end
464
+ end
465
+
466
+ context "when relation is has_many" do
467
+
468
+ before do
469
+ Drug.belongs_to :person, dependent: :destroy
470
+ Person.has_many :drugs
471
+ person.drugs = [drug]
472
+ person.save
473
+ end
474
+
475
+ after :all do
476
+ Drug.belongs_to :person, dependent: :nullify
477
+ Person.has_many :drugs, validate: false
478
+ end
479
+
480
+ context "when parent exists" do
481
+
482
+ context "when child is destroyed" do
483
+
484
+ before do
485
+ drug.delete
486
+ end
487
+
488
+ it "deletes child" do
489
+ expect(drug).to be_destroyed
490
+ end
491
+
492
+ it "deletes parent" do
493
+ expect(person).to be_destroyed
494
+ end
495
+ end
496
+ end
497
+ end
498
+ end
499
+
500
+ context "when dependent is delete" do
501
+
502
+ let(:account) do
503
+ Account.create
504
+ end
505
+
506
+ let(:drug) do
507
+ Drug.create
508
+ end
509
+
510
+ let(:person) do
511
+ Person.create
512
+ end
513
+
514
+ context "when relation is has_one" do
515
+
516
+ before do
517
+ Account.belongs_to :person, dependent: :delete
518
+ Person.has_one :account
519
+ person.account = account
520
+ person.save
521
+ end
522
+
523
+ after :all do
524
+ Account.belongs_to :person, dependent: :nullify
525
+ Person.has_one :account, validate: false
526
+ end
527
+
528
+ context "when parent is persisted" do
529
+
530
+ context "when child is deleted" do
531
+
532
+ before do
533
+ account.delete
534
+ end
535
+
536
+ it "deletes child" do
537
+ expect(account).to be_destroyed
538
+ end
539
+
540
+ it "deletes parent" do
541
+ expect(person).to be_destroyed
542
+ end
543
+ end
544
+ end
545
+ end
546
+
547
+ context "when relation is has_many" do
548
+
549
+ before do
550
+ Drug.belongs_to :person, dependent: :delete
551
+ Person.has_many :drugs
552
+ person.drugs = [drug]
553
+ person.save
554
+ end
555
+
556
+ after :all do
557
+ Drug.belongs_to :person, dependent: :nullify
558
+ Person.has_many :drugs, validate: false
559
+ end
560
+
561
+ context "when parent exists" do
562
+
563
+ context "when child is destroyed" do
564
+
565
+ before do
566
+ drug.delete
567
+ end
568
+
569
+ it "deletes child" do
570
+ expect(drug).to be_destroyed
571
+ end
572
+
573
+ it "deletes parent" do
574
+ expect(person).to be_destroyed
575
+ end
576
+ end
577
+ end
578
+ end
579
+ end
580
+
581
+ context "when dependent is nullify" do
582
+
583
+ let(:account) do
584
+ Account.create
585
+ end
586
+
587
+ let(:drug) do
588
+ Drug.create
589
+ end
590
+
591
+ let(:person) do
592
+ Person.create
593
+ end
594
+
595
+ context "when relation is has_one" do
596
+
597
+ before do
598
+ Account.belongs_to :person, dependent: :nullify
599
+ Person.has_one :account
600
+ person.account = account
601
+ person.save
602
+ end
603
+
604
+ context "when parent is persisted" do
605
+
606
+ context "when child is deleted" do
607
+
608
+ before do
609
+ account.delete
610
+ end
611
+
612
+ it "deletes child" do
613
+ expect(account).to be_destroyed
614
+ end
615
+
616
+ it "doesn't delete parent" do
617
+ expect(person).to_not be_destroyed
618
+ end
619
+
620
+ it "removes the link" do
621
+ expect(person.account).to be_nil
622
+ end
623
+ end
624
+ end
625
+ end
626
+
627
+ context "when relation is has_many" do
628
+
629
+ before do
630
+ Drug.belongs_to :person, dependent: :nullify
631
+ Person.has_many :drugs
632
+ person.drugs = [drug]
633
+ person.save
634
+ end
635
+
636
+ context "when parent exists" do
637
+
638
+ context "when child is destroyed" do
639
+
640
+ before do
641
+ drug.delete
642
+ end
643
+
644
+ it "deletes child" do
645
+ expect(drug).to be_destroyed
646
+ end
647
+
648
+ it "doesn't deletes parent" do
649
+ expect(person).to_not be_destroyed
650
+ end
651
+
652
+ it "removes the link" do
653
+ expect(person.drugs).to eq([])
654
+ end
655
+ end
656
+ end
657
+ end
658
+ end
659
+
660
+ context "when the inverse relation has no reference defined" do
661
+
662
+ let(:agent) do
663
+ Agent.new(title: "007")
664
+ end
665
+
666
+ let(:game) do
667
+ Game.new(name: "Donkey Kong")
668
+ end
669
+
670
+ before do
671
+ agent.game = game
672
+ agent.game = nil
673
+ end
674
+
675
+ it "removes the relation" do
676
+ expect(agent.game).to be_nil
677
+ end
678
+
679
+ it "removes the foreign_key" do
680
+ expect(agent.game_id).to be_nil
681
+ end
682
+ end
683
+
684
+ context "when the parent is a references one" do
685
+
686
+ context "when the relation is not polymorphic" do
687
+
688
+ context "when the parent is a new record" do
689
+
690
+ let(:person) do
691
+ Person.new
692
+ end
693
+
694
+ let(:game) do
695
+ Game.new
696
+ end
697
+
698
+ before do
699
+ game.person = person
700
+ game.person = nil
701
+ end
702
+
703
+ it "sets the relation to nil" do
704
+ expect(game.person).to be_nil
705
+ end
706
+
707
+ it "removed the inverse relation" do
708
+ expect(person.game).to be_nil
709
+ end
710
+
711
+ it "removes the foreign key value" do
712
+ expect(game.person_id).to be_nil
713
+ end
714
+ end
715
+
716
+ context "when the parent is not a new record" do
717
+
718
+ let(:person) do
719
+ Person.create
720
+ end
721
+
722
+ let(:game) do
723
+ Game.create
724
+ end
725
+
726
+ before do
727
+ game.person = person
728
+ game.person = nil
729
+ end
730
+
731
+ it "sets the relation to nil" do
732
+ expect(game.person).to be_nil
733
+ end
734
+
735
+ it "removed the inverse relation" do
736
+ expect(person.game).to be_nil
737
+ end
738
+
739
+ it "removes the foreign key value" do
740
+ expect(game.person_id).to be_nil
741
+ end
742
+
743
+ it "does not delete the child" do
744
+ expect(game).to_not be_destroyed
745
+ end
746
+ end
747
+ end
748
+
749
+ context "when the relation is polymorphic" do
750
+
751
+ context "when one relation against the same class exists" do
752
+
753
+ context "when the parent is a new record" do
754
+
755
+ let(:bar) do
756
+ Bar.new
757
+ end
758
+
759
+ let(:rating) do
760
+ Rating.new
761
+ end
762
+
763
+ before do
764
+ rating.ratable = bar
765
+ rating.ratable = nil
766
+ end
767
+
768
+ it "sets the relation to nil" do
769
+ expect(rating.ratable).to be_nil
770
+ end
771
+
772
+ it "removed the inverse relation" do
773
+ expect(bar.rating).to be_nil
774
+ end
775
+
776
+ it "removes the foreign key value" do
777
+ expect(rating.ratable_id).to be_nil
778
+ end
779
+ end
780
+
781
+ context "when the parent is not a new record" do
782
+
783
+ let(:bar) do
784
+ Bar.new
785
+ end
786
+
787
+ let(:rating) do
788
+ Rating.create
789
+ end
790
+
791
+ before do
792
+ rating.ratable = bar
793
+ rating.ratable = nil
794
+ end
795
+
796
+ it "sets the relation to nil" do
797
+ expect(rating.ratable).to be_nil
798
+ end
799
+
800
+ it "removed the inverse relation" do
801
+ expect(bar.rating).to be_nil
802
+ end
803
+
804
+ it "removes the foreign key value" do
805
+ expect(rating.ratable_id).to be_nil
806
+ end
807
+ end
808
+ end
809
+ end
810
+ end
811
+
812
+ context "when the parent is a references many" do
813
+
814
+ context "when the relation is not polymorphic" do
815
+
816
+ context "when the parent is a new record" do
817
+
818
+ let(:person) do
819
+ Person.new
820
+ end
821
+
822
+ let(:post) do
823
+ Post.new
824
+ end
825
+
826
+ before do
827
+ post.person = person
828
+ post.person = nil
829
+ end
830
+
831
+ it "sets the relation to nil" do
832
+ expect(post.person).to be_nil
833
+ end
834
+
835
+ it "removed the inverse relation" do
836
+ expect(person.posts).to be_empty
837
+ end
838
+
839
+ it "removes the foreign key value" do
840
+ expect(post.person_id).to be_nil
841
+ end
842
+ end
843
+
844
+ context "when the parent is not a new record" do
845
+
846
+ let(:person) do
847
+ Person.new
848
+ end
849
+
850
+ let(:post) do
851
+ Post.create
852
+ end
853
+
854
+ before do
855
+ post.person = person
856
+ post.person = nil
857
+ end
858
+
859
+ it "sets the relation to nil" do
860
+ expect(post.person).to be_nil
861
+ end
862
+
863
+ it "removed the inverse relation" do
864
+ expect(person.posts).to be_empty
865
+ end
866
+
867
+ it "removes the foreign key value" do
868
+ expect(post.person_id).to be_nil
869
+ end
870
+ end
871
+ end
872
+
873
+ context "when the relation is polymorphic" do
874
+
875
+ context "when the parent is a new record" do
876
+
877
+ let(:movie) do
878
+ Movie.new
879
+ end
880
+
881
+ let(:rating) do
882
+ Rating.new
883
+ end
884
+
885
+ before do
886
+ rating.ratable = movie
887
+ rating.ratable = nil
888
+ end
889
+
890
+ it "sets the relation to nil" do
891
+ expect(rating.ratable).to be_nil
892
+ end
893
+
894
+ it "removed the inverse relation" do
895
+ expect(movie.ratings).to be_empty
896
+ end
897
+
898
+ it "removes the foreign key value" do
899
+ expect(rating.ratable_id).to be_nil
900
+ end
901
+ end
902
+
903
+ context "when the parent is not a new record" do
904
+
905
+ let(:movie) do
906
+ Movie.new
907
+ end
908
+
909
+ let(:rating) do
910
+ Rating.create
911
+ end
912
+
913
+ before do
914
+ rating.ratable = movie
915
+ rating.ratable = nil
916
+ end
917
+
918
+ it "sets the relation to nil" do
919
+ expect(rating.ratable).to be_nil
920
+ end
921
+
922
+ it "removed the inverse relation" do
923
+ expect(movie.ratings).to be_empty
924
+ end
925
+
926
+ it "removes the foreign key value" do
927
+ expect(rating.ratable_id).to be_nil
928
+ end
929
+ end
930
+ end
931
+ end
932
+ end
933
+
934
+ describe ".builder" do
935
+
936
+ let(:builder_klass) do
937
+ Mongoid::Relations::Builders::Referenced::In
938
+ end
939
+
940
+ let(:document) do
941
+ double
942
+ end
943
+
944
+ let(:metadata) do
945
+ double(extension?: false)
946
+ end
947
+
948
+ it "returns the embedded in builder" do
949
+ expect(
950
+ described_class.builder(nil, metadata, document)
951
+ ).to be_a_kind_of(builder_klass)
952
+ end
953
+ end
954
+
955
+ describe ".eager_load" do
956
+
957
+ before do
958
+ Mongoid.identity_map_enabled = true
959
+ end
960
+
961
+ after do
962
+ Mongoid.identity_map_enabled = false
963
+ end
964
+
965
+ context "when the relation is not polymorphic" do
966
+
967
+ let!(:person) do
968
+ Person.create
969
+ end
970
+
971
+ let!(:post) do
972
+ person.posts.create(title: "testing")
973
+ end
974
+
975
+ let(:metadata) do
976
+ Post.relations["person"]
977
+ end
978
+
979
+ let(:eager) do
980
+ described_class.eager_load(metadata, Post.all)
981
+ end
982
+
983
+ let!(:map) do
984
+ Mongoid::IdentityMap.get(Person, person.id)
985
+ end
986
+
987
+ it "puts the document in the identity map" do
988
+ expect(map).to eq(person)
989
+ end
990
+ end
991
+
992
+ context "when the relation is polymorphic" do
993
+
994
+ let(:metadata) do
995
+ Rating.relations["ratable"]
996
+ end
997
+
998
+ it "raises an error" do
999
+ expect {
1000
+ described_class.eager_load(metadata, Rating.all)
1001
+ }.to raise_error(Mongoid::Errors::EagerLoad)
1002
+ end
1003
+ end
1004
+
1005
+ context "when the ids has been duplicated" do
1006
+
1007
+ let!(:person) do
1008
+ Person.create
1009
+ end
1010
+
1011
+ let!(:posts) do
1012
+ 2.times {|i| person.posts.create(title: "testing#{i}") }
1013
+ person.posts
1014
+ end
1015
+
1016
+ let(:metadata) do
1017
+ Post.relations["person"]
1018
+ end
1019
+
1020
+ let(:eager) do
1021
+ described_class.eager_load(metadata, posts.map(&:person_id))
1022
+ end
1023
+
1024
+ it "duplication should be removed" do
1025
+ expect(eager.count).to eq(1)
1026
+ end
1027
+ end
1028
+ end
1029
+
1030
+ describe ".embedded?" do
1031
+
1032
+ it "returns false" do
1033
+ expect(described_class).to_not be_embedded
1034
+ end
1035
+ end
1036
+
1037
+ describe ".foreign_key_suffix" do
1038
+
1039
+ it "returns _id" do
1040
+ expect(described_class.foreign_key_suffix).to eq("_id")
1041
+ end
1042
+ end
1043
+
1044
+ describe ".macro" do
1045
+
1046
+ it "returns belongs_to" do
1047
+ expect(described_class.macro).to eq(:belongs_to)
1048
+ end
1049
+ end
1050
+
1051
+ describe "#respond_to?" do
1052
+
1053
+ let(:person) do
1054
+ Person.new
1055
+ end
1056
+
1057
+ let(:game) do
1058
+ person.build_game(name: "Tron")
1059
+ end
1060
+
1061
+ let(:document) do
1062
+ game.person
1063
+ end
1064
+
1065
+ Mongoid::Document.public_instance_methods(true).each do |method|
1066
+
1067
+ context "when checking #{method}" do
1068
+
1069
+ it "returns true" do
1070
+ expect(document.respond_to?(method)).to be_true
1071
+ end
1072
+ end
1073
+ end
1074
+ end
1075
+
1076
+ describe ".stores_foreign_key?" do
1077
+
1078
+ it "returns true" do
1079
+ expect(described_class.stores_foreign_key?).to be_true
1080
+ end
1081
+ end
1082
+
1083
+ describe ".valid_options" do
1084
+
1085
+ it "returns the valid options" do
1086
+ expect(described_class.valid_options).to eq(
1087
+ [
1088
+ :autobuild,
1089
+ :autosave,
1090
+ :dependent,
1091
+ :foreign_key,
1092
+ :index,
1093
+ :polymorphic,
1094
+ :primary_key,
1095
+ :touch
1096
+ ]
1097
+ )
1098
+ end
1099
+ end
1100
+
1101
+ describe ".validation_default" do
1102
+
1103
+ it "returns false" do
1104
+ expect(described_class.validation_default).to be_false
1105
+ end
1106
+ end
1107
+
1108
+ context "when the relation is self referencing" do
1109
+
1110
+ let(:game_one) do
1111
+ Game.new(name: "Diablo")
1112
+ end
1113
+
1114
+ let(:game_two) do
1115
+ Game.new(name: "Warcraft")
1116
+ end
1117
+
1118
+ context "when setting the parent" do
1119
+
1120
+ before do
1121
+ game_one.parent = game_two
1122
+ end
1123
+
1124
+ it "sets the parent" do
1125
+ expect(game_one.parent).to eq(game_two)
1126
+ end
1127
+
1128
+ it "does not set the parent recursively" do
1129
+ expect(game_two.parent).to be_nil
1130
+ end
1131
+ end
1132
+ end
1133
+
1134
+ context "when the relation belongs to a has many and has one" do
1135
+
1136
+ before(:all) do
1137
+ class A
1138
+ include Mongoid::Document
1139
+ has_many :bs, inverse_of: :a
1140
+ end
1141
+
1142
+ class B
1143
+ include Mongoid::Document
1144
+ belongs_to :a, inverse_of: :bs
1145
+ belongs_to :c, inverse_of: :b
1146
+ end
1147
+
1148
+ class C
1149
+ include Mongoid::Document
1150
+ has_one :b, inverse_of: :c
1151
+ end
1152
+ end
1153
+
1154
+ after(:all) do
1155
+ Object.send(:remove_const, :A)
1156
+ Object.send(:remove_const, :B)
1157
+ Object.send(:remove_const, :C)
1158
+ end
1159
+
1160
+ context "when setting the has one" do
1161
+
1162
+ let(:a) do
1163
+ A.new
1164
+ end
1165
+
1166
+ let(:b) do
1167
+ B.new
1168
+ end
1169
+
1170
+ let(:c) do
1171
+ C.new
1172
+ end
1173
+
1174
+ before do
1175
+ b.c = c
1176
+ end
1177
+
1178
+ context "when subsequently setting the has many" do
1179
+
1180
+ before do
1181
+ b.a = a
1182
+ end
1183
+
1184
+ context "when setting the has one again" do
1185
+
1186
+ before do
1187
+ b.c = c
1188
+ end
1189
+
1190
+ it "allows the reset of the has one" do
1191
+ expect(b.c).to eq(c)
1192
+ end
1193
+ end
1194
+ end
1195
+ end
1196
+ end
1197
+
1198
+ context "when replacing the relation with another" do
1199
+
1200
+ let!(:person) do
1201
+ Person.create
1202
+ end
1203
+
1204
+ let!(:post) do
1205
+ Post.create(title: "test")
1206
+ end
1207
+
1208
+ let!(:game) do
1209
+ person.create_game(name: "Tron")
1210
+ end
1211
+
1212
+ before do
1213
+ post.person = game.person
1214
+ post.save
1215
+ end
1216
+
1217
+ it "clones the relation" do
1218
+ expect(post.person).to eq(person)
1219
+ end
1220
+
1221
+ it "sets the foreign key" do
1222
+ expect(post.person_id).to eq(person.id)
1223
+ end
1224
+
1225
+ it "does not remove the previous relation" do
1226
+ expect(game.person).to eq(person)
1227
+ end
1228
+
1229
+ it "does not remove the previous foreign key" do
1230
+ expect(game.person_id).to eq(person.id)
1231
+ end
1232
+
1233
+ context "when reloading" do
1234
+
1235
+ before do
1236
+ post.reload
1237
+ game.reload
1238
+ end
1239
+
1240
+ it "persists the relation" do
1241
+ expect(post.reload.person).to eq(person)
1242
+ end
1243
+
1244
+ it "persists the foreign key" do
1245
+ expect(post.reload.person_id).to eq(game.person_id)
1246
+ end
1247
+
1248
+ it "does not remove the previous relation" do
1249
+ expect(game.person).to eq(person)
1250
+ end
1251
+
1252
+ it "does not remove the previous foreign key" do
1253
+ expect(game.person_id).to eq(person.id)
1254
+ end
1255
+ end
1256
+ end
1257
+
1258
+ context "when the document belongs to a has one and has many" do
1259
+
1260
+ let(:movie) do
1261
+ Movie.create(name: "Infernal Affairs")
1262
+ end
1263
+
1264
+ let(:account) do
1265
+ Account.create(name: "Leung")
1266
+ end
1267
+
1268
+ context "when creating the document" do
1269
+
1270
+ let(:comment) do
1271
+ Comment.create(movie: movie, account: account)
1272
+ end
1273
+
1274
+ it "sets the correct has one" do
1275
+ expect(comment.account).to eq(account)
1276
+ end
1277
+
1278
+ it "sets the correct has many" do
1279
+ expect(comment.movie).to eq(movie)
1280
+ end
1281
+ end
1282
+ end
1283
+
1284
+ context "when reloading the relation" do
1285
+
1286
+ let!(:person_one) do
1287
+ Person.create
1288
+ end
1289
+
1290
+ let!(:person_two) do
1291
+ Person.create(title: "Sir")
1292
+ end
1293
+
1294
+ let!(:game) do
1295
+ Game.create(name: "Starcraft 2")
1296
+ end
1297
+
1298
+ before do
1299
+ game.person = person_one
1300
+ game.save
1301
+ end
1302
+
1303
+ context "when the relation references the same document" do
1304
+
1305
+ before do
1306
+ Person.collection.find({ _id: person_one.id }).
1307
+ update({ "$set" => { title: "Madam" }})
1308
+ end
1309
+
1310
+ let(:reloaded) do
1311
+ game.person(true)
1312
+ end
1313
+
1314
+ it "reloads the document from the database" do
1315
+ expect(reloaded.title).to eq("Madam")
1316
+ end
1317
+
1318
+ it "sets a new document instance" do
1319
+ expect(reloaded).to_not equal(person_one)
1320
+ end
1321
+ end
1322
+
1323
+ context "when the relation references a different document" do
1324
+
1325
+ before do
1326
+ game.person_id = person_two.id
1327
+ game.save
1328
+ end
1329
+
1330
+ let(:reloaded) do
1331
+ game.person(true)
1332
+ end
1333
+
1334
+ it "reloads the new document from the database" do
1335
+ expect(reloaded.title).to eq("Sir")
1336
+ end
1337
+
1338
+ it "sets a new document instance" do
1339
+ expect(reloaded).to_not equal(person_one)
1340
+ end
1341
+ end
1342
+ end
1343
+
1344
+ context "when the parent and child are persisted" do
1345
+
1346
+ context "when the identity map is enabled" do
1347
+
1348
+ before do
1349
+ Mongoid.identity_map_enabled = true
1350
+ end
1351
+
1352
+ after do
1353
+ Mongoid.identity_map_enabled = false
1354
+ end
1355
+
1356
+ let(:series) do
1357
+ Series.create
1358
+ end
1359
+
1360
+ let!(:book_one) do
1361
+ series.books.create
1362
+ end
1363
+
1364
+ let!(:book_two) do
1365
+ series.books.create
1366
+ end
1367
+
1368
+ let(:id) do
1369
+ Book.first.id
1370
+ end
1371
+
1372
+ context "when asking for the inverse multiple times" do
1373
+
1374
+ before do
1375
+ Book.find(id).series.books.to_a
1376
+ end
1377
+
1378
+ it "does not append and save duplicate docs" do
1379
+ expect(Book.find(id).series.books.to_a.length).to eq(2)
1380
+ end
1381
+
1382
+ it "returns the same documents from the map" do
1383
+ expect(Book.find(id)).to equal(Book.find(id))
1384
+ end
1385
+ end
1386
+ end
1387
+ end
1388
+
1389
+ context "when creating with a reference to an integer id parent" do
1390
+
1391
+ let!(:jar) do
1392
+ Jar.create do |doc|
1393
+ doc._id = 1
1394
+ end
1395
+ end
1396
+
1397
+ let(:cookie) do
1398
+ Cookie.create(jar_id: "1")
1399
+ end
1400
+
1401
+ it "allows strings to be passed as the id" do
1402
+ expect(cookie.jar).to eq(jar)
1403
+ end
1404
+
1405
+ it "persists the relation" do
1406
+ expect(cookie.reload.jar).to eq(jar)
1407
+ end
1408
+ end
1409
+
1410
+ context "when setting the relation via the foreign key" do
1411
+
1412
+ context "when the relation exists" do
1413
+
1414
+ let!(:person_one) do
1415
+ Person.create
1416
+ end
1417
+
1418
+ let!(:person_two) do
1419
+ Person.create
1420
+ end
1421
+
1422
+ let!(:game) do
1423
+ Game.create(person: person_one)
1424
+ end
1425
+
1426
+ before do
1427
+ game.person_id = person_two.id
1428
+ end
1429
+
1430
+ it "sets the new document on the relation" do
1431
+ expect(game.person).to eq(person_two)
1432
+ end
1433
+ end
1434
+ end
1435
+ end