mongoid 8.1.5 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1015) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE +1 -1
  4. data/README.md +4 -9
  5. data/Rakefile +42 -26
  6. data/lib/config/locales/en.yml +66 -5
  7. data/lib/mongoid/association/accessors.rb +16 -16
  8. data/lib/mongoid/association/bindable.rb +27 -8
  9. data/lib/mongoid/association/builders.rb +3 -2
  10. data/lib/mongoid/association/constrainable.rb +1 -0
  11. data/lib/mongoid/association/depending.rb +16 -1
  12. data/lib/mongoid/association/eager.rb +160 -0
  13. data/lib/mongoid/association/eager_loadable.rb +15 -4
  14. data/lib/mongoid/association/embedded/batchable.rb +6 -7
  15. data/lib/mongoid/association/embedded/cyclic.rb +1 -0
  16. data/lib/mongoid/association/embedded/eager.rb +23 -0
  17. data/lib/mongoid/association/embedded/embedded_in/binding.rb +5 -4
  18. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +1 -0
  19. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +21 -7
  20. data/lib/mongoid/association/embedded/embedded_in.rb +7 -0
  21. data/lib/mongoid/association/embedded/embeds_many/binding.rb +3 -2
  22. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -0
  23. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +134 -144
  24. data/lib/mongoid/association/embedded/embeds_many.rb +1 -0
  25. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -2
  26. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -0
  27. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +112 -54
  28. data/lib/mongoid/association/embedded/embeds_one.rb +1 -0
  29. data/lib/mongoid/association/embedded.rb +2 -0
  30. data/lib/mongoid/association/macros.rb +17 -14
  31. data/lib/mongoid/association/many.rb +1 -0
  32. data/lib/mongoid/association/marshalable.rb +4 -0
  33. data/lib/mongoid/association/nested/many.rb +8 -3
  34. data/lib/mongoid/association/nested/nested_buildable.rb +32 -0
  35. data/lib/mongoid/association/nested/one.rb +6 -3
  36. data/lib/mongoid/association/nested.rb +1 -0
  37. data/lib/mongoid/association/one.rb +1 -0
  38. data/lib/mongoid/association/options.rb +9 -2
  39. data/lib/mongoid/association/proxy.rb +30 -18
  40. data/lib/mongoid/association/referenced/auto_save.rb +6 -2
  41. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  42. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -0
  43. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -1
  44. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -14
  45. data/lib/mongoid/association/referenced/belongs_to.rb +2 -1
  46. data/lib/mongoid/association/referenced/counter_cache.rb +7 -2
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +132 -94
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +8 -3
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +39 -6
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +131 -104
  57. data/lib/mongoid/association/referenced/has_many.rb +2 -1
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -3
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +37 -28
  62. data/lib/mongoid/association/referenced/has_one.rb +5 -1
  63. data/lib/mongoid/association/referenced/syncable.rb +7 -6
  64. data/lib/mongoid/association/referenced.rb +1 -0
  65. data/lib/mongoid/association/reflections.rb +5 -4
  66. data/lib/mongoid/association/relatable.rb +10 -4
  67. data/lib/mongoid/association.rb +5 -0
  68. data/lib/mongoid/atomic/modifiers.rb +1 -0
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +2 -1
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -0
  71. data/lib/mongoid/atomic/paths/embedded.rb +1 -0
  72. data/lib/mongoid/atomic/paths/root.rb +1 -0
  73. data/lib/mongoid/atomic/paths.rb +1 -0
  74. data/lib/mongoid/atomic.rb +23 -62
  75. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  76. data/lib/mongoid/attributes/dynamic.rb +1 -0
  77. data/lib/mongoid/attributes/embedded.rb +34 -0
  78. data/lib/mongoid/attributes/nested.rb +3 -2
  79. data/lib/mongoid/attributes/processing.rb +11 -10
  80. data/lib/mongoid/attributes/projector.rb +1 -0
  81. data/lib/mongoid/attributes/readonly.rb +1 -0
  82. data/lib/mongoid/attributes.rb +6 -4
  83. data/lib/mongoid/cacheable.rb +2 -1
  84. data/lib/mongoid/changeable.rb +58 -49
  85. data/lib/mongoid/clients/factory.rb +37 -1
  86. data/lib/mongoid/clients/options.rb +113 -3
  87. data/lib/mongoid/clients/sessions.rb +245 -64
  88. data/lib/mongoid/clients/storage_options.rb +37 -1
  89. data/lib/mongoid/clients/validators/storage.rb +1 -0
  90. data/lib/mongoid/clients/validators.rb +1 -0
  91. data/lib/mongoid/clients.rb +36 -4
  92. data/lib/mongoid/collection_configurable.rb +1 -0
  93. data/lib/mongoid/composable.rb +5 -0
  94. data/lib/mongoid/config/defaults.rb +16 -36
  95. data/lib/mongoid/config/encryption.rb +213 -0
  96. data/lib/mongoid/config/environment.rb +2 -5
  97. data/lib/mongoid/config/introspection.rb +152 -0
  98. data/lib/mongoid/config/options.rb +8 -3
  99. data/lib/mongoid/config/validators/async_query_executor.rb +12 -2
  100. data/lib/mongoid/config/validators/client.rb +1 -0
  101. data/lib/mongoid/config/validators/option.rb +1 -0
  102. data/lib/mongoid/config/validators.rb +1 -0
  103. data/lib/mongoid/config.rb +57 -91
  104. data/lib/mongoid/contextual/aggregable/memory.rb +1 -0
  105. data/lib/mongoid/contextual/aggregable/mongo.rb +2 -5
  106. data/lib/mongoid/contextual/aggregable/none.rb +1 -0
  107. data/lib/mongoid/contextual/aggregable.rb +1 -0
  108. data/lib/mongoid/contextual/atomic.rb +98 -11
  109. data/lib/mongoid/contextual/command.rb +3 -0
  110. data/lib/mongoid/contextual/map_reduce.rb +6 -0
  111. data/lib/mongoid/contextual/memory.rb +45 -42
  112. data/lib/mongoid/contextual/mongo/documents_loader.rb +3 -2
  113. data/lib/mongoid/contextual/mongo.rb +32 -60
  114. data/lib/mongoid/contextual/none.rb +15 -32
  115. data/lib/mongoid/contextual/queryable.rb +4 -0
  116. data/lib/mongoid/contextual.rb +4 -0
  117. data/lib/mongoid/copyable.rb +3 -2
  118. data/lib/mongoid/criteria/findable.rb +44 -4
  119. data/lib/mongoid/criteria/includable.rb +5 -4
  120. data/lib/mongoid/criteria/inspectable.rb +4 -0
  121. data/lib/mongoid/criteria/marshalable.rb +4 -0
  122. data/lib/mongoid/criteria/modifiable.rb +5 -0
  123. data/lib/mongoid/criteria/options.rb +1 -0
  124. data/lib/mongoid/criteria/permission.rb +5 -0
  125. data/lib/mongoid/criteria/queryable/aggregable.rb +1 -0
  126. data/lib/mongoid/criteria/queryable/expandable.rb +1 -0
  127. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -1
  128. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
  129. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -1
  130. data/lib/mongoid/criteria/queryable/extensions/date.rb +4 -3
  131. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +2 -1
  132. data/lib/mongoid/criteria/queryable/extensions/hash.rb +2 -1
  133. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -1
  134. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +2 -1
  135. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -1
  136. data/lib/mongoid/criteria/queryable/extensions/range.rb +2 -1
  137. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +7 -1
  138. data/lib/mongoid/criteria/queryable/extensions/set.rb +2 -1
  139. data/lib/mongoid/criteria/queryable/extensions/string.rb +15 -3
  140. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +2 -1
  141. data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -1
  142. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -1
  143. data/lib/mongoid/criteria/queryable/extensions.rb +1 -0
  144. data/lib/mongoid/criteria/queryable/key.rb +10 -0
  145. data/lib/mongoid/criteria/queryable/macroable.rb +1 -0
  146. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -0
  147. data/lib/mongoid/criteria/queryable/optional.rb +1 -0
  148. data/lib/mongoid/criteria/queryable/options.rb +1 -0
  149. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -0
  150. data/lib/mongoid/criteria/queryable/selectable.rb +11 -26
  151. data/lib/mongoid/criteria/queryable/selector.rb +5 -2
  152. data/lib/mongoid/criteria/queryable/smash.rb +1 -0
  153. data/lib/mongoid/criteria/queryable/storable.rb +4 -3
  154. data/lib/mongoid/criteria/queryable.rb +1 -0
  155. data/lib/mongoid/criteria/scopable.rb +5 -0
  156. data/lib/mongoid/criteria/translator.rb +1 -0
  157. data/lib/mongoid/criteria.rb +37 -10
  158. data/lib/mongoid/deprecable.rb +1 -0
  159. data/lib/mongoid/deprecation.rb +8 -4
  160. data/lib/mongoid/document.rb +170 -117
  161. data/lib/mongoid/encryptable.rb +53 -0
  162. data/lib/mongoid/equality.rb +2 -21
  163. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -0
  164. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  165. data/lib/mongoid/errors/callback.rb +1 -0
  166. data/lib/mongoid/errors/create_collection_failure.rb +1 -0
  167. data/lib/mongoid/errors/criteria_argument_required.rb +1 -0
  168. data/lib/mongoid/errors/delete_restriction.rb +1 -0
  169. data/lib/mongoid/errors/document_not_destroyed.rb +1 -0
  170. data/lib/mongoid/errors/document_not_found.rb +1 -0
  171. data/lib/mongoid/errors/drop_collection_failure.rb +1 -0
  172. data/lib/mongoid/errors/empty_config_file.rb +1 -0
  173. data/lib/mongoid/errors/immutable_attribute.rb +1 -0
  174. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -0
  175. data/lib/mongoid/errors/invalid_async_query_executor.rb +1 -0
  176. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  177. data/lib/mongoid/errors/invalid_collection.rb +1 -0
  178. data/lib/mongoid/errors/invalid_config_file.rb +1 -0
  179. data/lib/mongoid/errors/invalid_config_option.rb +1 -0
  180. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -0
  181. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -0
  182. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -0
  183. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -0
  184. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -4
  185. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  186. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -0
  187. data/lib/mongoid/errors/invalid_field.rb +1 -0
  188. data/lib/mongoid/errors/invalid_field_operator.rb +1 -0
  189. data/lib/mongoid/errors/invalid_field_option.rb +1 -0
  190. data/lib/mongoid/errors/invalid_field_type.rb +1 -0
  191. data/lib/mongoid/errors/invalid_find.rb +1 -0
  192. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -0
  193. data/lib/mongoid/errors/invalid_includes.rb +1 -0
  194. data/lib/mongoid/errors/invalid_index.rb +1 -0
  195. data/lib/mongoid/errors/invalid_options.rb +1 -0
  196. data/lib/mongoid/errors/invalid_path.rb +1 -0
  197. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -0
  198. data/lib/mongoid/errors/invalid_query.rb +1 -0
  199. data/lib/mongoid/errors/invalid_relation.rb +1 -0
  200. data/lib/mongoid/errors/invalid_relation_option.rb +1 -0
  201. data/lib/mongoid/errors/invalid_scope.rb +1 -0
  202. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  203. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -1
  204. data/lib/mongoid/errors/invalid_storage_options.rb +1 -0
  205. data/lib/mongoid/errors/invalid_time.rb +1 -0
  206. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  207. data/lib/mongoid/errors/inverse_not_found.rb +1 -0
  208. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -0
  209. data/lib/mongoid/errors/mixed_relations.rb +1 -0
  210. data/lib/mongoid/errors/mongoid_error.rb +4 -3
  211. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -0
  212. data/lib/mongoid/errors/no_client_config.rb +1 -0
  213. data/lib/mongoid/errors/no_client_database.rb +1 -0
  214. data/lib/mongoid/errors/no_client_hosts.rb +1 -0
  215. data/lib/mongoid/errors/no_clients_config.rb +1 -0
  216. data/lib/mongoid/errors/no_default_client.rb +1 -0
  217. data/lib/mongoid/errors/no_environment.rb +1 -0
  218. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -0
  219. data/lib/mongoid/errors/no_metadata.rb +1 -0
  220. data/lib/mongoid/errors/no_parent.rb +1 -0
  221. data/lib/mongoid/errors/readonly_attribute.rb +1 -0
  222. data/lib/mongoid/errors/readonly_document.rb +1 -0
  223. data/lib/mongoid/errors/rollback.rb +15 -0
  224. data/lib/mongoid/errors/scope_overwrite.rb +1 -0
  225. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  226. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -0
  227. data/lib/mongoid/errors/transaction_error.rb +25 -0
  228. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  229. data/lib/mongoid/errors/unknown_attribute.rb +1 -0
  230. data/lib/mongoid/errors/unknown_model.rb +1 -0
  231. data/lib/mongoid/errors/unsaved_document.rb +1 -0
  232. data/lib/mongoid/errors/unsupported_javascript.rb +1 -0
  233. data/lib/mongoid/errors/validations.rb +1 -0
  234. data/lib/mongoid/errors.rb +10 -1
  235. data/lib/mongoid/evolvable.rb +1 -0
  236. data/lib/mongoid/extensions/array.rb +10 -24
  237. data/lib/mongoid/extensions/big_decimal.rb +14 -6
  238. data/lib/mongoid/extensions/binary.rb +3 -0
  239. data/lib/mongoid/extensions/boolean.rb +3 -0
  240. data/lib/mongoid/extensions/date.rb +7 -2
  241. data/lib/mongoid/extensions/date_time.rb +4 -6
  242. data/lib/mongoid/extensions/decimal128.rb +3 -0
  243. data/lib/mongoid/extensions/false_class.rb +5 -2
  244. data/lib/mongoid/extensions/float.rb +4 -1
  245. data/lib/mongoid/extensions/hash.rb +21 -143
  246. data/lib/mongoid/extensions/integer.rb +6 -1
  247. data/lib/mongoid/extensions/module.rb +4 -1
  248. data/lib/mongoid/extensions/nil_class.rb +5 -2
  249. data/lib/mongoid/extensions/object.rb +23 -35
  250. data/lib/mongoid/extensions/object_id.rb +3 -0
  251. data/lib/mongoid/extensions/range.rb +9 -6
  252. data/lib/mongoid/extensions/raw_value.rb +34 -0
  253. data/lib/mongoid/extensions/regexp.rb +3 -0
  254. data/lib/mongoid/extensions/set.rb +13 -2
  255. data/lib/mongoid/extensions/string.rb +18 -10
  256. data/lib/mongoid/extensions/symbol.rb +5 -0
  257. data/lib/mongoid/extensions/time.rb +7 -19
  258. data/lib/mongoid/extensions/time_with_zone.rb +6 -2
  259. data/lib/mongoid/extensions/true_class.rb +5 -2
  260. data/lib/mongoid/extensions.rb +2 -32
  261. data/lib/mongoid/factory.rb +134 -40
  262. data/lib/mongoid/fields/encrypted.rb +48 -0
  263. data/lib/mongoid/fields/foreign_key.rb +29 -3
  264. data/lib/mongoid/fields/localized.rb +6 -0
  265. data/lib/mongoid/fields/standard.rb +5 -0
  266. data/lib/mongoid/fields/validators/macro.rb +3 -1
  267. data/lib/mongoid/fields/validators.rb +1 -0
  268. data/lib/mongoid/fields.rb +35 -35
  269. data/lib/mongoid/findable.rb +2 -2
  270. data/lib/mongoid/indexable/specification.rb +55 -19
  271. data/lib/mongoid/indexable/validators/options.rb +1 -0
  272. data/lib/mongoid/indexable.rb +1 -0
  273. data/lib/mongoid/inspectable.rb +32 -0
  274. data/lib/mongoid/interceptable.rb +13 -2
  275. data/lib/mongoid/loadable.rb +83 -0
  276. data/lib/mongoid/loggable.rb +1 -0
  277. data/lib/mongoid/matchable.rb +1 -0
  278. data/lib/mongoid/matcher/all.rb +15 -0
  279. data/lib/mongoid/matcher/and.rb +14 -0
  280. data/lib/mongoid/matcher/bits.rb +19 -0
  281. data/lib/mongoid/matcher/bits_all_clear.rb +21 -0
  282. data/lib/mongoid/matcher/bits_all_set.rb +21 -0
  283. data/lib/mongoid/matcher/bits_any_clear.rb +21 -0
  284. data/lib/mongoid/matcher/bits_any_set.rb +21 -0
  285. data/lib/mongoid/matcher/elem_match.rb +15 -0
  286. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  287. data/lib/mongoid/matcher/eq.rb +15 -0
  288. data/lib/mongoid/matcher/eq_impl.rb +33 -16
  289. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +14 -2
  290. data/lib/mongoid/matcher/exists.rb +15 -0
  291. data/lib/mongoid/matcher/expression.rb +13 -0
  292. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  293. data/lib/mongoid/matcher/field_expression.rb +15 -0
  294. data/lib/mongoid/matcher/field_operator.rb +24 -0
  295. data/lib/mongoid/matcher/gt.rb +15 -0
  296. data/lib/mongoid/matcher/gte.rb +15 -0
  297. data/lib/mongoid/matcher/in.rb +15 -0
  298. data/lib/mongoid/matcher/lt.rb +15 -0
  299. data/lib/mongoid/matcher/lte.rb +15 -0
  300. data/lib/mongoid/matcher/mod.rb +16 -0
  301. data/lib/mongoid/matcher/ne.rb +15 -0
  302. data/lib/mongoid/matcher/nin.rb +15 -0
  303. data/lib/mongoid/matcher/nor.rb +14 -0
  304. data/lib/mongoid/matcher/not.rb +16 -0
  305. data/lib/mongoid/matcher/or.rb +14 -0
  306. data/lib/mongoid/matcher/regex.rb +24 -0
  307. data/lib/mongoid/matcher/size.rb +16 -0
  308. data/lib/mongoid/matcher/type.rb +25 -0
  309. data/lib/mongoid/matcher.rb +4 -0
  310. data/lib/mongoid/persistable/creatable.rb +14 -9
  311. data/lib/mongoid/persistable/deletable.rb +7 -2
  312. data/lib/mongoid/persistable/destroyable.rb +34 -7
  313. data/lib/mongoid/persistable/incrementable.rb +2 -1
  314. data/lib/mongoid/persistable/logical.rb +1 -0
  315. data/lib/mongoid/persistable/maxable.rb +37 -0
  316. data/lib/mongoid/persistable/minable.rb +37 -0
  317. data/lib/mongoid/persistable/multipliable.rb +36 -0
  318. data/lib/mongoid/persistable/poppable.rb +1 -0
  319. data/lib/mongoid/persistable/pullable.rb +1 -0
  320. data/lib/mongoid/persistable/pushable.rb +1 -0
  321. data/lib/mongoid/persistable/renamable.rb +1 -0
  322. data/lib/mongoid/persistable/savable.rb +1 -0
  323. data/lib/mongoid/persistable/settable.rb +1 -0
  324. data/lib/mongoid/persistable/unsettable.rb +1 -0
  325. data/lib/mongoid/persistable/updatable.rb +37 -18
  326. data/lib/mongoid/persistable/upsertable.rb +20 -7
  327. data/lib/mongoid/persistable.rb +11 -1
  328. data/lib/mongoid/persistence_context.rb +46 -6
  329. data/lib/mongoid/positional.rb +1 -0
  330. data/lib/mongoid/railtie.rb +24 -1
  331. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  332. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  333. data/lib/mongoid/railties/controller_runtime.rb +20 -4
  334. data/lib/mongoid/railties/database.rake +12 -0
  335. data/lib/mongoid/reloadable.rb +38 -30
  336. data/lib/mongoid/scopable.rb +19 -23
  337. data/lib/mongoid/search_indexable.rb +167 -0
  338. data/lib/mongoid/selectable.rb +1 -0
  339. data/lib/mongoid/serializable.rb +1 -0
  340. data/lib/mongoid/shardable.rb +1 -0
  341. data/lib/mongoid/stateful.rb +9 -3
  342. data/lib/mongoid/stringified_symbol.rb +19 -6
  343. data/lib/mongoid/tasks/database.rake +13 -0
  344. data/lib/mongoid/tasks/database.rb +63 -0
  345. data/lib/mongoid/tasks/encryption.rake +59 -0
  346. data/lib/mongoid/tasks/encryption.rb +108 -0
  347. data/lib/mongoid/threaded/lifecycle.rb +1 -0
  348. data/lib/mongoid/threaded.rb +94 -30
  349. data/lib/mongoid/timestamps/created/short.rb +1 -0
  350. data/lib/mongoid/timestamps/created.rb +4 -3
  351. data/lib/mongoid/timestamps/short.rb +1 -0
  352. data/lib/mongoid/timestamps/timeless.rb +29 -0
  353. data/lib/mongoid/timestamps/updated/short.rb +1 -0
  354. data/lib/mongoid/timestamps/updated.rb +2 -1
  355. data/lib/mongoid/timestamps.rb +1 -0
  356. data/lib/mongoid/touchable.rb +154 -49
  357. data/lib/mongoid/traversable.rb +128 -88
  358. data/lib/mongoid/utils.rb +32 -2
  359. data/lib/mongoid/validatable/associated.rb +1 -0
  360. data/lib/mongoid/validatable/format.rb +1 -0
  361. data/lib/mongoid/validatable/length.rb +1 -0
  362. data/lib/mongoid/validatable/localizable.rb +1 -0
  363. data/lib/mongoid/validatable/macros.rb +5 -0
  364. data/lib/mongoid/validatable/presence.rb +1 -0
  365. data/lib/mongoid/validatable/queryable.rb +9 -0
  366. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  367. data/lib/mongoid/validatable.rb +3 -2
  368. data/lib/mongoid/version.rb +2 -1
  369. data/lib/mongoid/warnings.rb +9 -16
  370. data/lib/mongoid.rb +38 -5
  371. data/lib/rails/generators/mongoid/config/config_generator.rb +17 -3
  372. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +36 -62
  374. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -0
  375. data/lib/rails/generators/mongoid_generator.rb +13 -0
  376. data/lib/rails/mongoid.rb +4 -29
  377. data/spec/config/mongoid.yml +0 -1
  378. data/spec/integration/active_job_spec.rb +32 -0
  379. data/spec/integration/app_spec.rb +69 -36
  380. data/spec/integration/associations/belongs_to_spec.rb +1 -0
  381. data/spec/integration/associations/embedded_dirty_spec.rb +1 -0
  382. data/spec/integration/associations/embedded_spec.rb +75 -6
  383. data/spec/integration/associations/embeds_many_spec.rb +1 -0
  384. data/spec/integration/associations/embeds_one_spec.rb +1 -0
  385. data/spec/integration/associations/foreign_key_spec.rb +1 -0
  386. data/spec/integration/associations/foreign_key_spec_models.rb +1 -0
  387. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +1 -0
  388. data/spec/integration/associations/has_many_spec.rb +1 -0
  389. data/spec/integration/associations/has_one_spec.rb +1 -0
  390. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -0
  391. data/spec/integration/associations/reverse_population_spec.rb +1 -0
  392. data/spec/integration/associations/reverse_population_spec_models.rb +1 -0
  393. data/spec/integration/associations/scope_option_spec.rb +1 -0
  394. data/spec/integration/atomic/modifiers_spec.rb +1 -0
  395. data/spec/integration/bson_regexp_raw_spec.rb +1 -0
  396. data/spec/integration/callbacks_models.rb +3 -2
  397. data/spec/integration/callbacks_spec.rb +2 -1
  398. data/spec/integration/contextual/empty_spec.rb +1 -0
  399. data/spec/integration/criteria/alias_query_spec.rb +25 -88
  400. data/spec/integration/criteria/date_field_spec.rb +1 -0
  401. data/spec/integration/criteria/default_scope_spec.rb +1 -0
  402. data/spec/integration/criteria/logical_spec.rb +10 -28
  403. data/spec/integration/criteria/range_spec.rb +1 -2
  404. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  405. data/spec/integration/criteria/time_with_zone_spec.rb +1 -0
  406. data/spec/integration/discriminator_key_spec.rb +1 -0
  407. data/spec/integration/discriminator_value_spec.rb +1 -0
  408. data/spec/integration/document_spec.rb +1 -0
  409. data/spec/integration/dots_and_dollars_spec.rb +1 -0
  410. data/spec/integration/encryption_spec.rb +100 -0
  411. data/spec/integration/i18n_fallbacks_spec.rb +7 -33
  412. data/spec/integration/matcher_examples_spec.rb +1 -0
  413. data/spec/integration/matcher_operator_data/bits_all_clear.yml +0 -15
  414. data/spec/integration/matcher_operator_data/bits_all_set.yml +0 -15
  415. data/spec/integration/matcher_operator_data/bits_any_clear.yml +0 -15
  416. data/spec/integration/matcher_operator_data/bits_any_set.yml +0 -15
  417. data/spec/integration/matcher_operator_data/size.yml +0 -3
  418. data/spec/integration/matcher_operator_data/type.yml +0 -6
  419. data/spec/integration/matcher_operator_data/type_array.yml +0 -1
  420. data/spec/integration/matcher_operator_data/type_decimal.yml +0 -4
  421. data/spec/integration/matcher_operator_spec.rb +1 -0
  422. data/spec/integration/matcher_spec.rb +21 -66
  423. data/spec/integration/persistence/range_field_spec.rb +1 -0
  424. data/spec/integration/server_query_spec.rb +1 -0
  425. data/spec/integration/shardable_spec.rb +1 -0
  426. data/spec/integration/stringified_symbol_field_spec.rb +1 -0
  427. data/spec/lite_spec_helper.rb +36 -10
  428. data/spec/mongoid/association/accessors_spec.rb +11 -28
  429. data/spec/mongoid/association/auto_save_spec.rb +1 -0
  430. data/spec/mongoid/association/builders_spec.rb +1 -0
  431. data/spec/mongoid/association/constrainable_spec.rb +1 -0
  432. data/spec/mongoid/association/counter_cache_spec.rb +1 -0
  433. data/spec/mongoid/association/depending_spec.rb +1 -0
  434. data/spec/mongoid/association/eager_spec.rb +50 -0
  435. data/spec/mongoid/association/embedded/cyclic_spec.rb +1 -0
  436. data/spec/mongoid/association/embedded/dirty_spec.rb +1 -0
  437. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +1 -0
  438. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +1 -0
  439. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +1 -0
  440. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -7
  441. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -0
  442. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +1 -0
  443. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1 -0
  444. data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -2
  445. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +4 -3
  446. data/spec/mongoid/association/embedded/embeds_many_spec.rb +1 -0
  447. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -0
  448. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +1 -0
  449. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1 -0
  450. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -0
  451. data/spec/mongoid/association/embedded/embeds_one_models.rb +6 -1
  452. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -1
  453. data/spec/mongoid/association/embedded/embeds_one_spec.rb +1 -0
  454. data/spec/mongoid/association/macros_spec.rb +1 -0
  455. data/spec/mongoid/association/nested/many_spec.rb +1 -0
  456. data/spec/mongoid/association/nested/one_spec.rb +1 -0
  457. data/spec/mongoid/association/options_spec.rb +1 -0
  458. data/spec/mongoid/association/polymorphic_spec.rb +1 -0
  459. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +1 -0
  460. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +1 -0
  461. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +1 -0
  462. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1 -0
  463. data/spec/mongoid/association/referenced/belongs_to_models.rb +1 -0
  464. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +2 -1
  465. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1 -0
  466. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +2 -1
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +1 -0
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -0
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +1 -3
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +1 -0
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -1
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1 -0
  474. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -0
  475. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +1 -0
  476. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +1 -0
  477. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -0
  478. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  479. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1085 -2002
  480. data/spec/mongoid/association/referenced/has_many_models.rb +1 -0
  481. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -1
  482. data/spec/mongoid/association/referenced/has_many_spec.rb +1 -0
  483. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -0
  484. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +1 -0
  485. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +1 -0
  486. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1 -0
  487. data/spec/mongoid/association/referenced/has_one_models.rb +1 -0
  488. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -1
  489. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -0
  490. data/spec/mongoid/association/reflections_spec.rb +1 -0
  491. data/spec/mongoid/association/syncable_spec.rb +1 -0
  492. data/spec/mongoid/association_spec.rb +1 -0
  493. data/spec/mongoid/atomic/modifiers_spec.rb +1 -0
  494. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -0
  495. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -0
  496. data/spec/mongoid/atomic/paths/root_spec.rb +1 -0
  497. data/spec/mongoid/atomic/paths_spec.rb +1 -0
  498. data/spec/mongoid/atomic_spec.rb +1 -0
  499. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  500. data/spec/mongoid/attributes/dynamic_spec.rb +1 -0
  501. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  502. data/spec/mongoid/attributes/nested_spec.rb +1 -0
  503. data/spec/mongoid/attributes/nested_spec_models.rb +1 -0
  504. data/spec/mongoid/attributes/projector_spec.rb +1 -0
  505. data/spec/mongoid/attributes/readonly_spec.rb +1 -0
  506. data/spec/mongoid/attributes_spec.rb +18 -19
  507. data/spec/mongoid/cacheable_spec.rb +1 -0
  508. data/spec/mongoid/changeable_spec.rb +4 -3
  509. data/spec/mongoid/clients/factory_spec.rb +77 -0
  510. data/spec/mongoid/clients/options_spec.rb +9 -5
  511. data/spec/mongoid/clients/sessions_spec.rb +27 -10
  512. data/spec/mongoid/clients/transactions_spec.rb +958 -185
  513. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  514. data/spec/mongoid/clients_spec.rb +47 -2
  515. data/spec/mongoid/collection_configurable_spec.rb +1 -0
  516. data/spec/mongoid/composable_spec.rb +1 -0
  517. data/spec/mongoid/config/defaults_spec.rb +31 -92
  518. data/spec/mongoid/config/encryption_spec.rb +152 -0
  519. data/spec/mongoid/config/environment_spec.rb +13 -41
  520. data/spec/mongoid/config/introspection_spec.rb +114 -0
  521. data/spec/mongoid/config/options_spec.rb +1 -0
  522. data/spec/mongoid/config_spec.rb +20 -133
  523. data/spec/mongoid/contextual/aggregable/memory_spec.rb +1 -0
  524. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +1 -0
  525. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +5 -29
  526. data/spec/mongoid/contextual/aggregable/none_spec.rb +3 -14
  527. data/spec/mongoid/contextual/atomic_spec.rb +203 -12
  528. data/spec/mongoid/contextual/map_reduce_spec.rb +1 -0
  529. data/spec/mongoid/contextual/memory_spec.rb +364 -534
  530. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +10 -3
  531. data/spec/mongoid/contextual/mongo_spec.rb +98 -205
  532. data/spec/mongoid/contextual/none_spec.rb +1 -0
  533. data/spec/mongoid/copyable_spec.rb +1 -0
  534. data/spec/mongoid/copyable_spec_models.rb +1 -0
  535. data/spec/mongoid/criteria/findable_spec.rb +191 -0
  536. data/spec/mongoid/criteria/includable_spec.rb +1 -0
  537. data/spec/mongoid/criteria/includable_spec_models.rb +1 -0
  538. data/spec/mongoid/criteria/inspectable_spec.rb +1 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +3 -2
  540. data/spec/mongoid/criteria/modifiable_spec.rb +1 -0
  541. data/spec/mongoid/criteria/options_spec.rb +1 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -0
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +1 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +8 -7
  546. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -0
  547. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +21 -11
  548. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +1 -0
  549. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -0
  550. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -0
  551. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -0
  552. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -0
  553. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +1 -0
  554. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -0
  555. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +1 -0
  556. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -11
  557. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -11
  558. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -0
  559. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -66
  560. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -0
  561. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +1 -0
  562. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +1 -0
  563. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -0
  564. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +1 -0
  565. data/spec/mongoid/criteria/queryable/optional_spec.rb +1 -0
  566. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -0
  567. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -0
  568. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -0
  569. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +4 -3
  570. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +1 -0
  571. data/spec/mongoid/criteria/queryable/selectable_spec.rb +51 -185
  572. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +1 -0
  573. data/spec/mongoid/criteria/queryable/selector_spec.rb +96 -0
  574. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -0
  575. data/spec/mongoid/criteria/queryable/storable_spec.rb +10 -32
  576. data/spec/mongoid/criteria/scopable_spec.rb +1 -0
  577. data/spec/mongoid/criteria/translator_spec.rb +1 -0
  578. data/spec/mongoid/criteria_projection_spec.rb +6 -5
  579. data/spec/mongoid/criteria_spec.rb +221 -359
  580. data/spec/mongoid/document_fields_spec.rb +1 -0
  581. data/spec/mongoid/document_persistence_context_spec.rb +77 -0
  582. data/spec/mongoid/document_query_spec.rb +5 -4
  583. data/spec/mongoid/document_spec.rb +3 -121
  584. data/spec/mongoid/equality_spec.rb +41 -143
  585. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -0
  586. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  587. data/spec/mongoid/errors/callback_spec.rb +1 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -0
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +1 -0
  591. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -0
  592. data/spec/mongoid/errors/invalid_config_file_spec.rb +1 -0
  593. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -0
  594. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -0
  595. data/spec/mongoid/errors/invalid_field_spec.rb +1 -0
  596. data/spec/mongoid/errors/invalid_field_type_spec.rb +1 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +1 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +1 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +1 -0
  601. data/spec/mongoid/errors/invalid_path_spec.rb +1 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -0
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -0
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +1 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -0
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +9 -22
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -0
  612. data/spec/mongoid/errors/no_client_config_spec.rb +1 -0
  613. data/spec/mongoid/errors/no_client_database_spec.rb +1 -0
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -0
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +1 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +1 -0
  619. data/spec/mongoid/errors/no_parent_spec.rb +1 -0
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +1 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +1 -0
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -0
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -0
  627. data/spec/mongoid/errors/validations_spec.rb +1 -0
  628. data/spec/mongoid/extensions/array_spec.rb +3 -262
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +5 -4
  630. data/spec/mongoid/extensions/binary_spec.rb +1 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +1 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +8 -7
  633. data/spec/mongoid/extensions/date_spec.rb +3 -20
  634. data/spec/mongoid/extensions/date_time_spec.rb +3 -9
  635. data/spec/mongoid/extensions/decimal128_spec.rb +1 -0
  636. data/spec/mongoid/extensions/false_class_spec.rb +1 -7
  637. data/spec/mongoid/extensions/float_spec.rb +3 -9
  638. data/spec/mongoid/extensions/hash_spec.rb +19 -222
  639. data/spec/mongoid/extensions/integer_spec.rb +3 -8
  640. data/spec/mongoid/extensions/module_spec.rb +1 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +1 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +1 -0
  643. data/spec/mongoid/extensions/object_spec.rb +1 -176
  644. data/spec/mongoid/extensions/range_spec.rb +1 -11
  645. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  646. data/spec/mongoid/extensions/regexp_spec.rb +1 -0
  647. data/spec/mongoid/extensions/set_spec.rb +2 -3
  648. data/spec/mongoid/extensions/string_spec.rb +3 -113
  649. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -0
  650. data/spec/mongoid/extensions/symbol_spec.rb +1 -31
  651. data/spec/mongoid/extensions/time_spec.rb +32 -350
  652. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -30
  653. data/spec/mongoid/extensions/true_class_spec.rb +1 -7
  654. data/spec/mongoid/factory_spec.rb +1 -0
  655. data/spec/mongoid/fields/foreign_key_spec.rb +282 -119
  656. data/spec/mongoid/fields/localized_spec.rb +1 -0
  657. data/spec/mongoid/fields/standard_spec.rb +1 -0
  658. data/spec/mongoid/fields_spec.rb +60 -66
  659. data/spec/mongoid/findable_spec.rb +2 -61
  660. data/spec/mongoid/indexable/specification_spec.rb +132 -13
  661. data/spec/mongoid/indexable_spec.rb +323 -9
  662. data/spec/mongoid/inspectable_spec.rb +81 -0
  663. data/spec/mongoid/interceptable_spec.rb +3 -2
  664. data/spec/mongoid/interceptable_spec_models.rb +1 -0
  665. data/spec/mongoid/loading_spec.rb +110 -0
  666. data/spec/mongoid/loggable_spec.rb +1 -0
  667. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -0
  668. data/spec/mongoid/mongoizable_spec.rb +1 -0
  669. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  670. data/spec/mongoid/persistable/creatable_spec.rb +1 -0
  671. data/spec/mongoid/persistable/deletable_spec.rb +78 -31
  672. data/spec/mongoid/persistable/destroyable_spec.rb +230 -52
  673. data/spec/mongoid/persistable/incrementable_spec.rb +1 -0
  674. data/spec/mongoid/persistable/logical_spec.rb +1 -0
  675. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  676. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  677. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  678. data/spec/mongoid/persistable/poppable_spec.rb +1 -0
  679. data/spec/mongoid/persistable/pullable_spec.rb +1 -0
  680. data/spec/mongoid/persistable/pushable_spec.rb +1 -0
  681. data/spec/mongoid/persistable/renamable_spec.rb +1 -0
  682. data/spec/mongoid/persistable/savable_spec.rb +2 -6
  683. data/spec/mongoid/persistable/settable_spec.rb +5 -4
  684. data/spec/mongoid/persistable/unsettable_spec.rb +1 -0
  685. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  686. data/spec/mongoid/persistable/upsertable_spec.rb +34 -1
  687. data/spec/mongoid/persistable_spec.rb +1 -0
  688. data/spec/mongoid/persistence_context_spec.rb +1 -0
  689. data/spec/mongoid/positional_spec.rb +1 -0
  690. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  691. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  692. data/spec/mongoid/relations/proxy_spec.rb +1 -0
  693. data/spec/mongoid/reloadable_spec.rb +28 -83
  694. data/spec/mongoid/scopable_spec.rb +39 -50
  695. data/spec/mongoid/search_indexable_spec.rb +147 -0
  696. data/spec/mongoid/selectable_spec.rb +1 -0
  697. data/spec/mongoid/serializable_spec.rb +1 -0
  698. data/spec/mongoid/shardable_models.rb +1 -0
  699. data/spec/mongoid/shardable_spec.rb +1 -0
  700. data/spec/mongoid/stateful_spec.rb +1 -0
  701. data/spec/mongoid/tasks/database_rake_spec.rb +127 -49
  702. data/spec/mongoid/tasks/database_spec.rb +48 -1
  703. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  704. data/spec/mongoid/threaded_spec.rb +38 -0
  705. data/spec/mongoid/timestamps/created/short_spec.rb +1 -0
  706. data/spec/mongoid/timestamps/created_spec.rb +1 -0
  707. data/spec/mongoid/timestamps/timeless_spec.rb +1 -0
  708. data/spec/mongoid/timestamps/updated/short_spec.rb +1 -0
  709. data/spec/mongoid/timestamps/updated_spec.rb +1 -0
  710. data/spec/mongoid/timestamps_spec.rb +1 -0
  711. data/spec/mongoid/timestamps_spec_models.rb +1 -0
  712. data/spec/mongoid/touchable_spec.rb +490 -62
  713. data/spec/mongoid/touchable_spec_models.rb +96 -1
  714. data/spec/mongoid/traversable_spec.rb +1 -0
  715. data/spec/mongoid/validatable/associated_spec.rb +1 -0
  716. data/spec/mongoid/validatable/format_spec.rb +1 -0
  717. data/spec/mongoid/validatable/length_spec.rb +1 -0
  718. data/spec/mongoid/validatable/numericality_spec.rb +1 -0
  719. data/spec/mongoid/validatable/presence_spec.rb +1 -0
  720. data/spec/mongoid/validatable/uniqueness_spec.rb +48 -3
  721. data/spec/mongoid/validatable_spec.rb +1 -0
  722. data/spec/mongoid/warnings_spec.rb +1 -0
  723. data/spec/mongoid_spec.rb +27 -0
  724. data/spec/rails/controller_extension/controller_runtime_spec.rb +1 -0
  725. data/spec/rails/mongoid_spec.rb +26 -117
  726. data/spec/shared/share/Dockerfile.erb +12 -52
  727. data/spec/shared/shlib/server.sh +1 -0
  728. data/spec/shared/shlib/set_env.sh +5 -28
  729. data/spec/spec_helper.rb +26 -28
  730. data/spec/support/authorization.rb +1 -0
  731. data/spec/support/client_registry.rb +1 -0
  732. data/spec/support/constraints.rb +1 -0
  733. data/spec/support/crypt/models.rb +50 -0
  734. data/spec/support/crypt.rb +80 -0
  735. data/spec/support/expectations.rb +1 -0
  736. data/spec/support/feature_sandbox.rb +72 -0
  737. data/spec/support/helpers.rb +1 -0
  738. data/spec/support/immutable_ids.rb +22 -21
  739. data/spec/support/macros.rb +4 -6
  740. data/spec/support/models/account.rb +1 -0
  741. data/spec/support/models/acolyte.rb +1 -0
  742. data/spec/support/models/actor.rb +1 -0
  743. data/spec/support/models/actress.rb +1 -0
  744. data/spec/support/models/address.rb +3 -0
  745. data/spec/support/models/address_component.rb +1 -0
  746. data/spec/support/models/address_number.rb +1 -0
  747. data/spec/support/models/agency.rb +1 -0
  748. data/spec/support/models/agent.rb +1 -0
  749. data/spec/support/models/album.rb +1 -0
  750. data/spec/support/models/alert.rb +1 -0
  751. data/spec/support/models/animal.rb +1 -0
  752. data/spec/support/models/answer.rb +1 -0
  753. data/spec/support/models/appointment.rb +1 -0
  754. data/spec/support/models/armrest.rb +1 -0
  755. data/spec/support/models/array_field.rb +1 -0
  756. data/spec/support/models/article.rb +1 -0
  757. data/spec/support/models/artist.rb +1 -0
  758. data/spec/support/models/artwork.rb +1 -0
  759. data/spec/support/models/audible_sound.rb +1 -0
  760. data/spec/support/models/audio.rb +1 -0
  761. data/spec/support/models/augmentation.rb +1 -0
  762. data/spec/support/models/author.rb +1 -0
  763. data/spec/support/models/baby.rb +1 -0
  764. data/spec/support/models/band.rb +5 -0
  765. data/spec/support/models/bar.rb +1 -0
  766. data/spec/support/models/basic.rb +1 -0
  767. data/spec/support/models/bed.rb +1 -0
  768. data/spec/support/models/big_palette.rb +1 -0
  769. data/spec/support/models/birthday.rb +1 -0
  770. data/spec/support/models/bolt.rb +1 -0
  771. data/spec/support/models/bomb.rb +1 -0
  772. data/spec/support/models/book.rb +1 -0
  773. data/spec/support/models/breed.rb +1 -0
  774. data/spec/support/models/browser.rb +1 -0
  775. data/spec/support/models/building.rb +1 -0
  776. data/spec/support/models/building_address.rb +1 -0
  777. data/spec/support/models/bus.rb +1 -0
  778. data/spec/support/models/business.rb +1 -0
  779. data/spec/support/models/callback_test.rb +1 -0
  780. data/spec/support/models/canvas.rb +1 -0
  781. data/spec/support/models/car.rb +1 -0
  782. data/spec/support/models/cat.rb +1 -0
  783. data/spec/support/models/catalog.rb +1 -0
  784. data/spec/support/models/category.rb +1 -0
  785. data/spec/support/models/child.rb +1 -0
  786. data/spec/support/models/child_doc.rb +1 -0
  787. data/spec/support/models/church.rb +1 -0
  788. data/spec/support/models/circle.rb +1 -0
  789. data/spec/support/models/circuit.rb +1 -0
  790. data/spec/support/models/circus.rb +1 -0
  791. data/spec/support/models/code.rb +1 -0
  792. data/spec/support/models/coding/pull_request.rb +1 -0
  793. data/spec/support/models/coding.rb +1 -0
  794. data/spec/support/models/comment.rb +1 -0
  795. data/spec/support/models/company.rb +1 -0
  796. data/spec/support/models/consumption_period.rb +1 -0
  797. data/spec/support/models/contextable_item.rb +1 -0
  798. data/spec/support/models/contractor.rb +1 -0
  799. data/spec/support/models/cookie.rb +1 -0
  800. data/spec/support/models/country_code.rb +1 -0
  801. data/spec/support/models/courier_job.rb +1 -0
  802. data/spec/support/models/cover.rb +1 -0
  803. data/spec/support/models/crate.rb +1 -0
  804. data/spec/support/models/customer.rb +1 -0
  805. data/spec/support/models/customer_address.rb +1 -0
  806. data/spec/support/models/deed.rb +1 -0
  807. data/spec/support/models/definition.rb +1 -0
  808. data/spec/support/models/delegating_patient.rb +1 -0
  809. data/spec/support/models/description.rb +1 -0
  810. data/spec/support/models/dictionary.rb +1 -0
  811. data/spec/support/models/division.rb +1 -0
  812. data/spec/support/models/doctor.rb +1 -0
  813. data/spec/support/models/dog.rb +1 -0
  814. data/spec/support/models/dokument.rb +1 -0
  815. data/spec/support/models/draft.rb +1 -0
  816. data/spec/support/models/dragon.rb +1 -0
  817. data/spec/support/models/driver.rb +1 -0
  818. data/spec/support/models/drug.rb +1 -0
  819. data/spec/support/models/dungeon.rb +1 -0
  820. data/spec/support/models/edit.rb +1 -0
  821. data/spec/support/models/email.rb +1 -0
  822. data/spec/support/models/employer.rb +1 -0
  823. data/spec/support/models/entry.rb +1 -0
  824. data/spec/support/models/eraser.rb +1 -0
  825. data/spec/support/models/even.rb +1 -0
  826. data/spec/support/models/event.rb +1 -0
  827. data/spec/support/models/exhibition.rb +1 -0
  828. data/spec/support/models/exhibitor.rb +1 -0
  829. data/spec/support/models/explosion.rb +1 -0
  830. data/spec/support/models/eye.rb +1 -0
  831. data/spec/support/models/eye_bowl.rb +1 -0
  832. data/spec/support/models/face.rb +1 -0
  833. data/spec/support/models/fanatic.rb +1 -0
  834. data/spec/support/models/favorite.rb +8 -1
  835. data/spec/support/models/filesystem.rb +1 -0
  836. data/spec/support/models/fire_hydrant.rb +1 -0
  837. data/spec/support/models/firefox.rb +1 -0
  838. data/spec/support/models/fish.rb +1 -0
  839. data/spec/support/models/folder.rb +1 -0
  840. data/spec/support/models/folder_item.rb +1 -0
  841. data/spec/support/models/fruits.rb +1 -0
  842. data/spec/support/models/game.rb +1 -0
  843. data/spec/support/models/ghost.rb +1 -0
  844. data/spec/support/models/guitar.rb +1 -0
  845. data/spec/support/models/hole.rb +1 -0
  846. data/spec/support/models/home.rb +1 -0
  847. data/spec/support/models/house.rb +1 -0
  848. data/spec/support/models/html_writer.rb +1 -0
  849. data/spec/support/models/id_key.rb +1 -0
  850. data/spec/support/models/idnodef.rb +1 -0
  851. data/spec/support/models/image.rb +1 -0
  852. data/spec/support/models/implant.rb +1 -0
  853. data/spec/support/models/instrument.rb +1 -0
  854. data/spec/support/models/item.rb +1 -0
  855. data/spec/support/models/jar.rb +1 -0
  856. data/spec/support/models/kaleidoscope.rb +1 -0
  857. data/spec/support/models/kangaroo.rb +1 -0
  858. data/spec/support/models/label.rb +1 -0
  859. data/spec/support/models/language.rb +1 -0
  860. data/spec/support/models/lat_lng.rb +1 -0
  861. data/spec/support/models/league.rb +1 -0
  862. data/spec/support/models/learner.rb +1 -0
  863. data/spec/support/models/line_item.rb +1 -0
  864. data/spec/support/models/location.rb +1 -0
  865. data/spec/support/models/login.rb +1 -0
  866. data/spec/support/models/manufacturer.rb +1 -0
  867. data/spec/support/models/meat.rb +1 -0
  868. data/spec/support/models/membership.rb +1 -0
  869. data/spec/support/models/message.rb +1 -0
  870. data/spec/support/models/minim.rb +1 -0
  871. data/spec/support/models/mixed_drink.rb +1 -0
  872. data/spec/support/models/mop.rb +1 -0
  873. data/spec/support/models/movie.rb +1 -0
  874. data/spec/support/models/my_hash.rb +1 -0
  875. data/spec/support/models/name.rb +1 -0
  876. data/spec/support/models/name_only.rb +1 -0
  877. data/spec/support/models/node.rb +1 -0
  878. data/spec/support/models/note.rb +1 -0
  879. data/spec/support/models/nut.rb +1 -0
  880. data/spec/support/models/odd.rb +1 -0
  881. data/spec/support/models/order.rb +1 -0
  882. data/spec/support/models/ordered_post.rb +1 -0
  883. data/spec/support/models/ordered_preference.rb +1 -0
  884. data/spec/support/models/oscar.rb +1 -0
  885. data/spec/support/models/other_owner_object.rb +1 -0
  886. data/spec/support/models/override.rb +1 -0
  887. data/spec/support/models/ownable.rb +1 -0
  888. data/spec/support/models/owner.rb +1 -0
  889. data/spec/support/models/pack.rb +1 -0
  890. data/spec/support/models/page.rb +1 -0
  891. data/spec/support/models/page_question.rb +1 -0
  892. data/spec/support/models/palette.rb +1 -0
  893. data/spec/support/models/parent.rb +1 -0
  894. data/spec/support/models/parent_doc.rb +1 -0
  895. data/spec/support/models/passport.rb +1 -0
  896. data/spec/support/models/patient.rb +1 -0
  897. data/spec/support/models/pdf_writer.rb +1 -0
  898. data/spec/support/models/pencil.rb +1 -0
  899. data/spec/support/models/person.rb +1 -0
  900. data/spec/support/models/pet.rb +1 -0
  901. data/spec/support/models/pet_owner.rb +1 -0
  902. data/spec/support/models/phone.rb +1 -0
  903. data/spec/support/models/piano.rb +1 -0
  904. data/spec/support/models/pizza.rb +1 -0
  905. data/spec/support/models/player.rb +1 -0
  906. data/spec/support/models/post.rb +1 -0
  907. data/spec/support/models/post_genre.rb +1 -0
  908. data/spec/support/models/powerup.rb +1 -0
  909. data/spec/support/models/preference.rb +1 -0
  910. data/spec/support/models/princess.rb +1 -0
  911. data/spec/support/models/product.rb +1 -0
  912. data/spec/support/models/profile.rb +1 -0
  913. data/spec/support/models/pronunciation.rb +1 -0
  914. data/spec/support/models/pub.rb +1 -0
  915. data/spec/support/models/publication/encyclopedia.rb +1 -0
  916. data/spec/support/models/publication/review.rb +1 -0
  917. data/spec/support/models/publication.rb +1 -0
  918. data/spec/support/models/purchase.rb +1 -0
  919. data/spec/support/models/purchased_item.rb +1 -0
  920. data/spec/support/models/question.rb +1 -0
  921. data/spec/support/models/quiz.rb +1 -0
  922. data/spec/support/models/rating.rb +1 -0
  923. data/spec/support/models/record.rb +1 -0
  924. data/spec/support/models/registry.rb +1 -0
  925. data/spec/support/models/role.rb +1 -0
  926. data/spec/support/models/root_category.rb +1 -0
  927. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  928. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  929. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  930. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  931. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  932. data/spec/support/models/sandwich.rb +1 -0
  933. data/spec/support/models/scheduler.rb +1 -0
  934. data/spec/support/models/school.rb +1 -0
  935. data/spec/support/models/scribe.rb +1 -0
  936. data/spec/support/models/sealer.rb +1 -0
  937. data/spec/support/models/seat.rb +1 -0
  938. data/spec/support/models/seo.rb +1 -0
  939. data/spec/support/models/series.rb +1 -0
  940. data/spec/support/models/server.rb +1 -0
  941. data/spec/support/models/service.rb +1 -0
  942. data/spec/support/models/shape.rb +1 -0
  943. data/spec/support/models/shelf.rb +1 -0
  944. data/spec/support/models/shield.rb +1 -0
  945. data/spec/support/models/shipment_address.rb +1 -0
  946. data/spec/support/models/shipping_container.rb +1 -0
  947. data/spec/support/models/shipping_pack.rb +1 -0
  948. data/spec/support/models/shirt.rb +1 -0
  949. data/spec/support/models/shop.rb +1 -0
  950. data/spec/support/models/short_agent.rb +1 -0
  951. data/spec/support/models/short_quiz.rb +1 -0
  952. data/spec/support/models/simple.rb +1 -0
  953. data/spec/support/models/slave.rb +1 -0
  954. data/spec/support/models/song.rb +1 -0
  955. data/spec/support/models/sound.rb +1 -0
  956. data/spec/support/models/spacer.rb +1 -0
  957. data/spec/support/models/square.rb +1 -0
  958. data/spec/support/models/staff.rb +1 -0
  959. data/spec/support/models/store_as_dup_test1.rb +1 -0
  960. data/spec/support/models/store_as_dup_test2.rb +1 -0
  961. data/spec/support/models/store_as_dup_test3.rb +1 -0
  962. data/spec/support/models/store_as_dup_test4.rb +1 -0
  963. data/spec/support/models/strategy.rb +1 -0
  964. data/spec/support/models/student.rb +1 -0
  965. data/spec/support/models/sub_item.rb +1 -0
  966. data/spec/support/models/subscription.rb +1 -0
  967. data/spec/support/models/survey.rb +1 -0
  968. data/spec/support/models/symptom.rb +1 -0
  969. data/spec/support/models/system_role.rb +1 -0
  970. data/spec/support/models/tag.rb +1 -0
  971. data/spec/support/models/target.rb +1 -0
  972. data/spec/support/models/template.rb +1 -0
  973. data/spec/support/models/thing.rb +1 -0
  974. data/spec/support/models/threadlocker.rb +1 -0
  975. data/spec/support/models/title.rb +1 -0
  976. data/spec/support/models/tool.rb +1 -0
  977. data/spec/support/models/topping.rb +1 -0
  978. data/spec/support/models/toy.rb +1 -0
  979. data/spec/support/models/track.rb +1 -0
  980. data/spec/support/models/translation.rb +1 -0
  981. data/spec/support/models/tree.rb +1 -0
  982. data/spec/support/models/truck.rb +1 -0
  983. data/spec/support/models/updatable.rb +1 -0
  984. data/spec/support/models/user.rb +1 -0
  985. data/spec/support/models/user_account.rb +1 -0
  986. data/spec/support/models/validation_callback.rb +1 -0
  987. data/spec/support/models/vehicle.rb +1 -0
  988. data/spec/support/models/version.rb +1 -0
  989. data/spec/support/models/vertex.rb +1 -0
  990. data/spec/support/models/vet_visit.rb +1 -0
  991. data/spec/support/models/video.rb +1 -0
  992. data/spec/support/models/video_game.rb +1 -0
  993. data/spec/support/models/washer.rb +1 -0
  994. data/spec/support/models/weapon.rb +1 -0
  995. data/spec/support/models/wiki_page.rb +1 -0
  996. data/spec/support/models/word.rb +1 -0
  997. data/spec/support/models/word_origin.rb +1 -0
  998. data/spec/support/models/writer.rb +1 -0
  999. data/spec/support/rails_mock.rb +32 -0
  1000. data/spec/support/shared/time.rb +3 -21
  1001. data/spec/support/sinatra_mock.rb +7 -0
  1002. data/spec/support/spec_config.rb +30 -9
  1003. data.tar.gz.sig +0 -0
  1004. metadata +92 -34
  1005. metadata.gz.sig +0 -0
  1006. data/lib/mongoid/association/referenced/eager.rb +0 -163
  1007. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -113
  1008. data/lib/mongoid/contextual/geo_near.rb +0 -236
  1009. data/lib/mongoid/errors/invalid_session_use.rb +0 -21
  1010. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -27
  1011. data/lib/mongoid/query_cache.rb +0 -68
  1012. data/spec/mongoid/contextual/geo_near_spec.rb +0 -471
  1013. data/spec/mongoid/extensions_spec.rb +0 -43
  1014. data/spec/mongoid/query_cache_middleware_spec.rb +0 -50
  1015. data/spec/mongoid/query_cache_spec.rb +0 -865
