mongoid 6.4.8 → 7.0.13

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 (376) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE +1 -0
  4. data/README.md +4 -3
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +17 -0
  7. data/lib/mongoid/association/accessors.rb +339 -0
  8. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  9. data/lib/mongoid/association/builders.rb +92 -0
  10. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  11. data/lib/mongoid/association/depending.rb +137 -0
  12. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  13. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  14. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  16. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  18. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  19. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  20. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  22. data/lib/mongoid/association/embedded/embeds_many.rb +211 -0
  23. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  24. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  26. data/lib/mongoid/association/embedded/embeds_one.rb +174 -0
  27. data/lib/mongoid/association/embedded.rb +4 -0
  28. data/lib/mongoid/association/macros.rb +204 -0
  29. data/lib/mongoid/{relations → association}/many.rb +19 -49
  30. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  31. data/lib/mongoid/association/nested/many.rb +200 -0
  32. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  33. data/lib/mongoid/association/nested/one.rb +127 -0
  34. data/lib/mongoid/association/nested.rb +15 -0
  35. data/lib/mongoid/{relations → association}/one.rb +6 -6
  36. data/lib/mongoid/association/options.rb +152 -0
  37. data/lib/mongoid/{relations → association}/proxy.rb +45 -59
  38. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  43. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  44. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  45. data/lib/mongoid/association/referenced/eager.rb +162 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  51. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  56. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  57. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  60. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  63. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  64. data/lib/mongoid/association/referenced.rb +7 -0
  65. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  66. data/lib/mongoid/association/relatable.rb +511 -0
  67. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  68. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  69. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  70. data/lib/mongoid/atomic/paths/embedded.rb +1 -1
  71. data/lib/mongoid/atomic.rb +14 -4
  72. data/lib/mongoid/attributes/dynamic.rb +16 -15
  73. data/lib/mongoid/attributes/nested.rb +22 -11
  74. data/lib/mongoid/attributes/processing.rb +2 -2
  75. data/lib/mongoid/attributes/readonly.rb +2 -4
  76. data/lib/mongoid/attributes.rb +55 -31
  77. data/lib/mongoid/changeable.rb +1 -1
  78. data/lib/mongoid/clients/options.rb +7 -5
  79. data/lib/mongoid/clients/sessions.rb +20 -4
  80. data/lib/mongoid/composable.rb +4 -4
  81. data/lib/mongoid/config/environment.rb +21 -8
  82. data/lib/mongoid/config.rb +1 -0
  83. data/lib/mongoid/contextual/atomic.rb +1 -1
  84. data/lib/mongoid/contextual/geo_near.rb +1 -1
  85. data/lib/mongoid/contextual/memory.rb +21 -3
  86. data/lib/mongoid/contextual/mongo.rb +10 -8
  87. data/lib/mongoid/copyable.rb +11 -6
  88. data/lib/mongoid/criteria/includable.rb +14 -14
  89. data/lib/mongoid/criteria/modifiable.rb +8 -3
  90. data/lib/mongoid/criteria/options.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  92. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  94. data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  96. data/lib/mongoid/criteria/queryable/key.rb +67 -8
  97. data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
  98. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  99. data/lib/mongoid/criteria/queryable/selectable.rb +5 -3
  100. data/lib/mongoid/criteria/queryable/selector.rb +9 -31
  101. data/lib/mongoid/criteria.rb +9 -3
  102. data/lib/mongoid/document.rb +14 -4
  103. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  104. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  105. data/lib/mongoid/errors/unknown_model.rb +25 -0
  106. data/lib/mongoid/errors.rb +3 -0
  107. data/lib/mongoid/extensions/array.rb +5 -5
  108. data/lib/mongoid/extensions/hash.rb +9 -4
  109. data/lib/mongoid/extensions/object.rb +4 -4
  110. data/lib/mongoid/extensions/range.rb +1 -0
  111. data/lib/mongoid/extensions/regexp.rb +1 -1
  112. data/lib/mongoid/extensions/string.rb +2 -2
  113. data/lib/mongoid/extensions.rb +0 -4
  114. data/lib/mongoid/factory.rb +13 -3
  115. data/lib/mongoid/fields/foreign_key.rb +5 -5
  116. data/lib/mongoid/fields/standard.rb +2 -14
  117. data/lib/mongoid/fields/validators/macro.rb +1 -1
  118. data/lib/mongoid/fields.rb +5 -4
  119. data/lib/mongoid/indexable.rb +4 -1
  120. data/lib/mongoid/interceptable.rb +8 -6
  121. data/lib/mongoid/matchable/all.rb +4 -3
  122. data/lib/mongoid/matchable/and.rb +1 -1
  123. data/lib/mongoid/matchable/default.rb +71 -24
  124. data/lib/mongoid/matchable/elem_match.rb +9 -3
  125. data/lib/mongoid/matchable/eq.rb +22 -0
  126. data/lib/mongoid/matchable/ne.rb +1 -1
  127. data/lib/mongoid/matchable/regexp.rb +2 -2
  128. data/lib/mongoid/matchable.rb +17 -16
  129. data/lib/mongoid/persistable/deletable.rb +7 -6
  130. data/lib/mongoid/persistable/incrementable.rb +1 -1
  131. data/lib/mongoid/persistable/logical.rb +1 -1
  132. data/lib/mongoid/persistable/pushable.rb +11 -2
  133. data/lib/mongoid/persistable/settable.rb +57 -12
  134. data/lib/mongoid/persistable.rb +4 -5
  135. data/lib/mongoid/persistence_context.rb +26 -11
  136. data/lib/mongoid/positional.rb +1 -1
  137. data/lib/mongoid/query_cache.rb +4 -2
  138. data/lib/mongoid/serializable.rb +4 -4
  139. data/lib/mongoid/shardable.rb +1 -1
  140. data/lib/mongoid/touchable.rb +102 -0
  141. data/lib/mongoid/traversable.rb +3 -3
  142. data/lib/mongoid/validatable/macros.rb +1 -1
  143. data/lib/mongoid/validatable/presence.rb +2 -2
  144. data/lib/mongoid/validatable/uniqueness.rb +5 -5
  145. data/lib/mongoid/validatable.rb +8 -8
  146. data/lib/mongoid/version.rb +2 -1
  147. data/lib/mongoid.rb +1 -0
  148. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  149. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  150. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  151. data/spec/README.md +18 -0
  152. data/spec/app/models/animal.rb +2 -1
  153. data/spec/app/models/bomb.rb +1 -1
  154. data/spec/app/models/customer.rb +11 -0
  155. data/spec/app/models/customer_address.rb +12 -0
  156. data/spec/app/models/message.rb +1 -1
  157. data/spec/app/models/minim.rb +7 -0
  158. data/spec/app/models/other_owner_object.rb +2 -0
  159. data/spec/app/models/person.rb +5 -2
  160. data/spec/app/models/shipment_address.rb +1 -0
  161. data/spec/app/models/store_as_dup_test3.rb +7 -0
  162. data/spec/app/models/store_as_dup_test4.rb +7 -0
  163. data/spec/app/models/updatable.rb +7 -0
  164. data/spec/app/models/vertex.rb +6 -0
  165. data/spec/app/models/wiki_page.rb +1 -1
  166. data/spec/config/mongoid.yml +13 -3
  167. data/spec/integration/app_spec.rb +341 -0
  168. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  169. data/spec/integration/associations/embedded_spec.rb +176 -0
  170. data/spec/integration/callbacks_models.rb +49 -0
  171. data/spec/integration/callbacks_spec.rb +216 -0
  172. data/spec/integration/criteria/date_field_spec.rb +41 -0
  173. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  174. data/spec/integration/matchable_spec.rb +680 -0
  175. data/spec/lite_spec_helper.rb +71 -0
  176. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  177. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  178. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  179. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  180. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  181. data/spec/mongoid/association/depending_spec.rb +866 -0
  182. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  183. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  184. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  185. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  186. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  187. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +55 -77
  188. data/spec/mongoid/association/embedded/embedded_in_spec.rb +901 -0
  189. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  190. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  191. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  192. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  193. data/spec/mongoid/association/embedded/embeds_many_spec.rb +862 -0
  194. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  195. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  196. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  197. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +6 -0
  198. data/spec/mongoid/association/embedded/embeds_one_models.rb +51 -0
  199. data/spec/mongoid/association/embedded/embeds_one_spec.rb +954 -0
  200. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  201. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  202. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  203. data/spec/mongoid/association/options_spec.rb +1321 -0
  204. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  205. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  206. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  207. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  208. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  209. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2023 -0
  210. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  211. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  212. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  213. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  214. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +247 -99
  215. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  216. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  217. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  218. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  219. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  220. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +227 -1
  221. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  222. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +30 -94
  223. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  224. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  225. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  226. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  227. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  228. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  229. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  230. data/spec/mongoid/association/referenced/has_one_spec.rb +1360 -0
  231. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  232. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  233. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  234. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  235. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  236. data/spec/mongoid/atomic_spec.rb +4 -4
  237. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  238. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  239. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  240. data/spec/mongoid/attributes_spec.rb +298 -9
  241. data/spec/mongoid/clients/factory_spec.rb +20 -38
  242. data/spec/mongoid/clients/options_spec.rb +64 -50
  243. data/spec/mongoid/clients/sessions_spec.rb +9 -5
  244. data/spec/mongoid/clients/transactions_spec.rb +390 -0
  245. data/spec/mongoid/clients_spec.rb +70 -10
  246. data/spec/mongoid/config_spec.rb +27 -1
  247. data/spec/mongoid/contextual/atomic_spec.rb +37 -14
  248. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  249. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  250. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  251. data/spec/mongoid/contextual/mongo_spec.rb +107 -56
  252. data/spec/mongoid/copyable_spec.rb +90 -6
  253. data/spec/mongoid/copyable_spec_models.rb +17 -0
  254. data/spec/mongoid/criteria/modifiable_spec.rb +173 -1
  255. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  256. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  257. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +44 -1
  258. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  259. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  260. data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
  261. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  262. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
  263. data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
  264. data/spec/mongoid/criteria/queryable/selector_spec.rb +37 -0
  265. data/spec/mongoid/criteria_spec.rb +36 -19
  266. data/spec/mongoid/document_fields_spec.rb +88 -0
  267. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  268. data/spec/mongoid/document_spec.rb +29 -4
  269. data/spec/mongoid/extensions/array_spec.rb +11 -15
  270. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  271. data/spec/mongoid/extensions/object_spec.rb +7 -11
  272. data/spec/mongoid/extensions/range_spec.rb +7 -0
  273. data/spec/mongoid/factory_spec.rb +21 -3
  274. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  275. data/spec/mongoid/fields_spec.rb +1 -1
  276. data/spec/mongoid/indexable_spec.rb +24 -12
  277. data/spec/mongoid/interceptable_spec.rb +22 -1
  278. data/spec/mongoid/matchable/default_spec.rb +10 -3
  279. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  280. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  281. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  282. data/spec/mongoid/matchable_spec.rb +2 -2
  283. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  284. data/spec/mongoid/persistable/savable_spec.rb +5 -5
  285. data/spec/mongoid/persistable/settable_spec.rb +125 -10
  286. data/spec/mongoid/persistable_spec.rb +21 -6
  287. data/spec/mongoid/persistence_context_spec.rb +1 -1
  288. data/spec/mongoid/query_cache_spec.rb +65 -27
  289. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  290. data/spec/mongoid/scopable_spec.rb +2 -1
  291. data/spec/mongoid/shardable_spec.rb +32 -12
  292. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  293. data/spec/mongoid/tasks/database_spec.rb +1 -1
  294. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  295. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  296. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  297. data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
  298. data/spec/mongoid/validatable_spec.rb +1 -1
  299. data/spec/shared/LICENSE +20 -0
  300. data/spec/shared/bin/get-mongodb-download-url +17 -0
  301. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  302. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  303. data/spec/shared/lib/mrss/constraints.rb +354 -0
  304. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  305. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  306. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  307. data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
  308. data/spec/shared/lib/mrss/utils.rb +15 -0
  309. data/spec/shared/share/Dockerfile.erb +231 -0
  310. data/spec/shared/shlib/distro.sh +73 -0
  311. data/spec/shared/shlib/server.sh +290 -0
  312. data/spec/shared/shlib/set_env.sh +128 -0
  313. data/spec/spec_helper.rb +34 -49
  314. data/spec/support/cluster_config.rb +3 -3
  315. data/spec/support/constraints.rb +21 -76
  316. data/spec/support/expectations.rb +17 -3
  317. data/spec/support/spec_config.rb +20 -7
  318. data.tar.gz.sig +0 -0
  319. metadata +646 -541
  320. metadata.gz.sig +1 -5
  321. data/lib/mongoid/relations/accessors.rb +0 -267
  322. data/lib/mongoid/relations/auto_save.rb +0 -94
  323. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  324. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  325. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  326. data/lib/mongoid/relations/bindings.rb +0 -9
  327. data/lib/mongoid/relations/builder.rb +0 -57
  328. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  329. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  330. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  331. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  332. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  333. data/lib/mongoid/relations/builders.rb +0 -106
  334. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  335. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  336. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  337. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  338. data/lib/mongoid/relations/cascading.rb +0 -56
  339. data/lib/mongoid/relations/conversions.rb +0 -34
  340. data/lib/mongoid/relations/counter_cache.rb +0 -160
  341. data/lib/mongoid/relations/cyclic.rb +0 -107
  342. data/lib/mongoid/relations/eager/base.rb +0 -153
  343. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  344. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  345. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  346. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  347. data/lib/mongoid/relations/embedded/in.rb +0 -241
  348. data/lib/mongoid/relations/embedded/many.rb +0 -683
  349. data/lib/mongoid/relations/embedded/one.rb +0 -235
  350. data/lib/mongoid/relations/macros.rb +0 -367
  351. data/lib/mongoid/relations/metadata.rb +0 -1179
  352. data/lib/mongoid/relations/nested_builder.rb +0 -74
  353. data/lib/mongoid/relations/options.rb +0 -49
  354. data/lib/mongoid/relations/polymorphic.rb +0 -39
  355. data/lib/mongoid/relations/referenced/in.rb +0 -304
  356. data/lib/mongoid/relations/referenced/many.rb +0 -812
  357. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  358. data/lib/mongoid/relations/referenced/one.rb +0 -290
  359. data/lib/mongoid/relations/synchronization.rb +0 -169
  360. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  361. data/lib/mongoid/relations/targets.rb +0 -2
  362. data/lib/mongoid/relations/touchable.rb +0 -97
  363. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  364. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  365. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  366. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  367. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  368. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  369. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  370. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  371. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  372. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  373. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  374. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  375. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  376. data/spec/mongoid/relations/options_spec.rb +0 -35
