mongoid 7.5.4 → 8.1.9

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 (446) 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 +32 -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 +11 -6
  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 +48 -39
  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 +135 -36
  121. data/lib/mongoid/equality.rb +9 -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 +187 -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 +9 -2
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +41 -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 +26 -3
  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/association_spec.rb +60 -0
  269. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  270. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  271. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  272. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  273. data/spec/mongoid/attributes/readonly_spec.rb +19 -0
  274. data/spec/mongoid/attributes_spec.rb +526 -33
  275. data/spec/mongoid/changeable_spec.rb +429 -37
  276. data/spec/mongoid/clients/factory_spec.rb +23 -30
  277. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  278. data/spec/mongoid/clients_spec.rb +149 -15
  279. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  280. data/spec/mongoid/config/defaults_spec.rb +160 -0
  281. data/spec/mongoid/config_spec.rb +214 -31
  282. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  283. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  284. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  285. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  286. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  287. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  288. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  289. data/spec/mongoid/contextual/none_spec.rb +60 -21
  290. data/spec/mongoid/copyable_spec.rb +453 -11
  291. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  292. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  293. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  294. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  295. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  296. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  297. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  299. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  300. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  301. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  302. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  303. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  305. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  306. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  307. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  308. data/spec/mongoid/criteria/queryable/selectable_spec.rb +107 -86
  309. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  310. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  311. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  312. data/spec/mongoid/criteria_spec.rb +469 -1205
  313. data/spec/mongoid/document_fields_spec.rb +173 -24
  314. data/spec/mongoid/document_spec.rb +59 -41
  315. data/spec/mongoid/equality_spec.rb +6 -0
  316. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  317. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  318. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  319. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  320. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  321. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  323. data/spec/mongoid/extensions/array_spec.rb +16 -2
  324. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  325. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  326. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  327. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  328. data/spec/mongoid/extensions/date_spec.rb +71 -1
  329. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  330. data/spec/mongoid/extensions/float_spec.rb +53 -74
  331. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  332. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  333. data/spec/mongoid/extensions/range_spec.rb +255 -54
  334. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  335. data/spec/mongoid/extensions/set_spec.rb +106 -0
  336. data/spec/mongoid/extensions/string_spec.rb +53 -25
  337. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  338. data/spec/mongoid/extensions/time_spec.rb +639 -106
  339. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  340. data/spec/mongoid/factory_spec.rb +61 -1
  341. data/spec/mongoid/fields/localized_spec.rb +80 -37
  342. data/spec/mongoid/fields_spec.rb +503 -87
  343. data/spec/mongoid/findable_spec.rb +450 -58
  344. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  345. data/spec/mongoid/indexable_spec.rb +55 -30
  346. data/spec/mongoid/interceptable_spec.rb +904 -22
  347. data/spec/mongoid/interceptable_spec_models.rb +189 -22
  348. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  349. data/spec/mongoid/mongoizable_spec.rb +285 -0
  350. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  351. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  353. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  354. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  355. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  358. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  360. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  361. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  363. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  364. data/spec/mongoid/persistence_context_spec.rb +31 -57
  365. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  366. data/spec/mongoid/query_cache_spec.rb +56 -215
  367. data/spec/mongoid/reloadable_spec.rb +83 -6
  368. data/spec/mongoid/scopable_spec.rb +91 -1
  369. data/spec/mongoid/serializable_spec.rb +25 -39
  370. data/spec/mongoid/shardable_spec.rb +4 -4
  371. data/spec/mongoid/stateful_spec.rb +150 -8
  372. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  373. data/spec/mongoid/tasks/database_spec.rb +127 -0
  374. data/spec/mongoid/timestamps/created_spec.rb +23 -0
  375. data/spec/mongoid/timestamps_spec.rb +392 -4
  376. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  377. data/spec/mongoid/touchable_spec.rb +390 -2
  378. data/spec/mongoid/touchable_spec_models.rb +14 -8
  379. data/spec/mongoid/traversable_spec.rb +13 -35
  380. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  381. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  382. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  383. data/spec/mongoid/warnings_spec.rb +35 -0
  384. data/spec/mongoid_spec.rb +34 -16
  385. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  386. data/spec/rails/mongoid_spec.rb +4 -16
  387. data/spec/spec_helper.rb +5 -0
  388. data/spec/support/constraints.rb +24 -0
  389. data/spec/support/immutable_ids.rb +118 -0
  390. data/spec/support/macros.rb +78 -0
  391. data/spec/support/models/artist.rb +0 -1
  392. data/spec/support/models/augmentation.rb +12 -0
  393. data/spec/support/models/band.rb +5 -0
  394. data/spec/support/models/book.rb +1 -0
  395. data/spec/support/models/building.rb +2 -0
  396. data/spec/support/models/catalog.rb +24 -0
  397. data/spec/support/models/circus.rb +3 -0
  398. data/spec/support/models/cover.rb +10 -0
  399. data/spec/support/models/fanatic.rb +8 -0
  400. data/spec/support/models/implant.rb +9 -0
  401. data/spec/support/models/label.rb +2 -0
  402. data/spec/support/models/lat_lng.rb +6 -0
  403. data/spec/support/models/name.rb +10 -0
  404. data/spec/support/models/passport.rb +9 -0
  405. data/spec/support/models/person.rb +2 -0
  406. data/spec/support/models/player.rb +2 -0
  407. data/spec/support/models/powerup.rb +12 -0
  408. data/spec/support/models/product.rb +1 -0
  409. data/spec/support/models/purse.rb +9 -0
  410. data/spec/support/models/registry.rb +1 -0
  411. data/spec/support/models/school.rb +14 -0
  412. data/spec/support/models/shield.rb +18 -0
  413. data/spec/support/models/student.rb +14 -0
  414. data/spec/support/models/weapon.rb +12 -0
  415. metadata +98 -96
  416. checksums.yaml.gz.sig +0 -0
  417. data/lib/mongoid/errors/eager_load.rb +0 -23
  418. data/lib/mongoid/errors/invalid_value.rb +0 -17
  419. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  420. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  421. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  422. data/spec/shared/LICENSE +0 -20
  423. data/spec/shared/bin/get-mongodb-download-url +0 -17
  424. data/spec/shared/bin/s3-copy +0 -45
  425. data/spec/shared/bin/s3-upload +0 -69
  426. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  427. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  428. data/spec/shared/lib/mrss/constraints.rb +0 -378
  429. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  430. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  431. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  432. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  433. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  434. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  435. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  436. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  437. data/spec/shared/lib/mrss/utils.rb +0 -15
  438. data/spec/shared/share/Dockerfile.erb +0 -325
  439. data/spec/shared/share/haproxy-1.conf +0 -16
  440. data/spec/shared/share/haproxy-2.conf +0 -17
  441. data/spec/shared/shlib/config.sh +0 -27
  442. data/spec/shared/shlib/distro.sh +0 -74
  443. data/spec/shared/shlib/server.sh +0 -392
  444. data/spec/shared/shlib/set_env.sh +0 -169
  445. data.tar.gz.sig +0 -0
  446. metadata.gz.sig +0 -3
