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
@@ -24,81 +24,12 @@ describe Mongoid::QueryCache do
24
24
  Mrss::SessionRegistry.instance.verify_sessions_ended!
25
25
  end
26
26
 
27
- let(:reset_legacy_qc_warning) do
28
- begin
29
- Mongoid::QueryCache.remove_instance_variable('@legacy_query_cache_warned')
30
- rescue NameError
31
- # raised if the instance variable wasn't set
32
- end
33
- end
34
-
35
27
  describe '#cache' do
36
- context 'with driver query cache' do
37
- min_driver_version '2.14'
38
-
39
- it 'does not log a deprecation warning' do
40
- reset_legacy_qc_warning
41
-
42
- expect_any_instance_of(Logger).to_not receive(:warn).with(
43
- described_class::LEGACY_WARNING
44
- )
45
- described_class.cache { }
46
- end
47
-
48
- context 'when query cache is not enabled' do
49
- before do
50
- Mongoid::QueryCache.enabled = false
51
- end
52
-
53
- it 'turns on the query cache within the block' do
54
- expect(Mongoid::QueryCache.enabled?).to be false
55
-
56
- Mongoid::QueryCache.cache do
57
- expect(Mongoid::QueryCache.enabled?).to be true
58
- end
59
-
60
- expect(Mongoid::QueryCache.enabled?).to be false
61
- end
62
- end
63
-
64
- context 'when query cache is enabled' do
65
- before do
66
- Mongoid::QueryCache.enabled = true
67
- end
68
-
69
- it 'keeps the query cache enabled within the block' do
70
- expect(Mongoid::QueryCache.enabled?).to be true
71
-
72
- Mongoid::QueryCache.cache do
73
- expect(Mongoid::QueryCache.enabled?).to be true
74
- end
75
-
76
- expect(Mongoid::QueryCache.enabled?).to be true
77
- end
78
- end
79
-
80
- context 'nested inside #uncached' do
81
- it 'turns on the query cache in the block' do
82
- Mongoid::QueryCache.uncached do
83
- expect(Mongoid::QueryCache.enabled?).to be false
84
-
85
- Mongoid::QueryCache.cache do
86
- expect(Mongoid::QueryCache.enabled?).to be true
87
- end
88
28
 
89
- expect(Mongoid::QueryCache.enabled?).to be false
90
- end
91
- end
92
- end
93
- end
94
-
95
- context 'with mongoid query cache' do
96
- max_driver_version '2.13'
29
+ context 'with driver query cache' do
97
30
 
98
31
  context 'when query cache is not enabled' do
99
- before do
100
- Mongoid::QueryCache.enabled = false
101
- end
32
+ override_query_cache false
102
33
 
103
34
  it 'turns on the query cache within the block' do
104
35
  expect(Mongoid::QueryCache.enabled?).to be false
@@ -112,9 +43,7 @@ describe Mongoid::QueryCache do
112
43
  end
113
44
 
114
45
  context 'when query cache is enabled' do
115
- before do
116
- Mongoid::QueryCache.enabled = true
117
- end
46
+ override_query_cache true
118
47
 
119
48
  it 'keeps the query cache enabled within the block' do
120
49
  expect(Mongoid::QueryCache.enabled?).to be true
@@ -144,70 +73,11 @@ describe Mongoid::QueryCache do
144
73
  end
145
74
 
146
75
  describe '#uncached' do
147
- context 'with driver query cache' do
148
- min_driver_version '2.14'
149
-
150
- context 'when query cache is not enabled' do
151
- before do
152
- Mongoid::QueryCache.enabled = false
153
- end
154
-
155
- it 'keeps the query cache turned off within the block' do
156
- expect(Mongoid::QueryCache.enabled?).to be false
157
-
158
- Mongoid::QueryCache.uncached do
159
- expect(Mongoid::QueryCache.enabled?).to be false
160
- end
161
76
 
