mongoid 7.0.5 → 8.1.0

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 (1107) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +33 -33
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +63 -5
  7. data/lib/config/locales/en.yml +220 -105
  8. data/lib/mongoid/association/accessors.rb +176 -84
  9. data/lib/mongoid/association/bindable.rb +57 -28
  10. data/lib/mongoid/association/builders.rb +9 -15
  11. data/lib/mongoid/association/constrainable.rb +5 -7
  12. data/lib/mongoid/association/depending.rb +9 -18
  13. data/lib/mongoid/association/eager_loadable.rb +31 -10
  14. data/lib/mongoid/association/embedded/batchable.rb +68 -54
  15. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +9 -6
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +16 -25
  19. data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +10 -6
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +156 -135
  23. data/lib/mongoid/association/embedded/embeds_many.rb +10 -37
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +27 -10
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +64 -30
  27. data/lib/mongoid/association/embedded/embeds_one.rb +11 -34
  28. data/lib/mongoid/association/embedded.rb +2 -0
  29. data/lib/mongoid/association/macros.rb +65 -41
  30. data/lib/mongoid/association/many.rb +25 -35
  31. data/lib/mongoid/association/marshalable.rb +3 -6
  32. data/lib/mongoid/association/nested/many.rb +22 -30
  33. data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
  34. data/lib/mongoid/association/nested/one.rb +57 -30
  35. data/lib/mongoid/association/nested.rb +3 -3
  36. data/lib/mongoid/association/one.rb +5 -12
  37. data/lib/mongoid/association/options.rb +16 -46
  38. data/lib/mongoid/association/proxy.rb +52 -40
  39. data/lib/mongoid/association/referenced/auto_save.rb +9 -14
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
  44. data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
  45. data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
  46. data/lib/mongoid/association/referenced/eager.rb +41 -40
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +105 -68
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +102 -125
  57. data/lib/mongoid/association/referenced/has_many.rb +21 -45
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
  63. data/lib/mongoid/association/referenced/has_one.rb +16 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -26
  65. data/lib/mongoid/association/referenced.rb +2 -0
  66. data/lib/mongoid/association/reflections.rb +7 -6
  67. data/lib/mongoid/association/relatable.rb +62 -84
  68. data/lib/mongoid/association.rb +13 -27
  69. data/lib/mongoid/atomic/modifiers.rb +29 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  72. data/lib/mongoid/atomic/paths/embedded.rb +2 -3
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +42 -47
  76. data/lib/mongoid/attributes/dynamic.rb +22 -36
  77. data/lib/mongoid/attributes/nested.rb +12 -15
  78. data/lib/mongoid/attributes/processing.rb +19 -27
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +6 -9
  81. data/lib/mongoid/attributes.rb +103 -100
  82. data/lib/mongoid/cacheable.rb +7 -10
  83. data/lib/mongoid/changeable.rb +151 -70
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +15 -14
  86. data/lib/mongoid/clients/sessions.rb +10 -10
  87. data/lib/mongoid/clients/storage_options.rb +9 -17
  88. data/lib/mongoid/clients/validators/storage.rb +5 -24
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +3 -10
  91. data/lib/mongoid/collection_configurable.rb +58 -0
  92. data/lib/mongoid/composable.rb +7 -9
  93. data/lib/mongoid/config/defaults.rb +60 -0
  94. data/lib/mongoid/config/environment.rb +51 -13
  95. data/lib/mongoid/config/options.rb +20 -23
  96. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  97. data/lib/mongoid/config/validators/client.rb +8 -23
  98. data/lib/mongoid/config/validators/option.rb +2 -3
  99. data/lib/mongoid/config/validators.rb +3 -1
  100. data/lib/mongoid/config.rb +235 -48
  101. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  102. data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
  103. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  104. data/lib/mongoid/contextual/aggregable.rb +17 -0
  105. data/lib/mongoid/contextual/atomic.rb +29 -31
  106. data/lib/mongoid/contextual/command.rb +2 -5
  107. data/lib/mongoid/contextual/geo_near.rb +13 -44
  108. data/lib/mongoid/contextual/map_reduce.rb +7 -35
  109. data/lib/mongoid/contextual/memory.rb +387 -81
  110. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  111. data/lib/mongoid/contextual/mongo.rb +641 -283
  112. data/lib/mongoid/contextual/none.rb +264 -31
  113. data/lib/mongoid/contextual/queryable.rb +3 -4
  114. data/lib/mongoid/contextual.rb +21 -11
  115. data/lib/mongoid/copyable.rb +42 -17
  116. data/lib/mongoid/criteria/findable.rb +20 -20
  117. data/lib/mongoid/criteria/includable.rb +32 -34
  118. data/lib/mongoid/criteria/inspectable.rb +2 -3
  119. data/lib/mongoid/criteria/marshalable.rb +12 -7
  120. data/lib/mongoid/criteria/modifiable.rb +4 -20
  121. data/lib/mongoid/criteria/options.rb +2 -3
  122. data/lib/mongoid/criteria/permission.rb +3 -2
  123. data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
  124. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  125. data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
  126. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
  127. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
  128. data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
  129. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
  130. data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
  131. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  132. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
  133. data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
  134. data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
  135. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +12 -19
  136. data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
  137. data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
  138. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
  139. data/lib/mongoid/criteria/queryable/extensions/time.rb +10 -10
  140. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +19 -7
  141. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  142. data/lib/mongoid/criteria/queryable/key.rb +40 -25
  143. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  144. data/lib/mongoid/criteria/queryable/mergeable.rb +205 -44
  145. data/lib/mongoid/criteria/queryable/optional.rb +16 -65
  146. data/lib/mongoid/criteria/queryable/options.rb +4 -21
  147. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  148. data/lib/mongoid/criteria/queryable/selectable.rb +453 -177
  149. data/lib/mongoid/criteria/queryable/selector.rb +126 -29
  150. data/lib/mongoid/criteria/queryable/smash.rb +42 -18
  151. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  152. data/lib/mongoid/criteria/queryable.rb +18 -15
  153. data/lib/mongoid/criteria/scopable.rb +29 -21
  154. data/lib/mongoid/criteria/translator.rb +45 -0
  155. data/lib/mongoid/criteria.rb +106 -111
  156. data/lib/mongoid/deprecable.rb +36 -0
  157. data/lib/mongoid/deprecation.rb +25 -0
  158. data/lib/mongoid/document.rb +151 -99
  159. data/lib/mongoid/equality.rb +35 -18
  160. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  161. data/lib/mongoid/errors/callback.rb +2 -3
  162. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  163. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  164. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  165. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  166. data/lib/mongoid/errors/document_not_found.rb +35 -21
  167. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  168. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  169. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  170. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  171. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  172. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  173. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  174. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  175. data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
  176. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  177. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  178. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  179. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  180. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  181. data/lib/mongoid/errors/invalid_field.rb +8 -7
  182. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  183. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  184. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  185. data/lib/mongoid/errors/invalid_find.rb +2 -3
  186. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  187. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  188. data/lib/mongoid/errors/invalid_index.rb +2 -3
  189. data/lib/mongoid/errors/invalid_options.rb +4 -5
  190. data/lib/mongoid/errors/invalid_path.rb +2 -3
  191. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  192. data/lib/mongoid/errors/invalid_query.rb +40 -0
  193. data/lib/mongoid/errors/invalid_relation.rb +5 -10
  194. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  195. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  196. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  197. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  198. data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
  199. data/lib/mongoid/errors/invalid_storage_parent.rb +4 -3
  200. data/lib/mongoid/errors/invalid_time.rb +2 -3
  201. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  202. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  203. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  204. data/lib/mongoid/errors/mongoid_error.rb +6 -13
  205. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  206. data/lib/mongoid/errors/no_client_config.rb +4 -5
  207. data/lib/mongoid/errors/no_client_database.rb +3 -4
  208. data/lib/mongoid/errors/no_client_hosts.rb +3 -4
  209. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  210. data/lib/mongoid/errors/no_default_client.rb +3 -4
  211. data/lib/mongoid/errors/no_environment.rb +2 -3
  212. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  213. data/lib/mongoid/errors/no_metadata.rb +2 -3
  214. data/lib/mongoid/errors/no_parent.rb +2 -3
  215. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  216. data/lib/mongoid/errors/readonly_document.rb +3 -6
  217. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  218. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  219. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  220. data/lib/mongoid/errors/unknown_model.rb +2 -3
  221. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  222. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  223. data/lib/mongoid/errors/validations.rb +2 -1
  224. data/lib/mongoid/errors.rb +18 -4
  225. data/lib/mongoid/evolvable.rb +4 -5
  226. data/lib/mongoid/extensions/array.rb +37 -44
  227. data/lib/mongoid/extensions/big_decimal.rb +35 -21
  228. data/lib/mongoid/extensions/binary.rb +42 -0
  229. data/lib/mongoid/extensions/boolean.rb +10 -6
  230. data/lib/mongoid/extensions/date.rb +32 -25
  231. data/lib/mongoid/extensions/date_time.rb +5 -13
  232. data/lib/mongoid/extensions/decimal128.rb +2 -5
  233. data/lib/mongoid/extensions/false_class.rb +5 -8
  234. data/lib/mongoid/extensions/float.rb +12 -14
  235. data/lib/mongoid/extensions/hash.rb +64 -42
  236. data/lib/mongoid/extensions/integer.rb +12 -16
  237. data/lib/mongoid/extensions/module.rb +3 -4
  238. data/lib/mongoid/extensions/nil_class.rb +2 -5
  239. data/lib/mongoid/extensions/object.rb +27 -52
  240. data/lib/mongoid/extensions/object_id.rb +2 -7
  241. data/lib/mongoid/extensions/range.rb +42 -20
  242. data/lib/mongoid/extensions/regexp.rb +14 -8
  243. data/lib/mongoid/extensions/set.rb +13 -11
  244. data/lib/mongoid/extensions/string.rb +30 -61
  245. data/lib/mongoid/extensions/symbol.rb +6 -22
  246. data/lib/mongoid/extensions/time.rb +38 -22
  247. data/lib/mongoid/extensions/time_with_zone.rb +26 -9
  248. data/lib/mongoid/extensions/true_class.rb +5 -8
  249. data/lib/mongoid/extensions.rb +19 -3
  250. data/lib/mongoid/factory.rb +104 -17
  251. data/lib/mongoid/fields/foreign_key.rb +14 -26
  252. data/lib/mongoid/fields/localized.rb +21 -15
  253. data/lib/mongoid/fields/standard.rb +23 -43
  254. data/lib/mongoid/fields/validators/macro.rb +32 -20
  255. data/lib/mongoid/fields/validators.rb +2 -1
  256. data/lib/mongoid/fields.rb +349 -76
  257. data/lib/mongoid/findable.rb +115 -34
  258. data/lib/mongoid/indexable/specification.rb +5 -18
  259. data/lib/mongoid/indexable/validators/options.rb +8 -9
  260. data/lib/mongoid/indexable.rb +6 -21
  261. data/lib/mongoid/inspectable.rb +4 -11
  262. data/lib/mongoid/interceptable.rb +85 -41
  263. data/lib/mongoid/loggable.rb +13 -16
  264. data/lib/mongoid/matchable.rb +4 -156
  265. data/lib/mongoid/matcher/all.rb +22 -0
  266. data/lib/mongoid/matcher/and.rb +21 -0
  267. data/lib/mongoid/matcher/bits.rb +41 -0
  268. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  269. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  271. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  272. data/lib/mongoid/matcher/elem_match.rb +36 -0
  273. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  274. data/lib/mongoid/matcher/eq.rb +11 -0
  275. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  276. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  277. data/lib/mongoid/matcher/exists.rb +15 -0
  278. data/lib/mongoid/matcher/expression.rb +35 -0
  279. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  280. data/lib/mongoid/matcher/field_expression.rb +62 -0
  281. data/lib/mongoid/matcher/field_operator.rb +54 -0
  282. data/lib/mongoid/matcher/gt.rb +17 -0
  283. data/lib/mongoid/matcher/gte.rb +17 -0
  284. data/lib/mongoid/matcher/in.rb +25 -0
  285. data/lib/mongoid/matcher/lt.rb +17 -0
  286. data/lib/mongoid/matcher/lte.rb +17 -0
  287. data/lib/mongoid/matcher/mod.rb +17 -0
  288. data/lib/mongoid/matcher/ne.rb +16 -0
  289. data/lib/mongoid/matcher/nin.rb +11 -0
  290. data/lib/mongoid/matcher/nor.rb +25 -0
  291. data/lib/mongoid/matcher/not.rb +29 -0
  292. data/lib/mongoid/matcher/or.rb +21 -0
  293. data/lib/mongoid/matcher/regex.rb +41 -0
  294. data/lib/mongoid/matcher/size.rb +26 -0
  295. data/lib/mongoid/matcher/type.rb +99 -0
  296. data/lib/mongoid/matcher.rb +130 -0
  297. data/lib/mongoid/persistable/creatable.rb +23 -30
  298. data/lib/mongoid/persistable/deletable.rb +7 -23
  299. data/lib/mongoid/persistable/destroyable.rb +12 -11
  300. data/lib/mongoid/persistable/incrementable.rb +6 -7
  301. data/lib/mongoid/persistable/logical.rb +4 -6
  302. data/lib/mongoid/persistable/poppable.rb +3 -6
  303. data/lib/mongoid/persistable/pullable.rb +3 -8
  304. data/lib/mongoid/persistable/pushable.rb +14 -10
  305. data/lib/mongoid/persistable/renamable.rb +10 -8
  306. data/lib/mongoid/persistable/savable.rb +16 -9
  307. data/lib/mongoid/persistable/settable.rb +3 -6
  308. data/lib/mongoid/persistable/unsettable.rb +10 -10
  309. data/lib/mongoid/persistable/updatable.rb +99 -30
  310. data/lib/mongoid/persistable/upsertable.rb +23 -9
  311. data/lib/mongoid/persistable.rb +138 -40
  312. data/lib/mongoid/persistence_context.rb +91 -51
  313. data/lib/mongoid/positional.rb +2 -5
  314. data/lib/mongoid/query_cache.rb +18 -238
  315. data/lib/mongoid/railtie.rb +3 -16
  316. data/lib/mongoid/railties/controller_runtime.rb +4 -2
  317. data/lib/mongoid/railties/database.rake +16 -2
  318. data/lib/mongoid/reloadable.rb +21 -22
  319. data/lib/mongoid/scopable.rb +34 -57
  320. data/lib/mongoid/selectable.rb +8 -18
  321. data/lib/mongoid/serializable.rb +33 -34
  322. data/lib/mongoid/shardable.rb +108 -21
  323. data/lib/mongoid/stateful.rb +60 -20
  324. data/lib/mongoid/stringified_symbol.rb +52 -0
  325. data/lib/mongoid/tasks/database.rake +24 -5
  326. data/lib/mongoid/tasks/database.rb +105 -7
  327. data/lib/mongoid/threaded/lifecycle.rb +7 -26
  328. data/lib/mongoid/threaded.rb +44 -67
  329. data/lib/mongoid/timestamps/created/short.rb +2 -1
  330. data/lib/mongoid/timestamps/created.rb +4 -3
  331. data/lib/mongoid/timestamps/short.rb +2 -1
  332. data/lib/mongoid/timestamps/timeless.rb +6 -9
  333. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  334. data/lib/mongoid/timestamps/updated.rb +5 -6
  335. data/lib/mongoid/timestamps.rb +3 -2
  336. data/lib/mongoid/touchable.rb +54 -25
  337. data/lib/mongoid/traversable.rb +185 -61
  338. data/lib/mongoid/utils.rb +22 -0
  339. data/lib/mongoid/validatable/associated.rb +5 -6
  340. data/lib/mongoid/validatable/format.rb +2 -1
  341. data/lib/mongoid/validatable/length.rb +2 -1
  342. data/lib/mongoid/validatable/localizable.rb +3 -4
  343. data/lib/mongoid/validatable/macros.rb +7 -14
  344. data/lib/mongoid/validatable/presence.rb +10 -15
  345. data/lib/mongoid/validatable/queryable.rb +2 -3
  346. data/lib/mongoid/validatable/uniqueness.rb +30 -42
  347. data/lib/mongoid/validatable.rb +16 -32
  348. data/lib/mongoid/version.rb +3 -2
  349. data/lib/mongoid/warnings.rb +44 -0
  350. data/lib/mongoid.rb +50 -17
  351. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  352. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
  353. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  354. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  355. data/lib/rails/generators/mongoid_generator.rb +2 -1
  356. data/lib/rails/mongoid.rb +4 -5
  357. data/spec/README.md +19 -4
  358. data/spec/config/mongoid.yml +17 -0
  359. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  360. data/spec/integration/app_spec.rb +345 -0
  361. data/spec/integration/associations/belongs_to_spec.rb +20 -0
  362. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  363. data/spec/integration/associations/embedded_spec.rb +283 -0
  364. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  365. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  366. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  367. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  368. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  369. data/spec/integration/associations/has_many_spec.rb +128 -0
  370. data/spec/integration/associations/has_one_spec.rb +272 -0
  371. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  372. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  373. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  374. data/spec/integration/associations/scope_option_spec.rb +101 -0
  375. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  376. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  377. data/spec/integration/callbacks_models.rb +192 -0
  378. data/spec/integration/callbacks_spec.rb +584 -0
  379. data/spec/integration/contextual/empty_spec.rb +141 -0
  380. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  381. data/spec/integration/criteria/date_field_spec.rb +40 -0
  382. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  383. data/spec/integration/criteria/logical_spec.rb +124 -0
  384. data/spec/integration/criteria/range_spec.rb +359 -0
  385. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  386. data/spec/integration/discriminator_key_spec.rb +391 -0
  387. data/spec/integration/discriminator_value_spec.rb +206 -0
  388. data/spec/integration/document_spec.rb +51 -0
  389. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  390. data/spec/integration/i18n_fallbacks_spec.rb +74 -0
  391. data/spec/integration/matcher_examples_spec.rb +765 -0
  392. data/spec/integration/matcher_operator_data/all.yml +140 -0
  393. data/spec/integration/matcher_operator_data/and.yml +93 -0
  394. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  397. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  398. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  399. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  400. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  401. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  402. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  403. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  404. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  405. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  406. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  407. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  408. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  409. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  410. data/spec/integration/matcher_operator_data/in.yml +210 -0
  411. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  412. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  413. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  414. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  415. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  416. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  417. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  418. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  419. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  420. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  421. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  422. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  423. data/spec/integration/matcher_operator_data/not.yml +196 -0
  424. data/spec/integration/matcher_operator_data/or.yml +137 -0
  425. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  426. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  427. data/spec/integration/matcher_operator_data/size.yml +174 -0
  428. data/spec/integration/matcher_operator_data/type.yml +70 -0
  429. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  430. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  431. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  434. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  435. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  436. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  437. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  438. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  440. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  442. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  444. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  445. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  446. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  447. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  448. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  449. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  450. data/spec/integration/matcher_operator_spec.rb +122 -0
  451. data/spec/integration/matcher_spec.rb +283 -0
  452. data/spec/integration/persistence/range_field_spec.rb +350 -0
  453. data/spec/integration/server_query_spec.rb +141 -0
  454. data/spec/integration/shardable_spec.rb +148 -0
  455. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  456. data/spec/lite_spec_helper.rb +35 -8
  457. data/spec/mongoid/association/accessors_spec.rb +284 -77
  458. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  459. data/spec/mongoid/association/builders_spec.rb +3 -1
  460. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  461. data/spec/mongoid/association/counter_cache_spec.rb +35 -33
  462. data/spec/mongoid/association/depending_spec.rb +431 -338
  463. data/spec/mongoid/association/eager_spec.rb +8 -5
  464. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  465. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  466. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
  467. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
  468. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +152 -13
  469. data/spec/mongoid/association/embedded/embedded_in_spec.rb +3 -1
  470. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  471. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
  472. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +706 -197
  473. data/spec/mongoid/association/embedded/embeds_many_models.rb +227 -0
  474. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  475. data/spec/mongoid/association/embedded/embeds_many_spec.rb +81 -1
  476. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  477. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
  478. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +38 -23
  479. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +2 -0
  480. data/spec/mongoid/association/embedded/embeds_one_models.rb +22 -0
  481. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  482. data/spec/mongoid/association/embedded/embeds_one_spec.rb +31 -3
  483. data/spec/mongoid/association/macros_spec.rb +11 -9
  484. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  485. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  486. data/spec/mongoid/association/options_spec.rb +2 -0
  487. data/spec/mongoid/association/polymorphic_spec.rb +2 -0
  488. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
  489. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
  490. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
  491. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
  492. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  493. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  494. data/spec/mongoid/association/referenced/belongs_to_spec.rb +28 -21
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +46 -2
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +25 -5
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +559 -385
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +68 -2
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  502. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +81 -4
  503. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  504. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
  505. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  506. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +415 -129
  507. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +859 -502
  508. data/spec/mongoid/association/referenced/has_many_models.rb +61 -1
  509. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  510. data/spec/mongoid/association/referenced/has_many_spec.rb +48 -0
  511. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  512. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
  513. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  514. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
  515. data/spec/mongoid/association/referenced/has_one_models.rb +65 -0
  516. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  517. data/spec/mongoid/association/referenced/has_one_spec.rb +24 -1
  518. data/spec/mongoid/association/reflections_spec.rb +2 -0
  519. data/spec/mongoid/association/syncable_spec.rb +48 -32
  520. data/spec/mongoid/association_spec.rb +2 -0
  521. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  522. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  523. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  524. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  525. data/spec/mongoid/atomic/paths_spec.rb +93 -12
  526. data/spec/mongoid/atomic_spec.rb +53 -6
  527. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +149 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  534. data/spec/mongoid/attributes_spec.rb +895 -54
  535. data/spec/mongoid/cacheable_spec.rb +6 -4
  536. data/spec/mongoid/changeable_spec.rb +484 -67
  537. data/spec/mongoid/clients/factory_spec.rb +128 -28
  538. data/spec/mongoid/clients/options_spec.rb +49 -30
  539. data/spec/mongoid/clients/sessions_spec.rb +29 -66
  540. data/spec/mongoid/clients/transactions_spec.rb +74 -37
  541. data/spec/mongoid/clients_spec.rb +189 -23
  542. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  543. data/spec/mongoid/composable_spec.rb +2 -0
  544. data/spec/mongoid/config/defaults_spec.rb +160 -0
  545. data/spec/mongoid/config/environment_spec.rb +126 -8
  546. data/spec/mongoid/config/options_spec.rb +22 -3
  547. data/spec/mongoid/config_spec.rb +504 -1
  548. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  549. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  550. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  551. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  552. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  553. data/spec/mongoid/contextual/atomic_spec.rb +242 -81
  554. data/spec/mongoid/contextual/geo_near_spec.rb +30 -19
  555. data/spec/mongoid/contextual/map_reduce_spec.rb +22 -19
  556. data/spec/mongoid/contextual/memory_spec.rb +1828 -303
  557. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  558. data/spec/mongoid/contextual/mongo_spec.rb +3504 -1270
  559. data/spec/mongoid/contextual/none_spec.rb +80 -67
  560. data/spec/mongoid/copyable_spec.rb +659 -36
  561. data/spec/mongoid/copyable_spec_models.rb +30 -0
  562. data/spec/mongoid/criteria/findable_spec.rb +161 -228
  563. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  564. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  565. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  566. data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
  567. data/spec/mongoid/criteria/modifiable_spec.rb +43 -40
  568. data/spec/mongoid/criteria/options_spec.rb +2 -0
  569. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  570. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  571. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
  572. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
  573. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  574. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
  575. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
  576. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  577. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
  578. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  579. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  580. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  581. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  582. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  583. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
  585. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  586. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +7 -70
  587. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
  588. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +53 -23
  589. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +41 -1
  590. data/spec/mongoid/criteria/queryable/key_spec.rb +2 -0
  591. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  592. data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
  593. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -1
  594. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  595. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  596. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2538 -0
  597. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  598. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1100 -2880
  599. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  600. data/spec/mongoid/criteria/queryable/selector_spec.rb +17 -3
  601. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  602. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  603. data/spec/mongoid/criteria/scopable_spec.rb +129 -0
  604. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  605. data/spec/mongoid/criteria_projection_spec.rb +406 -0
  606. data/spec/mongoid/criteria_spec.rb +1320 -1723
  607. data/spec/mongoid/document_fields_spec.rb +262 -0
  608. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  609. data/spec/mongoid/document_query_spec.rb +89 -0
  610. data/spec/mongoid/document_spec.rb +153 -87
  611. data/spec/mongoid/equality_spec.rb +144 -41
  612. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  613. data/spec/mongoid/errors/callback_spec.rb +2 -0
  614. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  615. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  616. data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
  617. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  618. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
  619. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  620. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  621. data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
  622. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  623. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  624. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  625. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  626. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  627. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  628. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  629. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  630. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  631. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  632. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  633. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  634. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  635. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  636. data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
  637. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  638. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  639. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  640. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  641. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  642. data/spec/mongoid/errors/no_environment_spec.rb +5 -3
  643. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  644. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  645. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  646. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  647. data/spec/mongoid/errors/readonly_document_spec.rb +4 -2
  648. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  649. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
  650. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  651. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  652. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  653. data/spec/mongoid/errors/validations_spec.rb +2 -0
  654. data/spec/mongoid/extensions/array_spec.rb +41 -45
  655. data/spec/mongoid/extensions/big_decimal_spec.rb +714 -212
  656. data/spec/mongoid/extensions/binary_spec.rb +46 -9
  657. data/spec/mongoid/extensions/boolean_spec.rb +70 -82
  658. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  659. data/spec/mongoid/extensions/date_spec.rb +58 -140
  660. data/spec/mongoid/extensions/date_time_spec.rb +32 -69
  661. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  662. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  663. data/spec/mongoid/extensions/float_spec.rb +66 -73
  664. data/spec/mongoid/extensions/hash_spec.rb +135 -0
  665. data/spec/mongoid/extensions/integer_spec.rb +61 -63
  666. data/spec/mongoid/extensions/module_spec.rb +2 -0
  667. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  668. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  669. data/spec/mongoid/extensions/object_spec.rb +13 -24
  670. data/spec/mongoid/extensions/range_spec.rb +257 -54
  671. data/spec/mongoid/extensions/regexp_spec.rb +60 -33
  672. data/spec/mongoid/extensions/set_spec.rb +108 -0
  673. data/spec/mongoid/extensions/string_spec.rb +111 -50
  674. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  675. data/spec/mongoid/extensions/symbol_spec.rb +20 -25
  676. data/spec/mongoid/extensions/time_spec.rb +668 -106
  677. data/spec/mongoid/extensions/time_with_zone_spec.rb +57 -83
  678. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  679. data/spec/mongoid/extensions_spec.rb +16 -2
  680. data/spec/mongoid/factory_spec.rb +347 -27
  681. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  682. data/spec/mongoid/fields/localized_spec.rb +86 -41
  683. data/spec/mongoid/fields/standard_spec.rb +2 -0
  684. data/spec/mongoid/fields_spec.rb +869 -114
  685. data/spec/mongoid/findable_spec.rb +520 -64
  686. data/spec/mongoid/indexable/specification_spec.rb +4 -2
  687. data/spec/mongoid/indexable_spec.rb +87 -32
  688. data/spec/mongoid/inspectable_spec.rb +39 -2
  689. data/spec/mongoid/interceptable_spec.rb +761 -98
  690. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  691. data/spec/mongoid/loggable_spec.rb +2 -0
  692. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  693. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  694. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  695. data/spec/mongoid/mongoizable_spec.rb +285 -0
  696. data/spec/mongoid/persistable/creatable_spec.rb +114 -29
  697. data/spec/mongoid/persistable/deletable_spec.rb +300 -18
  698. data/spec/mongoid/persistable/destroyable_spec.rb +228 -18
  699. data/spec/mongoid/persistable/incrementable_spec.rb +60 -7
  700. data/spec/mongoid/persistable/logical_spec.rb +56 -3
  701. data/spec/mongoid/persistable/poppable_spec.rb +55 -3
  702. data/spec/mongoid/persistable/pullable_spec.rb +108 -6
  703. data/spec/mongoid/persistable/pushable_spec.rb +163 -7
  704. data/spec/mongoid/persistable/renamable_spec.rb +54 -2
  705. data/spec/mongoid/persistable/savable_spec.rb +284 -25
  706. data/spec/mongoid/persistable/settable_spec.rb +91 -8
  707. data/spec/mongoid/persistable/unsettable_spec.rb +55 -3
  708. data/spec/mongoid/persistable/updatable_spec.rb +63 -49
  709. data/spec/mongoid/persistable/upsertable_spec.rb +93 -3
  710. data/spec/mongoid/persistable_spec.rb +85 -9
  711. data/spec/mongoid/persistence_context_spec.rb +59 -58
  712. data/spec/mongoid/positional_spec.rb +2 -0
  713. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  714. data/spec/mongoid/query_cache_spec.rb +410 -95
  715. data/spec/mongoid/relations/proxy_spec.rb +9 -7
  716. data/spec/mongoid/reloadable_spec.rb +357 -26
  717. data/spec/mongoid/scopable_spec.rb +193 -38
  718. data/spec/mongoid/selectable_spec.rb +8 -6
  719. data/spec/mongoid/serializable_spec.rb +148 -38
  720. data/spec/mongoid/shardable_models.rb +75 -0
  721. data/spec/mongoid/shardable_spec.rb +239 -34
  722. data/spec/mongoid/stateful_spec.rb +153 -9
  723. data/spec/mongoid/tasks/database_rake_spec.rb +89 -13
  724. data/spec/mongoid/tasks/database_spec.rb +130 -1
  725. data/spec/mongoid/threaded_spec.rb +4 -2
  726. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  727. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  728. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  729. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  730. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  731. data/spec/mongoid/timestamps_spec.rb +400 -10
  732. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  733. data/spec/mongoid/touchable_spec.rb +568 -33
  734. data/spec/mongoid/touchable_spec_models.rb +59 -0
  735. data/spec/mongoid/traversable_spec.rb +1145 -1
  736. data/spec/mongoid/validatable/associated_spec.rb +2 -0
  737. data/spec/mongoid/validatable/format_spec.rb +2 -0
  738. data/spec/mongoid/validatable/length_spec.rb +2 -0
  739. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  740. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  741. data/spec/mongoid/validatable/uniqueness_spec.rb +159 -103
  742. data/spec/mongoid/validatable_spec.rb +5 -3
  743. data/spec/mongoid/warnings_spec.rb +35 -0
  744. data/spec/mongoid_spec.rb +37 -9
  745. data/spec/rails/controller_extension/controller_runtime_spec.rb +5 -3
  746. data/spec/rails/mongoid_spec.rb +8 -18
  747. data/spec/shared/LICENSE +20 -0
  748. data/spec/shared/bin/get-mongodb-download-url +17 -0
  749. data/spec/shared/bin/s3-copy +45 -0
  750. data/spec/shared/bin/s3-upload +69 -0
  751. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  752. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  753. data/spec/shared/lib/mrss/constraints.rb +378 -0
  754. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  755. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  756. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  757. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  758. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  759. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  760. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  761. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  762. data/spec/shared/lib/mrss/utils.rb +37 -0
  763. data/spec/shared/share/Dockerfile.erb +321 -0
  764. data/spec/shared/share/haproxy-1.conf +16 -0
  765. data/spec/shared/share/haproxy-2.conf +17 -0
  766. data/spec/shared/shlib/config.sh +27 -0
  767. data/spec/shared/shlib/distro.sh +74 -0
  768. data/spec/shared/shlib/server.sh +416 -0
  769. data/spec/shared/shlib/set_env.sh +169 -0
  770. data/spec/spec_helper.rb +44 -66
  771. data/spec/support/authorization.rb +2 -0
  772. data/spec/support/client_registry.rb +9 -0
  773. data/spec/support/constraints.rb +45 -69
  774. data/spec/support/expectations.rb +21 -3
  775. data/spec/support/helpers.rb +11 -0
  776. data/spec/support/immutable_ids.rb +118 -0
  777. data/spec/support/macros.rb +109 -0
  778. data/spec/{app → support}/models/account.rb +3 -1
  779. data/spec/{app → support}/models/acolyte.rb +2 -0
  780. data/spec/{app → support}/models/actor.rb +3 -1
  781. data/spec/support/models/actress.rb +4 -0
  782. data/spec/{app → support}/models/address.rb +6 -0
  783. data/spec/{app → support}/models/address_component.rb +2 -0
  784. data/spec/{app → support}/models/address_number.rb +2 -0
  785. data/spec/{app → support}/models/agency.rb +2 -0
  786. data/spec/{app → support}/models/agent.rb +2 -0
  787. data/spec/{app → support}/models/album.rb +2 -0
  788. data/spec/{app → support}/models/alert.rb +2 -0
  789. data/spec/{app → support}/models/animal.rb +2 -0
  790. data/spec/{app → support}/models/answer.rb +2 -0
  791. data/spec/{app → support}/models/appointment.rb +2 -0
  792. data/spec/support/models/armrest.rb +9 -0
  793. data/spec/{app → support}/models/article.rb +2 -0
  794. data/spec/{app → support}/models/artist.rb +4 -1
  795. data/spec/{app → support}/models/artwork.rb +2 -0
  796. data/spec/support/models/audible_sound.rb +3 -0
  797. data/spec/{app → support}/models/audio.rb +2 -0
  798. data/spec/support/models/augmentation.rb +25 -0
  799. data/spec/{app → support}/models/author.rb +2 -0
  800. data/spec/{app → support}/models/baby.rb +2 -0
  801. data/spec/{app → support}/models/band.rb +10 -0
  802. data/spec/{app → support}/models/bar.rb +2 -0
  803. data/spec/{app → support}/models/basic.rb +2 -0
  804. data/spec/support/models/bed.rb +3 -0
  805. data/spec/{app → support}/models/big_palette.rb +2 -0
  806. data/spec/{app → support}/models/birthday.rb +2 -0
  807. data/spec/support/models/bolt.rb +7 -0
  808. data/spec/{app → support}/models/bomb.rb +2 -0
  809. data/spec/{app → support}/models/book.rb +3 -0
  810. data/spec/{app → support}/models/breed.rb +2 -0
  811. data/spec/{app → support}/models/browser.rb +3 -1
  812. data/spec/{app → support}/models/building.rb +4 -0
  813. data/spec/{app → support}/models/building_address.rb +2 -0
  814. data/spec/{app → support}/models/bus.rb +2 -0
  815. data/spec/{app → support}/models/business.rb +2 -0
  816. data/spec/{app → support}/models/callback_test.rb +2 -0
  817. data/spec/{app → support}/models/canvas.rb +3 -1
  818. data/spec/support/models/car.rb +3 -0
  819. data/spec/{app → support}/models/cat.rb +2 -0
  820. data/spec/support/models/catalog.rb +24 -0
  821. data/spec/{app → support}/models/category.rb +2 -0
  822. data/spec/{app → support}/models/child.rb +2 -0
  823. data/spec/{app → support}/models/child_doc.rb +5 -3
  824. data/spec/{app → support}/models/church.rb +2 -0
  825. data/spec/{app → support}/models/circle.rb +2 -0
  826. data/spec/{app → support}/models/circuit.rb +2 -0
  827. data/spec/support/models/circus.rb +12 -0
  828. data/spec/{app → support}/models/code.rb +4 -0
  829. data/spec/support/models/coding/pull_request.rb +11 -0
  830. data/spec/support/models/coding.rb +3 -0
  831. data/spec/{app → support}/models/comment.rb +2 -0
  832. data/spec/{app → support}/models/company.rb +2 -0
  833. data/spec/{app → support}/models/consumption_period.rb +2 -0
  834. data/spec/{app → support}/models/contextable_item.rb +2 -0
  835. data/spec/{app → support}/models/contractor.rb +2 -0
  836. data/spec/{app → support}/models/cookie.rb +2 -0
  837. data/spec/{app → support}/models/country_code.rb +4 -0
  838. data/spec/{app → support}/models/courier_job.rb +2 -0
  839. data/spec/support/models/cover.rb +10 -0
  840. data/spec/support/models/crate.rb +12 -0
  841. data/spec/support/models/customer.rb +10 -0
  842. data/spec/support/models/customer_address.rb +11 -0
  843. data/spec/support/models/deed.rb +7 -0
  844. data/spec/{app → support}/models/definition.rb +2 -0
  845. data/spec/support/models/delegating_patient.rb +15 -0
  846. data/spec/{app → support}/models/description.rb +2 -0
  847. data/spec/{app → support}/models/dictionary.rb +8 -0
  848. data/spec/{app → support}/models/division.rb +2 -0
  849. data/spec/{app → support}/models/doctor.rb +2 -0
  850. data/spec/{app → support}/models/dog.rb +2 -0
  851. data/spec/{app → support}/models/dokument.rb +2 -0
  852. data/spec/{app → support}/models/draft.rb +2 -0
  853. data/spec/{app → support}/models/dragon.rb +2 -0
  854. data/spec/{app → support}/models/driver.rb +3 -1
  855. data/spec/{app → support}/models/drug.rb +2 -0
  856. data/spec/{app → support}/models/dungeon.rb +2 -0
  857. data/spec/{app → support}/models/edit.rb +2 -0
  858. data/spec/{app → support}/models/email.rb +2 -0
  859. data/spec/{app → support}/models/employer.rb +2 -0
  860. data/spec/{app → support}/models/entry.rb +2 -0
  861. data/spec/support/models/eraser.rb +3 -0
  862. data/spec/{app → support}/models/even.rb +2 -0
  863. data/spec/{app → support}/models/event.rb +2 -0
  864. data/spec/{app → support}/models/exhibition.rb +2 -0
  865. data/spec/{app → support}/models/exhibitor.rb +2 -0
  866. data/spec/{app → support}/models/explosion.rb +2 -0
  867. data/spec/{app → support}/models/eye.rb +2 -0
  868. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  869. data/spec/{app → support}/models/face.rb +2 -0
  870. data/spec/support/models/fanatic.rb +8 -0
  871. data/spec/{app → support}/models/favorite.rb +2 -0
  872. data/spec/{app → support}/models/filesystem.rb +2 -0
  873. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  874. data/spec/{app → support}/models/firefox.rb +2 -0
  875. data/spec/{app → support}/models/fish.rb +2 -0
  876. data/spec/{app → support}/models/folder.rb +2 -0
  877. data/spec/{app → support}/models/folder_item.rb +2 -0
  878. data/spec/{app → support}/models/fruits.rb +2 -0
  879. data/spec/{app → support}/models/game.rb +2 -0
  880. data/spec/{app → support}/models/ghost.rb +2 -0
  881. data/spec/support/models/guitar.rb +4 -0
  882. data/spec/support/models/hole.rb +12 -0
  883. data/spec/{app → support}/models/home.rb +2 -0
  884. data/spec/{app → support}/models/house.rb +2 -0
  885. data/spec/{app → support}/models/html_writer.rb +2 -0
  886. data/spec/{app → support}/models/id_key.rb +2 -0
  887. data/spec/support/models/idnodef.rb +7 -0
  888. data/spec/{app → support}/models/image.rb +2 -0
  889. data/spec/{app → support}/models/implant.rb +11 -0
  890. data/spec/support/models/instrument.rb +8 -0
  891. data/spec/{app → support}/models/item.rb +3 -1
  892. data/spec/{app → support}/models/jar.rb +2 -0
  893. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  894. data/spec/{app → support}/models/kangaroo.rb +3 -1
  895. data/spec/{app → support}/models/label.rb +6 -1
  896. data/spec/{app → support}/models/language.rb +2 -0
  897. data/spec/{app → support}/models/lat_lng.rb +2 -0
  898. data/spec/{app → support}/models/league.rb +2 -0
  899. data/spec/support/models/learner.rb +4 -0
  900. data/spec/{app → support}/models/line_item.rb +2 -0
  901. data/spec/{app → support}/models/location.rb +2 -0
  902. data/spec/{app → support}/models/login.rb +2 -0
  903. data/spec/{app → support}/models/manufacturer.rb +2 -0
  904. data/spec/{app → support}/models/meat.rb +2 -0
  905. data/spec/{app → support}/models/membership.rb +3 -0
  906. data/spec/{app → support}/models/message.rb +2 -0
  907. data/spec/{app → support}/models/minim.rb +0 -1
  908. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  909. data/spec/support/models/mop.rb +24 -0
  910. data/spec/{app → support}/models/movie.rb +2 -0
  911. data/spec/support/models/my_hash.rb +4 -0
  912. data/spec/{app → support}/models/name.rb +2 -0
  913. data/spec/support/models/name_only.rb +8 -0
  914. data/spec/{app → support}/models/node.rb +2 -0
  915. data/spec/{app → support}/models/note.rb +2 -0
  916. data/spec/support/models/nut.rb +7 -0
  917. data/spec/{app → support}/models/odd.rb +2 -0
  918. data/spec/support/models/order.rb +12 -0
  919. data/spec/{app → support}/models/ordered_post.rb +3 -1
  920. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  921. data/spec/{app → support}/models/oscar.rb +2 -0
  922. data/spec/support/models/other_owner_object.rb +4 -0
  923. data/spec/{app → support}/models/override.rb +2 -0
  924. data/spec/{app → support}/models/ownable.rb +2 -0
  925. data/spec/{app → support}/models/owner.rb +4 -0
  926. data/spec/{app → support}/models/pack.rb +2 -0
  927. data/spec/{app → support}/models/page.rb +2 -0
  928. data/spec/{app → support}/models/page_question.rb +2 -0
  929. data/spec/{app → support}/models/palette.rb +3 -1
  930. data/spec/{app → support}/models/parent.rb +2 -0
  931. data/spec/{app → support}/models/parent_doc.rb +2 -0
  932. data/spec/support/models/passport.rb +22 -0
  933. data/spec/{app → support}/models/patient.rb +2 -0
  934. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  935. data/spec/support/models/pencil.rb +3 -0
  936. data/spec/{app → support}/models/person.rb +22 -1
  937. data/spec/{app → support}/models/pet.rb +2 -0
  938. data/spec/{app → support}/models/pet_owner.rb +2 -0
  939. data/spec/{app → support}/models/phone.rb +5 -1
  940. data/spec/support/models/piano.rb +4 -0
  941. data/spec/{app → support}/models/pizza.rb +2 -0
  942. data/spec/{app → support}/models/player.rb +4 -0
  943. data/spec/{app → support}/models/post.rb +2 -0
  944. data/spec/{app → support}/models/post_genre.rb +2 -0
  945. data/spec/support/models/powerup.rb +25 -0
  946. data/spec/{app → support}/models/preference.rb +2 -0
  947. data/spec/{app → support}/models/princess.rb +2 -0
  948. data/spec/{app → support}/models/product.rb +3 -0
  949. data/spec/support/models/profile.rb +17 -0
  950. data/spec/{app → support}/models/pronunciation.rb +2 -0
  951. data/spec/{app → support}/models/pub.rb +2 -0
  952. data/spec/support/models/publication/encyclopedia.rb +11 -0
  953. data/spec/support/models/publication/review.rb +13 -0
  954. data/spec/support/models/publication.rb +4 -0
  955. data/spec/{app → support}/models/purchase.rb +2 -0
  956. data/spec/support/models/purchased_item.rb +10 -0
  957. data/spec/{app → support}/models/question.rb +2 -0
  958. data/spec/{app → support}/models/quiz.rb +2 -0
  959. data/spec/{app → support}/models/rating.rb +2 -0
  960. data/spec/{app → support}/models/record.rb +2 -0
  961. data/spec/{app → support}/models/registry.rb +3 -0
  962. data/spec/{app → support}/models/role.rb +2 -0
  963. data/spec/{app → support}/models/root_category.rb +2 -0
  964. data/spec/{app → support}/models/sandwich.rb +2 -0
  965. data/spec/{app → support}/models/scheduler.rb +2 -0
  966. data/spec/support/models/school.rb +14 -0
  967. data/spec/support/models/scribe.rb +7 -0
  968. data/spec/support/models/sealer.rb +7 -0
  969. data/spec/support/models/seat.rb +24 -0
  970. data/spec/{app → support}/models/seo.rb +2 -0
  971. data/spec/support/models/series.rb +7 -0
  972. data/spec/{app → support}/models/server.rb +2 -0
  973. data/spec/{app → support}/models/service.rb +2 -0
  974. data/spec/{app → support}/models/shape.rb +4 -2
  975. data/spec/{app → support}/models/shelf.rb +2 -0
  976. data/spec/support/models/shield.rb +18 -0
  977. data/spec/{app → support}/models/shipment_address.rb +2 -0
  978. data/spec/{app → support}/models/shipping_container.rb +2 -0
  979. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  980. data/spec/support/models/shirt.rb +11 -0
  981. data/spec/{app → support}/models/shop.rb +2 -0
  982. data/spec/{app → support}/models/short_agent.rb +2 -0
  983. data/spec/{app → support}/models/short_quiz.rb +2 -0
  984. data/spec/{app → support}/models/simple.rb +2 -0
  985. data/spec/{app → support}/models/slave.rb +2 -0
  986. data/spec/{app → support}/models/song.rb +2 -0
  987. data/spec/{app → support}/models/sound.rb +2 -0
  988. data/spec/support/models/spacer.rb +7 -0
  989. data/spec/{app → support}/models/square.rb +2 -0
  990. data/spec/{app → support}/models/staff.rb +2 -0
  991. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  992. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  993. data/spec/{app → support}/models/strategy.rb +2 -0
  994. data/spec/support/models/student.rb +14 -0
  995. data/spec/{app → support}/models/sub_item.rb +2 -0
  996. data/spec/{app → support}/models/subscription.rb +2 -0
  997. data/spec/{app → support}/models/survey.rb +2 -0
  998. data/spec/{app → support}/models/symptom.rb +2 -0
  999. data/spec/support/models/system_role.rb +7 -0
  1000. data/spec/{app → support}/models/tag.rb +2 -0
  1001. data/spec/{app → support}/models/target.rb +2 -0
  1002. data/spec/{app → support}/models/template.rb +2 -0
  1003. data/spec/{app → support}/models/thing.rb +2 -0
  1004. data/spec/support/models/threadlocker.rb +7 -0
  1005. data/spec/{app → support}/models/title.rb +2 -0
  1006. data/spec/{app → support}/models/tool.rb +4 -2
  1007. data/spec/{app → support}/models/topping.rb +2 -0
  1008. data/spec/support/models/toy.rb +9 -0
  1009. data/spec/{app → support}/models/track.rb +2 -0
  1010. data/spec/{app → support}/models/translation.rb +2 -0
  1011. data/spec/{app → support}/models/tree.rb +2 -0
  1012. data/spec/support/models/truck.rb +7 -0
  1013. data/spec/{app → support}/models/user.rb +2 -0
  1014. data/spec/{app → support}/models/user_account.rb +2 -0
  1015. data/spec/{app → support}/models/validation_callback.rb +2 -0
  1016. data/spec/support/models/vehicle.rb +18 -0
  1017. data/spec/{app → support}/models/version.rb +2 -0
  1018. data/spec/{app → support}/models/vertex.rb +3 -1
  1019. data/spec/{app → support}/models/vet_visit.rb +2 -0
  1020. data/spec/{app → support}/models/video.rb +2 -0
  1021. data/spec/support/models/video_game.rb +3 -0
  1022. data/spec/support/models/washer.rb +7 -0
  1023. data/spec/support/models/weapon.rb +25 -0
  1024. data/spec/{app → support}/models/wiki_page.rb +3 -0
  1025. data/spec/{app → support}/models/word.rb +2 -0
  1026. data/spec/{app → support}/models/word_origin.rb +2 -0
  1027. data/spec/{app → support}/models/writer.rb +4 -2
  1028. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1029. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1030. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1031. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1032. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1033. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1034. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1035. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1036. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1037. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1038. data/spec/support/shared/time.rb +53 -0
  1039. data/spec/support/spec_config.rb +30 -5
  1040. data.tar.gz.sig +0 -0
  1041. metadata +1240 -742
  1042. metadata.gz.sig +0 -0
  1043. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1044. data/lib/mongoid/errors/eager_load.rb +0 -22
  1045. data/lib/mongoid/errors/invalid_value.rb +0 -16
  1046. data/lib/mongoid/matchable/all.rb +0 -27
  1047. data/lib/mongoid/matchable/and.rb +0 -30
  1048. data/lib/mongoid/matchable/default.rb +0 -72
  1049. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1050. data/lib/mongoid/matchable/eq.rb +0 -22
  1051. data/lib/mongoid/matchable/exists.rb +0 -23
  1052. data/lib/mongoid/matchable/gt.rb +0 -23
  1053. data/lib/mongoid/matchable/gte.rb +0 -23
  1054. data/lib/mongoid/matchable/in.rb +0 -24
  1055. data/lib/mongoid/matchable/lt.rb +0 -23
  1056. data/lib/mongoid/matchable/lte.rb +0 -23
  1057. data/lib/mongoid/matchable/ne.rb +0 -21
  1058. data/lib/mongoid/matchable/nin.rb +0 -22
  1059. data/lib/mongoid/matchable/nor.rb +0 -37
  1060. data/lib/mongoid/matchable/or.rb +0 -33
  1061. data/lib/mongoid/matchable/regexp.rb +0 -27
  1062. data/lib/mongoid/matchable/size.rb +0 -21
  1063. data/lib/support/ruby_version.rb +0 -26
  1064. data/spec/app/models/actress.rb +0 -2
  1065. data/spec/app/models/augmentation.rb +0 -11
  1066. data/spec/app/models/bed.rb +0 -1
  1067. data/spec/app/models/car.rb +0 -1
  1068. data/spec/app/models/circus.rb +0 -7
  1069. data/spec/app/models/eraser.rb +0 -1
  1070. data/spec/app/models/learner.rb +0 -2
  1071. data/spec/app/models/my_hash.rb +0 -2
  1072. data/spec/app/models/other_owner_object.rb +0 -2
  1073. data/spec/app/models/passport.rb +0 -5
  1074. data/spec/app/models/pencil.rb +0 -1
  1075. data/spec/app/models/powerup.rb +0 -11
  1076. data/spec/app/models/profile.rb +0 -5
  1077. data/spec/app/models/series.rb +0 -4
  1078. data/spec/app/models/truck.rb +0 -3
  1079. data/spec/app/models/vehicle.rb +0 -11
  1080. data/spec/app/models/video_game.rb +0 -1
  1081. data/spec/app/models/weapon.rb +0 -11
  1082. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -58
  1083. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -58
  1084. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1085. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1086. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1087. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1088. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1089. data/spec/mongoid/matchable/eq_spec.rb +0 -48
  1090. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1091. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1092. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1093. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1094. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1095. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1096. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1097. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1098. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1099. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1100. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1101. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1102. data/spec/mongoid/matchable_spec.rb +0 -853
  1103. data/spec/support/cluster_config.rb +0 -158
  1104. /data/spec/{app → support}/models/array_field.rb +0 -0
  1105. /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  1106. /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  1107. /data/spec/{app → support}/models/updatable.rb +0 -0
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
4
+ require 'mongoid/association/referenced/has_many_models'
2
5
 
