mongoid 7.2.1 → 9.0.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 (1082) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/LICENSE +1 -1
  5. data/README.md +7 -12
  6. data/Rakefile +58 -1
  7. data/lib/config/locales/en.yml +191 -60
  8. data/lib/mongoid/association/accessors.rb +67 -53
  9. data/lib/mongoid/association/bindable.rb +77 -31
  10. data/lib/mongoid/association/builders.rb +8 -14
  11. data/lib/mongoid/association/constrainable.rb +2 -5
  12. data/lib/mongoid/association/depending.rb +20 -12
  13. data/lib/mongoid/association/eager.rb +160 -0
  14. data/lib/mongoid/association/eager_loadable.rb +41 -11
  15. data/lib/mongoid/association/embedded/batchable.rb +63 -52
  16. data/lib/mongoid/association/embedded/cyclic.rb +4 -12
  17. data/lib/mongoid/association/embedded/eager.rb +23 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
  19. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
  21. data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
  22. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
  23. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
  25. data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
  26. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
  27. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
  29. data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
  30. data/lib/mongoid/association/embedded.rb +2 -1
  31. data/lib/mongoid/association/macros.rb +47 -16
  32. data/lib/mongoid/association/many.rb +12 -24
  33. data/lib/mongoid/association/marshalable.rb +4 -5
  34. data/lib/mongoid/association/nested/many.rb +14 -19
  35. data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
  36. data/lib/mongoid/association/nested/one.rb +54 -26
  37. data/lib/mongoid/association/nested.rb +1 -3
  38. data/lib/mongoid/association/one.rb +3 -11
  39. data/lib/mongoid/association/options.rb +18 -44
  40. data/lib/mongoid/association/proxy.rb +49 -42
  41. data/lib/mongoid/association/referenced/auto_save.rb +11 -15
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
  46. data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
  47. data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
  53. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
  54. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
  55. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
  56. data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
  57. data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
  58. data/lib/mongoid/association/referenced/has_many.rb +17 -43
  59. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
  60. data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
  61. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
  63. data/lib/mongoid/association/referenced/has_one.rb +17 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -27
  65. data/lib/mongoid/association/referenced.rb +1 -1
  66. data/lib/mongoid/association/reflections.rb +9 -9
  67. data/lib/mongoid/association/relatable.rb +55 -74
  68. data/lib/mongoid/association.rb +10 -22
  69. data/lib/mongoid/atomic/modifiers.rb +7 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -3
  73. data/lib/mongoid/atomic/paths/root.rb +1 -5
  74. data/lib/mongoid/atomic/paths.rb +1 -1
  75. data/lib/mongoid/atomic.rb +39 -86
  76. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  77. data/lib/mongoid/attributes/dynamic.rb +5 -21
  78. data/lib/mongoid/attributes/embedded.rb +34 -0
  79. data/lib/mongoid/attributes/nested.rb +9 -13
  80. data/lib/mongoid/attributes/processing.rb +43 -28
  81. data/lib/mongoid/attributes/projector.rb +120 -0
  82. data/lib/mongoid/attributes/readonly.rb +4 -8
  83. data/lib/mongoid/attributes.rb +85 -89
  84. data/lib/mongoid/cacheable.rb +5 -9
  85. data/lib/mongoid/changeable.rb +183 -97
  86. data/lib/mongoid/clients/factory.rb +58 -15
  87. data/lib/mongoid/clients/options.rb +117 -8
  88. data/lib/mongoid/clients/sessions.rb +246 -84
  89. data/lib/mongoid/clients/storage_options.rb +37 -11
  90. data/lib/mongoid/clients/validators/storage.rb +4 -24
  91. data/lib/mongoid/clients/validators.rb +1 -1
  92. data/lib/mongoid/clients.rb +37 -14
  93. data/lib/mongoid/collection_configurable.rb +59 -0
  94. data/lib/mongoid/composable.rb +7 -7
  95. data/lib/mongoid/config/defaults.rb +40 -0
  96. data/lib/mongoid/config/encryption.rb +213 -0
  97. data/lib/mongoid/config/environment.rb +25 -5
  98. data/lib/mongoid/config/introspection.rb +152 -0
  99. data/lib/mongoid/config/options.rb +11 -14
  100. data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
  101. data/lib/mongoid/config/validators/client.rb +7 -23
  102. data/lib/mongoid/config/validators/option.rb +1 -3
  103. data/lib/mongoid/config/validators.rb +2 -1
  104. data/lib/mongoid/config.rb +183 -46
  105. data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
  106. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
  107. data/lib/mongoid/contextual/aggregable/none.rb +66 -0
  108. data/lib/mongoid/contextual/aggregable.rb +18 -0
  109. data/lib/mongoid/contextual/atomic.rb +97 -30
  110. data/lib/mongoid/contextual/command.rb +3 -5
  111. data/lib/mongoid/contextual/map_reduce.rb +8 -33
  112. data/lib/mongoid/contextual/memory.rb +396 -89
  113. data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
  114. data/lib/mongoid/contextual/mongo.rb +640 -311
  115. data/lib/mongoid/contextual/none.rb +244 -30
  116. data/lib/mongoid/contextual/queryable.rb +5 -4
  117. data/lib/mongoid/contextual.rb +18 -7
  118. data/lib/mongoid/copyable.rb +34 -14
  119. data/lib/mongoid/criteria/findable.rb +52 -22
  120. data/lib/mongoid/criteria/includable.rb +31 -34
  121. data/lib/mongoid/criteria/inspectable.rb +4 -3
  122. data/lib/mongoid/criteria/marshalable.rb +14 -7
  123. data/lib/mongoid/criteria/modifiable.rb +5 -19
  124. data/lib/mongoid/criteria/options.rb +1 -3
  125. data/lib/mongoid/criteria/permission.rb +6 -2
  126. data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
  127. data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
  128. data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
  129. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
  130. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
  131. data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
  132. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
  133. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
  134. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
  135. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
  136. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
  137. data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
  138. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
  139. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
  140. data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
  141. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
  142. data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
  143. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  144. data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
  145. data/lib/mongoid/criteria/queryable/key.rb +15 -18
  146. data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
  147. data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
  148. data/lib/mongoid/criteria/queryable/optional.rb +12 -62
  149. data/lib/mongoid/criteria/queryable/options.rb +3 -21
  150. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
  151. data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
  152. data/lib/mongoid/criteria/queryable/selector.rb +96 -25
  153. data/lib/mongoid/criteria/queryable/smash.rb +41 -18
  154. data/lib/mongoid/criteria/queryable/storable.rb +14 -9
  155. data/lib/mongoid/criteria/queryable.rb +12 -13
  156. data/lib/mongoid/criteria/scopable.rb +32 -21
  157. data/lib/mongoid/criteria/translator.rb +46 -0
  158. data/lib/mongoid/criteria.rb +60 -109
  159. data/lib/mongoid/deprecable.rb +38 -0
  160. data/lib/mongoid/deprecation.rb +29 -0
  161. data/lib/mongoid/document.rb +263 -173
  162. data/lib/mongoid/encryptable.rb +53 -0
  163. data/lib/mongoid/equality.rb +22 -25
  164. data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
  165. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  166. data/lib/mongoid/errors/callback.rb +1 -3
  167. data/lib/mongoid/errors/create_collection_failure.rb +34 -0
  168. data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
  169. data/lib/mongoid/errors/delete_restriction.rb +9 -12
  170. data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
  171. data/lib/mongoid/errors/document_not_found.rb +34 -21
  172. data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
  173. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  174. data/lib/mongoid/errors/immutable_attribute.rb +27 -0
  175. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
  176. data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
  177. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  178. data/lib/mongoid/errors/invalid_collection.rb +1 -1
  179. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  180. data/lib/mongoid/errors/invalid_config_option.rb +2 -4
  181. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
  182. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
  183. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
  184. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
  185. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
  186. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  187. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
  188. data/lib/mongoid/errors/invalid_field.rb +7 -7
  189. data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
  190. data/lib/mongoid/errors/invalid_field_option.rb +1 -3
  191. data/lib/mongoid/errors/invalid_field_type.rb +27 -0
  192. data/lib/mongoid/errors/invalid_find.rb +1 -3
  193. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
  194. data/lib/mongoid/errors/invalid_includes.rb +1 -3
  195. data/lib/mongoid/errors/invalid_index.rb +1 -3
  196. data/lib/mongoid/errors/invalid_options.rb +1 -3
  197. data/lib/mongoid/errors/invalid_path.rb +1 -3
  198. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
  199. data/lib/mongoid/errors/invalid_query.rb +1 -1
  200. data/lib/mongoid/errors/invalid_relation.rb +2 -8
  201. data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
  202. data/lib/mongoid/errors/invalid_scope.rb +1 -3
  203. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  204. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
  205. data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
  206. data/lib/mongoid/errors/invalid_time.rb +1 -3
  207. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  208. data/lib/mongoid/errors/inverse_not_found.rb +1 -3
  209. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
  210. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  211. data/lib/mongoid/errors/mongoid_error.rb +8 -16
  212. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
  213. data/lib/mongoid/errors/no_client_config.rb +1 -3
  214. data/lib/mongoid/errors/no_client_database.rb +2 -4
  215. data/lib/mongoid/errors/no_client_hosts.rb +2 -4
  216. data/lib/mongoid/errors/no_clients_config.rb +1 -3
  217. data/lib/mongoid/errors/no_default_client.rb +1 -3
  218. data/lib/mongoid/errors/no_environment.rb +1 -3
  219. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
  220. data/lib/mongoid/errors/no_metadata.rb +1 -3
  221. data/lib/mongoid/errors/no_parent.rb +1 -3
  222. data/lib/mongoid/errors/readonly_attribute.rb +2 -4
  223. data/lib/mongoid/errors/readonly_document.rb +2 -6
  224. data/lib/mongoid/errors/rollback.rb +15 -0
  225. data/lib/mongoid/errors/scope_overwrite.rb +1 -1
  226. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  227. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
  228. data/lib/mongoid/errors/transaction_error.rb +25 -0
  229. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  230. data/lib/mongoid/errors/unknown_attribute.rb +2 -4
  231. data/lib/mongoid/errors/unknown_model.rb +1 -3
  232. data/lib/mongoid/errors/unsaved_document.rb +2 -2
  233. data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
  234. data/lib/mongoid/errors/validations.rb +1 -1
  235. data/lib/mongoid/errors.rb +18 -5
  236. data/lib/mongoid/evolvable.rb +2 -4
  237. data/lib/mongoid/extensions/array.rb +20 -58
  238. data/lib/mongoid/extensions/big_decimal.rb +44 -24
  239. data/lib/mongoid/extensions/binary.rb +45 -0
  240. data/lib/mongoid/extensions/boolean.rb +11 -6
  241. data/lib/mongoid/extensions/date.rb +31 -29
  242. data/lib/mongoid/extensions/date_time.rb +5 -16
  243. data/lib/mongoid/extensions/decimal128.rb +3 -5
  244. data/lib/mongoid/extensions/false_class.rb +8 -10
  245. data/lib/mongoid/extensions/float.rb +11 -12
  246. data/lib/mongoid/extensions/hash.rb +28 -148
  247. data/lib/mongoid/extensions/integer.rb +13 -14
  248. data/lib/mongoid/extensions/module.rb +5 -5
  249. data/lib/mongoid/extensions/nil_class.rb +5 -7
  250. data/lib/mongoid/extensions/object.rb +32 -81
  251. data/lib/mongoid/extensions/object_id.rb +3 -7
  252. data/lib/mongoid/extensions/range.rb +47 -24
  253. data/lib/mongoid/extensions/raw_value.rb +34 -0
  254. data/lib/mongoid/extensions/regexp.rb +14 -7
  255. data/lib/mongoid/extensions/set.rb +24 -13
  256. data/lib/mongoid/extensions/string.rb +30 -62
  257. data/lib/mongoid/extensions/symbol.rb +9 -22
  258. data/lib/mongoid/extensions/time.rb +30 -40
  259. data/lib/mongoid/extensions/time_with_zone.rb +18 -11
  260. data/lib/mongoid/extensions/true_class.rb +8 -10
  261. data/lib/mongoid/extensions.rb +3 -20
  262. data/lib/mongoid/factory.rb +178 -37
  263. data/lib/mongoid/fields/encrypted.rb +48 -0
  264. data/lib/mongoid/fields/foreign_key.rb +39 -27
  265. data/lib/mongoid/fields/localized.rb +25 -15
  266. data/lib/mongoid/fields/standard.rb +22 -40
  267. data/lib/mongoid/fields/validators/macro.rb +6 -19
  268. data/lib/mongoid/fields/validators.rb +1 -1
  269. data/lib/mongoid/fields.rb +354 -76
  270. data/lib/mongoid/findable.rb +62 -22
  271. data/lib/mongoid/indexable/specification.rb +55 -34
  272. data/lib/mongoid/indexable/validators/options.rb +7 -9
  273. data/lib/mongoid/indexable.rb +2 -18
  274. data/lib/mongoid/inspectable.rb +34 -11
  275. data/lib/mongoid/interceptable.rb +197 -41
  276. data/lib/mongoid/loadable.rb +83 -0
  277. data/lib/mongoid/loggable.rb +1 -9
  278. data/lib/mongoid/matchable.rb +2 -6
  279. data/lib/mongoid/matcher/all.rb +15 -0
  280. data/lib/mongoid/matcher/and.rb +14 -0
  281. data/lib/mongoid/matcher/bits.rb +60 -0
  282. data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
  283. data/lib/mongoid/matcher/bits_all_set.rb +41 -0
  284. data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
  285. data/lib/mongoid/matcher/bits_any_set.rb +41 -0
  286. data/lib/mongoid/matcher/elem_match.rb +17 -1
  287. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  288. data/lib/mongoid/matcher/eq.rb +15 -0
  289. data/lib/mongoid/matcher/eq_impl.rb +54 -2
  290. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
  291. data/lib/mongoid/matcher/exists.rb +15 -0
  292. data/lib/mongoid/matcher/expression.rb +22 -14
  293. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  294. data/lib/mongoid/matcher/field_expression.rb +19 -5
  295. data/lib/mongoid/matcher/field_operator.rb +30 -0
  296. data/lib/mongoid/matcher/gt.rb +15 -0
  297. data/lib/mongoid/matcher/gte.rb +15 -0
  298. data/lib/mongoid/matcher/in.rb +15 -0
  299. data/lib/mongoid/matcher/lt.rb +15 -0
  300. data/lib/mongoid/matcher/lte.rb +15 -0
  301. data/lib/mongoid/matcher/mod.rb +33 -0
  302. data/lib/mongoid/matcher/ne.rb +15 -0
  303. data/lib/mongoid/matcher/nin.rb +15 -0
  304. data/lib/mongoid/matcher/nor.rb +14 -0
  305. data/lib/mongoid/matcher/not.rb +16 -0
  306. data/lib/mongoid/matcher/or.rb +14 -0
  307. data/lib/mongoid/matcher/regex.rb +24 -0
  308. data/lib/mongoid/matcher/size.rb +16 -0
  309. data/lib/mongoid/matcher/type.rb +124 -0
  310. data/lib/mongoid/matcher.rb +59 -52
  311. data/lib/mongoid/persistable/creatable.rb +25 -29
  312. data/lib/mongoid/persistable/deletable.rb +10 -23
  313. data/lib/mongoid/persistable/destroyable.rb +37 -11
  314. data/lib/mongoid/persistable/incrementable.rb +2 -6
  315. data/lib/mongoid/persistable/logical.rb +1 -5
  316. data/lib/mongoid/persistable/maxable.rb +37 -0
  317. data/lib/mongoid/persistable/minable.rb +37 -0
  318. data/lib/mongoid/persistable/multipliable.rb +36 -0
  319. data/lib/mongoid/persistable/poppable.rb +1 -5
  320. data/lib/mongoid/persistable/pullable.rb +1 -7
  321. data/lib/mongoid/persistable/pushable.rb +1 -7
  322. data/lib/mongoid/persistable/renamable.rb +1 -5
  323. data/lib/mongoid/persistable/savable.rb +14 -8
  324. data/lib/mongoid/persistable/settable.rb +1 -5
  325. data/lib/mongoid/persistable/unsettable.rb +3 -7
  326. data/lib/mongoid/persistable/updatable.rb +114 -28
  327. data/lib/mongoid/persistable/upsertable.rb +33 -8
  328. data/lib/mongoid/persistable.rb +17 -27
  329. data/lib/mongoid/persistence_context.rb +111 -43
  330. data/lib/mongoid/positional.rb +1 -5
  331. data/lib/mongoid/railtie.rb +23 -15
  332. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  333. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  334. data/lib/mongoid/railties/controller_runtime.rb +21 -6
  335. data/lib/mongoid/railties/database.rake +19 -2
  336. data/lib/mongoid/reloadable.rb +45 -42
  337. data/lib/mongoid/scopable.rb +25 -53
  338. data/lib/mongoid/search_indexable.rb +167 -0
  339. data/lib/mongoid/selectable.rb +6 -17
  340. data/lib/mongoid/serializable.rb +11 -21
  341. data/lib/mongoid/shardable.rb +50 -16
  342. data/lib/mongoid/stateful.rb +66 -22
  343. data/lib/mongoid/stringified_symbol.rb +19 -7
  344. data/lib/mongoid/tasks/database.rake +25 -0
  345. data/lib/mongoid/tasks/database.rb +84 -8
  346. data/lib/mongoid/tasks/encryption.rake +59 -0
  347. data/lib/mongoid/tasks/encryption.rb +108 -0
  348. data/lib/mongoid/threaded/lifecycle.rb +6 -26
  349. data/lib/mongoid/threaded.rb +131 -92
  350. data/lib/mongoid/timestamps/created/short.rb +1 -1
  351. data/lib/mongoid/timestamps/created.rb +4 -4
  352. data/lib/mongoid/timestamps/short.rb +1 -1
  353. data/lib/mongoid/timestamps/timeless.rb +29 -7
  354. data/lib/mongoid/timestamps/updated/short.rb +1 -1
  355. data/lib/mongoid/timestamps/updated.rb +3 -5
  356. data/lib/mongoid/timestamps.rb +1 -1
  357. data/lib/mongoid/touchable.rb +155 -29
  358. data/lib/mongoid/traversable.rb +180 -125
  359. data/lib/mongoid/utils.rb +52 -0
  360. data/lib/mongoid/validatable/associated.rb +97 -21
  361. data/lib/mongoid/validatable/format.rb +1 -1
  362. data/lib/mongoid/validatable/length.rb +1 -1
  363. data/lib/mongoid/validatable/localizable.rb +2 -4
  364. data/lib/mongoid/validatable/macros.rb +10 -14
  365. data/lib/mongoid/validatable/presence.rb +7 -13
  366. data/lib/mongoid/validatable/queryable.rb +9 -3
  367. data/lib/mongoid/validatable/uniqueness.rb +26 -39
  368. data/lib/mongoid/validatable.rb +20 -29
  369. data/lib/mongoid/version.rb +2 -2
  370. data/lib/mongoid/warnings.rb +37 -0
  371. data/lib/mongoid.rb +56 -22
  372. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  374. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
  375. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
  376. data/lib/rails/generators/mongoid_generator.rb +13 -1
  377. data/lib/rails/mongoid.rb +4 -32
  378. data/spec/config/mongoid.yml +16 -1
  379. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  380. data/spec/integration/active_job_spec.rb +32 -0
  381. data/spec/integration/app_spec.rb +180 -89
  382. data/spec/integration/associations/belongs_to_spec.rb +19 -1
  383. data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
  384. data/spec/integration/associations/embedded_spec.rb +90 -7
  385. data/spec/integration/associations/embeds_many_spec.rb +197 -1
  386. data/spec/integration/associations/embeds_one_spec.rb +19 -1
  387. data/spec/integration/associations/foreign_key_spec.rb +10 -1
  388. data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
  389. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
  390. data/spec/integration/associations/has_many_spec.rb +1 -1
  391. data/spec/integration/associations/has_one_spec.rb +145 -1
  392. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
  393. data/spec/integration/associations/reverse_population_spec.rb +1 -1
  394. data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
  395. data/spec/integration/associations/scope_option_spec.rb +102 -0
  396. data/spec/integration/atomic/modifiers_spec.rb +1 -1
  397. data/spec/integration/bson_regexp_raw_spec.rb +1 -1
  398. data/spec/integration/callbacks_models.rb +147 -3
  399. data/spec/integration/callbacks_spec.rb +398 -8
  400. data/spec/integration/contextual/empty_spec.rb +142 -0
  401. data/spec/integration/criteria/alias_query_spec.rb +98 -0
  402. data/spec/integration/criteria/date_field_spec.rb +2 -2
  403. data/spec/integration/criteria/default_scope_spec.rb +52 -0
  404. data/spec/integration/criteria/logical_spec.rb +12 -0
  405. data/spec/integration/criteria/range_spec.rb +358 -0
  406. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  407. data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
  408. data/spec/integration/discriminator_key_spec.rb +119 -81
  409. data/spec/integration/discriminator_value_spec.rb +1 -1
  410. data/spec/integration/document_spec.rb +31 -1
  411. data/spec/integration/dots_and_dollars_spec.rb +278 -0
  412. data/spec/integration/encryption_spec.rb +100 -0
  413. data/spec/integration/i18n_fallbacks_spec.rb +10 -52
  414. data/spec/integration/matcher_examples_spec.rb +21 -14
  415. data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
  416. data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
  417. data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
  418. data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
  419. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  420. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  421. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  422. data/spec/integration/matcher_operator_data/in.yml +16 -0
  423. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  424. data/spec/integration/matcher_operator_data/size.yml +0 -3
  425. data/spec/integration/matcher_operator_data/type.yml +64 -0
  426. data/spec/integration/matcher_operator_data/type_array.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  428. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  429. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  430. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  431. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  433. data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
  434. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  436. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  437. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  438. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  439. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  440. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  441. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  442. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  443. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  444. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  445. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  446. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  447. data/spec/integration/matcher_operator_spec.rb +26 -3
  448. data/spec/integration/matcher_spec.rb +50 -1
  449. data/spec/integration/persistence/range_field_spec.rb +351 -0
  450. data/spec/integration/server_query_spec.rb +1 -1
  451. data/spec/integration/shardable_spec.rb +1 -1
  452. data/spec/integration/stringified_symbol_field_spec.rb +17 -3
  453. data/spec/lite_spec_helper.rb +47 -14
  454. data/spec/mongoid/association/accessors_spec.rb +31 -19
  455. data/spec/mongoid/association/auto_save_spec.rb +73 -34
  456. data/spec/mongoid/association/builders_spec.rb +2 -2
  457. data/spec/mongoid/association/constrainable_spec.rb +1 -1
  458. data/spec/mongoid/association/counter_cache_spec.rb +34 -34
  459. data/spec/mongoid/association/depending_spec.rb +397 -358
  460. data/spec/mongoid/association/eager_spec.rb +56 -6
  461. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
  462. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
  463. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
  464. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
  465. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
  466. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
  467. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
  468. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
  469. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
  470. data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
  471. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
  472. data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
  473. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
  474. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
  475. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
  476. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
  477. data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
  478. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
  479. data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
  480. data/spec/mongoid/association/macros_spec.rb +10 -10
  481. data/spec/mongoid/association/nested/many_spec.rb +1 -1
  482. data/spec/mongoid/association/nested/one_spec.rb +17 -13
  483. data/spec/mongoid/association/options_spec.rb +1 -1
  484. data/spec/mongoid/association/polymorphic_spec.rb +1 -1
  485. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
  486. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
  487. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
  488. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
  489. data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
  490. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
  491. data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
  492. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
  493. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
  500. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
  501. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
  502. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
  503. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
  504. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
  505. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
  506. data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
  507. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
  508. data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
  509. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
  510. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
  511. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
  512. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
  513. data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
  514. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
  515. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
  516. data/spec/mongoid/association/reflections_spec.rb +1 -1
  517. data/spec/mongoid/association/syncable_spec.rb +47 -33
  518. data/spec/mongoid/association_spec.rb +1 -1
  519. data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
  520. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
  521. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
  522. data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
  523. data/spec/mongoid/atomic/paths_spec.rb +65 -27
  524. data/spec/mongoid/atomic_spec.rb +29 -7
  525. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  526. data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
  527. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +49 -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 +41 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +23 -23
  534. data/spec/mongoid/attributes_spec.rb +921 -69
  535. data/spec/mongoid/cacheable_spec.rb +5 -5
  536. data/spec/mongoid/changeable_spec.rb +468 -76
  537. data/spec/mongoid/clients/factory_spec.rb +152 -30
  538. data/spec/mongoid/clients/options_spec.rb +24 -12
  539. data/spec/mongoid/clients/sessions_spec.rb +49 -71
  540. data/spec/mongoid/clients/transactions_spec.rb +971 -176
  541. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  542. data/spec/mongoid/clients_spec.rb +230 -22
  543. data/spec/mongoid/collection_configurable_spec.rb +159 -0
  544. data/spec/mongoid/composable_spec.rb +1 -1
  545. data/spec/mongoid/config/defaults_spec.rb +99 -0
  546. data/spec/mongoid/config/encryption_spec.rb +152 -0
  547. data/spec/mongoid/config/environment_spec.rb +126 -39
  548. data/spec/mongoid/config/introspection_spec.rb +114 -0
  549. data/spec/mongoid/config/options_spec.rb +1 -1
  550. data/spec/mongoid/config_spec.rb +375 -43
  551. data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
  552. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  553. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
  554. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
  555. data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
  556. data/spec/mongoid/contextual/atomic_spec.rb +329 -87
  557. data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
  558. data/spec/mongoid/contextual/memory_spec.rb +1479 -127
  559. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
  560. data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
  561. data/spec/mongoid/contextual/none_spec.rb +79 -68
  562. data/spec/mongoid/copyable_spec.rb +465 -23
  563. data/spec/mongoid/copyable_spec_models.rb +1 -1
  564. data/spec/mongoid/criteria/findable_spec.rb +295 -229
  565. data/spec/mongoid/criteria/includable_spec.rb +1493 -0
  566. data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
  567. data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
  568. data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
  569. data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
  570. data/spec/mongoid/criteria/options_spec.rb +1 -1
  571. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
  572. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
  573. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
  574. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
  575. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
  576. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
  577. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
  578. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
  579. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
  580. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
  581. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
  582. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
  583. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
  584. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
  586. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
  587. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
  588. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
  589. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
  590. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
  591. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
  592. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
  593. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
  594. data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
  595. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
  596. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
  597. data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
  598. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
  599. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  600. data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
  601. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  602. data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
  603. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
  604. data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
  605. data/spec/mongoid/criteria/scopable_spec.rb +128 -1
  606. data/spec/mongoid/criteria/translator_spec.rb +133 -0
  607. data/spec/mongoid/criteria_projection_spec.rb +407 -0
  608. data/spec/mongoid/criteria_spec.rb +1029 -1806
  609. data/spec/mongoid/document_fields_spec.rb +180 -5
  610. data/spec/mongoid/document_persistence_context_spec.rb +77 -1
  611. data/spec/mongoid/document_query_spec.rb +55 -4
  612. data/spec/mongoid/document_spec.rb +43 -172
  613. data/spec/mongoid/equality_spec.rb +7 -8
  614. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
  615. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  616. data/spec/mongoid/errors/callback_spec.rb +1 -1
  617. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
  618. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
  619. data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
  620. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
  621. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
  622. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
  623. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
  624. data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
  625. data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
  626. data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
  627. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
  628. data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
  629. data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
  630. data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
  631. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
  632. data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
  633. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
  634. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
  635. data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
  636. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
  637. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
  638. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
  639. data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
  640. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
  641. data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
  642. data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
  643. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
  644. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
  645. data/spec/mongoid/errors/no_environment_spec.rb +4 -4
  646. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
  647. data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
  648. data/spec/mongoid/errors/no_parent_spec.rb +1 -1
  649. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
  650. data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
  651. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
  652. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
  653. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
  654. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
  655. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
  656. data/spec/mongoid/errors/validations_spec.rb +1 -1
  657. data/spec/mongoid/extensions/array_spec.rb +19 -265
  658. data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
  659. data/spec/mongoid/extensions/binary_spec.rb +45 -10
  660. data/spec/mongoid/extensions/boolean_spec.rb +69 -83
  661. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
  662. data/spec/mongoid/extensions/date_spec.rb +74 -22
  663. data/spec/mongoid/extensions/date_time_spec.rb +18 -19
  664. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  665. data/spec/mongoid/extensions/false_class_spec.rb +2 -9
  666. data/spec/mongoid/extensions/float_spec.rb +56 -84
  667. data/spec/mongoid/extensions/hash_spec.rb +45 -219
  668. data/spec/mongoid/extensions/integer_spec.rb +53 -73
  669. data/spec/mongoid/extensions/module_spec.rb +1 -1
  670. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  671. data/spec/mongoid/extensions/object_id_spec.rb +1 -1
  672. data/spec/mongoid/extensions/object_spec.rb +1 -177
  673. data/spec/mongoid/extensions/range_spec.rb +254 -64
  674. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  675. data/spec/mongoid/extensions/regexp_spec.rb +59 -34
  676. data/spec/mongoid/extensions/set_spec.rb +105 -1
  677. data/spec/mongoid/extensions/string_spec.rb +21 -104
  678. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
  679. data/spec/mongoid/extensions/symbol_spec.rb +15 -53
  680. data/spec/mongoid/extensions/time_spec.rb +345 -131
  681. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
  682. data/spec/mongoid/extensions/true_class_spec.rb +2 -9
  683. data/spec/mongoid/factory_spec.rb +63 -2
  684. data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
  685. data/spec/mongoid/fields/localized_spec.rb +85 -42
  686. data/spec/mongoid/fields/standard_spec.rb +1 -1
  687. data/spec/mongoid/fields_spec.rb +826 -121
  688. data/spec/mongoid/findable_spec.rb +442 -80
  689. data/spec/mongoid/indexable/specification_spec.rb +132 -14
  690. data/spec/mongoid/indexable_spec.rb +361 -23
  691. data/spec/mongoid/inspectable_spec.rb +93 -5
  692. data/spec/mongoid/interceptable_spec.rb +926 -116
  693. data/spec/mongoid/interceptable_spec_models.rb +236 -4
  694. data/spec/mongoid/loading_spec.rb +110 -0
  695. data/spec/mongoid/loggable_spec.rb +1 -1
  696. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  697. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  698. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
  699. data/spec/mongoid/mongoizable_spec.rb +286 -0
  700. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  701. data/spec/mongoid/persistable/creatable_spec.rb +5 -5
  702. data/spec/mongoid/persistable/deletable_spec.rb +267 -27
  703. data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
  704. data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
  705. data/spec/mongoid/persistable/logical_spec.rb +42 -5
  706. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  707. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  708. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  709. data/spec/mongoid/persistable/poppable_spec.rb +41 -5
  710. data/spec/mongoid/persistable/pullable_spec.rb +81 -9
  711. data/spec/mongoid/persistable/pushable_spec.rb +81 -9
  712. data/spec/mongoid/persistable/renamable_spec.rb +40 -4
  713. data/spec/mongoid/persistable/savable_spec.rb +114 -20
  714. data/spec/mongoid/persistable/settable_spec.rb +77 -10
  715. data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
  716. data/spec/mongoid/persistable/updatable_spec.rb +64 -52
  717. data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
  718. data/spec/mongoid/persistable_spec.rb +4 -4
  719. data/spec/mongoid/persistence_context_spec.rb +58 -59
  720. data/spec/mongoid/positional_spec.rb +1 -1
  721. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  722. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  723. data/spec/mongoid/relations/proxy_spec.rb +7 -7
  724. data/spec/mongoid/reloadable_spec.rb +255 -30
  725. data/spec/mongoid/scopable_spec.rb +198 -58
  726. data/spec/mongoid/search_indexable_spec.rb +147 -0
  727. data/spec/mongoid/selectable_spec.rb +7 -7
  728. data/spec/mongoid/serializable_spec.rb +19 -40
  729. data/spec/mongoid/shardable_models.rb +15 -0
  730. data/spec/mongoid/shardable_spec.rb +181 -31
  731. data/spec/mongoid/stateful_spec.rb +152 -10
  732. data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
  733. data/spec/mongoid/tasks/database_spec.rb +175 -2
  734. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  735. data/spec/mongoid/threaded_spec.rb +40 -3
  736. data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
  737. data/spec/mongoid/timestamps/created_spec.rb +2 -2
  738. data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
  739. data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
  740. data/spec/mongoid/timestamps/updated_spec.rb +4 -4
  741. data/spec/mongoid/timestamps_spec.rb +399 -11
  742. data/spec/mongoid/timestamps_spec_models.rb +68 -0
  743. data/spec/mongoid/touchable_spec.rb +971 -54
  744. data/spec/mongoid/touchable_spec_models.rb +154 -0
  745. data/spec/mongoid/traversable_spec.rb +79 -37
  746. data/spec/mongoid/validatable/associated_spec.rb +14 -31
  747. data/spec/mongoid/validatable/format_spec.rb +1 -1
  748. data/spec/mongoid/validatable/length_spec.rb +1 -1
  749. data/spec/mongoid/validatable/numericality_spec.rb +1 -1
  750. data/spec/mongoid/validatable/presence_spec.rb +27 -23
  751. data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
  752. data/spec/mongoid/validatable_spec.rb +4 -4
  753. data/spec/mongoid/warnings_spec.rb +36 -0
  754. data/spec/mongoid_spec.rb +61 -11
  755. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
  756. data/spec/rails/mongoid_spec.rb +28 -132
  757. data/spec/shared/bin/get-mongodb-download-url +17 -0
  758. data/spec/shared/bin/s3-copy +45 -0
  759. data/spec/shared/bin/s3-upload +69 -0
  760. data/spec/shared/lib/mrss/cluster_config.rb +24 -4
  761. data/spec/shared/lib/mrss/constraints.rb +77 -29
  762. data/spec/shared/lib/mrss/docker_runner.rb +40 -4
  763. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  764. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  765. data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
  766. data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
  767. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  768. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  769. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  770. data/spec/shared/lib/mrss/utils.rb +37 -0
  771. data/spec/shared/share/Dockerfile.erb +123 -71
  772. data/spec/shared/share/haproxy-1.conf +16 -0
  773. data/spec/shared/share/haproxy-2.conf +17 -0
  774. data/spec/shared/shlib/config.sh +27 -0
  775. data/spec/shared/shlib/distro.sh +2 -1
  776. data/spec/shared/shlib/server.sh +187 -40
  777. data/spec/shared/shlib/set_env.sh +49 -31
  778. data/spec/spec_helper.rb +46 -49
  779. data/spec/support/authorization.rb +1 -1
  780. data/spec/support/client_registry.rb +10 -0
  781. data/spec/support/constraints.rb +25 -1
  782. data/spec/support/crypt/models.rb +50 -0
  783. data/spec/support/crypt.rb +80 -0
  784. data/spec/support/expectations.rb +1 -1
  785. data/spec/support/feature_sandbox.rb +72 -0
  786. data/spec/support/helpers.rb +1 -0
  787. data/spec/support/immutable_ids.rb +119 -0
  788. data/spec/support/macros.rb +107 -1
  789. data/spec/support/models/account.rb +2 -2
  790. data/spec/support/models/acolyte.rb +1 -1
  791. data/spec/support/models/actor.rb +1 -1
  792. data/spec/support/models/actress.rb +1 -1
  793. data/spec/support/models/address.rb +7 -1
  794. data/spec/support/models/address_component.rb +1 -1
  795. data/spec/support/models/address_number.rb +1 -1
  796. data/spec/support/models/agency.rb +1 -1
  797. data/spec/support/models/agent.rb +1 -1
  798. data/spec/support/models/album.rb +1 -1
  799. data/spec/support/models/alert.rb +1 -1
  800. data/spec/support/models/animal.rb +1 -1
  801. data/spec/support/models/answer.rb +1 -1
  802. data/spec/support/models/appointment.rb +1 -1
  803. data/spec/support/models/armrest.rb +1 -1
  804. data/spec/support/models/array_field.rb +1 -1
  805. data/spec/support/models/article.rb +1 -1
  806. data/spec/support/models/artist.rb +3 -2
  807. data/spec/support/models/artwork.rb +1 -1
  808. data/spec/support/models/audible_sound.rb +4 -0
  809. data/spec/support/models/audio.rb +1 -1
  810. data/spec/support/models/augmentation.rb +13 -1
  811. data/spec/support/models/author.rb +1 -1
  812. data/spec/support/models/baby.rb +1 -1
  813. data/spec/support/models/band.rb +13 -1
  814. data/spec/support/models/bar.rb +1 -1
  815. data/spec/support/models/basic.rb +1 -1
  816. data/spec/support/models/bed.rb +1 -1
  817. data/spec/support/models/big_palette.rb +1 -1
  818. data/spec/support/models/birthday.rb +1 -1
  819. data/spec/support/models/bolt.rb +8 -0
  820. data/spec/support/models/bomb.rb +1 -1
  821. data/spec/support/models/book.rb +2 -1
  822. data/spec/support/models/breed.rb +1 -1
  823. data/spec/support/models/browser.rb +1 -1
  824. data/spec/support/models/building.rb +3 -1
  825. data/spec/support/models/building_address.rb +1 -1
  826. data/spec/support/models/bus.rb +1 -1
  827. data/spec/support/models/business.rb +1 -1
  828. data/spec/support/models/callback_test.rb +1 -1
  829. data/spec/support/models/canvas.rb +1 -1
  830. data/spec/support/models/car.rb +1 -1
  831. data/spec/support/models/cat.rb +1 -1
  832. data/spec/support/models/catalog.rb +25 -0
  833. data/spec/support/models/category.rb +1 -1
  834. data/spec/support/models/child.rb +1 -1
  835. data/spec/support/models/child_doc.rb +4 -4
  836. data/spec/support/models/church.rb +1 -1
  837. data/spec/support/models/circle.rb +1 -1
  838. data/spec/support/models/circuit.rb +1 -1
  839. data/spec/support/models/circus.rb +4 -1
  840. data/spec/support/models/code.rb +3 -1
  841. data/spec/support/models/coding/pull_request.rb +1 -1
  842. data/spec/support/models/coding.rb +1 -1
  843. data/spec/support/models/comment.rb +1 -1
  844. data/spec/support/models/company.rb +1 -1
  845. data/spec/support/models/consumption_period.rb +1 -1
  846. data/spec/support/models/contextable_item.rb +1 -1
  847. data/spec/support/models/contractor.rb +1 -1
  848. data/spec/support/models/cookie.rb +1 -1
  849. data/spec/support/models/country_code.rb +3 -1
  850. data/spec/support/models/courier_job.rb +1 -1
  851. data/spec/support/models/cover.rb +11 -0
  852. data/spec/support/models/crate.rb +1 -1
  853. data/spec/support/models/customer.rb +1 -1
  854. data/spec/support/models/customer_address.rb +1 -1
  855. data/spec/support/models/deed.rb +1 -1
  856. data/spec/support/models/definition.rb +1 -1
  857. data/spec/support/models/delegating_patient.rb +1 -1
  858. data/spec/support/models/description.rb +1 -1
  859. data/spec/support/models/dictionary.rb +1 -1
  860. data/spec/support/models/division.rb +1 -1
  861. data/spec/support/models/doctor.rb +1 -1
  862. data/spec/support/models/dog.rb +1 -1
  863. data/spec/support/models/dokument.rb +1 -1
  864. data/spec/support/models/draft.rb +1 -1
  865. data/spec/support/models/dragon.rb +1 -1
  866. data/spec/support/models/driver.rb +1 -1
  867. data/spec/support/models/drug.rb +1 -1
  868. data/spec/support/models/dungeon.rb +1 -1
  869. data/spec/support/models/edit.rb +1 -1
  870. data/spec/support/models/email.rb +1 -1
  871. data/spec/support/models/employer.rb +1 -1
  872. data/spec/support/models/entry.rb +1 -1
  873. data/spec/support/models/eraser.rb +1 -1
  874. data/spec/support/models/even.rb +1 -1
  875. data/spec/support/models/event.rb +1 -1
  876. data/spec/support/models/exhibition.rb +1 -1
  877. data/spec/support/models/exhibitor.rb +1 -1
  878. data/spec/support/models/explosion.rb +1 -1
  879. data/spec/support/models/eye.rb +1 -1
  880. data/spec/support/models/eye_bowl.rb +1 -1
  881. data/spec/support/models/face.rb +1 -1
  882. data/spec/support/models/fanatic.rb +9 -0
  883. data/spec/support/models/favorite.rb +8 -2
  884. data/spec/support/models/filesystem.rb +1 -1
  885. data/spec/support/models/fire_hydrant.rb +1 -1
  886. data/spec/support/models/firefox.rb +1 -1
  887. data/spec/support/models/fish.rb +1 -1
  888. data/spec/support/models/folder.rb +1 -1
  889. data/spec/support/models/folder_item.rb +1 -1
  890. data/spec/support/models/fruits.rb +1 -1
  891. data/spec/support/models/game.rb +1 -1
  892. data/spec/support/models/ghost.rb +1 -1
  893. data/spec/support/models/guitar.rb +1 -1
  894. data/spec/support/models/hole.rb +13 -0
  895. data/spec/support/models/home.rb +1 -1
  896. data/spec/support/models/house.rb +1 -1
  897. data/spec/support/models/html_writer.rb +1 -1
  898. data/spec/support/models/id_key.rb +1 -1
  899. data/spec/support/models/idnodef.rb +1 -1
  900. data/spec/support/models/image.rb +1 -1
  901. data/spec/support/models/implant.rb +10 -1
  902. data/spec/support/models/instrument.rb +1 -1
  903. data/spec/support/models/item.rb +1 -1
  904. data/spec/support/models/jar.rb +1 -1
  905. data/spec/support/models/kaleidoscope.rb +1 -1
  906. data/spec/support/models/kangaroo.rb +1 -1
  907. data/spec/support/models/label.rb +5 -2
  908. data/spec/support/models/language.rb +1 -1
  909. data/spec/support/models/lat_lng.rb +1 -1
  910. data/spec/support/models/league.rb +1 -1
  911. data/spec/support/models/learner.rb +1 -1
  912. data/spec/support/models/line_item.rb +1 -1
  913. data/spec/support/models/location.rb +1 -1
  914. data/spec/support/models/login.rb +1 -1
  915. data/spec/support/models/manufacturer.rb +1 -1
  916. data/spec/support/models/meat.rb +1 -1
  917. data/spec/support/models/membership.rb +2 -1
  918. data/spec/support/models/message.rb +1 -1
  919. data/spec/support/models/minim.rb +1 -1
  920. data/spec/support/models/mixed_drink.rb +1 -1
  921. data/spec/support/models/mop.rb +10 -1
  922. data/spec/support/models/movie.rb +1 -1
  923. data/spec/support/models/my_hash.rb +1 -1
  924. data/spec/support/models/name.rb +11 -1
  925. data/spec/support/models/name_only.rb +1 -1
  926. data/spec/support/models/node.rb +1 -1
  927. data/spec/support/models/note.rb +1 -1
  928. data/spec/support/models/nut.rb +8 -0
  929. data/spec/support/models/odd.rb +1 -1
  930. data/spec/support/models/order.rb +3 -1
  931. data/spec/support/models/ordered_post.rb +2 -2
  932. data/spec/support/models/ordered_preference.rb +1 -1
  933. data/spec/support/models/oscar.rb +1 -1
  934. data/spec/support/models/other_owner_object.rb +1 -1
  935. data/spec/support/models/override.rb +1 -1
  936. data/spec/support/models/ownable.rb +1 -1
  937. data/spec/support/models/owner.rb +1 -1
  938. data/spec/support/models/pack.rb +1 -1
  939. data/spec/support/models/page.rb +1 -1
  940. data/spec/support/models/page_question.rb +1 -1
  941. data/spec/support/models/palette.rb +1 -1
  942. data/spec/support/models/parent.rb +1 -1
  943. data/spec/support/models/parent_doc.rb +1 -1
  944. data/spec/support/models/passport.rb +15 -1
  945. data/spec/support/models/patient.rb +1 -1
  946. data/spec/support/models/pdf_writer.rb +1 -1
  947. data/spec/support/models/pencil.rb +1 -1
  948. data/spec/support/models/person.rb +19 -1
  949. data/spec/support/models/pet.rb +1 -1
  950. data/spec/support/models/pet_owner.rb +1 -1
  951. data/spec/support/models/phone.rb +3 -2
  952. data/spec/support/models/piano.rb +1 -1
  953. data/spec/support/models/pizza.rb +1 -1
  954. data/spec/support/models/player.rb +3 -1
  955. data/spec/support/models/post.rb +1 -1
  956. data/spec/support/models/post_genre.rb +1 -1
  957. data/spec/support/models/powerup.rb +13 -1
  958. data/spec/support/models/preference.rb +1 -1
  959. data/spec/support/models/princess.rb +1 -1
  960. data/spec/support/models/product.rb +2 -1
  961. data/spec/support/models/profile.rb +1 -1
  962. data/spec/support/models/pronunciation.rb +1 -1
  963. data/spec/support/models/pub.rb +1 -1
  964. data/spec/support/models/publication/encyclopedia.rb +1 -1
  965. data/spec/support/models/publication/review.rb +1 -1
  966. data/spec/support/models/publication.rb +1 -1
  967. data/spec/support/models/purchase.rb +1 -1
  968. data/spec/support/models/purchased_item.rb +11 -0
  969. data/spec/support/models/purse.rb +9 -0
  970. data/spec/support/models/question.rb +1 -1
  971. data/spec/support/models/quiz.rb +1 -1
  972. data/spec/support/models/rating.rb +1 -1
  973. data/spec/support/models/record.rb +1 -1
  974. data/spec/support/models/registry.rb +2 -1
  975. data/spec/support/models/role.rb +1 -1
  976. data/spec/support/models/root_category.rb +1 -1
  977. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  978. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  979. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  980. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  981. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  982. data/spec/support/models/sandwich.rb +1 -1
  983. data/spec/support/models/scheduler.rb +1 -1
  984. data/spec/support/models/school.rb +15 -0
  985. data/spec/support/models/scribe.rb +1 -1
  986. data/spec/support/models/sealer.rb +8 -0
  987. data/spec/support/models/seat.rb +1 -1
  988. data/spec/support/models/seo.rb +1 -1
  989. data/spec/support/models/series.rb +1 -1
  990. data/spec/support/models/server.rb +1 -1
  991. data/spec/support/models/service.rb +1 -1
  992. data/spec/support/models/shape.rb +1 -1
  993. data/spec/support/models/shelf.rb +1 -1
  994. data/spec/support/models/shield.rb +19 -0
  995. data/spec/support/models/shipment_address.rb +1 -1
  996. data/spec/support/models/shipping_container.rb +1 -1
  997. data/spec/support/models/shipping_pack.rb +1 -1
  998. data/spec/support/models/shirt.rb +12 -0
  999. data/spec/support/models/shop.rb +1 -1
  1000. data/spec/support/models/short_agent.rb +1 -1
  1001. data/spec/support/models/short_quiz.rb +1 -1
  1002. data/spec/support/models/simple.rb +1 -1
  1003. data/spec/support/models/slave.rb +1 -1
  1004. data/spec/support/models/song.rb +1 -1
  1005. data/spec/support/models/sound.rb +1 -1
  1006. data/spec/support/models/spacer.rb +8 -0
  1007. data/spec/support/models/square.rb +1 -1
  1008. data/spec/support/models/staff.rb +1 -1
  1009. data/spec/support/models/store_as_dup_test1.rb +1 -1
  1010. data/spec/support/models/store_as_dup_test2.rb +1 -1
  1011. data/spec/support/models/store_as_dup_test3.rb +1 -1
  1012. data/spec/support/models/store_as_dup_test4.rb +1 -1
  1013. data/spec/support/models/strategy.rb +1 -1
  1014. data/spec/support/models/student.rb +15 -0
  1015. data/spec/support/models/sub_item.rb +1 -1
  1016. data/spec/support/models/subscription.rb +1 -1
  1017. data/spec/support/models/survey.rb +1 -1
  1018. data/spec/support/models/symptom.rb +1 -1
  1019. data/spec/support/models/system_role.rb +1 -0
  1020. data/spec/support/models/tag.rb +1 -1
  1021. data/spec/support/models/target.rb +1 -1
  1022. data/spec/support/models/template.rb +1 -1
  1023. data/spec/support/models/thing.rb +1 -1
  1024. data/spec/support/models/threadlocker.rb +8 -0
  1025. data/spec/support/models/title.rb +1 -1
  1026. data/spec/support/models/tool.rb +1 -1
  1027. data/spec/support/models/topping.rb +1 -1
  1028. data/spec/support/models/toy.rb +1 -1
  1029. data/spec/support/models/track.rb +1 -1
  1030. data/spec/support/models/translation.rb +1 -1
  1031. data/spec/support/models/tree.rb +1 -1
  1032. data/spec/support/models/truck.rb +1 -1
  1033. data/spec/support/models/updatable.rb +1 -1
  1034. data/spec/support/models/user.rb +1 -1
  1035. data/spec/support/models/user_account.rb +1 -1
  1036. data/spec/support/models/validation_callback.rb +1 -1
  1037. data/spec/support/models/vehicle.rb +1 -1
  1038. data/spec/support/models/version.rb +1 -1
  1039. data/spec/support/models/vertex.rb +1 -1
  1040. data/spec/support/models/vet_visit.rb +1 -1
  1041. data/spec/support/models/video.rb +1 -1
  1042. data/spec/support/models/video_game.rb +1 -1
  1043. data/spec/support/models/washer.rb +8 -0
  1044. data/spec/support/models/weapon.rb +13 -1
  1045. data/spec/support/models/wiki_page.rb +1 -1
  1046. data/spec/support/models/word.rb +1 -1
  1047. data/spec/support/models/word_origin.rb +1 -1
  1048. data/spec/support/models/writer.rb +1 -1
  1049. data/spec/support/rails_mock.rb +32 -0
  1050. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1051. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1052. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1053. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1054. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1055. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1056. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1057. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1058. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1059. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1060. data/spec/support/shared/time.rb +3 -22
  1061. data/spec/support/sinatra_mock.rb +7 -0
  1062. data/spec/support/spec_config.rb +42 -7
  1063. data.tar.gz.sig +0 -0
  1064. metadata +883 -562
  1065. metadata.gz.sig +0 -0
  1066. data/lib/mongoid/association/referenced/eager.rb +0 -184
  1067. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
  1068. data/lib/mongoid/contextual/geo_near.rb +0 -269
  1069. data/lib/mongoid/errors/eager_load.rb +0 -26
  1070. data/lib/mongoid/errors/invalid_session_use.rb +0 -26
  1071. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
  1072. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1073. data/lib/mongoid/query_cache.rb +0 -333
  1074. data/lib/support/ruby_version.rb +0 -29
  1075. data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
  1076. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1077. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1078. data/spec/mongoid/extensions_spec.rb +0 -32
  1079. data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
  1080. data/spec/mongoid/query_cache_spec.rb +0 -978
  1081. data/spec/support/cluster_config.rb +0 -158
  1082. data/spec/support/session_registry.rb +0 -50
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  require "spec_helper"
5
+ require_relative './touchable_spec_models'
5
6
 
