mongoid 7.0.13 → 8.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1089) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/README.md +32 -19
  5. data/Rakefile +43 -0
  6. data/lib/config/locales/en.yml +178 -95
  7. data/lib/mongoid/association/accessors.rb +175 -83
  8. data/lib/mongoid/association/bindable.rb +57 -28
  9. data/lib/mongoid/association/builders.rb +8 -14
  10. data/lib/mongoid/association/constrainable.rb +5 -7
  11. data/lib/mongoid/association/depending.rb +9 -18
  12. data/lib/mongoid/association/eager_loadable.rb +31 -10
  13. data/lib/mongoid/association/embedded/batchable.rb +67 -53
  14. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
  18. data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +143 -122
  22. data/lib/mongoid/association/embedded/embeds_many.rb +8 -36
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +26 -9
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +63 -29
  26. data/lib/mongoid/association/embedded/embeds_one.rb +9 -33
  27. data/lib/mongoid/association/embedded.rb +2 -0
  28. data/lib/mongoid/association/macros.rb +71 -41
  29. data/lib/mongoid/association/many.rb +25 -35
  30. data/lib/mongoid/association/marshalable.rb +3 -6
  31. data/lib/mongoid/association/nested/many.rb +22 -30
  32. data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
  33. data/lib/mongoid/association/nested/one.rb +19 -30
  34. data/lib/mongoid/association/nested.rb +3 -3
  35. data/lib/mongoid/association/one.rb +5 -12
  36. data/lib/mongoid/association/options.rb +16 -46
  37. data/lib/mongoid/association/proxy.rb +37 -38
  38. data/lib/mongoid/association/referenced/auto_save.rb +9 -14
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
  43. data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
  44. data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
  45. data/lib/mongoid/association/referenced/eager.rb +41 -40
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +105 -68
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +101 -124
  56. data/lib/mongoid/association/referenced/has_many.rb +21 -45
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
  62. data/lib/mongoid/association/referenced/has_one.rb +16 -36
  63. data/lib/mongoid/association/referenced/syncable.rb +11 -26
  64. data/lib/mongoid/association/referenced.rb +2 -0
  65. data/lib/mongoid/association/reflections.rb +7 -6
  66. data/lib/mongoid/association/relatable.rb +62 -84
  67. data/lib/mongoid/association.rb +13 -27
  68. data/lib/mongoid/atomic/modifiers.rb +29 -53
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  71. data/lib/mongoid/atomic/paths/embedded.rb +2 -3
  72. data/lib/mongoid/atomic/paths/root.rb +4 -7
  73. data/lib/mongoid/atomic/paths.rb +2 -1
  74. data/lib/mongoid/atomic.rb +45 -51
  75. data/lib/mongoid/attributes/dynamic.rb +6 -21
  76. data/lib/mongoid/attributes/nested.rb +11 -14
  77. data/lib/mongoid/attributes/processing.rb +46 -30
  78. data/lib/mongoid/attributes/projector.rb +119 -0
  79. data/lib/mongoid/attributes/readonly.rb +5 -8
  80. data/lib/mongoid/attributes.rb +80 -98
  81. data/lib/mongoid/cacheable.rb +7 -10
  82. data/lib/mongoid/changeable.rb +49 -70
  83. data/lib/mongoid/clients/factory.rb +42 -17
  84. data/lib/mongoid/clients/options.rb +15 -14
  85. data/lib/mongoid/clients/sessions.rb +4 -20
  86. data/lib/mongoid/clients/storage_options.rb +7 -12
  87. data/lib/mongoid/clients/validators/storage.rb +5 -12
  88. data/lib/mongoid/clients/validators.rb +2 -1
  89. data/lib/mongoid/clients.rb +3 -10
  90. data/lib/mongoid/composable.rb +5 -9
  91. data/lib/mongoid/config/environment.rb +30 -5
  92. data/lib/mongoid/config/options.rb +23 -23
  93. data/lib/mongoid/config/validators/client.rb +8 -23
  94. data/lib/mongoid/config/validators/option.rb +2 -3
  95. data/lib/mongoid/config/validators.rb +2 -1
  96. data/lib/mongoid/config.rb +164 -48
  97. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  98. data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
  99. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  100. data/lib/mongoid/contextual/aggregable.rb +17 -0
  101. data/lib/mongoid/contextual/atomic.rb +29 -31
  102. data/lib/mongoid/contextual/command.rb +2 -5
  103. data/lib/mongoid/contextual/geo_near.rb +13 -44
  104. data/lib/mongoid/contextual/map_reduce.rb +7 -35
  105. data/lib/mongoid/contextual/memory.rb +187 -81
  106. data/lib/mongoid/contextual/mongo.rb +360 -239
  107. data/lib/mongoid/contextual/none.rb +109 -31
  108. data/lib/mongoid/contextual/queryable.rb +3 -4
  109. data/lib/mongoid/contextual.rb +9 -11
  110. data/lib/mongoid/copyable.rb +42 -17
  111. data/lib/mongoid/criteria/findable.rb +19 -19
  112. data/lib/mongoid/criteria/includable.rb +30 -33
  113. data/lib/mongoid/criteria/inspectable.rb +2 -3
  114. data/lib/mongoid/criteria/marshalable.rb +12 -7
  115. data/lib/mongoid/criteria/modifiable.rb +2 -19
  116. data/lib/mongoid/criteria/options.rb +2 -3
  117. data/lib/mongoid/criteria/permission.rb +3 -2
  118. data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
  119. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  120. data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
  121. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
  122. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
  123. data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
  124. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
  125. data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
  126. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  127. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
  128. data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
  129. data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
  130. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
  131. data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
  132. data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
  133. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
  134. data/lib/mongoid/criteria/queryable/extensions/time.rb +9 -9
  135. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  136. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  137. data/lib/mongoid/criteria/queryable/key.rb +39 -24
  138. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  139. data/lib/mongoid/criteria/queryable/mergeable.rb +200 -40
  140. data/lib/mongoid/criteria/queryable/optional.rb +10 -59
  141. data/lib/mongoid/criteria/queryable/options.rb +4 -21
  142. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  143. data/lib/mongoid/criteria/queryable/selectable.rb +417 -171
  144. data/lib/mongoid/criteria/queryable/selector.rb +127 -30
  145. data/lib/mongoid/criteria/queryable/smash.rb +42 -18
  146. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  147. data/lib/mongoid/criteria/queryable.rb +18 -15
  148. data/lib/mongoid/criteria/scopable.rb +29 -21
  149. data/lib/mongoid/criteria/translator.rb +45 -0
  150. data/lib/mongoid/criteria.rb +95 -107
  151. data/lib/mongoid/deprecable.rb +37 -0
  152. data/lib/mongoid/deprecation.rb +25 -0
  153. data/lib/mongoid/document.rb +148 -97
  154. data/lib/mongoid/equality.rb +35 -18
  155. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  156. data/lib/mongoid/errors/callback.rb +2 -3
  157. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  158. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  159. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  160. data/lib/mongoid/errors/document_not_found.rb +35 -21
  161. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  162. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  163. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  164. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  165. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  166. data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
  167. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  168. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  169. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  170. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  171. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  172. data/lib/mongoid/errors/invalid_field.rb +8 -7
  173. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  174. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  175. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  176. data/lib/mongoid/errors/invalid_find.rb +2 -3
  177. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  178. data/lib/mongoid/errors/invalid_index.rb +2 -3
  179. data/lib/mongoid/errors/invalid_options.rb +4 -5
  180. data/lib/mongoid/errors/invalid_path.rb +2 -3
  181. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  182. data/lib/mongoid/errors/invalid_query.rb +40 -0
  183. data/lib/mongoid/errors/invalid_relation.rb +5 -10
  184. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  185. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  186. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  187. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  188. data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
  189. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  190. data/lib/mongoid/errors/invalid_time.rb +2 -3
  191. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  192. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  193. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  194. data/lib/mongoid/errors/mongoid_error.rb +6 -13
  195. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  196. data/lib/mongoid/errors/no_client_config.rb +4 -5
  197. data/lib/mongoid/errors/no_client_database.rb +3 -4
  198. data/lib/mongoid/errors/no_client_hosts.rb +3 -4
  199. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  200. data/lib/mongoid/errors/no_default_client.rb +3 -4
  201. data/lib/mongoid/errors/no_environment.rb +2 -3
  202. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  203. data/lib/mongoid/errors/no_metadata.rb +2 -3
  204. data/lib/mongoid/errors/no_parent.rb +2 -3
  205. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  206. data/lib/mongoid/errors/readonly_document.rb +3 -6
  207. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  208. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  209. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  210. data/lib/mongoid/errors/unknown_model.rb +2 -3
  211. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  212. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  213. data/lib/mongoid/errors/validations.rb +2 -1
  214. data/lib/mongoid/errors.rb +14 -3
  215. data/lib/mongoid/evolvable.rb +4 -5
  216. data/lib/mongoid/extensions/array.rb +37 -44
  217. data/lib/mongoid/extensions/big_decimal.rb +35 -21
  218. data/lib/mongoid/extensions/binary.rb +42 -0
  219. data/lib/mongoid/extensions/boolean.rb +10 -6
  220. data/lib/mongoid/extensions/date.rb +32 -25
  221. data/lib/mongoid/extensions/date_time.rb +5 -13
  222. data/lib/mongoid/extensions/decimal128.rb +2 -5
  223. data/lib/mongoid/extensions/false_class.rb +5 -8
  224. data/lib/mongoid/extensions/float.rb +12 -14
  225. data/lib/mongoid/extensions/hash.rb +87 -45
  226. data/lib/mongoid/extensions/integer.rb +12 -16
  227. data/lib/mongoid/extensions/module.rb +3 -4
  228. data/lib/mongoid/extensions/nil_class.rb +2 -5
  229. data/lib/mongoid/extensions/object.rb +25 -50
  230. data/lib/mongoid/extensions/object_id.rb +2 -7
  231. data/lib/mongoid/extensions/range.rb +42 -20
  232. data/lib/mongoid/extensions/regexp.rb +13 -7
  233. data/lib/mongoid/extensions/set.rb +13 -11
  234. data/lib/mongoid/extensions/string.rb +30 -61
  235. data/lib/mongoid/extensions/symbol.rb +6 -22
  236. data/lib/mongoid/extensions/time.rb +37 -23
  237. data/lib/mongoid/extensions/time_with_zone.rb +26 -9
  238. data/lib/mongoid/extensions/true_class.rb +5 -8
  239. data/lib/mongoid/extensions.rb +19 -3
  240. data/lib/mongoid/factory.rb +104 -17
  241. data/lib/mongoid/fields/foreign_key.rb +14 -26
  242. data/lib/mongoid/fields/localized.rb +11 -15
  243. data/lib/mongoid/fields/standard.rb +13 -43
  244. data/lib/mongoid/fields/validators/macro.rb +32 -20
  245. data/lib/mongoid/fields/validators.rb +2 -1
  246. data/lib/mongoid/fields.rb +328 -85
  247. data/lib/mongoid/findable.rb +90 -33
  248. data/lib/mongoid/indexable/specification.rb +5 -18
  249. data/lib/mongoid/indexable/validators/options.rb +8 -9
  250. data/lib/mongoid/indexable.rb +6 -21
  251. data/lib/mongoid/inspectable.rb +4 -11
  252. data/lib/mongoid/interceptable.rb +191 -41
  253. data/lib/mongoid/loggable.rb +13 -16
  254. data/lib/mongoid/matchable.rb +3 -154
  255. data/lib/mongoid/matcher/all.rb +22 -0
  256. data/lib/mongoid/matcher/and.rb +21 -0
  257. data/lib/mongoid/matcher/bits.rb +41 -0
  258. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  259. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  260. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  261. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  262. data/lib/mongoid/matcher/elem_match.rb +36 -0
  263. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  264. data/lib/mongoid/matcher/eq.rb +11 -0
  265. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  266. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  267. data/lib/mongoid/matcher/exists.rb +15 -0
  268. data/lib/mongoid/matcher/expression.rb +35 -0
  269. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  270. data/lib/mongoid/matcher/field_expression.rb +62 -0
  271. data/lib/mongoid/matcher/field_operator.rb +54 -0
  272. data/lib/mongoid/matcher/gt.rb +17 -0
  273. data/lib/mongoid/matcher/gte.rb +17 -0
  274. data/lib/mongoid/matcher/in.rb +25 -0
  275. data/lib/mongoid/matcher/lt.rb +17 -0
  276. data/lib/mongoid/matcher/lte.rb +17 -0
  277. data/lib/mongoid/matcher/mod.rb +17 -0
  278. data/lib/mongoid/matcher/ne.rb +16 -0
  279. data/lib/mongoid/matcher/nin.rb +11 -0
  280. data/lib/mongoid/matcher/nor.rb +25 -0
  281. data/lib/mongoid/matcher/not.rb +29 -0
  282. data/lib/mongoid/matcher/or.rb +21 -0
  283. data/lib/mongoid/matcher/regex.rb +41 -0
  284. data/lib/mongoid/matcher/size.rb +26 -0
  285. data/lib/mongoid/matcher/type.rb +99 -0
  286. data/lib/mongoid/matcher.rb +130 -0
  287. data/lib/mongoid/persistable/creatable.rb +22 -30
  288. data/lib/mongoid/persistable/deletable.rb +6 -22
  289. data/lib/mongoid/persistable/destroyable.rb +12 -11
  290. data/lib/mongoid/persistable/incrementable.rb +6 -7
  291. data/lib/mongoid/persistable/logical.rb +4 -6
  292. data/lib/mongoid/persistable/poppable.rb +3 -6
  293. data/lib/mongoid/persistable/pullable.rb +3 -8
  294. data/lib/mongoid/persistable/pushable.rb +3 -8
  295. data/lib/mongoid/persistable/renamable.rb +10 -8
  296. data/lib/mongoid/persistable/savable.rb +5 -10
  297. data/lib/mongoid/persistable/settable.rb +3 -6
  298. data/lib/mongoid/persistable/unsettable.rb +9 -9
  299. data/lib/mongoid/persistable/updatable.rb +50 -31
  300. data/lib/mongoid/persistable/upsertable.rb +5 -10
  301. data/lib/mongoid/persistable.rb +135 -40
  302. data/lib/mongoid/persistence_context.rb +85 -45
  303. data/lib/mongoid/positional.rb +2 -5
  304. data/lib/mongoid/query_cache.rb +13 -280
  305. data/lib/mongoid/railtie.rb +3 -16
  306. data/lib/mongoid/railties/controller_runtime.rb +4 -2
  307. data/lib/mongoid/railties/database.rake +9 -0
  308. data/lib/mongoid/reloadable.rb +19 -22
  309. data/lib/mongoid/scopable.rb +34 -57
  310. data/lib/mongoid/selectable.rb +8 -18
  311. data/lib/mongoid/serializable.rb +33 -34
  312. data/lib/mongoid/shardable.rb +108 -21
  313. data/lib/mongoid/stateful.rb +38 -19
  314. data/lib/mongoid/stringified_symbol.rb +52 -0
  315. data/lib/mongoid/tasks/database.rake +12 -5
  316. data/lib/mongoid/tasks/database.rb +85 -7
  317. data/lib/mongoid/threaded/lifecycle.rb +7 -26
  318. data/lib/mongoid/threaded.rb +44 -67
  319. data/lib/mongoid/timestamps/created/short.rb +2 -1
  320. data/lib/mongoid/timestamps/created.rb +4 -3
  321. data/lib/mongoid/timestamps/short.rb +2 -1
  322. data/lib/mongoid/timestamps/timeless.rb +6 -9
  323. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  324. data/lib/mongoid/timestamps/updated.rb +5 -6
  325. data/lib/mongoid/timestamps.rb +3 -2
  326. data/lib/mongoid/touchable.rb +54 -25
  327. data/lib/mongoid/traversable.rb +185 -61
  328. data/lib/mongoid/validatable/associated.rb +99 -22
  329. data/lib/mongoid/validatable/format.rb +2 -1
  330. data/lib/mongoid/validatable/length.rb +2 -1
  331. data/lib/mongoid/validatable/localizable.rb +3 -4
  332. data/lib/mongoid/validatable/macros.rb +2 -9
  333. data/lib/mongoid/validatable/presence.rb +10 -15
  334. data/lib/mongoid/validatable/queryable.rb +2 -3
  335. data/lib/mongoid/validatable/uniqueness.rb +29 -41
  336. data/lib/mongoid/validatable.rb +22 -33
  337. data/lib/mongoid/version.rb +2 -2
  338. data/lib/mongoid/warnings.rb +28 -0
  339. data/lib/mongoid.rb +34 -15
  340. data/lib/rails/generators/mongoid/config/config_generator.rb +2 -1
  341. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
  342. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  343. data/lib/rails/generators/mongoid_generator.rb +2 -1
  344. data/lib/rails/mongoid.rb +4 -5
  345. data/spec/README.md +19 -4
  346. data/spec/config/mongoid.yml +17 -0
  347. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  348. data/spec/integration/app_spec.rb +31 -27
  349. data/spec/integration/associations/belongs_to_spec.rb +20 -0
  350. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  351. data/spec/integration/associations/embedded_spec.rb +162 -55
  352. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  353. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  354. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  355. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  356. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  357. data/spec/integration/associations/has_many_spec.rb +128 -0
  358. data/spec/integration/associations/has_one_spec.rb +272 -0
  359. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  360. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  361. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  362. data/spec/integration/associations/scope_option_spec.rb +101 -0
  363. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  364. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  365. data/spec/integration/callbacks_models.rb +107 -1
  366. data/spec/integration/callbacks_spec.rb +262 -8
  367. data/spec/integration/contextual/empty_spec.rb +141 -0
  368. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  369. data/spec/integration/criteria/date_field_spec.rb +1 -2
  370. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  371. data/spec/integration/criteria/logical_spec.rb +124 -0
  372. data/spec/integration/criteria/range_spec.rb +359 -0
  373. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  374. data/spec/integration/discriminator_key_spec.rb +392 -0
  375. data/spec/integration/discriminator_value_spec.rb +206 -0
  376. data/spec/integration/document_spec.rb +30 -1
  377. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  378. data/spec/integration/i18n_fallbacks_spec.rb +73 -0
  379. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
  380. data/spec/integration/matcher_operator_data/all.yml +140 -0
  381. data/spec/integration/matcher_operator_data/and.yml +93 -0
  382. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  383. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  384. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  385. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  386. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  387. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  388. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  389. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  390. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  391. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  392. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  393. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  394. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  395. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  396. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  397. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  398. data/spec/integration/matcher_operator_data/in.yml +210 -0
  399. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  400. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  401. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  402. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  403. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  404. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  405. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  406. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  407. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  408. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  409. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  410. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  411. data/spec/integration/matcher_operator_data/not.yml +196 -0
  412. data/spec/integration/matcher_operator_data/or.yml +137 -0
  413. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  414. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  415. data/spec/integration/matcher_operator_data/size.yml +174 -0
  416. data/spec/integration/matcher_operator_data/type.yml +70 -0
  417. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  418. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  419. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  420. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  421. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  422. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  423. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  424. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  425. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  426. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  427. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  428. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  429. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  430. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  431. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  432. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  433. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  434. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  436. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  437. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  438. data/spec/integration/matcher_operator_spec.rb +122 -0
  439. data/spec/integration/matcher_spec.rb +283 -0
  440. data/spec/integration/persistence/range_field_spec.rb +350 -0
  441. data/spec/integration/server_query_spec.rb +141 -0
  442. data/spec/integration/shardable_spec.rb +148 -0
  443. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  444. data/spec/lite_spec_helper.rb +18 -6
  445. data/spec/mongoid/association/accessors_spec.rb +284 -77
  446. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  447. data/spec/mongoid/association/builders_spec.rb +3 -1
  448. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  449. data/spec/mongoid/association/counter_cache_spec.rb +35 -33
  450. data/spec/mongoid/association/depending_spec.rb +431 -338
  451. data/spec/mongoid/association/eager_spec.rb +8 -5
  452. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  453. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  454. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
  455. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
  456. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +84 -22
  457. data/spec/mongoid/association/embedded/embedded_in_spec.rb +3 -1
  458. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  459. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
  460. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +687 -173
  461. data/spec/mongoid/association/embedded/embeds_many_models.rb +174 -1
  462. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  463. data/spec/mongoid/association/embedded/embeds_many_spec.rb +71 -1
  464. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  465. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
  466. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
  467. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +2 -0
  468. data/spec/mongoid/association/embedded/embeds_one_models.rb +22 -0
  469. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  470. data/spec/mongoid/association/embedded/embeds_one_spec.rb +31 -1
  471. data/spec/mongoid/association/macros_spec.rb +11 -9
  472. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  473. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  474. data/spec/mongoid/association/options_spec.rb +2 -0
  475. data/spec/mongoid/association/polymorphic_spec.rb +2 -0
  476. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
  477. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
  478. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
  479. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
  480. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  481. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  482. data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -3
  483. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  484. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  485. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +46 -2
  486. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +25 -5
  487. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +418 -361
  488. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +68 -2
  489. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  490. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +81 -4
  491. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  492. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
  493. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  494. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +314 -133
  495. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +848 -451
  496. data/spec/mongoid/association/referenced/has_many_models.rb +61 -1
  497. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  498. data/spec/mongoid/association/referenced/has_many_spec.rb +48 -0
  499. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  500. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
  501. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  502. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
  503. data/spec/mongoid/association/referenced/has_one_models.rb +65 -0
  504. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  505. data/spec/mongoid/association/referenced/has_one_spec.rb +24 -1
  506. data/spec/mongoid/association/reflections_spec.rb +2 -0
  507. data/spec/mongoid/association/syncable_spec.rb +47 -31
  508. data/spec/mongoid/association_spec.rb +2 -0
  509. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  510. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  511. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  512. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  513. data/spec/mongoid/atomic/paths_spec.rb +66 -26
  514. data/spec/mongoid/atomic_spec.rb +53 -6
  515. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  516. data/spec/mongoid/attributes/nested_spec.rb +149 -78
  517. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  518. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  519. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  520. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  521. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  522. data/spec/mongoid/attributes_spec.rb +683 -65
  523. data/spec/mongoid/cacheable_spec.rb +6 -4
  524. data/spec/mongoid/changeable_spec.rb +185 -43
  525. data/spec/mongoid/clients/factory_spec.rb +128 -28
  526. data/spec/mongoid/clients/options_spec.rb +45 -26
  527. data/spec/mongoid/clients/sessions_spec.rb +25 -66
  528. data/spec/mongoid/clients/transactions_spec.rb +54 -29
  529. data/spec/mongoid/clients_spec.rb +65 -8
  530. data/spec/mongoid/composable_spec.rb +2 -0
  531. data/spec/mongoid/config/environment_spec.rb +126 -8
  532. data/spec/mongoid/config/options_spec.rb +22 -3
  533. data/spec/mongoid/config_spec.rb +377 -1
  534. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  535. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  536. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  537. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  538. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  539. data/spec/mongoid/contextual/atomic_spec.rb +205 -67
  540. data/spec/mongoid/contextual/geo_near_spec.rb +20 -18
  541. data/spec/mongoid/contextual/map_reduce_spec.rb +6 -18
  542. data/spec/mongoid/contextual/memory_spec.rb +1360 -91
  543. data/spec/mongoid/contextual/mongo_spec.rb +1871 -544
  544. data/spec/mongoid/contextual/none_spec.rb +39 -73
  545. data/spec/mongoid/copyable_spec.rb +657 -26
  546. data/spec/mongoid/copyable_spec_models.rb +30 -0
  547. data/spec/mongoid/criteria/findable_spec.rb +161 -228
  548. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  549. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  550. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  551. data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
  552. data/spec/mongoid/criteria/modifiable_spec.rb +43 -40
  553. data/spec/mongoid/criteria/options_spec.rb +2 -0
  554. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  555. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  556. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
  557. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
  558. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
  559. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  560. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
  561. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
  562. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
  563. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  564. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
  565. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  566. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  567. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  568. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  569. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  570. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  571. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +2 -0
  572. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  573. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +2 -59
  574. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
  575. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +34 -16
  576. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +13 -0
  577. data/spec/mongoid/criteria/queryable/key_spec.rb +2 -0
  578. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  579. data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
  580. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
  581. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  582. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  583. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1643 -286
  584. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  585. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1191 -2752
  586. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  587. data/spec/mongoid/criteria/queryable/selector_spec.rb +91 -4
  588. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  589. data/spec/mongoid/criteria/queryable/storable_spec.rb +298 -0
  590. data/spec/mongoid/criteria/scopable_spec.rb +129 -0
  591. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  592. data/spec/mongoid/criteria_projection_spec.rb +409 -0
  593. data/spec/mongoid/criteria_spec.rb +1322 -1723
  594. data/spec/mongoid/document_fields_spec.rb +179 -5
  595. data/spec/mongoid/document_persistence_context_spec.rb +0 -1
  596. data/spec/mongoid/document_query_spec.rb +89 -0
  597. data/spec/mongoid/document_spec.rb +153 -87
  598. data/spec/mongoid/equality_spec.rb +144 -41
  599. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  600. data/spec/mongoid/errors/callback_spec.rb +2 -0
  601. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  602. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  603. data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
  604. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  605. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
  606. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  607. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  608. data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
  609. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  610. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  611. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  612. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  613. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  614. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  615. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  616. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  617. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  618. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  619. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  620. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  621. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  622. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  623. data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
  624. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  625. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  626. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  627. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  628. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  629. data/spec/mongoid/errors/no_environment_spec.rb +5 -3
  630. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  631. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  632. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  633. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  634. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  635. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  636. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
  637. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  638. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  639. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  640. data/spec/mongoid/errors/validations_spec.rb +2 -0
  641. data/spec/mongoid/extensions/array_spec.rb +41 -45
  642. data/spec/mongoid/extensions/big_decimal_spec.rb +714 -212
  643. data/spec/mongoid/extensions/binary_spec.rb +46 -9
  644. data/spec/mongoid/extensions/boolean_spec.rb +70 -82
  645. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  646. data/spec/mongoid/extensions/date_spec.rb +58 -140
  647. data/spec/mongoid/extensions/date_time_spec.rb +32 -69
  648. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  649. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  650. data/spec/mongoid/extensions/float_spec.rb +66 -73
  651. data/spec/mongoid/extensions/hash_spec.rb +138 -3
  652. data/spec/mongoid/extensions/integer_spec.rb +61 -63
  653. data/spec/mongoid/extensions/module_spec.rb +2 -0
  654. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  655. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  656. data/spec/mongoid/extensions/object_spec.rb +13 -24
  657. data/spec/mongoid/extensions/range_spec.rb +257 -54
  658. data/spec/mongoid/extensions/regexp_spec.rb +60 -33
  659. data/spec/mongoid/extensions/set_spec.rb +108 -0
  660. data/spec/mongoid/extensions/string_spec.rb +111 -50
  661. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  662. data/spec/mongoid/extensions/symbol_spec.rb +20 -25
  663. data/spec/mongoid/extensions/time_spec.rb +663 -66
  664. data/spec/mongoid/extensions/time_with_zone_spec.rb +50 -31
  665. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  666. data/spec/mongoid/extensions_spec.rb +16 -2
  667. data/spec/mongoid/factory_spec.rb +347 -27
  668. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  669. data/spec/mongoid/fields/localized_spec.rb +43 -16
  670. data/spec/mongoid/fields/standard_spec.rb +2 -0
  671. data/spec/mongoid/fields_spec.rb +776 -80
  672. data/spec/mongoid/findable_spec.rb +133 -34
  673. data/spec/mongoid/indexable/specification_spec.rb +4 -2
  674. data/spec/mongoid/indexable_spec.rb +65 -18
  675. data/spec/mongoid/inspectable_spec.rb +39 -2
  676. data/spec/mongoid/interceptable_spec.rb +955 -103
  677. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  678. data/spec/mongoid/loggable_spec.rb +2 -0
  679. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  680. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  681. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  682. data/spec/mongoid/mongoizable_spec.rb +285 -0
  683. data/spec/mongoid/persistable/creatable_spec.rb +114 -29
  684. data/spec/mongoid/persistable/deletable_spec.rb +274 -12
  685. data/spec/mongoid/persistable/destroyable_spec.rb +202 -12
  686. data/spec/mongoid/persistable/incrementable_spec.rb +23 -7
  687. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  688. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  689. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  690. data/spec/mongoid/persistable/pushable_spec.rb +36 -6
  691. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  692. data/spec/mongoid/persistable/savable_spec.rb +188 -25
  693. data/spec/mongoid/persistable/settable_spec.rb +24 -8
  694. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  695. data/spec/mongoid/persistable/updatable_spec.rb +45 -23
  696. data/spec/mongoid/persistable/upsertable_spec.rb +18 -2
  697. data/spec/mongoid/persistable_spec.rb +85 -9
  698. data/spec/mongoid/persistence_context_spec.rb +52 -1
  699. data/spec/mongoid/positional_spec.rb +2 -0
  700. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  701. data/spec/mongoid/query_cache_spec.rb +339 -87
  702. data/spec/mongoid/relations/proxy_spec.rb +8 -6
  703. data/spec/mongoid/reloadable_spec.rb +357 -22
  704. data/spec/mongoid/scopable_spec.rb +121 -37
  705. data/spec/mongoid/selectable_spec.rb +8 -6
  706. data/spec/mongoid/serializable_spec.rb +160 -29
  707. data/spec/mongoid/shardable_models.rb +75 -0
  708. data/spec/mongoid/shardable_spec.rb +239 -34
  709. data/spec/mongoid/stateful_spec.rb +31 -1
  710. data/spec/mongoid/tasks/database_rake_spec.rb +2 -0
  711. data/spec/mongoid/tasks/database_spec.rb +2 -0
  712. data/spec/mongoid/threaded_spec.rb +4 -2
  713. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  714. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  715. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  716. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  717. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  718. data/spec/mongoid/timestamps_spec.rb +398 -6
  719. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  720. data/spec/mongoid/touchable_spec.rb +296 -33
  721. data/spec/mongoid/touchable_spec_models.rb +57 -0
  722. data/spec/mongoid/traversable_spec.rb +1160 -1
  723. data/spec/mongoid/validatable/associated_spec.rb +15 -30
  724. data/spec/mongoid/validatable/format_spec.rb +2 -0
  725. data/spec/mongoid/validatable/length_spec.rb +2 -0
  726. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  727. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  728. data/spec/mongoid/validatable/uniqueness_spec.rb +128 -98
  729. data/spec/mongoid/validatable_spec.rb +5 -3
  730. data/spec/mongoid/warnings_spec.rb +35 -0
  731. data/spec/mongoid_spec.rb +3 -1
  732. data/spec/rails/controller_extension/controller_runtime_spec.rb +5 -3
  733. data/spec/rails/mongoid_spec.rb +8 -18
  734. data/spec/shared/bin/s3-copy +45 -0
  735. data/spec/shared/bin/s3-upload +69 -0
  736. data/spec/shared/lib/mrss/cluster_config.rb +14 -4
  737. data/spec/shared/lib/mrss/constraints.rb +51 -27
  738. data/spec/shared/lib/mrss/docker_runner.rb +37 -4
  739. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  740. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  741. data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
  742. data/spec/shared/lib/mrss/server_version_registry.rb +16 -18
  743. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  744. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  745. data/spec/shared/lib/mrss/spec_organizer.rb +18 -1
  746. data/spec/shared/lib/mrss/utils.rb +28 -6
  747. data/spec/shared/share/Dockerfile.erb +156 -66
  748. data/spec/shared/share/haproxy-1.conf +16 -0
  749. data/spec/shared/share/haproxy-2.conf +17 -0
  750. data/spec/shared/shlib/config.sh +27 -0
  751. data/spec/shared/shlib/distro.sh +2 -1
  752. data/spec/shared/shlib/server.sh +171 -45
  753. data/spec/shared/shlib/set_env.sh +47 -6
  754. data/spec/spec_helper.rb +38 -36
  755. data/spec/support/authorization.rb +2 -0
  756. data/spec/support/client_registry.rb +9 -0
  757. data/spec/support/constraints.rb +39 -8
  758. data/spec/support/expectations.rb +5 -1
  759. data/spec/support/helpers.rb +11 -0
  760. data/spec/support/macros.rb +77 -0
  761. data/spec/{app → support}/models/account.rb +3 -1
  762. data/spec/{app → support}/models/acolyte.rb +2 -0
  763. data/spec/{app → support}/models/actor.rb +3 -1
  764. data/spec/support/models/actress.rb +4 -0
  765. data/spec/{app → support}/models/address.rb +6 -0
  766. data/spec/{app → support}/models/address_component.rb +2 -0
  767. data/spec/{app → support}/models/address_number.rb +2 -0
  768. data/spec/{app → support}/models/agency.rb +2 -0
  769. data/spec/{app → support}/models/agent.rb +2 -0
  770. data/spec/{app → support}/models/album.rb +2 -0
  771. data/spec/{app → support}/models/alert.rb +2 -0
  772. data/spec/{app → support}/models/animal.rb +2 -0
  773. data/spec/{app → support}/models/answer.rb +2 -0
  774. data/spec/{app → support}/models/appointment.rb +2 -0
  775. data/spec/support/models/armrest.rb +9 -0
  776. data/spec/{app → support}/models/article.rb +2 -0
  777. data/spec/{app → support}/models/artist.rb +4 -0
  778. data/spec/{app → support}/models/artwork.rb +2 -0
  779. data/spec/support/models/audible_sound.rb +3 -0
  780. data/spec/{app → support}/models/audio.rb +2 -0
  781. data/spec/support/models/augmentation.rb +25 -0
  782. data/spec/{app → support}/models/author.rb +2 -0
  783. data/spec/{app → support}/models/baby.rb +2 -0
  784. data/spec/{app → support}/models/band.rb +9 -0
  785. data/spec/{app → support}/models/bar.rb +2 -0
  786. data/spec/{app → support}/models/basic.rb +2 -0
  787. data/spec/support/models/bed.rb +3 -0
  788. data/spec/{app → support}/models/big_palette.rb +2 -0
  789. data/spec/{app → support}/models/birthday.rb +2 -0
  790. data/spec/support/models/bolt.rb +7 -0
  791. data/spec/{app → support}/models/bomb.rb +2 -0
  792. data/spec/{app → support}/models/book.rb +2 -0
  793. data/spec/{app → support}/models/breed.rb +2 -0
  794. data/spec/{app → support}/models/browser.rb +3 -1
  795. data/spec/{app → support}/models/building.rb +2 -0
  796. data/spec/{app → support}/models/building_address.rb +2 -0
  797. data/spec/{app → support}/models/bus.rb +2 -0
  798. data/spec/{app → support}/models/business.rb +2 -0
  799. data/spec/{app → support}/models/callback_test.rb +2 -0
  800. data/spec/{app → support}/models/canvas.rb +3 -1
  801. data/spec/support/models/car.rb +3 -0
  802. data/spec/{app → support}/models/cat.rb +2 -0
  803. data/spec/support/models/catalog.rb +24 -0
  804. data/spec/{app → support}/models/category.rb +2 -0
  805. data/spec/{app → support}/models/child.rb +2 -0
  806. data/spec/{app → support}/models/child_doc.rb +5 -3
  807. data/spec/{app → support}/models/church.rb +2 -0
  808. data/spec/{app → support}/models/circle.rb +2 -0
  809. data/spec/{app → support}/models/circuit.rb +2 -0
  810. data/spec/support/models/circus.rb +12 -0
  811. data/spec/{app → support}/models/code.rb +4 -0
  812. data/spec/support/models/coding/pull_request.rb +11 -0
  813. data/spec/support/models/coding.rb +3 -0
  814. data/spec/{app → support}/models/comment.rb +2 -0
  815. data/spec/{app → support}/models/company.rb +2 -0
  816. data/spec/{app → support}/models/consumption_period.rb +2 -0
  817. data/spec/{app → support}/models/contextable_item.rb +2 -0
  818. data/spec/{app → support}/models/contractor.rb +2 -0
  819. data/spec/{app → support}/models/cookie.rb +2 -0
  820. data/spec/{app → support}/models/country_code.rb +4 -0
  821. data/spec/{app → support}/models/courier_job.rb +2 -0
  822. data/spec/support/models/crate.rb +12 -0
  823. data/spec/{app → support}/models/customer.rb +0 -1
  824. data/spec/{app → support}/models/customer_address.rb +0 -1
  825. data/spec/support/models/deed.rb +7 -0
  826. data/spec/{app → support}/models/definition.rb +2 -0
  827. data/spec/{app → support}/models/delegating_patient.rb +0 -1
  828. data/spec/{app → support}/models/description.rb +2 -0
  829. data/spec/{app → support}/models/dictionary.rb +8 -0
  830. data/spec/{app → support}/models/division.rb +2 -0
  831. data/spec/{app → support}/models/doctor.rb +2 -0
  832. data/spec/{app → support}/models/dog.rb +2 -0
  833. data/spec/{app → support}/models/dokument.rb +2 -0
  834. data/spec/{app → support}/models/draft.rb +2 -0
  835. data/spec/{app → support}/models/dragon.rb +2 -0
  836. data/spec/{app → support}/models/driver.rb +3 -1
  837. data/spec/{app → support}/models/drug.rb +2 -0
  838. data/spec/{app → support}/models/dungeon.rb +2 -0
  839. data/spec/{app → support}/models/edit.rb +2 -0
  840. data/spec/{app → support}/models/email.rb +2 -0
  841. data/spec/{app → support}/models/employer.rb +2 -0
  842. data/spec/{app → support}/models/entry.rb +2 -0
  843. data/spec/support/models/eraser.rb +3 -0
  844. data/spec/{app → support}/models/even.rb +2 -0
  845. data/spec/{app → support}/models/event.rb +2 -0
  846. data/spec/{app → support}/models/exhibition.rb +2 -0
  847. data/spec/{app → support}/models/exhibitor.rb +2 -0
  848. data/spec/{app → support}/models/explosion.rb +2 -0
  849. data/spec/{app → support}/models/eye.rb +2 -0
  850. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  851. data/spec/{app → support}/models/face.rb +2 -0
  852. data/spec/support/models/fanatic.rb +8 -0
  853. data/spec/{app → support}/models/favorite.rb +2 -0
  854. data/spec/{app → support}/models/filesystem.rb +2 -0
  855. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  856. data/spec/{app → support}/models/firefox.rb +2 -0
  857. data/spec/{app → support}/models/fish.rb +2 -0
  858. data/spec/{app → support}/models/folder.rb +2 -0
  859. data/spec/{app → support}/models/folder_item.rb +2 -0
  860. data/spec/{app → support}/models/fruits.rb +2 -0
  861. data/spec/{app → support}/models/game.rb +2 -0
  862. data/spec/{app → support}/models/ghost.rb +2 -0
  863. data/spec/support/models/guitar.rb +4 -0
  864. data/spec/support/models/hole.rb +12 -0
  865. data/spec/{app → support}/models/home.rb +2 -0
  866. data/spec/{app → support}/models/house.rb +2 -0
  867. data/spec/{app → support}/models/html_writer.rb +2 -0
  868. data/spec/{app → support}/models/id_key.rb +2 -0
  869. data/spec/support/models/idnodef.rb +7 -0
  870. data/spec/{app → support}/models/image.rb +2 -0
  871. data/spec/{app → support}/models/implant.rb +11 -0
  872. data/spec/support/models/instrument.rb +8 -0
  873. data/spec/{app → support}/models/item.rb +3 -1
  874. data/spec/{app → support}/models/jar.rb +2 -0
  875. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  876. data/spec/{app → support}/models/kangaroo.rb +3 -1
  877. data/spec/{app → support}/models/label.rb +6 -1
  878. data/spec/{app → support}/models/language.rb +2 -0
  879. data/spec/{app → support}/models/lat_lng.rb +2 -0
  880. data/spec/{app → support}/models/league.rb +2 -0
  881. data/spec/support/models/learner.rb +4 -0
  882. data/spec/{app → support}/models/line_item.rb +2 -0
  883. data/spec/{app → support}/models/location.rb +2 -0
  884. data/spec/{app → support}/models/login.rb +2 -0
  885. data/spec/{app → support}/models/manufacturer.rb +2 -0
  886. data/spec/{app → support}/models/meat.rb +2 -0
  887. data/spec/{app → support}/models/membership.rb +3 -0
  888. data/spec/{app → support}/models/message.rb +2 -0
  889. data/spec/{app → support}/models/minim.rb +0 -1
  890. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  891. data/spec/support/models/mop.rb +24 -0
  892. data/spec/{app → support}/models/movie.rb +2 -0
  893. data/spec/support/models/my_hash.rb +4 -0
  894. data/spec/{app → support}/models/name.rb +12 -0
  895. data/spec/support/models/name_only.rb +8 -0
  896. data/spec/{app → support}/models/node.rb +2 -0
  897. data/spec/{app → support}/models/note.rb +2 -0
  898. data/spec/support/models/nut.rb +7 -0
  899. data/spec/{app → support}/models/odd.rb +2 -0
  900. data/spec/support/models/order.rb +12 -0
  901. data/spec/{app → support}/models/ordered_post.rb +3 -1
  902. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  903. data/spec/{app → support}/models/oscar.rb +2 -0
  904. data/spec/support/models/other_owner_object.rb +4 -0
  905. data/spec/{app → support}/models/override.rb +2 -0
  906. data/spec/{app → support}/models/ownable.rb +2 -0
  907. data/spec/{app → support}/models/owner.rb +4 -0
  908. data/spec/{app → support}/models/pack.rb +2 -0
  909. data/spec/{app → support}/models/page.rb +2 -0
  910. data/spec/{app → support}/models/page_question.rb +2 -0
  911. data/spec/{app → support}/models/palette.rb +3 -1
  912. data/spec/{app → support}/models/parent.rb +2 -0
  913. data/spec/{app → support}/models/parent_doc.rb +2 -0
  914. data/spec/support/models/passport.rb +22 -0
  915. data/spec/{app → support}/models/patient.rb +2 -0
  916. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  917. data/spec/support/models/pencil.rb +3 -0
  918. data/spec/{app → support}/models/person.rb +23 -1
  919. data/spec/{app → support}/models/pet.rb +2 -0
  920. data/spec/{app → support}/models/pet_owner.rb +2 -0
  921. data/spec/{app → support}/models/phone.rb +5 -1
  922. data/spec/support/models/piano.rb +4 -0
  923. data/spec/{app → support}/models/pizza.rb +2 -0
  924. data/spec/{app → support}/models/player.rb +4 -0
  925. data/spec/{app → support}/models/post.rb +2 -0
  926. data/spec/{app → support}/models/post_genre.rb +2 -0
  927. data/spec/support/models/powerup.rb +25 -0
  928. data/spec/{app → support}/models/preference.rb +2 -0
  929. data/spec/{app → support}/models/princess.rb +2 -0
  930. data/spec/{app → support}/models/product.rb +2 -0
  931. data/spec/support/models/profile.rb +17 -0
  932. data/spec/{app → support}/models/pronunciation.rb +2 -0
  933. data/spec/{app → support}/models/pub.rb +2 -0
  934. data/spec/support/models/publication/encyclopedia.rb +11 -0
  935. data/spec/support/models/publication/review.rb +13 -0
  936. data/spec/support/models/publication.rb +4 -0
  937. data/spec/{app → support}/models/purchase.rb +2 -0
  938. data/spec/support/models/purchased_item.rb +10 -0
  939. data/spec/support/models/purse.rb +9 -0
  940. data/spec/{app → support}/models/question.rb +2 -0
  941. data/spec/{app → support}/models/quiz.rb +2 -0
  942. data/spec/{app → support}/models/rating.rb +2 -0
  943. data/spec/{app → support}/models/record.rb +2 -0
  944. data/spec/{app → support}/models/registry.rb +3 -0
  945. data/spec/{app → support}/models/role.rb +2 -0
  946. data/spec/{app → support}/models/root_category.rb +2 -0
  947. data/spec/{app → support}/models/sandwich.rb +2 -0
  948. data/spec/{app → support}/models/scheduler.rb +2 -0
  949. data/spec/support/models/school.rb +14 -0
  950. data/spec/support/models/scribe.rb +7 -0
  951. data/spec/support/models/sealer.rb +7 -0
  952. data/spec/support/models/seat.rb +24 -0
  953. data/spec/{app → support}/models/seo.rb +2 -0
  954. data/spec/support/models/series.rb +7 -0
  955. data/spec/{app → support}/models/server.rb +2 -0
  956. data/spec/{app → support}/models/service.rb +2 -0
  957. data/spec/{app → support}/models/shape.rb +4 -2
  958. data/spec/{app → support}/models/shelf.rb +2 -0
  959. data/spec/support/models/shield.rb +18 -0
  960. data/spec/{app → support}/models/shipment_address.rb +2 -0
  961. data/spec/{app → support}/models/shipping_container.rb +2 -0
  962. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  963. data/spec/support/models/shirt.rb +11 -0
  964. data/spec/{app → support}/models/shop.rb +2 -0
  965. data/spec/{app → support}/models/short_agent.rb +2 -0
  966. data/spec/{app → support}/models/short_quiz.rb +2 -0
  967. data/spec/{app → support}/models/simple.rb +2 -0
  968. data/spec/{app → support}/models/slave.rb +2 -0
  969. data/spec/{app → support}/models/song.rb +2 -0
  970. data/spec/{app → support}/models/sound.rb +2 -0
  971. data/spec/support/models/spacer.rb +7 -0
  972. data/spec/{app → support}/models/square.rb +2 -0
  973. data/spec/{app → support}/models/staff.rb +2 -0
  974. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  975. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  976. data/spec/{app → support}/models/strategy.rb +2 -0
  977. data/spec/support/models/student.rb +14 -0
  978. data/spec/{app → support}/models/sub_item.rb +2 -0
  979. data/spec/{app → support}/models/subscription.rb +2 -0
  980. data/spec/{app → support}/models/survey.rb +2 -0
  981. data/spec/{app → support}/models/symptom.rb +2 -0
  982. data/spec/support/models/system_role.rb +7 -0
  983. data/spec/{app → support}/models/tag.rb +2 -0
  984. data/spec/{app → support}/models/target.rb +2 -0
  985. data/spec/{app → support}/models/template.rb +2 -0
  986. data/spec/{app → support}/models/thing.rb +2 -0
  987. data/spec/support/models/threadlocker.rb +7 -0
  988. data/spec/{app → support}/models/title.rb +2 -0
  989. data/spec/{app → support}/models/tool.rb +4 -2
  990. data/spec/{app → support}/models/topping.rb +2 -0
  991. data/spec/support/models/toy.rb +9 -0
  992. data/spec/{app → support}/models/track.rb +2 -0
  993. data/spec/{app → support}/models/translation.rb +2 -0
  994. data/spec/{app → support}/models/tree.rb +2 -0
  995. data/spec/support/models/truck.rb +7 -0
  996. data/spec/{app → support}/models/user.rb +2 -0
  997. data/spec/{app → support}/models/user_account.rb +2 -0
  998. data/spec/{app → support}/models/validation_callback.rb +2 -0
  999. data/spec/support/models/vehicle.rb +18 -0
  1000. data/spec/{app → support}/models/version.rb +2 -0
  1001. data/spec/{app → support}/models/vertex.rb +3 -1
  1002. data/spec/{app → support}/models/vet_visit.rb +2 -0
  1003. data/spec/{app → support}/models/video.rb +2 -0
  1004. data/spec/support/models/video_game.rb +3 -0
  1005. data/spec/support/models/washer.rb +7 -0
  1006. data/spec/support/models/weapon.rb +25 -0
  1007. data/spec/{app → support}/models/wiki_page.rb +3 -0
  1008. data/spec/{app → support}/models/word.rb +2 -0
  1009. data/spec/{app → support}/models/word_origin.rb +2 -0
  1010. data/spec/{app → support}/models/writer.rb +4 -2
  1011. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1012. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1013. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1014. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1015. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1016. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1017. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1018. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1019. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1020. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1021. data/spec/support/shared/time.rb +53 -0
  1022. data/spec/support/spec_config.rb +12 -3
  1023. data.tar.gz.sig +0 -0
  1024. metadata +1162 -764
  1025. metadata.gz.sig +0 -0
  1026. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1027. data/lib/mongoid/errors/eager_load.rb +0 -22
  1028. data/lib/mongoid/errors/invalid_value.rb +0 -16
  1029. data/lib/mongoid/matchable/all.rb +0 -28
  1030. data/lib/mongoid/matchable/and.rb +0 -30
  1031. data/lib/mongoid/matchable/default.rb +0 -119
  1032. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1033. data/lib/mongoid/matchable/eq.rb +0 -22
  1034. data/lib/mongoid/matchable/exists.rb +0 -23
  1035. data/lib/mongoid/matchable/gt.rb +0 -23
  1036. data/lib/mongoid/matchable/gte.rb +0 -23
  1037. data/lib/mongoid/matchable/in.rb +0 -24
  1038. data/lib/mongoid/matchable/lt.rb +0 -23
  1039. data/lib/mongoid/matchable/lte.rb +0 -23
  1040. data/lib/mongoid/matchable/ne.rb +0 -21
  1041. data/lib/mongoid/matchable/nin.rb +0 -22
  1042. data/lib/mongoid/matchable/nor.rb +0 -37
  1043. data/lib/mongoid/matchable/or.rb +0 -33
  1044. data/lib/mongoid/matchable/regexp.rb +0 -27
  1045. data/lib/mongoid/matchable/size.rb +0 -21
  1046. data/lib/support/ruby_version.rb +0 -26
  1047. data/spec/app/models/actress.rb +0 -2
  1048. data/spec/app/models/augmentation.rb +0 -11
  1049. data/spec/app/models/bed.rb +0 -1
  1050. data/spec/app/models/car.rb +0 -1
  1051. data/spec/app/models/circus.rb +0 -7
  1052. data/spec/app/models/eraser.rb +0 -1
  1053. data/spec/app/models/learner.rb +0 -2
  1054. data/spec/app/models/my_hash.rb +0 -2
  1055. data/spec/app/models/other_owner_object.rb +0 -2
  1056. data/spec/app/models/passport.rb +0 -5
  1057. data/spec/app/models/pencil.rb +0 -1
  1058. data/spec/app/models/powerup.rb +0 -11
  1059. data/spec/app/models/profile.rb +0 -5
  1060. data/spec/app/models/series.rb +0 -4
  1061. data/spec/app/models/truck.rb +0 -3
  1062. data/spec/app/models/vehicle.rb +0 -11
  1063. data/spec/app/models/video_game.rb +0 -1
  1064. data/spec/app/models/weapon.rb +0 -11
  1065. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1066. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1067. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1068. data/spec/mongoid/matchable/default_spec.rb +0 -137
  1069. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1070. data/spec/mongoid/matchable/eq_spec.rb +0 -48
  1071. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1072. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1073. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1074. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1075. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1076. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1077. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1078. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1079. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1080. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1081. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1082. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1083. data/spec/mongoid/matchable_spec.rb +0 -853
  1084. data/spec/support/cluster_config.rb +0 -158
  1085. data/spec/support/session_registry.rb +0 -50
  1086. /data/spec/{app → support}/models/array_field.rb +0 -0
  1087. /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  1088. /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  1089. /data/spec/{app → support}/models/updatable.rb +0 -0
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
4
+ require_relative "../has_and_belongs_to_many_models"
2
5
 