3
6
  describe Mongoid::QueryCache do
4
7
 
@@ -7,6 +10,116 @@ describe Mongoid::QueryCache do
7
10
  Mongoid::QueryCache.cache { spec.run }
8
11
  end
9
12
 
13
+ before(:all) do
14
+ # It is likely that there are other session leaks in the driver
15
+ # and/or Mongoid that are unrelated to the query cache. Clear the
16
+ # SessionRegistry at the start of these tests in order to detect leaks that
17
+ # occur only within the scope of these tests.
18
+ #
19
+ # Other session leaks will be detected and addressed as part of RUBY-2391.
20
+ Mrss::SessionRegistry.instance.clear_registry
21
+ end
22
+
23
+ after do
24
+ Mrss::SessionRegistry.instance.verify_sessions_ended!
25
+ end
26
+
27
+ describe '#cache' do
28
+
29
+ context 'with driver query cache' do
30
+
31
+ context 'when query cache is not enabled' do
32
+ override_query_cache false
33
+
34
+ it 'turns on the query cache within the block' do
35
+ expect(Mongoid::QueryCache.enabled?).to be false
36
+
37
+ Mongoid::QueryCache.cache do
38
+ expect(Mongoid::QueryCache.enabled?).to be true
39
+ end
40
+
41
+ expect(Mongoid::QueryCache.enabled?).to be false
42
+ end
43
+ end
44
+
45
+ context 'when query cache is enabled' do
46
+ override_query_cache true
47
+
48
+ it 'keeps the query cache enabled within the block' do
49
+ expect(Mongoid::QueryCache.enabled?).to be true
50
+
51
+ Mongoid::QueryCache.cache do
52
+ expect(Mongoid::QueryCache.enabled?).to be true
53
+ end
54
+
55
+ expect(Mongoid::QueryCache.enabled?).to be true
56
+ end
57
+ end
58
+
59
+ context 'nested inside #uncached' do
60
+ it 'turns on the query cache in the block' do
61
+ Mongoid::QueryCache.uncached do
62
+ expect(Mongoid::QueryCache.enabled?).to be false
63
+
64
+ Mongoid::QueryCache.cache do
65
+ expect(Mongoid::QueryCache.enabled?).to be true
66
+ end
67
+
68
+ expect(Mongoid::QueryCache.enabled?).to be false
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ describe '#uncached' do
76
+
77
+ context 'with driver query cache' do
78
+
79
+ context 'when query cache is not enabled' do
80
+ override_query_cache false
81
+
82
+ it 'keeps the query cache turned off within the block' do
83
+ expect(Mongoid::QueryCache.enabled?).to be false
84
+
85
+ Mongoid::QueryCache.uncached do
86
+ expect(Mongoid::QueryCache.enabled?).to be false
87
+ end
88
+
89
+ expect(Mongoid::QueryCache.enabled?).to be false
90
+ end
91
+ end
92
+
93
+ context 'when query cache is enabled' do
94
+ override_query_cache true
95
+
96
+ it 'turns off the query cache within the block' do
97
+ expect(Mongoid::QueryCache.enabled?).to be true
98
+
99
+ Mongoid::QueryCache.uncached do
100
+ expect(Mongoid::QueryCache.enabled?).to be false
101
+ end
102
+
103
+ expect(Mongoid::QueryCache.enabled?).to be true
104
+ end
105
+ end
106
+
107
+ context 'nested inside #cache' do
108
+ it 'turns on the query cache in the block' do
109
+ Mongoid::QueryCache.cache do
110
+ expect(Mongoid::QueryCache.enabled?).to be true
111
+
112
+ Mongoid::QueryCache.uncached do
113
+ expect(Mongoid::QueryCache.enabled?).to be false
114
+ end
115
+
116
+ expect(Mongoid::QueryCache.enabled?).to be true
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+
10
123
  context 'when iterating over objects sharing the same base' do
