mongoid 7.0.2 → 8.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +33 -33
- data/LICENSE +1 -0
- data/README.md +34 -20
- data/Rakefile +100 -5
- data/lib/config/locales/en.yml +220 -105
- data/lib/mongoid/association/accessors.rb +176 -84
- data/lib/mongoid/association/bindable.rb +57 -28
- data/lib/mongoid/association/builders.rb +9 -15
- data/lib/mongoid/association/constrainable.rb +5 -7
- data/lib/mongoid/association/depending.rb +9 -18
- data/lib/mongoid/association/eager_loadable.rb +31 -10
- data/lib/mongoid/association/embedded/batchable.rb +68 -54
- data/lib/mongoid/association/embedded/cyclic.rb +10 -17
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +9 -6
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +16 -25
- data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +10 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +156 -135
- data/lib/mongoid/association/embedded/embeds_many.rb +10 -37
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +27 -10
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +64 -30
- data/lib/mongoid/association/embedded/embeds_one.rb +11 -34
- data/lib/mongoid/association/embedded.rb +2 -0
- data/lib/mongoid/association/macros.rb +65 -41
- data/lib/mongoid/association/many.rb +25 -35
- data/lib/mongoid/association/marshalable.rb +3 -6
- data/lib/mongoid/association/nested/many.rb +22 -30
- data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
- data/lib/mongoid/association/nested/one.rb +57 -30
- data/lib/mongoid/association/nested.rb +3 -3
- data/lib/mongoid/association/one.rb +5 -12
- data/lib/mongoid/association/options.rb +16 -46
- data/lib/mongoid/association/proxy.rb +52 -40
- data/lib/mongoid/association/referenced/auto_save.rb +9 -14
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
- data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
- data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
- data/lib/mongoid/association/referenced/eager.rb +42 -38
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +106 -67
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
- data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
- data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
- data/lib/mongoid/association/referenced/has_many/proxy.rb +104 -127
- data/lib/mongoid/association/referenced/has_many.rb +21 -45
- data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
- data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
- data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
- data/lib/mongoid/association/referenced/has_one.rb +16 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -26
- data/lib/mongoid/association/referenced.rb +2 -0
- data/lib/mongoid/association/reflections.rb +7 -6
- data/lib/mongoid/association/relatable.rb +149 -89
- data/lib/mongoid/association.rb +13 -27
- data/lib/mongoid/atomic/modifiers.rb +29 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
- data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
- data/lib/mongoid/atomic/paths/embedded.rb +3 -4
- data/lib/mongoid/atomic/paths/root.rb +4 -7
- data/lib/mongoid/atomic/paths.rb +2 -1
- data/lib/mongoid/atomic.rb +49 -47
- data/lib/mongoid/attributes/dynamic.rb +22 -36
- data/lib/mongoid/attributes/nested.rb +12 -15
- data/lib/mongoid/attributes/processing.rb +19 -27
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +6 -9
- data/lib/mongoid/attributes.rb +103 -100
- data/lib/mongoid/cacheable.rb +7 -10
- data/lib/mongoid/changeable.rb +152 -73
- data/lib/mongoid/clients/factory.rb +42 -17
- data/lib/mongoid/clients/options.rb +21 -18
- data/lib/mongoid/clients/sessions.rb +10 -10
- data/lib/mongoid/clients/storage_options.rb +9 -17
- data/lib/mongoid/clients/validators/storage.rb +5 -24
- data/lib/mongoid/clients/validators.rb +2 -1
- data/lib/mongoid/clients.rb +3 -10
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +7 -9
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/environment.rb +51 -13
- data/lib/mongoid/config/options.rb +20 -23
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +8 -23
- data/lib/mongoid/config/validators/option.rb +2 -3
- data/lib/mongoid/config/validators.rb +3 -1
- data/lib/mongoid/config.rb +235 -48
- data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
- data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
- data/lib/mongoid/contextual/aggregable/none.rb +65 -0
- data/lib/mongoid/contextual/aggregable.rb +17 -0
- data/lib/mongoid/contextual/atomic.rb +29 -31
- data/lib/mongoid/contextual/command.rb +2 -5
- data/lib/mongoid/contextual/geo_near.rb +13 -44
- data/lib/mongoid/contextual/map_reduce.rb +7 -35
- data/lib/mongoid/contextual/memory.rb +387 -81
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +641 -283
- data/lib/mongoid/contextual/none.rb +264 -31
- data/lib/mongoid/contextual/queryable.rb +3 -4
- data/lib/mongoid/contextual.rb +21 -11
- data/lib/mongoid/copyable.rb +46 -17
- data/lib/mongoid/criteria/findable.rb +20 -20
- data/lib/mongoid/criteria/includable.rb +32 -34
- data/lib/mongoid/criteria/inspectable.rb +2 -3
- data/lib/mongoid/criteria/marshalable.rb +12 -7
- data/lib/mongoid/criteria/modifiable.rb +15 -21
- data/lib/mongoid/criteria/options.rb +4 -5
- data/lib/mongoid/criteria/permission.rb +3 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
- data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +12 -19
- data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +10 -10
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +19 -7
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
- data/lib/mongoid/criteria/queryable/key.rb +105 -31
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +205 -44
- data/lib/mongoid/criteria/queryable/optional.rb +16 -65
- data/lib/mongoid/criteria/queryable/options.rb +4 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
- data/lib/mongoid/criteria/queryable/selectable.rb +471 -168
- data/lib/mongoid/criteria/queryable/selector.rb +133 -58
- data/lib/mongoid/criteria/queryable/smash.rb +42 -18
- data/lib/mongoid/criteria/queryable/storable.rb +237 -0
- data/lib/mongoid/criteria/queryable.rb +18 -15
- data/lib/mongoid/criteria/scopable.rb +29 -21
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +106 -111
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +162 -103
- data/lib/mongoid/equality.rb +35 -18
- data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
- data/lib/mongoid/errors/callback.rb +2 -3
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
- data/lib/mongoid/errors/delete_restriction.rb +10 -13
- data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
- data/lib/mongoid/errors/document_not_found.rb +35 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/empty_config_file.rb +25 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_collection.rb +2 -1
- data/lib/mongoid/errors/invalid_config_file.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +3 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
- data/lib/mongoid/errors/invalid_field.rb +8 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_field_option.rb +2 -3
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_find.rb +2 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_includes.rb +2 -3
- data/lib/mongoid/errors/invalid_index.rb +2 -3
- data/lib/mongoid/errors/invalid_options.rb +4 -5
- data/lib/mongoid/errors/invalid_path.rb +2 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
- data/lib/mongoid/errors/invalid_query.rb +40 -0
- data/lib/mongoid/errors/invalid_relation.rb +5 -10
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
- data/lib/mongoid/errors/invalid_scope.rb +2 -3
- data/lib/mongoid/errors/invalid_session_use.rb +3 -6
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
- data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
- data/lib/mongoid/errors/invalid_storage_parent.rb +4 -3
- data/lib/mongoid/errors/invalid_time.rb +2 -3
- data/lib/mongoid/errors/inverse_not_found.rb +3 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
- data/lib/mongoid/errors/mixed_relations.rb +2 -3
- data/lib/mongoid/errors/mongoid_error.rb +6 -13
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
- data/lib/mongoid/errors/no_client_config.rb +4 -5
- data/lib/mongoid/errors/no_client_database.rb +3 -4
- data/lib/mongoid/errors/no_client_hosts.rb +3 -4
- data/lib/mongoid/errors/no_clients_config.rb +2 -3
- data/lib/mongoid/errors/no_default_client.rb +3 -4
- data/lib/mongoid/errors/no_environment.rb +2 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
- data/lib/mongoid/errors/no_metadata.rb +2 -3
- data/lib/mongoid/errors/no_parent.rb +2 -3
- data/lib/mongoid/errors/readonly_attribute.rb +3 -4
- data/lib/mongoid/errors/readonly_document.rb +3 -6
- data/lib/mongoid/errors/scope_overwrite.rb +2 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
- data/lib/mongoid/errors/unknown_attribute.rb +3 -4
- data/lib/mongoid/errors/unknown_model.rb +2 -3
- data/lib/mongoid/errors/unsaved_document.rb +3 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
- data/lib/mongoid/errors/validations.rb +2 -1
- data/lib/mongoid/errors.rb +18 -4
- data/lib/mongoid/evolvable.rb +4 -5
- data/lib/mongoid/extensions/array.rb +37 -44
- data/lib/mongoid/extensions/big_decimal.rb +35 -21
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +10 -6
- data/lib/mongoid/extensions/date.rb +32 -25
- data/lib/mongoid/extensions/date_time.rb +5 -13
- data/lib/mongoid/extensions/decimal128.rb +2 -5
- data/lib/mongoid/extensions/false_class.rb +5 -8
- data/lib/mongoid/extensions/float.rb +12 -14
- data/lib/mongoid/extensions/hash.rb +64 -42
- data/lib/mongoid/extensions/integer.rb +12 -16
- data/lib/mongoid/extensions/module.rb +3 -4
- data/lib/mongoid/extensions/nil_class.rb +2 -5
- data/lib/mongoid/extensions/object.rb +27 -52
- data/lib/mongoid/extensions/object_id.rb +2 -7
- data/lib/mongoid/extensions/range.rb +42 -20
- data/lib/mongoid/extensions/regexp.rb +14 -7
- data/lib/mongoid/extensions/set.rb +13 -11
- data/lib/mongoid/extensions/string.rb +35 -64
- data/lib/mongoid/extensions/symbol.rb +6 -22
- data/lib/mongoid/extensions/time.rb +38 -22
- data/lib/mongoid/extensions/time_with_zone.rb +26 -9
- data/lib/mongoid/extensions/true_class.rb +5 -8
- data/lib/mongoid/extensions.rb +19 -3
- data/lib/mongoid/factory.rb +104 -17
- data/lib/mongoid/fields/foreign_key.rb +14 -26
- data/lib/mongoid/fields/localized.rb +21 -15
- data/lib/mongoid/fields/standard.rb +23 -43
- data/lib/mongoid/fields/validators/macro.rb +32 -20
- data/lib/mongoid/fields/validators.rb +2 -1
- data/lib/mongoid/fields.rb +349 -76
- data/lib/mongoid/findable.rb +115 -34
- data/lib/mongoid/indexable/specification.rb +5 -18
- data/lib/mongoid/indexable/validators/options.rb +8 -9
- data/lib/mongoid/indexable.rb +6 -21
- data/lib/mongoid/inspectable.rb +4 -11
- data/lib/mongoid/interceptable.rb +85 -41
- data/lib/mongoid/loggable.rb +13 -16
- data/lib/mongoid/matchable.rb +4 -154
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/bits.rb +41 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_all_set.rb +20 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_any_set.rb +20 -0
- data/lib/mongoid/matcher/elem_match.rb +36 -0
- data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
- data/lib/mongoid/matcher/eq.rb +11 -0
- data/lib/mongoid/matcher/eq_impl.rb +67 -0
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +35 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +62 -0
- data/lib/mongoid/matcher/field_operator.rb +54 -0
- data/lib/mongoid/matcher/gt.rb +17 -0
- data/lib/mongoid/matcher/gte.rb +17 -0
- data/lib/mongoid/matcher/in.rb +25 -0
- data/lib/mongoid/matcher/lt.rb +17 -0
- data/lib/mongoid/matcher/lte.rb +17 -0
- data/lib/mongoid/matcher/mod.rb +17 -0
- data/lib/mongoid/matcher/ne.rb +16 -0
- data/lib/mongoid/matcher/nin.rb +11 -0
- data/lib/mongoid/matcher/nor.rb +25 -0
- data/lib/mongoid/matcher/not.rb +29 -0
- data/lib/mongoid/matcher/or.rb +21 -0
- data/lib/mongoid/matcher/regex.rb +41 -0
- data/lib/mongoid/matcher/size.rb +26 -0
- data/lib/mongoid/matcher/type.rb +99 -0
- data/lib/mongoid/matcher.rb +130 -0
- data/lib/mongoid/persistable/creatable.rb +23 -30
- data/lib/mongoid/persistable/deletable.rb +7 -23
- data/lib/mongoid/persistable/destroyable.rb +12 -11
- data/lib/mongoid/persistable/incrementable.rb +6 -7
- data/lib/mongoid/persistable/logical.rb +4 -6
- data/lib/mongoid/persistable/poppable.rb +3 -6
- data/lib/mongoid/persistable/pullable.rb +3 -8
- data/lib/mongoid/persistable/pushable.rb +14 -10
- data/lib/mongoid/persistable/renamable.rb +10 -8
- data/lib/mongoid/persistable/savable.rb +16 -9
- data/lib/mongoid/persistable/settable.rb +3 -6
- data/lib/mongoid/persistable/unsettable.rb +10 -10
- data/lib/mongoid/persistable/updatable.rb +99 -30
- data/lib/mongoid/persistable/upsertable.rb +23 -9
- data/lib/mongoid/persistable.rb +138 -40
- data/lib/mongoid/persistence_context.rb +107 -52
- data/lib/mongoid/positional.rb +3 -6
- data/lib/mongoid/query_cache.rb +18 -234
- data/lib/mongoid/railtie.rb +20 -16
- data/lib/mongoid/railties/controller_runtime.rb +88 -0
- data/lib/mongoid/railties/database.rake +16 -2
- data/lib/mongoid/reloadable.rb +19 -22
- data/lib/mongoid/scopable.rb +37 -60
- data/lib/mongoid/selectable.rb +8 -18
- data/lib/mongoid/serializable.rb +33 -34
- data/lib/mongoid/shardable.rb +108 -21
- data/lib/mongoid/stateful.rb +60 -20
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +24 -5
- data/lib/mongoid/tasks/database.rb +105 -7
- data/lib/mongoid/threaded/lifecycle.rb +7 -26
- data/lib/mongoid/threaded.rb +80 -67
- data/lib/mongoid/timestamps/created/short.rb +2 -1
- data/lib/mongoid/timestamps/created.rb +4 -3
- data/lib/mongoid/timestamps/short.rb +2 -1
- data/lib/mongoid/timestamps/timeless.rb +6 -9
- data/lib/mongoid/timestamps/updated/short.rb +2 -1
- data/lib/mongoid/timestamps/updated.rb +5 -6
- data/lib/mongoid/timestamps.rb +3 -2
- data/lib/mongoid/touchable.rb +54 -25
- data/lib/mongoid/traversable.rb +185 -61
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +5 -6
- data/lib/mongoid/validatable/format.rb +2 -1
- data/lib/mongoid/validatable/length.rb +2 -1
- data/lib/mongoid/validatable/localizable.rb +3 -4
- data/lib/mongoid/validatable/macros.rb +8 -15
- data/lib/mongoid/validatable/presence.rb +10 -15
- data/lib/mongoid/validatable/queryable.rb +2 -3
- data/lib/mongoid/validatable/uniqueness.rb +30 -42
- data/lib/mongoid/validatable.rb +16 -32
- data/lib/mongoid/version.rb +3 -2
- data/lib/mongoid/warnings.rb +44 -0
- data/lib/mongoid.rb +50 -17
- data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
- data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/mongoid_generator.rb +2 -1
- data/lib/rails/mongoid.rb +4 -5
- data/spec/README.md +33 -0
- data/spec/config/mongoid.yml +29 -3
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +345 -0
- data/spec/integration/associations/belongs_to_spec.rb +33 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
- data/spec/integration/associations/embedded_spec.rb +283 -0
- data/spec/integration/associations/embeds_many_spec.rb +219 -0
- data/spec/integration/associations/embeds_one_spec.rb +41 -0
- data/spec/integration/associations/foreign_key_spec.rb +107 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_many_spec.rb +128 -0
- data/spec/integration/associations/has_one_spec.rb +272 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
- data/spec/integration/associations/reverse_population_spec.rb +34 -0
- data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
- data/spec/integration/associations/scope_option_spec.rb +101 -0
- data/spec/integration/atomic/modifiers_spec.rb +116 -0
- data/spec/integration/bson_regexp_raw_spec.rb +19 -0
- data/spec/integration/callbacks_models.rb +192 -0
- data/spec/integration/callbacks_spec.rb +584 -0
- data/spec/integration/contextual/empty_spec.rb +141 -0
- data/spec/integration/criteria/alias_query_spec.rb +161 -0
- data/spec/integration/criteria/date_field_spec.rb +40 -0
- data/spec/integration/criteria/default_scope_spec.rb +72 -0
- data/spec/integration/criteria/logical_spec.rb +124 -0
- data/spec/integration/criteria/range_spec.rb +359 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
- data/spec/integration/discriminator_key_spec.rb +391 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +51 -0
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +74 -0
- data/spec/integration/matcher_examples_spec.rb +765 -0
- data/spec/integration/matcher_operator_data/all.yml +140 -0
- data/spec/integration/matcher_operator_data/and.yml +93 -0
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
- data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
- data/spec/integration/matcher_operator_data/eq.yml +191 -0
- data/spec/integration/matcher_operator_data/exists.yml +213 -0
- data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
- data/spec/integration/matcher_operator_data/gt.yml +132 -0
- data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
- data/spec/integration/matcher_operator_data/in.yml +210 -0
- data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
- data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
- data/spec/integration/matcher_operator_data/lt.yml +132 -0
- data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/multiple.yml +29 -0
- data/spec/integration/matcher_operator_data/ne.yml +150 -0
- data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
- data/spec/integration/matcher_operator_data/nin.yml +114 -0
- data/spec/integration/matcher_operator_data/nor.yml +126 -0
- data/spec/integration/matcher_operator_data/not.yml +196 -0
- data/spec/integration/matcher_operator_data/or.yml +137 -0
- data/spec/integration/matcher_operator_data/regex.yml +174 -0
- data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
- data/spec/integration/matcher_operator_data/size.yml +174 -0
- data/spec/integration/matcher_operator_data/type.yml +70 -0
- data/spec/integration/matcher_operator_data/type_array.yml +16 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +122 -0
- data/spec/integration/matcher_spec.rb +283 -0
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/integration/server_query_spec.rb +141 -0
- data/spec/integration/shardable_spec.rb +148 -0
- data/spec/integration/stringified_symbol_field_spec.rb +203 -0
- data/spec/lite_spec_helper.rb +83 -0
- data/spec/mongoid/association/accessors_spec.rb +284 -77
- data/spec/mongoid/association/auto_save_spec.rb +74 -33
- data/spec/mongoid/association/builders_spec.rb +3 -1
- data/spec/mongoid/association/constrainable_spec.rb +2 -0
- data/spec/mongoid/association/counter_cache_spec.rb +35 -33
- data/spec/mongoid/association/depending_spec.rb +431 -338
- data/spec/mongoid/association/eager_spec.rb +8 -5
- data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
- data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +152 -13
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +61 -1
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +706 -197
- data/spec/mongoid/association/embedded/embeds_many_models.rb +227 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +81 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +38 -23
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +73 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +77 -1
- data/spec/mongoid/association/macros_spec.rb +11 -9
- data/spec/mongoid/association/nested/many_spec.rb +2 -0
- data/spec/mongoid/association/nested/one_spec.rb +18 -12
- data/spec/mongoid/association/options_spec.rb +2 -0
- data/spec/mongoid/association/polymorphic_spec.rb +2 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +266 -17
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +96 -29
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +67 -4
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +559 -385
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +92 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +84 -7
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +415 -129
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +859 -502
- data/spec/mongoid/association/referenced/has_many_models.rb +97 -0
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +51 -3
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
- data/spec/mongoid/association/referenced/has_one_models.rb +113 -0
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +87 -7
- data/spec/mongoid/association/reflections_spec.rb +2 -0
- data/spec/mongoid/association/syncable_spec.rb +48 -32
- data/spec/mongoid/association_spec.rb +2 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
- data/spec/mongoid/atomic/paths_spec.rb +93 -12
- data/spec/mongoid/atomic_spec.rb +53 -6
- data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
- data/spec/mongoid/attributes/nested_spec.rb +149 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +40 -0
- data/spec/mongoid/attributes/readonly_spec.rb +24 -22
- data/spec/mongoid/attributes_spec.rb +895 -54
- data/spec/mongoid/cacheable_spec.rb +6 -4
- data/spec/mongoid/changeable_spec.rb +484 -67
- data/spec/mongoid/clients/factory_spec.rb +139 -33
- data/spec/mongoid/clients/options_spec.rb +76 -54
- data/spec/mongoid/clients/sessions_spec.rb +35 -63
- data/spec/mongoid/clients/transactions_spec.rb +87 -41
- data/spec/mongoid/clients_spec.rb +257 -31
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/composable_spec.rb +2 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config/environment_spec.rb +126 -8
- data/spec/mongoid/config/options_spec.rb +22 -3
- data/spec/mongoid/config_spec.rb +507 -2
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
- 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/aggregable/mongo_spec.rb +122 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
- data/spec/mongoid/contextual/atomic_spec.rb +242 -81
- data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
- data/spec/mongoid/contextual/map_reduce_spec.rb +22 -19
- data/spec/mongoid/contextual/memory_spec.rb +1828 -303
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3505 -1268
- data/spec/mongoid/contextual/none_spec.rb +80 -67
- data/spec/mongoid/copyable_spec.rb +697 -40
- data/spec/mongoid/copyable_spec_models.rb +47 -0
- data/spec/mongoid/criteria/findable_spec.rb +161 -228
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
- data/spec/mongoid/criteria/modifiable_spec.rb +100 -48
- data/spec/mongoid/criteria/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +119 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +7 -70
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +53 -23
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +41 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
- data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
- data/spec/mongoid/criteria/queryable/options_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2538 -0
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1193 -2934
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +56 -5
- data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
- data/spec/mongoid/criteria/scopable_spec.rb +210 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +406 -0
- data/spec/mongoid/criteria_spec.rb +1334 -1719
- data/spec/mongoid/document_fields_spec.rb +262 -0
- data/spec/mongoid/document_persistence_context_spec.rb +32 -0
- data/spec/mongoid/document_query_spec.rb +89 -0
- data/spec/mongoid/document_spec.rb +212 -67
- data/spec/mongoid/equality_spec.rb +144 -41
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
- data/spec/mongoid/errors/callback_spec.rb +2 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
- data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
- data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
- data/spec/mongoid/errors/no_environment_spec.rb +5 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
- data/spec/mongoid/errors/no_parent_spec.rb +3 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
- data/spec/mongoid/errors/readonly_document_spec.rb +4 -2
- data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
- data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
- data/spec/mongoid/errors/validations_spec.rb +2 -0
- data/spec/mongoid/extensions/array_spec.rb +41 -45
- data/spec/mongoid/extensions/big_decimal_spec.rb +715 -213
- data/spec/mongoid/extensions/binary_spec.rb +46 -9
- data/spec/mongoid/extensions/boolean_spec.rb +70 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
- data/spec/mongoid/extensions/date_spec.rb +58 -140
- data/spec/mongoid/extensions/date_time_spec.rb +32 -69
- data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
- data/spec/mongoid/extensions/false_class_spec.rb +3 -1
- data/spec/mongoid/extensions/float_spec.rb +66 -73
- data/spec/mongoid/extensions/hash_spec.rb +135 -0
- data/spec/mongoid/extensions/integer_spec.rb +61 -63
- data/spec/mongoid/extensions/module_spec.rb +2 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/extensions/object_id_spec.rb +2 -0
- data/spec/mongoid/extensions/object_spec.rb +13 -24
- data/spec/mongoid/extensions/range_spec.rb +257 -54
- data/spec/mongoid/extensions/regexp_spec.rb +70 -20
- data/spec/mongoid/extensions/set_spec.rb +108 -0
- data/spec/mongoid/extensions/string_spec.rb +146 -57
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +20 -25
- data/spec/mongoid/extensions/time_spec.rb +668 -106
- data/spec/mongoid/extensions/time_with_zone_spec.rb +57 -83
- data/spec/mongoid/extensions/true_class_spec.rb +3 -1
- data/spec/mongoid/extensions_spec.rb +16 -2
- data/spec/mongoid/factory_spec.rb +347 -27
- data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
- data/spec/mongoid/fields/localized_spec.rb +86 -41
- data/spec/mongoid/fields/standard_spec.rb +2 -0
- data/spec/mongoid/fields_spec.rb +869 -114
- data/spec/mongoid/findable_spec.rb +521 -65
- data/spec/mongoid/indexable/specification_spec.rb +4 -2
- data/spec/mongoid/indexable_spec.rb +87 -32
- data/spec/mongoid/inspectable_spec.rb +39 -2
- data/spec/mongoid/interceptable_spec.rb +761 -98
- data/spec/mongoid/interceptable_spec_models.rb +307 -0
- data/spec/mongoid/loggable_spec.rb +2 -0
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +114 -29
- data/spec/mongoid/persistable/deletable_spec.rb +300 -18
- data/spec/mongoid/persistable/destroyable_spec.rb +228 -18
- data/spec/mongoid/persistable/incrementable_spec.rb +66 -13
- data/spec/mongoid/persistable/logical_spec.rb +56 -3
- data/spec/mongoid/persistable/poppable_spec.rb +55 -3
- data/spec/mongoid/persistable/pullable_spec.rb +108 -6
- data/spec/mongoid/persistable/pushable_spec.rb +163 -7
- data/spec/mongoid/persistable/renamable_spec.rb +54 -2
- data/spec/mongoid/persistable/savable_spec.rb +284 -25
- data/spec/mongoid/persistable/settable_spec.rb +91 -8
- data/spec/mongoid/persistable/unsettable_spec.rb +55 -3
- data/spec/mongoid/persistable/updatable_spec.rb +63 -49
- data/spec/mongoid/persistable/upsertable_spec.rb +93 -3
- data/spec/mongoid/persistable_spec.rb +85 -9
- data/spec/mongoid/persistence_context_spec.rb +60 -59
- data/spec/mongoid/positional_spec.rb +2 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
- data/spec/mongoid/query_cache_spec.rb +446 -78
- data/spec/mongoid/relations/proxy_spec.rb +9 -7
- data/spec/mongoid/reloadable_spec.rb +381 -26
- data/spec/mongoid/scopable_spec.rb +206 -38
- data/spec/mongoid/selectable_spec.rb +8 -6
- data/spec/mongoid/serializable_spec.rb +148 -38
- data/spec/mongoid/shardable_models.rb +75 -0
- data/spec/mongoid/shardable_spec.rb +239 -34
- data/spec/mongoid/stateful_spec.rb +153 -9
- data/spec/mongoid/tasks/database_rake_spec.rb +89 -13
- data/spec/mongoid/tasks/database_spec.rb +130 -1
- data/spec/mongoid/threaded_spec.rb +72 -2
- data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
- data/spec/mongoid/timestamps/created_spec.rb +3 -1
- data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
- data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
- data/spec/mongoid/timestamps/updated_spec.rb +5 -3
- data/spec/mongoid/timestamps_spec.rb +400 -10
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +568 -33
- data/spec/mongoid/touchable_spec_models.rb +59 -0
- data/spec/mongoid/traversable_spec.rb +1145 -1
- data/spec/mongoid/validatable/associated_spec.rb +2 -0
- data/spec/mongoid/validatable/format_spec.rb +2 -0
- data/spec/mongoid/validatable/length_spec.rb +2 -0
- data/spec/mongoid/validatable/numericality_spec.rb +2 -0
- data/spec/mongoid/validatable/presence_spec.rb +28 -22
- data/spec/mongoid/validatable/uniqueness_spec.rb +159 -103
- data/spec/mongoid/validatable_spec.rb +5 -3
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +36 -10
- data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
- data/spec/rails/mongoid_spec.rb +8 -18
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +378 -0
- data/spec/shared/lib/mrss/docker_runner.rb +298 -0
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +321 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +74 -0
- data/spec/shared/shlib/server.sh +416 -0
- data/spec/shared/shlib/set_env.sh +169 -0
- data/spec/spec_helper.rb +74 -88
- data/spec/support/authorization.rb +2 -0
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +77 -0
- data/spec/support/expectations.rb +21 -3
- data/spec/support/helpers.rb +11 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +129 -0
- data/spec/{app → support}/models/account.rb +3 -1
- data/spec/{app → support}/models/acolyte.rb +2 -0
- data/spec/{app → support}/models/actor.rb +3 -1
- data/spec/support/models/actress.rb +4 -0
- data/spec/{app → support}/models/address.rb +6 -0
- data/spec/{app → support}/models/address_component.rb +2 -0
- data/spec/{app → support}/models/address_number.rb +2 -0
- data/spec/{app → support}/models/agency.rb +2 -0
- data/spec/{app → support}/models/agent.rb +2 -0
- data/spec/{app → support}/models/album.rb +2 -0
- data/spec/{app → support}/models/alert.rb +2 -0
- data/spec/{app → support}/models/animal.rb +2 -0
- data/spec/{app → support}/models/answer.rb +2 -0
- data/spec/{app → support}/models/appointment.rb +2 -0
- data/spec/support/models/armrest.rb +9 -0
- data/spec/{app → support}/models/article.rb +2 -0
- data/spec/{app → support}/models/artist.rb +4 -1
- data/spec/{app → support}/models/artwork.rb +2 -0
- data/spec/support/models/audible_sound.rb +3 -0
- data/spec/{app → support}/models/audio.rb +2 -0
- data/spec/support/models/augmentation.rb +25 -0
- data/spec/{app → support}/models/author.rb +2 -0
- data/spec/{app → support}/models/baby.rb +2 -0
- data/spec/{app → support}/models/band.rb +10 -0
- data/spec/{app → support}/models/bar.rb +2 -0
- data/spec/{app → support}/models/basic.rb +2 -0
- data/spec/support/models/bed.rb +3 -0
- data/spec/{app → support}/models/big_palette.rb +2 -0
- data/spec/{app → support}/models/birthday.rb +2 -0
- data/spec/support/models/bolt.rb +7 -0
- data/spec/{app → support}/models/bomb.rb +2 -0
- data/spec/{app → support}/models/book.rb +3 -0
- data/spec/{app → support}/models/breed.rb +2 -0
- data/spec/{app → support}/models/browser.rb +3 -1
- data/spec/{app → support}/models/building.rb +4 -0
- data/spec/{app → support}/models/building_address.rb +2 -0
- data/spec/{app → support}/models/bus.rb +2 -0
- data/spec/{app → support}/models/business.rb +2 -0
- data/spec/{app → support}/models/callback_test.rb +2 -0
- data/spec/{app → support}/models/canvas.rb +3 -1
- data/spec/support/models/car.rb +3 -0
- data/spec/{app → support}/models/cat.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/{app → support}/models/category.rb +2 -0
- data/spec/{app → support}/models/child.rb +2 -0
- data/spec/{app → support}/models/child_doc.rb +5 -3
- data/spec/{app → support}/models/church.rb +2 -0
- data/spec/{app → support}/models/circle.rb +2 -0
- data/spec/{app → support}/models/circuit.rb +2 -0
- data/spec/support/models/circus.rb +12 -0
- data/spec/{app → support}/models/code.rb +4 -0
- data/spec/support/models/coding/pull_request.rb +11 -0
- data/spec/support/models/coding.rb +3 -0
- data/spec/{app → support}/models/comment.rb +2 -0
- data/spec/{app → support}/models/company.rb +2 -0
- data/spec/{app → support}/models/consumption_period.rb +2 -0
- data/spec/{app → support}/models/contextable_item.rb +2 -0
- data/spec/{app → support}/models/contractor.rb +2 -0
- data/spec/{app → support}/models/cookie.rb +2 -0
- data/spec/{app → support}/models/country_code.rb +4 -0
- data/spec/{app → support}/models/courier_job.rb +2 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/crate.rb +12 -0
- data/spec/support/models/customer.rb +10 -0
- data/spec/support/models/customer_address.rb +11 -0
- data/spec/support/models/deed.rb +7 -0
- data/spec/{app → support}/models/definition.rb +2 -0
- data/spec/support/models/delegating_patient.rb +15 -0
- data/spec/{app → support}/models/description.rb +2 -0
- data/spec/{app → support}/models/dictionary.rb +8 -0
- data/spec/{app → support}/models/division.rb +2 -0
- data/spec/{app → support}/models/doctor.rb +2 -0
- data/spec/{app → support}/models/dog.rb +2 -0
- data/spec/{app → support}/models/dokument.rb +2 -0
- data/spec/{app → support}/models/draft.rb +2 -0
- data/spec/{app → support}/models/dragon.rb +2 -0
- data/spec/{app → support}/models/driver.rb +3 -1
- data/spec/{app → support}/models/drug.rb +2 -0
- data/spec/{app → support}/models/dungeon.rb +2 -0
- data/spec/{app → support}/models/edit.rb +2 -0
- data/spec/{app → support}/models/email.rb +2 -0
- data/spec/{app → support}/models/employer.rb +2 -0
- data/spec/{app → support}/models/entry.rb +2 -0
- data/spec/support/models/eraser.rb +3 -0
- data/spec/{app → support}/models/even.rb +2 -0
- data/spec/{app → support}/models/event.rb +2 -0
- data/spec/{app → support}/models/exhibition.rb +2 -0
- data/spec/{app → support}/models/exhibitor.rb +2 -0
- data/spec/{app → support}/models/explosion.rb +2 -0
- data/spec/{app → support}/models/eye.rb +2 -0
- data/spec/{app → support}/models/eye_bowl.rb +2 -0
- data/spec/{app → support}/models/face.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/{app → support}/models/favorite.rb +2 -0
- data/spec/{app → support}/models/filesystem.rb +2 -0
- data/spec/{app → support}/models/fire_hydrant.rb +2 -0
- data/spec/{app → support}/models/firefox.rb +2 -0
- data/spec/{app → support}/models/fish.rb +2 -0
- data/spec/{app → support}/models/folder.rb +2 -0
- data/spec/{app → support}/models/folder_item.rb +2 -0
- data/spec/{app → support}/models/fruits.rb +2 -0
- data/spec/{app → support}/models/game.rb +2 -0
- data/spec/{app → support}/models/ghost.rb +2 -0
- data/spec/support/models/guitar.rb +4 -0
- data/spec/support/models/hole.rb +12 -0
- data/spec/{app → support}/models/home.rb +2 -0
- data/spec/{app → support}/models/house.rb +2 -0
- data/spec/{app → support}/models/html_writer.rb +2 -0
- data/spec/{app → support}/models/id_key.rb +2 -0
- data/spec/support/models/idnodef.rb +7 -0
- data/spec/{app → support}/models/image.rb +2 -0
- data/spec/{app → support}/models/implant.rb +11 -0
- data/spec/support/models/instrument.rb +8 -0
- data/spec/{app → support}/models/item.rb +3 -1
- data/spec/{app → support}/models/jar.rb +2 -0
- data/spec/{app → support}/models/kaleidoscope.rb +2 -0
- data/spec/{app → support}/models/kangaroo.rb +3 -1
- data/spec/{app → support}/models/label.rb +6 -1
- data/spec/{app → support}/models/language.rb +2 -0
- data/spec/{app → support}/models/lat_lng.rb +2 -0
- data/spec/{app → support}/models/league.rb +2 -0
- data/spec/support/models/learner.rb +4 -0
- data/spec/{app → support}/models/line_item.rb +2 -0
- data/spec/{app → support}/models/location.rb +2 -0
- data/spec/{app → support}/models/login.rb +2 -0
- data/spec/{app → support}/models/manufacturer.rb +2 -0
- data/spec/{app → support}/models/meat.rb +2 -0
- data/spec/{app → support}/models/membership.rb +3 -0
- data/spec/{app → support}/models/message.rb +2 -0
- data/spec/support/models/minim.rb +6 -0
- data/spec/{app → support}/models/mixed_drink.rb +2 -0
- data/spec/support/models/mop.rb +24 -0
- data/spec/{app → support}/models/movie.rb +2 -0
- data/spec/support/models/my_hash.rb +4 -0
- data/spec/{app → support}/models/name.rb +2 -0
- data/spec/support/models/name_only.rb +8 -0
- data/spec/{app → support}/models/node.rb +2 -0
- data/spec/{app → support}/models/note.rb +2 -0
- data/spec/support/models/nut.rb +7 -0
- data/spec/{app → support}/models/odd.rb +2 -0
- data/spec/support/models/order.rb +12 -0
- data/spec/{app → support}/models/ordered_post.rb +3 -1
- data/spec/{app → support}/models/ordered_preference.rb +2 -0
- data/spec/{app → support}/models/oscar.rb +2 -0
- data/spec/support/models/other_owner_object.rb +4 -0
- data/spec/{app → support}/models/override.rb +2 -0
- data/spec/{app → support}/models/ownable.rb +2 -0
- data/spec/{app → support}/models/owner.rb +4 -0
- data/spec/{app → support}/models/pack.rb +2 -0
- data/spec/{app → support}/models/page.rb +2 -0
- data/spec/{app → support}/models/page_question.rb +2 -0
- data/spec/{app → support}/models/palette.rb +3 -1
- data/spec/{app → support}/models/parent.rb +2 -0
- data/spec/{app → support}/models/parent_doc.rb +2 -0
- data/spec/support/models/passport.rb +22 -0
- data/spec/{app → support}/models/patient.rb +2 -0
- data/spec/{app → support}/models/pdf_writer.rb +2 -0
- data/spec/support/models/pencil.rb +3 -0
- data/spec/{app → support}/models/person.rb +22 -1
- data/spec/{app → support}/models/pet.rb +2 -0
- data/spec/{app → support}/models/pet_owner.rb +2 -0
- data/spec/{app → support}/models/phone.rb +5 -1
- data/spec/support/models/piano.rb +4 -0
- data/spec/{app → support}/models/pizza.rb +2 -0
- data/spec/{app → support}/models/player.rb +4 -0
- data/spec/{app → support}/models/post.rb +2 -0
- data/spec/{app → support}/models/post_genre.rb +2 -0
- data/spec/support/models/powerup.rb +25 -0
- data/spec/{app → support}/models/preference.rb +2 -0
- data/spec/{app → support}/models/princess.rb +2 -0
- data/spec/{app → support}/models/product.rb +3 -0
- data/spec/support/models/profile.rb +17 -0
- data/spec/{app → support}/models/pronunciation.rb +2 -0
- data/spec/{app → support}/models/pub.rb +2 -0
- data/spec/support/models/publication/encyclopedia.rb +11 -0
- data/spec/support/models/publication/review.rb +13 -0
- data/spec/support/models/publication.rb +4 -0
- data/spec/{app → support}/models/purchase.rb +2 -0
- data/spec/support/models/purchased_item.rb +10 -0
- data/spec/{app → support}/models/question.rb +2 -0
- data/spec/{app → support}/models/quiz.rb +2 -0
- data/spec/{app → support}/models/rating.rb +2 -0
- data/spec/{app → support}/models/record.rb +2 -0
- data/spec/{app → support}/models/registry.rb +3 -0
- data/spec/{app → support}/models/role.rb +2 -0
- data/spec/{app → support}/models/root_category.rb +2 -0
- data/spec/{app → support}/models/sandwich.rb +2 -0
- data/spec/{app → support}/models/scheduler.rb +2 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/scribe.rb +7 -0
- data/spec/support/models/sealer.rb +7 -0
- data/spec/support/models/seat.rb +24 -0
- data/spec/{app → support}/models/seo.rb +2 -0
- data/spec/support/models/series.rb +7 -0
- data/spec/{app → support}/models/server.rb +2 -0
- data/spec/{app → support}/models/service.rb +2 -0
- data/spec/{app → support}/models/shape.rb +4 -2
- data/spec/{app → support}/models/shelf.rb +2 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/{app → support}/models/shipment_address.rb +2 -0
- data/spec/{app → support}/models/shipping_container.rb +2 -0
- data/spec/{app → support}/models/shipping_pack.rb +2 -0
- data/spec/support/models/shirt.rb +11 -0
- data/spec/{app → support}/models/shop.rb +2 -0
- data/spec/{app → support}/models/short_agent.rb +2 -0
- data/spec/{app → support}/models/short_quiz.rb +2 -0
- data/spec/{app → support}/models/simple.rb +2 -0
- data/spec/{app → support}/models/slave.rb +2 -0
- data/spec/{app → support}/models/song.rb +2 -0
- data/spec/{app → support}/models/sound.rb +2 -0
- data/spec/support/models/spacer.rb +7 -0
- data/spec/{app → support}/models/square.rb +2 -0
- data/spec/{app → support}/models/staff.rb +2 -0
- data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
- data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
- data/spec/support/models/store_as_dup_test3.rb +7 -0
- data/spec/support/models/store_as_dup_test4.rb +7 -0
- data/spec/{app → support}/models/strategy.rb +2 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/{app → support}/models/sub_item.rb +2 -0
- data/spec/{app → support}/models/subscription.rb +2 -0
- data/spec/{app → support}/models/survey.rb +2 -0
- data/spec/{app → support}/models/symptom.rb +2 -0
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +2 -0
- data/spec/{app → support}/models/target.rb +2 -0
- data/spec/{app → support}/models/template.rb +2 -0
- data/spec/{app → support}/models/thing.rb +2 -0
- data/spec/support/models/threadlocker.rb +7 -0
- data/spec/{app → support}/models/title.rb +2 -0
- data/spec/{app → support}/models/tool.rb +4 -2
- data/spec/{app → support}/models/topping.rb +2 -0
- data/spec/support/models/toy.rb +9 -0
- data/spec/{app → support}/models/track.rb +2 -0
- data/spec/{app → support}/models/translation.rb +2 -0
- data/spec/{app → support}/models/tree.rb +2 -0
- data/spec/support/models/truck.rb +7 -0
- data/spec/{app → support}/models/user.rb +2 -0
- data/spec/{app → support}/models/user_account.rb +2 -0
- data/spec/{app → support}/models/validation_callback.rb +2 -0
- data/spec/support/models/vehicle.rb +18 -0
- data/spec/{app → support}/models/version.rb +2 -0
- data/spec/{app → support}/models/vertex.rb +3 -1
- data/spec/{app → support}/models/vet_visit.rb +2 -0
- data/spec/{app → support}/models/video.rb +2 -0
- data/spec/support/models/video_game.rb +3 -0
- data/spec/support/models/washer.rb +7 -0
- data/spec/support/models/weapon.rb +25 -0
- data/spec/{app → support}/models/wiki_page.rb +3 -0
- data/spec/{app → support}/models/word.rb +2 -0
- data/spec/{app → support}/models/word_origin.rb +2 -0
- data/spec/{app → support}/models/writer.rb +4 -2
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +53 -0
- data/spec/support/spec_config.rb +64 -0
- data.tar.gz.sig +1 -2
- metadata +1158 -615
- metadata.gz.sig +0 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- data/lib/mongoid/errors/eager_load.rb +0 -22
- data/lib/mongoid/errors/invalid_value.rb +0 -16
- data/lib/mongoid/matchable/all.rb +0 -27
- data/lib/mongoid/matchable/and.rb +0 -30
- data/lib/mongoid/matchable/default.rb +0 -72
- data/lib/mongoid/matchable/elem_match.rb +0 -34
- data/lib/mongoid/matchable/exists.rb +0 -23
- data/lib/mongoid/matchable/gt.rb +0 -23
- data/lib/mongoid/matchable/gte.rb +0 -23
- data/lib/mongoid/matchable/in.rb +0 -24
- data/lib/mongoid/matchable/lt.rb +0 -23
- data/lib/mongoid/matchable/lte.rb +0 -23
- data/lib/mongoid/matchable/ne.rb +0 -21
- data/lib/mongoid/matchable/nin.rb +0 -22
- data/lib/mongoid/matchable/nor.rb +0 -37
- data/lib/mongoid/matchable/or.rb +0 -33
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/lib/mongoid/matchable/size.rb +0 -21
- data/lib/support/ruby_version.rb +0 -26
- data/spec/app/models/actress.rb +0 -2
- data/spec/app/models/augmentation.rb +0 -11
- data/spec/app/models/bed.rb +0 -1
- data/spec/app/models/car.rb +0 -1
- data/spec/app/models/circus.rb +0 -7
- data/spec/app/models/eraser.rb +0 -1
- data/spec/app/models/learner.rb +0 -2
- data/spec/app/models/my_hash.rb +0 -2
- data/spec/app/models/passport.rb +0 -5
- data/spec/app/models/pencil.rb +0 -1
- data/spec/app/models/powerup.rb +0 -11
- data/spec/app/models/profile.rb +0 -5
- data/spec/app/models/series.rb +0 -4
- data/spec/app/models/truck.rb +0 -3
- data/spec/app/models/vehicle.rb +0 -11
- data/spec/app/models/video_game.rb +0 -1
- data/spec/app/models/weapon.rb +0 -11
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -58
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -58
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
- data/spec/mongoid/matchable/all_spec.rb +0 -31
- data/spec/mongoid/matchable/and_spec.rb +0 -187
- data/spec/mongoid/matchable/default_spec.rb +0 -130
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
- data/spec/mongoid/matchable/exists_spec.rb +0 -57
- data/spec/mongoid/matchable/gt_spec.rb +0 -86
- data/spec/mongoid/matchable/gte_spec.rb +0 -84
- data/spec/mongoid/matchable/in_spec.rb +0 -49
- data/spec/mongoid/matchable/lt_spec.rb +0 -85
- data/spec/mongoid/matchable/lte_spec.rb +0 -85
- data/spec/mongoid/matchable/ne_spec.rb +0 -46
- data/spec/mongoid/matchable/nin_spec.rb +0 -48
- data/spec/mongoid/matchable/nor_spec.rb +0 -209
- data/spec/mongoid/matchable/or_spec.rb +0 -131
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
- data/spec/mongoid/matchable/size_spec.rb +0 -25
- data/spec/mongoid/matchable_spec.rb +0 -853
- /data/spec/{app → support}/models/array_field.rb +0 -0
- /data/spec/{app → support}/models/updatable.rb +0 -0
data/spec/mongoid/fields_spec.rb
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "spec_helper"
|
|
2
4
|
|
|
3
5
|
describe Mongoid::Fields do
|
|
4
|
-
|
|
5
|
-
before(:all) do
|
|
6
|
-
Mongoid.use_activesupport_time_zone = false
|
|
7
|
-
end
|
|
6
|
+
config_override :use_activesupport_time_zone, false
|
|
8
7
|
|
|
9
8
|
describe "#\{field}_translations" do
|
|
10
9
|
|
|
@@ -15,18 +14,15 @@ describe Mongoid::Fields do
|
|
|
15
14
|
context "when the field is localized" do
|
|
16
15
|
|
|
17
16
|
context "when translations exist" do
|
|
17
|
+
with_default_i18n_configs
|
|
18
18
|
|
|
19
19
|
before do
|
|
20
|
+
I18n.locale = :en
|
|
20
21
|
product.description = "test"
|
|
21
|
-
I18n.
|
|
22
|
-
::I18n.locale = :de
|
|
22
|
+
I18n.locale = :de
|
|
23
23
|
product.description = "The best"
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
after do
|
|
27
|
-
::I18n.locale = :en
|
|
28
|
-
end
|
|
29
|
-
|
|
30
26
|
let(:translations) do
|
|
31
27
|
product.description_translations
|
|
32
28
|
end
|
|
@@ -107,7 +103,7 @@ describe Mongoid::Fields do
|
|
|
107
103
|
context "when saving the new translations" do
|
|
108
104
|
|
|
109
105
|
before do
|
|
110
|
-
product.save
|
|
106
|
+
product.save!
|
|
111
107
|
end
|
|
112
108
|
|
|
113
109
|
it "persists the changes" do
|
|
@@ -118,7 +114,7 @@ describe Mongoid::Fields do
|
|
|
118
114
|
|
|
119
115
|
before do
|
|
120
116
|
product.description_translations = { "en" => "overwritten" }
|
|
121
|
-
product.save
|
|
117
|
+
product.save!
|
|
122
118
|
end
|
|
123
119
|
|
|
124
120
|
it "persists the changes" do
|
|
@@ -149,7 +145,7 @@ describe Mongoid::Fields do
|
|
|
149
145
|
context "when saving the new translations" do
|
|
150
146
|
|
|
151
147
|
before do
|
|
152
|
-
dictionary.save
|
|
148
|
+
dictionary.save!
|
|
153
149
|
end
|
|
154
150
|
|
|
155
151
|
it "persists the changes" do
|
|
@@ -162,7 +158,7 @@ describe Mongoid::Fields do
|
|
|
162
158
|
|
|
163
159
|
before do
|
|
164
160
|
dictionary.description_translations = { "en" => "overwritten" }
|
|
165
|
-
dictionary.save
|
|
161
|
+
dictionary.save!
|
|
166
162
|
end
|
|
167
163
|
|
|
168
164
|
it "persists the changes" do
|
|
@@ -319,7 +315,7 @@ describe Mongoid::Fields do
|
|
|
319
315
|
end
|
|
320
316
|
|
|
321
317
|
it "converts to Mongoid::Boolean" do
|
|
322
|
-
expect(klass.field(:test, type: Boolean).type).to be(Mongoid::Boolean)
|
|
318
|
+
expect(klass.field(:test, type: Mongoid::Boolean).type).to be(Mongoid::Boolean)
|
|
323
319
|
end
|
|
324
320
|
end
|
|
325
321
|
|
|
@@ -394,6 +390,22 @@ describe Mongoid::Fields do
|
|
|
394
390
|
it "converts :time to Time" do
|
|
395
391
|
expect(klass.field(:test, type: :time).type).to be(Time)
|
|
396
392
|
end
|
|
393
|
+
|
|
394
|
+
context 'when using an unknown symbol' do
|
|
395
|
+
it 'raises InvalidFieldType' do
|
|
396
|
+
lambda do
|
|
397
|
+
klass.field(:test, type: :bogus)
|
|
398
|
+
end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value :bogus/)
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
context 'when using an unknown string' do
|
|
403
|
+
it 'raises InvalidFieldType' do
|
|
404
|
+
lambda do
|
|
405
|
+
klass.field(:test, type: 'bogus')
|
|
406
|
+
end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value "bogus"/)
|
|
407
|
+
end
|
|
408
|
+
end
|
|
397
409
|
end
|
|
398
410
|
|
|
399
411
|
context "when the options are valid" do
|
|
@@ -401,7 +413,7 @@ describe Mongoid::Fields do
|
|
|
401
413
|
context "when the options are all standard" do
|
|
402
414
|
|
|
403
415
|
before do
|
|
404
|
-
Band.field :acceptable, type: Boolean
|
|
416
|
+
Band.field :acceptable, type: Mongoid::Boolean
|
|
405
417
|
end
|
|
406
418
|
|
|
407
419
|
after do
|
|
@@ -416,7 +428,7 @@ describe Mongoid::Fields do
|
|
|
416
428
|
context "when a custom option is provided" do
|
|
417
429
|
|
|
418
430
|
before do
|
|
419
|
-
Band.field :acceptable, type: Boolean, custom: true
|
|
431
|
+
Band.field :acceptable, type: Mongoid::Boolean, custom: true
|
|
420
432
|
end
|
|
421
433
|
|
|
422
434
|
it "adds the field to the model" do
|
|
@@ -425,11 +437,49 @@ describe Mongoid::Fields do
|
|
|
425
437
|
end
|
|
426
438
|
end
|
|
427
439
|
|
|
440
|
+
context "when the Symbol type is used" do
|
|
441
|
+
|
|
442
|
+
before do
|
|
443
|
+
Mongoid::Warnings.class_eval do
|
|
444
|
+
@symbol_type_deprecated = false
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
after do
|
|
449
|
+
Label.fields.delete("should_warn")
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
it "warns that the BSON symbol type is deprecated" do
|
|
453
|
+
expect(Mongoid.logger).to receive(:warn)
|
|
454
|
+
|
|
455
|
+
Label.field :should_warn, type: Symbol
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
it "warns on first use of Symbol type only" do
|
|
459
|
+
expect(Mongoid.logger).to receive(:warn).once
|
|
460
|
+
|
|
461
|
+
Label.field :should_warn, type: Symbol
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
context 'when using Symbol field type in multiple classes' do
|
|
465
|
+
after do
|
|
466
|
+
Truck.fields.delete("should_warn")
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
it "warns on first use of Symbol type only" do
|
|
470
|
+
expect(Mongoid.logger).to receive(:warn).once
|
|
471
|
+
|
|
472
|
+
Label.field :should_warn, type: Symbol
|
|
473
|
+
Truck.field :should_warn, type: Symbol
|
|
474
|
+
end
|
|
475
|
+
end
|
|
476
|
+
end
|
|
477
|
+
|
|
428
478
|
context "when the options are not valid" do
|
|
429
479
|
|
|
430
480
|
it "raises an error" do
|
|
431
481
|
expect {
|
|
432
|
-
|
|
482
|
+
Label.field :unacceptable, bad: true
|
|
433
483
|
}.to raise_error(Mongoid::Errors::InvalidFieldOption)
|
|
434
484
|
end
|
|
435
485
|
end
|
|
@@ -474,16 +524,13 @@ describe Mongoid::Fields do
|
|
|
474
524
|
end
|
|
475
525
|
|
|
476
526
|
context "when a single locale is set" do
|
|
527
|
+
with_default_i18n_configs
|
|
477
528
|
|
|
478
529
|
before do
|
|
479
|
-
|
|
530
|
+
I18n.locale = :de
|
|
480
531
|
product.description = "The best"
|
|
481
532
|
end
|
|
482
533
|
|
|
483
|
-
after do
|
|
484
|
-
::I18n.locale = :en
|
|
485
|
-
end
|
|
486
|
-
|
|
487
534
|
let(:description) do
|
|
488
535
|
product.description
|
|
489
536
|
end
|
|
@@ -494,17 +541,15 @@ describe Mongoid::Fields do
|
|
|
494
541
|
end
|
|
495
542
|
|
|
496
543
|
context "when multiple locales are set" do
|
|
544
|
+
with_default_i18n_configs
|
|
497
545
|
|
|
498
546
|
before do
|
|
547
|
+
I18n.locale = :end
|
|
499
548
|
product.description = "Cheap drinks"
|
|
500
|
-
|
|
549
|
+
I18n.locale = :de
|
|
501
550
|
product.description = "Cheaper drinks"
|
|
502
551
|
end
|
|
503
552
|
|
|
504
|
-
after do
|
|
505
|
-
::I18n.locale = :en
|
|
506
|
-
end
|
|
507
|
-
|
|
508
553
|
let(:description) do
|
|
509
554
|
product.description
|
|
510
555
|
end
|
|
@@ -531,8 +576,144 @@ describe Mongoid::Fields do
|
|
|
531
576
|
context "when the attribute has been assigned" do
|
|
532
577
|
|
|
533
578
|
it "returns the attribute before type cast" do
|
|
534
|
-
person.age = "
|
|
535
|
-
expect(person.age_before_type_cast).to eq("
|
|
579
|
+
person.age = "42"
|
|
580
|
+
expect(person.age_before_type_cast).to eq("42")
|
|
581
|
+
end
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
context "when reloading" do
|
|
585
|
+
|
|
586
|
+
let(:product) do
|
|
587
|
+
Product.create!(price: '1')
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
before do
|
|
591
|
+
product.reload
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
it "resets the attributes_before_type_cast to the attributes hash" do
|
|
595
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
596
|
+
end
|
|
597
|
+
|
|
598
|
+
it "the *_before_type_cast method returns the demongoized value" do
|
|
599
|
+
expect(product.price_before_type_cast).to eq(1)
|
|
600
|
+
end
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
context "when reloading and writing a demongoizable value" do
|
|
604
|
+
|
|
605
|
+
let(:product) do
|
|
606
|
+
Product.create!.tap do |product|
|
|
607
|
+
Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
|
|
608
|
+
end
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
before do
|
|
612
|
+
product.reload
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
it "resets the attributes_before_type_cast to the attributes hash" do
|
|
616
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
it "the *_before_type_cast method returns the mongoized value" do
|
|
620
|
+
expect(product.price_before_type_cast).to eq('1')
|
|
621
|
+
end
|
|
622
|
+
end
|
|
623
|
+
|
|
624
|
+
context "when reading from the db" do
|
|
625
|
+
|
|
626
|
+
let(:product) do
|
|
627
|
+
Product.create!(price: '1')
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
let(:from_db) do
|
|
631
|
+
Product.find(product.id)
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
it "resets the attributes_before_type_cast to the attributes hash" do
|
|
635
|
+
expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
it "the *_before_type_cast method returns the demongoized value" do
|
|
639
|
+
expect(from_db.price_before_type_cast).to eq(1)
|
|
640
|
+
end
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
context "when reading from the db after writing a demongoizable value" do
|
|
644
|
+
|
|
645
|
+
let(:product) do
|
|
646
|
+
Product.create!.tap do |product|
|
|
647
|
+
Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
|
|
648
|
+
end
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
let(:from_db) do
|
|
652
|
+
Product.find(product.id)
|
|
653
|
+
end
|
|
654
|
+
|
|
655
|
+
it "resets the attributes_before_type_cast to the attributes hash" do
|
|
656
|
+
expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
it "the *_before_type_cast method returns the mongoized value" do
|
|
660
|
+
expect(from_db.price_before_type_cast).to eq('1')
|
|
661
|
+
end
|
|
662
|
+
end
|
|
663
|
+
|
|
664
|
+
context "when making a new model" do
|
|
665
|
+
|
|
666
|
+
context "when using new with no options" do
|
|
667
|
+
let(:product) { Product.new }
|
|
668
|
+
|
|
669
|
+
it "sets the attributes_before_type_cast to the attributes hash" do
|
|
670
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
671
|
+
end
|
|
672
|
+
end
|
|
673
|
+
|
|
674
|
+
context "when using new with options" do
|
|
675
|
+
let(:product) { Product.new(price: '1') }
|
|
676
|
+
|
|
677
|
+
let(:abtc) do
|
|
678
|
+
product.attributes.merge('price' => '1')
|
|
679
|
+
end
|
|
680
|
+
|
|
681
|
+
it "has the attributes before type cast" do
|
|
682
|
+
expect(product.attributes_before_type_cast).to eq(abtc)
|
|
683
|
+
end
|
|
684
|
+
end
|
|
685
|
+
|
|
686
|
+
context "when persisting the model" do
|
|
687
|
+
let(:product) { Product.new(price: '1') }
|
|
688
|
+
|
|
689
|
+
let(:abtc) do
|
|
690
|
+
product.attributes.merge('price' => '1')
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
before do
|
|
694
|
+
expect(product.attributes_before_type_cast).to eq(abtc)
|
|
695
|
+
product.save!
|
|
696
|
+
end
|
|
697
|
+
|
|
698
|
+
it "resets the attributes_before_type_cast to the attributes" do
|
|
699
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
700
|
+
end
|
|
701
|
+
end
|
|
702
|
+
|
|
703
|
+
context "when using create! without options" do
|
|
704
|
+
let(:product) { Product.create! }
|
|
705
|
+
|
|
706
|
+
it "resets the attributes_before_type_cast to the attributes" do
|
|
707
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
708
|
+
end
|
|
709
|
+
end
|
|
710
|
+
|
|
711
|
+
context "when using create! with options" do
|
|
712
|
+
let(:product) { Product.create!(price: '1') }
|
|
713
|
+
|
|
714
|
+
it "resets the attributes_before_type_cast to the attributes" do
|
|
715
|
+
expect(product.attributes_before_type_cast).to eq(product.attributes)
|
|
716
|
+
end
|
|
536
717
|
end
|
|
537
718
|
end
|
|
538
719
|
end
|
|
@@ -580,14 +761,14 @@ describe Mongoid::Fields do
|
|
|
580
761
|
|
|
581
762
|
before do
|
|
582
763
|
product.stores = [ "kadewe", "karstadt" ]
|
|
583
|
-
product.save
|
|
764
|
+
product.save!
|
|
584
765
|
end
|
|
585
766
|
|
|
586
767
|
context "when setting the value to nil" do
|
|
587
768
|
|
|
588
769
|
before do
|
|
589
770
|
product.stores = nil
|
|
590
|
-
product.save
|
|
771
|
+
product.save!
|
|
591
772
|
end
|
|
592
773
|
|
|
593
774
|
it "allows the set" do
|
|
@@ -599,7 +780,7 @@ describe Mongoid::Fields do
|
|
|
599
780
|
|
|
600
781
|
before do
|
|
601
782
|
product.stores = [ "kadewe", nil ]
|
|
602
|
-
product.save
|
|
783
|
+
product.save!
|
|
603
784
|
end
|
|
604
785
|
|
|
605
786
|
it "allows the set of nil values" do
|
|
@@ -615,7 +796,7 @@ describe Mongoid::Fields do
|
|
|
615
796
|
|
|
616
797
|
before do
|
|
617
798
|
product.stores = [ "karstadt", "kadewe" ]
|
|
618
|
-
product.save
|
|
799
|
+
product.save!
|
|
619
800
|
end
|
|
620
801
|
|
|
621
802
|
it "reverses the values" do
|
|
@@ -646,16 +827,13 @@ describe Mongoid::Fields do
|
|
|
646
827
|
end
|
|
647
828
|
|
|
648
829
|
context "when a locale is set" do
|
|
830
|
+
with_default_i18n_configs
|
|
649
831
|
|
|
650
832
|
before do
|
|
651
|
-
|
|
833
|
+
I18n.locale = :de
|
|
652
834
|
product.description = "Cheaper drinks"
|
|
653
835
|
end
|
|
654
836
|
|
|
655
|
-
after do
|
|
656
|
-
::I18n.locale = :en
|
|
657
|
-
end
|
|
658
|
-
|
|
659
837
|
let(:description) do
|
|
660
838
|
product.attributes["description"]
|
|
661
839
|
end
|
|
@@ -666,17 +844,15 @@ describe Mongoid::Fields do
|
|
|
666
844
|
end
|
|
667
845
|
|
|
668
846
|
context "when having multiple locales" do
|
|
847
|
+
with_default_i18n_configs
|
|
669
848
|
|
|
670
849
|
before do
|
|
850
|
+
I18n.locale = :en
|
|
671
851
|
product.description = "Cheap drinks"
|
|
672
|
-
|
|
852
|
+
I18n.locale = :de
|
|
673
853
|
product.description = "Cheaper drinks"
|
|
674
854
|
end
|
|
675
855
|
|
|
676
|
-
after do
|
|
677
|
-
::I18n.locale = :en
|
|
678
|
-
end
|
|
679
|
-
|
|
680
856
|
let(:description) do
|
|
681
857
|
product.attributes["description"]
|
|
682
858
|
end
|
|
@@ -688,6 +864,22 @@ describe Mongoid::Fields do
|
|
|
688
864
|
end
|
|
689
865
|
end
|
|
690
866
|
end
|
|
867
|
+
|
|
868
|
+
context "when the field needs to be mongoized" do
|
|
869
|
+
|
|
870
|
+
before do
|
|
871
|
+
product.price = "1"
|
|
872
|
+
product.save!
|
|
873
|
+
end
|
|
874
|
+
|
|
875
|
+
it "mongoizes the value" do
|
|
876
|
+
expect(product.price).to eq(1)
|
|
877
|
+
end
|
|
878
|
+
|
|
879
|
+
it "stores the value in the mongoized form" do
|
|
880
|
+
expect(product.attributes_before_type_cast["price"]).to eq(1)
|
|
881
|
+
end
|
|
882
|
+
end
|
|
691
883
|
end
|
|
692
884
|
|
|
693
885
|
describe "#defaults" do
|
|
@@ -792,7 +984,8 @@ describe Mongoid::Fields do
|
|
|
792
984
|
end
|
|
793
985
|
|
|
794
986
|
it "does not return subclass defaults" do
|
|
795
|
-
expect(shape.pre_processed_defaults).to eq([ "_id", "x", "y"
|
|
987
|
+
expect(shape.pre_processed_defaults).to eq([ "_id", "x", "y" ])
|
|
988
|
+
expect(shape.post_processed_defaults).to eq([ "_type" ])
|
|
796
989
|
end
|
|
797
990
|
end
|
|
798
991
|
|
|
@@ -803,7 +996,8 @@ describe Mongoid::Fields do
|
|
|
803
996
|
end
|
|
804
997
|
|
|
805
998
|
it "has the parent and child defaults" do
|
|
806
|
-
expect(circle.pre_processed_defaults).to eq([ "_id", "x", "y", "
|
|
999
|
+
expect(circle.pre_processed_defaults).to eq([ "_id", "x", "y", "radius" ])
|
|
1000
|
+
expect(circle.post_processed_defaults).to eq([ "_type" ])
|
|
807
1001
|
end
|
|
808
1002
|
end
|
|
809
1003
|
end
|
|
@@ -822,32 +1016,30 @@ describe Mongoid::Fields do
|
|
|
822
1016
|
it "raises an error" do
|
|
823
1017
|
expect {
|
|
824
1018
|
Person.field(meth)
|
|
825
|
-
}.to raise_error(Mongoid::Errors::InvalidField)
|
|
1019
|
+
}.to raise_error(Mongoid::Errors::InvalidField, /Defining a field named '#{meth}' is not allowed/)
|
|
826
1020
|
end
|
|
827
1021
|
end
|
|
828
1022
|
end
|
|
829
1023
|
end
|
|
830
1024
|
|
|
831
1025
|
context "when field already exist and validate_duplicate is enable" do
|
|
1026
|
+
context 'when exception is enabled' do
|
|
1027
|
+
config_override :duplicate_fields_exception, true
|
|
832
1028
|
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
Mongoid.duplicate_fields_exception = false
|
|
839
|
-
end
|
|
840
|
-
|
|
841
|
-
it "raises an error" do
|
|
842
|
-
expect {
|
|
843
|
-
Person.field(:title)
|
|
844
|
-
}.to raise_error(Mongoid::Errors::InvalidField)
|
|
1029
|
+
it "raises an error" do
|
|
1030
|
+
expect {
|
|
1031
|
+
Person.field(:title)
|
|
1032
|
+
}.to raise_error(Mongoid::Errors::InvalidField)
|
|
1033
|
+
end
|
|
845
1034
|
end
|
|
846
1035
|
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
1036
|
+
context 'when exception is disabled' do
|
|
1037
|
+
config_override :duplicate_fields_exception, false
|
|
1038
|
+
it "doesn't raise an error" do
|
|
1039
|
+
expect {
|
|
1040
|
+
Class.new(Person)
|
|
1041
|
+
}.to_not raise_error
|
|
1042
|
+
end
|
|
851
1043
|
end
|
|
852
1044
|
end
|
|
853
1045
|
|
|
@@ -862,14 +1054,7 @@ describe Mongoid::Fields do
|
|
|
862
1054
|
end
|
|
863
1055
|
|
|
864
1056
|
context "when reading the field" do
|
|
865
|
-
|
|
866
|
-
before do
|
|
867
|
-
Time.zone = "Berlin"
|
|
868
|
-
end
|
|
869
|
-
|
|
870
|
-
after do
|
|
871
|
-
Time.zone = nil
|
|
872
|
-
end
|
|
1057
|
+
time_zone_override "Berlin"
|
|
873
1058
|
|
|
874
1059
|
it "performs the necessary time conversions" do
|
|
875
1060
|
expect(person.lunch_time.to_s).to eq(time.getlocal.to_s)
|
|
@@ -947,11 +1132,11 @@ describe Mongoid::Fields do
|
|
|
947
1132
|
end
|
|
948
1133
|
|
|
949
1134
|
before do
|
|
950
|
-
Person.field :aliased, as: :alias, type: Boolean, overwrite: true
|
|
1135
|
+
Person.field :aliased, as: :alias, type: Mongoid::Boolean, overwrite: true
|
|
951
1136
|
end
|
|
952
1137
|
|
|
953
1138
|
it "uses the alias to write the attribute" do
|
|
954
|
-
(person.alias =
|
|
1139
|
+
expect(person.alias = true).to be true
|
|
955
1140
|
end
|
|
956
1141
|
|
|
957
1142
|
it "uses the alias to read the attribute" do
|
|
@@ -963,7 +1148,7 @@ describe Mongoid::Fields do
|
|
|
963
1148
|
end
|
|
964
1149
|
|
|
965
1150
|
it "uses the name to write the attribute" do
|
|
966
|
-
(person.aliased =
|
|
1151
|
+
expect(person.aliased = true).to be true
|
|
967
1152
|
end
|
|
968
1153
|
|
|
969
1154
|
it "uses the name to read the attribute" do
|
|
@@ -1075,6 +1260,10 @@ describe Mongoid::Fields do
|
|
|
1075
1260
|
it "does not return subclass fields" do
|
|
1076
1261
|
expect(shape.fields.keys).to_not include("radius")
|
|
1077
1262
|
end
|
|
1263
|
+
|
|
1264
|
+
it 'includes _type field' do
|
|
1265
|
+
expect(shape.fields.keys).to include("_type")
|
|
1266
|
+
end
|
|
1078
1267
|
end
|
|
1079
1268
|
|
|
1080
1269
|
context "on subclasses" do
|
|
@@ -1094,6 +1283,28 @@ describe Mongoid::Fields do
|
|
|
1094
1283
|
it "includes the child fields" do
|
|
1095
1284
|
expect(circle.fields.keys).to include("radius")
|
|
1096
1285
|
end
|
|
1286
|
+
|
|
1287
|
+
it 'includes _type field' do
|
|
1288
|
+
expect(circle.fields.keys).to include("_type")
|
|
1289
|
+
end
|
|
1290
|
+
end
|
|
1291
|
+
|
|
1292
|
+
context "on new subclasses" do
|
|
1293
|
+
it "all subclasses get the discriminator key" do
|
|
1294
|
+
class DiscriminatorParent
|
|
1295
|
+
include Mongoid::Document
|
|
1296
|
+
end
|
|
1297
|
+
|
|
1298
|
+
class DiscriminatorChild1 < DiscriminatorParent
|
|
1299
|
+
end
|
|
1300
|
+
|
|
1301
|
+
class DiscriminatorChild2 < DiscriminatorParent
|
|
1302
|
+
end
|
|
1303
|
+
|
|
1304
|
+
expect(DiscriminatorParent.fields.keys).to include("_type")
|
|
1305
|
+
expect(DiscriminatorChild1.fields.keys).to include("_type")
|
|
1306
|
+
expect(DiscriminatorChild2.fields.keys).to include("_type")
|
|
1307
|
+
end
|
|
1097
1308
|
end
|
|
1098
1309
|
end
|
|
1099
1310
|
|
|
@@ -1166,71 +1377,147 @@ describe Mongoid::Fields do
|
|
|
1166
1377
|
|
|
1167
1378
|
context "when a field is defined as a big decimal" do
|
|
1168
1379
|
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
end
|
|
1380
|
+
context 'when Mongoid.map_big_decimal_to_decimal128 is false' do
|
|
1381
|
+
config_override :map_big_decimal_to_decimal128, false
|
|
1172
1382
|
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
end
|
|
1176
|
-
|
|
1177
|
-
context "when setting to a big decimal" do
|
|
1178
|
-
|
|
1179
|
-
before do
|
|
1180
|
-
band.sales = decimal
|
|
1383
|
+
let(:band) do
|
|
1384
|
+
Band.new(name: "Tool")
|
|
1181
1385
|
end
|
|
1182
1386
|
|
|
1183
|
-
|
|
1184
|
-
|
|
1387
|
+
let(:decimal) do
|
|
1388
|
+
BigDecimal("1000000.00")
|
|
1185
1389
|
end
|
|
1186
1390
|
|
|
1187
|
-
|
|
1188
|
-
|
|
1391
|
+
context "when setting to a big decimal" do
|
|
1392
|
+
|
|
1393
|
+
before do
|
|
1394
|
+
band.sales = decimal
|
|
1395
|
+
end
|
|
1396
|
+
|
|
1397
|
+
it "properly persists as a string" do
|
|
1398
|
+
expect(band.attributes["sales"]).to eq(decimal.to_s)
|
|
1399
|
+
end
|
|
1400
|
+
|
|
1401
|
+
it "returns the proper big decimal" do
|
|
1402
|
+
expect(band.sales).to eq(decimal)
|
|
1403
|
+
end
|
|
1189
1404
|
end
|
|
1190
|
-
end
|
|
1191
1405
|
|
|
1192
|
-
|
|
1406
|
+
context "when setting to a string" do
|
|
1193
1407
|
|
|
1194
|
-
|
|
1195
|
-
|
|
1408
|
+
before do
|
|
1409
|
+
band.sales = decimal.to_s
|
|
1410
|
+
end
|
|
1411
|
+
|
|
1412
|
+
it "properly persists as a string" do
|
|
1413
|
+
expect(band.attributes["sales"]).to eq(decimal.to_s)
|
|
1414
|
+
end
|
|
1415
|
+
|
|
1416
|
+
it "returns the proper big decimal" do
|
|
1417
|
+
expect(band.sales).to eq(decimal)
|
|
1418
|
+
end
|
|
1196
1419
|
end
|
|
1197
1420
|
|
|
1198
|
-
|
|
1199
|
-
|
|
1421
|
+
context "when setting to an integer" do
|
|
1422
|
+
|
|
1423
|
+
before do
|
|
1424
|
+
band.sales = decimal.to_i
|
|
1425
|
+
end
|
|
1426
|
+
|
|
1427
|
+
it "properly persists as a string" do
|
|
1428
|
+
expect(band.attributes["sales"]).to eq("1000000")
|
|
1429
|
+
end
|
|
1430
|
+
|
|
1431
|
+
it "returns the proper big decimal" do
|
|
1432
|
+
expect(band.sales).to eq(decimal)
|
|
1433
|
+
end
|
|
1200
1434
|
end
|
|
1201
1435
|
|
|
1202
|
-
|
|
1203
|
-
|
|
1436
|
+
context "when setting to a float" do
|
|
1437
|
+
|
|
1438
|
+
before do
|
|
1439
|
+
band.sales = decimal.to_f
|
|
1440
|
+
end
|
|
1441
|
+
|
|
1442
|
+
it "properly persists as a string" do
|
|
1443
|
+
expect(band.attributes["sales"]).to eq(decimal.to_s)
|
|
1444
|
+
end
|
|
1445
|
+
|
|
1446
|
+
it "returns the proper big decimal" do
|
|
1447
|
+
expect(band.sales).to eq(decimal)
|
|
1448
|
+
end
|
|
1204
1449
|
end
|
|
1205
1450
|
end
|
|
1206
1451
|
|
|
1207
|
-
context
|
|
1452
|
+
context 'when Mongoid.map_big_decimal_to_decimal128 is true' do
|
|
1453
|
+
config_override :map_big_decimal_to_decimal128, true
|
|
1208
1454
|
|
|
1209
|
-
|
|
1210
|
-
|
|
1455
|
+
let(:band) do
|
|
1456
|
+
Band.new(name: "Tool")
|
|
1211
1457
|
end
|
|
1212
1458
|
|
|
1213
|
-
|
|
1214
|
-
|
|
1459
|
+
let(:decimal) do
|
|
1460
|
+
BigDecimal("1000000.00")
|
|
1215
1461
|
end
|
|
1216
1462
|
|
|
1217
|
-
|
|
1218
|
-
|
|
1463
|
+
context "when setting to a big decimal" do
|
|
1464
|
+
|
|
1465
|
+
before do
|
|
1466
|
+
band.sales = decimal
|
|
1467
|
+
end
|
|
1468
|
+
|
|
1469
|
+
it "properly persists as a BSON::Decimal128" do
|
|
1470
|
+
expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal))
|
|
1471
|
+
end
|
|
1472
|
+
|
|
1473
|
+
it "returns the proper big decimal" do
|
|
1474
|
+
expect(band.sales).to eq(decimal)
|
|
1475
|
+
end
|
|
1219
1476
|
end
|
|
1220
|
-
end
|
|
1221
1477
|
|
|
1222
|
-
|
|
1478
|
+
context "when setting to a string" do
|
|
1223
1479
|
|
|
1224
|
-
|
|
1225
|
-
|
|
1480
|
+
before do
|
|
1481
|
+
band.sales = decimal.to_s
|
|
1482
|
+
end
|
|
1483
|
+
|
|
1484
|
+
it "persists as a BSON::Decimal128" do
|
|
1485
|
+
expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_s))
|
|
1486
|
+
end
|
|
1487
|
+
|
|
1488
|
+
it "returns the proper big decimal" do
|
|
1489
|
+
expect(band.sales).to eq(decimal)
|
|
1490
|
+
end
|
|
1226
1491
|
end
|
|
1227
1492
|
|
|
1228
|
-
|
|
1229
|
-
|
|
1493
|
+
context "when setting to an integer" do
|
|
1494
|
+
|
|
1495
|
+
before do
|
|
1496
|
+
band.sales = decimal.to_i
|
|
1497
|
+
end
|
|
1498
|
+
|
|
1499
|
+
it "persists as a BSON::Decimal128" do
|
|
1500
|
+
expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_i.to_s))
|
|
1501
|
+
end
|
|
1502
|
+
|
|
1503
|
+
it "returns the proper big decimal" do
|
|
1504
|
+
expect(band.sales).to eq(decimal)
|
|
1505
|
+
end
|
|
1230
1506
|
end
|
|
1231
1507
|
|
|
1232
|
-
|
|
1233
|
-
|
|
1508
|
+
context "when setting to a float" do
|
|
1509
|
+
|
|
1510
|
+
before do
|
|
1511
|
+
band.sales = decimal.to_f
|
|
1512
|
+
end
|
|
1513
|
+
|
|
1514
|
+
it "properly persists as a BSON::Decimal128" do
|
|
1515
|
+
expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_f.to_s))
|
|
1516
|
+
end
|
|
1517
|
+
|
|
1518
|
+
it "returns the proper big decimal" do
|
|
1519
|
+
expect(band.sales).to eq(decimal)
|
|
1520
|
+
end
|
|
1234
1521
|
end
|
|
1235
1522
|
end
|
|
1236
1523
|
end
|
|
@@ -1238,7 +1525,7 @@ describe Mongoid::Fields do
|
|
|
1238
1525
|
context "when the field is a hash of arrays" do
|
|
1239
1526
|
|
|
1240
1527
|
let(:person) do
|
|
1241
|
-
Person.create
|
|
1528
|
+
Person.create!
|
|
1242
1529
|
end
|
|
1243
1530
|
|
|
1244
1531
|
let(:map) do
|
|
@@ -1252,7 +1539,7 @@ describe Mongoid::Fields do
|
|
|
1252
1539
|
before do
|
|
1253
1540
|
person.map = map
|
|
1254
1541
|
person.map["stack1"].reverse!
|
|
1255
|
-
person.save
|
|
1542
|
+
person.save!
|
|
1256
1543
|
end
|
|
1257
1544
|
|
|
1258
1545
|
it "properly updates the hash" do
|
|
@@ -1311,4 +1598,472 @@ describe Mongoid::Fields do
|
|
|
1311
1598
|
end
|
|
1312
1599
|
end
|
|
1313
1600
|
end
|
|
1601
|
+
|
|
1602
|
+
describe '_type field' do
|
|
1603
|
+
context 'on parent class' do
|
|
1604
|
+
let(:shape) { Shape.new }
|
|
1605
|
+
|
|
1606
|
+
it 'is correctly set' do
|
|
1607
|
+
shape.attributes['_type'].should == 'Shape'
|
|
1608
|
+
end
|
|
1609
|
+
end
|
|
1610
|
+
|
|
1611
|
+
context 'on child class' do
|
|
1612
|
+
let(:circle) { Circle.new }
|
|
1613
|
+
|
|
1614
|
+
it 'is correctly set' do
|
|
1615
|
+
circle.attributes['_type'].should == 'Circle'
|
|
1616
|
+
end
|
|
1617
|
+
end
|
|
1618
|
+
end
|
|
1619
|
+
|
|
1620
|
+
describe '.database_field_name' do
|
|
1621
|
+
|
|
1622
|
+
shared_examples_for 'database_field_name' do
|
|
1623
|
+
subject { Person.database_field_name(key) }
|
|
1624
|
+
|
|
1625
|
+
context 'non-aliased field name' do
|
|
1626
|
+
let(:key) { 't' }
|
|
1627
|
+
it { is_expected.to eq 't' }
|
|
1628
|
+
end
|
|
1629
|
+
|
|
1630
|
+
context 'aliased field name' do
|
|
1631
|
+
let(:key) { 'test' }
|
|
1632
|
+
it { is_expected.to eq 't' }
|
|
1633
|
+
end
|
|
1634
|
+
|
|
1635
|
+
context 'non-aliased embeds one relation' do
|
|
1636
|
+
let(:key) { 'pass' }
|
|
1637
|
+
it { is_expected.to eq 'pass' }
|
|
1638
|
+
end
|
|
1639
|
+
|
|
1640
|
+
context 'aliased embeds one relation' do
|
|
1641
|
+
let(:key) { 'passport' }
|
|
1642
|
+
it { is_expected.to eq 'pass' }
|
|
1643
|
+
end
|
|
1644
|
+
|
|
1645
|
+
context 'non-aliased embeds many relation' do
|
|
1646
|
+
let(:key) { 'mobile_phones' }
|
|
1647
|
+
it { is_expected.to eq 'mobile_phones' }
|
|
1648
|
+
end
|
|
1649
|
+
|
|
1650
|
+
context 'aliased embeds many relation' do
|
|
1651
|
+
let(:key) { 'phones' }
|
|
1652
|
+
it { is_expected.to eq 'mobile_phones' }
|
|
1653
|
+
end
|
|
1654
|
+
|
|
1655
|
+
context 'non-aliased embeds one field' do
|
|
1656
|
+
let(:key) { 'pass.exp' }
|
|
1657
|
+
it { is_expected.to eq 'pass.exp' }
|
|
1658
|
+
end
|
|
1659
|
+
|
|
1660
|
+
context 'aliased embeds one field' do
|
|
1661
|
+
let(:key) { 'passport.expiration_date' }
|
|
1662
|
+
it { is_expected.to eq 'pass.exp' }
|
|
1663
|
+
end
|
|
1664
|
+
|
|
1665
|
+
context 'non-aliased embeds many field' do
|
|
1666
|
+
let(:key) { 'mobile_phones.landline' }
|
|
1667
|
+
it { is_expected.to eq 'mobile_phones.landline' }
|
|
1668
|
+
end
|
|
1669
|
+
|
|
1670
|
+
context 'aliased embeds many field' do
|
|
1671
|
+
let(:key) { 'phones.extension' }
|
|
1672
|
+
it { is_expected.to eq 'mobile_phones.ext' }
|
|
1673
|
+
end
|
|
1674
|
+
|
|
1675
|
+
context 'aliased multi-level embedded document' do
|
|
1676
|
+
let(:key) { 'phones.extension' }
|
|
1677
|
+
it { is_expected.to eq 'mobile_phones.ext' }
|
|
1678
|
+
end
|
|
1679
|
+
|
|
1680
|
+
context 'non-aliased multi-level embedded document' do
|
|
1681
|
+
let(:key) { 'phones.extension' }
|
|
1682
|
+
it { is_expected.to eq 'mobile_phones.ext' }
|
|
1683
|
+
end
|
|
1684
|
+
|
|
1685
|
+
context 'aliased multi-level embedded document field' do
|
|
1686
|
+
let(:key) { 'mobile_phones.country_code.code' }
|
|
1687
|
+
it { is_expected.to eq 'mobile_phones.country_code.code' }
|
|
1688
|
+
end
|
|
1689
|
+
|
|
1690
|
+
context 'non-aliased multi-level embedded document field' do
|
|
1691
|
+
let(:key) { 'phones.country_code.iso_alpha2_code' }
|
|
1692
|
+
it { is_expected.to eq 'mobile_phones.country_code.iso' }
|
|
1693
|
+
end
|
|
1694
|
+
|
|
1695
|
+
context 'when field is unknown' do
|
|
1696
|
+
let(:key) { 'shenanigans' }
|
|
1697
|
+
it { is_expected.to eq 'shenanigans' }
|
|
1698
|
+
end
|
|
1699
|
+
|
|
1700
|
+
context 'when embedded field is unknown' do
|
|
1701
|
+
let(:key) { 'phones.bamboozle' }
|
|
1702
|
+
it { is_expected.to eq 'mobile_phones.bamboozle' }
|
|
1703
|
+
end
|
|
1704
|
+
|
|
1705
|
+
context 'when multi-level embedded field is unknown' do
|
|
1706
|
+
let(:key) { 'phones.bamboozle.brouhaha' }
|
|
1707
|
+
it { is_expected.to eq 'mobile_phones.bamboozle.brouhaha' }
|
|
1708
|
+
end
|
|
1709
|
+
end
|
|
1710
|
+
|
|
1711
|
+
shared_examples_for 'pre-fix database_field_name' do
|
|
1712
|
+
subject { Person.database_field_name(key) }
|
|
1713
|
+
|
|
1714
|
+
context 'non-aliased field name' do
|
|
1715
|
+
let(:key) { 't' }
|
|
1716
|
+
it { is_expected.to eq 't' }
|
|
1717
|
+
end
|
|
1718
|
+
|
|
1719
|
+
context 'aliased field name' do
|
|
1720
|
+
let(:key) { 'test' }
|
|
1721
|
+
it { is_expected.to eq 't' }
|
|
1722
|
+
end
|
|
1723
|
+
|
|
1724
|
+
context 'non-aliased embeds one relation' do
|
|
1725
|
+
let(:key) { 'pass' }
|
|
1726
|
+
it { is_expected.to eq 'pass' }
|
|
1727
|
+
end
|
|
1728
|
+
|
|
1729
|
+
context 'aliased embeds one relation' do
|
|
1730
|
+
let(:key) { 'passport' }
|
|
1731
|
+
it { is_expected.to eq 'pass' }
|
|
1732
|
+
end
|
|
1733
|
+
|
|
1734
|
+
context 'non-aliased embeds many relation' do
|
|
1735
|
+
let(:key) { 'mobile_phones' }
|
|
1736
|
+
it { is_expected.to eq 'mobile_phones' }
|
|
1737
|
+
end
|
|
1738
|
+
|
|
1739
|
+
context 'aliased embeds many relation' do
|
|
1740
|
+
let(:key) { 'phones' }
|
|
1741
|
+
it { is_expected.to eq 'mobile_phones' }
|
|
1742
|
+
end
|
|
1743
|
+
|
|
1744
|
+
context 'non-aliased embeds one field' do
|
|
1745
|
+
let(:key) { 'pass.exp' }
|
|
1746
|
+
it { is_expected.to eq 'pass.exp' }
|
|
1747
|
+
end
|
|
1748
|
+
|
|
1749
|
+
context 'aliased embeds one field' do
|
|
1750
|
+
let(:key) { 'passport.expiration_date' }
|
|
1751
|
+
it { is_expected.to eq 'passport.expiration_date' }
|
|
1752
|
+
end
|
|
1753
|
+
|
|
1754
|
+
context 'non-aliased embeds many field' do
|
|
1755
|
+
let(:key) { 'mobile_phones.landline' }
|
|
1756
|
+
it { is_expected.to eq 'mobile_phones.landline' }
|
|
1757
|
+
end
|
|
1758
|
+
|
|
1759
|
+
context 'aliased embeds many field' do
|
|
1760
|
+
let(:key) { 'phones.extension' }
|
|
1761
|
+
it { is_expected.to eq 'phones.extension' }
|
|
1762
|
+
end
|
|
1763
|
+
|
|
1764
|
+
context 'aliased multi-level embedded document' do
|
|
1765
|
+
let(:key) { 'phones.extension' }
|
|
1766
|
+
it { is_expected.to eq 'phones.extension' }
|
|
1767
|
+
end
|
|
1768
|
+
|
|
1769
|
+
context 'non-aliased multi-level embedded document' do
|
|
1770
|
+
let(:key) { 'phones.extension' }
|
|
1771
|
+
it { is_expected.to eq 'phones.extension' }
|
|
1772
|
+
end
|
|
1773
|
+
|
|
1774
|
+
context 'aliased multi-level embedded document field' do
|
|
1775
|
+
let(:key) { 'mobile_phones.country_code.code' }
|
|
1776
|
+
it { is_expected.to eq 'mobile_phones.country_code.code' }
|
|
1777
|
+
end
|
|
1778
|
+
|
|
1779
|
+
context 'non-aliased multi-level embedded document field' do
|
|
1780
|
+
let(:key) { 'phones.country_code.iso_alpha2_code' }
|
|
1781
|
+
it { is_expected.to eq 'phones.country_code.iso_alpha2_code' }
|
|
1782
|
+
end
|
|
1783
|
+
|
|
1784
|
+
context 'when field is unknown' do
|
|
1785
|
+
let(:key) { 'shenanigans' }
|
|
1786
|
+
it { is_expected.to eq 'shenanigans' }
|
|
1787
|
+
end
|
|
1788
|
+
|
|
1789
|
+
context 'when embedded field is unknown' do
|
|
1790
|
+
let(:key) { 'phones.bamboozle' }
|
|
1791
|
+
it { is_expected.to eq 'phones.bamboozle' }
|
|
1792
|
+
end
|
|
1793
|
+
|
|
1794
|
+
context 'when multi-level embedded field is unknown' do
|
|
1795
|
+
let(:key) { 'phones.bamboozle.brouhaha' }
|
|
1796
|
+
it { is_expected.to eq 'phones.bamboozle.brouhaha' }
|
|
1797
|
+
end
|
|
1798
|
+
end
|
|
1799
|
+
|
|
1800
|
+
context "when the broken_alias_handling is not set" do
|
|
1801
|
+
config_override :broken_alias_handling, false
|
|
1802
|
+
|
|
1803
|
+
context 'given nil' do
|
|
1804
|
+
subject { Person.database_field_name(nil) }
|
|
1805
|
+
it { is_expected.to eq nil }
|
|
1806
|
+
end
|
|
1807
|
+
|
|
1808
|
+
context 'given an empty String' do
|
|
1809
|
+
subject { Person.database_field_name('') }
|
|
1810
|
+
it { is_expected.to eq nil }
|
|
1811
|
+
end
|
|
1812
|
+
|
|
1813
|
+
context 'given a String' do
|
|
1814
|
+
subject { Person.database_field_name(key.to_s) }
|
|
1815
|
+
it_behaves_like 'database_field_name'
|
|
1816
|
+
end
|
|
1817
|
+
|
|
1818
|
+
context 'given a Symbol' do
|
|
1819
|
+
subject { Person.database_field_name(key.to_sym) }
|
|
1820
|
+
it_behaves_like 'database_field_name'
|
|
1821
|
+
end
|
|
1822
|
+
end
|
|
1823
|
+
|
|
1824
|
+
context "when the broken_alias_handling is set" do
|
|
1825
|
+
config_override :broken_alias_handling, true
|
|
1826
|
+
|
|
1827
|
+
context 'given nil' do
|
|
1828
|
+
subject { Person.database_field_name(nil) }
|
|
1829
|
+
it { is_expected.to eq nil }
|
|
1830
|
+
end
|
|
1831
|
+
|
|
1832
|
+
context 'given an empty String' do
|
|
1833
|
+
subject { Person.database_field_name('') }
|
|
1834
|
+
it { is_expected.to eq "" }
|
|
1835
|
+
end
|
|
1836
|
+
|
|
1837
|
+
context 'given a String' do
|
|
1838
|
+
subject { Person.database_field_name(key.to_s) }
|
|
1839
|
+
it_behaves_like 'pre-fix database_field_name'
|
|
1840
|
+
end
|
|
1841
|
+
|
|
1842
|
+
context 'given a Symbol' do
|
|
1843
|
+
subject { Person.database_field_name(key.to_sym) }
|
|
1844
|
+
it_behaves_like 'pre-fix database_field_name'
|
|
1845
|
+
end
|
|
1846
|
+
end
|
|
1847
|
+
|
|
1848
|
+
context 'when getting the database field name of a belongs_to associations' do
|
|
1849
|
+
# These tests only apply when the flag is not set
|
|
1850
|
+
config_override :broken_alias_handling, false
|
|
1851
|
+
|
|
1852
|
+
context "when the broken_alias_handling is not set" do
|
|
1853
|
+
context "when the association is the last item" do
|
|
1854
|
+
let(:name) do
|
|
1855
|
+
Game.database_field_name("person")
|
|
1856
|
+
end
|
|
1857
|
+
|
|
1858
|
+
it "gets the alias" do
|
|
1859
|
+
expect(name).to eq("person_id")
|
|
1860
|
+
end
|
|
1861
|
+
end
|
|
1862
|
+
|
|
1863
|
+
context "when the association is not the last item" do
|
|
1864
|
+
let(:name) do
|
|
1865
|
+
Game.database_field_name("person.name")
|
|
1866
|
+
end
|
|
1867
|
+
|
|
1868
|
+
it "gets the alias" do
|
|
1869
|
+
expect(name).to eq("person.name")
|
|
1870
|
+
end
|
|
1871
|
+
end
|
|
1872
|
+
end
|
|
1873
|
+
end
|
|
1874
|
+
end
|
|
1875
|
+
|
|
1876
|
+
describe "#get_field" do
|
|
1877
|
+
|
|
1878
|
+
let(:klass) { Person }
|
|
1879
|
+
let(:field) { klass.cleanse_localized_field_names(field_name) }
|
|
1880
|
+
|
|
1881
|
+
context "when cleansing a field" do
|
|
1882
|
+
let(:field_name) { "employer_id" }
|
|
1883
|
+
it "returns the correct field name" do
|
|
1884
|
+
expect(field).to eq(field_name)
|
|
1885
|
+
end
|
|
1886
|
+
end
|
|
1887
|
+
|
|
1888
|
+
context "when cleansing a localized field" do
|
|
1889
|
+
let(:field_name) { "desc" }
|
|
1890
|
+
it "returns the correct field name" do
|
|
1891
|
+
expect(field).to eq(field_name)
|
|
1892
|
+
end
|
|
1893
|
+
end
|
|
1894
|
+
|
|
1895
|
+
context "when cleansing a translation field" do
|
|
1896
|
+
let(:field_name) { "desc_translations" }
|
|
1897
|
+
it "returns the correct field name" do
|
|
1898
|
+
expect(field).to eq("desc")
|
|
1899
|
+
end
|
|
1900
|
+
end
|
|
1901
|
+
|
|
1902
|
+
context "when cleansing an existing translation field" do
|
|
1903
|
+
let(:field_name) { "localized_translations" }
|
|
1904
|
+
it "returns the correct field name" do
|
|
1905
|
+
expect(field).to eq(field_name)
|
|
1906
|
+
end
|
|
1907
|
+
end
|
|
1908
|
+
|
|
1909
|
+
context "when cleansing an existing translation field with a _translations" do
|
|
1910
|
+
let(:field_name) { "localized_translations_translations" }
|
|
1911
|
+
it "returns the correct field name" do
|
|
1912
|
+
expect(field).to eq("localized_translations")
|
|
1913
|
+
end
|
|
1914
|
+
end
|
|
1915
|
+
|
|
1916
|
+
context "when cleansing dotted translation field" do
|
|
1917
|
+
config_override :broken_alias_handling, false
|
|
1918
|
+
let(:field_name) { "passport.name_translations.asd" }
|
|
1919
|
+
it "returns the correct field name" do
|
|
1920
|
+
expect(field).to eq("pass.name.asd")
|
|
1921
|
+
end
|
|
1922
|
+
end
|
|
1923
|
+
|
|
1924
|
+
context "when cleansing dotted translation field as a symbol" do
|
|
1925
|
+
config_override :broken_alias_handling, false
|
|
1926
|
+
let(:field_name) { "passport.name_translations.asd".to_sym }
|
|
1927
|
+
it "returns the correct field name" do
|
|
1928
|
+
expect(field).to eq("pass.name.asd")
|
|
1929
|
+
end
|
|
1930
|
+
end
|
|
1931
|
+
|
|
1932
|
+
context "when cleansing dotted existing translation field" do
|
|
1933
|
+
config_override :broken_alias_handling, false
|
|
1934
|
+
let(:field_name) { "passport.localized_translations.asd" }
|
|
1935
|
+
it "returns the correct field name" do
|
|
1936
|
+
expect(field).to eq("pass.localized_translations.asd")
|
|
1937
|
+
end
|
|
1938
|
+
end
|
|
1939
|
+
|
|
1940
|
+
context "when cleansing aliased dotted translation field" do
|
|
1941
|
+
let(:field_name) { "pass.name_translations.asd" }
|
|
1942
|
+
it "returns the correct field name" do
|
|
1943
|
+
expect(field).to eq("pass.name.asd")
|
|
1944
|
+
end
|
|
1945
|
+
end
|
|
1946
|
+
end
|
|
1947
|
+
|
|
1948
|
+
describe "localize: :present" do
|
|
1949
|
+
|
|
1950
|
+
let(:product) do
|
|
1951
|
+
Product.new
|
|
1952
|
+
end
|
|
1953
|
+
|
|
1954
|
+
context "when assigning a non blank value" do
|
|
1955
|
+
|
|
1956
|
+
before do
|
|
1957
|
+
product.title = "hello"
|
|
1958
|
+
end
|
|
1959
|
+
|
|
1960
|
+
it "assigns the value" do
|
|
1961
|
+
expect(product.title).to eq("hello")
|
|
1962
|
+
end
|
|
1963
|
+
|
|
1964
|
+
it "populates the translations hash" do
|
|
1965
|
+
expect(product.title_translations).to eq({ "en" => "hello" })
|
|
1966
|
+
end
|
|
1967
|
+
end
|
|
1968
|
+
|
|
1969
|
+
context "when assigning an empty string" do
|
|
1970
|
+
with_default_i18n_configs
|
|
1971
|
+
|
|
1972
|
+
before do
|
|
1973
|
+
I18n.locale = :en
|
|
1974
|
+
product.title = "hello"
|
|
1975
|
+
I18n.locale = :de
|
|
1976
|
+
product.title = "hello there!"
|
|
1977
|
+
product.title = ""
|
|
1978
|
+
end
|
|
1979
|
+
|
|
1980
|
+
it "assigns the value" do
|
|
1981
|
+
expect(product.title).to eq(nil)
|
|
1982
|
+
end
|
|
1983
|
+
|
|
1984
|
+
it "populates the translations hash" do
|
|
1985
|
+
expect(product.title_translations).to eq({ "en" => "hello" })
|
|
1986
|
+
end
|
|
1987
|
+
end
|
|
1988
|
+
|
|
1989
|
+
context "when assigning nil" do
|
|
1990
|
+
with_default_i18n_configs
|
|
1991
|
+
|
|
1992
|
+
before do
|
|
1993
|
+
I18n.locale = :en
|
|
1994
|
+
product.title = "hello"
|
|
1995
|
+
I18n.locale = :de
|
|
1996
|
+
product.title = "hello there!"
|
|
1997
|
+
product.title = nil
|
|
1998
|
+
end
|
|
1999
|
+
|
|
2000
|
+
it "assigns the value" do
|
|
2001
|
+
expect(product.title).to eq(nil)
|
|
2002
|
+
end
|
|
2003
|
+
|
|
2004
|
+
it "populates the translations hash" do
|
|
2005
|
+
expect(product.title_translations).to eq({ "en" => "hello" })
|
|
2006
|
+
end
|
|
2007
|
+
end
|
|
2008
|
+
|
|
2009
|
+
context "when assigning an empty array" do
|
|
2010
|
+
with_default_i18n_configs
|
|
2011
|
+
|
|
2012
|
+
before do
|
|
2013
|
+
I18n.locale = :en
|
|
2014
|
+
product.title = "hello"
|
|
2015
|
+
I18n.locale = :de
|
|
2016
|
+
product.title = "hello there!"
|
|
2017
|
+
product.title = []
|
|
2018
|
+
end
|
|
2019
|
+
|
|
2020
|
+
it "assigns the value" do
|
|
2021
|
+
expect(product.title).to eq(nil)
|
|
2022
|
+
end
|
|
2023
|
+
|
|
2024
|
+
it "populates the translations hash" do
|
|
2025
|
+
expect(product.title_translations).to eq({ "en" => "hello" })
|
|
2026
|
+
end
|
|
2027
|
+
end
|
|
2028
|
+
|
|
2029
|
+
context "when assigning an empty string first" do
|
|
2030
|
+
with_default_i18n_configs
|
|
2031
|
+
|
|
2032
|
+
before do
|
|
2033
|
+
product.title = ""
|
|
2034
|
+
end
|
|
2035
|
+
|
|
2036
|
+
it "assigns the value" do
|
|
2037
|
+
expect(product.title).to eq(nil)
|
|
2038
|
+
end
|
|
2039
|
+
|
|
2040
|
+
it "populates the translations hash" do
|
|
2041
|
+
expect(product.title_translations).to eq({})
|
|
2042
|
+
end
|
|
2043
|
+
end
|
|
2044
|
+
|
|
2045
|
+
context "when assigning an empty string with only one translation" do
|
|
2046
|
+
with_default_i18n_configs
|
|
2047
|
+
|
|
2048
|
+
before do
|
|
2049
|
+
product.title = "Hello"
|
|
2050
|
+
product.title = ""
|
|
2051
|
+
product.save!
|
|
2052
|
+
end
|
|
2053
|
+
|
|
2054
|
+
let(:from_db) { Product.first }
|
|
2055
|
+
|
|
2056
|
+
it "assigns the value" do
|
|
2057
|
+
expect(product.title).to eq(nil)
|
|
2058
|
+
end
|
|
2059
|
+
|
|
2060
|
+
it "populates the translations hash" do
|
|
2061
|
+
expect(product.title_translations).to eq({})
|
|
2062
|
+
end
|
|
2063
|
+
|
|
2064
|
+
it "round trips an empty hash" do
|
|
2065
|
+
expect(from_db.title_translations).to eq({})
|
|
2066
|
+
end
|
|
2067
|
+
end
|
|
2068
|
+
end
|
|
1314
2069
|
end
|