3
6
  describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
4
7
 
@@ -24,7 +27,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
24
27
  context "when the inverse_of is nil" do
25
28
 
26
29
  let!(:article) do
27
- Article.create
30
+ Article.create!
28
31
  end
29
32
 
30
33
  context "when the child document is new" do
@@ -45,7 +48,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
45
48
  context "when the child document is not new" do
46
49
 
47
50
  let(:preference) do
48
- Preference.create
51
+ Preference.create!
49
52
  end
50
53
 
51
54
  it "does not persist the child document" do
@@ -77,7 +80,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
77
80
  context "when the parent is not a new record" do
78
81
 
79
82
  let(:person) do
80
- Person.create
83
+ Person.create!
81
84
  end
82
85
 
83
86
  let!(:preference) do
@@ -121,11 +124,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
121
124
  context "when appending in a parent create block" do
122
125
 
123
126
  let!(:preference) do
124
- Preference.create(name: "testing")
127
+ Preference.create!(name: "testing")
125
128
  end
126
129
 
127
130
  let!(:person) do
128
- Person.create do |doc|
131
+ Person.create! do |doc|
129
132
  doc.preferences << preference
130
133
  end
131
134
  end
@@ -210,7 +213,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
210
213
  context "when the child is already persisted" do
211
214
 
