mongoid 7.5.1 → 8.1.2

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 (424) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +6 -6
  5. data/Rakefile +25 -0
  6. data/lib/config/locales/en.yml +92 -43
  7. data/lib/mongoid/association/accessors.rb +40 -11
  8. data/lib/mongoid/association/bindable.rb +50 -2
  9. data/lib/mongoid/association/builders.rb +5 -3
  10. data/lib/mongoid/association/constrainable.rb +0 -1
  11. data/lib/mongoid/association/eager_loadable.rb +29 -7
  12. data/lib/mongoid/association/embedded/batchable.rb +54 -14
  13. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  17. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  21. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  22. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  24. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  25. data/lib/mongoid/association/macros.rb +8 -1
  26. data/lib/mongoid/association/many.rb +11 -7
  27. data/lib/mongoid/association/nested/many.rb +5 -4
  28. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  29. data/lib/mongoid/association/nested/one.rb +45 -7
  30. data/lib/mongoid/association/one.rb +2 -2
  31. data/lib/mongoid/association/options.rb +9 -9
  32. data/lib/mongoid/association/proxy.rb +15 -4
  33. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  34. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  35. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  36. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  37. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  38. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  39. data/lib/mongoid/association/referenced/eager.rb +2 -2
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  41. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  42. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  43. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  44. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  45. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  46. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  47. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  48. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  49. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  50. data/lib/mongoid/association/reflections.rb +4 -4
  51. data/lib/mongoid/association/relatable.rb +44 -10
  52. data/lib/mongoid/association.rb +5 -5
  53. data/lib/mongoid/atomic/modifiers.rb +2 -2
  54. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  55. data/lib/mongoid/atomic.rb +7 -0
  56. data/lib/mongoid/attributes/dynamic.rb +4 -4
  57. data/lib/mongoid/attributes/nested.rb +6 -6
  58. data/lib/mongoid/attributes/processing.rb +37 -6
  59. data/lib/mongoid/attributes/projector.rb +2 -2
  60. data/lib/mongoid/attributes/readonly.rb +3 -3
  61. data/lib/mongoid/attributes.rb +51 -42
  62. data/lib/mongoid/cacheable.rb +2 -2
  63. data/lib/mongoid/changeable.rb +147 -14
  64. data/lib/mongoid/clients/options.rb +5 -1
  65. data/lib/mongoid/clients/sessions.rb +2 -14
  66. data/lib/mongoid/clients/storage_options.rb +2 -5
  67. data/lib/mongoid/clients/validators/storage.rb +3 -15
  68. data/lib/mongoid/collection_configurable.rb +58 -0
  69. data/lib/mongoid/composable.rb +2 -0
  70. data/lib/mongoid/config/defaults.rb +60 -0
  71. data/lib/mongoid/config/options.rb +3 -0
  72. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  73. data/lib/mongoid/config/validators/client.rb +6 -6
  74. data/lib/mongoid/config/validators.rb +1 -0
  75. data/lib/mongoid/config.rb +145 -17
  76. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  77. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  78. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  79. data/lib/mongoid/contextual/atomic.rb +1 -1
  80. data/lib/mongoid/contextual/geo_near.rb +7 -7
  81. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  82. data/lib/mongoid/contextual/memory.rb +285 -58
  83. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  84. data/lib/mongoid/contextual/mongo.rb +521 -333
  85. data/lib/mongoid/contextual/none.rb +193 -20
  86. data/lib/mongoid/contextual/queryable.rb +1 -1
  87. data/lib/mongoid/contextual.rb +14 -2
  88. data/lib/mongoid/copyable.rb +32 -8
  89. data/lib/mongoid/criteria/findable.rb +8 -5
  90. data/lib/mongoid/criteria/includable.rb +27 -22
  91. data/lib/mongoid/criteria/marshalable.rb +10 -2
  92. data/lib/mongoid/criteria/permission.rb +1 -1
  93. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  95. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  96. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  97. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  100. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  101. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  102. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  103. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  104. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  105. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  106. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  107. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  108. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  109. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  110. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  112. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  113. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  114. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  115. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  116. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  117. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  118. data/lib/mongoid/criteria/queryable.rb +12 -7
  119. data/lib/mongoid/criteria/scopable.rb +2 -2
  120. data/lib/mongoid/criteria/translator.rb +45 -0
  121. data/lib/mongoid/criteria.rb +20 -40
  122. data/lib/mongoid/deprecable.rb +36 -0
  123. data/lib/mongoid/deprecation.rb +25 -0
  124. data/lib/mongoid/document.rb +135 -36
  125. data/lib/mongoid/equality.rb +8 -8
  126. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  127. data/lib/mongoid/errors/document_not_found.rb +10 -6
  128. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  129. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  130. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  131. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  132. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  133. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  134. data/lib/mongoid/errors/invalid_field.rb +6 -2
  135. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  136. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  137. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  138. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  139. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  140. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  141. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  142. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  143. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  144. data/lib/mongoid/errors/no_client_database.rb +1 -1
  145. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  146. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  147. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  148. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  149. data/lib/mongoid/errors.rb +6 -3
  150. data/lib/mongoid/extensions/array.rb +9 -7
  151. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  152. data/lib/mongoid/extensions/binary.rb +42 -0
  153. data/lib/mongoid/extensions/boolean.rb +8 -2
  154. data/lib/mongoid/extensions/date.rb +26 -20
  155. data/lib/mongoid/extensions/date_time.rb +1 -1
  156. data/lib/mongoid/extensions/false_class.rb +1 -1
  157. data/lib/mongoid/extensions/float.rb +7 -4
  158. data/lib/mongoid/extensions/hash.rb +19 -8
  159. data/lib/mongoid/extensions/integer.rb +7 -4
  160. data/lib/mongoid/extensions/module.rb +1 -1
  161. data/lib/mongoid/extensions/object.rb +10 -8
  162. data/lib/mongoid/extensions/range.rb +41 -10
  163. data/lib/mongoid/extensions/regexp.rb +11 -4
  164. data/lib/mongoid/extensions/set.rb +11 -4
  165. data/lib/mongoid/extensions/string.rb +11 -22
  166. data/lib/mongoid/extensions/symbol.rb +4 -15
  167. data/lib/mongoid/extensions/time.rb +29 -16
  168. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  169. data/lib/mongoid/extensions/true_class.rb +1 -1
  170. data/lib/mongoid/extensions.rb +1 -0
  171. data/lib/mongoid/factory.rb +55 -7
  172. data/lib/mongoid/fields/foreign_key.rb +11 -4
  173. data/lib/mongoid/fields/localized.rb +19 -4
  174. data/lib/mongoid/fields/standard.rb +17 -7
  175. data/lib/mongoid/fields/validators/macro.rb +3 -9
  176. data/lib/mongoid/fields.rb +129 -20
  177. data/lib/mongoid/findable.rb +54 -24
  178. data/lib/mongoid/indexable/specification.rb +2 -2
  179. data/lib/mongoid/indexable/validators/options.rb +6 -2
  180. data/lib/mongoid/interceptable.rb +76 -15
  181. data/lib/mongoid/matchable.rb +1 -1
  182. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  183. data/lib/mongoid/matcher/type.rb +1 -1
  184. data/lib/mongoid/matcher.rb +33 -13
  185. data/lib/mongoid/persistable/creatable.rb +19 -9
  186. data/lib/mongoid/persistable/deletable.rb +2 -2
  187. data/lib/mongoid/persistable/destroyable.rb +1 -1
  188. data/lib/mongoid/persistable/savable.rb +14 -2
  189. data/lib/mongoid/persistable/unsettable.rb +2 -2
  190. data/lib/mongoid/persistable/updatable.rb +69 -12
  191. data/lib/mongoid/persistable/upsertable.rb +21 -2
  192. data/lib/mongoid/persistable.rb +6 -3
  193. data/lib/mongoid/persistence_context.rb +63 -10
  194. data/lib/mongoid/query_cache.rb +13 -261
  195. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  196. data/lib/mongoid/railties/database.rake +7 -2
  197. data/lib/mongoid/reloadable.rb +10 -8
  198. data/lib/mongoid/scopable.rb +15 -13
  199. data/lib/mongoid/selectable.rb +1 -2
  200. data/lib/mongoid/serializable.rb +10 -6
  201. data/lib/mongoid/shardable.rb +35 -11
  202. data/lib/mongoid/stateful.rb +57 -10
  203. data/lib/mongoid/tasks/database.rake +12 -0
  204. data/lib/mongoid/tasks/database.rb +20 -2
  205. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  206. data/lib/mongoid/threaded.rb +42 -12
  207. data/lib/mongoid/timestamps/created.rb +1 -1
  208. data/lib/mongoid/timestamps/updated.rb +2 -2
  209. data/lib/mongoid/touchable.rb +2 -3
  210. data/lib/mongoid/traversable.rb +5 -4
  211. data/lib/mongoid/utils.rb +22 -0
  212. data/lib/mongoid/validatable/localizable.rb +1 -1
  213. data/lib/mongoid/validatable/macros.rb +5 -7
  214. data/lib/mongoid/validatable/presence.rb +2 -2
  215. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  216. data/lib/mongoid/validatable.rb +9 -6
  217. data/lib/mongoid/version.rb +1 -1
  218. data/lib/mongoid/warnings.rb +19 -4
  219. data/lib/mongoid.rb +17 -3
  220. data/spec/config/mongoid.yml +16 -0
  221. data/spec/integration/app_spec.rb +10 -14
  222. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  223. data/spec/integration/associations/embedded_spec.rb +15 -0
  224. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  225. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  226. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  227. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  228. data/spec/integration/associations/has_one_spec.rb +97 -1
  229. data/spec/integration/associations/scope_option_spec.rb +1 -1
  230. data/spec/integration/callbacks_models.rb +132 -1
  231. data/spec/integration/callbacks_spec.rb +360 -4
  232. data/spec/integration/criteria/range_spec.rb +95 -1
  233. data/spec/integration/discriminator_key_spec.rb +118 -80
  234. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  235. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  236. data/spec/integration/matcher_examples_spec.rb +20 -13
  237. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  238. data/spec/integration/matcher_operator_spec.rb +3 -5
  239. data/spec/integration/persistence/range_field_spec.rb +350 -0
  240. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  241. data/spec/mongoid/association/depending_spec.rb +9 -9
  242. data/spec/mongoid/association/eager_spec.rb +2 -1
  243. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  244. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  245. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  246. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  247. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +276 -65
  248. data/spec/mongoid/association/embedded/embeds_many_models.rb +158 -0
  249. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  250. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  251. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  252. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  253. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  254. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  255. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  256. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  257. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  258. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  259. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  260. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +215 -228
  261. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  262. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  263. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  264. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  265. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +193 -177
  266. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  267. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  268. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  269. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  270. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  271. data/spec/mongoid/association/syncable_spec.rb +15 -1
  272. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  273. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  274. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  275. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  276. data/spec/mongoid/attributes_spec.rb +554 -33
  277. data/spec/mongoid/cacheable_spec.rb +3 -3
  278. data/spec/mongoid/changeable_spec.rb +429 -37
  279. data/spec/mongoid/clients/factory_spec.rb +23 -30
  280. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  281. data/spec/mongoid/clients_spec.rb +179 -15
  282. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  283. data/spec/mongoid/config/defaults_spec.rb +160 -0
  284. data/spec/mongoid/config_spec.rb +220 -30
  285. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  286. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  287. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  288. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  289. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  290. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  291. data/spec/mongoid/contextual/mongo_spec.rb +1570 -413
  292. data/spec/mongoid/contextual/none_spec.rb +60 -21
  293. data/spec/mongoid/copyable_spec.rb +453 -11
  294. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  295. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  296. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  297. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  298. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  299. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  300. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  301. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  303. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  304. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  305. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  306. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  307. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  308. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  309. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  310. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  311. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  312. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  313. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  314. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  315. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  316. data/spec/mongoid/criteria_spec.rb +469 -1205
  317. data/spec/mongoid/document_fields_spec.rb +173 -24
  318. data/spec/mongoid/document_spec.rb +32 -41
  319. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  320. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  321. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  322. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  323. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  324. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  325. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  326. data/spec/mongoid/extensions/array_spec.rb +16 -2
  327. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  328. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  329. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  330. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  331. data/spec/mongoid/extensions/date_spec.rb +71 -1
  332. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  333. data/spec/mongoid/extensions/float_spec.rb +53 -74
  334. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  335. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  336. data/spec/mongoid/extensions/range_spec.rb +255 -54
  337. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  338. data/spec/mongoid/extensions/set_spec.rb +106 -0
  339. data/spec/mongoid/extensions/string_spec.rb +53 -25
  340. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  341. data/spec/mongoid/extensions/time_spec.rb +639 -106
  342. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  343. data/spec/mongoid/factory_spec.rb +61 -1
  344. data/spec/mongoid/fields/localized_spec.rb +80 -37
  345. data/spec/mongoid/fields_spec.rb +500 -84
  346. data/spec/mongoid/findable_spec.rb +450 -58
  347. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  348. data/spec/mongoid/indexable_spec.rb +55 -30
  349. data/spec/mongoid/interceptable_spec.rb +599 -8
  350. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  351. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  352. data/spec/mongoid/mongoizable_spec.rb +285 -0
  353. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  354. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  355. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  356. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  357. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  358. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  360. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  361. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  363. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  364. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  365. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  366. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  367. data/spec/mongoid/persistence_context_spec.rb +57 -58
  368. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  369. data/spec/mongoid/query_cache_spec.rb +56 -215
  370. data/spec/mongoid/reloadable_spec.rb +83 -6
  371. data/spec/mongoid/scopable_spec.rb +91 -1
  372. data/spec/mongoid/serializable_spec.rb +9 -30
  373. data/spec/mongoid/shardable_models.rb +14 -0
  374. data/spec/mongoid/shardable_spec.rb +157 -51
  375. data/spec/mongoid/stateful_spec.rb +150 -8
  376. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  377. data/spec/mongoid/tasks/database_spec.rb +127 -0
  378. data/spec/mongoid/timestamps_spec.rb +392 -4
  379. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  380. data/spec/mongoid/touchable_spec.rb +390 -2
  381. data/spec/mongoid/touchable_spec_models.rb +14 -8
  382. data/spec/mongoid/traversable_spec.rb +13 -35
  383. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  384. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  385. data/spec/mongoid/warnings_spec.rb +35 -0
  386. data/spec/mongoid_spec.rb +34 -10
  387. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  388. data/spec/rails/mongoid_spec.rb +4 -16
  389. data/spec/shared/lib/mrss/lite_constraints.rb +8 -0
  390. data/spec/shared/shlib/server.sh +5 -5
  391. data/spec/spec_helper.rb +5 -0
  392. data/spec/support/constraints.rb +24 -0
  393. data/spec/support/immutable_ids.rb +118 -0
  394. data/spec/support/macros.rb +78 -0
  395. data/spec/support/models/artist.rb +0 -1
  396. data/spec/support/models/augmentation.rb +12 -0
  397. data/spec/support/models/band.rb +4 -0
  398. data/spec/support/models/book.rb +1 -0
  399. data/spec/support/models/building.rb +2 -0
  400. data/spec/support/models/catalog.rb +24 -0
  401. data/spec/support/models/circus.rb +3 -0
  402. data/spec/support/models/cover.rb +10 -0
  403. data/spec/support/models/fanatic.rb +8 -0
  404. data/spec/support/models/implant.rb +9 -0
  405. data/spec/support/models/label.rb +2 -0
  406. data/spec/support/models/passport.rb +9 -0
  407. data/spec/support/models/person.rb +2 -0
  408. data/spec/support/models/player.rb +2 -0
  409. data/spec/support/models/powerup.rb +12 -0
  410. data/spec/support/models/product.rb +1 -0
  411. data/spec/support/models/purse.rb +9 -0
  412. data/spec/support/models/registry.rb +1 -0
  413. data/spec/support/models/school.rb +14 -0
  414. data/spec/support/models/shield.rb +18 -0
  415. data/spec/support/models/student.rb +14 -0
  416. data/spec/support/models/weapon.rb +12 -0
  417. data.tar.gz.sig +0 -0
  418. metadata +720 -638
  419. metadata.gz.sig +0 -0
  420. data/lib/mongoid/errors/eager_load.rb +0 -23
  421. data/lib/mongoid/errors/invalid_value.rb +0 -17
  422. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  423. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  424. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -14,19 +14,19 @@ describe Mongoid::Serializable do