@@ -1,10 +1,12 @@
1
1
  module InterceptableSpec
2
2
  class CallbackRegistry
3
- def initialize
3
+ def initialize(only: [])
4
4
  @calls = []
5
+ @only = only
5
6
  end
6
7
 
7
8
  def record_call(cls, cb)
9
+ return unless @only.empty? || @only.any? { |pat| pat == cb }
8
10
  @calls << [cls, cb]
9
11
  end
10
12
 
@@ -15,62 +17,227 @@ module InterceptableSpec
15
17
  extend ActiveSupport::Concern
16
18
 
17
19
  included do
20
+ field :name, type: String
21
+
18
22
  %i(
19
23
  validation save create update
20
24
  ).each do |what|
21
25
  %i(before after).each do |whn|
22
26
  send("#{whn}_#{what}", "#{whn}_#{what}_stub".to_sym)
23
27
  define_method("#{whn}_#{what}_stub") do
24
- callback_registry.record_call(self.class, "#{whn}_#{what}".to_sym)
28
+ callback_registry&.record_call(self.class, "#{whn}_#{what}".to_sym)
29
+ end
30
+ end
31
+ unless what == :validation
32
+ send("around_#{what}", "around_#{what}_stub".to_sym)
33
+ define_method("around_#{what}_stub") do |&block|
34
+ callback_registry&.record_call(self.class, "around_#{what}_open".to_sym)
35
+ block.call
36
+ callback_registry&.record_call(self.class, "around_#{what}_close".to_sym)
25
37
  end
26
38
  end
27
39
  end