6
7
  describe Mongoid::Touchable do
7
8
 
@@ -9,7 +10,7 @@ describe Mongoid::Touchable do
9
10
 
10
11
  context "when the document has no associations" do
11
12
  let(:updatable) do
12
- Updatable.create
13
+ Updatable.create!
13
14
  end
14
15
 
15
16
  it "responds to #touch" do
@@ -26,46 +27,155 @@ describe Mongoid::Touchable do
26
27
  updatable.touch
27
28
  expect(updatable.updated_at).to be > updated_at
28
29
  end
30
+
31
+ it 'does not leave model in changed state' do
32
+ updatable.touch
33
+ expect(updatable).not_to be_changed
34
+ end
29
35
  end
30
36
 
31
- context "when the document is embedded" do
37
+ context 'when the document has a parent association' do
32
38
 
33
- before do
34
- Label.send(:include, Mongoid::Touchable::InstanceMethods)
39
+ let(:building) do
40
+ parent_cls.create!
35
41
  end
36
42
 
37
- let(:band) do
38
- Band.create(name: "Placebo")
43
+ let(:entrance) do
44
+ building.entrances.create!
39
45
  end
40
46
 
41
- let(:label) do
42
- band.create_label(name: "Mute", updated_at: 10.days.ago)
47
+ let(:floor) do
48
+ building.floors.create!
43
49
  end