212
215
  let!(:persisted) do
213
- Preference.create(name: "testy")
216
+ Preference.create!(name: "testy")
214
217
  end
215
218
 
216
219
  let(:preference) do
@@ -219,7 +222,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
219
222
 
220
223
  before do
221
224
  person.preferences.send(method, preference)
222
- person.save
225
+ person.save!
223
226
  end
224
227
 
225
228
  it "adds the documents to the relation" do
@@ -250,7 +253,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
250
253
  context "when setting via the associated ids" do
251
254
 
252
255
  let!(:persisted) do
253
- Preference.create(name: "testy")
256
+ Preference.create!(name: "testy")
254
257
  end
255
258
 
256
259
  let(:preference) do
@@ -262,7 +265,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
262
265
  end
263
266
 
264
267
  before do
265
- person.save
268
+ person.save!
266
269
  end
267
270
 
268
271
  it "adds the documents to the relation" do
@@ -290,7 +293,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
290
293
  context "when the parent is not a new record" do
291
294
 
292
295
  let(:person) do
293
- Person.create
296
+ Person.create!
294
297
  end
295
298
 
296
299
  let(:preference) do
@@ -372,11 +375,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
372
375
  context "when both sides have been persisted" do
373
376
 
374
377
  let(:person) do
375
- Person.create
378
+ Person.create!
376
379
  end