11
124
 
12
125
  let(:server) do
@@ -14,11 +127,11 @@ describe Mongoid::QueryCache do
14
127
  end
15
128
 
16
129
  before do
17
- person = Person.create
130
+ person = Person.create!
18
131
  3.times do
19
- person.send(relation).create
132
+ person.send(relation).create!
20
133
  end
21
- person.save
134
+ person.save!
22
135
  end
23
136
 
24
137
  let!(:relations) do
@@ -32,10 +145,7 @@ describe Mongoid::QueryCache do
32
145
  end
33
146
 
34
147
  context 'does not query for the relation and instead sets the base' do
35
-
36
- before do
37
- Mongoid::QueryCache.enabled = false
38
- end
148
+ override_query_cache false
39
149
 
40
150
  it 'queries for each access to the base' do
41
151
  expect(server).to receive(:with_connection).exactly(0).times.and_call_original
@@ -53,10 +163,7 @@ describe Mongoid::QueryCache do
53
163
  end
54
164
 
55
165
  context 'when query cache is disabled' do
56
-
57
- before do
58
- Mongoid::QueryCache.enabled = false
59
- end
166
+ override_query_cache false
60
167
 
61
168
  it 'does not query for access to the base' do
62
169
  expect(server).to receive(:context).exactly(0).times.and_call_original