@@ -1,6 +1,18 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require "spec_helper"
5
+ require_relative './transactions_spec_models'
6
+
7
+ def capture_exception
8
+ e = nil
9
+ begin
10
+ yield
11
+ rescue => ex
12
+ e = ex
13
+ end
14
+ e
15
+ end
4
16
 
5
17
  describe Mongoid::Clients::Sessions do
6
18
  before(:all) do
@@ -72,170 +84,316 @@ describe Mongoid::Clients::Sessions do
72
84
  end
73
85
 
74
86
  context 'when another thread is started' do
87
+ shared_examples 'it does not use the transaction for that thread' do
88
+ it do
89
+ expect(Person.count).to be(2)
90
+ expect(Person.with(client: :default) { Person.count }).to be(1)
91
+ expect(insert_events.count { |e| e.command['startTransaction'] }).to be(1)
92
+ expect(other_events.count { |e| e.command_name == 'commitTransaction' }).to be(1)
93
+ end
94
+ end
75
95
 
76
- let!(:last_use_diff) do
77
- Person.with_session do |s|
78
- s.start_transaction
79
- Person.create!
80
- Person.create!
81
- Thread.new { Person.create! }.value
82
- s.commit_transaction
96
+ context 'using #with_session' do
97
+ let!(:last_use_diff) do
98
+ Person.with_session do |s|
99
+ s.start_transaction
100
+ Person.create!
101
+ Person.create!
102
+ Thread.new { Person.create! }.value
103
+ s.commit_transaction
104
+ end
83
105
  end
