mongoid 5.4.1 → 7.4.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 (1354) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/LICENSE +1 -0
  5. data/README.md +33 -19
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +180 -64
  8. data/lib/mongoid/association/accessors.rb +402 -0
  9. data/lib/mongoid/association/bindable.rb +179 -0
  10. data/lib/mongoid/association/builders.rb +84 -0
  11. data/lib/mongoid/association/constrainable.rb +43 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +35 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +358 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +52 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +134 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +41 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +549 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +39 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +145 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -0
  29. data/lib/mongoid/association/macros.rb +207 -0
  30. data/lib/mongoid/association/many.rb +198 -0
  31. data/lib/mongoid/association/marshalable.rb +31 -0
  32. data/lib/mongoid/association/nested/many.rb +191 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
  34. data/lib/mongoid/association/nested/one.rb +116 -0
  35. data/lib/mongoid/association/nested.rb +15 -0
  36. data/lib/mongoid/association/one.rb +53 -0
  37. data/lib/mongoid/association/options.rb +122 -0
  38. data/lib/mongoid/association/proxy.rb +189 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +73 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +82 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +125 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
  46. data/lib/mongoid/association/referenced/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +292 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +270 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +498 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +545 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +111 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +455 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +29 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +5 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +47 -52
  76. data/lib/mongoid/attributes/dynamic.rb +19 -33
  77. data/lib/mongoid/attributes/nested.rb +29 -21
  78. data/lib/mongoid/attributes/processing.rb +11 -26
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +24 -7
  81. data/lib/mongoid/attributes.rb +110 -106
  82. data/lib/mongoid/cacheable.rb +33 -0
  83. data/lib/mongoid/changeable.rb +39 -57
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +62 -258
  86. data/lib/mongoid/clients/sessions.rb +125 -0
  87. data/lib/mongoid/clients/storage_options.rb +9 -81
  88. data/lib/mongoid/clients/validators/storage.rb +2 -9
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +13 -73
  91. data/lib/mongoid/composable.rb +33 -10
  92. data/lib/mongoid/config/environment.rb +36 -14
  93. data/lib/mongoid/config/options.rb +20 -23
  94. data/lib/mongoid/config/validators/client.rb +2 -17
  95. data/lib/mongoid/config/validators/option.rb +2 -3
  96. data/lib/mongoid/config/validators.rb +2 -1
  97. data/lib/mongoid/config.rb +112 -39
  98. data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -27
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +31 -33
  103. data/lib/mongoid/contextual/command.rb +2 -5
  104. data/lib/mongoid/contextual/geo_near.rb +7 -38
  105. data/lib/mongoid/contextual/map_reduce.rb +12 -36
  106. data/lib/mongoid/contextual/memory.rb +34 -64
  107. data/lib/mongoid/contextual/mongo.rb +228 -113
  108. data/lib/mongoid/contextual/none.rb +51 -23
  109. data/lib/mongoid/contextual/queryable.rb +2 -3
  110. data/lib/mongoid/contextual.rb +7 -9
  111. data/lib/mongoid/copyable.rb +32 -19
  112. data/lib/mongoid/criteria/findable.rb +12 -15
  113. data/lib/mongoid/criteria/includable.rb +21 -28
  114. data/lib/mongoid/criteria/inspectable.rb +2 -3
  115. data/lib/mongoid/criteria/marshalable.rb +4 -7
  116. data/lib/mongoid/criteria/modifiable.rb +38 -24
  117. data/lib/mongoid/criteria/options.rb +24 -0
  118. data/lib/mongoid/criteria/permission.rb +2 -1
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +109 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +162 -0
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +36 -0
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +33 -0
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +58 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +47 -0
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +177 -0
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +75 -0
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +81 -0
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +181 -0
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +94 -0
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +72 -0
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +33 -0
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +122 -0
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +72 -0
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +55 -0
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +61 -0
  137. data/lib/mongoid/criteria/queryable/extensions.rb +25 -0
  138. data/lib/mongoid/criteria/queryable/key.rb +177 -0
  139. data/lib/mongoid/criteria/queryable/macroable.rb +26 -0
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +413 -0
  141. data/lib/mongoid/criteria/queryable/optional.rb +386 -0
  142. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +106 -0
  144. data/lib/mongoid/criteria/queryable/selectable.rb +943 -0
  145. data/lib/mongoid/criteria/queryable/selector.rb +202 -0
  146. data/lib/mongoid/criteria/queryable/smash.rb +95 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +85 -0
  149. data/lib/mongoid/criteria/scopable.rb +27 -19
  150. data/lib/mongoid/criteria.rb +93 -76
  151. data/lib/mongoid/document.rb +62 -109
  152. data/lib/mongoid/equality.rb +29 -12
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +5 -6
  154. data/lib/mongoid/errors/callback.rb +2 -3
  155. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  156. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  157. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  158. data/lib/mongoid/errors/document_not_found.rb +2 -9
  159. data/lib/mongoid/errors/eager_load.rb +6 -5
  160. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  161. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  162. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  163. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  164. data/lib/mongoid/errors/invalid_config_option.rb +2 -3
  165. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  166. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  167. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  168. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  169. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  170. data/lib/mongoid/errors/invalid_field.rb +4 -7
  171. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  172. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  173. data/lib/mongoid/errors/invalid_find.rb +2 -3
  174. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  175. data/lib/mongoid/errors/invalid_index.rb +2 -3
  176. data/lib/mongoid/errors/invalid_options.rb +4 -5
  177. data/lib/mongoid/errors/invalid_path.rb +2 -3
  178. data/lib/mongoid/errors/invalid_persistence_option.rb +26 -0
  179. data/lib/mongoid/errors/invalid_query.rb +40 -0
  180. data/lib/mongoid/errors/invalid_relation.rb +61 -0
  181. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  182. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  183. data/lib/mongoid/errors/invalid_session_use.rb +21 -0
  184. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  185. data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
  186. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  187. data/lib/mongoid/errors/invalid_time.rb +2 -3
  188. data/lib/mongoid/errors/invalid_value.rb +2 -1
  189. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  190. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  191. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  192. data/lib/mongoid/errors/mongoid_error.rb +3 -10
  193. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  194. data/lib/mongoid/errors/no_client_config.rb +4 -5
  195. data/lib/mongoid/errors/no_client_database.rb +2 -3
  196. data/lib/mongoid/errors/no_client_hosts.rb +2 -3
  197. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  198. data/lib/mongoid/errors/no_default_client.rb +3 -4
  199. data/lib/mongoid/errors/no_environment.rb +2 -3
  200. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  201. data/lib/mongoid/errors/no_metadata.rb +2 -3
  202. data/lib/mongoid/errors/no_parent.rb +2 -3
  203. data/lib/mongoid/errors/readonly_attribute.rb +2 -3
  204. data/lib/mongoid/errors/readonly_document.rb +3 -6
  205. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  206. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
  207. data/lib/mongoid/errors/unknown_attribute.rb +2 -3
  208. data/lib/mongoid/errors/unknown_model.rb +24 -0
  209. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  210. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  211. data/lib/mongoid/errors/validations.rb +2 -1
  212. data/lib/mongoid/errors.rb +18 -1
  213. data/lib/mongoid/evolvable.rb +4 -5
  214. data/lib/mongoid/extensions/array.rb +33 -42
  215. data/lib/mongoid/extensions/big_decimal.rb +17 -17
  216. data/lib/mongoid/extensions/boolean.rb +3 -5
  217. data/lib/mongoid/extensions/date.rb +17 -13
  218. data/lib/mongoid/extensions/date_time.rb +4 -12
  219. data/lib/mongoid/extensions/decimal128.rb +3 -6
  220. data/lib/mongoid/extensions/false_class.rb +4 -7
  221. data/lib/mongoid/extensions/float.rb +5 -10
  222. data/lib/mongoid/extensions/hash.rb +57 -38
  223. data/lib/mongoid/extensions/integer.rb +5 -12
  224. data/lib/mongoid/extensions/module.rb +2 -3
  225. data/lib/mongoid/extensions/nil_class.rb +2 -5
  226. data/lib/mongoid/extensions/object.rb +21 -48
  227. data/lib/mongoid/extensions/object_id.rb +2 -7
  228. data/lib/mongoid/extensions/range.rb +3 -11
  229. data/lib/mongoid/extensions/regexp.rb +4 -4
  230. data/lib/mongoid/extensions/set.rb +2 -7
  231. data/lib/mongoid/extensions/string.rb +27 -44
  232. data/lib/mongoid/extensions/symbol.rb +2 -7
  233. data/lib/mongoid/extensions/time.rb +16 -10
  234. data/lib/mongoid/extensions/time_with_zone.rb +25 -7
  235. data/lib/mongoid/extensions/true_class.rb +4 -7
  236. data/lib/mongoid/extensions.rb +18 -11
  237. data/lib/mongoid/factory.rb +60 -10
  238. data/lib/mongoid/fields/foreign_key.rb +8 -27
  239. data/lib/mongoid/fields/localized.rb +2 -11
  240. data/lib/mongoid/fields/standard.rb +8 -50
  241. data/lib/mongoid/fields/validators/macro.rb +50 -14
  242. data/lib/mongoid/fields/validators.rb +2 -1
  243. data/lib/mongoid/fields.rb +118 -67
  244. data/lib/mongoid/findable.rb +60 -24
  245. data/lib/mongoid/indexable/specification.rb +3 -16
  246. data/lib/mongoid/indexable/validators/options.rb +2 -7
  247. data/lib/mongoid/indexable.rb +26 -36
  248. data/lib/mongoid/inspectable.rb +4 -11
  249. data/lib/mongoid/interceptable.rb +27 -57
  250. data/lib/mongoid/loggable.rb +13 -16
  251. data/lib/mongoid/matchable.rb +5 -146
  252. data/lib/mongoid/matcher/all.rb +22 -0
  253. data/lib/mongoid/matcher/and.rb +21 -0
  254. data/lib/mongoid/matcher/bits.rb +41 -0
  255. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  256. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  257. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  258. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  259. data/lib/mongoid/matcher/elem_match.rb +36 -0
  260. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  261. data/lib/mongoid/matcher/eq.rb +11 -0
  262. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  263. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  264. data/lib/mongoid/matcher/exists.rb +15 -0
  265. data/lib/mongoid/matcher/expression.rb +35 -0
  266. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  267. data/lib/mongoid/matcher/field_expression.rb +62 -0
  268. data/lib/mongoid/matcher/field_operator.rb +54 -0
  269. data/lib/mongoid/matcher/gt.rb +17 -0
  270. data/lib/mongoid/matcher/gte.rb +17 -0
  271. data/lib/mongoid/matcher/in.rb +25 -0
  272. data/lib/mongoid/matcher/lt.rb +17 -0
  273. data/lib/mongoid/matcher/lte.rb +17 -0
  274. data/lib/mongoid/matcher/mod.rb +17 -0
  275. data/lib/mongoid/matcher/ne.rb +16 -0
  276. data/lib/mongoid/matcher/nin.rb +11 -0
  277. data/lib/mongoid/matcher/nor.rb +25 -0
  278. data/lib/mongoid/matcher/not.rb +29 -0
  279. data/lib/mongoid/matcher/or.rb +21 -0
  280. data/lib/mongoid/matcher/regex.rb +41 -0
  281. data/lib/mongoid/matcher/size.rb +26 -0
  282. data/lib/mongoid/matcher/type.rb +99 -0
  283. data/lib/mongoid/matcher.rb +110 -0
  284. data/lib/mongoid/persistable/creatable.rb +9 -24
  285. data/lib/mongoid/persistable/deletable.rb +16 -29
  286. data/lib/mongoid/persistable/destroyable.rb +12 -15
  287. data/lib/mongoid/persistable/incrementable.rb +7 -8
  288. data/lib/mongoid/persistable/logical.rb +5 -7
  289. data/lib/mongoid/persistable/poppable.rb +3 -6
  290. data/lib/mongoid/persistable/pullable.rb +3 -8
  291. data/lib/mongoid/persistable/pushable.rb +14 -10
  292. data/lib/mongoid/persistable/renamable.rb +10 -8
  293. data/lib/mongoid/persistable/savable.rb +3 -8
  294. data/lib/mongoid/persistable/settable.rb +61 -19
  295. data/lib/mongoid/persistable/unsettable.rb +8 -8
  296. data/lib/mongoid/persistable/updatable.rb +38 -33
  297. data/lib/mongoid/persistable/upsertable.rb +5 -9
  298. data/lib/mongoid/persistable.rb +137 -45
  299. data/lib/mongoid/persistence_context.rb +222 -0
  300. data/lib/mongoid/positional.rb +3 -6
  301. data/lib/mongoid/query_cache.rb +141 -110
  302. data/lib/mongoid/railtie.rb +20 -17
  303. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  304. data/lib/mongoid/railties/database.rake +9 -0
  305. data/lib/mongoid/reloadable.rb +14 -19
  306. data/lib/mongoid/scopable.rb +11 -38
  307. data/lib/mongoid/selectable.rb +8 -17
  308. data/lib/mongoid/serializable.rb +29 -34
  309. data/lib/mongoid/shardable.rb +80 -17
  310. data/lib/mongoid/stateful.rb +4 -10
  311. data/lib/mongoid/stringified_symbol.rb +52 -0
  312. data/lib/mongoid/tasks/database.rake +12 -5
  313. data/lib/mongoid/tasks/database.rb +88 -7
  314. data/lib/mongoid/threaded/lifecycle.rb +2 -21
  315. data/lib/mongoid/threaded.rb +70 -49
  316. data/lib/mongoid/timestamps/created/short.rb +2 -1
  317. data/lib/mongoid/timestamps/created.rb +3 -2
  318. data/lib/mongoid/timestamps/short.rb +2 -1
  319. data/lib/mongoid/timestamps/timeless.rb +6 -9
  320. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  321. data/lib/mongoid/timestamps/updated.rb +3 -4
  322. data/lib/mongoid/timestamps.rb +3 -2
  323. data/lib/mongoid/touchable.rb +132 -0
  324. data/lib/mongoid/traversable.rb +181 -61
  325. data/lib/mongoid/validatable/associated.rb +5 -6
  326. data/lib/mongoid/validatable/format.rb +2 -1
  327. data/lib/mongoid/validatable/length.rb +2 -1
  328. data/lib/mongoid/validatable/localizable.rb +2 -3
  329. data/lib/mongoid/validatable/macros.rb +3 -8
  330. data/lib/mongoid/validatable/presence.rb +10 -15
  331. data/lib/mongoid/validatable/queryable.rb +2 -3
  332. data/lib/mongoid/validatable/uniqueness.rb +26 -40
  333. data/lib/mongoid/validatable.rb +16 -35
  334. data/lib/mongoid/version.rb +3 -2
  335. data/lib/mongoid.rb +35 -17
  336. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  337. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +54 -21
  338. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  339. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  340. data/lib/rails/generators/mongoid_generator.rb +2 -1
  341. data/lib/rails/mongoid.rb +4 -5
  342. data/spec/README.md +33 -0
  343. data/spec/config/mongoid.yml +28 -2
  344. data/spec/integration/app_spec.rb +343 -0
  345. data/spec/integration/associations/belongs_to_spec.rb +15 -0
  346. data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
  347. data/spec/integration/associations/embedded_spec.rb +268 -0
  348. data/spec/integration/associations/embeds_many_spec.rb +206 -0
  349. data/spec/integration/associations/embeds_one_spec.rb +23 -0
  350. data/spec/integration/associations/foreign_key_spec.rb +98 -0
  351. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  352. data/spec/integration/associations/has_many_spec.rb +128 -0
  353. data/spec/integration/associations/has_one_spec.rb +176 -0
  354. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  355. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  356. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  357. data/spec/integration/associations/scope_option_spec.rb +101 -0
  358. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  359. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  360. data/spec/integration/callbacks_models.rb +61 -0
  361. data/spec/integration/callbacks_spec.rb +228 -0
  362. data/spec/integration/contextual/empty_spec.rb +141 -0
  363. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  364. data/spec/integration/criteria/date_field_spec.rb +40 -0
  365. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  366. data/spec/integration/criteria/logical_spec.rb +124 -0
  367. data/spec/integration/criteria/range_spec.rb +265 -0
  368. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  369. data/spec/integration/discriminator_key_spec.rb +353 -0
  370. data/spec/integration/discriminator_value_spec.rb +206 -0
  371. data/spec/integration/document_spec.rb +51 -0
  372. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  373. data/spec/integration/matcher_examples_spec.rb +758 -0
  374. data/spec/integration/matcher_operator_data/all.yml +140 -0
  375. data/spec/integration/matcher_operator_data/and.yml +93 -0
  376. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  377. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  378. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  379. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  380. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  381. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  382. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  383. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  384. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  385. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  386. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  387. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  388. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  389. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  390. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  391. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  392. data/spec/integration/matcher_operator_data/in.yml +210 -0
  393. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  394. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  395. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  396. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  398. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  399. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  400. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  401. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  402. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  403. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  404. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  405. data/spec/integration/matcher_operator_data/not.yml +196 -0
  406. data/spec/integration/matcher_operator_data/or.yml +137 -0
  407. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  408. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  409. data/spec/integration/matcher_operator_data/size.yml +174 -0
  410. data/spec/integration/matcher_operator_data/type.yml +70 -0
  411. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  412. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  413. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  414. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  415. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  416. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  417. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  418. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  419. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  420. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  421. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  422. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  423. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  424. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  425. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  426. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  427. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  428. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  429. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  430. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  431. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  432. data/spec/integration/matcher_operator_spec.rb +124 -0
  433. data/spec/integration/matcher_spec.rb +283 -0
  434. data/spec/integration/server_query_spec.rb +141 -0
  435. data/spec/integration/shardable_spec.rb +148 -0
  436. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  437. data/spec/lite_spec_helper.rb +83 -0
  438. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  439. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  440. data/spec/mongoid/association/builders_spec.rb +255 -0
  441. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  442. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  443. data/spec/mongoid/association/depending_spec.rb +959 -0
  444. data/spec/mongoid/association/eager_spec.rb +281 -0
  445. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  446. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  447. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +173 -0
  448. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +36 -0
  449. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +559 -0
  450. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  451. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  452. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +106 -0
  453. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4652 -0
  454. data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
  455. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
  456. data/spec/mongoid/association/embedded/embeds_many_spec.rb +864 -0
  457. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  458. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +81 -0
  459. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  460. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  461. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  462. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  463. data/spec/mongoid/association/embedded/embeds_one_spec.rb +956 -0
  464. data/spec/mongoid/association/macros_spec.rb +1116 -0
  465. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  466. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  467. data/spec/mongoid/association/options_spec.rb +1323 -0
  468. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  469. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +243 -0
  470. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +238 -0
  471. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  472. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1373 -0
  473. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  474. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  475. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  476. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  477. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  478. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  479. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3773 -0
  480. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
  481. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  482. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1071 -0
  483. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  484. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +142 -0
  485. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  486. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2232 -0
  487. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  488. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4092 -0
  489. data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
  490. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  491. data/spec/mongoid/association/referenced/has_many_spec.rb +1248 -0
  492. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  493. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  494. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  495. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1142 -0
  496. data/spec/mongoid/association/referenced/has_one_models.rb +97 -0
  497. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  498. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  499. data/spec/mongoid/association/reflections_spec.rb +92 -0
  500. data/spec/mongoid/association/syncable_spec.rb +499 -0
  501. data/spec/mongoid/association_spec.rb +191 -0
  502. data/spec/mongoid/atomic/modifiers_spec.rb +52 -3
  503. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  504. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  505. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  506. data/spec/mongoid/atomic/paths_spec.rb +107 -12
  507. data/spec/mongoid/atomic_spec.rb +36 -11
  508. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  509. data/spec/mongoid/attributes/nested_spec.rb +115 -91
  510. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  511. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  512. data/spec/mongoid/attributes/projector_spec.rb +44 -0
  513. data/spec/mongoid/attributes/readonly_spec.rb +111 -111
  514. data/spec/mongoid/attributes_spec.rb +501 -33
  515. data/spec/mongoid/cacheable_spec.rb +114 -0
  516. data/spec/mongoid/changeable_spec.rb +118 -35
  517. data/spec/mongoid/clients/factory_spec.rb +176 -34
  518. data/spec/mongoid/clients/options_spec.rb +431 -98
  519. data/spec/mongoid/clients/sessions_spec.rb +335 -0
  520. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  521. data/spec/mongoid/clients_spec.rb +318 -114
  522. data/spec/mongoid/composable_spec.rb +9 -0
  523. data/spec/mongoid/config/environment_spec.rb +88 -8
  524. data/spec/mongoid/config/options_spec.rb +22 -3
  525. data/spec/mongoid/config_spec.rb +371 -13
  526. data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
  527. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  528. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  529. data/spec/mongoid/contextual/atomic_spec.rb +245 -84
  530. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  531. data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
  532. data/spec/mongoid/contextual/memory_spec.rb +44 -23
  533. data/spec/mongoid/contextual/mongo_spec.rb +780 -155
  534. data/spec/mongoid/contextual/none_spec.rb +14 -71
  535. data/spec/mongoid/copyable_spec.rb +297 -23
  536. data/spec/mongoid/copyable_spec_models.rb +47 -0
  537. data/spec/mongoid/criteria/findable_spec.rb +77 -20
  538. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
  540. data/spec/mongoid/criteria/modifiable_spec.rb +506 -50
  541. data/spec/mongoid/criteria/options_spec.rb +31 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +372 -0
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +525 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +61 -0
  546. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +60 -0
  547. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +215 -0
  548. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +332 -0
  549. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +423 -0
  550. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +60 -0
  551. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +67 -0
  552. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +329 -0
  553. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +67 -0
  554. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +79 -0
  555. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +53 -0
  556. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +110 -0
  557. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +370 -0
  558. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +91 -0
  559. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +92 -0
  560. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +41 -0
  561. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +347 -0
  562. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +169 -0
  563. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +395 -0
  564. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +376 -0
  565. data/spec/mongoid/criteria/queryable/key_spec.rb +96 -0
  566. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +182 -0
  567. data/spec/mongoid/criteria/queryable/optional_spec.rb +1801 -0
  568. data/spec/mongoid/criteria/queryable/options_spec.rb +362 -0
  569. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +214 -0
  570. data/spec/mongoid/criteria/queryable/queryable_spec.rb +139 -0
  571. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2069 -0
  572. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  573. data/spec/mongoid/criteria/queryable/selectable_spec.rb +2297 -0
  574. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  575. data/spec/mongoid/criteria/queryable/selector_spec.rb +883 -0
  576. data/spec/mongoid/criteria/queryable/smash_spec.rb +32 -0
  577. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  578. data/spec/mongoid/criteria/scopable_spec.rb +210 -0
  579. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  580. data/spec/mongoid/criteria_spec.rb +876 -402
  581. data/spec/mongoid/document_fields_spec.rb +113 -0
  582. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  583. data/spec/mongoid/document_query_spec.rb +89 -0
  584. data/spec/mongoid/document_spec.rb +214 -104
  585. data/spec/mongoid/equality_spec.rb +144 -41
  586. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  587. data/spec/mongoid/errors/callback_spec.rb +2 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +2 -0
  591. data/spec/mongoid/errors/eager_load_spec.rb +2 -0
  592. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  593. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  594. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  595. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  596. data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  601. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +39 -0
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +28 -11
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  612. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  613. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +2 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  619. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  627. data/spec/mongoid/errors/validations_spec.rb +2 -0
  628. data/spec/mongoid/extensions/array_spec.rb +36 -58
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +323 -19
  630. data/spec/mongoid/extensions/binary_spec.rb +2 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +16 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
  633. data/spec/mongoid/extensions/date_spec.rb +8 -164
  634. data/spec/mongoid/extensions/date_time_spec.rb +19 -66
  635. data/spec/mongoid/extensions/decimal128_spec.rb +3 -1
  636. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  637. data/spec/mongoid/extensions/float_spec.rb +25 -4
  638. data/spec/mongoid/extensions/hash_spec.rb +138 -1
  639. data/spec/mongoid/extensions/integer_spec.rb +22 -3
  640. data/spec/mongoid/extensions/module_spec.rb +2 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  643. data/spec/mongoid/extensions/object_spec.rb +27 -31
  644. data/spec/mongoid/extensions/range_spec.rb +9 -0
  645. data/spec/mongoid/extensions/regexp_spec.rb +25 -0
  646. data/spec/mongoid/extensions/set_spec.rb +2 -0
  647. data/spec/mongoid/extensions/string_spec.rb +113 -31
  648. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  649. data/spec/mongoid/extensions/symbol_spec.rb +2 -0
  650. data/spec/mongoid/extensions/time_spec.rb +31 -6
  651. data/spec/mongoid/extensions/time_with_zone_spec.rb +35 -6
  652. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  653. data/spec/mongoid/extensions_spec.rb +16 -2
  654. data/spec/mongoid/factory_spec.rb +304 -15
  655. data/spec/mongoid/fields/foreign_key_spec.rb +26 -32
  656. data/spec/mongoid/fields/localized_spec.rb +6 -4
  657. data/spec/mongoid/fields/standard_spec.rb +2 -0
  658. data/spec/mongoid/fields_spec.rb +420 -38
  659. data/spec/mongoid/findable_spec.rb +98 -19
  660. data/spec/mongoid/indexable/specification_spec.rb +2 -0
  661. data/spec/mongoid/indexable_spec.rb +69 -17
  662. data/spec/mongoid/inspectable_spec.rb +39 -2
  663. data/spec/mongoid/interceptable_spec.rb +273 -114
  664. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  665. data/spec/mongoid/loggable_spec.rb +2 -0
  666. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  667. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  668. data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
  669. data/spec/mongoid/persistable/creatable_spec.rb +119 -29
  670. data/spec/mongoid/persistable/deletable_spec.rb +307 -11
  671. data/spec/mongoid/persistable/destroyable_spec.rb +225 -12
  672. data/spec/mongoid/persistable/incrementable_spec.rb +29 -13
  673. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  674. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  675. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  676. data/spec/mongoid/persistable/pushable_spec.rb +91 -7
  677. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  678. data/spec/mongoid/persistable/savable_spec.rb +218 -50
  679. data/spec/mongoid/persistable/settable_spec.rb +213 -32
  680. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  681. data/spec/mongoid/persistable/updatable_spec.rb +222 -21
  682. data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
  683. data/spec/mongoid/persistable_spec.rb +116 -25
  684. data/spec/mongoid/persistence_context_spec.rb +696 -0
  685. data/spec/mongoid/positional_spec.rb +3 -1
  686. data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
  687. data/spec/mongoid/query_cache_spec.rb +647 -45
  688. data/spec/mongoid/relations/proxy_spec.rb +126 -98
  689. data/spec/mongoid/reloadable_spec.rb +346 -17
  690. data/spec/mongoid/scopable_spec.rb +82 -22
  691. data/spec/mongoid/selectable_spec.rb +8 -6
  692. data/spec/mongoid/serializable_spec.rb +160 -79
  693. data/spec/mongoid/shardable_models.rb +61 -0
  694. data/spec/mongoid/shardable_spec.rb +145 -26
  695. data/spec/mongoid/stateful_spec.rb +3 -1
  696. data/spec/mongoid/tasks/database_rake_spec.rb +15 -13
  697. data/spec/mongoid/tasks/database_spec.rb +3 -1
  698. data/spec/mongoid/threaded_spec.rb +72 -2
  699. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  700. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  701. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  702. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  703. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  704. data/spec/mongoid/timestamps_spec.rb +8 -6
  705. data/spec/mongoid/touchable_spec.rb +588 -0
  706. data/spec/mongoid/touchable_spec_models.rb +53 -0
  707. data/spec/mongoid/traversable_spec.rb +1167 -1
  708. data/spec/mongoid/validatable/associated_spec.rb +3 -1
  709. data/spec/mongoid/validatable/format_spec.rb +2 -0
  710. data/spec/mongoid/validatable/length_spec.rb +2 -0
  711. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  712. data/spec/mongoid/validatable/presence_spec.rb +33 -26
  713. data/spec/mongoid/validatable/uniqueness_spec.rb +119 -81
  714. data/spec/mongoid/validatable_spec.rb +21 -3
  715. data/spec/mongoid_spec.rb +2 -0
  716. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  717. data/spec/rails/mongoid_spec.rb +4 -2
  718. data/spec/shared/LICENSE +20 -0
  719. data/spec/shared/bin/get-mongodb-download-url +17 -0
  720. data/spec/shared/bin/s3-copy +45 -0
  721. data/spec/shared/bin/s3-upload +69 -0
  722. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  723. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  724. data/spec/shared/lib/mrss/constraints.rb +386 -0
  725. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  726. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  727. data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
  728. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  729. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  730. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  731. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  732. data/spec/shared/lib/mrss/utils.rb +15 -0
  733. data/spec/shared/share/Dockerfile.erb +339 -0
  734. data/spec/shared/share/haproxy-1.conf +16 -0
  735. data/spec/shared/share/haproxy-2.conf +17 -0
  736. data/spec/shared/shlib/distro.sh +74 -0
  737. data/spec/shared/shlib/server.sh +379 -0
  738. data/spec/shared/shlib/set_env.sh +132 -0
  739. data/spec/spec_helper.rb +133 -53
  740. data/spec/support/authorization.rb +2 -0
  741. data/spec/support/client_registry.rb +9 -0
  742. data/spec/support/constraints.rb +53 -0
  743. data/spec/support/expectations.rb +21 -3
  744. data/spec/support/helpers.rb +11 -0
  745. data/spec/support/macros.rb +42 -0
  746. data/spec/support/models/account.rb +38 -0
  747. data/spec/support/models/acolyte.rb +19 -0
  748. data/spec/support/models/actor.rb +20 -0
  749. data/spec/support/models/actress.rb +4 -0
  750. data/spec/support/models/address.rb +85 -0
  751. data/spec/support/models/address_component.rb +7 -0
  752. data/spec/support/models/address_number.rb +8 -0
  753. data/spec/support/models/agency.rb +7 -0
  754. data/spec/support/models/agent.rb +18 -0
  755. data/spec/support/models/album.rb +20 -0
  756. data/spec/support/models/alert.rb +9 -0
  757. data/spec/support/models/animal.rb +28 -0
  758. data/spec/support/models/answer.rb +8 -0
  759. data/spec/support/models/appointment.rb +9 -0
  760. data/spec/support/models/armrest.rb +9 -0
  761. data/spec/support/models/array_field.rb +7 -0
  762. data/spec/support/models/article.rb +14 -0
  763. data/spec/support/models/artist.rb +91 -0
  764. data/spec/support/models/artwork.rb +6 -0
  765. data/spec/support/models/audible_sound.rb +3 -0
  766. data/spec/support/models/audio.rb +7 -0
  767. data/spec/support/models/augmentation.rb +13 -0
  768. data/spec/support/models/author.rb +8 -0
  769. data/spec/support/models/baby.rb +6 -0
  770. data/spec/support/models/band.rb +37 -0
  771. data/spec/support/models/bar.rb +12 -0
  772. data/spec/support/models/basic.rb +8 -0
  773. data/spec/support/models/bed.rb +3 -0
  774. data/spec/support/models/big_palette.rb +4 -0
  775. data/spec/support/models/birthday.rb +15 -0
  776. data/spec/support/models/bolt.rb +7 -0
  777. data/spec/support/models/bomb.rb +6 -0
  778. data/spec/support/models/book.rb +18 -0
  779. data/spec/support/models/breed.rb +6 -0
  780. data/spec/support/models/browser.rb +8 -0
  781. data/spec/support/models/building.rb +8 -0
  782. data/spec/support/models/building_address.rb +9 -0
  783. data/spec/support/models/bus.rb +9 -0
  784. data/spec/support/models/business.rb +7 -0
  785. data/spec/support/models/callback_test.rb +11 -0
  786. data/spec/support/models/canvas.rb +27 -0
  787. data/spec/support/models/car.rb +3 -0
  788. data/spec/support/models/cat.rb +10 -0
  789. data/spec/support/models/category.rb +10 -0
  790. data/spec/support/models/child.rb +6 -0
  791. data/spec/support/models/child_doc.rb +24 -0
  792. data/spec/support/models/church.rb +8 -0
  793. data/spec/support/models/circle.rb +5 -0
  794. data/spec/support/models/circuit.rb +6 -0
  795. data/spec/support/models/circus.rb +9 -0
  796. data/spec/support/models/code.rb +13 -0
  797. data/spec/support/models/coding/pull_request.rb +11 -0
  798. data/spec/support/models/coding.rb +3 -0
  799. data/spec/support/models/comment.rb +18 -0
  800. data/spec/support/models/company.rb +7 -0
  801. data/spec/support/models/consumption_period.rb +9 -0
  802. data/spec/support/models/contextable_item.rb +7 -0
  803. data/spec/support/models/contractor.rb +7 -0
  804. data/spec/support/models/cookie.rb +8 -0
  805. data/spec/support/models/country_code.rb +12 -0
  806. data/spec/support/models/courier_job.rb +6 -0
  807. data/spec/support/models/crate.rb +12 -0
  808. data/spec/support/models/customer.rb +10 -0
  809. data/spec/support/models/customer_address.rb +11 -0
  810. data/spec/support/models/deed.rb +7 -0
  811. data/spec/support/models/definition.rb +11 -0
  812. data/spec/support/models/delegating_patient.rb +15 -0
  813. data/spec/support/models/description.rb +13 -0
  814. data/spec/support/models/dictionary.rb +18 -0
  815. data/spec/support/models/division.rb +12 -0
  816. data/spec/support/models/doctor.rb +14 -0
  817. data/spec/support/models/dog.rb +9 -0
  818. data/spec/support/models/dokument.rb +8 -0
  819. data/spec/support/models/draft.rb +11 -0
  820. data/spec/support/models/dragon.rb +6 -0
  821. data/spec/support/models/driver.rb +9 -0
  822. data/spec/support/models/drug.rb +8 -0
  823. data/spec/support/models/dungeon.rb +6 -0
  824. data/spec/support/models/edit.rb +7 -0
  825. data/spec/support/models/email.rb +8 -0
  826. data/spec/support/models/employer.rb +7 -0
  827. data/spec/support/models/entry.rb +8 -0
  828. data/spec/support/models/eraser.rb +3 -0
  829. data/spec/support/models/even.rb +9 -0
  830. data/spec/support/models/event.rb +24 -0
  831. data/spec/support/models/exhibition.rb +6 -0
  832. data/spec/support/models/exhibitor.rb +8 -0
  833. data/spec/support/models/explosion.rb +6 -0
  834. data/spec/support/models/eye.rb +11 -0
  835. data/spec/support/models/eye_bowl.rb +11 -0
  836. data/spec/support/models/face.rb +10 -0
  837. data/spec/support/models/favorite.rb +8 -0
  838. data/spec/support/models/filesystem.rb +7 -0
  839. data/spec/support/models/fire_hydrant.rb +8 -0
  840. data/spec/support/models/firefox.rb +6 -0
  841. data/spec/support/models/fish.rb +9 -0
  842. data/spec/support/models/folder.rb +9 -0
  843. data/spec/support/models/folder_item.rb +11 -0
  844. data/spec/support/models/fruits.rb +36 -0
  845. data/spec/support/models/game.rb +21 -0
  846. data/spec/support/models/ghost.rb +9 -0
  847. data/spec/support/models/guitar.rb +4 -0
  848. data/spec/support/models/hole.rb +12 -0
  849. data/spec/support/models/home.rb +6 -0
  850. data/spec/support/models/house.rb +8 -0
  851. data/spec/support/models/html_writer.rb +5 -0
  852. data/spec/support/models/id_key.rb +8 -0
  853. data/spec/support/models/idnodef.rb +7 -0
  854. data/spec/support/models/image.rb +24 -0
  855. data/spec/support/models/implant.rb +18 -0
  856. data/spec/support/models/instrument.rb +8 -0
  857. data/spec/support/models/item.rb +10 -0
  858. data/spec/support/models/jar.rb +9 -0
  859. data/spec/support/models/kaleidoscope.rb +8 -0
  860. data/spec/support/models/kangaroo.rb +6 -0
  861. data/spec/support/models/label.rb +50 -0
  862. data/spec/support/models/language.rb +7 -0
  863. data/spec/support/models/lat_lng.rb +17 -0
  864. data/spec/support/models/league.rb +13 -0
  865. data/spec/support/models/learner.rb +4 -0
  866. data/spec/support/models/line_item.rb +8 -0
  867. data/spec/support/models/location.rb +10 -0
  868. data/spec/support/models/login.rb +10 -0
  869. data/spec/support/models/manufacturer.rb +9 -0
  870. data/spec/support/models/meat.rb +6 -0
  871. data/spec/support/models/membership.rb +6 -0
  872. data/spec/support/models/message.rb +13 -0
  873. data/spec/support/models/minim.rb +6 -0
  874. data/spec/support/models/mixed_drink.rb +6 -0
  875. data/spec/support/models/mop.rb +24 -0
  876. data/spec/support/models/movie.rb +15 -0
  877. data/spec/support/models/my_hash.rb +4 -0
  878. data/spec/support/models/name.rb +26 -0
  879. data/spec/support/models/name_only.rb +8 -0
  880. data/spec/support/models/node.rb +7 -0
  881. data/spec/support/models/note.rb +19 -0
  882. data/spec/support/models/nut.rb +7 -0
  883. data/spec/support/models/odd.rb +9 -0
  884. data/spec/support/models/order.rb +12 -0
  885. data/spec/support/models/ordered_post.rb +13 -0
  886. data/spec/support/models/ordered_preference.rb +8 -0
  887. data/spec/support/models/oscar.rb +16 -0
  888. data/spec/support/models/other_owner_object.rb +4 -0
  889. data/spec/support/models/override.rb +18 -0
  890. data/spec/support/models/ownable.rb +8 -0
  891. data/spec/support/models/owner.rb +10 -0
  892. data/spec/support/models/pack.rb +5 -0
  893. data/spec/support/models/page.rb +18 -0
  894. data/spec/support/models/page_question.rb +6 -0
  895. data/spec/support/models/palette.rb +9 -0
  896. data/spec/support/models/parent.rb +7 -0
  897. data/spec/support/models/parent_doc.rb +8 -0
  898. data/spec/support/models/passport.rb +13 -0
  899. data/spec/support/models/patient.rb +11 -0
  900. data/spec/support/models/pdf_writer.rb +5 -0
  901. data/spec/support/models/pencil.rb +3 -0
  902. data/spec/support/models/person.rb +230 -0
  903. data/spec/support/models/pet.rb +25 -0
  904. data/spec/support/models/pet_owner.rb +8 -0
  905. data/spec/support/models/phone.rb +13 -0
  906. data/spec/support/models/piano.rb +4 -0
  907. data/spec/support/models/pizza.rb +9 -0
  908. data/spec/support/models/player.rb +37 -0
  909. data/spec/support/models/post.rb +52 -0
  910. data/spec/support/models/post_genre.rb +8 -0
  911. data/spec/support/models/powerup.rb +13 -0
  912. data/spec/support/models/preference.rb +11 -0
  913. data/spec/support/models/princess.rb +12 -0
  914. data/spec/support/models/product.rb +19 -0
  915. data/spec/support/models/profile.rb +17 -0
  916. data/spec/support/models/pronunciation.rb +7 -0
  917. data/spec/support/models/pub.rb +8 -0
  918. data/spec/support/models/publication/encyclopedia.rb +11 -0
  919. data/spec/support/models/publication/review.rb +13 -0
  920. data/spec/support/models/publication.rb +4 -0
  921. data/spec/support/models/purchase.rb +6 -0
  922. data/spec/support/models/purchased_item.rb +10 -0
  923. data/spec/support/models/question.rb +10 -0
  924. data/spec/support/models/quiz.rb +9 -0
  925. data/spec/support/models/rating.rb +10 -0
  926. data/spec/support/models/record.rb +54 -0
  927. data/spec/support/models/registry.rb +6 -0
  928. data/spec/support/models/role.rb +9 -0
  929. data/spec/support/models/root_category.rb +6 -0
  930. data/spec/support/models/sandwich.rb +11 -0
  931. data/spec/support/models/scheduler.rb +9 -0
  932. data/spec/support/models/scribe.rb +7 -0
  933. data/spec/support/models/sealer.rb +7 -0
  934. data/spec/support/models/seat.rb +24 -0
  935. data/spec/support/models/seo.rb +9 -0
  936. data/spec/support/models/series.rb +7 -0
  937. data/spec/support/models/server.rb +15 -0
  938. data/spec/support/models/service.rb +24 -0
  939. data/spec/support/models/shape.rb +14 -0
  940. data/spec/support/models/shelf.rb +7 -0
  941. data/spec/support/models/shipment_address.rb +5 -0
  942. data/spec/support/models/shipping_container.rb +7 -0
  943. data/spec/support/models/shipping_pack.rb +5 -0
  944. data/spec/support/models/shirt.rb +11 -0
  945. data/spec/support/models/shop.rb +8 -0
  946. data/spec/support/models/short_agent.rb +6 -0
  947. data/spec/support/models/short_quiz.rb +7 -0
  948. data/spec/support/models/simple.rb +7 -0
  949. data/spec/support/models/slave.rb +8 -0
  950. data/spec/support/models/song.rb +10 -0
  951. data/spec/support/models/sound.rb +7 -0
  952. data/spec/support/models/spacer.rb +7 -0
  953. data/spec/support/models/square.rb +6 -0
  954. data/spec/support/models/staff.rb +9 -0
  955. data/spec/support/models/store_as_dup_test1.rb +7 -0
  956. data/spec/support/models/store_as_dup_test2.rb +7 -0
  957. data/spec/support/models/store_as_dup_test3.rb +7 -0
  958. data/spec/support/models/store_as_dup_test4.rb +7 -0
  959. data/spec/support/models/strategy.rb +5 -0
  960. data/spec/support/models/sub_item.rb +5 -0
  961. data/spec/support/models/subscription.rb +7 -0
  962. data/spec/support/models/survey.rb +7 -0
  963. data/spec/support/models/symptom.rb +8 -0
  964. data/spec/support/models/system_role.rb +7 -0
  965. data/spec/support/models/tag.rb +10 -0
  966. data/spec/support/models/target.rb +7 -0
  967. data/spec/support/models/template.rb +7 -0
  968. data/spec/support/models/thing.rb +11 -0
  969. data/spec/support/models/threadlocker.rb +7 -0
  970. data/spec/support/models/title.rb +5 -0
  971. data/spec/support/models/tool.rb +10 -0
  972. data/spec/support/models/topping.rb +7 -0
  973. data/spec/support/models/toy.rb +9 -0
  974. data/spec/support/models/track.rb +40 -0
  975. data/spec/support/models/translation.rb +7 -0
  976. data/spec/support/models/tree.rb +11 -0
  977. data/spec/support/models/truck.rb +7 -0
  978. data/spec/support/models/updatable.rb +7 -0
  979. data/spec/support/models/user.rb +23 -0
  980. data/spec/support/models/user_account.rb +12 -0
  981. data/spec/support/models/validation_callback.rb +12 -0
  982. data/spec/support/models/vehicle.rb +18 -0
  983. data/spec/support/models/version.rb +7 -0
  984. data/spec/support/models/vertex.rb +8 -0
  985. data/spec/support/models/vet_visit.rb +7 -0
  986. data/spec/support/models/video.rb +15 -0
  987. data/spec/support/models/video_game.rb +3 -0
  988. data/spec/support/models/washer.rb +7 -0
  989. data/spec/support/models/weapon.rb +13 -0
  990. data/spec/support/models/wiki_page.rb +17 -0
  991. data/spec/support/models/word.rb +17 -0
  992. data/spec/support/models/word_origin.rb +13 -0
  993. data/spec/support/models/writer.rb +13 -0
  994. data/spec/support/shared/time.rb +53 -0
  995. data/spec/support/spec_config.rb +60 -0
  996. data.tar.gz.sig +0 -0
  997. metadata +1347 -813
  998. metadata.gz.sig +0 -0
  999. data/lib/mongoid/clients/thread_options.rb +0 -19
  1000. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  1001. data/lib/mongoid/matchable/all.rb +0 -27
  1002. data/lib/mongoid/matchable/and.rb +0 -30
  1003. data/lib/mongoid/matchable/default.rb +0 -72
  1004. data/lib/mongoid/matchable/exists.rb +0 -23
  1005. data/lib/mongoid/matchable/gt.rb +0 -21
  1006. data/lib/mongoid/matchable/gte.rb +0 -21
  1007. data/lib/mongoid/matchable/in.rb +0 -24
  1008. data/lib/mongoid/matchable/lt.rb +0 -21
  1009. data/lib/mongoid/matchable/lte.rb +0 -21
  1010. data/lib/mongoid/matchable/ne.rb +0 -21
  1011. data/lib/mongoid/matchable/nin.rb +0 -22
  1012. data/lib/mongoid/matchable/or.rb +0 -33
  1013. data/lib/mongoid/matchable/regexp.rb +0 -27
  1014. data/lib/mongoid/matchable/size.rb +0 -21
  1015. data/lib/mongoid/railties/document.rb +0 -12
  1016. data/lib/mongoid/relations/accessors.rb +0 -264
  1017. data/lib/mongoid/relations/auto_save.rb +0 -86
  1018. data/lib/mongoid/relations/binding.rb +0 -218
  1019. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  1020. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -43
  1021. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -45
  1022. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  1023. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -38
  1024. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  1025. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1026. data/lib/mongoid/relations/bindings.rb +0 -9
  1027. data/lib/mongoid/relations/builder.rb +0 -57
  1028. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1029. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1030. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1031. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  1032. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -126
  1033. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1034. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  1035. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  1036. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1037. data/lib/mongoid/relations/builders.rb +0 -106
  1038. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1039. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1040. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1041. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1042. data/lib/mongoid/relations/cascading.rb +0 -56
  1043. data/lib/mongoid/relations/constraint.rb +0 -55
  1044. data/lib/mongoid/relations/conversions.rb +0 -34
  1045. data/lib/mongoid/relations/counter_cache.rb +0 -150
  1046. data/lib/mongoid/relations/cyclic.rb +0 -107
  1047. data/lib/mongoid/relations/eager/base.rb +0 -153
  1048. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  1049. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  1050. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  1051. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  1052. data/lib/mongoid/relations/eager.rb +0 -41
  1053. data/lib/mongoid/relations/embedded/batchable.rb +0 -382
  1054. data/lib/mongoid/relations/embedded/in.rb +0 -229
  1055. data/lib/mongoid/relations/embedded/many.rb +0 -642
  1056. data/lib/mongoid/relations/embedded/one.rb +0 -222
  1057. data/lib/mongoid/relations/macros.rb +0 -359
  1058. data/lib/mongoid/relations/many.rb +0 -238
  1059. data/lib/mongoid/relations/marshalable.rb +0 -32
  1060. data/lib/mongoid/relations/metadata.rb +0 -1179
  1061. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1062. data/lib/mongoid/relations/one.rb +0 -60
  1063. data/lib/mongoid/relations/options.rb +0 -49
  1064. data/lib/mongoid/relations/polymorphic.rb +0 -39
  1065. data/lib/mongoid/relations/proxy.rb +0 -245
  1066. data/lib/mongoid/relations/referenced/in.rb +0 -295
  1067. data/lib/mongoid/relations/referenced/many.rb +0 -808
  1068. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -472
  1069. data/lib/mongoid/relations/referenced/one.rb +0 -276
  1070. data/lib/mongoid/relations/reflections.rb +0 -64
  1071. data/lib/mongoid/relations/synchronization.rb +0 -169
  1072. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  1073. data/lib/mongoid/relations/targets.rb +0 -2
  1074. data/lib/mongoid/relations/touchable.rb +0 -94
  1075. data/lib/mongoid/relations.rb +0 -148
  1076. data/lib/support/ruby_version.rb +0 -26
  1077. data/spec/app/models/account.rb +0 -36
  1078. data/spec/app/models/acolyte.rb +0 -17
  1079. data/spec/app/models/actor.rb +0 -18
  1080. data/spec/app/models/actress.rb +0 -2
  1081. data/spec/app/models/address.rb +0 -79
  1082. data/spec/app/models/address_component.rb +0 -5
  1083. data/spec/app/models/address_number.rb +0 -6
  1084. data/spec/app/models/agency.rb +0 -5
  1085. data/spec/app/models/agent.rb +0 -14
  1086. data/spec/app/models/album.rb +0 -14
  1087. data/spec/app/models/alert.rb +0 -7
  1088. data/spec/app/models/animal.rb +0 -25
  1089. data/spec/app/models/answer.rb +0 -6
  1090. data/spec/app/models/appointment.rb +0 -7
  1091. data/spec/app/models/article.rb +0 -12
  1092. data/spec/app/models/artist.rb +0 -66
  1093. data/spec/app/models/artwork.rb +0 -4
  1094. data/spec/app/models/audio.rb +0 -5
  1095. data/spec/app/models/augmentation.rb +0 -11
  1096. data/spec/app/models/author.rb +0 -6
  1097. data/spec/app/models/baby.rb +0 -4
  1098. data/spec/app/models/band.rb +0 -28
  1099. data/spec/app/models/bar.rb +0 -10
  1100. data/spec/app/models/basic.rb +0 -6
  1101. data/spec/app/models/bed.rb +0 -1
  1102. data/spec/app/models/big_palette.rb +0 -2
  1103. data/spec/app/models/birthday.rb +0 -13
  1104. data/spec/app/models/bomb.rb +0 -4
  1105. data/spec/app/models/book.rb +0 -15
  1106. data/spec/app/models/breed.rb +0 -4
  1107. data/spec/app/models/browser.rb +0 -6
  1108. data/spec/app/models/building.rb +0 -6
  1109. data/spec/app/models/building_address.rb +0 -7
  1110. data/spec/app/models/bus.rb +0 -7
  1111. data/spec/app/models/business.rb +0 -5
  1112. data/spec/app/models/callback_test.rb +0 -9
  1113. data/spec/app/models/canvas.rb +0 -25
  1114. data/spec/app/models/car.rb +0 -1
  1115. data/spec/app/models/cat.rb +0 -8
  1116. data/spec/app/models/category.rb +0 -8
  1117. data/spec/app/models/child.rb +0 -4
  1118. data/spec/app/models/child_doc.rb +0 -22
  1119. data/spec/app/models/church.rb +0 -6
  1120. data/spec/app/models/circle.rb +0 -3
  1121. data/spec/app/models/circuit.rb +0 -4
  1122. data/spec/app/models/circus.rb +0 -7
  1123. data/spec/app/models/code.rb +0 -11
  1124. data/spec/app/models/comment.rb +0 -16
  1125. data/spec/app/models/company.rb +0 -5
  1126. data/spec/app/models/consumption_period.rb +0 -7
  1127. data/spec/app/models/contextable_item.rb +0 -5
  1128. data/spec/app/models/contractor.rb +0 -5
  1129. data/spec/app/models/cookie.rb +0 -6
  1130. data/spec/app/models/country_code.rb +0 -8
  1131. data/spec/app/models/courier_job.rb +0 -4
  1132. data/spec/app/models/definition.rb +0 -9
  1133. data/spec/app/models/description.rb +0 -11
  1134. data/spec/app/models/dictionary.rb +0 -10
  1135. data/spec/app/models/division.rb +0 -10
  1136. data/spec/app/models/doctor.rb +0 -12
  1137. data/spec/app/models/dog.rb +0 -7
  1138. data/spec/app/models/dokument.rb +0 -5
  1139. data/spec/app/models/draft.rb +0 -9
  1140. data/spec/app/models/dragon.rb +0 -4
  1141. data/spec/app/models/driver.rb +0 -7
  1142. data/spec/app/models/drug.rb +0 -6
  1143. data/spec/app/models/dungeon.rb +0 -4
  1144. data/spec/app/models/edit.rb +0 -5
  1145. data/spec/app/models/email.rb +0 -6
  1146. data/spec/app/models/employer.rb +0 -5
  1147. data/spec/app/models/entry.rb +0 -6
  1148. data/spec/app/models/eraser.rb +0 -1
  1149. data/spec/app/models/even.rb +0 -7
  1150. data/spec/app/models/event.rb +0 -22
  1151. data/spec/app/models/exhibition.rb +0 -4
  1152. data/spec/app/models/exhibitor.rb +0 -6
  1153. data/spec/app/models/explosion.rb +0 -4
  1154. data/spec/app/models/eye.rb +0 -9
  1155. data/spec/app/models/eye_bowl.rb +0 -9
  1156. data/spec/app/models/face.rb +0 -8
  1157. data/spec/app/models/favorite.rb +0 -6
  1158. data/spec/app/models/filesystem.rb +0 -5
  1159. data/spec/app/models/fire_hydrant.rb +0 -6
  1160. data/spec/app/models/firefox.rb +0 -4
  1161. data/spec/app/models/fish.rb +0 -7
  1162. data/spec/app/models/folder.rb +0 -7
  1163. data/spec/app/models/folder_item.rb +0 -9
  1164. data/spec/app/models/fruits.rb +0 -34
  1165. data/spec/app/models/game.rb +0 -19
  1166. data/spec/app/models/ghost.rb +0 -7
  1167. data/spec/app/models/home.rb +0 -4
  1168. data/spec/app/models/house.rb +0 -6
  1169. data/spec/app/models/html_writer.rb +0 -3
  1170. data/spec/app/models/id_key.rb +0 -6
  1171. data/spec/app/models/image.rb +0 -22
  1172. data/spec/app/models/implant.rb +0 -16
  1173. data/spec/app/models/item.rb +0 -8
  1174. data/spec/app/models/jar.rb +0 -7
  1175. data/spec/app/models/kaleidoscope.rb +0 -6
  1176. data/spec/app/models/kangaroo.rb +0 -4
  1177. data/spec/app/models/label.rb +0 -47
  1178. data/spec/app/models/language.rb +0 -5
  1179. data/spec/app/models/lat_lng.rb +0 -15
  1180. data/spec/app/models/league.rb +0 -11
  1181. data/spec/app/models/learner.rb +0 -2
  1182. data/spec/app/models/line_item.rb +0 -6
  1183. data/spec/app/models/location.rb +0 -8
  1184. data/spec/app/models/login.rb +0 -8
  1185. data/spec/app/models/manufacturer.rb +0 -7
  1186. data/spec/app/models/meat.rb +0 -4
  1187. data/spec/app/models/membership.rb +0 -4
  1188. data/spec/app/models/message.rb +0 -11
  1189. data/spec/app/models/mixed_drink.rb +0 -4
  1190. data/spec/app/models/movie.rb +0 -13
  1191. data/spec/app/models/my_hash.rb +0 -2
  1192. data/spec/app/models/name.rb +0 -24
  1193. data/spec/app/models/node.rb +0 -5
  1194. data/spec/app/models/note.rb +0 -17
  1195. data/spec/app/models/odd.rb +0 -7
  1196. data/spec/app/models/ordered_post.rb +0 -6
  1197. data/spec/app/models/ordered_preference.rb +0 -6
  1198. data/spec/app/models/oscar.rb +0 -15
  1199. data/spec/app/models/override.rb +0 -16
  1200. data/spec/app/models/ownable.rb +0 -6
  1201. data/spec/app/models/owner.rb +0 -6
  1202. data/spec/app/models/pack.rb +0 -3
  1203. data/spec/app/models/page.rb +0 -16
  1204. data/spec/app/models/page_question.rb +0 -4
  1205. data/spec/app/models/palette.rb +0 -7
  1206. data/spec/app/models/parent.rb +0 -5
  1207. data/spec/app/models/parent_doc.rb +0 -6
  1208. data/spec/app/models/passport.rb +0 -5
  1209. data/spec/app/models/patient.rb +0 -9
  1210. data/spec/app/models/pdf_writer.rb +0 -3
  1211. data/spec/app/models/pencil.rb +0 -1
  1212. data/spec/app/models/person.rb +0 -207
  1213. data/spec/app/models/pet.rb +0 -23
  1214. data/spec/app/models/pet_owner.rb +0 -6
  1215. data/spec/app/models/phone.rb +0 -9
  1216. data/spec/app/models/pizza.rb +0 -7
  1217. data/spec/app/models/player.rb +0 -35
  1218. data/spec/app/models/post.rb +0 -50
  1219. data/spec/app/models/post_genre.rb +0 -6
  1220. data/spec/app/models/powerup.rb +0 -11
  1221. data/spec/app/models/preference.rb +0 -9
  1222. data/spec/app/models/princess.rb +0 -8
  1223. data/spec/app/models/product.rb +0 -17
  1224. data/spec/app/models/profile.rb +0 -5
  1225. data/spec/app/models/pronunciation.rb +0 -5
  1226. data/spec/app/models/pub.rb +0 -6
  1227. data/spec/app/models/purchase.rb +0 -4
  1228. data/spec/app/models/question.rb +0 -8
  1229. data/spec/app/models/quiz.rb +0 -7
  1230. data/spec/app/models/rating.rb +0 -8
  1231. data/spec/app/models/record.rb +0 -51
  1232. data/spec/app/models/registry.rb +0 -4
  1233. data/spec/app/models/role.rb +0 -7
  1234. data/spec/app/models/root_category.rb +0 -4
  1235. data/spec/app/models/sandwich.rb +0 -9
  1236. data/spec/app/models/scheduler.rb +0 -7
  1237. data/spec/app/models/seo.rb +0 -7
  1238. data/spec/app/models/series.rb +0 -4
  1239. data/spec/app/models/server.rb +0 -13
  1240. data/spec/app/models/service.rb +0 -22
  1241. data/spec/app/models/shape.rb +0 -12
  1242. data/spec/app/models/shelf.rb +0 -5
  1243. data/spec/app/models/shipment_address.rb +0 -2
  1244. data/spec/app/models/shipping_container.rb +0 -5
  1245. data/spec/app/models/shipping_pack.rb +0 -3
  1246. data/spec/app/models/shop.rb +0 -6
  1247. data/spec/app/models/short_agent.rb +0 -4
  1248. data/spec/app/models/short_quiz.rb +0 -5
  1249. data/spec/app/models/simple.rb +0 -5
  1250. data/spec/app/models/slave.rb +0 -6
  1251. data/spec/app/models/song.rb +0 -8
  1252. data/spec/app/models/sound.rb +0 -5
  1253. data/spec/app/models/square.rb +0 -4
  1254. data/spec/app/models/staff.rb +0 -7
  1255. data/spec/app/models/store_as_dup_test1.rb +0 -5
  1256. data/spec/app/models/store_as_dup_test2.rb +0 -5
  1257. data/spec/app/models/strategy.rb +0 -3
  1258. data/spec/app/models/sub_item.rb +0 -3
  1259. data/spec/app/models/subscription.rb +0 -4
  1260. data/spec/app/models/survey.rb +0 -5
  1261. data/spec/app/models/symptom.rb +0 -6
  1262. data/spec/app/models/tag.rb +0 -8
  1263. data/spec/app/models/target.rb +0 -5
  1264. data/spec/app/models/template.rb +0 -5
  1265. data/spec/app/models/thing.rb +0 -9
  1266. data/spec/app/models/title.rb +0 -3
  1267. data/spec/app/models/tool.rb +0 -8
  1268. data/spec/app/models/topping.rb +0 -5
  1269. data/spec/app/models/track.rb +0 -38
  1270. data/spec/app/models/translation.rb +0 -5
  1271. data/spec/app/models/tree.rb +0 -9
  1272. data/spec/app/models/truck.rb +0 -3
  1273. data/spec/app/models/user.rb +0 -21
  1274. data/spec/app/models/user_account.rb +0 -10
  1275. data/spec/app/models/validation_callback.rb +0 -10
  1276. data/spec/app/models/vehicle.rb +0 -11
  1277. data/spec/app/models/version.rb +0 -5
  1278. data/spec/app/models/vet_visit.rb +0 -5
  1279. data/spec/app/models/video.rb +0 -13
  1280. data/spec/app/models/video_game.rb +0 -1
  1281. data/spec/app/models/weapon.rb +0 -11
  1282. data/spec/app/models/wiki_page.rb +0 -14
  1283. data/spec/app/models/word.rb +0 -15
  1284. data/spec/app/models/word_origin.rb +0 -11
  1285. data/spec/app/models/writer.rb +0 -11
  1286. data/spec/mongoid/extensions/origin/regexp_raw_spec.rb +0 -89
  1287. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1288. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1289. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1290. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1291. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1292. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1293. data/spec/mongoid/matchable/gt_spec.rb +0 -75
  1294. data/spec/mongoid/matchable/gte_spec.rb +0 -74
  1295. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1296. data/spec/mongoid/matchable/lt_spec.rb +0 -74
  1297. data/spec/mongoid/matchable/lte_spec.rb +0 -74
  1298. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1299. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1300. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1301. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1302. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1303. data/spec/mongoid/matchable_spec.rb +0 -708
  1304. data/spec/mongoid/railties/document_spec.rb +0 -24
  1305. data/spec/mongoid/relations/accessors_spec.rb +0 -821
  1306. data/spec/mongoid/relations/auto_save_spec.rb +0 -281
  1307. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1308. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1309. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1310. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1311. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1312. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1313. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1314. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1315. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1316. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1317. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -233
  1318. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1319. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -230
  1320. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1321. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1322. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  1323. data/spec/mongoid/relations/builders_spec.rb +0 -226
  1324. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1325. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1326. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1327. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1328. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1329. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  1330. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  1331. data/spec/mongoid/relations/counter_cache_spec.rb +0 -389
  1332. data/spec/mongoid/relations/cyclic_spec.rb +0 -178
  1333. data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
  1334. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +0 -117
  1335. data/spec/mongoid/relations/eager/has_many_spec.rb +0 -244
  1336. data/spec/mongoid/relations/eager/has_one_spec.rb +0 -163
  1337. data/spec/mongoid/relations/eager_spec.rb +0 -239
  1338. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1339. data/spec/mongoid/relations/embedded/in_spec.rb +0 -579
  1340. data/spec/mongoid/relations/embedded/many_spec.rb +0 -4166
  1341. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1067
  1342. data/spec/mongoid/relations/macros_spec.rb +0 -631
  1343. data/spec/mongoid/relations/metadata_spec.rb +0 -1971
  1344. data/spec/mongoid/relations/options_spec.rb +0 -35
  1345. data/spec/mongoid/relations/polymorphic_spec.rb +0 -128
  1346. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1326
  1347. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3806
  1348. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3589
  1349. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1240
  1350. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1351. data/spec/mongoid/relations/synchronization_spec.rb +0 -449
  1352. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1717
  1353. data/spec/mongoid/relations/touchable_spec.rb +0 -362
  1354. data/spec/mongoid/relations_spec.rb +0 -189
