mongoid 7.5.4 → 8.1.7

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 (442) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +16 -7
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +38 -9
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +142 -28
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +186 -16
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +48 -14
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +17 -13
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +10 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  269. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  270. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  271. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  272. data/spec/mongoid/attributes_spec.rb +526 -33
  273. data/spec/mongoid/changeable_spec.rb +429 -37
  274. data/spec/mongoid/clients/factory_spec.rb +23 -30
  275. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  276. data/spec/mongoid/clients_spec.rb +149 -15
  277. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  278. data/spec/mongoid/config/defaults_spec.rb +160 -0
  279. data/spec/mongoid/config_spec.rb +214 -31
  280. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  281. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  282. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  283. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  284. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  285. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  286. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  287. data/spec/mongoid/contextual/none_spec.rb +60 -21
  288. data/spec/mongoid/copyable_spec.rb +453 -11
  289. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  290. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  291. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  292. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  293. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  294. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  295. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  298. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  299. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  300. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  301. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  304. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  305. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  306. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  307. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  308. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  309. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  310. data/spec/mongoid/criteria_spec.rb +469 -1205
  311. data/spec/mongoid/document_fields_spec.rb +173 -24
  312. data/spec/mongoid/document_spec.rb +32 -41
  313. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  314. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  315. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  316. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  317. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  319. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  320. data/spec/mongoid/extensions/array_spec.rb +16 -2
  321. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  322. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  323. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  324. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  325. data/spec/mongoid/extensions/date_spec.rb +71 -1
  326. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  327. data/spec/mongoid/extensions/float_spec.rb +53 -74
  328. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  329. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  330. data/spec/mongoid/extensions/range_spec.rb +255 -54
  331. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  332. data/spec/mongoid/extensions/set_spec.rb +106 -0
  333. data/spec/mongoid/extensions/string_spec.rb +53 -25
  334. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  335. data/spec/mongoid/extensions/time_spec.rb +639 -106
  336. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  337. data/spec/mongoid/factory_spec.rb +61 -1
  338. data/spec/mongoid/fields/localized_spec.rb +80 -37
  339. data/spec/mongoid/fields_spec.rb +503 -87
  340. data/spec/mongoid/findable_spec.rb +450 -58
  341. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  342. data/spec/mongoid/indexable_spec.rb +55 -30
  343. data/spec/mongoid/interceptable_spec.rb +824 -22
  344. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  345. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  346. data/spec/mongoid/mongoizable_spec.rb +285 -0
  347. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  348. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  350. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  351. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  352. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  353. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  355. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  357. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  358. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  360. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  361. data/spec/mongoid/persistence_context_spec.rb +31 -57
  362. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  363. data/spec/mongoid/query_cache_spec.rb +56 -215
  364. data/spec/mongoid/reloadable_spec.rb +83 -6
  365. data/spec/mongoid/scopable_spec.rb +91 -1
  366. data/spec/mongoid/serializable_spec.rb +25 -39
  367. data/spec/mongoid/shardable_spec.rb +4 -4
  368. data/spec/mongoid/stateful_spec.rb +150 -8
  369. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  370. data/spec/mongoid/tasks/database_spec.rb +127 -0
  371. data/spec/mongoid/timestamps_spec.rb +392 -4
  372. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  373. data/spec/mongoid/touchable_spec.rb +390 -2
  374. data/spec/mongoid/touchable_spec_models.rb +14 -8
  375. data/spec/mongoid/traversable_spec.rb +13 -35
  376. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  377. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  378. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  379. data/spec/mongoid/warnings_spec.rb +35 -0
  380. data/spec/mongoid_spec.rb +34 -16
  381. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  382. data/spec/rails/mongoid_spec.rb +4 -16
  383. data/spec/spec_helper.rb +5 -0
  384. data/spec/support/constraints.rb +24 -0
  385. data/spec/support/immutable_ids.rb +118 -0
  386. data/spec/support/macros.rb +78 -0
  387. data/spec/support/models/artist.rb +0 -1
  388. data/spec/support/models/augmentation.rb +12 -0
  389. data/spec/support/models/band.rb +5 -0
  390. data/spec/support/models/book.rb +1 -0
  391. data/spec/support/models/building.rb +2 -0
  392. data/spec/support/models/catalog.rb +24 -0
  393. data/spec/support/models/circus.rb +3 -0
  394. data/spec/support/models/cover.rb +10 -0
  395. data/spec/support/models/fanatic.rb +8 -0
  396. data/spec/support/models/implant.rb +9 -0
  397. data/spec/support/models/label.rb +2 -0
  398. data/spec/support/models/lat_lng.rb +6 -0
  399. data/spec/support/models/name.rb +10 -0
  400. data/spec/support/models/passport.rb +9 -0
  401. data/spec/support/models/person.rb +2 -0
  402. data/spec/support/models/player.rb +2 -0
  403. data/spec/support/models/powerup.rb +12 -0
  404. data/spec/support/models/product.rb +1 -0
  405. data/spec/support/models/purse.rb +9 -0
  406. data/spec/support/models/registry.rb +1 -0
  407. data/spec/support/models/school.rb +14 -0
  408. data/spec/support/models/shield.rb +18 -0
  409. data/spec/support/models/student.rb +14 -0
  410. data/spec/support/models/weapon.rb +12 -0
  411. metadata +101 -96
  412. checksums.yaml.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  418. data/spec/shared/LICENSE +0 -20
  419. data/spec/shared/bin/get-mongodb-download-url +0 -17
  420. data/spec/shared/bin/s3-copy +0 -45
  421. data/spec/shared/bin/s3-upload +0 -69
  422. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  423. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  424. data/spec/shared/lib/mrss/constraints.rb +0 -378
  425. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  426. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  427. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  428. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  429. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  430. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  431. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  432. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  433. data/spec/shared/lib/mrss/utils.rb +0 -15
  434. data/spec/shared/share/Dockerfile.erb +0 -325
  435. data/spec/shared/share/haproxy-1.conf +0 -16
  436. data/spec/shared/share/haproxy-2.conf +0 -17
  437. data/spec/shared/shlib/config.sh +0 -27
  438. data/spec/shared/shlib/distro.sh +0 -74
  439. data/spec/shared/shlib/server.sh +0 -392
  440. data/spec/shared/shlib/set_env.sh +0 -169
  441. data.tar.gz.sig +0 -0
  442. metadata.gz.sig +0 -3