44
50
 
45
- before do
46
- label.touch
51
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
52
+
53
+ let(:update_time) do
54
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
47
55
  end
48
56
 
49
- it "updates the updated_at timestamp" do
50
- expect(label.updated_at).to be_within(1).of(Time.now)
57
+ after do
58
+ Timecop.return
51
59
  end
52
60
 
53
- it "persists the changes" do
54
- expect(label.reload.updated_at).to be_within(1).of(Time.now)
61
+ shared_examples 'updates the child' do
62
+ it "updates the updated_at timestamp" do
63
+ entrance
64
+ update_time
65
+ entrance.touch
66
+
67
+ expect(entrance.updated_at).to eq(update_time)
68
+ end
69
+
70
+ it "persists the changes" do
71
+ entrance
72
+ update_time
73
+ entrance.touch
74
+
75
+ expect(entrance.reload.updated_at).to eq(update_time)
76
+ end
55
77
  end
56
- end
57
78
 
58
- context "when no relations have touch options" do
79
+ shared_examples 'updates the parent when :touch is true' do
59
80
 
60
- before do
61
- Person.send(:include, Mongoid::Touchable::InstanceMethods)
62
- Agent.send(:include, Mongoid::Touchable::InstanceMethods)
81
+ it 'updates updated_at on parent' do
82
+ floor
83
+ update_time
84
+ floor.touch
85
+
86
+ expect(building.updated_at).to eq(update_time)
87
+ end
88
+
89
+ it 'persists updated updated_at on parent' do
90
+ floor
91
+ update_time
92
+ floor.touch
93
+
94
+ expect(building.reload.updated_at).to eq(update_time)
95
+ end
96
+ end
97
+
98
+ shared_examples 'does not update the parent when :touch is false' do
99
+ it 'does not update updated_at on parent' do
100
+ entrance
101
+ update_time
102
+ entrance.touch
103
+
104
+ expect(building.updated_at).to eq(start_time)
105
+ end
106
+
107
+ it 'does not persist updated updated_at on parent' do
108
+ entrance
109
+ update_time
110
+ entrance.touch
111
+
112
+ expect(building.reload.updated_at).to eq(start_time)
113
+ end
114
+ end
115
+
116
+ shared_examples 'does not update the parent when :touch is not set' do
117
+ it_behaves_like 'does not update the parent when :touch is false'
118
+ end
119
+
120
+ context "when the document is embedded" do
121
+ let(:parent_cls) { TouchableSpec::Embedded::Building }
122
+
123
+ include_examples 'updates the child'
124
+ include_examples 'updates the parent when :touch is true'
125
+ include_examples 'does not update the parent when :touch is not set'
126
+
127
+ context 'when also updating an additional field when :touch is true' do
128
+ it 'persists the update to the additional field' do
129
+ entrance
130
+ update_time
131
+ entrance.touch(:last_used_at)
132
+
133
+ entrance.reload
134
+ building.reload
135
+
136
+ # This is the assertion we want.
137
+ expect(entrance.last_used_at).to eq(update_time)
138
+
139
+ # Check other timestamps for good measure.
140
+ expect(entrance.updated_at).to eq(update_time)
141
+ expect(building.updated_at).to eq(start_time)
142
+ end
143
+ end
144
+
145
+ context 'when also updating an additional field when :touch is not set' do
146
+ it 'persists the update to the additional field' do
147
+ floor
148
+ update_time
149
+ floor.touch(:last_used_at)
150
+
151
+ floor.reload
152
+ building.reload
153
+
154
+ # This is the assertion we want.
155
+ expect(floor.last_used_at).to eq(update_time)
156
+
157
+ # Check other timestamps for good measure.
158
+ expect(floor.updated_at).to eq(update_time)
159
+ expect(building.updated_at).to eq(update_time)
160
+ end
161
+ end
63
162
  end