14
14
  expect(guitar.send(:field_names, {})).to eq(guitar.fields.except("_type").keys.sort)
15
15
  end
16
16
 
17
- context "when using a custom discriminator_key" do
18
- before do
17
+ context "when using a custom discriminator_key" do
18
+ before do
19
19
  Instrument.discriminator_key = "dkey"
20
20
  end
21
21
 
22
- after do
22
+ after do
23
23
  Instrument.discriminator_key = nil
24
24
  end
25
25
 
26
26
  let(:guitar) do
27
27
  Guitar.new
28
28
  end
29
-
29
+
30
30
  it "includes _type but does not include the new discriminator key" do
31
31
  expect(guitar.send(:field_names, {})).to eq(guitar.fields.except("dkey").keys.sort)
32
32
  end
@@ -41,15 +41,11 @@ describe Mongoid::Serializable do
41
41
  end
42
42
 
43
43
  after do
44
- Mongoid.include_root_in_json = false
45
44
  reload_model(:Minim)
46
45
  end
47
46
 
48
47
  context "when global config is set to true" do
49
-
50
- before do
51
- Mongoid.include_root_in_json = true
52
- end
48
+ config_override :include_root_in_json, true
53
49
 
54
50
  it "returns true" do
55
51
  expect(Minim.public_send(meth)).to be true