106
+
107
+ include_examples 'it does not use the transaction for that thread'
84
108
  end
85
109
 
86
- it 'does not use the transaction for that thread' do
87
- expect(Person.count).to be(2)
88
- expect(Person.with(client: :default) { Person.count }).to be(1)
89
- expect(insert_events.count { |e| e.command['startTransaction'] }).to be(1)
90
- expect(other_events.count { |e| e.command_name == 'commitTransaction' }).to be(1)
110
+ context 'using #transaction' do
111
+ let!(:last_use_diff) do
112
+ Person.transaction do
113
+ Person.create!
114
+ Person.create!
115
+ Thread.new { Person.create! }.value
116
+ end
117
+ end
118
+
119
+ include_examples 'it does not use the transaction for that thread'
91
120
  end
92
121
  end
93
122
 
94
123
  context 'when the operations in the transactions block are all on the class' do
124
+ shared_examples 'it uses a single transaction number for all operations on the class' do
125
+ it do
126
+ expect(Person.count).to be(2)
127
+ expect(insert_events_txn_numbers.size).to eq(2)
128
+ expect(insert_events_txn_numbers.uniq.size).to eq(1)
129
+ end
130
+ end
95
131
 
96
- before do
97
- Person.with_session do |s|
98
- s.start_transaction
99
- Person.create!
100
- Person.create!
101
- s.commit_transaction
132
+ context 'using #with_session' do
133
+ before do
134
+ Person.with_session do |s|
135
+ s.start_transaction
136
+ Person.create!
137
+ Person.create!
138
+ s.commit_transaction
139
+ end
102
140
  end