@@ -67,10 +174,7 @@ describe Mongoid::QueryCache do
67
174
  end
68
175
 
69
176
  context 'when query cache is enabled' do
70
-
71
- before do
72
- Mongoid::QueryCache.enabled = true
73
- end
177
+ override_query_cache true
74
178
 
75
179
  it 'does not query for access to the base' do
76
180
  expect(server).to receive(:context).exactly(0).times.and_call_original
@@ -82,6 +186,96 @@ describe Mongoid::QueryCache do
82
186
  end
83
187
  end
84
188
 
189
+ context 'when driver query cache exists' do
190
+
191
+ before do
192
+ Band.all.to_a
193
+ Band.create!
194
+ end
195
+
196
+ it 'recognizes the driver query cache' do
197
+ expect(defined?(Mongo::QueryCache)).to_not be_nil
198
+ end
199
+
200
+ context 'when query cache enabled' do
201
+
202
+ it 'uses the driver query cache' do
203
+ expect(Mongo::QueryCache).to receive(:enabled=).and_call_original
204
+ Mongoid::QueryCache.enabled = true
205
+
206
+ expect(Mongoid::QueryCache.enabled?).to be(true)
207
+ expect(Mongo::QueryCache.enabled?).to be(true)
208
+ end
209
+ end
210
+
211
+ context 'when query cache disabled' do
212
+
213
+ it 'uses the driver query cache' do
214
+ expect(Mongo::QueryCache).to receive(:enabled=).and_call_original
215
+ Mongoid::QueryCache.enabled = false
216
+
217
+ expect(Mongoid::QueryCache.enabled?).to be(false)
218
+ expect(Mongo::QueryCache.enabled?).to be(false)
219
+ end
220
+ end
221
+
222
+ context 'when block is cached' do
223
+ override_query_cache false
224
+
225
+ it 'uses the driver query cache' do
226
+ expect(Mongo::QueryCache).to receive(:cache).and_call_original
227
+ Mongoid::QueryCache.cache do
228
+ expect(Mongo::QueryCache).to receive(:enabled?).exactly(2).and_call_original
229
+ expect(Mongoid::QueryCache.enabled?).to be(true)
230
+ expect(Mongo::QueryCache.enabled?).to be(true)
231
+ end
232
+ end
233
+ end
234
+
235
+ context 'when block is uncached' do
236
+ override_query_cache true
237
+
238
+ it 'uses the driver query cache' do
239
+ expect(Mongo::QueryCache).to receive(:uncached).and_call_original
240
+ Mongoid::QueryCache.uncached do
241
+ expect(Mongo::QueryCache).to receive(:enabled?).exactly(2).and_call_original
242
+ expect(Mongoid::QueryCache.enabled?).to be(false)
243
+ expect(Mongo::QueryCache.enabled?).to be(false)
244
+ end
245
+ end
246
+ end
247
+
248
+ context 'when clear_cache is used' do
249
+
250
+ before do
251
+ Band.all.to_a
252
+ end
253
+
254
+ it 'requires Mongoid to query again' do
255
+ expect_no_queries do
256
+ Band.all.to_a
257
+ end
258
+
259
+ Mongoid::QueryCache.clear_cache
260
+
261
+ expect_query(1) do
262
+ Band.all.to_a
263
+ end
264
+ end
265
+ end
266
+
267
+ context 'when query cache used and cleared' do
268
+ it 'uses the driver query cache' do
269
+ expect(Mongo::QueryCache).to receive(:set).once.and_call_original
270
+
271
+ expect_query(1) do
272
+ Band.all.to_a
273
+ Band.all.to_a
274
+ end
275
+ end
276
+ end
277
+ end
278
+
85
279
  context "when querying for a single document" do