64
163
 
164
+ context "when the document is referenced" do
165
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
166
+
167
+ include_examples 'updates the child'
168
+ include_examples 'updates the parent when :touch is true'
169
+ include_examples 'does not update the parent when :touch is false'
170
+ end
171
+ end
172
+
173
+ context "when no relations have touch options" do
174
+
65
175
  context "when no updated at is defined" do
66
176
 
67
177
  let(:person) do
68
- Person.create
178
+ Person.create!
69
179
  end
70
180
 
71
181
  context "when no attribute is provided" do
@@ -125,7 +235,7 @@ describe Mongoid::Touchable do
125
235
  context "when an updated at is defined" do
126
236
 
127
237
  let!(:agent) do
128
- Agent.create(updated_at: 2.days.ago)
238
+ Agent.create!(updated_at: 2.days.ago)
129
239
  end
130
240
 
131
241
  context "when no attribute is provided" do
@@ -146,8 +256,8 @@ describe Mongoid::Touchable do
146
256
  expect(touched).to be true
147
257
  end
148
258
 
149
- it "keeps changes for next callback" do
150
- expect(agent.changes).to_not be_empty
259
+ it "clears changes" do
260
+ expect(agent.changes).to be_empty
151
261
  end
152
262
  end
153
263
 
@@ -181,8 +291,8 @@ describe Mongoid::Touchable do
181
291
  expect(touched).to be true
