mongoid 6.4.8 → 7.0.13

Sign up to get free protection for your applications and to get access to all the features.
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