mongoid 7.4.3 → 8.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +3 -3
- data/Rakefile +25 -0
- data/lib/config/locales/en.yml +52 -28
- data/lib/mongoid/association/accessors.rb +38 -9
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +33 -10
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +28 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +5 -5
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +14 -3
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
- data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +2 -2
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +7 -0
- data/lib/mongoid/attributes/dynamic.rb +3 -3
- data/lib/mongoid/attributes/nested.rb +5 -5
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +1 -1
- data/lib/mongoid/attributes/readonly.rb +2 -2
- data/lib/mongoid/attributes.rb +43 -40
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/changeable.rb +43 -10
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/validators/storage.rb +3 -3
- data/lib/mongoid/config/options.rb +3 -0
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config.rb +62 -17
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +180 -21
- data/lib/mongoid/contextual/mongo.rb +260 -217
- data/lib/mongoid/contextual/none.rb +67 -5
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +7 -4
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +3 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
- data/lib/mongoid/criteria/queryable/optional.rb +5 -11
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
- data/lib/mongoid/criteria/queryable/selector.rb +93 -8
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +16 -35
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +135 -34
- data/lib/mongoid/equality.rb +8 -8
- data/lib/mongoid/errors/document_not_found.rb +33 -12
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +2 -2
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +37 -8
- data/lib/mongoid/extensions/integer.rb +7 -4
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +8 -6
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +55 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +9 -4
- data/lib/mongoid/fields/standard.rb +7 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +233 -40
- data/lib/mongoid/findable.rb +34 -13
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +185 -16
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher.rb +33 -13
- data/lib/mongoid/persistable/creatable.rb +18 -9
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +2 -2
- data/lib/mongoid/persistable/unsettable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +19 -12
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistable.rb +3 -3
- data/lib/mongoid/persistence_context.rb +63 -10
- data/lib/mongoid/query_cache.rb +8 -260
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +10 -8
- data/lib/mongoid/scopable.rb +26 -22
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +10 -6
- data/lib/mongoid/shardable.rb +35 -11
- data/lib/mongoid/stateful.rb +35 -9
- data/lib/mongoid/tasks/database.rb +0 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -4
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +0 -2
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +6 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +2 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -12
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +246 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +1 -17
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
- data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +551 -27
- data/spec/mongoid/cacheable_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/options_spec.rb +1 -0
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +57 -2
- data/spec/mongoid/config_spec.rb +78 -18
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +1336 -69
- data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
- data/spec/mongoid/contextual/none_spec.rb +38 -0
- data/spec/mongoid/copyable_spec.rb +451 -1
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
- data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
- data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +0 -1
- data/spec/mongoid/criteria_spec.rb +475 -1199
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +37 -12
- data/spec/mongoid/fields_spec.rb +364 -50
- data/spec/mongoid/findable_spec.rb +80 -15
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +39 -20
- data/spec/mongoid/interceptable_spec.rb +807 -27
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +50 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +0 -154
- data/spec/mongoid/reloadable_spec.rb +59 -2
- data/spec/mongoid/scopable_spec.rb +54 -16
- data/spec/mongoid/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +157 -51
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +1 -1
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/docker_runner.rb +7 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +36 -40
- data/spec/shared/shlib/server.sh +32 -8
- data/spec/shared/shlib/set_env.sh +4 -4
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +46 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/code.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data.tar.gz.sig +4 -1
- metadata +682 -635
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "spec_helper"
|
4
|
+
require_relative '../embeds_many_models'
|
4
5
|
|
5
6
|
describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
|
6
7
|
|
@@ -507,7 +508,7 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
|
|
507
508
|
end
|
508
509
|
end
|
509
510
|
|
510
|
-
context "when the same class is embedded multiple times" do
|
511
|
+
context "when the same class is embedded multiple times; embeds_one" do
|
511
512
|
|
512
513
|
let(:customer) do
|
513
514
|
Customer.new
|
@@ -516,7 +517,6 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
|
|
516
517
|
context "assignment after saving" do
|
517
518
|
|
518
519
|
it "correctly sets the association for the embedded class" do
|
519
|
-
pending 'MONGOID-5039'
|
520
520
|
|
521
521
|
customer.home_address = CustomerAddress.new
|
522
522
|
customer.work_address = CustomerAddress.new
|
@@ -537,22 +537,82 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
|
|
537
537
|
|
538
538
|
expect(customer.home_address.instance_eval { _association.store_as }).to eq("home_address")
|
539
539
|
expect(customer.work_address.instance_eval { _association.store_as }).to eq("work_address")
|
540
|
+
|
541
|
+
expect(customer.home_address.addressable).to eq(customer)
|
542
|
+
expect(customer.work_address.addressable).to eq(customer)
|
540
543
|
end
|
541
544
|
end
|
542
545
|
|
543
546
|
context "inverse assignment" do
|
544
547
|
|
548
|
+
it "raises an error when trying to set the association" do
|
549
|
+
customer.work_address = CustomerAddress.new
|
550
|
+
|
551
|
+
expect do
|
552
|
+
customer.work_address.addressable = customer
|
553
|
+
end.to raise_error(Mongoid::Errors::InvalidSetPolymorphicRelation)
|
554
|
+
end
|
555
|
+
end
|
556
|
+
|
557
|
+
context "when there is an explicit inverse_of" do
|
558
|
+
|
559
|
+
let(:customer) { EmmCustomer.new }
|
560
|
+
|
545
561
|
it "correctly sets the association for the embedded class" do
|
546
|
-
|
562
|
+
customer.work_address = EmmCustomerAddress.new
|
547
563
|
|
548
|
-
|
549
|
-
|
564
|
+
expect do
|
565
|
+
customer.work_address.addressable = customer
|
566
|
+
end.to_not raise_error
|
550
567
|
|
551
|
-
expect(customer.
|
552
|
-
|
568
|
+
expect(customer.work_address.addressable).to eq(customer)
|
569
|
+
end
|
570
|
+
end
|
571
|
+
end
|
553
572
|
|
554
|
-
|
555
|
-
|
573
|
+
context "when the same class is embedded multiple times; embeds_many" do
|
574
|
+
|
575
|
+
let(:customer) do
|
576
|
+
EmmCustomer.new
|
577
|
+
end
|
578
|
+
|
579
|
+
context "assignment after saving" do
|
580
|
+
|
581
|
+
it "correctly sets the association for the embedded class" do
|
582
|
+
|
583
|
+
customer.close_friends = [EmmFriend.new]
|
584
|
+
customer.acquaintances = [EmmFriend.new]
|
585
|
+
|
586
|
+
expect(customer.close_friends._association.store_as).to eq("close_friends")
|
587
|
+
expect(customer.acquaintances._association.store_as).to eq("acquaintances")
|
588
|
+
|
589
|
+
expect(customer.close_friends[0].instance_eval { _association.store_as }).to eq("close_friends")
|
590
|
+
expect(customer.acquaintances[0].instance_eval { _association.store_as }).to eq("acquaintances")
|
591
|
+
|
592
|
+
customer.save!
|
593
|
+
|
594
|
+
customer.close_friends = [EmmFriend.new]
|
595
|
+
customer.acquaintances = [EmmFriend.new]
|
596
|
+
|
597
|
+
expect(customer.close_friends._association.store_as).to eq("close_friends")
|
598
|
+
expect(customer.acquaintances._association.store_as).to eq("acquaintances")
|
599
|
+
|
600
|
+
expect(customer.close_friends[0].instance_eval { _association.store_as }).to eq("close_friends")
|
601
|
+
expect(customer.acquaintances[0].instance_eval { _association.store_as }).to eq("acquaintances")
|
602
|
+
|
603
|
+
expect(customer.close_friends[0].befriendable).to eq(customer)
|
604
|
+
expect(customer.acquaintances[0].befriendable).to eq(customer)
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
608
|
+
context "inverse assignment" do
|
609
|
+
|
610
|
+
it "raises an error when trying to set the association" do
|
611
|
+
customer.acquaintances = [EmmFriend.new]
|
612
|
+
|
613
|
+
expect do
|
614
|
+
customer.acquaintances[0].befriendable = customer
|
615
|
+
end.to raise_error(Mongoid::Errors::InvalidSetPolymorphicRelation)
|
556
616
|
end
|
557
617
|
end
|
558
618
|
end
|
@@ -103,4 +103,116 @@ describe Mongoid::Association::Embedded::EmbedsMany::Buildable do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
106
|
+
|
107
|
+
context 'when the object is already associated with another object' do
|
108
|
+
|
109
|
+
context "when using <<" do
|
110
|
+
|
111
|
+
let(:person1) do
|
112
|
+
Person.new
|
113
|
+
end
|
114
|
+
|
115
|
+
let(:person2) do
|
116
|
+
Person.new
|
117
|
+
end
|
118
|
+
|
119
|
+
let(:appointment) do
|
120
|
+
Appointment.new
|
121
|
+
end
|
122
|
+
|
123
|
+
before do
|
124
|
+
person1.appointments << appointment
|
125
|
+
person2.appointments << appointment
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'clears the object of its previous association' do
|
129
|
+
expect(person1.appointments).to eq([])
|
130
|
+
expect(person2.appointments).to eq([appointment])
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context "when using concat" do
|
135
|
+
|
136
|
+
let(:person1) do
|
137
|
+
Person.new
|
138
|
+
end
|
139
|
+
|
140
|
+
let(:person2) do
|
141
|
+
Person.new
|
142
|
+
end
|
143
|
+
|
144
|
+
let(:appointment) do
|
145
|
+
Appointment.new
|
146
|
+
end
|
147
|
+
|
148
|
+
before do
|
149
|
+
person1.appointments.concat([appointment])
|
150
|
+
person2.appointments.concat([appointment])
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'clears the object of its previous association' do
|
154
|
+
expect(person1.appointments).to eq([])
|
155
|
+
expect(person2.appointments).to eq([appointment])
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
context "when using =" do
|
160
|
+
|
161
|
+
let(:person1) do
|
162
|
+
Person.new
|
163
|
+
end
|
164
|
+
|
165
|
+
let(:person2) do
|
166
|
+
Person.new
|
167
|
+
end
|
168
|
+
|
169
|
+
let(:appointment) do
|
170
|
+
Appointment.new
|
171
|
+
end
|
172
|
+
|
173
|
+
let(:apts) { [ appointment ] }
|
174
|
+
|
175
|
+
before do
|
176
|
+
person1.appointments = apts
|
177
|
+
person2.appointments = apts
|
178
|
+
expect(apts).to eq([ appointment ])
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'clears the object of its previous association' do
|
182
|
+
expect(person1.appointments).to eq([])
|
183
|
+
expect(person2.appointments).to eq([appointment])
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context "when using = on the same document twice" do
|
188
|
+
|
189
|
+
let(:person1) do
|
190
|
+
Person.new
|
191
|
+
end
|
192
|
+
|
193
|
+
let(:person2) do
|
194
|
+
Person.new
|
195
|
+
end
|
196
|
+
|
197
|
+
let(:appointment1) do
|
198
|
+
Appointment.new
|
199
|
+
end
|
200
|
+
|
201
|
+
let(:appointment2) do
|
202
|
+
Appointment.new
|
203
|
+
end
|
204
|
+
|
205
|
+
let(:apts) { [ appointment1, appointment2 ] }
|
206
|
+
|
207
|
+
before do
|
208
|
+
person1.appointments = apts
|
209
|
+
person1.appointments = person1.appointments.reverse
|
210
|
+
expect(apts).to eq([ appointment1, appointment2 ])
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'clears the object of its previous association' do
|
214
|
+
expect(person1.appointments).to eq([ appointment2, appointment1 ])
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
106
218
|
end
|
@@ -1862,51 +1862,56 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
1862
1862
|
end
|
1863
1863
|
end
|
1864
1864
|
|
1865
|
-
|
1865
|
+
%i[ delete delete_one ].each do |method|
|
1866
|
+
describe "\##{method}" do
|
1867
|
+
let(:address_one) { Address.new(street: "first") }
|
1868
|
+
let(:address_two) { Address.new(street: "second") }
|
1866
1869
|
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
|
1871
|
-
let(:address_one) do
|
1872
|
-
Address.new(street: "first")
|
1873
|
-
end
|
1870
|
+
before do
|
1871
|
+
person.addresses << [ address_one, address_two ]
|
1872
|
+
end
|
1874
1873
|
|
1875
|
-
|
1876
|
-
|
1877
|
-
|
1874
|
+
shared_examples_for 'deleting from the collection' do
|
1875
|
+
context 'when the document exists in the relation' do
|
1876
|
+
let!(:deleted) do
|
1877
|
+
person.addresses.send(method, address_one)
|
1878
|
+
end
|
1878
1879
|
|
1879
|
-
|
1880
|
-
|
1881
|
-
|
1880
|
+
it 'deletes the document' do
|
1881
|
+
expect(person.addresses).to eq([ address_two ])
|
1882
|
+
expect(person.reload.addresses).to eq([ address_two ]) if person.persisted?
|
1883
|
+
end
|
1882
1884
|
|
1883
|
-
|
1885
|
+
it 'deletes the document from the unscoped' do
|
1886
|
+
expect(person.addresses.send(:_unscoped)).to eq([ address_two ])
|
1887
|
+
end
|
1884
1888
|
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1889
|
+
it 'reindexes the relation' do
|
1890
|
+
expect(address_two._index).to eq(0)
|
1891
|
+
end
|
1888
1892
|
|
1889
|
-
|
1890
|
-
|
1891
|
-
|
1893
|
+
it 'returns the document' do
|
1894
|
+
expect(deleted).to eq(address_one)
|
1895
|
+
end
|
1896
|
+
end
|
1892
1897
|
|
1893
|
-
|
1894
|
-
|
1898
|
+
context 'when the document does not exist' do
|
1899
|
+
it 'returns nil' do
|
1900
|
+
expect(person.addresses.send(method, Address.new)).to be_nil
|
1901
|
+
end
|
1902
|
+
end
|
1895
1903
|
end
|
1896
1904
|
|
1897
|
-
|
1898
|
-
|
1899
|
-
end
|
1905
|
+
context 'when the root document is unpersisted' do
|
1906
|
+
let(:person) { Person.new }
|
1900
1907
|
|
1901
|
-
|
1902
|
-
expect(deleted).to eq(address_one)
|
1908
|
+
it_behaves_like 'deleting from the collection'
|
1903
1909
|
end
|
1904
|
-
end
|
1905
1910
|
|
1906
|
-
|
1911
|
+
context 'when the root document is persisted' do
|
1912
|
+
let(:person) { Person.create }
|
1907
1913
|
|
1908
|
-
|
1909
|
-
expect(person.addresses.delete(Address.new)).to be_nil
|
1914
|
+
it_behaves_like 'deleting from the collection'
|
1910
1915
|
end
|
1911
1916
|
end
|
1912
1917
|
end
|
@@ -2210,6 +2215,79 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
2210
2215
|
end
|
2211
2216
|
end
|
2212
2217
|
end
|
2218
|
+
|
2219
|
+
context "when modifying the document beforehand" do
|
2220
|
+
let(:parent) { EmmParent.new }
|
2221
|
+
|
2222
|
+
before do
|
2223
|
+
|
2224
|
+
parent.blocks << EmmBlock.new(name: 'test', children: [size: 1, order: 1])
|
2225
|
+
parent.save!
|
2226
|
+
|
2227
|
+
parent.blocks[0].children[0].assign_attributes(size: 2)
|
2228
|
+
|
2229
|
+
parent.blocks.destroy_all(:name => 'test')
|
2230
|
+
end
|
2231
|
+
|
2232
|
+
it "deletes the correct document in the database" do
|
2233
|
+
expect(parent.reload.blocks.length).to eq(0)
|
2234
|
+
end
|
2235
|
+
end
|
2236
|
+
|
2237
|
+
context "when nil _id" do
|
2238
|
+
let(:parent) { EmmParent.new }
|
2239
|
+
|
2240
|
+
before do
|
2241
|
+
parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
|
2242
|
+
parent.blocks << EmmBlock.new(_id: nil, name: 'test2', children: [size: 1, order: 1])
|
2243
|
+
parent.save!
|
2244
|
+
|
2245
|
+
parent.blocks.destroy_all(:name => 'test')
|
2246
|
+
end
|
2247
|
+
|
2248
|
+
it "deletes only the matching documents in the database" do
|
2249
|
+
expect(parent.reload.blocks.length).to eq(1)
|
2250
|
+
end
|
2251
|
+
end
|
2252
|
+
|
2253
|
+
# Since without an _id field we must us a $pullAll with the attributes of
|
2254
|
+
# the embedded document, if you modify it beforehand, the query will not
|
2255
|
+
# be able to find the correct document to pull.
|
2256
|
+
context "when modifying the document with nil _id" do
|
2257
|
+
let(:parent) { EmmParent.new }
|
2258
|
+
|
2259
|
+
before do
|
2260
|
+
parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
|
2261
|
+
parent.blocks << EmmBlock.new(_id: nil, name: 'test2', children: [size: 1, order: 1])
|
2262
|
+
parent.save!
|
2263
|
+
|
2264
|
+
parent.blocks[0].children[0].assign_attributes(size: 2)
|
2265
|
+
|
2266
|
+
parent.blocks.destroy_all(:name => 'test')
|
2267
|
+
end
|
2268
|
+
|
2269
|
+
it "does not delete the correct documents" do
|
2270
|
+
expect(parent.reload.blocks.length).to eq(2)
|
2271
|
+
end
|
2272
|
+
end
|
2273
|
+
|
2274
|
+
context "when documents with and without _id" do
|
2275
|
+
let(:parent) { EmmParent.new }
|
2276
|
+
|
2277
|
+
before do
|
2278
|
+
parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
|
2279
|
+
parent.blocks << EmmBlock.new(name: 'test', children: [size: 1, order: 1])
|
2280
|
+
parent.save!
|
2281
|
+
|
2282
|
+
parent.blocks[1].children[0].assign_attributes(size: 2)
|
2283
|
+
|
2284
|
+
parent.blocks.destroy_all(:name => 'test')
|
2285
|
+
end
|
2286
|
+
|
2287
|
+
it "does not delete the correct documents" do
|
2288
|
+
expect(parent.reload.blocks.length).to eq(0)
|
2289
|
+
end
|
2290
|
+
end
|
2213
2291
|
end
|
2214
2292
|
end
|
2215
2293
|
|
@@ -2287,7 +2365,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
2287
2365
|
it "raises an error" do
|
2288
2366
|
expect {
|
2289
2367
|
person.addresses.find(BSON::ObjectId.new)
|
2290
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
2368
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
|
2291
2369
|
end
|
2292
2370
|
end
|
2293
2371
|
|
@@ -2336,7 +2414,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
2336
2414
|
it "raises an error" do
|
2337
2415
|
expect {
|
2338
2416
|
person.addresses.find([ BSON::ObjectId.new ])
|
2339
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
2417
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
|
2340
2418
|
end
|
2341
2419
|
end
|
2342
2420
|
|
@@ -3461,7 +3539,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
3461
3539
|
|
3462
3540
|
describe "replacing the entire embedded list" do
|
3463
3541
|
|
3464
|
-
context "when an embeds many relationship contains
|
3542
|
+
context "when an embeds many relationship contains nil as the first item" do
|
3465
3543
|
|
3466
3544
|
let(:person) do
|
3467
3545
|
Person.create!
|
@@ -3482,7 +3560,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
3482
3560
|
end
|
3483
3561
|
end
|
3484
3562
|
|
3485
|
-
context "when an embeds many relationship contains
|
3563
|
+
context "when an embeds many relationship contains nil in the middle of the list" do
|
3486
3564
|
|
3487
3565
|
let(:person) do
|
3488
3566
|
Person.create!
|
@@ -3503,7 +3581,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
3503
3581
|
end
|
3504
3582
|
end
|
3505
3583
|
|
3506
|
-
context "when an embeds many relationship contains
|
3584
|
+
context "when an embeds many relationship contains nil at the end of the list" do
|
3507
3585
|
|
3508
3586
|
let(:person) do
|
3509
3587
|
Person.create!
|
@@ -3527,7 +3605,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
3527
3605
|
|
3528
3606
|
describe "appending to the embedded list" do
|
3529
3607
|
|
3530
|
-
context "when appending
|
3608
|
+
context "when appending nil to the first position in an embedded list" do
|
3531
3609
|
|
3532
3610
|
let(:person) do
|
3533
3611
|
Person.create! phone_numbers: []
|
@@ -3546,7 +3624,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
3546
3624
|
end
|
3547
3625
|
end
|
3548
3626
|
|
3549
|
-
context "when appending
|
3627
|
+
context "when appending nil into the middle of an embedded list" do
|
3550
3628
|
|
3551
3629
|
let(:person) do
|
3552
3630
|
Person.create! phone_numbers: []
|
@@ -3565,7 +3643,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
3565
3643
|
end
|
3566
3644
|
end
|
3567
3645
|
|
3568
|
-
context "when appending
|
3646
|
+
context "when appending nil to the end of an embedded list" do
|
3569
3647
|
|
3570
3648
|
let(:person) do
|
3571
3649
|
Person.create! phone_numbers: []
|
@@ -3960,6 +4038,28 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
3960
4038
|
end
|
3961
4039
|
end
|
3962
4040
|
|
4041
|
+
context "when destroying a document with multiple nil _ids" do
|
4042
|
+
let(:congress) { EmmCongress.create! }
|
4043
|
+
|
4044
|
+
before do
|
4045
|
+
congress.legislators << EmmLegislator.new(_id: nil, a: 1)
|
4046
|
+
congress.legislators << EmmLegislator.new(_id: nil, a: 2)
|
4047
|
+
|
4048
|
+
congress.legislators[0].destroy
|
4049
|
+
end
|
4050
|
+
|
4051
|
+
it "deletes the correct document locally" do
|
4052
|
+
pending "MONGOID-5394"
|
4053
|
+
expect(congress.legislators.length).to eq(1)
|
4054
|
+
expect(congress.legislators.first.a).to eq(1)
|
4055
|
+
end
|
4056
|
+
|
4057
|
+
it "only deletes the one document" do
|
4058
|
+
pending "MONGOID-5394"
|
4059
|
+
expect(congress.reload.legislators.length).to eq(1)
|
4060
|
+
end
|
4061
|
+
end
|
4062
|
+
|
3963
4063
|
context "when adding a document" do
|
3964
4064
|
|
3965
4065
|
let(:person) do
|
@@ -4651,6 +4751,55 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
4651
4751
|
end
|
4652
4752
|
end
|
4653
4753
|
|
4754
|
+
context "when trying to persist the empty list" do
|
4755
|
+
|
4756
|
+
context "in an embeds_many relation" do
|
4757
|
+
|
4758
|
+
let(:band) { Band.create! }
|
4759
|
+
|
4760
|
+
before do
|
4761
|
+
band.labels = []
|
4762
|
+
band.save!
|
4763
|
+
end
|
4764
|
+
|
4765
|
+
let(:reloaded_band) { Band.collection.find(_id: band._id).first }
|
4766
|
+
|
4767
|
+
it "persists the empty list" do
|
4768
|
+
expect(reloaded_band).to have_key(:labels)
|
4769
|
+
expect(reloaded_band[:labels]).to eq []
|
4770
|
+
end
|
4771
|
+
end
|
4772
|
+
|
4773
|
+
context "in a nested embeds_many relation" do
|
4774
|
+
|
4775
|
+
let(:survey) { Survey.create!(questions: [Question.new]) }
|
4776
|
+
|
4777
|
+
before do
|
4778
|
+
survey.questions.first.answers = []
|
4779
|
+
survey.save!
|
4780
|
+
end
|
4781
|
+
|
4782
|
+
let(:reloaded_survey) { Survey.collection.find(_id: survey._id).first }
|
4783
|
+
|
4784
|
+
it "persists the empty list" do
|
4785
|
+
expect(reloaded_survey).to have_key(:questions)
|
4786
|
+
expect(reloaded_survey[:questions][0]).to have_key(:answers)
|
4787
|
+
expect(reloaded_survey[:questions][0][:answers]).to eq []
|
4788
|
+
end
|
4789
|
+
end
|
4790
|
+
|
4791
|
+
context "when not setting the embeds_many field" do
|
4792
|
+
|
4793
|
+
let(:band) { Band.create! }
|
4794
|
+
|
4795
|
+
let(:reloaded_band) { Band.collection.find(_id: band._id).first }
|
4796
|
+
|
4797
|
+
it "does not persist the empty list" do
|
4798
|
+
expect(reloaded_band).to_not have_key(:labels)
|
4799
|
+
end
|
4800
|
+
end
|
4801
|
+
end
|
4802
|
+
|
4654
4803
|
context "when using assign_attributes with an already populated array" do
|
4655
4804
|
let(:post) { EmmPost.create! }
|
4656
4805
|
|
@@ -4670,4 +4819,50 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
4670
4819
|
expect(post.company_tags.first.title).to eq("c")
|
4671
4820
|
end
|
4672
4821
|
end
|
4822
|
+
|
4823
|
+
context "when the parent fails validation" do
|
4824
|
+
let(:school) { EmmSchool.new }
|
4825
|
+
let(:student) { school.students.new }
|
4826
|
+
|
4827
|
+
before do
|
4828
|
+
student.save
|
4829
|
+
end
|
4830
|
+
|
4831
|
+
it "does not mark the parent as persisted" do
|
4832
|
+
expect(school.persisted?).to be false
|
4833
|
+
end
|
4834
|
+
|
4835
|
+
it "does not mark the child as persisted" do
|
4836
|
+
expect(student.persisted?).to be false
|
4837
|
+
end
|
4838
|
+
|
4839
|
+
it "does not persist the parent" do
|
4840
|
+
expect(School.count).to eq(0)
|
4841
|
+
end
|
4842
|
+
end
|
4843
|
+
|
4844
|
+
context "when doing assign_attributes then assignment" do
|
4845
|
+
|
4846
|
+
let(:post) do
|
4847
|
+
EmmPost.create!(
|
4848
|
+
company_tags: [ EmmCompanyTag.new(title: "1"), EmmCompanyTag.new(title: "1") ],
|
4849
|
+
user_tags: [ EmmUserTag.new(title: "1"), EmmUserTag.new(title: "1") ]
|
4850
|
+
)
|
4851
|
+
end
|
4852
|
+
|
4853
|
+
let(:from_db) { EmmPost.find(post.id) }
|
4854
|
+
|
4855
|
+
before do
|
4856
|
+
post.assign_attributes(
|
4857
|
+
company_tags: [ EmmCompanyTag.new(title: '3'), EmmCompanyTag.new(title: '4') ]
|
4858
|
+
)
|
4859
|
+
post.user_tags = [ EmmUserTag.new(title: '3'), EmmUserTag.new(title: '4') ]
|
4860
|
+
post.save!
|
4861
|
+
end
|
4862
|
+
|
4863
|
+
it "persists the associations correctly" do
|
4864
|
+
expect(from_db.user_tags.size).to eq(2)
|
4865
|
+
expect(from_db.company_tags.size).to eq(2)
|
4866
|
+
end
|
4867
|
+
end
|
4673
4868
|
end
|
@@ -188,3 +188,39 @@ class EmmUserTag
|
|
188
188
|
embedded_in :post, class_name: "EmmPost"
|
189
189
|
end
|
190
190
|
|
191
|
+
class EmmSchool
|
192
|
+
include Mongoid::Document
|
193
|
+
|
194
|
+
embeds_many :students, class_name: "EmmStudent"
|
195
|
+
|
196
|
+
field :name, type: :string
|
197
|
+
|
198
|
+
validates :name, presence: true
|
199
|
+
end
|
200
|
+
|
201
|
+
class EmmStudent
|
202
|
+
include Mongoid::Document
|
203
|
+
|
204
|
+
embedded_in :school, class_name: "EmmSchool"
|
205
|
+
end
|
206
|
+
|
207
|
+
class EmmParent
|
208
|
+
include Mongoid::Document
|
209
|
+
embeds_many :blocks, class_name: "EmmBlock"
|
210
|
+
end
|
211
|
+
|
212
|
+
class EmmBlock
|
213
|
+
include Mongoid::Document
|
214
|
+
field :name, type: String
|
215
|
+
embeds_many :children, class_name: "EmmChild"
|
216
|
+
end
|
217
|
+
|
218
|
+
class EmmChild
|
219
|
+
include Mongoid::Document
|
220
|
+
embedded_in :block, class_name: "EmmBlock"
|
221
|
+
|
222
|
+
field :size, type: Integer
|
223
|
+
field :order, type: Integer
|
224
|
+
field :t
|
225
|
+
end
|
226
|
+
|
@@ -47,5 +47,17 @@ describe Mongoid::Association::Embedded::EmbedsMany do
|
|
47
47
|
expect(patient.addresses.first.number).to eq(123)
|
48
48
|
end
|
49
49
|
end
|
50
|
+
|
51
|
+
context "when excluding the relation" do
|
52
|
+
let(:congress) do
|
53
|
+
EmmCongress.where(name: 'foo').only(:_id).first
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'raises a MissingAttributeError' do
|
57
|
+
expect do
|
58
|
+
congress.legislators
|
59
|
+
end.to raise_error(ActiveModel::MissingAttributeError)
|
60
|
+
end
|
61
|
+
end
|
50
62
|
end
|
51
63
|
end
|