86
280
 
87
281
  [ :first, :one, :last ].each do |method|
@@ -91,10 +285,7 @@ describe Mongoid::QueryCache do
91
285
  end
92
286
 
93
287
  context "when query cache is disabled" do
94
-
95
- before do
96
- Mongoid::QueryCache.enabled = false
97
- end
288
+ override_query_cache false
98
289
 
99
290
  it "queries again" do
100
291
  expect_query(1) do
@@ -126,29 +317,86 @@ describe Mongoid::QueryCache do
126
317
  context 'querying all documents after a single document' do
127
318
  before do
128
319
  3.times do
129
- Person.create
320
+ Person.create!
130
321
  end
131
322
  end
132
323
 
133
324
  it 'returns all documents' do
134
- expect(Person.all.to_a.count).to eq(3)
135
- Person.first
136
- expect(Person.all.to_a.count).to eq(3)
325
+ # Mongoid adds a sort by _id to the Person.first call, which is why
326
+ # these commands issue two queries instead of one.
327
+ expect_query(2) do
328
+ expect(Person.all.to_a.count).to eq(3)
329
+ Person.first
330
+ expect(Person.all.to_a.count).to eq(3)
331
+ end
332
+ end
333
+
334
+ it 'caches the query when order is specified' do
335
+ expect_query(1) do
336
+ expect(Person.order(_id: 1).all.to_a.count).to eq(3)
337
+ Person.first
338
+ expect(Person.order(_id: 1).all.to_a.count).to eq(3)
339
+ end
137
340
  end