141
+
142
+ include_examples 'it uses a single transaction number for all operations on the class'
103
143
  end
104
144
 
105
- it 'uses a single transaction number for all operations on the class' do
106
- expect(Person.count).to be(2)
107
- expect(insert_events_txn_numbers.size).to eq(2)
108
- expect(insert_events_txn_numbers.uniq.size).to eq(1)
145
+ context 'using #transaction' do
146
+ before do
147
+ Person.transaction do
148
+ Person.create!
149
+ Person.create!
150
+ end
151
+ end
152
+
153
+ include_examples 'it uses a single transaction number for all operations on the class'
109
154
  end
110
155
  end
111
156
 
112
157
  context 'when the operations in the transactions block are also on another class' do
113
-
114
158
  context 'when the other class uses the same client' do
159
+ shared_examples 'it uses a single transaction number for all operations on the class' do
160
+ it do
161
+ expect(Post.with(client: :other) { |klass| klass.count }).to be(1)
162
+ expect(insert_events_txn_numbers.size).to eq(3)
163
+ expect(insert_events_txn_numbers.uniq.size).to eq(1)
164
+ end
165
+ end
115
166
 
116
- before do
117
- Post.with(client: :other) do
118
- Person.with_session do |s|
119
- s.start_transaction
120
- Person.create!
121
- Person.create!
122
- Post.create!
123
- s.commit_transaction
167
+ context 'using #with_session' do
168
+ before do
169
+ Post.with(client: :other) do
170
+ Person.with_session do |s|
171
+ s.start_transaction
172
+ Person.create!
173
+ Person.create!
174
+ Post.create!
175
+ s.commit_transaction
176
+ end
124
177
  end