28
40
  end
29
- end
30
41
 
31
- class CbParent
32
- include Mongoid::Document
42
+ attr_accessor :callback_registry
33
43
 
34
- def initialize(callback_registry)
44
+ def initialize(callback_registry, *args, **kwargs)
35
45
  @callback_registry = callback_registry
36
- super()
46
+ super(*args, **kwargs)
37
47
  end
48
+ end
38
49
 
39
- attr_reader :callback_registry
50
+ module RootInsertable
51
+ def insert_as_root
52
+ @callback_registry&.record_call(self.class, :insert_into_database)
53
+ super
54
+ end
55
+ end
40
56
 
41
- embeds_many :cb_children
42
- embeds_many :cb_cascaded_children, cascade_callbacks: true
57
+ class CbHasOneParent
58
+ include Mongoid::Document
59
+ include CallbackTracking
60
+ include RootInsertable
43
61
 
62
+ has_one :child, autosave: true, class_name: "CbHasOneChild", inverse_of: :parent
63
+ end
64
+
65
+ class CbHasOneChild
66
+ include Mongoid::Document
44
67
  include CallbackTracking
68
+
69
+ belongs_to :parent, class_name: "CbHasOneParent", inverse_of: :child
45
70
  end
46
71
 
47
- class CbChild
72
+ class CbHasManyParent
48
73
  include Mongoid::Document
74
+ include CallbackTracking
75
+ include RootInsertable
49
76
 
50
- embedded_in :cb_parent
77
+ has_many :children, autosave: true, class_name: "CbHasManyChild", inverse_of: :parent
78
+ end
51
79
 
52
- def initialize(callback_registry, options)
53
- @callback_registry = callback_registry
54
- super(options)
55
- end
80
+ class CbHasManyChild
81
+ include Mongoid::Document
82
+ include CallbackTracking
56
83
 
57
- attr_reader :callback_registry
84
+ belongs_to :parent, class_name: "CbHasManyParent", inverse_of: :children
85
+ end
58
86
 
87
+ class CbEmbedsOneParent
88
+ include Mongoid::Document
59
89
  include CallbackTracking
90
+ include RootInsertable
91
+
92
+ field :name
93
+
94
+ embeds_one :child, cascade_callbacks: true, class_name: "CbEmbedsOneChild", inverse_of: :parent
95
+ end
96
+
97
+ class CbEmbedsOneChild
98
+ include Mongoid::Document
99
+ include CallbackTracking
100
+
101
+ field :age
102
+
103
+ embedded_in :parent, class_name: "CbEmbedsOneParent", inverse_of: :child
104
+ end
105
+
106
+ class CbEmbedsManyParent
107
+ include Mongoid::Document
108
+ include CallbackTracking
109
+ include RootInsertable
110
+
111
+ embeds_many :children, cascade_callbacks: true, class_name: "CbEmbedsManyChild", inverse_of: :parent
112
+ end
113
+
114
+ class CbEmbedsManyChild
115
+ include Mongoid::Document
116
+ include CallbackTracking
117
+
118
+ embedded_in :parent, class_name: "CbEmbedsManyParent", inverse_of: :children
119
+ end
120
+
121
+ class CbParent
122
+ include Mongoid::Document
123
+ include CallbackTracking
124
+
125
+ embeds_many :cb_children
126
+ embeds_many :cb_cascaded_children, cascade_callbacks: true
127
+ embeds_many :cb_cascaded_nodes, cascade_callbacks: true, as: :parent
128
+ end
129
+
130
+ class CbChild
131
+ include Mongoid::Document
132
+ include CallbackTracking
133
+
134
+ embedded_in :cb_parent
60
135
  end
61
136
 
62
137
  class CbCascadedChild
63
138
  include Mongoid::Document
139
+ include CallbackTracking
64
140
 
65
141
  embedded_in :cb_parent
66
142
 
67
- def initialize(callback_registry, options)
68
- @callback_registry = callback_registry
69
- super(options)
70
- end
143
+ before_save :test_mongoid_state
71
144
 
72
- attr_reader :callback_registry
145
+ private
146
+
147
+ # Helps test that cascading child callbacks have access to the Mongoid
148
+ # state objects; if the implementation uses fiber-local (instead of truly
149
+ # thread-local) variables, the related tests will fail because the
150
+ # cascading child callbacks use fibers to linearize the recursion.
151
+ def test_mongoid_state
152
+ Mongoid::Threaded.stack('interceptable').push(self)
153
+ end
154
+ end
73
155
 
