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
@@ -21,13 +21,165 @@ module InterceptableSpec
21
21
  %i(before after).each do |whn|
22
22
  send("#{whn}_#{what}", "#{whn}_#{what}_stub".to_sym)
23
23
  define_method("#{whn}_#{what}_stub") do
24
- callback_registry.record_call(self.class, "#{whn}_#{what}".to_sym)
24
+ callback_registry&.record_call(self.class, "#{whn}_#{what}".to_sym)
25
+ end
26
+ end
27
+ unless what == :validation
28
+ send("around_#{what}", "around_#{what}_stub".to_sym)
29
+ define_method("around_#{what}_stub") do |&block|
30
+ callback_registry&.record_call(self.class, "around_#{what}_open".to_sym)
31
+ block.call
32
+ callback_registry&.record_call(self.class, "around_#{what}_close".to_sym)
25
33
  end
26
34
  end
27
35
  end
28
36
  end
29
37
  end
30
38
 
39
+ class CbHasOneParent
40
+ include Mongoid::Document
41
+
42
+ has_one :child, autosave: true, class_name: "CbHasOneChild", inverse_of: :parent
43
+
44
+ def initialize(callback_registry)
45
+ @callback_registry = callback_registry
46
+ super()
47
+ end
48
+
49
+ attr_accessor :callback_registry
50
+
51
+ def insert_as_root
52
+ @callback_registry&.record_call(self.class, :insert_into_database)
53
+ super
54
+ end
55
+
56
+ include CallbackTracking
57
+ end
58
+
59
+ class CbHasOneChild
60
+ include Mongoid::Document
61
+
62
+ belongs_to :parent, class_name: "CbHasOneParent", inverse_of: :child
63
+
64
+ def initialize(callback_registry)
65
+ @callback_registry = callback_registry
66
+ super()
67
+ end
68
+
69
+ attr_accessor :callback_registry
70
+
71
+ include CallbackTracking
72
+ end
73
+
74
+ class CbHasManyParent
75
+ include Mongoid::Document
76
+
77
+ has_many :children, autosave: true, class_name: "CbHasManyChild", inverse_of: :parent
78
+
79
+ def initialize(callback_registry)
80
+ @callback_registry = callback_registry
81
+ super()
82
+ end
83
+
84
+ attr_accessor :callback_registry
85
+
86
+ def insert_as_root
87
+ @callback_registry&.record_call(self.class, :insert_into_database)
88
+ super
89
+ end
90
+
91
+ include CallbackTracking
92
+ end
93
+
94
+ class CbHasManyChild
95
+ include Mongoid::Document
96
+
97
+ belongs_to :parent, class_name: "CbHasManyParent", inverse_of: :children
98
+
99
+ def initialize(callback_registry)
100
+ @callback_registry = callback_registry
101
+ super()
102
+ end
103
+
104
+ attr_accessor :callback_registry
105
+
106
+ include CallbackTracking
107
+ end
108
+
109
+ class CbEmbedsOneParent
110
+ include Mongoid::Document
111
+
112
+ field :name
113
+
114
+ embeds_one :child, cascade_callbacks: true, class_name: "CbEmbedsOneChild", inverse_of: :parent
115
+
116
+ def initialize(callback_registry)
117
+ @callback_registry = callback_registry
118
+ super()
119
+ end
120
+
121
+ attr_accessor :callback_registry
122
+
123
+ def insert_as_root
124
+ @callback_registry&.record_call(self.class, :insert_into_database)
125
+ super
126
+ end
127
+
128
+ include CallbackTracking
129
+ end
130
+
131
+ class CbEmbedsOneChild
132
+ include Mongoid::Document
133
+
134
+ field :age
135
+
136
+ embedded_in :parent, class_name: "CbEmbedsOneParent", inverse_of: :child
137
+
138
+ def initialize(callback_registry)
139
+ @callback_registry = callback_registry
140
+ super()
141
+ end
142
+
143
+ attr_accessor :callback_registry
144
+
145
+ include CallbackTracking
146
+ end
147
+
148
+ class CbEmbedsManyParent
149
+ include Mongoid::Document
150
+
151
+ embeds_many :children, cascade_callbacks: true, class_name: "CbEmbedsManyChild", inverse_of: :parent
152
+
153
+ def initialize(callback_registry)
154
+ @callback_registry = callback_registry
155
+ super()
156
+ end
157
+
158
+ attr_accessor :callback_registry
159
+
160
+ def insert_as_root
161
+ @callback_registry&.record_call(self.class, :insert_into_database)
162
+ super
163
+ end
164
+
165
+ include CallbackTracking
166
+ end
167
+
168
+ class CbEmbedsManyChild
169
+ include Mongoid::Document
170
+
171
+ embedded_in :parent, class_name: "CbEmbedsManyParent", inverse_of: :children
172
+
173
+ def initialize(callback_registry)
174
+ @callback_registry = callback_registry
175
+ super()
176
+ end
177
+
178
+ attr_accessor :callback_registry
179
+
180
+ include CallbackTracking
181
+ end
182
+
31
183
  class CbParent