182
292
  end
183
293
 
184
- it "keeps changes for next callback" do
185
- expect(agent.changes).to_not be_empty
294
+ it "clears changes" do
295
+ expect(agent.changes).to be_empty
186
296
  end
187
297
  end
188
298
  end
@@ -225,11 +335,7 @@ describe Mongoid::Touchable do
225
335
  end
226
336
 
227
337
  let(:frozen_error_cls) do
228
- if RUBY_VERSION >= '2.5'
229
- FrozenError
230
- else
231
- RuntimeError
232
- end
338
+ FrozenError
233
339
  end
234
340
 
235
341
  context "when no attribute is provided" do
@@ -285,17 +391,12 @@ describe Mongoid::Touchable do
285
391
 
286
392
  context "when the relation is a parent of an embedded doc" do
287
393
 
288
- before do
289
- Page.send(:include, Mongoid::Touchable::InstanceMethods)
290
- Edit.send(:include, Mongoid::Touchable::InstanceMethods)
291
- end
292
-
293
394
  let(:page) do
294
- WikiPage.create(title: "test")
395
+ WikiPage.create!(title: "test")
295
396
  end
296
397
 
297
398
  let!(:edit) do
298
- page.edits.create
399
+ page.edits.create!
299
400
  end
300
401
 
301
402
  before do