156
+ class CbCascadedNode
157
+ include Mongoid::Document
74
158
  include CallbackTracking
159
+
160
+ embedded_in :parent, polymorphic: true
161
+
162
+ embeds_many :cb_cascaded_nodes, cascade_callbacks: true, as: :parent
163
+ end
164
+ end
165
+
166
+ class InterceptableBand
167
+ include Mongoid::Document
168
+
169
+ has_many :songs, class_name: "InterceptableSong"
170
+ field :name
171
+ end
172
+
173
+ class InterceptableSong
174
+ include Mongoid::Document
175
+
176
+ belongs_to :band, class_name: "InterceptableBand"
177
+ field :band_name, default: -> { band.name }
178
+ field :name
179
+ end
180
+
181
+ class InterceptablePlane
182
+ include Mongoid::Document
183
+
184
+ has_many :wings, class_name: "InterceptableWing"
185
+ end
186
+
187
+ class InterceptableWing
188
+ include Mongoid::Document
189
+
190
+ belongs_to :plane, class_name: "InterceptablePlane"
191
+ has_one :engine, autobuild: true, class_name: "InterceptableEngine"
192
+
193
+ field :_id, type: String, default: -> { 'hello-wing' }
194
+
195
+ field :p_id, type: String, default: -> { plane&.id }
196
+ field :e_id, type: String, default: -> { engine&.id }
197
+ end
198
+
199
+ class InterceptableEngine
200
+ include Mongoid::Document
201
+
202
+ belongs_to :wing, class_name: "InterceptableWing"
203
+
204
+ field :_id, type: String, default: -> { "hello-engine-#{wing&.id}" }
205
+ end
206
+
207
+ class InterceptableCompany
208
+ include Mongoid::Document
209
+
210
+ has_many :users, class_name: "InterceptableUser"
211
+ has_many :shops, class_name: "InterceptableShop"
212
+ end
213
+
214
+ class InterceptableShop
215
+ include Mongoid::Document
216
+
217
+ embeds_one :address, class_name: "InterceptableAddress"
218
+ belongs_to :company, class_name: "InterceptableCompany"
219
+
220
+ after_initialize :build_address1
221
+
222
+ def build_address1
223
+ self.address ||= Address.new
75
224
  end
76
225
  end
226
+
227
+ class InterceptableAddress
228
+ include Mongoid::Document
229
+ embedded_in :shop, class_name: "InterceptableShop"
230
+ end
231
+
232
+ class InterceptableUser
233
+ include Mongoid::Document
234
+
235
+ belongs_to :company, class_name: "InterceptableCompany"
236
+
237
+ validate :break_mongoid
238
+
239
+ def break_mongoid
240
+ company.shop_ids
241
+ end
242
+ end
243
+
@@ -5,11 +5,7 @@ require 'spec_helper'
5
5
  describe 'Matcher.extract_attribute' do
6
6
  Dir[File.join(File.dirname(__FILE__), 'extract_attribute_data', '*.yml')].sort.each do |path|
7
7
  context File.basename(path) do
8
- specs = if RUBY_VERSION.start_with?("2.5")
9
- YAML.safe_load(File.read(path), [], [], true)
10
- else
11
- YAML.safe_load(File.read(path), aliases: true)
12
- end
8
+ specs = YAML.safe_load(File.read(path), aliases: true)
13
9
 
14
10
  specs.each do |spec|
15
11
  context spec['name'] do