162
- expect(Mongoid::QueryCache.enabled?).to be false
163
- end
164
- end
165
-
166
- context 'when query cache is enabled' do
167
- before do
168
- Mongoid::QueryCache.enabled = true
169
- end
170
-
171
- it 'turns off the query cache within the block' do
172
- expect(Mongoid::QueryCache.enabled?).to be true
173
-
174
- Mongoid::QueryCache.uncached do
175
- expect(Mongoid::QueryCache.enabled?).to be false
176
- end
177
-
178
- expect(Mongoid::QueryCache.enabled?).to be true
179
- end
180
- end
181
-
182
- context 'nested inside #cache' do
183
- it 'turns on the query cache in the block' do
184
- Mongoid::QueryCache.cache do
185
- expect(Mongoid::QueryCache.enabled?).to be true
186
-
187
- Mongoid::QueryCache.uncached do
188
- expect(Mongoid::QueryCache.enabled?).to be false
189
- end
190
-
191
- expect(Mongoid::QueryCache.enabled?).to be true
192
- end
193
- end
194
- end
195
- end
196
-
197
- context 'with mongoid query cache' do
198
- max_driver_version '2.13'
199
-
200
- it 'logs a deprecation warning' do
201
- reset_legacy_qc_warning
202
-
203
- expect_any_instance_of(Logger).to receive(:warn).with(described_class::LEGACY_WARNING)
204
- described_class.cache { }
205
- end
77
+ context 'with driver query cache' do
206
78
 
207
79
  context 'when query cache is not enabled' do
208
- before do
209
- Mongoid::QueryCache.enabled = false
210
- end
80
+ override_query_cache false
211
81
 
212
82
  it 'keeps the query cache turned off within the block' do
213
83
  expect(Mongoid::QueryCache.enabled?).to be false
@@ -221,9 +91,7 @@ describe Mongoid::QueryCache do
221
91
  end
222
92
 
223
93
  context 'when query cache is enabled' do
224
- before do
225
- Mongoid::QueryCache.enabled = true
226
- end
94
+ override_query_cache true
227
95
 
228
96
  it 'turns off the query cache within the block' do
229
97
  expect(Mongoid::QueryCache.enabled?).to be true
@@ -277,10 +145,7 @@ describe Mongoid::QueryCache do
277
145
  end
278
146
 
279
147
  context 'does not query for the relation and instead sets the base' do
280
-
281
- before do
282
- Mongoid::QueryCache.enabled = false
283
- end
148
+ override_query_cache false
284
149
 
285
150
  it 'queries for each access to the base' do
286
151
  expect(server).to receive(:with_connection).exactly(0).times.and_call_original
@@ -298,10 +163,7 @@ describe Mongoid::QueryCache do
298
163
  end
299
164
 
300
165
  context 'when query cache is disabled' do
301
-
302
- before do
303
- Mongoid::QueryCache.enabled = false
304
- end
166
+ override_query_cache false
305
167
 
306
168
  it 'does not query for access to the base' do
307
169
  expect(server).to receive(:context).exactly(0).times.and_call_original
@@ -312,10 +174,7 @@ describe Mongoid::QueryCache do
312
174
  end
313
175
 
314
176
  context 'when query cache is enabled' do
315
-
316
- before do
317
- Mongoid::QueryCache.enabled = true
318
- end
177
+ override_query_cache true
319
178
 
320
179
  it 'does not query for access to the base' do
321
180
  expect(server).to receive(:context).exactly(0).times.and_call_original
@@ -328,7 +187,6 @@ describe Mongoid::QueryCache do
328
187
  end
329
188
 
330
189
  context 'when driver query cache exists' do
331
- min_driver_version '2.14'
332
190
 
333
191
  before do
334
192
  Band.all.to_a
@@ -362,10 +220,7 @@ describe Mongoid::QueryCache do
362
220
  end
363
221
 
364
222
  context 'when block is cached' do
365
-
366
- before do
367
- Mongoid::QueryCache.enabled = false
368
- end
223
+ override_query_cache false
369
224
 
370
225
  it 'uses the driver query cache' do
371
226
  expect(Mongo::QueryCache).to receive(:cache).and_call_original
@@ -378,10 +233,7 @@ describe Mongoid::QueryCache do
378
233
  end
379
234
 
380
235
  context 'when block is uncached' do
381
-
382
- before do
383
- Mongoid::QueryCache.enabled = true
384
- end
236
+ override_query_cache true
385
237
 
386
238
  it 'uses the driver query cache' do
387
239
  expect(Mongo::QueryCache).to receive(:uncached).and_call_original
@@ -424,14 +276,6 @@ describe Mongoid::QueryCache do
424
276
  end
425
277
  end
426
278
 
427
- context 'when drivers query cache does not exist' do
428
- max_driver_version '2.13'
429
-
430
- it 'does not recognize the driver query cache' do
431
- expect(defined?(Mongo::QueryCache)).to be_nil
432
- end
433
- end
434
-
435
279
  context "when querying for a single document" do