377
380
 
378
381
  let(:event) do
379
- Event.create
382
+ Event.create!
380
383
  end
381
384
 
382
385
  before do
@@ -425,15 +428,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
425
428
  context "when the relation also includes a has_many relation" do
426
429
 
427
430
  let(:artwork) do
428
- Artwork.create
431
+ Artwork.create!
429
432
  end
430
433
 
431
434
  let(:exhibition) do
432
- Exhibition.create
435
+ Exhibition.create!
433
436
  end
434
437
 
435
438
  let(:exhibitor) do
436
- Exhibitor.create(exhibition: exhibition)
439
+ Exhibitor.create!(exhibition: exhibition)
437
440
  end
438
441
 
439
442
  before do
@@ -448,11 +451,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
448
451
  context "when the relation is self referencing" do
449
452
 
450
453
  let(:tag_one) do
451
- Tag.create(text: "one")
454
+ Tag.create!(text: "one")
452
455
  end
453
456
 
454
457
  let(:tag_two) do
455
- Tag.create(text: "two")
458
+ Tag.create!(text: "two")
456
459
  end
457
460
 
458
461
  before do
@@ -561,7 +564,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
561
564
  end
562
565
 
563
566
  let(:preference) do
564
- Preference.create(name: "one")
567
+ Preference.create!(name: "one")
565
568
  end