125
178
  end
179
+
180
+ include_examples 'it uses a single transaction number for all operations on the class'
126
181
  end
127
182
 
128
- it 'uses a single transaction number for all operations on the class' do
129
- expect(Post.with(client: :other) { |klass| klass.count }).to be(1)
130
- expect(insert_events_txn_numbers.size).to eq(3)
131
- expect(insert_events_txn_numbers.uniq.size).to eq(1)
183
+ context 'using #transaction' do
184
+ before do
185
+ Post.with(client: :other) do
186
+ Person.transaction do
187
+ Person.create!
188
+ Person.create!
189
+ Post.create!
190
+ end
191
+ end
192
+ end
193
+
194
+ include_examples 'it uses a single transaction number for all operations on the class'
132
195
  end
133
196
  end
134
197
 
135
198
  context 'when the other class uses a different client' do
199
+ shared_examples 'it does not abort the transaction' do
200
+ it 'does not raise an error' do
201
+ expect(error).to be_nil
202
+ end
136
203
 
137
- let!(:error) do
138
- e = nil
139
- begin
140
- Person.with_session do |s|
141
- s.start_transaction
142
- Person.create!
143
- Person.create!
144
- Post.create!
145
- s.commit_transaction
146
- end
147
- rescue => ex
148
- e = ex
204
+ it 'committed the transaction' do
205
+ expect(Person.count).to be(2)
206
+ expect(Post.count).to be(1)
207
+ expect(insert_events_txn_numbers.size).to eq(2)
208
+ expect(other_events.count { |e| e.command_name == 'abortTransaction'}).to be(0)
209
+ expect(other_events.count { |e| e.command_name == 'commitTransaction'}).to be(1)
149
210
  end