@@ -67,10 +63,7 @@ describe Mongoid::Serializable do
67
63
  end
68
64
 
69
65
  context "when global config set to false" do
70
-
71
- before do
72
- Mongoid.include_root_in_json = false
73
- end
66
+ config_override :include_root_in_json, false
74
67
 
75
68
  it "returns false" do
76
69
  expect(Minim.public_send(meth)).to be false
@@ -89,13 +82,13 @@ describe Mongoid::Serializable do
89
82
  end
90
83
 
91
84
  describe "#include_root_in_json" do
85
+ config_override :include_root_in_json, false
92
86
 
93
87
  before do
94
88
  reload_model(:Minim)
95
89
  end
96
90
 
97
91
  after do
98
- Mongoid.include_root_in_json = false
99
92
  reload_model(:Minim)
100
93
  end
101
94
 
@@ -127,10 +120,6 @@ describe Mongoid::Serializable do
127
120
 
128
121
  context "when global config set to false" do
129
122
 
130
- before do
131
- Mongoid.include_root_in_json = false
132
- end
133
-
134
123
  it "returns false" do
135
124
  expect(minim.public_send(meth)).to be false
136
125
  end
@@ -297,14 +286,7 @@ describe Mongoid::Serializable do
297
286
  end
298
287
 
299
288
  context "when include_type_for_serialization is true" do
