mongoid_heroku_stable 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 (660) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3235 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +452 -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 +305 -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 +145 -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 +41 -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/invalid_value.rb +16 -0
  70. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  71. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  72. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  73. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  74. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  75. data/lib/mongoid/errors/no_default_session.rb +23 -0
  76. data/lib/mongoid/errors/no_environment.rb +19 -0
  77. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  78. data/lib/mongoid/errors/no_metadata.rb +21 -0
  79. data/lib/mongoid/errors/no_parent.rb +24 -0
  80. data/lib/mongoid/errors/no_session_config.rb +22 -0
  81. data/lib/mongoid/errors/no_session_database.rb +27 -0
  82. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  83. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  84. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  85. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  86. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  87. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  88. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  89. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  90. data/lib/mongoid/errors/validations.rb +29 -0
  91. data/lib/mongoid/evolvable.rb +19 -0
  92. data/lib/mongoid/extensions.rb +35 -0
  93. data/lib/mongoid/extensions/array.rb +180 -0
  94. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  95. data/lib/mongoid/extensions/boolean.rb +21 -0
  96. data/lib/mongoid/extensions/date.rb +77 -0
  97. data/lib/mongoid/extensions/date_time.rb +73 -0
  98. data/lib/mongoid/extensions/false_class.rb +38 -0
  99. data/lib/mongoid/extensions/float.rb +56 -0
  100. data/lib/mongoid/extensions/hash.rb +209 -0
  101. data/lib/mongoid/extensions/integer.rb +67 -0
  102. data/lib/mongoid/extensions/module.rb +28 -0
  103. data/lib/mongoid/extensions/nil_class.rb +33 -0
  104. data/lib/mongoid/extensions/object.rb +274 -0
  105. data/lib/mongoid/extensions/object_id.rb +54 -0
  106. data/lib/mongoid/extensions/range.rb +85 -0
  107. data/lib/mongoid/extensions/regexp.rb +27 -0
  108. data/lib/mongoid/extensions/set.rb +55 -0
  109. data/lib/mongoid/extensions/string.rb +199 -0
  110. data/lib/mongoid/extensions/symbol.rb +54 -0
  111. data/lib/mongoid/extensions/time.rb +88 -0
  112. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  113. data/lib/mongoid/extensions/true_class.rb +38 -0
  114. data/lib/mongoid/factory.rb +46 -0
  115. data/lib/mongoid/fields.rb +542 -0
  116. data/lib/mongoid/fields/foreign_key.rb +174 -0
  117. data/lib/mongoid/fields/localized.rb +73 -0
  118. data/lib/mongoid/fields/standard.rb +273 -0
  119. data/lib/mongoid/fields/validators.rb +2 -0
  120. data/lib/mongoid/fields/validators/macro.rb +92 -0
  121. data/lib/mongoid/findable.rb +133 -0
  122. data/lib/mongoid/identity_map.rb +163 -0
  123. data/lib/mongoid/indexable.rb +147 -0
  124. data/lib/mongoid/indexable/specification.rb +115 -0
  125. data/lib/mongoid/indexable/validators/options.rb +103 -0
  126. data/lib/mongoid/inspectable.rb +59 -0
  127. data/lib/mongoid/interceptable.rb +265 -0
  128. data/lib/mongoid/loggable.rb +69 -0
  129. data/lib/mongoid/matchable.rb +152 -0
  130. data/lib/mongoid/matchable/all.rb +27 -0
  131. data/lib/mongoid/matchable/and.rb +30 -0
  132. data/lib/mongoid/matchable/default.rb +72 -0
  133. data/lib/mongoid/matchable/exists.rb +23 -0
  134. data/lib/mongoid/matchable/gt.rb +21 -0
  135. data/lib/mongoid/matchable/gte.rb +21 -0
  136. data/lib/mongoid/matchable/in.rb +24 -0
  137. data/lib/mongoid/matchable/lt.rb +21 -0
  138. data/lib/mongoid/matchable/lte.rb +21 -0
  139. data/lib/mongoid/matchable/ne.rb +21 -0
  140. data/lib/mongoid/matchable/nin.rb +21 -0
  141. data/lib/mongoid/matchable/or.rb +33 -0
  142. data/lib/mongoid/matchable/size.rb +21 -0
  143. data/lib/mongoid/persistable.rb +207 -0
  144. data/lib/mongoid/persistable/creatable.rb +189 -0
  145. data/lib/mongoid/persistable/deletable.rb +149 -0
  146. data/lib/mongoid/persistable/destroyable.rb +55 -0
  147. data/lib/mongoid/persistable/incrementable.rb +36 -0
  148. data/lib/mongoid/persistable/logical.rb +38 -0
  149. data/lib/mongoid/persistable/poppable.rb +39 -0
  150. data/lib/mongoid/persistable/pullable.rb +55 -0
  151. data/lib/mongoid/persistable/pushable.rb +62 -0
  152. data/lib/mongoid/persistable/renamable.rb +35 -0
  153. data/lib/mongoid/persistable/savable.rb +52 -0
  154. data/lib/mongoid/persistable/settable.rb +33 -0
  155. data/lib/mongoid/persistable/unsettable.rb +36 -0
  156. data/lib/mongoid/persistable/updatable.rb +151 -0
  157. data/lib/mongoid/persistable/upsertable.rb +55 -0
  158. data/lib/mongoid/positional.rb +71 -0
  159. data/lib/mongoid/railtie.rb +156 -0
  160. data/lib/mongoid/railties/database.rake +97 -0
  161. data/lib/mongoid/railties/document.rb +12 -0
  162. data/lib/mongoid/relations.rb +162 -0
  163. data/lib/mongoid/relations/accessors.rb +299 -0
  164. data/lib/mongoid/relations/auto_save.rb +106 -0
  165. data/lib/mongoid/relations/binding.rb +218 -0
  166. data/lib/mongoid/relations/bindings.rb +9 -0
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  174. data/lib/mongoid/relations/builder.rb +57 -0
  175. data/lib/mongoid/relations/builders.rb +104 -0
  176. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  177. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  178. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  181. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  182. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  184. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  185. data/lib/mongoid/relations/cascading.rb +56 -0
  186. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  187. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  188. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  189. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  190. data/lib/mongoid/relations/constraint.rb +49 -0
  191. data/lib/mongoid/relations/conversions.rb +34 -0
  192. data/lib/mongoid/relations/counter_cache.rb +105 -0
  193. data/lib/mongoid/relations/cyclic.rb +107 -0
  194. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  195. data/lib/mongoid/relations/embedded/in.rb +231 -0
  196. data/lib/mongoid/relations/embedded/many.rb +639 -0
  197. data/lib/mongoid/relations/embedded/one.rb +223 -0
  198. data/lib/mongoid/relations/macros.rb +356 -0
  199. data/lib/mongoid/relations/many.rb +208 -0
  200. data/lib/mongoid/relations/marshalable.rb +32 -0
  201. data/lib/mongoid/relations/metadata.rb +1172 -0
  202. data/lib/mongoid/relations/nested_builder.rb +74 -0
  203. data/lib/mongoid/relations/one.rb +60 -0
  204. data/lib/mongoid/relations/options.rb +48 -0
  205. data/lib/mongoid/relations/polymorphic.rb +39 -0
  206. data/lib/mongoid/relations/proxy.rb +270 -0
  207. data/lib/mongoid/relations/referenced/in.rb +297 -0
  208. data/lib/mongoid/relations/referenced/many.rb +787 -0
  209. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  210. data/lib/mongoid/relations/referenced/one.rb +290 -0
  211. data/lib/mongoid/relations/reflections.rb +62 -0
  212. data/lib/mongoid/relations/synchronization.rb +169 -0
  213. data/lib/mongoid/relations/targets.rb +2 -0
  214. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  215. data/lib/mongoid/relations/touchable.rb +94 -0
  216. data/lib/mongoid/reloadable.rb +95 -0
  217. data/lib/mongoid/scopable.rb +379 -0
  218. data/lib/mongoid/selectable.rb +59 -0
  219. data/lib/mongoid/serializable.rb +170 -0
  220. data/lib/mongoid/sessions.rb +330 -0
  221. data/lib/mongoid/sessions/factory.rb +129 -0
  222. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  223. data/lib/mongoid/sessions/options.rb +141 -0
  224. data/lib/mongoid/sessions/validators.rb +2 -0
  225. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  226. data/lib/mongoid/shardable.rb +65 -0
  227. data/lib/mongoid/state.rb +97 -0
  228. data/lib/mongoid/threaded.rb +383 -0
  229. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  230. data/lib/mongoid/timestamps.rb +15 -0
  231. data/lib/mongoid/timestamps/created.rb +30 -0
  232. data/lib/mongoid/timestamps/created/short.rb +19 -0
  233. data/lib/mongoid/timestamps/short.rb +10 -0
  234. data/lib/mongoid/timestamps/updated.rb +39 -0
  235. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  236. data/lib/mongoid/traversable.rb +192 -0
  237. data/lib/mongoid/unit_of_work.rb +61 -0
  238. data/lib/mongoid/validatable.rb +180 -0
  239. data/lib/mongoid/validatable/associated.rb +48 -0
  240. data/lib/mongoid/validatable/format.rb +20 -0
  241. data/lib/mongoid/validatable/length.rb +20 -0
  242. data/lib/mongoid/validatable/localizable.rb +30 -0
  243. data/lib/mongoid/validatable/macros.rb +94 -0
  244. data/lib/mongoid/validatable/presence.rb +86 -0
  245. data/lib/mongoid/validatable/queryable.rb +30 -0
  246. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  247. data/lib/mongoid/version.rb +4 -0
  248. data/lib/rack/mongoid.rb +2 -0
  249. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  250. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  251. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  252. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  253. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  254. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  255. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  256. data/lib/rails/generators/mongoid_generator.rb +65 -0
  257. data/lib/rails/mongoid.rb +180 -0
  258. data/lib/support/ruby_version.rb +26 -0
  259. data/spec/app/models/account.rb +28 -0
  260. data/spec/app/models/acolyte.rb +17 -0
  261. data/spec/app/models/actor.rb +18 -0
  262. data/spec/app/models/actress.rb +2 -0
  263. data/spec/app/models/address.rb +77 -0
  264. data/spec/app/models/address_component.rb +5 -0
  265. data/spec/app/models/address_number.rb +6 -0
  266. data/spec/app/models/agency.rb +5 -0
  267. data/spec/app/models/agent.rb +12 -0
  268. data/spec/app/models/album.rb +14 -0
  269. data/spec/app/models/alert.rb +5 -0
  270. data/spec/app/models/animal.rb +25 -0
  271. data/spec/app/models/answer.rb +4 -0
  272. data/spec/app/models/appointment.rb +7 -0
  273. data/spec/app/models/article.rb +10 -0
  274. data/spec/app/models/artist.rb +66 -0
  275. data/spec/app/models/artwork.rb +4 -0
  276. data/spec/app/models/audio.rb +5 -0
  277. data/spec/app/models/augmentation.rb +11 -0
  278. data/spec/app/models/author.rb +4 -0
  279. data/spec/app/models/band.rb +26 -0
  280. data/spec/app/models/bar.rb +10 -0
  281. data/spec/app/models/basic.rb +6 -0
  282. data/spec/app/models/bed.rb +1 -0
  283. data/spec/app/models/big_palette.rb +2 -0
  284. data/spec/app/models/birthday.rb +13 -0
  285. data/spec/app/models/book.rb +13 -0
  286. data/spec/app/models/breed.rb +4 -0
  287. data/spec/app/models/browser.rb +6 -0
  288. data/spec/app/models/building.rb +5 -0
  289. data/spec/app/models/building_address.rb +5 -0
  290. data/spec/app/models/bus.rb +7 -0
  291. data/spec/app/models/business.rb +5 -0
  292. data/spec/app/models/callback_recorder.rb +25 -0
  293. data/spec/app/models/callback_test.rb +9 -0
  294. data/spec/app/models/canvas.rb +25 -0
  295. data/spec/app/models/car.rb +1 -0
  296. data/spec/app/models/cat.rb +8 -0
  297. data/spec/app/models/category.rb +8 -0
  298. data/spec/app/models/child.rb +4 -0
  299. data/spec/app/models/child_doc.rb +22 -0
  300. data/spec/app/models/church.rb +4 -0
  301. data/spec/app/models/circle.rb +3 -0
  302. data/spec/app/models/circuit.rb +4 -0
  303. data/spec/app/models/circus.rb +7 -0
  304. data/spec/app/models/code.rb +5 -0
  305. data/spec/app/models/comment.rb +16 -0
  306. data/spec/app/models/contractor.rb +5 -0
  307. data/spec/app/models/cookie.rb +6 -0
  308. data/spec/app/models/country_code.rb +8 -0
  309. data/spec/app/models/definition.rb +7 -0
  310. data/spec/app/models/description.rb +11 -0
  311. data/spec/app/models/dictionary.rb +10 -0
  312. data/spec/app/models/division.rb +10 -0
  313. data/spec/app/models/doctor.rb +12 -0
  314. data/spec/app/models/dog.rb +7 -0
  315. data/spec/app/models/dokument.rb +5 -0
  316. data/spec/app/models/dragon.rb +4 -0
  317. data/spec/app/models/driver.rb +7 -0
  318. data/spec/app/models/drug.rb +6 -0
  319. data/spec/app/models/dungeon.rb +4 -0
  320. data/spec/app/models/email.rb +6 -0
  321. data/spec/app/models/employer.rb +5 -0
  322. data/spec/app/models/entry.rb +6 -0
  323. data/spec/app/models/eraser.rb +1 -0
  324. data/spec/app/models/event.rb +22 -0
  325. data/spec/app/models/exhibition.rb +4 -0
  326. data/spec/app/models/exhibitor.rb +5 -0
  327. data/spec/app/models/eye.rb +9 -0
  328. data/spec/app/models/eye_bowl.rb +9 -0
  329. data/spec/app/models/face.rb +8 -0
  330. data/spec/app/models/favorite.rb +6 -0
  331. data/spec/app/models/filesystem.rb +5 -0
  332. data/spec/app/models/fire_hydrant.rb +6 -0
  333. data/spec/app/models/firefox.rb +4 -0
  334. data/spec/app/models/fish.rb +7 -0
  335. data/spec/app/models/folder.rb +7 -0
  336. data/spec/app/models/folder_item.rb +9 -0
  337. data/spec/app/models/fruits.rb +34 -0
  338. data/spec/app/models/game.rb +19 -0
  339. data/spec/app/models/ghost.rb +7 -0
  340. data/spec/app/models/home.rb +4 -0
  341. data/spec/app/models/house.rb +6 -0
  342. data/spec/app/models/html_writer.rb +3 -0
  343. data/spec/app/models/image.rb +22 -0
  344. data/spec/app/models/implant.rb +16 -0
  345. data/spec/app/models/item.rb +8 -0
  346. data/spec/app/models/jar.rb +7 -0
  347. data/spec/app/models/label.rb +40 -0
  348. data/spec/app/models/language.rb +5 -0
  349. data/spec/app/models/lat_lng.rb +15 -0
  350. data/spec/app/models/league.rb +11 -0
  351. data/spec/app/models/learner.rb +2 -0
  352. data/spec/app/models/line_item.rb +6 -0
  353. data/spec/app/models/location.rb +8 -0
  354. data/spec/app/models/login.rb +8 -0
  355. data/spec/app/models/manufacturer.rb +7 -0
  356. data/spec/app/models/meat.rb +4 -0
  357. data/spec/app/models/membership.rb +4 -0
  358. data/spec/app/models/mixed_drink.rb +4 -0
  359. data/spec/app/models/movie.rb +13 -0
  360. data/spec/app/models/my_hash.rb +2 -0
  361. data/spec/app/models/name.rb +23 -0
  362. data/spec/app/models/node.rb +5 -0
  363. data/spec/app/models/note.rb +12 -0
  364. data/spec/app/models/ordered_post.rb +6 -0
  365. data/spec/app/models/ordered_preference.rb +6 -0
  366. data/spec/app/models/oscar.rb +15 -0
  367. data/spec/app/models/override.rb +16 -0
  368. data/spec/app/models/ownable.rb +6 -0
  369. data/spec/app/models/owner.rb +6 -0
  370. data/spec/app/models/pack.rb +3 -0
  371. data/spec/app/models/page.rb +5 -0
  372. data/spec/app/models/page_question.rb +4 -0
  373. data/spec/app/models/palette.rb +7 -0
  374. data/spec/app/models/parent.rb +5 -0
  375. data/spec/app/models/parent_doc.rb +6 -0
  376. data/spec/app/models/passport.rb +5 -0
  377. data/spec/app/models/patient.rb +9 -0
  378. data/spec/app/models/pdf_writer.rb +3 -0
  379. data/spec/app/models/pencil.rb +1 -0
  380. data/spec/app/models/person.rb +206 -0
  381. data/spec/app/models/pet.rb +23 -0
  382. data/spec/app/models/pet_owner.rb +6 -0
  383. data/spec/app/models/phone.rb +11 -0
  384. data/spec/app/models/pizza.rb +7 -0
  385. data/spec/app/models/player.rb +35 -0
  386. data/spec/app/models/post.rb +44 -0
  387. data/spec/app/models/powerup.rb +11 -0
  388. data/spec/app/models/preference.rb +9 -0
  389. data/spec/app/models/princess.rb +8 -0
  390. data/spec/app/models/product.rb +15 -0
  391. data/spec/app/models/profile.rb +5 -0
  392. data/spec/app/models/pronunciation.rb +5 -0
  393. data/spec/app/models/purchase.rb +4 -0
  394. data/spec/app/models/question.rb +8 -0
  395. data/spec/app/models/quiz.rb +7 -0
  396. data/spec/app/models/rating.rb +8 -0
  397. data/spec/app/models/record.rb +46 -0
  398. data/spec/app/models/registry.rb +4 -0
  399. data/spec/app/models/role.rb +7 -0
  400. data/spec/app/models/root_category.rb +4 -0
  401. data/spec/app/models/sandwich.rb +4 -0
  402. data/spec/app/models/scheduler.rb +7 -0
  403. data/spec/app/models/seo.rb +7 -0
  404. data/spec/app/models/series.rb +4 -0
  405. data/spec/app/models/server.rb +13 -0
  406. data/spec/app/models/service.rb +22 -0
  407. data/spec/app/models/shape.rb +12 -0
  408. data/spec/app/models/shelf.rb +5 -0
  409. data/spec/app/models/shipping_container.rb +5 -0
  410. data/spec/app/models/shipping_pack.rb +3 -0
  411. data/spec/app/models/shop.rb +6 -0
  412. data/spec/app/models/short_agent.rb +4 -0
  413. data/spec/app/models/short_quiz.rb +5 -0
  414. data/spec/app/models/slave.rb +6 -0
  415. data/spec/app/models/song.rb +8 -0
  416. data/spec/app/models/sound.rb +5 -0
  417. data/spec/app/models/square.rb +4 -0
  418. data/spec/app/models/strategy.rb +3 -0
  419. data/spec/app/models/sub_item.rb +3 -0
  420. data/spec/app/models/subscription.rb +4 -0
  421. data/spec/app/models/survey.rb +5 -0
  422. data/spec/app/models/symptom.rb +6 -0
  423. data/spec/app/models/tag.rb +8 -0
  424. data/spec/app/models/target.rb +5 -0
  425. data/spec/app/models/template.rb +5 -0
  426. data/spec/app/models/thing.rb +9 -0
  427. data/spec/app/models/title.rb +3 -0
  428. data/spec/app/models/tool.rb +8 -0
  429. data/spec/app/models/topping.rb +5 -0
  430. data/spec/app/models/track.rb +38 -0
  431. data/spec/app/models/translation.rb +5 -0
  432. data/spec/app/models/tree.rb +9 -0
  433. data/spec/app/models/truck.rb +3 -0
  434. data/spec/app/models/user.rb +21 -0
  435. data/spec/app/models/user_account.rb +10 -0
  436. data/spec/app/models/validation_callback.rb +10 -0
  437. data/spec/app/models/vehicle.rb +11 -0
  438. data/spec/app/models/version.rb +5 -0
  439. data/spec/app/models/vet_visit.rb +5 -0
  440. data/spec/app/models/video.rb +13 -0
  441. data/spec/app/models/weapon.rb +11 -0
  442. data/spec/app/models/wiki_page.rb +14 -0
  443. data/spec/app/models/word.rb +15 -0
  444. data/spec/app/models/word_origin.rb +11 -0
  445. data/spec/app/models/writer.rb +11 -0
  446. data/spec/config/mongoid.yml +38 -0
  447. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  448. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  449. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  450. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  451. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  452. data/spec/mongoid/atomic_spec.rb +365 -0
  453. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  454. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  455. data/spec/mongoid/attributes_spec.rb +1467 -0
  456. data/spec/mongoid/changeable_spec.rb +1507 -0
  457. data/spec/mongoid/composable_spec.rb +24 -0
  458. data/spec/mongoid/config/environment_spec.rb +83 -0
  459. data/spec/mongoid/config/options_spec.rb +56 -0
  460. data/spec/mongoid/config_spec.rb +318 -0
  461. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  462. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +495 -0
  463. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  464. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  465. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  466. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  467. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  468. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  469. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  470. data/spec/mongoid/copyable_spec.rb +393 -0
  471. data/spec/mongoid/criteria/findable_spec.rb +1222 -0
  472. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  473. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  474. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  475. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  476. data/spec/mongoid/criteria_spec.rb +3821 -0
  477. data/spec/mongoid/document_spec.rb +1205 -0
  478. data/spec/mongoid/equality_spec.rb +241 -0
  479. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  480. data/spec/mongoid/errors/callback_spec.rb +29 -0
  481. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  482. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  483. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  484. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  485. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  487. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  488. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  489. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  490. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  492. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  493. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  494. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  495. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  496. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  497. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  499. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  500. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  501. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  504. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  505. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  509. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  510. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  511. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  512. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  513. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  514. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  515. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  516. data/spec/mongoid/errors/validations_spec.rb +45 -0
  517. data/spec/mongoid/extensions/array_spec.rb +638 -0
  518. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  519. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  520. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  521. data/spec/mongoid/extensions/date_spec.rb +235 -0
  522. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  523. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  524. data/spec/mongoid/extensions/float_spec.rb +133 -0
  525. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  526. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  527. data/spec/mongoid/extensions/module_spec.rb +42 -0
  528. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  529. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  530. data/spec/mongoid/extensions/object_spec.rb +292 -0
  531. data/spec/mongoid/extensions/range_spec.rb +154 -0
  532. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  533. data/spec/mongoid/extensions/set_spec.rb +33 -0
  534. data/spec/mongoid/extensions/string_spec.rb +357 -0
  535. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  536. data/spec/mongoid/extensions/time_spec.rb +467 -0
  537. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  538. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  539. data/spec/mongoid/extensions_spec.rb +15 -0
  540. data/spec/mongoid/factory_spec.rb +185 -0
  541. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  543. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  544. data/spec/mongoid/fields/localized_spec.rb +386 -0
  545. data/spec/mongoid/fields/standard_spec.rb +166 -0
  546. data/spec/mongoid/fields_spec.rb +1229 -0
  547. data/spec/mongoid/findable_spec.rb +342 -0
  548. data/spec/mongoid/identity_map_spec.rb +564 -0
  549. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  550. data/spec/mongoid/indexable_spec.rb +504 -0
  551. data/spec/mongoid/inspectable_spec.rb +49 -0
  552. data/spec/mongoid/interceptable_spec.rb +1564 -0
  553. data/spec/mongoid/loggable_spec.rb +21 -0
  554. data/spec/mongoid/matchable/all_spec.rb +31 -0
  555. data/spec/mongoid/matchable/and_spec.rb +162 -0
  556. data/spec/mongoid/matchable/default_spec.rb +130 -0
  557. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  558. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  559. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  560. data/spec/mongoid/matchable/in_spec.rb +25 -0
  561. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  562. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  563. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  564. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  565. data/spec/mongoid/matchable/or_spec.rb +106 -0
  566. data/spec/mongoid/matchable/size_spec.rb +25 -0
  567. data/spec/mongoid/matchable_spec.rb +532 -0
  568. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  569. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  570. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  571. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  572. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  573. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  574. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  575. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  576. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  577. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  578. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  579. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  580. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  581. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  582. data/spec/mongoid/persistable_spec.rb +206 -0
  583. data/spec/mongoid/positional_spec.rb +227 -0
  584. data/spec/mongoid/railties/document_spec.rb +24 -0
  585. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  586. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  587. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  588. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  589. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  590. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  592. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  593. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  594. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  595. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  596. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  598. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  599. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  600. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  601. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  602. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  603. data/spec/mongoid/relations/builders_spec.rb +226 -0
  604. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  605. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  606. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  607. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  608. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  609. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  610. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  611. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  612. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  613. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  614. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  615. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  616. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  617. data/spec/mongoid/relations/macros_spec.rb +631 -0
  618. data/spec/mongoid/relations/metadata_spec.rb +1936 -0
  619. data/spec/mongoid/relations/options_spec.rb +35 -0
  620. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  621. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  622. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  623. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  624. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  625. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  626. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  627. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  628. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  629. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  630. data/spec/mongoid/relations_spec.rb +188 -0
  631. data/spec/mongoid/reloadable_spec.rb +305 -0
  632. data/spec/mongoid/scopable_spec.rb +926 -0
  633. data/spec/mongoid/selectable_spec.rb +134 -0
  634. data/spec/mongoid/serializable_spec.rb +862 -0
  635. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  636. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  637. data/spec/mongoid/sessions/options_spec.rb +71 -0
  638. data/spec/mongoid/sessions_spec.rb +1078 -0
  639. data/spec/mongoid/shardable_spec.rb +61 -0
  640. data/spec/mongoid/state_spec.rb +102 -0
  641. data/spec/mongoid/threaded_spec.rb +258 -0
  642. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  643. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  644. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  645. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  646. data/spec/mongoid/timestamps_spec.rb +112 -0
  647. data/spec/mongoid/traversable_spec.rb +244 -0
  648. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  649. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  650. data/spec/mongoid/validatable/format_spec.rb +83 -0
  651. data/spec/mongoid/validatable/length_spec.rb +119 -0
  652. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  653. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  654. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  655. data/spec/mongoid/validatable_spec.rb +309 -0
  656. data/spec/mongoid_spec.rb +74 -0
  657. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  658. data/spec/rails/mongoid_spec.rb +462 -0
  659. data/spec/spec_helper.rb +103 -0
  660. metadata +1160 -0