150
- e
151
211
  end
152
212
 
153
- it 'raises an error' do
154
- expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
213
+ context 'using #with_session' do
214
+ let!(:error) do
215
+ capture_exception do
216
+ Person.with_session do |s|
217
+ s.start_transaction
218
+ Person.create!
219
+ Person.create!
220
+ Post.create!
221
+ s.commit_transaction
222
+ end
223
+ end
224
+ end
225
+
226
+ include_examples 'it does not abort the transaction'
155
227
  end
156
228
 
157
- it 'aborted the transaction' do
158
- expect(Person.count).to be(0)
159
- expect(Post.count).to be(0)
160
- expect(insert_events_txn_numbers.size).to eq(2)
161
- expect(other_events.count { |e| e.command_name == 'abortTransaction'}).to be(1)
162
- expect(other_events.count { |e| e.command_name == 'commitTransaction'}).to be(0)
229
+ context 'using #transaction' do
230
+ let!(:error) do
231
+ capture_exception do
232
+ Person.transaction do
233
+ Person.create!
234
+ Person.create!
235
+ Post.create!
236
+ end
237
+ end
238
+ end
239
+
240
+ include_examples 'it does not abort the transaction'
163
241
  end
164
242
  end
165
243
 
166
244
  context 'when transactions are nested' do
245
+ shared_examples 'it aborts the transaction' do |error_class|
246
+ it 'raises an error' do
247
+ expect(error).to be_a(error_class)
248
+ end
167
249
 
168
- let!(:error) do
169
- e = nil
170
- begin
171
- Person.with_session do |s|
172
- s.start_transaction
173
- s.start_transaction
174
- Person.create!
175
- Post.create!
176
- s.commit_transaction
177
- end
178
- rescue => ex
179
- e = ex
250
+ it 'does not execute any operations' do
251
+ expect(Person.count).to be(0)
252
+ expect(Post.count).to be(0)
253
+ expect(insert_events).to be_empty
180
254
  end
181
- e
182
255
  end
183
256
 
184
- it 'raises an error' do
185
- expect(error).to be_a(Mongo::Error::InvalidTransactionOperation)
257
+ context 'using #with_session' do
258
+ let!(:error) do
259
+ capture_exception do
260
+ Person.with_session do |s|
261
+ s.start_transaction
262
+ s.start_transaction
263
+ Person.create!
264
+ Post.create!
265
+ s.commit_transaction
266
+ end
267
+ end
268
+ end
269
+
270
+ include_examples 'it aborts the transaction', Mongo::Error::InvalidTransactionOperation
186
271
  end
187
272
 
188
- it 'does not execute any operations' do
189
- expect(Person.count).to be(0)
190
- expect(Post.count).to be(0)
191
- expect(insert_events).to be_empty
273
+ context 'using #transaction' do
274
+ let!(:error) do
275
+ capture_exception do
276
+ Person.transaction do
277
+ Person.transaction do
278
+ Person.create!
279
+ Post.create!
280
+ end
281
+ end
282
+ end
283
+ end
284
+
285
+ include_examples 'it aborts the transaction', Mongoid::Errors::InvalidTransactionNesting
192
286
  end
193
287
  end
194
288
  end
195
289
 
196
- context 'When reloading an embedded document created inside a transaction' do
197
- it 'does not raise an error and has the correct document' do
198
- Canvas.with_session do |s|
199
- s.start_transaction
290
+ context 'when reloading an embedded document created inside a transaction' do
291
+ context 'using #with_session' do
292
+ it 'does not raise an error and has the correct document' do
293
+ Canvas.with_session do |s|
294
+ s.start_transaction
295
+ p = Palette.new
296
+ c = Canvas.new(palette: p)
297
+ c.save!
298
+
299
+ expect do
300
+ p.reload
301
+ end.to_not raise_error
302
+
303
+ expect(c.palette).to eq(p)
304
+
305
+ s.commit_transaction
306
+ end
307
+ end
308
+ end
200
309
 
201
- p = Palette.new
202
- c = Canvas.new(palette: p)
203
- c.save!
310
+ context 'using #transaction' do
311
+ it 'does not raise an error and has the correct document' do
312
+ Canvas.transaction do
204
313
 
205
- expect do
206
- p.reload
207
- end.to_not raise_error
314
+ p = Palette.new
315
+ c = Canvas.new(palette: p)
316
+ c.save!
208
317
 
209
- expect(c.palette).to eq(p)
318
+ expect do
319
+ p.reload
320
+ end.to_not raise_error
210
321
 
211
- s.commit_transaction
322
+ expect(c.palette).to eq(p)
323
+ end
212
324
  end
213
325
  end
214
326
  end
327
+
328
+ context 'when Mongoid::Errors:Rollback raised' do
329
+ let!(:error) do
330
+ capture_exception do
331
+ Person.transaction do
332
+ Person.create!
333
+ raise Mongoid::Errors::Rollback
334
+ end
335
+ end
336
+ end
337
+
338
+ it 'does not bass on the exception' do
339
+ expect(error).to be_nil
340
+ end
341
+
342
+ it 'aborts the transaction' do
343
+ expect(other_events.count { |e| e.command_name == 'abortTransaction'}).to be(1)
344
+ expect(other_events.count { |e| e.command_name == 'commitTransaction'}).to be(0)
345
+ end
346
+ end
215
347
  end
216
348
 
217
349
  context 'when sessions are supported but transactions are not' do
218
350
  min_server_version '3.6'
219
351
  # Could also test 4.0 in sharded cluster
220
- max_server_version '3.6'
352
+ max_server_version '3.6.99'
221
353
 
222
- let!(:error) do
223
- e = nil
224
- begin
225
- Person.with_session do |s|
226
- s.start_transaction
227
- Person.create!
228
- s.commit_transaction
354
+ shared_examples 'it raises a transactions not supported error' do
355
+ it do
356
+ expect(Person.count).to eq(0)
357
+ expect(error).to be_a(Mongoid::Errors::TransactionsNotSupported)
358
+ end
359
+ end
360
+
361
+ context 'using #with_session' do
362
+ let!(:error) do
363
+ capture_exception do
364
+ Person.with_session do |s|
365
+ s.start_transaction
366
+ Person.create!
367
+ s.commit_transaction
368
+ end
229
369
  end
230
- rescue => ex
231
- e = ex
232
370
  end
233
- e
371
+
372
+ include_examples 'it raises a transactions not supported error'
234
373
  end
235
374
 
236
- it 'raises a transactions not supported error' do
237
- expect(Person.count).to eq(0)
238
- expect(error).to be_a(Mongo::Error::OperationFailure)
375
+ context 'using #transaction' do
376
+ let!(:error) do
377
+ capture_exception do
378
+ Person.transaction do
379
+ Person.create!
380
+ end
381
+ end
382
+ end
383
+
384
+ include_examples 'it raises a transactions not supported error'
385
+ end
386
+ end
387
+
388
+ context 'when transactions are not supported' do
389
+ require_topology :single
390
+
391
+ it 'it raises a transactions not supported error' do
392
+ expect do
393
+ Person.transaction do
394
+ Person.create!
395
+ end
396
+ end.to raise_error(Mongoid::Errors::TransactionsNotSupported)
239
397
  end
240
398
  end
241
399
  end
@@ -263,119 +421,215 @@ describe Mongoid::Clients::Sessions do
263
421
  end
264
422
 
265
423
  context 'when the operations in the transaction block are all on the instance' do
424
+ shared_examples 'it uses a single transaction number for all operations on the class' do
425
+ it do
426
+ expect(person.reload.username).to eq('Emily')
427
+ expect(person.reload.age).to eq(80)
428
+ expect(update_events_txn_numbers.size).to eq(2)
429
+ expect(update_events_txn_numbers.uniq.size).to eq(1)
430
+ end
431
+ end
266
432
 
267
- before do
268
- person.with_session do |s|
269
- s.start_transaction
270
- person.username = 'Emily'
271
- person.save!
272
- person.age = 80
273
- person.save!
274
- s.commit_transaction
433
+ context 'using #with_session' do
434
+ before do
435
+ person.with_session do |s|
436
+ s.start_transaction
437
+ person.username = 'Emily'
438
+ person.save!
439
+ person.age = 80
440
+ person.save!
441
+ s.commit_transaction
442
+ end
275
443
  end
444
+
445
+ include_examples 'it uses a single transaction number for all operations on the class'
276
446
  end
277
447
 
278
- it 'uses a single transaction number for all operations on the class' do
279
- expect(person.reload.username).to eq('Emily')
280
- expect(person.reload.age).to eq(80)
281
- expect(update_events_txn_numbers.size).to eq(2)
282
- expect(update_events_txn_numbers.uniq.size).to eq(1)
448
+ context 'using #transaction' do
449
+ before do
450
+ person.transaction do
451
+ person.username = 'Emily'
452
+ person.save!
453
+ person.age = 80
454
+ person.save!
455
+ end
456
+ end
457
+
458
+ include_examples 'it uses a single transaction number for all operations on the class'
283
459
  end
284
460
  end
285
461
 
286
462
  context 'when the operations in the transaction block are also on another class' do
287
463
 
288
464
  context 'when the other class uses the same client' do