@@ -54,24 +54,35 @@ describe Mongoid::Contextual::None do
54
54
  end
55
55
 
56
56
  describe "#pluck" do
57
- it "returns an empty array" do
58
- expect(context.pluck(:id)).to eq([])
57
+
58
+ context "when plucking one field" do
59
+ it "returns an empty array" do
60
+ expect(context.pluck(:id)).to eq([])
61
+ end
62
+ end
63
+
64
+ context "when plucking multiple fields" do
65
+ it "returns an empty array" do
66
+ expect(context.pluck(:id, :foo)).to eq([])
67
+ end
59
68
  end
60
69
  end
61
70
 
62
- describe "#first" do
63
- it "returns nil" do
64
- expect(context.first).to be_nil
71
+ describe "#pick" do
72
+ it "returns an empty array" do
73
+ expect(context.pick(:id)).to eq(nil)
65
74
  end
75
+ end
66
76
 
67
- it "doen't raise when passing options" do
68
- expect do
69
- context.first(id_sort: :none)
70
- end.to_not raise_error
77
+ describe "#tally" do
78
+ it "returns an empty hash" do
79
+ expect(context.tally(:id)).to eq({})
71
80
  end
81
+ end
72
82
 
73
- it "returns nil when passing a hash" do
74
- expect(context.first(id_sort: :none)).to be_nil
83
+ describe "#first" do
84
+ it "returns nil" do
85
+ expect(context.first).to be_nil
75
86
  end