@@ -0,0 +1,901 @@
1
+ require "spec_helper"
2
+ require_relative './embeds_one_models'
3
+
4
+ describe Mongoid::Association::Embedded::EmbeddedIn do
5
+
6
+ before do
7
+ class Container; include Mongoid::Document; end
8
+ class EmbeddedObject; include Mongoid::Document; end
9
+ end
10
+
11
+ after do
12
+ Object.send(:remove_const, :Container)
13
+ Object.send(:remove_const, :EmbeddedObject)
14
+ end
15
+
16
+ let(:embedded_class) do
17
+ EmbeddedObject
18
+ end
19
+
20
+ let(:name) do
21
+ :container
22
+ end
23
+
24
+ let(:association) do
25
+ embedded_class.embedded_in name, options
26
+ end
27
+
28
+ let(:options) do
29
+ { }
30
+ end
31
+
32
+ describe '#VALID_OPTIONS' do
33
+
34
+ it 'returns the SHARED options with the ASSOCIATION_OPTIONS' do
35
+ expect(association.class::VALID_OPTIONS).to match_array(Mongoid::Association::Relatable::SHARED_OPTIONS +
36
+ association.class::ASSOCIATION_OPTIONS)
37
+ end
38
+ end
39
+
40
+ describe '#relation_complements' do
41
+
42
+ let(:expected_complements) do
43
+ [
44
+ Mongoid::Association::Embedded::EmbedsMany,
45
+ Mongoid::Association::Embedded::EmbedsOne
46
+ ]
47
+ end
48
+
49
+ it 'returns the relation complements' do
50
+ expect(association.send(:relation_complements)).to eq(expected_complements)
51
+ end
52
+ end
53
+
54
+ describe '#setup_instance_methods!' do
55
+
56
+ it 'sets up a getter for the relation' do
57
+ expect(Mongoid::Association::Accessors).to receive(:define_getter!).with(association)
58
+ association.send(:setup_instance_methods!)
59
+ end
60
+
61
+ it 'sets up a setter for the relation' do
62
+ expect(Mongoid::Association::Accessors).to receive(:define_setter!).with(association)
63
+ association.send(:setup_instance_methods!)
64
+ end
65
+
66
+ it 'sets up an existence check for the relation' do
67
+ expect(Mongoid::Association::Accessors).to receive(:define_existence_check!).with(association)
68
+ association.send(:setup_instance_methods!)
69
+ end
70
+ end
71
+
72
+ describe '#inverse_type_setter' do
73
+
74
+ context 'when polymorphic' do
75
+
76
+ let(:options) do
77
+ { polymorphic: true }
78
+ end
79
+
80
+ it 'returns nil' do
81
+ expect(association.inverse_type).to be_nil
82
+ end
83
+ end
84
+
85
+ context 'when not polymorphic' do
86
+
87
+ it 'returns nil' do
88
+ expect(association.inverse_type).to be_nil
89
+ end
90
+ end
91
+ end
92
+
93
+ describe '#embedded?' do
94
+
95
+ it 'returns true' do
96
+ expect(association.embedded?).to be(true)
97
+ end
98
+ end
99
+
100
+ describe '#relation' do
101
+
102
+ it 'returns Mongoid::Association::Embedded::EmbeddedIn::Proxy' do
103
+ expect(association.relation).to be(Mongoid::Association::Embedded::EmbeddedIn::Proxy)
104
+ end
105
+ end
106
+
107
+ describe '#validation_default' do
108
+
109
+ it 'returns false' do
110
+ expect(association.validation_default).to be(false)
111
+ end
112
+ end
113
+
114
+ describe '#name' do
115
+
116
+ it 'returns the name of the relation' do
117
+ expect(association.name).to be(name)
118
+ end
119
+ end
120
+
121
+ describe '#options' do
122
+
123
+ it 'returns the options' do
124
+ expect(association.options).to be(options)
125
+ end
126
+ end
127
+
128
+ describe '#cyclic?' do
129
+
130
+ context 'when :cyclic is specified in the options' do
131
+
132
+ let(:options) do
133
+ { cyclic: true }
134
+ end
135
+
136
+ it 'returns true' do
137
+ expect(association.cyclic?).to be(true)
138
+ end
139
+ end
140
+
141
+ context 'when :cyclic is not specified in the options' do
142
+
143
+ it 'returns false' do
144
+ expect(association.cyclic?).to be(false)
145
+ end
146
+ end
147
+ end
148
+
149
+ describe '#merge!' do
150
+
151
+ end
152
+
153
+
154
+ describe '#touchable?' do
155
+
156
+ context 'when :touch is in the options' do
157
+
158
+ let(:options) do
159
+ { touch: true}
160
+ end
161
+
162
+ it 'returns true' do
163
+ expect(association.send(:touchable?)).to be(true)
164
+ end
165
+ end
166
+
167
+ context 'when :touch is not in the options' do
168
+
169
+ it 'return false' do
170
+ expect(association.send(:touchable?)).to be(false)
171
+ end
172
+ end
173
+ end
174
+
175
+ describe '#polymorphic?' do
176
+
177
+ context 'when :polymorphic is specified in the options as true' do
178
+
179
+ let(:options) do
180
+ { polymorphic: true }
181
+ end
182
+
183
+ it 'returns true' do
184
+ expect(association.polymorphic?).to be(true)
185
+ end
186
+ end
187
+
188
+ context 'when :polymorphic is specified in the options as false' do
189
+
190
+ let(:options) do
191
+ { polymorphic: false }
192
+ end
193
+
194
+ it 'returns false' do
195
+ expect(association.polymorphic?).to be(false)
196
+ end
197
+ end
198
+
199
+ context 'when :polymorphic is not specified in the options' do
200
+
201
+ it 'returns false' do
202
+ expect(association.polymorphic?).to be(false)
203
+ end
204
+ end
205
+ end
206
+
207
+ describe '#bindable?' do
208
+
209
+ it 'returns false' do
210
+ expect(association.bindable?(Person.new)).to be(false)
211
+ end
212
+ end
213
+
214
+ describe '#inverses' do
215
+
216
+ context 'when polymorphic' do
217
+
218
+ let(:options) do
219
+ {
220
+ polymorphic: true
221
+ }
222
+ end
223
+
224
+ let(:name) do
225
+ :containable
226
+ end
227
+
228
+ context 'when another object is passed to the method' do
229
+
230
+ let(:instance_of_other_class) do
231
+ Container.new
232
+ end
233
+
234
+ context 'when the relation class has only one relation whose class matches the owning class' do
235
+
236
+ before do
237
+ Container.embeds_many :embedded_objects, as: :containable
238
+ end
239
+
240
+ context 'when :inverse_of is specified' do
241
+
242
+ before do
243
+ options.merge!(inverse_of: :inverse_name)
244
+ end
245
+
246
+ it 'returns the :inverse_of value' do
247
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
248
+ end
249
+ end
250
+
251
+ context 'when inverse_of is not specified' do
252
+
253
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
254
+ expect(association.inverses(instance_of_other_class)).to match_array([ :embedded_objects ])
255
+ end
256
+
257
+ context 'when the relation class has two associations with the same name' do
258
+
259
+ before do
260
+ Container.embeds_many :embedded_objects, as: :containable
261
+ Container.embeds_many :other_embedded_objects, as: :containable
262
+ end
263
+
264
+ it 'returns only the relations whose :as attribute and class match' do
265
+ expect(association.inverses(instance_of_other_class)).to match_array([ :embedded_objects ])
266
+ end
267
+ end
268
+ end
269
+ end
270
+
271
+ context 'when the relation class has more than one relation whose class matches the owning class' do
272
+
273
+ before do
274
+ Container.embeds_many :embedded_objects, as: :containable
275
+ Container.embeds_one :other_embedded_object, as: :containable, class_name: 'EmbeddedObject'
276
+ end
277
+
278
+ context 'when :inverse_of is specified' do
279
+
280
+ before do
281
+ options.merge!(inverse_of: :inverse_name)
282
+ end
283
+
284
+ it 'returns the :inverse_of value' do
285
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
286
+ end
287
+ end
288
+
289
+ context 'when inverse_of is not specified' do
290
+
291
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
292
+ expect(association.inverses(instance_of_other_class)).to match_array([ :embedded_objects,
293
+ :other_embedded_object ])
294
+ end
295
+ end
296
+ end
297
+ end
298
+
299
+ context 'when another object is not passed to the method' do
300
+
301
+ context 'when inverse_of is specified' do
302
+
303
+ before do
304
+ options.merge!(inverse_of: :inverse_name)
305
+ end
306
+
307
+ it 'returns the :inverse_of value' do
308
+ expect(association.inverses).to eq([ :inverse_name ])
309
+ end
310
+ end
311
+
312
+ context 'when inverse_of is not specified' do
313
+
314
+ it 'returns nil' do
315
+ expect(association.inverses).to eq(nil)
316
+ end
317
+
318
+ context 'when class_name is given and is a plain string' do
319
+ let(:association) do
320
+ EomParent.relations['child']
321
+ end
322
+
323
+ it 'returns the inverse in an array' do
324
+ inverses = association.inverses
325
+ expect(inverses).to eq([:parent])
326
+ end
327
+ end
328
+
329
+ context 'when class_name is given and is a :: prefixed string' do
330
+ let(:association) do
331
+ EomCcChild.relations['parent']
332
+ end
333
+
334
+ it 'returns the inverse in an array' do
335
+ pending 'MONGOID-4751'
336
+
337
+ inverses = association.inverses
338
+ expect(inverses).to eq([:child])
339
+ end
340
+
341
+ context 'when other associations referencing unloaded classes exist' do
342
+ let(:association) do
343
+ EomDnlChild.relations['parent']
344
+ end
345
+
346
+ it 'does not load other classes' do
347
+ inverses = association.inverses
348
+ expect(inverses).to eq([:child])
349
+ expect(Object.const_defined?(:EoDnlMarker)).to be false
350
+ end
351
+ end
352
+ end
353
+ end
354
+ end
355
+ end
356
+
357
+ context 'when not polymorphic' do
358
+
359
+ context 'when inverse_of is specified' do
360
+
361
+ before do
362
+ options.merge!(inverse_of: :inverse_name)
363
+ end
364
+
365
+ it 'returns the :inverse_of value' do
366
+ expect(association.inverses).to eq([ :inverse_name ])
367
+ end
368
+ end
369
+
370
+ context 'when inverse_of is not specified' do
371
+
372
+ before do
373
+ Container.embeds_many :embedded_objects
374
+ end
375
+
376
+ it 'uses the inverse class to find the inverse name' do
377
+ expect(association.inverses).to eq([ :embedded_objects ])
378
+ end
379
+ end
380
+
381
+ context 'when :cyclic is specified' do
382
+
383
+ it 'returns the cyclic inverse name' do
384
+
385
+ end
386
+ end
387
+
388
+ context 'when the inverse class has more than one relation with objects of the owner class' do
389
+
390
+ before do
391
+ Container.embeds_many :embedded_objects
392
+ Container.embeds_many :other_embedded_objects, class_name: 'EmbeddedObject'
393
+ end
394
+
395
+ it 'raises a Mongoid::Errors::AmbiguousRelationship exception' do
396
+ expect {
397
+ association.inverses
398
+ }.to raise_exception(Mongoid::Errors::AmbiguousRelationship)
399
+ end
400
+ end
401
+
402
+ context 'when the inverse class only has one relation with objects of the owner class' do
403
+
404
+ before do
405
+ Container.embeds_many :embedded_objects
406
+ end
407
+
408
+ it 'uses the inverse class to find the inverse name' do
409
+ expect(association.inverses).to eq([ :embedded_objects ])
410
+ end
411
+ end
412
+ end
413
+ end
414
+
415
+ describe '#inverse' do
416
+
417
+ context 'when polymorphic' do
418
+
419
+ let(:options) do
420
+ {
421
+ polymorphic: true
422
+ }
423
+ end
424
+
425
+ let(:name) do
426
+ :containable
427
+ end
428
+
429
+ context 'when another object is passed to the method' do
430
+
431
+ let(:instance_of_other_class) do
432
+ Container.new
433
+ end
434
+
435
+ context 'when the relation class has only one relation whose class matches the owning class' do
436
+
437
+ before do
438
+ Container.embeds_many :embedded_objects, as: :containable
439
+ end
440
+
441
+ context 'when :inverse_of is specified' do
442
+
443
+ before do
444
+ options.merge!(inverse_of: :inverse_name)
445
+ end
446
+
447
+ it 'returns the :inverse_of value' do
448
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
449
+ end
450
+ end
451
+
452
+ context 'when inverse_of is not specified' do
453
+
454
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
455
+ expect(association.inverse(instance_of_other_class)).to eq(:embedded_objects)
456
+ end
457
+ end
458
+ end
459
+
460
+ context 'when the relation class has more than one relation whose class matches the owning class' do
461
+
462
+ before do
463
+ Container.embeds_many :embedded_objects, as: :containable
464
+ Container.embeds_one :other_embedded_object, as: :containable
465
+ end
466
+
467
+ context 'when :inverse_of is specified' do
468
+
469
+ before do
470
+ options.merge!(inverse_of: :inverse_name)
471
+ end
472
+
473
+ it 'returns the :inverse_of value' do
474
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
475
+ end
476
+ end
477
+
478
+ context 'when inverse_of is not specified' do
479
+
480
+ it 'returns the first candidate whose :as attribute matches the name of this association' do
481
+ expect(association.inverse(instance_of_other_class)).to eq(:embedded_objects)
482
+ end
483
+ end
484
+ end
485
+ end
486
+
487
+ context 'when another object is not passed to the method' do
488
+
489
+ context 'when inverse_of is specified' do
490
+
491
+ before do
492
+ options.merge!(inverse_of: :inverse_name)
493
+ end
494
+
495
+ it 'returns the :inverse_of value' do
496
+ expect(association.inverse).to eq(:inverse_name)
497
+ end
498
+ end
499
+
500
+ context 'when inverse_of is not specified' do
501
+
502
+ it 'returns nil' do
503
+ expect(association.inverse).to eq(nil)
504
+ end
505
+ end
506
+ end
507
+ end
508
+
509
+ context 'when not polymorphic' do
510
+
511
+ context 'when inverse_of is specified' do
512
+
513
+ before do
514
+ options.merge!(inverse_of: :inverse_name)
515
+ end
516
+
517
+ it 'returns the :inverse_of value' do
518
+ expect(association.inverse).to eq(:inverse_name)
519
+ end
520
+ end
521
+
522
+ context 'when inverse_of is not specified' do
523
+
524
+ before do
525
+ Container.embeds_many :embedded_objects
526
+ end
527
+
528
+ it 'uses the inverse class to find the inverse name' do
529
+ expect(association.inverse).to eq(:embedded_objects)
530
+ end
531
+ end
532
+
533
+ context 'when :cyclic is specified' do
534
+
535
+ it 'returns the cyclic inverse name' do
536
+
537
+ end
538
+ end
539
+
540
+ context 'when the inverse class has more than one relation with objects of the owner class' do
541
+
542
+ before do
543
+ Container.embeds_many :embedded_objects
544
+ Container.embeds_many :other_embedded_objects, class_name: 'EmbeddedObject'
545
+ end
546
+
547
+ it 'raises a Mongoid::Errors::AmbiguousRelationship exception' do
548
+ expect {
549
+ association.inverse
550
+ }.to raise_exception(Mongoid::Errors::AmbiguousRelationship)
551
+ end
552
+ end
553
+
554
+ context 'when the inverse class only has one relation with objects of the owner class' do
555
+
556
+ before do
557
+ Container.embeds_many :embedded_objects
558
+ end
559
+
560
+ it 'uses the inverse class to find the inverse name' do
561
+ expect(association.inverse).to eq(:embedded_objects)
562
+ end
563
+ end
564
+ end
565
+ end
566
+
567
+ describe '#inverse_association' do
568
+
569
+ end
570
+
571
+ describe '#autosave' do
572
+
573
+ it 'returns false' do
574
+ expect(association.autosave).to be(false)
575
+ end
576
+ end
577
+
578
+ describe '#relation_class_name' do
579
+
580
+ context 'when the :class_name option is specified' do
581
+
582
+ let(:options) do
583
+ { class_name: 'OtherContainer' }
584
+ end
585
+
586
+ it 'returns the class name option' do
587
+ expect(association.relation_class_name).to eq('OtherContainer')
588
+ end
589
+
590
+ context ':class_name is a :: prefixed string' do
591
+ let(:association) do
592
+ EomCcChild.relations['parent']
593
+ end
594
+
595
+ it 'returns the :: prefixed string' do
596
+ expect(association.relation_class_name).to eq('::EomCcParent')
597
+ end
598
+ end
599
+ end
600
+
601
+ context 'when the class_name option is not specified' do
602
+
603
+ it 'uses the name of the relation to deduce the class name' do
604
+ expect(association.relation_class_name).to eq('Container')
605
+ end
606
+ end
607
+
608
+ context 'when another association in the model is referencing a third model class' do
609
+ let(:association) do
610
+ EomDnlChild.relations['parent']
611
+ end
612
+
613
+ it 'does not attempt to load the third class' do
614
+ expect(association.relation_class_name).to eq('EomDnlParent')
615
+ expect(Object.const_defined?(:EoDnlMarker)).to be false
616
+ end
617
+ end
618
+ end
619
+
620
+ describe '#klass' do
621
+
622
+ context 'when the :class_name option is specified' do
623
+
624
+ let!(:_class) do
625
+ class OtherContainer; end
626
+ OtherContainer
627
+ end
628
+
629
+ let(:options) do
630
+ { class_name: 'OtherContainer' }
631
+ end
632
+
633
+ it 'returns the class name option' do
634
+ expect(association.klass).to eq(_class)
635
+ end
636
+ end
637
+
638
+ context 'when the class_name option is not specified' do
639
+
640
+ it 'uses the name of the relation to deduce the class name' do
641
+ expect(association.klass).to eq(Container)
642
+ end
643
+ end
644
+ end
645
+
646
+ describe '#inverse_class_name' do
647
+
648
+ it 'returns the name of the owner class' do
649
+ expect(association.inverse_class_name).to eq(embedded_class.name)
650
+ end
651
+ end
652
+
653
+ describe '#inverse_class' do
654
+
655
+ it 'returns the owner class' do
656
+ expect(association.inverse_class).to be(embedded_class)
657
+ end
658
+ end
659
+
660
+ describe '#inverse_of' do
661
+
662
+ context 'when :inverse_of is specified in the options' do
663
+
664
+ let(:options) do
665
+ { inverse_of: :a_container }
666
+ end
667
+
668
+ it 'returns the inverse_of value' do
669
+ expect(association.inverse_of).to eq(options[:inverse_of])
670
+ end
671
+ end
672
+
673
+ context 'when :inverse_of is not specified in the options' do
674
+
675
+ it 'returns nil' do
676
+ expect(association.inverse_of).to be_nil
677
+ end
678
+ end
679
+ end
680
+
681
+ describe '#key' do
682
+
683
+ it 'returns the name of the relation as a string' do
684
+ expect(association.key).to eq(name.to_s)
685
+ end
686
+ end
687
+
688
+ describe '#setter' do
689
+
690
+ it 'returns a string of the name followed by =' do
691
+ expect(association.setter).to eq("#{name}=")
692
+ end
693
+ end
694
+
695
+ describe '#validate?' do
696
+
697
+ context 'when :validate is specified in the options' do
698
+
699
+ context 'when validate is true' do
700
+
701
+ let(:options) do
702
+ { validate: true }
703
+ end
704
+
705
+ it 'returns true' do
706
+ expect(association.send(:validate?)).to be(true)
707
+ end
708
+ end
709
+
710
+ context 'when validate is false' do
711
+
712
+ let(:options) do
713
+ { validate: false }
714
+ end
715
+
716
+ it 'returns false' do
717
+ expect(association.send(:validate?)).to be(false)
718
+ end
719
+ end
720
+ end
721
+
722
+ context 'when :validate is not specified in the options' do
723
+
724
+ it 'returns the validation_default' do
725
+ expect(association.send(:validate?)).to eq(association.validation_default)
726
+ end
727
+ end
728
+ end
729
+
730
+ describe '#autobuilding?' do
731
+
732
+ context 'when :autobuild is specified in the options' do
733
+
734
+ context 'when autobuild is true' do
735
+
736
+ let(:options) do
737
+ { autobuild: true }
738
+ end
739
+
740
+ it 'returns true' do
741
+ expect(association.autobuilding?).to be(true)
742
+ end
743
+ end
744
+
745
+ context 'when autobuild is false' do
746
+
747
+ let(:options) do
748
+ { autobuild: false }
749
+ end
750
+
751
+ it 'returns true' do
752
+ expect(association.autobuilding?).to be(false)
753
+ end
754
+ end
755
+ end
756
+
757
+ context 'when :validate is not specified in the options' do
758
+
759
+ it 'returns false' do
760
+ expect(association.autobuilding?).to be(false)
761
+ end
762
+ end
763
+ end
764
+
765
+ describe '#forced_nil_inverse?' do
766
+
767
+ it 'returns false' do
768
+ expect(association.forced_nil_inverse?).to be(false)
769
+ end
770
+ end
771
+
772
+ describe '#stores_foreign_key?' do
773
+
774
+ it 'returns false' do
775
+ expect(association.stores_foreign_key?).to be(false)
776
+ end
777
+ end
778
+
779
+ describe '#inverse_setter' do
780
+
781
+ context 'when an inverse can be determined' do
782
+
783
+ before do
784
+ Container.embeds_many :embedded_objects
785
+ end
786
+
787
+ it 'returns the name of the inverse followed by =' do
788
+ expect(association.inverse_setter).to eq('embedded_objects=')
789
+ end
790
+ end
791
+
792
+ context 'when an inverse cannot be determined' do
793
+
794
+ it 'returns nil' do
795
+ expect(association.inverse_setter).to be_nil
796
+ end
797
+ end
798
+ end
799
+
800
+ describe '#extension' do
801
+
802
+ context 'when a block is passed' do
803
+
804
+ let(:association) do
805
+ embedded_class.embedded_in name, options do; end
806
+ end
807
+
808
+ it 'defines an extension module' do
809
+ expect(association.extension).to be_a(Module)
810
+ end
811
+
812
+ it 'returns the extension' do
813
+ expect(association.extension).to eq(
814
+ "#{embedded_class.name}::#{embedded_class.name}#{name.capitalize}RelationExtension".constantize)
815
+ end
816
+ end
817
+
818
+ context 'when an :extension is not specified in the options' do
819
+
820
+ it 'returns false' do
821
+ expect(association.extension).to be_nil
822
+ end
823
+ end
824
+ end
825
+
826
+ describe '#criteria' do
827
+
828
+ it 'does not respond to the method' do
829
+ expect {
830
+ association.criteria
831
+ }.to raise_exception(NoMethodError)
832
+ end
833
+ end
834
+
835
+ describe '#destructive?' do
836
+
837
+ it 'returns false' do
838
+ expect(association.destructive?).to be(false)
839
+ end
840
+ end
841
+
842
+ describe '#nested_builder' do
843
+
844
+ it 'returns an instance of Association::Nested::One' do
845
+ expect(association.nested_builder({}, {})).to be_a(Mongoid::Association::Nested::One)
846
+ end
847
+ end
848
+
849
+ describe '#cascading_callbacks?' do
850
+
851
+ context 'when cascade_callbacks is specified in the options' do
852
+
853
+ let(:options) do
854
+ {cascade_callbacks: true}
855
+ end
856
+
857
+ it 'raises a Mongoid::Errors::InvalidRelationOption exception' do
858
+ expect {
859
+ association.cascading_callbacks?
860
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
861
+ end
862
+ end
863
+
864
+ context 'when cascade_callbacks is not specified in the options' do
865
+
866
+ it 'returns false' do
867
+ expect(association.cascading_callbacks?).to be(false)
868
+ end
869
+ end
870
+ end
871
+
872
+ describe '#path' do
873
+
874
+ it 'returns an instance of Mongoid::Atomic::Paths::Root' do
875
+ expect(association.path({})).to be_a(Mongoid::Atomic::Paths::Root)
876
+ end
877
+ end
878
+
879
+ describe '#foreign_key_check' do
880
+
881
+ it 'returns nil' do
882
+ expect(association.foreign_key_check).to be_nil
883
+ end
884
+ end
885
+
886
+ describe '#create_relation' do
887
+
888
+ let(:owner) do
889
+ Container.new
890
+ end
891
+
892
+ let(:target) do
893
+ EmbeddedObject.new
894
+ end
895
+
896
+ it 'returns an instance of Mongoid::Association::Embedded::EmbeddedIn::Proxy' do
897
+ expect(Mongoid::Association::Embedded::EmbeddedIn::Proxy).to receive(:new).and_call_original
898
+ expect(association.create_relation(owner, target)).to be_a(EmbeddedObject)
899
+ end
900
+ end
901
+ end