138
341
 
139
342
  context 'with conditions specified' do
140
343
  it 'returns all documents' do
141
- expect(Person.gt(age: 0).to_a.count).to eq(3)
142
- Person.gt(age: 0).first
143
- expect(Person.gt(age: 0).to_a.count).to eq(3)
344
+ # Mongoid adds a sort by _id to the Person.first call, which is why
345
+ # these commands issue two queries instead of one.
346
+ expect_query(2) do
347
+ expect(Person.gt(age: 0).to_a.count).to eq(3)
348
+ Person.gt(age: 0).first
349
+ expect(Person.gt(age: 0).to_a.count).to eq(3)
350
+ end
351
+ end
352
+
353
+ it 'caches the query when order is specified' do
354
+ expect_query(1) do
355
+ expect(Person.order(_id: 1).gt(age: 0).to_a.count).to eq(3)
356
+ Person.gt(age: 0).first
357
+ expect(Person.order(_id: 1).gt(age: 0).to_a.count).to eq(3)
358
+ end
144
359
  end
145
360
  end
146
361
 
147
362
  context 'with order specified' do
148
363
  it 'returns all documents' do
149
- expect(Person.order_by(name: 1).to_a.count).to eq(3)
150
- Person.order_by(name: 1).first
151
- expect(Person.order_by(name: 1).to_a.count).to eq(3)
364
+ expect_query(1) do
365
+ expect(Person.order_by(name: 1).to_a.count).to eq(3)
366
+ Person.order_by(name: 1).first
367
+ expect(Person.order_by(name: 1).to_a.count).to eq(3)
368
+ end
369
+ end
370
+ end
371
+ end
372
+
373
+ context 'when using a block API' do
374
+ before do
375
+ Band.destroy_all
376
+ 5.times { Band.create! }
377
+ end
378
+
379
+ context '#any? with no block' do
380
+ it 'doesn\'t leak sessions' do
381
+ Band.all.any?
382
+ end
383
+ end
384
+
385
+ context '#all? with no block' do
386
+ it 'doesn\'t leak sessions' do
387
+ Band.all.all?
388
+ end
389
+ end
390
+
391
+ context '#none? with no block' do
392
+ it 'doesn\'t leak sessions' do
393
+ Band.all.none?
394
+ end
395
+ end
396
+
397
+ context '#one? with no block' do
398
+ it 'doesn\'t leak sessions' do
399
+ Band.all.one?
152
400
  end