76
87
 
77
88
  it "returns [] when passing a limit" do
@@ -79,19 +90,17 @@ describe Mongoid::Contextual::None do
79
90
  end
80
91
  end
81
92
 
82
- describe "#last" do
83
- it "returns nil" do
84
- expect(context.last).to be_nil
85
- end
86
-
87
- it "doen't raise when passing options" do
93
+ describe "#first!" do
94
+ it "raises an error" do
88
95
  expect do
89
- context.last(id_sort: :none)
90
- end.to_not raise_error
96
+ context.first!
97
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
91
98
  end
99
+ end
92
100
 
93
- it "returns nil when passing a hash" do
94
- expect(context.last(id_sort: :none)).to be_nil
101
+ describe "#last" do
102
+ it "returns nil" do
103
+ expect(context.last).to be_nil
95
104
  end
96
105
 
97
106
  it "returns [] when passing a limit" do
@@ -99,6 +108,14 @@ describe Mongoid::Contextual::None do
99
108
  end
100
109
  end
101
110
 
111
+ describe "#last!" do
112
+ it "raises an error" do
113
+ expect do
114
+ context.last!
115
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
116
+ end
117
+ end
118
+
102
119
  describe "#take" do
103
120
  it "returns nil" do
104
121
  expect(context.take).to be_nil
@@ -117,6 +134,28 @@ describe Mongoid::Contextual::None do
117
134
  end
118
135
  end
119
136
 
137
+ [ :second,
138
+ :third,
139
+ :fourth,
140
+ :fifth,
141
+ :second_to_last,
142
+ :third_to_last
143
+ ].each do |meth|
144
+ describe "##{meth}" do
145
+ it "returns nil" do
146
+ expect(context.send(meth)).to be_nil
147
+ end
148
+ end
149
+
150
+ describe "##{meth}!" do
151
+ it "raises an error" do
152
+ expect do
153
+ context.send("#{meth}!")
154
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
155
+ end
156
+ end
157
+ end
158
+
120
159
  describe "#length" do
121
160
  it "returns zero" do
122
161
  expect(context.length).to eq(0)
@@ -90,7 +90,7 @@ describe Mongoid::Copyable do
90
90
  end
91
91
 
92
92
  it 'calls constructor with explicitly declared attributes only' do
93
- expect(cls).to receive(:new).with('name' => 'test').and_call_original
93
+ expect(Mongoid::Factory).to receive(:build).with(cls, { 'name' => 'test' }).and_call_original
94
94
  cloned
95
95
  end
96
96
  end
@@ -164,19 +164,15 @@ describe Mongoid::Copyable do
164
164
  end
165
165
 
166
166
  context "when cloning a document with multiple languages field" do
167
+ with_default_i18n_configs
167
168
 
168
169
  before do
169
- I18n.enforce_available_locales = false
170
170
  I18n.locale = 'pt_BR'
171
171
  person.desc = "descrição"
172
172
  person.addresses.first.name = "descrição"
173
173
  person.save!
174
174
  end
175
175
 
176
- after do
177
- I18n.locale = :en
178
- end
179
-
180
176
  let!(:from_db) do
181
177
  Person.find(person.id)
182
178
  end
@@ -212,22 +208,18 @@ describe Mongoid::Copyable do
212
208
  end
213
209
 
214
210
  context "when cloning a document with polymorphic embedded documents with multiple language field" do
211
+ with_default_i18n_configs
215
212
 
216
213
  let!(:shipment_address) do
217
214
  person.addresses.build({ shipping_name: "Title" }, ShipmentAddress)
218
215
  end
219
216
 
220
217
  before do
221
- I18n.enforce_available_locales = false
222
218
  I18n.locale = 'pt_BR'