@@ -0,0 +1,285 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ # This file is for testing the functionality of uncastable values for all
6
+ # mongoizable classes.
7
+ describe "mongoize/demongoize/evolve methods" do
8
+
9
+ shared_examples "handles unmongoizable values" do
10
+
11
+ context "when passing an invalid value" do
12
+ context "to mongoize" do
13
+ it "returns nil" do
14
+ expect(klass.mongoize(invalid_value)).to be_nil
15
+ end
16
+ end
17
+
18
+ context "when assigning an invalid value to a field" do
19
+ let(:catalog) { Catalog.create!(field_name => invalid_value) }
20
+
21
+ it "returns nil" do
22
+ catalog.attributes[field_name].should be_nil
23
+ end
24
+
25
+ it "persists nil" do
26
+ Catalog.find(catalog._id).attributes[field_name].should be_nil
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ shared_examples "handles undemongoizable values" do
33
+
34
+ context "when passing an invalid value" do
35
+ context "to demongoize" do
36
+ it "returns nil" do
37
+ expect(klass.demongoize(invalid_value)).to be_nil
38
+ end
39
+ end
40
+
41
+ context "when retrieving an invalid value from the db" do
42
+
43
+ before do
44
+ Catalog.collection.insert_one(field_name => invalid_value)
45
+ end
46
+
47
+ let(:catalog) { Catalog.first }
48
+
49
+ it "returns nil" do
50
+ catalog.send(field_name).should be_nil
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ shared_examples "pushes through unmongoizable values" do
57
+
58
+ context "when passing an invalid value" do
59
+ context "to mongoize" do
60
+ it "returns that value" do
61
+ expect(klass.mongoize(invalid_value)).to eq(mongoized_value)
62
+ end
63
+ end
64
+ end
65
+
66
+ context "when assigning an invalid value to a field" do
67
+ let!(:catalog) { Catalog.create!(field_name => invalid_value) }
68
+ let(:from_db) { Catalog.find(catalog._id) }
69
+
70
+ it "returns the inputted value" do
71
+ catalog.attributes[field_name].should be_nil
72
+ end
73
+
74
+ it "persists the inputted value" do
75
+ from_db.attributes[field_name].should be_nil
76
+ end
77
+ end
78
+ end
79
+
80
+ shared_examples "pushes through undemongoizable values" do
81
+
82
+ context "when reading an invalid value from the db" do
83
+ before do
84
+ Catalog.collection.insert_one(field_name => invalid_value)
85
+ end
86
+
87
+ let(:from_db) { Catalog.first }
88
+
89
+ it "reads the inputted value" do
90
+ from_db.send(field_name).should eq(demongoized_value)
91
+ end
92
+ end
93
+ end
94
+
95
+ shared_examples "pushes through unevolvable values" do
96
+
97
+ context "when passing an uncastable value to evolve" do
98
+
99
+ it "pushes the value through" do
100
+ expect(klass.evolve(invalid_value)).to eq(mongoized_value)
101
+ end
102
+ end
103
+ end
104
+
105
+ shared_examples "pushes through uncastable values" do
106
+ include_examples "pushes through unmongoizable values"
107
+ include_examples "pushes through undemongoizable values"
108
+ end
109
+
110
+ shared_examples "handles uncastable values" do
111
+ include_examples "handles unmongoizable values"
112
+ include_examples "handles undemongoizable values"
113
+ end
114
+
115
+ let(:mongoized_value) { invalid_value }
116
+ let(:demongoized_value) { invalid_value }
117
+
118
+ describe Array do
119
+ let(:invalid_value) { 1 }
120
+ let(:klass) { Array }
121
+ let(:field_name) { :array_field }
122
+
123
+ include_examples "handles unmongoizable values"
124
+ include_examples "pushes through undemongoizable values"
125
+ include_examples "pushes through unevolvable values"
126
+ end
127
+
128
+ describe BigDecimal do
129
+ let(:invalid_value) { "bogus" }
130
+ let(:klass) { described_class }
131
+ let(:field_name) { :big_decimal_field }
132
+
133
+ include_examples "handles uncastable values"
134
+ include_examples "pushes through unevolvable values"
135
+ end
136
+
137
+ describe Mongoid::Boolean do
138
+ let(:invalid_value) { "invalid_value" }
139
+ let(:klass) { described_class }
140
+ let(:field_name) { :boolean_field }
141
+
142
+ include_examples "handles uncastable values"
143
+ include_examples "pushes through unevolvable values"
144
+ end
145
+
146
+ describe Date do
147
+ let(:invalid_value) { :hello }
148
+ let(:klass) { described_class }
149
+ let(:field_name) { :date_field }
150
+
151
+ include_examples "handles uncastable values"
152
+ include_examples "pushes through unevolvable values"
153
+ end
154
+
155
+ describe DateTime do
156
+ let(:invalid_value) { :hello }
157
+ let(:klass) { described_class }
158
+ let(:field_name) { :date_time_field }
159
+
160
+ include_examples "handles uncastable values"
161
+ include_examples "pushes through unevolvable values"
162
+ end
163
+
164
+ describe Float do
165
+ let(:invalid_value) { [] }
166
+ let(:klass) { described_class }
167
+ let(:field_name) { :float_field }
168
+
169
+ include_examples "handles uncastable values"
170
+ include_examples "pushes through unevolvable values"
171
+ end
172
+
173
+ describe Hash do
174
+ let(:invalid_value) { 1 }
175
+ let(:klass) { described_class }
176
+ let(:field_name) { :hash_field }
177
+
178
+ include_examples "handles unmongoizable values"
179
+ include_examples "pushes through undemongoizable values"
180
+ include_examples "pushes through unevolvable values"
181
+ end
182
+
183
+ describe Integer do
184
+ let(:invalid_value) { [] }
185
+ let(:klass) { described_class }
186
+ let(:field_name) { :integer_field }
187
+
188
+ include_examples "handles uncastable values"
189
+ include_examples "pushes through unevolvable values"
190
+ end
191
+
192
+ describe BSON::ObjectId do
193
+ let(:invalid_value) { "invalid value" }
194
+ let(:klass) { described_class }
195
+ let(:field_name) { :object_id_field }
196
+
197
+ include_examples "pushes through uncastable values"
198
+ include_examples "pushes through unevolvable values"
199
+ end
200
+
201
+ describe BSON::Binary do
202
+ let(:invalid_value) { true }
203
+ let(:klass) { described_class }
204
+ let(:field_name) { :binary_field }
205
+
206
+ include_examples "handles uncastable values"
207
+ include_examples "pushes through unevolvable values"
208
+ end
209
+
210
+ describe Range do
211
+ let(:invalid_value) { "invalid value" }
212
+ let(:klass) { described_class }
213
+ let(:field_name) { :range_field }
214
+
215
+ include_examples "handles uncastable values"
216
+ include_examples "pushes through unevolvable values"
217
+ end
218
+
219
+ describe Regexp do
220
+ let(:invalid_value) { 1 }
221
+ let(:klass) { described_class }
222
+ let(:field_name) { :regexp_field }
223
+
224
+ include_examples "handles uncastable values"
225
+ include_examples "pushes through unevolvable values"
226
+ end
227
+
228
+ describe Set do
229
+ let(:invalid_value) { 1 }
230
+ let(:klass) { described_class }
231
+ let(:field_name) { :set_field }
232
+
233
+ include_examples "handles uncastable values"
234
+ include_examples "pushes through unevolvable values"
235
+ end
236
+
237
+ describe String do
238
+ let(:invalid_value) { 1 }
239
+ let(:mongoized_value) { "1" }
240
+ let(:demongoized_value) { "1" }
241
+ let(:klass) { described_class }
242
+ let(:field_name) { :string_field }
243
+
244
+ include_examples "pushes through uncastable values"
245
+ include_examples "pushes through unevolvable values"
246
+ end
247
+
248
+ describe Mongoid::StringifiedSymbol do
249
+ let(:invalid_value) { [] }
250
+ let(:mongoized_value) { "[]" }
251
+ let(:demongoized_value) { :[] }
252
+ let(:klass) { described_class }
253
+ let(:field_name) { :stringified_symbol_field }
254
+
255
+ include_examples "pushes through uncastable values"
256
+ include_examples "pushes through unevolvable values"
257
+ end
258
+
259
+ describe Symbol do
260
+ let(:invalid_value) { Time.new }
261
+ let(:klass) { described_class }
262
+ let(:field_name) { :symbol_field }
263
+
264
+ include_examples "handles uncastable values"
265
+ include_examples "pushes through unevolvable values"
266
+ end
267
+
268
+ describe Time do
269
+ let(:invalid_value) { "invalid value" }
270
+ let(:klass) { described_class }
271
+ let(:field_name) { :time_field }
272
+
273
+ include_examples "handles uncastable values"
274
+ include_examples "pushes through unevolvable values"
275
+ end
276
+
277
+ describe ActiveSupport::TimeWithZone do
278
+ let(:invalid_value) { "invalid value" }
279
+ let(:klass) { described_class }
280
+ let(:field_name) { :time_with_zone_field }
281
+
282
+ include_examples "handles uncastable values"
283
+ include_examples "pushes through unevolvable values"
284
+ end
285
+ end
@@ -234,11 +234,11 @@ describe Mongoid::Persistable::Creatable do
234
234
  end
