mongoid 7.2.1 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +20 -20
- data/LICENSE +1 -1
- data/README.md +7 -12
- data/Rakefile +58 -1
- data/lib/config/locales/en.yml +191 -60
- data/lib/mongoid/association/accessors.rb +67 -53
- data/lib/mongoid/association/bindable.rb +77 -31
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +2 -5
- data/lib/mongoid/association/depending.rb +20 -12
- data/lib/mongoid/association/eager.rb +160 -0
- data/lib/mongoid/association/eager_loadable.rb +41 -11
- data/lib/mongoid/association/embedded/batchable.rb +63 -52
- data/lib/mongoid/association/embedded/cyclic.rb +4 -12
- data/lib/mongoid/association/embedded/eager.rb +23 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
- data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
- data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
- data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
- data/lib/mongoid/association/embedded.rb +2 -1
- data/lib/mongoid/association/macros.rb +47 -16
- data/lib/mongoid/association/many.rb +12 -24
- data/lib/mongoid/association/marshalable.rb +4 -5
- data/lib/mongoid/association/nested/many.rb +14 -19
- data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
- data/lib/mongoid/association/nested/one.rb +54 -26
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +3 -11
- data/lib/mongoid/association/options.rb +18 -44
- data/lib/mongoid/association/proxy.rb +49 -42
- data/lib/mongoid/association/referenced/auto_save.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
- data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
- data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
- data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
- data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
- data/lib/mongoid/association/referenced/has_many.rb +17 -43
- data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
- data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
- data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
- data/lib/mongoid/association/referenced/has_one.rb +17 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -27
- data/lib/mongoid/association/referenced.rb +1 -1
- data/lib/mongoid/association/reflections.rb +9 -9
- data/lib/mongoid/association/relatable.rb +55 -74
- data/lib/mongoid/association.rb +10 -22
- data/lib/mongoid/atomic/modifiers.rb +7 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
- data/lib/mongoid/atomic/paths/embedded.rb +1 -3
- data/lib/mongoid/atomic/paths/root.rb +1 -5
- data/lib/mongoid/atomic/paths.rb +1 -1
- data/lib/mongoid/atomic.rb +39 -86
- data/lib/mongoid/atomic_update_preparer.rb +88 -0
- data/lib/mongoid/attributes/dynamic.rb +5 -21
- data/lib/mongoid/attributes/embedded.rb +34 -0
- data/lib/mongoid/attributes/nested.rb +9 -13
- data/lib/mongoid/attributes/processing.rb +43 -28
- data/lib/mongoid/attributes/projector.rb +120 -0
- data/lib/mongoid/attributes/readonly.rb +4 -8
- data/lib/mongoid/attributes.rb +85 -89
- data/lib/mongoid/cacheable.rb +5 -9
- data/lib/mongoid/changeable.rb +183 -97
- data/lib/mongoid/clients/factory.rb +58 -15
- data/lib/mongoid/clients/options.rb +117 -8
- data/lib/mongoid/clients/sessions.rb +246 -84
- data/lib/mongoid/clients/storage_options.rb +37 -11
- data/lib/mongoid/clients/validators/storage.rb +4 -24
- data/lib/mongoid/clients/validators.rb +1 -1
- data/lib/mongoid/clients.rb +37 -14
- data/lib/mongoid/collection_configurable.rb +59 -0
- data/lib/mongoid/composable.rb +7 -7
- data/lib/mongoid/config/defaults.rb +40 -0
- data/lib/mongoid/config/encryption.rb +213 -0
- data/lib/mongoid/config/environment.rb +25 -5
- data/lib/mongoid/config/introspection.rb +152 -0
- data/lib/mongoid/config/options.rb +11 -14
- data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
- data/lib/mongoid/config/validators/client.rb +7 -23
- data/lib/mongoid/config/validators/option.rb +1 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +183 -46
- data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
- data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
- data/lib/mongoid/contextual/aggregable/none.rb +66 -0
- data/lib/mongoid/contextual/aggregable.rb +18 -0
- data/lib/mongoid/contextual/atomic.rb +97 -30
- data/lib/mongoid/contextual/command.rb +3 -5
- data/lib/mongoid/contextual/map_reduce.rb +8 -33
- data/lib/mongoid/contextual/memory.rb +396 -89
- data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
- data/lib/mongoid/contextual/mongo.rb +640 -311
- data/lib/mongoid/contextual/none.rb +244 -30
- data/lib/mongoid/contextual/queryable.rb +5 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +34 -14
- data/lib/mongoid/criteria/findable.rb +52 -22
- data/lib/mongoid/criteria/includable.rb +31 -34
- data/lib/mongoid/criteria/inspectable.rb +4 -3
- data/lib/mongoid/criteria/marshalable.rb +14 -7
- data/lib/mongoid/criteria/modifiable.rb +5 -19
- data/lib/mongoid/criteria/options.rb +1 -3
- data/lib/mongoid/criteria/permission.rb +6 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
- data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
- data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
- data/lib/mongoid/criteria/queryable/key.rb +15 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
- data/lib/mongoid/criteria/queryable/optional.rb +12 -62
- data/lib/mongoid/criteria/queryable/options.rb +3 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
- data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
- data/lib/mongoid/criteria/queryable/selector.rb +96 -25
- data/lib/mongoid/criteria/queryable/smash.rb +41 -18
- data/lib/mongoid/criteria/queryable/storable.rb +14 -9
- data/lib/mongoid/criteria/queryable.rb +12 -13
- data/lib/mongoid/criteria/scopable.rb +32 -21
- data/lib/mongoid/criteria/translator.rb +46 -0
- data/lib/mongoid/criteria.rb +60 -109
- data/lib/mongoid/deprecable.rb +38 -0
- data/lib/mongoid/deprecation.rb +29 -0
- data/lib/mongoid/document.rb +263 -173
- data/lib/mongoid/encryptable.rb +53 -0
- data/lib/mongoid/equality.rb +22 -25
- data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
- data/lib/mongoid/errors/callback.rb +1 -3
- data/lib/mongoid/errors/create_collection_failure.rb +34 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +9 -12
- data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
- data/lib/mongoid/errors/document_not_found.rb +34 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
- data/lib/mongoid/errors/empty_config_file.rb +26 -0
- data/lib/mongoid/errors/immutable_attribute.rb +27 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
- data/lib/mongoid/errors/invalid_collection.rb +1 -1
- data/lib/mongoid/errors/invalid_config_file.rb +26 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +7 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field_option.rb +1 -3
- data/lib/mongoid/errors/invalid_field_type.rb +27 -0
- data/lib/mongoid/errors/invalid_find.rb +1 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
- data/lib/mongoid/errors/invalid_includes.rb +1 -3
- data/lib/mongoid/errors/invalid_index.rb +1 -3
- data/lib/mongoid/errors/invalid_options.rb +1 -3
- data/lib/mongoid/errors/invalid_path.rb +1 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
- data/lib/mongoid/errors/invalid_query.rb +1 -1
- data/lib/mongoid/errors/invalid_relation.rb +2 -8
- data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
- data/lib/mongoid/errors/invalid_scope.rb +1 -3
- data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -3
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -3
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +8 -16
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -3
- data/lib/mongoid/errors/no_client_database.rb +2 -4
- data/lib/mongoid/errors/no_client_hosts.rb +2 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -3
- data/lib/mongoid/errors/no_default_client.rb +1 -3
- data/lib/mongoid/errors/no_environment.rb +1 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
- data/lib/mongoid/errors/no_metadata.rb +1 -3
- data/lib/mongoid/errors/no_parent.rb +1 -3
- data/lib/mongoid/errors/readonly_attribute.rb +2 -4
- data/lib/mongoid/errors/readonly_document.rb +2 -6
- data/lib/mongoid/errors/rollback.rb +15 -0
- data/lib/mongoid/errors/scope_overwrite.rb +1 -1
- data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
- data/lib/mongoid/errors/transaction_error.rb +25 -0
- data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -3
- data/lib/mongoid/errors/unsaved_document.rb +2 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
- data/lib/mongoid/errors/validations.rb +1 -1
- data/lib/mongoid/errors.rb +18 -5
- data/lib/mongoid/evolvable.rb +2 -4
- data/lib/mongoid/extensions/array.rb +20 -58
- data/lib/mongoid/extensions/big_decimal.rb +44 -24
- data/lib/mongoid/extensions/binary.rb +45 -0
- data/lib/mongoid/extensions/boolean.rb +11 -6
- data/lib/mongoid/extensions/date.rb +31 -29
- data/lib/mongoid/extensions/date_time.rb +5 -16
- data/lib/mongoid/extensions/decimal128.rb +3 -5
- data/lib/mongoid/extensions/false_class.rb +8 -10
- data/lib/mongoid/extensions/float.rb +11 -12
- data/lib/mongoid/extensions/hash.rb +28 -148
- data/lib/mongoid/extensions/integer.rb +13 -14
- data/lib/mongoid/extensions/module.rb +5 -5
- data/lib/mongoid/extensions/nil_class.rb +5 -7
- data/lib/mongoid/extensions/object.rb +32 -81
- data/lib/mongoid/extensions/object_id.rb +3 -7
- data/lib/mongoid/extensions/range.rb +47 -24
- data/lib/mongoid/extensions/raw_value.rb +34 -0
- data/lib/mongoid/extensions/regexp.rb +14 -7
- data/lib/mongoid/extensions/set.rb +24 -13
- data/lib/mongoid/extensions/string.rb +30 -62
- data/lib/mongoid/extensions/symbol.rb +9 -22
- data/lib/mongoid/extensions/time.rb +30 -40
- data/lib/mongoid/extensions/time_with_zone.rb +18 -11
- data/lib/mongoid/extensions/true_class.rb +8 -10
- data/lib/mongoid/extensions.rb +3 -20
- data/lib/mongoid/factory.rb +178 -37
- data/lib/mongoid/fields/encrypted.rb +48 -0
- data/lib/mongoid/fields/foreign_key.rb +39 -27
- data/lib/mongoid/fields/localized.rb +25 -15
- data/lib/mongoid/fields/standard.rb +22 -40
- data/lib/mongoid/fields/validators/macro.rb +6 -19
- data/lib/mongoid/fields/validators.rb +1 -1
- data/lib/mongoid/fields.rb +354 -76
- data/lib/mongoid/findable.rb +62 -22
- data/lib/mongoid/indexable/specification.rb +55 -34
- data/lib/mongoid/indexable/validators/options.rb +7 -9
- data/lib/mongoid/indexable.rb +2 -18
- data/lib/mongoid/inspectable.rb +34 -11
- data/lib/mongoid/interceptable.rb +197 -41
- data/lib/mongoid/loadable.rb +83 -0
- data/lib/mongoid/loggable.rb +1 -9
- data/lib/mongoid/matchable.rb +2 -6
- data/lib/mongoid/matcher/all.rb +15 -0
- data/lib/mongoid/matcher/and.rb +14 -0
- data/lib/mongoid/matcher/bits.rb +60 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_all_set.rb +41 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_any_set.rb +41 -0
- data/lib/mongoid/matcher/elem_match.rb +17 -1
- data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
- data/lib/mongoid/matcher/eq.rb +15 -0
- data/lib/mongoid/matcher/eq_impl.rb +54 -2
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +22 -14
- data/lib/mongoid/matcher/expression_operator.rb +14 -0
- data/lib/mongoid/matcher/field_expression.rb +19 -5
- data/lib/mongoid/matcher/field_operator.rb +30 -0
- data/lib/mongoid/matcher/gt.rb +15 -0
- data/lib/mongoid/matcher/gte.rb +15 -0
- data/lib/mongoid/matcher/in.rb +15 -0
- data/lib/mongoid/matcher/lt.rb +15 -0
- data/lib/mongoid/matcher/lte.rb +15 -0
- data/lib/mongoid/matcher/mod.rb +33 -0
- data/lib/mongoid/matcher/ne.rb +15 -0
- data/lib/mongoid/matcher/nin.rb +15 -0
- data/lib/mongoid/matcher/nor.rb +14 -0
- data/lib/mongoid/matcher/not.rb +16 -0
- data/lib/mongoid/matcher/or.rb +14 -0
- data/lib/mongoid/matcher/regex.rb +24 -0
- data/lib/mongoid/matcher/size.rb +16 -0
- data/lib/mongoid/matcher/type.rb +124 -0
- data/lib/mongoid/matcher.rb +59 -52
- data/lib/mongoid/persistable/creatable.rb +25 -29
- data/lib/mongoid/persistable/deletable.rb +10 -23
- data/lib/mongoid/persistable/destroyable.rb +37 -11
- data/lib/mongoid/persistable/incrementable.rb +2 -6
- data/lib/mongoid/persistable/logical.rb +1 -5
- data/lib/mongoid/persistable/maxable.rb +37 -0
- data/lib/mongoid/persistable/minable.rb +37 -0
- data/lib/mongoid/persistable/multipliable.rb +36 -0
- data/lib/mongoid/persistable/poppable.rb +1 -5
- data/lib/mongoid/persistable/pullable.rb +1 -7
- data/lib/mongoid/persistable/pushable.rb +1 -7
- data/lib/mongoid/persistable/renamable.rb +1 -5
- data/lib/mongoid/persistable/savable.rb +14 -8
- data/lib/mongoid/persistable/settable.rb +1 -5
- data/lib/mongoid/persistable/unsettable.rb +3 -7
- data/lib/mongoid/persistable/updatable.rb +114 -28
- data/lib/mongoid/persistable/upsertable.rb +33 -8
- data/lib/mongoid/persistable.rb +17 -27
- data/lib/mongoid/persistence_context.rb +111 -43
- data/lib/mongoid/positional.rb +1 -5
- data/lib/mongoid/railtie.rb +23 -15
- data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
- data/lib/mongoid/railties/console_sandbox.rb +42 -0
- data/lib/mongoid/railties/controller_runtime.rb +21 -6
- data/lib/mongoid/railties/database.rake +19 -2
- data/lib/mongoid/reloadable.rb +45 -42
- data/lib/mongoid/scopable.rb +25 -53
- data/lib/mongoid/search_indexable.rb +167 -0
- data/lib/mongoid/selectable.rb +6 -17
- data/lib/mongoid/serializable.rb +11 -21
- data/lib/mongoid/shardable.rb +50 -16
- data/lib/mongoid/stateful.rb +66 -22
- data/lib/mongoid/stringified_symbol.rb +19 -7
- data/lib/mongoid/tasks/database.rake +25 -0
- data/lib/mongoid/tasks/database.rb +84 -8
- data/lib/mongoid/tasks/encryption.rake +59 -0
- data/lib/mongoid/tasks/encryption.rb +108 -0
- data/lib/mongoid/threaded/lifecycle.rb +6 -26
- data/lib/mongoid/threaded.rb +131 -92
- data/lib/mongoid/timestamps/created/short.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +4 -4
- data/lib/mongoid/timestamps/short.rb +1 -1
- data/lib/mongoid/timestamps/timeless.rb +29 -7
- data/lib/mongoid/timestamps/updated/short.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +3 -5
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/touchable.rb +155 -29
- data/lib/mongoid/traversable.rb +180 -125
- data/lib/mongoid/utils.rb +52 -0
- data/lib/mongoid/validatable/associated.rb +97 -21
- data/lib/mongoid/validatable/format.rb +1 -1
- data/lib/mongoid/validatable/length.rb +1 -1
- data/lib/mongoid/validatable/localizable.rb +2 -4
- data/lib/mongoid/validatable/macros.rb +10 -14
- data/lib/mongoid/validatable/presence.rb +7 -13
- data/lib/mongoid/validatable/queryable.rb +9 -3
- data/lib/mongoid/validatable/uniqueness.rb +26 -39
- data/lib/mongoid/validatable.rb +20 -29
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +37 -0
- data/lib/mongoid.rb +56 -22
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
- data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
- data/lib/rails/generators/mongoid_generator.rb +13 -1
- data/lib/rails/mongoid.rb +4 -32
- data/spec/config/mongoid.yml +16 -1
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/active_job_spec.rb +32 -0
- data/spec/integration/app_spec.rb +180 -89
- data/spec/integration/associations/belongs_to_spec.rb +19 -1
- data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
- data/spec/integration/associations/embedded_spec.rb +90 -7
- data/spec/integration/associations/embeds_many_spec.rb +197 -1
- data/spec/integration/associations/embeds_one_spec.rb +19 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -1
- data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
- data/spec/integration/associations/has_many_spec.rb +1 -1
- data/spec/integration/associations/has_one_spec.rb +145 -1
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
- data/spec/integration/associations/scope_option_spec.rb +102 -0
- data/spec/integration/atomic/modifiers_spec.rb +1 -1
- data/spec/integration/bson_regexp_raw_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +147 -3
- data/spec/integration/callbacks_spec.rb +398 -8
- data/spec/integration/contextual/empty_spec.rb +142 -0
- data/spec/integration/criteria/alias_query_spec.rb +98 -0
- data/spec/integration/criteria/date_field_spec.rb +2 -2
- data/spec/integration/criteria/default_scope_spec.rb +52 -0
- data/spec/integration/criteria/logical_spec.rb +12 -0
- data/spec/integration/criteria/range_spec.rb +358 -0
- data/spec/integration/criteria/raw_value_spec.rb +525 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
- data/spec/integration/discriminator_key_spec.rb +119 -81
- data/spec/integration/discriminator_value_spec.rb +1 -1
- data/spec/integration/document_spec.rb +31 -1
- data/spec/integration/dots_and_dollars_spec.rb +278 -0
- data/spec/integration/encryption_spec.rb +100 -0
- data/spec/integration/i18n_fallbacks_spec.rb +10 -52
- data/spec/integration/matcher_examples_spec.rb +21 -14
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
- data/spec/integration/matcher_operator_data/in.yml +16 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/size.yml +0 -3
- data/spec/integration/matcher_operator_data/type.yml +64 -0
- data/spec/integration/matcher_operator_data/type_array.yml +15 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +26 -3
- data/spec/integration/matcher_spec.rb +50 -1
- data/spec/integration/persistence/range_field_spec.rb +351 -0
- data/spec/integration/server_query_spec.rb +1 -1
- data/spec/integration/shardable_spec.rb +1 -1
- data/spec/integration/stringified_symbol_field_spec.rb +17 -3
- data/spec/lite_spec_helper.rb +47 -14
- data/spec/mongoid/association/accessors_spec.rb +31 -19
- data/spec/mongoid/association/auto_save_spec.rb +73 -34
- data/spec/mongoid/association/builders_spec.rb +2 -2
- data/spec/mongoid/association/constrainable_spec.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +34 -34
- data/spec/mongoid/association/depending_spec.rb +397 -358
- data/spec/mongoid/association/eager_spec.rb +56 -6
- data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
- data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
- data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
- data/spec/mongoid/association/macros_spec.rb +10 -10
- data/spec/mongoid/association/nested/many_spec.rb +1 -1
- data/spec/mongoid/association/nested/one_spec.rb +17 -13
- data/spec/mongoid/association/options_spec.rb +1 -1
- data/spec/mongoid/association/polymorphic_spec.rb +1 -1
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
- data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
- data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
- data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
- data/spec/mongoid/association/reflections_spec.rb +1 -1
- data/spec/mongoid/association/syncable_spec.rb +47 -33
- data/spec/mongoid/association_spec.rb +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
- data/spec/mongoid/atomic/paths_spec.rb +65 -27
- data/spec/mongoid/atomic_spec.rb +29 -7
- data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
- data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
- data/spec/mongoid/attributes/embedded_spec.rb +118 -0
- data/spec/mongoid/attributes/nested_spec.rb +147 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +41 -0
- data/spec/mongoid/attributes/readonly_spec.rb +23 -23
- data/spec/mongoid/attributes_spec.rb +921 -69
- data/spec/mongoid/cacheable_spec.rb +5 -5
- data/spec/mongoid/changeable_spec.rb +468 -76
- data/spec/mongoid/clients/factory_spec.rb +152 -30
- data/spec/mongoid/clients/options_spec.rb +24 -12
- data/spec/mongoid/clients/sessions_spec.rb +49 -71
- data/spec/mongoid/clients/transactions_spec.rb +971 -176
- data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
- data/spec/mongoid/clients_spec.rb +230 -22
- data/spec/mongoid/collection_configurable_spec.rb +159 -0
- data/spec/mongoid/composable_spec.rb +1 -1
- data/spec/mongoid/config/defaults_spec.rb +99 -0
- data/spec/mongoid/config/encryption_spec.rb +152 -0
- data/spec/mongoid/config/environment_spec.rb +126 -39
- data/spec/mongoid/config/introspection_spec.rb +114 -0
- data/spec/mongoid/config/options_spec.rb +1 -1
- data/spec/mongoid/config_spec.rb +375 -43
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
- data/spec/mongoid/contextual/atomic_spec.rb +329 -87
- data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
- data/spec/mongoid/contextual/memory_spec.rb +1479 -127
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
- data/spec/mongoid/contextual/none_spec.rb +79 -68
- data/spec/mongoid/copyable_spec.rb +465 -23
- data/spec/mongoid/copyable_spec_models.rb +1 -1
- data/spec/mongoid/criteria/findable_spec.rb +295 -229
- data/spec/mongoid/criteria/includable_spec.rb +1493 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
- data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
- data/spec/mongoid/criteria/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
- data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
- data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
- data/spec/mongoid/criteria/scopable_spec.rb +128 -1
- data/spec/mongoid/criteria/translator_spec.rb +133 -0
- data/spec/mongoid/criteria_projection_spec.rb +407 -0
- data/spec/mongoid/criteria_spec.rb +1029 -1806
- data/spec/mongoid/document_fields_spec.rb +180 -5
- data/spec/mongoid/document_persistence_context_spec.rb +77 -1
- data/spec/mongoid/document_query_spec.rb +55 -4
- data/spec/mongoid/document_spec.rb +43 -172
- data/spec/mongoid/equality_spec.rb +7 -8
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
- data/spec/mongoid/errors/callback_spec.rb +1 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
- data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
- data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
- data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
- data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
- data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_environment_spec.rb +4 -4
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
- data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
- data/spec/mongoid/errors/no_parent_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
- data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
- data/spec/mongoid/errors/validations_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +19 -265
- data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
- data/spec/mongoid/extensions/binary_spec.rb +45 -10
- data/spec/mongoid/extensions/boolean_spec.rb +69 -83
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
- data/spec/mongoid/extensions/date_spec.rb +74 -22
- data/spec/mongoid/extensions/date_time_spec.rb +18 -19
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/false_class_spec.rb +2 -9
- data/spec/mongoid/extensions/float_spec.rb +56 -84
- data/spec/mongoid/extensions/hash_spec.rb +45 -219
- data/spec/mongoid/extensions/integer_spec.rb +53 -73
- data/spec/mongoid/extensions/module_spec.rb +1 -1
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +1 -1
- data/spec/mongoid/extensions/object_spec.rb +1 -177
- data/spec/mongoid/extensions/range_spec.rb +254 -64
- data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
- data/spec/mongoid/extensions/regexp_spec.rb +59 -34
- data/spec/mongoid/extensions/set_spec.rb +105 -1
- data/spec/mongoid/extensions/string_spec.rb +21 -104
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
- data/spec/mongoid/extensions/symbol_spec.rb +15 -53
- data/spec/mongoid/extensions/time_spec.rb +345 -131
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
- data/spec/mongoid/extensions/true_class_spec.rb +2 -9
- data/spec/mongoid/factory_spec.rb +63 -2
- data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
- data/spec/mongoid/fields/localized_spec.rb +85 -42
- data/spec/mongoid/fields/standard_spec.rb +1 -1
- data/spec/mongoid/fields_spec.rb +826 -121
- data/spec/mongoid/findable_spec.rb +442 -80
- data/spec/mongoid/indexable/specification_spec.rb +132 -14
- data/spec/mongoid/indexable_spec.rb +361 -23
- data/spec/mongoid/inspectable_spec.rb +93 -5
- data/spec/mongoid/interceptable_spec.rb +926 -116
- data/spec/mongoid/interceptable_spec_models.rb +236 -4
- data/spec/mongoid/loading_spec.rb +110 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
- data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
- data/spec/mongoid/mongoizable_spec.rb +286 -0
- data/spec/mongoid/monkey_patches_spec.rb +211 -0
- data/spec/mongoid/persistable/creatable_spec.rb +5 -5
- data/spec/mongoid/persistable/deletable_spec.rb +267 -27
- data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
- data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
- data/spec/mongoid/persistable/logical_spec.rb +42 -5
- data/spec/mongoid/persistable/maxable_spec.rb +147 -0
- data/spec/mongoid/persistable/minable_spec.rb +147 -0
- data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
- data/spec/mongoid/persistable/poppable_spec.rb +41 -5
- data/spec/mongoid/persistable/pullable_spec.rb +81 -9
- data/spec/mongoid/persistable/pushable_spec.rb +81 -9
- data/spec/mongoid/persistable/renamable_spec.rb +40 -4
- data/spec/mongoid/persistable/savable_spec.rb +114 -20
- data/spec/mongoid/persistable/settable_spec.rb +77 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
- data/spec/mongoid/persistable/updatable_spec.rb +64 -52
- data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
- data/spec/mongoid/persistable_spec.rb +4 -4
- data/spec/mongoid/persistence_context_spec.rb +58 -59
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
- data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
- data/spec/mongoid/relations/proxy_spec.rb +7 -7
- data/spec/mongoid/reloadable_spec.rb +255 -30
- data/spec/mongoid/scopable_spec.rb +198 -58
- data/spec/mongoid/search_indexable_spec.rb +147 -0
- data/spec/mongoid/selectable_spec.rb +7 -7
- data/spec/mongoid/serializable_spec.rb +19 -40
- data/spec/mongoid/shardable_models.rb +15 -0
- data/spec/mongoid/shardable_spec.rb +181 -31
- data/spec/mongoid/stateful_spec.rb +152 -10
- data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
- data/spec/mongoid/tasks/database_spec.rb +175 -2
- data/spec/mongoid/tasks/encryption_spec.rb +187 -0
- data/spec/mongoid/threaded_spec.rb +40 -3
- data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
- data/spec/mongoid/timestamps/created_spec.rb +2 -2
- data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
- data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
- data/spec/mongoid/timestamps/updated_spec.rb +4 -4
- data/spec/mongoid/timestamps_spec.rb +399 -11
- data/spec/mongoid/timestamps_spec_models.rb +68 -0
- data/spec/mongoid/touchable_spec.rb +971 -54
- data/spec/mongoid/touchable_spec_models.rb +154 -0
- data/spec/mongoid/traversable_spec.rb +79 -37
- data/spec/mongoid/validatable/associated_spec.rb +14 -31
- data/spec/mongoid/validatable/format_spec.rb +1 -1
- data/spec/mongoid/validatable/length_spec.rb +1 -1
- data/spec/mongoid/validatable/numericality_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +27 -23
- data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
- data/spec/mongoid/validatable_spec.rb +4 -4
- data/spec/mongoid/warnings_spec.rb +36 -0
- data/spec/mongoid_spec.rb +61 -11
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
- data/spec/rails/mongoid_spec.rb +28 -132
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +24 -4
- data/spec/shared/lib/mrss/constraints.rb +77 -29
- data/spec/shared/lib/mrss/docker_runner.rb +40 -4
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +123 -71
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +187 -40
- data/spec/shared/shlib/set_env.sh +49 -31
- data/spec/spec_helper.rb +46 -49
- data/spec/support/authorization.rb +1 -1
- data/spec/support/client_registry.rb +10 -0
- data/spec/support/constraints.rb +25 -1
- data/spec/support/crypt/models.rb +50 -0
- data/spec/support/crypt.rb +80 -0
- data/spec/support/expectations.rb +1 -1
- data/spec/support/feature_sandbox.rb +72 -0
- data/spec/support/helpers.rb +1 -0
- data/spec/support/immutable_ids.rb +119 -0
- data/spec/support/macros.rb +107 -1
- data/spec/support/models/account.rb +2 -2
- data/spec/support/models/acolyte.rb +1 -1
- data/spec/support/models/actor.rb +1 -1
- data/spec/support/models/actress.rb +1 -1
- data/spec/support/models/address.rb +7 -1
- data/spec/support/models/address_component.rb +1 -1
- data/spec/support/models/address_number.rb +1 -1
- data/spec/support/models/agency.rb +1 -1
- data/spec/support/models/agent.rb +1 -1
- data/spec/support/models/album.rb +1 -1
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +1 -1
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +1 -1
- data/spec/support/models/armrest.rb +1 -1
- data/spec/support/models/array_field.rb +1 -1
- data/spec/support/models/article.rb +1 -1
- data/spec/support/models/artist.rb +3 -2
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +4 -0
- data/spec/support/models/audio.rb +1 -1
- data/spec/support/models/augmentation.rb +13 -1
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +13 -1
- data/spec/support/models/bar.rb +1 -1
- data/spec/support/models/basic.rb +1 -1
- data/spec/support/models/bed.rb +1 -1
- data/spec/support/models/big_palette.rb +1 -1
- data/spec/support/models/birthday.rb +1 -1
- data/spec/support/models/bolt.rb +8 -0
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +2 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -1
- data/spec/support/models/building.rb +3 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +1 -1
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +1 -1
- data/spec/support/models/car.rb +1 -1
- data/spec/support/models/cat.rb +1 -1
- data/spec/support/models/catalog.rb +25 -0
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +4 -4
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +1 -1
- data/spec/support/models/circuit.rb +1 -1
- data/spec/support/models/circus.rb +4 -1
- data/spec/support/models/code.rb +3 -1
- data/spec/support/models/coding/pull_request.rb +1 -1
- data/spec/support/models/coding.rb +1 -1
- data/spec/support/models/comment.rb +1 -1
- data/spec/support/models/company.rb +1 -1
- data/spec/support/models/consumption_period.rb +1 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +1 -1
- data/spec/support/models/country_code.rb +3 -1
- data/spec/support/models/courier_job.rb +1 -1
- data/spec/support/models/cover.rb +11 -0
- data/spec/support/models/crate.rb +1 -1
- data/spec/support/models/customer.rb +1 -1
- data/spec/support/models/customer_address.rb +1 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +1 -1
- data/spec/support/models/description.rb +1 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +1 -1
- data/spec/support/models/doctor.rb +1 -1
- data/spec/support/models/dog.rb +1 -1
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +1 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +1 -1
- data/spec/support/models/drug.rb +1 -1
- data/spec/support/models/dungeon.rb +1 -1
- data/spec/support/models/edit.rb +1 -1
- data/spec/support/models/email.rb +1 -1
- data/spec/support/models/employer.rb +1 -1
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +1 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +1 -1
- data/spec/support/models/exhibition.rb +1 -1
- data/spec/support/models/exhibitor.rb +1 -1
- data/spec/support/models/explosion.rb +1 -1
- data/spec/support/models/eye.rb +1 -1
- data/spec/support/models/eye_bowl.rb +1 -1
- data/spec/support/models/face.rb +1 -1
- data/spec/support/models/fanatic.rb +9 -0
- data/spec/support/models/favorite.rb +8 -2
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +1 -1
- data/spec/support/models/fish.rb +1 -1
- data/spec/support/models/folder.rb +1 -1
- data/spec/support/models/folder_item.rb +1 -1
- data/spec/support/models/fruits.rb +1 -1
- data/spec/support/models/game.rb +1 -1
- data/spec/support/models/ghost.rb +1 -1
- data/spec/support/models/guitar.rb +1 -1
- data/spec/support/models/hole.rb +13 -0
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +1 -1
- data/spec/support/models/html_writer.rb +1 -1
- data/spec/support/models/id_key.rb +1 -1
- data/spec/support/models/idnodef.rb +1 -1
- data/spec/support/models/image.rb +1 -1
- data/spec/support/models/implant.rb +10 -1
- data/spec/support/models/instrument.rb +1 -1
- data/spec/support/models/item.rb +1 -1
- data/spec/support/models/jar.rb +1 -1
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +5 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +1 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +1 -1
- data/spec/support/models/line_item.rb +1 -1
- data/spec/support/models/location.rb +1 -1
- data/spec/support/models/login.rb +1 -1
- data/spec/support/models/manufacturer.rb +1 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +2 -1
- data/spec/support/models/message.rb +1 -1
- data/spec/support/models/minim.rb +1 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/mop.rb +10 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -1
- data/spec/support/models/name.rb +11 -1
- data/spec/support/models/name_only.rb +1 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +1 -1
- data/spec/support/models/nut.rb +8 -0
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +3 -1
- data/spec/support/models/ordered_post.rb +2 -2
- data/spec/support/models/ordered_preference.rb +1 -1
- data/spec/support/models/oscar.rb +1 -1
- data/spec/support/models/other_owner_object.rb +1 -1
- data/spec/support/models/override.rb +1 -1
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +1 -1
- data/spec/support/models/page.rb +1 -1
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +1 -1
- data/spec/support/models/parent.rb +1 -1
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +15 -1
- data/spec/support/models/patient.rb +1 -1
- data/spec/support/models/pdf_writer.rb +1 -1
- data/spec/support/models/pencil.rb +1 -1
- data/spec/support/models/person.rb +19 -1
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +3 -2
- data/spec/support/models/piano.rb +1 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +3 -1
- data/spec/support/models/post.rb +1 -1
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +13 -1
- data/spec/support/models/preference.rb +1 -1
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +2 -1
- data/spec/support/models/profile.rb +1 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +1 -1
- data/spec/support/models/publication/encyclopedia.rb +1 -1
- data/spec/support/models/publication/review.rb +1 -1
- data/spec/support/models/publication.rb +1 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +11 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/question.rb +1 -1
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +1 -1
- data/spec/support/models/registry.rb +2 -1
- data/spec/support/models/role.rb +1 -1
- data/spec/support/models/root_category.rb +1 -1
- data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_user.rb +4 -0
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +1 -1
- data/spec/support/models/school.rb +15 -0
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +8 -0
- data/spec/support/models/seat.rb +1 -1
- data/spec/support/models/seo.rb +1 -1
- data/spec/support/models/series.rb +1 -1
- data/spec/support/models/server.rb +1 -1
- data/spec/support/models/service.rb +1 -1
- data/spec/support/models/shape.rb +1 -1
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +19 -0
- data/spec/support/models/shipment_address.rb +1 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +1 -1
- data/spec/support/models/shirt.rb +12 -0
- data/spec/support/models/shop.rb +1 -1
- data/spec/support/models/short_agent.rb +1 -1
- data/spec/support/models/short_quiz.rb +1 -1
- data/spec/support/models/simple.rb +1 -1
- data/spec/support/models/slave.rb +1 -1
- data/spec/support/models/song.rb +1 -1
- data/spec/support/models/sound.rb +1 -1
- data/spec/support/models/spacer.rb +8 -0
- data/spec/support/models/square.rb +1 -1
- data/spec/support/models/staff.rb +1 -1
- data/spec/support/models/store_as_dup_test1.rb +1 -1
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +1 -1
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +1 -1
- data/spec/support/models/student.rb +15 -0
- data/spec/support/models/sub_item.rb +1 -1
- data/spec/support/models/subscription.rb +1 -1
- data/spec/support/models/survey.rb +1 -1
- data/spec/support/models/symptom.rb +1 -1
- data/spec/support/models/system_role.rb +1 -0
- data/spec/support/models/tag.rb +1 -1
- data/spec/support/models/target.rb +1 -1
- data/spec/support/models/template.rb +1 -1
- data/spec/support/models/thing.rb +1 -1
- data/spec/support/models/threadlocker.rb +8 -0
- data/spec/support/models/title.rb +1 -1
- data/spec/support/models/tool.rb +1 -1
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +1 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +1 -1
- data/spec/support/models/truck.rb +1 -1
- data/spec/support/models/updatable.rb +1 -1
- data/spec/support/models/user.rb +1 -1
- data/spec/support/models/user_account.rb +1 -1
- data/spec/support/models/validation_callback.rb +1 -1
- data/spec/support/models/vehicle.rb +1 -1
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +1 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +1 -1
- data/spec/support/models/video_game.rb +1 -1
- data/spec/support/models/washer.rb +8 -0
- data/spec/support/models/weapon.rb +13 -1
- data/spec/support/models/wiki_page.rb +1 -1
- data/spec/support/models/word.rb +1 -1
- data/spec/support/models/word_origin.rb +1 -1
- data/spec/support/models/writer.rb +1 -1
- data/spec/support/rails_mock.rb +32 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +3 -22
- data/spec/support/sinatra_mock.rb +7 -0
- data/spec/support/spec_config.rb +42 -7
- data.tar.gz.sig +0 -0
- metadata +883 -562
- metadata.gz.sig +0 -0
- data/lib/mongoid/association/referenced/eager.rb +0 -184
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
- data/lib/mongoid/contextual/geo_near.rb +0 -269
- data/lib/mongoid/errors/eager_load.rb +0 -26
- data/lib/mongoid/errors/invalid_session_use.rb +0 -26
- data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
- data/lib/mongoid/errors/invalid_value.rb +0 -18
- data/lib/mongoid/query_cache.rb +0 -333
- data/lib/support/ruby_version.rb +0 -29
- data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
- data/spec/mongoid/extensions_spec.rb +0 -32
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
- data/spec/mongoid/query_cache_spec.rb +0 -978
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
require "spec_helper"
|
|
5
|
+
require_relative './attributes/nested_spec_models'
|
|
5
6
|
|
|
6
7
|
describe Mongoid::Attributes do
|
|
7
8
|
|
|
@@ -21,7 +22,7 @@ describe Mongoid::Attributes do
|
|
|
21
22
|
context "when the attribute was excluded in a criteria" do
|
|
22
23
|
|
|
23
24
|
let!(:person) do
|
|
24
|
-
Person.create(title: "sir")
|
|
25
|
+
Person.create!(title: "sir")
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
context "when the attribute is localized" do
|
|
@@ -56,7 +57,7 @@ describe Mongoid::Attributes do
|
|
|
56
57
|
let!(:agent) do
|
|
57
58
|
agent = Agent.new(:title => title)
|
|
58
59
|
agent.build_address(:city => city)
|
|
59
|
-
agent.save()
|
|
60
|
+
agent.save!()
|
|
60
61
|
agent
|
|
61
62
|
end
|
|
62
63
|
let(:from_db) do
|
|
@@ -96,6 +97,49 @@ describe Mongoid::Attributes do
|
|
|
96
97
|
it "does not raise an error" do
|
|
97
98
|
expect(from_db.map).to eq(map)
|
|
98
99
|
end
|
|
100
|
+
|
|
101
|
+
context 'when only one of the hash fields is projected' do
|
|
102
|
+
|
|
103
|
+
let(:map) do
|
|
104
|
+
{ 'dates' => { 'y' => { '2016' => 'Berlin', '2017' => 'Munich' } } }
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
let(:expected) do
|
|
108
|
+
{ 'dates' => { 'y' => {
|
|
109
|
+
'2016' => 'Berlin',
|
|
110
|
+
} } }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'retrieves only the projected fields' do
|
|
114
|
+
expect(from_db.map).to eq(expected)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
context 'when several of the hash fields is projected' do
|
|
119
|
+
|
|
120
|
+
let(:map) do
|
|
121
|
+
{ 'dates' => { 'y' => {
|
|
122
|
+
'2016' => 'Berlin',
|
|
123
|
+
'2017' => 'Munich',
|
|
124
|
+
'2018' => 'Krakow',
|
|
125
|
+
} } }
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
let(:expected) do
|
|
129
|
+
{ 'dates' => { 'y' => {
|
|
130
|
+
'2016' => 'Berlin',
|
|
131
|
+
'2018' => 'Krakow',
|
|
132
|
+
} } }
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
let(:from_db) do
|
|
136
|
+
Person.only('map.dates.y.2016', 'map.dates.y.2018').first
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it 'retrieves only the projected fields' do
|
|
140
|
+
expect(from_db.map).to eq(expected)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
99
143
|
end
|
|
100
144
|
end
|
|
101
145
|
|
|
@@ -123,7 +167,7 @@ describe Mongoid::Attributes do
|
|
|
123
167
|
it "raises an error" do
|
|
124
168
|
expect {
|
|
125
169
|
from_db.title
|
|
126
|
-
}.to raise_error(
|
|
170
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
127
171
|
end
|
|
128
172
|
|
|
129
173
|
context "accessing via []" do
|
|
@@ -131,7 +175,7 @@ describe Mongoid::Attributes do
|
|
|
131
175
|
it "raises an error" do
|
|
132
176
|
expect {
|
|
133
177
|
from_db["title"]
|
|
134
|
-
}.to raise_error(
|
|
178
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
135
179
|
end
|
|
136
180
|
end
|
|
137
181
|
end
|
|
@@ -145,7 +189,7 @@ describe Mongoid::Attributes do
|
|
|
145
189
|
it "raises an error" do
|
|
146
190
|
expect {
|
|
147
191
|
from_db.title
|
|
148
|
-
}.to raise_error(
|
|
192
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
149
193
|
end
|
|
150
194
|
end
|
|
151
195
|
end
|
|
@@ -156,7 +200,7 @@ describe Mongoid::Attributes do
|
|
|
156
200
|
context 'when the document has a custom attribute type' do
|
|
157
201
|
|
|
158
202
|
let(:bar) do
|
|
159
|
-
Bar.create(lat_lng: LatLng.new(52.30, 13.25))
|
|
203
|
+
Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
|
|
160
204
|
end
|
|
161
205
|
|
|
162
206
|
it 'returns the demongoized version of the attribute' do
|
|
@@ -213,7 +257,7 @@ describe Mongoid::Attributes do
|
|
|
213
257
|
context "when the document is an existing record" do
|
|
214
258
|
|
|
215
259
|
let!(:person) do
|
|
216
|
-
Person.create(title: "sir")
|
|
260
|
+
Person.create!(title: "sir")
|
|
217
261
|
end
|
|
218
262
|
|
|
219
263
|
context "when the attribute was excluded in a criteria" do
|
|
@@ -227,7 +271,7 @@ describe Mongoid::Attributes do
|
|
|
227
271
|
it "raises an error" do
|
|
228
272
|
expect {
|
|
229
273
|
from_db[:title]
|
|
230
|
-
}.to raise_error(
|
|
274
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
231
275
|
end
|
|
232
276
|
end
|
|
233
277
|
|
|
@@ -240,7 +284,92 @@ describe Mongoid::Attributes do
|
|
|
240
284
|
it "raises an error" do
|
|
241
285
|
expect {
|
|
242
286
|
from_db[:title]
|
|
243
|
-
}.to raise_error(
|
|
287
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
context "when the field was not explicitly defined" do
|
|
293
|
+
|
|
294
|
+
context "when excluding with only and the field was not excluded" do
|
|
295
|
+
|
|
296
|
+
let(:from_db) do
|
|
297
|
+
Person.only(:_id).first
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
it "raises an error" do
|
|
301
|
+
expect {
|
|
302
|
+
from_db[:undefined_field]
|
|
303
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'undefined_field' on Person which was not loaded/)
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
context "when excluding with without and the field was excluded" do
|
|
308
|
+
|
|
309
|
+
let(:from_db) do
|
|
310
|
+
Person.without(:title).first
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
it "raises an error" do
|
|
314
|
+
expect {
|
|
315
|
+
from_db[:title]
|
|
316
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
context "when excluding with without and the field was not excluded" do
|
|
321
|
+
|
|
322
|
+
let(:from_db) do
|
|
323
|
+
Person.without(:title).first
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
it "returns nil" do
|
|
327
|
+
from_db[:undefined_field].should be nil
|
|
328
|
+
end
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
context 'when projecting with #only' do
|
|
333
|
+
let!(:person) do
|
|
334
|
+
Person.create!(title: 'sir', name: { first_name: 'Jose', language: { name: 'es' } })
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
context 'when projecting an embedded association' do
|
|
338
|
+
let(:from_db) do
|
|
339
|
+
Person.only(:name).first
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
context 'when retrieving a field of the association using the dot notation' do
|
|
343
|
+
|
|
344
|
+
it 'retrieves the field' do
|
|
345
|
+
expect(from_db['name.first_name']).to eq 'Jose'
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
context 'when retrieving a field of a nested association using the dot notation' do
|
|
350
|
+
it 'retrieves the field' do
|
|
351
|
+
expect(from_db['name.language.name']).to eq 'es'
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
context 'when projecting a sub-association of an embedded association' do
|
|
357
|
+
let(:from_db) do
|
|
358
|
+
Person.only('name.language').first
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
context 'when retrieving a field under the projected sub-association' do
|
|
362
|
+
it 'retrieves the field' do
|
|
363
|
+
expect(from_db['name.language.name']).to eq 'es'
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
context 'when retrieving a non-projected field' do
|
|
368
|
+
it 'raises AttributeNotLoaded' do
|
|
369
|
+
expect do
|
|
370
|
+
from_db['name.first_name']
|
|
371
|
+
end.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'name.first_name' on Person which was not loaded/)
|
|
372
|
+
end
|
|
244
373
|
end
|
|
245
374
|
end
|
|
246
375
|
end
|
|
@@ -265,11 +394,10 @@ describe Mongoid::Attributes do
|
|
|
265
394
|
end
|
|
266
395
|
|
|
267
396
|
context "when reloaded" do
|
|
397
|
+
config_override :raise_not_found_error, false
|
|
268
398
|
|
|
269
399
|
before do
|
|
270
|
-
Mongoid.raise_not_found_error = false
|
|
271
400
|
person.reload
|
|
272
|
-
Mongoid.raise_not_found_error = true
|
|
273
401
|
end
|
|
274
402
|
|
|
275
403
|
it "returns the default value" do
|
|
@@ -287,7 +415,7 @@ describe Mongoid::Attributes do
|
|
|
287
415
|
let(:bar) do
|
|
288
416
|
Bar.new.tap do |b|
|
|
289
417
|
b[:lat_lng] = LatLng.new(52.30, 13.25)
|
|
290
|
-
b.save
|
|
418
|
+
b.save!
|
|
291
419
|
end
|
|
292
420
|
end
|
|
293
421
|
|
|
@@ -329,6 +457,67 @@ describe Mongoid::Attributes do
|
|
|
329
457
|
expect(terms).to eq(true)
|
|
330
458
|
end
|
|
331
459
|
end
|
|
460
|
+
|
|
461
|
+
context 'when the field is not explicitly defined' do
|
|
462
|
+
let(:bar) { Bar.new }
|
|
463
|
+
|
|
464
|
+
before do
|
|
465
|
+
bar['missing_field'] = 42
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
it 'writes the value into attributes' do
|
|
469
|
+
bar.attributes.should == {'_id' => bar.id, 'missing_field' => 42}
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
it 'makes the attribute accessible via []' do
|
|
473
|
+
bar['missing_field'].should == 42
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
context 'when writing fields on a document with projection' do
|
|
477
|
+
|
|
478
|
+
let!(:person) do
|
|
479
|
+
Person.create!(title: "sir")
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
context "when excluding with only and the field was not excluded" do
|
|
483
|
+
|
|
484
|
+
let(:from_db) do
|
|
485
|
+
Person.only(:_id).first
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
it "raises an error" do
|
|
489
|
+
expect {
|
|
490
|
+
from_db[:undefined_field] = 'x'
|
|
491
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'undefined_field' on Person which was not loaded/)
|
|
492
|
+
end
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
context "when excluding with without and the field was excluded" do
|
|
496
|
+
|
|
497
|
+
let(:from_db) do
|
|
498
|
+
Person.without(:title).first
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
it "raises an error" do
|
|
502
|
+
expect {
|
|
503
|
+
from_db[:title] = 'x'
|
|
504
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
context "when excluding with without and the field was not excluded" do
|
|
509
|
+
|
|
510
|
+
let(:from_db) do
|
|
511
|
+
Person.without(:title).first
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
it "writes the value" do
|
|
515
|
+
from_db[:undefined_field] = 'x'
|
|
516
|
+
from_db[:undefined_field].should == 'x'
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
end
|
|
332
521
|
end
|
|
333
522
|
|
|
334
523
|
describe "#_id" do
|
|
@@ -799,7 +988,7 @@ describe Mongoid::Attributes do
|
|
|
799
988
|
context 'when the document has a custom attribute type' do
|
|
800
989
|
|
|
801
990
|
let(:bar) do
|
|
802
|
-
Bar.create(lat_lng: LatLng.new(52.30, 13.25))
|
|
991
|
+
Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
|
|
803
992
|
end
|
|
804
993
|
|
|
805
994
|
it 'returns the demongoized version of the attribute' do
|
|
@@ -837,18 +1026,17 @@ describe Mongoid::Attributes do
|
|
|
837
1026
|
context "when the document is an existing record" do
|
|
838
1027
|
|
|
839
1028
|
let(:person) do
|
|
840
|
-
Person.create
|
|
1029
|
+
Person.create!
|
|
841
1030
|
end
|
|
842
1031
|
|
|
843
1032
|
context "when the attribute does not exist" do
|
|
1033
|
+
config_override :raise_not_found_error, false
|
|
844
1034
|
|
|
845
1035
|
before do
|
|
846
1036
|
person.collection
|
|
847
1037
|
.find({ _id: person.id })
|
|
848
1038
|
.update_one({ "$unset" => { age: 1 }})
|
|
849
|
-
Mongoid.raise_not_found_error = false
|
|
850
1039
|
person.reload
|
|
851
|
-
Mongoid.raise_not_found_error = true
|
|
852
1040
|
end
|
|
853
1041
|
|
|
854
1042
|
it "returns the default value" do
|
|
@@ -876,7 +1064,7 @@ describe Mongoid::Attributes do
|
|
|
876
1064
|
describe "#read_attribute_before_type_cast" do
|
|
877
1065
|
|
|
878
1066
|
let(:person) do
|
|
879
|
-
Person.create
|
|
1067
|
+
Person.create!
|
|
880
1068
|
end
|
|
881
1069
|
|
|
882
1070
|
context "when the attribute has not yet been assigned" do
|
|
@@ -889,8 +1077,52 @@ describe Mongoid::Attributes do
|
|
|
889
1077
|
context "after the attribute has been assigned" do
|
|
890
1078
|
|
|
891
1079
|
it "returns the default value" do
|
|
892
|
-
person.age = "
|
|
893
|
-
expect(person.age_before_type_cast).to eq("
|
|
1080
|
+
person.age = "42"
|
|
1081
|
+
expect(person.age_before_type_cast).to eq("42")
|
|
1082
|
+
end
|
|
1083
|
+
end
|
|
1084
|
+
|
|
1085
|
+
context 'when reading fields on a document with projection' do
|
|
1086
|
+
|
|
1087
|
+
let!(:person) do
|
|
1088
|
+
Person.create!(title: "sir")
|
|
1089
|
+
end
|
|
1090
|
+
|
|
1091
|
+
context "when excluding with only and the field was not excluded" do
|
|
1092
|
+
|
|
1093
|
+
let(:from_db) do
|
|
1094
|
+
Person.only(:_id).first
|
|
1095
|
+
end
|
|
1096
|
+
|
|
1097
|
+
it "raises an error" do
|
|
1098
|
+
expect {
|
|
1099
|
+
from_db.read_attribute(:undefined_field)
|
|
1100
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'undefined_field' on Person which was not loaded/)
|
|
1101
|
+
end
|
|
1102
|
+
end
|
|
1103
|
+
|
|
1104
|
+
context "when excluding with without and the field was excluded" do
|
|
1105
|
+
|
|
1106
|
+
let(:from_db) do
|
|
1107
|
+
Person.without(:title).first
|
|
1108
|
+
end
|
|
1109
|
+
|
|
1110
|
+
it "raises an error" do
|
|
1111
|
+
expect {
|
|
1112
|
+
from_db.read_attribute(:title)
|
|
1113
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
1114
|
+
end
|
|
1115
|
+
end
|
|
1116
|
+
|
|
1117
|
+
context "when excluding with without and the field was not excluded" do
|
|
1118
|
+
|
|
1119
|
+
let(:from_db) do
|
|
1120
|
+
Person.without(:title).first
|
|
1121
|
+
end
|
|
1122
|
+
|
|
1123
|
+
it "returns nil" do
|
|
1124
|
+
from_db.read_attribute(:undefined_field).should be nil
|
|
1125
|
+
end
|
|
894
1126
|
end
|
|
895
1127
|
end
|
|
896
1128
|
end
|
|
@@ -924,18 +1156,17 @@ describe Mongoid::Attributes do
|
|
|
924
1156
|
context "when the document is an existing record" do
|
|
925
1157
|
|
|
926
1158
|
let(:person) do
|
|
927
|
-
Person.create
|
|
1159
|
+
Person.create!
|
|
928
1160
|
end
|
|
929
1161
|
|
|
930
1162
|
context "when the attribute does not exist" do
|
|
1163
|
+
config_override :raise_not_found_error, false
|
|
931
1164
|
|
|
932
1165
|
before do
|
|
933
1166
|
person.collection
|
|
934
1167
|
.find({ _id: person.id })
|
|
935
1168
|
.update_one({ "$unset" => { age: 1 }})
|
|
936
|
-
Mongoid.raise_not_found_error = false
|
|
937
1169
|
person.reload
|
|
938
|
-
Mongoid.raise_not_found_error = true
|
|
939
1170
|
end
|
|
940
1171
|
|
|
941
1172
|
it "returns true" do
|
|
@@ -983,7 +1214,7 @@ describe Mongoid::Attributes do
|
|
|
983
1214
|
|
|
984
1215
|
context "when the attribute is not on only list" do
|
|
985
1216
|
|
|
986
|
-
before { Person.create }
|
|
1217
|
+
before { Person.create! }
|
|
987
1218
|
let(:person) do
|
|
988
1219
|
Person.only(:id).first
|
|
989
1220
|
end
|
|
@@ -1033,15 +1264,15 @@ describe Mongoid::Attributes do
|
|
|
1033
1264
|
|
|
1034
1265
|
context "before the attribute has been assigned" do
|
|
1035
1266
|
|
|
1036
|
-
it "returns
|
|
1037
|
-
expect(person.has_attribute_before_type_cast?(:age)).to be
|
|
1267
|
+
it "returns true" do
|
|
1268
|
+
expect(person.has_attribute_before_type_cast?(:age)).to be true
|
|
1038
1269
|
end
|
|
1039
1270
|
end
|
|
1040
1271
|
|
|
1041
1272
|
context "after the attribute has been assigned" do
|
|
1042
1273
|
|
|
1043
1274
|
it "returns true" do
|
|
1044
|
-
person.age = '
|
|
1275
|
+
person.age = '42'
|
|
1045
1276
|
expect(person.has_attribute_before_type_cast?(:age)).to be true
|
|
1046
1277
|
end
|
|
1047
1278
|
end
|
|
@@ -1052,7 +1283,7 @@ describe Mongoid::Attributes do
|
|
|
1052
1283
|
context "when the attribute exists" do
|
|
1053
1284
|
|
|
1054
1285
|
let(:person) do
|
|
1055
|
-
Person.create(title: "Sir")
|
|
1286
|
+
Person.create!(title: "Sir")
|
|
1056
1287
|
end
|
|
1057
1288
|
|
|
1058
1289
|
before do
|
|
@@ -1070,7 +1301,7 @@ describe Mongoid::Attributes do
|
|
|
1070
1301
|
context "when saving after the removal" do
|
|
1071
1302
|
|
|
1072
1303
|
before do
|
|
1073
|
-
person.save
|
|
1304
|
+
person.save!
|
|
1074
1305
|
end
|
|
1075
1306
|
|
|
1076
1307
|
it "persists the removal" do
|
|
@@ -1090,7 +1321,7 @@ describe Mongoid::Attributes do
|
|
|
1090
1321
|
end
|
|
1091
1322
|
|
|
1092
1323
|
before do
|
|
1093
|
-
person.save
|
|
1324
|
+
person.save!
|
|
1094
1325
|
person.pet.remove_attribute(:name)
|
|
1095
1326
|
end
|
|
1096
1327
|
|
|
@@ -1105,7 +1336,7 @@ describe Mongoid::Attributes do
|
|
|
1105
1336
|
context "when saving after the removal" do
|
|
1106
1337
|
|
|
1107
1338
|
before do
|
|
1108
|
-
person.save
|
|
1339
|
+
person.save!
|
|
1109
1340
|
end
|
|
1110
1341
|
|
|
1111
1342
|
it "persists the removal" do
|
|
@@ -1150,7 +1381,7 @@ describe Mongoid::Attributes do
|
|
|
1150
1381
|
context 'when the database name is used' do
|
|
1151
1382
|
|
|
1152
1383
|
let(:person) do
|
|
1153
|
-
Person.create(at: Time.now)
|
|
1384
|
+
Person.create!(at: Time.now)
|
|
1154
1385
|
end
|
|
1155
1386
|
|
|
1156
1387
|
before do
|
|
@@ -1168,7 +1399,7 @@ describe Mongoid::Attributes do
|
|
|
1168
1399
|
context "when saving after the removal" do
|
|
1169
1400
|
|
|
1170
1401
|
before do
|
|
1171
|
-
person.save
|
|
1402
|
+
person.save!
|
|
1172
1403
|
end
|
|
1173
1404
|
|
|
1174
1405
|
it "persists the removal" do
|
|
@@ -1180,7 +1411,7 @@ describe Mongoid::Attributes do
|
|
|
1180
1411
|
context 'when the alias is used' do
|
|
1181
1412
|
|
|
1182
1413
|
let(:person) do
|
|
1183
|
-
Person.create(aliased_timestamp: Time.now)
|
|
1414
|
+
Person.create!(aliased_timestamp: Time.now)
|
|
1184
1415
|
end
|
|
1185
1416
|
|
|
1186
1417
|
before do
|
|
@@ -1198,7 +1429,7 @@ describe Mongoid::Attributes do
|
|
|
1198
1429
|
context "when saving after the removal" do
|
|
1199
1430
|
|
|
1200
1431
|
before do
|
|
1201
|
-
person.save
|
|
1432
|
+
person.save!
|
|
1202
1433
|
end
|
|
1203
1434
|
|
|
1204
1435
|
it "persists the removal" do
|
|
@@ -1296,12 +1527,13 @@ describe Mongoid::Attributes do
|
|
|
1296
1527
|
end
|
|
1297
1528
|
|
|
1298
1529
|
context "when setting an attribute that needs type casting" do
|
|
1530
|
+
|
|
1299
1531
|
let(:person) do
|
|
1300
|
-
Person.new(age: "
|
|
1532
|
+
Person.new(age: "42")
|
|
1301
1533
|
end
|
|
1302
1534
|
|
|
1303
1535
|
it "should store the attribute before type cast" do
|
|
1304
|
-
expect(person.age_before_type_cast).to eq("
|
|
1536
|
+
expect(person.age_before_type_cast).to eq("42")
|
|
1305
1537
|
end
|
|
1306
1538
|
end
|
|
1307
1539
|
|
|
@@ -1341,7 +1573,7 @@ describe Mongoid::Attributes do
|
|
|
1341
1573
|
person.write_attribute(:test, "aliased field to test")
|
|
1342
1574
|
end
|
|
1343
1575
|
|
|
1344
|
-
it "allows the field name to be
|
|
1576
|
+
it "allows the field name to be updated" do
|
|
1345
1577
|
expect(person.t).to eq("aliased field to test")
|
|
1346
1578
|
end
|
|
1347
1579
|
end
|
|
@@ -1349,20 +1581,18 @@ describe Mongoid::Attributes do
|
|
|
1349
1581
|
context "when attribute is a Hash" do
|
|
1350
1582
|
let(:person) { Person.new map: { somekey: "somevalue" } }
|
|
1351
1583
|
|
|
1352
|
-
it "
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Array cannot be written to a field of type Hash/)
|
|
1584
|
+
it "writes nil when trying to set a value of invalid type - array" do
|
|
1585
|
+
person.map = []
|
|
1586
|
+
expect(person.map).to be_nil
|
|
1356
1587
|
end
|
|
1357
1588
|
|
|
1358
|
-
it "
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Hash/)
|
|
1589
|
+
it "writes nil when trying to set a value of invalid type - boolean" do
|
|
1590
|
+
person.map = false
|
|
1591
|
+
expect(person.map).to be_nil
|
|
1362
1592
|
end
|
|
1363
1593
|
|
|
1364
|
-
it "can set a Hash value" do
|
|
1365
|
-
expect(person.map).to eq( { somekey
|
|
1594
|
+
it "can set a Hash value with stringified keys" do
|
|
1595
|
+
expect(person.map).to eq( { "somekey" => "somevalue" } )
|
|
1366
1596
|
end
|
|
1367
1597
|
end
|
|
1368
1598
|
|
|
@@ -1373,16 +1603,14 @@ describe Mongoid::Attributes do
|
|
|
1373
1603
|
expect(person.aliases).to eq([ :alias_1 ])
|
|
1374
1604
|
end
|
|
1375
1605
|
|
|
1376
|
-
it "
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Hash cannot be written to a field of type Array/)
|
|
1606
|
+
it "writes nil when trying to set a value of invalid type - hash" do
|
|
1607
|
+
person.aliases = {}
|
|
1608
|
+
expect(person.aliases).to be_nil
|
|
1380
1609
|
end
|
|
1381
1610
|
|
|
1382
|
-
it "
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Array/)
|
|
1611
|
+
it "writes nil when trying to set a value of invalid type - boolean" do
|
|
1612
|
+
person.aliases = false
|
|
1613
|
+
expect(person.aliases).to be_nil
|
|
1386
1614
|
end
|
|
1387
1615
|
end
|
|
1388
1616
|
|
|
@@ -1398,6 +1626,93 @@ describe Mongoid::Attributes do
|
|
|
1398
1626
|
expect(dictionary.description).to eq('foo')
|
|
1399
1627
|
end
|
|
1400
1628
|
end
|
|
1629
|
+
|
|
1630
|
+
context 'when writing fields on a document with projection' do
|
|
1631
|
+
|
|
1632
|
+
let!(:person) do
|
|
1633
|
+
Person.create!(title: "sir")
|
|
1634
|
+
end
|
|
1635
|
+
|
|
1636
|
+
context "when excluding with only and the field was not excluded" do
|
|
1637
|
+
|
|
1638
|
+
let(:from_db) do
|
|
1639
|
+
Person.only(:_id).first
|
|
1640
|
+
end
|
|
1641
|
+
|
|
1642
|
+
it "raises an error" do
|
|
1643
|
+
expect {
|
|
1644
|
+
from_db.write_attribute(:undefined_field, 'x')
|
|
1645
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'undefined_field' on Person which was not loaded/)
|
|
1646
|
+
end
|
|
1647
|
+
end
|
|
1648
|
+
|
|
1649
|
+
context "when excluding with without and the field was excluded" do
|
|
1650
|
+
|
|
1651
|
+
let(:from_db) do
|
|
1652
|
+
Person.without(:title).first
|
|
1653
|
+
end
|
|
1654
|
+
|
|
1655
|
+
it "raises an error" do
|
|
1656
|
+
expect {
|
|
1657
|
+
from_db.write_attribute(:title, 'x')
|
|
1658
|
+
}.to raise_error(Mongoid::Errors::AttributeNotLoaded, /Attempted to access attribute 'title' on Person which was not loaded/)
|
|
1659
|
+
end
|
|
1660
|
+
end
|
|
1661
|
+
|
|
1662
|
+
context "when excluding with without and the field was not excluded" do
|
|
1663
|
+
|
|
1664
|
+
let(:from_db) do
|
|
1665
|
+
Person.without(:title).first
|
|
1666
|
+
end
|
|
1667
|
+
|
|
1668
|
+
it "writes the value" do
|
|
1669
|
+
from_db.write_attribute(:undefined_field, 'x')
|
|
1670
|
+
from_db.read_attribute(:undefined_field).should == 'x'
|
|
1671
|
+
end
|
|
1672
|
+
end
|
|
1673
|
+
end
|
|
1674
|
+
|
|
1675
|
+
context "when comparing the object_ids of the written value" do
|
|
1676
|
+
before do
|
|
1677
|
+
Person.create!
|
|
1678
|
+
end
|
|
1679
|
+
|
|
1680
|
+
let(:person) do
|
|
1681
|
+
Person.first
|
|
1682
|
+
end
|
|
1683
|
+
|
|
1684
|
+
context "when the field is not resizable" do
|
|
1685
|
+
let(:test) do
|
|
1686
|
+
person.write_attribute(:test, "aliased field to test")
|
|
1687
|
+
end
|
|
1688
|
+
|
|
1689
|
+
it "has the same object_id as the attributes hash value" do
|
|
1690
|
+
expect(test.object_id).to eq(person.test.object_id)
|
|
1691
|
+
end
|
|
1692
|
+
end
|
|
1693
|
+
|
|
1694
|
+
context "when the field is resizable" do
|
|
1695
|
+
|
|
1696
|
+
let(:arrays) do
|
|
1697
|
+
person.write_attribute(:arrays, [])
|
|
1698
|
+
end
|
|
1699
|
+
|
|
1700
|
+
it "has the same object_id as the attributes hash value" do
|
|
1701
|
+
expect(arrays.object_id).to eq(person.arrays.object_id)
|
|
1702
|
+
end
|
|
1703
|
+
end
|
|
1704
|
+
|
|
1705
|
+
context "when the field is a HABTM foreign key array" do
|
|
1706
|
+
|
|
1707
|
+
let(:preference_ids) do
|
|
1708
|
+
person.write_attribute(:preference_ids, [])
|
|
1709
|
+
end
|
|
1710
|
+
|
|
1711
|
+
it "has the same object_id as the attributes hash value" do
|
|
1712
|
+
expect(preference_ids.object_id).to eq(person.preference_ids.object_id)
|
|
1713
|
+
end
|
|
1714
|
+
end
|
|
1715
|
+
end
|
|
1401
1716
|
end
|
|
1402
1717
|
|
|
1403
1718
|
describe "#typed_value_for" do
|
|
@@ -1578,11 +1893,11 @@ describe Mongoid::Attributes do
|
|
|
1578
1893
|
end
|
|
1579
1894
|
|
|
1580
1895
|
it "has 3 new entries" do
|
|
1581
|
-
expect(pet.vet_visits.count).to eq
|
|
1896
|
+
expect(pet.vet_visits.count).to eq 3
|
|
1582
1897
|
end
|
|
1583
1898
|
|
|
1584
1899
|
it "persists the changes" do
|
|
1585
|
-
expect(pet.reload.vet_visits.count).to eq
|
|
1900
|
+
expect(pet.reload.vet_visits.count).to eq 3
|
|
1586
1901
|
end
|
|
1587
1902
|
end
|
|
1588
1903
|
|
|
@@ -1651,6 +1966,61 @@ describe Mongoid::Attributes do
|
|
|
1651
1966
|
end
|
|
1652
1967
|
end
|
|
1653
1968
|
|
|
1969
|
+
describe '#unalias_attribute' do
|
|
1970
|
+
let(:shirt) { Shirt.new }
|
|
1971
|
+
let(:id) { '1234' }
|
|
1972
|
+
|
|
1973
|
+
context 'when creating object' do
|
|
1974
|
+
let(:shirt) { Shirt.new(id: id) }
|
|
1975
|
+
|
|
1976
|
+
it 'id and _id are not the same' do
|
|
1977
|
+
expect(shirt.id).to eq(id)
|
|
1978
|
+
expect(shirt._id).not_to eq(id)
|
|
1979
|
+
end
|
|
1980
|
+
end
|
|
1981
|
+
|
|
1982
|
+
context 'update' do
|
|
1983
|
+
before do
|
|
1984
|
+
shirt.update(id: id)
|
|
1985
|
+
end
|
|
1986
|
+
|
|
1987
|
+
it 'updates id but not_id' do
|
|
1988
|
+
expect(shirt.id).to eq(id)
|
|
1989
|
+
expect(shirt._id).not_to eq(id)
|
|
1990
|
+
end
|
|
1991
|
+
end
|
|
1992
|
+
|
|
1993
|
+
context 'id=' do
|
|
1994
|
+
before do
|
|
1995
|
+
shirt.id = id
|
|
1996
|
+
end
|
|
1997
|
+
|
|
1998
|
+
it 'sets id and not _id' do
|
|
1999
|
+
expect(shirt.id).to eq(id)
|
|
2000
|
+
expect(shirt._id).not_to eq(id)
|
|
2001
|
+
end
|
|
2002
|
+
end
|
|
2003
|
+
|
|
2004
|
+
context 'id?' do
|
|
2005
|
+
context 'with null id' do
|
|
2006
|
+
it 'returns false' do
|
|
2007
|
+
expect(shirt.id?).to be false
|
|
2008
|
+
expect(shirt._id?).to be true
|
|
2009
|
+
end
|
|
2010
|
+
end
|
|
2011
|
+
|
|
2012
|
+
context 'with id' do
|
|
2013
|
+
before do
|
|
2014
|
+
shirt.id = id
|
|
2015
|
+
end
|
|
2016
|
+
|
|
2017
|
+
it 'returns true' do
|
|
2018
|
+
expect(shirt.id?).to be true
|
|
2019
|
+
end
|
|
2020
|
+
end
|
|
2021
|
+
end
|
|
2022
|
+
end
|
|
2023
|
+
|
|
1654
2024
|
describe "#alias_attribute" do
|
|
1655
2025
|
|
|
1656
2026
|
let(:product) do
|
|
@@ -1697,8 +2067,8 @@ describe Mongoid::Attributes do
|
|
|
1697
2067
|
end
|
|
1698
2068
|
|
|
1699
2069
|
it "aliases *_before_type_cast" do
|
|
1700
|
-
product.cost = "
|
|
1701
|
-
expect(product.cost_before_type_cast).to eq("
|
|
2070
|
+
product.cost = "42"
|
|
2071
|
+
expect(product.cost_before_type_cast).to eq("42")
|
|
1702
2072
|
end
|
|
1703
2073
|
end
|
|
1704
2074
|
|
|
@@ -1742,7 +2112,7 @@ describe Mongoid::Attributes do
|
|
|
1742
2112
|
context "when persisting nil attributes" do
|
|
1743
2113
|
|
|
1744
2114
|
let!(:person) do
|
|
1745
|
-
Person.create(score: nil)
|
|
2115
|
+
Person.create!(score: nil)
|
|
1746
2116
|
end
|
|
1747
2117
|
|
|
1748
2118
|
it "has an entry in the attributes" do
|
|
@@ -1757,7 +2127,7 @@ describe Mongoid::Attributes do
|
|
|
1757
2127
|
end
|
|
1758
2128
|
|
|
1759
2129
|
it "saves the default" do
|
|
1760
|
-
expect { person.save }.to_not raise_error
|
|
2130
|
+
expect { person.save! }.to_not raise_error
|
|
1761
2131
|
expect(person.last_drink_taken_at).to eq(1.day.ago.in_time_zone("Alaska").to_date)
|
|
1762
2132
|
end
|
|
1763
2133
|
end
|
|
@@ -1767,7 +2137,7 @@ describe Mongoid::Attributes do
|
|
|
1767
2137
|
context "when no value exists in the database" do
|
|
1768
2138
|
|
|
1769
2139
|
let(:person) do
|
|
1770
|
-
Person.create
|
|
2140
|
+
Person.create!
|
|
1771
2141
|
end
|
|
1772
2142
|
|
|
1773
2143
|
it "applies the default value" do
|
|
@@ -1780,7 +2150,7 @@ describe Mongoid::Attributes do
|
|
|
1780
2150
|
context "when the value is not nil" do
|
|
1781
2151
|
|
|
1782
2152
|
let!(:person) do
|
|
1783
|
-
Person.create(age: 50)
|
|
2153
|
+
Person.create!(age: 50)
|
|
1784
2154
|
end
|
|
1785
2155
|
|
|
1786
2156
|
let(:from_db) do
|
|
@@ -1795,7 +2165,7 @@ describe Mongoid::Attributes do
|
|
|
1795
2165
|
context "when the value is explicitly nil" do
|
|
1796
2166
|
|
|
1797
2167
|
let!(:person) do
|
|
1798
|
-
Person.create(age: nil)
|
|
2168
|
+
Person.create!(age: nil)
|
|
1799
2169
|
end
|
|
1800
2170
|
|
|
1801
2171
|
let(:from_db) do
|
|
@@ -1810,7 +2180,7 @@ describe Mongoid::Attributes do
|
|
|
1810
2180
|
context "when the default is a proc" do
|
|
1811
2181
|
|
|
1812
2182
|
let!(:account) do
|
|
1813
|
-
Account.create(name: "savings", balance:
|
|
2183
|
+
Account.create!(name: "savings", balance: 100)
|
|
1814
2184
|
end
|
|
1815
2185
|
|
|
1816
2186
|
let(:from_db) do
|
|
@@ -1828,7 +2198,7 @@ describe Mongoid::Attributes do
|
|
|
1828
2198
|
|
|
1829
2199
|
context 'when the attribute is blank' do
|
|
1830
2200
|
let(:person) do
|
|
1831
|
-
Person.create(title: '')
|
|
2201
|
+
Person.create!(title: '')
|
|
1832
2202
|
end
|
|
1833
2203
|
|
|
1834
2204
|
it 'returns false' do
|
|
@@ -1838,7 +2208,7 @@ describe Mongoid::Attributes do
|
|
|
1838
2208
|
|
|
1839
2209
|
context 'when the attribute is localized' do
|
|
1840
2210
|
let(:person) do
|
|
1841
|
-
Person.create
|
|
2211
|
+
Person.create!
|
|
1842
2212
|
end
|
|
1843
2213
|
|
|
1844
2214
|
context 'after initialization when the field is nil' do
|
|
@@ -1870,7 +2240,7 @@ describe Mongoid::Attributes do
|
|
|
1870
2240
|
|
|
1871
2241
|
context 'when the attribute is not localized' do
|
|
1872
2242
|
let(:person) do
|
|
1873
|
-
Person.create(username: 'localized')
|
|
2243
|
+
Person.create!(username: 'localized')
|
|
1874
2244
|
end
|
|
1875
2245
|
|
|
1876
2246
|
before do
|
|
@@ -1882,4 +2252,486 @@ describe Mongoid::Attributes do
|
|
|
1882
2252
|
end
|
|
1883
2253
|
end
|
|
1884
2254
|
end
|
|
2255
|
+
|
|
2256
|
+
context "when an attribute is removed then set" do
|
|
2257
|
+
let(:cat) { Cat.create!(name: "Neil") }
|
|
2258
|
+
|
|
2259
|
+
before do
|
|
2260
|
+
cat.remove_attribute("name")
|
|
2261
|
+
cat.name = "Nissim"
|
|
2262
|
+
cat.save!
|
|
2263
|
+
cat.reload
|
|
2264
|
+
end
|
|
2265
|
+
|
|
2266
|
+
it "correctly sets the attribute" do
|
|
2267
|
+
expect(cat.name).to eq("Nissim")
|
|
2268
|
+
end
|
|
2269
|
+
end
|
|
2270
|
+
|
|
2271
|
+
describe "attributes after setting an association without reloading" do
|
|
2272
|
+
|
|
2273
|
+
context "on embeds_many" do
|
|
2274
|
+
|
|
2275
|
+
context "when not setting anything" do
|
|
2276
|
+
let(:doc) { NestedBook.create! }
|
|
2277
|
+
|
|
2278
|
+
it "doesn't add attributes" do
|
|
2279
|
+
expect(doc.attributes).to_not have_key("pages")
|
|
2280
|
+
end
|
|
2281
|
+
|
|
2282
|
+
it "has the same attributes after reloading" do
|
|
2283
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2284
|
+
end
|
|
2285
|
+
end
|
|
2286
|
+
|
|
2287
|
+
context "when using nested attributes" do
|
|
2288
|
+
let(:doc) { NestedBook.create! }
|
|
2289
|
+
|
|
2290
|
+
before do
|
|
2291
|
+
doc.update_attributes({ pages_attributes: [ {} ] })
|
|
2292
|
+
end
|
|
2293
|
+
|
|
2294
|
+
it "updates the attributes" do
|
|
2295
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
|
2296
|
+
end
|
|
2297
|
+
|
|
2298
|
+
it "has the same attributes after reloading" do
|
|
2299
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2300
|
+
end
|
|
2301
|
+
end
|
|
2302
|
+
|
|
2303
|
+
context "when doing assignments" do
|
|
2304
|
+
let(:doc) { NestedBook.create! }
|
|
2305
|
+
before do
|
|
2306
|
+
doc.pages = [NestedPage.new]
|
|
2307
|
+
end
|
|
2308
|
+
|
|
2309
|
+
it "updates the attributes" do
|
|
2310
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
|
2311
|
+
end
|
|
2312
|
+
|
|
2313
|
+
it "has the same attributes after reloading" do
|
|
2314
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2315
|
+
end
|
|
2316
|
+
end
|
|
2317
|
+
|
|
2318
|
+
context "when replacing assignments" do
|
|
2319
|
+
let(:doc) { NestedBook.create! }
|
|
2320
|
+
before do
|
|
2321
|
+
doc.pages = [NestedPage.new(number: 1)]
|
|
2322
|
+
doc.pages = [NestedPage.new(number: 2)]
|
|
2323
|
+
end
|
|
2324
|
+
|
|
2325
|
+
it "updates the attributes" do
|
|
2326
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id, "number" => 2 }])
|
|
2327
|
+
end
|
|
2328
|
+
|
|
2329
|
+
it "has the same attributes after reloading" do
|
|
2330
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2331
|
+
end
|
|
2332
|
+
end
|
|
2333
|
+
|
|
2334
|
+
context "when setting to nil" do
|
|
2335
|
+
let(:doc) { NestedBook.create! }
|
|
2336
|
+
before do
|
|
2337
|
+
doc.pages = [NestedPage.new(number: 1)]
|
|
2338
|
+
doc.pages = nil
|
|
2339
|
+
end
|
|
2340
|
+
|
|
2341
|
+
it "updates the attributes" do
|
|
2342
|
+
expect(doc.attributes).to_not have_key("pages")
|
|
2343
|
+
end
|
|
2344
|
+
|
|
2345
|
+
it "has the same attributes after reloading" do
|
|
2346
|
+
expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
|
|
2347
|
+
end
|
|
2348
|
+
end
|
|
2349
|
+
|
|
2350
|
+
context "when setting to nil and back" do
|
|
2351
|
+
let(:doc) { NestedBook.create! }
|
|
2352
|
+
let(:page) { NestedPage.new }
|
|
2353
|
+
before do
|
|
2354
|
+
doc.pages = [page]
|
|
2355
|
+
doc.pages = nil
|
|
2356
|
+
doc.pages = [page]
|
|
2357
|
+
end
|
|
2358
|
+
|
|
2359
|
+
it "updates the attributes" do
|
|
2360
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
|
2361
|
+
end
|
|
2362
|
+
|
|
2363
|
+
it "has the same attributes after reloading" do
|
|
2364
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2365
|
+
end
|
|
2366
|
+
end
|
|
2367
|
+
|
|
2368
|
+
context "when pushing" do
|
|
2369
|
+
let(:doc) { NestedBook.create! }
|
|
2370
|
+
before do
|
|
2371
|
+
doc.pages << NestedPage.new
|
|
2372
|
+
end
|
|
2373
|
+
|
|
2374
|
+
it "updates the attributes" do
|
|
2375
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
|
2376
|
+
end
|
|
2377
|
+
|
|
2378
|
+
it "has the same attributes after reloading" do
|
|
2379
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2380
|
+
end
|
|
2381
|
+
end
|
|
2382
|
+
|
|
2383
|
+
[:shift, :pop].each do |meth|
|
|
2384
|
+
context "when performing #{meth}" do
|
|
2385
|
+
let(:doc) { NestedBook.create! }
|
|
2386
|
+
before do
|
|
2387
|
+
doc.pages << NestedPage.new
|
|
2388
|
+
doc.pages << NestedPage.new
|
|
2389
|
+
doc.pages << NestedPage.new
|
|
2390
|
+
|
|
2391
|
+
doc.pages.send(meth, 2)
|
|
2392
|
+
end
|
|
2393
|
+
|
|
2394
|
+
it "updates the attributes" do
|
|
2395
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
|
2396
|
+
end
|
|
2397
|
+
|
|
2398
|
+
it "has the same attributes after reloading" do
|
|
2399
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2400
|
+
end
|
|
2401
|
+
end
|
|
2402
|
+
end
|
|
2403
|
+
|
|
2404
|
+
context "when concatting" do
|
|
2405
|
+
let(:doc) { NestedBook.create! }
|
|
2406
|
+
before do
|
|
2407
|
+
doc.pages << NestedPage.new
|
|
2408
|
+
doc.pages.concat([NestedPage.new, NestedPage.new])
|
|
2409
|
+
end
|
|
2410
|
+
|
|
2411
|
+
it "updates the attributes" do
|
|
2412
|
+
expect(doc.attributes["pages"].count).to eq 3
|
|
2413
|
+
end
|
|
2414
|
+
|
|
2415
|
+
it "has the same attributes after reloading" do
|
|
2416
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2417
|
+
end
|
|
2418
|
+
end
|
|
2419
|
+
|
|
2420
|
+
[:build, :create].each do |meth|
|
|
2421
|
+
context "when preforming #{meth}" do
|
|
2422
|
+
let(:doc) { NestedBook.create! }
|
|
2423
|
+
before do
|
|
2424
|
+
doc.pages.send(meth)
|
|
2425
|
+
end
|
|
2426
|
+
|
|
2427
|
+
it "updates the attributes" do
|
|
2428
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
|
2429
|
+
end
|
|
2430
|
+
|
|
2431
|
+
it "has the same attributes after reloading" do
|
|
2432
|
+
doc.pages.first.save
|
|
2433
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2434
|
+
end
|
|
2435
|
+
end
|
|
2436
|
+
end
|
|
2437
|
+
|
|
2438
|
+
context "when clearing" do
|
|
2439
|
+
let(:doc) { NestedBook.create! }
|
|
2440
|
+
before do
|
|
2441
|
+
doc.pages << NestedPage.new
|
|
2442
|
+
doc.pages << NestedPage.new
|
|
2443
|
+
doc.pages << NestedPage.new
|
|
2444
|
+
|
|
2445
|
+
doc.pages.clear
|
|
2446
|
+
end
|
|
2447
|
+
|
|
2448
|
+
it "updates the attributes" do
|
|
2449
|
+
expect(doc.attributes).to_not have_key("pages")
|
|
2450
|
+
end
|
|
2451
|
+
|
|
2452
|
+
it "has the same attributes after reloading" do
|
|
2453
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2454
|
+
end
|
|
2455
|
+
end
|
|
2456
|
+
|
|
2457
|
+
[:delete_all, :destroy_all, :remove_all].each do |meth|
|
|
2458
|
+
context "when performing: #{meth}" do
|
|
2459
|
+
let(:doc) { NestedBook.create! }
|
|
2460
|
+
before do
|
|
2461
|
+
doc.pages << NestedPage.new
|
|
2462
|
+
doc.pages << NestedPage.new
|
|
2463
|
+
doc.pages << NestedPage.new
|
|
2464
|
+
|
|
2465
|
+
doc.pages.send(meth)
|
|
2466
|
+
end
|
|
2467
|
+
|
|
2468
|
+
it "updates the attributes" do
|
|
2469
|
+
expect(doc.attributes).to_not have_key("pages")
|
|
2470
|
+
end
|
|
2471
|
+
|
|
2472
|
+
it "has the same attributes after reloading" do
|
|
2473
|
+
expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
|
|
2474
|
+
end
|
|
2475
|
+
end
|
|
2476
|
+
end
|
|
2477
|
+
|
|
2478
|
+
context "when deleting" do
|
|
2479
|
+
let(:doc) { NestedBook.create! }
|
|
2480
|
+
let(:page) { NestedPage.new }
|
|
2481
|
+
before do
|
|
2482
|
+
doc.pages << page
|
|
2483
|
+
doc.pages << NestedPage.new
|
|
2484
|
+
doc.pages << NestedPage.new
|
|
2485
|
+
|
|
2486
|
+
doc.pages.delete(page)
|
|
2487
|
+
end
|
|
2488
|
+
|
|
2489
|
+
it "updates the attributes" do
|
|
2490
|
+
expect(doc.attributes["pages"].count).to eq 2
|
|
2491
|
+
end
|
|
2492
|
+
|
|
2493
|
+
it "has the same attributes after reloading" do
|
|
2494
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2495
|
+
end
|
|
2496
|
+
end
|
|
2497
|
+
|
|
2498
|
+
context "when doing _remove" do
|
|
2499
|
+
let(:doc) { NestedBook.create! }
|
|
2500
|
+
let(:page) { NestedPage.new }
|
|
2501
|
+
before do
|
|
2502
|
+
doc.pages << page
|
|
2503
|
+
doc.pages << NestedPage.new
|
|
2504
|
+
doc.pages << NestedPage.new
|
|
2505
|
+
|
|
2506
|
+
doc.pages._remove(page)
|
|
2507
|
+
end
|
|
2508
|
+
|
|
2509
|
+
it "updates the attributes" do
|
|
2510
|
+
expect(doc.attributes["pages"].count).to eq 2
|
|
2511
|
+
end
|
|
2512
|
+
end
|
|
2513
|
+
|
|
2514
|
+
context "when assigning an array of hashes" do
|
|
2515
|
+
let(:doc) { NestedBook.create! }
|
|
2516
|
+
before do
|
|
2517
|
+
doc.pages = [{}]
|
|
2518
|
+
end
|
|
2519
|
+
|
|
2520
|
+
it "updates the attributes" do
|
|
2521
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
|
2522
|
+
end
|
|
2523
|
+
|
|
2524
|
+
it "has the same attributes after reloading" do
|
|
2525
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2526
|
+
end
|
|
2527
|
+
end
|
|
2528
|
+
|
|
2529
|
+
context "when assigning twice" do
|
|
2530
|
+
let(:doc) { NestedBook.create! }
|
|
2531
|
+
before do
|
|
2532
|
+
doc.pages = [{ number: 1 }]
|
|
2533
|
+
doc.pages = [{}]
|
|
2534
|
+
end
|
|
2535
|
+
|
|
2536
|
+
it "updates the attributes" do
|
|
2537
|
+
expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
|
|
2538
|
+
end
|
|
2539
|
+
|
|
2540
|
+
it "has the same attributes after reloading" do
|
|
2541
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2542
|
+
end
|
|
2543
|
+
end
|
|
2544
|
+
end
|
|
2545
|
+
|
|
2546
|
+
context "on embeds_one" do
|
|
2547
|
+
|
|
2548
|
+
let(:attrs) { { "title" => "Title" } }
|
|
2549
|
+
|
|
2550
|
+
context "when using nested attributes" do
|
|
2551
|
+
let(:doc) { NestedBook.create! }
|
|
2552
|
+
|
|
2553
|
+
before do
|
|
2554
|
+
doc.update_attributes({ cover_attributes: attrs })
|
|
2555
|
+
end
|
|
2556
|
+
|
|
2557
|
+
it "updates the attributes" do
|
|
2558
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
|
2559
|
+
end
|
|
2560
|
+
|
|
2561
|
+
it "has the same attributes after reloading" do
|
|
2562
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2563
|
+
end
|
|
2564
|
+
end
|
|
2565
|
+
|
|
2566
|
+
context "when doing assignments" do
|
|
2567
|
+
let(:doc) { NestedBook.create! }
|
|
2568
|
+
before do
|
|
2569
|
+
doc.cover = NestedCover.new(attrs)
|
|
2570
|
+
end
|
|
2571
|
+
|
|
2572
|
+
it "updates the attributes" do
|
|
2573
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
|
2574
|
+
end
|
|
2575
|
+
|
|
2576
|
+
it "has the same attributes after reloading" do
|
|
2577
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2578
|
+
end
|
|
2579
|
+
end
|
|
2580
|
+
|
|
2581
|
+
context "when replacing assignments" do
|
|
2582
|
+
let(:doc) { NestedBook.create! }
|
|
2583
|
+
before do
|
|
2584
|
+
doc.cover = NestedCover.new("title" => "Title1")
|
|
2585
|
+
doc.cover = NestedCover.new(attrs)
|
|
2586
|
+
end
|
|
2587
|
+
|
|
2588
|
+
it "updates the attributes" do
|
|
2589
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
|
2590
|
+
end
|
|
2591
|
+
|
|
2592
|
+
it "has the same attributes after reloading" do
|
|
2593
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2594
|
+
end
|
|
2595
|
+
end
|
|
2596
|
+
|
|
2597
|
+
context "when setting to nil" do
|
|
2598
|
+
let(:doc) { NestedBook.create! }
|
|
2599
|
+
before do
|
|
2600
|
+
doc.cover = NestedCover.new(attrs)
|
|
2601
|
+
doc.cover = nil
|
|
2602
|
+
end
|
|
2603
|
+
|
|
2604
|
+
it "updates the attributes" do
|
|
2605
|
+
expect(doc.attributes.key?("cover")).to be false
|
|
2606
|
+
end
|
|
2607
|
+
|
|
2608
|
+
it "has the same attributes after reloading" do
|
|
2609
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2610
|
+
end
|
|
2611
|
+
end
|
|
2612
|
+
|
|
2613
|
+
context "when setting to nil and back" do
|
|
2614
|
+
let(:doc) { NestedBook.create! }
|
|
2615
|
+
before do
|
|
2616
|
+
doc.cover = NestedCover.new(attrs)
|
|
2617
|
+
doc.cover = nil
|
|
2618
|
+
doc.cover = NestedCover.new(attrs)
|
|
2619
|
+
end
|
|
2620
|
+
|
|
2621
|
+
it "updates the attributes" do
|
|
2622
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
|
2623
|
+
end
|
|
2624
|
+
|
|
2625
|
+
|
|
2626
|
+
it "has the same attributes after reloading" do
|
|
2627
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2628
|
+
end
|
|
2629
|
+
end
|
|
2630
|
+
|
|
2631
|
+
[:build, :create].each do |meth|
|
|
2632
|
+
context "when preforming #{meth}" do
|
|
2633
|
+
let(:doc) { NestedBook.create! }
|
|
2634
|
+
before do
|
|
2635
|
+
doc.send("#{meth}_cover", attrs)
|
|
2636
|
+
end
|
|
2637
|
+
|
|
2638
|
+
it "updates the attributes" do
|
|
2639
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
|
2640
|
+
end
|
|
2641
|
+
|
|
2642
|
+
it "has the same attributes after reloading" do
|
|
2643
|
+
doc.cover.save
|
|
2644
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2645
|
+
end
|
|
2646
|
+
end
|
|
2647
|
+
end
|
|
2648
|
+
|
|
2649
|
+
context "when assigning a hash" do
|
|
2650
|
+
let(:doc) { NestedBook.create! }
|
|
2651
|
+
before do
|
|
2652
|
+
doc.cover = attrs
|
|
2653
|
+
end
|
|
2654
|
+
|
|
2655
|
+
it "updates the attributes" do
|
|
2656
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
|
2657
|
+
end
|
|
2658
|
+
|
|
2659
|
+
it "has the same attributes after reloading" do
|
|
2660
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2661
|
+
end
|
|
2662
|
+
end
|
|
2663
|
+
|
|
2664
|
+
context "when assigning twice" do
|
|
2665
|
+
let(:doc) { NestedBook.create! }
|
|
2666
|
+
before do
|
|
2667
|
+
doc.cover = { "title" => "1984" }
|
|
2668
|
+
doc.cover = attrs
|
|
2669
|
+
end
|
|
2670
|
+
|
|
2671
|
+
it "updates the attributes" do
|
|
2672
|
+
expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
|
|
2673
|
+
end
|
|
2674
|
+
|
|
2675
|
+
it "has the same attributes after reloading" do
|
|
2676
|
+
expect(doc.attributes).to eq(doc.reload.attributes)
|
|
2677
|
+
end
|
|
2678
|
+
end
|
|
2679
|
+
end
|
|
2680
|
+
end
|
|
2681
|
+
|
|
2682
|
+
context "when modifiying a hash referenced with the [] notation" do
|
|
2683
|
+
let(:church) { Church.create!(location: { x: 1 }) }
|
|
2684
|
+
|
|
2685
|
+
before do
|
|
2686
|
+
church[:location].merge!(y: 2)
|
|
2687
|
+
church.save!
|
|
2688
|
+
church.reload
|
|
2689
|
+
end
|
|
2690
|
+
|
|
2691
|
+
it "persists the updated hash" do
|
|
2692
|
+
church.location.should == { "x" => 1, "y" => 2 }
|
|
2693
|
+
end
|
|
2694
|
+
end
|
|
2695
|
+
|
|
2696
|
+
context "when modifiying a set referenced with the [] notation" do
|
|
2697
|
+
let(:catalog) { Catalog.create!(set_field: [ 1 ].to_set) }
|
|
2698
|
+
|
|
2699
|
+
before do
|
|
2700
|
+
catalog[:set_field] << 2
|
|
2701
|
+
catalog.save!
|
|
2702
|
+
catalog.reload
|
|
2703
|
+
end
|
|
2704
|
+
|
|
2705
|
+
it "persists the updated hash" do
|
|
2706
|
+
pending "MONGOID-2951"
|
|
2707
|
+
catalog.set_field.should == Set.new([ 1, 2 ])
|
|
2708
|
+
end
|
|
2709
|
+
end
|
|
2710
|
+
|
|
2711
|
+
context 'when an embedded field has a capitalized store_as name' do
|
|
2712
|
+
let(:person) { Person.new(Purse: { brand: 'Gucci' }) }
|
|
2713
|
+
|
|
2714
|
+
it 'sets the value' do
|
|
2715
|
+
expect(person.purse.brand).to eq('Gucci')
|
|
2716
|
+
end
|
|
2717
|
+
|
|
2718
|
+
it 'saves successfully' do
|
|
2719
|
+
expect(person.save!).to eq(true)
|
|
2720
|
+
end
|
|
2721
|
+
|
|
2722
|
+
context 'when persisted' do
|
|
2723
|
+
before do
|
|
2724
|
+
person.save!
|
|
2725
|
+
person.reload
|
|
2726
|
+
end
|
|
2727
|
+
|
|
2728
|
+
it 'persists the value' do
|
|
2729
|
+
expect(person.reload.purse.brand).to eq('Gucci')
|
|
2730
|
+
end
|
|
2731
|
+
|
|
2732
|
+
it 'uses the correct key in the database' do
|
|
2733
|
+
expect(person.collection.find(_id: person.id).first['Purse']['_id']).to eq(person.purse.id)
|
|
2734
|
+
end
|
|
2735
|
+
end
|
|
2736
|
+
end
|
|
1885
2737
|
end
|