mongoid 7.0.0 → 7.4.0

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