mongoid 9.0.11 → 9.1.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
- data/CHANGELOG.md +8 -8
- data/README.md +5 -11
- data/Rakefile +35 -38
- data/lib/config/locales/en.yml +11 -0
- data/lib/mongoid/association/accessors.rb +19 -26
- data/lib/mongoid/association/bindable.rb +43 -45
- data/lib/mongoid/association/builders.rb +18 -15
- data/lib/mongoid/association/constrainable.rb +3 -5
- data/lib/mongoid/association/depending.rb +34 -38
- data/lib/mongoid/association/eager.rb +47 -13
- data/lib/mongoid/association/eager_loadable.rb +152 -24
- data/lib/mongoid/association/embedded/batchable.rb +28 -30
- data/lib/mongoid/association/embedded/cyclic.rb +8 -11
- data/lib/mongoid/association/embedded/eager.rb +1 -6
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +6 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -3
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +25 -22
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +0 -2
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +2 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many.rb +24 -21
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +2 -6
- data/lib/mongoid/association/embedded/embeds_one.rb +20 -18
- data/lib/mongoid/association/embedded.rb +0 -1
- data/lib/mongoid/association/macros.rb +3 -7
- data/lib/mongoid/association/many.rb +75 -3
- data/lib/mongoid/association/marshalable.rb +0 -3
- data/lib/mongoid/association/nested/many.rb +18 -13
- data/lib/mongoid/association/nested/nested_buildable.rb +6 -9
- data/lib/mongoid/association/nested/one.rb +4 -7
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +0 -3
- data/lib/mongoid/association/options.rb +8 -7
- data/lib/mongoid/association/referenced/auto_save.rb +0 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +23 -5
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +1 -3
- data/lib/mongoid/association/referenced/belongs_to.rb +48 -43
- data/lib/mongoid/association/referenced/counter_cache.rb +5 -10
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +8 -4
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +52 -47
- data/lib/mongoid/association/referenced/has_many/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_many/buildable.rb +11 -5
- data/lib/mongoid/association/referenced/has_many/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +107 -38
- data/lib/mongoid/association/referenced/has_many/proxy.rb +10 -6
- data/lib/mongoid/association/referenced/has_many.rb +30 -24
- data/lib/mongoid/association/referenced/has_one/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_one/buildable.rb +11 -9
- data/lib/mongoid/association/referenced/has_one/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_one.rb +26 -21
- data/lib/mongoid/association/referenced/syncable.rb +30 -34
- data/lib/mongoid/association/referenced.rb +0 -1
- data/lib/mongoid/association/reflections.rb +0 -3
- data/lib/mongoid/association/relatable.rb +69 -66
- data/lib/mongoid/association.rb +12 -15
- data/lib/mongoid/atomic/modifiers.rb +65 -25
- data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
- data/lib/mongoid/atomic/paths/embedded/one.rb +2 -4
- data/lib/mongoid/atomic/paths/embedded.rb +3 -6
- data/lib/mongoid/atomic/paths/root.rb +1 -4
- data/lib/mongoid/atomic/paths.rb +2 -3
- data/lib/mongoid/atomic.rb +0 -3
- data/lib/mongoid/attributes/dynamic.rb +6 -7
- data/lib/mongoid/attributes/nested.rb +8 -10
- data/lib/mongoid/attributes/projector.rb +7 -20
- data/lib/mongoid/attributes/readonly.rb +6 -11
- data/lib/mongoid/attributes.rb +18 -34
- data/lib/mongoid/cacheable.rb +24 -6
- data/lib/mongoid/clients/factory.rb +12 -15
- data/lib/mongoid/clients/options.rb +2 -5
- data/lib/mongoid/clients/sessions.rb +50 -60
- data/lib/mongoid/clients/storage_options.rb +1 -4
- data/lib/mongoid/clients/validators/storage.rb +2 -3
- data/lib/mongoid/clients/validators.rb +1 -2
- data/lib/mongoid/clients.rb +8 -11
- data/lib/mongoid/collection_configurable.rb +10 -14
- data/lib/mongoid/composable.rb +30 -34
- data/lib/mongoid/config/defaults.rb +7 -4
- data/lib/mongoid/config/encryption.rb +1 -3
- data/lib/mongoid/config/environment.rb +7 -16
- data/lib/mongoid/config/introspection.rb +14 -16
- data/lib/mongoid/config/options.rb +16 -10
- data/lib/mongoid/config/validators/async_query_executor.rb +3 -6
- data/lib/mongoid/config/validators/client.rb +12 -15
- data/lib/mongoid/config/validators/option.rb +3 -5
- data/lib/mongoid/config/validators.rb +3 -4
- data/lib/mongoid/config.rb +132 -42
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -4
- data/lib/mongoid/contextual/aggregable/mongo.rb +20 -22
- data/lib/mongoid/contextual/aggregable/none.rb +2 -4
- data/lib/mongoid/contextual/aggregable.rb +5 -7
- data/lib/mongoid/contextual/atomic.rb +20 -24
- data/lib/mongoid/contextual/command.rb +0 -3
- data/lib/mongoid/contextual/map_reduce.rb +12 -16
- data/lib/mongoid/contextual/memory.rb +72 -65
- data/lib/mongoid/contextual/mongo/documents_loader.rb +2 -3
- data/lib/mongoid/contextual/mongo.rb +169 -85
- data/lib/mongoid/contextual/none.rb +9 -9
- data/lib/mongoid/contextual/queryable.rb +1 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +7 -9
- data/lib/mongoid/criteria/findable.rb +5 -7
- data/lib/mongoid/criteria/includable.rb +37 -8
- data/lib/mongoid/criteria/inspectable.rb +2 -5
- data/lib/mongoid/criteria/marshalable.rb +4 -8
- data/lib/mongoid/criteria/modifiable.rb +3 -11
- data/lib/mongoid/criteria/options.rb +0 -3
- data/lib/mongoid/criteria/permission.rb +34 -37
- data/lib/mongoid/criteria/queryable/aggregable.rb +9 -10
- data/lib/mongoid/criteria/queryable/expandable.rb +4 -9
- data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -10
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/date.rb +2 -6
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +3 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +20 -11
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -11
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -8
- data/lib/mongoid/criteria/queryable/extensions/range.rb +6 -9
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -12
- data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -6
- data/lib/mongoid/criteria/queryable/extensions/string.rb +5 -9
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -7
- data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -6
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +2 -12
- data/lib/mongoid/criteria/queryable/extensions.rb +18 -21
- data/lib/mongoid/criteria/queryable/key.rb +12 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +31 -39
- data/lib/mongoid/criteria/queryable/optional.rb +17 -18
- data/lib/mongoid/criteria/queryable/options.rb +20 -9
- data/lib/mongoid/criteria/queryable/pipeline.rb +6 -9
- data/lib/mongoid/criteria/queryable/selectable.rb +131 -193
- data/lib/mongoid/criteria/queryable/selector.rb +20 -29
- data/lib/mongoid/criteria/queryable/smash.rb +1 -6
- data/lib/mongoid/criteria/queryable/storable.rb +20 -39
- data/lib/mongoid/criteria/queryable.rb +25 -15
- data/lib/mongoid/criteria/scopable.rb +5 -11
- data/lib/mongoid/criteria/translator.rb +5 -8
- data/lib/mongoid/criteria.rb +109 -54
- data/lib/mongoid/deprecable.rb +1 -4
- data/lib/mongoid/deprecation.rb +2 -6
- data/lib/mongoid/document.rb +1 -1
- data/lib/mongoid/encryptable.rb +1 -2
- data/lib/mongoid/equality.rb +4 -5
- data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +1 -4
- data/lib/mongoid/errors/callback.rb +1 -4
- data/lib/mongoid/errors/create_collection_failure.rb +8 -11
- data/lib/mongoid/errors/criteria_argument_required.rb +2 -5
- data/lib/mongoid/errors/delete_restriction.rb +1 -4
- data/lib/mongoid/errors/document_not_destroyed.rb +1 -4
- data/lib/mongoid/errors/document_not_found.rb +16 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +7 -10
- data/lib/mongoid/errors/empty_config_file.rb +1 -4
- data/lib/mongoid/errors/immutable_attribute.rb +1 -4
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -4
- data/lib/mongoid/errors/invalid_async_query_executor.rb +2 -5
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +2 -5
- data/lib/mongoid/errors/invalid_collection.rb +1 -3
- data/lib/mongoid/errors/invalid_config_file.rb +1 -4
- data/lib/mongoid/errors/invalid_config_option.rb +2 -5
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +6 -10
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +2 -4
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -4
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +5 -9
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +1 -4
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +1 -4
- data/lib/mongoid/errors/invalid_expression_operator.rb +3 -7
- data/lib/mongoid/errors/invalid_field.rb +2 -5
- data/lib/mongoid/errors/invalid_field_operator.rb +5 -9
- data/lib/mongoid/errors/invalid_field_option.rb +2 -5
- data/lib/mongoid/errors/invalid_field_type.rb +1 -4
- data/lib/mongoid/errors/invalid_find.rb +1 -4
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -4
- data/lib/mongoid/errors/invalid_includes.rb +3 -6
- data/lib/mongoid/errors/invalid_index.rb +1 -4
- data/lib/mongoid/errors/invalid_options.rb +1 -4
- data/lib/mongoid/errors/invalid_path.rb +1 -4
- data/lib/mongoid/errors/invalid_persistence_option.rb +4 -7
- data/lib/mongoid/errors/invalid_query.rb +6 -11
- data/lib/mongoid/errors/invalid_relation.rb +10 -13
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -7
- data/lib/mongoid/errors/invalid_scope.rb +1 -4
- data/lib/mongoid/errors/invalid_session_nesting.rb +0 -3
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +2 -4
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -4
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +0 -3
- data/lib/mongoid/errors/inverse_not_found.rb +1 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -4
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +7 -11
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -4
- data/lib/mongoid/errors/no_client_database.rb +1 -4
- data/lib/mongoid/errors/no_client_hosts.rb +1 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -4
- data/lib/mongoid/errors/no_default_client.rb +1 -4
- data/lib/mongoid/errors/no_environment.rb +1 -4
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -4
- data/lib/mongoid/errors/no_metadata.rb +1 -4
- data/lib/mongoid/errors/no_parent.rb +1 -4
- data/lib/mongoid/errors/readonly_attribute.rb +1 -4
- data/lib/mongoid/errors/readonly_document.rb +1 -4
- data/lib/mongoid/errors/rollback.rb +0 -2
- data/lib/mongoid/errors/scope_overwrite.rb +2 -4
- data/lib/mongoid/errors/sessions_not_supported.rb +0 -3
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -3
- data/lib/mongoid/errors/transaction_error.rb +0 -3
- data/lib/mongoid/errors/transactions_not_supported.rb +0 -3
- data/lib/mongoid/errors/unknown_attribute.rb +1 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -4
- data/lib/mongoid/errors/unregistered_class.rb +1 -1
- data/lib/mongoid/errors/unsaved_document.rb +1 -3
- data/lib/mongoid/errors/unsupported_isolation_level.rb +22 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -4
- data/lib/mongoid/errors/validations.rb +3 -5
- data/lib/mongoid/errors.rb +72 -72
- data/lib/mongoid/evolvable.rb +0 -3
- data/lib/mongoid/extensions/array.rb +5 -7
- data/lib/mongoid/extensions/big_decimal.rb +6 -7
- data/lib/mongoid/extensions/binary.rb +3 -6
- data/lib/mongoid/extensions/boolean.rb +4 -7
- data/lib/mongoid/extensions/bson_document.rb +28 -0
- data/lib/mongoid/extensions/date.rb +10 -14
- data/lib/mongoid/extensions/date_time.rb +2 -6
- data/lib/mongoid/extensions/decimal128.rb +1 -5
- data/lib/mongoid/extensions/false_class.rb +3 -5
- data/lib/mongoid/extensions/float.rb +5 -10
- data/lib/mongoid/extensions/hash.rb +5 -10
- data/lib/mongoid/extensions/integer.rb +5 -10
- data/lib/mongoid/extensions/module.rb +1 -4
- data/lib/mongoid/extensions/nil_class.rb +0 -1
- data/lib/mongoid/extensions/object.rb +9 -14
- data/lib/mongoid/extensions/object_id.rb +2 -6
- data/lib/mongoid/extensions/range.rb +14 -15
- data/lib/mongoid/extensions/raw_value.rb +0 -3
- data/lib/mongoid/extensions/regexp.rb +3 -6
- data/lib/mongoid/extensions/set.rb +3 -4
- data/lib/mongoid/extensions/string.rb +8 -12
- data/lib/mongoid/extensions/symbol.rb +3 -7
- data/lib/mongoid/extensions/time.rb +24 -26
- data/lib/mongoid/extensions/time_with_zone.rb +4 -7
- data/lib/mongoid/extensions/true_class.rb +3 -5
- data/lib/mongoid/extensions.rb +26 -26
- data/lib/mongoid/factory.rb +5 -9
- data/lib/mongoid/fields/encrypted.rb +0 -1
- data/lib/mongoid/fields/foreign_key.rb +9 -10
- data/lib/mongoid/fields/localized.rb +12 -12
- data/lib/mongoid/fields/standard.rb +5 -7
- data/lib/mongoid/fields/validators/macro.rb +23 -34
- data/lib/mongoid/fields/validators.rb +1 -2
- data/lib/mongoid/fields.rb +151 -58
- data/lib/mongoid/findable.rb +82 -53
- data/lib/mongoid/indexable/specification.rb +20 -6
- data/lib/mongoid/indexable/validators/options.rb +33 -40
- data/lib/mongoid/indexable.rb +26 -25
- data/lib/mongoid/inspectable.rb +4 -7
- data/lib/mongoid/interceptable.rb +41 -40
- data/lib/mongoid/loadable.rb +17 -18
- data/lib/mongoid/loggable.rb +4 -8
- data/lib/mongoid/matchable.rb +0 -2
- data/lib/mongoid/matcher/all.rb +2 -5
- data/lib/mongoid/matcher/and.rb +0 -3
- data/lib/mongoid/matcher/bits.rb +13 -8
- data/lib/mongoid/matcher/bits_all_clear.rb +1 -3
- data/lib/mongoid/matcher/bits_all_set.rb +1 -3
- data/lib/mongoid/matcher/bits_any_clear.rb +1 -3
- data/lib/mongoid/matcher/bits_any_set.rb +1 -3
- data/lib/mongoid/matcher/elem_match.rb +13 -15
- data/lib/mongoid/matcher/elem_match_expression.rb +0 -3
- data/lib/mongoid/matcher/eq.rb +0 -3
- data/lib/mongoid/matcher/eq_impl.rb +12 -17
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +4 -7
- data/lib/mongoid/matcher/exists.rb +1 -4
- data/lib/mongoid/matcher/expression.rb +5 -10
- data/lib/mongoid/matcher/expression_operator.rb +1 -3
- data/lib/mongoid/matcher/field_expression.rb +10 -13
- data/lib/mongoid/matcher/field_operator.rb +4 -6
- data/lib/mongoid/matcher/gt.rb +0 -3
- data/lib/mongoid/matcher/gte.rb +0 -3
- data/lib/mongoid/matcher/in.rb +9 -12
- data/lib/mongoid/matcher/lt.rb +0 -3
- data/lib/mongoid/matcher/lte.rb +0 -3
- data/lib/mongoid/matcher/mod.rb +4 -8
- data/lib/mongoid/matcher/ne.rb +0 -3
- data/lib/mongoid/matcher/nin.rb +0 -3
- data/lib/mongoid/matcher/nor.rb +1 -6
- data/lib/mongoid/matcher/not.rb +0 -3
- data/lib/mongoid/matcher/or.rb +0 -3
- data/lib/mongoid/matcher/regex.rb +11 -14
- data/lib/mongoid/matcher/size.rb +2 -5
- data/lib/mongoid/matcher/type.rb +32 -37
- data/lib/mongoid/matcher.rb +7 -15
- data/lib/mongoid/model_resolver.rb +1 -0
- data/lib/mongoid/persistable/creatable.rb +23 -7
- data/lib/mongoid/persistable/deletable.rb +6 -7
- data/lib/mongoid/persistable/destroyable.rb +2 -6
- data/lib/mongoid/persistable/incrementable.rb +1 -3
- data/lib/mongoid/persistable/logical.rb +3 -5
- data/lib/mongoid/persistable/maxable.rb +2 -4
- data/lib/mongoid/persistable/minable.rb +2 -4
- data/lib/mongoid/persistable/multipliable.rb +1 -3
- data/lib/mongoid/persistable/poppable.rb +2 -4
- data/lib/mongoid/persistable/pullable.rb +3 -5
- data/lib/mongoid/persistable/pushable.rb +5 -7
- data/lib/mongoid/persistable/renamable.rb +1 -3
- data/lib/mongoid/persistable/savable.rb +0 -3
- data/lib/mongoid/persistable/settable.rb +4 -13
- data/lib/mongoid/persistable/unsettable.rb +1 -3
- data/lib/mongoid/persistable/updatable.rb +16 -24
- data/lib/mongoid/persistable/upsertable.rb +8 -10
- data/lib/mongoid/persistable.rb +28 -27
- data/lib/mongoid/persistence_context.rb +34 -41
- data/lib/mongoid/pluckable.rb +0 -2
- data/lib/mongoid/positional.rb +5 -11
- data/lib/mongoid/railtie.rb +16 -22
- data/lib/mongoid/railties/console_sandbox.rb +6 -8
- data/lib/mongoid/railties/controller_runtime.rb +7 -11
- data/lib/mongoid/railties/database.rake +42 -44
- data/lib/mongoid/scopable.rb +23 -31
- data/lib/mongoid/search_indexable.rb +330 -0
- data/lib/mongoid/selectable.rb +1 -3
- data/lib/mongoid/serializable.rb +6 -8
- data/lib/mongoid/shardable.rb +8 -17
- data/lib/mongoid/stateful.rb +5 -10
- data/lib/mongoid/stringified_symbol.rb +5 -9
- data/lib/mongoid/tasks/database.rake +31 -32
- data/lib/mongoid/tasks/database.rb +28 -30
- data/lib/mongoid/tasks/encryption.rb +10 -15
- data/lib/mongoid/threaded/lifecycle.rb +6 -9
- data/lib/mongoid/threaded.rb +132 -32
- data/lib/mongoid/timestamps/created/short.rb +2 -3
- data/lib/mongoid/timestamps/created.rb +1 -2
- data/lib/mongoid/timestamps/short.rb +0 -1
- data/lib/mongoid/timestamps/timeless.rb +8 -13
- data/lib/mongoid/timestamps/updated/short.rb +2 -3
- data/lib/mongoid/timestamps/updated.rb +2 -5
- data/lib/mongoid/timestamps.rb +4 -6
- data/lib/mongoid/touchable.rb +19 -11
- data/lib/mongoid/traversable.rb +3 -2
- data/lib/mongoid/validatable/associated.rb +1 -5
- data/lib/mongoid/validatable/format.rb +0 -2
- data/lib/mongoid/validatable/length.rb +0 -2
- data/lib/mongoid/validatable/localizable.rb +0 -3
- data/lib/mongoid/validatable/macros.rb +0 -2
- data/lib/mongoid/validatable/numericality.rb +24 -3
- data/lib/mongoid/validatable/presence.rb +8 -10
- data/lib/mongoid/validatable/queryable.rb +0 -3
- data/lib/mongoid/validatable/uniqueness.rb +12 -14
- data/lib/mongoid/validatable.rb +15 -20
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +10 -11
- data/lib/mongoid.rb +30 -34
- data/lib/rails/generators/mongoid/config/config_generator.rb +2 -4
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +4 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +2 -2
- data/lib/rails/generators/mongoid/model/model_generator.rb +5 -8
- data/lib/rails/generators/mongoid_generator.rb +6 -10
- data/lib/rails/mongoid.rb +1 -3
- data/spec/integration/active_job_spec.rb +1 -2
- data/spec/integration/app_spec.rb +142 -178
- data/spec/integration/associations/belongs_to_spec.rb +30 -28
- data/spec/integration/associations/embedded_dirty_spec.rb +0 -1
- data/spec/integration/associations/embedded_spec.rb +41 -43
- data/spec/integration/associations/embeds_many_spec.rb +46 -29
- data/spec/integration/associations/embeds_one_spec.rb +2 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -11
- data/spec/integration/associations/foreign_key_spec_models.rb +8 -9
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +16 -13
- data/spec/integration/associations/has_many_spec.rb +17 -18
- data/spec/integration/associations/has_one_spec.rb +42 -45
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +36 -39
- data/spec/integration/associations/reverse_population_spec.rb +4 -5
- data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
- data/spec/integration/associations/scope_option_spec.rb +18 -20
- data/spec/integration/atomic/modifiers_spec.rb +72 -52
- data/spec/integration/bson_regexp_raw_spec.rb +2 -3
- data/spec/integration/caching_spec.rb +68 -0
- data/spec/integration/callbacks_models.rb +11 -9
- data/spec/integration/callbacks_spec.rb +78 -80
- data/spec/integration/contextual/empty_spec.rb +19 -20
- data/spec/integration/criteria/alias_query_spec.rb +12 -19
- data/spec/integration/criteria/date_field_spec.rb +1 -2
- data/spec/integration/criteria/default_scope_spec.rb +23 -18
- data/spec/integration/criteria/logical_spec.rb +18 -19
- data/spec/integration/criteria/range_spec.rb +77 -86
- data/spec/integration/criteria/raw_value_spec.rb +122 -109
- data/spec/integration/criteria/time_with_zone_spec.rb +33 -24
- data/spec/integration/discriminator_key_spec.rb +85 -85
- data/spec/integration/discriminator_value_spec.rb +70 -73
- data/spec/integration/document_spec.rb +9 -10
- data/spec/integration/dots_and_dollars_spec.rb +104 -119
- data/spec/integration/encryption_spec.rb +8 -11
- data/spec/integration/i18n_fallbacks_spec.rb +7 -8
- data/spec/integration/isolation_state_spec.rb +241 -0
- data/spec/integration/matcher_examples_spec.rb +145 -168
- data/spec/integration/matcher_operator_data/in.yml +6 -6
- data/spec/integration/matcher_operator_spec.rb +16 -26
- data/spec/integration/matcher_spec.rb +31 -32
- data/spec/integration/persistence/collection_options_spec.rb +0 -2
- data/spec/integration/persistence/range_field_spec.rb +24 -2
- data/spec/integration/server_query_spec.rb +43 -37
- data/spec/integration/shardable_spec.rb +10 -11
- data/spec/integration/stringified_symbol_field_spec.rb +28 -43
- data/spec/lite_spec_helper.rb +11 -12
- data/spec/mongoid/association/accessors_spec.rb +197 -285
- data/spec/mongoid/association/auto_save_spec.rb +62 -93
- data/spec/mongoid/association/builders_spec.rb +121 -74
- data/spec/mongoid/association/constrainable_spec.rb +9 -22
- data/spec/mongoid/association/counter_cache_spec.rb +71 -104
- data/spec/mongoid/association/depending_spec.rb +166 -208
- data/spec/mongoid/association/eager_spec.rb +416 -80
- data/spec/mongoid/association/embedded/cyclic_spec.rb +36 -48
- data/spec/mongoid/association/embedded/dirty_spec.rb +15 -20
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +36 -54
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +8 -15
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +135 -175
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +25 -127
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +9 -14
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +38 -51
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1151 -1340
- data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -17
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +11 -11
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +25 -138
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +15 -23
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +18 -26
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +204 -273
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +5 -6
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -143
- data/spec/mongoid/association/macros_spec.rb +213 -300
- data/spec/mongoid/association/nested/many_spec.rb +51 -73
- data/spec/mongoid/association/nested/one_spec.rb +56 -80
- data/spec/mongoid/association/options_spec.rb +187 -310
- data/spec/mongoid/association/polymorphic_spec.rb +35 -53
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +55 -76
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +36 -41
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +81 -101
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +258 -345
- data/spec/mongoid/association/referenced/belongs_to_models.rb +4 -3
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +91 -294
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +42 -56
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +41 -32
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +36 -42
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +8 -9
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +771 -975
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +9 -9
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +5 -6
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +59 -177
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +29 -43
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +53 -53
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +104 -67
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +431 -675
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -2
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -11
- data/spec/mongoid/association/referenced/has_many_models.rb +1 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/has_many_spec.rb +44 -188
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +26 -38
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +28 -29
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +29 -42
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +270 -332
- data/spec/mongoid/association/referenced/has_one_models.rb +1 -2
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/has_one_spec.rb +40 -188
- data/spec/mongoid/association/reflections_spec.rb +14 -24
- data/spec/mongoid/association/syncable_spec.rb +102 -125
- data/spec/mongoid/association_spec.rb +47 -70
- data/spec/mongoid/atomic/modifiers_spec.rb +184 -197
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +39 -52
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +35 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +9 -15
- data/spec/mongoid/atomic/paths_spec.rb +81 -117
- data/spec/mongoid/atomic_spec.rb +156 -171
- data/spec/mongoid/attributes/dynamic_spec.rb +5 -6
- data/spec/mongoid/attributes/nested_spec.rb +1219 -1692
- data/spec/mongoid/attributes/nested_spec_models.rb +8 -9
- data/spec/mongoid/attributes/projector_spec.rb +2 -6
- data/spec/mongoid/attributes/readonly_spec.rb +73 -97
- data/spec/mongoid/attributes_spec.rb +669 -826
- data/spec/mongoid/cacheable_spec.rb +74 -44
- data/spec/mongoid/changeable_spec.rb +591 -733
- data/spec/mongoid/clients/factory_spec.rb +122 -154
- data/spec/mongoid/clients/options_spec.rb +40 -59
- data/spec/mongoid/clients/sessions_spec.rb +25 -44
- data/spec/mongoid/clients/transactions_spec.rb +33 -50
- data/spec/mongoid/clients/transactions_spec_models.rb +3 -4
- data/spec/mongoid/clients_spec.rb +265 -355
- data/spec/mongoid/collection_configurable_spec.rb +9 -12
- data/spec/mongoid/composable_spec.rb +2 -9
- data/spec/mongoid/config/defaults_spec.rb +24 -31
- data/spec/mongoid/config/encryption_spec.rb +54 -57
- data/spec/mongoid/config/environment_spec.rb +30 -40
- data/spec/mongoid/config/introspection_spec.rb +42 -37
- data/spec/mongoid/config/options_spec.rb +14 -21
- data/spec/mongoid/config_spec.rb +145 -195
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +98 -135
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +4 -7
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +149 -187
- data/spec/mongoid/contextual/aggregable/none_spec.rb +14 -16
- data/spec/mongoid/contextual/atomic_spec.rb +223 -271
- data/spec/mongoid/contextual/map_reduce_spec.rb +110 -138
- data/spec/mongoid/contextual/memory_spec.rb +706 -854
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +12 -13
- data/spec/mongoid/contextual/mongo_spec.rb +1008 -1213
- data/spec/mongoid/contextual/none_spec.rb +54 -59
- data/spec/mongoid/contextual/short_circuit_spec.rb +139 -0
- data/spec/mongoid/copyable_spec.rb +254 -300
- data/spec/mongoid/copyable_spec_models.rb +0 -1
- data/spec/mongoid/criteria/findable_spec.rb +322 -387
- data/spec/mongoid/criteria/includable_spec.rb +421 -372
- data/spec/mongoid/criteria/includable_spec_models.rb +16 -7
- data/spec/mongoid/criteria/inspectable_spec.rb +11 -14
- data/spec/mongoid/criteria/marshalable_spec.rb +11 -14
- data/spec/mongoid/criteria/modifiable_spec.rb +366 -512
- data/spec/mongoid/criteria/options_spec.rb +2 -7
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +112 -141
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +8 -11
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +127 -184
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +123 -60
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +84 -117
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +44 -65
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +86 -108
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +94 -33
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +103 -138
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +95 -34
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +25 -38
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +26 -28
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +32 -54
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +136 -130
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +16 -24
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +15 -24
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +12 -19
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +46 -63
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +28 -42
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +73 -96
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +71 -92
- data/spec/mongoid/criteria/queryable/key_spec.rb +32 -36
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +44 -49
- data/spec/mongoid/criteria/queryable/optional_spec.rb +373 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +172 -123
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +65 -87
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +41 -53
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +576 -680
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +7 -11
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +807 -998
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +154 -191
- data/spec/mongoid/criteria/queryable/selector_spec.rb +294 -390
- data/spec/mongoid/criteria/queryable/smash_spec.rb +6 -11
- data/spec/mongoid/criteria/queryable/storable_spec.rb +54 -81
- data/spec/mongoid/criteria/queryable_mql_spec.rb +92 -0
- data/spec/mongoid/criteria/scopable_spec.rb +102 -138
- data/spec/mongoid/criteria/translator_spec.rb +59 -60
- data/spec/mongoid/criteria_projection_spec.rb +81 -99
- data/spec/mongoid/criteria_spec.rb +935 -950
- data/spec/mongoid/document_fields_spec.rb +28 -30
- data/spec/mongoid/document_persistence_context_spec.rb +13 -15
- data/spec/mongoid/document_query_spec.rb +9 -12
- data/spec/mongoid/document_spec.rb +317 -409
- data/spec/mongoid/equality_spec.rb +69 -102
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -11
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +7 -10
- data/spec/mongoid/errors/callback_spec.rb +8 -11
- data/spec/mongoid/errors/delete_restriction_spec.rb +5 -8
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +7 -10
- data/spec/mongoid/errors/document_not_found_spec.rb +51 -61
- data/spec/mongoid/errors/invalid_collection_spec.rb +9 -13
- data/spec/mongoid/errors/invalid_config_file_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_config_option_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_field_option_spec.rb +7 -10
- data/spec/mongoid/errors/invalid_field_spec.rb +10 -11
- data/spec/mongoid/errors/invalid_field_type_spec.rb +9 -12
- data/spec/mongoid/errors/invalid_find_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_includes_spec.rb +9 -13
- data/spec/mongoid/errors/invalid_index_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_options_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_path_spec.rb +7 -10
- data/spec/mongoid/errors/invalid_relation_spec.rb +15 -16
- data/spec/mongoid/errors/invalid_scope_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -6
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_time_spec.rb +8 -11
- data/spec/mongoid/errors/inverse_not_found_spec.rb +9 -12
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +9 -12
- data/spec/mongoid/errors/mixed_relations_spec.rb +8 -11
- data/spec/mongoid/errors/mongoid_error_spec.rb +21 -24
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -9
- data/spec/mongoid/errors/no_client_config_spec.rb +7 -10
- data/spec/mongoid/errors/no_client_database_spec.rb +9 -12
- data/spec/mongoid/errors/no_client_hosts_spec.rb +9 -12
- data/spec/mongoid/errors/no_clients_config_spec.rb +7 -10
- data/spec/mongoid/errors/no_environment_spec.rb +8 -11
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +8 -11
- data/spec/mongoid/errors/no_metadata_spec.rb +7 -10
- data/spec/mongoid/errors/no_parent_spec.rb +7 -10
- data/spec/mongoid/errors/readonly_attribute_spec.rb +7 -10
- data/spec/mongoid/errors/readonly_document_spec.rb +6 -9
- data/spec/mongoid/errors/scope_overwrite_spec.rb +9 -12
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +9 -12
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -8
- data/spec/mongoid/errors/unsaved_document_spec.rb +8 -11
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +9 -12
- data/spec/mongoid/errors/validations_spec.rb +11 -14
- data/spec/mongoid/extensions/array_spec.rb +70 -92
- data/spec/mongoid/extensions/big_decimal_spec.rb +233 -313
- data/spec/mongoid/extensions/binary_spec.rb +21 -32
- data/spec/mongoid/extensions/boolean_spec.rb +52 -75
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +43 -54
- data/spec/mongoid/extensions/date_spec.rb +26 -38
- data/spec/mongoid/extensions/date_time_spec.rb +22 -32
- data/spec/mongoid/extensions/decimal128_spec.rb +12 -18
- data/spec/mongoid/extensions/false_class_spec.rb +10 -17
- data/spec/mongoid/extensions/float_spec.rb +40 -61
- data/spec/mongoid/extensions/hash_spec.rb +46 -64
- data/spec/mongoid/extensions/integer_spec.rb +40 -61
- data/spec/mongoid/extensions/module_spec.rb +13 -18
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -5
- data/spec/mongoid/extensions/object_id_spec.rb +159 -247
- data/spec/mongoid/extensions/object_spec.rb +31 -47
- data/spec/mongoid/extensions/range_spec.rb +112 -115
- data/spec/mongoid/extensions/raw_value_spec.rb +10 -12
- data/spec/mongoid/extensions/regexp_spec.rb +23 -36
- data/spec/mongoid/extensions/set_spec.rb +38 -49
- data/spec/mongoid/extensions/string_spec.rb +118 -167
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +29 -43
- data/spec/mongoid/extensions/symbol_spec.rb +12 -20
- data/spec/mongoid/extensions/time_spec.rb +160 -202
- data/spec/mongoid/extensions/time_with_zone_spec.rb +79 -105
- data/spec/mongoid/extensions/true_class_spec.rb +10 -17
- data/spec/mongoid/factory_spec.rb +125 -148
- data/spec/mongoid/fields/foreign_key_spec.rb +124 -169
- data/spec/mongoid/fields/localized_spec.rb +140 -185
- data/spec/mongoid/fields/standard_spec.rb +43 -59
- data/spec/mongoid/fields_spec.rb +751 -620
- data/spec/mongoid/findable_spec.rb +260 -228
- data/spec/mongoid/indexable/specification_spec.rb +42 -58
- data/spec/mongoid/indexable_spec.rb +260 -264
- data/spec/mongoid/inspectable_spec.rb +45 -55
- data/spec/mongoid/interceptable_spec.rb +784 -922
- data/spec/mongoid/interceptable_spec_models.rb +35 -35
- data/spec/mongoid/loading_spec.rb +47 -43
- data/spec/mongoid/loggable_spec.rb +3 -6
- data/spec/mongoid/matcher/extract_attribute_spec.rb +2 -6
- data/spec/mongoid/mongoizable_spec.rb +81 -90
- data/spec/mongoid/monkey_patches_spec.rb +4 -0
- data/spec/mongoid/persistable/creatable_spec.rb +181 -220
- data/spec/mongoid/persistable/deletable_spec.rb +139 -179
- data/spec/mongoid/persistable/destroyable_spec.rb +135 -164
- data/spec/mongoid/persistable/incrementable_spec.rb +65 -84
- data/spec/mongoid/persistable/logical_spec.rb +48 -61
- data/spec/mongoid/persistable/maxable_spec.rb +45 -44
- data/spec/mongoid/persistable/minable_spec.rb +45 -44
- data/spec/mongoid/persistable/multipliable_spec.rb +54 -69
- data/spec/mongoid/persistable/poppable_spec.rb +47 -60
- data/spec/mongoid/persistable/pullable_spec.rb +79 -103
- data/spec/mongoid/persistable/pushable_spec.rb +106 -131
- data/spec/mongoid/persistable/renamable_spec.rb +52 -65
- data/spec/mongoid/persistable/savable_spec.rb +152 -189
- data/spec/mongoid/persistable/settable_spec.rb +121 -145
- data/spec/mongoid/persistable/unsettable_spec.rb +56 -73
- data/spec/mongoid/persistable/updatable_spec.rb +185 -232
- data/spec/mongoid/persistable/upsertable_spec.rb +66 -77
- data/spec/mongoid/persistable_spec.rb +132 -139
- data/spec/mongoid/persistence_context_spec.rb +31 -89
- data/spec/mongoid/positional_spec.rb +67 -79
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +0 -3
- data/spec/mongoid/railties/console_sandbox_spec.rb +0 -1
- data/spec/mongoid/relations/proxy_spec.rb +0 -1
- data/spec/mongoid/reloadable_spec.rb +250 -145
- data/spec/mongoid/scopable_spec.rb +319 -398
- data/spec/mongoid/search_indexable_spec.rb +446 -41
- data/spec/mongoid/selectable_spec.rb +36 -51
- data/spec/mongoid/serializable_spec.rb +269 -312
- data/spec/mongoid/shardable_models.rb +5 -5
- data/spec/mongoid/shardable_spec.rb +44 -46
- data/spec/mongoid/stateful_spec.rb +55 -75
- data/spec/mongoid/tasks/database_rake_spec.rb +138 -141
- data/spec/mongoid/tasks/database_spec.rb +80 -80
- data/spec/mongoid/tasks/encryption_spec.rb +22 -20
- data/spec/mongoid/threaded_spec.rb +57 -83
- data/spec/mongoid/timestamps/created/short_spec.rb +12 -16
- data/spec/mongoid/timestamps/created_spec.rb +16 -20
- data/spec/mongoid/timestamps/timeless_spec.rb +31 -43
- data/spec/mongoid/timestamps/updated/short_spec.rb +21 -28
- data/spec/mongoid/timestamps/updated_spec.rb +18 -25
- data/spec/mongoid/timestamps_spec.rb +171 -188
- data/spec/mongoid/timestamps_spec_models.rb +12 -13
- data/spec/mongoid/touchable_spec.rb +330 -294
- data/spec/mongoid/touchable_spec_models.rb +35 -37
- data/spec/mongoid/traversable_spec.rb +435 -471
- data/spec/mongoid/validatable/associated_spec.rb +42 -60
- data/spec/mongoid/validatable/format_spec.rb +24 -34
- data/spec/mongoid/validatable/length_spec.rb +62 -86
- data/spec/mongoid/validatable/numericality_spec.rb +114 -23
- data/spec/mongoid/validatable/presence_spec.rb +149 -203
- data/spec/mongoid/validatable/uniqueness_spec.rb +632 -830
- data/spec/mongoid/validatable_spec.rb +71 -103
- data/spec/mongoid/warnings_spec.rb +5 -9
- data/spec/mongoid_spec.rb +25 -41
- data/spec/rails/controller_extension/controller_runtime_spec.rb +45 -49
- data/spec/rails/mongoid_spec.rb +15 -15
- data/spec/shared/lib/mrss/cluster_config.rb +5 -40
- data/spec/shared/lib/mrss/constraints.rb +7 -46
- data/spec/shared/lib/mrss/docker_runner.rb +10 -21
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -31
- data/spec/shared/lib/mrss/release/candidate.rb +18 -12
- data/spec/shared/lib/mrss/server_version_registry.rb +1 -5
- data/spec/shared/share/Dockerfile.erb +6 -8
- data/spec/shared/shlib/server.sh +0 -50
- data/spec/shared/shlib/set_env.sh +4 -10
- data/spec/spec_helper.rb +54 -31
- data/spec/support/authorization.rb +0 -1
- data/spec/support/client_registry.rb +1 -2
- data/spec/support/constraints.rb +8 -25
- data/spec/support/crypt/models.rb +7 -8
- data/spec/support/crypt.rb +6 -9
- data/spec/support/expectations.rb +21 -7
- data/spec/support/feature_sandbox.rb +1 -4
- data/spec/support/helpers.rb +0 -1
- data/spec/support/immutable_ids.rb +20 -21
- data/spec/support/macros.rb +1 -3
- data/spec/support/models/account.rb +4 -5
- data/spec/support/models/acolyte.rb +5 -5
- data/spec/support/models/actor.rb +3 -3
- data/spec/support/models/actress.rb +0 -1
- data/spec/support/models/address.rb +11 -11
- 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 -2
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +4 -5
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +2 -2
- data/spec/support/models/armrest.rb +0 -1
- data/spec/support/models/array_field.rb +0 -1
- data/spec/support/models/article.rb +0 -1
- data/spec/support/models/artist.rb +16 -12
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +0 -1
- data/spec/support/models/audio.rb +2 -2
- data/spec/support/models/augmentation.rb +1 -2
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +0 -1
- data/spec/support/models/bar.rb +2 -2
- data/spec/support/models/basic.rb +0 -1
- data/spec/support/models/bed.rb +0 -1
- data/spec/support/models/big_palette.rb +0 -1
- data/spec/support/models/birthday.rb +3 -5
- data/spec/support/models/bolt.rb +0 -1
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +1 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -2
- data/spec/support/models/building.rb +0 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +2 -2
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +5 -6
- data/spec/support/models/car.rb +0 -1
- data/spec/support/models/cat.rb +0 -2
- data/spec/support/models/catalog.rb +0 -1
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +5 -6
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +0 -1
- data/spec/support/models/circuit.rb +2 -2
- data/spec/support/models/circus.rb +0 -1
- data/spec/support/models/code.rb +2 -1
- data/spec/support/models/coding/pull_request.rb +0 -1
- data/spec/support/models/coding.rb +0 -1
- data/spec/support/models/comment.rb +0 -1
- data/spec/support/models/company.rb +0 -1
- data/spec/support/models/consumption_period.rb +0 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +0 -1
- data/spec/support/models/country_code.rb +2 -3
- data/spec/support/models/courier_job.rb +2 -2
- data/spec/support/models/cover.rb +0 -1
- data/spec/support/models/crate.rb +0 -1
- data/spec/support/models/customer.rb +0 -1
- data/spec/support/models/customer_address.rb +0 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +0 -1
- data/spec/support/models/description.rb +0 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +2 -2
- data/spec/support/models/doctor.rb +0 -1
- data/spec/support/models/dog.rb +2 -2
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +0 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +2 -2
- 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 -2
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +0 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +3 -4
- 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 +0 -1
- data/spec/support/models/eye_bowl.rb +2 -3
- data/spec/support/models/face.rb +2 -3
- data/spec/support/models/fanatic.rb +1 -1
- data/spec/support/models/favorite.rb +1 -1
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +0 -1
- data/spec/support/models/fish.rb +0 -1
- data/spec/support/models/folder.rb +0 -2
- data/spec/support/models/folder_item.rb +1 -3
- data/spec/support/models/fruits.rb +9 -5
- data/spec/support/models/game.rb +3 -4
- data/spec/support/models/ghost.rb +0 -1
- data/spec/support/models/guitar.rb +0 -1
- data/spec/support/models/hole.rb +0 -1
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +2 -2
- data/spec/support/models/html_writer.rb +0 -1
- data/spec/support/models/id_key.rb +3 -3
- data/spec/support/models/idnodef.rb +0 -1
- data/spec/support/models/image.rb +0 -1
- data/spec/support/models/implant.rb +1 -2
- data/spec/support/models/instrument.rb +2 -3
- data/spec/support/models/item.rb +2 -2
- data/spec/support/models/jar.rb +1 -2
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +2 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +0 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +0 -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 -2
- data/spec/support/models/manufacturer.rb +0 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +1 -1
- data/spec/support/models/message.rb +1 -2
- data/spec/support/models/minim.rb +0 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/modifier_models.rb +25 -0
- data/spec/support/models/mop.rb +0 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -2
- data/spec/support/models/name.rb +4 -5
- data/spec/support/models/name_only.rb +0 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +3 -3
- data/spec/support/models/nut.rb +0 -1
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +1 -1
- data/spec/support/models/ordered_post.rb +1 -1
- 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 +0 -1
- data/spec/support/models/override.rb +3 -11
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +0 -1
- data/spec/support/models/page.rb +3 -3
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +2 -2
- data/spec/support/models/parent.rb +2 -2
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +0 -1
- data/spec/support/models/patient.rb +2 -2
- data/spec/support/models/pdf_writer.rb +0 -1
- data/spec/support/models/pencil.rb +0 -1
- data/spec/support/models/person.rb +32 -28
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +1 -2
- data/spec/support/models/piano.rb +0 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +5 -5
- data/spec/support/models/post.rb +12 -12
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +1 -2
- data/spec/support/models/preference.rb +2 -2
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +3 -3
- data/spec/support/models/profile.rb +2 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +2 -2
- data/spec/support/models/publication/encyclopedia.rb +0 -1
- data/spec/support/models/publication/review.rb +0 -1
- data/spec/support/models/publication.rb +0 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +1 -1
- data/spec/support/models/question.rb +2 -2
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +2 -3
- data/spec/support/models/registry.rb +1 -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 +0 -1
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +0 -1
- data/spec/support/models/sandbox/sandbox_message.rb +0 -1
- data/spec/support/models/sandbox/sandbox_user.rb +0 -1
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +0 -1
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +0 -1
- data/spec/support/models/school.rb +0 -1
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +0 -1
- data/spec/support/models/seat.rb +0 -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 +2 -2
- data/spec/support/models/shape.rb +3 -3
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +2 -2
- data/spec/support/models/shipment_address.rb +0 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +0 -1
- data/spec/support/models/shirt.rb +0 -1
- data/spec/support/models/shop.rb +2 -2
- data/spec/support/models/short_agent.rb +0 -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 -2
- data/spec/support/models/sound.rb +2 -2
- data/spec/support/models/spacer.rb +0 -1
- data/spec/support/models/square.rb +0 -1
- data/spec/support/models/staff.rb +0 -1
- data/spec/support/models/store_as_dup_test1.rb +2 -2
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +2 -2
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +0 -1
- data/spec/support/models/student.rb +1 -2
- data/spec/support/models/sub_item.rb +0 -1
- data/spec/support/models/subscription.rb +2 -2
- data/spec/support/models/survey.rb +2 -2
- data/spec/support/models/symptom.rb +2 -2
- data/spec/support/models/system_role.rb +2 -3
- data/spec/support/models/tag.rb +2 -2
- 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 +0 -1
- data/spec/support/models/title.rb +0 -1
- data/spec/support/models/tool.rb +3 -3
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +0 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +2 -3
- data/spec/support/models/truck.rb +0 -1
- data/spec/support/models/updatable.rb +0 -1
- data/spec/support/models/user.rb +3 -4
- data/spec/support/models/user_account.rb +3 -3
- data/spec/support/models/validation_callback.rb +4 -4
- data/spec/support/models/vehicle.rb +2 -3
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +0 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +2 -2
- data/spec/support/models/video_game.rb +0 -1
- data/spec/support/models/washer.rb +0 -1
- data/spec/support/models/weapon.rb +1 -2
- data/spec/support/models/wiki_page.rb +2 -3
- data/spec/support/models/word.rb +2 -2
- data/spec/support/models/word_origin.rb +1 -2
- data/spec/support/models/writer.rb +3 -3
- data/spec/support/rails_mock.rb +7 -12
- data/spec/support/shared/time.rb +0 -1
- data/spec/support/sinatra_mock.rb +4 -2
- data/spec/support/spec_config.rb +19 -18
- metadata +14 -2
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
|
-
require
|
|
3
|
+
require 'spec_helper'
|
|
5
4
|
|
|
6
5
|
describe Mongoid::Document do
|
|
7
|
-
|
|
8
6
|
let(:klass) do
|
|
9
7
|
Person
|
|
10
8
|
end
|
|
@@ -13,19 +11,17 @@ describe Mongoid::Document do
|
|
|
13
11
|
Person.new
|
|
14
12
|
end
|
|
15
13
|
|
|
16
|
-
it
|
|
14
|
+
it 'defines a _destroy method' do
|
|
17
15
|
expect(Person.new).to respond_to(:_destroy)
|
|
18
16
|
end
|
|
19
17
|
|
|
20
|
-
describe
|
|
21
|
-
|
|
22
|
-
it "default to false" do
|
|
18
|
+
describe '#_destroy' do
|
|
19
|
+
it 'default to false' do
|
|
23
20
|
expect(Person.new._destroy).to be false
|
|
24
21
|
end
|
|
25
22
|
end
|
|
26
23
|
|
|
27
|
-
describe
|
|
28
|
-
|
|
24
|
+
describe '.included' do
|
|
29
25
|
let(:models) do
|
|
30
26
|
Mongoid.models
|
|
31
27
|
end
|
|
@@ -37,75 +33,72 @@ describe Mongoid::Document do
|
|
|
37
33
|
let(:new_klass) do
|
|
38
34
|
Class.new do
|
|
39
35
|
class << self; attr_accessor :name; end
|
|
40
|
-
end.tap{|new_klass| new_klass.name = new_klass_name}
|
|
36
|
+
end.tap { |new_klass| new_klass.name = new_klass_name }
|
|
41
37
|
end
|
|
42
38
|
|
|
43
39
|
let(:new_model) do
|
|
44
40
|
new_klass.tap do
|
|
45
|
-
new_klass.send(:include,
|
|
41
|
+
new_klass.send(:include, Mongoid::Document)
|
|
46
42
|
end
|
|
47
43
|
end
|
|
48
44
|
|
|
49
45
|
let(:twice_a_new_model) do
|
|
50
46
|
new_klass.tap do
|
|
51
|
-
2.times{ new_klass.send(:include,
|
|
47
|
+
2.times { new_klass.send(:include, Mongoid::Document) }
|
|
52
48
|
end
|
|
53
49
|
end
|
|
54
50
|
|
|
55
|
-
context
|
|
56
|
-
it
|
|
51
|
+
context 'when Document has been included in a model' do
|
|
52
|
+
it '.models should include that model' do
|
|
57
53
|
expect(models).to include(klass)
|
|
58
54
|
end
|
|
59
55
|
end
|
|
60
56
|
|
|
61
|
-
context
|
|
62
|
-
it
|
|
63
|
-
expect(models).
|
|
57
|
+
context 'before Document has been included' do
|
|
58
|
+
it '.models should *not* include that model' do
|
|
59
|
+
expect(models).not_to include(new_klass)
|
|
64
60
|
end
|
|
65
61
|
end
|
|
66
62
|
|
|
67
|
-
context
|
|
68
|
-
it
|
|
63
|
+
context 'after Document has been included' do
|
|
64
|
+
it '.models should include that model' do
|
|
69
65
|
expect(models).to include(new_model)
|
|
70
66
|
end
|
|
71
67
|
end
|
|
72
68
|
|
|
73
|
-
context
|
|
74
|
-
it
|
|
75
|
-
expect(models.count(twice_a_new_model)).to
|
|
69
|
+
context 'after Document has been included multiple times' do
|
|
70
|
+
it '.models should include that model just once' do
|
|
71
|
+
expect(models.count(twice_a_new_model)).to eql(1)
|
|
76
72
|
end
|
|
77
73
|
end
|
|
78
74
|
end
|
|
79
75
|
|
|
80
|
-
describe
|
|
81
|
-
|
|
82
|
-
context "when the document is subclassed" do
|
|
83
|
-
|
|
76
|
+
describe '._types' do
|
|
77
|
+
context 'when the document is subclassed' do
|
|
84
78
|
let(:types) do
|
|
85
79
|
Person._types
|
|
86
80
|
end
|
|
87
81
|
|
|
88
|
-
it
|
|
89
|
-
expect(types).to include(
|
|
82
|
+
it 'includes the root' do
|
|
83
|
+
expect(types).to include('Person')
|
|
90
84
|
end
|
|
91
85
|
|
|
92
|
-
it
|
|
93
|
-
expect(types).to include(
|
|
86
|
+
it 'includes the subclasses' do
|
|
87
|
+
expect(types).to include('Doctor')
|
|
94
88
|
end
|
|
95
89
|
end
|
|
96
90
|
|
|
97
|
-
context
|
|
98
|
-
|
|
91
|
+
context 'when the document is not subclassed' do
|
|
99
92
|
let(:types) do
|
|
100
93
|
Kangaroo._types
|
|
101
94
|
end
|
|
102
95
|
|
|
103
|
-
it
|
|
104
|
-
expect(types).to eq([
|
|
96
|
+
it 'returns the document' do
|
|
97
|
+
expect(types).to eq([ 'Kangaroo' ])
|
|
105
98
|
end
|
|
106
99
|
end
|
|
107
100
|
|
|
108
|
-
context
|
|
101
|
+
context 'when ._types had been called before class declaration' do
|
|
109
102
|
let(:descendant) do
|
|
110
103
|
Class.new(Person)
|
|
111
104
|
end
|
|
@@ -115,168 +108,154 @@ describe Mongoid::Document do
|
|
|
115
108
|
descendant
|
|
116
109
|
end
|
|
117
110
|
|
|
118
|
-
it "
|
|
111
|
+
it "clears descendants' cache" do
|
|
119
112
|
expect(Person._types).to include(descendant.discriminator_value)
|
|
120
113
|
end
|
|
121
114
|
end
|
|
122
115
|
end
|
|
123
116
|
|
|
124
|
-
describe
|
|
125
|
-
|
|
126
|
-
context "when changing the discriminator_value" do
|
|
127
|
-
|
|
117
|
+
describe '._mongoid_clear_types' do
|
|
118
|
+
context 'when changing the discriminator_value' do
|
|
128
119
|
before do
|
|
129
120
|
Kangaroo._types
|
|
130
|
-
Kangaroo.discriminator_value =
|
|
121
|
+
Kangaroo.discriminator_value = 'dvalue'
|
|
131
122
|
end
|
|
132
123
|
|
|
133
124
|
after do
|
|
134
125
|
Kangaroo.discriminator_value = nil
|
|
135
126
|
end
|
|
136
127
|
|
|
137
|
-
it
|
|
138
|
-
expect(Kangaroo._types).to eq([
|
|
128
|
+
it 'has the correct _types' do
|
|
129
|
+
expect(Kangaroo._types).to eq([ 'dvalue' ])
|
|
139
130
|
end
|
|
140
131
|
end
|
|
141
132
|
|
|
142
|
-
context
|
|
143
|
-
|
|
133
|
+
context 'when changing the discriminator_value in child' do
|
|
144
134
|
before do
|
|
145
135
|
Shape._types
|
|
146
|
-
Circle.discriminator_value =
|
|
136
|
+
Circle.discriminator_value = 'dvalue'
|
|
147
137
|
end
|
|
148
138
|
|
|
149
139
|
after do
|
|
150
140
|
Circle.discriminator_value = nil
|
|
151
141
|
end
|
|
152
142
|
|
|
153
|
-
it
|
|
154
|
-
expect(Circle._types).to eq([
|
|
143
|
+
it 'has the correct _types' do
|
|
144
|
+
expect(Circle._types).to eq([ 'dvalue' ])
|
|
155
145
|
end
|
|
156
146
|
|
|
157
|
-
it
|
|
158
|
-
expect(Shape._types).to include(
|
|
147
|
+
it 'has the new Circle discriminator value' do
|
|
148
|
+
expect(Shape._types).to include('dvalue')
|
|
159
149
|
end
|
|
160
150
|
|
|
161
151
|
it "doesn't have the old Circle discriminator value" do
|
|
162
|
-
expect(Shape._types).
|
|
152
|
+
expect(Shape._types).not_to include('Cirlce')
|
|
163
153
|
end
|
|
164
154
|
end
|
|
165
155
|
end
|
|
166
156
|
|
|
167
|
-
describe
|
|
168
|
-
|
|
157
|
+
describe '#attributes' do
|
|
169
158
|
let!(:person) do
|
|
170
|
-
Person.create!(title:
|
|
159
|
+
Person.create!(title: 'Sir')
|
|
171
160
|
end
|
|
172
161
|
|
|
173
|
-
it
|
|
174
|
-
expect(person[:title]).to eq(
|
|
162
|
+
it 'returns the attributes with indifferent access' do
|
|
163
|
+
expect(person[:title]).to eq('Sir')
|
|
175
164
|
end
|
|
176
165
|
|
|
177
|
-
context
|
|
178
|
-
it
|
|
166
|
+
context 'when instantiating a new document' do
|
|
167
|
+
it 'returns a Hash' do
|
|
179
168
|
expect(person.attributes.class).to eq(Hash)
|
|
180
169
|
end
|
|
181
170
|
end
|
|
182
171
|
|
|
183
|
-
context
|
|
184
|
-
|
|
172
|
+
context 'when retrieving a document from the database' do
|
|
185
173
|
let(:from_db) { Person.first }
|
|
186
174
|
|
|
187
|
-
it
|
|
175
|
+
it 'returns a Hash' do
|
|
188
176
|
expect(from_db.attributes.class).to eq(Hash)
|
|
189
177
|
end
|
|
190
178
|
end
|
|
191
179
|
end
|
|
192
180
|
|
|
193
|
-
describe
|
|
194
|
-
|
|
181
|
+
describe '#identity' do
|
|
195
182
|
let(:person) do
|
|
196
183
|
Person.new
|
|
197
184
|
end
|
|
198
185
|
|
|
199
|
-
it
|
|
200
|
-
expect(person.identity).to eq([person.class, person.id])
|
|
186
|
+
it 'returns a [doc.class, doc.id] array' do
|
|
187
|
+
expect(person.identity).to eq([ person.class, person.id ])
|
|
201
188
|
end
|
|
202
189
|
end
|
|
203
190
|
|
|
204
|
-
describe
|
|
205
|
-
|
|
191
|
+
describe '#hash' do
|
|
206
192
|
let(:person) do
|
|
207
193
|
Person.new
|
|
208
194
|
end
|
|
209
195
|
|
|
210
|
-
it
|
|
196
|
+
it 'returns the identity hash' do
|
|
211
197
|
expect(person.hash).to eq(person.identity.hash)
|
|
212
198
|
end
|
|
213
199
|
end
|
|
214
200
|
|
|
215
|
-
describe
|
|
216
|
-
|
|
201
|
+
describe '#initialize' do
|
|
217
202
|
let(:person) do
|
|
218
|
-
Person.new(title:
|
|
203
|
+
Person.new(title: 'Sir')
|
|
219
204
|
end
|
|
220
205
|
|
|
221
|
-
it
|
|
222
|
-
expect(person).
|
|
206
|
+
it 'sets persisted to false' do
|
|
207
|
+
expect(person).not_to be_persisted
|
|
223
208
|
end
|
|
224
209
|
|
|
225
|
-
it
|
|
210
|
+
it 'creates an id for the document' do
|
|
226
211
|
expect(person.id).to be_a(BSON::ObjectId)
|
|
227
212
|
end
|
|
228
213
|
|
|
229
|
-
it
|
|
230
|
-
expect(person.title).to eq(
|
|
214
|
+
it 'sets the attributes' do
|
|
215
|
+
expect(person.title).to eq('Sir')
|
|
231
216
|
end
|
|
232
217
|
|
|
233
|
-
context
|
|
234
|
-
|
|
235
|
-
context "when the default scope is settable" do
|
|
236
|
-
|
|
218
|
+
context 'when the model has a default scope' do
|
|
219
|
+
context 'when the default scope is settable' do
|
|
237
220
|
let(:sound) do
|
|
238
221
|
Sound.new
|
|
239
222
|
end
|
|
240
223
|
|
|
241
|
-
it
|
|
224
|
+
it 'sets the default scoping on the model' do
|
|
242
225
|
expect(sound).to be_active
|
|
243
226
|
end
|
|
244
227
|
end
|
|
245
228
|
|
|
246
|
-
context
|
|
247
|
-
|
|
229
|
+
context 'when the default scope is not settable' do
|
|
248
230
|
let(:audio) do
|
|
249
231
|
Audio.new
|
|
250
232
|
end
|
|
251
233
|
|
|
252
|
-
it
|
|
234
|
+
it 'does not set the default scoping' do
|
|
253
235
|
expect(audio.attributes.except('_id')).to be_empty
|
|
254
236
|
end
|
|
255
237
|
end
|
|
256
238
|
end
|
|
257
239
|
|
|
258
|
-
context
|
|
259
|
-
|
|
240
|
+
context 'when accessing a relation from an overridden setter' do
|
|
260
241
|
let(:doctor) do
|
|
261
|
-
Doctor.new(specialty:
|
|
242
|
+
Doctor.new(specialty: 'surgery')
|
|
262
243
|
end
|
|
263
244
|
|
|
264
|
-
it
|
|
245
|
+
it 'allows access to the relation' do
|
|
265
246
|
expect(doctor.users.first).to be_a(User)
|
|
266
247
|
end
|
|
267
248
|
|
|
268
|
-
it
|
|
269
|
-
expect(doctor.specialty).to eq(
|
|
249
|
+
it 'properly allows super calls' do
|
|
250
|
+
expect(doctor.specialty).to eq('surgery')
|
|
270
251
|
end
|
|
271
252
|
end
|
|
272
253
|
|
|
273
|
-
context
|
|
274
|
-
|
|
275
|
-
context "when accessing attributes" do
|
|
276
|
-
|
|
254
|
+
context 'when initialize callbacks are defined' do
|
|
255
|
+
context 'when accessing attributes' do
|
|
277
256
|
before do
|
|
278
257
|
Person.set_callback :initialize, :after do |doc|
|
|
279
|
-
doc.title =
|
|
258
|
+
doc.title = 'Madam'
|
|
280
259
|
end
|
|
281
260
|
end
|
|
282
261
|
|
|
@@ -284,20 +263,19 @@ describe Mongoid::Document do
|
|
|
284
263
|
Person.reset_callbacks(:initialize)
|
|
285
264
|
end
|
|
286
265
|
|
|
287
|
-
it
|
|
288
|
-
expect(person.title).to eq(
|
|
266
|
+
it 'runs the callbacks' do
|
|
267
|
+
expect(person.title).to eq('Madam')
|
|
289
268
|
end
|
|
290
269
|
end
|
|
291
270
|
|
|
292
|
-
context
|
|
293
|
-
|
|
271
|
+
context 'when accessing relations' do
|
|
294
272
|
let(:person) do
|
|
295
273
|
Person.new(game: Game.new)
|
|
296
274
|
end
|
|
297
275
|
|
|
298
276
|
before do
|
|
299
277
|
Person.after_initialize do
|
|
300
|
-
|
|
278
|
+
game.name = 'Ms. Pacman'
|
|
301
279
|
end
|
|
302
280
|
end
|
|
303
281
|
|
|
@@ -305,207 +283,192 @@ describe Mongoid::Document do
|
|
|
305
283
|
Person.reset_callbacks(:initialize)
|
|
306
284
|
end
|
|
307
285
|
|
|
308
|
-
it
|
|
309
|
-
expect(person.game.name).to eq(
|
|
286
|
+
it 'runs the callbacks' do
|
|
287
|
+
expect(person.game.name).to eq('Ms. Pacman')
|
|
310
288
|
end
|
|
311
289
|
end
|
|
312
290
|
end
|
|
313
291
|
|
|
314
|
-
context
|
|
315
|
-
|
|
316
|
-
it "sets the default values" do
|
|
292
|
+
context 'when defaults are defined' do
|
|
293
|
+
it 'sets the default values' do
|
|
317
294
|
expect(person.age).to eq(100)
|
|
318
295
|
end
|
|
319
296
|
end
|
|
320
297
|
|
|
321
|
-
context
|
|
322
|
-
|
|
298
|
+
context 'when a block is provided' do
|
|
323
299
|
let(:person) do
|
|
324
300
|
Person.new do |doc|
|
|
325
|
-
doc.title =
|
|
301
|
+
doc.title = 'King'
|
|
326
302
|
end
|
|
327
303
|
end
|
|
328
304
|
|
|
329
|
-
it
|
|
330
|
-
expect(person.title).to eq(
|
|
305
|
+
it 'yields to the block' do
|
|
306
|
+
expect(person.title).to eq('King')
|
|
331
307
|
end
|
|
332
308
|
end
|
|
333
309
|
end
|
|
334
310
|
|
|
335
|
-
describe
|
|
336
|
-
|
|
337
|
-
context "when passing a block" do
|
|
338
|
-
|
|
311
|
+
describe '.instantiate' do
|
|
312
|
+
context 'when passing a block' do
|
|
339
313
|
let(:id) do
|
|
340
314
|
BSON::ObjectId.new
|
|
341
315
|
end
|
|
342
316
|
|
|
343
317
|
let(:document) do
|
|
344
|
-
Band.instantiate(
|
|
318
|
+
Band.instantiate('_id' => id, 'name' => 'Depeche Mode') do |band|
|
|
345
319
|
band.likes = 1000
|
|
346
320
|
end
|
|
347
321
|
end
|
|
348
322
|
|
|
349
|
-
it
|
|
323
|
+
it 'yields to the block' do
|
|
350
324
|
expect(document.likes).to eq(1000)
|
|
351
325
|
end
|
|
352
326
|
end
|
|
353
327
|
|
|
354
|
-
context
|
|
355
|
-
|
|
328
|
+
context 'when an id exists' do
|
|
356
329
|
let(:id) do
|
|
357
330
|
BSON::ObjectId.new
|
|
358
331
|
end
|
|
359
332
|
|
|
360
333
|
let!(:person) do
|
|
361
|
-
Person.instantiate(
|
|
334
|
+
Person.instantiate('_id' => id, 'title' => 'Sir')
|
|
362
335
|
end
|
|
363
336
|
|
|
364
|
-
it
|
|
365
|
-
expect(person.title).to eq(
|
|
337
|
+
it 'sets the attributes' do
|
|
338
|
+
expect(person.title).to eq('Sir')
|
|
366
339
|
end
|
|
367
340
|
|
|
368
|
-
it
|
|
341
|
+
it 'sets persisted to true' do
|
|
369
342
|
expect(person).to be_persisted
|
|
370
343
|
end
|
|
371
344
|
end
|
|
372
345
|
|
|
373
|
-
context
|
|
374
|
-
|
|
346
|
+
context 'when attributes are nil' do
|
|
375
347
|
let(:person) do
|
|
376
348
|
Person.instantiate
|
|
377
349
|
end
|
|
378
350
|
|
|
379
|
-
it
|
|
351
|
+
it 'creates a new document' do
|
|
380
352
|
expect(person).to be_a(Person)
|
|
381
353
|
end
|
|
382
354
|
end
|
|
383
355
|
end
|
|
384
356
|
|
|
385
|
-
describe
|
|
386
|
-
|
|
357
|
+
describe '#model_name' do
|
|
387
358
|
let(:person) do
|
|
388
359
|
Person.new
|
|
389
360
|
end
|
|
390
361
|
|
|
391
|
-
it
|
|
392
|
-
expect(person.model_name).to eq(
|
|
362
|
+
it 'returns the class model name' do
|
|
363
|
+
expect(person.model_name).to eq('Person')
|
|
393
364
|
end
|
|
394
365
|
end
|
|
395
366
|
|
|
396
|
-
describe
|
|
397
|
-
|
|
367
|
+
describe '#raw_attributes' do
|
|
398
368
|
let(:person) do
|
|
399
|
-
Person.new(title:
|
|
369
|
+
Person.new(title: 'Sir')
|
|
400
370
|
end
|
|
401
371
|
|
|
402
|
-
it
|
|
403
|
-
expect(person.raw_attributes[
|
|
372
|
+
it 'returns the internal attributes' do
|
|
373
|
+
expect(person.raw_attributes['title']).to eq('Sir')
|
|
404
374
|
end
|
|
405
375
|
end
|
|
406
376
|
|
|
407
|
-
describe
|
|
408
|
-
|
|
377
|
+
describe '#as_json' do
|
|
409
378
|
let!(:person) do
|
|
410
|
-
Person.new(title:
|
|
379
|
+
Person.new(title: 'Sir')
|
|
411
380
|
end
|
|
412
381
|
|
|
413
|
-
context
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
expect(person.as_json[
|
|
417
|
-
expect(person.as_json["age"]).to eq(100)
|
|
382
|
+
context 'when no options are provided' do
|
|
383
|
+
it 'does not apply any options' do
|
|
384
|
+
expect(person.as_json['title']).to eq('Sir')
|
|
385
|
+
expect(person.as_json['age']).to eq(100)
|
|
418
386
|
end
|
|
419
387
|
|
|
420
|
-
context
|
|
421
|
-
|
|
388
|
+
context 'when options for the super method are provided' do
|
|
422
389
|
let(:options) do
|
|
423
390
|
{ only: :title }
|
|
424
391
|
end
|
|
425
392
|
|
|
426
|
-
it
|
|
427
|
-
expect(person.as_json(options)[
|
|
428
|
-
expect(person.as_json(options).keys).not_to include(
|
|
393
|
+
it 'passes the options through to the super method' do
|
|
394
|
+
expect(person.as_json(options)['title']).to eq('Sir')
|
|
395
|
+
expect(person.as_json(options).keys).not_to include('age')
|
|
429
396
|
end
|
|
430
397
|
end
|
|
431
398
|
end
|
|
432
399
|
end
|
|
433
400
|
|
|
434
|
-
describe
|
|
435
|
-
|
|
401
|
+
describe '#as_document' do
|
|
436
402
|
let!(:person) do
|
|
437
|
-
Person.new(title:
|
|
403
|
+
Person.new(title: 'Sir')
|
|
438
404
|
end
|
|
439
405
|
|
|
440
406
|
let!(:address) do
|
|
441
|
-
person.addresses.build(street:
|
|
407
|
+
person.addresses.build(street: 'Upper')
|
|
442
408
|
end
|
|
443
409
|
|
|
444
410
|
let!(:name) do
|
|
445
|
-
person.build_name(first_name:
|
|
411
|
+
person.build_name(first_name: 'James')
|
|
446
412
|
end
|
|
447
413
|
|
|
448
414
|
let!(:location) do
|
|
449
|
-
address.locations.build(name:
|
|
415
|
+
address.locations.build(name: 'Home')
|
|
450
416
|
end
|
|
451
417
|
|
|
452
|
-
it
|
|
453
|
-
expect(person.as_document).to have_key(
|
|
418
|
+
it 'includes embeds one attributes' do
|
|
419
|
+
expect(person.as_document).to have_key('name')
|
|
454
420
|
end
|
|
455
421
|
|
|
456
|
-
it
|
|
422
|
+
it 'includes embeds one attributes as a symbol' do
|
|
457
423
|
expect(person.as_document).to have_key(:name)
|
|
458
424
|
end
|
|
459
425
|
|
|
460
|
-
it
|
|
461
|
-
expect(person.as_document).to have_key(
|
|
426
|
+
it 'includes embeds many attributes' do
|
|
427
|
+
expect(person.as_document).to have_key('addresses')
|
|
462
428
|
end
|
|
463
429
|
|
|
464
|
-
it
|
|
430
|
+
it 'includes embeds many attributes as a symbol' do
|
|
465
431
|
expect(person.as_document).to have_key(:addresses)
|
|
466
432
|
end
|
|
467
433
|
|
|
468
|
-
it
|
|
469
|
-
expect(person.as_document[
|
|
434
|
+
it 'includes second level embeds many attributes' do
|
|
435
|
+
expect(person.as_document['addresses'].first).to have_key('locations')
|
|
470
436
|
end
|
|
471
437
|
|
|
472
|
-
it
|
|
473
|
-
expect(person.as_document[
|
|
438
|
+
it 'includes second level embeds many attributes as a symbol' do
|
|
439
|
+
expect(person.as_document['addresses'].first).to have_key(:locations)
|
|
474
440
|
end
|
|
475
441
|
|
|
476
|
-
context
|
|
477
|
-
|
|
442
|
+
context 'with relation define store_as option in embeded_many' do
|
|
478
443
|
let!(:phone) do
|
|
479
444
|
person.phones.build(number: '+33123456789')
|
|
480
445
|
end
|
|
481
446
|
|
|
482
447
|
it 'includes the store_as key association' do
|
|
483
|
-
expect(person.as_document).to have_key(
|
|
448
|
+
expect(person.as_document).to have_key('mobile_phones')
|
|
484
449
|
end
|
|
485
450
|
|
|
486
451
|
it 'includes the store_as key association as a symbol' do
|
|
487
452
|
expect(person.as_document).to have_key(:mobile_phones)
|
|
488
453
|
end
|
|
489
454
|
|
|
490
|
-
it '
|
|
491
|
-
expect(person.as_document).
|
|
455
|
+
it 'does not include the key of association' do
|
|
456
|
+
expect(person.as_document).not_to have_key('phones')
|
|
492
457
|
end
|
|
493
458
|
end
|
|
494
459
|
|
|
495
|
-
context
|
|
496
|
-
|
|
460
|
+
context 'when removing an embedded document' do
|
|
497
461
|
before do
|
|
498
462
|
person.save!
|
|
499
463
|
person.addresses.delete(address)
|
|
500
464
|
end
|
|
501
465
|
|
|
502
|
-
it
|
|
503
|
-
expect(person.as_document).
|
|
466
|
+
it 'does not include the document in the hash' do
|
|
467
|
+
expect(person.as_document).not_to have_key('addresses')
|
|
504
468
|
end
|
|
505
469
|
end
|
|
506
470
|
|
|
507
|
-
context
|
|
508
|
-
|
|
471
|
+
context 'when an embedded relation has been set to nil' do
|
|
509
472
|
before do
|
|
510
473
|
# Save the doc, then set an embeds_one relation to nil
|
|
511
474
|
person.save!
|
|
@@ -513,203 +476,182 @@ describe Mongoid::Document do
|
|
|
513
476
|
person.save!
|
|
514
477
|
end
|
|
515
478
|
|
|
516
|
-
it
|
|
517
|
-
expect(person.as_document).
|
|
479
|
+
it 'does not include the document in the hash' do
|
|
480
|
+
expect(person.as_document).not_to have_key('name')
|
|
518
481
|
end
|
|
519
482
|
end
|
|
520
483
|
end
|
|
521
484
|
|
|
522
|
-
describe
|
|
523
|
-
|
|
524
|
-
context "when the document is new" do
|
|
525
|
-
|
|
485
|
+
describe '#to_key' do
|
|
486
|
+
context 'when the document is new' do
|
|
526
487
|
let(:person) do
|
|
527
488
|
Person.new
|
|
528
489
|
end
|
|
529
490
|
|
|
530
|
-
it
|
|
491
|
+
it 'returns nil' do
|
|
531
492
|
expect(person.to_key).to be_nil
|
|
532
493
|
end
|
|
533
494
|
end
|
|
534
495
|
|
|
535
|
-
context
|
|
536
|
-
|
|
496
|
+
context 'when the document is not new' do
|
|
537
497
|
let(:person) do
|
|
538
498
|
Person.create!
|
|
539
499
|
end
|
|
540
500
|
|
|
541
|
-
it
|
|
501
|
+
it 'returns the id in an array' do
|
|
542
502
|
expect(person.to_key).to eq([ person.id.to_s ])
|
|
543
503
|
end
|
|
544
504
|
|
|
545
|
-
it
|
|
505
|
+
it 'can query using the key' do
|
|
546
506
|
expect(person.id).to eq Person.find(person.to_key).first.id
|
|
547
507
|
end
|
|
548
508
|
end
|
|
549
509
|
|
|
550
|
-
context
|
|
551
|
-
|
|
510
|
+
context 'when the document is destroyed' do
|
|
552
511
|
let(:person) do
|
|
553
|
-
Person.instantiate(
|
|
512
|
+
Person.instantiate('_id' => BSON::ObjectId.new).tap do |peep|
|
|
554
513
|
peep.destroyed = true
|
|
555
514
|
end
|
|
556
515
|
end
|
|
557
516
|
|
|
558
|
-
it
|
|
517
|
+
it 'returns the id in an array' do
|
|
559
518
|
expect(person.to_key).to eq([ person.id.to_s ])
|
|
560
519
|
end
|
|
561
520
|
end
|
|
562
521
|
end
|
|
563
522
|
|
|
564
|
-
describe
|
|
565
|
-
|
|
566
|
-
context "when the document is new" do
|
|
567
|
-
|
|
523
|
+
describe '#to_param' do
|
|
524
|
+
context 'when the document is new' do
|
|
568
525
|
let(:person) do
|
|
569
526
|
Person.new
|
|
570
527
|
end
|
|
571
528
|
|
|
572
|
-
it
|
|
529
|
+
it 'returns nil' do
|
|
573
530
|
expect(person.to_param).to be_nil
|
|
574
531
|
end
|
|
575
532
|
end
|
|
576
533
|
|
|
577
|
-
context
|
|
578
|
-
|
|
534
|
+
context 'when the document is not new' do
|
|
579
535
|
let(:person) do
|
|
580
|
-
Person.instantiate(
|
|
536
|
+
Person.instantiate('_id' => BSON::ObjectId.new)
|
|
581
537
|
end
|
|
582
538
|
|
|
583
|
-
it
|
|
539
|
+
it 'returns the id as a string' do
|
|
584
540
|
expect(person.to_param).to eq(person.id.to_s)
|
|
585
541
|
end
|
|
586
542
|
end
|
|
587
543
|
end
|
|
588
544
|
|
|
589
|
-
describe
|
|
590
|
-
|
|
545
|
+
describe '#frozen?' do
|
|
591
546
|
let(:person) do
|
|
592
547
|
Person.new
|
|
593
548
|
end
|
|
594
549
|
|
|
595
|
-
context
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
expect
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
}.to_not raise_error
|
|
550
|
+
context 'when attributes are not frozen' do
|
|
551
|
+
it 'return false' do
|
|
552
|
+
expect(person).not_to be_frozen
|
|
553
|
+
expect do
|
|
554
|
+
person.title = 'something'
|
|
555
|
+
end.not_to raise_error
|
|
602
556
|
end
|
|
603
557
|
end
|
|
604
558
|
|
|
605
|
-
context
|
|
559
|
+
context 'when attributes are frozen' do
|
|
606
560
|
before do
|
|
607
561
|
person.raw_attributes.freeze
|
|
608
562
|
end
|
|
609
563
|
|
|
610
|
-
it
|
|
564
|
+
it 'return true' do
|
|
611
565
|
expect(person).to be_frozen
|
|
612
566
|
end
|
|
613
567
|
end
|
|
614
568
|
end
|
|
615
569
|
|
|
616
|
-
describe
|
|
617
|
-
|
|
570
|
+
describe '#freeze' do
|
|
618
571
|
let(:person) do
|
|
619
572
|
Person.new
|
|
620
573
|
end
|
|
621
574
|
|
|
622
|
-
context
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
it "freezes attributes" do
|
|
575
|
+
context 'when freezing the model' do
|
|
576
|
+
context 'when not frozen' do
|
|
577
|
+
it 'freezes attributes' do
|
|
627
578
|
expect(person.freeze).to eq(person)
|
|
628
|
-
expect { person.title =
|
|
579
|
+
expect { person.title = 'something' }.to raise_error(RuntimeError)
|
|
629
580
|
end
|
|
630
581
|
end
|
|
631
582
|
|
|
632
|
-
context
|
|
633
|
-
|
|
583
|
+
context 'when frozen' do
|
|
634
584
|
before do
|
|
635
585
|
person.raw_attributes.freeze
|
|
636
586
|
end
|
|
637
587
|
|
|
638
|
-
it
|
|
588
|
+
it 'keeps things frozen' do
|
|
639
589
|
person.freeze
|
|
640
|
-
expect
|
|
641
|
-
person.title =
|
|
642
|
-
|
|
590
|
+
expect do
|
|
591
|
+
person.title = 'something'
|
|
592
|
+
end.to raise_error(RuntimeError)
|
|
643
593
|
end
|
|
644
594
|
end
|
|
645
595
|
end
|
|
646
596
|
|
|
647
|
-
context
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
context "when the frozen value is a hash" do
|
|
652
|
-
|
|
597
|
+
context 'when freezing attributes of the model' do
|
|
598
|
+
context 'when assigning a frozen value' do
|
|
599
|
+
context 'when the frozen value is a hash' do
|
|
653
600
|
let(:hash) do
|
|
654
|
-
{
|
|
601
|
+
{ 'foo' => { 'bar' => { 'baz' => [ 1, 2, 3 ] } } }
|
|
655
602
|
end
|
|
656
603
|
|
|
657
604
|
let(:assign_hash) do
|
|
658
605
|
person.map = hash.freeze
|
|
659
606
|
end
|
|
660
607
|
|
|
661
|
-
it
|
|
662
|
-
expect{ assign_hash }.not_to raise_error
|
|
608
|
+
it 'no mutation occurs during assignment' do
|
|
609
|
+
expect { assign_hash }.not_to raise_error
|
|
663
610
|
end
|
|
664
611
|
end
|
|
665
612
|
end
|
|
666
613
|
end
|
|
667
614
|
end
|
|
668
615
|
|
|
669
|
-
describe
|
|
670
|
-
|
|
671
|
-
it "returns the mongoid logger" do
|
|
616
|
+
describe '.logger' do
|
|
617
|
+
it 'returns the mongoid logger' do
|
|
672
618
|
expect(Person.logger).to eq(Mongoid.logger)
|
|
673
619
|
end
|
|
674
620
|
end
|
|
675
621
|
|
|
676
|
-
describe
|
|
677
|
-
|
|
622
|
+
describe '#logger' do
|
|
678
623
|
let(:person) do
|
|
679
624
|
Person.new
|
|
680
625
|
end
|
|
681
626
|
|
|
682
|
-
it
|
|
627
|
+
it 'returns the mongoid logger' do
|
|
683
628
|
expect(person.send(:logger)).to eq(Mongoid.logger)
|
|
684
629
|
end
|
|
685
630
|
end
|
|
686
631
|
|
|
687
|
-
context
|
|
688
|
-
|
|
632
|
+
context 'after including the document module' do
|
|
689
633
|
let(:movie) do
|
|
690
634
|
Movie.new
|
|
691
635
|
end
|
|
692
636
|
|
|
693
|
-
it
|
|
694
|
-
expect(movie.global_set).to be_a(
|
|
637
|
+
it 'resets to the global scope' do
|
|
638
|
+
expect(movie.global_set).to be_a(Set)
|
|
695
639
|
end
|
|
696
640
|
end
|
|
697
|
-
context "when a model name conflicts with a mongoid internal" do
|
|
698
641
|
|
|
642
|
+
context 'when a model name conflicts with a mongoid internal' do
|
|
699
643
|
let(:scheduler) do
|
|
700
644
|
Scheduler.new
|
|
701
645
|
end
|
|
702
646
|
|
|
703
|
-
it
|
|
647
|
+
it 'allows the model name' do
|
|
704
648
|
expect(scheduler.strategy).to be_a(Strategy)
|
|
705
649
|
end
|
|
706
650
|
end
|
|
707
651
|
|
|
708
|
-
describe
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
it "sets the defaults before yielding" do
|
|
652
|
+
describe '#initialize' do
|
|
653
|
+
context 'when providing a block' do
|
|
654
|
+
it 'sets the defaults before yielding' do
|
|
713
655
|
Person.new do |person|
|
|
714
656
|
expect(person.age).to eq(100)
|
|
715
657
|
end
|
|
@@ -717,8 +659,7 @@ describe Mongoid::Document do
|
|
|
717
659
|
end
|
|
718
660
|
end
|
|
719
661
|
|
|
720
|
-
context
|
|
721
|
-
|
|
662
|
+
context 'defining a BSON::ObjectId as a field' do
|
|
722
663
|
let(:bson_id) do
|
|
723
664
|
BSON::ObjectId.new
|
|
724
665
|
end
|
|
@@ -731,50 +672,47 @@ describe Mongoid::Document do
|
|
|
731
672
|
person.save!
|
|
732
673
|
end
|
|
733
674
|
|
|
734
|
-
it
|
|
675
|
+
it 'persists the correct type' do
|
|
735
676
|
expect(person.reload.bson_id).to be_a(BSON::ObjectId)
|
|
736
677
|
end
|
|
737
678
|
|
|
738
|
-
it
|
|
679
|
+
it 'has the correct value' do
|
|
739
680
|
expect(person.bson_id).to eq(bson_id)
|
|
740
681
|
end
|
|
741
682
|
end
|
|
742
683
|
|
|
743
|
-
context
|
|
744
|
-
|
|
684
|
+
context 'when setting bson id fields to empty strings' do
|
|
745
685
|
let(:post) do
|
|
746
686
|
Post.new
|
|
747
687
|
end
|
|
748
688
|
|
|
749
689
|
before do
|
|
750
|
-
post.person_id =
|
|
690
|
+
post.person_id = ''
|
|
751
691
|
end
|
|
752
692
|
|
|
753
|
-
it
|
|
693
|
+
it 'converts them to nil' do
|
|
754
694
|
expect(post.person_id).to be_nil
|
|
755
695
|
end
|
|
756
696
|
end
|
|
757
697
|
|
|
758
|
-
context
|
|
759
|
-
|
|
760
|
-
context "when defining collection" do
|
|
761
|
-
|
|
698
|
+
context 'creating anonymous documents' do
|
|
699
|
+
context 'when defining collection' do
|
|
762
700
|
let(:model) do
|
|
763
701
|
Class.new do
|
|
764
702
|
include Mongoid::Document
|
|
765
|
-
|
|
703
|
+
|
|
704
|
+
store_in collection: 'anonymous'
|
|
766
705
|
field :gender
|
|
767
706
|
end
|
|
768
707
|
end
|
|
769
708
|
|
|
770
|
-
it
|
|
771
|
-
Object.const_set
|
|
709
|
+
it 'allows the creation' do
|
|
710
|
+
Object.const_set :Anonymous, model
|
|
772
711
|
end
|
|
773
712
|
end
|
|
774
713
|
end
|
|
775
714
|
|
|
776
|
-
describe
|
|
777
|
-
|
|
715
|
+
describe '#becomes' do
|
|
778
716
|
before(:all) do
|
|
779
717
|
Person.validates_format_of(:ssn, without: /\$\$\$/)
|
|
780
718
|
|
|
@@ -788,55 +726,54 @@ describe Mongoid::Document do
|
|
|
788
726
|
Object.send(:remove_const, :Manager)
|
|
789
727
|
end
|
|
790
728
|
|
|
791
|
-
context
|
|
792
|
-
|
|
729
|
+
context 'when casting to a superclass' do
|
|
793
730
|
let(:manager) do
|
|
794
|
-
Manager.new(title:
|
|
731
|
+
Manager.new(title: 'Sir')
|
|
795
732
|
end
|
|
796
733
|
|
|
797
|
-
context
|
|
798
|
-
context
|
|
734
|
+
context 'when no embedded documents are present' do
|
|
735
|
+
context 'when using the default discriminator key' do
|
|
799
736
|
let(:person) do
|
|
800
737
|
manager.becomes(Person)
|
|
801
738
|
end
|
|
802
739
|
|
|
803
|
-
it
|
|
740
|
+
it 'copies attributes' do
|
|
804
741
|
expect(person.title).to eq('Sir')
|
|
805
742
|
end
|
|
806
743
|
|
|
807
|
-
it
|
|
744
|
+
it 'keeps the same object id' do
|
|
808
745
|
expect(person.id).to eq(manager.id)
|
|
809
746
|
end
|
|
810
747
|
|
|
811
|
-
it
|
|
812
|
-
expect(person._type).to eq(
|
|
748
|
+
it 'sets the class type' do
|
|
749
|
+
expect(person._type).to eq('Person')
|
|
813
750
|
end
|
|
814
751
|
|
|
815
|
-
it
|
|
816
|
-
expect
|
|
752
|
+
it 'raises an error when inappropriate class is provided' do
|
|
753
|
+
expect do
|
|
817
754
|
manager.becomes(String)
|
|
818
|
-
|
|
755
|
+
end.to raise_error(ArgumentError, /A class which includes Mongoid::Document is expected/)
|
|
819
756
|
end
|
|
820
757
|
end
|
|
821
758
|
|
|
822
|
-
context
|
|
759
|
+
context 'when using a custom discriminator key' do
|
|
823
760
|
before do
|
|
824
|
-
Person.discriminator_key =
|
|
761
|
+
Person.discriminator_key = 'dkey'
|
|
825
762
|
end
|
|
826
763
|
|
|
827
764
|
after do
|
|
828
765
|
Person.discriminator_key = nil
|
|
829
766
|
end
|
|
830
767
|
|
|
831
|
-
it
|
|
832
|
-
expect(person.dkey).to eq(
|
|
768
|
+
it 'sets the class type with new discriminator key' do
|
|
769
|
+
expect(person.dkey).to eq('Person')
|
|
833
770
|
end
|
|
834
771
|
end
|
|
835
772
|
|
|
836
|
-
context
|
|
773
|
+
context 'when using a custom discriminator key and discriminator value' do
|
|
837
774
|
before do
|
|
838
|
-
Person.discriminator_key =
|
|
839
|
-
Person.discriminator_value =
|
|
775
|
+
Person.discriminator_key = 'dkey'
|
|
776
|
+
Person.discriminator_value = 'dvalue'
|
|
840
777
|
end
|
|
841
778
|
|
|
842
779
|
after do
|
|
@@ -844,16 +781,14 @@ describe Mongoid::Document do
|
|
|
844
781
|
Person.discriminator_value = nil
|
|
845
782
|
end
|
|
846
783
|
|
|
847
|
-
it
|
|
848
|
-
expect(person.dkey).to eq(
|
|
784
|
+
it 'sets the class type with new discriminator key' do
|
|
785
|
+
expect(person.dkey).to eq('dvalue')
|
|
849
786
|
end
|
|
850
787
|
end
|
|
851
788
|
end
|
|
852
789
|
|
|
853
|
-
context
|
|
854
|
-
|
|
855
|
-
context "when the attribtues are protected" do
|
|
856
|
-
|
|
790
|
+
context 'when the document has embedded documents' do
|
|
791
|
+
context 'when the attributes are protected' do
|
|
857
792
|
let!(:appointment) do
|
|
858
793
|
manager.appointments.build
|
|
859
794
|
end
|
|
@@ -862,44 +797,41 @@ describe Mongoid::Document do
|
|
|
862
797
|
manager.becomes(Person)
|
|
863
798
|
end
|
|
864
799
|
|
|
865
|
-
it
|
|
800
|
+
it 'copies the embedded documents' do
|
|
866
801
|
expect(person.appointments.first).to eq(appointment)
|
|
867
802
|
end
|
|
868
803
|
|
|
869
|
-
it
|
|
870
|
-
expect(person.appointments.first).
|
|
804
|
+
it 'returns new instances' do
|
|
805
|
+
expect(person.appointments.first).not_to equal(appointment)
|
|
871
806
|
end
|
|
872
807
|
end
|
|
873
808
|
|
|
874
|
-
context
|
|
875
|
-
|
|
876
|
-
context "when embedded doc is not persisted" do
|
|
877
|
-
|
|
809
|
+
context 'when the attributes are not protected' do
|
|
810
|
+
context 'when embedded doc is not persisted' do
|
|
878
811
|
let!(:address) do
|
|
879
|
-
manager.addresses.build(street:
|
|
812
|
+
manager.addresses.build(street: 'hobrecht')
|
|
880
813
|
end
|
|
881
814
|
|
|
882
815
|
let(:person) do
|
|
883
816
|
manager.becomes(Person)
|
|
884
817
|
end
|
|
885
818
|
|
|
886
|
-
it
|
|
819
|
+
it 'copies the embedded documents' do
|
|
887
820
|
expect(person.addresses.first).to eq(address)
|
|
888
821
|
end
|
|
889
822
|
|
|
890
|
-
it
|
|
891
|
-
expect(person.addresses.first).
|
|
823
|
+
it 'returns new instances' do
|
|
824
|
+
expect(person.addresses.first).not_to equal(address)
|
|
892
825
|
end
|
|
893
826
|
end
|
|
894
827
|
|
|
895
|
-
context
|
|
896
|
-
|
|
828
|
+
context 'when embedded doc is persisted' do
|
|
897
829
|
let(:manager) do
|
|
898
|
-
Manager.create!(title:
|
|
830
|
+
Manager.create!(title: 'Sir')
|
|
899
831
|
end
|
|
900
832
|
|
|
901
833
|
let!(:address) do
|
|
902
|
-
manager.addresses.create!(street:
|
|
834
|
+
manager.addresses.create!(street: 'hobrecht')
|
|
903
835
|
end
|
|
904
836
|
|
|
905
837
|
let(:person) do
|
|
@@ -910,45 +842,42 @@ describe Mongoid::Document do
|
|
|
910
842
|
person.save!
|
|
911
843
|
end
|
|
912
844
|
|
|
913
|
-
it
|
|
845
|
+
it 'copies the embedded documents' do
|
|
914
846
|
expect(person.addresses.first).to eq(address)
|
|
915
847
|
end
|
|
916
848
|
|
|
917
|
-
it
|
|
849
|
+
it 'copies the embedded documents only once' do
|
|
918
850
|
expect(person.reload.addresses.length).to eq(1)
|
|
919
851
|
end
|
|
920
852
|
end
|
|
921
853
|
end
|
|
922
854
|
end
|
|
923
855
|
|
|
924
|
-
context
|
|
925
|
-
|
|
856
|
+
context 'when the document has a localize field' do
|
|
926
857
|
let(:manager) do
|
|
927
|
-
Manager.new(title:
|
|
858
|
+
Manager.new(title: 'Sir', desc: 'description')
|
|
928
859
|
end
|
|
929
860
|
|
|
930
861
|
let(:person) do
|
|
931
862
|
manager.becomes(Person)
|
|
932
863
|
end
|
|
933
864
|
|
|
934
|
-
it
|
|
935
|
-
expect(person.desc).to eq(
|
|
865
|
+
it 'copies the localize attribute' do
|
|
866
|
+
expect(person.desc).to eq('description')
|
|
936
867
|
end
|
|
937
868
|
end
|
|
938
869
|
|
|
939
|
-
context
|
|
940
|
-
|
|
870
|
+
context 'when the document is new' do
|
|
941
871
|
let(:person) do
|
|
942
872
|
manager.becomes(Person)
|
|
943
873
|
end
|
|
944
874
|
|
|
945
|
-
it
|
|
875
|
+
it 'copies the state' do
|
|
946
876
|
expect(person).to be_a_new_record
|
|
947
877
|
end
|
|
948
878
|
end
|
|
949
879
|
|
|
950
|
-
context
|
|
951
|
-
|
|
880
|
+
context 'when the document is persisted' do
|
|
952
881
|
before do
|
|
953
882
|
manager.save!
|
|
954
883
|
end
|
|
@@ -957,13 +886,12 @@ describe Mongoid::Document do
|
|
|
957
886
|
manager.becomes(Person)
|
|
958
887
|
end
|
|
959
888
|
|
|
960
|
-
it
|
|
889
|
+
it 'copies the state' do
|
|
961
890
|
expect(person).to be_persisted
|
|
962
891
|
end
|
|
963
892
|
end
|
|
964
893
|
|
|
965
|
-
context
|
|
966
|
-
|
|
894
|
+
context 'when the document is destroyed' do
|
|
967
895
|
before do
|
|
968
896
|
manager.destroy
|
|
969
897
|
end
|
|
@@ -972,35 +900,33 @@ describe Mongoid::Document do
|
|
|
972
900
|
manager.becomes(Person)
|
|
973
901
|
end
|
|
974
902
|
|
|
975
|
-
it
|
|
903
|
+
it 'copies the state' do
|
|
976
904
|
expect(person).to be_destroyed
|
|
977
905
|
end
|
|
978
906
|
end
|
|
979
907
|
|
|
980
|
-
context
|
|
981
|
-
|
|
908
|
+
context 'when the document is dirty' do
|
|
982
909
|
before do
|
|
983
910
|
manager.save!
|
|
984
|
-
manager.ssn =
|
|
911
|
+
manager.ssn = '123-22-1234'
|
|
985
912
|
end
|
|
986
913
|
|
|
987
914
|
let(:person) do
|
|
988
915
|
manager.becomes(Person)
|
|
989
916
|
end
|
|
990
917
|
|
|
991
|
-
it
|
|
992
|
-
expect(person.changes[
|
|
918
|
+
it 'copies over the dirty changes' do
|
|
919
|
+
expect(person.changes['ssn']).to eq([ nil, '123-22-1234' ])
|
|
993
920
|
end
|
|
994
921
|
|
|
995
|
-
it
|
|
996
|
-
expect(person.changes[
|
|
922
|
+
it 'adds the _type change' do
|
|
923
|
+
expect(person.changes['_type']).to eq(%w[Manager Person])
|
|
997
924
|
end
|
|
998
925
|
end
|
|
999
926
|
|
|
1000
|
-
context
|
|
1001
|
-
|
|
927
|
+
context 'when the document is invalid' do
|
|
1002
928
|
before do
|
|
1003
|
-
manager.ssn =
|
|
929
|
+
manager.ssn = '$$$'
|
|
1004
930
|
manager.valid?
|
|
1005
931
|
end
|
|
1006
932
|
|
|
@@ -1008,75 +934,70 @@ describe Mongoid::Document do
|
|
|
1008
934
|
manager.becomes(Person)
|
|
1009
935
|
end
|
|
1010
936
|
|
|
1011
|
-
it
|
|
937
|
+
it 'copies the errors' do
|
|
1012
938
|
expect(person.errors).to include(:ssn)
|
|
1013
939
|
end
|
|
1014
940
|
end
|
|
1015
941
|
end
|
|
1016
942
|
|
|
1017
|
-
context
|
|
1018
|
-
|
|
943
|
+
context 'when casting to a subclass' do
|
|
1019
944
|
let(:person) do
|
|
1020
|
-
Person.new(title:
|
|
945
|
+
Person.new(title: 'Sir')
|
|
1021
946
|
end
|
|
1022
947
|
|
|
1023
|
-
context
|
|
1024
|
-
|
|
948
|
+
context 'when no embedded documents are present' do
|
|
1025
949
|
let(:manager) do
|
|
1026
950
|
person.becomes(Manager)
|
|
1027
951
|
end
|
|
1028
952
|
|
|
1029
|
-
it
|
|
953
|
+
it 'copies attributes' do
|
|
1030
954
|
expect(manager.title).to eq('Sir')
|
|
1031
955
|
end
|
|
1032
956
|
|
|
1033
|
-
it
|
|
957
|
+
it 'keeps the same object id' do
|
|
1034
958
|
expect(manager.id).to eq(person.id)
|
|
1035
959
|
end
|
|
1036
960
|
|
|
1037
|
-
it
|
|
1038
|
-
expect(manager._type).to eq(
|
|
961
|
+
it 'sets the class type' do
|
|
962
|
+
expect(manager._type).to eq('Manager')
|
|
1039
963
|
end
|
|
1040
964
|
|
|
1041
|
-
it
|
|
1042
|
-
expect
|
|
965
|
+
it 'raises an error when inappropriate class is provided' do
|
|
966
|
+
expect do
|
|
1043
967
|
person.becomes(String)
|
|
1044
|
-
|
|
968
|
+
end.to raise_error(ArgumentError)
|
|
1045
969
|
end
|
|
1046
970
|
end
|
|
1047
971
|
|
|
1048
|
-
context
|
|
1049
|
-
|
|
972
|
+
context 'when the document has embedded documents' do
|
|
1050
973
|
let!(:address) do
|
|
1051
|
-
person.addresses.build(street:
|
|
974
|
+
person.addresses.build(street: 'hobrecht')
|
|
1052
975
|
end
|
|
1053
976
|
|
|
1054
977
|
let(:manager) do
|
|
1055
978
|
person.becomes(Manager)
|
|
1056
979
|
end
|
|
1057
980
|
|
|
1058
|
-
it
|
|
981
|
+
it 'copies the embedded documents' do
|
|
1059
982
|
expect(manager.addresses.first).to eq(address)
|
|
1060
983
|
end
|
|
1061
984
|
|
|
1062
|
-
it
|
|
1063
|
-
expect(manager.addresses.first).
|
|
985
|
+
it 'returns new instances' do
|
|
986
|
+
expect(manager.addresses.first).not_to equal(address)
|
|
1064
987
|
end
|
|
1065
988
|
end
|
|
1066
989
|
|
|
1067
|
-
context
|
|
1068
|
-
|
|
990
|
+
context 'when the document is new' do
|
|
1069
991
|
let(:manager) do
|
|
1070
992
|
person.becomes(Manager)
|
|
1071
993
|
end
|
|
1072
994
|
|
|
1073
|
-
it
|
|
995
|
+
it 'copies the state' do
|
|
1074
996
|
expect(manager).to be_a_new_record
|
|
1075
997
|
end
|
|
1076
998
|
end
|
|
1077
999
|
|
|
1078
|
-
context
|
|
1079
|
-
|
|
1000
|
+
context 'when the document is persisted' do
|
|
1080
1001
|
before do
|
|
1081
1002
|
person.save!
|
|
1082
1003
|
end
|
|
@@ -1085,36 +1006,34 @@ describe Mongoid::Document do
|
|
|
1085
1006
|
person.becomes(Manager)
|
|
1086
1007
|
end
|
|
1087
1008
|
|
|
1088
|
-
it
|
|
1009
|
+
it 'copies the state' do
|
|
1089
1010
|
expect(manager).to be_persisted
|
|
1090
1011
|
end
|
|
1091
1012
|
|
|
1092
|
-
context
|
|
1093
|
-
|
|
1013
|
+
context 'when downcasted document is saved' do
|
|
1094
1014
|
before do
|
|
1095
1015
|
manager.save!
|
|
1096
1016
|
end
|
|
1097
1017
|
|
|
1098
|
-
it
|
|
1018
|
+
it 'keeps the type' do
|
|
1099
1019
|
expect(manager).to be_an_instance_of(Manager)
|
|
1100
1020
|
end
|
|
1101
1021
|
|
|
1102
|
-
it
|
|
1103
|
-
expect(manager.changes[
|
|
1022
|
+
it 'copies over the dirty changes' do
|
|
1023
|
+
expect(manager.changes['ssn']).to eq(person.changes['ssn'])
|
|
1104
1024
|
end
|
|
1105
1025
|
|
|
1106
|
-
it
|
|
1026
|
+
it 'can by queried by the parent class' do
|
|
1107
1027
|
expect(Person.find(manager.id)).to be_an_instance_of(Manager)
|
|
1108
1028
|
end
|
|
1109
1029
|
|
|
1110
|
-
it
|
|
1030
|
+
it 'can by queried by the main class' do
|
|
1111
1031
|
expect(Manager.find(manager.id)).to be_an_instance_of(Manager)
|
|
1112
1032
|
end
|
|
1113
1033
|
end
|
|
1114
1034
|
end
|
|
1115
1035
|
|
|
1116
|
-
context
|
|
1117
|
-
|
|
1036
|
+
context 'when the document is destroyed' do
|
|
1118
1037
|
before do
|
|
1119
1038
|
person.destroy
|
|
1120
1039
|
end
|
|
@@ -1123,35 +1042,33 @@ describe Mongoid::Document do
|
|
|
1123
1042
|
person.becomes(Manager)
|
|
1124
1043
|
end
|
|
1125
1044
|
|
|
1126
|
-
it
|
|
1045
|
+
it 'copies the state' do
|
|
1127
1046
|
expect(manager).to be_destroyed
|
|
1128
1047
|
end
|
|
1129
1048
|
end
|
|
1130
1049
|
|
|
1131
|
-
context
|
|
1132
|
-
|
|
1050
|
+
context 'when the document is dirty' do
|
|
1133
1051
|
before do
|
|
1134
1052
|
person.save!
|
|
1135
|
-
person.ssn =
|
|
1053
|
+
person.ssn = '123-22-1234'
|
|
1136
1054
|
end
|
|
1137
1055
|
|
|
1138
1056
|
let(:manager) do
|
|
1139
1057
|
person.becomes(Manager)
|
|
1140
1058
|
end
|
|
1141
1059
|
|
|
1142
|
-
it
|
|
1143
|
-
expect(manager.changes[
|
|
1060
|
+
it 'copies over the dirty changes' do
|
|
1061
|
+
expect(manager.changes['ssn']).to eq([ nil, '123-22-1234' ])
|
|
1144
1062
|
end
|
|
1145
1063
|
|
|
1146
|
-
it
|
|
1147
|
-
expect(manager.changes[
|
|
1064
|
+
it 'adds the _type change' do
|
|
1065
|
+
expect(manager.changes['_type']).to eq(%w[Person Manager])
|
|
1148
1066
|
end
|
|
1149
1067
|
end
|
|
1150
1068
|
|
|
1151
|
-
context
|
|
1152
|
-
|
|
1069
|
+
context 'when the document is invalid' do
|
|
1153
1070
|
before do
|
|
1154
|
-
person.ssn =
|
|
1071
|
+
person.ssn = '$$$'
|
|
1155
1072
|
person.valid?
|
|
1156
1073
|
end
|
|
1157
1074
|
|
|
@@ -1159,99 +1076,90 @@ describe Mongoid::Document do
|
|
|
1159
1076
|
person.becomes(Manager)
|
|
1160
1077
|
end
|
|
1161
1078
|
|
|
1162
|
-
it
|
|
1079
|
+
it 'copies the errors' do
|
|
1163
1080
|
expect(manager.errors).to include(:ssn)
|
|
1164
1081
|
end
|
|
1165
|
-
|
|
1166
1082
|
end
|
|
1167
1083
|
|
|
1168
|
-
context
|
|
1169
|
-
|
|
1084
|
+
context 'when the subclass validates attributes not present on the parent class' do
|
|
1170
1085
|
before do
|
|
1171
|
-
Manager.validates_inclusion_of(:level, in: [1, 2])
|
|
1086
|
+
Manager.validates_inclusion_of(:level, in: [ 1, 2 ])
|
|
1172
1087
|
end
|
|
1173
1088
|
|
|
1174
1089
|
let(:manager) do
|
|
1175
1090
|
person.becomes(Manager)
|
|
1176
1091
|
end
|
|
1177
1092
|
|
|
1178
|
-
it
|
|
1093
|
+
it 'validates the instance of the subclass' do
|
|
1179
1094
|
manager.level = 3
|
|
1180
1095
|
expect(manager.valid?).to be false
|
|
1181
1096
|
end
|
|
1182
1097
|
end
|
|
1183
1098
|
|
|
1184
|
-
context
|
|
1185
|
-
|
|
1099
|
+
context 'when the subclass has defaults' do
|
|
1186
1100
|
let(:manager) do
|
|
1187
1101
|
Person.new(title: 'Sir').becomes(Manager)
|
|
1188
1102
|
end
|
|
1189
1103
|
|
|
1190
|
-
it
|
|
1104
|
+
it 'applies default attributes' do
|
|
1191
1105
|
expect(manager.level).to eq(1)
|
|
1192
1106
|
end
|
|
1193
1107
|
end
|
|
1194
1108
|
end
|
|
1195
1109
|
end
|
|
1196
1110
|
|
|
1197
|
-
context
|
|
1198
|
-
|
|
1111
|
+
context 'when marshalling the document' do
|
|
1199
1112
|
let(:agency) do
|
|
1200
1113
|
Agency.new
|
|
1201
1114
|
end
|
|
1202
1115
|
|
|
1203
1116
|
let!(:agent) do
|
|
1204
|
-
agency.agents.build(title:
|
|
1117
|
+
agency.agents.build(title: 'VIP')
|
|
1205
1118
|
end
|
|
1206
1119
|
|
|
1207
|
-
describe Marshal,
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
expect {
|
|
1120
|
+
describe Marshal, '.dump' do
|
|
1121
|
+
it 'successfully dumps the document' do
|
|
1122
|
+
expect do
|
|
1211
1123
|
Marshal.dump(agency)
|
|
1212
1124
|
Marshal.dump(agent)
|
|
1213
|
-
|
|
1125
|
+
end.not_to raise_error
|
|
1214
1126
|
end
|
|
1215
1127
|
end
|
|
1216
1128
|
|
|
1217
|
-
describe Marshal,
|
|
1218
|
-
|
|
1219
|
-
it "successfully loads the document" do
|
|
1129
|
+
describe Marshal, '.load' do
|
|
1130
|
+
it 'successfully loads the document' do
|
|
1220
1131
|
expect(Marshal.load(Marshal.dump(agency))).to eq(agency)
|
|
1221
1132
|
end
|
|
1222
1133
|
end
|
|
1223
1134
|
end
|
|
1224
1135
|
|
|
1225
|
-
context
|
|
1226
|
-
|
|
1136
|
+
context 'when putting a document in the cache' do
|
|
1227
1137
|
describe ActiveSupport::Cache do
|
|
1228
|
-
|
|
1229
1138
|
let(:cache) do
|
|
1230
1139
|
ActiveSupport::Cache::MemoryStore.new
|
|
1231
1140
|
end
|
|
1232
1141
|
|
|
1233
|
-
describe
|
|
1234
|
-
|
|
1142
|
+
describe '#fetch' do
|
|
1235
1143
|
let(:agency) do
|
|
1236
1144
|
Agency.new
|
|
1237
1145
|
end
|
|
1238
1146
|
|
|
1239
1147
|
let(:agent) do
|
|
1240
|
-
agency.agents.build(title:
|
|
1148
|
+
agency.agents.build(title: 'VIP', address: address)
|
|
1241
1149
|
end
|
|
1242
1150
|
|
|
1243
1151
|
let(:address) do
|
|
1244
1152
|
Address.new(city: 'Berlin')
|
|
1245
1153
|
end
|
|
1246
1154
|
|
|
1247
|
-
it
|
|
1248
|
-
expect(cache.fetch(
|
|
1249
|
-
expect(cache.fetch(
|
|
1155
|
+
it 'stores the parent object' do
|
|
1156
|
+
expect(cache.fetch('key') { agency }).to eq(agency)
|
|
1157
|
+
expect(cache.fetch('key')).to eq(agency)
|
|
1250
1158
|
end
|
|
1251
1159
|
|
|
1252
|
-
it
|
|
1253
|
-
expect(cache.fetch(
|
|
1254
|
-
expect(cache.fetch(
|
|
1160
|
+
it 'stores the embedded object' do
|
|
1161
|
+
expect(cache.fetch('key') { agent }).to eq(agent)
|
|
1162
|
+
expect(cache.fetch('key').address).to eq(agent.address)
|
|
1255
1163
|
end
|
|
1256
1164
|
end
|
|
1257
1165
|
end
|