223
219
  person.addresses.type(ShipmentAddress).each { |address| address.shipping_name = "Título" }
224
220
  person.save!
225
221
  end
226
222
 
227
- after do
228
- I18n.locale = :en
229
- end
230
-
231
223
  let!(:from_db) do
232
224
  Person.find(person.id)
233
225
  end
@@ -696,5 +688,455 @@ describe Mongoid::Copyable do
696
688
  end
697
689
  end
698
690
  end
691
+
692
+ context "when fields are removed before cloning" do
693
+
694
+ context "when using embeds_one associations" do
695
+
696
+ before do
697
+ class CloneParent
698
+ include Mongoid::Document
699
+
700
+ embeds_one :clone_child
701
+
702
+ field :a, type: :string
703
+ field :b, type: :string
704
+ end
705
+
706
+ class CloneChild
707
+ include Mongoid::Document
708
+
709
+ embedded_in :clone_parent
710
+ embeds_one :clone_grandchild
711
+
712
+ field :c, type: :string
713
+ field :d, type: :string
714
+ end
715
+
716
+ class CloneGrandchild
717
+ include Mongoid::Document
718
+
719
+ embedded_in :clone_child
720
+
721
+ field :e, type: :string
722
+ field :f, type: :string
723
+ end
724
+
725
+ end
726
+
727
+ after do
728
+ Object.send(:remove_const, :CloneParent)
729
+ Object.send(:remove_const, :CloneChild)
730
+ Object.send(:remove_const, :CloneGrandchild)
731
+ end
732
+
733
+ context "when removing from the parent" do
734
+
735
+ before do
736
+ CloneParent.create(a: "1", b: "2")
737
+
738
+ Object.send(:remove_const, :CloneParent)
739
+
740
+ class CloneParent
741
+ include Mongoid::Document
742
+ field :a, type: :string
743
+ end
744
+ end
745
+
746
+ let(:parent) { CloneParent.last }
747
+ let(:clone) { parent.send(method) }
748
+
749
+ it "doesn't have the removed field" do
750
+ expect do
751
+ parent.b
752
+ end.to raise_error(NoMethodError)
753
+ end
754
+
755
+ it "contains the missing field in the attributes" do
756
+ expect(parent.attributes).to include({ "b" => "2" })
757
+ end
758
+
759
+ it "clones correctly" do
760
+ expect(clone).to be_a(CloneParent)
761
+ expect(clone.a).to eq("1")
762
+ expect(clone.attributes).to include({ "b" => "2" })
763
+ end
764
+ end
765
+
766
+ context "when removing from the child" do
767
+
768
+ before do
769
+ parent = CloneParent.new(a: "1", b: "2")
770
+ parent.clone_child = CloneChild.new(c: "3", d: "4")
771
+ parent.save
772
+
773
+ Object.send(:remove_const, :CloneParent)
774
+ Object.send(:remove_const, :CloneChild)
775
+
776
+ class CloneParent
777
+ include Mongoid::Document
778
+ embeds_one :clone_child
779
+ field :a, type: :string
780
+ field :b, type: :string
781
+ end
782
+
783
+ class CloneChild
784
+ include Mongoid::Document
785
+ embedded_in :clone_parent
786
+ field :c, type: :string
787
+ end
788
+ end
789
+
790
+ let(:parent) { CloneParent.last }
791
+ let(:clone) { parent.send(method) }
792
+
793
+ it "doesn't have the removed field" do
794
+ expect do
795
+ parent.clone_child.d
796
+ end.to raise_error(NoMethodError)
797
+ end
798
+
799
+ it "contains the missing field in the attributes" do
800
+ expect(parent.clone_child.attributes).to include({ "d" => "4" })
801
+ end
802
+
803
+ it "clones the parent correctly" do
804
+ expect(clone).to be_a(CloneParent)
805
+ expect(clone.a).to eq("1")
806
+ expect(clone.b).to eq("2")
807
+ end
808
+
809
+ it "clones the child correctly" do
810
+ expect(clone.clone_child).to be_a(CloneChild)
811
+ expect(clone.clone_child.c).to eq("3")
812
+ expect(clone.clone_child.attributes).to include({ "d" => "4" })
813
+ end
814
+ end
815
+
816
+ context "when removing from the grandchild" do
817
+
818
+ before do
819
+ parent = CloneParent.new(a: "1", b: "2")
820
+ parent.clone_child = CloneChild.new(c: "3", d: "4")
821
+ parent.clone_child.clone_grandchild = CloneGrandchild.new(e: "5", f: "6")
822
+ parent.save
823
+
824
+ Object.send(:remove_const, :CloneParent)
825
+ Object.send(:remove_const, :CloneChild)
826
+ Object.send(:remove_const, :CloneGrandchild)
827
+
828
+ class CloneParent
829
+ include Mongoid::Document
830
+ embeds_one :clone_child
831
+ field :a, type: :string
832
+ field :b, type: :string
833
+ end
834
+
835
+ class CloneChild
836
+ include Mongoid::Document
837
+ embedded_in :clone_parent
838
+ embeds_one :clone_grandchild
839
+ field :c, type: :string
840
+ field :d, type: :string
841
+ end
842
+
843
+ class CloneGrandchild
844
+ include Mongoid::Document
845
+ embedded_in :clone_child
846
+ field :e, type: :string
847
+ end
848
+ end
849
+
850
+ let(:parent) { CloneParent.last }
851
+ let(:clone) { parent.send(method) }
852
+
853
+ it "doesn't have the removed field" do
854
+ expect do
855
+ parent.clone_child.clone_grandchild.f
856
+ end.to raise_error(NoMethodError)
857
+ end
858
+
859
+ it "contains the missing field in the attributes" do
860
+ expect(parent.clone_child.clone_grandchild.attributes).to include({ "f" => "6" })
861
+ end
862
+
863
+ it "clones the parent correctly" do
864
+ expect(clone).to be_a(CloneParent)
865
+ expect(clone.a).to eq("1")
866
+ expect(clone.b).to eq("2")
867
+ end
868
+
869
+ it "clones the child correctly" do
870
+ expect(clone.clone_child).to be_a(CloneChild)
871
+ expect(clone.clone_child.c).to eq("3")
872
+ expect(clone.clone_child.d).to eq("4")
873
+ end
874
+
875
+ it "clones the child correctly" do
876
+ expect(clone.clone_child.clone_grandchild).to be_a(CloneGrandchild)
877
+ expect(clone.clone_child.clone_grandchild.e).to eq("5")
878
+ expect(clone.clone_child.clone_grandchild.attributes).to include({ "f" => "6" })
879
+ end
880
+ end
881
+ end
882
+
883
+ context "when using embeds_many associations" do
884
+
885
+ before do
886
+ class CloneParent
887
+ include Mongoid::Document
888
+
889
+ embeds_many :clone_children
890
+
891
+ field :a, type: :string
892
+ field :b, type: :string
893
+ end
894
+
895
+ class CloneChild
896
+ include Mongoid::Document
897
+
898
+ embedded_in :clone_parent
899
+ embeds_many :clone_grandchildren
900
+
901
+ field :c, type: :string
902
+ field :d, type: :string
903
+ end
904
+
905
+ class CloneGrandchild
906
+ include Mongoid::Document
907
+
908
+ embedded_in :clone_child
909
+
910
+ field :e, type: :string
911
+ field :f, type: :string
912
+ end
913
+
914
+ end
915
+
916
+ after do
917
+ Object.send(:remove_const, :CloneParent)
918
+ Object.send(:remove_const, :CloneChild)
919
+ Object.send(:remove_const, :CloneGrandchild)
920
+ end
921
+
922
+ context "when removing from the parent" do
923
+
924
+ before do
925
+ CloneParent.create(a: "1", b: "2")
926
+
927
+ Object.send(:remove_const, :CloneParent)
928
+
929
+ class CloneParent
930
+ include Mongoid::Document
931
+ field :a, type: :string
932
+ end
933
+ end
934
+
935
+ let(:parent) { CloneParent.last }
936
+ let(:clone) { parent.send(method) }
937
+
938
+ it "doesn't have the removed field" do
939
+ expect do
940
+ parent.b
941
+ end.to raise_error(NoMethodError)
942
+ end
943
+
944
+ it "contains the missing field in the attributes" do
945
+ expect(parent.attributes).to include({ "b" => "2" })
946
+ end
947
+
948
+ it "clones correctly" do
949
+ expect(clone).to be_a(CloneParent)
950
+ expect(clone.a).to eq("1")
951
+ expect(clone.attributes).to include({ "b" => "2" })
952
+ end
953
+ end
954
+
955
+ context "when removing from the child" do
956
+
957
+ before do
958
+ parent = CloneParent.new(a: "1", b: "2")
959
+ parent.clone_children = [ CloneChild.new(c: "3", d: "4"), CloneChild.new(c: "3", d: "4") ]
960
+ parent.save
961
+
962
+ Object.send(:remove_const, :CloneParent)
963
+ Object.send(:remove_const, :CloneChild)
964
+
965
+ class CloneParent
966
+ include Mongoid::Document
967
+ embeds_many :clone_children
968
+ field :a, type: :string
969
+ field :b, type: :string
970
+ end
971
+
972
+ class CloneChild
973
+ include Mongoid::Document
974
+ embedded_in :clone_parent
975
+ field :c, type: :string
976
+ end
977
+ end
978
+
979
+ let(:parent) { CloneParent.last }
980
+ let(:clone) { parent.send(method) }
981
+
982
+ it "doesn't have the removed field" do
983
+ parent.clone_children.each do |clone_child|
984
+ expect do
985
+ clone_child.d
986
+ end.to raise_error(NoMethodError)
987
+ end
988
+ end
989
+
990
+ it "contains the missing field in the attributes" do
991
+ expect(parent.clone_children[0].attributes).to include({ "d" => "4" })
992
+ expect(parent.clone_children[1].attributes).to include({ "d" => "4" })
993
+ end
994
+
995
+ it "clones the parent correctly" do
996
+ expect(clone).to be_a(CloneParent)
997
+ expect(clone.a).to eq("1")
998
+ expect(clone.b).to eq("2")
999
+ end
1000
+
1001
+ it "clones the child correctly" do
1002
+ expect(clone.clone_children.length).to eq(2)
1003
+ clone.clone_children.each do |clone_child|
1004
+ expect(clone_child).to be_a(CloneChild)
1005
+ expect(clone_child.c).to eq("3")
1006
+ expect(clone_child.attributes).to include({ "d" => "4" })
1007
+ end
1008
+ end
1009
+ end
1010
+
1011
+ context "when removing from the grandchild" do
1012
+
1013
+ before do
1014
+ parent = CloneParent.new(a: "1", b: "2")
1015
+ parent.clone_children = [ CloneChild.new(c: "3", d: "4"), CloneChild.new(c: "3", d: "4") ]
1016
+ parent.clone_children.each do |cc|
1017
+ cc.clone_grandchildren = [ CloneGrandchild.new(e: "5", f: "6"), CloneGrandchild.new(e: "5", f: "6") ]
1018
+ end
1019
+ parent.save
1020
+
1021
+ Object.send(:remove_const, :CloneParent)
1022
+ Object.send(:remove_const, :CloneChild)
1023
+ Object.send(:remove_const, :CloneGrandchild)
1024
+
1025
+ class CloneParent
1026
+ include Mongoid::Document
1027
+ embeds_many :clone_children
1028
+ field :a, type: :string
1029
+ field :b, type: :string
1030
+ end
1031
+
1032
+ class CloneChild
1033
+ include Mongoid::Document
1034
+ embedded_in :clone_parent
1035
+ embeds_many :clone_grandchildren
1036
+ field :c, type: :string
1037
+ field :d, type: :string
1038
+ end
1039
+
1040
+ class CloneGrandchild
1041
+ include Mongoid::Document
1042
+ embedded_in :clone_child
1043
+ field :e, type: :string
1044
+ end
1045
+ end
1046
+
1047
+ let(:parent) { CloneParent.last }
1048
+ let(:clone) { parent.send(method) }
1049
+
1050
+ it "doesn't have the removed field" do
1051
+ parent.clone_children.each do |cc|
1052
+ cc.clone_grandchildren.each do |cg|
1053
+ expect do
1054
+ cg.f
1055
+ end.to raise_error(NoMethodError)
1056
+ end
1057
+ end
1058
+ end
1059
+
1060
+ it "contains the missing field in the attributes" do
1061
+ parent.clone_children.each do |cc|
1062
+ cc.clone_grandchildren.each do |cg|
1063
+ expect(cg.attributes).to include({ "f" => "6" })
1064
+ end
1065
+ end
1066
+ end
1067
+
1068
+ it "clones the parent correctly" do
1069
+ expect(clone).to be_a(CloneParent)
1070
+ expect(clone.a).to eq("1")
1071
+ expect(clone.b).to eq("2")
1072
+ end
1073
+
1074
+ it "clones the child correctly" do
1075
+ expect(clone.clone_children.length).to eq(2)
1076
+ clone.clone_children.each do |clone_child|
1077
+ expect(clone_child).to be_a(CloneChild)
1078
+ expect(clone_child.c).to eq("3")
1079
+ expect(clone_child.attributes).to include({ "d" => "4" })
1080
+ end
1081
+ end
1082
+
1083
+ it "clones the grandchild correctly" do
1084
+ parent.clone_children.each do |cc|
1085
+ expect(cc.clone_grandchildren.length).to eq(2)
1086
+ cc.clone_grandchildren.each do |cg|
1087
+ expect(cg).to be_a(CloneGrandchild)
1088
+ expect(cg.e).to eq("5")
1089
+ expect(cg.attributes).to include({ "f" => "6" })
1090
+ end
1091
+ end
1092
+ end
1093
+ end
1094
+ end
1095
+
1096
+ context "when using embedded_in associations" do
1097
+
1098
+ before do
1099
+ class CloneParent
1100
+ include Mongoid::Document
1101
+
1102
+ embeds_one :clone_child
1103
+
1104
+ field :a, type: :string
1105
+ field :b, type: :string
1106
+ end
1107
+
1108
+ class CloneChild
1109
+ include Mongoid::Document
1110
+
1111
+ embedded_in :clone_parent
1112
+
1113
+ field :c, type: :string
1114
+ field :d, type: :string
1115
+ end
1116
+ end
1117
+
1118
+ after do
1119
+ Object.send(:remove_const, :CloneParent)
1120
+ Object.send(:remove_const, :CloneChild)
1121
+ end
1122
+
1123
+
1124
+ context "when accessing the parent" do
1125
+
1126
+ before do
1127
+ parent = CloneParent.new(a: "1", b: "2")
1128
+ parent.clone_child = CloneChild.new(c: "3", d: "4")
1129
+ parent.save
1130
+ end
1131
+
1132
+ let(:parent) { CloneParent.last }
1133
+ let(:clone) { parent.clone_child.send(method) }
1134
+
1135
+ it "doesn't clone the parent" do
1136
+ expect(clone.clone_parent).to be_nil
1137
+ end
1138
+ end
1139
+ end
1140
+ end
699
1141
  end
700
1142
  end