32
184
  include Mongoid::Document
33
185
 
@@ -36,7 +188,7 @@ module InterceptableSpec
36
188
  super()
37
189
  end
38
190
 
39
- attr_reader :callback_registry
191
+ attr_accessor :callback_registry
40
192
 
41
193
  embeds_many :cb_children
42
194
  embeds_many :cb_cascaded_children, cascade_callbacks: true
@@ -54,7 +206,7 @@ module InterceptableSpec
54
206
  super(options)
55
207
  end
56
208
 
57
- attr_reader :callback_registry
209
+ attr_accessor :callback_registry
58
210
 
59
211
  include CallbackTracking
60
212
  end
@@ -69,8 +221,87 @@ module InterceptableSpec
69
221
  super(options)
70
222
  end
71
223
 
72
- attr_reader :callback_registry
224
+ attr_accessor :callback_registry
73
225
 
74
226
  include CallbackTracking
75
227
  end
76
228
  end
229
+
230
+ class InterceptableBand
231
+ include Mongoid::Document
232
+
233
+ has_many :songs, class_name: "InterceptableSong"
234
+ field :name
235
+ end
236
+
237
+ class InterceptableSong
238
+ include Mongoid::Document
239
+
240
+ belongs_to :band, class_name: "InterceptableBand"
241
+ field :band_name, default: -> { band.name }
242
+ field :name
243
+ end
244
+
245
+ class InterceptablePlane
246
+ include Mongoid::Document
247
+
248
+ has_many :wings, class_name: "InterceptableWing"
249
+ end
250
+
251
+ class InterceptableWing
252
+ include Mongoid::Document
253
+
254
+ belongs_to :plane, class_name: "InterceptablePlane"
255
+ has_one :engine, autobuild: true, class_name: "InterceptableEngine"
256
+
257
+ field :_id, type: String, default: -> { 'hello-wing' }
258
+
259
+ field :p_id, type: String, default: -> { plane&.id }
260
+ field :e_id, type: String, default: -> { engine&.id }
261
+ end
262
+
263
+ class InterceptableEngine
264
+ include Mongoid::Document
265
+
266
+ belongs_to :wing, class_name: "InterceptableWing"
267
+
268
+ field :_id, type: String, default: -> { "hello-engine-#{wing&.id}" }
269
+ end
270
+
271
+ class InterceptableCompany
272
+ include Mongoid::Document
273
+
274
+ has_many :users, class_name: "InterceptableUser"
275
+ has_many :shops, class_name: "InterceptableShop"
276
+ end
277
+
278
+ class InterceptableShop
279
+ include Mongoid::Document
280
+
281
+ embeds_one :address, class_name: "InterceptableAddress"
282
+ belongs_to :company, class_name: "InterceptableCompany"
283
+
284
+ after_initialize :build_address1
285
+
286
+ def build_address1
287
+ self.address ||= Address.new
288
+ end
289
+ end
290
+
291
+ class InterceptableAddress
292
+ include Mongoid::Document
293
+ embedded_in :shop, class_name: "InterceptableShop"
294
+ end
295
+
296
+ class InterceptableUser
297
+ include Mongoid::Document
298
+
299
+ belongs_to :company, class_name: "InterceptableCompany"
300
+
301
+ validate :break_mongoid
302
+
303
+ def break_mongoid
304
+ company.shop_ids
305
+ end
306
+ end
307
+
@@ -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