566
569
 
567
570
  before do
@@ -582,7 +585,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
582
585
  context "when the document is persisted" do
583
586
 
584
587
  before do
585
- person.save
588
+ person.save!
586
589
  end
587
590
 
588
591
  it "does not add the duplicates" do
@@ -653,7 +656,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
653
656
  end
654
657
 
655
658
  let!(:preference) do
656
- Preference.create
659
+ Preference.create!
657
660
  end
658
661
 
659
662
  before do
@@ -700,7 +703,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
700
703
  context "when the parent is not a new record" do
701
704
 
702
705
  let(:person) do
703
- Person.create
706
+ Person.create!
704
707
  end
705
708
 
706
709
  let(:preference) do
@@ -784,7 +787,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
784
787
  expect(person.preferences).to eq([ another_preference ])
785
788
  end
786
789
 
787
- it "persists the relation between another_prefrence and person" do
790
+ it "persists the relation between another_preference and person" do
788
791
  expect(another_preference.people).to eq([ person ])
789
792
  end
790
793
 
@@ -796,7 +799,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
796
799
  context "and person is saved" do
797
800
 
798
801
  before do
799
- person.save
802
+ person.save!
800
803
  person.reload
801
804
  another_preference.reload
802
805
  end
@@ -805,7 +808,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
805
808
  expect(person.preferences).to eq([ another_preference ])
806
809
  end
807
810
 
808
- it "persists the relation between another_prefrence and person" do
811
+ it "persists the relation between another_preference and person" do
809
812
  expect(another_preference.people).to eq([ person ])
810
813
  end
811
814
 
@@ -820,11 +823,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
820
823
 
821
824
  describe "when self-referencing" do
822
825
  let!(:parent) do
823
- Vertex.create
826
+ Vertex.create!
824
827
  end
825
828
 
826
829
  let!(:child) do
827
- Vertex.create(parents: [parent])
830
+ Vertex.create!(parents: [parent])
828
831
  end
829
832
 
830
833
  before do
@@ -961,7 +964,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
961
964
  context "when the relation has been loaded" do
962
965
 
963
966
  let(:person) do
964
- Person.create
967
+ Person.create!
965
968
  end
966
969
 
967
970
  let(:preference) do
@@ -1001,7 +1004,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1001
1004
  end
1002
1005
 
1003
1006
  let(:person) do
1004
- Person.create.tap do |p|
1007
+ Person.create!.tap do |p|
1005
1008
  p.preferences = [ preference ]
1006
1009
  end
1007
1010
  end
@@ -1071,7 +1074,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1071
1074
  context "when the parent is not a new record" do
1072
1075
 
1073
1076
  let(:person) do
1074
- Person.create
1077
+ Person.create!
1075
1078
  end
1076
1079
 
1077
1080
  let!(:preference) do
@@ -1109,7 +1112,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1109
1112
  context "when saving the target" do
1110
1113
 
1111
1114
  before do
1112
- preference.save
1115
+ preference.save!
1113
1116
  end
1114
1117
 
1115
1118
  it "persists the parent keys" do
@@ -1128,13 +1131,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1128
1131
  context "when the parent has been persisted" do
1129
1132
 
1130
1133
  let!(:person) do
1131
- Person.create
1134
+ Person.create!
1132
1135
  end
1133
1136
 
1134
1137
  context "when the children are persisted" do
1135
1138
 
1136
1139
  let!(:preference) do
1137
- person.preferences.create(name: "settings")
1140
+ person.preferences.create!(name: "settings")
1138
1141
  end
1139
1142
 
1140
1143
  let!(:relation) do
@@ -1306,7 +1309,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1306
1309
  context "when the parent is not a new record" do
1307
1310
 
1308
1311
  let(:person) do
1309
- Person.create
1312
+ Person.create!
1310
1313
  end
1311
1314
 
1312
1315
  let!(:preference) do
@@ -1350,11 +1353,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1350
1353
  context "when appending in a parent create block" do
1351
1354
 
1352
1355
  let!(:preference) do
1353
- Preference.create(name: "testing")
1356
+ Preference.create!(name: "testing")
1354
1357
  end
1355
1358
 
1356
1359
  let!(:person) do
1357
- Person.create do |doc|
1360
+ Person.create! do |doc|
1358
1361
  doc.preferences.concat([ preference ])
1359
1362
  end
1360
1363
  end
@@ -1439,7 +1442,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1439
1442
  context "when the child is already persisted" do
1440
1443
 
1441
1444
  let!(:persisted) do
1442
- Preference.create(name: "testy")
1445
+ Preference.create!(name: "testy")
1443
1446
  end
1444
1447
 
1445
1448
  let(:preference) do
@@ -1448,7 +1451,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1448
1451
 
1449
1452
  before do
1450
1453
  person.preferences.concat([ preference ])
1451
- person.save
1454
+ person.save!
1452
1455
  end
1453
1456
 
1454
1457
  it "adds the documents to the relation" do
@@ -1479,7 +1482,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1479
1482
  context "when setting via the associated ids" do
1480
1483
 
1481
1484
  let!(:persisted) do
1482
- Preference.create(name: "testy")
1485
+ Preference.create!(name: "testy")
1483
1486
  end
1484
1487
 
1485
1488
  let(:preference) do
@@ -1491,7 +1494,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1491
1494
  end
1492
1495
 
1493
1496
  before do
1494
- person.save
1497
+ person.save!
1495
1498
  end
1496
1499
 
1497
1500
  it "adds the documents to the relation" do
@@ -1519,7 +1522,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1519
1522
  context "when the parent is not a new record" do
1520
1523
 
1521
1524
  let(:person) do
1522
- Person.create
1525
+ Person.create!
1523
1526
  end
1524
1527
 
1525
1528
  let(:preference) do
@@ -1601,11 +1604,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1601
1604
  context "when both sides have been persisted" do
1602
1605
 
1603
1606
  let(:person) do
1604
- Person.create
1607
+ Person.create!
1605
1608
  end
1606
1609
 
1607
1610
  let(:event) do
1608
- Event.create
1611
+ Event.create!
1609
1612
  end
1610
1613
 
1611
1614
  before do
@@ -1654,15 +1657,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1654
1657
  context "when the relation also includes a has_many relation" do
1655
1658
 
1656
1659
  let(:artwork) do
1657
- Artwork.create
1660
+ Artwork.create!
1658
1661
  end
1659
1662
 
1660
1663
  let(:exhibition) do
1661
- Exhibition.create
1664
+ Exhibition.create!
1662
1665
  end
1663
1666
 
1664
1667
  let(:exhibitor) do
1665
- Exhibitor.create(exhibition: exhibition)
1668
+ Exhibitor.create!(exhibition: exhibition)
1666
1669
  end
1667
1670
 
1668
1671
  before do
@@ -1677,11 +1680,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1677
1680
  context "when the relation is self referencing" do
1678
1681
 
1679
1682
  let(:tag_one) do
1680
- Tag.create(text: "one")
1683
+ Tag.create!(text: "one")
1681
1684
  end
1682
1685
 
1683
1686
  let(:tag_two) do
1684
- Tag.create(text: "two")
1687
+ Tag.create!(text: "two")
1685
1688
  end
1686
1689
 
1687
1690
  before do
@@ -1732,7 +1735,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1732
1735
  describe "#count" do
1733
1736
 
1734
1737
  let(:person) do
1735
- Person.create
1738
+ Person.create!
1736
1739
  end
1737
1740
 
1738
1741
  context "when nothing exists on the relation" do
@@ -1757,7 +1760,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1757
1760
  describe "#any?" do
1758
1761
 
1759
1762
  let(:person) do
1760
- Person.create
1763
+ Person.create!
1761
1764
  end
1762
1765
 
1763
1766
  context "when nothing exists on the relation" do
@@ -1794,7 +1797,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1794
1797
  context "when documents have been persisted" do
1795
1798
 
1796
1799
  let!(:preference) do
1797
- person.preferences.create(name: "setting")
1800
+ person.preferences.create!(name: "setting")
1798
1801
  end
1799
1802
 
1800
1803
  it "returns the number of persisted documents" do
@@ -1805,12 +1808,12 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1805
1808
  context "when appending to a loaded relation" do
1806
1809
 
1807
1810
  let!(:preference) do
1808
- person.preferences.create(name: "setting")
1811
+ person.preferences.create!(name: "setting")
1809
1812
  end
1810
1813
 
1811
1814
  before do
1812
1815
  person.preferences.count
1813
- person.preferences << Preference.create(name: "two")
1816
+ person.preferences << Preference.create!(name: "two")
1814
1817
  end
1815
1818
 
1816
1819
  it "returns the number of persisted documents" do
@@ -1834,7 +1837,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1834
1837
  context "when the documents are part of the relation" do
1835
1838
 
1836
1839
  before do
1837
- Preference.create(person_ids: [ person.id ])
1840
+ Preference.create!(person_ids: [ person.id ])
1838
1841
  end
1839
1842
 
1840
1843
  it "returns the count from the db" do
@@ -1845,7 +1848,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1845
1848
  context "when the documents are not part of the relation" do
1846
1849
 
1847
1850
  before do
1848
- Preference.create
1851
+ Preference.create!
1849
1852
  end
1850
1853
 
1851
1854
  it "returns the count from the db" do
@@ -1859,7 +1862,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1859
1862
  context "when documents have been persisted" do
1860
1863
 
1861
1864
  let!(:house) do
1862
- person.houses.create(name: "Wayne Manor")
1865
+ person.houses.create!(name: "Wayne Manor")
1863
1866
  end
1864
1867
 
1865
1868
  it "returns the number of persisted documents" do
@@ -1883,7 +1886,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1883
1886
  describe "#any?" do
1884
1887
 
1885
1888
  let(:sandwich) do
1886
- Sandwich.create
1889
+ Sandwich.create!
1887
1890
  end
1888
1891
 
1889
1892
  context "when nothing exists on the relation" do
@@ -1951,7 +1954,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1951
1954
  context "when documents have been persisted" do
1952
1955
 
1953
1956
  let!(:meat) do
1954
- sandwich.meats.create
1957
+ sandwich.meats.create!
1955
1958
  end
1956
1959
 
1957
1960
  it "returns true" do
@@ -1972,7 +1975,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1972
1975
 
1973
1976
  context "when new documents exist in the database" do
1974
1977
  before do
1975
- Meat.create(sandwiches: [sandwich])
1978
+ Meat.create!(sandwiches: [sandwich])
1976
1979
  end
1977
1980
 
1978
1981
  it "returns true" do
@@ -1990,15 +1993,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1990
1993
  context "when using string keys" do
1991
1994
 
1992
1995
  let(:agent) do
1993
- Agent.create(number: "007")
1996
+ Agent.create!(number: "007")
1994
1997
  end
1995
1998
 
1996
1999
  before do
1997
- agent.accounts.create(name: "testing again")
2000
+ agent.accounts.send(method, name: "test again")
1998
2001
  end
1999
2002
 
2000
2003
  it "does not convert the string key to an object id" do
2001
- expect(agent.account_ids).to eq([ "testing-again" ])
2004
+ expect(agent.account_ids).to eq([ "test-again" ])
2002
2005
  end
2003
2006
  end
2004
2007
 
@@ -2070,7 +2073,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2070
2073
  context "when validation fails" do
2071
2074
 
2072
2075
  let(:person) do
2073
- Person.create
2076
+ Person.create!
2074
2077
  end
2075
2078
 
2076
2079
  context "when the relation is not polymorphic" do
@@ -2084,290 +2087,236 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2084
2087
  end
2085
2088
  end
2086
2089
 
2087
- describe "#delete" do
2088
-
2089
- let(:person) do
2090
- Person.create
2091
- end
2090
+ %i[ delete delete_one ].each do |method|
2091
+ describe "\##{method}" do
2092
+ let(:person) { Person.create! }
2093
+ let(:preference_one) { Preference.create!(name: "Testing") }
2094
+ let(:preference_two) { Preference.create!(name: "Test") }
2092
2095
 