@@ -310,17 +411,13 @@ describe Mongoid::Touchable do
310
411
 
311
412
  context "when the parent of embedded doc has cascade callbacks" do
312
413
 
313
- before do
314
- Band.send(:include, Mongoid::Touchable::InstanceMethods)
315
- end
316
-
317
414
  let!(:book) do
318
415
  Book.new
319
416
  end
320
417
 
321
418
  before do
322
419
  book.pages.new
323
- book.save
420
+ book.save!
324
421
  book.unset(:updated_at)
325
422
  book.pages.first.touch
326
423
  end
@@ -338,7 +435,7 @@ describe Mongoid::Touchable do
338
435
 
339
436
  before do
340
437
  2.times { book.pages.new }
341
- book.save
438
+ book.save!
342
439
  book.unset(:updated_at)
343
440
  book.pages.first.content = "foo"
344
441
  book.pages.second.content = "bar"
@@ -353,7 +450,7 @@ describe Mongoid::Touchable do
353
450
  context "when the relation is nil" do
354
451
 
355
452
  let!(:agent) do
356
- Agent.create
453
+ Agent.create!
357
454
  end
358
455
 
359
456
  context "when the relation autobuilds" do
@@ -371,7 +468,7 @@ describe Mongoid::Touchable do
371
468
  context "when the relation is not nil" do
372
469
 
373
470
  let!(:agent) do
374
- Agent.create
471
+ Agent.create!
375
472
  end
376
473
 
377
474
  let!(:agency) do
@@ -396,7 +493,7 @@ describe Mongoid::Touchable do
396
493
  context "when creating the child" do
397
494
 
398
495
  let!(:agency) do
399
- Agency.create
496
+ Agency.create!
400
497
  end
401
498
 
402
499
  let!(:updated) do
@@ -404,7 +501,7 @@ describe Mongoid::Touchable do
404
501
  end
405
502
 
406
503
  let!(:agent) do
407
- agency.agents.create
504
+ agency.agents.create!
408
505
  end
409
506
 
410
507
  it "updates the parent's updated at" do
@@ -415,16 +512,16 @@ describe Mongoid::Touchable do
415
512
  context "when modifying the child" do
416
513
 
417
514
  let!(:agency) do
418
- Agency.create
515
+ Agency.create!
419
516
  end
420
517
 
421
518
  let!(:agent) do
422
- agency.agents.create(number: '1')
519
+ agency.agents.create!(number: '1')
423
520
  end
424
521
 
425
522
  it "updates the parent's updated at" do
426
523
  expect {
427
- agent.update_attributes(number: '2')
524
+ agent.update_attributes!(number: '2')
428
525
  }.to change { agency.updated_at }
429
526
  end
430
527
  end
@@ -432,11 +529,11 @@ describe Mongoid::Touchable do
432
529
  context "when destroying the child" do
433
530
 
434
531
  let!(:agency) do
435
- Agency.create
532
+ Agency.create!
436
533
  end
437
534
 
438
535
  let!(:agent) do
439
- agency.agents.create
536
+ agency.agents.create!
440
537
  end
441
538
 
442
539
  let!(:updated) do
@@ -456,7 +553,7 @@ describe Mongoid::Touchable do
456
553
  context "when other document attributes have been changed" do
457
554
 
458
555
  let(:band) do
459
- Band.create(name: "Placebo")
556
+ Band.create!(name: "Placebo")
460
557
  end
461
558
 
462
559
  context "when an attribute is provided" do
@@ -483,5 +580,825 @@ describe Mongoid::Touchable do
483
580
  end
484
581
  end
485
582
  end
