mongoid 7.5.1 → 8.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +3 -3
- data/README.md +6 -6
- data/Rakefile +25 -0
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +40 -11
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +5 -3
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +54 -14
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +8 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +45 -7
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +15 -4
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
- data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +4 -4
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
- data/lib/mongoid/atomic.rb +7 -0
- data/lib/mongoid/attributes/dynamic.rb +4 -4
- data/lib/mongoid/attributes/nested.rb +6 -6
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +3 -3
- data/lib/mongoid/attributes.rb +51 -42
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/changeable.rb +147 -14
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +3 -15
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/options.rb +3 -0
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +145 -17
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +285 -58
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +521 -333
- data/lib/mongoid/contextual/none.rb +193 -20
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +14 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +8 -5
- data/lib/mongoid/criteria/includable.rb +27 -22
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +4 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +11 -17
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
- data/lib/mongoid/criteria/queryable/selector.rb +93 -8
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +20 -40
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +135 -36
- data/lib/mongoid/equality.rb +8 -8
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +6 -3
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +19 -8
- data/lib/mongoid/extensions/integer.rb +7 -4
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +10 -8
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +29 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +55 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +19 -4
- data/lib/mongoid/fields/standard.rb +17 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +129 -20
- data/lib/mongoid/findable.rb +54 -24
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +76 -15
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/matcher.rb +33 -13
- data/lib/mongoid/persistable/creatable.rb +19 -9
- data/lib/mongoid/persistable/deletable.rb +2 -2
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +14 -2
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +69 -12
- data/lib/mongoid/persistable/upsertable.rb +21 -2
- data/lib/mongoid/persistable.rb +6 -3
- data/lib/mongoid/persistence_context.rb +63 -10
- data/lib/mongoid/query_cache.rb +13 -261
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +10 -8
- data/lib/mongoid/scopable.rb +15 -13
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +10 -6
- data/lib/mongoid/shardable.rb +35 -11
- data/lib/mongoid/stateful.rb +57 -10
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -4
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +5 -7
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +9 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +19 -4
- data/lib/mongoid.rb +17 -3
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +10 -14
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +132 -1
- data/spec/integration/callbacks_spec.rb +360 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +118 -80
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -32
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +276 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +158 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +215 -228
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +193 -177
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +15 -1
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +554 -33
- data/spec/mongoid/cacheable_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +429 -37
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +179 -15
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +220 -30
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +850 -88
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +1570 -413
- data/spec/mongoid/contextual/none_spec.rb +60 -21
- data/spec/mongoid/copyable_spec.rb +453 -11
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
- data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
- data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +1 -5
- data/spec/mongoid/criteria_spec.rb +469 -1205
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +639 -106
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +80 -37
- data/spec/mongoid/fields_spec.rb +500 -84
- data/spec/mongoid/findable_spec.rb +450 -58
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +55 -30
- data/spec/mongoid/interceptable_spec.rb +599 -8
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +28 -8
- data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
- data/spec/mongoid/persistence_context_spec.rb +57 -58
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +56 -215
- data/spec/mongoid/reloadable_spec.rb +83 -6
- data/spec/mongoid/scopable_spec.rb +91 -1
- data/spec/mongoid/serializable_spec.rb +9 -30
- data/spec/mongoid/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +157 -51
- data/spec/mongoid/stateful_spec.rb +150 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +392 -4
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +390 -2
- data/spec/mongoid/touchable_spec_models.rb +14 -8
- data/spec/mongoid/traversable_spec.rb +13 -35
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +34 -10
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/lite_constraints.rb +8 -0
- data/spec/shared/shlib/server.sh +5 -5
- data/spec/spec_helper.rb +5 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +78 -0
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +4 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/product.rb +1 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data.tar.gz.sig +0 -0
- metadata +720 -638
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "spec_helper"
|
|
4
|
+
require_relative "../has_and_belongs_to_many_models"
|
|
4
5
|
|
|
5
6
|
describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
7
|
+
config_override :raise_not_found_error, true
|
|
6
8
|
|
|
7
9
|
around(:each) do |example|
|
|
8
|
-
original_raise_not_found_error = Mongoid.raise_not_found_error
|
|
9
10
|
original_preferences_association = Person.relations["preferences"]
|
|
10
|
-
Mongoid.raise_not_found_error = true
|
|
11
11
|
Person.has_and_belongs_to_many :preferences, autosave: true
|
|
12
12
|
example.run
|
|
13
|
-
Mongoid.raise_not_found_error = original_raise_not_found_error
|
|
14
13
|
Person.relations["preferences"] = original_preferences_association
|
|
15
14
|
end
|
|
16
15
|
|
|
@@ -2086,283 +2085,229 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2086
2085
|
end
|
|
2087
2086
|
end
|
|
2088
2087
|
|
|
2089
|
-
|
|
2088
|
+
%i[ delete delete_one ].each do |method|
|
|
2089
|
+
describe "\##{method}" do
|
|
2090
|
+
let(:person) { Person.create! }
|
|
2091
|
+
let(:preference_one) { Preference.create!(name: "Testing") }
|
|
2092
|
+
let(:preference_two) { Preference.create!(name: "Test") }
|
|
2090
2093
|
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
end
|
|
2094
|
-
|
|
2095
|
-
let(:preference_one) do
|
|
2096
|
-
Preference.create!(name: "Testing")
|
|
2097
|
-
end
|
|
2098
|
-
|
|
2099
|
-
let(:preference_two) do
|
|
2100
|
-
Preference.create!(name: "Test")
|
|
2101
|
-
end
|
|
2102
|
-
|
|
2103
|
-
before do
|
|
2104
|
-
person.preferences << [ preference_one, preference_two ]
|
|
2105
|
-
end
|
|
2106
|
-
|
|
2107
|
-
context "when the document exists" do
|
|
2108
|
-
|
|
2109
|
-
let!(:deleted) do
|
|
2110
|
-
person.preferences.delete(preference_one)
|
|
2111
|
-
end
|
|
2112
|
-
|
|
2113
|
-
it "removes the document from the relation" do
|
|
2114
|
-
expect(person.preferences).to eq([ preference_two ])
|
|
2115
|
-
end
|
|
2116
|
-
|
|
2117
|
-
it "returns the document" do
|
|
2118
|
-
expect(deleted).to eq(preference_one)
|
|
2119
|
-
end
|
|
2120
|
-
|
|
2121
|
-
it "removes the document key from the foreign key" do
|
|
2122
|
-
expect(person.preference_ids).to eq([ preference_two.id ])
|
|
2123
|
-
end
|
|
2124
|
-
|
|
2125
|
-
it "removes the inverse reference" do
|
|
2126
|
-
expect(deleted.reload.people).to be_empty
|
|
2127
|
-
end
|
|
2128
|
-
|
|
2129
|
-
it "removes the base id from the inverse keys" do
|
|
2130
|
-
expect(deleted.reload.person_ids).to be_empty
|
|
2094
|
+
before do
|
|
2095
|
+
person.preferences << [ preference_one, preference_two ]
|
|
2131
2096
|
end
|
|
2132
2097
|
|
|
2133
|
-
context
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
person.reload
|
|
2137
|
-
preference_one.reload
|
|
2138
|
-
preference_two.reload
|
|
2098
|
+
context 'when the document exists' do
|
|
2099
|
+
let!(:deleted) do
|
|
2100
|
+
person.preferences.send(method, preference_one)
|
|
2139
2101
|
end
|
|
2140
2102
|
|
|
2141
|
-
it
|
|
2103
|
+
it 'removes the document from the relation' do
|
|
2142
2104
|
expect(person.preferences).to eq([ preference_two ])
|
|
2143
2105
|
end
|
|
2144
2106
|
|
|
2145
|
-
it
|
|
2146
|
-
expect(
|
|
2107
|
+
it 'returns the document' do
|
|
2108
|
+
expect(deleted).to eq(preference_one)
|
|
2147
2109
|
end
|
|
2148
|
-
end
|
|
2149
|
-
end
|
|
2150
|
-
|
|
2151
|
-
context "when the document does not exist" do
|
|
2152
|
-
|
|
2153
|
-
let!(:deleted) do
|
|
2154
|
-
person.preferences.delete(Preference.new)
|
|
2155
|
-
end
|
|
2156
|
-
|
|
2157
|
-
it "returns nil" do
|
|
2158
|
-
expect(deleted).to be_nil
|
|
2159
|
-
end
|
|
2160
|
-
|
|
2161
|
-
it "does not modify the relation" do
|
|
2162
|
-
expect(person.preferences).to eq([ preference_one, preference_two ])
|
|
2163
|
-
end
|
|
2164
|
-
|
|
2165
|
-
it "does not modify the keys" do
|
|
2166
|
-
expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
|
|
2167
|
-
end
|
|
2168
|
-
end
|
|
2169
|
-
|
|
2170
|
-
context "when :dependent => :nullify is set" do
|
|
2171
|
-
|
|
2172
|
-
context "when :inverse_of is set" do
|
|
2173
2110
|
|
|
2174
|
-
|
|
2175
|
-
|
|
2111
|
+
it 'removes the document key from the foreign key' do
|
|
2112
|
+
expect(person.preference_ids).to eq([ preference_two.id ])
|
|
2176
2113
|
end
|
|
2177
2114
|
|
|
2178
|
-
|
|
2179
|
-
|
|
2115
|
+
it 'removes the inverse reference' do
|
|
2116
|
+
expect(deleted.reload.people).to be_empty
|
|
2180
2117
|
end
|
|
2181
2118
|
|
|
2182
|
-
it
|
|
2183
|
-
expect(
|
|
2119
|
+
it 'removes the base id from the inverse keys' do
|
|
2120
|
+
expect(deleted.reload.person_ids).to be_empty
|
|
2184
2121
|
end
|
|
2185
|
-
end
|
|
2186
|
-
end
|
|
2187
2122
|
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2123
|
+
context 'and person and preferences are reloaded' do
|
|
2124
|
+
before do
|
|
2125
|
+
person.reload
|
|
2126
|
+
preference_one.reload
|
|
2127
|
+
preference_two.reload
|
|
2128
|
+
end
|
|
2193
2129
|
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2130
|
+
it 'nullifies the deleted preference' do
|
|
2131
|
+
expect(person.preferences).to eq([ preference_two ])
|
|
2132
|
+
end
|
|
2197
2133
|
|
|
2198
|
-
|
|
2199
|
-
|
|
2134
|
+
it 'retains the ids for one preference' do
|
|
2135
|
+
expect(person.preference_ids).to eq([ preference_two.id ])
|
|
2136
|
+
end
|
|
2137
|
+
end
|
|
2200
2138
|
end
|
|
2201
2139
|
|
|
2202
|
-
context
|
|
2203
|
-
|
|
2140
|
+
context 'when the document does not exist' do
|
|
2204
2141
|
let!(:deleted) do
|
|
2205
|
-
|
|
2206
|
-
end
|
|
2207
|
-
|
|
2208
|
-
it "deletes the document from the relation" do
|
|
2209
|
-
expect(tag_one.related).to be_empty
|
|
2142
|
+
person.preferences.send(method, Preference.new)
|
|
2210
2143
|
end
|
|
2211
2144
|
|
|
2212
|
-
it
|
|
2213
|
-
expect(
|
|
2145
|
+
it 'returns nil' do
|
|
2146
|
+
expect(deleted).to be_nil
|
|
2214
2147
|
end
|
|
2215
2148
|
|
|
2216
|
-
it
|
|
2217
|
-
expect(
|
|
2149
|
+
it 'does not modify the relation' do
|
|
2150
|
+
expect(person.preferences).to eq([ preference_one, preference_two ])
|
|
2218
2151
|
end
|
|
2219
2152
|
|
|
2220
|
-
it
|
|
2221
|
-
expect(
|
|
2153
|
+
it 'does not modify the keys' do
|
|
2154
|
+
expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
|
|
2222
2155
|
end
|
|
2223
2156
|
end
|
|
2224
2157
|
|
|
2225
|
-
context
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
let(:reloaded) do
|
|
2230
|
-
tag_one.reload
|
|
2231
|
-
end
|
|
2232
|
-
|
|
2233
|
-
let!(:deleted) do
|
|
2234
|
-
reloaded.related.delete(tag_two)
|
|
2235
|
-
end
|
|
2158
|
+
context 'when :dependent => :nullify is set' do
|
|
2159
|
+
context 'when :inverse_of is set' do
|
|
2160
|
+
let(:event) { Event.create! }
|
|
2236
2161
|
|
|
2237
|
-
|
|
2238
|
-
|
|
2162
|
+
before do
|
|
2163
|
+
person.administrated_events << [ event ]
|
|
2239
2164
|
end
|
|
2240
2165
|
|
|
2241
|
-
it
|
|
2242
|
-
expect(
|
|
2166
|
+
it 'deletes the document' do
|
|
2167
|
+
expect(event.delete).to be true
|
|
2243
2168
|
end
|
|
2169
|
+
end
|
|
2170
|
+
end
|
|
2244
2171
|
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2172
|
+
context 'when the relationships are self referencing' do
|
|
2173
|
+
let(:tag_one) { Tag.create!(text: "one") }
|
|
2174
|
+
let(:tag_two) { Tag.create!(text: "two") }
|
|
2248
2175
|
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
end
|
|
2176
|
+
before do
|
|
2177
|
+
tag_one.related << tag_two
|
|
2252
2178
|
end
|
|
2253
2179
|
|
|
2254
|
-
context
|
|
2180
|
+
context 'when deleting without reloading' do
|
|
2181
|
+
let!(:deleted) { tag_one.related.send(method, tag_two) }
|
|
2255
2182
|
|
|
2256
|
-
|
|
2257
|
-
|
|
2183
|
+
it 'deletes the document from the relation' do
|
|
2184
|
+
expect(tag_one.related).to be_empty
|
|
2258
2185
|
end
|
|
2259
2186
|
|
|
2260
|
-
|
|
2261
|
-
|
|
2187
|
+
it 'deletes the foreign key from the relation' do
|
|
2188
|
+
expect(tag_one.related_ids).to be_empty
|
|
2262
2189
|
end
|
|
2263
2190
|
|
|
2264
|
-
it
|
|
2265
|
-
expect(
|
|
2266
|
-
end
|
|
2267
|
-
|
|
2268
|
-
it "deletes the foreign key from the relation" do
|
|
2269
|
-
expect(reloaded.related_ids).to be_empty
|
|
2191
|
+
it 'removes the reference from the inverse' do
|
|
2192
|
+
expect(deleted.related).to be_empty
|
|
2270
2193
|
end
|
|
2271
2194
|
|
|
2272
|
-
it
|
|
2195
|
+
it 'removes the foreign keys from the inverse' do
|
|
2273
2196
|
expect(deleted.related_ids).to be_empty
|
|
2274
2197
|
end
|
|
2275
2198
|
end
|
|
2276
|
-
end
|
|
2277
|
-
end
|
|
2278
2199
|
|
|
2279
|
-
|
|
2200
|
+
context 'when deleting with reloading' do
|
|
2201
|
+
context "when deleting from the front side" do
|
|
2202
|
+
let(:reloaded) { tag_one.reload }
|
|
2203
|
+
let!(:deleted) { reloaded.related.send(method, tag_two) }
|
|
2280
2204
|
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2205
|
+
it 'deletes the document from the relation' do
|
|
2206
|
+
expect(reloaded.related).to be_empty
|
|
2207
|
+
end
|
|
2284
2208
|
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2209
|
+
it 'deletes the foreign key from the relation' do
|
|
2210
|
+
expect(reloaded.related_ids).to be_empty
|
|
2211
|
+
end
|
|
2288
2212
|
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2213
|
+
it 'removes the reference from the inverse' do
|
|
2214
|
+
expect(deleted.related).to be_empty
|
|
2215
|
+
end
|
|
2292
2216
|
|
|
2293
|
-
|
|
2217
|
+
it 'removes the foreign keys from the inverse' do
|
|
2218
|
+
expect(deleted.related_ids).to be_empty
|
|
2219
|
+
end
|
|
2220
|
+
end
|
|
2294
2221
|
|
|
2295
|
-
|
|
2222
|
+
context 'when deleting from the inverse side' do
|
|
2223
|
+
let(:reloaded) { tag_two.reload }
|
|
2224
|
+
let!(:deleted) { reloaded.related.send(method, tag_one) }
|
|
2296
2225
|
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2226
|
+
it 'deletes the document from the relation' do
|
|
2227
|
+
expect(reloaded.related).to be_empty
|
|
2228
|
+
end
|
|
2300
2229
|
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2230
|
+
it 'deletes the foreign key from the relation' do
|
|
2231
|
+
expect(reloaded.related_ids).to be_empty
|
|
2232
|
+
end
|
|
2304
2233
|
|
|
2305
|
-
|
|
2306
|
-
|
|
2234
|
+
it 'removes the foreign keys from the inverse' do
|
|
2235
|
+
expect(deleted.related_ids).to be_empty
|
|
2236
|
+
end
|
|
2307
2237
|
end
|
|
2308
2238
|
end
|
|
2239
|
+
end
|
|
2309
2240
|
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
expect(post).to receive(:before_remove_tag).and_raise
|
|
2314
|
-
begin; post.tags.delete(tag); rescue; end
|
|
2315
|
-
end
|
|
2241
|
+
context 'when the association has callbacks' do
|
|
2242
|
+
let(:post) { Post.new }
|
|
2243
|
+
let(:tag) { Tag.new }
|
|
2316
2244
|
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
end
|
|
2245
|
+
before do
|
|
2246
|
+
post.tags << tag
|
|
2320
2247
|
end
|
|
2321
|
-
end
|
|
2322
2248
|
|
|
2323
|
-
|
|
2249
|
+
context 'when the callback is a before_remove' do
|
|
2250
|
+
context 'when there are no errors' do
|
|
2251
|
+
before do
|
|
2252
|
+
post.tags.send(method, tag)
|
|
2253
|
+
end
|
|
2324
2254
|
|
|
2325
|
-
|
|
2255
|
+
it 'executes the callback' do
|
|
2256
|
+
expect(post.before_remove_called).to be true
|
|
2257
|
+
end
|
|
2326
2258
|
|
|
2327
|
-
|
|
2328
|
-
|
|
2259
|
+
it 'removes the document from the relation' do
|
|
2260
|
+
expect(post.tags).to be_empty
|
|
2261
|
+
end
|
|
2329
2262
|
end
|
|
2330
2263
|
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2264
|
+
context "when errors are raised" do
|
|
2265
|
+
before do
|
|
2266
|
+
expect(post).to receive(:before_remove_tag).and_raise
|
|
2267
|
+
begin; post.tags.send(method, tag); rescue; end
|
|
2268
|
+
end
|
|
2334
2269
|
|
|
2335
|
-
|
|
2336
|
-
|
|
2270
|
+
it 'does not remove the document from the relation' do
|
|
2271
|
+
expect(post.tags).to eq([ tag ])
|
|
2272
|
+
end
|
|
2337
2273
|
end
|
|
2338
2274
|
end
|
|
2339
2275
|
|
|
2340
|
-
context
|
|
2276
|
+
context 'when the callback is an after_remove' do
|
|
2277
|
+
context 'when no errors are raised' do
|
|
2278
|
+
before do
|
|
2279
|
+
post.tags.send(method, tag)
|
|
2280
|
+
end
|
|
2341
2281
|
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2282
|
+
it 'executes the callback' do
|
|
2283
|
+
expect(post.after_remove_called).to be true
|
|
2284
|
+
end
|
|
2285
|
+
|
|
2286
|
+
it 'removes the document from the relation' do
|
|
2287
|
+
expect(post.tags).to be_empty
|
|
2288
|
+
end
|
|
2345
2289
|
end
|
|
2346
2290
|
|
|
2347
|
-
|
|
2348
|
-
|
|
2291
|
+
context 'when errors are raised' do
|
|
2292
|
+
before do
|
|
2293
|
+
expect(post).to receive(:after_remove_tag).and_raise
|
|
2294
|
+
begin; post.tags.send(method, tag); rescue; end
|
|
2295
|
+
end
|
|
2296
|
+
|
|
2297
|
+
it 'removes the document from the relation' do
|
|
2298
|
+
expect(post.tags).to be_empty
|
|
2299
|
+
end
|
|
2349
2300
|
end
|
|
2350
2301
|
end
|
|
2351
2302
|
end
|
|
2352
2303
|
end
|
|
2353
2304
|
end
|
|
2354
2305
|
|
|
2355
|
-
[
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
context "when conditions are provided" do
|
|
2362
|
-
|
|
2363
|
-
let(:person) do
|
|
2364
|
-
Person.create!
|
|
2365
|
-
end
|
|
2306
|
+
%i[ delete_all destroy_all ].each do |method|
|
|
2307
|
+
describe "\##{method}" do
|
|
2308
|
+
context 'when the relation is not polymorphic' do
|
|
2309
|
+
context 'when conditions are provided' do
|
|
2310
|
+
let(:person) { Person.create! }
|
|
2366
2311
|
|
|
2367
2312
|
let!(:preference_one) do
|
|
2368
2313
|
person.preferences.create!(name: "Testing")
|
|
@@ -2394,6 +2339,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2394
2339
|
it "removes the ids from the foreign key" do
|
|
2395
2340
|
expect(person.preference_ids).to eq([ preference_two.id ])
|
|
2396
2341
|
end
|
|
2342
|
+
|
|
2343
|
+
it "sets the association locally" do
|
|
2344
|
+
expect(person.preferences).to eq([preference_two])
|
|
2345
|
+
end
|
|
2397
2346
|
end
|
|
2398
2347
|
|
|
2399
2348
|
context "when conditions are not provided" do
|
|
@@ -2420,6 +2369,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2420
2369
|
it "returns the number of documents deleted" do
|
|
2421
2370
|
expect(deleted).to eq(2)
|
|
2422
2371
|
end
|
|
2372
|
+
|
|
2373
|
+
it "sets the association locally" do
|
|
2374
|
+
expect(person.preferences).to eq([])
|
|
2375
|
+
end
|
|
2423
2376
|
end
|
|
2424
2377
|
end
|
|
2425
2378
|
end
|
|
@@ -2507,39 +2460,29 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2507
2460
|
it "raises an error" do
|
|
2508
2461
|
expect {
|
|
2509
2462
|
preference
|
|
2510
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2463
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
|
|
2511
2464
|
end
|
|
2512
2465
|
end
|
|
2513
2466
|
|
|
2514
2467
|
context "when the id does not match" do
|
|
2515
2468
|
|
|
2516
2469
|
context "when config set to raise error" do
|
|
2517
|
-
|
|
2518
|
-
before do
|
|
2519
|
-
Mongoid.raise_not_found_error = true
|
|
2520
|
-
end
|
|
2470
|
+
config_override :raise_not_found_error, true
|
|
2521
2471
|
|
|
2522
2472
|
it "raises an error" do
|
|
2523
2473
|
expect {
|
|
2524
2474
|
person.preferences.find(BSON::ObjectId.new)
|
|
2525
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2475
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
|
|
2526
2476
|
end
|
|
2527
2477
|
end
|
|
2528
2478
|
|
|
2529
2479
|
context "when config set not to raise error" do
|
|
2480
|
+
config_override :raise_not_found_error, false
|
|
2530
2481
|
|
|
2531
2482
|
let(:preference) do
|
|
2532
2483
|
person.preferences.find(BSON::ObjectId.new)
|
|
2533
2484
|
end
|
|
2534
2485
|
|
|
2535
|
-
before do
|
|
2536
|
-
Mongoid.raise_not_found_error = false
|
|
2537
|
-
end
|
|
2538
|
-
|
|
2539
|
-
after do
|
|
2540
|
-
Mongoid.raise_not_found_error = true
|
|
2541
|
-
end
|
|
2542
|
-
|
|
2543
2486
|
it "returns nil" do
|
|
2544
2487
|
expect(preference).to be_nil
|
|
2545
2488
|
end
|
|
@@ -2571,39 +2514,29 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2571
2514
|
it "raises an error" do
|
|
2572
2515
|
expect {
|
|
2573
2516
|
preferences
|
|
2574
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2517
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
|
|
2575
2518
|
end
|
|
2576
2519
|
end
|
|
2577
2520
|
|
|
2578
2521
|
context "when the ids do not match" do
|
|
2579
2522
|
|
|
2580
2523
|
context "when config set to raise error" do
|
|
2581
|
-
|
|
2582
|
-
before do
|
|
2583
|
-
Mongoid.raise_not_found_error = true
|
|
2584
|
-
end
|
|
2524
|
+
config_override :raise_not_found_error, true
|
|
2585
2525
|
|
|
2586
2526
|
it "raises an error" do
|
|
2587
2527
|
expect {
|
|
2588
2528
|
person.preferences.find([ BSON::ObjectId.new ])
|
|
2589
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2529
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
|
|
2590
2530
|
end
|
|
2591
2531
|
end
|
|
2592
2532
|
|
|
2593
2533
|
context "when config set not to raise error" do
|
|
2534
|
+
config_override :raise_not_found_error, false
|
|
2594
2535
|
|
|
2595
2536
|
let(:preferences) do
|
|
2596
2537
|
person.preferences.find([ BSON::ObjectId.new ])
|
|
2597
2538
|
end
|
|
2598
2539
|
|
|
2599
|
-
before do
|
|
2600
|
-
Mongoid.raise_not_found_error = false
|
|
2601
|
-
end
|
|
2602
|
-
|
|
2603
|
-
after do
|
|
2604
|
-
Mongoid.raise_not_found_error = true
|
|
2605
|
-
end
|
|
2606
|
-
|
|
2607
2540
|
it "returns an empty array" do
|
|
2608
2541
|
expect(preferences).to be_empty
|
|
2609
2542
|
end
|
|
@@ -3770,4 +3703,58 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
3770
3703
|
expect(p2.d_ids).to match_array([d2.id])
|
|
3771
3704
|
end
|
|
3772
3705
|
end
|
|
3706
|
+
|
|
3707
|
+
context "when accesing own _id from parent's foreign key in default" do
|
|
3708
|
+
let!(:contract) { HabtmmContract.create! }
|
|
3709
|
+
let!(:signature) { contract.signatures.create! }
|
|
3710
|
+
|
|
3711
|
+
it "is nil" do
|
|
3712
|
+
expect(signature.favorite_signature).to be nil
|
|
3713
|
+
end
|
|
3714
|
+
end
|
|
3715
|
+
|
|
3716
|
+
context "when setting an association on a model that uses the class_name option" do
|
|
3717
|
+
let!(:contract) { HabtmmContract.create! }
|
|
3718
|
+
let!(:signature) { HabtmmSignature.create!(contracts: [contract]) }
|
|
3719
|
+
|
|
3720
|
+
it "populates the inverse foreign key" do
|
|
3721
|
+
expect(signature.contracts.first.signature_ids).to eq([signature.id])
|
|
3722
|
+
end
|
|
3723
|
+
end
|
|
3724
|
+
|
|
3725
|
+
context "when there is a foreign key in the aliased associations" do
|
|
3726
|
+
it "has the correct aliases" do
|
|
3727
|
+
expect(Dog.aliased_associations["breed_ids"]).to eq("breeds")
|
|
3728
|
+
expect(Breed.aliased_associations["dog_ids"]).to eq("dogs")
|
|
3729
|
+
end
|
|
3730
|
+
end
|
|
3731
|
+
|
|
3732
|
+
# This test is for MONGOID-5344 which tests that the initial call to
|
|
3733
|
+
# signature_ids refers to the same array as subsequent calls to signature_ids.
|
|
3734
|
+
# Prior to the change in that ticket, this test broke because the array
|
|
3735
|
+
# returned from write_attribute (which is triggered the first time the
|
|
3736
|
+
# foreign key array is referenced, to set the default), refers to a different
|
|
3737
|
+
# array to the one stored in the attributes hash. This happened because,
|
|
3738
|
+
# when retrieving a document from the database, the attributes hash is actually
|
|
3739
|
+
# a BSON::Document, which applies a transformation to the array before
|
|
3740
|
+
# storing it.
|
|
3741
|
+
context "when executing concat on foreign key array from the db" do
|
|
3742
|
+
config_override :legacy_attributes, false
|
|
3743
|
+
|
|
3744
|
+
before do
|
|
3745
|
+
HabtmmContract.create!
|
|
3746
|
+
HabtmmSignature.create!
|
|
3747
|
+
end
|
|
3748
|
+
|
|
3749
|
+
let!(:contract) { HabtmmContract.first }
|
|
3750
|
+
let!(:signature) { HabtmmSignature.first }
|
|
3751
|
+
|
|
3752
|
+
before do
|
|
3753
|
+
contract.signature_ids.concat([signature.id])
|
|
3754
|
+
end
|
|
3755
|
+
|
|
3756
|
+
it "works on the first attempt" do
|
|
3757
|
+
expect(contract.signature_ids).to eq([signature.id])
|
|
3758
|
+
end
|
|
3759
|
+
end
|
|
3773
3760
|
end
|
|
@@ -32,6 +32,8 @@ end
|
|
|
32
32
|
class HabtmmSignature
|
|
33
33
|
include Mongoid::Document
|
|
34
34
|
|
|
35
|
+
field :favorite_signature, default: ->{ contracts.first.signature_ids.first if contracts.first }
|
|
36
|
+
|
|
35
37
|
has_and_belongs_to_many :contracts, class_name: 'HabtmmContract'
|
|
36
38
|
|
|
37
39
|
field :name, type: String
|
|
@@ -65,3 +67,26 @@ class HabtmmAnimal
|
|
|
65
67
|
|
|
66
68
|
has_and_belongs_to_many :trainers, inverse_of: :animals, class_name: 'HabtmmTrainer', scope: -> { where(name: 'Dave') }
|
|
67
69
|
end
|
|
70
|
+
|
|
71
|
+
class HabtmmSchool
|
|
72
|
+
include Mongoid::Document
|
|
73
|
+
include Mongoid::Timestamps
|
|
74
|
+
|
|
75
|
+
has_and_belongs_to_many :students, class_name: 'HabtmmStudent'
|
|
76
|
+
|
|
77
|
+
field :after_destroy_triggered, default: false
|
|
78
|
+
|
|
79
|
+
accepts_nested_attributes_for :students, allow_destroy: true
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
class HabtmmStudent
|
|
83
|
+
include Mongoid::Document
|
|
84
|
+
include Mongoid::Timestamps
|
|
85
|
+
|
|
86
|
+
has_and_belongs_to_many :schools, class_name: 'HabtmmSchool'
|
|
87
|
+
|
|
88
|
+
after_destroy do |doc|
|
|
89
|
+
schools.first.update_attributes!(after_destroy_triggered: true) unless schools.empty?
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|