235
235
 
236
236
  let(:attributes) do
237
- collection.find({ name: "Testy"}).first
237
+ collection.find({ name: "Testy" }).first
238
238
  end
239
239
 
240
240
  before do
241
- Browser.create(name: 'Safari', version: '4.0.0')
241
+ Browser.create(name: 'Safari', version: 4.0)
242
242
  end
243
243
 
244
244
  it "persists the versions" do
@@ -12,14 +12,34 @@ describe Mongoid::Persistable::Deletable do
12
12
 
13
13
  context "when deleting a readonly document" do
14
14
 
15
- let(:from_db) do
16
- Person.only(:_id).first
15
+ context "when legacy_attributes is true" do
16
+ config_override :legacy_readonly, true
17
+
18
+ let(:from_db) do
19
+ Person.only(:_id).first
20
+ end
21
+
22
+ it "raises an error" do
23
+ expect(from_db.readonly?).to be true
24
+ expect {
25
+ from_db.delete
26
+ }.to raise_error(Mongoid::Errors::ReadonlyDocument)
27
+ end
17
28
  end
18
29
 
19
- it "raises an error" do
20
- expect {
21
- from_db.delete
22
- }.to raise_error(Mongoid::Errors::ReadonlyDocument)
30
+ context "when legacy_attributes is false" do
31
+ config_override :legacy_readonly, false
32
+
33
+ let(:from_db) do
34
+ Person.first.tap(&:readonly!)
35
+ end
36
+
37
+ it "raises an error" do
38
+ expect(from_db.readonly?).to be true
39
+ expect {
40
+ from_db.delete
41
+ }.to raise_error(Mongoid::Errors::ReadonlyDocument)
42
+ end
23
43
  end