300
-
301
- before do
302
- Mongoid.include_type_for_serialization = true
303
- end
304
-
305
- after do
306
- Mongoid.include_type_for_serialization = false
307
- end
289
+ config_override :include_type_for_serialization, true
308
290
 
309
291
  it "includes _type field" do
310
292
  expect(person.serializable_hash.keys).to include '_type'
@@ -881,16 +863,13 @@ describe Mongoid::Serializable do
881
863
  end
882
864
 
883
865
  context "when including root in json via Mongoid" do
866
+ config_override :include_root_in_json, false
884
867
 
885
868
  before do
886
869
  account.include_root_in_json.should be false
887
870
  Mongoid.include_root_in_json = true
888
871
  end
889
872
 
890
- after do
891
- Mongoid.include_root_in_json = false
892
- end
893
-
894
873
  it "uses the mongoid configuration" do
895
874
  expect(JSON.parse(account.to_json)).to have_key("account")
896
875
  end
@@ -59,3 +59,17 @@ end
59
59
  class SmNotSharded
60
60
  include Mongoid::Document
61
61
  end
62
+
63
+ class SmReviewAuthor
64
+ include Mongoid::Document
65
+ embedded_in :review, class_name: "SmReview", touch: false
66
+ field :name, type: String
67
+ end
68
+
69
+ class SmReview
70
+ include Mongoid::Document
71
+
72
+ embeds_one :author, class_name: "SmReviewAuthor"
73
+
74
+ shard_key "author.name" => 1
75
+ end
@@ -27,11 +27,11 @@ describe Mongoid::Shardable do
27
27
  context 'when full syntax is used' do