436
280
 
437
281
  [ :first, :one, :last ].each do |method|
@@ -441,10 +285,7 @@ describe Mongoid::QueryCache do
441
285
  end
442
286
 
443
287
  context "when query cache is disabled" do
444
-
445
- before do
446
- Mongoid::QueryCache.enabled = false
447
- end
288
+ override_query_cache false
448
289
 
449
290
  it "queries again" do
450
291
  expect_query(1) do
@@ -567,10 +408,7 @@ describe Mongoid::QueryCache do
567
408
  end
568
409
 
569
410
  context "when query cache is disabled" do
570
-
571
- before do
572
- Mongoid::QueryCache.enabled = false
573
- end
411
+ override_query_cache false
574
412
 
575
413
  it "queries again" do
576
414
  expect_query(1) do
@@ -662,12 +500,8 @@ describe Mongoid::QueryCache do
662
500
  end
663
501
 
664
502
  context "when the next query has a limit" do
665
- # Server versions older than 3.2 also perform a killCursors operation,
666
- # which causes this test to fail.
667
- min_server_version '3.2'
668
503
 
669
504
  context 'with driver query cache' do
670
- min_driver_version '2.14'
671
505
 
672
506
  # The driver query cache re-uses results with a larger limit
673
507
  it 'does not query again' do
@@ -678,18 +512,6 @@ describe Mongoid::QueryCache do
678
512
  end
679
513
  end
680
514
  end
681
-
682
- context 'with mongoid query cache' do
683
- max_driver_version '2.13'
684
-
685
- it 'queries again' do
686
- expect_query(1) do
687
- result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
688
- expect(result.length).to eq(2)
689
- expect(result.map { |r| r['value'] }).to eq([6, 7])
690
- end
691
- end
692
- end
693
515
  end
694
516
 
695
517
  context "when the new query does not have a limit" do
@@ -812,13 +634,7 @@ describe Mongoid::QueryCache do
812
634
  end
813
635
 
814
636
  context "when query caching is enabled and the batch_size is set" do
815
-
816
- around(:each) do |example|
817
- query_cache_enabled = Mongoid::QueryCache.enabled?
818
- Mongoid::QueryCache.enabled = true
819
- example.run
820
- Mongoid::QueryCache.enabled = query_cache_enabled
821
- end
637
+ override_query_cache true
822
638
 
823
639
  it "does not raise an error when requesting the second batch" do
824
640
  expect {
@@ -827,7 +643,6 @@ describe Mongoid::QueryCache do
827
643
  end
828
644
  }.not_to raise_error
829
645
  end
830
-
831
646
  end
832
647
  end
833
648
 
@@ -895,10 +710,7 @@ describe Mongoid::QueryCache do
895
710
  end
896
711
 
897
712
  context 'when query cache is disabled' do
898
-
899
- before do
900
- Mongoid::QueryCache.enabled = false
901
- end
713
+ override_query_cache false
902
714
 
903
715
  it "queries again" do
904
716
  band = Band.find(band_id)
@@ -962,15 +774,15 @@ describe Mongoid::QueryCache do
962
774
  end
963
775
 
964
776
  context 'when the initial query does not exhaust the results' do
777
+ override_query_cache true
778
+
965
779
  before do
966
- Mongoid::QueryCache.enabled = true
967
780
  10.times { Band.create! }
968
781
 
969
782
  Band.batch_size(4).to_a
970
783
  end
971
784
 
972
785
  context 'with driver query cache' do
973
- min_driver_version '2.14'
974
786
 
975
787
  # The driver query cache caches multi-batch cursors
976
788
  it 'does cache the result' do
@@ -979,16 +791,6 @@ describe Mongoid::QueryCache do
979
791
  end
980
792
  end
981
793
  end
982
-
983
- context 'with mongoid query cache' do
984
- max_driver_version '2.13'
985
-
986
- it 'does not cache the result' do
987
- expect_query(1) do
988
- expect(Band.all.map(&:id).size).to eq(10)
989
- end
990
- end
991
- end
992
794
  end
993
795
 
994
796
  context 'when storing in system collection' do
@@ -1021,4 +823,43 @@ describe Mongoid::QueryCache do
1021
823
  school.students.to_a.length.should == 5
1022
824
  end
1023
825
  end
