mongoid 7.1.1 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +20 -20
- data/README.md +15 -8
- data/Rakefile +61 -5
- data/lib/config/locales/en.yml +162 -56
- data/lib/mongoid/association/accessors.rb +89 -40
- data/lib/mongoid/association/bindable.rb +50 -23
- data/lib/mongoid/association/builders.rb +5 -12
- data/lib/mongoid/association/constrainable.rb +1 -5
- data/lib/mongoid/association/depending.rb +5 -17
- data/lib/mongoid/association/eager_loadable.rb +29 -10
- data/lib/mongoid/association/embedded/batchable.rb +64 -52
- data/lib/mongoid/association/embedded/cyclic.rb +3 -12
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -5
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -16
- data/lib/mongoid/association/embedded/embedded_in.rb +4 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -7
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +110 -92
- data/lib/mongoid/association/embedded/embeds_many.rb +4 -34
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -8
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +50 -19
- data/lib/mongoid/association/embedded/embeds_one.rb +5 -31
- data/lib/mongoid/association/embedded.rb +0 -1
- data/lib/mongoid/association/macros.rb +27 -5
- data/lib/mongoid/association/many.rb +14 -27
- data/lib/mongoid/association/marshalable.rb +0 -5
- data/lib/mongoid/association/nested/many.rb +6 -16
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -13
- data/lib/mongoid/association/nested/one.rb +48 -23
- data/lib/mongoid/association/nested.rb +0 -3
- data/lib/mongoid/association/one.rb +2 -11
- data/lib/mongoid/association/options.rb +9 -42
- data/lib/mongoid/association/proxy.rb +22 -27
- data/lib/mongoid/association/referenced/auto_save.rb +6 -14
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -8
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -19
- data/lib/mongoid/association/referenced/belongs_to.rb +11 -36
- data/lib/mongoid/association/referenced/counter_cache.rb +12 -25
- data/lib/mongoid/association/referenced/eager.rb +5 -26
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +81 -51
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +17 -41
- data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
- data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +438 -461
- data/lib/mongoid/association/referenced/has_many/proxy.rb +58 -84
- data/lib/mongoid/association/referenced/has_many.rb +15 -42
- data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
- data/lib/mongoid/association/referenced/has_one/buildable.rb +12 -5
- data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +7 -22
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -16
- data/lib/mongoid/association/referenced/has_one.rb +12 -35
- data/lib/mongoid/association/referenced/syncable.rb +4 -21
- data/lib/mongoid/association/referenced.rb +0 -1
- data/lib/mongoid/association/reflections.rb +4 -5
- data/lib/mongoid/association/relatable.rb +46 -71
- data/lib/mongoid/association.rb +5 -22
- data/lib/mongoid/atomic/modifiers.rb +7 -54
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -5
- data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
- data/lib/mongoid/atomic/paths/embedded.rb +0 -3
- data/lib/mongoid/atomic/paths/root.rb +0 -5
- data/lib/mongoid/atomic/paths.rb +0 -1
- data/lib/mongoid/atomic.rb +40 -47
- data/lib/mongoid/attributes/dynamic.rb +5 -22
- data/lib/mongoid/attributes/nested.rb +6 -11
- data/lib/mongoid/attributes/processing.rb +11 -21
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +3 -8
- data/lib/mongoid/attributes.rb +82 -88
- data/lib/mongoid/cacheable.rb +4 -9
- data/lib/mongoid/changeable.rb +148 -69
- data/lib/mongoid/clients/factory.rb +41 -17
- data/lib/mongoid/clients/options.rb +13 -14
- data/lib/mongoid/clients/sessions.rb +8 -11
- data/lib/mongoid/clients/storage_options.rb +7 -17
- data/lib/mongoid/clients/validators/storage.rb +3 -24
- data/lib/mongoid/clients/validators.rb +0 -1
- data/lib/mongoid/clients.rb +1 -10
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +3 -7
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/environment.rb +28 -5
- data/lib/mongoid/config/options.rb +0 -11
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +6 -23
- data/lib/mongoid/config/validators/option.rb +0 -3
- data/lib/mongoid/config/validators.rb +1 -1
- data/lib/mongoid/config.rb +183 -39
- data/lib/mongoid/contextual/aggregable/memory.rb +37 -26
- data/lib/mongoid/contextual/aggregable/mongo.rb +29 -32
- data/lib/mongoid/contextual/aggregable/none.rb +65 -0
- data/lib/mongoid/contextual/aggregable.rb +17 -0
- data/lib/mongoid/contextual/atomic.rb +7 -27
- data/lib/mongoid/contextual/command.rb +0 -5
- data/lib/mongoid/contextual/geo_near.rb +8 -41
- data/lib/mongoid/contextual/map_reduce.rb +2 -33
- data/lib/mongoid/contextual/memory.rb +383 -79
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +636 -283
- data/lib/mongoid/contextual/none.rb +262 -31
- data/lib/mongoid/contextual/queryable.rb +1 -4
- data/lib/mongoid/contextual.rb +14 -7
- data/lib/mongoid/copyable.rb +39 -16
- data/lib/mongoid/criteria/findable.rb +9 -19
- data/lib/mongoid/criteria/includable.rb +27 -31
- data/lib/mongoid/criteria/inspectable.rb +0 -3
- data/lib/mongoid/criteria/marshalable.rb +10 -7
- data/lib/mongoid/criteria/modifiable.rb +2 -20
- data/lib/mongoid/criteria/options.rb +0 -3
- data/lib/mongoid/criteria/permission.rb +1 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +0 -25
- data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -40
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -7
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -6
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -8
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -6
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -40
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -20
- data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -29
- data/lib/mongoid/criteria/queryable/extensions/range.rb +46 -16
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -18
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -31
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -21
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -8
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +16 -6
- data/lib/mongoid/criteria/queryable/extensions.rb +0 -5
- data/lib/mongoid/criteria/queryable/key.rb +6 -19
- data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +123 -38
- data/lib/mongoid/criteria/queryable/optional.rb +11 -62
- data/lib/mongoid/criteria/queryable/options.rb +2 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -14
- data/lib/mongoid/criteria/queryable/selectable.rb +138 -125
- data/lib/mongoid/criteria/queryable/selector.rb +94 -30
- data/lib/mongoid/criteria/queryable/smash.rb +40 -18
- data/lib/mongoid/criteria/queryable/storable.rb +14 -10
- data/lib/mongoid/criteria/queryable.rb +11 -13
- data/lib/mongoid/criteria/scopable.rb +27 -21
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +88 -108
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +149 -99
- data/lib/mongoid/equality.rb +32 -16
- data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
- data/lib/mongoid/errors/callback.rb +0 -3
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
- data/lib/mongoid/errors/delete_restriction.rb +8 -12
- data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
- data/lib/mongoid/errors/document_not_found.rb +33 -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 +0 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_collection.rb +0 -1
- data/lib/mongoid/errors/invalid_config_file.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -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 +6 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_field_option.rb +0 -3
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_find.rb +0 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_includes.rb +0 -3
- data/lib/mongoid/errors/invalid_index.rb +0 -3
- data/lib/mongoid/errors/invalid_options.rb +0 -3
- data/lib/mongoid/errors/invalid_path.rb +0 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
- data/lib/mongoid/errors/invalid_query.rb +40 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -8
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -4
- data/lib/mongoid/errors/invalid_scope.rb +0 -3
- data/lib/mongoid/errors/invalid_session_use.rb +1 -6
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
- data/lib/mongoid/errors/invalid_time.rb +0 -3
- data/lib/mongoid/errors/inverse_not_found.rb +0 -3
- data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
- data/lib/mongoid/errors/mixed_relations.rb +0 -3
- data/lib/mongoid/errors/mongoid_error.rb +4 -13
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
- data/lib/mongoid/errors/no_client_config.rb +2 -5
- data/lib/mongoid/errors/no_client_database.rb +1 -4
- data/lib/mongoid/errors/no_client_hosts.rb +1 -4
- data/lib/mongoid/errors/no_clients_config.rb +0 -3
- data/lib/mongoid/errors/no_default_client.rb +1 -4
- data/lib/mongoid/errors/no_environment.rb +0 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
- data/lib/mongoid/errors/no_metadata.rb +0 -3
- data/lib/mongoid/errors/no_parent.rb +0 -3
- data/lib/mongoid/errors/readonly_attribute.rb +1 -4
- data/lib/mongoid/errors/readonly_document.rb +1 -6
- data/lib/mongoid/errors/scope_overwrite.rb +0 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -2
- data/lib/mongoid/errors/unknown_attribute.rb +1 -4
- data/lib/mongoid/errors/unknown_model.rb +0 -3
- data/lib/mongoid/errors/unsaved_document.rb +1 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
- data/lib/mongoid/errors/validations.rb +0 -1
- data/lib/mongoid/errors.rb +15 -4
- data/lib/mongoid/evolvable.rb +1 -4
- data/lib/mongoid/extensions/array.rb +12 -36
- data/lib/mongoid/extensions/big_decimal.rb +33 -21
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -6
- data/lib/mongoid/extensions/date.rb +26 -29
- data/lib/mongoid/extensions/date_time.rb +1 -10
- data/lib/mongoid/extensions/decimal128.rb +0 -5
- data/lib/mongoid/extensions/false_class.rb +3 -8
- data/lib/mongoid/extensions/float.rb +7 -11
- data/lib/mongoid/extensions/hash.rb +19 -37
- data/lib/mongoid/extensions/integer.rb +7 -13
- data/lib/mongoid/extensions/module.rb +1 -4
- data/lib/mongoid/extensions/nil_class.rb +0 -5
- data/lib/mongoid/extensions/object.rb +11 -48
- data/lib/mongoid/extensions/object_id.rb +0 -7
- data/lib/mongoid/extensions/range.rb +40 -20
- data/lib/mongoid/extensions/regexp.rb +12 -8
- data/lib/mongoid/extensions/set.rb +11 -11
- data/lib/mongoid/extensions/string.rb +12 -52
- data/lib/mongoid/extensions/symbol.rb +4 -22
- data/lib/mongoid/extensions/time.rb +28 -26
- data/lib/mongoid/extensions/time_with_zone.rb +14 -11
- data/lib/mongoid/extensions/true_class.rb +3 -8
- data/lib/mongoid/extensions.rb +17 -3
- data/lib/mongoid/factory.rb +80 -16
- data/lib/mongoid/fields/foreign_key.rb +11 -25
- data/lib/mongoid/fields/localized.rb +19 -15
- data/lib/mongoid/fields/standard.rb +17 -40
- data/lib/mongoid/fields/validators/macro.rb +25 -24
- data/lib/mongoid/fields/validators.rb +0 -1
- data/lib/mongoid/fields.rb +346 -75
- data/lib/mongoid/findable.rb +107 -31
- data/lib/mongoid/indexable/specification.rb +2 -17
- data/lib/mongoid/indexable/validators/options.rb +6 -9
- data/lib/mongoid/indexable.rb +3 -20
- data/lib/mongoid/inspectable.rb +2 -11
- data/lib/mongoid/interceptable.rb +79 -41
- data/lib/mongoid/loggable.rb +0 -9
- data/lib/mongoid/matchable.rb +2 -155
- 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 +20 -29
- data/lib/mongoid/persistable/deletable.rb +4 -22
- data/lib/mongoid/persistable/destroyable.rb +9 -10
- data/lib/mongoid/persistable/incrementable.rb +0 -5
- data/lib/mongoid/persistable/logical.rb +0 -5
- data/lib/mongoid/persistable/poppable.rb +0 -5
- data/lib/mongoid/persistable/pullable.rb +0 -7
- data/lib/mongoid/persistable/pushable.rb +4 -8
- data/lib/mongoid/persistable/renamable.rb +0 -5
- data/lib/mongoid/persistable/savable.rb +13 -8
- data/lib/mongoid/persistable/settable.rb +0 -5
- data/lib/mongoid/persistable/unsettable.rb +2 -7
- data/lib/mongoid/persistable/updatable.rb +96 -29
- data/lib/mongoid/persistable/upsertable.rb +20 -8
- data/lib/mongoid/persistable.rb +6 -26
- data/lib/mongoid/persistence_context.rb +71 -43
- data/lib/mongoid/positional.rb +0 -5
- data/lib/mongoid/query_cache.rb +16 -236
- data/lib/mongoid/railtie.rb +0 -15
- data/lib/mongoid/railties/controller_runtime.rb +1 -2
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +17 -20
- data/lib/mongoid/scopable.rb +32 -56
- data/lib/mongoid/selectable.rb +5 -17
- data/lib/mongoid/serializable.rb +11 -22
- data/lib/mongoid/shardable.rb +49 -16
- data/lib/mongoid/stateful.rb +57 -19
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +59 -11
- data/lib/mongoid/threaded/lifecycle.rb +5 -26
- data/lib/mongoid/threaded.rb +42 -67
- data/lib/mongoid/timestamps/created/short.rb +0 -1
- data/lib/mongoid/timestamps/created.rb +1 -2
- data/lib/mongoid/timestamps/short.rb +0 -1
- data/lib/mongoid/timestamps/timeless.rb +0 -7
- data/lib/mongoid/timestamps/updated/short.rb +0 -1
- data/lib/mongoid/timestamps/updated.rb +2 -5
- data/lib/mongoid/timestamps.rb +0 -1
- data/lib/mongoid/touchable.rb +34 -13
- data/lib/mongoid/traversable.rb +181 -59
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +1 -4
- data/lib/mongoid/validatable/format.rb +0 -1
- data/lib/mongoid/validatable/length.rb +0 -1
- data/lib/mongoid/validatable/localizable.rb +1 -4
- data/lib/mongoid/validatable/macros.rb +5 -14
- data/lib/mongoid/validatable/presence.rb +6 -13
- data/lib/mongoid/validatable/queryable.rb +0 -3
- data/lib/mongoid/validatable/uniqueness.rb +26 -40
- data/lib/mongoid/validatable.rb +9 -27
- data/lib/mongoid/version.rb +1 -2
- data/lib/mongoid/warnings.rb +44 -0
- data/lib/mongoid.rb +42 -18
- data/lib/rails/generators/mongoid/config/config_generator.rb +8 -2
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/mongoid_generator.rb +0 -1
- data/lib/rails/mongoid.rb +0 -3
- data/spec/README.md +19 -4
- data/spec/config/mongoid.yml +16 -0
- 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 +18 -1
- data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
- data/spec/integration/associations/embedded_spec.rb +163 -1
- 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 +9 -1
- data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
- 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 +0 -1
- data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
- 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 +51 -0
- data/spec/integration/criteria/logical_spec.rb +43 -0
- data/spec/integration/criteria/range_spec.rb +359 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
- data/spec/integration/discriminator_key_spec.rb +391 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +30 -1
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -19
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
- 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 +20 -5
- data/spec/integration/stringified_symbol_field_spec.rb +203 -0
- data/spec/lite_spec_helper.rb +25 -9
- data/spec/mongoid/association/accessors_spec.rb +282 -78
- data/spec/mongoid/association/auto_save_spec.rb +72 -34
- data/spec/mongoid/association/builders_spec.rb +1 -2
- data/spec/mongoid/association/constrainable_spec.rb +0 -1
- data/spec/mongoid/association/counter_cache_spec.rb +33 -34
- data/spec/mongoid/association/depending_spec.rb +429 -339
- data/spec/mongoid/association/eager_spec.rb +6 -6
- data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
- data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -1
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +150 -14
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +704 -198
- data/spec/mongoid/association/embedded/embeds_many_models.rb +194 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -1
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +78 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -1
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +36 -24
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +20 -1
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -3
- data/spec/mongoid/association/macros_spec.rb +9 -10
- data/spec/mongoid/association/nested/many_spec.rb +0 -1
- data/spec/mongoid/association/nested/one_spec.rb +16 -13
- data/spec/mongoid/association/options_spec.rb +0 -1
- data/spec/mongoid/association/polymorphic_spec.rb +0 -1
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +109 -17
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +112 -59
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +20 -1
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -22
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +523 -372
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +56 -3
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +130 -1
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +413 -130
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +857 -503
- data/spec/mongoid/association/referenced/has_many_models.rb +59 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +46 -1
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -10
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +133 -28
- data/spec/mongoid/association/referenced/has_one_models.rb +63 -1
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_one_spec.rb +22 -2
- data/spec/mongoid/association/reflections_spec.rb +0 -1
- data/spec/mongoid/association/syncable_spec.rb +46 -33
- data/spec/mongoid/association_spec.rb +0 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +47 -1
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
- data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
- data/spec/mongoid/atomic/paths_spec.rb +91 -13
- data/spec/mongoid/atomic_spec.rb +51 -7
- data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
- data/spec/mongoid/attributes/nested_spec.rb +147 -79
- 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 +22 -23
- data/spec/mongoid/attributes_spec.rb +888 -62
- data/spec/mongoid/cacheable_spec.rb +4 -5
- data/spec/mongoid/changeable_spec.rb +464 -73
- data/spec/mongoid/clients/factory_spec.rb +91 -9
- data/spec/mongoid/clients/options_spec.rb +27 -19
- data/spec/mongoid/clients/sessions_spec.rb +27 -67
- data/spec/mongoid/clients/transactions_spec.rb +69 -35
- data/spec/mongoid/clients_spec.rb +187 -24
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/composable_spec.rb +0 -1
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config/environment_spec.rb +124 -9
- data/spec/mongoid/config/options_spec.rb +0 -1
- data/spec/mongoid/config_spec.rb +465 -1
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +431 -154
- 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 +120 -21
- data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
- data/spec/mongoid/contextual/atomic_spec.rb +148 -86
- data/spec/mongoid/contextual/geo_near_spec.rb +28 -20
- data/spec/mongoid/contextual/map_reduce_spec.rb +20 -20
- data/spec/mongoid/contextual/memory_spec.rb +1826 -304
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3501 -1272
- data/spec/mongoid/contextual/none_spec.rb +78 -68
- data/spec/mongoid/copyable_spec.rb +657 -37
- data/spec/mongoid/copyable_spec_models.rb +28 -1
- data/spec/mongoid/criteria/findable_spec.rb +109 -234
- 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 +0 -1
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +37 -38
- data/spec/mongoid/criteria/options_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -74
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -20
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -27
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -1
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -1
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -16
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -8
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +5 -71
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +30 -8
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +39 -2
- data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +143 -13
- data/spec/mongoid/criteria/queryable/optional_spec.rb +16 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1186 -195
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +307 -705
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -4
- data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
- data/spec/mongoid/criteria/scopable_spec.rb +127 -1
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +406 -0
- data/spec/mongoid/criteria_spec.rb +1267 -1739
- data/spec/mongoid/document_fields_spec.rb +179 -5
- data/spec/mongoid/document_persistence_context_spec.rb +32 -0
- data/spec/mongoid/document_query_spec.rb +51 -1
- data/spec/mongoid/document_spec.rb +151 -88
- data/spec/mongoid/equality_spec.rb +142 -42
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
- data/spec/mongoid/errors/callback_spec.rb +0 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +2 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -1
- data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +5 -6
- data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -2
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
- data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
- data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +22 -9
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +2 -3
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -4
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -4
- data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -4
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
- data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
- data/spec/mongoid/errors/no_parent_spec.rb +0 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -2
- data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
- data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
- data/spec/mongoid/errors/validations_spec.rb +0 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -213
- data/spec/mongoid/extensions/binary_spec.rb +44 -10
- data/spec/mongoid/extensions/boolean_spec.rb +68 -83
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -4
- data/spec/mongoid/extensions/date_spec.rb +71 -2
- data/spec/mongoid/extensions/date_time_spec.rb +15 -10
- data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
- data/spec/mongoid/extensions/false_class_spec.rb +1 -2
- data/spec/mongoid/extensions/float_spec.rb +53 -75
- data/spec/mongoid/extensions/hash_spec.rb +30 -1
- data/spec/mongoid/extensions/integer_spec.rb +50 -65
- data/spec/mongoid/extensions/module_spec.rb +0 -1
- data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
- data/spec/mongoid/extensions/object_id_spec.rb +0 -1
- data/spec/mongoid/extensions/object_spec.rb +0 -1
- data/spec/mongoid/extensions/range_spec.rb +255 -55
- data/spec/mongoid/extensions/regexp_spec.rb +58 -34
- data/spec/mongoid/extensions/set_spec.rb +106 -1
- data/spec/mongoid/extensions/string_spec.rb +58 -31
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +18 -26
- data/spec/mongoid/extensions/time_spec.rb +639 -107
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -84
- data/spec/mongoid/extensions/true_class_spec.rb +1 -2
- data/spec/mongoid/extensions_spec.rb +14 -3
- data/spec/mongoid/factory_spec.rb +323 -30
- data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
- data/spec/mongoid/fields/localized_spec.rb +84 -42
- data/spec/mongoid/fields/standard_spec.rb +0 -1
- data/spec/mongoid/fields_spec.rb +855 -118
- data/spec/mongoid/findable_spec.rb +518 -65
- data/spec/mongoid/indexable/specification_spec.rb +2 -3
- data/spec/mongoid/indexable_spec.rb +85 -33
- data/spec/mongoid/inspectable_spec.rb +37 -3
- data/spec/mongoid/interceptable_spec.rb +702 -104
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/loggable_spec.rb +0 -1
- 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 +112 -30
- data/spec/mongoid/persistable/deletable_spec.rb +298 -19
- data/spec/mongoid/persistable/destroyable_spec.rb +226 -19
- data/spec/mongoid/persistable/incrementable_spec.rb +45 -9
- data/spec/mongoid/persistable/logical_spec.rb +41 -5
- data/spec/mongoid/persistable/poppable_spec.rb +40 -5
- data/spec/mongoid/persistable/pullable_spec.rb +80 -9
- data/spec/mongoid/persistable/pushable_spec.rb +80 -9
- data/spec/mongoid/persistable/renamable_spec.rb +39 -4
- data/spec/mongoid/persistable/savable_spec.rb +282 -26
- data/spec/mongoid/persistable/settable_spec.rb +76 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +40 -5
- data/spec/mongoid/persistable/updatable_spec.rb +61 -50
- data/spec/mongoid/persistable/upsertable_spec.rb +91 -4
- data/spec/mongoid/persistable_spec.rb +3 -4
- data/spec/mongoid/persistence_context_spec.rb +57 -59
- data/spec/mongoid/positional_spec.rb +0 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +7 -5
- data/spec/mongoid/query_cache_spec.rb +424 -68
- data/spec/mongoid/relations/proxy_spec.rb +7 -8
- data/spec/mongoid/reloadable_spec.rb +355 -27
- data/spec/mongoid/scopable_spec.rb +191 -39
- data/spec/mongoid/selectable_spec.rb +6 -7
- data/spec/mongoid/serializable_spec.rb +35 -39
- data/spec/mongoid/shardable_models.rb +15 -1
- data/spec/mongoid/shardable_spec.rb +181 -32
- data/spec/mongoid/stateful_spec.rb +151 -10
- data/spec/mongoid/tasks/database_rake_spec.rb +87 -14
- data/spec/mongoid/tasks/database_spec.rb +128 -2
- data/spec/mongoid/threaded_spec.rb +2 -3
- data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
- data/spec/mongoid/timestamps/created_spec.rb +1 -2
- data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
- data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
- data/spec/mongoid/timestamps/updated_spec.rb +3 -4
- data/spec/mongoid/timestamps_spec.rb +398 -11
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +525 -36
- data/spec/mongoid/touchable_spec_models.rb +59 -0
- data/spec/mongoid/traversable_spec.rb +1143 -2
- data/spec/mongoid/validatable/associated_spec.rb +0 -1
- data/spec/mongoid/validatable/format_spec.rb +0 -1
- data/spec/mongoid/validatable/length_spec.rb +0 -1
- data/spec/mongoid/validatable/numericality_spec.rb +0 -1
- data/spec/mongoid/validatable/presence_spec.rb +26 -23
- data/spec/mongoid/validatable/uniqueness_spec.rb +125 -99
- data/spec/mongoid/validatable_spec.rb +3 -4
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +35 -10
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -3
- data/spec/rails/mongoid_spec.rb +4 -17
- 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 +24 -54
- data/spec/support/authorization.rb +0 -1
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +34 -197
- data/spec/support/expectations.rb +0 -1
- data/spec/support/helpers.rb +1 -1
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +109 -1
- data/spec/{app → support}/models/account.rb +1 -2
- data/spec/{app → support}/models/acolyte.rb +0 -1
- data/spec/{app → support}/models/actor.rb +1 -2
- data/spec/{app → support}/models/actress.rb +0 -1
- data/spec/{app → support}/models/address.rb +4 -1
- data/spec/{app → support}/models/address_component.rb +0 -1
- data/spec/{app → support}/models/address_number.rb +0 -1
- data/spec/{app → support}/models/agency.rb +0 -1
- data/spec/{app → support}/models/agent.rb +0 -1
- data/spec/{app → support}/models/album.rb +0 -1
- data/spec/{app → support}/models/alert.rb +0 -1
- data/spec/{app → support}/models/animal.rb +0 -1
- data/spec/{app → support}/models/answer.rb +0 -1
- data/spec/{app → support}/models/appointment.rb +0 -1
- data/spec/support/models/armrest.rb +9 -0
- data/spec/{app → support}/models/array_field.rb +0 -1
- data/spec/{app → support}/models/article.rb +0 -1
- data/spec/{app → support}/models/artist.rb +2 -2
- data/spec/{app → support}/models/artwork.rb +0 -1
- data/spec/support/models/audible_sound.rb +3 -0
- data/spec/{app → support}/models/audio.rb +0 -1
- data/spec/support/models/augmentation.rb +25 -0
- data/spec/{app → support}/models/author.rb +0 -1
- data/spec/{app → support}/models/baby.rb +0 -1
- data/spec/{app → support}/models/band.rb +8 -1
- data/spec/{app → support}/models/bar.rb +0 -1
- data/spec/{app → support}/models/basic.rb +0 -1
- data/spec/{app → support}/models/bed.rb +0 -1
- data/spec/{app → support}/models/big_palette.rb +0 -1
- data/spec/{app → support}/models/birthday.rb +0 -1
- data/spec/support/models/bolt.rb +7 -0
- data/spec/{app → support}/models/bomb.rb +0 -1
- data/spec/{app → support}/models/book.rb +1 -1
- data/spec/{app → support}/models/breed.rb +0 -1
- data/spec/{app → support}/models/browser.rb +1 -2
- data/spec/{app → support}/models/building.rb +2 -1
- data/spec/{app → support}/models/building_address.rb +0 -1
- data/spec/{app → support}/models/bus.rb +0 -1
- data/spec/{app → support}/models/business.rb +0 -1
- data/spec/{app → support}/models/callback_test.rb +0 -1
- data/spec/{app → support}/models/canvas.rb +1 -2
- data/spec/{app → support}/models/car.rb +0 -1
- data/spec/{app → support}/models/cat.rb +0 -1
- data/spec/support/models/catalog.rb +24 -0
- data/spec/{app → support}/models/category.rb +0 -1
- data/spec/{app → support}/models/child.rb +0 -1
- data/spec/{app → support}/models/child_doc.rb +3 -4
- data/spec/{app → support}/models/church.rb +0 -1
- data/spec/{app → support}/models/circle.rb +0 -1
- data/spec/{app → support}/models/circuit.rb +0 -1
- data/spec/{app → support}/models/circus.rb +3 -1
- data/spec/{app → support}/models/code.rb +2 -1
- data/spec/{app → support}/models/coding/pull_request.rb +0 -1
- data/spec/support/models/coding.rb +3 -0
- data/spec/{app → support}/models/comment.rb +0 -1
- data/spec/{app → support}/models/company.rb +0 -1
- data/spec/{app → support}/models/consumption_period.rb +0 -1
- data/spec/{app → support}/models/contextable_item.rb +0 -1
- data/spec/{app → support}/models/contractor.rb +0 -1
- data/spec/{app → support}/models/cookie.rb +0 -1
- data/spec/{app → support}/models/country_code.rb +2 -1
- data/spec/{app → support}/models/courier_job.rb +0 -1
- 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 +0 -1
- data/spec/{app → support}/models/delegating_patient.rb +0 -1
- data/spec/{app → support}/models/description.rb +0 -1
- data/spec/{app → support}/models/dictionary.rb +6 -1
- data/spec/{app → support}/models/division.rb +0 -1
- data/spec/{app → support}/models/doctor.rb +0 -1
- data/spec/{app → support}/models/dog.rb +0 -1
- data/spec/{app → support}/models/dokument.rb +0 -1
- data/spec/{app → support}/models/draft.rb +0 -1
- data/spec/{app → support}/models/dragon.rb +0 -1
- data/spec/{app → support}/models/driver.rb +1 -2
- data/spec/{app → support}/models/drug.rb +0 -1
- data/spec/{app → support}/models/dungeon.rb +0 -1
- data/spec/{app → support}/models/edit.rb +0 -1
- data/spec/{app → support}/models/email.rb +0 -1
- data/spec/{app → support}/models/employer.rb +0 -1
- data/spec/{app → support}/models/entry.rb +0 -1
- data/spec/{app → support}/models/eraser.rb +0 -1
- data/spec/{app → support}/models/even.rb +0 -1
- data/spec/{app → support}/models/event.rb +0 -1
- data/spec/{app → support}/models/exhibition.rb +0 -1
- data/spec/{app → support}/models/exhibitor.rb +0 -1
- data/spec/{app → support}/models/explosion.rb +0 -1
- data/spec/{app → support}/models/eye.rb +0 -1
- data/spec/{app → support}/models/eye_bowl.rb +0 -1
- data/spec/{app → support}/models/face.rb +0 -1
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/{app → support}/models/favorite.rb +0 -1
- data/spec/{app → support}/models/filesystem.rb +0 -1
- data/spec/{app → support}/models/fire_hydrant.rb +0 -1
- data/spec/{app → support}/models/firefox.rb +0 -1
- data/spec/{app → support}/models/fish.rb +0 -1
- data/spec/{app → support}/models/folder.rb +0 -1
- data/spec/{app → support}/models/folder_item.rb +0 -1
- data/spec/{app → support}/models/fruits.rb +0 -1
- data/spec/{app → support}/models/game.rb +0 -1
- data/spec/{app → support}/models/ghost.rb +0 -1
- data/spec/support/models/guitar.rb +4 -0
- data/spec/support/models/hole.rb +12 -0
- data/spec/{app → support}/models/home.rb +0 -1
- data/spec/{app → support}/models/house.rb +0 -1
- data/spec/{app → support}/models/html_writer.rb +0 -1
- data/spec/{app → support}/models/id_key.rb +0 -1
- data/spec/support/models/idnodef.rb +7 -0
- data/spec/{app → support}/models/image.rb +0 -1
- data/spec/{app → support}/models/implant.rb +9 -1
- data/spec/support/models/instrument.rb +8 -0
- data/spec/{app → support}/models/item.rb +1 -2
- data/spec/{app → support}/models/jar.rb +0 -1
- data/spec/{app → support}/models/kaleidoscope.rb +0 -1
- data/spec/{app → support}/models/kangaroo.rb +0 -1
- data/spec/{app → support}/models/label.rb +4 -2
- data/spec/{app → support}/models/language.rb +0 -1
- data/spec/{app → support}/models/lat_lng.rb +0 -1
- data/spec/{app → support}/models/league.rb +0 -1
- data/spec/{app → support}/models/learner.rb +0 -1
- data/spec/{app → support}/models/line_item.rb +0 -1
- data/spec/{app → support}/models/location.rb +0 -1
- data/spec/{app → support}/models/login.rb +0 -1
- data/spec/{app → support}/models/manufacturer.rb +0 -1
- data/spec/{app → support}/models/meat.rb +0 -1
- data/spec/{app → support}/models/membership.rb +1 -1
- data/spec/{app → support}/models/message.rb +0 -1
- data/spec/{app → support}/models/minim.rb +0 -1
- data/spec/{app → support}/models/mixed_drink.rb +0 -1
- data/spec/support/models/mop.rb +24 -0
- data/spec/{app → support}/models/movie.rb +0 -1
- data/spec/{app → support}/models/my_hash.rb +0 -1
- data/spec/{app → support}/models/name.rb +0 -1
- data/spec/{app → support}/models/name_only.rb +0 -1
- data/spec/{app → support}/models/node.rb +0 -1
- data/spec/{app → support}/models/note.rb +0 -1
- data/spec/support/models/nut.rb +7 -0
- data/spec/{app → support}/models/odd.rb +0 -1
- data/spec/support/models/order.rb +12 -0
- data/spec/{app → support}/models/ordered_post.rb +1 -2
- data/spec/{app → support}/models/ordered_preference.rb +0 -1
- data/spec/{app → support}/models/oscar.rb +0 -1
- data/spec/{app → support}/models/other_owner_object.rb +0 -1
- data/spec/{app → support}/models/override.rb +0 -1
- data/spec/{app → support}/models/ownable.rb +0 -1
- data/spec/{app → support}/models/owner.rb +2 -1
- data/spec/{app → support}/models/pack.rb +0 -1
- data/spec/{app → support}/models/page.rb +0 -1
- data/spec/{app → support}/models/page_question.rb +0 -1
- data/spec/{app → support}/models/palette.rb +1 -2
- data/spec/{app → support}/models/parent.rb +0 -1
- data/spec/{app → support}/models/parent_doc.rb +0 -1
- data/spec/support/models/passport.rb +22 -0
- data/spec/{app → support}/models/patient.rb +0 -1
- data/spec/{app → support}/models/pdf_writer.rb +0 -1
- data/spec/{app → support}/models/pencil.rb +0 -1
- data/spec/{app → support}/models/person.rb +20 -2
- data/spec/{app → support}/models/pet.rb +0 -1
- data/spec/{app → support}/models/pet_owner.rb +0 -1
- data/spec/{app → support}/models/phone.rb +3 -2
- data/spec/support/models/piano.rb +4 -0
- data/spec/{app → support}/models/pizza.rb +0 -1
- data/spec/{app → support}/models/player.rb +2 -1
- data/spec/{app → support}/models/post.rb +0 -1
- data/spec/{app → support}/models/post_genre.rb +0 -1
- data/spec/support/models/powerup.rb +25 -0
- data/spec/{app → support}/models/preference.rb +0 -1
- data/spec/{app → support}/models/princess.rb +0 -1
- data/spec/{app → support}/models/product.rb +1 -1
- data/spec/support/models/profile.rb +17 -0
- data/spec/{app → support}/models/pronunciation.rb +0 -1
- data/spec/{app → support}/models/pub.rb +0 -1
- data/spec/{app → support}/models/publication/encyclopedia.rb +0 -1
- data/spec/{app → support}/models/publication/review.rb +0 -1
- data/spec/support/models/publication.rb +4 -0
- data/spec/{app → support}/models/purchase.rb +0 -1
- data/spec/support/models/purchased_item.rb +10 -0
- data/spec/{app → support}/models/question.rb +0 -1
- data/spec/{app → support}/models/quiz.rb +0 -1
- data/spec/{app → support}/models/rating.rb +0 -1
- data/spec/{app → support}/models/record.rb +0 -1
- data/spec/{app → support}/models/registry.rb +1 -1
- data/spec/{app → support}/models/role.rb +0 -1
- data/spec/{app → support}/models/root_category.rb +0 -1
- data/spec/{app → support}/models/sandwich.rb +0 -1
- data/spec/{app → support}/models/scheduler.rb +0 -1
- data/spec/support/models/school.rb +14 -0
- data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -3
- data/spec/support/models/sealer.rb +7 -0
- data/spec/support/models/seat.rb +24 -0
- data/spec/{app → support}/models/seo.rb +0 -1
- data/spec/{app → support}/models/series.rb +1 -1
- data/spec/{app → support}/models/server.rb +0 -1
- data/spec/{app → support}/models/service.rb +0 -1
- data/spec/{app → support}/models/shape.rb +2 -3
- data/spec/{app → support}/models/shelf.rb +0 -1
- data/spec/support/models/shield.rb +18 -0
- data/spec/{app → support}/models/shipment_address.rb +0 -1
- data/spec/{app → support}/models/shipping_container.rb +0 -1
- data/spec/{app → support}/models/shipping_pack.rb +0 -1
- data/spec/support/models/shirt.rb +11 -0
- data/spec/{app → support}/models/shop.rb +0 -1
- data/spec/{app → support}/models/short_agent.rb +0 -1
- data/spec/{app → support}/models/short_quiz.rb +0 -1
- data/spec/{app → support}/models/simple.rb +0 -1
- data/spec/{app → support}/models/slave.rb +0 -1
- data/spec/{app → support}/models/song.rb +0 -1
- data/spec/{app → support}/models/sound.rb +0 -1
- data/spec/support/models/spacer.rb +7 -0
- data/spec/{app → support}/models/square.rb +0 -1
- data/spec/{app → support}/models/staff.rb +0 -1
- data/spec/{app → support}/models/store_as_dup_test1.rb +0 -1
- data/spec/{app → support}/models/store_as_dup_test2.rb +0 -1
- data/spec/{app → support}/models/store_as_dup_test3.rb +0 -1
- data/spec/{app → support}/models/store_as_dup_test4.rb +0 -1
- data/spec/{app → support}/models/strategy.rb +0 -1
- data/spec/support/models/student.rb +14 -0
- data/spec/{app → support}/models/sub_item.rb +0 -1
- data/spec/{app → support}/models/subscription.rb +0 -1
- data/spec/{app → support}/models/survey.rb +0 -1
- data/spec/{app → support}/models/symptom.rb +0 -1
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +0 -1
- data/spec/{app → support}/models/target.rb +0 -1
- data/spec/{app → support}/models/template.rb +0 -1
- data/spec/{app → support}/models/thing.rb +0 -1
- data/spec/support/models/threadlocker.rb +7 -0
- data/spec/{app → support}/models/title.rb +0 -1
- data/spec/{app → support}/models/tool.rb +2 -3
- data/spec/{app → support}/models/topping.rb +0 -1
- data/spec/support/models/toy.rb +9 -0
- data/spec/{app → support}/models/track.rb +0 -1
- data/spec/{app → support}/models/translation.rb +0 -1
- data/spec/{app → support}/models/tree.rb +0 -1
- data/spec/{app → support}/models/truck.rb +2 -1
- data/spec/{app → support}/models/updatable.rb +0 -1
- data/spec/{app → support}/models/user.rb +0 -1
- data/spec/{app → support}/models/user_account.rb +0 -1
- data/spec/{app → support}/models/validation_callback.rb +0 -1
- data/spec/{app → support}/models/vehicle.rb +7 -3
- data/spec/{app → support}/models/version.rb +0 -1
- data/spec/{app → support}/models/vertex.rb +0 -1
- data/spec/{app → support}/models/vet_visit.rb +0 -1
- data/spec/{app → support}/models/video.rb +0 -1
- data/spec/{app → support}/models/video_game.rb +0 -1
- data/spec/support/models/washer.rb +7 -0
- data/spec/support/models/weapon.rb +25 -0
- data/spec/{app → support}/models/wiki_page.rb +1 -1
- data/spec/{app → support}/models/word.rb +0 -1
- data/spec/{app → support}/models/word_origin.rb +0 -1
- data/spec/{app → support}/models/writer.rb +2 -3
- 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 +0 -1
- data/spec/support/spec_config.rb +28 -6
- data.tar.gz.sig +0 -0
- metadata +1216 -799
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -26
- data/lib/mongoid/errors/invalid_value.rb +0 -18
- data/lib/mongoid/matchable/all.rb +0 -30
- data/lib/mongoid/matchable/and.rb +0 -32
- data/lib/mongoid/matchable/default.rb +0 -121
- data/lib/mongoid/matchable/elem_match.rb +0 -36
- data/lib/mongoid/matchable/eq.rb +0 -23
- data/lib/mongoid/matchable/exists.rb +0 -25
- data/lib/mongoid/matchable/gt.rb +0 -25
- data/lib/mongoid/matchable/gte.rb +0 -25
- data/lib/mongoid/matchable/in.rb +0 -26
- data/lib/mongoid/matchable/lt.rb +0 -25
- data/lib/mongoid/matchable/lte.rb +0 -25
- data/lib/mongoid/matchable/ne.rb +0 -23
- data/lib/mongoid/matchable/nin.rb +0 -24
- data/lib/mongoid/matchable/nor.rb +0 -38
- data/lib/mongoid/matchable/or.rb +0 -35
- data/lib/mongoid/matchable/regexp.rb +0 -30
- data/lib/mongoid/matchable/size.rb +0 -23
- data/lib/support/ruby_version.rb +0 -29
- data/spec/app/models/augmentation.rb +0 -14
- data/spec/app/models/coding.rb +0 -4
- data/spec/app/models/passport.rb +0 -8
- data/spec/app/models/powerup.rb +0 -14
- data/spec/app/models/publication.rb +0 -5
- data/spec/app/models/weapon.rb +0 -14
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
- data/spec/mongoid/matchable/all_spec.rb +0 -34
- data/spec/mongoid/matchable/and_spec.rb +0 -190
- data/spec/mongoid/matchable/default_spec.rb +0 -140
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
- data/spec/mongoid/matchable/eq_spec.rb +0 -49
- data/spec/mongoid/matchable/exists_spec.rb +0 -60
- data/spec/mongoid/matchable/gt_spec.rb +0 -89
- data/spec/mongoid/matchable/gte_spec.rb +0 -87
- data/spec/mongoid/matchable/in_spec.rb +0 -52
- data/spec/mongoid/matchable/lt_spec.rb +0 -88
- data/spec/mongoid/matchable/lte_spec.rb +0 -88
- data/spec/mongoid/matchable/ne_spec.rb +0 -49
- data/spec/mongoid/matchable/nin_spec.rb +0 -51
- data/spec/mongoid/matchable/nor_spec.rb +0 -210
- data/spec/mongoid/matchable/or_spec.rb +0 -134
- data/spec/mongoid/matchable/regexp_spec.rb +0 -62
- data/spec/mongoid/matchable/size_spec.rb +0 -28
- data/spec/mongoid/matchable_spec.rb +0 -856
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/lite_constraints.rb +0 -22
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
|
|
4
3
|
require "spec_helper"
|
|
5
4
|
|
|
@@ -85,7 +84,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
85
84
|
|
|
86
85
|
it "adds the conditions to top level" do
|
|
87
86
|
expect(selection.selector).to eq({
|
|
88
|
-
"field" => {'$gt' => 3
|
|
87
|
+
"field" => {'$gt' => 3},
|
|
89
88
|
})
|
|
90
89
|
end
|
|
91
90
|
|
|
@@ -113,6 +112,54 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
113
112
|
|
|
114
113
|
it_behaves_like 'adds the conditions to top level'
|
|
115
114
|
end
|
|
115
|
+
|
|
116
|
+
context 'when the criterion is a time' do
|
|
117
|
+
let(:selection) do
|
|
118
|
+
query.send(tested_method, :field.gte => Time.new(2020, 1, 1))
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it 'adds the conditions' do
|
|
122
|
+
expect(selection.selector).to eq({
|
|
123
|
+
"field" => {'$gte' => Time.new(2020, 1, 1)},
|
|
124
|
+
})
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it 'keeps argument type' do
|
|
128
|
+
selection.selector['field']['$gte'].should be_a(Time)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context 'when the criterion is a datetime' do
|
|
133
|
+
let(:selection) do
|
|
134
|
+
query.send(tested_method, :field.gte => DateTime.new(2020, 1, 1))
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it 'adds the conditions' do
|
|
138
|
+
expect(selection.selector).to eq({
|
|
139
|
+
"field" => {'$gte' => Time.utc(2020, 1, 1)},
|
|
140
|
+
})
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it 'converts argument to a time' do
|
|
144
|
+
selection.selector['field']['$gte'].should be_a(Time)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context 'when the criterion is a date' do
|
|
149
|
+
let(:selection) do
|
|
150
|
+
query.send(tested_method, :field.gte => Date.new(2020, 1, 1))
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it 'adds the conditions' do
|
|
154
|
+
expect(selection.selector).to eq({
|
|
155
|
+
"field" => {'$gte' => Time.utc(2020, 1, 1)},
|
|
156
|
+
})
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it 'converts argument to a time' do
|
|
160
|
+
selection.selector['field']['$gte'].should be_a(Time)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
116
163
|
end
|
|
117
164
|
|
|
118
165
|
context "when provided a nested criterion" do
|
|
@@ -283,25 +330,58 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
283
330
|
|
|
284
331
|
context "when provided multiple criteria" do
|
|
285
332
|
|
|
286
|
-
context "when the
|
|
333
|
+
context "when the criterion is already included" do
|
|
287
334
|
|
|
288
|
-
|
|
289
|
-
|
|
335
|
+
context 'simple criterion' do
|
|
336
|
+
let(:selection) do
|
|
337
|
+
query.and({ first: [ 1, 2 ] }).and({ first: [ 1, 2 ] })
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
it "adds all conditions" do
|
|
341
|
+
expect(selection.selector).to eq({
|
|
342
|
+
'first' => [1, 2],
|
|
343
|
+
"$and" => [
|
|
344
|
+
{ "first" => [ 1, 2 ] }
|
|
345
|
+
]
|
|
346
|
+
})
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
it_behaves_like 'returns a cloned query'
|
|
290
350
|
end
|
|
291
351
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
352
|
+
context 'Key criterion' do
|
|
353
|
+
let(:selection) do
|
|
354
|
+
query.and({ first: [ 1, 2 ] }).and(:first.gt => 3)
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
it "adds all conditions" do
|
|
358
|
+
expect(selection.selector).to eq({
|
|
359
|
+
'first' => [1, 2],
|
|
360
|
+
"$and" => [
|
|
361
|
+
{ "first" => {'$gt' => 3} }
|
|
362
|
+
]
|
|
363
|
+
})
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
it_behaves_like 'returns a cloned query'
|
|
299
367
|
end
|
|
300
368
|
|
|
301
|
-
|
|
369
|
+
context 'Key criterion when existing criterion is an operator' do
|
|
370
|
+
let(:selection) do
|
|
371
|
+
query.and(:first.lt => 5).and(:first.gt => 3)
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
it "adds all conditions" do
|
|
375
|
+
expect(selection.selector).to eq({
|
|
376
|
+
'first' => {'$lt' => 5, '$gt' => 3},
|
|
377
|
+
})
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it_behaves_like 'returns a cloned query'
|
|
381
|
+
end
|
|
302
382
|
end
|
|
303
383
|
|
|
304
|
-
context "when the new
|
|
384
|
+
context "when the new criteria are for different fields" do
|
|
305
385
|
|
|
306
386
|
let(:selection) do
|
|
307
387
|
query.and({ first: [ 1, 2 ] }, { second: [ 3, 4 ] })
|
|
@@ -317,22 +397,235 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
317
397
|
it_behaves_like 'returns a cloned query'
|
|
318
398
|
end
|
|
319
399
|
|
|
320
|
-
context "when the new
|
|
400
|
+
context "when the new criteria are for the same field" do
|
|
321
401
|
|
|
322
|
-
|
|
323
|
-
|
|
402
|
+
context 'when criteria are simple' do
|
|
403
|
+
let(:selection) do
|
|
404
|
+
query.and({ first: [ 1, 2 ] }, { first: [ 3, 4 ] })
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
it "combines via $and operator" do
|
|
408
|
+
expect(selection.selector).to eq({
|
|
409
|
+
"first" => [ 1, 2 ],
|
|
410
|
+
"$and" => [
|
|
411
|
+
{ "first" => [ 3, 4 ] }
|
|
412
|
+
]
|
|
413
|
+
})
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
it_behaves_like 'returns a cloned query'
|
|
324
417
|
end
|
|
325
418
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
419
|
+
context 'when criteria use operators' do
|
|
420
|
+
shared_examples 'behave correctly' do
|
|
421
|
+
let(:selection) do
|
|
422
|
+
query.and(
|
|
423
|
+
{ field: {first_operator => [ 1, 2 ] }},
|
|
424
|
+
{ field: {second_operator => [ 3, 4 ] }},
|
|
425
|
+
)
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
it "combines via $and operator and stringifies all keys" do
|
|
429
|
+
expect(selection.selector).to eq({
|
|
430
|
+
"field" => {'$in' => [ 1, 2 ]},
|
|
431
|
+
"$and" => [
|
|
432
|
+
{ "field" => {'$in' => [ 3, 4 ] }}
|
|
433
|
+
]
|
|
434
|
+
})
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
[
|
|
439
|
+
['$in', '$in'],
|
|
440
|
+
[:$in, '$in'],
|
|
441
|
+
['$in', :$in],
|
|
442
|
+
[:$in, :$in],
|
|
443
|
+
].each do |first_operator, second_operator|
|
|
444
|
+
context "when first operator is #{first_operator.inspect} and second operator is #{second_operator.inspect}" do
|
|
445
|
+
let(:first_operator) { first_operator }
|
|
446
|
+
let(:second_operator) { second_operator }
|
|
447
|
+
|
|
448
|
+
include_examples 'behave correctly'
|
|
449
|
+
end
|
|
450
|
+
end
|
|
333
451
|
end
|
|
334
452
|
|
|
335
|
-
|
|
453
|
+
context 'when criteria are handled via Key' do
|
|
454
|
+
shared_examples_for 'adds the conditions to top level' do
|
|
455
|
+
|
|
456
|
+
it "adds the conditions to top level" do
|
|
457
|
+
expect(selection.selector).to eq({
|
|
458
|
+
"field" => {'$gt' => 3, '$lt' => 5},
|
|
459
|
+
})
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
it_behaves_like 'returns a cloned query'
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
context 'criteria are provided in the same hash' do
|
|
466
|
+
let(:selection) do
|
|
467
|
+
query.send(tested_method, :field.gt => 3, :field.lt => 5)
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
it_behaves_like 'adds the conditions to top level'
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
context 'criteria are provided in separate hashes' do
|
|
474
|
+
let(:selection) do
|
|
475
|
+
query.send(tested_method, {:field.gt => 3}, {:field.lt => 5})
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
it_behaves_like 'adds the conditions to top level'
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
context 'when the criterion is wrapped in an array' do
|
|
482
|
+
let(:selection) do
|
|
483
|
+
query.send(tested_method, [:field.gt => 3], [:field.lt => 5])
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
it_behaves_like 'adds the conditions to top level'
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
context 'when criteria are simple and handled via Key' do
|
|
491
|
+
shared_examples_for 'combines conditions with $and' do
|
|
492
|
+
|
|
493
|
+
it "combines conditions with $and" do
|
|
494
|
+
expect(selection.selector).to eq({
|
|
495
|
+
"field" => 3,
|
|
496
|
+
'$and' => ['field' => {'$lt' => 5}],
|
|
497
|
+
})
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
it_behaves_like 'returns a cloned query'
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
504
|
+
|
|
505
|
+
it "combines conditions with $eq" do
|
|
506
|
+
expect(selection.selector).to eq({
|
|
507
|
+
"field" => {'$eq' => 3, '$lt' => 5},
|
|
508
|
+
})
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
it_behaves_like 'returns a cloned query'
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
515
|
+
|
|
516
|
+
it "combines conditions with $regex" do
|
|
517
|
+
expect(selection.selector).to eq({
|
|
518
|
+
"field" => {'$regex' => /t/, '$lt' => 5},
|
|
519
|
+
})
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
it_behaves_like 'returns a cloned query'
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
context 'criteria are provided in the same hash' do
|
|
526
|
+
context 'non-regexp argument' do
|
|
527
|
+
let(:selection) do
|
|
528
|
+
query.send(tested_method, :field => 3, :field.lt => 5)
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
it_behaves_like 'combines conditions with $eq'
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
context 'regexp argument' do
|
|
535
|
+
let(:selection) do
|
|
536
|
+
query.send(tested_method, :field => /t/, :field.lt => 5)
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
it_behaves_like 'combines conditions with $regex'
|
|
540
|
+
end
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
context 'criteria are provided in separate hashes' do
|
|
544
|
+
let(:selection) do
|
|
545
|
+
query.send(tested_method, {:field => 3}, {:field.lt => 5})
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
it_behaves_like 'combines conditions with $and'
|
|
549
|
+
end
|
|
550
|
+
|
|
551
|
+
context 'when the criterion is wrapped in an array' do
|
|
552
|
+
let(:selection) do
|
|
553
|
+
query.send(tested_method, [:field => 3], [:field.lt => 5])
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
it_behaves_like 'combines conditions with $and'
|
|
557
|
+
end
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
context 'when criteria are handled via Key and simple' do
|
|
561
|
+
shared_examples_for 'combines conditions with $and' do
|
|
562
|
+
|
|
563
|
+
it "combines conditions with $and" do
|
|
564
|
+
expect(selection.selector).to eq({
|
|
565
|
+
"field" => {'$gt' => 3},
|
|
566
|
+
'$and' => ['field' => 5],
|
|
567
|
+
})
|
|
568
|
+
end
|
|
569
|
+
|
|
570
|
+
it_behaves_like 'returns a cloned query'
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
574
|
+
|
|
575
|
+
it "combines conditions with $eq" do
|
|
576
|
+
expect(selection.selector).to eq({
|
|
577
|
+
"field" => {'$gt' => 3, '$eq' => 5},
|
|
578
|
+
})
|
|
579
|
+
end
|
|
580
|
+
|
|
581
|
+
it_behaves_like 'returns a cloned query'
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
585
|
+
|
|
586
|
+
it "combines conditions with $regex" do
|
|
587
|
+
expect(selection.selector).to eq({
|
|
588
|
+
"field" => {'$gt' => 3, '$regex' => /t/},
|
|
589
|
+
})
|
|
590
|
+
end
|
|
591
|
+
|
|
592
|
+
it_behaves_like 'returns a cloned query'
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
context 'criteria are provided in the same hash' do
|
|
596
|
+
context 'non-regexp argument' do
|
|
597
|
+
let(:selection) do
|
|
598
|
+
query.send(tested_method, :field.gt => 3, :field => 5)
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
it_behaves_like 'combines conditions with $eq'
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
context 'regexp argument' do
|
|
605
|
+
let(:selection) do
|
|
606
|
+
query.send(tested_method, :field.gt => 3, :field => /t/)
|
|
607
|
+
end
|
|
608
|
+
|
|
609
|
+
it_behaves_like 'combines conditions with $regex'
|
|
610
|
+
end
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
context 'criteria are provided in separate hashes' do
|
|
614
|
+
let(:selection) do
|
|
615
|
+
query.send(tested_method, {:field.gt => 3}, {:field => 5})
|
|
616
|
+
end
|
|
617
|
+
|
|
618
|
+
it_behaves_like 'combines conditions with $and'
|
|
619
|
+
end
|
|
620
|
+
|
|
621
|
+
context 'when the criterion is wrapped in an array' do
|
|
622
|
+
let(:selection) do
|
|
623
|
+
query.send(tested_method, [:field.gt => 3], [:field => 5])
|
|
624
|
+
end
|
|
625
|
+
|
|
626
|
+
it_behaves_like 'combines conditions with $and'
|
|
627
|
+
end
|
|
628
|
+
end
|
|
336
629
|
end
|
|
337
630
|
end
|
|
338
631
|
|
|
@@ -509,17 +802,14 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
509
802
|
end
|
|
510
803
|
end
|
|
511
804
|
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
let(:tested_method) { :or }
|
|
515
|
-
let(:expected_operator) { '$or' }
|
|
805
|
+
shared_examples '$or/$nor' do
|
|
516
806
|
|
|
517
807
|
it_behaves_like 'a non-hoisting logical operation'
|
|
518
808
|
|
|
519
809
|
context "when provided no arguments" do
|
|
520
810
|
|
|
521
811
|
let(:selection) do
|
|
522
|
-
query.
|
|
812
|
+
query.send(tested_method)
|
|
523
813
|
end
|
|
524
814
|
|
|
525
815
|
it_behaves_like 'returns a cloned query'
|
|
@@ -536,7 +826,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
536
826
|
context "when provided nil" do
|
|
537
827
|
|
|
538
828
|
let(:selection) do
|
|
539
|
-
query.
|
|
829
|
+
query.send(tested_method, nil)
|
|
540
830
|
end
|
|
541
831
|
|
|
542
832
|
it_behaves_like 'returns a cloned query'
|
|
@@ -553,42 +843,42 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
553
843
|
context "when provided a single criterion" do
|
|
554
844
|
|
|
555
845
|
let(:selection) do
|
|
556
|
-
query.
|
|
846
|
+
query.send(tested_method, field: [ 1, 2 ])
|
|
557
847
|
end
|
|
558
848
|
|
|
559
849
|
it_behaves_like 'returns a cloned query'
|
|
560
850
|
|
|
561
|
-
it "adds the $or selector" do
|
|
851
|
+
it "adds the $or/$nor selector" do
|
|
562
852
|
expect(selection.selector).to eq({
|
|
563
|
-
|
|
853
|
+
expected_operator => [{ "field" => [ 1, 2 ] }]
|
|
564
854
|
})
|
|
565
855
|
end
|
|
566
856
|
|
|
567
857
|
context 'when the criterion is wrapped in array' do
|
|
568
858
|
|
|
569
859
|
let(:selection) do
|
|
570
|
-
query.
|
|
860
|
+
query.send(tested_method, [{ field: [ 1, 2 ] }])
|
|
571
861
|
end
|
|
572
862
|
|
|
573
863
|
it_behaves_like 'returns a cloned query'
|
|
574
864
|
|
|
575
|
-
it "adds the $or selector" do
|
|
865
|
+
it "adds the $or/$nor selector" do
|
|
576
866
|
expect(selection.selector).to eq({
|
|
577
|
-
|
|
867
|
+
expected_operator => [{ "field" => [ 1, 2 ] }]
|
|
578
868
|
})
|
|
579
869
|
end
|
|
580
870
|
|
|
581
871
|
context 'when the array has nil as one of the elements' do
|
|
582
872
|
|
|
583
873
|
let(:selection) do
|
|
584
|
-
query.
|
|
874
|
+
query.send(tested_method, [{ field: [ 1, 2 ] }, nil])
|
|
585
875
|
end
|
|
586
876
|
|
|
587
877
|
it_behaves_like 'returns a cloned query'
|
|
588
878
|
|
|
589
|
-
it "adds the $or selector ignoring the nil element" do
|
|
879
|
+
it "adds the $or/$nor selector ignoring the nil element" do
|
|
590
880
|
expect(selection.selector).to eq({
|
|
591
|
-
|
|
881
|
+
expected_operator => [{ "field" => [ 1, 2 ] }]
|
|
592
882
|
})
|
|
593
883
|
end
|
|
594
884
|
end
|
|
@@ -597,27 +887,27 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
597
887
|
context 'when query already has a condition on another field' do
|
|
598
888
|
|
|
599
889
|
let(:selection) do
|
|
600
|
-
query.where(foo: 'bar').
|
|
890
|
+
query.where(foo: 'bar').send(tested_method, field: [ 1, 2 ])
|
|
601
891
|
end
|
|
602
892
|
|
|
603
|
-
it 'moves original conditions under $or' do
|
|
893
|
+
it 'moves original conditions under $or/$nor' do
|
|
604
894
|
expect(selection.selector).to eq({
|
|
605
|
-
|
|
895
|
+
expected_operator => [{'foo' => 'bar'}, { "field" => [ 1, 2 ] }]
|
|
606
896
|
})
|
|
607
897
|
end
|
|
608
898
|
end
|
|
609
899
|
|
|
610
|
-
context 'when query already has an $or condition and another condition' do
|
|
900
|
+
context 'when query already has an $or/$nor condition and another condition' do
|
|
611
901
|
|
|
612
902
|
let(:selection) do
|
|
613
|
-
query.
|
|
903
|
+
query.send(tested_method, field: [ 1, 2 ]).where(foo: 'bar').send(tested_method, test: 1)
|
|
614
904
|
end
|
|
615
905
|
|
|
616
906
|
it 'unions existing conditions' do
|
|
617
907
|
expect(selection.selector).to eq(
|
|
618
|
-
|
|
908
|
+
expected_operator => [
|
|
619
909
|
{
|
|
620
|
-
|
|
910
|
+
expected_operator => [{ "field" => [ 1, 2 ] }],
|
|
621
911
|
'foo' => 'bar',
|
|
622
912
|
},
|
|
623
913
|
{'test' => 1},
|
|
@@ -632,14 +922,14 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
632
922
|
context "when the criteria are for different fields" do
|
|
633
923
|
|
|
634
924
|
let(:selection) do
|
|
635
|
-
query.
|
|
925
|
+
query.send(tested_method, { first: [ 1, 2 ] }, { second: [ 3, 4 ] })
|
|
636
926
|
end
|
|
637
927
|
|
|
638
928
|
it_behaves_like 'returns a cloned query'
|
|
639
929
|
|
|
640
|
-
it "adds the $or selector" do
|
|
930
|
+
it "adds the $or/$nor selector" do
|
|
641
931
|
expect(selection.selector).to eq({
|
|
642
|
-
|
|
932
|
+
expected_operator => [
|
|
643
933
|
{ "first" => [ 1, 2 ] },
|
|
644
934
|
{ "second" => [ 3, 4 ] }
|
|
645
935
|
]
|
|
@@ -650,12 +940,12 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
650
940
|
context "when the criteria uses a Key instance" do
|
|
651
941
|
|
|
652
942
|
let(:selection) do
|
|
653
|
-
query.
|
|
943
|
+
query.send(tested_method, { first: [ 1, 2 ] }, { :second.gt => 3 })
|
|
654
944
|
end
|
|
655
945
|
|
|
656
|
-
it "adds the $or selector" do
|
|
946
|
+
it "adds the $or/$nor selector" do
|
|
657
947
|
expect(selection.selector).to eq({
|
|
658
|
-
|
|
948
|
+
expected_operator => [
|
|
659
949
|
{ "first" => [ 1, 2 ] },
|
|
660
950
|
{ "second" => { "$gt" => 3 }}
|
|
661
951
|
]
|
|
@@ -663,17 +953,65 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
663
953
|
end
|
|
664
954
|
|
|
665
955
|
it_behaves_like 'returns a cloned query'
|
|
956
|
+
|
|
957
|
+
context 'when the criterion is a time' do
|
|
958
|
+
let(:selection) do
|
|
959
|
+
query.send(tested_method, :field.gte => Time.new(2020, 1, 1))
|
|
960
|
+
end
|
|
961
|
+
|
|
962
|
+
it 'adds the conditions' do
|
|
963
|
+
expect(selection.selector).to eq(expected_operator => [
|
|
964
|
+
"field" => {'$gte' => Time.new(2020, 1, 1)},
|
|
965
|
+
])
|
|
966
|
+
end
|
|
967
|
+
|
|
968
|
+
it 'keeps the type' do
|
|
969
|
+
selection.selector[expected_operator].first['field']['$gte'].should be_a(Time)
|
|
970
|
+
end
|
|
971
|
+
end
|
|
972
|
+
|
|
973
|
+
context 'when the criterion is a datetime' do
|
|
974
|
+
let(:selection) do
|
|
975
|
+
query.send(tested_method, :field.gte => DateTime.new(2020, 1, 1))
|
|
976
|
+
end
|
|
977
|
+
|
|
978
|
+
it 'adds the conditions' do
|
|
979
|
+
expect(selection.selector).to eq(expected_operator => [
|
|
980
|
+
"field" => {'$gte' => Time.utc(2020, 1, 1)},
|
|
981
|
+
])
|
|
982
|
+
end
|
|
983
|
+
|
|
984
|
+
it 'converts argument to a time' do
|
|
985
|
+
selection.selector[expected_operator].first['field']['$gte'].should be_a(Time)
|
|
986
|
+
end
|
|
987
|
+
end
|
|
988
|
+
|
|
989
|
+
context 'when the criterion is a date' do
|
|
990
|
+
let(:selection) do
|
|
991
|
+
query.send(tested_method, :field.gte => Date.new(2020, 1, 1))
|
|
992
|
+
end
|
|
993
|
+
|
|
994
|
+
it 'adds the conditions' do
|
|
995
|
+
expect(selection.selector).to eq(expected_operator => [
|
|
996
|
+
"field" => {'$gte' => Time.utc(2020, 1, 1)},
|
|
997
|
+
])
|
|
998
|
+
end
|
|
999
|
+
|
|
1000
|
+
it 'converts argument to a time' do
|
|
1001
|
+
selection.selector[expected_operator].first['field']['$gte'].should be_a(Time)
|
|
1002
|
+
end
|
|
1003
|
+
end
|
|
666
1004
|
end
|
|
667
1005
|
|
|
668
1006
|
context "when a criterion has an aliased field" do
|
|
669
1007
|
|
|
670
1008
|
let(:selection) do
|
|
671
|
-
query.
|
|
1009
|
+
query.send(tested_method, { id: 1 })
|
|
672
1010
|
end
|
|
673
1011
|
|
|
674
|
-
it "adds the $or selector and aliases the field" do
|
|
1012
|
+
it "adds the $or/$nor selector and aliases the field" do
|
|
675
1013
|
expect(selection.selector).to eq({
|
|
676
|
-
|
|
1014
|
+
expected_operator => [ { "_id" => 1 } ]
|
|
677
1015
|
})
|
|
678
1016
|
end
|
|
679
1017
|
|
|
@@ -683,14 +1021,14 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
683
1021
|
context "when a criterion is wrapped in an array" do
|
|
684
1022
|
|
|
685
1023
|
let(:selection) do
|
|
686
|
-
query.
|
|
1024
|
+
query.send(tested_method, [{ first: [ 1, 2 ] }, { :second.gt => 3 }])
|
|
687
1025
|
end
|
|
688
1026
|
|
|
689
1027
|
it_behaves_like 'returns a cloned query'
|
|
690
1028
|
|
|
691
|
-
it "adds the $or selector" do
|
|
1029
|
+
it "adds the $or/$nor selector" do
|
|
692
1030
|
expect(selection.selector).to eq({
|
|
693
|
-
|
|
1031
|
+
expected_operator => [
|
|
694
1032
|
{ "first" => [ 1, 2 ] },
|
|
695
1033
|
{ "second" => { "$gt" => 3 }}
|
|
696
1034
|
]
|
|
@@ -700,19 +1038,54 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
700
1038
|
|
|
701
1039
|
context "when the criteria are on the same field" do
|
|
702
1040
|
|
|
703
|
-
|
|
704
|
-
|
|
1041
|
+
context 'simple criteria' do
|
|
1042
|
+
let(:selection) do
|
|
1043
|
+
query.send(tested_method, { first: [ 1, 2 ] }, { first: [ 3, 4 ] })
|
|
1044
|
+
end
|
|
1045
|
+
|
|
1046
|
+
it_behaves_like 'returns a cloned query'
|
|
1047
|
+
|
|
1048
|
+
it "appends both $or/$nor expressions" do
|
|
1049
|
+
expect(selection.selector).to eq({
|
|
1050
|
+
expected_operator => [
|
|
1051
|
+
{ "first" => [ 1, 2 ] },
|
|
1052
|
+
{ "first" => [ 3, 4 ] }
|
|
1053
|
+
]
|
|
1054
|
+
})
|
|
1055
|
+
end
|
|
705
1056
|
end
|
|
706
1057
|
|
|
707
|
-
|
|
1058
|
+
context 'Key criteria as one argument' do
|
|
1059
|
+
let(:selection) do
|
|
1060
|
+
query.send(tested_method, :first.gt => 3, :first.lt => 5)
|
|
1061
|
+
end
|
|
708
1062
|
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
1063
|
+
it_behaves_like 'returns a cloned query'
|
|
1064
|
+
|
|
1065
|
+
it "adds all criteria" do
|
|
1066
|
+
expect(selection.selector).to eq({
|
|
1067
|
+
expected_operator => [
|
|
1068
|
+
{ "first" => {'$gt' => 3, '$lt' => 5} },
|
|
1069
|
+
]
|
|
1070
|
+
})
|
|
1071
|
+
end
|
|
1072
|
+
end
|
|
1073
|
+
|
|
1074
|
+
context 'Key criteria as multiple arguments' do
|
|
1075
|
+
let(:selection) do
|
|
1076
|
+
query.send(tested_method, {:first.gt => 3}, {:first.lt => 5})
|
|
1077
|
+
end
|
|
1078
|
+
|
|
1079
|
+
it_behaves_like 'returns a cloned query'
|
|
1080
|
+
|
|
1081
|
+
it "adds all criteria" do
|
|
1082
|
+
expect(selection.selector).to eq({
|
|
1083
|
+
expected_operator => [
|
|
1084
|
+
{ "first" => {'$gt' => 3} },
|
|
1085
|
+
{ "first" => {'$lt' => 5} },
|
|
1086
|
+
]
|
|
1087
|
+
})
|
|
1088
|
+
end
|
|
716
1089
|
end
|
|
717
1090
|
end
|
|
718
1091
|
end
|
|
@@ -722,14 +1095,14 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
722
1095
|
context "when the criterion are for different fields" do
|
|
723
1096
|
|
|
724
1097
|
let(:selection) do
|
|
725
|
-
query.
|
|
1098
|
+
query.send(tested_method, first: [ 1, 2 ]).send(tested_method, second: [ 3, 4 ])
|
|
726
1099
|
end
|
|
727
1100
|
|
|
728
1101
|
it_behaves_like 'returns a cloned query'
|
|
729
1102
|
|
|
730
|
-
it "adds the $or selectors" do
|
|
1103
|
+
it "adds the $or/$nor selectors" do
|
|
731
1104
|
expect(selection.selector).to eq({
|
|
732
|
-
|
|
1105
|
+
expected_operator => [
|
|
733
1106
|
{ "first" => [ 1, 2 ] },
|
|
734
1107
|
{ "second" => [ 3, 4 ] }
|
|
735
1108
|
]
|
|
@@ -740,14 +1113,14 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
740
1113
|
context "when the criterion are on the same field" do
|
|
741
1114
|
|
|
742
1115
|
let(:selection) do
|
|
743
|
-
query.
|
|
1116
|
+
query.send(tested_method, first: [ 1, 2 ]).send(tested_method, first: [ 3, 4 ])
|
|
744
1117
|
end
|
|
745
1118
|
|
|
746
1119
|
it_behaves_like 'returns a cloned query'
|
|
747
1120
|
|
|
748
|
-
it "appends both $or expressions" do
|
|
1121
|
+
it "appends both $or/$nor expressions" do
|
|
749
1122
|
expect(selection.selector).to eq({
|
|
750
|
-
|
|
1123
|
+
expected_operator => [
|
|
751
1124
|
{ "first" => [ 1, 2 ] },
|
|
752
1125
|
{ "first" => [ 3, 4 ] }
|
|
753
1126
|
]
|
|
@@ -755,141 +1128,54 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
755
1128
|
end
|
|
756
1129
|
end
|
|
757
1130
|
end
|
|
758
|
-
end
|
|
759
|
-
|
|
760
|
-
describe "#nor" do
|
|
761
|
-
|
|
762
|
-
let(:tested_method) { :nor }
|
|
763
|
-
let(:expected_operator) { '$nor' }
|
|
764
1131
|
|
|
765
|
-
|
|
1132
|
+
context 'when giving multiple conditions in one call on the same key with symbol operator' do
|
|
766
1133
|
|
|
767
|
-
|
|
1134
|
+
context 'non-regexp argument' do
|
|
1135
|
+
let(:selection) do
|
|
1136
|
+
query.send(tested_method, field: 1, :field.gt => 0)
|
|
1137
|
+
end
|
|
768
1138
|
|
|
769
|
-
|
|
770
|
-
|
|
1139
|
+
it 'combines conditions with $eq' do
|
|
1140
|
+
selection.selector.should == {
|
|
1141
|
+
expected_operator => [
|
|
1142
|
+
'field' => {'$eq' => 1, '$gt' => 0},
|
|
1143
|
+
]
|
|
1144
|
+
}
|
|
1145
|
+
end
|
|
771
1146
|
end
|
|
772
1147
|
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
1148
|
+
context 'regexp argument' do
|
|
1149
|
+
let(:selection) do
|
|
1150
|
+
query.send(tested_method, field: /t/, :field.gt => 0)
|
|
1151
|
+
end
|
|
776
1152
|
|
|
777
|
-
|
|
778
|
-
|
|
1153
|
+
it 'combines conditions with $regex' do
|
|
1154
|
+
selection.selector.should == {
|
|
1155
|
+
expected_operator => [
|
|
1156
|
+
'field' => {'$regex' => /t/, '$gt' => 0},
|
|
1157
|
+
]
|
|
1158
|
+
}
|
|
1159
|
+
end
|
|
779
1160
|
end
|
|
780
1161
|
|
|
781
|
-
it_behaves_like 'returns a cloned query'
|
|
782
1162
|
end
|
|
1163
|
+
end
|
|
783
1164
|
|
|
784
|
-
|
|
1165
|
+
describe "#or" do
|
|
785
1166
|
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
end
|
|
1167
|
+
let(:tested_method) { :or }
|
|
1168
|
+
let(:expected_operator) { '$or' }
|
|
789
1169
|
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
end
|
|
793
|
-
|
|
794
|
-
it "returns the query" do
|
|
795
|
-
expect(selection).to eq(query)
|
|
796
|
-
end
|
|
797
|
-
|
|
798
|
-
it_behaves_like 'returns a cloned query'
|
|
799
|
-
end
|
|
800
|
-
|
|
801
|
-
context "when provided a single criterion" do
|
|
802
|
-
|
|
803
|
-
let(:selection) do
|
|
804
|
-
query.nor(field: [ 1, 2 ])
|
|
805
|
-
end
|
|
806
|
-
|
|
807
|
-
it "adds the $nor selector" do
|
|
808
|
-
expect(selection.selector).to eq({
|
|
809
|
-
"$nor" => [{"field" => [ 1, 2 ] }]
|
|
810
|
-
})
|
|
811
|
-
end
|
|
812
|
-
|
|
813
|
-
it_behaves_like 'returns a cloned query'
|
|
814
|
-
end
|
|
815
|
-
|
|
816
|
-
context "when provided multiple criterion" do
|
|
817
|
-
|
|
818
|
-
context "when the criterion are fnor different fields" do
|
|
819
|
-
|
|
820
|
-
let(:selection) do
|
|
821
|
-
query.nor({ first: [ 1, 2 ] }, { second: [ 3, 4 ] })
|
|
822
|
-
end
|
|
823
|
-
|
|
824
|
-
it "adds the $nor selector" do
|
|
825
|
-
expect(selection.selector).to eq({
|
|
826
|
-
"$nor" => [
|
|
827
|
-
{ "first" => [ 1, 2 ] },
|
|
828
|
-
{ "second" => [ 3, 4 ] }
|
|
829
|
-
]
|
|
830
|
-
})
|
|
831
|
-
end
|
|
832
|
-
|
|
833
|
-
it_behaves_like 'returns a cloned query'
|
|
834
|
-
end
|
|
835
|
-
|
|
836
|
-
context "when the criterion are on the same field" do
|
|
837
|
-
|
|
838
|
-
let(:selection) do
|
|
839
|
-
query.nor({ first: [ 1, 2 ] }, { first: [ 3, 4 ] })
|
|
840
|
-
end
|
|
841
|
-
|
|
842
|
-
it "appends both $nor expressions" do
|
|
843
|
-
expect(selection.selector).to eq({
|
|
844
|
-
"$nor" => [
|
|
845
|
-
{ "first" => [ 1, 2 ] },
|
|
846
|
-
{ "first" => [ 3, 4 ] }
|
|
847
|
-
]
|
|
848
|
-
})
|
|
849
|
-
end
|
|
850
|
-
|
|
851
|
-
it_behaves_like 'returns a cloned query'
|
|
852
|
-
end
|
|
853
|
-
end
|
|
854
|
-
|
|
855
|
-
context "when chaining the criterion" do
|
|
856
|
-
|
|
857
|
-
context "when the criterion are fnor different fields" do
|
|
858
|
-
|
|
859
|
-
let(:selection) do
|
|
860
|
-
query.nor(first: [ 1, 2 ]).nor(second: [ 3, 4 ])
|
|
861
|
-
end
|
|
862
|
-
|
|
863
|
-
it "adds the $nor selectors" do
|
|
864
|
-
expect(selection.selector).to eq({
|
|
865
|
-
"$nor" => [
|
|
866
|
-
{ "first" => [ 1, 2 ] },
|
|
867
|
-
{ "second" => [ 3, 4 ] }
|
|
868
|
-
]
|
|
869
|
-
})
|
|
870
|
-
end
|
|
871
|
-
|
|
872
|
-
it_behaves_like 'returns a cloned query'
|
|
873
|
-
end
|
|
874
|
-
|
|
875
|
-
context "when the criterion are on the same field" do
|
|
1170
|
+
it_behaves_like '$or/$nor'
|
|
1171
|
+
end
|
|
876
1172
|
|
|
877
|
-
|
|
878
|
-
query.nor(first: [ 1, 2 ]).nor(first: [ 3, 4 ])
|
|
879
|
-
end
|
|
1173
|
+
describe "#nor" do
|
|
880
1174
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
"$nor" => [
|
|
884
|
-
{ "first" => [ 1, 2 ] },
|
|
885
|
-
{ "first" => [ 3, 4 ] }
|
|
886
|
-
]
|
|
887
|
-
})
|
|
888
|
-
end
|
|
1175
|
+
let(:tested_method) { :nor }
|
|
1176
|
+
let(:expected_operator) { '$nor' }
|
|
889
1177
|
|
|
890
|
-
|
|
891
|
-
end
|
|
892
|
-
end
|
|
1178
|
+
it_behaves_like '$or/$nor'
|
|
893
1179
|
end
|
|
894
1180
|
|
|
895
1181
|
describe "#any_of" do
|
|
@@ -1058,6 +1344,34 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1058
1344
|
)
|
|
1059
1345
|
end
|
|
1060
1346
|
end
|
|
1347
|
+
|
|
1348
|
+
context 'when any_of has multiple arguments' do
|
|
1349
|
+
|
|
1350
|
+
let(:selection) do
|
|
1351
|
+
query.or(field: [ 1, 2 ]).where(foo: 'bar').any_of({a: 1}, {b: 2})
|
|
1352
|
+
end
|
|
1353
|
+
|
|
1354
|
+
it 'adds the new condition to top level' do
|
|
1355
|
+
expect(selection.selector).to eq(
|
|
1356
|
+
'$or' => [{'field' => [1, 2]}],
|
|
1357
|
+
'foo' => 'bar',
|
|
1358
|
+
'$and' => [{'$or' => [{'a' => 1}, {'b' => 2}]}],
|
|
1359
|
+
)
|
|
1360
|
+
end
|
|
1361
|
+
|
|
1362
|
+
context 'when query already has a top-level $and' do
|
|
1363
|
+
let(:selection) do
|
|
1364
|
+
query.or(field: [ 1, 2 ]).where('$and' => [foo: 'bar']).any_of({a: 1}, {b: 2})
|
|
1365
|
+
end
|
|
1366
|
+
|
|
1367
|
+
it 'adds the new condition to top level $and' do
|
|
1368
|
+
expect(selection.selector).to eq(
|
|
1369
|
+
'$or' => [{'field' => [1, 2]}],
|
|
1370
|
+
'$and' => [{'foo' => 'bar'}, {'$or' => [{'a' => 1}, {'b' => 2}]}],
|
|
1371
|
+
)
|
|
1372
|
+
end
|
|
1373
|
+
end
|
|
1374
|
+
end
|
|
1061
1375
|
end
|
|
1062
1376
|
|
|
1063
1377
|
context "when provided multiple criteria" do
|
|
@@ -1098,6 +1412,156 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1098
1412
|
it_behaves_like 'returns a cloned query'
|
|
1099
1413
|
end
|
|
1100
1414
|
|
|
1415
|
+
context 'when criteria are simple and handled via Key' do
|
|
1416
|
+
shared_examples_for 'adds conditions with $or' do
|
|
1417
|
+
|
|
1418
|
+
it "adds conditions with $or" do
|
|
1419
|
+
expect(selection.selector).to eq({
|
|
1420
|
+
'$or' => [
|
|
1421
|
+
{'field' => 3},
|
|
1422
|
+
{'field' => {'$lt' => 5}},
|
|
1423
|
+
],
|
|
1424
|
+
})
|
|
1425
|
+
end
|
|
1426
|
+
|
|
1427
|
+
it_behaves_like 'returns a cloned query'
|
|
1428
|
+
end
|
|
1429
|
+
|
|
1430
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
1431
|
+
|
|
1432
|
+
it "combines conditions with $eq" do
|
|
1433
|
+
expect(selection.selector).to eq({
|
|
1434
|
+
'field' => {
|
|
1435
|
+
'$eq' => 3,
|
|
1436
|
+
'$lt' => 5,
|
|
1437
|
+
},
|
|
1438
|
+
})
|
|
1439
|
+
end
|
|
1440
|
+
|
|
1441
|
+
it_behaves_like 'returns a cloned query'
|
|
1442
|
+
end
|
|
1443
|
+
|
|
1444
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
1445
|
+
|
|
1446
|
+
it "combines conditions with $regex" do
|
|
1447
|
+
expect(selection.selector).to eq({
|
|
1448
|
+
'field' => {
|
|
1449
|
+
'$regex' => /t/,
|
|
1450
|
+
'$lt' => 5,
|
|
1451
|
+
},
|
|
1452
|
+
})
|
|
1453
|
+
end
|
|
1454
|
+
|
|
1455
|
+
it_behaves_like 'returns a cloned query'
|
|
1456
|
+
end
|
|
1457
|
+
|
|
1458
|
+
context 'criteria are provided in the same hash' do
|
|
1459
|
+
context 'non-regexp argument' do
|
|
1460
|
+
let(:selection) do
|
|
1461
|
+
query.send(tested_method, :field => 3, :field.lt => 5)
|
|
1462
|
+
end
|
|
1463
|
+
|
|
1464
|
+
it_behaves_like 'combines conditions with $eq'
|
|
1465
|
+
end
|
|
1466
|
+
|
|
1467
|
+
context 'regexp argument' do
|
|
1468
|
+
let(:selection) do
|
|
1469
|
+
query.send(tested_method, :field => /t/, :field.lt => 5)
|
|
1470
|
+
end
|
|
1471
|
+
|
|
1472
|
+
it_behaves_like 'combines conditions with $regex'
|
|
1473
|
+
end
|
|
1474
|
+
end
|
|
1475
|
+
|
|
1476
|
+
context 'criteria are provided in separate hashes' do
|
|
1477
|
+
let(:selection) do
|
|
1478
|
+
query.send(tested_method, {:field => 3}, {:field.lt => 5})
|
|
1479
|
+
end
|
|
1480
|
+
|
|
1481
|
+
it_behaves_like 'adds conditions with $or'
|
|
1482
|
+
end
|
|
1483
|
+
|
|
1484
|
+
context 'when the criterion is wrapped in an array' do
|
|
1485
|
+
let(:selection) do
|
|
1486
|
+
query.send(tested_method, [:field => 3], [:field.lt => 5])
|
|
1487
|
+
end
|
|
1488
|
+
|
|
1489
|
+
it_behaves_like 'adds conditions with $or'
|
|
1490
|
+
end
|
|
1491
|
+
end
|
|
1492
|
+
|
|
1493
|
+
context 'when criteria are handled via Key and simple' do
|
|
1494
|
+
shared_examples_for 'adds conditions with $or' do
|
|
1495
|
+
|
|
1496
|
+
it "adds conditions with $or" do
|
|
1497
|
+
expect(selection.selector).to eq({
|
|
1498
|
+
'$or' => [
|
|
1499
|
+
{'field' => {'$gt' => 3}},
|
|
1500
|
+
{'field' => 5},
|
|
1501
|
+
],
|
|
1502
|
+
})
|
|
1503
|
+
end
|
|
1504
|
+
|
|
1505
|
+
it_behaves_like 'returns a cloned query'
|
|
1506
|
+
end
|
|
1507
|
+
|
|
1508
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
1509
|
+
|
|
1510
|
+
it "combines conditions with $eq" do
|
|
1511
|
+
expect(selection.selector).to eq(
|
|
1512
|
+
'field' => {'$gt' => 3, '$eq' => 5},
|
|
1513
|
+
)
|
|
1514
|
+
end
|
|
1515
|
+
|
|
1516
|
+
it_behaves_like 'returns a cloned query'
|
|
1517
|
+
end
|
|
1518
|
+
|
|
1519
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
1520
|
+
|
|
1521
|
+
it "combines conditions with $regex" do
|
|
1522
|
+
expect(selection.selector).to eq(
|
|
1523
|
+
'field' => {'$gt' => 3, '$regex' => /t/},
|
|
1524
|
+
)
|
|
1525
|
+
end
|
|
1526
|
+
|
|
1527
|
+
it_behaves_like 'returns a cloned query'
|
|
1528
|
+
end
|
|
1529
|
+
|
|
1530
|
+
context 'criteria are provided in the same hash' do
|
|
1531
|
+
context 'non-regexp argument' do
|
|
1532
|
+
let(:selection) do
|
|
1533
|
+
query.send(tested_method, :field.gt => 3, :field => 5)
|
|
1534
|
+
end
|
|
1535
|
+
|
|
1536
|
+
it_behaves_like 'combines conditions with $eq'
|
|
1537
|
+
end
|
|
1538
|
+
|
|
1539
|
+
context 'regexp argument' do
|
|
1540
|
+
let(:selection) do
|
|
1541
|
+
query.send(tested_method, :field.gt => 3, :field => /t/)
|
|
1542
|
+
end
|
|
1543
|
+
|
|
1544
|
+
it_behaves_like 'combines conditions with $regex'
|
|
1545
|
+
end
|
|
1546
|
+
end
|
|
1547
|
+
|
|
1548
|
+
context 'criteria are provided in separate hashes' do
|
|
1549
|
+
let(:selection) do
|
|
1550
|
+
query.send(tested_method, {:field.gt => 3}, {:field => 5})
|
|
1551
|
+
end
|
|
1552
|
+
|
|
1553
|
+
it_behaves_like 'adds conditions with $or'
|
|
1554
|
+
end
|
|
1555
|
+
|
|
1556
|
+
context 'when the criterion is wrapped in an array' do
|
|
1557
|
+
let(:selection) do
|
|
1558
|
+
query.send(tested_method, [:field.gt => 3], [:field => 5])
|
|
1559
|
+
end
|
|
1560
|
+
|
|
1561
|
+
it_behaves_like 'adds conditions with $or'
|
|
1562
|
+
end
|
|
1563
|
+
end
|
|
1564
|
+
|
|
1101
1565
|
context "when a criterion has an aliased field" do
|
|
1102
1566
|
|
|
1103
1567
|
let(:selection) do
|
|
@@ -1184,6 +1648,42 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1184
1648
|
end
|
|
1185
1649
|
end
|
|
1186
1650
|
end
|
|
1651
|
+
|
|
1652
|
+
context 'when using multiple criteria and symbol operators' do
|
|
1653
|
+
context 'when using fields that meaningfully evolve values' do
|
|
1654
|
+
|
|
1655
|
+
let(:query) do
|
|
1656
|
+
Dictionary.any_of({a: 1}, :published.gt => Date.new(2020, 2, 3))
|
|
1657
|
+
end
|
|
1658
|
+
|
|
1659
|
+
it 'generates the expected query' do
|
|
1660
|
+
query.selector.should == {'$or' => [
|
|
1661
|
+
{'a' => 1},
|
|
1662
|
+
# Date instance is converted to a Time instance in local time,
|
|
1663
|
+
# because we are querying on a Time field and dates are interpreted
|
|
1664
|
+
# in local time when assigning to Time fields
|
|
1665
|
+
{'published' => {'$gt' => Time.local(2020, 2, 3)}},
|
|
1666
|
+
]}
|
|
1667
|
+
end
|
|
1668
|
+
end
|
|
1669
|
+
|
|
1670
|
+
context 'when using fields that do not meaningfully evolve values' do
|
|
1671
|
+
|
|
1672
|
+
let(:query) do
|
|
1673
|
+
Dictionary.any_of({a: 1}, :submitted_on.gt => Date.new(2020, 2, 3))
|
|
1674
|
+
end
|
|
1675
|
+
|
|
1676
|
+
it 'generates the expected query' do
|
|
1677
|
+
query.selector.should == {'$or' => [
|
|
1678
|
+
{'a' => 1},
|
|
1679
|
+
# Date instance is converted to a Time instance in UTC,
|
|
1680
|
+
# because we are querying on a Date field and dates are interpreted
|
|
1681
|
+
# in UTC when persisted as dates by Mongoid
|
|
1682
|
+
{'submitted_on' => {'$gt' => Time.utc(2020, 2, 3)}},
|
|
1683
|
+
]}
|
|
1684
|
+
end
|
|
1685
|
+
end
|
|
1686
|
+
end
|
|
1187
1687
|
end
|
|
1188
1688
|
|
|
1189
1689
|
describe "#not" do
|
|
@@ -1271,6 +1771,25 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1271
1771
|
end
|
|
1272
1772
|
end
|
|
1273
1773
|
|
|
1774
|
+
context "when the criteria uses Key" do
|
|
1775
|
+
|
|
1776
|
+
let(:selection) do
|
|
1777
|
+
query.not(:age.gt => 50)
|
|
1778
|
+
end
|
|
1779
|
+
|
|
1780
|
+
it "negates the gt selection" do
|
|
1781
|
+
expect(selection.selector).to eq(
|
|
1782
|
+
'$and' => ['$nor' => ['age' => {'$gt' => 50}]]
|
|
1783
|
+
)
|
|
1784
|
+
end
|
|
1785
|
+
|
|
1786
|
+
it_behaves_like 'returns a cloned query'
|
|
1787
|
+
|
|
1788
|
+
it "removes the negation on the clone" do
|
|
1789
|
+
expect(selection).to_not be_negating
|
|
1790
|
+
end
|
|
1791
|
+
end
|
|
1792
|
+
|
|
1274
1793
|
context "when the following criteria is a where" do
|
|
1275
1794
|
|
|
1276
1795
|
let(:selection) do
|
|
@@ -1543,5 +2062,477 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1543
2062
|
)
|
|
1544
2063
|
end
|
|
1545
2064
|
end
|
|
2065
|
+
|
|
2066
|
+
context 'when giving multiple conditions in one call on the same key with symbol operator' do
|
|
2067
|
+
|
|
2068
|
+
context 'non-regexp argument' do
|
|
2069
|
+
let(:selection) do
|
|
2070
|
+
query.not(field: 1, :field.gt => 0)
|
|
2071
|
+
end
|
|
2072
|
+
|
|
2073
|
+
it 'combines conditions with $eq' do
|
|
2074
|
+
selection.selector.should == {
|
|
2075
|
+
'$and' => ['$nor' => [
|
|
2076
|
+
'field' => {'$eq' => 1, '$gt' => 0},
|
|
2077
|
+
]]
|
|
2078
|
+
}
|
|
2079
|
+
end
|
|
2080
|
+
end
|
|
2081
|
+
|
|
2082
|
+
context 'regexp argument' do
|
|
2083
|
+
let(:selection) do
|
|
2084
|
+
query.not(field: /t/, :field.gt => 0)
|
|
2085
|
+
end
|
|
2086
|
+
|
|
2087
|
+
it 'combines conditions with $regex' do
|
|
2088
|
+
selection.selector.should == {
|
|
2089
|
+
'$and' => ['$nor' => [
|
|
2090
|
+
'field' => {'$regex' => /t/, '$gt' => 0},
|
|
2091
|
+
]]
|
|
2092
|
+
}
|
|
2093
|
+
end
|
|
2094
|
+
end
|
|
2095
|
+
end
|
|
2096
|
+
|
|
2097
|
+
# This test confirms that MONGOID-5097 has been repaired.
|
|
2098
|
+
context "when using exists on a field of type Time" do
|
|
2099
|
+
let(:criteria) do
|
|
2100
|
+
Dictionary.any_of({:published.exists => true}, published: nil)
|
|
2101
|
+
end
|
|
2102
|
+
|
|
2103
|
+
it "doesn't raise an error" do
|
|
2104
|
+
expect do
|
|
2105
|
+
criteria
|
|
2106
|
+
end.to_not raise_error
|
|
2107
|
+
end
|
|
2108
|
+
|
|
2109
|
+
it "generates the correct selector" do
|
|
2110
|
+
expect(criteria.selector).to eq({
|
|
2111
|
+
"$or" => [ {
|
|
2112
|
+
"published" => { "$exists" => true }
|
|
2113
|
+
}, {
|
|
2114
|
+
"published" => nil
|
|
2115
|
+
} ] } )
|
|
2116
|
+
end
|
|
2117
|
+
end
|
|
2118
|
+
end
|
|
2119
|
+
|
|
2120
|
+
describe "#none_of" do
|
|
2121
|
+
context 'when argument is a mix of Criteria and hashes' do
|
|
2122
|
+
let(:query) { Mongoid::Query.new.where(hello: 'world') }
|
|
2123
|
+
let(:other1) { Mongoid::Query.new.where(foo: 'bar') }
|
|
2124
|
+
let(:other2) { { bar: 42 } }
|
|
2125
|
+
let(:other3) { Mongoid::Query.new.where(a: 2) }
|
|
2126
|
+
|
|
2127
|
+
let(:result) { query.none_of(other1, other2, other3) }
|
|
2128
|
+
|
|
2129
|
+
it 'combines' do
|
|
2130
|
+
expect(result.selector).to eq(
|
|
2131
|
+
'hello' => 'world',
|
|
2132
|
+
'$nor' => [
|
|
2133
|
+
{'foo' => 'bar'},
|
|
2134
|
+
{'bar' => 42},
|
|
2135
|
+
{'a' => 2},
|
|
2136
|
+
],
|
|
2137
|
+
)
|
|
2138
|
+
end
|
|
2139
|
+
end
|
|
2140
|
+
|
|
2141
|
+
context "when provided no arguments" do
|
|
2142
|
+
let(:selection) { query.none_of }
|
|
2143
|
+
|
|
2144
|
+
it_behaves_like 'returns a cloned query'
|
|
2145
|
+
|
|
2146
|
+
it "does not add any criteria" do
|
|
2147
|
+
expect(selection.selector).to eq({})
|
|
2148
|
+
end
|
|
2149
|
+
|
|
2150
|
+
it "returns the query" do
|
|
2151
|
+
expect(selection).to eq(query)
|
|
2152
|
+
end
|
|
2153
|
+
end
|
|
2154
|
+
|
|
2155
|
+
context "when provided nil" do
|
|
2156
|
+
let(:selection) { query.none_of(nil) }
|
|
2157
|
+
|
|
2158
|
+
it_behaves_like 'returns a cloned query'
|
|
2159
|
+
|
|
2160
|
+
it "does not add any criteria" do
|
|
2161
|
+
expect(selection.selector).to eq({})
|
|
2162
|
+
end
|
|
2163
|
+
|
|
2164
|
+
it "returns the query" do
|
|
2165
|
+
expect(selection).to eq(query)
|
|
2166
|
+
end
|
|
2167
|
+
end
|
|
2168
|
+
|
|
2169
|
+
context "when provided a single criterion" do
|
|
2170
|
+
let(:selection) { query.none_of(field: [ 1, 2 ]) }
|
|
2171
|
+
|
|
2172
|
+
it_behaves_like 'returns a cloned query'
|
|
2173
|
+
|
|
2174
|
+
it 'adds the $nor selector' do
|
|
2175
|
+
expect(selection.selector).to eq(
|
|
2176
|
+
'$nor' => [ { 'field' => [ 1, 2 ] } ],
|
|
2177
|
+
)
|
|
2178
|
+
end
|
|
2179
|
+
|
|
2180
|
+
context 'when the criterion is wrapped in array' do
|
|
2181
|
+
let(:selection) { query.none_of([{ field: [ 1, 2 ] }]) }
|
|
2182
|
+
|
|
2183
|
+
it_behaves_like 'returns a cloned query'
|
|
2184
|
+
|
|
2185
|
+
it 'adds the condition' do
|
|
2186
|
+
expect(selection.selector).to eq(
|
|
2187
|
+
'$nor' => [ { 'field' => [ 1, 2 ] } ],
|
|
2188
|
+
)
|
|
2189
|
+
end
|
|
2190
|
+
|
|
2191
|
+
context 'when the array has nil as one of the elements' do
|
|
2192
|
+
let(:selection) { query.none_of([{ field: [ 1, 2 ] }, nil]) }
|
|
2193
|
+
|
|
2194
|
+
it_behaves_like 'returns a cloned query'
|
|
2195
|
+
|
|
2196
|
+
it 'adds the $nor selector ignoring the nil element' do
|
|
2197
|
+
expect(selection.selector).to eq(
|
|
2198
|
+
'$nor' => [ { 'field' => [ 1, 2 ] } ],
|
|
2199
|
+
)
|
|
2200
|
+
end
|
|
2201
|
+
end
|
|
2202
|
+
end
|
|
2203
|
+
|
|
2204
|
+
context 'when query already has a condition on another field' do
|
|
2205
|
+
context 'when there is one argument' do
|
|
2206
|
+
let(:selection) { query.where(foo: 'bar').none_of(field: [ 1, 2 ]) }
|
|
2207
|
+
|
|
2208
|
+
it 'adds the new condition' do
|
|
2209
|
+
expect(selection.selector).to eq(
|
|
2210
|
+
'foo' => 'bar',
|
|
2211
|
+
'$nor' => [ { 'field' => [1, 2] } ],
|
|
2212
|
+
)
|
|
2213
|
+
end
|
|
2214
|
+
end
|
|
2215
|
+
|
|
2216
|
+
context 'when there are multiple arguments' do
|
|
2217
|
+
let(:selection) do
|
|
2218
|
+
query.where(foo: 'bar').none_of({ field: [ 1, 2 ] }, { hello: 'world' })
|
|
2219
|
+
end
|
|
2220
|
+
|
|
2221
|
+
it 'adds the new condition' do
|
|
2222
|
+
expect(selection.selector).to eq(
|
|
2223
|
+
'foo' => 'bar',
|
|
2224
|
+
'$nor' => [
|
|
2225
|
+
{ 'field' => [1, 2] },
|
|
2226
|
+
{ 'hello' => 'world' },
|
|
2227
|
+
],
|
|
2228
|
+
)
|
|
2229
|
+
end
|
|
2230
|
+
end
|
|
2231
|
+
end
|
|
2232
|
+
|
|
2233
|
+
context 'when query already has a $nor condition and another condition' do
|
|
2234
|
+
let(:selection) do
|
|
2235
|
+
query.nor(field: [ 1, 2 ]).where(foo: 'bar').none_of(test: 1)
|
|
2236
|
+
end
|
|
2237
|
+
|
|
2238
|
+
it 'adds the new condition' do
|
|
2239
|
+
expect(selection.selector).to eq(
|
|
2240
|
+
'$nor' => [ { 'field' => [1, 2] } ],
|
|
2241
|
+
'foo' => 'bar',
|
|
2242
|
+
'$and' => [ { '$nor' => [ { 'test' => 1 } ] } ]
|
|
2243
|
+
)
|
|
2244
|
+
end
|
|
2245
|
+
end
|
|
2246
|
+
|
|
2247
|
+
context 'when none_of has multiple arguments' do
|
|
2248
|
+
let(:selection) do
|
|
2249
|
+
query.nor(field: [ 1, 2 ]).where(foo: 'bar').none_of({a: 1}, {b: 2})
|
|
2250
|
+
end
|
|
2251
|
+
|
|
2252
|
+
it 'adds the new condition to top level' do
|
|
2253
|
+
expect(selection.selector).to eq(
|
|
2254
|
+
'foo' => 'bar',
|
|
2255
|
+
'$nor' => [ { 'field' => [1, 2] } ],
|
|
2256
|
+
'$and' => [ { '$nor' => [ { 'a' => 1 }, { 'b' => 2 } ] } ]
|
|
2257
|
+
)
|
|
2258
|
+
end
|
|
2259
|
+
|
|
2260
|
+
context 'when query already has a top-level $and' do
|
|
2261
|
+
let(:selection) do
|
|
2262
|
+
query.nor(field: [ 1, 2 ]).where('$and' => [foo: 'bar']).none_of({a: 1}, {b: 2})
|
|
2263
|
+
end
|
|
2264
|
+
|
|
2265
|
+
it 'adds the new condition to top level $and' do
|
|
2266
|
+
expect(selection.selector).to eq(
|
|
2267
|
+
'$nor' => [ { 'field' => [1, 2] } ],
|
|
2268
|
+
'$and' => [
|
|
2269
|
+
{ 'foo' => 'bar' },
|
|
2270
|
+
{ '$nor' => [ { 'a' => 1 }, { 'b' => 2 } ] }
|
|
2271
|
+
],
|
|
2272
|
+
)
|
|
2273
|
+
end
|
|
2274
|
+
end
|
|
2275
|
+
end
|
|
2276
|
+
end
|
|
2277
|
+
|
|
2278
|
+
context "when provided multiple criteria" do
|
|
2279
|
+
context "when the criteria are for different fields" do
|
|
2280
|
+
let(:selection) do
|
|
2281
|
+
query.none_of({ first: [ 1, 2 ] }, { second: [ 3, 4 ] })
|
|
2282
|
+
end
|
|
2283
|
+
|
|
2284
|
+
it_behaves_like 'returns a cloned query'
|
|
2285
|
+
|
|
2286
|
+
it "adds the $nor selector" do
|
|
2287
|
+
expect(selection.selector).to eq({
|
|
2288
|
+
"$nor" => [
|
|
2289
|
+
{ "first" => [ 1, 2 ] },
|
|
2290
|
+
{ "second" => [ 3, 4 ] }
|
|
2291
|
+
]
|
|
2292
|
+
})
|
|
2293
|
+
end
|
|
2294
|
+
end
|
|
2295
|
+
|
|
2296
|
+
context "when the criteria uses a Key instance" do
|
|
2297
|
+
let(:selection) do
|
|
2298
|
+
query.none_of({ first: [ 1, 2 ] }, { :second.gt => 3 })
|
|
2299
|
+
end
|
|
2300
|
+
|
|
2301
|
+
it "adds the $nor selector" do
|
|
2302
|
+
expect(selection.selector).to eq({
|
|
2303
|
+
"$nor" => [
|
|
2304
|
+
{ "first" => [ 1, 2 ] },
|
|
2305
|
+
{ "second" => { "$gt" => 3 }}
|
|
2306
|
+
]
|
|
2307
|
+
})
|
|
2308
|
+
end
|
|
2309
|
+
|
|
2310
|
+
it_behaves_like 'returns a cloned query'
|
|
2311
|
+
end
|
|
2312
|
+
|
|
2313
|
+
context 'when criteria are simple and handled via Key' do
|
|
2314
|
+
shared_examples_for 'adds conditions with $nor' do
|
|
2315
|
+
it "adds conditions with $nor" do
|
|
2316
|
+
expect(selection.selector).to eq({
|
|
2317
|
+
'$nor' => [
|
|
2318
|
+
{'field' => 3},
|
|
2319
|
+
{'field' => {'$lt' => 5}},
|
|
2320
|
+
],
|
|
2321
|
+
})
|
|
2322
|
+
end
|
|
2323
|
+
|
|
2324
|
+
it_behaves_like 'returns a cloned query'
|
|
2325
|
+
end
|
|
2326
|
+
|
|
2327
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
2328
|
+
it "combines conditions with $eq" do
|
|
2329
|
+
expect(selection.selector).to eq({
|
|
2330
|
+
'$nor' => [ { 'field' => { '$eq' => 3, '$lt' => 5 } } ]
|
|
2331
|
+
})
|
|
2332
|
+
end
|
|
2333
|
+
|
|
2334
|
+
it_behaves_like 'returns a cloned query'
|
|
2335
|
+
end
|
|
2336
|
+
|
|
2337
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
2338
|
+
it 'combines conditions with $regex' do
|
|
2339
|
+
expect(selection.selector).to eq({
|
|
2340
|
+
'$nor' => [ { 'field' => { '$regex' => /t/, '$lt' => 5 } } ]
|
|
2341
|
+
})
|
|
2342
|
+
end
|
|
2343
|
+
|
|
2344
|
+
it_behaves_like 'returns a cloned query'
|
|
2345
|
+
end
|
|
2346
|
+
|
|
2347
|
+
context 'criteria are provided in the same hash' do
|
|
2348
|
+
context 'non-regexp argument' do
|
|
2349
|
+
let(:selection) { query.none_of(:field => 3, :field.lt => 5) }
|
|
2350
|
+
it_behaves_like 'combines conditions with $eq'
|
|
2351
|
+
end
|
|
2352
|
+
|
|
2353
|
+
context 'regexp argument' do
|
|
2354
|
+
let(:selection) { query.none_of(:field => /t/, :field.lt => 5) }
|
|
2355
|
+
it_behaves_like 'combines conditions with $regex'
|
|
2356
|
+
end
|
|
2357
|
+
end
|
|
2358
|
+
|
|
2359
|
+
context 'criteria are provided in separate hashes' do
|
|
2360
|
+
let(:selection) { query.none_of({:field => 3}, {:field.lt => 5}) }
|
|
2361
|
+
it_behaves_like 'adds conditions with $nor'
|
|
2362
|
+
end
|
|
2363
|
+
|
|
2364
|
+
context 'when the criterion is wrapped in an array' do
|
|
2365
|
+
let(:selection) { query.none_of([:field => 3], [:field.lt => 5]) }
|
|
2366
|
+
it_behaves_like 'adds conditions with $nor'
|
|
2367
|
+
end
|
|
2368
|
+
end
|
|
2369
|
+
|
|
2370
|
+
context 'when criteria are handled via Key and simple' do
|
|
2371
|
+
shared_examples_for 'adds conditions with $nor' do
|
|
2372
|
+
it 'adds conditions with $nor' do
|
|
2373
|
+
expect(selection.selector).to eq({
|
|
2374
|
+
'$nor' => [
|
|
2375
|
+
{ 'field' => { '$gt' => 3 } },
|
|
2376
|
+
{ 'field' => 5 },
|
|
2377
|
+
],
|
|
2378
|
+
})
|
|
2379
|
+
end
|
|
2380
|
+
|
|
2381
|
+
it_behaves_like 'returns a cloned query'
|
|
2382
|
+
end
|
|
2383
|
+
|
|
2384
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
2385
|
+
it 'combines conditions with $eq' do
|
|
2386
|
+
expect(selection.selector).to eq(
|
|
2387
|
+
'$nor' => [ { 'field' => {'$gt' => 3, '$eq' => 5} } ],
|
|
2388
|
+
)
|
|
2389
|
+
end
|
|
2390
|
+
|
|
2391
|
+
it_behaves_like 'returns a cloned query'
|
|
2392
|
+
end
|
|
2393
|
+
|
|
2394
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
2395
|
+
it 'combines conditions with $regex' do
|
|
2396
|
+
expect(selection.selector).to eq(
|
|
2397
|
+
'$nor' => [ { 'field' => {'$gt' => 3, '$regex' => /t/} } ],
|
|
2398
|
+
)
|
|
2399
|
+
end
|
|
2400
|
+
|
|
2401
|
+
it_behaves_like 'returns a cloned query'
|
|
2402
|
+
end
|
|
2403
|
+
|
|
2404
|
+
context 'criteria are provided in the same hash' do
|
|
2405
|
+
context 'non-regexp argument' do
|
|
2406
|
+
let(:selection) { query.none_of(:field.gt => 3, :field => 5) }
|
|
2407
|
+
it_behaves_like 'combines conditions with $eq'
|
|
2408
|
+
end
|
|
2409
|
+
|
|
2410
|
+
context 'regexp argument' do
|
|
2411
|
+
let(:selection) { query.none_of(:field.gt => 3, :field => /t/) }
|
|
2412
|
+
it_behaves_like 'combines conditions with $regex'
|
|
2413
|
+
end
|
|
2414
|
+
end
|
|
2415
|
+
|
|
2416
|
+
context 'criteria are provided in separate hashes' do
|
|
2417
|
+
let(:selection) { query.none_of({:field.gt => 3}, {:field => 5}) }
|
|
2418
|
+
it_behaves_like 'adds conditions with $nor'
|
|
2419
|
+
end
|
|
2420
|
+
|
|
2421
|
+
context 'when the criterion is wrapped in an array' do
|
|
2422
|
+
let(:selection) { query.none_of([:field.gt => 3], [:field => 5]) }
|
|
2423
|
+
it_behaves_like 'adds conditions with $nor'
|
|
2424
|
+
end
|
|
2425
|
+
end
|
|
2426
|
+
|
|
2427
|
+
context 'when a criterion has an aliased field' do
|
|
2428
|
+
let(:selection) { query.none_of({ id: 1 }) }
|
|
2429
|
+
|
|
2430
|
+
it 'adds the $nor selector and aliases the field' do
|
|
2431
|
+
expect(selection.selector).to eq('$nor' => [{ '_id' => 1 }])
|
|
2432
|
+
end
|
|
2433
|
+
|
|
2434
|
+
it_behaves_like 'returns a cloned query'
|
|
2435
|
+
end
|
|
2436
|
+
|
|
2437
|
+
context 'when a criterion is wrapped in an array' do
|
|
2438
|
+
let(:selection) do
|
|
2439
|
+
query.none_of([{ first: [ 1, 2 ] }, { :second.gt => 3 }])
|
|
2440
|
+
end
|
|
2441
|
+
|
|
2442
|
+
it_behaves_like 'returns a cloned query'
|
|
2443
|
+
|
|
2444
|
+
it 'adds the $ nor selector' do
|
|
2445
|
+
expect(selection.selector).to eq({
|
|
2446
|
+
'$nor' => [
|
|
2447
|
+
{ 'first' => [ 1, 2 ] },
|
|
2448
|
+
{ 'second' => { '$gt' => 3 }}
|
|
2449
|
+
]
|
|
2450
|
+
})
|
|
2451
|
+
end
|
|
2452
|
+
end
|
|
2453
|
+
|
|
2454
|
+
context "when the criteria are on the same field" do
|
|
2455
|
+
let(:selection) do
|
|
2456
|
+
query.none_of({ first: [ 1, 2 ] }, { first: [ 3, 4 ] })
|
|
2457
|
+
end
|
|
2458
|
+
|
|
2459
|
+
it_behaves_like 'returns a cloned query'
|
|
2460
|
+
|
|
2461
|
+
it 'appends both $nor expressions' do
|
|
2462
|
+
expect(selection.selector).to eq({
|
|
2463
|
+
"$nor" => [
|
|
2464
|
+
{ "first" => [ 1, 2 ] },
|
|
2465
|
+
{ "first" => [ 3, 4 ] }
|
|
2466
|
+
]
|
|
2467
|
+
})
|
|
2468
|
+
end
|
|
2469
|
+
end
|
|
2470
|
+
end
|
|
2471
|
+
|
|
2472
|
+
context 'when chaining the criteria' do
|
|
2473
|
+
context 'when the criteria are for different fields' do
|
|
2474
|
+
let(:selection) do
|
|
2475
|
+
query.none_of(first: [ 1, 2 ]).none_of(second: [ 3, 4 ])
|
|
2476
|
+
end
|
|
2477
|
+
|
|
2478
|
+
it_behaves_like 'returns a cloned query'
|
|
2479
|
+
|
|
2480
|
+
it 'adds the conditions separately' do
|
|
2481
|
+
expect(selection.selector).to eq(
|
|
2482
|
+
'$nor' => [ { 'first' => [ 1, 2 ] } ],
|
|
2483
|
+
'$and' => [ { '$nor' => [ { 'second' => [ 3, 4 ] } ] } ],
|
|
2484
|
+
)
|
|
2485
|
+
end
|
|
2486
|
+
end
|
|
2487
|
+
|
|
2488
|
+
context "when the criteria are on the same field" do
|
|
2489
|
+
let(:selection) do
|
|
2490
|
+
query.none_of(first: [ 1, 2 ]).none_of(first: [ 3, 4 ])
|
|
2491
|
+
end
|
|
2492
|
+
|
|
2493
|
+
it_behaves_like 'returns a cloned query'
|
|
2494
|
+
|
|
2495
|
+
it 'adds the conditions separately' do
|
|
2496
|
+
expect(selection.selector).to eq(
|
|
2497
|
+
'$nor' => [ { 'first' => [ 1, 2 ] } ],
|
|
2498
|
+
'$and' => [ { '$nor' => [ { 'first' => [ 3, 4 ] } ] } ]
|
|
2499
|
+
)
|
|
2500
|
+
end
|
|
2501
|
+
end
|
|
2502
|
+
end
|
|
2503
|
+
|
|
2504
|
+
context 'when using multiple criteria and symbol operators' do
|
|
2505
|
+
context 'when using fields that meaningfully evolve values' do
|
|
2506
|
+
let(:query) do
|
|
2507
|
+
Dictionary.none_of({a: 1}, :published.gt => Date.new(2020, 2, 3))
|
|
2508
|
+
end
|
|
2509
|
+
|
|
2510
|
+
it 'generates the expected query' do
|
|
2511
|
+
query.selector.should == {'$nor' => [
|
|
2512
|
+
{'a' => 1},
|
|
2513
|
+
# Date instance is converted to a Time instance in local time,
|
|
2514
|
+
# because we are querying on a Time field and dates are interpreted
|
|
2515
|
+
# in local time when assigning to Time fields
|
|
2516
|
+
{'published' => {'$gt' => Time.local(2020, 2, 3) } },
|
|
2517
|
+
] }
|
|
2518
|
+
end
|
|
2519
|
+
end
|
|
2520
|
+
|
|
2521
|
+
context 'when using fields that do not meaningfully evolve values' do
|
|
2522
|
+
let(:query) do
|
|
2523
|
+
Dictionary.none_of({a: 1}, :submitted_on.gt => Date.new(2020, 2, 3))
|
|
2524
|
+
end
|
|
2525
|
+
|
|
2526
|
+
it 'generates the expected query' do
|
|
2527
|
+
query.selector.should == {'$nor' => [
|
|
2528
|
+
{'a' => 1},
|
|
2529
|
+
# Date instance is converted to a Time instance in UTC,
|
|
2530
|
+
# because we are querying on a Date field and dates are interpreted
|
|
2531
|
+
# in UTC when persisted as dates by Mongoid
|
|
2532
|
+
{'submitted_on' => {'$gt' => Time.utc(2020, 2, 3)}},
|
|
2533
|
+
]}
|
|
2534
|
+
end
|
|
2535
|
+
end
|
|
2536
|
+
end
|
|
1546
2537
|
end
|
|
1547
2538
|
end
|