24
44
  end
25
45
 
@@ -33,7 +53,7 @@ describe Mongoid::Persistable::Deletable do
33
53
  it 'deletes the matching document from the database' do
34
54
  lambda do
35
55
  person.reload
36
- end.should raise_error(Mongoid::Errors::DocumentNotFound)
56
+ end.should raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Person with id\(s\)/)
37
57
  end
38
58
  end
39
59
 
@@ -46,7 +66,7 @@ describe Mongoid::Persistable::Deletable do
46
66
  it "deletes the document from the collection" do
47
67
  expect {
48
68
  Person.find(person.id)
49
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
69
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Person with id\(s\)/)
50
70
  end
51
71
 
52
72
  it "returns true" do
@@ -12,14 +12,34 @@ describe Mongoid::Persistable::Destroyable do
12
12
 
13
13
  context "when destroying a readonly document" do
14
14
 
15
- let(:from_db) do
16
- Person.only(:_id).first
15
+ context "when legacy_attributes is true" do
16
+ config_override :legacy_readonly, true
17
+
18
+ let(:from_db) do
19
+ Person.only(:_id).first
20
+ end
21
+
22
+ it "raises an error" do
23
+ expect(from_db.readonly?).to be true
24
+ expect {
25
+ from_db.destroy
26
+ }.to raise_error(Mongoid::Errors::ReadonlyDocument)
27
+ end
17
28
  end
18
29
 
19
- it "raises an error" do
20
- expect {
21
- from_db.destroy
22
- }.to raise_error(Mongoid::Errors::ReadonlyDocument)
30
+ context "when legacy_attributes is false" do
31
+ config_override :legacy_readonly, false
32
+
33
+ let(:from_db) do
34
+ Person.first.tap(&:readonly!)
35
+ end
36
+
37
+ it "raises an error" do
38
+ expect(from_db.readonly?).to be true
39
+ expect {
40
+ from_db.destroy
41
+ }.to raise_error(Mongoid::Errors::ReadonlyDocument)
42
+ end
23
43
  end
24
44
  end
25
45
 
@@ -33,7 +53,7 @@ describe Mongoid::Persistable::Destroyable do
33
53
  it 'deletes the matching document from the database' do
34
54
  lambda do
35
55
  person.reload
36
- end.should raise_error(Mongoid::Errors::DocumentNotFound)
56
+ end.should raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Person with id\(s\)/)
37
57
  end
38
58
  end
39
59
 
@@ -46,7 +66,7 @@ describe Mongoid::Persistable::Destroyable do
46
66
  it "destroys the document from the collection" do
47
67
  expect {
48
68
  Person.find(person.id)
49
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
69
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Person with id\(s\)/)
50
70
  end
51
71
 
52
72
  it "returns true" do