465
+ shared_examples 'it uses a single transaction number for all operations on the class' do
466
+ it do
467
+ expect(person.reload.username).to eq('Emily')
468
+ expect(Post.with(client: :other) { Post.count }).to be(1)
469
+ expect(update_events_txn_numbers.size).to eq(3) # person update, counter cache, post assignment
470
+ expect(update_events_txn_numbers.uniq.size).to eq(1) # person update, counter cache, post assignment
471
+ expect(insert_events_txn_numbers.size).to eq(2)
472
+ expect(insert_events_txn_numbers.uniq.size).to eq(1)
473
+ expect(update_events_txn_numbers.uniq).to eq(insert_events_txn_numbers.uniq)
474
+ end
475
+ end
289
476
 
290
- before do
291
- Post.with(client: :other) do
292
- person.with_session do |s|
293
- s.start_transaction
294
- person.username = 'Emily'
295
- person.save!
296
- person.posts << Post.create!
297
- s.commit_transaction
477
+ context 'using #with_session' do
478
+ before do
479
+ Post.with(client: :other) do
480
+ person.with_session do |s|
481
+ s.start_transaction
482
+ person.username = 'Emily'
483
+ person.save!
484
+ person.posts << Post.create!
485
+ s.commit_transaction
486
+ end
298
487
  end
299
488
  end
489
+
490
+ include_examples 'it uses a single transaction number for all operations on the class'
300
491
  end
301
492
 
302
- it 'uses a single transaction number for all operations on the class' do
303
- expect(person.reload.username).to eq('Emily')
304
- expect(Post.with(client: :other) { Post.count }).to be(1)
305
- expect(update_events_txn_numbers.size).to eq(3) # person update, counter cache, post assignment
306
- expect(update_events_txn_numbers.uniq.size).to eq(1) # person update, counter cache, post assignment
307
- expect(insert_events_txn_numbers.size).to eq(2)
308
- expect(insert_events_txn_numbers.uniq.size).to eq(1)
309
- expect(update_events_txn_numbers.uniq).to eq(insert_events_txn_numbers.uniq)
493
+ context 'using #transaction' do
494
+ before do
495
+ Post.with(client: :other) do
496
+ person.transaction do
497
+ person.username = 'Emily'
498
+ person.save!
499
+ person.posts << Post.create!
500
+ end
501
+ end
502
+ end
503
+
504
+ include_examples 'it uses a single transaction number for all operations on the class'
310
505
  end
311
506
  end
312
507
 
313
508
  context 'when the other class uses a different client' do
509
+ shared_examples 'does not abort the transaction' do
510
+ it 'raises an error' do
511
+ expect(error).to be_nil
512
+ end
314
513
 
315
- let!(:error) do
316
- e = nil
317
- begin
318
- person.with_session do |s|
319
- s.start_transaction
320
- person.username = 'Emily'
321
- person.save!
322
- person.posts << Post.create!
323
- s.commit_transaction
324
- end
325
- rescue => ex
326
- e = ex
514
+ it 'did not abort the transaction' do
515
+ expect(person.reload.username).to eq('Emily')
516
+ expect(Post.count).to be(1)
517
+ expect(update_events_txn_numbers.size).to eq(2)
518
+ expect(insert_events_txn_numbers.size).to eq(1)
327
519
  end
328
- e
329
520
  end
330
521
 
331
- it 'raises an error' do
332
- expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
522
+ context 'using #with_session' do
523
+ let!(:error) do
524
+ capture_exception do
525
+ person.with_session do |s|
526
+ s.start_transaction
527
+ person.username = 'Emily'
528
+ person.save!
529
+ person.posts << Post.create!
530
+ s.commit_transaction
531
+ end
532
+ end
533
+ end
534
+
535
+ include_examples 'does not abort the transaction'
333
536
  end
334
537
 
335
- it 'aborted the transction' do
336
- expect(person.reload.username).not_to eq('Emily')
337
- expect(Post.count).to be(0)
338
- expect(update_events_txn_numbers.size).to eq(1)
339
- expect(insert_events_txn_numbers.size).to eq(1)
538
+ context 'using #transaction' do
539
+ let!(:error) do
540
+ capture_exception do
541
+ person.transaction do
542
+ person.username = 'Emily'
543
+ person.save!
544
+ person.posts << Post.create!
545
+ end
546
+ rescue => ex
547
+ end
548
+ end
549
+
550
+ include_examples 'does not abort the transaction'
340
551
  end
341
552
  end
342
553
 
343
554
  context 'when transactions are nested' do
344
-
345
- let!(:error) do
346
- e = nil
347
- begin
348
- person.with_session do |s|
349
- s.start_transaction
350
- s.start_transaction
351
- person.username = 'Emily'
352
- person.save!
353
- person.posts << Post.create!
354
- s.commit_transaction
555
+ context 'use #with_session' do
556
+ let!(:error) do
557
+ capture_exception do
558
+ person.with_session do |s|
559
+ s.start_transaction
560
+ s.start_transaction
561
+ person.username = 'Emily'
562
+ person.save!
563
+ person.posts << Post.create!
564
+ s.commit_transaction
565
+ end
355
566
  end
356
- rescue => ex
357
- e = ex
358
567
  end
359
- e
568
+
569
+ it 'raises an error' do
570
+ expect(error).to be_a(Mongo::Error::InvalidTransactionOperation)
571
+ end
572
+
573
+ it 'does not execute any operations' do
574
+ expect(person.reload.username).not_to eq('Emily')
575
+ expect(Post.count).to be(0)
576
+ expect(update_events).to be_empty
577
+ end
360
578
  end
361
579
 
362
- it 'raises an error' do
363
- expect(error).to be_a(Mongo::Error::InvalidTransactionOperation)
580
+ context 'use #transaction' do
581
+ let!(:error) do
582
+ capture_exception do
583
+ person.transaction do
584
+ person.transaction do
585
+ person.username = 'Emily'
586
+ person.save!
587
+ person.posts << Post.create!
588
+ end
589
+ end
590
+ end
591
+ end
592
+
593
+ it 'raises an error' do
594
+ expect(error).to be_a(Mongoid::Errors::InvalidTransactionNesting)
595
+ end
596
+
597
+ it 'does not execute any operations' do
598
+ expect(person.reload.username).not_to eq('Emily')
599
+ expect(Post.count).to be(0)
600
+ expect(update_events).to be_empty
601
+ end
364
602
  end
365
603
 
366
- it 'does not execute any operations' do
367
- expect(person.reload.username).not_to eq('Emily')
368
- expect(Post.count).to be(0)
369
- expect(update_events).to be_empty
604
+ end
605
+ end
606
+
607
+ context 'when Mongoid::Errors:Rollback raised' do
608
+ let!(:error) do
609
+ capture_exception do
610
+ person.transaction do
611
+ person.username = 'John'
612
+ person.save!
613
+ raise Mongoid::Errors::Rollback
614
+ end
370
615
  end
371
616
  end
617
+
618
+ it 'does not bass on the exception' do
619
+ expect(error).to be_nil
620
+ end
621
+
622
+ it 'aborts the transaction' do
623
+ expect(other_events.count { |e| e.command_name == 'abortTransaction'}).to be(1)
624
+ expect(other_events.count { |e| e.command_name == 'commitTransaction'}).to be(0)
625
+ end
372
626
  end
373
627
  end
374
628
 
375
629
  context 'when sessions are supported but transactions are not' do
376
630
  min_server_version '3.6'
377
631
  # Could also test 4.0 in sharded cluster
378
- max_server_version '3.6'
632
+ max_server_version '3.6.99'
379
633
 
380
634
  around do |example|
381
635
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
@@ -391,24 +645,543 @@ describe Mongoid::Clients::Sessions do
391
645
  end
392
646
  end
393
647
 
394
- let!(:error) do
395
- e = nil
396
- begin
397
- person.with_session do |s|
398
- s.start_transaction
399
- person.username = 'Emily'
400
- person.save!
401
- s.commit_transaction
648
+ context 'using #with_session' do
649
+ let!(:error) do
650
+ capture_exception do
651
+ person.with_session do |s|
652
+ s.start_transaction
653
+ person.username = 'Emily'
654
+ person.save!
655
+ s.commit_transaction
656
+ end
657
+ end
658
+ end
659
+
660
+ it 'raises a transactions not supported error' do
661
+ expect(person.reload.username).not_to be('Emily')
662
+ expect(error).to be_a(Mongoid::Errors::TransactionsNotSupported)
663
+ end
664
+ end
665
+
666
+ context 'using #transaction' do
667
+ let!(:error) do
668
+ capture_exception do
669
+ person.transaction do
670
+ person.username = 'Emily'
671
+ person.save!
672
+ end
673
+ end
674
+ end
675
+
676
+ it 'raises a transactions not supported error' do
677
+ expect(person.reload.username).not_to be('Emily')
678
+ expect(error).to be_a(Mongoid::Errors::TransactionsNotSupported)
679
+ end
680
+ end
681
+ end
682
+
683
+ context 'when transactions are not supported' do
684
+ require_topology :single
685
+
686
+ it 'it raises a transactions not supported error' do
687
+ expect do
688
+ Person.transaction do
689
+ Person.create!
690
+ end
691
+ end.to raise_error(Mongoid::Errors::TransactionsNotSupported)
692
+ end
693
+ end
694
+ end
695
+
696
+ context 'when a transaction is used on Mongoid module' do
697
+ let(:subscriber) do
698
+ Mongoid::Clients.with_name(:default).send(:monitoring).subscribers['Command'].find do |s|
699
+ s.is_a?(EventSubscriber)
700
+ end
701
+ end
702
+
703
+ before do
704
+ Mongoid::Clients.with_name(:default).database.collections.each(&:drop)
705
+ Person.collection.create
706
+ Account.collection.create
707
+ Mongoid::Clients.with_name(:default).subscribe(Mongo::Monitoring::COMMAND, EventSubscriber.new)
708
+ subscriber.clear_events!
709
+ end
710
+
711
+ after do
712
+ Mongoid::Clients.with_name(:default).database.collections.each(&:drop)
713
+ end
714
+
715
+ context 'when transactions are supported' do
716
+ require_transaction_support
717
+
718
+ context 'when no error raised' do
719
+ before do
720
+ Mongoid.transaction do
721
+ Person.create!
402
722
  end
403
- rescue => ex
404
- e = ex
405
723
  end
406
- e
724
+
725
+ it 'commits the transacrion' do
726
+ expect(other_events.count { |e| e.command_name == 'abortTransaction'}).to be(0)
727
+ expect(other_events.count { |e| e.command_name == 'commitTransaction'}).to be(1)
728
+ end
729
+
730
+ it 'executes the commands inside the transaction' do
731
+ expect(Person.count).to be(1)
732
+ end
407
733
  end
408
734
 