583
+
584
+ context "when the touch option is true" do
585
+
586
+ shared_examples "updates the parent's updated_at" do
587
+
588
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
589
+
590
+ let(:update_time) do
591
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
592
+ end
593
+
594
+ after do
595
+ Timecop.return
596
+ end
597
+
598
+ let(:building) do
599
+ parent_cls.create!
600
+ end
601
+
602
+ let(:floor) do
603
+ building.floors.create!
604
+ end
605
+
606
+ before do
607
+ floor
608
+ update_time
609
+ floor.level = 9
610
+ floor.send(meth)
611
+ end
612
+
613
+ it "the parent is not nil" do
614
+ expect(floor.building).to_not be nil
615
+ end
616
+
617
+ it "updates the parent's timestamp" do
618
+ expect(building.updated_at).to eq(update_time)
619
+ expect(building.reload.updated_at).to eq(update_time)
620
+ end
621
+ end
622
+
623
+ shared_examples "updates the child's updated_at" do
624
+
625
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
626
+
627
+ let(:update_time) do
628
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
629
+ end
630
+
631
+ after do
632
+ Timecop.return
633
+ end
634
+
635
+ let(:building) do
636
+ parent_cls.create!
637
+ end
638
+
639
+ let(:floor) do
640
+ building.floors.create!
641
+ end
642
+
643
+ before do
644
+ floor
645
+ update_time
646
+ floor.level = 9
647
+ floor.send(meth)
648
+ end
649
+
650
+ it "the parent is not nil" do
651
+ expect(floor.building).to_not be nil
652
+ end
653
+
654
+ it "updates the child's timestamp" do
655
+ floor.updated_at.should == update_time
656
+ floor.reload.updated_at.should == update_time
657
+ end
658
+ end
659
+
660
+ [ :save!, :destroy, :touch].each do |meth|
661
+ context "with #{meth} on referenced associations" do
662
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
663
+ let(:meth) { meth }
664
+
665
+ include_examples "updates the child's updated_at" unless meth == :destroy
666
+ include_examples "updates the parent's updated_at"
667
+ end
668
+
669
+ context "with #{meth} on embedded associations" do
670
+ let(:parent_cls) { TouchableSpec::Embedded::Building }
671
+ let(:meth) { meth }
672
+
673
+ include_examples "updates the child's updated_at" unless meth == :destroy
674
+ include_examples "updates the parent's updated_at"
675
+ end
676
+ end
677
+ end
678
+
679
+ context "when the touch option is false" do
680
+
681
+ shared_examples "does not update the parent" do
682
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
683
+ let(:update_time) { Timecop.freeze(Time.at(Time.now.to_i) + 2) }
684
+
685
+ after do
686
+ Timecop.return
687
+ end
688
+
689
+ let(:building) do
690
+ parent_cls.create!
691
+ end
692
+
693
+ let(:entrance) do
694
+ building.entrances.create!
695
+ end
696
+
697
+ before do
698
+ entrance
699
+ update_time
700
+ entrance.level = 1
701
+ entrance.send(meth)
702
+ end
703
+
704
+ it "updates the child's timestamp" do
705
+ if entrance.destroyed?
706
+ expect(entrance.updated_at).to eq(start_time)
707
+ else
708
+ expect(entrance.updated_at).to eq(update_time)
709
+ expect(entrance.reload.updated_at).to eq(update_time)
710
+ end
711
+ end
712
+
713
+ it "does not update the parent's timestamp" do
714
+ expect(building.updated_at).to eq(start_time)
715
+ expect(building.reload.updated_at).to eq(start_time)
716
+ end
717
+ end
718
+
719
+ [ :save!, :destroy, :touch].each do |meth|
720
+ context "with #{meth} on belongs_to" do
721
+ let(:meth) { meth }
722
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
723
+
724
+ include_examples "does not update the parent"
725
+ end
726
+
727
+ context "with #{meth} on embedded_in" do
728
+ let(:meth) { meth }
729
+ let(:parent_cls) { TouchableSpec::Embedded::Building }
730
+
731
+ include_examples "does not update the parent"
732
+ end
733
+ end
734
+ end
735
+
736
+ context 'multi-level' do
737
+
738
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
739
+
740
+ let(:update_time) { Timecop.freeze(Time.at(Time.now.to_i) + 2) }
741
+
742
+ let(:child_name) do
743
+ child_cls.name.demodulize.underscore
744
+ end
745
+
746
+ let(:grandchild_name) do
747
+ grandchild_cls.name.demodulize.underscore
748
+ end
749
+
750
+ let(:parent) do
751
+ parent_cls.create!
752
+ end
753
+
754
+ let(:child) do
755
+ parent.send(child_name.pluralize).create!
756
+ end
757
+
758
+ let(:grandchild) do
759
+ grandchild = child.send(grandchild_name.pluralize).create!
760
+ grandchild.created_at = Time.now + 1.day # arbitrary change so save! works
761
+ grandchild
762
+ end
763
+
764
+ shared_examples "updates the parent" do
765
+ it "updates the parent's timestamp" do
766
+ expect(parent.updated_at).to eq(update_time)
767
+ expect(parent.reload.updated_at).to eq(update_time)
768
+ end
769
+ end
770
+
771
+ shared_examples "does not update the parent" do
772
+ it "does not update the parent's timestamp" do
773
+ expect(parent.updated_at).to eq(start_time)
774
+ expect(parent.reload.updated_at).to eq(start_time)
775
+ end
776
+ end
777
+
778
+ shared_examples "updates the child" do
779
+ it "updates the child's timestamp" do
780
+ expect(child.updated_at).to eq(update_time)
781
+ expect(child.reload.updated_at).to eq(update_time)
782
+ end
783
+ end
784
+
785
+ shared_examples "does not update the child" do
786
+ it "does not update the child's timestamp" do
787
+ expect(child.updated_at).to eq(start_time)
788
+ expect(child.reload.updated_at).to eq(start_time)
789
+ end
790
+ end
791
+
792
+ shared_examples "updates the grandchild" do
793
+ it "updates the grandchild's timestamp" do
794
+ if grandchild.destroyed?
795
+ expect(grandchild.updated_at).to eq(start_time)
796
+ else
797
+ expect(grandchild.updated_at).to eq(update_time)
798
+ expect(grandchild.reload.updated_at).to eq(update_time)
799
+ end
800
+ end
801
+ end
802
+
803
+ shared_examples "does not update the grandchild" do
804
+ it "does not update the grandchild's timestamp" do
805
+ expect(grandchild.updated_at).to eq(start_time)
806
+ expect(grandchild.reload.updated_at).to eq(start_time) unless grandchild.destroyed?
807
+ end
808
+ end
809
+
810
+ before do
811
+ grandchild
812
+ update_time
813
+ grandchild.send(meth)
814
+ end
815
+
816
+ after do
817
+ Timecop.return
818
+ end
819
+
820
+ context 'parent > embedded child > embedded grandchild' do
821
+
822
+ let(:parent_cls) { TouchableSpec::Embedded::Building }
823
+
824
+ context 'child touch: true' do
825
+
826
+ let(:child_cls) do
827
+ TouchableSpec::Embedded::Floor
828
+ end
829
+
830
+ context 'grandchild touch: true' do
831
+
832
+ let(:grandchild_cls) do
833
+ TouchableSpec::Embedded::Sofa
834
+ end
835
+
836
+ [ :save!, :destroy, :touch ].each do |meth|
837
+ context "when calling #{meth} method" do
838
+ let(:meth) { meth }
839
+
840
+ it_behaves_like "updates the parent"
841
+ it_behaves_like "updates the child"
842
+ it_behaves_like "updates the grandchild"
843
+ end
844
+ end
845
+ end
846
+
847
+ context 'grandchild touch: false' do
848
+
849
+ let(:grandchild_cls) do
850
+ TouchableSpec::Embedded::Chair
851
+ end
852
+
853
+ [ :save!, :destroy, :touch ].each do |meth|
854
+ context "when calling #{meth} method" do
855
+ let(:meth) { meth }
856
+
857
+ it_behaves_like "does not update the parent"
858
+ it_behaves_like "does not update the child"
859
+ it_behaves_like "updates the grandchild"
860
+ end
861
+ end
862
+ end
863
+ end
864
+
865
+ context 'child touch: false' do
866
+
867
+ let(:child_cls) do
868
+ TouchableSpec::Embedded::Entrance
869
+ end
870
+
871
+ context 'grandchild touch: true' do
872
+
873
+ let(:grandchild_cls) do
874
+ TouchableSpec::Embedded::Camera
875
+ end
876
+
877
+ [ :save!, :destroy, :touch ].each do |meth|
878
+ context "when calling #{meth} method" do
879
+ let(:meth) { meth }
880
+
881
+ it_behaves_like "does not update the parent"
882
+ it_behaves_like "updates the child"
883
+ it_behaves_like "updates the grandchild"
884
+ end
885
+ end
886
+ end
887
+
888
+ context 'grandchild touch: false' do
889
+
890
+ let(:grandchild_cls) do
891
+ TouchableSpec::Embedded::Keypad
892
+ end
893
+
894
+ [ :save!, :destroy, :touch ].each do |meth|
895
+ context "when calling #{meth} method" do
896
+ let(:meth) { meth }
897
+
898
+ it_behaves_like "does not update the parent"
899
+ it_behaves_like "does not update the child"
900
+ it_behaves_like "updates the grandchild"
901
+ end
902
+ end
903
+ end
904
+ end
905
+ end
906
+
907
+ context 'parent > referenced child > embedded grandchild' do
908
+
909
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
910
+
911
+ context 'child touch: true' do
912
+
913
+ let(:child_cls) do
914
+ TouchableSpec::Referenced::Floor
915
+ end
916
+
917
+ context 'grandchild touch: true' do
918
+
919
+ let(:grandchild_cls) do
920
+ TouchableSpec::Referenced::Sofa
921
+ end
922
+
923
+ [ :save!, :destroy, :touch ].each do |meth|
924
+ context "when calling #{meth} method" do
925
+ let(:meth) { meth }
926
+
927
+ it_behaves_like "updates the parent"
928
+ it_behaves_like "updates the child"
929
+ it_behaves_like "updates the grandchild"
930
+ end
931
+ end
932
+ end
933
+
934
+ context 'grandchild touch: false' do
935
+
936
+ let(:grandchild_cls) do
937
+ TouchableSpec::Referenced::Chair
938
+ end
939
+
940
+ [ :save!, :destroy, :touch ].each do |meth|
941
+ context "when calling #{meth} method" do
942
+ let(:meth) { meth }
943
+
944
+ it_behaves_like "does not update the parent"
945
+ it_behaves_like "does not update the child"
946
+ it_behaves_like "updates the grandchild"
947
+ end
948
+ end
949
+ end
950
+ end
951
+
952
+ context 'child touch: false' do
953
+
954
+ let(:child_cls) do
955
+ TouchableSpec::Referenced::Entrance
956
+ end
957
+
958
+ context 'grandchild touch: true' do
959
+
960
+ let(:grandchild_cls) do
961
+ TouchableSpec::Referenced::Camera
962
+ end
963
+
964
+ [ :save!, :destroy, :touch ].each do |meth|
965
+ context "when calling #{meth} method" do
966
+ let(:meth) { meth }
967
+
968
+ it_behaves_like "does not update the parent"
969
+ it_behaves_like "updates the child"
970
+ it_behaves_like "updates the grandchild"
971
+ end
972
+ end
973
+ end
974
+
975
+ context 'grandchild touch: false' do
976
+
977
+ let(:grandchild_cls) do
978
+ TouchableSpec::Referenced::Keypad
979
+ end
980
+
981
+ [ :save!, :destroy, :touch ].each do |meth|
982
+ context "when calling #{meth} method" do
983
+ let(:meth) { meth }
984
+
985
+ it_behaves_like "does not update the parent"
986
+ it_behaves_like "does not update the child"
987
+ it_behaves_like "updates the grandchild"
988
+ end
989
+ end
990
+ end
991
+ end
992
+ end
993
+
994
+ context 'parent > referenced child > referenced grandchild' do
995
+
996
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
997
+
998
+ context 'child touch: true' do
999
+
1000
+ let(:child_cls) do
1001
+ TouchableSpec::Referenced::Floor
1002
+ end
1003
+
1004
+ context 'grandchild touch: true' do
1005
+
1006
+ let(:grandchild_cls) do
1007
+ TouchableSpec::Referenced::Window
1008
+ end
1009
+
1010
+ [ :save!, :destroy, :touch ].each do |meth|
1011
+ context "when calling #{meth} method" do
1012
+ let(:meth) { meth }
1013
+
1014
+ it_behaves_like "updates the parent"
1015
+ it_behaves_like "updates the child"
1016
+ it_behaves_like "updates the grandchild"
1017
+ end
1018
+ end
1019
+ end
1020
+
1021
+ context 'grandchild touch: false' do
1022
+
1023
+ let(:grandchild_cls) do
1024
+ TouchableSpec::Referenced::Plant
1025
+ end
1026
+
1027
+ [ :save!, :destroy, :touch ].each do |meth|
1028
+ context "when calling #{meth} method" do
1029
+ let(:meth) { meth }
1030
+
1031
+ it_behaves_like "does not update the parent"
1032
+ it_behaves_like "does not update the child"
1033
+ it_behaves_like "updates the grandchild"
1034
+ end
1035
+ end
1036
+ end
1037
+ end
1038
+
1039
+ context 'child touch: false' do
1040
+
1041
+ let(:child_cls) do
1042
+ TouchableSpec::Referenced::Entrance
1043
+ end
1044
+
1045
+ context 'grandchild touch: true' do
1046
+
1047
+ let(:grandchild_cls) do
1048
+ TouchableSpec::Referenced::Window
1049
+ end
1050
+
1051
+ [ :save!, :destroy, :touch ].each do |meth|
1052
+ context "when calling #{meth} method" do
1053
+ let(:meth) { meth }
1054
+
1055
+ it_behaves_like "does not update the parent"
1056
+ it_behaves_like "updates the child"
1057
+ it_behaves_like "updates the grandchild"
1058
+ end
1059
+ end
1060
+ end
1061
+
1062
+ context 'grandchild touch: false' do
1063
+
1064
+ let(:grandchild_cls) do
1065
+ TouchableSpec::Referenced::Plant
1066
+ end
1067
+
1068
+ [ :save!, :destroy, :touch ].each do |meth|
1069
+ context "when calling #{meth} method" do
1070
+ let(:meth) { meth }
1071
+
1072
+ it_behaves_like "does not update the parent"
1073
+ it_behaves_like "does not update the child"
1074
+ it_behaves_like "updates the grandchild"
1075
+ end
1076
+ end
1077
+ end
1078
+ end
1079
+ end
1080
+ end
1081
+ end
1082
+
1083
+ describe "when saving a document" do
1084
+
1085
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
1086
+
1087
+ let(:update_time) do
1088
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
1089
+ end
1090
+
1091
+ after do
1092
+ Timecop.return
1093
+ end
1094
+
1095
+ context "when only using the root document" do
1096
+
1097
+ shared_examples "timeless is cleared" do
1098
+ it "clears the timeless option" do
1099
+ expect(doc.timeless?).to be false
1100
+ end
1101
+ end
1102
+
1103
+ shared_examples "touches the document" do
1104
+ it "touches the document" do
1105
+ expect(doc.created_at).to eq(start_time)
1106
+ expect(doc.updated_at).to eq(start_time)
1107
+ end
1108
+ end
1109
+
1110
+ shared_examples "updates the document" do
1111
+ it "updates the document" do
1112
+ expect(doc.created_at).to eq(start_time)
1113
+ expect(doc.updated_at).to eq(update_time)
1114
+ end
1115
+ end
1116
+
1117
+ let(:doc) { Dokument.new }
1118
+
1119
+ context "when saving a new document" do
1120
+
1121
+ context "when not passing a touch option" do
1122
+
1123
+ before do
1124
+ doc.save!
1125
+ end
1126
+
1127
+ include_examples "touches the document"
1128
+ include_examples "timeless is cleared"
1129
+ end
1130
+
1131
+ context "when passing touch: true" do
1132
+
1133
+ before do
1134
+ doc.save!(touch: true)
1135
+ end
1136
+
1137
+ include_examples "touches the document"
1138
+ include_examples "timeless is cleared"
1139
+ end
1140
+
1141
+ context "when passing touch: false" do
1142
+
1143
+ before do
1144
+ doc.save!(touch: false)
1145
+ end
1146
+
1147
+ include_examples "touches the document"
1148
+ include_examples "timeless is cleared"
1149
+ end
1150
+ end
1151
+
1152
+ context "when updating a document" do
1153
+ before do
1154
+ doc.save!
1155
+ doc.title = "title"
1156
+ update_time
1157
+ end
1158
+
1159
+ context "when not passing a touch option" do
1160
+
1161
+ before do
1162
+ doc.save!
1163
+ end
1164
+
1165
+ include_examples "updates the document"
1166
+ include_examples "timeless is cleared"
1167
+ end
1168
+
1169
+ context "when passing touch: true" do
1170
+
1171
+ before do
1172
+ doc.save!(touch: true)
1173
+ end
1174
+
1175
+ include_examples "updates the document"
1176
+ include_examples "timeless is cleared"
1177
+ end
1178
+
1179
+ context "when passing touch: false" do
1180
+
1181
+ before do
1182
+ doc.save!(touch: false)
1183
+ end
1184
+
1185
+ include_examples "touches the document"
1186
+ include_examples "timeless is cleared"
1187
+ end
1188
+ end
1189
+ end
1190
+
1191
+ context "when saving embedded associations with cascading callbacks" do
1192
+
1193
+ shared_examples "timeless is cleared" do
1194
+ it "clears the timeless option" do
1195
+ expect(book.timeless?).to be false
1196
+ expect(book.covers.first.timeless?).to be false
1197
+ end
1198
+ end
1199
+
1200
+ shared_examples "touches the document" do
1201
+ it "touches the document" do
1202
+ expect(book.created_at).to eq(start_time)
1203
+ expect(book.updated_at).to eq(start_time)
1204
+ end
1205
+ end
1206
+
1207
+ shared_examples "updates the document" do
1208
+ it "updates the document" do
1209
+ expect(book.created_at).to eq(start_time)
1210
+ expect(book.updated_at).to eq(update_time)
1211
+ end
1212
+ end
1213
+
1214
+ shared_examples "touches the children" do
1215
+ it "touches the children" do
1216
+ expect(book.covers.first.created_at).to eq(start_time)
1217
+ expect(book.covers.first.updated_at).to eq(start_time)
1218
+ end
1219
+ end
1220
+
1221
+ shared_examples "updates the children" do
1222
+ it "updates the children" do
1223
+ expect(book.covers.first.created_at).to eq(start_time)
1224
+ expect(book.covers.first.updated_at).to eq(update_time)
1225
+ end
1226
+ end
1227
+
1228
+ let(:book) do
1229
+ Book.new(covers: [ cover ])
1230
+ end
1231
+
1232
+ let(:cover) do
1233
+ Cover.new
1234
+ end
1235
+
1236
+ context "when saving a new document" do
1237
+
1238
+ context "when not passing a touch option" do
1239
+
1240
+ before do
1241
+ book.save!
1242
+ end
1243
+
1244
+ include_examples "touches the document"
1245
+ include_examples "touches the children"
1246
+ include_examples "timeless is cleared"
1247
+ end
1248
+
1249
+ context "when passing touch: true" do
1250
+
1251
+ before do
1252
+ book.save!(touch: true)
1253
+ end
1254
+
1255
+ include_examples "touches the document"
1256
+ include_examples "touches the children"
1257
+ include_examples "timeless is cleared"
1258
+ end
1259
+
1260
+ context "when passing touch: false" do
1261
+
1262
+ before do
1263
+ book.save!(touch: false)
1264
+ end
1265
+
1266
+ include_examples "touches the document"
1267
+ include_examples "touches the children"
1268
+ include_examples "timeless is cleared"
1269
+ end
1270
+ end
1271
+
1272
+ context "when updating a document" do
1273
+ before do
1274
+ book.save!
1275
+ book.title = "title"
1276
+ book.covers.first.title = "title"
1277
+ update_time
1278
+ end
1279
+
1280
+ context "when not passing a touch option" do
1281
+
1282
+ before do
1283
+ book.save!
1284
+ end
1285
+
1286
+ include_examples "updates the document"
1287
+ include_examples "updates the children"
1288
+ include_examples "timeless is cleared"
1289
+ end
1290
+
1291
+ context "when passing touch: true" do
1292
+
1293
+ before do
1294
+ book.save!(touch: true)
1295
+ end
1296
+
1297
+ include_examples "updates the document"
1298
+ include_examples "updates the children"
1299
+ include_examples "timeless is cleared"
1300
+ end
1301
+
1302
+ context "when passing touch: false" do
1303
+
1304
+ before do
1305
+ book.save!(touch: false)
1306
+ end
1307
+
1308
+ include_examples "touches the document"
1309
+ include_examples "touches the children"
1310
+ include_examples "timeless is cleared"
1311
+ end
1312
+ end
1313
+ end
1314
+ end
1315
+
1316
+ context 'when updated after touch' do
1317
+ let(:touch_time) { Timecop.freeze(Time.at(Time.now.to_i) + 2) }
1318
+
1319
+ let(:update_time) { Timecop.freeze(Time.at(Time.now.to_i) + 4) }
1320
+
1321
+ let!(:book) { Book.create! }
1322
+
1323
+ after do
1324
+ Timecop.return
1325
+ end
1326
+
1327
+ it 'updates updated_at' do
1328
+ touch_time
1329
+ book.touch
1330
+ update_time
1331
+ book.title = 'This book has no name'
1332
+ book.save!
1333
+ expect(book.updated_at).to eq(update_time)
1334
+ end
1335
+ end
1336
+
1337
+ context 'callbacks' do
1338
+ class TouchableParent
1339
+ include Mongoid::Document
1340
+ include Mongoid::Timestamps
1341
+
1342
+ attr_reader :before_touch_called, :after_touch_called
1343
+
1344
+ set_callback(:touch, :before) do
1345
+ @before_touch_called = true
1346
+ end
1347
+
1348
+ set_callback(:touch, :after) do
1349
+ @after_touch_called = true
1350
+ end
1351
+
1352
+ embeds_one :child, inverse_of: :parent, class_name: 'TouchableChild'
1353
+ end
1354
+
1355
+ class TouchableChild
1356
+ include Mongoid::Document
1357
+ include Mongoid::Timestamps
1358
+
1359
+ attr_reader :before_touch_called, :after_touch_called
1360
+
1361
+ set_callback(:touch, :before) do
1362
+ @before_touch_called = true
1363
+ end
1364
+
1365
+ set_callback(:touch, :after) do
1366
+ @after_touch_called = true
1367
+ end
1368
+
1369
+ embedded_in :parent, inverse_of: :child, class_name: 'TouchableParent', touch: true
1370
+ end
1371
+
1372
+ let(:parent) do
1373
+ TouchableParent.create!.tap do |parent|
1374
+ parent.child = TouchableChild.create!(parent: parent)
1375
+ end
1376
+ end
1377
+
1378
+ let(:child) do
1379
+ parent.child
1380
+ end
1381
+
1382
+ it 'calls touch callbacks on parent' do
1383
+ parent.touch
1384
+ expect(parent.before_touch_called).to eq(true)
1385
+ expect(parent.after_touch_called).to eq(true)
1386
+ end
1387
+
1388
+ context 'when touch is calles on a child' do
1389
+ before do
1390
+ child.touch
1391
+ end
1392
+
1393
+ it 'calls touch callbacks on parent' do
1394
+ expect(parent.before_touch_called).to eq(true)
1395
+ expect(parent.after_touch_called).to eq(true)
1396
+ end
1397
+
1398
+ it 'calls touch callbacks on child' do
1399
+ expect(child.before_touch_called).to eq(true)
1400
+ expect(child.after_touch_called).to eq(true)
1401
+ end
1402
+ end
486
1403
  end
487
1404
  end