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,1917 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Metadata do
4
+
5
+ describe "#counter_cached?" do
6
+
7
+ context "when counter_cache is false" do
8
+
9
+ let(:metadata) do
10
+ described_class.new(
11
+ name: :car,
12
+ relation: Mongoid::Relations::Referenced::In,
13
+ counter_cache: false
14
+ )
15
+ end
16
+
17
+ it "returns false" do
18
+ expect(metadata).to_not be_counter_cached
19
+ end
20
+ end
21
+
22
+ context "when counter_cache is true" do
23
+
24
+ let(:metadata) do
25
+ described_class.new(
26
+ name: :car,
27
+ relation: Mongoid::Relations::Referenced::In,
28
+ counter_cache: true
29
+ )
30
+ end
31
+
32
+ it "returns true" do
33
+ expect(metadata).to be_counter_cached
34
+ end
35
+ end
36
+
37
+ context "when counter_cache is name for column" do
38
+
39
+ let(:metadata) do
40
+ described_class.new(
41
+ name: :car,
42
+ relation: Mongoid::Relations::Referenced::In,
43
+ counter_cache: 'counter'
44
+ )
45
+ end
46
+
47
+ it "returns true" do
48
+ expect(metadata).to be_counter_cached
49
+ end
50
+ end
51
+
52
+ context "when counter_cache is nil" do
53
+
54
+ let(:metadata) do
55
+ described_class.new(
56
+ name: :car,
57
+ relation: Mongoid::Relations::Referenced::In,
58
+ )
59
+ end
60
+
61
+ it "returns false" do
62
+ expect(metadata).to_not be_counter_cached
63
+ end
64
+ end
65
+ end
66
+
67
+ describe "#counter_cache_column_name" do
68
+
69
+ let(:inverse_class_name) do
70
+ "Wheel"
71
+ end
72
+
73
+ context "when the counter_cache is true" do
74
+
75
+ let(:metadata) do
76
+ described_class.new(
77
+ name: :car,
78
+ relation: Mongoid::Relations::Referenced::In,
79
+ inverse_class_name: inverse_class_name,
80
+ counter_cache: true
81
+ )
82
+ end
83
+
84
+ before do
85
+ metadata.should_receive(:inverse).and_return(:wheels)
86
+ end
87
+
88
+ it "returns inverse name + _count" do
89
+ expect(metadata.counter_cache_column_name).to eq(
90
+ "#{inverse_class_name.demodulize.underscore.pluralize}_count"
91
+ )
92
+ end
93
+ end
94
+
95
+ context "when given a custom name for counter cache" do
96
+ let(:counter_cache_name) { 'counte_cache_for_wheels' }
97
+ let(:metadata) do
98
+ described_class.new(
99
+ name: :car,
100
+ relation: Mongoid::Relations::Referenced::In,
101
+ inverse_class_name: inverse_class_name,
102
+ counter_cache: counter_cache_name
103
+ )
104
+ end
105
+
106
+ it "returns the name given" do
107
+ expect(metadata.counter_cache_column_name).to eq(counter_cache_name)
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "#autobuilding?" do
113
+
114
+ context "when the option is true" do
115
+
116
+ let(:metadata) do
117
+ described_class.new(
118
+ relation: Mongoid::Relations::Embedded::One,
119
+ autobuild: true
120
+ )
121
+ end
122
+
123
+ it "returns true" do
124
+ expect(metadata).to be_autobuilding
125
+ end
126
+ end
127
+
128
+ context "when the option is false" do
129
+
130
+ let(:metadata) do
131
+ described_class.new(
132
+ relation: Mongoid::Relations::Embedded::One,
133
+ autobuild: false
134
+ )
135
+ end
136
+
137
+ it "returns false" do
138
+ expect(metadata).to_not be_autobuilding
139
+ end
140
+ end
141
+
142
+ context "when the option is nil" do
143
+
144
+ let(:metadata) do
145
+ described_class.new(
146
+ relation: Mongoid::Relations::Embedded::One
147
+ )
148
+ end
149
+
150
+ it "returns false" do
151
+ expect(metadata).to_not be_autobuilding
152
+ end
153
+ end
154
+ end
155
+
156
+ describe "#builder" do
157
+
158
+ let(:metadata) do
159
+ described_class.new(relation: Mongoid::Relations::Embedded::One)
160
+ end
161
+
162
+ let(:object) do
163
+ double
164
+ end
165
+
166
+ let(:base) do
167
+ double
168
+ end
169
+
170
+ it "returns the builder from the relation" do
171
+ expect(
172
+ metadata.builder(base, object)
173
+ ).to be_a_kind_of(Mongoid::Relations::Builders::Embedded::One)
174
+ end
175
+ end
176
+
177
+ describe "#cascading_callbacks?" do
178
+
179
+ context "when the option is true" do
180
+
181
+ let(:metadata) do
182
+ described_class.new(
183
+ relation: Mongoid::Relations::Embedded::Many,
184
+ cascade_callbacks: true
185
+ )
186
+ end
187
+
188
+ it "returns true" do
189
+ expect(metadata).to be_cascading_callbacks
190
+ end
191
+ end
192
+
193
+ context "when the option is false" do
194
+
195
+ let(:metadata) do
196
+ described_class.new(
197
+ relation: Mongoid::Relations::Embedded::Many,
198
+ cascade_callbacks: false
199
+ )
200
+ end
201
+
202
+ it "returns false" do
203
+ expect(metadata).to_not be_cascading_callbacks
204
+ end
205
+ end
206
+
207
+ context "when the option is nil" do
208
+
209
+ let(:metadata) do
210
+ described_class.new(
211
+ relation: Mongoid::Relations::Embedded::Many
212
+ )
213
+ end
214
+
215
+ it "returns false" do
216
+ expect(metadata).to_not be_cascading_callbacks
217
+ end
218
+ end
219
+ end
220
+
221
+ describe "#cascade_strategy" do
222
+
223
+ context "when no dependent option is set" do
224
+
225
+ let(:metadata) do
226
+ described_class.new(
227
+ name: :posts,
228
+ relation: Mongoid::Relations::Referenced::Many
229
+ )
230
+ end
231
+
232
+ it "returns nil" do
233
+ expect(metadata.cascade_strategy).to be_nil
234
+ end
235
+ end
236
+
237
+ context "when dependent is delete" do
238
+
239
+ let(:metadata) do
240
+ described_class.new(
241
+ name: :posts,
242
+ relation: Mongoid::Relations::Referenced::Many,
243
+ dependent: :delete
244
+ )
245
+ end
246
+
247
+ it "returns the delete strategy" do
248
+ expect(metadata.cascade_strategy).to eq(
249
+ Mongoid::Relations::Cascading::Delete
250
+ )
251
+ end
252
+ end
253
+
254
+ context "when dependent is destroy" do
255
+
256
+ let(:metadata) do
257
+ described_class.new(
258
+ name: :posts,
259
+ relation: Mongoid::Relations::Referenced::Many,
260
+ dependent: :destroy
261
+ )
262
+ end
263
+
264
+ it "returns the destroy strategy" do
265
+ expect(metadata.cascade_strategy).to eq(
266
+ Mongoid::Relations::Cascading::Destroy
267
+ )
268
+ end
269
+ end
270
+
271
+ context "when dependent is nullify" do
272
+
273
+ let(:metadata) do
274
+ described_class.new(
275
+ name: :posts,
276
+ relation: Mongoid::Relations::Referenced::Many,
277
+ dependent: :nullify
278
+ )
279
+ end
280
+
281
+ it "returns the nullify strategy" do
282
+ expect(metadata.cascade_strategy).to eq(
283
+ Mongoid::Relations::Cascading::Nullify
284
+ )
285
+ end
286
+ end
287
+ end
288
+
289
+ describe "#constraint" do
290
+
291
+ let(:metadata) do
292
+ described_class.new(
293
+ relation: Mongoid::Relations::Referenced::Many,
294
+ class_name: "Person"
295
+ )
296
+ end
297
+
298
+ it "returns the constraint object" do
299
+ expect(metadata.constraint).to be_a(Mongoid::Relations::Constraint)
300
+ end
301
+ end
302
+
303
+ describe "#classify" do
304
+
305
+ let(:name) do
306
+ "name"
307
+ end
308
+
309
+ let(:metadata) do
310
+ described_class.new(name: name)
311
+ end
312
+
313
+ let(:classified) do
314
+ metadata.send(:classify)
315
+ end
316
+
317
+ before do
318
+ Mongoid::Relations::Options.should_receive(:validate!).at_least(:once)
319
+ end
320
+
321
+ it "concatenates the result from #find_module and name.classify" do
322
+ metadata.should_receive(:find_module).once.and_return("Fruit")
323
+ expect(classified).to eq("Fruit::Name")
324
+ end
325
+ end
326
+
327
+ describe "#find_module" do
328
+
329
+ let(:name) do
330
+ "name"
331
+ end
332
+
333
+ let(:metadata) do
334
+ described_class.new(name: name, inverse_class_name: inverse_class_name)
335
+ end
336
+
337
+ let(:mod) do
338
+ metadata.send(:find_module)
339
+ end
340
+
341
+ before do
342
+ Mongoid::Relations::Options.should_receive(:validate!).at_least(:once)
343
+ end
344
+
345
+ context "when inverse_class_name is nil" do
346
+
347
+ let(:inverse_class_name) do
348
+ nil
349
+ end
350
+
351
+ it "returns nil" do
352
+ expect(mod).to be_nil
353
+ end
354
+ end
355
+
356
+ context "when inverse_class_name is empty" do
357
+
358
+ let(:inverse_class_name) do
359
+ ""
360
+ end
361
+
362
+ it "returns nil" do
363
+ expect(mod).to be_nil
364
+ end
365
+ end
366
+
367
+ context "when inverse_class_name is defined" do
368
+
369
+ context "when inverse_class_name is in root namespace" do
370
+
371
+ let(:inverse_class_name) do
372
+ "Person"
373
+ end
374
+
375
+ context "when name isn't defined" do
376
+
377
+ let(:name) do
378
+ "undefined"
379
+ end
380
+
381
+ it "returns nil" do
382
+ expect(mod).to be_nil
383
+ end
384
+ end
385
+
386
+ context "when name is defined in root namespace" do
387
+
388
+ let(:name) do
389
+ "account"
390
+ end
391
+
392
+ it "returns root namespace" do
393
+ expect(mod).to be_empty
394
+ end
395
+ end
396
+
397
+ context "when name is defined in module Fruits" do
398
+
399
+ context "when inverse_class_name is defined in the same module" do
400
+
401
+ let(:inverse_class_name) do
402
+ "Fruits::Apple"
403
+ end
404
+
405
+ let(:name) do
406
+ "banana"
407
+ end
408
+
409
+ it "returns Fruits" do
410
+ expect(mod).to eq("Fruits")
411
+ end
412
+ end
413
+
414
+ context "when inverse_class_name is defined in a nested module" do
415
+
416
+ let(:inverse_class_name) do
417
+ "Fruits::Big::Ananas"
418
+ end
419
+
420
+ let(:name) do
421
+ "banana"
422
+ end
423
+
424
+ it "returns Fruits" do
425
+ expect(mod).to eq("Fruits")
426
+ end
427
+ end
428
+
429
+ context "when the inverse_class_name is defined in the root namespace" do
430
+
431
+ let(:inverse_class_name) do
432
+ "Person"
433
+ end
434
+
435
+ let(:name) do
436
+ "banana"
437
+ end
438
+
439
+ it "returns nil" do
440
+ expect(mod).to be_nil
441
+ end
442
+ end
443
+ end
444
+ end
445
+ end
446
+ end
447
+
448
+ describe "#class_name" do
449
+
450
+ context "when class_name provided" do
451
+
452
+ context "when the class name contains leading ::" do
453
+
454
+ let(:metadata) do
455
+ described_class.new(
456
+ relation: Mongoid::Relations::Referenced::Many,
457
+ class_name: "::Person"
458
+ )
459
+ end
460
+
461
+ it "returns the stripped class name" do
462
+ expect(metadata.class_name).to eq("Person")
463
+ end
464
+ end
465
+
466
+ context "when the class name has no prefix" do
467
+
468
+ let(:metadata) do
469
+ described_class.new(
470
+ relation: Mongoid::Relations::Referenced::Many,
471
+ class_name: "Person"
472
+ )
473
+ end
474
+
475
+ it "constantizes the class name" do
476
+ expect(metadata.class_name).to eq("Person")
477
+ end
478
+ end
479
+ end
480
+
481
+ context "when no class_name provided" do
482
+
483
+ context "when inverse_class_name is provided" do
484
+
485
+ context "when inverse_class_name is a simple class name" do
486
+
487
+ context "when association name is singular" do
488
+
489
+ let(:relation) do
490
+ Mongoid::Relations::Embedded::One
491
+ end
492
+
493
+ let(:metadata) do
494
+ described_class.new(name: :name, relation: relation, inverse_class_name: "Person")
495
+ end
496
+
497
+ it "classifies and constantizes the association name and adds the module" do
498
+ expect(metadata.class_name).to eq("Name")
499
+ end
500
+ end
501
+
502
+ context "when association name is plural" do
503
+
504
+ let(:relation) do
505
+ Mongoid::Relations::Embedded::Many
506
+ end
507
+
508
+ let(:metadata) do
509
+ described_class.new(name: :addresses, relation: relation, inverse_class_name: "Person")
510
+ end
511
+
512
+ it "classifies and constantizes the association name and adds the module" do
513
+ expect(metadata.class_name).to eq("Address")
514
+ end
515
+ end
516
+
517
+ end
518
+
519
+ context "when inverse_class_name is a class name in a module" do
520
+
521
+ context "when association name is singular" do
522
+
523
+ let(:relation) do
524
+ Mongoid::Relations::Embedded::One
525
+ end
526
+
527
+ let(:metadata) do
528
+ described_class.new(name: :apple, relation: relation, inverse_class_name: "Fruits::Banana")
529
+ end
530
+
531
+ it "classifies and constantizes the association name and adds the module" do
532
+ expect(metadata.class_name).to eq("Fruits::Apple")
533
+ end
534
+ end
535
+
536
+ context "when association name is plural" do
537
+
538
+ let(:relation) do
539
+ Mongoid::Relations::Embedded::Many
540
+ end
541
+
542
+ let(:metadata) do
543
+ described_class.new(name: :apples, relation: relation, inverse_class_name: "Fruits::Banana")
544
+ end
545
+
546
+ it "classifies and constantizes the association name and adds the module" do
547
+ expect(metadata.class_name).to eq("Fruits::Apple")
548
+ end
549
+ end
550
+
551
+ end
552
+ end
553
+
554
+ context "when no inverse_class_name is provided" do
555
+
556
+ context "when association name is singular" do
557
+
558
+ let(:relation) do
559
+ Mongoid::Relations::Embedded::One
560
+ end
561
+
562
+ let(:metadata) do
563
+ described_class.new(name: :name, relation: relation)
564
+ end
565
+
566
+ it "classifies and constantizes the association name" do
567
+ expect(metadata.class_name).to eq("Name")
568
+ end
569
+ end
570
+
571
+ context "when association name is plural" do
572
+
573
+ let(:relation) do
574
+ Mongoid::Relations::Embedded::Many
575
+ end
576
+
577
+ let(:metadata) do
578
+ described_class.new(name: :addresses, relation: relation)
579
+ end
580
+
581
+ it "classifies and constantizes the association name" do
582
+ expect(metadata.class_name).to eq("Address")
583
+ end
584
+ end
585
+ end
586
+ end
587
+ end
588
+
589
+ describe "#destructive?" do
590
+
591
+ context "when the relation has a destructive dependent option" do
592
+
593
+ let(:metadata) do
594
+ described_class.new(
595
+ relation: Mongoid::Relations::Referenced::Many,
596
+ dependent: :destroy
597
+ )
598
+ end
599
+
600
+ it "returns true" do
601
+ expect(metadata).to be_destructive
602
+ end
603
+ end
604
+
605
+ context "when no dependent option" do
606
+
607
+ let(:metadata) do
608
+ described_class.new(
609
+ relation: Mongoid::Relations::Referenced::Many
610
+ )
611
+ end
612
+
613
+ it "returns false" do
614
+ expect(metadata).to_not be_destructive
615
+ end
616
+ end
617
+ end
618
+
619
+ describe "#embedded?" do
620
+
621
+ context "when the relation is embedded" do
622
+
623
+ let(:metadata) do
624
+ described_class.new(
625
+ relation: Mongoid::Relations::Embedded::Many
626
+ )
627
+ end
628
+
629
+ it "returns true" do
630
+ expect(metadata).to be_embedded
631
+ end
632
+ end
633
+
634
+ context "when the relation is not embedded" do
635
+
636
+ let(:metadata) do
637
+ described_class.new(
638
+ relation: Mongoid::Relations::Referenced::Many
639
+ )
640
+ end
641
+
642
+ it "returns false" do
643
+ expect(metadata).to_not be_embedded
644
+ end
645
+ end
646
+ end
647
+
648
+ describe "#extension" do
649
+
650
+ let(:metadata) do
651
+ described_class.new(
652
+ relation: Mongoid::Relations::Referenced::Many,
653
+ extend: :value
654
+ )
655
+ end
656
+
657
+ it "returns the extend property" do
658
+ expect(metadata.extension).to eq(:value)
659
+ end
660
+ end
661
+
662
+ describe "#extension?" do
663
+
664
+ context "when an extends property exists" do
665
+
666
+ let(:metadata) do
667
+ described_class.new(
668
+ relation: Mongoid::Relations::Referenced::Many,
669
+ extend: :value
670
+ )
671
+ end
672
+
673
+ it "returns true" do
674
+ expect(metadata.extension?).to be_true
675
+ end
676
+ end
677
+
678
+ context "when the extend option is nil" do
679
+
680
+ let(:metadata) do
681
+ described_class.new(
682
+ relation: Mongoid::Relations::Referenced::Many
683
+ )
684
+ end
685
+
686
+ it "returns false" do
687
+ expect(metadata.extension?).to be_false
688
+ end
689
+ end
690
+ end
691
+
692
+ describe "#foreign_key" do
693
+
694
+ context "when no foreign key was explicitly defined" do
695
+
696
+ context "when the relation stores a foreign key" do
697
+
698
+ context "when referenced in" do
699
+
700
+ context "when not providing a class name" do
701
+
702
+ let(:metadata) do
703
+ described_class.new(
704
+ name: :person,
705
+ relation: Mongoid::Relations::Referenced::In
706
+ )
707
+ end
708
+
709
+ it "returns the foreign_key" do
710
+ expect(metadata.foreign_key).to eq("person_id")
711
+ end
712
+ end
713
+
714
+ context "when providing a class name" do
715
+
716
+ let(:metadata) do
717
+ described_class.new(
718
+ name: :person,
719
+ relation: Mongoid::Relations::Referenced::In,
720
+ class_name: "TheseAreNotTheDriods"
721
+ )
722
+ end
723
+
724
+ it "returns the foreign_key" do
725
+ expect(metadata.foreign_key).to eq("person_id")
726
+ end
727
+ end
728
+
729
+ context "when the class is namespaces" do
730
+
731
+ let(:metadata) do
732
+ described_class.new(
733
+ name: :apple,
734
+ relation: Mongoid::Relations::Referenced::In,
735
+ class_name: "Fruits::Apple"
736
+ )
737
+ end
738
+
739
+ it "returns the foreign_key without the module name" do
740
+ expect(metadata.foreign_key).to eq("apple_id")
741
+ end
742
+ end
743
+ end
744
+
745
+ context "when references and referenced in many" do
746
+
747
+ let(:metadata) do
748
+ described_class.new(
749
+ name: :people,
750
+ relation: Mongoid::Relations::Referenced::ManyToMany
751
+ )
752
+ end
753
+
754
+ it "returns the foreign_key" do
755
+ expect(metadata.foreign_key).to eq("person_ids")
756
+ end
757
+
758
+ context "given a specific foreign key" do
759
+
760
+ let(:metadata) do
761
+ described_class.new(
762
+ name: :follower,
763
+ foreign_key: :follower_list,
764
+ relation: Mongoid::Relations::Referenced::ManyToMany
765
+ )
766
+ end
767
+
768
+ it "returns the foreign_key" do
769
+ expect(metadata.foreign_key).to eq("follower_list")
770
+ end
771
+ end
772
+
773
+ context "using name as foreign key" do
774
+
775
+ let(:metadata) do
776
+ described_class.new(
777
+ name: :followers,
778
+ class_name: "Person",
779
+ relation: Mongoid::Relations::Referenced::ManyToMany
780
+ )
781
+ end
782
+
783
+ it "returns the foreign_key" do
784
+ expect(metadata.foreign_key).to eq("follower_ids")
785
+ end
786
+ end
787
+
788
+ context "when the class is namespaced" do
789
+
790
+ let(:metadata) do
791
+ described_class.new(
792
+ name: :bananas,
793
+ relation: Mongoid::Relations::Referenced::ManyToMany,
794
+ inverse_class_name: "Fruits::Apple",
795
+ class_name: "Fruits::Banana"
796
+ )
797
+ end
798
+
799
+ it "returns the foreign_key without the module name" do
800
+ expect(metadata.foreign_key).to eq("banana_ids")
801
+ end
802
+
803
+ it "returns the inverse_foreign_key without the module name" do
804
+ expect(metadata.inverse_foreign_key).to eq("apple_ids")
805
+ end
806
+ end
807
+ end
808
+ end
809
+
810
+ context "when the relation does not store a foreign key" do
811
+
812
+ context "when references one" do
813
+
814
+ let(:metadata) do
815
+ described_class.new(
816
+ name: :post,
817
+ relation: Mongoid::Relations::Referenced::One,
818
+ inverse_class_name: "Person"
819
+ )
820
+ end
821
+
822
+ it "returns the inverse foreign key" do
823
+ expect(metadata.foreign_key).to eq("person_id")
824
+ end
825
+ end
826
+
827
+ context "when references many" do
828
+
829
+ context "when an inverse_of is defined" do
830
+
831
+ let(:metadata) do
832
+ described_class.new(
833
+ name: :created_streets,
834
+ relation: Mongoid::Relations::Referenced::Many,
835
+ inverse_class_name: "House",
836
+ inverse_of: :creator
837
+ )
838
+ end
839
+
840
+ it "returns the inverse_of plus suffix" do
841
+ expect(metadata.foreign_key).to eq("creator_id")
842
+ end
843
+ end
844
+
845
+ context "when the class is not namespaced" do
846
+
847
+ let(:metadata) do
848
+ described_class.new(
849
+ name: :posts,
850
+ relation: Mongoid::Relations::Referenced::Many,
851
+ inverse_class_name: "Person"
852
+ )
853
+ end
854
+
855
+ it "returns the inverse foreign key" do
856
+ expect(metadata.foreign_key).to eq("person_id")
857
+ end
858
+ end
859
+
860
+ context "when the class is namespaced" do
861
+
862
+ let(:metadata) do
863
+ described_class.new(
864
+ name: :bananas,
865
+ relation: Mongoid::Relations::Referenced::Many,
866
+ inverse_class_name: "Fruits::Apple",
867
+ class_name: "Fruits::Banana"
868
+ )
869
+ end
870
+
871
+ it "returns the foreign_key without the module name" do
872
+ expect(metadata.foreign_key).to eq("apple_id")
873
+ end
874
+ end
875
+ end
876
+
877
+ context "when embeds one" do
878
+ let(:metadata) do
879
+ described_class.new(
880
+ name: :post,
881
+ relation: Mongoid::Relations::Embedded::One,
882
+ inverse_class_name: "Person"
883
+ )
884
+ end
885
+
886
+ it "returns the inverse foreign key" do
887
+ expect(metadata.foreign_key).to eq("person_id")
888
+ end
889
+ end
890
+ end
891
+ end
892
+
893
+ context "when a foreign_key was defined" do
894
+
895
+ let(:metadata) do
896
+ described_class.new(
897
+ name: :person,
898
+ relation: Mongoid::Relations::Referenced::ManyToMany,
899
+ foreign_key: "blog_post_id"
900
+ )
901
+ end
902
+
903
+ it "returns the foreign_key" do
904
+ expect(metadata.foreign_key).to eq("blog_post_id")
905
+ end
906
+ end
907
+ end
908
+
909
+ describe "#foreign_key_default" do
910
+
911
+ context "when the relation stores keys in an array" do
912
+
913
+ let(:metadata) do
914
+ described_class.new(
915
+ name: :preferences,
916
+ relation: Mongoid::Relations::Referenced::ManyToMany,
917
+ foreign_key: "preference_ids"
918
+ )
919
+ end
920
+
921
+ it "returns an empty array" do
922
+ expect(metadata.foreign_key_default).to be_empty
923
+ end
924
+ end
925
+
926
+ context "when the relation stores a single key" do
927
+
928
+ let(:metadata) do
929
+ described_class.new(
930
+ name: :person,
931
+ relation: Mongoid::Relations::Referenced::In,
932
+ foreign_key: "person_id"
933
+ )
934
+ end
935
+
936
+ it "returns an empty array" do
937
+ expect(metadata.foreign_key_default).to be_nil
938
+ end
939
+ end
940
+ end
941
+
942
+ describe "#foreign_key_setter" do
943
+
944
+ context "when the relation is not polymorphic" do
945
+
946
+ let(:metadata) do
947
+ described_class.new(
948
+ name: :person,
949
+ relation: Mongoid::Relations::Referenced::In,
950
+ foreign_key: "person_id"
951
+ )
952
+ end
953
+
954
+ it "returns the foreign_key plus =" do
955
+ expect(metadata.foreign_key_setter).to eq("person_id=")
956
+ end
957
+ end
958
+
959
+ context "when the relation is polymorphic" do
960
+
961
+ let(:metadata) do
962
+ described_class.new(
963
+ name: :ratings,
964
+ relation: Mongoid::Relations::Referenced::Many,
965
+ as: :ratable,
966
+ inverse_class_name: "Movie"
967
+ )
968
+ end
969
+
970
+ it "returns the polymorphic foreign_key plus =" do
971
+ expect(metadata.foreign_key_setter).to eq("ratable_id=")
972
+ end
973
+ end
974
+ end
975
+
976
+ describe "#inverse_type" do
977
+
978
+ context "when the relation is not polymorphic" do
979
+
980
+ let(:metadata) do
981
+ described_class.new(
982
+ name: :person,
983
+ relation: Mongoid::Relations::Referenced::In,
984
+ foreign_key: "person_id"
985
+ )
986
+ end
987
+
988
+ it "returns nil" do
989
+ expect(metadata.inverse_type).to be_nil
990
+ end
991
+ end
992
+
993
+ context "when the relation is polymorphic" do
994
+
995
+ let(:metadata) do
996
+ described_class.new(
997
+ name: :ratable,
998
+ relation: Mongoid::Relations::Referenced::In,
999
+ polymorphic: true,
1000
+ inverse_class_name: "Rating"
1001
+ )
1002
+ end
1003
+
1004
+ it "returns the polymorphic name plus type" do
1005
+ expect(metadata.inverse_type).to eq("ratable_type")
1006
+ end
1007
+ end
1008
+ end
1009
+
1010
+ describe "#inverse_type_setter" do
1011
+
1012
+ context "when the relation is not polymorphic" do
1013
+
1014
+ let(:metadata) do
1015
+ described_class.new(
1016
+ name: :person,
1017
+ relation: Mongoid::Relations::Referenced::In,
1018
+ foreign_key: "person_id"
1019
+ )
1020
+ end
1021
+
1022
+ it "returns nil" do
1023
+ expect(metadata.inverse_type_setter).to be_nil
1024
+ end
1025
+ end
1026
+
1027
+ context "when the relation is polymorphic" do
1028
+
1029
+ let(:metadata) do
1030
+ described_class.new(
1031
+ name: :ratable,
1032
+ relation: Mongoid::Relations::Referenced::In,
1033
+ polymorphic: true,
1034
+ inverse_class_name: "Rating"
1035
+ )
1036
+ end
1037
+
1038
+ it "returns the inverse type plus =" do
1039
+ expect(metadata.inverse_type_setter).to eq("ratable_type=")
1040
+ end
1041
+ end
1042
+ end
1043
+
1044
+ describe "#inverses" do
1045
+
1046
+ context "when the relation is polymorphic" do
1047
+
1048
+ context "when an inverse_of is defined" do
1049
+
1050
+ let(:metadata) do
1051
+ described_class.new(
1052
+ name: :ratable,
1053
+ relation: Mongoid::Relations::Referenced::In,
1054
+ polymorphic: true,
1055
+ inverse_of: "my_ratings"
1056
+ )
1057
+ end
1058
+
1059
+ it "returns only the inverse_of" do
1060
+ expect(metadata.inverses(nil)).to eq([ "my_ratings" ])
1061
+ end
1062
+ end
1063
+ end
1064
+ end
1065
+
1066
+ describe "#indexed?" do
1067
+
1068
+ context "when an index property exists" do
1069
+
1070
+ let(:metadata) do
1071
+ described_class.new(
1072
+ index: true,
1073
+ relation: Mongoid::Relations::Referenced::In
1074
+ )
1075
+ end
1076
+
1077
+ it "returns true" do
1078
+ expect(metadata.indexed?).to be_true
1079
+ end
1080
+ end
1081
+
1082
+ context "when the index option is nil" do
1083
+
1084
+ let(:metadata) do
1085
+ described_class.new(
1086
+ relation: Mongoid::Relations::Referenced::In
1087
+ )
1088
+ end
1089
+
1090
+ it "returns false" do
1091
+ expect(metadata.indexed?).to be_false
1092
+ end
1093
+ end
1094
+
1095
+ context "when the index option is false" do
1096
+
1097
+ let(:metadata) do
1098
+ described_class.new(
1099
+ index: false,
1100
+ relation: Mongoid::Relations::Referenced::In
1101
+ )
1102
+ end
1103
+
1104
+ it "returns false" do
1105
+ expect(metadata.indexed?).to be_false
1106
+ end
1107
+ end
1108
+ end
1109
+
1110
+ describe "#inverse" do
1111
+
1112
+ context "when an inverse relation exists" do
1113
+
1114
+ context "when the inverse has a foreign key match" do
1115
+
1116
+ let(:metadata) do
1117
+ User.reflect_on_association(:account)
1118
+ end
1119
+
1120
+ it "returns the name of the inverse with the matching foreign_key" do
1121
+ expect(metadata.inverse).to eq(:creator)
1122
+ end
1123
+ end
1124
+
1125
+ context "when multiple relations against the same class exist" do
1126
+
1127
+ context "when not polymorphic" do
1128
+
1129
+ let(:metadata) do
1130
+ described_class.new(
1131
+ inverse_class_name: "User",
1132
+ name: :shop,
1133
+ relation: Mongoid::Relations::Referenced::One
1134
+ )
1135
+ end
1136
+
1137
+ it "returns the name of the inverse with the matching inverse of" do
1138
+ expect(metadata.inverse).to eq(:user)
1139
+ end
1140
+ end
1141
+
1142
+ context "when polymorphic" do
1143
+
1144
+ let(:metadata) do
1145
+ described_class.new(
1146
+ name: :left_eye,
1147
+ as: :eyeable,
1148
+ inverse_class_name: "Face",
1149
+ class_name: "Eye",
1150
+ relation: Mongoid::Relations::Referenced::One
1151
+ )
1152
+ end
1153
+
1154
+ it "returns the name of the relation" do
1155
+ expect(metadata.inverse).to eq(:eyeable)
1156
+ end
1157
+ end
1158
+
1159
+ context "when polymorphic on the child" do
1160
+
1161
+ let(:metadata) do
1162
+ described_class.new(
1163
+ name: :eyeable,
1164
+ polymorphic: true,
1165
+ inverse_class_name: "Eye",
1166
+ relation: Mongoid::Relations::Referenced::In
1167
+ )
1168
+ end
1169
+
1170
+ it "returns nil" do
1171
+ expect(metadata.inverse(Face.new)).to be_nil
1172
+ end
1173
+ end
1174
+ end
1175
+
1176
+ context "when inverse_of is defined" do
1177
+
1178
+ context "when inverse_of is nil" do
1179
+
1180
+ let(:metadata) do
1181
+ described_class.new(
1182
+ inverse_of: nil,
1183
+ relation: Mongoid::Relations::Referenced::In
1184
+ )
1185
+ end
1186
+
1187
+ it "returns nil" do
1188
+ expect(metadata.inverse).to be_nil
1189
+ end
1190
+ end
1191
+
1192
+ context "when inverse_of is a symbol" do
1193
+
1194
+ let(:metadata) do
1195
+ described_class.new(
1196
+ inverse_of: :crazy_name,
1197
+ relation: Mongoid::Relations::Referenced::In
1198
+ )
1199
+ end
1200
+
1201
+ it "returns the name of the inverse_of property" do
1202
+ expect(metadata.inverse).to eq(:crazy_name)
1203
+ end
1204
+ end
1205
+ end
1206
+
1207
+ context "when not polymorphic" do
1208
+
1209
+ let(:metadata) do
1210
+ described_class.new(
1211
+ name: :pet,
1212
+ class_name: "Animal",
1213
+ inverse_class_name: "Person",
1214
+ relation: Mongoid::Relations::Referenced::In
1215
+ )
1216
+ end
1217
+
1218
+ it "returns the name of the relation" do
1219
+ expect(metadata.inverse).to eq(:person)
1220
+ end
1221
+ end
1222
+
1223
+ context "when polymorphic" do
1224
+
1225
+ let(:metadata) do
1226
+ described_class.new(
1227
+ name: :addresses,
1228
+ as: :addressable,
1229
+ inverse_class_name: "Person",
1230
+ relation: Mongoid::Relations::Referenced::Many
1231
+ )
1232
+ end
1233
+
1234
+ it "returns the name of the relation" do
1235
+ expect(metadata.inverse).to eq(:addressable)
1236
+ end
1237
+ end
1238
+
1239
+ context "when polymorphic on the child" do
1240
+
1241
+ let(:metadata) do
1242
+ described_class.new(
1243
+ name: :addressable,
1244
+ polymorphic: true,
1245
+ inverse_class_name: "Address",
1246
+ relation: Mongoid::Relations::Referenced::In
1247
+ )
1248
+ end
1249
+
1250
+ it "returns the name of the relation" do
1251
+ expect(metadata.inverse(Person.new)).to eq(:addresses)
1252
+ end
1253
+ end
1254
+
1255
+ context "when in a cyclic relation" do
1256
+
1257
+ context "when the base name is included in the plural form" do
1258
+
1259
+ let(:metadata) do
1260
+ described_class.new(
1261
+ name: :parent_role,
1262
+ class_name: "Role",
1263
+ inverse_class_name: "Role",
1264
+ relation: Mongoid::Relations::Embedded::In,
1265
+ cyclic: true
1266
+ )
1267
+ end
1268
+
1269
+ it "returns the name of the relation" do
1270
+ expect(metadata.inverse(Role.new)).to eq(:child_roles)
1271
+ end
1272
+ end
1273
+
1274
+ context "when the base name is not included in the plural form" do
1275
+
1276
+ let(:metadata) do
1277
+ described_class.new(
1278
+ name: :parent_entry,
1279
+ class_name: "Entry",
1280
+ inverse_class_name: "Entry",
1281
+ relation: Mongoid::Relations::Embedded::In,
1282
+ cyclic: true
1283
+ )
1284
+ end
1285
+
1286
+ it "returns the name of the relation" do
1287
+ expect(metadata.inverse(Entry.new)).to eq(:child_entries)
1288
+ end
1289
+ end
1290
+ end
1291
+ end
1292
+ end
1293
+
1294
+ context "#inverse_foreign_key" do
1295
+
1296
+ context "when the inverse foreign key is not defined" do
1297
+
1298
+ let(:metadata) do
1299
+ described_class.new(
1300
+ name: :preferences,
1301
+ index: true,
1302
+ dependent: :nullify,
1303
+ relation: Mongoid::Relations::Referenced::ManyToMany,
1304
+ inverse_class_name: "Person"
1305
+ )
1306
+ end
1307
+
1308
+ it "returns the inverse class name plus suffix" do
1309
+ expect(metadata.inverse_foreign_key).to eq("person_ids")
1310
+ end
1311
+ end
1312
+
1313
+ context "when the inverse_of is nil" do
1314
+
1315
+ let(:metadata) do
1316
+ described_class.new(
1317
+ name: :blogs,
1318
+ class_name: "Blog",
1319
+ relation: Mongoid::Relations::Referenced::ManyToMany,
1320
+ inverse_of: nil
1321
+ )
1322
+ end
1323
+
1324
+ it "returns nil" do
1325
+ expect(metadata.inverse_foreign_key).to be_nil
1326
+ end
1327
+ end
1328
+ end
1329
+
1330
+ context "#inverse_klass" do
1331
+
1332
+ let(:metadata) do
1333
+ described_class.new(
1334
+ inverse_class_name: "Person",
1335
+ relation: Mongoid::Relations::Referenced::In
1336
+ )
1337
+ end
1338
+
1339
+ it "constantizes the inverse_class_name" do
1340
+ expect(metadata.inverse_klass).to eq(Person)
1341
+ end
1342
+ end
1343
+
1344
+ context "#inverse_setter" do
1345
+
1346
+ context "when the relation is not polymorphic" do
1347
+
1348
+ let(:metadata) do
1349
+ described_class.new(
1350
+ name: :pet,
1351
+ class_name: "Animal",
1352
+ inverse_class_name: "Person",
1353
+ relation: Mongoid::Relations::Referenced::In
1354
+ )
1355
+ end
1356
+
1357
+ it "returns a string for the setter" do
1358
+ expect(metadata.inverse_setter).to eq("person=")
1359
+ end
1360
+ end
1361
+
1362
+ context "when the relation is polymorphic" do
1363
+
1364
+ context "when multiple relations against the same class exist" do
1365
+
1366
+ context "when a referenced in" do
1367
+
1368
+ let(:metadata) do
1369
+ described_class.new(
1370
+ name: :eyeable,
1371
+ polymorphic: true,
1372
+ relation: Mongoid::Relations::Referenced::In
1373
+ )
1374
+ end
1375
+
1376
+ let(:other) do
1377
+ Face.new
1378
+ end
1379
+
1380
+ it "returns nil" do
1381
+ expect(metadata.inverse_setter(other)).to be_nil
1382
+ end
1383
+ end
1384
+
1385
+ context "when a references many" do
1386
+
1387
+ let(:metadata) do
1388
+ described_class.new(
1389
+ name: :blue_eyes,
1390
+ inverse_class_name: "EyeBowl",
1391
+ as: :eyeable,
1392
+ relation: Mongoid::Relations::Referenced::Many
1393
+ )
1394
+ end
1395
+
1396
+ it "returns a string for the setter" do
1397
+ expect(metadata.inverse_setter).to eq("eyeable=")
1398
+ end
1399
+ end
1400
+ end
1401
+
1402
+ context "when a referenced in" do
1403
+
1404
+ let(:metadata) do
1405
+ described_class.new(
1406
+ name: :ratable,
1407
+ inverse_class_name: "Rating",
1408
+ polymorphic: true,
1409
+ relation: Mongoid::Relations::Referenced::In
1410
+ )
1411
+ end
1412
+
1413
+ let(:other) do
1414
+ Movie.new
1415
+ end
1416
+
1417
+ it "returns a string for the setter" do
1418
+ expect(metadata.inverse_setter(other)).to eq("ratings=")
1419
+ end
1420
+ end
1421
+
1422
+ context "when a references many" do
1423
+
1424
+ let(:metadata) do
1425
+ described_class.new(
1426
+ name: :ratings,
1427
+ inverse_class_name: "Rating",
1428
+ as: :ratable,
1429
+ relation: Mongoid::Relations::Referenced::Many
1430
+ )
1431
+ end
1432
+
1433
+ it "returns a string for the setter" do
1434
+ expect(metadata.inverse_setter).to eq("ratable=")
1435
+ end
1436
+ end
1437
+ end
1438
+ end
1439
+
1440
+ context "#key" do
1441
+
1442
+ context "when relation is embedded" do
1443
+
1444
+ let(:metadata) do
1445
+ described_class.new(
1446
+ name: :addresses,
1447
+ relation: Mongoid::Relations::Embedded::Many
1448
+ )
1449
+ end
1450
+
1451
+ it "returns the name as a string" do
1452
+ expect(metadata.key).to eq("addresses")
1453
+ end
1454
+
1455
+ context "with a store_as option defined" do
1456
+
1457
+ let(:metadata) do
1458
+ described_class.new(
1459
+ name: :comment,
1460
+ relation: Mongoid::Relations::Embedded::Many,
1461
+ store_as: "user_comments"
1462
+ )
1463
+ end
1464
+
1465
+ it "return the name define by store_as option" do
1466
+ expect(metadata.key).to eq("user_comments")
1467
+ end
1468
+ end
1469
+ end
1470
+
1471
+ context "when relation is referenced" do
1472
+
1473
+ context "when relation stores foreign_key" do
1474
+
1475
+ context "when the relation is not polymorphic" do
1476
+
1477
+ let(:metadata) do
1478
+ described_class.new(
1479
+ name: :posts,
1480
+ relation: Mongoid::Relations::Referenced::ManyToMany
1481
+ )
1482
+ end
1483
+
1484
+ it "returns the foreign_key" do
1485
+ expect(metadata.key).to eq("post_ids")
1486
+ end
1487
+ end
1488
+
1489
+ context "when the relation is polymorphic" do
1490
+
1491
+ let(:metadata) do
1492
+ described_class.new(
1493
+ name: :ratable,
1494
+ relation: Mongoid::Relations::Referenced::In,
1495
+ polymorphic: true
1496
+ )
1497
+ end
1498
+
1499
+ it "returns the polymorphic foreign_key" do
1500
+ expect(metadata.key).to eq("ratable_id")
1501
+ end
1502
+ end
1503
+ end
1504
+
1505
+ context "when relation does not store a foreign_key" do
1506
+
1507
+ let(:metadata) do
1508
+ described_class.new(
1509
+ name: :addresses,
1510
+ relation: Mongoid::Relations::Referenced::Many,
1511
+ inverse_class_name: "Person"
1512
+ )
1513
+ end
1514
+
1515
+ it "returns _id" do
1516
+ expect(metadata.key).to eq("_id")
1517
+ end
1518
+ end
1519
+ end
1520
+ end
1521
+
1522
+ describe "#options" do
1523
+
1524
+ let(:metadata) do
1525
+ described_class.new(
1526
+ order: :rating.asc,
1527
+ relation: Mongoid::Relations::Referenced::Many
1528
+ )
1529
+ end
1530
+
1531
+ it "returns self" do
1532
+ expect(metadata.options).to eq(metadata)
1533
+ end
1534
+ end
1535
+
1536
+ describe "#order" do
1537
+
1538
+ let(:metadata) do
1539
+ described_class.new(
1540
+ order: :rating.asc,
1541
+ relation: Mongoid::Relations::Referenced::Many
1542
+ )
1543
+ end
1544
+
1545
+ it "returns order criteria" do
1546
+ expect(metadata.order).to eq(:rating.asc)
1547
+ end
1548
+ end
1549
+
1550
+ describe "#klass" do
1551
+
1552
+ context "when the class name is not namespaced" do
1553
+
1554
+ let(:metadata) do
1555
+ described_class.new(
1556
+ class_name: "Address",
1557
+ relation: Mongoid::Relations::Embedded::Many
1558
+ )
1559
+ end
1560
+
1561
+ it "constantizes the class_name" do
1562
+ expect(metadata.klass).to eq(Address)
1563
+ end
1564
+ end
1565
+
1566
+ context "when the class name is prepended with ::" do
1567
+
1568
+ let(:metadata) do
1569
+ described_class.new(
1570
+ class_name: "::Address",
1571
+ relation: Mongoid::Relations::Embedded::Many
1572
+ )
1573
+ end
1574
+
1575
+ it "returns the class" do
1576
+ expect(metadata.klass).to eq(Address)
1577
+ end
1578
+ end
1579
+ end
1580
+
1581
+ describe "#many?" do
1582
+
1583
+ context "when the relation is a many" do
1584
+
1585
+ let(:metadata) do
1586
+ described_class.new(relation: Mongoid::Relations::Embedded::Many)
1587
+ end
1588
+
1589
+ it "returns true" do
1590
+ expect(metadata).to be_many
1591
+ end
1592
+ end
1593
+
1594
+ context "when the relation is not a many" do
1595
+
1596
+ let(:metadata) do
1597
+ described_class.new(relation: Mongoid::Relations::Embedded::One)
1598
+ end
1599
+
1600
+ it "returns false" do
1601
+ expect(metadata).to_not be_many
1602
+ end
1603
+ end
1604
+ end
1605
+
1606
+ describe "#macro" do
1607
+
1608
+ let(:metadata) do
1609
+ described_class.new(relation: Mongoid::Relations::Embedded::One)
1610
+ end
1611
+
1612
+ it "returns the macro from the relation" do
1613
+ expect(metadata.macro).to eq(:embeds_one)
1614
+ end
1615
+ end
1616
+
1617
+ describe "#nested_builder" do
1618
+
1619
+ let(:metadata) do
1620
+ described_class.new(relation: Mongoid::Relations::Embedded::One)
1621
+ end
1622
+
1623
+ let(:attributes) do
1624
+ {}
1625
+ end
1626
+
1627
+ let(:options) do
1628
+ {}
1629
+ end
1630
+
1631
+ it "returns the nested builder from the relation" do
1632
+ expect(
1633
+ metadata.nested_builder(attributes, options)
1634
+ ).to be_a_kind_of(Mongoid::Relations::Builders::NestedAttributes::One)
1635
+ end
1636
+ end
1637
+
1638
+ describe "#primary_key" do
1639
+
1640
+ context "when no primary key exists" do
1641
+
1642
+ let(:metadata) do
1643
+ described_class.new(
1644
+ name: :person,
1645
+ inverse_class_name: "Person",
1646
+ relation: Mongoid::Relations::Referenced::In
1647
+ )
1648
+ end
1649
+
1650
+ it "returns _id" do
1651
+ expect(metadata.primary_key).to eq("_id")
1652
+ end
1653
+ end
1654
+
1655
+ context "when a primary key exists" do
1656
+
1657
+ let(:metadata) do
1658
+ described_class.new(
1659
+ name: :person,
1660
+ inverse_class_name: "Person",
1661
+ relation: Mongoid::Relations::Referenced::In,
1662
+ primary_key: :something_id
1663
+ )
1664
+ end
1665
+
1666
+ it "returns the primary key" do
1667
+ expect(metadata.primary_key).to eq("something_id")
1668
+ end
1669
+ end
1670
+ end
1671
+
1672
+ describe "#validate?" do
1673
+
1674
+ context "when validate is provided" do
1675
+
1676
+ context "when validate is true" do
1677
+
1678
+ let(:metadata) do
1679
+ described_class.new(
1680
+ name: :posts,
1681
+ inverse_class_name: "Post",
1682
+ relation: Mongoid::Relations::Referenced::Many,
1683
+ validate: true
1684
+ )
1685
+ end
1686
+
1687
+ it "returns true" do
1688
+ expect(metadata.validate?).to be_true
1689
+ end
1690
+ end
1691
+
1692
+ context "when validate is false" do
1693
+
1694
+ let(:metadata) do
1695
+ described_class.new(
1696
+ name: :posts,
1697
+ inverse_class_name: "Post",
1698
+ relation: Mongoid::Relations::Referenced::Many,
1699
+ validate: false
1700
+ )
1701
+ end
1702
+
1703
+ it "returns false" do
1704
+ expect(metadata.validate?).to be_false
1705
+ end
1706
+ end
1707
+ end
1708
+
1709
+ context "when validate is not provided" do
1710
+
1711
+ let(:metadata) do
1712
+ described_class.new(
1713
+ name: :posts,
1714
+ inverse_class_name: "Post",
1715
+ relation: Mongoid::Relations::Referenced::Many
1716
+ )
1717
+ end
1718
+
1719
+ it "returns the relation default" do
1720
+ expect(metadata.validate?).to be_true
1721
+ end
1722
+ end
1723
+ end
1724
+
1725
+ describe "#store_as" do
1726
+
1727
+ context "when store_as is define" do
1728
+
1729
+ let(:metadata) do
1730
+ described_class.new(
1731
+ name: :comment,
1732
+ relation: Mongoid::Relations::Embedded::Many,
1733
+ store_as: 'user_comments'
1734
+ )
1735
+ end
1736
+
1737
+ it "returns the value" do
1738
+ expect(metadata.store_as).to eq("user_comments")
1739
+ end
1740
+ end
1741
+
1742
+ context "when is not define" do
1743
+
1744
+ let(:metadata) do
1745
+ described_class.new(
1746
+ name: :comments,
1747
+ relation: Mongoid::Relations::Embedded::Many,
1748
+ )
1749
+ end
1750
+
1751
+ it "returns false" do
1752
+ expect(metadata.store_as).to eq("comments")
1753
+ end
1754
+ end
1755
+ end
1756
+
1757
+ describe "#determine_inverse_relation" do
1758
+
1759
+ let(:class_name) do
1760
+ "Person"
1761
+ end
1762
+
1763
+ let(:metadata) do
1764
+ described_class.new(
1765
+ relation: Mongoid::Relations::Referenced::In,
1766
+ inverse_class_name: "Drug",
1767
+ class_name: class_name,
1768
+ name: :person
1769
+ )
1770
+ end
1771
+
1772
+ let(:inverse_relation) do
1773
+ metadata.send(:determine_inverse_relation)
1774
+ end
1775
+
1776
+ context "when no match" do
1777
+
1778
+ let(:class_name) do
1779
+ "Slave"
1780
+ end
1781
+
1782
+ it "returns nil" do
1783
+ expect(inverse_relation).to be_nil
1784
+ end
1785
+ end
1786
+
1787
+ context "when one match" do
1788
+
1789
+ it "returns correct relation" do
1790
+ expect(inverse_relation).to eq(:drugs)
1791
+ end
1792
+ end
1793
+
1794
+ context "when multiple matches" do
1795
+
1796
+ before do
1797
+ class_name.constantize.has_many(:evil_drugs, class_name: "Drug")
1798
+ end
1799
+
1800
+ after do
1801
+ class_name.constantize.relations.delete("evil_drugs")
1802
+ Person.reset_callbacks(:validate)
1803
+ end
1804
+
1805
+ it "raises AmbiguousRelationship" do
1806
+ expect {
1807
+ inverse_relation
1808
+ }.to raise_error(Mongoid::Errors::AmbiguousRelationship)
1809
+ end
1810
+ end
1811
+ end
1812
+
1813
+ describe "touchable?" do
1814
+
1815
+ context "when touch is false" do
1816
+
1817
+ let(:metadata) do
1818
+ described_class.new(
1819
+ name: :versions,
1820
+ relation: Mongoid::Relations::Referenced::In,
1821
+ touch: false
1822
+ )
1823
+ end
1824
+
1825
+ it "returns false" do
1826
+ expect(metadata).to_not be_touchable
1827
+ end
1828
+ end
1829
+
1830
+ context "when touch is true" do
1831
+
1832
+ let(:metadata) do
1833
+ described_class.new(
1834
+ name: :versions,
1835
+ relation: Mongoid::Relations::Referenced::In,
1836
+ touch: true
1837
+ )
1838
+ end
1839
+
1840
+ it "returns true" do
1841
+ expect(metadata).to be_touchable
1842
+ end
1843
+ end
1844
+
1845
+ context "when touch is nil" do
1846
+
1847
+ let(:metadata) do
1848
+ described_class.new(
1849
+ name: :versions,
1850
+ relation: Mongoid::Relations::Referenced::In,
1851
+ )
1852
+ end
1853
+
1854
+ it "returns false" do
1855
+ expect(metadata).to_not be_touchable
1856
+ end
1857
+ end
1858
+ end
1859
+
1860
+ context "properties" do
1861
+
1862
+ PROPERTIES = [
1863
+ "as",
1864
+ "cyclic",
1865
+ "name",
1866
+ "order"
1867
+ ]
1868
+
1869
+ PROPERTIES.each do |property|
1870
+
1871
+ describe "##{property}" do
1872
+
1873
+ let(:metadata) do
1874
+ described_class.new(
1875
+ property.to_sym => :value,
1876
+ relation: Mongoid::Relations::Embedded::Many
1877
+ )
1878
+ end
1879
+
1880
+ it "returns the #{property} property" do
1881
+ expect(metadata.send(property)).to eq(:value)
1882
+ end
1883
+ end
1884
+
1885
+ describe "##{property}?" do
1886
+
1887
+ context "when a #{property} property exists" do
1888
+
1889
+ let(:metadata) do
1890
+ described_class.new(
1891
+ property.to_sym => :value,
1892
+ relation: Mongoid::Relations::Embedded::Many
1893
+ )
1894
+ end
1895
+
1896
+ it "returns true" do
1897
+ expect(metadata.send("#{property}?")).to be_true
1898
+ end
1899
+ end
1900
+
1901
+ context "when the #{property} property is nil" do
1902
+
1903
+ let(:metadata) do
1904
+ described_class.new(
1905
+ relation: Mongoid::Relations::Embedded::Many
1906
+ )
1907
+ end
1908
+
1909
+ it "returns false" do
1910
+ expect(metadata.send("#{property}?")).to be_false
1911
+ end
1912
+ end
1913
+ end
1914
+ end
1915
+ end
1916
+
1917
+ end