2093
- let(:preference_one) do
2094
- Preference.create(name: "Testing")
2095
- end
2096
-
2097
- let(:preference_two) do
2098
- Preference.create(name: "Test")
2099
- end
2100
-
2101
- before do
2102
- person.preferences << [ preference_one, preference_two ]
2103
- end
2104
-
2105
- context "when the document exists" do
2106
-
2107
- let!(:deleted) do
2108
- person.preferences.delete(preference_one)
2109
- end
2110
-
2111
- it "removes the document from the relation" do
2112
- expect(person.preferences).to eq([ preference_two ])
2113
- end
2114
-
2115
- it "returns the document" do
2116
- expect(deleted).to eq(preference_one)
2117
- end
2118
-
2119
- it "removes the document key from the foreign key" do
2120
- expect(person.preference_ids).to eq([ preference_two.id ])
2121
- end
2122
-
2123
- it "removes the inverse reference" do
2124
- expect(deleted.reload.people).to be_empty
2125
- end
2126
-
2127
- it "removes the base id from the inverse keys" do
2128
- expect(deleted.reload.person_ids).to be_empty
2096
+ before do
2097
+ person.preferences << [ preference_one, preference_two ]
2129
2098
  end
2130
2099
 
2131
- context "and person and preferences are reloaded" do
2132
-
2133
- before do
2134
- person.reload
2135
- preference_one.reload
2136
- preference_two.reload
2100
+ context 'when the document exists' do
2101
+ let!(:deleted) do
2102
+ person.preferences.send(method, preference_one)
2137
2103
  end
2138
2104
 
2139
- it "nullifies the deleted preference" do
2105
+ it 'removes the document from the relation' do
2140
2106
  expect(person.preferences).to eq([ preference_two ])
2141
2107
  end
2142
2108
 
2143
- it "retains the ids for one preference" do
2144
- expect(person.preference_ids).to eq([ preference_two.id ])
2109
+ it 'returns the document' do
2110
+ expect(deleted).to eq(preference_one)
2145
2111
  end
2146
- end
2147
- end
2148
-
2149
- context "when the document does not exist" do
2150
-
2151
- let!(:deleted) do
2152
- person.preferences.delete(Preference.new)
2153
- end
2154
-
2155
- it "returns nil" do
2156
- expect(deleted).to be_nil
2157
- end
2158
-
2159
- it "does not modify the relation" do
2160
- expect(person.preferences).to eq([ preference_one, preference_two ])
2161
- end
2162
-
2163
- it "does not modify the keys" do
2164
- expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2165
- end
2166
- end
2167
-
2168
- context "when :dependent => :nullify is set" do
2169
-
2170
- context "when :inverse_of is set" do
2171
2112
 
2172
- let(:event) do
2173
- Event.create
2113
+ it 'removes the document key from the foreign key' do
2114
+ expect(person.preference_ids).to eq([ preference_two.id ])
2174
2115
  end
2175
2116
 
2176
- before do
2177
- person.administrated_events << [ event ]
2117
+ it 'removes the inverse reference' do
2118
+ expect(deleted.reload.people).to be_empty
2178
2119
  end
2179
2120
 
2180
- it "deletes the document" do
2181
- expect(event.delete).to be true
2121
+ it 'removes the base id from the inverse keys' do
2122
+ expect(deleted.reload.person_ids).to be_empty
2182
2123
  end
2183
- end
2184
- end
2185
2124
 
2186
- context "when the relationships are self referencing" do
2187
-
2188
- let(:tag_one) do
2189
- Tag.create(text: "one")
2190
- end
2125
+ context 'and person and preferences are reloaded' do
2126
+ before do
2127
+ person.reload
2128
+ preference_one.reload
2129
+ preference_two.reload
2130
+ end
2191
2131
 
2192
- let(:tag_two) do
2193
- Tag.create(text: "two")
2194
- end
2132
+ it 'nullifies the deleted preference' do
2133
+ expect(person.preferences).to eq([ preference_two ])
2134
+ end
2195
2135
 
2196
- before do
2197
- tag_one.related << tag_two
2136
+ it 'retains the ids for one preference' do
2137
+ expect(person.preference_ids).to eq([ preference_two.id ])
2138
+ end
2139
+ end
2198
2140
  end
2199
2141
 
2200
- context "when deleting without reloading" do
2201
-
2142
+ context 'when the document does not exist' do
2202
2143
  let!(:deleted) do
2203
- tag_one.related.delete(tag_two)
2204
- end
2205
-
2206
- it "deletes the document from the relation" do
2207
- expect(tag_one.related).to be_empty
2144
+ person.preferences.send(method, Preference.new)
2208
2145
  end
2209
2146
 
2210
- it "deletes the foreign key from the relation" do
2211
- expect(tag_one.related_ids).to be_empty
2147
+ it 'returns nil' do
2148
+ expect(deleted).to be_nil
2212
2149
  end
2213
2150
 
2214
- it "removes the reference from the inverse" do
2215
- expect(deleted.related).to be_empty
2151
+ it 'does not modify the relation' do
2152
+ expect(person.preferences).to eq([ preference_one, preference_two ])
2216
2153
  end
2217
2154
 
2218
- it "removes the foreign keys from the inverse" do
2219
- expect(deleted.related_ids).to be_empty
2155
+ it 'does not modify the keys' do
2156
+ expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2220
2157
  end
2221
2158
  end
2222
2159
 
2223
- context "when deleting with reloading" do
2160
+ context 'when :dependent => :nullify is set' do
2161
+ context 'when :inverse_of is set' do
2162
+ let(:event) { Event.create! }
2224
2163
 
2225
- context "when deleting from the front side" do
2226
-
2227
- let(:reloaded) do
2228
- tag_one.reload
2229
- end
2230
-
2231
- let!(:deleted) do
2232
- reloaded.related.delete(tag_two)
2233
- end
2234
-
2235
- it "deletes the document from the relation" do
2236
- expect(reloaded.related).to be_empty
2164
+ before do
2165
+ person.administrated_events << [ event ]
2237
2166
  end
2238
2167
 
2239
- it "deletes the foreign key from the relation" do
2240
- expect(reloaded.related_ids).to be_empty
2168
+ it 'deletes the document' do
2169
+ expect(event.delete).to be true
2241
2170
  end
2171
+ end
2172
+ end
2242
2173
 
2243
- it "removes the reference from the inverse" do
2244
- expect(deleted.related).to be_empty
2245
- end
2174
+ context 'when the relationships are self referencing' do
2175
+ let(:tag_one) { Tag.create!(text: "one") }
2176
+ let(:tag_two) { Tag.create!(text: "two") }
2246
2177
 
2247
- it "removes the foreign keys from the inverse" do
2248
- expect(deleted.related_ids).to be_empty
2249
- end
2178
+ before do
2179
+ tag_one.related << tag_two
2250
2180
  end
2251
2181
 
2252
- context "when deleting from the inverse side" do
2182
+ context 'when deleting without reloading' do
2183
+ let!(:deleted) { tag_one.related.send(method, tag_two) }
2253
2184
 
2254
- let(:reloaded) do
2255
- tag_two.reload
2185
+ it 'deletes the document from the relation' do
2186
+ expect(tag_one.related).to be_empty
2256
2187
  end
2257
2188
 
2258
- let!(:deleted) do
2259
- reloaded.related.delete(tag_one)
2260
- end
2261
-
2262
- it "deletes the document from the relation" do
2263
- expect(reloaded.related).to be_empty
2189
+ it 'deletes the foreign key from the relation' do
2190
+ expect(tag_one.related_ids).to be_empty
2264
2191
  end
2265
2192
 
2266
- it "deletes the foreign key from the relation" do
2267
- expect(reloaded.related_ids).to be_empty
2193
+ it 'removes the reference from the inverse' do
2194
+ expect(deleted.related).to be_empty
2268
2195
  end
2269
2196
 
2270
- it "removes the foreign keys from the inverse" do
2197
+ it 'removes the foreign keys from the inverse' do
2271
2198
  expect(deleted.related_ids).to be_empty
2272
2199
  end
2273
2200
  end
2274
- end
2275
- end
2276
2201
 
2277
- context "when the association has callbacks" do
2202
+ context 'when deleting with reloading' do
2203
+ context "when deleting from the front side" do
2204
+ let(:reloaded) { tag_one.reload }
2205
+ let!(:deleted) { reloaded.related.send(method, tag_two) }
2278
2206
 
2279
- let(:post) do
2280
- Post.new
2281
- end
2207
+ it 'deletes the document from the relation' do
2208
+ expect(reloaded.related).to be_empty
2209
+ end
2282
2210
 
2283
- let(:tag) do
2284
- Tag.new
2285
- end
2211
+ it 'deletes the foreign key from the relation' do
2212
+ expect(reloaded.related_ids).to be_empty
2213
+ end
2286
2214
 
2287
- before do
2288
- post.tags << tag
2289
- end
2215
+ it 'removes the reference from the inverse' do
2216
+ expect(deleted.related).to be_empty
2217
+ end
2290
2218
 
2291
- context "when the callback is a before_remove" do
2219
+ it 'removes the foreign keys from the inverse' do
2220
+ expect(deleted.related_ids).to be_empty
2221
+ end
2222
+ end
2292
2223
 
2293
- context "when there are no errors" do
2224
+ context 'when deleting from the inverse side' do
2225
+ let(:reloaded) { tag_two.reload }
2226
+ let!(:deleted) { reloaded.related.send(method, tag_one) }
2294
2227
 
2295
- before do
2296
- post.tags.delete tag
2297
- end
2228
+ it 'deletes the document from the relation' do
2229
+ expect(reloaded.related).to be_empty
2230
+ end
2298
2231
 
2299
- it "executes the callback" do
2300
- expect(post.before_remove_called).to be true
2301
- end
2232
+ it 'deletes the foreign key from the relation' do
2233
+ expect(reloaded.related_ids).to be_empty
2234
+ end
2302
2235
 
2303
- it "removes the document from the relation" do
2304
- expect(post.tags).to be_empty
2236
+ it 'removes the foreign keys from the inverse' do
2237
+ expect(deleted.related_ids).to be_empty
2238
+ end
2305
2239
  end
2306
2240
  end
2241
+ end
2307
2242
 
2308
- context "when errors are raised" do
2309
-
2310
- before do
2311
- expect(post).to receive(:before_remove_tag).and_raise
2312
- begin; post.tags.delete(tag); rescue; end
2313
- end
2243
+ context 'when the association has callbacks' do
2244
+ let(:post) { Post.new }
2245
+ let(:tag) { Tag.new }
2314
2246
 
2315
- it "does not remove the document from the relation" do
2316
- expect(post.tags).to eq([ tag ])
2317
- end
2247
+ before do
2248
+ post.tags << tag
2318
2249
  end
2319
- end
2320
2250
 
2321
- context "when the callback is an after_remove" do
2251
+ context 'when the callback is a before_remove' do
2252
+ context 'when there are no errors' do
2253
+ before do
2254
+ post.tags.send(method, tag)
2255
+ end
2322
2256
 
2323
- context "when no errors are raised" do
2257
+ it 'executes the callback' do
2258
+ expect(post.before_remove_called).to be true
2259
+ end
2324
2260
 
2325
- before do
2326
- post.tags.delete(tag)
2261
+ it 'removes the document from the relation' do
2262
+ expect(post.tags).to be_empty
2263
+ end
2327
2264
  end
2328
2265
 
2329
- it "executes the callback" do
2330
- expect(post.after_remove_called).to be true
2331
- end
2266
+ context "when errors are raised" do
2267
+ before do
2268
+ expect(post).to receive(:before_remove_tag).and_raise
2269
+ begin; post.tags.send(method, tag); rescue; end
2270
+ end
2332
2271
 
2333
- it "removes the document from the relation" do
2334
- expect(post.tags).to be_empty
2272
+ it 'does not remove the document from the relation' do
2273
+ expect(post.tags).to eq([ tag ])
2274
+ end
2335
2275
  end
2336
2276
  end
2337
2277
 
2338
- context "when errors are raised" do
2278
+ context 'when the callback is an after_remove' do
2279
+ context 'when no errors are raised' do
2280
+ before do
2281
+ post.tags.send(method, tag)
2282
+ end
2339
2283
 
2340
- before do
2341
- expect(post).to receive(:after_remove_tag).and_raise
2342
- begin; post.tags.delete(tag); rescue; end
2284
+ it 'executes the callback' do
2285
+ expect(post.after_remove_called).to be true
2286
+ end
2287
+
2288
+ it 'removes the document from the relation' do
2289
+ expect(post.tags).to be_empty
2290
+ end
2343
2291
  end
2344
2292
 
2345
- it "removes the document from the relation" do
2346
- expect(post.tags).to be_empty
2293
+ context 'when errors are raised' do
2294
+ before do
2295
+ expect(post).to receive(:after_remove_tag).and_raise
2296
+ begin; post.tags.send(method, tag); rescue; end
2297
+ end
2298
+
2299
+ it 'removes the document from the relation' do
2300
+ expect(post.tags).to be_empty
2301
+ end
2347
2302
  end
2348
2303
  end
2349
2304
  end
2350
2305
  end
2351
2306
  end
2352
2307
 
