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,954 @@
1
+ require "spec_helper"
2
+ require_relative './embeds_one_models'
3
+
4
+ describe Mongoid::Association::Embedded::EmbedsOne 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
+ Container.relations.clear
13
+ EmbeddedObject.relations.clear
14
+ end
15
+
16
+ let(:embeds_one_class) do
17
+ Container
18
+ end
19
+
20
+ let(:name) do
21
+ :embedded_object
22
+ end
23
+
24
+ let(:association) do
25
+ embeds_one_class.embeds_one name, options
26
+ end
27
+
28
+ let(:options) do
29
+ { }
30
+ end
31
+
32
+ describe '#relation_complements' do
33
+
34
+ let(:expected_complements) do
35
+ [
36
+ Mongoid::Association::Embedded::EmbeddedIn,
37
+ ]
38
+ end
39
+
40
+ it 'returns the relation complements' do
41
+ expect(association.send(:relation_complements)).to eq(expected_complements)
42
+ end
43
+ end
44
+
45
+ describe '#setup!' do
46
+
47
+ it 'sets up a getter for the relation' do
48
+ expect(Mongoid::Association::Accessors).to receive(:define_getter!).with(association)
49
+ association.setup!
50
+ end
51
+
52
+ it 'sets up a setter for the relation' do
53
+ expect(Mongoid::Association::Accessors).to receive(:define_setter!).with(association)
54
+ association.setup!
55
+ end
56
+
57
+ it 'sets up an existence check for the relation' do
58
+ expect(Mongoid::Association::Accessors).to receive(:define_existence_check!).with(association)
59
+ association.setup!
60
+ end
61
+
62
+ it 'sets up the builder for the relation' do
63
+ expect(Mongoid::Association::Builders).to receive(:define_builder!).with(association)
64
+ association.setup!
65
+ end
66
+
67
+ it 'sets up the creator for the relation' do
68
+ expect(Mongoid::Association::Builders).to receive(:define_creator!).with(association)
69
+ association.setup!
70
+ end
71
+
72
+ context 'when the :validate option is true' do
73
+
74
+ let(:options) do
75
+ {
76
+ validate: true
77
+ }
78
+ end
79
+
80
+ let(:association) do
81
+ # Note that it is necessary to create the association directly, otherwise the
82
+ # setup! method will be called by the :embeds_one macro
83
+ described_class.new(embeds_one_class, name, options)
84
+ end
85
+
86
+ it 'sets up validation' do
87
+ expect(embeds_one_class).to receive(:validates_associated).with(name).and_call_original
88
+ association.setup!
89
+ end
90
+ end
91
+
92
+ context 'when the :validate option is false' do
93
+
94
+ let(:options) do
95
+ {
96
+ validate: false
97
+ }
98
+ end
99
+
100
+ it 'does not set up validation' do
101
+ expect(embeds_one_class).not_to receive(:validates_associated)
102
+ association.setup!
103
+ end
104
+ end
105
+
106
+ context 'when the :validate option is not provided' do
107
+
108
+ let(:association) do
109
+ # Note that it is necessary to create the association directly, otherwise the
110
+ # setup! method will be called by the :embeds_one macro
111
+ described_class.new(embeds_one_class, name, options)
112
+ end
113
+
114
+ it 'sets up the validation because it uses the validation default (true)' do
115
+ expect(embeds_one_class).to receive(:validates_associated).with(name).and_call_original
116
+ association.setup!
117
+ end
118
+ end
119
+ end
120
+
121
+ describe '#type' do
122
+
123
+ context 'when polymorphic' do
124
+
125
+ let(:options) do
126
+ { as: :containable }
127
+ end
128
+
129
+ it 'returns the as attribute followed by "_type"' do
130
+ expect(association.type).to eq("#{options[:as]}_type")
131
+ end
132
+ end
133
+
134
+ context 'when not polymorphic' do
135
+
136
+ it 'returns nil' do
137
+ expect(association.type).to be_nil
138
+ end
139
+ end
140
+ end
141
+
142
+ describe '#inverse_type' do
143
+
144
+ context 'when polymorphic' do
145
+
146
+ let(:options) do
147
+ { as: :containable }
148
+ end
149
+
150
+ it 'returns nil' do
151
+ expect(association.inverse_type).to be_nil
152
+ end
153
+ end
154
+
155
+ context 'when not polymorphic' do
156
+
157
+ it 'returns nil' do
158
+ expect(association.inverse_type).to be_nil
159
+ end
160
+ end
161
+ end
162
+
163
+ describe '#inverse_type_setter' do
164
+
165
+ context 'when polymorphic' do
166
+
167
+ let(:options) do
168
+ { as: :containable }
169
+ end
170
+
171
+ it 'returns nil' do
172
+ expect(association.inverse_type).to be_nil
173
+ end
174
+ end
175
+
176
+ context 'when not polymorphic' do
177
+
178
+ it 'returns nil' do
179
+ expect(association.inverse_type).to be_nil
180
+ end
181
+ end
182
+ end
183
+
184
+ describe '#embedded?' do
185
+
186
+ it 'returns true' do
187
+ expect(association.embedded?).to be(true)
188
+ end
189
+ end
190
+
191
+ describe '#primary_key' do
192
+
193
+ it 'returns nil' do
194
+ expect(association.primary_key).to be_nil
195
+ end
196
+ end
197
+
198
+ describe '#indexed?' do
199
+
200
+ it 'returns false' do
201
+ expect(association.indexed?).to be(false)
202
+ end
203
+ end
204
+
205
+ describe '#relation' do
206
+
207
+ it 'returns Mongoid::Association::Embedded::EmbedsOne::Proxy' do
208
+ expect(association.relation).to be(Mongoid::Association::Embedded::EmbedsOne::Proxy)
209
+ end
210
+ end
211
+
212
+ describe '#validation_default' do
213
+
214
+ it 'returns true' do
215
+ expect(association.validation_default).to be(true)
216
+ end
217
+ end
218
+
219
+ describe '#name' do
220
+
221
+ it 'returns the name of the relation' do
222
+ expect(association.name).to be(name)
223
+ end
224
+ end
225
+
226
+ describe '#options' do
227
+
228
+ it 'returns the options' do
229
+ expect(association.options).to be(options)
230
+ end
231
+ end
232
+
233
+ describe '#cyclic?' do
234
+
235
+ context 'when :cyclic is specified in the options' do
236
+
237
+ let(:options) do
238
+ { cyclic: true }
239
+ end
240
+
241
+ it 'returns true' do
242
+ expect(association.cyclic?).to be(true)
243
+ end
244
+ end
245
+
246
+ context 'when :cyclic is not specified in the options' do
247
+
248
+ it 'returns false' do
249
+ expect(association.cyclic?).to be(false)
250
+ end
251
+ end
252
+ end
253
+
254
+ describe '#merge!' do
255
+
256
+ end
257
+
258
+ describe '#store_as' do
259
+
260
+ context 'when :store_as is specified in the options' do
261
+
262
+ let(:options) do
263
+ {
264
+ store_as: :baby_kangaroo
265
+ }
266
+ end
267
+
268
+ it 'returns the :store_as option as a String' do
269
+ expect(association.store_as).to eq(options[:store_as].to_s)
270
+ end
271
+ end
272
+
273
+ context 'when :store_as is not specified in the options' do
274
+
275
+ it 'returns name as a String' do
276
+ expect(association.store_as).to eq(name.to_s)
277
+ end
278
+ end
279
+ end
280
+
281
+ describe '#touchable?' do
282
+
283
+ it 'return false' do
284
+ expect(association.send(:touchable?)).to be(false)
285
+ end
286
+ end
287
+
288
+ describe '#order' do
289
+
290
+ it 'returns nil' do
291
+ expect(association.order).to be_nil
292
+ end
293
+ end
294
+
295
+ describe '#as' do
296
+
297
+ context 'when :as is specified in the options' do
298
+
299
+ let(:options) do
300
+ {
301
+ as: :containable
302
+ }
303
+ end
304
+
305
+ it 'returns the :as option' do
306
+ expect(association.as).to eq(options[:as])
307
+ end
308
+ end
309
+
310
+ context 'when :as is not specified in the options' do
311
+
312
+ it 'returns nil' do
313
+ expect(association.as).to be_nil
314
+ end
315
+ end
316
+ end
317
+
318
+ describe '#polymorphic?' do
319
+
320
+ context 'when :as is specified in the options' do
321
+
322
+ let(:options) do
323
+ {
324
+ as: :containable
325
+ }
326
+ end
327
+
328
+ it 'returns true' do
329
+ expect(association.polymorphic?).to be(true)
330
+ end
331
+
332
+ end
333
+
334
+ context 'when :as is not specified in the options' do
335
+
336
+ it 'returns false' do
337
+ expect(association.polymorphic?).to be(false)
338
+ end
339
+ end
340
+ end
341
+
342
+ describe '#type_setter' do
343
+
344
+ context 'when polymorphic' do
345
+
346
+ let(:options) do
347
+ { as: :containable }
348
+ end
349
+
350
+ it 'returns the type followed by = as a String' do
351
+ expect(association.type_setter).to eq("containable_type=")
352
+ end
353
+ end
354
+
355
+ context 'when not polymorphic' do
356
+
357
+ it 'returns nil' do
358
+ expect(association.type).to be_nil
359
+ end
360
+ end
361
+ end
362
+
363
+ describe '#dependent' do
364
+
365
+ it 'returns nil' do
366
+ expect(association.dependent).to be_nil
367
+ end
368
+ end
369
+
370
+ describe '#inverse_type' do
371
+
372
+ it 'returns nil' do
373
+ expect(association.inverse_type).to be_nil
374
+ end
375
+ end
376
+
377
+ describe '#bindable?' do
378
+
379
+ it 'returns false' do
380
+ expect(association.bindable?(Person.new)).to be(false)
381
+ end
382
+ end
383
+
384
+ describe '#inverses' do
385
+
386
+ context 'when polymorphic' do
387
+
388
+ before do
389
+ EmbeddedObject.embedded_in :containable, polymorphic: true
390
+ end
391
+
392
+ let(:options) do
393
+ {
394
+ as: :containable
395
+ }
396
+ end
397
+
398
+ context 'when another object is passed to the method' do
399
+
400
+ let(:instance_of_other_class) do
401
+ EmbeddedObject.new
402
+ end
403
+
404
+ context 'when the relation class has only one relation whose class matches the owning class' do
405
+
406
+ it 'returns the :as attribute of this association' do
407
+ expect(association.inverses(instance_of_other_class)).to match_array([ :containable ])
408
+ end
409
+ end
410
+
411
+ context 'when :inverse_of is specified' do
412
+
413
+ before do
414
+ options.merge!(inverse_of: :inverse_name)
415
+ end
416
+
417
+ it 'returns the :inverse_of value' do
418
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
419
+ end
420
+ end
421
+
422
+ context 'when inverse_of is not specified' do
423
+
424
+ it 'returns the :as attribute of this association' do
425
+ expect(association.inverses(instance_of_other_class)).to match_array([ :containable ])
426
+ end
427
+ end
428
+ end
429
+
430
+ context 'when another object is not passed to the method' do
431
+
432
+ context 'when inverse_of is specified' do
433
+
434
+ before do
435
+ options.merge!(inverse_of: :inverse_name)
436
+ end
437
+
438
+ it 'returns the :inverse_of value' do
439
+ expect(association.inverses).to eq([ :inverse_name ])
440
+ end
441
+ end
442
+
443
+ context 'when inverse_of is not specified' do
444
+
445
+ it 'returns the :as attribute' do
446
+ expect(association.inverses).to eq([ :containable ])
447
+ end
448
+
449
+ context 'when class_name is given and is a :: prefixed string' do
450
+
451
+ let(:association) do
452
+ EomCcParent.relations['child']
453
+ end
454
+
455
+ it 'returns the inverse in an array' do
456
+ inverses = association.inverses
457
+ expect(inverses).to eq([:parent])
458
+ end
459
+
460
+ context 'when other associations referencing unloaded classes exist' do
461
+ let(:association) do
462
+ EomDnlParent.relations['child']
463
+ end
464
+
465
+ it 'does not load other classes' do
466
+ inverses = association.inverses
467
+ expect(inverses).to eq([:parent])
468
+ expect(Object.const_defined?(:EoDnlMarker)).to be false
469
+ end
470
+ end
471
+ end
472
+ end
473
+ end
474
+ end
475
+
476
+ context 'when not polymorphic' do
477
+
478
+ before do
479
+ EmbeddedObject.embedded_in :container
480
+ end
481
+
482
+ context 'when inverse_of is specified' do
483
+
484
+ before do
485
+ options.merge!(inverse_of: :inverse_name)
486
+ end
487
+
488
+ it 'returns the :inverse_of value' do
489
+ expect(association.inverses).to eq([ :inverse_name ])
490
+ end
491
+ end
492
+
493
+ context 'when inverse_of is not specified' do
494
+
495
+ it 'uses the inverse class to find the inverse name' do
496
+ expect(association.inverses).to eq([ :container ])
497
+ end
498
+ end
499
+
500
+ context 'when :cyclic is specified' do
501
+
502
+ it 'returns the cyclic inverse name' do
503
+
504
+ end
505
+ end
506
+ end
507
+ end
508
+
509
+ describe '##inverse' do
510
+
511
+ context 'when polymorphic' do
512
+
513
+ before do
514
+ EmbeddedObject.embedded_in :containable, polymorphic: true
515
+ end
516
+
517
+ let(:options) do
518
+ {
519
+ as: :containable
520
+ }
521
+ end
522
+
523
+ context 'when another object is passed to the method' do
524
+
525
+ let(:instance_of_other_class) do
526
+ EmbeddedObject.new
527
+ end
528
+
529
+ context 'when the relation class has only one relation whose class matches the owning class' do
530
+
531
+ it 'returns the :as attribute of this association' do
532
+ expect(association.inverse(instance_of_other_class)).to eq(:containable)
533
+ end
534
+ end
535
+
536
+ context 'when :inverse_of is specified' do
537
+
538
+ before do
539
+ options.merge!(inverse_of: :inverse_name)
540
+ end
541
+
542
+ it 'returns the :inverse_of value' do
543
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
544
+ end
545
+ end
546
+
547
+ context 'when inverse_of is not specified' do
548
+
549
+ it 'returns the :as attribute of this association' do
550
+ expect(association.inverse(instance_of_other_class)).to eq(:containable)
551
+ end
552
+ end
553
+ end
554
+
555
+ context 'when another object is not passed to the method' do
556
+
557
+ context 'when inverse_of is specified' do
558
+
559
+ before do
560
+ options.merge!(inverse_of: :inverse_name)
561
+ end
562
+
563
+ it 'returns the :inverse_of value' do
564
+ expect(association.inverse).to eq(:inverse_name)
565
+ end
566
+ end
567
+
568
+ context 'when inverse_of is not specified' do
569
+
570
+ it 'returns the :as attribute' do
571
+ expect(association.inverse).to eq(:containable)
572
+ end
573
+ end
574
+ end
575
+ end
576
+
577
+ context 'when not polymorphic' do
578
+
579
+ before do
580
+ EmbeddedObject.embedded_in :container
581
+ end
582
+
583
+ context 'when inverse_of is specified' do
584
+
585
+ before do
586
+ options.merge!(inverse_of: :inverse_name)
587
+ end
588
+
589
+ it 'returns the :inverse_of value' do
590
+ expect(association.inverse).to eq(:inverse_name)
591
+ end
592
+ end
593
+
594
+ context 'when inverse_of is not specified' do
595
+
596
+ it 'uses the inverse class to find the inverse name' do
597
+ expect(association.inverse).to eq(:container)
598
+ end
599
+ end
600
+
601
+ context 'when :cyclic is specified' do
602
+
603
+ it 'returns the cyclic inverse name' do
604
+
605
+ end
606
+ end
607
+ end
608
+ end
609
+
610
+ describe '#inverse_association' do
611
+
612
+ end
613
+
614
+ describe '#autosave' do
615
+
616
+ it 'returns false' do
617
+ expect(association.autosave).to be(false)
618
+ end
619
+ end
620
+
621
+ describe '#relation_class_name' do
622
+
623
+ context 'when the :class_name option is specified' do
624
+
625
+ let(:options) do
626
+ { class_name: 'OtherEmbeddedObject' }
627
+ end
628
+
629
+ it 'returns the class name option' do
630
+ expect(association.relation_class_name).to eq('OtherEmbeddedObject')
631
+ end
632
+
633
+ context ':class_name is a :: prefixed string' do
634
+ let(:association) do
635
+ EomCcParent.relations['child']
636
+ end
637
+
638
+ it 'returns the :: prefixed string' do
639
+ expect(association.relation_class_name).to eq('::EomCcChild')
640
+ end
641
+ end
642
+ end
643
+
644
+ context 'when the class_name option is not specified' do
645
+
646
+ it 'uses the name of the relation to deduce the class name' do
647
+ expect(association.relation_class_name).to eq('EmbeddedObject')
648
+ end
649
+ end
650
+
651
+ context 'when another association in the model is referencing a third model class' do
652
+ let(:association) do
653
+ EomDnlParent.relations['child']
654
+ end
655
+
656
+ it 'does not attempt to load the third class' do
657
+ expect(association.relation_class_name).to eq('EomDnlChild')
658
+ expect(Object.const_defined?(:EoDnlMarker)).to be false
659
+ end
660
+ end
661
+ end
662
+
663
+ describe '#klass' do
664
+
665
+ context 'when the :class_name option is specified' do
666
+
667
+ let!(:_class) do
668
+ class OtherEmbeddedObject; end
669
+ OtherEmbeddedObject
670
+ end
671
+
672
+ let(:options) do
673
+ { class_name: 'OtherEmbeddedObject' }
674
+ end
675
+
676
+ it 'returns the class name option' do
677
+ expect(association.klass).to eq(_class)
678
+ end
679
+ end
680
+
681
+ context 'when the class_name option is not specified' do
682
+
683
+ it 'uses the name of the relation to deduce the class name' do
684
+ expect(association.klass).to eq(EmbeddedObject)
685
+ end
686
+ end
687
+ end
688
+
689
+ describe '#inverse_class_name' do
690
+
691
+ it 'returns the name of the owner class' do
692
+ expect(association.inverse_class_name).to eq(Container.name)
693
+ end
694
+ end
695
+
696
+ describe '#inverse_class' do
697
+
698
+ it 'returns the owner class' do
699
+ expect(association.inverse_class).to be(Container)
700
+ end
701
+ end
702
+
703
+ describe '#inverse_of' do
704
+
705
+ context 'when :inverse_of is specified in the options' do
706
+
707
+ let(:options) do
708
+ { inverse_of: :objects_list }
709
+ end
710
+
711
+ it 'returns the inverse_of value' do
712
+ expect(association.inverse_of).to eq(options[:inverse_of])
713
+ end
714
+ end
715
+
716
+ context 'when :inverse_of is not specified in the options' do
717
+
718
+ it 'returns nil' do
719
+ expect(association.inverse_of).to be_nil
720
+ end
721
+ end
722
+ end
723
+
724
+ describe '#key' do
725
+
726
+ it 'returns the name of the relation as a string' do
727
+ expect(association.key).to eq(name.to_s)
728
+ end
729
+ end
730
+
731
+ describe '#setter' do
732
+
733
+ it 'returns a string of the name followed by =' do
734
+ expect(association.setter).to eq("#{name}=")
735
+ end
736
+ end
737
+
738
+ describe '#validate?' do
739
+
740
+ context 'when :validate is specified in the options' do
741
+
742
+ context 'when validate is true' do
743
+
744
+ let(:options) do
745
+ { validate: true }
746
+ end
747
+
748
+ it 'returns true' do
749
+ expect(association.send(:validate?)).to be(true)
750
+ end
751
+ end
752
+
753
+ context 'when validate is false' do
754
+
755
+ let(:options) do
756
+ { validate: false }
757
+ end
758
+
759
+ it 'returns false' do
760
+ expect(association.send(:validate?)).to be(false)
761
+ end
762
+ end
763
+ end
764
+
765
+ context 'when :validate is not specified in the options' do
766
+
767
+ it 'returns the validation_default' do
768
+ expect(association.send(:validate?)).to eq(association.validation_default)
769
+ end
770
+ end
771
+ end
772
+
773
+ describe '#autobuilding?' do
774
+
775
+ context 'when :autobuild is specified in the options' do
776
+
777
+ context 'when autobuild is true' do
778
+
779
+ let(:options) do
780
+ { autobuild: true }
781
+ end
782
+
783
+ it 'returns true' do
784
+ expect(association.autobuilding?).to be(true)
785
+ end
786
+ end
787
+
788
+ context 'when autobuild is false' do
789
+
790
+ let(:options) do
791
+ { autobuild: false }
792
+ end
793
+
794
+ it 'returns true' do
795
+ expect(association.autobuilding?).to be(false)
796
+ end
797
+ end
798
+ end
799
+
800
+ context 'when :validate is not specified in the options' do
801
+
802
+ it 'returns false' do
803
+ expect(association.autobuilding?).to be(false)
804
+ end
805
+ end
806
+ end
807
+
808
+ describe '#forced_nil_inverse?' do
809
+
810
+ it 'returns false' do
811
+ expect(association.forced_nil_inverse?).to be(false)
812
+ end
813
+ end
814
+
815
+ describe '#stores_foreign_key?' do
816
+
817
+ it 'returns false' do
818
+ expect(association.stores_foreign_key?).to be(false)
819
+ end
820
+ end
821
+
822
+ describe '#inverse_setter' do
823
+
824
+ context 'when an inverse can be determined' do
825
+
826
+ before do
827
+ EmbeddedObject.embedded_in :container
828
+ end
829
+
830
+ it 'returns the name of the inverse followed by =' do
831
+ expect(association.inverse_setter).to eq('container=')
832
+ end
833
+ end
834
+
835
+ context 'when an inverse cannot be determined' do
836
+
837
+ it 'returns nil' do
838
+ expect(association.inverse_setter).to be_nil
839
+ end
840
+ end
841
+ end
842
+
843
+ describe '#extension' do
844
+
845
+ context 'when a block is passed' do
846
+
847
+ let(:association) do
848
+ embeds_one_class.embeds_one name, options do; end
849
+ end
850
+
851
+ it 'defines an extension module' do
852
+ expect(association.extension).to be_a(Module)
853
+ end
854
+
855
+ it 'returns the extension' do
856
+ expect(association.extension).to eq(
857
+ "#{embeds_one_class.name}::#{embeds_one_class.name}#{name.to_s.camelize}RelationExtension".constantize)
858
+ end
859
+ end
860
+
861
+ context 'when an :extension is not specified in the options' do
862
+
863
+ it 'returns false' do
864
+ expect(association.extension).to be_nil
865
+ end
866
+ end
867
+ end
868
+
869
+ describe '#criteria' do
870
+
871
+ it 'does not respond to the method' do
872
+ expect {
873
+ association.criteria
874
+ }.to raise_exception(NoMethodError)
875
+ end
876
+ end
877
+
878
+ describe '#destructive?' do
879
+
880
+ it 'returns false' do
881
+ expect(association.destructive?).to be(false)
882
+ end
883
+ end
884
+
885
+ describe '#nested_builder' do
886
+
887
+ it 'returns an instance of Association::Nested::One' do
888
+ expect(association.nested_builder({}, {})).to be_a(Mongoid::Association::Nested::One)
889
+ end
890
+ end
891
+
892
+ describe '#cascading_callbacks?' do
893
+
894
+ context 'when cascade_callbacks is specified in the options' do
895
+
896
+ context 'when :cascade_callbacks is true' do
897
+
898
+ let(:options) do
899
+ { cascade_callbacks: true }
900
+ end
901
+
902
+ it 'returns true' do
903
+ expect(association.cascading_callbacks?).to be(true)
904
+ end
905
+ end
906
+
907
+ context 'when :cascade_callbacks is false' do
908
+
909
+ let(:options) do
910
+ { cascade_callbacks: false }
911
+ end
912
+
913
+ it 'returns false' do
914
+ expect(association.cascading_callbacks?).to be(false)
915
+ end
916
+ end
917
+ end
918
+
919
+ context 'when cascade_callbacks is not specified in the options' do
920
+
921
+ it 'returns false' do
922
+ expect(association.cascading_callbacks?).to be(false)
923
+ end
924
+ end
925
+ end
926
+
927
+ describe '#path' do
928
+
929
+ it 'returns an instance of Mongoid::Atomic::Paths::Root' do
930
+ expect(association.path(double( :_parent => true))).to be_a(Mongoid::Atomic::Paths::Embedded::One)
931
+ end
932
+ end
933
+
934
+ describe '#create_relation' do
935
+
936
+ let(:owner) do
937
+ Container.new
938
+ end
939
+
940
+ let(:target) do
941
+ EmbeddedObject.new
942
+ end
943
+
944
+ before do
945
+ association
946
+ EmbeddedObject.embedded_in :container
947
+ end
948
+
949
+ it 'returns an the target (EmbeddedObject)' do
950
+ expect(Mongoid::Association::Embedded::EmbedsOne::Proxy).to receive(:new).and_call_original
951
+ expect(association.create_relation(owner, target)).to be_a(EmbeddedObject)
952
+ end
953
+ end
954
+ end