28
28
  context 'with symbol value' do
29
29
  it 'sets shard key fields to symbol value' do
30
- SmProducer.shard_key_fields.should == %i(age gender)
30
+ expect(SmProducer.shard_key_fields).to be == %i(age gender)
31
31
  end
32
32
 
33
33
  it 'sets shard config' do
34
- SmProducer.shard_config.should == {
34
+ expect(SmProducer.shard_config).to be == {
35
35
  key: {age: 1, gender: 'hashed'},
36
36
  options: {
37
37
  unique: true,
@@ -41,37 +41,37 @@ describe Mongoid::Shardable do
41
41
  end
42
42
 
43
43
  it 'keeps hashed as string' do
44
- SmProducer.shard_config[:key][:gender].should == 'hashed'
44
+ expect(SmProducer.shard_config[:key][:gender]).to be == 'hashed'
45
45
  end
46
46
  end
47
47
 
48
48
  context 'with string value' do
49
49
  it 'sets shard key fields to symbol value' do
50
- SmActor.shard_key_fields.should == %i(age gender hello)
50
+ expect(SmActor.shard_key_fields).to be == %i(age gender hello)
51
51
  end
52
52
 
53
53
  it 'sets shard config' do
54
- SmActor.shard_config.should == {
54
+ expect(SmActor.shard_config).to be == {
55
55
  key: {age: 1, gender: 'hashed', hello: 'hashed'},
56
56
  options: {},
57
57
  }
58
58
  end
59
59
 
60
60
  it 'sets hashed to string' do
61
- SmActor.shard_config[:key][:gender].should == 'hashed'
61
+ expect(SmActor.shard_config[:key][:gender]).to be == 'hashed'
62
62
  end
63
63
  end
64
64
 
65
65
  context 'when passed association name' do
66
66
  it 'uses foreign key as shard key in shard config' do
67
- SmDriver.shard_config.should == {
67
+ expect(SmDriver.shard_config).to be == {
68
68
  key: {age: 1, agency_id: 'hashed'},
69
69
  options: {},
70
70
  }
71
71
  end
72
72
 
73
73
  it 'uses foreign key as shard key in shard key fields' do
74
- SmDriver.shard_key_fields.should == %i(age agency_id)
74
+ expect(SmDriver.shard_key_fields).to be == %i(age agency_id)
75
75
  end
76
76
  end
77
77
  end
@@ -79,26 +79,26 @@ describe Mongoid::Shardable do
79
79
  context 'when shorthand syntax is used' do
80
80
  context 'with symbol value' do
81
81
  it 'sets shard key fields to symbol value' do
82
- SmMovie.shard_key_fields.should == %i(year)
82
+ expect(SmMovie.shard_key_fields).to be == %i(year)
83
83
  end
84
84
  end
85
85
 
86
86
  context 'with string value' do
87
87
  it 'sets shard key fields to symbol value' do
88
- SmTrailer.shard_key_fields.should == %i(year)
88
+ expect(SmTrailer.shard_key_fields).to be == %i(year)
89
89
  end
90
90
  end
91
91
 
92
92
  context 'when passed association name' do
93
93
  it 'uses foreign key as shard key in shard config' do
94
- SmDirector.shard_config.should == {
94
+ expect(SmDirector.shard_config).to be == {
95
95
  key: {agency_id: 1},
96
96
  options: {},
97
97
  }
98
98
  end
99
99
 
100
100
  it 'uses foreign key as shard key in shard key fields' do
101
- SmDirector.shard_key_fields.should == %i(agency_id)
101
+ expect(SmDirector.shard_key_fields).to be == %i(agency_id)
102
102
  end
103
103
  end
104
104
  end
@@ -106,41 +106,80 @@ describe Mongoid::Shardable do
106
106
 
107
107
  describe '#shard_key_selector' do
108
108
  subject { instance.shard_key_selector }
109
- let(:klass) { Band }
110
- let(:value) { 'a-brand-name' }
109
+
110
+ context 'when key is an immediate attribute' do
111
+ let(:klass) { Band }
112
+ let(:value) { 'a-brand-name' }
111
113
 
112
- before { klass.shard_key(:name) }
114
+ before { klass.shard_key(:name) }
113
115
 
114
- context 'when record is new' do
115
- let(:instance) { klass.new(name: value) }
116
+ context 'when record is new' do
117
+ let(:instance) { klass.new(name: value) }
116
118
 
117
- it { is_expected.to eq({ 'name' => value }) }
119
+ it { is_expected.to eq({ 'name' => value }) }
118
120
 
119
- context 'changing shard key value' do
120
- let(:new_value) { 'a-new-value' }
121
+ context 'changing shard key value' do
122
+ let(:new_value) { 'a-new-value' }
121
123
 
122
- before do
123
- instance.name = new_value
124
+ before do
125
+ instance.name = new_value
126
+ end
127
+
128
+ it { is_expected.to eq({ 'name' => new_value }) }
124
129
  end
130
+ end
131
+
132
+ context 'when record is persisted' do
133
+ let(:instance) { klass.create!(name: value) }
134
+
135
+ it { is_expected.to eq({ 'name' => value }) }
136
+
137
+ context 'changing shard key value' do
138
+ let(:new_value) { 'a-new-value' }
139
+
140
+ before do
141
+ instance.name = new_value
142
+ end
125
143
 
126
- it { is_expected.to eq({ 'name' => new_value }) }
144
+ it { is_expected.to eq({ 'name' => new_value }) }
145
+ end
127
146
  end
128
147
  end
129
148
 
130
- context 'when record is persisted' do
131
- let(:instance) { klass.create!(name: value) }
149
+ context 'when key is an embedded attribute' do
150
+ let(:klass) { SmReview }
151
+ let(:value) { 'Arthur Conan Doyle' }
152
+ let(:key) { 'author.name' }
132
153
 
133
- it { is_expected.to eq({ 'name' => value }) }
154
+ context 'when record is new' do
155
+ let(:instance) { klass.new(author: { name: value }) }
134
156
 
135
- context 'changing shard key value' do
136
- let(:new_value) { 'a-new-value' }
157
+ it { is_expected.to eq({ key => value }) }
137
158
 
138
- before do
139
- instance.name = new_value
159
+ context 'changing shard key value' do
160
+ let(:new_value) { 'Jules Verne' }
161
+
162
+ before do
163
+ instance.author.name = new_value
164
+ end
165
+
166
+ it { is_expected.to eq({ key => new_value }) }
140
167
  end
168
+ end
169
+
170
+ context 'when record is persisted' do
171
+ let(:instance) { klass.create!(author: { name: value }) }
172
+
173
+ it { is_expected.to eq({ key => value }) }
174
+
175
+ context 'changing shard key value' do
176
+ let(:new_value) { 'Jules Verne' }
177
+
178
+ before do
179
+ instance.author.name = new_value
180
+ end
141
181
 
142
- it 'uses the newly set shard key value' do
143
- subject.should == { 'name' => new_value }
182
+ it { is_expected.to eq({ 'author.name' => new_value }) }
144
183
  end
145
184
  end
146
185
  end
@@ -148,42 +187,109 @@ describe Mongoid::Shardable do
148
187
 
149
188
  describe '#shard_key_selector_in_db' do
150
189
  subject { instance.shard_key_selector_in_db }
151
- let(:klass) { Band }
152
- let(:value) { 'a-brand-name' }
153
190
 
154
- before { klass.shard_key(:name) }
191
+ context 'when key is an immediate attribute' do
192
+ let(:klass) { Band }
193
+ let(:value) { 'a-brand-name' }
155
194
 
156
- context 'when record is new' do
157
- let(:instance) { klass.new(name: value) }
195
+ before { klass.shard_key(:name) }
158
196
 
159
- it { is_expected.to eq({ 'name' => value }) }
197
+ context 'when record is new' do
198
+ let(:instance) { klass.new(name: value) }
160
199
 
161
- context 'changing shard key value' do
162
- let(:new_value) { 'a-new-value' }
200
+ it { is_expected.to eq({ 'name' => value }) }
201
+
202
+ context 'changing shard key value' do
203
+ let(:new_value) { 'a-new-value' }
204
+
205
+ before do
206
+ instance.name = new_value
207
+ end
208
+
209
+ it { is_expected.to eq({ 'name' => new_value }) }
210
+ end
211
+ end
212
+
213
+ context 'when record is persisted' do
214
+ let(:instance) { klass.create!(name: value) }
215
+
216
+ it { is_expected.to eq({ 'name' => value }) }
217
+
218
+ context 'changing shard key value' do
219
+ let(:new_value) { 'a-new-value' }
220
+
221
+ before do
222
+ instance.name = new_value
223
+ end
224
+
225
+ it { is_expected.to eq({ 'name' => value }) }
226
+ end
227
+ end
228
+
229
+ context "when record is not found" do
230
+ let!(:instance) { klass.create!(name: value) }
163
231
 
164
232
  before do
165
- instance.name = new_value
233
+ instance.destroy
166
234
  end
167
235
 
168
- it 'uses the existing shard key value' do
169
- subject.should == { 'name' => new_value }
236
+ it "raises a DocumentNotFound error with the shard key in the description on reload" do
237
+ expect do
238
+ instance.reload
239
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class Band with id #{instance.id.to_s} and shard key name: a-brand-name./)
170
240
  end
171
241
  end
172
242
  end
173
243
 
174
- context 'when record is persisted' do
175
- let(:instance) { klass.create!(name: value) }
244
+ context 'when key is an embedded attribute' do
245
+ let(:klass) { SmReview }
246
+ let(:value) { 'Arthur Conan Doyle' }
247
+ let(:key) { 'author.name' }
176
248
 
177
- it { is_expected.to eq({ 'name' => value }) }
249
+ context 'when record is new' do
250
+ let(:instance) { klass.new(author: { name: value }) }
178
251
 
179
- context 'changing shard key value' do
180
- let(:new_value) { 'a-new-value' }
252
+ it { is_expected.to eq({ key => value }) }
181
253
 
182
- before do
183
- instance.name = new_value
254
+ context 'changing shard key value' do
255
+ let(:new_value) { 'Jules Verne' }
256
+
257
+ before do
258
+ instance.author.name = new_value
259
+ end
260
+
261
+ it { is_expected.to eq({ key => new_value }) }
184
262
  end
263
+ end
185
264
 
186
- it { is_expected.to eq({ 'name' => value }) }
265
+ context 'when record is persisted' do
266
+ let(:instance) { klass.create!(author: { name: value }) }
267
+
268
+ it { is_expected.to eq({ key => value }) }
269
+
270
+ context 'changing shard key value' do
271
+ let(:new_value) { 'Jules Verne' }
272
+
273
+ before do
274
+ instance.author.name = new_value
275
+ end
276
+
277
+ it { is_expected.to eq({ key => value }) }
278
+ end
279
+
280
+ context "when record is not found" do
281
+ let!(:instance) { klass.create!(author: { name: value }) }
282
+
283
+ before do
284
+ instance.destroy
285
+ end
286
+
287
+ it "raises a DocumentNotFound error with the shard key in the description on reload" do
288
+ expect do
289
+ instance.reload
290
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class SmReview with id #{instance.id.to_s} and shard key author.name: Arthur Conan Doyle./)
291
+ end
292
+ end
187
293
  end
188
294
  end
189
295
  end
@@ -40,6 +40,25 @@ describe Mongoid::Stateful do
40
40
  end
41
41
  end
42
42
 
43
+ describe '#previously_new_record?' do
44
+ it "returns correct values" do
45
+ person = Person.new
46
+ expect(person).not_to be_a_previously_new_record
47
+ person.save!
48
+ expect(person).to be_a_previously_new_record
49
+ person.title = "Title"
50
+ person.save!
51
+ expect(person).not_to be_a_previously_new_record
52
+ end
53
+
54
+ it "resets after reload" do
55
+ person = Person.create!
56
+ expect(person).to be_a_previously_new_record
57
+ person.reload
58
+ expect(person).not_to be_a_previously_new_record
59
+ end
60
+ end
61
+
43
62
  describe "#persisted?" do
44
63
 
45
64
  let(:person) do
@@ -62,6 +81,15 @@ describe Mongoid::Stateful do
62
81
  end
63
82
  end
64
83
 
84
+ describe "#previously_persisted?" do
85
+ it "returns true after being destroyed" do
86
+ person = Person.create!
87
+ expect(person).not_to be_previously_persisted
88
+ person.destroy
89
+ expect(person).to be_previously_persisted
90
+ end
91
+ end
92
+
65
93
  describe "destroyed?" do
66
94
 
67
95
  let(:person) do
@@ -108,21 +136,135 @@ describe Mongoid::Stateful do
108
136
  Band.new
109
137
  end
110
138
 
111
- context "when the document is readonly" do
139
+ context "when legacy_readonly is true" do
140
+ config_override :legacy_readonly, true
112
141
 
113
- before do
114
- document.__selected_fields = { test: 1 }
142
+ context "when the selected fields are set" do
143
+
144
+ before do
145
+ document.__selected_fields = { test: 1 }
146
+ end
147
+
148
+ it "returns true" do
149
+ expect(document).to be_readonly
150
+ end
115
151
  end
116
152
 
117
- it "returns true" do
118
- expect(document).to be_readonly
153
+ context "when no readonly has been set" do
154
+
155
+ it "returns false" do
156
+ expect(document).to_not be_readonly
157
+ end
158
+ end
159
+
160
+ context "when the readonly! method is called" do
161
+
162
+ let(:op) do
163
+ document.readonly!
164
+ end
165
+
166
+ it "returns false" do
167
+ op
168
+ expect(document).to_not be_readonly
169
+ end
170
+
171
+ it "warns" do
172
+ expect(Mongoid::Warnings).to receive(:warn_legacy_readonly)
173
+ op
174
+ end
175
+ end
176
+
177
+ context "when overriding readonly?" do
178
+
179
+ let(:doc) { ReadonlyModel.create! }
180
+
181
+ before do
182
+ class ReadonlyModel
183
+ include Mongoid::Document
184
+
185
+ attr_accessor :locked
186
+
187
+ def readonly?
188
+ !!locked
189
+ end
190
+ end
191
+ end
192
+
193
+ after do
194
+ Object.send(:remove_const, :ReadonlyModel)
195
+ end
196
+
197
+ it "raises when readonly? is true" do
198
+ expect(doc.readonly?).to be false
199
+ doc.locked = true
200
+ expect(doc.readonly?).to be true
201
+ expect do
202
+ doc.destroy
203
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
204
+ end
119
205
  end
120
206
  end
121
207
 
122
- context "when no readonly has been set" do
208
+ context "when legacy_readonly is false" do
209
+ config_override :legacy_readonly, false
123
210
 
124
- it "returns false" do
125
- expect(document).to_not be_readonly
211
+ context "when the selected fields are set" do
212
+
213
+ before do
214
+ document.__selected_fields = { test: 1 }
215
+ end
216
+
217
+ it "returns false" do
218
+ expect(document).to_not be_readonly
219
+ end
220
+ end
221
+
222
+ context "when the readonly! method is called" do
223
+
224
+ before do
225
+ document.readonly!
226
+ end
227
+
228
+ it "returns true" do
229
+ expect(document).to be_readonly
230
+ end
231
+ end
232
+
233
+ context "when no readonly has been set" do
234
+
235
+ it "returns false" do
236
+ expect(document).to_not be_readonly
237
+ end
238
+ end
239
+
240
+ context "when overriding readonly?" do
241
+
242
+ let(:doc) { ReadonlyModel.new }
243
+
244
+ before do
245
+ class ReadonlyModel
246
+ include Mongoid::Document
247
+
248
+ attr_accessor :locked
249
+
250
+ def readonly?
251
+ !!locked
252
+ end
253
+ end
254
+ end
255
+
256
+ after do
257
+ Object.send(:remove_const, :ReadonlyModel)
258
+ end
259
+
260
+ it "raises when readonly? is true" do
261
+ expect(doc.readonly?).to be false
262
+ doc.locked = true
263
+ expect(doc.readonly?).to be true
264
+ expect do
265
+ doc.save!
266
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
267
+ end
126
268
  end
127
269
  end
128
270
  end