mongoid 7.5.1 → 8.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "spec_helper"
|
4
|
+
require_relative './attributes/nested_spec_models'
|
4
5
|
|
5
6
|
describe Mongoid::Attributes do
|
6
7
|
|
@@ -392,11 +393,10 @@ describe Mongoid::Attributes do
|
|
392
393
|
end
|
393
394
|
|
394
395
|
context "when reloaded" do
|
396
|
+
config_override :raise_not_found_error, false
|
395
397
|
|
396
398
|
before do
|
397
|
-
Mongoid.raise_not_found_error = false
|
398
399
|
person.reload
|
399
|
-
Mongoid.raise_not_found_error = true
|
400
400
|
end
|
401
401
|
|
402
402
|
it "returns the default value" do
|
@@ -1029,14 +1029,13 @@ describe Mongoid::Attributes do
|
|
1029
1029
|
end
|
1030
1030
|
|
1031
1031
|
context "when the attribute does not exist" do
|
1032
|
+
config_override :raise_not_found_error, false
|
1032
1033
|
|
1033
1034
|
before do
|
1034
1035
|
person.collection
|
1035
1036
|
.find({ _id: person.id })
|
1036
1037
|
.update_one({ "$unset" => { age: 1 }})
|
1037
|
-
Mongoid.raise_not_found_error = false
|
1038
1038
|
person.reload
|
1039
|
-
Mongoid.raise_not_found_error = true
|
1040
1039
|
end
|
1041
1040
|
|
1042
1041
|
it "returns the default value" do
|
@@ -1077,8 +1076,8 @@ describe Mongoid::Attributes do
|
|
1077
1076
|
context "after the attribute has been assigned" do
|
1078
1077
|
|
1079
1078
|
it "returns the default value" do
|
1080
|
-
person.age = "
|
1081
|
-
expect(person.age_before_type_cast).to eq("
|
1079
|
+
person.age = "42"
|
1080
|
+
expect(person.age_before_type_cast).to eq("42")
|
1082
1081
|
end
|
1083
1082
|
end
|
1084
1083
|
|
@@ -1160,14 +1159,13 @@ describe Mongoid::Attributes do
|
|
1160
1159
|
end
|
1161
1160
|
|
1162
1161
|
context "when the attribute does not exist" do
|
1162
|
+
config_override :raise_not_found_error, false
|
1163
1163
|
|
1164
1164
|
before do
|
1165
1165
|
person.collection
|
1166
1166
|
.find({ _id: person.id })
|
1167
1167
|
.update_one({ "$unset" => { age: 1 }})
|
1168
|
-
Mongoid.raise_not_found_error = false
|
1169
1168
|
person.reload
|
1170
|
-
Mongoid.raise_not_found_error = true
|
1171
1169
|
end
|
1172
1170
|
|
1173
1171
|
it "returns true" do
|
@@ -1265,15 +1263,15 @@ describe Mongoid::Attributes do
|
|
1265
1263
|
|
1266
1264
|
context "before the attribute has been assigned" do
|
1267
1265
|
|
1268
|
-
it "returns
|
1269
|
-
expect(person.has_attribute_before_type_cast?(:age)).to be
|
1266
|
+
it "returns true" do
|
1267
|
+
expect(person.has_attribute_before_type_cast?(:age)).to be true
|
1270
1268
|
end
|
1271
1269
|
end
|
1272
1270
|
|
1273
1271
|
context "after the attribute has been assigned" do
|
1274
1272
|
|
1275
1273
|
it "returns true" do
|
1276
|
-
person.age = '
|
1274
|
+
person.age = '42'
|
1277
1275
|
expect(person.has_attribute_before_type_cast?(:age)).to be true
|
1278
1276
|
end
|
1279
1277
|
end
|
@@ -1528,12 +1526,13 @@ describe Mongoid::Attributes do
|
|
1528
1526
|
end
|
1529
1527
|
|
1530
1528
|
context "when setting an attribute that needs type casting" do
|
1529
|
+
|
1531
1530
|
let(:person) do
|
1532
|
-
Person.new(age: "
|
1531
|
+
Person.new(age: "42")
|
1533
1532
|
end
|
1534
1533
|
|
1535
1534
|
it "should store the attribute before type cast" do
|
1536
|
-
expect(person.age_before_type_cast).to eq("
|
1535
|
+
expect(person.age_before_type_cast).to eq("42")
|
1537
1536
|
end
|
1538
1537
|
end
|
1539
1538
|
|
@@ -1581,16 +1580,14 @@ describe Mongoid::Attributes do
|
|
1581
1580
|
context "when attribute is a Hash" do
|
1582
1581
|
let(:person) { Person.new map: { somekey: "somevalue" } }
|
1583
1582
|
|
1584
|
-
it "
|
1585
|
-
|
1586
|
-
|
1587
|
-
end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Array cannot be written to a field of type Hash/)
|
1583
|
+
it "writes nil when trying to set a value of invalid type - array" do
|
1584
|
+
person.map = []
|
1585
|
+
expect(person.map).to be_nil
|
1588
1586
|
end
|
1589
1587
|
|
1590
|
-
it "
|
1591
|
-
|
1592
|
-
|
1593
|
-
end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Hash/)
|
1588
|
+
it "writes nil when trying to set a value of invalid type - boolean" do
|
1589
|
+
person.map = false
|
1590
|
+
expect(person.map).to be_nil
|
1594
1591
|
end
|
1595
1592
|
|
1596
1593
|
it "can set a Hash value" do
|
@@ -1605,16 +1602,14 @@ describe Mongoid::Attributes do
|
|
1605
1602
|
expect(person.aliases).to eq([ :alias_1 ])
|
1606
1603
|
end
|
1607
1604
|
|
1608
|
-
it "
|
1609
|
-
|
1610
|
-
|
1611
|
-
end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Hash cannot be written to a field of type Array/)
|
1605
|
+
it "writes nil when trying to set a value of invalid type - hash" do
|
1606
|
+
person.aliases = {}
|
1607
|
+
expect(person.aliases).to be_nil
|
1612
1608
|
end
|
1613
1609
|
|
1614
|
-
it "
|
1615
|
-
|
1616
|
-
|
1617
|
-
end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Array/)
|
1610
|
+
it "writes nil when trying to set a value of invalid type - boolean" do
|
1611
|
+
person.aliases = false
|
1612
|
+
expect(person.aliases).to be_nil
|
1618
1613
|
end
|
1619
1614
|
end
|
1620
1615
|
|
@@ -1675,6 +1670,50 @@ describe Mongoid::Attributes do
|
|
1675
1670
|
end
|
1676
1671
|
end
|
1677
1672
|
end
|
1673
|
+
|
1674
|
+
context "when comparing the object_ids of the written value" do
|
1675
|
+
config_override :legacy_attributes, false
|
1676
|
+
|
1677
|
+
before do
|
1678
|
+
Person.create!
|
1679
|
+
end
|
1680
|
+
|
1681
|
+
let(:person) do
|
1682
|
+
Person.first
|
1683
|
+
end
|
1684
|
+
|
1685
|
+
context "when the field is not resizable" do
|
1686
|
+
let(:test) do
|
1687
|
+
person.write_attribute(:test, "aliased field to test")
|
1688
|
+
end
|
1689
|
+
|
1690
|
+
it "has the same object_id as the attributes hash value" do
|
1691
|
+
expect(test.object_id).to eq(person.test.object_id)
|
1692
|
+
end
|
1693
|
+
end
|
1694
|
+
|
1695
|
+
context "when the field is resizable" do
|
1696
|
+
|
1697
|
+
let(:arrays) do
|
1698
|
+
person.write_attribute(:arrays, [])
|
1699
|
+
end
|
1700
|
+
|
1701
|
+
it "has the same object_id as the attributes hash value" do
|
1702
|
+
expect(arrays.object_id).to eq(person.arrays.object_id)
|
1703
|
+
end
|
1704
|
+
end
|
1705
|
+
|
1706
|
+
context "when the field is a HABTM foreign key array" do
|
1707
|
+
|
1708
|
+
let(:preference_ids) do
|
1709
|
+
person.write_attribute(:preference_ids, [])
|
1710
|
+
end
|
1711
|
+
|
1712
|
+
it "has the same object_id as the attributes hash value" do
|
1713
|
+
expect(preference_ids.object_id).to eq(person.preference_ids.object_id)
|
1714
|
+
end
|
1715
|
+
end
|
1716
|
+
end
|
1678
1717
|
end
|
1679
1718
|
|
1680
1719
|
describe "#typed_value_for" do
|
@@ -1855,11 +1894,11 @@ describe Mongoid::Attributes do
|
|
1855
1894
|
end
|
1856
1895
|
|
1857
1896
|
it "has 3 new entries" do
|
1858
|
-
expect(pet.vet_visits.count).to eq
|
1897
|
+
expect(pet.vet_visits.count).to eq 3
|
1859
1898
|
end
|
1860
1899
|
|
1861
1900
|
it "persists the changes" do
|
1862
|
-
expect(pet.reload.vet_visits.count).to eq
|
1901
|
+
expect(pet.reload.vet_visits.count).to eq 3
|
1863
1902
|
end
|
1864
1903
|
end
|
1865
1904
|
|
@@ -2029,8 +2068,8 @@ describe Mongoid::Attributes do
|
|
2029
2068
|
end
|
2030
2069
|
|
2031
2070
|
it "aliases *_before_type_cast" do
|
2032
|
-
product.cost = "
|
2033
|
-
expect(product.cost_before_type_cast).to eq("
|
2071
|
+
product.cost = "42"
|
2072
|
+
expect(product.cost_before_type_cast).to eq("42")
|
2034
2073
|
end
|
2035
2074
|
end
|
2036
2075
|
|
@@ -2214,4 +2253,486 @@ describe Mongoid::Attributes do
|
|
2214
2253
|
end
|
2215
2254
|
end
|
2216
2255
|
end
|
2256
|
+
|
2257
|
+
context "when an attribute is removed then set" do
|
2258
|
+
let(:cat) { Cat.create!(name: "Neil") }
|
2259
|
+
|
2260
|
+
before do
|
2261
|
+
cat.remove_attribute("name")
|
2262
|
+
cat.name = "Nissim"
|
2263
|
+
cat.save!
|
2264
|
+
cat.reload
|
2265
|
+
end
|
2266
|
+
|
2267
|
+
it "correctly sets the attribute" do
|
2268
|
+
expect(cat.name).to eq("Nissim")
|
2269
|
+
end
|
2270
|
+
end
|
2271
|
+
|
2272
|
+
describe "attributes after setting an association without reloading" do
|
2273
|
+
|
2274
|
+
context "on embeds_many" do
|
2275
|
+
|
2276
|
+
context "when not setting anything" do
|
2277
|
+
let(:doc) { NestedBook.create! }
|
2278
|
+
|
2279
|
+
it "doesn't add attributes" do
|
2280
|
+
expect(doc.attributes).to_not have_key("pages")
|
2281
|
+
end
|
2282
|
+
|
2283
|
+
it "has the same attributes after reloading" do
|
2284
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2285
|
+
end
|
2286
|
+
end
|
2287
|
+
|
2288
|
+
context "when using nested attributes" do
|
2289
|
+
let(:doc) { NestedBook.create! }
|
2290
|
+
|
2291
|
+
before do
|
2292
|
+
doc.update_attributes({ pages_attributes: [ {} ] })
|
2293
|
+
end
|
2294
|
+
|
2295
|
+
it "updates the attributes" do
|
2296
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
2297
|
+
end
|
2298
|
+
|
2299
|
+
it "has the same attributes after reloading" do
|
2300
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2301
|
+
end
|
2302
|
+
end
|
2303
|
+
|
2304
|
+
context "when doing assignments" do
|
2305
|
+
let(:doc) { NestedBook.create! }
|
2306
|
+
before do
|
2307
|
+
doc.pages = [NestedPage.new]
|
2308
|
+
end
|
2309
|
+
|
2310
|
+
it "updates the attributes" do
|
2311
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
2312
|
+
end
|
2313
|
+
|
2314
|
+
it "has the same attributes after reloading" do
|
2315
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2316
|
+
end
|
2317
|
+
end
|
2318
|
+
|
2319
|
+
context "when replacing assignments" do
|
2320
|
+
let(:doc) { NestedBook.create! }
|
2321
|
+
before do
|
2322
|
+
doc.pages = [NestedPage.new(number: 1)]
|
2323
|
+
doc.pages = [NestedPage.new(number: 2)]
|
2324
|
+
end
|
2325
|
+
|
2326
|
+
it "updates the attributes" do
|
2327
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id, "number" => 2 }])
|
2328
|
+
end
|
2329
|
+
|
2330
|
+
it "has the same attributes after reloading" do
|
2331
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2332
|
+
end
|
2333
|
+
end
|
2334
|
+
|
2335
|
+
context "when setting to nil" do
|
2336
|
+
let(:doc) { NestedBook.create! }
|
2337
|
+
before do
|
2338
|
+
doc.pages = [NestedPage.new(number: 1)]
|
2339
|
+
doc.pages = nil
|
2340
|
+
end
|
2341
|
+
|
2342
|
+
it "updates the attributes" do
|
2343
|
+
expect(doc.attributes).to_not have_key("pages")
|
2344
|
+
end
|
2345
|
+
|
2346
|
+
it "has the same attributes after reloading" do
|
2347
|
+
expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
|
2348
|
+
end
|
2349
|
+
end
|
2350
|
+
|
2351
|
+
context "when setting to nil and back" do
|
2352
|
+
let(:doc) { NestedBook.create! }
|
2353
|
+
let(:page) { NestedPage.new }
|
2354
|
+
before do
|
2355
|
+
doc.pages = [page]
|
2356
|
+
doc.pages = nil
|
2357
|
+
doc.pages = [page]
|
2358
|
+
end
|
2359
|
+
|
2360
|
+
it "updates the attributes" do
|
2361
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
2362
|
+
end
|
2363
|
+
|
2364
|
+
it "has the same attributes after reloading" do
|
2365
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2366
|
+
end
|
2367
|
+
end
|
2368
|
+
|
2369
|
+
context "when pushing" do
|
2370
|
+
let(:doc) { NestedBook.create! }
|
2371
|
+
before do
|
2372
|
+
doc.pages << NestedPage.new
|
2373
|
+
end
|
2374
|
+
|
2375
|
+
it "updates the attributes" do
|
2376
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
2377
|
+
end
|
2378
|
+
|
2379
|
+
it "has the same attributes after reloading" do
|
2380
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2381
|
+
end
|
2382
|
+
end
|
2383
|
+
|
2384
|
+
[:shift, :pop].each do |meth|
|
2385
|
+
context "when performing #{meth}" do
|
2386
|
+
let(:doc) { NestedBook.create! }
|
2387
|
+
before do
|
2388
|
+
doc.pages << NestedPage.new
|
2389
|
+
doc.pages << NestedPage.new
|
2390
|
+
doc.pages << NestedPage.new
|
2391
|
+
|
2392
|
+
doc.pages.send(meth, 2)
|
2393
|
+
end
|
2394
|
+
|
2395
|
+
it "updates the attributes" do
|
2396
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
2397
|
+
end
|
2398
|
+
|
2399
|
+
it "has the same attributes after reloading" do
|
2400
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2401
|
+
end
|
2402
|
+
end
|
2403
|
+
end
|
2404
|
+
|
2405
|
+
context "when concatting" do
|
2406
|
+
let(:doc) { NestedBook.create! }
|
2407
|
+
before do
|
2408
|
+
doc.pages << NestedPage.new
|
2409
|
+
doc.pages.concat([NestedPage.new, NestedPage.new])
|
2410
|
+
end
|
2411
|
+
|
2412
|
+
it "updates the attributes" do
|
2413
|
+
expect(doc.attributes["pages"].count).to eq 3
|
2414
|
+
end
|
2415
|
+
|
2416
|
+
it "has the same attributes after reloading" do
|
2417
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2418
|
+
end
|
2419
|
+
end
|
2420
|
+
|
2421
|
+
[:build, :create].each do |meth|
|
2422
|
+
context "when preforming #{meth}" do
|
2423
|
+
let(:doc) { NestedBook.create! }
|
2424
|
+
before do
|
2425
|
+
doc.pages.send(meth)
|
2426
|
+
end
|
2427
|
+
|
2428
|
+
it "updates the attributes" do
|
2429
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
2430
|
+
end
|
2431
|
+
|
2432
|
+
it "has the same attributes after reloading" do
|
2433
|
+
doc.pages.first.save
|
2434
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2435
|
+
end
|
2436
|
+
end
|
2437
|
+
end
|
2438
|
+
|
2439
|
+
context "when clearing" do
|
2440
|
+
let(:doc) { NestedBook.create! }
|
2441
|
+
before do
|
2442
|
+
doc.pages << NestedPage.new
|
2443
|
+
doc.pages << NestedPage.new
|
2444
|
+
doc.pages << NestedPage.new
|
2445
|
+
|
2446
|
+
doc.pages.clear
|
2447
|
+
end
|
2448
|
+
|
2449
|
+
it "updates the attributes" do
|
2450
|
+
expect(doc.attributes).to_not have_key("pages")
|
2451
|
+
end
|
2452
|
+
|
2453
|
+
it "has the same attributes after reloading" do
|
2454
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2455
|
+
end
|
2456
|
+
end
|
2457
|
+
|
2458
|
+
[:delete_all, :destroy_all, :remove_all].each do |meth|
|
2459
|
+
context "when performing: #{meth}" do
|
2460
|
+
let(:doc) { NestedBook.create! }
|
2461
|
+
before do
|
2462
|
+
doc.pages << NestedPage.new
|
2463
|
+
doc.pages << NestedPage.new
|
2464
|
+
doc.pages << NestedPage.new
|
2465
|
+
|
2466
|
+
doc.pages.send(meth)
|
2467
|
+
end
|
2468
|
+
|
2469
|
+
it "updates the attributes" do
|
2470
|
+
expect(doc.attributes).to_not have_key("pages")
|
2471
|
+
end
|
2472
|
+
|
2473
|
+
it "has the same attributes after reloading" do
|
2474
|
+
expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
|
2475
|
+
end
|
2476
|
+
end
|
2477
|
+
end
|
2478
|
+
|
2479
|
+
context "when deleting" do
|
2480
|
+
let(:doc) { NestedBook.create! }
|
2481
|
+
let(:page) { NestedPage.new }
|
2482
|
+
before do
|
2483
|
+
doc.pages << page
|
2484
|
+
doc.pages << NestedPage.new
|
2485
|
+
doc.pages << NestedPage.new
|
2486
|
+
|
2487
|
+
doc.pages.delete(page)
|
2488
|
+
end
|
2489
|
+
|
2490
|
+
it "updates the attributes" do
|
2491
|
+
expect(doc.attributes["pages"].count).to eq 2
|
2492
|
+
end
|
2493
|
+
|
2494
|
+
it "has the same attributes after reloading" do
|
2495
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2496
|
+
end
|
2497
|
+
end
|
2498
|
+
|
2499
|
+
context "when doing _remove" do
|
2500
|
+
let(:doc) { NestedBook.create! }
|
2501
|
+
let(:page) { NestedPage.new }
|
2502
|
+
before do
|
2503
|
+
doc.pages << page
|
2504
|
+
doc.pages << NestedPage.new
|
2505
|
+
doc.pages << NestedPage.new
|
2506
|
+
|
2507
|
+
doc.pages._remove(page)
|
2508
|
+
end
|
2509
|
+
|
2510
|
+
it "updates the attributes" do
|
2511
|
+
expect(doc.attributes["pages"].count).to eq 2
|
2512
|
+
end
|
2513
|
+
end
|
2514
|
+
|
2515
|
+
context "when assigning an array of hashes" do
|
2516
|
+
let(:doc) { NestedBook.create! }
|
2517
|
+
before do
|
2518
|
+
doc.pages = [{}]
|
2519
|
+
end
|
2520
|
+
|
2521
|
+
it "updates the attributes" do
|
2522
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
2523
|
+
end
|
2524
|
+
|
2525
|
+
it "has the same attributes after reloading" do
|
2526
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2527
|
+
end
|
2528
|
+
end
|
2529
|
+
|
2530
|
+
context "when assigning twice" do
|
2531
|
+
let(:doc) { NestedBook.create! }
|
2532
|
+
before do
|
2533
|
+
doc.pages = [{ number: 1 }]
|
2534
|
+
doc.pages = [{}]
|
2535
|
+
end
|
2536
|
+
|
2537
|
+
it "updates the attributes" do
|
2538
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
2539
|
+
end
|
2540
|
+
|
2541
|
+
it "has the same attributes after reloading" do
|
2542
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2543
|
+
end
|
2544
|
+
end
|
2545
|
+
end
|
2546
|
+
|
2547
|
+
context "on embeds_one" do
|
2548
|
+
|
2549
|
+
let(:attrs) { { "title" => "Title" } }
|
2550
|
+
|
2551
|
+
context "when using nested attributes" do
|
2552
|
+
let(:doc) { NestedBook.create! }
|
2553
|
+
|
2554
|
+
before do
|
2555
|
+
doc.update_attributes({ cover_attributes: attrs })
|
2556
|
+
end
|
2557
|
+
|
2558
|
+
it "updates the attributes" do
|
2559
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
2560
|
+
end
|
2561
|
+
|
2562
|
+
it "has the same attributes after reloading" do
|
2563
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2564
|
+
end
|
2565
|
+
end
|
2566
|
+
|
2567
|
+
context "when doing assignments" do
|
2568
|
+
let(:doc) { NestedBook.create! }
|
2569
|
+
before do
|
2570
|
+
doc.cover = NestedCover.new(attrs)
|
2571
|
+
end
|
2572
|
+
|
2573
|
+
it "updates the attributes" do
|
2574
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
2575
|
+
end
|
2576
|
+
|
2577
|
+
it "has the same attributes after reloading" do
|
2578
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2579
|
+
end
|
2580
|
+
end
|
2581
|
+
|
2582
|
+
context "when replacing assignments" do
|
2583
|
+
let(:doc) { NestedBook.create! }
|
2584
|
+
before do
|
2585
|
+
doc.cover = NestedCover.new("title" => "Title1")
|
2586
|
+
doc.cover = NestedCover.new(attrs)
|
2587
|
+
end
|
2588
|
+
|
2589
|
+
it "updates the attributes" do
|
2590
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
2591
|
+
end
|
2592
|
+
|
2593
|
+
it "has the same attributes after reloading" do
|
2594
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2595
|
+
end
|
2596
|
+
end
|
2597
|
+
|
2598
|
+
context "when setting to nil" do
|
2599
|
+
let(:doc) { NestedBook.create! }
|
2600
|
+
before do
|
2601
|
+
doc.cover = NestedCover.new(attrs)
|
2602
|
+
doc.cover = nil
|
2603
|
+
end
|
2604
|
+
|
2605
|
+
it "updates the attributes" do
|
2606
|
+
expect(doc.attributes.key?("cover")).to be false
|
2607
|
+
end
|
2608
|
+
|
2609
|
+
it "has the same attributes after reloading" do
|
2610
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2611
|
+
end
|
2612
|
+
end
|
2613
|
+
|
2614
|
+
context "when setting to nil and back" do
|
2615
|
+
let(:doc) { NestedBook.create! }
|
2616
|
+
before do
|
2617
|
+
doc.cover = NestedCover.new(attrs)
|
2618
|
+
doc.cover = nil
|
2619
|
+
doc.cover = NestedCover.new(attrs)
|
2620
|
+
end
|
2621
|
+
|
2622
|
+
it "updates the attributes" do
|
2623
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
2624
|
+
end
|
2625
|
+
|
2626
|
+
|
2627
|
+
it "has the same attributes after reloading" do
|
2628
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2629
|
+
end
|
2630
|
+
end
|
2631
|
+
|
2632
|
+
[:build, :create].each do |meth|
|
2633
|
+
context "when preforming #{meth}" do
|
2634
|
+
let(:doc) { NestedBook.create! }
|
2635
|
+
before do
|
2636
|
+
doc.send("#{meth}_cover", attrs)
|
2637
|
+
end
|
2638
|
+
|
2639
|
+
it "updates the attributes" do
|
2640
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
2641
|
+
end
|
2642
|
+
|
2643
|
+
it "has the same attributes after reloading" do
|
2644
|
+
doc.cover.save
|
2645
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2646
|
+
end
|
2647
|
+
end
|
2648
|
+
end
|
2649
|
+
|
2650
|
+
context "when assigning a hash" do
|
2651
|
+
let(:doc) { NestedBook.create! }
|
2652
|
+
before do
|
2653
|
+
doc.cover = attrs
|
2654
|
+
end
|
2655
|
+
|
2656
|
+
it "updates the attributes" do
|
2657
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
2658
|
+
end
|
2659
|
+
|
2660
|
+
it "has the same attributes after reloading" do
|
2661
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2662
|
+
end
|
2663
|
+
end
|
2664
|
+
|
2665
|
+
context "when assigning twice" do
|
2666
|
+
let(:doc) { NestedBook.create! }
|
2667
|
+
before do
|
2668
|
+
doc.cover = { "title" => "1984" }
|
2669
|
+
doc.cover = attrs
|
2670
|
+
end
|
2671
|
+
|
2672
|
+
it "updates the attributes" do
|
2673
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
2674
|
+
end
|
2675
|
+
|
2676
|
+
it "has the same attributes after reloading" do
|
2677
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
2678
|
+
end
|
2679
|
+
end
|
2680
|
+
end
|
2681
|
+
end
|
2682
|
+
|
2683
|
+
context "when modifiying a hash referenced with the [] notation" do
|
2684
|
+
let(:church) { Church.create!(location: { x: 1 }) }
|
2685
|
+
|
2686
|
+
before do
|
2687
|
+
church[:location].merge!(y: 2)
|
2688
|
+
church.save!
|
2689
|
+
church.reload
|
2690
|
+
end
|
2691
|
+
|
2692
|
+
it "persists the updated hash" do
|
2693
|
+
church.location.should == { "x" => 1, "y" => 2 }
|
2694
|
+
end
|
2695
|
+
end
|
2696
|
+
|
2697
|
+
context "when modifiying a set referenced with the [] notation" do
|
2698
|
+
let(:catalog) { Catalog.create!(set_field: [ 1 ].to_set) }
|
2699
|
+
|
2700
|
+
before do
|
2701
|
+
catalog[:set_field] << 2
|
2702
|
+
catalog.save!
|
2703
|
+
catalog.reload
|
2704
|
+
end
|
2705
|
+
|
2706
|
+
it "persists the updated hash" do
|
2707
|
+
pending "MONGOID-2951"
|
2708
|
+
catalog.set_field.should == Set.new([ 1, 2 ])
|
2709
|
+
end
|
2710
|
+
end
|
2711
|
+
|
2712
|
+
context 'when an embedded field has a capitalized store_as name' do
|
2713
|
+
let(:person) { Person.new(Purse: { brand: 'Gucci' }) }
|
2714
|
+
|
2715
|
+
it 'sets the value' do
|
2716
|
+
expect(person.purse.brand).to eq('Gucci')
|
2717
|
+
end
|
2718
|
+
|
2719
|
+
it 'saves successfully' do
|
2720
|
+
expect(person.save!).to eq(true)
|
2721
|
+
end
|
2722
|
+
|
2723
|
+
context 'when persisted' do
|
2724
|
+
before do
|
2725
|
+
person.save!
|
2726
|
+
person.reload
|
2727
|
+
end
|
2728
|
+
|
2729
|
+
it 'persists the value' do
|
2730
|
+
expect(person.reload.purse.brand).to eq('Gucci')
|
2731
|
+
end
|
2732
|
+
|
2733
|
+
it 'uses the correct key in the database' do
|
2734
|
+
expect(person.collection.find(_id: person.id).first['Purse']['_id']).to eq(person.purse.id)
|
2735
|
+
end
|
2736
|
+
end
|
2737
|
+
end
|
2217
2738
|
end
|