826
+
827
+ describe 'deprecation warnings' do
828
+
829
+ context '#cache' do
830
+ it 'should raise a warning' do
831
+ expect(Mongoid::Warnings).to receive(:warn_mongoid_query_cache)
832
+ Mongoid::QueryCache.cache {}
833
+ end
834
+ end
835
+
836
+ context '#uncached' do
837
+ it 'should raise a warning' do
838
+ expect(Mongoid::Warnings).to receive(:warn_mongoid_query_cache)
839
+ Mongoid::QueryCache.uncached {}
840
+ end
841
+ end
842
+
843
+ context '#clear_cache' do
844
+ it 'should raise a warning' do
845
+ expect(Mongoid::Warnings).to receive(:warn_mongoid_query_cache_clear)
846
+ Mongoid::QueryCache.clear_cache
847
+ end
848
+ end
849
+
850
+ context '#enabled?' do
851
+ it 'should raise a warning' do
852
+ expect(Mongoid::Warnings).to receive(:warn_mongoid_query_cache)
853
+ Mongoid::QueryCache.enabled?
854
+ end
855
+ end
856
+
857
+ context '#enabled=' do
858
+ it 'should raise a warning' do
859
+ old_enabled = Mongoid::QueryCache.enabled?
860
+ expect(Mongoid::Warnings).to receive(:warn_mongoid_query_cache)
861
+ Mongoid::QueryCache.enabled = old_enabled
862
+ end
863
+ end
864
+ end
1024
865
  end
@@ -103,7 +103,7 @@ describe Mongoid::Reloadable do
103
103
  end
104
104
 
105
105
  it "resets attributes_before_type_cast" do
106
- expect(person.attributes_before_type_cast).to be_empty
106
+ expect(person.attributes_before_type_cast).to eq(person.attributes)
107
107
  end
108
108
  end
109
109
 
@@ -114,7 +114,7 @@ describe Mongoid::Reloadable do
114
114
  it "raises an error" do
115
115
  expect {
116
116
  Person.new.reload
117
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
117
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Person with id\(s\)/)
118
118
  end
119
119
  end
120
120
 
@@ -390,6 +390,30 @@ describe Mongoid::Reloadable do
390
390
  end
391
391
  end
392
392
 
393
+ context 'when embeds_many is modified' do
394
+ let(:contractor1) { Contractor.new(name: 'b') }
395
+ let(:contractor2) { Contractor.new(name: 'c') }
396
+
397
+ let(:building) do
398
+ Building.create!(name: 'a', contractors: [ contractor1 ])
399
+ end
400
+
401
+ let(:more_contractors) { building.contractors + [ contractor2 ] }
402
+
403
+ let(:modified_building) do
404
+ building.tap do
405
+ building.assign_attributes contractors: more_contractors
406
+ end
407
+ end
408
+
409
+ let(:reloaded_building) { modified_building.reload }
410
+
411
+ it 'resets delayed_atomic_sets' do
412
+ expect(modified_building.delayed_atomic_sets).not_to be_empty
413
+ expect(reloaded_building.delayed_atomic_sets).to be_empty
414
+ end
415
+ end
416
+
393
417
  context "when embedded document is nil" do
394
418
 
395
419
  let(:palette) do
@@ -488,12 +512,32 @@ describe Mongoid::Reloadable do
488
512
  Person.create!
489
513
  end
490
514
 
491
- let(:reloaded) do
492
- Person.only(:name).first.reload
515
+ context "when legacy_readonly is on" do
516
+ config_override :legacy_readonly, true
517
+
518
+ let(:reloaded) do
519
+ Person.only(:name).first.reload
520
+ end
521
+
522
+ it 'resets the readonly state after reloading' do
523
+ expect(reloaded.readonly?).to be(false)
524
+ end
493
525
  end
494
526
 
495
- it 'resets the readonly state after reloading' do
496
- expect(reloaded.readonly?).to be(false)
527
+ context "when legacy_readonly is off" do
528
+ config_override :legacy_readonly, false
529
+
530
+ let(:reloaded) do
531
+ Person.only(:name).first.tap do |doc|
532
+ doc.readonly!
533
+ expect(doc.readonly?).to be true
534
+ doc.reload
535
+ end
536
+ end
537
+
538
+ it 'does not reset the readonly state after reloading' do
539
+ expect(reloaded.readonly?).to be(true)
540
+ end
497
541
  end
498
542
  end
499
543
 
@@ -628,5 +672,38 @@ describe Mongoid::Reloadable do
628
672
  church.acolytes.first.name.should == 'Borg'
629
673
  end
630
674
  end