409
- it 'raises a sessions not supported error' do
410
- expect(person.reload.username).not_to be('Emily')
411
- expect(error).to be_a(Mongo::Error::OperationFailure)
735
+ context 'When an error raised' do
736
+ let!(:error) do
737
+ capture_exception do
738
+ Mongoid.transaction do
739
+ Person.create!
740
+ Account.create!
741
+ end
742
+ end
743
+ end
744
+
745
+ it 'aborts the transaction' do
746
+ expect(other_events.count { |e| e.command_name == 'abortTransaction'}).to be(1)
747
+ expect(other_events.count { |e| e.command_name == 'commitTransaction'}).to be(0)
748
+ end
749
+
750
+ it 'passes on the error' do
751
+ expect(error).to be_a(Mongoid::Errors::Validations)
752
+ end
753
+
754
+ it 'reverts changes' do
755
+ expect(Account.count).to be(0)
756
+ expect(Person.count).to be(0)
757
+ end
758
+ end
759
+ end
760
+ end
761
+
762
+ context 'callbacks' do
763
+ shared_examples 'commit callbacks are called' do
764
+ it 'calls after_commit once' do
765
+ expect(subject.after_commit_counter.value).to eq(1)
766
+ end
767
+
768
+ it 'does not call after_rollback' do
769
+ expect(subject.after_rollback_counter.value).to eq(0)
770
+ end
771
+ end
772
+
773
+ shared_examples 'rollback callbacks are called' do
774
+ it 'does not call after_commit' do
775
+ expect(subject.after_commit_counter.value).to eq(0)
776
+ end
777
+
778
+ it 'calls after_rollback once' do
779
+ expect(subject.after_rollback_counter.value).to eq(1)
780
+ end
781
+ end
782
+
783
+ context 'with explicit transaction' do
784
+ require_transaction_support
785
+
786
+ before do
787
+ Mongoid::Clients.with_name(:default).database.collections.each(&:drop)
788
+ TransactionsSpecPerson.collection.create
789
+ TransactionsSpecPersonWithOnCreate.collection.create
790
+ TransactionsSpecPersonWithOnUpdate.collection.create
791
+ TransactionsSpecPersonWithOnDestroy.collection.create
792
+ TransactionSpecRaisesBeforeSave.collection.create
793
+ TransactionSpecRaisesAfterSave.collection.create
794
+ end
795
+
796
+ context 'when commit the transaction' do
797
+ context 'create' do
798
+ context 'without :on option' do
799
+ let!(:subject) do
800
+ person = nil
801
+ TransactionsSpecPerson.transaction do
802
+ person = TransactionsSpecPerson.create!(name: 'James Bond')
803
+ end
804
+ person
805
+ end
806
+
807
+ it_behaves_like 'commit callbacks are called'
808
+ end
809
+
810
+ context 'when callback has :on option' do
811
+ let!(:subject) do
812
+ person = nil
813
+ TransactionsSpecPersonWithOnCreate.transaction do
814
+ person = TransactionsSpecPersonWithOnCreate.create!(name: 'James Bond')
815
+ end
816
+ person
817
+ end
818
+
819
+ it_behaves_like 'commit callbacks are called'
820
+ end
821
+ end
822
+
823
+ context 'save' do
824
+ context 'without :on option' do
825
+ let(:subject) do
826
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |subject|
827
+ subject.after_commit_counter.reset
828
+ subject.after_rollback_counter.reset
829
+ end
830
+ end
831
+
832
+ context 'when modified once' do
833
+ before do
834
+ subject.transaction do
835
+ subject.name = 'Austin Powers'
836
+ subject.save!
837
+ end
838
+ end
839
+
840
+ it_behaves_like 'commit callbacks are called'
841
+ end
842
+
843
+ context 'when modified multiple times' do
844
+ before do
845
+ subject.transaction do
846
+ subject.name = 'Austin Powers'
847
+ subject.save!
848
+ subject.name = 'Jason Bourne'
849
+ subject.save!
850
+ end
851
+ end
852
+
853
+ it_behaves_like 'commit callbacks are called'
854
+ end
855
+ end
856
+
857
+ context 'with :on option' do
858
+ let(:subject) do
859
+ TransactionsSpecPersonWithOnUpdate.create!(name: 'James Bond').tap do |subject|
860
+ subject.after_commit_counter.reset
861
+ subject.after_rollback_counter.reset
862
+ end
863
+ end
864
+
865
+ context 'when modified once' do
866
+ before do
867
+ subject.transaction do
868
+ subject.name = 'Austin Powers'
869
+ subject.save!
870
+ end
871
+ end
872
+
873
+ it_behaves_like 'commit callbacks are called'
874
+ end
875
+
876
+ context 'when modified multiple times' do
877
+ before do
878
+ subject.transaction do
879
+ subject.name = 'Austin Powers'
880
+ subject.save!
881
+ subject.name = 'Jason Bourne'
882
+ subject.save!
883
+ end
884
+ end
885
+
886
+ it_behaves_like 'commit callbacks are called'
887
+ end
888
+ end
889
+ end
890
+
891
+ context 'update_attributes' do
892
+ context 'without :on option' do
893
+ let(:subject) do
894
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |subject|
895
+ subject.after_commit_counter.reset
896
+ subject.after_rollback_counter.reset
897
+ end
898
+ end
899
+
900
+ before do
901
+ subject.transaction do
902
+ subject.update_attributes!(name: 'Austin Powers')
903
+ end
904
+ end
905
+
906
+ it_behaves_like 'commit callbacks are called'
907
+ end
908
+
909
+ context 'when callback has on option' do
910
+ let(:subject) do
911
+ TransactionsSpecPersonWithOnUpdate.create!(name: 'Jason Bourne')
912
+ end
913
+
914
+ before do
915
+ TransactionsSpecPersonWithOnUpdate.transaction do
916
+ subject.update_attributes!(name: 'Foma Kiniaev')
917
+ end
918
+ end
919
+
920
+ it_behaves_like 'commit callbacks are called'
921
+ end
922
+ end
923
+
924
+ context 'destroy' do
925
+ context 'without :on option' do
926
+ let(:after_commit_counter) do
927
+ TransactionsSpecCounter.new
928
+ end
929
+
930
+ let(:after_rollback_counter) do
931
+ TransactionsSpecCounter.new
932
+ end
933
+
934
+ let(:subject) do
935
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |p|
936
+ p.after_commit_counter = after_commit_counter
937
+ p.after_rollback_counter = after_rollback_counter
938
+ end
939
+ end
940
+
941
+ before do
942
+ subject.transaction do
943
+ subject.destroy
944
+ end
945
+ end
946
+
947
+ it_behaves_like 'commit callbacks are called'
948
+ end
949
+
950
+ context 'with :on option' do
951
+ let(:after_commit_counter) do
952
+ TransactionsSpecCounter.new
953
+ end
954
+
955
+ let(:after_rollback_counter) do
956
+ TransactionsSpecCounter.new
957
+ end
958
+
959
+ let(:subject) do
960
+ TransactionsSpecPersonWithOnDestroy.create!(name: 'James Bond').tap do |p|
961
+ p.after_commit_counter = after_commit_counter
962
+ p.after_rollback_counter = after_rollback_counter
963
+ end
964
+ end
965
+
966
+ before do
967
+ subject.transaction do
968
+ subject.destroy
969
+ end
970
+ end
971
+
972
+ it_behaves_like 'commit callbacks are called'
973
+ end
974
+ end
975
+ end
976
+
977
+ context 'when rollback the transaction' do
978
+ context 'create' do
979
+ context 'without :on option' do
980
+ let!(:subject) do
981
+ person = nil
982
+ TransactionsSpecPerson.transaction do
983
+ person = TransactionsSpecPerson.create!(name: 'James Bond')
984
+ raise Mongoid::Errors::Rollback
985
+ end
986
+ person
987
+ end
988
+
989
+ it_behaves_like 'rollback callbacks are called'
990
+ end
991
+
992
+ context 'with :on option' do
993
+ let!(:subject) do
994
+ person = nil
995
+ TransactionsSpecPersonWithOnCreate.transaction do
996
+ person = TransactionsSpecPersonWithOnCreate.create!(name: 'James Bond')
997
+ raise Mongoid::Errors::Rollback
998
+ end
999
+ person
1000
+ end
1001
+
1002
+ it_behaves_like 'rollback callbacks are called'
1003
+ end
1004
+ end
1005
+
1006
+ context 'save' do
1007
+ let(:subject) do
1008
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |subject|
1009
+ subject.after_commit_counter.reset
1010
+ subject.after_rollback_counter.reset
1011
+ end
1012
+ end
1013
+
1014
+ context 'when modified once' do
1015
+ before do
1016
+ begin
1017
+ subject.transaction do
1018
+ subject.name = 'Austin Powers'
1019
+ subject.save!
1020
+ raise 'Something went wrong'
1021
+ end
1022
+ rescue RuntimeError
1023
+ end
1024
+ end
1025
+
1026
+ it_behaves_like 'rollback callbacks are called'
1027
+ end
1028
+
1029
+ context 'when modified multiple times' do
1030
+ before do
1031
+ subject.transaction do
1032
+ subject.name = 'Austin Powers'
1033
+ subject.save!
1034
+ subject.name = 'Jason Bourne'
1035
+ subject.save!
1036
+ raise Mongoid::Errors::Rollback
1037
+ end
1038
+ end
1039
+
1040
+ it_behaves_like 'rollback callbacks are called'
1041
+ end
1042
+
1043
+ context 'when exception is raised in a callback' do
1044
+ context 'in before_save' do
1045
+ let(:subject) do
1046
+ TransactionSpecRaisesBeforeSave.new
1047
+ end
1048
+
1049
+ before do
1050
+ begin
1051
+ subject.transaction do
1052
+ subject.save!
1053
+ end
1054
+ rescue RuntimeError
1055
+ end
1056
+ end
1057
+
1058
+ it 'does not call any transaction callbacks' do
1059
+ # This is according to Rails behavior
1060
+ expect(subject.after_commit_counter.value).to eq(0)
1061
+ expect(subject.after_rollback_counter.value).to eq(0)
1062
+ end
1063
+ end
1064
+
1065
+ context 'in after_save' do
1066
+ let(:subject) do
1067
+ TransactionSpecRaisesAfterSave.new
1068
+ end
1069
+
1070
+ before do
1071
+ begin
1072
+ subject.transaction do
1073
+ subject.save!
1074
+ end
1075
+ rescue RuntimeError
1076
+ end
1077
+ end
1078
+
1079
+ it_behaves_like 'rollback callbacks are called'
1080
+ end
1081
+ end
1082
+ end
1083
+
1084
+ context 'update_attributes' do
1085
+ let(:subject) do
1086
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |p|
1087
+ p.after_commit_counter.reset
1088
+ p.after_rollback_counter.reset
1089
+ end
1090
+ end
1091
+
1092
+ before do
1093
+ subject.transaction do
1094
+ subject.update_attributes!(name: 'Austin Powers')
1095
+ raise Mongoid::Errors::Rollback
1096
+ end
1097
+ end
1098
+
1099
+ it_behaves_like 'rollback callbacks are called'
1100
+ end
1101
+
1102
+ context 'destroy' do
1103
+ let(:after_commit_counter) do
1104
+ TransactionsSpecCounter.new
1105
+ end
1106
+
1107
+ let(:after_rollback_counter) do
1108
+ TransactionsSpecCounter.new
1109
+ end
1110
+
1111
+ let(:subject) do
1112
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |p|
1113
+ p.after_commit_counter = after_commit_counter
1114
+ p.after_rollback_counter = after_rollback_counter
1115
+ end
1116
+ end
1117
+
1118
+ before do
1119
+ subject.transaction do
1120
+ subject.destroy
1121
+ raise Mongoid::Errors::Rollback
1122
+ end
1123
+ end
1124
+
1125
+ it_behaves_like 'rollback callbacks are called'
1126
+ end
1127
+ end
1128
+ end
1129
+
1130
+ context 'without explicit transaction' do
1131
+ context 'when operation is successful' do
1132
+ context 'create' do
1133
+ let!(:subject) do
1134
+ TransactionsSpecPerson.create!(name: 'James Bond')
1135
+ end
1136
+
1137
+ it_behaves_like 'commit callbacks are called'
1138
+ end
1139
+
1140
+ context 'save' do
1141
+ let(:subject) do
1142
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |person|
1143
+ person.after_commit_counter.reset
1144
+ person.after_rollback_counter.reset
1145
+ end
1146
+ end
1147
+
1148
+ before do
1149
+ subject.name = 'Jason Bourne'
1150
+ subject.save!
1151
+ end
1152
+
1153
+ it_behaves_like 'commit callbacks are called'
1154
+ end
1155
+
1156
+ context 'save' do
1157
+ let(:subject) do
1158
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |person|
1159
+ person.after_commit_counter.reset
1160
+ person.after_rollback_counter.reset
1161
+ end
1162
+ end
1163
+
1164
+ before do
1165
+ subject.update_attributes!(name: 'Jason Bourne')
1166
+ end
1167
+
1168
+ it_behaves_like 'commit callbacks are called'
1169
+ end
1170
+
1171
+ context 'destroy' do
1172
+ let(:subject) do
1173
+ TransactionsSpecPerson.create!(name: 'James Bond').tap do |person|
1174
+ person.after_commit_counter.reset
1175
+ person.after_rollback_counter.reset
1176
+ end
1177
+ end
1178
+
1179
+ before do
1180
+ subject.destroy
1181
+ end
1182
+
1183
+ it_behaves_like 'commit callbacks are called'
1184
+ end
412
1185
  end
413
1186
  end
414
1187
  end