2353
- [ :delete_all, :destroy_all ].each do |method|
2354
-
2355
- describe "##{method}" do
2356
-
2357
- context "when the relation is not polymorphic" do
2358
-
2359
- context "when conditions are provided" do
2360
-
2361
- let(:person) do
2362
- Person.create
2363
- end
2308
+ %i[ delete_all destroy_all ].each do |method|
2309
+ describe "\##{method}" do
2310
+ context 'when the relation is not polymorphic' do
2311
+ context 'when conditions are provided' do
2312
+ let(:person) { Person.create! }
2364
2313
 
2365
2314
  let!(:preference_one) do
2366
- person.preferences.create(name: "Testing")
2315
+ person.preferences.create!(name: "Testing")
2367
2316
  end
2368
2317
 
2369
2318
  let!(:preference_two) do
2370
- person.preferences.create(name: "Test")
2319
+ person.preferences.create!(name: "Test")
2371
2320
  end
2372
2321
 
2373
2322
  let!(:deleted) do
@@ -2392,14 +2341,18 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2392
2341
  it "removes the ids from the foreign key" do
2393
2342
  expect(person.preference_ids).to eq([ preference_two.id ])
2394
2343
  end
2344
+
2345
+ it "sets the association locally" do
2346
+ expect(person.preferences).to eq([preference_two])
2347
+ end
2395
2348
  end
2396
2349
 
2397
2350
  context "when conditions are not provided" do
2398
2351
 
2399
2352
  let(:person) do
2400
- Person.create.tap do |person|
2401
- person.preferences.create(name: "Testing")
2402
- person.preferences.create(name: "Test")
2353
+ Person.create!.tap do |person|
2354
+ person.preferences.create!(name: "Testing")
2355
+ person.preferences.create!(name: "Test")
2403
2356
  end
2404
2357
  end
2405
2358
 
@@ -2418,6 +2371,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2418
2371
  it "returns the number of documents deleted" do
2419
2372
  expect(deleted).to eq(2)
2420
2373
  end
2374
+
2375
+ it "sets the association locally" do
2376
+ expect(person.preferences).to eq([])
2377
+ end
2421
2378
  end
2422
2379
  end
2423
2380
  end
@@ -2433,13 +2390,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2433
2390
  describe "#exists?" do
2434
2391
 
2435
2392
  let!(:person) do
2436
- Person.create
2393
+ Person.create!
2437
2394
  end
2438
2395
 
2439
2396
  context "when documents exist in the database" do
2440
2397
 
2441
2398
  before do
2442
- person.preferences.create
2399
+ person.preferences.create!
2443
2400
  end
2444
2401
 
2445
2402
  it "returns true" do
@@ -2464,23 +2421,23 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2464
2421
  context "when the relation is not polymorphic" do
2465
2422
 
2466
2423
  let(:person) do
2467
- Person.create
2424
+ Person.create!
2468
2425
  end
2469
2426
 
2470
2427
  let!(:preference_one) do
2471
- person.preferences.create(name: "Test")
2428
+ person.preferences.create!(name: "Test")
2472
2429
  end
2473
2430
 
2474
2431
  let!(:preference_two) do
2475
- person.preferences.create(name: "OMG I has relations")
2432
+ person.preferences.create!(name: "OMG I has relations")
2476
2433
  end
2477
2434
 
2478
2435
  let!(:unrelated_pref) do
2479
- Preference.create(name: "orphan annie")
2436
+ Preference.create!(name: "orphan annie")
2480
2437
  end
2481
2438
 
2482
2439
  let!(:unrelated_pref_two) do
2483
- Preference.create(name: "orphan two")
2440
+ Preference.create!(name: "orphan two")
2484
2441
  end
2485
2442
 
2486
2443
  context "when providing an id" do
@@ -2505,7 +2462,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2505
2462
  it "raises an error" do