153
401
  end
154
402
  end
@@ -160,10 +408,7 @@ describe Mongoid::QueryCache do
160
408
  end
161
409
 
162
410
  context "when query cache is disabled" do
163
-
164
- before do
165
- Mongoid::QueryCache.enabled = false
166
- end
411
+ override_query_cache false
167
412
 
168
413
  it "queries again" do
169
414
  expect_query(1) do
@@ -180,7 +425,8 @@ describe Mongoid::QueryCache do
180
425
  end
181
426
  end
182
427
 
183
- context 'when the first query has a collation', if: collation_supported? do
428
+ context 'when the first query has a collation' do
429
+ min_server_version '3.4'
184
430
 
185
431
  before do
186
432
  Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2).to_a
@@ -221,6 +467,10 @@ describe Mongoid::QueryCache do
221
467
  end
222
468
 
223
469
  before do
470
+ 10.times do |i|
471
+ game.ratings << Rating.create!(value: i+1)
472
+ end
473
+
224
474
  game.ratings.where(:value.gt => 5).asc(:id).all.to_a
225
475
  end
226
476
 
@@ -228,27 +478,38 @@ describe Mongoid::QueryCache do
228
478
 
229
479
  it "uses the cache" do
230
480
  expect_no_queries do
231
- game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
481
+ result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
482
+ expect(result.length).to eq(2)
483
+ expect(result.map { |r| r['value'] }).to eq([6, 7])
232
484
  end