@@ -0,0 +1,2046 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require_relative './has_one_models'
5
+
6
+ describe Mongoid::Association::Referenced::BelongsTo do
7
+
8
+ before do
9
+ class OwnerObject; include Mongoid::Document; end
10
+ class BelongingObject; include Mongoid::Document; end
11
+ end
12
+
13
+ after do
14
+ Object.send(:remove_const, :BelongingObject)
15
+ Object.send(:remove_const, :OwnerObject)
16
+ end
17
+
18
+ let(:belonging_class) do
19
+ BelongingObject
20
+ end
21
+
22
+ let(:name) do
23
+ :owner_object
24
+ end
25
+
26
+ let(:association) do
27
+ belonging_class.belongs_to name, options
28
+ end
29
+
30
+ let(:options) do
31
+ { }
32
+ end
33
+
34
+ describe '#relation_complements' do
35
+
36
+ let(:expected_complements) do
37
+ [
38
+ Mongoid::Association::Referenced::HasMany,
39
+ Mongoid::Association::Referenced::HasOne
40
+ ]
41
+ end
42
+
43
+ it 'returns the relation complements' do
44
+ expect(association.relation_complements).to eq(expected_complements)
45
+ end
46
+ end
47
+
48
+ describe '#setup!' do
49
+
50
+ it 'sets up a getter for the relation' do
51
+ expect(Mongoid::Association::Accessors).to receive(:define_getter!).with(association)
52
+ association.setup!
53
+ end
54
+
55
+ it 'sets up a setter for the relation' do
56
+ expect(Mongoid::Association::Accessors).to receive(:define_setter!).with(association)
57
+ association.setup!
58
+ end
59
+
60
+ it 'sets up an existence check for the relation' do
61
+ expect(Mongoid::Association::Accessors).to receive(:define_existence_check!).with(association)
62
+ association.setup!
63
+ end
64
+
65
+ it 'sets up the builder for the relation' do
66
+ expect(Mongoid::Association::Builders).to receive(:define_builder!).with(association)
67
+ association.setup!
68
+ end
69
+
70
+ it 'sets up the creator for the relation' do
71
+ expect(Mongoid::Association::Builders).to receive(:define_creator!).with(association)
72
+ association.setup!
73
+ end
74
+
75
+ context 'autosave' do
76
+
77
+ context 'when the :autosave option is true' do
78
+
79
+ let(:options) do
80
+ {
81
+ autosave: true
82
+ }
83
+ end
84
+
85
+ let(:association) do
86
+ # Note that it is necessary to create the association directly, otherwise the
87
+ # setup!! method will be called by the :belongs_to macro
88
+ described_class.new(belonging_class, name, options)
89
+ end
90
+
91
+ it 'sets up autosave' do
92
+ expect(Mongoid::Association::Referenced::AutoSave).to receive(:define_autosave!).with(association)
93
+ association.setup!
94
+ end
95
+ end
96
+
97
+ context 'when the :autosave option is false' do
98
+
99
+ let(:options) do
100
+ {
101
+ autosave: false
102
+ }
103
+ end
104
+
105
+ it 'does not set up autosave' do
106
+ expect(Mongoid::Association::Referenced::AutoSave).not_to receive(:define_autosave!)
107
+ association.setup!
108
+ end
109
+ end
110
+
111
+ context 'when the :autosave option is not provided' do
112
+
113
+ let(:association) do
114
+ # Note that it is necessary to create the association directly, otherwise the
115
+ # setup!! method will be called by the :embeds_many macro
116
+ described_class.new(belonging_class, name, options)
117
+ end
118
+
119
+ it 'does not set up autosave' do
120
+ expect(Mongoid::Association::Referenced::AutoSave).not_to receive(:define_autosave!)
121
+ association.setup!
122
+ end
123
+ end
124
+ end
125
+
126
+ context 'counter cache callbacks' do
127
+
128
+ context 'when the :counter_cache option is true' do
129
+
130
+ let(:options) do
131
+ {
132
+ counter_cache: true
133
+ }
134
+ end
135
+
136
+ let(:association) do
137
+ # Note that it is necessary to create the association directly, otherwise the
138
+ # setup! method will be called by the :belongs_to macro
139
+ described_class.new(belonging_class, name, options)
140
+ end
141
+
142
+ it 'sets up counter cache callbacks' do
143
+ expect(Mongoid::Association::Referenced::CounterCache).to receive(:define_callbacks!).with(association)
144
+ association.setup!
145
+ end
146
+ end
147
+
148
+ context 'when the :counter_cache option is a String' do
149
+
150
+ let(:options) do
151
+ {
152
+ counter_cache: 'counts_field'
153
+ }
154
+ end
155
+
156
+ let(:association) do
157
+ # Note that it is necessary to create the association directly, otherwise the
158
+ # setup! method will be called by the :belongs_to macro
159
+ described_class.new(belonging_class, name, options)
160
+ end
161
+
162
+ it 'sets up counter cache callbacks' do
163
+ expect(Mongoid::Association::Referenced::CounterCache).to receive(:define_callbacks!).with(association)
164
+ association.setup!
165
+ end
166
+ end
167
+
168
+ context 'when the :counter_cache option is false' do
169
+
170
+ let(:options) do
171
+ {
172
+ counter_cache: false
173
+ }
174
+ end
175
+
176
+ it 'does not set up counter cache callbacks' do
177
+ expect(Mongoid::Association::Referenced::CounterCache).not_to receive(:define_callbacks!)
178
+ association.setup!
179
+ end
180
+ end
181
+
182
+ context 'when the :counter_cache option is not provided' do
183
+
184
+ let(:association) do
185
+ # Note that it is necessary to create the association directly, otherwise the
186
+ # setup! method will be called by the :embeds_many macro
187
+ described_class.new(belonging_class, name, options)
188
+ end
189
+
190
+ it 'does not set up counter cache callbacks' do
191
+ expect(Mongoid::Association::Referenced::CounterCache).not_to receive(:define_callbacks!)
192
+ association.setup!
193
+ end
194
+ end
195
+ end
196
+
197
+ context 'polymorphic' do
198
+
199
+ context 'when the polymorphic option is provided' do
200
+
201
+ context 'when the polymorphic option is true' do
202
+
203
+ let(:options) do
204
+ {
205
+ polymorphic: true
206
+ }
207
+ end
208
+
209
+ before do
210
+ association
211
+ end
212
+
213
+ it 'set the polymorphic attribute on the owner class' do
214
+ expect(belonging_class.polymorphic).to be(true)
215
+ end
216
+
217
+ it 'sets up a field for the inverse type' do
218
+ expect(belonging_class.fields.keys).to include(association.inverse_type)
219
+ end
220
+ end
221
+
222
+ context 'when the polymorphic option is false' do
223
+
224
+ let(:options) do
225
+ {
226
+ polymorphic: false
227
+ }
228
+ end
229
+
230
+ it 'does not set the polymorphic attribute on the owner class' do
231
+ expect(belonging_class.polymorphic).to be(false)
232
+ end
233
+
234
+ it 'does not set up a field for the inverse type' do
235
+ expect(belonging_class.fields.keys).not_to include(association.inverse_type)
236
+ end
237
+ end
238
+ end
239
+
240
+ context 'when the polymorphic option is not provided' do
241
+
242
+ it 'does not set the polymorphic attribute on the owner class' do
243
+ expect(belonging_class.polymorphic).to be(false)
244
+ end
245
+
246
+ it 'does not set up a field for the inverse type' do
247
+ expect(belonging_class.fields.keys).not_to include(association.inverse_type)
248
+ end
249
+ end
250
+ end
251
+
252
+ context 'dependent' do
253
+
254
+ context 'when the dependent option is provided' do
255
+
256
+ context 'when the dependent option is :delete_all' do
257
+
258
+ let(:options) do
259
+ {
260
+ dependent: :delete_all
261
+ }
262
+ end
263
+
264
+ let(:association) do
265
+ # Note that it is necessary to create the association directly, otherwise the
266
+ # setup! method will be called by the :belongs_to macro
267
+ described_class.new(belonging_class, name, options)
268
+ end
269
+
270
+ it 'sets up the dependency' do
271
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
272
+ association.setup!
273
+ end
274
+ end
275
+
276
+ context 'when the dependent option is :destroy' do
277
+
278
+ let(:options) do
279
+ {
280
+ dependent: :destroy
281
+ }
282
+ end
283
+
284
+ let(:association) do
285
+ # Note that it is necessary to create the association directly, otherwise the
286
+ # setup! method will be called by the :belongs_to macro
287
+ described_class.new(belonging_class, name, options)
288
+ end
289
+
290
+ it 'sets up the dependency' do
291
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
292
+ association.setup!
293
+ end
294
+ end
295
+
296
+ context 'when the dependent option is :nullify' do
297
+
298
+ let(:options) do
299
+ {
300
+ dependent: :nullify
301
+ }
302
+ end
303
+
304
+ let(:association) do
305
+ # Note that it is necessary to create the association directly, otherwise the
306
+ # setup! method will be called by the :belongs_to macro
307
+ described_class.new(belonging_class, name, options)
308
+ end
309
+
310
+ it 'sets up the dependency' do
311
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
312
+ association.setup!
313
+ end
314
+ end
315
+
316
+ context 'when the dependent option is :restrict_with_exception' do
317
+
318
+ let(:options) do
319
+ {
320
+ dependent: :restrict_with_exception
321
+ }
322
+ end
323
+
324
+ let(:association) do
325
+ # Note that it is necessary to create the association directly, otherwise the
326
+ # setup! method will be called by the :belongs_to macro
327
+ described_class.new(belonging_class, name, options)
328
+ end
329
+
330
+ it 'sets up the dependency' do
331
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
332
+ association.setup!
333
+ end
334
+ end
335
+
336
+ context 'when the dependent option is :restrict_with_error' do
337
+
338
+ let(:options) do
339
+ {
340
+ dependent: :restrict_with_error
341
+ }
342
+ end
343
+
344
+ let(:association) do
345
+ # Note that it is necessary to create the association directly, otherwise the
346
+ # setup! method will be called by the :belongs_to macro
347
+ described_class.new(belonging_class, name, options)
348
+ end
349
+
350
+ it 'sets up the dependency' do
351
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
352
+ association.setup!
353
+ end
354
+ end
355
+ end
356
+
357
+ context 'when the dependent option is not provided' do
358
+
359
+ it 'does not set up the dependency' do
360
+ expect(Mongoid::Association::Depending).not_to receive(:define_dependency!)
361
+ association.setup!
362
+ end
363
+ end
364
+ end
365
+
366
+ context 'foreign key field' do
367
+
368
+ before do
369
+ association
370
+ end
371
+
372
+ it 'sets up the foreign key field' do
373
+ expect(belonging_class.fields.keys).to include(association.foreign_key)
374
+ end
375
+ end
376
+
377
+ context 'index' do
378
+
379
+ before do
380
+ association
381
+ end
382
+
383
+ context 'when index is true' do
384
+
385
+ context 'when polymorphic' do
386
+
387
+ let(:options) do
388
+ {
389
+ polymorphic: true,
390
+ index: true
391
+ }
392
+ end
393
+
394
+ it 'sets up the index with the key and inverse type' do
395
+ expect(belonging_class.index_specifications.first.fields).to match_array([ association.key.to_sym,
396
+ association.inverse_type.to_sym])
397
+ end
398
+ end
399
+
400
+ context 'when not polymorphic' do
401
+
402
+ let(:options) do
403
+ {
404
+ index: true
405
+ }
406
+ end
407
+
408
+ it 'sets up the index with the key' do
409
+ expect(belonging_class.index_specifications.first.fields).to match_array([ association.key.to_sym ])
410
+ end
411
+ end
412
+ end
413
+
414
+ context 'when index is false' do
415
+
416
+ context 'when polymorphic' do
417
+
418
+ let(:options) do
419
+ {
420
+ polymorphic: true
421
+ }
422
+ end
423
+
424
+ it 'does not set up an index' do
425
+ expect(belonging_class.index_specifications).to eq([ ])
426
+ end
427
+ end
428
+
429
+ context 'when not polymorphic' do
430
+
431
+ it 'does not set up an index' do
432
+ expect(belonging_class.index_specifications).to eq([ ])
433
+ end
434
+ end
435
+ end
436
+ end
437
+
438
+ context 'touchable' do
439
+
440
+ context 'when the :touch option is true' do
441
+
442
+ let(:options) do
443
+ {
444
+ touch: true
445
+ }
446
+ end
447
+
448
+ let(:association) do
449
+ # Note that it is necessary to create the association directly, otherwise the
450
+ # setup! method will be called by the :belongs_to macro
451
+ described_class.new(belonging_class, name, options)
452
+ end
453
+
454
+ it 'sets up touch' do
455
+ expect(Mongoid::Touchable).to receive(:define_touchable!).with(association)
456
+ association.setup!
457
+ end
458
+ end
459
+
460
+ context 'when the :touch option is false' do
461
+
462
+ let(:options) do
463
+ {
464
+ touch: false
465
+ }
466
+ end
467
+
468
+ it 'does not set up touch' do
469
+ expect(Mongoid::Touchable).not_to receive(:define_touchable!).with(association)
470
+ association.setup!
471
+ end
472
+ end
473
+
474
+ context 'when the :touch option is not provided' do
475
+
476
+ let(:association) do
477
+ # Note that it is necessary to create the association directly, otherwise the
478
+ # setup! method will be called by the :embeds_many macro
479
+ described_class.new(belonging_class, name, options)
480
+ end
481
+
482
+ it 'does not set up touch' do
483
+ expect(Mongoid::Touchable).not_to receive(:define_touchable!).with(association)
484
+ association.setup!
485
+ end
486
+ end
487
+ end
488
+
489
+ context 'validate' do
490
+
491
+ context 'when the :validate option is true' do
492
+
493
+ let(:options) do
494
+ {
495
+ validate: true
496
+ }
497
+ end
498
+
499
+ let(:association) do
500
+ # Note that it is necessary to create the association directly, otherwise the
501
+ # setup! method will be called by the :belongs_to macro
502
+ described_class.new(belonging_class, name, options)
503
+ end
504
+
505
+ it 'sets up validation' do
506
+ expect(belonging_class).to receive(:validates_associated).with(name).and_call_original
507
+ association.setup!
508
+ end
509
+ end
510
+
511
+ context 'when the :validate option is false' do
512
+
513
+ let(:options) do
514
+ {
515
+ validate: false
516
+ }
517
+ end
518
+
519
+ it 'does not set up validation' do
520
+ expect(belonging_class).not_to receive(:validates_associated)
521
+ association.setup!
522
+ end
523
+ end
524
+
525
+ context 'when the :validate option is not provided' do
526
+
527
+ let(:association) do
528
+ # Note that it is necessary to create the association directly, otherwise the
529
+ # setup! method will be called by the :belongs_to macro
530
+ described_class.new(belonging_class, name, options)
531
+ end
532
+
533
+ it 'does not set up the validation because it uses the validation default (false)' do
534
+ expect(belonging_class).not_to receive(:validates_associated)
535
+ association.setup!
536
+ end
537
+ end
538
+ end
539
+
540
+ context 'presence of validation' do
541
+
542
+ let(:association) do
543
+ # Note that it is necessary to create the association directly, otherwise the
544
+ # setup! method will be called by the :belongs_to macro
545
+ described_class.new(belonging_class, name, options)
546
+ end
547
+
548
+ context 'when the global config option is true' do
549
+
550
+ around(:example) do |example|
551
+ original_config = Mongoid.belongs_to_required_by_default
552
+ Mongoid.belongs_to_required_by_default = true
553
+ example.run
554
+ Mongoid.belongs_to_required_by_default = original_config
555
+ end
556
+
557
+ let!(:original_required_config) do
558
+ Mongoid.belongs_to_required_by_default
559
+ end
560
+
561
+ context 'when the required option is true' do
562
+
563
+ let(:options) do
564
+ {
565
+ required: true
566
+ }
567
+ end
568
+
569
+ it 'sets up the presence of validation' do
570
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
571
+ association.setup!
572
+ end
573
+
574
+ context 'when the optional option is true' do
575
+
576
+ let(:options) do
577
+ {
578
+ required: true,
579
+ optional: true
580
+ }
581
+ end
582
+
583
+ it 'sets up the presence of validation' do
584
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
585
+ association.setup!
586
+ end
587
+ end
588
+
589
+ context 'when the optional option is false' do
590
+
591
+ let(:options) do
592
+ {
593
+ required: true,
594
+ optional: false
595
+ }
596
+ end
597
+
598
+ it 'sets up the presence of validation' do
599
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
600
+ association.setup!
601
+ end
602
+ end
603
+ end
604
+
605
+ context 'when the required option is false' do
606
+
607
+ let(:options) do
608
+ {
609
+ required: false
610
+ }
611
+ end
612
+
613
+ it 'does not set up the presence of validation' do
614
+ expect(belonging_class).not_to receive(:validates)
615
+ association.setup!
616
+ end
617
+
618
+ context 'when the optional option is true' do
619
+
620
+ let(:options) do
621
+ {
622
+ required: false,
623
+ optional: true
624
+ }
625
+ end
626
+
627
+ it 'does not set up the presence of validation' do
628
+ expect(belonging_class).not_to receive(:validates)
629
+ association.setup!
630
+ end
631
+ end
632
+
633
+ context 'when the optional option is false' do
634
+
635
+ let(:options) do
636
+ {
637
+ required: false,
638
+ optional: false
639
+ }
640
+ end
641
+
642
+ it 'does not set up the presence of validation' do
643
+ expect(belonging_class).not_to receive(:validates)
644
+ association.setup!
645
+ end
646
+ end
647
+ end
648
+
649
+ context 'when the required option is not provided' do
650
+
651
+ it 'uses the default and sets up the presence of validation' do
652
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
653
+ association.setup!
654
+ end
655
+
656
+ context 'when the optional option is true' do
657
+
658
+ let(:options) do
659
+ {
660
+ optional: true
661
+ }
662
+ end
663
+
664
+ it 'does not set up the presence of validation' do
665
+ expect(belonging_class).not_to receive(:validates)
666
+ association.setup!
667
+ end
668
+ end
669
+
670
+ context 'when the optional option is false' do
671
+
672
+ let(:options) do
673
+ {
674
+ optional: false
675
+ }
676
+ end
677
+
678
+ it 'sets up the presence of validation' do
679
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
680
+ association.setup!
681
+ end
682
+ end
683
+ end
684
+ end
685
+
686
+ context 'when the global config option is false' do
687
+
688
+ around(:example) do |example|
689
+ original_config = Mongoid.belongs_to_required_by_default
690
+ Mongoid.belongs_to_required_by_default = false
691
+ example.run
692
+ Mongoid.belongs_to_required_by_default = original_config
693
+ end
694
+
695
+ context 'when the required option is true' do
696
+
697
+ let(:options) do
698
+ {
699
+ required: true
700
+ }
701
+ end
702
+
703
+ it 'sets up the presence of validation' do
704
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
705
+ association.setup!
706
+ end
707
+
708
+ context 'when the optional option is true' do
709
+
710
+ let(:options) do
711
+ {
712
+ required: true,
713
+ optional: true
714
+ }
715
+ end
716
+
717
+ it 'sets up the presence of validation' do
718
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
719
+ association.setup!
720
+ end
721
+ end
722
+
723
+ context 'when the optional option is false' do
724
+
725
+ let(:options) do
726
+ {
727
+ required: true,
728
+ optional: false
729
+ }
730
+ end
731
+
732
+ it 'sets up the presence of validation' do
733
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
734
+ association.setup!
735
+ end
736
+ end
737
+ end
738
+
739
+ context 'when the required option is false' do
740
+
741
+ let(:options) do
742
+ {
743
+ required: false
744
+ }
745
+ end
746
+
747
+ it 'does not set up the presence of validation' do
748
+ expect(belonging_class).not_to receive(:validates)
749
+ association.setup!
750
+ end
751
+
752
+ context 'when the optional option is true' do
753
+
754
+ let(:options) do
755
+ {
756
+ required: false,
757
+ optional: true
758
+ }
759
+ end
760
+
761
+ it 'does not set up the presence of validation' do
762
+ expect(belonging_class).not_to receive(:validates)
763
+ association.setup!
764
+ end
765
+ end
766
+
767
+ context 'when the optional option is false' do
768
+
769
+ let(:options) do
770
+ {
771
+ required: false,
772
+ optional: false
773
+ }
774
+ end
775
+
776
+ it 'does not set up the presence of validation' do
777
+ expect(belonging_class).not_to receive(:validates)
778
+ association.setup!
779
+ end
780
+ end
781
+ end
782
+
783
+ context 'when the required option is not provided' do
784
+
785
+ it 'uses the default and does not set up the presence of validation' do
786
+ expect(belonging_class).not_to receive(:validates)
787
+ association.setup!
788
+ end
789
+
790
+ context 'when the optional option is true' do
791
+
792
+ let(:options) do
793
+ {
794
+ optional: true
795
+ }
796
+ end
797
+
798
+ it 'does not set up the presence of validation' do
799
+ expect(belonging_class).not_to receive(:validates)
800
+ association.setup!
801
+ end
802
+ end
803
+
804
+ context 'when the optional option is false' do
805
+
806
+ let(:options) do
807
+ {
808
+ optional: false
809
+ }
810
+ end
811
+
812
+ it 'sets up the presence of validation' do
813
+ expect(belonging_class).to receive(:validates).with(name, { presence: true }).and_call_original
814
+ association.setup!
815
+ end
816
+ end
817
+ end
818
+ end
819
+ end
820
+ end
821
+
822
+ describe '#type' do
823
+
824
+ context 'when polymorphic' do
825
+
826
+ let(:options) do
827
+ { polymorphic: true }
828
+ end
829
+
830
+ it 'returns nil' do
831
+ expect(association.type).to be_nil
832
+ end
833
+ end
834
+
835
+ context 'when not polymorphic' do
836
+
837
+ it 'returns nil' do
838
+ expect(association.type).to be_nil
839
+ end
840
+ end
841
+ end
842
+
843
+ describe '#inverse_type' do
844
+
845
+ context 'when polymorphic' do
846
+
847
+ let(:options) do
848
+ { polymorphic: true }
849
+ end
850
+
851
+ it 'returns the name followed by "_type"' do
852
+ expect(association.inverse_type).to eq("#{name}_type")
853
+ end
854
+ end
855
+
856
+ context 'when not polymorphic' do
857
+
858
+ it 'returns nil' do
859
+ expect(association.inverse_type).to be_nil
860
+ end
861
+ end
862
+ end
863
+
864
+ describe '#inverse_type_setter' do
865
+
866
+ context 'when polymorphic' do
867
+
868
+ let(:options) do
869
+ { polymorphic: true }
870
+ end
871
+
872
+ it 'returns the inverse type setter' do
873
+ expect(association.inverse_type_setter).to eq("#{name}_type=")
874
+ end
875
+ end
876
+
877
+ context 'when not polymorphic' do
878
+
879
+ it 'returns nil' do
880
+ expect(association.inverse_type_setter).to be_nil
881
+ end
882
+ end
883
+ end
884
+
885
+ describe '#foreign_key' do
886
+
887
+ context 'when options has foreign_key specified' do
888
+
889
+ let(:options) do
890
+ { foreign_key: :other_object_id }
891
+ end
892
+
893
+ it 'returns the foreign key' do
894
+ expect(association.foreign_key).to eq(options[:foreign_key].to_s)
895
+ end
896
+ end
897
+
898
+ context 'when options does not have foreign_key specified' do
899
+
900
+ it 'returns the ame followed by "_id"' do
901
+ expect(association.foreign_key).to eq("#{name}_id")
902
+ end
903
+ end
904
+ end
905
+
906
+ describe '#embedded?' do
907
+
908
+ it 'returns false' do
909
+ expect(association.embedded?).to be(false)
910
+ end
911
+ end
912
+
913
+ describe '#primary_key' do
914
+
915
+ context 'when the :primary_key option is specified' do
916
+
917
+ context 'when the :primary_key option is true' do
918
+
919
+ let(:options) do
920
+ {
921
+ primary_key: :other_primary_key
922
+ }
923
+ end
924
+
925
+ it 'returns the primary key option as a String' do
926
+ expect(association.primary_key).to eq('other_primary_key')
927
+ end
928
+ end
929
+ end
930
+
931
+ context 'when the :primary_key option is not specified' do
932
+
933
+ it 'returns the default primary key' do
934
+ expect(association.primary_key).to eq(Mongoid::Association::Relatable::PRIMARY_KEY_DEFAULT)
935
+ end
936
+ end
937
+ end
938
+
939
+ describe '#indexed?' do
940
+
941
+ context 'when :index is specified in the options' do
942
+
943
+ context 'when :index is true' do
944
+
945
+ let(:options) do
946
+ {
947
+ index: true
948
+ }
949
+ end
950
+
951
+ it 'returns true' do
952
+ expect(association.indexed?).to be(true)
953
+ end
954
+ end
955
+
956
+ context 'when :index is false' do
957
+
958
+ let(:options) do
959
+ {
960
+ index: false
961
+ }
962
+ end
963
+
964
+ it 'returns false' do
965
+ expect(association.indexed?).to be(false)
966
+ end
967
+ end
968
+ end
969
+
970
+ context 'when :index is not specified in the options' do
971
+
972
+ it 'returns nil' do
973
+ expect(association.indexed?).to be(false)
974
+ end
975
+ end
976
+ end
977
+
978
+ describe '#relation' do
979
+
980
+ it 'returns Mongoid::Association::Referenced::BelongsTo::Proxy' do
981
+ expect(association.relation).to be(Mongoid::Association::Referenced::BelongsTo::Proxy)
982
+ end
983
+ end
984
+
985
+ describe '#validation_default' do
986
+
987
+ it 'returns false' do
988
+ expect(association.validation_default).to be(false)
989
+ end
990
+ end
991
+
992
+ describe '#name' do
993
+
994
+ it 'returns the name of the relation' do
995
+ expect(association.name).to be(name)
996
+ end
997
+ end
998
+
999
+ describe '#options' do
1000
+
1001
+ it 'returns the options' do
1002
+ expect(association.options).to be(options)
1003
+ end
1004
+ end
1005
+
1006
+ describe '#cyclic?' do
1007
+
1008
+ it 'returns false' do
1009
+ expect(association.cyclic?).to be(false)
1010
+ end
1011
+ end
1012
+
1013
+ describe '#merge!' do
1014
+
1015
+ end
1016
+
1017
+ describe '#store_as' do
1018
+
1019
+ it 'returns nil' do
1020
+ expect(association.store_as).to be_nil
1021
+ end
1022
+ end
1023
+
1024
+ describe '#touchable?' do
1025
+
1026
+ context 'when :touch is in the options' do
1027
+
1028
+ let(:options) do
1029
+ { touch: true}
1030
+ end
1031
+
1032
+ it 'returns true' do
1033
+ expect(association.send(:touchable?)).to be(true)
1034
+ end
1035
+ end
1036
+
1037
+ context 'when :touch is not in the options' do
1038
+
1039
+ it 'return false' do
1040
+ expect(association.send(:touchable?)).to be(false)
1041
+ end
1042
+ end
1043
+ end
1044
+
1045
+ describe '#order' do
1046
+
1047
+ it 'returns nil' do
1048
+ expect(association.order).to be_nil
1049
+ end
1050
+ end
1051
+
1052
+ describe '#scope' do
1053
+
1054
+ context 'when scope is specified in the options' do
1055
+
1056
+ let(:options) do
1057
+ { scope: -> { unscoped.where(foo: :bar) } }
1058
+ end
1059
+
1060
+ it 'returns a Criteria Queryable Key' do
1061
+ expect(association.scope).to be_a(Proc)
1062
+ end
1063
+ end
1064
+
1065
+ context 'when scope is not specified in the options' do
1066
+
1067
+ it 'returns nil' do
1068
+ expect(association.scope).to be_nil
1069
+ end
1070
+ end
1071
+ end
1072
+
1073
+ describe '#as' do
1074
+
1075
+ it 'returns nil' do
1076
+ expect(association.as).to be_nil
1077
+ end
1078
+ end
1079
+
1080
+ describe '#polymorphic?' do
1081
+
1082
+ context 'when :polymorphic is specified in the options as true' do
1083
+
1084
+ let(:options) do
1085
+ { polymorphic: true }
1086
+ end
1087
+
1088
+ it 'returns true' do
1089
+ expect(association.polymorphic?).to be(true)
1090
+ end
1091
+ end
1092
+
1093
+ context 'when :polymorphic is specified in the options as false' do
1094
+
1095
+ let(:options) do
1096
+ { polymorphic: false }
1097
+ end
1098
+
1099
+ it 'returns false' do
1100
+ expect(association.polymorphic?).to be(false)
1101
+ end
1102
+ end
1103
+
1104
+ context 'when :polymorphic is not specified in the options' do
1105
+
1106
+ it 'returns false' do
1107
+ expect(association.polymorphic?).to be(false)
1108
+ end
1109
+ end
1110
+ end
1111
+
1112
+ describe '#dependent' do
1113
+
1114
+ context 'when the dependent option is provided' do
1115
+
1116
+ context 'when the dependent option is :delete_all' do
1117
+
1118
+ let(:options) do
1119
+ {
1120
+ dependent: :delete_all
1121
+ }
1122
+ end
1123
+
1124
+ it 'returns :delete_all' do
1125
+ expect(association.dependent).to eq(:delete_all)
1126
+ end
1127
+ end
1128
+
1129
+ context 'when the dependent option is :destroy' do
1130
+
1131
+ let(:options) do
1132
+ {
1133
+ dependent: :destroy
1134
+ }
1135
+ end
1136
+
1137
+ it 'returns :destroy' do
1138
+ expect(association.dependent).to eq(:destroy)
1139
+ end
1140
+ end
1141
+
1142
+ context 'when the dependent option is :nullify' do
1143
+
1144
+ let(:options) do
1145
+ {
1146
+ dependent: :nullify
1147
+ }
1148
+ end
1149
+
1150
+ it 'returns :nullify' do
1151
+ expect(association.dependent).to eq(:nullify)
1152
+ end
1153
+ end
1154
+
1155
+ context 'when the dependent option is :restrict_with_exception' do
1156
+
1157
+ let(:options) do
1158
+ {
1159
+ dependent: :restrict_with_exception
1160
+ }
1161
+ end
1162
+
1163
+ it 'returns :restrict_with_exception' do
1164
+ expect(association.dependent).to eq(:restrict_with_exception)
1165
+ end
1166
+ end
1167
+
1168
+ context 'when the dependent option is :restrict_with_error' do
1169
+
1170
+ let(:options) do
1171
+ {
1172
+ dependent: :restrict_with_error
1173
+ }
1174
+ end
1175
+
1176
+ it 'returns :restrict_with_error' do
1177
+ expect(association.dependent).to eq(:restrict_with_error)
1178
+ end
1179
+ end
1180
+ end
1181
+
1182
+ context 'when the dependent option is not provided' do
1183
+
1184
+ it 'returns nil' do
1185
+ expect(association.dependent).to be_nil
1186
+ end
1187
+ end
1188
+ end
1189
+
1190
+ describe '#bindable?' do
1191
+
1192
+ it 'returns false' do
1193
+ expect(association.bindable?(Person.new)).to be(false)
1194
+ end
1195
+ end
1196
+
1197
+ describe '#inverses' do
1198
+
1199
+ context 'when polymorphic' do
1200
+
1201
+ let(:options) do
1202
+ {
1203
+ polymorphic: true
1204
+ }
1205
+ end
1206
+
1207
+ let(:name) do
1208
+ :containable
1209
+ end
1210
+
1211
+ context 'when another object is passed to the method' do
1212
+
1213
+ let(:instance_of_other_class) do
1214
+ OwnerObject.new
1215
+ end
1216
+
1217
+ context 'when the relation class has only one relation whose class matches the owning class' do
1218
+
1219
+ before do
1220
+ OwnerObject.has_one :belonging_object, as: :containable
1221
+ end
1222
+
1223
+ context 'when :inverse_of is specified' do
1224
+
1225
+ before do
1226
+ options.merge!(inverse_of: :inverse_name)
1227
+ end
1228
+
1229
+ it 'returns the :inverse_of value' do
1230
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
1231
+ end
1232
+ end
1233
+
1234
+ context 'when inverse_of is not specified' do
1235
+
1236
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
1237
+ expect(association.inverses(instance_of_other_class)).to match_array([ :belonging_object ])
1238
+ end
1239
+ end
1240
+ end
1241
+
1242
+ context 'when the relation class has more than one relation whose class matches the owning class' do
1243
+
1244
+ before do
1245
+ OwnerObject.has_one :other_belonging_object, as: :containable, class_name: 'BelongingObject'
1246
+ OwnerObject.has_one :belonging_object, as: :containable
1247
+ end
1248
+
1249
+ context 'when :inverse_of is specified' do
1250
+
1251
+ before do
1252
+ options.merge!(inverse_of: :inverse_name)
1253
+ end
1254
+
1255
+ it 'returns the :inverse_of value' do
1256
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
1257
+ end
1258
+ end
1259
+
1260
+ context 'when inverse_of is not specified' do
1261
+
1262
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
1263
+ expect(association.inverses(instance_of_other_class)).to match_array([ :other_belonging_object,
1264
+ :belonging_object ])
1265
+ end
1266
+
1267
+ context 'when the relation class has two associations with the same name' do
1268
+
1269
+ before do
1270
+ OwnerObject.has_one :belonging_object, as: :containable
1271
+ OwnerObject.has_one :other_belonging_object, as: :containable
1272
+ end
1273
+
1274
+ it 'returns only the relations whose :as attribute and class match' do
1275
+ expect(association.inverses(instance_of_other_class)).to match_array([ :belonging_object ])
1276
+ end
1277
+ end
1278
+ end
1279
+ end
1280
+ end
1281
+
1282
+ context 'when another object is not passed to the method' do
1283
+
1284
+ context 'when inverse_of is specified' do
1285
+
1286
+ before do
1287
+ options.merge!(inverse_of: :inverse_name)
1288
+ end
1289
+
1290
+ it 'returns the :inverse_of value' do
1291
+ expect(association.inverses).to eq([ :inverse_name ])
1292
+ end
1293
+ end
1294
+
1295
+ context 'when inverse_of is not specified' do
1296
+
1297
+ it 'returns nil' do
1298
+ expect(association.inverses).to eq(nil)
1299
+ end
1300
+ end
1301
+ end
1302
+ end
1303
+
1304
+ context 'when not polymorphic' do
1305
+
1306
+ context 'when inverse_of is specified' do
1307
+
1308
+ before do
1309
+ options.merge!(inverse_of: :inverse_name)
1310
+ end
1311
+
1312
+ it 'returns the :inverse_of value' do
1313
+ expect(association.inverses).to eq([ :inverse_name ])
1314
+ end
1315
+ end
1316
+
1317
+ context 'when inverse_of is not specified' do
1318
+
1319
+ before do
1320
+ OwnerObject.has_many :belonging_objects
1321
+ end
1322
+
1323
+ it 'uses the inverse class to find the inverse name' do
1324
+ expect(association.inverses).to eq([ :belonging_objects ])
1325
+ end
1326
+ end
1327
+
1328
+ context 'when :cyclic is specified' do
1329
+
1330
+ it 'returns the cyclic inverse name' do
1331
+
1332
+ end
1333
+ end
1334
+
1335
+ context 'when the inverse class has more than one relation with objects of the owner class' do
1336
+
1337
+ before do
1338
+ OwnerObject.has_many :belonging_objects
1339
+ OwnerObject.has_one :other_belonging_object, class_name: 'BelongingObject'
1340
+ end
1341
+
1342
+ it 'raises a Mongoid::Errors::AmbiguousRelationship exception' do
1343
+ expect {
1344
+ association.inverses
1345
+ }.to raise_exception(Mongoid::Errors::AmbiguousRelationship)
1346
+ end
1347
+ end
1348
+
1349
+ context 'when the inverse class only has one relation with objects of the owner class' do
1350
+
1351
+ before do
1352
+ OwnerObject.has_many :belonging_objects
1353
+ end
1354
+
1355
+ it 'uses the inverse class to find the inverse name' do
1356
+ expect(association.inverses).to eq([ :belonging_objects ])
1357
+ end
1358
+ end
1359
+ end
1360
+ end
1361
+
1362
+ describe '#inverse' do
1363
+
1364
+ context 'when polymorphic' do
1365
+
1366
+ let(:options) do
1367
+ {
1368
+ polymorphic: true
1369
+ }
1370
+ end
1371
+
1372
+ let(:name) do
1373
+ :containable
1374
+ end
1375
+
1376
+ context 'when another object is passed to the method' do
1377
+
1378
+ let(:instance_of_other_class) do
1379
+ OwnerObject.new
1380
+ end
1381
+
1382
+ context 'when the relation class has only one relation whose class matches the owning class' do
1383
+
1384
+ before do
1385
+ OwnerObject.has_many :belonging_objects, as: :containable
1386
+ end
1387
+
1388
+ context 'when :inverse_of is specified' do
1389
+
1390
+ before do
1391
+ options.merge!(inverse_of: :inverse_name)
1392
+ end
1393
+
1394
+ it 'returns the :inverse_of value' do
1395
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
1396
+ end
1397
+ end
1398
+
1399
+ context 'when inverse_of is not specified' do
1400
+
1401
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
1402
+ expect(association.inverse(instance_of_other_class)).to eq(:belonging_objects)
1403
+ end
1404
+ end
1405
+ end
1406
+
1407
+ context 'when the relation class has more than one relation whose class matches the owning class' do
1408
+
1409
+ before do
1410
+ OwnerObject.has_one :other_belonging_object, as: :containable, class_name: 'BelongingObject'
1411
+ OwnerObject.has_one :belonging_object, as: :containable
1412
+ end
1413
+
1414
+ context 'when :inverse_of is specified' do
1415
+
1416
+ before do
1417
+ options.merge!(inverse_of: :inverse_name)
1418
+ end
1419
+
1420
+ it 'returns the :inverse_of value' do
1421
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
1422
+ end
1423
+ end
1424
+
1425
+ context 'when inverse_of is not specified' do
1426
+
1427
+ it 'returns the first candidate whose :as attribute matches the name of this association' do
1428
+ expect(association.inverse(instance_of_other_class)).to eq(:other_belonging_object)
1429
+ end
1430
+ end
1431
+ end
1432
+ end
1433
+
1434
+ context 'when another object is not passed to the method' do
1435
+
1436
+ context 'when inverse_of is specified' do
1437
+
1438
+ before do
1439
+ options.merge!(inverse_of: :inverse_name)
1440
+ end
1441
+
1442
+ it 'returns the :inverse_of value' do
1443
+ expect(association.inverse).to eq(:inverse_name)
1444
+ end
1445
+ end
1446
+
1447
+ context 'when inverse_of is not specified' do
1448
+
1449
+ it 'returns nil' do
1450
+ expect(association.inverse).to eq(nil)
1451
+ end
1452
+ end
1453
+ end
1454
+ end
1455
+
1456
+ context 'when not polymorphic' do
1457
+
1458
+ context 'when inverse_of is specified' do
1459
+
1460
+ before do
1461
+ options.merge!(inverse_of: :inverse_name)
1462
+ end
1463
+
1464
+ it 'returns the :inverse_of value' do
1465
+ expect(association.inverse).to eq(:inverse_name)
1466
+ end
1467
+ end
1468
+
1469
+ context 'when inverse_of is not specified' do
1470
+
1471
+ before do
1472
+ OwnerObject.has_many :belonging_objects
1473
+ end
1474
+
1475
+ it 'uses the inverse class to find the inverse name' do
1476
+ expect(association.inverse).to eq(:belonging_objects)
1477
+ end
1478
+ end
1479
+
1480
+ context 'when :cyclic is specified' do
1481
+
1482
+ it 'returns the cyclic inverse name' do
1483
+
1484
+ end
1485
+ end
1486
+
1487
+ context 'when the inverse class has more than one relation with objects of the owner class' do
1488
+
1489
+ before do
1490
+ OwnerObject.has_many :belonging_objects
1491
+ OwnerObject.has_many :other_belonging_objects, class_name: 'BelongingObject'
1492
+ end
1493
+
1494
+ it 'raises a Mongoid::Errors::AmbiguousRelationship exception' do
1495
+ expect {
1496
+ association.inverse
1497
+ }.to raise_exception(Mongoid::Errors::AmbiguousRelationship)
1498
+ end
1499
+ end
1500
+
1501
+ context 'when the inverse class only has one relation with objects of the owner class' do
1502
+
1503
+ before do
1504
+ OwnerObject.has_many :belonging_objects
1505
+ end
1506
+
1507
+ it 'uses the inverse class to find the inverse name' do
1508
+ expect(association.inverse).to eq(:belonging_objects)
1509
+ end
1510
+ end
1511
+ end
1512
+ end
1513
+
1514
+ describe '#inverse_association' do
1515
+
1516
+ end
1517
+
1518
+ describe '#autosave' do
1519
+
1520
+ context 'when the :autosave option is specified' do
1521
+
1522
+ context 'when the :autosave option is true' do
1523
+
1524
+ let(:options) do
1525
+ {
1526
+ autosave: true
1527
+ }
1528
+ end
1529
+
1530
+ it 'returns true' do
1531
+ expect(association.autosave).to be(true)
1532
+ end
1533
+ end
1534
+
1535
+ context 'when the :autosave option is false' do
1536
+
1537
+ let(:options) do
1538
+ {
1539
+ autosave: false
1540
+ }
1541
+ end
1542
+
1543
+ it 'returns false' do
1544
+ expect(association.autosave).to be(false)
1545
+ end
1546
+ end
1547
+ end
1548
+
1549
+ context 'when the :autosave option is not specified' do
1550
+
1551
+ it 'returns nil' do
1552
+ expect(association.autosave).to be(false)
1553
+ end
1554
+ end
1555
+ end
1556
+
1557
+ describe '#counter_cached?' do
1558
+
1559
+ context 'when the :counter_cache option is true' do
1560
+
1561
+ let(:options) do
1562
+ {
1563
+ counter_cache: true
1564
+ }
1565
+ end
1566
+
1567
+ it 'returns true' do
1568
+ expect(association.counter_cached?).to be(true)
1569
+ end
1570
+ end
1571
+
1572
+ context 'when the :counter_cache option is a String' do
1573
+
1574
+ let(:options) do
1575
+ {
1576
+ counter_cache: 'counts_field'
1577
+ }
1578
+ end
1579
+
1580
+ it 'returns true' do
1581
+ expect(association.counter_cached?).to be(true)
1582
+ end
1583
+ end
1584
+
1585
+ context 'when the :counter_cache option is false' do
1586
+
1587
+ let(:options) do
1588
+ {
1589
+ counter_cache: false
1590
+ }
1591
+ end
1592
+
1593
+ it 'returns false' do
1594
+ expect(association.counter_cached?).to be(false)
1595
+ end
1596
+ end
1597
+
1598
+ context 'when the :counter_cache option is not provided' do
1599
+
1600
+ it 'returns false' do
1601
+ expect(association.counter_cached?).to be(false)
1602
+ end
1603
+ end
1604
+ end
1605
+
1606
+ describe '#counter_cache_column_name' do
1607
+
1608
+ context 'when the :counter_cache option is true' do
1609
+
1610
+ let(:options) do
1611
+ {
1612
+ counter_cache: true
1613
+ }
1614
+ end
1615
+
1616
+ it 'returns the inverse name followed by "_count"' do
1617
+ expect(association.counter_cache_column_name).to eq('belonging_objects_count')
1618
+ end
1619
+ end
1620
+
1621
+ context 'when the :counter_cache option is a String' do
1622
+
1623
+ let(:options) do
1624
+ {
1625
+ counter_cache: 'counts_field'
1626
+ }
1627
+ end
1628
+
1629
+ it 'returns the String' do
1630
+ expect(association.counter_cache_column_name).to eq('counts_field')
1631
+ end
1632
+ end
1633
+ end
1634
+
1635
+ describe '#relation_class_name' do
1636
+
1637
+ context 'when the :class_name option is specified' do
1638
+
1639
+ let(:options) do
1640
+ { class_name: 'OtherOwnerObject' }
1641
+ end
1642
+
1643
+ it 'returns the class name option' do
1644
+ expect(association.relation_class_name).to eq('OtherOwnerObject')
1645
+ end
1646
+ end
1647
+
1648
+ context 'when the :class_name option is scoped with ::' do
1649
+
1650
+ let(:options) do
1651
+ { class_name: '::OtherOwnerObject' }
1652
+ end
1653
+
1654
+ it 'returns the class name option' do
1655
+ expect(association.relation_class_name).to eq('::OtherOwnerObject')
1656
+ end
1657
+ end
1658
+
1659
+ context 'when the class_name option is not specified' do
1660
+
1661
+ it 'uses the name of the relation to deduce the class name' do
1662
+ expect(association.relation_class_name).to eq('OwnerObject')
1663
+ end
1664
+ end
1665
+
1666
+ context 'when the association is polymorphic' do
1667
+ let(:association) do
1668
+ HomPolymorphicChild.relations['p_parent']
1669
+ end
1670
+
1671
+ it 'is the computed class name that does not match any existing class' do
1672
+ expect(association.relation_class_name).to eq('PParent')
1673
+ end
1674
+ end
1675
+ end
1676
+
1677
+ describe '#relation_class' do
1678
+
1679
+ context 'when the :class_name option is specified' do
1680
+
1681
+ let(:options) do
1682
+ { class_name: 'OtherOwnerObject' }
1683
+ end
1684
+
1685
+ it 'returns the named class' do
1686
+ expect(association.relation_class).to eq(OtherOwnerObject)
1687
+ end
1688
+ end
1689
+
1690
+ context 'when the :class_name option is scoped with ::' do
1691
+
1692
+ let(:options) do
1693
+ { class_name: '::OtherOwnerObject' }
1694
+ end
1695
+
1696
+ it 'returns the named class' do
1697
+ expect(association.relation_class).to eq(OtherOwnerObject)
1698
+ end
1699
+ end
1700
+
1701
+ context 'when the class_name option is not specified' do
1702
+
1703
+ it 'uses the name of the relation to deduce the class name' do
1704
+ expect(association.relation_class).to eq(OwnerObject)
1705
+ end
1706
+ end
1707
+
1708
+ context 'when the association is polymorphic' do
1709
+ let(:association) do
1710
+ HomPolymorphicChild.relations['p_parent']
1711
+ end
1712
+
1713
+ it 'raises NameError' do
1714
+ expect do
1715
+ association.relation_class
1716
+ end.to raise_error(NameError, /uninitialized constant .*PParent/)
1717
+ end
1718
+ end
1719
+ end
1720
+
1721
+ describe '#inverse_class_name' do
1722
+
1723
+ it 'returns the name of the owner class' do
1724
+ expect(association.inverse_class_name).to eq(belonging_class.name)
1725
+ end
1726
+
1727
+ context 'polymorphic association' do
1728
+ let(:association) do
1729
+ belonging_class.belongs_to :poly_owner, polymorphic: true
1730
+ end
1731
+
1732
+ it 'returns the name of the owner class' do
1733
+ expect(association.inverse_class_name).to eq(belonging_class.name)
1734
+ end
1735
+ end
1736
+ end
1737
+
1738
+ describe '#inverse_class' do
1739
+
1740
+ it 'returns the owner class' do
1741
+ expect(association.inverse_class).to be(belonging_class)
1742
+ end
1743
+
1744
+ context 'polymorphic association' do
1745
+ let(:association) do
1746
+ belonging_class.belongs_to :poly_owner, polymorphic: true
1747
+ end
1748
+
1749
+ it 'returns the owner class' do
1750
+ expect(association.inverse_class).to be(belonging_class)
1751
+ end
1752
+ end
1753
+ end
1754
+
1755
+ describe '#inverse_of' do
1756
+
1757
+ context 'when :inverse_of is specified in the options' do
1758
+
1759
+ let(:options) do
1760
+ { inverse_of: :a_belonging_object }
1761
+ end
1762
+
1763
+ it 'returns the inverse_of value' do
1764
+ expect(association.inverse_of).to eq(options[:inverse_of])
1765
+ end
1766
+ end
1767
+
1768
+ context 'when :inverse_of is not specified in the options' do
1769
+
1770
+ it 'returns nil' do
1771
+ expect(association.inverse_of).to be_nil
1772
+ end
1773
+ end
1774
+ end
1775
+
1776
+ describe '#key' do
1777
+
1778
+ it 'returns the name of the foreign_key as a string' do
1779
+ expect(association.key).to eq(association.foreign_key.to_s)
1780
+ end
1781
+ end
1782
+
1783
+ describe '#setter' do
1784
+
1785
+ it 'returns a string of the name followed by =' do
1786
+ expect(association.setter).to eq("#{name}=")
1787
+ end
1788
+ end
1789
+
1790
+ describe '#validate?' do
1791
+
1792
+ context 'when :validate is specified in the options' do
1793
+
1794
+ context 'when validate is true' do
1795
+
1796
+ let(:options) do
1797
+ { validate: true }
1798
+ end
1799
+
1800
+ it 'returns true' do
1801
+ expect(association.send(:validate?)).to be(true)
1802
+ end
1803
+ end
1804
+
1805
+ context 'when validate is false' do
1806
+
1807
+ let(:options) do
1808
+ { validate: false }
1809
+ end
1810
+
1811
+ it 'returns false' do
1812
+ expect(association.send(:validate?)).to be(false)
1813
+ end
1814
+ end
1815
+ end
1816
+
1817
+ context 'when :validate is not specified in the options' do
1818
+
1819
+ it 'returns the validation_default' do
1820
+ expect(association.send(:validate?)).to eq(association.validation_default)
1821
+ end
1822
+ end
1823
+ end
1824
+
1825
+ describe '#autobuilding?' do
1826
+
1827
+ context 'when :autobuild is specified in the options' do
1828
+
1829
+ context 'when autobuild is true' do
1830
+
1831
+ let(:options) do
1832
+ { autobuild: true }
1833
+ end
1834
+
1835
+ it 'returns true' do
1836
+ expect(association.autobuilding?).to be(true)
1837
+ end
1838
+ end
1839
+
1840
+ context 'when autobuild is false' do
1841
+
1842
+ let(:options) do
1843
+ { autobuild: false }
1844
+ end
1845
+
1846
+ it 'returns true' do
1847
+ expect(association.autobuilding?).to be(false)
1848
+ end
1849
+ end
1850
+ end
1851
+
1852
+ context 'when :validate is not specified in the options' do
1853
+
1854
+ it 'returns false' do
1855
+ expect(association.autobuilding?).to be(false)
1856
+ end
1857
+ end
1858
+ end
1859
+
1860
+ describe '#forced_nil_inverse?' do
1861
+
1862
+ it 'returns false' do
1863
+ expect(association.forced_nil_inverse?).to be(false)
1864
+ end
1865
+ end
1866
+
1867
+ describe '#stores_foreign_key?' do
1868
+
1869
+ it 'returns true' do
1870
+ expect(association.stores_foreign_key?).to be(true)
1871
+ end
1872
+ end
1873
+
1874
+ describe '#inverse_setter' do
1875
+
1876
+ context 'when an inverse can be determined' do
1877
+
1878
+ before do
1879
+ OwnerObject.has_many :belonging_objects
1880
+ end
1881
+
1882
+ it 'returns the name of the inverse followed by =' do
1883
+ expect(association.inverse_setter).to eq('belonging_objects=')
1884
+ end
1885
+ end
1886
+
1887
+ context 'when an inverse cannot be determined' do
1888
+
1889
+ it 'returns nil' do
1890
+ expect(association.inverse_setter).to be_nil
1891
+ end
1892
+ end
1893
+ end
1894
+
1895
+ describe '#extension' do
1896
+
1897
+ context 'when a block is passed' do
1898
+
1899
+ let(:association) do
1900
+ belonging_class.belongs_to name, options do; end
1901
+ end
1902
+
1903
+ it 'defines an extension module' do
1904
+ expect(association.extension).to be_a(Module)
1905
+ end
1906
+
1907
+ it 'returns the extension' do
1908
+ expect(association.extension).to eq(
1909
+ "#{belonging_class.name}::#{belonging_class.name}#{name.to_s.camelize}RelationExtension".constantize)
1910
+ end
1911
+ end
1912
+
1913
+ context 'when an :extension is not specified in the options' do
1914
+
1915
+ it 'returns false' do
1916
+ expect(association.extension).to be_nil
1917
+ end
1918
+ end
1919
+ end
1920
+
1921
+ describe '#foreign_key_setter' do
1922
+
1923
+ it 'returns the foreign key field followed by "="' do
1924
+ expect(association.foreign_key_setter).to eq("owner_object_id=")
1925
+ end
1926
+ end
1927
+
1928
+ describe '#destructive?' do
1929
+
1930
+ context 'when the dependent option is provided' do
1931
+
1932
+ context 'when the dependent option is :delete_all' do
1933
+
1934
+ let(:options) do
1935
+ {
1936
+ dependent: :delete_all
1937
+ }
1938
+ end
1939
+
1940
+ it 'returns true' do
1941
+ expect(association.destructive?).to be(true)
1942
+ end
1943
+ end
1944
+
1945
+ context 'when the dependent option is :destroy' do
1946
+
1947
+ let(:options) do
1948
+ {
1949
+ dependent: :destroy
1950
+ }
1951
+ end
1952
+
1953
+ it 'returns true' do
1954
+ expect(association.destructive?).to be(true)
1955
+ end
1956
+ end
1957
+
1958
+ context 'when the dependent option is :nullify' do
1959
+
1960
+ let(:options) do
1961
+ {
1962
+ dependent: :nullify
1963
+ }
1964
+ end
1965
+
1966
+ it 'returns false' do
1967
+ expect(association.destructive?).to be(false)
1968
+ end
1969
+ end
1970
+
1971
+ context 'when the dependent option is :restrict_with_exception' do
1972
+
1973
+ let(:options) do
1974
+ {
1975
+ dependent: :restrict_with_exception
1976
+ }
1977
+ end
1978
+
1979
+ it 'returns false' do
1980
+ expect(association.destructive?).to be(false)
1981
+ end
1982
+ end
1983
+
1984
+ context 'when the dependent option is :restrict_with_error' do
1985
+
1986
+ let(:options) do
1987
+ {
1988
+ dependent: :restrict_with_error
1989
+ }
1990
+ end
1991
+
1992
+ it 'returns false' do
1993
+ expect(association.destructive?).to be(false)
1994
+ end
1995
+ end
1996
+ end
1997
+
1998
+ context 'when the dependent option is not provided' do
1999
+
2000
+ it 'returns false' do
2001
+ expect(association.destructive?).to be(false)
2002
+ end
2003
+ end
2004
+ end
2005
+
2006
+ describe '#nested_builder' do
2007
+
2008
+ it 'returns an instance of Association::Nested::One' do
2009
+ expect(association.nested_builder({}, {})).to be_a(Mongoid::Association::Nested::One)
2010
+ end
2011
+ end
2012
+
2013
+ describe '#path' do
2014
+
2015
+ it 'returns an instance of Mongoid::Atomic::Paths::Root' do
2016
+ expect(association.path({})).to be_a(Mongoid::Atomic::Paths::Root)
2017
+ end
2018
+ end
2019
+
2020
+ describe '#foreign_key_check' do
2021
+
2022
+ it 'returns the foreign_key followed by "_changed?"' do
2023
+ expect(association.foreign_key_check).to eq('owner_object_id_changed?')
2024
+ end
2025
+ end
2026
+
2027
+ describe '#create_relation' do
2028
+
2029
+ let(:owner) do
2030
+ BelongingObject.new
2031
+ end
2032
+
2033
+ let(:target) do
2034
+ OwnerObject.new
2035
+ end
2036
+
2037
+ before do
2038
+ OwnerObject.has_one :belonging_object
2039
+ end
2040
+
2041
+ it 'returns an instance of Mongoid::Association::Referenced::BelongsTo::Proxy' do
2042
+ expect(Mongoid::Association::Referenced::BelongsTo::Proxy).to receive(:new).and_call_original
2043
+ expect(association.create_relation(owner, target)).to be_a(OwnerObject)
2044
+ end
2045
+ end
2046
+ end