2506
2463
  expect {
2507
2464
  preference
2508
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2465
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2509
2466
  end
2510
2467
  end
2511
2468
 
@@ -2520,7 +2477,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2520
2477
  it "raises an error" do
2521
2478
  expect {
2522
2479
  person.preferences.find(BSON::ObjectId.new)
2523
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2480
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2524
2481
  end
2525
2482
  end
2526
2483
 
@@ -2558,7 +2515,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2558
2515
  end
2559
2516
  end
2560
2517
 
2561
- context "when the ids matche unreferenced documents" do
2518
+ context "when the ids match unreferenced documents" do
2562
2519
 
2563
2520
  let(:preferences) do
2564
2521
  person.preferences.find(
@@ -2569,7 +2526,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2569
2526
  it "raises an error" do
2570
2527
  expect {
2571
2528
  preferences
2572
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2529
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2573
2530
  end
2574
2531
  end
2575
2532
 
@@ -2584,7 +2541,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2584
2541
  it "raises an error" do
2585
2542
  expect {
2586
2543
  person.preferences.find([ BSON::ObjectId.new ])
2587
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2544
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2588
2545
  end
2589
2546
  end
2590
2547
 
@@ -2616,11 +2573,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2616
2573
  context "when the relation is not polymorphic" do
2617
2574
 
2618
2575
  let(:person) do
2619
- Person.create
2576
+ Person.create!
2620
2577
  end
2621
2578
 
2622
2579
  let!(:preference) do
2623
- person.preferences.create(name: "Testing")
2580
+ person.preferences.create!(name: "Testing")
2624
2581
  end
2625
2582
 
2626
2583
  context "when the document exists" do
@@ -2656,11 +2613,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2656
2613
  context "when the relation is not polymorphic" do
2657
2614
 
2658
2615
  let(:person) do
2659
- Person.create
2616
+ Person.create!
2660
2617
  end
2661
2618
 
2662
2619
  let!(:preference) do
2663
- person.preferences.create(name: "Testing")
2620
+ person.preferences.create!(name: "Testing")
2664
2621
  end
2665
2622
 
2666
2623
  context "when the document exists" do
@@ -2705,11 +2662,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2705
2662
  context "when the relation is not polymorphic" do
2706
2663
 
2707
2664
  let(:person) do
2708
- Person.create
2665
+ Person.create!
2709
2666
  end
2710
2667
 
2711
2668
  let!(:preference) do
2712
- person.preferences.create(name: "Testing")
2669
+ person.preferences.create!(name: "Testing")
2713
2670
  end
2714
2671
 
2715
2672
  context "when the document exists" do
@@ -2743,15 +2700,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2743
2700
  describe "#max" do
2744
2701
 
2745
2702
  let(:person) do
2746
- Person.create
2703
+ Person.create!
2747
2704
  end
2748
2705
 
2749
2706
  let(:preference_one) do
2750
- Preference.create(ranking: 5)
2707
+ Preference.create!(ranking: 5)
2751
2708
  end
2752
2709
 
2753
2710
  let(:preference_two) do
2754
- Preference.create(ranking: 10)
2711
+ Preference.create!(ranking: 10)
2755
2712
  end
2756
2713
 
2757
2714
  before do
@@ -2772,15 +2729,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2772
2729
  describe "#max_by" do
2773
2730
 
2774
2731
  let(:person) do
2775
- Person.create
2732
+ Person.create!
2776
2733
  end
2777
2734
 
2778
2735
  let(:preference_one) do
2779
- Preference.create(ranking: 5)
2736
+ Preference.create!(ranking: 5)
2780
2737
  end
2781
2738
 
2782
2739
  let(:preference_two) do
2783
- Preference.create(ranking: 10)
2740
+ Preference.create!(ranking: 10)
2784
2741
  end
2785
2742
 
2786
2743
  before do
@@ -2799,19 +2756,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2799
2756
  describe "#method_missing" do
2800
2757
 
2801
2758
  let!(:person) do
2802
- Person.create
2759
+ Person.create!
2803
2760
  end
2804
2761
 
2805
2762
  let!(:preference_one) do
2806
- person.preferences.create(name: "First", value: "Posting")
2763
+ person.preferences.create!(name: "First", value: "Posting")
2807
2764
  end
2808
2765
 
2809
2766
  let!(:preference_two) do
2810
- person.preferences.create(name: "Second", value: "Testing")
2767
+ person.preferences.create!(name: "Second", value: "Testing")
2811
2768
  end
2812
2769
 
2813
2770
  let!(:unrelated) do
2814
- Preference.create(name: "Third")
2771
+ Preference.create!(name: "Third")
2815
2772
  end
2816
2773
 
2817
2774
  context "when providing a single criteria" do
@@ -2886,7 +2843,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2886
2843
  context "when the inverse relation is not defined" do
2887
2844
 
2888
2845
  let!(:house) do
2889
- person.houses.create(name: "Wayne Manor")
2846
+ person.houses.create!(name: "Wayne Manor")
2890
2847
  end
2891
2848
 
2892
2849
  it "returns the distinct values for the fields" do
@@ -2900,15 +2857,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2900
2857
  describe "#min" do
2901
2858
 
2902
2859
  let(:person) do
2903
- Person.create
2860
+ Person.create!
2904
2861
  end
2905
2862
 
2906
2863
  let(:preference_one) do
2907
- Preference.create(ranking: 5)
2864
+ Preference.create!(ranking: 5)
2908
2865
  end
2909
2866
 
2910
2867
  let(:preference_two) do
2911
- Preference.create(ranking: 10)
2868
+ Preference.create!(ranking: 10)
2912
2869
  end
2913
2870
 
2914
2871
  before do
@@ -2929,15 +2886,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2929
2886
  describe "#min_by" do
2930
2887
 
2931
2888
  let(:person) do
2932
- Person.create
2889
+ Person.create!
2933
2890
  end
2934
2891
 
2935
2892
  let(:preference_one) do
2936
- Preference.create(ranking: 5)
2893
+ Preference.create!(ranking: 5)
2937
2894
  end
2938
2895
 
2939
2896
  let(:preference_two) do
2940
- Preference.create(ranking: 10)
2897
+ Preference.create!(ranking: 10)
2941
2898
  end
2942
2899
 
2943
2900
  before do
@@ -2963,15 +2920,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2963
2920
  describe "#nullify_all" do
2964
2921
 
2965
2922
  let(:person) do
2966
- Person.create
2923
+ Person.create!
2967
2924
  end
2968
2925
 
2969
2926
  let!(:preference_one) do
2970
- person.preferences.create(name: "One")
2927
+ person.preferences.create!(name: "One")
2971
2928
  end
2972
2929
 
2973
2930
  let!(:preference_two) do
2974
- person.preferences.create(name: "Two")
2931
+ person.preferences.create!(name: "Two")
2975
2932
  end
2976
2933
 
2977
2934
  before do
@@ -3017,9 +2974,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3017
2974
  person.preferences
3018
2975
  end
3019
2976
 
3020
- Array.public_instance_methods.each do |method|
2977
+ Array.public_instance_methods.sort.each do |method|
2978
+
2979
+ context "when checking Array##{method}" do
3021
2980
 
3022
- context "when checking #{method}" do
2981
+ before do
2982
+ expect([].respond_to?(method)).to be true
2983
+ end
3023
2984
 
3024
2985
  it "returns true" do
3025
2986
  expect(preferences.respond_to?(method)).to be true
@@ -3027,9 +2988,9 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3027
2988
  end
3028
2989
  end
3029
2990
 
3030
- Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy.public_instance_methods.each do |method|
2991
+ Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy.public_instance_methods.sort.each do |method|
3031
2992
 
3032
- context "when checking #{method}" do
2993
+ context "when checking Proxy##{method}" do
3033
2994
 
3034
2995
  it "returns true" do
3035
2996
  expect(preferences.respond_to?(method)).to be true
@@ -3037,9 +2998,9 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3037
2998
  end
3038
2999
  end
3039
3000
 
3040
- Preference.scopes.keys.each do |method|
3001
+ Preference.scopes.keys.sort.each do |method|
3041
3002
 
3042
- context "when checking #{method}" do
3003
+ context "when checking scope #{method}" do
3043
3004
 
3044
3005
  it "returns true" do
3045
3006
  expect(preferences.respond_to?(method)).to be true
@@ -3050,20 +3011,36 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3050
3011
 
3051
3012
  describe "#scoped" do
3052
3013
 
3053
- let(:person) do
3054
- Person.new
3055
- end
3056
-
3057
3014
  let(:scoped) do
3058
3015
  person.preferences.scoped
3059
3016
  end
3060
3017
 
3061
- it "returns the relation criteria" do
3062
- expect(scoped).to be_a(Mongoid::Criteria)
3018
+ context 'when association is empty' do
3019
+
3020
+ let(:person) do
3021
+ Person.new
3022
+ end
3023
+
3024
+ it "returns the relation criteria" do
3025
+ expect(scoped).to be_a(Mongoid::Criteria)
3026
+ end
3027
+
3028
+ it "returns with an empty selector" do
3029
+ expect(scoped.selector).to eq("_id" => { "$in" => [] })
3030
+ end
3063
3031
  end
3064
3032
 
3065
- it "returns with an empty selector" do
3066
- expect(scoped.selector).to eq({ "$and" => [{ "_id" => { "$in" => [] }}]})
3033
+ context 'when association is not empty' do
3034
+
3035
+ let(:person) do
3036
+ Person.create!(preferences: [
3037
+ Preference.new(id: 123),
3038
+ ])
3039
+ end
3040
+
3041
+ it "returns with a selector including association element ids" do
3042
+ expect(scoped.selector).to eq("_id" => { "$in" => [123] })
3043
+ end
3067
3044
  end
3068
3045
  end
3069
3046
 
@@ -3072,13 +3049,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3072
3049
  describe "##{method}" do
3073
3050
 
3074
3051
  let(:person) do
3075
- Person.create
3052
+ Person.create!
3076
3053
  end
3077
3054
 
3078
3055
  context "when documents have been persisted" do
3079
3056
 
3080
3057
  let!(:preference) do
3081
- person.preferences.create(name: "Testing")
3058
+ person.preferences.create!(name: "Testing")
3082
3059
  end
3083
3060
 
3084
3061
  it "returns the number of documents" do
@@ -3090,7 +3067,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3090
3067
 
3091
3068
  before do
3092
3069
  person.preferences.build(name: "Test")
3093
- person.preferences.create(name: "Test 2")
3070
+ person.preferences.create!(name: "Test 2")
3094
3071
  end
3095
3072
 
3096
3073
  it "returns the total number of documents" do
@@ -3105,15 +3082,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3105
3082
  context "when the relation has no default scope" do
3106
3083
 
3107
3084
  let!(:person) do
3108
- Person.create
3085
+ Person.create!
3109
3086
  end
3110
3087
 
3111
3088
  let!(:preference_one) do
3112
- person.preferences.create(name: "first")
3089
+ person.preferences.create!(name: "first")
3113
3090
  end
3114
3091
 
3115
3092
  let!(:preference_two) do
3116
- Preference.create(name: "second")
3093
+ Preference.create!(name: "second")
3117
3094
  end
3118
3095
 
3119
3096
  let(:unscoped) do
@@ -3128,15 +3105,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3128
3105
  context "when the relation has a default scope" do
3129
3106
 
3130
3107
  let!(:person) do
3131
- Person.create
3108
+ Person.create!
3132
3109
  end
3133
3110
 
3134
3111
  let!(:house_one) do
3135
- person.houses.create(name: "first")
3112
+ person.houses.create!(name: "first")
3136
3113
  end
3137
3114
 
3138
3115
  let!(:house_two) do
3139
- House.create(name: "second")
3116
+ House.create!(name: "second")
3140
3117
  end
3141
3118
 
3142
3119
  let(:unscoped) do
@@ -3172,10 +3149,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3172
3149
  end
3173
3150
 
3174
3151
  before do
3175
- person.update_attributes(
3152
+ person.update_attributes!(
3176
3153
  houses: [ wife_house, exwife_house, girlfriend_house ]
3177
3154
  )
3178
- person.update_attributes(house_ids: [ girlfriend_house.id ])
3155
+ person.update_attributes!(house_ids: [ girlfriend_house.id ])
3179
3156
  end
3180
3157
 
3181
3158
  context "when reloading" do
@@ -3222,7 +3199,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3222
3199
  end
3223
3200
 
3224
3201
  let!(:business) do
3225
- Business.create(name: "serious", owners: [ user ])
3202
+ Business.create!(name: "serious", owners: [ user ])
3226
3203
  end
3227
3204
 
3228
3205
  before do
@@ -3265,11 +3242,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3265
3242
  context "when the documents are persisted" do
3266
3243
 
3267
3244
  let(:user) do
3268
- User.create(name: "tst")
3245
+ User.create!(name: "tst")
3269
3246
  end
3270
3247
 
3271
3248
  let(:business) do
3272
- Business.create(name: "srs", owners: [ user ])
3249
+ Business.create!(name: "srs", owners: [ user ])
3273
3250
  end
3274
3251
 
3275
3252
  before do
@@ -3313,11 +3290,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3313
3290
  context "when binding the relation multiple times" do
3314
3291
 
3315
3292
  let(:person) do
3316
- Person.create
3293
+ Person.create!
3317
3294
  end
3318
3295
 
3319
3296
  let(:preference) do
3320
- person.preferences.create(name: "testing")
3297
+ person.preferences.create!(name: "testing")
3321
3298
  end
3322
3299
 
3323
3300
  before do
@@ -3336,19 +3313,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3336
3313
  context "when the association has order criteria" do
3337
3314
 
3338
3315
  let(:person) do
3339
- Person.create
3316
+ Person.create!
3340
3317
  end
3341
3318
 
3342
3319
  let(:preference_one) do
3343
- OrderedPreference.create(name: 'preference-1', value: 10)
3320
+ OrderedPreference.create!(name: 'preference-1', value: 10)
3344
3321
  end
3345
3322
 
3346
3323
  let(:preference_two) do
3347
- OrderedPreference.create(name: 'preference-2', value: 20)
3324
+ OrderedPreference.create!(name: 'preference-2', value: 20)
3348
3325
  end
3349
3326
 
3350
3327
  let(:preference_three) do
3351
- OrderedPreference.create(name: 'preference-3', value: 20)
3328
+ OrderedPreference.create!(name: 'preference-3', value: 20)
3352
3329
  end
3353
3330
 
3354
3331
  before do
@@ -3372,7 +3349,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3372
3349
  context "when the parent is not a new record and freshly loaded" do
3373
3350
 
3374
3351
  let(:person) do
3375
- Person.create
3352
+ Person.create!
3376
3353
  end
3377
3354
 
3378
3355
  let(:preference) do
@@ -3381,7 +3358,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3381
3358
 
3382
3359
  before do
3383
3360
  person.preferences = [ preference ]
3384
- person.save
3361
+ person.save!
3385
3362
  person.reload
3386
3363
  person.preferences = nil
3387
3364
  end
@@ -3404,15 +3381,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3404
3381
  context "when reloading the relation" do
3405
3382
 
3406
3383
  let!(:person) do
3407
- Person.create
3384
+ Person.create!
3408
3385
  end
3409
3386
 
3410
3387
  let!(:preference_one) do
3411
- Preference.create(name: "one")
3388
+ Preference.create!(name: "one")
3412
3389
  end
3413
3390
 
3414
3391
  let!(:preference_two) do
3415
- Preference.create(name: "two")
3392
+ Preference.create!(name: "two")
3416
3393
  end
3417
3394
 
3418
3395
  before do
@@ -3456,7 +3433,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3456
3433
  context "when the document is new" do
3457
3434
 
3458
3435
  let!(:person) do
3459
- Person.create(preference_names: "one, two")
3436
+ Person.create!(preference_names: "one, two")
3460
3437
  end
3461
3438
 
3462
3439
  let(:preference_one) do
@@ -3492,23 +3469,23 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3492
3469
  end
3493
3470
 
3494
3471
  let(:preference_one) do
3495
- Preference.create(name: "one")
3472
+ Preference.create!(name: "one")
3496
3473
  end
3497
3474
 
3498
3475
  let(:preference_two) do
3499
- Preference.create(name: "two")
3476
+ Preference.create!(name: "two")
3500
3477
  end
3501
3478
 
3502
3479
  before do
3503
3480
  person.preference_ids = [ preference_one.id, preference_two.id ]
3504
- person.save
3481
+ person.save!
3505
3482
  end
3506
3483
 
3507
3484
  context "and the order is changed" do
3508
3485
 
3509
3486
  before do
3510
3487
  person.preference_ids = [ preference_two.id, preference_one.id ]
3511
- person.save
3488
+ person.save!
3512
3489
  end
3513
3490
 
3514
3491
  let(:reloaded) do
@@ -3525,13 +3502,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3525
3502
  context "and the order is changed and an element is added" do
3526
3503
 
3527
3504
  let(:preference_three) do
3528
- Preference.create(name: "three")
3505
+ Preference.create!(name: "three")
3529
3506
  end
3530
3507
 
3531
3508
  before do
3532
3509
  person.preference_ids =
3533
3510
  [ preference_two.id, preference_one.id, preference_three.id ]
3534
- person.save
3511
+ person.save!
3535
3512
  end
3536
3513
 
3537
3514
  let(:reloaded) do
@@ -3548,16 +3525,16 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3548
3525
  context "and the order is changed and an element is removed" do
3549
3526
 
3550
3527
  let(:preference_three) do
3551
- Preference.create(name: "three")
3528
+ Preference.create!(name: "three")
3552
3529
  end
3553
3530
 
3554
3531
  before do
3555
3532
  person.preference_ids =
3556
3533
  [ preference_one.id, preference_two.id, preference_three.id ]
3557
- person.save
3534
+ person.save!
3558
3535
  person.preference_ids =
3559
3536
  [ preference_three.id, preference_two.id ]
3560
- person.save
3537
+ person.save!
3561
3538
  end
3562
3539
 
3563
3540
  let(:reloaded) do
@@ -3607,15 +3584,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3607
3584
  context "when the relation exists" do
3608
3585
 
3609
3586
  let!(:person) do
3610
- Person.create
3587
+ Person.create!
3611
3588
  end
3612
3589
 
3613
3590
  let!(:pref_one) do
3614
- person.preferences.create
3591
+ person.preferences.create!
3615
3592
  end
3616
3593
 
3617
3594
  let!(:pref_two) do
3618
- Preference.create
3595
+ Preference.create!
3619
3596
  end
3620
3597
 
3621
3598
  before do
@@ -3631,15 +3608,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3631
3608
  context "when using a different primary key" do
3632
3609
 
3633
3610
  let(:dog) do
3634
- Dog.create(name: 'Doggie')
3611
+ Dog.create!(name: 'Doggie')
3635
3612
  end
3636
3613
 
3637
3614
  let(:cat) do
3638
- Cat.create(name: 'Kitty')
3615
+ Cat.create!(name: 'Kitty')
3616
+ end
3617
+
3618
+ let(:another_cat) do
3619
+ Cat.create!(name: 'Kitten')
3639
3620
  end
3640
3621
 
3641
3622
  let(:fire_hydrant) do
3642
- FireHydrant.create(location: '221B Baker Street')
3623
+ FireHydrant.create!(location: '221B Baker Street')
3643
3624
  end
3644
3625
 
3645
3626
  context "when adding to a one-way many to many" do
@@ -3653,6 +3634,28 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3653
3634
  end
3654
3635
  end
3655
3636
 
3637
+ context "when adding multiple documents to a one-way many to many" do
3638
+
3639
+ before do
3640
+ fire_hydrant.cats.push([cat, another_cat])
3641
+ end
3642
+
3643
+ it "adds the pk values to the fk set" do
3644
+ expect(fire_hydrant.cat_ids).to eq([cat.name, another_cat.name])
3645
+ end
3646
+ end
3647
+
3648
+ context "when adding a new document to a one-way many to many" do
3649
+
3650
+ before do
3651
+ fire_hydrant.cats.build name: 'Kitten'
3652
+ end
3653
+
3654
+ it "adds the pk values to the fk set" do
3655
+ expect(fire_hydrant.cat_ids).to eq(['Kitten'])
3656
+ end
3657
+ end
3658
+
3656
3659
  context "when adding to a two-way many to many" do
3657
3660
 
3658
3661
  before do
@@ -3709,10 +3712,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3709
3712
  end
3710
3713
 
3711
3714
  it "should assign relation from both sides" do
3712
- p1 = Project.create name: 'Foo'
3713
- p2 = Project.create name: 'Bar'
3714
- d1 = Distributor.create name: 'Rock'
3715
- d2 = Distributor.create name: 'Soul'
3715
+ p1 = Project.create! name: 'Foo'
3716
+ p2 = Project.create! name: 'Bar'
3717
+ d1 = Distributor.create! name: 'Rock'
3718
+ d2 = Distributor.create! name: 'Soul'
3716
3719
 
3717
3720
  p1.distributors << d1
3718
3721
  expect(p1.d_ids).to match_array([d1.id])
@@ -3722,4 +3725,58 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3722
3725
  expect(p2.d_ids).to match_array([d2.id])
3723
3726
  end
3724
3727
  end
3728
+
3729
+ context "when accesing own _id from parent's foreign key in default" do
3730
+ let!(:contract) { HabtmmContract.create! }
3731
+ let!(:signature) { contract.signatures.create! }
3732
+
3733
+ it "is nil" do
3734
+ expect(signature.favorite_signature).to be nil
3735
+ end
3736
+ end
3737
+
3738
+ context "when setting an association on a model that uses the class_name option" do
3739
+ let!(:contract) { HabtmmContract.create! }
3740
+ let!(:signature) { HabtmmSignature.create!(contracts: [contract]) }
3741
+
3742
+ it "populates the inverse foreign key" do
3743
+ expect(signature.contracts.first.signature_ids).to eq([signature.id])
3744
+ end
3745
+ end
3746
+
3747
+ context "when there is a foreign key in the aliased associations" do
3748
+ it "has the correct aliases" do
3749
+ expect(Dog.aliased_associations["breed_ids"]).to eq("breeds")
3750
+ expect(Breed.aliased_associations["dog_ids"]).to eq("dogs")
3751
+ end
3752
+ end
3753
+
3754
+ # This test is for MONGOID-5344 which tests that the initial call to
3755
+ # signature_ids refers to the same array as subsequent calls to signature_ids.
3756
+ # Prior to the change in that ticket, this test broke because the array
3757
+ # returned from write_attribute (which is triggered the first time the
3758
+ # foreign key array is referenced, to set the default), refers to a different
3759
+ # array to the one stored in the attributes hash. This happened because,
3760
+ # when retrieving a document from the database, the attributes hash is actually
3761
+ # a BSON::Document, which applies a transformation to the array before
3762
+ # storing it.
3763
+ context "when executing concat on foreign key array from the db" do
3764
+ config_override :legacy_attributes, false
3765
+
3766
+ before do
3767
+ HabtmmContract.create!
3768
+ HabtmmSignature.create!
3769
+ end
3770
+
3771
+ let!(:contract) { HabtmmContract.first }
3772
+ let!(:signature) { HabtmmSignature.first }
3773
+
3774
+ before do
3775
+ contract.signature_ids.concat([signature.id])
3776
+ end
3777
+
3778
+ it "works on the first attempt" do
3779
+ expect(contract.signature_ids).to eq([signature.id])
3780
+ end
3781
+ end
3725
3782
  end