233
485
  end
234
486
  end
235
487
  end
236
488
 
237
489
  context "when the first query has a limit" do
238
-
239
490
  let(:game) do
240
491
  Game.create!(name: "2048")
241
492
  end
242
493
 
243
494
  before do
495
+ 10.times do |i|
496
+ game.ratings << Rating.create!(value: i+1)
497
+ end
498
+
244
499
  game.ratings.where(:value.gt => 5).limit(3).asc(:id).all.to_a
245
500
  end
246
501
 
247
502
  context "when the next query has a limit" do
248
503
 
249
- it "queries again" do
250
- expect_query(1) do
251
- game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
504
+ context 'with driver query cache' do
505
+
506
+ # The driver query cache re-uses results with a larger limit
507
+ it 'does not query again' do
508
+ expect_no_queries do
509
+ result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
510
+ expect(result.length).to eq(2)
511
+ expect(result.map { |r| r['value'] }).to eq([6, 7])
512
+ end
252
513
  end
253
514
  end
254
515
  end
@@ -257,7 +518,9 @@ describe Mongoid::QueryCache do
257
518
 
258
519
  it "queries again" do
259
520
  expect_query(1) do
260
- game.ratings.where(:value.gt => 5).asc(:id).to_a
521
+ result = game.ratings.where(:value.gt => 5).asc(:id).to_a
522
+ expect(result.length).to eq(5)
523
+ expect(result.map { |r| r['value'] }).to eq([6, 7, 8, 9, 10])
261
524
  end
262
525
  end
263
526
  end
@@ -270,21 +533,34 @@ describe Mongoid::QueryCache do
270
533
  end
271
534
 
272
535
  before do
536
+ 10.times do |i|
537
+ game.ratings << Rating.create!(value: i+1)
538
+ end
539
+
273
540
  game.ratings.where(:value.gt => 5).asc(:id).all.to_a
274
541
  end
275
542
 
276
543
  it "does not query again" do
277
544
  expect_no_queries do
278
- game.ratings.where(:value.gt => 5).asc(:id).first
545
+ result = game.ratings.where(:value.gt => 5).asc(:id).first
546
+ expect(result['value']).to eq(6)
279
547
  end
280
548
  end
281
549
  end
282
550
 
283
551
  context "when limiting the result" do
552
+ before do
553
+ Band.destroy_all
554
+
555
+ 5.times { |i| Band.create!(name: "Band #{i}") }
556
+ Band.all.to_a
557
+ end
284
558
 
285
559
  it "does not query again" do
286
560
  expect_query(0) do
287
- Band.limit(2).all.to_a
561
+ result = Band.limit(2).all.to_a
562
+ expect(result.length).to eq(2)
563
+ expect(result.map { |r| r["name"] }).to eq(["Band 0", "Band 1"])
288
564
  end
289
565
  end
290
566
  end
@@ -292,12 +568,17 @@ describe Mongoid::QueryCache do
292
568
  context "when specifying a different skip value" do
293
569
 
294
570
  before do
571
+ Band.destroy_all
572
+
573
+ 5.times { |i| Band.create!(name: "Band #{i}") }
295
574
  Band.limit(2).skip(1).all.to_a
296
575
  end
297
576
 
298
577
  it "queries again" do
299
578
  expect_query(1) do
300
- Band.limit(2).skip(3).all.to_a
579
+ result = Band.limit(2).skip(3).all.to_a
580
+ expect(result.length).to eq(2)
581
+ expect(result.map { |r| r["name"] }).to eq(["Band 3", "Band 4"])
301
582
  end
302
583
  end
303
584
  end
@@ -333,14 +614,27 @@ describe Mongoid::QueryCache do
333
614
  end
334
615
  end
335
616
 
336
- context "when query caching is enabled and the batch_size is set" do
617
+ context 'when querying collection larger than the batch size' do
618
+ before do
619
+ Band.destroy_all
620
+ 101.times { |i| Band.create!(_id: i) }
621
+ end
337
622
 
338
- around(:each) do |example|
339
- query_cache_enabled = Mongoid::QueryCache.enabled?
340
- Mongoid::QueryCache.enabled = true
341
- example.run
342
- Mongoid::QueryCache.enabled = query_cache_enabled
343
- end
623
+ it 'does not raise an exception when querying multiple times' do
624
+ expect do
625
+ results1 = Band.all.to_a
626
+ expect(results1.length).to eq(101)
627
+ expect(results1.map { |band| band["_id"] }).to eq([*0..100])
628
+
629
+ results2 = Band.all.to_a
630
+ expect(results2.length).to eq(101)
631
+ expect(results2.map { |band| band["_id"] }).to eq([*0..100])
632
+ end.not_to raise_error
633
+ end
634
+ end
635
+
636
+ context "when query caching is enabled and the batch_size is set" do
637
+ override_query_cache true
344
638
 
345
639
  it "does not raise an error when requesting the second batch" do
346
640
  expect {
@@ -349,7 +643,6 @@ describe Mongoid::QueryCache do
349
643
  end
350
644
  }.not_to raise_error
351
645
  end
352
-
353
646
  end
354
647
  end
355
648
 
@@ -413,14 +706,11 @@ describe Mongoid::QueryCache do
413
706
  context "when reloading a document" do
414
707
 
415
708
  let!(:band_id) do
416
- Band.create.id
709
+ Band.create!.id
417
710
  end
418
711
 
419
712
  context 'when query cache is disabled' do
420
-
421
- before do
422
- Mongoid::QueryCache.enabled = false
423
- end
713
+ override_query_cache false
424
714
 
425
715
  it "queries again" do
426
716
  band = Band.find(band_id)
@@ -467,8 +757,10 @@ describe Mongoid::QueryCache do
467
757
  end
468
758
  end
469
759
 
470
- it "returns the same count of objects when using #pluck" do
471
- expect(Band.pluck(:name).length).to eq(99)
760
+ it "returns the same count of objects when using #pluck but doesn't cache" do
761
+ expect_query(1) do
762
+ expect(Band.pluck(:name).length).to eq(99)
763
+ end
472
764
  end
473
765
  end
474
766
  end
@@ -482,69 +774,92 @@ describe Mongoid::QueryCache do
482
774
  end
483
775
 
484
776
  context 'when the initial query does not exhaust the results' do
777
+ override_query_cache true
778
+
485
779
  before do
486
- Mongoid::QueryCache.enabled = true
487
780
  10.times { Band.create! }
488
781
 
489
- Band.batch_size(4).all.any?
782
+ Band.batch_size(4).to_a
490
783
  end
491
784
 
492
- it 'does not cache the result' do
493
- expect(Band.all.map(&:id).size).to eq(10)
494
- end
785
+ context 'with driver query cache' do
495
786
 
496
- context 'when a batch size smaller than the result set is specified' do
497
- let(:batch_size) do
498
- 4
787
+ # The driver query cache caches multi-batch cursors
788
+ it 'does cache the result' do
789
+ expect_no_queries do
790
+ expect(Band.all.map(&:id).size).to eq(10)
791
+ end
499
792
  end
793
+ end
794
+ end
500
795
 
501
- it 'does not cache the result' do
502
- expect(Band.batch_size(batch_size).all.map(&:id).size).to eq(10)
796
+ context 'when storing in system collection' do
797
+ it 'does not cache the query' do
798
+ expect_query(2) do
799
+ SystemRole.all.to_a
800
+ SystemRole.all.to_a
503
801
  end
504
802
  end
505
803
  end
506
- end
507
804
 
508
- describe Mongoid::QueryCache::Middleware do
805
+ context 'after calling none? on an association' do
806
+ let!(:host) do
807
+ HmmSchool.delete_all
808
+ school = HmmSchool.create!
809
+ 5.times do
810
+ HmmStudent.create!(school: school)
811
+ end
812
+ end
509
813
 
510
- let :middleware do
511
- Mongoid::QueryCache::Middleware.new(app)
512
- end
814
+ let(:school) { HmmSchool.first }
513
815
 
514
- context "when not touching mongoid on the app" do
816
+ before do
817
+ Mongoid::QueryCache.clear_cache
515
818
 
516
- let(:app) do
517
- ->(env) { @enabled = Mongoid::QueryCache.enabled?; [200, env, "app"] }
819
+ school.students.none?
518
820
  end
519
821
 
520
- it "returns success" do
521
- code, _ = middleware.call({})
522
- expect(code).to eq(200)
822
+ it 'returns all children for the association' do
823
+ school.students.to_a.length.should == 5
523
824
  end
825
+ end
524
826
 
525
- it "enableds the query cache" do
526
- middleware.call({})
527
- expect(@enabled).to be true
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
528
834
  end
529
- end
530
835
 
531
- context "when querying on the app" do
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
532
842
 
533
- let(:app) do
534
- ->(env) {
535
- Band.all.to_a
536
- [200, env, "app"]
537
- }
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
538
848
  end
539
849
 
540
- it "returns success" do
541
- code, _ = middleware.call({})
542
- expect(code).to eq(200)
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
543
855
  end
544
856
 
545
- it "cleans the query cache after reponds" do
546
- middleware.call({})
547
- expect(Mongoid::QueryCache.cache_table).to be_empty
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
548
863
  end
549
864
  end
550
865
  end