@@ -0,0 +1,1936 @@
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
+ context "when name doesnt include namespace" do
863
+
864
+ let(:metadata) do
865
+ described_class.new(
866
+ name: :bananas,
867
+ relation: Mongoid::Relations::Referenced::Many,
868
+ inverse_class_name: "Fruits::Apple",
869
+ class_name: "Fruits::Banana"
870
+ )
871
+ end
872
+
873
+ it "returns the foreign_key without the module name" do
874
+ expect(metadata.foreign_key).to eq("apple_id")
875
+ end
876
+ end
877
+
878
+ context "when name include namespace" do
879
+
880
+ let(:metadata) do
881
+ described_class.new(
882
+ name: :fruits_melons,
883
+ relation: Mongoid::Relations::Referenced::Many,
884
+ inverse_class_name: "Fruits::Apple",
885
+ class_name: "Fruits::Melon"
886
+ )
887
+ end
888
+
889
+ it "returns the foreign_key with the module name" do
890
+ expect(metadata.foreign_key).to eq("fruit_apple_id")
891
+ end
892
+ end
893
+ end
894
+ end
895
+
896
+ context "when embeds one" do
897
+ let(:metadata) do
898
+ described_class.new(
899
+ name: :post,
900
+ relation: Mongoid::Relations::Embedded::One,
901
+ inverse_class_name: "Person"
902
+ )
903
+ end
904
+
905
+ it "returns a nil foreign key" do
906
+ expect(metadata.foreign_key).to be_nil
907
+ end
908
+ end
909
+ end
910
+ end
911
+
912
+ context "when a foreign_key was defined" do
913
+
914
+ let(:metadata) do
915
+ described_class.new(
916
+ name: :person,
917
+ relation: Mongoid::Relations::Referenced::ManyToMany,
918
+ foreign_key: "blog_post_id"
919
+ )
920
+ end
921
+
922
+ it "returns the foreign_key" do
923
+ expect(metadata.foreign_key).to eq("blog_post_id")
924
+ end
925
+ end
926
+ end
927
+
928
+ describe "#foreign_key_default" do
929
+
930
+ context "when the relation stores keys in an array" do
931
+
932
+ let(:metadata) do
933
+ described_class.new(
934
+ name: :preferences,
935
+ relation: Mongoid::Relations::Referenced::ManyToMany,
936
+ foreign_key: "preference_ids"
937
+ )
938
+ end
939
+
940
+ it "returns an empty array" do
941
+ expect(metadata.foreign_key_default).to be_empty
942
+ end
943
+ end
944
+
945
+ context "when the relation stores a single key" do
946
+
947
+ let(:metadata) do
948
+ described_class.new(
949
+ name: :person,
950
+ relation: Mongoid::Relations::Referenced::In,
951
+ foreign_key: "person_id"
952
+ )
953
+ end
954
+
955
+ it "returns an empty array" do
956
+ expect(metadata.foreign_key_default).to be_nil
957
+ end
958
+ end
959
+ end
960
+
961
+ describe "#foreign_key_setter" do
962
+
963
+ context "when the relation is not polymorphic" do
964
+
965
+ let(:metadata) do
966
+ described_class.new(
967
+ name: :person,
968
+ relation: Mongoid::Relations::Referenced::In,
969
+ foreign_key: "person_id"
970
+ )
971
+ end
972
+
973
+ it "returns the foreign_key plus =" do
974
+ expect(metadata.foreign_key_setter).to eq("person_id=")
975
+ end
976
+ end
977
+
978
+ context "when the relation is polymorphic" do
979
+
980
+ let(:metadata) do
981
+ described_class.new(
982
+ name: :ratings,
983
+ relation: Mongoid::Relations::Referenced::Many,
984
+ as: :ratable,
985
+ inverse_class_name: "Movie"
986
+ )
987
+ end
988
+
989
+ it "returns the polymorphic foreign_key plus =" do
990
+ expect(metadata.foreign_key_setter).to eq("ratable_id=")
991
+ end
992
+ end
993
+ end
994
+
995
+ describe "#inverse_type" do
996
+
997
+ context "when the relation is not polymorphic" do
998
+
999
+ let(:metadata) do
1000
+ described_class.new(
1001
+ name: :person,
1002
+ relation: Mongoid::Relations::Referenced::In,
1003
+ foreign_key: "person_id"
1004
+ )
1005
+ end
1006
+
1007
+ it "returns nil" do
1008
+ expect(metadata.inverse_type).to be_nil
1009
+ end
1010
+ end
1011
+
1012
+ context "when the relation is polymorphic" do
1013
+
1014
+ let(:metadata) do
1015
+ described_class.new(
1016
+ name: :ratable,
1017
+ relation: Mongoid::Relations::Referenced::In,
1018
+ polymorphic: true,
1019
+ inverse_class_name: "Rating"
1020
+ )
1021
+ end
1022
+
1023
+ it "returns the polymorphic name plus type" do
1024
+ expect(metadata.inverse_type).to eq("ratable_type")
1025
+ end
1026
+ end
1027
+ end
1028
+
1029
+ describe "#inverse_type_setter" do
1030
+
1031
+ context "when the relation is not polymorphic" do
1032
+
1033
+ let(:metadata) do
1034
+ described_class.new(
1035
+ name: :person,
1036
+ relation: Mongoid::Relations::Referenced::In,
1037
+ foreign_key: "person_id"
1038
+ )
1039
+ end
1040
+
1041
+ it "returns nil" do
1042
+ expect(metadata.inverse_type_setter).to be_nil
1043
+ end
1044
+ end
1045
+
1046
+ context "when the relation is polymorphic" do
1047
+
1048
+ let(:metadata) do
1049
+ described_class.new(
1050
+ name: :ratable,
1051
+ relation: Mongoid::Relations::Referenced::In,
1052
+ polymorphic: true,
1053
+ inverse_class_name: "Rating"
1054
+ )
1055
+ end
1056
+
1057
+ it "returns the inverse type plus =" do
1058
+ expect(metadata.inverse_type_setter).to eq("ratable_type=")
1059
+ end
1060
+ end
1061
+ end
1062
+
1063
+ describe "#inverses" do
1064
+
1065
+ context "when the relation is polymorphic" do
1066
+
1067
+ context "when an inverse_of is defined" do
1068
+
1069
+ let(:metadata) do
1070
+ described_class.new(
1071
+ name: :ratable,
1072
+ relation: Mongoid::Relations::Referenced::In,
1073
+ polymorphic: true,
1074
+ inverse_of: "my_ratings"
1075
+ )
1076
+ end
1077
+
1078
+ it "returns only the inverse_of" do
1079
+ expect(metadata.inverses(nil)).to eq([ "my_ratings" ])
1080
+ end
1081
+ end
1082
+ end
1083
+ end
1084
+
1085
+ describe "#indexed?" do
1086
+
1087
+ context "when an index property exists" do
1088
+
1089
+ let(:metadata) do
1090
+ described_class.new(
1091
+ index: true,
1092
+ relation: Mongoid::Relations::Referenced::In
1093
+ )
1094
+ end
1095
+
1096
+ it "returns true" do
1097
+ expect(metadata.indexed?).to be_true
1098
+ end
1099
+ end
1100
+
1101
+ context "when the index option is nil" do
1102
+
1103
+ let(:metadata) do
1104
+ described_class.new(
1105
+ relation: Mongoid::Relations::Referenced::In
1106
+ )
1107
+ end
1108
+
1109
+ it "returns false" do
1110
+ expect(metadata.indexed?).to be_false
1111
+ end
1112
+ end
1113
+
1114
+ context "when the index option is false" do
1115
+
1116
+ let(:metadata) do
1117
+ described_class.new(
1118
+ index: false,
1119
+ relation: Mongoid::Relations::Referenced::In
1120
+ )
1121
+ end
1122
+
1123
+ it "returns false" do
1124
+ expect(metadata.indexed?).to be_false
1125
+ end
1126
+ end
1127
+ end
1128
+
1129
+ describe "#inverse" do
1130
+
1131
+ context "when an inverse relation exists" do
1132
+
1133
+ context "when the inverse has a foreign key match" do
1134
+
1135
+ let(:metadata) do
1136
+ User.reflect_on_association(:account)
1137
+ end
1138
+
1139
+ it "returns the name of the inverse with the matching foreign_key" do
1140
+ expect(metadata.inverse).to eq(:creator)
1141
+ end
1142
+ end
1143
+
1144
+ context "when multiple relations against the same class exist" do
1145
+
1146
+ context "when not polymorphic" do
1147
+
1148
+ let(:metadata) do
1149
+ described_class.new(
1150
+ inverse_class_name: "User",
1151
+ name: :shop,
1152
+ relation: Mongoid::Relations::Referenced::One
1153
+ )
1154
+ end
1155
+
1156
+ it "returns the name of the inverse with the matching inverse of" do
1157
+ expect(metadata.inverse).to eq(:user)
1158
+ end
1159
+ end
1160
+
1161
+ context "when polymorphic" do
1162
+
1163
+ let(:metadata) do
1164
+ described_class.new(
1165
+ name: :left_eye,
1166
+ as: :eyeable,
1167
+ inverse_class_name: "Face",
1168
+ class_name: "Eye",
1169
+ relation: Mongoid::Relations::Referenced::One
1170
+ )
1171
+ end
1172
+
1173
+ it "returns the name of the relation" do
1174
+ expect(metadata.inverse).to eq(:eyeable)
1175
+ end
1176
+ end
1177
+
1178
+ context "when polymorphic on the child" do
1179
+
1180
+ let(:metadata) do
1181
+ described_class.new(
1182
+ name: :eyeable,
1183
+ polymorphic: true,
1184
+ inverse_class_name: "Eye",
1185
+ relation: Mongoid::Relations::Referenced::In
1186
+ )
1187
+ end
1188
+
1189
+ it "returns nil" do
1190
+ expect(metadata.inverse(Face.new)).to be_nil
1191
+ end
1192
+ end
1193
+ end
1194
+
1195
+ context "when inverse_of is defined" do
1196
+
1197
+ context "when inverse_of is nil" do
1198
+
1199
+ let(:metadata) do
1200
+ described_class.new(
1201
+ inverse_of: nil,
1202
+ relation: Mongoid::Relations::Referenced::In
1203
+ )
1204
+ end
1205
+
1206
+ it "returns nil" do
1207
+ expect(metadata.inverse).to be_nil
1208
+ end
1209
+ end
1210
+
1211
+ context "when inverse_of is a symbol" do
1212
+
1213
+ let(:metadata) do
1214
+ described_class.new(
1215
+ inverse_of: :crazy_name,
1216
+ relation: Mongoid::Relations::Referenced::In
1217
+ )
1218
+ end
1219
+
1220
+ it "returns the name of the inverse_of property" do
1221
+ expect(metadata.inverse).to eq(:crazy_name)
1222
+ end
1223
+ end
1224
+ end
1225
+
1226
+ context "when not polymorphic" do
1227
+
1228
+ let(:metadata) do
1229
+ described_class.new(
1230
+ name: :pet,
1231
+ class_name: "Animal",
1232
+ inverse_class_name: "Person",
1233
+ relation: Mongoid::Relations::Referenced::In
1234
+ )
1235
+ end
1236
+
1237
+ it "returns the name of the relation" do
1238
+ expect(metadata.inverse).to eq(:person)
1239
+ end
1240
+ end
1241
+
1242
+ context "when polymorphic" do
1243
+
1244
+ let(:metadata) do
1245
+ described_class.new(
1246
+ name: :addresses,
1247
+ as: :addressable,
1248
+ inverse_class_name: "Person",
1249
+ relation: Mongoid::Relations::Referenced::Many
1250
+ )
1251
+ end
1252
+
1253
+ it "returns the name of the relation" do
1254
+ expect(metadata.inverse).to eq(:addressable)
1255
+ end
1256
+ end
1257
+
1258
+ context "when polymorphic on the child" do
1259
+
1260
+ let(:metadata) do
1261
+ described_class.new(
1262
+ name: :addressable,
1263
+ polymorphic: true,
1264
+ inverse_class_name: "Address",
1265
+ relation: Mongoid::Relations::Referenced::In
1266
+ )
1267
+ end
1268
+
1269
+ it "returns the name of the relation" do
1270
+ expect(metadata.inverse(Person.new)).to eq(:addresses)
1271
+ end
1272
+ end
1273
+
1274
+ context "when in a cyclic relation" do
1275
+
1276
+ context "when the base name is included in the plural form" do
1277
+
1278
+ let(:metadata) do
1279
+ described_class.new(
1280
+ name: :parent_role,
1281
+ class_name: "Role",
1282
+ inverse_class_name: "Role",
1283
+ relation: Mongoid::Relations::Embedded::In,
1284
+ cyclic: true
1285
+ )
1286
+ end
1287
+
1288
+ it "returns the name of the relation" do
1289
+ expect(metadata.inverse(Role.new)).to eq(:child_roles)
1290
+ end
1291
+ end
1292
+
1293
+ context "when the base name is not included in the plural form" do
1294
+
1295
+ let(:metadata) do
1296
+ described_class.new(
1297
+ name: :parent_entry,
1298
+ class_name: "Entry",
1299
+ inverse_class_name: "Entry",
1300
+ relation: Mongoid::Relations::Embedded::In,
1301
+ cyclic: true
1302
+ )
1303
+ end
1304
+
1305
+ it "returns the name of the relation" do
1306
+ expect(metadata.inverse(Entry.new)).to eq(:child_entries)
1307
+ end
1308
+ end
1309
+ end
1310
+ end
1311
+ end
1312
+
1313
+ context "#inverse_foreign_key" do
1314
+
1315
+ context "when the inverse foreign key is not defined" do
1316
+
1317
+ let(:metadata) do
1318
+ described_class.new(
1319
+ name: :preferences,
1320
+ index: true,
1321
+ dependent: :nullify,
1322
+ relation: Mongoid::Relations::Referenced::ManyToMany,
1323
+ inverse_class_name: "Person"
1324
+ )
1325
+ end
1326
+
1327
+ it "returns the inverse class name plus suffix" do
1328
+ expect(metadata.inverse_foreign_key).to eq("person_ids")
1329
+ end
1330
+ end
1331
+
1332
+ context "when the inverse_of is nil" do
1333
+
1334
+ let(:metadata) do
1335
+ described_class.new(
1336
+ name: :blogs,
1337
+ class_name: "Blog",
1338
+ relation: Mongoid::Relations::Referenced::ManyToMany,
1339
+ inverse_of: nil
1340
+ )
1341
+ end
1342
+
1343
+ it "returns nil" do
1344
+ expect(metadata.inverse_foreign_key).to be_nil
1345
+ end
1346
+ end
1347
+ end
1348
+
1349
+ context "#inverse_klass" do
1350
+
1351
+ let(:metadata) do
1352
+ described_class.new(
1353
+ inverse_class_name: "Person",
1354
+ relation: Mongoid::Relations::Referenced::In
1355
+ )
1356
+ end
1357
+
1358
+ it "constantizes the inverse_class_name" do
1359
+ expect(metadata.inverse_klass).to eq(Person)
1360
+ end
1361
+ end
1362
+
1363
+ context "#inverse_setter" do
1364
+
1365
+ context "when the relation is not polymorphic" do
1366
+
1367
+ let(:metadata) do
1368
+ described_class.new(
1369
+ name: :pet,
1370
+ class_name: "Animal",
1371
+ inverse_class_name: "Person",
1372
+ relation: Mongoid::Relations::Referenced::In
1373
+ )
1374
+ end
1375
+
1376
+ it "returns a string for the setter" do
1377
+ expect(metadata.inverse_setter).to eq("person=")
1378
+ end
1379
+ end
1380
+
1381
+ context "when the relation is polymorphic" do
1382
+
1383
+ context "when multiple relations against the same class exist" do
1384
+
1385
+ context "when a referenced in" do
1386
+
1387
+ let(:metadata) do
1388
+ described_class.new(
1389
+ name: :eyeable,
1390
+ polymorphic: true,
1391
+ relation: Mongoid::Relations::Referenced::In
1392
+ )
1393
+ end
1394
+
1395
+ let(:other) do
1396
+ Face.new
1397
+ end
1398
+
1399
+ it "returns nil" do
1400
+ expect(metadata.inverse_setter(other)).to be_nil
1401
+ end
1402
+ end
1403
+
1404
+ context "when a references many" do
1405
+
1406
+ let(:metadata) do
1407
+ described_class.new(
1408
+ name: :blue_eyes,
1409
+ inverse_class_name: "EyeBowl",
1410
+ as: :eyeable,
1411
+ relation: Mongoid::Relations::Referenced::Many
1412
+ )
1413
+ end
1414
+
1415
+ it "returns a string for the setter" do
1416
+ expect(metadata.inverse_setter).to eq("eyeable=")
1417
+ end
1418
+ end
1419
+ end
1420
+
1421
+ context "when a referenced in" do
1422
+
1423
+ let(:metadata) do
1424
+ described_class.new(
1425
+ name: :ratable,
1426
+ inverse_class_name: "Rating",
1427
+ polymorphic: true,
1428
+ relation: Mongoid::Relations::Referenced::In
1429
+ )
1430
+ end
1431
+
1432
+ let(:other) do
1433
+ Movie.new
1434
+ end
1435
+
1436
+ it "returns a string for the setter" do
1437
+ expect(metadata.inverse_setter(other)).to eq("ratings=")
1438
+ end
1439
+ end
1440
+
1441
+ context "when a references many" do
1442
+
1443
+ let(:metadata) do
1444
+ described_class.new(
1445
+ name: :ratings,
1446
+ inverse_class_name: "Rating",
1447
+ as: :ratable,
1448
+ relation: Mongoid::Relations::Referenced::Many
1449
+ )
1450
+ end
1451
+
1452
+ it "returns a string for the setter" do
1453
+ expect(metadata.inverse_setter).to eq("ratable=")
1454
+ end
1455
+ end
1456
+ end
1457
+ end
1458
+
1459
+ context "#key" do
1460
+
1461
+ context "when relation is embedded" do
1462
+
1463
+ let(:metadata) do
1464
+ described_class.new(
1465
+ name: :addresses,
1466
+ relation: Mongoid::Relations::Embedded::Many
1467
+ )
1468
+ end
1469
+
1470
+ it "returns the name as a string" do
1471
+ expect(metadata.key).to eq("addresses")
1472
+ end
1473
+
1474
+ context "with a store_as option defined" do
1475
+
1476
+ let(:metadata) do
1477
+ described_class.new(
1478
+ name: :comment,
1479
+ relation: Mongoid::Relations::Embedded::Many,
1480
+ store_as: "user_comments"
1481
+ )
1482
+ end
1483
+
1484
+ it "return the name define by store_as option" do
1485
+ expect(metadata.key).to eq("user_comments")
1486
+ end
1487
+ end
1488
+ end
1489
+
1490
+ context "when relation is referenced" do
1491
+
1492
+ context "when relation stores foreign_key" do
1493
+
1494
+ context "when the relation is not polymorphic" do
1495
+
1496
+ let(:metadata) do
1497
+ described_class.new(
1498
+ name: :posts,
1499
+ relation: Mongoid::Relations::Referenced::ManyToMany
1500
+ )
1501
+ end
1502
+
1503
+ it "returns the foreign_key" do
1504
+ expect(metadata.key).to eq("post_ids")
1505
+ end
1506
+ end
1507
+
1508
+ context "when the relation is polymorphic" do
1509
+
1510
+ let(:metadata) do
1511
+ described_class.new(
1512
+ name: :ratable,
1513
+ relation: Mongoid::Relations::Referenced::In,
1514
+ polymorphic: true
1515
+ )
1516
+ end
1517
+
1518
+ it "returns the polymorphic foreign_key" do
1519
+ expect(metadata.key).to eq("ratable_id")
1520
+ end
1521
+ end
1522
+ end
1523
+
1524
+ context "when relation does not store a foreign_key" do
1525
+
1526
+ let(:metadata) do
1527
+ described_class.new(
1528
+ name: :addresses,
1529
+ relation: Mongoid::Relations::Referenced::Many,
1530
+ inverse_class_name: "Person"
1531
+ )
1532
+ end
1533
+
1534
+ it "returns _id" do
1535
+ expect(metadata.key).to eq("_id")
1536
+ end
1537
+ end
1538
+ end
1539
+ end
1540
+
1541
+ describe "#options" do
1542
+
1543
+ let(:metadata) do
1544
+ described_class.new(
1545
+ order: :rating.asc,
1546
+ relation: Mongoid::Relations::Referenced::Many
1547
+ )
1548
+ end
1549
+
1550
+ it "returns self" do
1551
+ expect(metadata.options).to eq(metadata)
1552
+ end
1553
+ end
1554
+
1555
+ describe "#order" do
1556
+
1557
+ let(:metadata) do
1558
+ described_class.new(
1559
+ order: :rating.asc,
1560
+ relation: Mongoid::Relations::Referenced::Many
1561
+ )
1562
+ end
1563
+
1564
+ it "returns order criteria" do
1565
+ expect(metadata.order).to eq(:rating.asc)
1566
+ end
1567
+ end
1568
+
1569
+ describe "#klass" do
1570
+
1571
+ context "when the class name is not namespaced" do
1572
+
1573
+ let(:metadata) do
1574
+ described_class.new(
1575
+ class_name: "Address",
1576
+ relation: Mongoid::Relations::Embedded::Many
1577
+ )
1578
+ end
1579
+
1580
+ it "constantizes the class_name" do
1581
+ expect(metadata.klass).to eq(Address)
1582
+ end
1583
+ end
1584
+
1585
+ context "when the class name is prepended with ::" do
1586
+
1587
+ let(:metadata) do
1588
+ described_class.new(
1589
+ class_name: "::Address",
1590
+ relation: Mongoid::Relations::Embedded::Many
1591
+ )
1592
+ end
1593
+
1594
+ it "returns the class" do
1595
+ expect(metadata.klass).to eq(Address)
1596
+ end
1597
+ end
1598
+ end
1599
+
1600
+ describe "#many?" do
1601
+
1602
+ context "when the relation is a many" do
1603
+
1604
+ let(:metadata) do
1605
+ described_class.new(relation: Mongoid::Relations::Embedded::Many)
1606
+ end
1607
+
1608
+ it "returns true" do
1609
+ expect(metadata).to be_many
1610
+ end
1611
+ end
1612
+
1613
+ context "when the relation is not a many" do
1614
+
1615
+ let(:metadata) do
1616
+ described_class.new(relation: Mongoid::Relations::Embedded::One)
1617
+ end
1618
+
1619
+ it "returns false" do
1620
+ expect(metadata).to_not be_many
1621
+ end
1622
+ end
1623
+ end
1624
+
1625
+ describe "#macro" do
1626
+
1627
+ let(:metadata) do
1628
+ described_class.new(relation: Mongoid::Relations::Embedded::One)
1629
+ end
1630
+
1631
+ it "returns the macro from the relation" do
1632
+ expect(metadata.macro).to eq(:embeds_one)
1633
+ end
1634
+ end
1635
+
1636
+ describe "#nested_builder" do
1637
+
1638
+ let(:metadata) do
1639
+ described_class.new(relation: Mongoid::Relations::Embedded::One)
1640
+ end
1641
+
1642
+ let(:attributes) do
1643
+ {}
1644
+ end
1645
+
1646
+ let(:options) do
1647
+ {}
1648
+ end
1649
+
1650
+ it "returns the nested builder from the relation" do
1651
+ expect(
1652
+ metadata.nested_builder(attributes, options)
1653
+ ).to be_a_kind_of(Mongoid::Relations::Builders::NestedAttributes::One)
1654
+ end
1655
+ end
1656
+
1657
+ describe "#primary_key" do
1658
+
1659
+ context "when no primary key exists" do
1660
+
1661
+ let(:metadata) do
1662
+ described_class.new(
1663
+ name: :person,
1664
+ inverse_class_name: "Person",
1665
+ relation: Mongoid::Relations::Referenced::In
1666
+ )
1667
+ end
1668
+
1669
+ it "returns _id" do
1670
+ expect(metadata.primary_key).to eq("_id")
1671
+ end
1672
+ end
1673
+
1674
+ context "when a primary key exists" do
1675
+
1676
+ let(:metadata) do
1677
+ described_class.new(
1678
+ name: :person,
1679
+ inverse_class_name: "Person",
1680
+ relation: Mongoid::Relations::Referenced::In,
1681
+ primary_key: :something_id
1682
+ )
1683
+ end
1684
+
1685
+ it "returns the primary key" do
1686
+ expect(metadata.primary_key).to eq("something_id")
1687
+ end
1688
+ end
1689
+ end
1690
+
1691
+ describe "#validate?" do
1692
+
1693
+ context "when validate is provided" do
1694
+
1695
+ context "when validate is true" do
1696
+
1697
+ let(:metadata) do
1698
+ described_class.new(
1699
+ name: :posts,
1700
+ inverse_class_name: "Post",
1701
+ relation: Mongoid::Relations::Referenced::Many,
1702
+ validate: true
1703
+ )
1704
+ end
1705
+
1706
+ it "returns true" do
1707
+ expect(metadata.validate?).to be_true
1708
+ end
1709
+ end
1710
+
1711
+ context "when validate is false" do
1712
+
1713
+ let(:metadata) do
1714
+ described_class.new(
1715
+ name: :posts,
1716
+ inverse_class_name: "Post",
1717
+ relation: Mongoid::Relations::Referenced::Many,
1718
+ validate: false
1719
+ )
1720
+ end
1721
+
1722
+ it "returns false" do
1723
+ expect(metadata.validate?).to be_false
1724
+ end
1725
+ end
1726
+ end
1727
+
1728
+ context "when validate is not provided" do
1729
+
1730
+ let(:metadata) do
1731
+ described_class.new(
1732
+ name: :posts,
1733
+ inverse_class_name: "Post",
1734
+ relation: Mongoid::Relations::Referenced::Many
1735
+ )
1736
+ end
1737
+
1738
+ it "returns the relation default" do
1739
+ expect(metadata.validate?).to be_true
1740
+ end
1741
+ end
1742
+ end
1743
+
1744
+ describe "#store_as" do
1745
+
1746
+ context "when store_as is define" do
1747
+
1748
+ let(:metadata) do
1749
+ described_class.new(
1750
+ name: :comment,
1751
+ relation: Mongoid::Relations::Embedded::Many,
1752
+ store_as: 'user_comments'
1753
+ )
1754
+ end
1755
+
1756
+ it "returns the value" do
1757
+ expect(metadata.store_as).to eq("user_comments")
1758
+ end
1759
+ end
1760
+
1761
+ context "when is not define" do
1762
+
1763
+ let(:metadata) do
1764
+ described_class.new(
1765
+ name: :comments,
1766
+ relation: Mongoid::Relations::Embedded::Many,
1767
+ )
1768
+ end
1769
+
1770
+ it "returns false" do
1771
+ expect(metadata.store_as).to eq("comments")
1772
+ end
1773
+ end
1774
+ end
1775
+
1776
+ describe "#determine_inverse_relation" do
1777
+
1778
+ let(:class_name) do
1779
+ "Person"
1780
+ end
1781
+
1782
+ let(:metadata) do
1783
+ described_class.new(
1784
+ relation: Mongoid::Relations::Referenced::In,
1785
+ inverse_class_name: "Drug",
1786
+ class_name: class_name,
1787
+ name: :person
1788
+ )
1789
+ end
1790
+
1791
+ let(:inverse_relation) do
1792
+ metadata.send(:determine_inverse_relation)
1793
+ end
1794
+
1795
+ context "when no match" do
1796
+
1797
+ let(:class_name) do
1798
+ "Slave"
1799
+ end
1800
+
1801
+ it "returns nil" do
1802
+ expect(inverse_relation).to be_nil
1803
+ end
1804
+ end
1805
+
1806
+ context "when one match" do
1807
+
1808
+ it "returns correct relation" do
1809
+ expect(inverse_relation).to eq(:drugs)
1810
+ end
1811
+ end
1812
+
1813
+ context "when multiple matches" do
1814
+
1815
+ before do
1816
+ class_name.constantize.has_many(:evil_drugs, class_name: "Drug")
1817
+ end
1818
+
1819
+ after do
1820
+ class_name.constantize.relations.delete("evil_drugs")
1821
+ Person.reset_callbacks(:validate)
1822
+ end
1823
+
1824
+ it "raises AmbiguousRelationship" do
1825
+ expect {
1826
+ inverse_relation
1827
+ }.to raise_error(Mongoid::Errors::AmbiguousRelationship)
1828
+ end
1829
+ end
1830
+ end
1831
+
1832
+ describe "touchable?" do
1833
+
1834
+ context "when touch is false" do
1835
+
1836
+ let(:metadata) do
1837
+ described_class.new(
1838
+ name: :versions,
1839
+ relation: Mongoid::Relations::Referenced::In,
1840
+ touch: false
1841
+ )
1842
+ end
1843
+
1844
+ it "returns false" do
1845
+ expect(metadata).to_not be_touchable
1846
+ end
1847
+ end
1848
+
1849
+ context "when touch is true" do
1850
+
1851
+ let(:metadata) do
1852
+ described_class.new(
1853
+ name: :versions,
1854
+ relation: Mongoid::Relations::Referenced::In,
1855
+ touch: true
1856
+ )
1857
+ end
1858
+
1859
+ it "returns true" do
1860
+ expect(metadata).to be_touchable
1861
+ end
1862
+ end
1863
+
1864
+ context "when touch is nil" do
1865
+
1866
+ let(:metadata) do
1867
+ described_class.new(
1868
+ name: :versions,
1869
+ relation: Mongoid::Relations::Referenced::In,
1870
+ )
1871
+ end
1872
+
1873
+ it "returns false" do
1874
+ expect(metadata).to_not be_touchable
1875
+ end
1876
+ end
1877
+ end
1878
+
1879
+ context "properties" do
1880
+
1881
+ PROPERTIES = [
1882
+ "as",
1883
+ "cyclic",
1884
+ "name",
1885
+ "order"
1886
+ ]
1887
+
1888
+ PROPERTIES.each do |property|
1889
+
1890
+ describe "##{property}" do
1891
+
1892
+ let(:metadata) do
1893
+ described_class.new(
1894
+ property.to_sym => :value,
1895
+ relation: Mongoid::Relations::Embedded::Many
1896
+ )
1897
+ end
1898
+
1899
+ it "returns the #{property} property" do
1900
+ expect(metadata.send(property)).to eq(:value)
1901
+ end
1902
+ end
1903
+
1904
+ describe "##{property}?" do
1905
+
1906
+ context "when a #{property} property exists" do
1907
+
1908
+ let(:metadata) do
1909
+ described_class.new(
1910
+ property.to_sym => :value,
1911
+ relation: Mongoid::Relations::Embedded::Many
1912
+ )
1913
+ end
1914
+
1915
+ it "returns true" do
1916
+ expect(metadata.send("#{property}?")).to be_true
1917
+ end
1918
+ end
1919
+
1920
+ context "when the #{property} property is nil" do
1921
+
1922
+ let(:metadata) do
1923
+ described_class.new(
1924
+ relation: Mongoid::Relations::Embedded::Many
1925
+ )
1926
+ end
1927
+
1928
+ it "returns false" do
1929
+ expect(metadata.send("#{property}?")).to be_false
1930
+ end
1931
+ end
1932
+ end
1933
+ end
1934
+ end
1935
+
1936
+ end