675
+
676
+ context 'when document has previous changes' do
677
+ context 'when document was updated' do
678
+ let(:person) do
679
+ Person.create!(title: 'Sir')
680
+ end
681
+
682
+ before do
683
+ person.title = 'Madam'
684
+ person.save!
685
+ person.reload
686
+ end
687
+
688
+ it "resets previous changes" do
689
+ expect(person.title_previously_was).to be_nil
690
+ expect(person).not_to be_previously_persisted
691
+ end
692
+ end
693
+
694
+ context 'when document was created' do
695
+ let(:person) do
696
+ Person.create!(title: 'Sir')
697
+ end
698
+
699
+ before do
700
+ person.reload
701
+ end
702
+
703
+ it "resets previous changes" do
704
+ expect(person).not_to be_previously_new_record
705
+ end
706
+ end
707
+ end
631
708
  end
632
709
  end
@@ -121,6 +121,76 @@ describe Mongoid::Scopable do
121
121
  expect(selector).to eq({'active' => true})
122
122
  end
123
123
  end
124
+
125
+ context "when the default scope is dotted" do
126
+
127
+ let(:criteria) do
128
+ Band.where('tags.foo' => 'bar')
129
+ end
130
+
131
+ before do
132
+ Band.default_scope ->{ criteria }
133
+ end
134
+
135
+ after do
136
+ Band.default_scoping = nil
137
+ end
138
+
139
+ let!(:band) do
140
+ Band.create!
141
+ end
142
+
143
+ it "adds the scope as a dotted key attribute" do
144
+ expect(band.attributes['tags.foo']).to eq('bar')
145
+ end
146
+
147
+ it "adds the default scope to the class" do
148
+ expect(Band.default_scoping.call).to eq(criteria)
149
+ end
150
+
151
+ it "flags as being default scoped" do
152
+ expect(Band).to be_default_scoping
153
+ end
154
+
155
+ it "does not find the correct document" do
156
+ expect(Band.count).to eq(0)
157
+ end
158
+ end
159
+
160
+ context "when the default scope is dotted with a query" do
161
+
162
+ let(:criteria) do
163
+ Band.where('tags.foo' => {'$eq' => 'bar'})
164
+ end
165
+
166
+ before do
167
+ Band.default_scope ->{ criteria }
168
+ end
169
+
170
+ after do
171
+ Band.default_scoping = nil
172
+ end
173
+
174
+ let!(:band) do
175
+ Band.create!('tags' => { 'foo' => 'bar' })
176
+ end
177
+
178
+ it "does not add the scope as a dotted key attribute" do
179
+ expect(band.attributes).to_not have_key('tags.foo')
180
+ end
181
+
182
+ it "adds the default scope to the class" do
183
+ expect(Band.default_scoping.call).to eq(criteria)
184
+ end
185
+
186
+ it "flags as being default scoped" do
187
+ expect(Band).to be_default_scoping
188
+ end
189
+
190
+ it "finds the correct document" do
191
+ expect(Band.where.first).to eq(band)
192
+ end
193
+ end
124
194
  end
125
195
 
126
196
  describe ".default_scopable?" do
@@ -801,9 +871,11 @@ describe Mongoid::Scopable do
801
871
  "$or" => [
802
872
  { "ccc" => nil },
803
873
  { "ccc" => { "$gt" => 1.0 }},
874
+ ],
875
+ '$and' => ['$or' => [
804
876
  { "aaa" => { "$gt" => 0.0 }},
805
877
  { "bbb" => { "$gt" => 0.0 }}
806
- ]
878
+ ]],
807
879
  })
808
880
  end
809
881
  end
@@ -1188,6 +1260,24 @@ describe Mongoid::Scopable do
1188
1260
  end
1189
1261
  end
1190
1262
  end
1263
+
1264
+ context 'when nesting unscoped under with_scope' do
1265
+ let(:c1) { Band.where(active: true) }
1266
+
1267
+ it 'restores previous scope' do
1268
+ pending 'MONGOID-5214'
1269
+
1270
+ Band.with_scope(c1) do |crit|
1271
+ Band.unscoped do |crit2|
1272
+ Mongoid::Threaded.current_scope(Band).should be nil
1273
+ end
1274
+
1275
+ Mongoid::Threaded.current_scope(Band).selector.should == {
1276
+ 'active' => true,
1277
+ }
1278
+ end
1279
+ end
1280
+ end
1191
1281
  end
1192
1282
 
1193
1283
  describe ".without_default_scope" do