mongoid 6.4.4 → 7.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +30 -30
- data/LICENSE +1 -0
- data/README.md +34 -20
- data/Rakefile +75 -5
- data/lib/config/locales/en.yml +149 -66
- data/lib/mongoid/association/accessors.rb +402 -0
- data/lib/mongoid/association/bindable.rb +179 -0
- data/lib/mongoid/association/builders.rb +84 -0
- data/lib/mongoid/association/constrainable.rb +43 -0
- data/lib/mongoid/association/depending.rb +128 -0
- data/lib/mongoid/association/eager_loadable.rb +35 -0
- data/lib/mongoid/association/embedded/batchable.rb +358 -0
- data/lib/mongoid/association/embedded/cyclic.rb +102 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +52 -0
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +134 -0
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +41 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +549 -0
- data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +39 -0
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +145 -0
- data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
- data/lib/mongoid/association/embedded.rb +6 -0
- data/lib/mongoid/association/macros.rb +227 -0
- data/lib/mongoid/association/many.rb +198 -0
- data/lib/mongoid/association/marshalable.rb +31 -0
- data/lib/mongoid/association/nested/many.rb +191 -0
- data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
- data/lib/mongoid/association/nested/one.rb +116 -0
- data/lib/mongoid/association/nested.rb +15 -0
- data/lib/mongoid/association/one.rb +53 -0
- data/lib/mongoid/association/options.rb +122 -0
- data/lib/mongoid/association/proxy.rb +189 -0
- data/lib/mongoid/association/referenced/auto_save.rb +73 -0
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +82 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +125 -0
- data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
- data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
- data/lib/mongoid/association/referenced/eager.rb +163 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +292 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +270 -0
- data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
- data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
- data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +502 -0
- data/lib/mongoid/association/referenced/has_many/proxy.rb +545 -0
- data/lib/mongoid/association/referenced/has_many.rb +251 -0
- data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
- data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
- data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
- data/lib/mongoid/association/referenced/has_one/proxy.rb +111 -0
- data/lib/mongoid/association/referenced/has_one.rb +184 -0
- data/lib/mongoid/association/referenced/syncable.rb +155 -0
- data/lib/mongoid/association/referenced.rb +9 -0
- data/lib/mongoid/association/reflections.rb +69 -0
- data/lib/mongoid/association/relatable.rb +455 -0
- data/lib/mongoid/association.rb +135 -0
- data/lib/mongoid/atomic/modifiers.rb +27 -51
- data/lib/mongoid/atomic/paths/embedded/many.rb +5 -8
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
- data/lib/mongoid/atomic/paths/embedded.rb +3 -4
- data/lib/mongoid/atomic/paths/root.rb +4 -7
- data/lib/mongoid/atomic/paths.rb +2 -1
- data/lib/mongoid/atomic.rb +43 -48
- data/lib/mongoid/attributes/dynamic.rb +19 -33
- data/lib/mongoid/attributes/nested.rb +29 -21
- data/lib/mongoid/attributes/processing.rb +11 -26
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +5 -10
- data/lib/mongoid/attributes.rb +94 -91
- data/lib/mongoid/cacheable.rb +6 -9
- data/lib/mongoid/changeable.rb +7 -61
- data/lib/mongoid/clients/factory.rb +42 -17
- data/lib/mongoid/clients/options.rb +17 -18
- data/lib/mongoid/clients/sessions.rb +22 -10
- data/lib/mongoid/clients/storage_options.rb +7 -12
- data/lib/mongoid/clients/validators/storage.rb +2 -9
- data/lib/mongoid/clients/validators.rb +2 -1
- data/lib/mongoid/clients.rb +3 -10
- data/lib/mongoid/composable.rb +9 -13
- data/lib/mongoid/config/environment.rb +51 -13
- data/lib/mongoid/config/options.rb +20 -23
- data/lib/mongoid/config/validators/client.rb +2 -17
- data/lib/mongoid/config/validators/option.rb +2 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +117 -40
- data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
- data/lib/mongoid/contextual/aggregable/mongo.rb +25 -26
- data/lib/mongoid/contextual/aggregable/none.rb +65 -0
- data/lib/mongoid/contextual/aggregable.rb +17 -0
- data/lib/mongoid/contextual/atomic.rb +29 -31
- data/lib/mongoid/contextual/command.rb +2 -5
- data/lib/mongoid/contextual/geo_near.rb +7 -38
- data/lib/mongoid/contextual/map_reduce.rb +5 -33
- data/lib/mongoid/contextual/memory.rb +167 -70
- data/lib/mongoid/contextual/mongo.rb +281 -109
- data/lib/mongoid/contextual/none.rb +88 -28
- data/lib/mongoid/contextual/queryable.rb +2 -3
- data/lib/mongoid/contextual.rb +7 -9
- data/lib/mongoid/copyable.rb +20 -14
- data/lib/mongoid/criteria/findable.rb +12 -15
- data/lib/mongoid/criteria/includable.rb +21 -28
- data/lib/mongoid/criteria/inspectable.rb +2 -3
- data/lib/mongoid/criteria/marshalable.rb +2 -5
- data/lib/mongoid/criteria/modifiable.rb +10 -22
- data/lib/mongoid/criteria/options.rb +4 -5
- data/lib/mongoid/criteria/permission.rb +2 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -13
- data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +5 -26
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -8
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -11
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -25
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -13
- data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -29
- data/lib/mongoid/criteria/queryable/extensions/range.rb +41 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -19
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -10
- data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +13 -6
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
- data/lib/mongoid/criteria/queryable/key.rb +101 -27
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +205 -44
- data/lib/mongoid/criteria/queryable/optional.rb +5 -48
- data/lib/mongoid/criteria/queryable/options.rb +2 -19
- data/lib/mongoid/criteria/queryable/pipeline.rb +14 -19
- data/lib/mongoid/criteria/queryable/selectable.rb +436 -166
- data/lib/mongoid/criteria/queryable/selector.rb +45 -55
- data/lib/mongoid/criteria/queryable/smash.rb +2 -11
- data/lib/mongoid/criteria/queryable/storable.rb +237 -0
- data/lib/mongoid/criteria/queryable.rb +7 -9
- data/lib/mongoid/criteria/scopable.rb +27 -19
- data/lib/mongoid/criteria.rb +90 -75
- data/lib/mongoid/document.rb +36 -74
- data/lib/mongoid/equality.rb +29 -12
- data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
- data/lib/mongoid/errors/callback.rb +2 -3
- data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
- data/lib/mongoid/errors/delete_restriction.rb +10 -13
- data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
- data/lib/mongoid/errors/document_not_found.rb +25 -15
- data/lib/mongoid/errors/eager_load.rb +6 -5
- data/lib/mongoid/errors/empty_config_file.rb +25 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
- data/lib/mongoid/errors/invalid_collection.rb +2 -1
- data/lib/mongoid/errors/invalid_config_file.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -3
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -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 +2 -5
- data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_field_option.rb +2 -3
- data/lib/mongoid/errors/invalid_find.rb +2 -3
- data/lib/mongoid/errors/invalid_includes.rb +2 -3
- data/lib/mongoid/errors/invalid_index.rb +2 -3
- data/lib/mongoid/errors/invalid_options.rb +4 -5
- data/lib/mongoid/errors/invalid_path.rb +2 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
- data/lib/mongoid/errors/invalid_query.rb +40 -0
- data/lib/mongoid/errors/invalid_relation.rb +4 -9
- data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
- data/lib/mongoid/errors/invalid_scope.rb +2 -3
- data/lib/mongoid/errors/invalid_session_use.rb +3 -6
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
- data/lib/mongoid/errors/invalid_time.rb +2 -3
- data/lib/mongoid/errors/invalid_value.rb +2 -1
- data/lib/mongoid/errors/inverse_not_found.rb +3 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
- data/lib/mongoid/errors/mixed_relations.rb +2 -3
- data/lib/mongoid/errors/mongoid_error.rb +3 -10
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
- data/lib/mongoid/errors/no_client_config.rb +4 -5
- data/lib/mongoid/errors/no_client_database.rb +2 -3
- data/lib/mongoid/errors/no_client_hosts.rb +2 -3
- data/lib/mongoid/errors/no_clients_config.rb +2 -3
- data/lib/mongoid/errors/no_default_client.rb +3 -4
- data/lib/mongoid/errors/no_environment.rb +2 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
- data/lib/mongoid/errors/no_metadata.rb +2 -3
- data/lib/mongoid/errors/no_parent.rb +2 -3
- data/lib/mongoid/errors/readonly_attribute.rb +2 -3
- data/lib/mongoid/errors/readonly_document.rb +3 -6
- data/lib/mongoid/errors/scope_overwrite.rb +2 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -3
- data/lib/mongoid/errors/unknown_model.rb +24 -0
- data/lib/mongoid/errors/unsaved_document.rb +3 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
- data/lib/mongoid/errors/validations.rb +2 -1
- data/lib/mongoid/errors.rb +15 -1
- data/lib/mongoid/evolvable.rb +4 -5
- data/lib/mongoid/extensions/array.rb +33 -42
- data/lib/mongoid/extensions/big_decimal.rb +2 -11
- data/lib/mongoid/extensions/boolean.rb +3 -5
- data/lib/mongoid/extensions/date.rb +13 -12
- data/lib/mongoid/extensions/date_time.rb +4 -12
- data/lib/mongoid/extensions/decimal128.rb +2 -5
- data/lib/mongoid/extensions/false_class.rb +4 -7
- data/lib/mongoid/extensions/float.rb +5 -10
- data/lib/mongoid/extensions/hash.rb +56 -38
- data/lib/mongoid/extensions/integer.rb +5 -12
- data/lib/mongoid/extensions/module.rb +2 -3
- data/lib/mongoid/extensions/nil_class.rb +2 -5
- data/lib/mongoid/extensions/object.rb +21 -48
- data/lib/mongoid/extensions/object_id.rb +2 -7
- data/lib/mongoid/extensions/range.rb +3 -11
- data/lib/mongoid/extensions/regexp.rb +3 -4
- data/lib/mongoid/extensions/set.rb +2 -7
- data/lib/mongoid/extensions/string.rb +24 -42
- data/lib/mongoid/extensions/symbol.rb +2 -7
- data/lib/mongoid/extensions/time.rb +12 -9
- data/lib/mongoid/extensions/time_with_zone.rb +25 -7
- data/lib/mongoid/extensions/true_class.rb +4 -7
- data/lib/mongoid/extensions.rb +18 -7
- data/lib/mongoid/factory.rb +59 -10
- data/lib/mongoid/fields/foreign_key.rb +8 -27
- data/lib/mongoid/fields/localized.rb +2 -11
- data/lib/mongoid/fields/standard.rb +8 -50
- data/lib/mongoid/fields/validators/macro.rb +37 -19
- data/lib/mongoid/fields/validators.rb +2 -1
- data/lib/mongoid/fields.rb +245 -70
- data/lib/mongoid/findable.rb +78 -27
- data/lib/mongoid/indexable/specification.rb +3 -16
- data/lib/mongoid/indexable/validators/options.rb +2 -7
- data/lib/mongoid/indexable.rb +10 -22
- data/lib/mongoid/inspectable.rb +4 -11
- data/lib/mongoid/interceptable.rb +18 -35
- data/lib/mongoid/loggable.rb +13 -16
- data/lib/mongoid/matchable.rb +3 -153
- 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 +110 -0
- data/lib/mongoid/persistable/creatable.rb +4 -21
- data/lib/mongoid/persistable/deletable.rb +11 -26
- data/lib/mongoid/persistable/destroyable.rb +11 -10
- data/lib/mongoid/persistable/incrementable.rb +7 -8
- data/lib/mongoid/persistable/logical.rb +5 -7
- data/lib/mongoid/persistable/poppable.rb +3 -6
- data/lib/mongoid/persistable/pullable.rb +3 -8
- data/lib/mongoid/persistable/pushable.rb +14 -10
- data/lib/mongoid/persistable/renamable.rb +10 -8
- data/lib/mongoid/persistable/savable.rb +3 -8
- data/lib/mongoid/persistable/settable.rb +60 -18
- data/lib/mongoid/persistable/unsettable.rb +8 -8
- data/lib/mongoid/persistable/updatable.rb +32 -20
- data/lib/mongoid/persistable/upsertable.rb +4 -9
- data/lib/mongoid/persistable.rb +136 -42
- data/lib/mongoid/persistence_context.rb +49 -47
- data/lib/mongoid/positional.rb +3 -6
- data/lib/mongoid/query_cache.rb +138 -106
- data/lib/mongoid/railtie.rb +3 -16
- data/lib/mongoid/railties/controller_runtime.rb +3 -1
- data/lib/mongoid/railties/database.rake +9 -0
- data/lib/mongoid/reloadable.rb +14 -19
- data/lib/mongoid/scopable.rb +19 -44
- data/lib/mongoid/selectable.rb +8 -17
- data/lib/mongoid/serializable.rb +28 -33
- data/lib/mongoid/shardable.rb +80 -17
- data/lib/mongoid/stateful.rb +3 -10
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +12 -5
- data/lib/mongoid/tasks/database.rb +85 -5
- data/lib/mongoid/threaded/lifecycle.rb +2 -21
- data/lib/mongoid/threaded.rb +2 -55
- data/lib/mongoid/timestamps/created/short.rb +2 -1
- data/lib/mongoid/timestamps/created.rb +3 -2
- data/lib/mongoid/timestamps/short.rb +2 -1
- data/lib/mongoid/timestamps/timeless.rb +6 -9
- data/lib/mongoid/timestamps/updated/short.rb +2 -1
- data/lib/mongoid/timestamps/updated.rb +3 -4
- data/lib/mongoid/timestamps.rb +3 -2
- data/lib/mongoid/touchable.rb +132 -0
- data/lib/mongoid/traversable.rb +183 -60
- data/lib/mongoid/validatable/associated.rb +5 -6
- data/lib/mongoid/validatable/format.rb +2 -1
- data/lib/mongoid/validatable/length.rb +2 -1
- data/lib/mongoid/validatable/localizable.rb +2 -3
- data/lib/mongoid/validatable/macros.rb +3 -8
- data/lib/mongoid/validatable/presence.rb +10 -15
- data/lib/mongoid/validatable/queryable.rb +2 -3
- data/lib/mongoid/validatable/uniqueness.rb +25 -38
- data/lib/mongoid/validatable.rb +16 -35
- data/lib/mongoid/version.rb +3 -2
- data/lib/mongoid/warnings.rb +29 -0
- data/lib/mongoid.rb +34 -15
- data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -29
- data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/mongoid_generator.rb +2 -1
- data/lib/rails/mongoid.rb +4 -5
- data/spec/README.md +33 -0
- data/spec/config/mongoid.yml +14 -3
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +349 -0
- data/spec/integration/associations/belongs_to_spec.rb +15 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
- data/spec/integration/associations/embedded_spec.rb +268 -0
- data/spec/integration/associations/embeds_many_spec.rb +206 -0
- data/spec/integration/associations/embeds_one_spec.rb +23 -0
- data/spec/integration/associations/foreign_key_spec.rb +98 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
- data/spec/integration/associations/has_many_spec.rb +128 -0
- data/spec/integration/associations/has_one_spec.rb +176 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
- data/spec/integration/associations/reverse_population_spec.rb +34 -0
- data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
- data/spec/integration/associations/scope_option_spec.rb +101 -0
- data/spec/integration/atomic/modifiers_spec.rb +116 -0
- data/spec/integration/bson_regexp_raw_spec.rb +19 -0
- data/spec/integration/callbacks_models.rb +61 -0
- data/spec/integration/callbacks_spec.rb +228 -0
- data/spec/integration/contextual/empty_spec.rb +141 -0
- data/spec/integration/criteria/alias_query_spec.rb +161 -0
- data/spec/integration/criteria/date_field_spec.rb +40 -0
- data/spec/integration/criteria/default_scope_spec.rb +72 -0
- data/spec/integration/criteria/logical_spec.rb +124 -0
- data/spec/integration/criteria/range_spec.rb +265 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
- data/spec/integration/discriminator_key_spec.rb +353 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +51 -0
- data/spec/integration/i18n_fallbacks_spec.rb +103 -0
- data/spec/integration/matcher_examples_spec.rb +758 -0
- data/spec/integration/matcher_operator_data/all.yml +140 -0
- data/spec/integration/matcher_operator_data/and.yml +93 -0
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
- data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
- data/spec/integration/matcher_operator_data/eq.yml +191 -0
- data/spec/integration/matcher_operator_data/exists.yml +213 -0
- data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
- data/spec/integration/matcher_operator_data/gt.yml +132 -0
- data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
- data/spec/integration/matcher_operator_data/in.yml +210 -0
- data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
- data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
- data/spec/integration/matcher_operator_data/lt.yml +132 -0
- data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/multiple.yml +29 -0
- data/spec/integration/matcher_operator_data/ne.yml +150 -0
- data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
- data/spec/integration/matcher_operator_data/nin.yml +114 -0
- data/spec/integration/matcher_operator_data/nor.yml +126 -0
- data/spec/integration/matcher_operator_data/not.yml +196 -0
- data/spec/integration/matcher_operator_data/or.yml +137 -0
- data/spec/integration/matcher_operator_data/regex.yml +174 -0
- data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
- data/spec/integration/matcher_operator_data/size.yml +174 -0
- data/spec/integration/matcher_operator_data/type.yml +70 -0
- data/spec/integration/matcher_operator_data/type_array.yml +16 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +40 -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 +124 -0
- data/spec/integration/matcher_spec.rb +283 -0
- data/spec/integration/server_query_spec.rb +141 -0
- data/spec/integration/shardable_spec.rb +148 -0
- data/spec/integration/stringified_symbol_field_spec.rb +203 -0
- data/spec/lite_spec_helper.rb +83 -0
- data/spec/mongoid/association/accessors_spec.rb +1067 -0
- data/spec/mongoid/association/auto_save_spec.rb +403 -0
- data/spec/mongoid/association/builders_spec.rb +255 -0
- data/spec/mongoid/association/constrainable_spec.rb +117 -0
- data/spec/mongoid/association/counter_cache_spec.rb +452 -0
- data/spec/mongoid/association/depending_spec.rb +959 -0
- data/spec/mongoid/association/eager_spec.rb +281 -0
- data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
- data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +173 -0
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +36 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +559 -0
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +106 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4652 -0
- data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +864 -0
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +81 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +956 -0
- data/spec/mongoid/association/macros_spec.rb +1116 -0
- data/spec/mongoid/association/nested/many_spec.rb +232 -0
- data/spec/mongoid/association/nested/one_spec.rb +253 -0
- data/spec/mongoid/association/options_spec.rb +1323 -0
- data/spec/mongoid/association/polymorphic_spec.rb +162 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +243 -0
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +238 -0
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1373 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3773 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1071 -0
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +142 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2286 -0
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4092 -0
- data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +1248 -0
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1142 -0
- data/spec/mongoid/association/referenced/has_one_models.rb +97 -0
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
- data/spec/mongoid/association/reflections_spec.rb +92 -0
- data/spec/mongoid/association/syncable_spec.rb +499 -0
- data/spec/mongoid/association_spec.rb +191 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +51 -2
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
- data/spec/mongoid/atomic/paths_spec.rb +107 -12
- data/spec/mongoid/atomic_spec.rb +57 -10
- data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
- data/spec/mongoid/attributes/nested_spec.rb +98 -78
- 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 +44 -0
- data/spec/mongoid/attributes/readonly_spec.rb +84 -127
- data/spec/mongoid/attributes_spec.rb +417 -34
- data/spec/mongoid/cacheable_spec.rb +3 -1
- data/spec/mongoid/changeable_spec.rb +60 -35
- data/spec/mongoid/clients/factory_spec.rb +146 -33
- data/spec/mongoid/clients/options_spec.rb +93 -60
- data/spec/mongoid/clients/sessions_spec.rb +40 -30
- data/spec/mongoid/clients/transactions_spec.rb +415 -0
- data/spec/mongoid/clients_spec.rb +78 -16
- data/spec/mongoid/composable_spec.rb +2 -0
- data/spec/mongoid/config/environment_spec.rb +126 -8
- data/spec/mongoid/config/options_spec.rb +22 -3
- data/spec/mongoid/config_spec.rb +350 -2
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
- data/spec/mongoid/contextual/atomic_spec.rb +242 -81
- data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
- data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
- data/spec/mongoid/contextual/memory_spec.rb +870 -88
- data/spec/mongoid/contextual/mongo_spec.rb +1318 -183
- data/spec/mongoid/contextual/none_spec.rb +45 -71
- data/spec/mongoid/copyable_spec.rb +294 -29
- data/spec/mongoid/copyable_spec_models.rb +47 -0
- data/spec/mongoid/criteria/findable_spec.rb +77 -20
- data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +215 -40
- data/spec/mongoid/criteria/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +35 -17
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +53 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +46 -1
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +42 -23
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +30 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
- data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +14 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2069 -0
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1155 -2927
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
- data/spec/mongoid/criteria/scopable_spec.rb +129 -0
- data/spec/mongoid/criteria_projection_spec.rb +410 -0
- data/spec/mongoid/criteria_spec.rb +829 -478
- data/spec/mongoid/document_fields_spec.rb +113 -0
- data/spec/mongoid/document_persistence_context_spec.rb +32 -0
- data/spec/mongoid/document_query_spec.rb +89 -0
- data/spec/mongoid/document_spec.rb +131 -31
- data/spec/mongoid/equality_spec.rb +144 -41
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
- data/spec/mongoid/errors/callback_spec.rb +2 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +51 -0
- data/spec/mongoid/errors/eager_load_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
- data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +22 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
- data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
- data/spec/mongoid/errors/no_environment_spec.rb +2 -0
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
- data/spec/mongoid/errors/no_parent_spec.rb +3 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
- data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
- data/spec/mongoid/errors/validations_spec.rb +2 -0
- data/spec/mongoid/extensions/array_spec.rb +36 -58
- data/spec/mongoid/extensions/big_decimal_spec.rb +2 -0
- data/spec/mongoid/extensions/binary_spec.rb +2 -0
- data/spec/mongoid/extensions/boolean_spec.rb +2 -0
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
- data/spec/mongoid/extensions/date_spec.rb +8 -160
- data/spec/mongoid/extensions/date_time_spec.rb +17 -60
- data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
- data/spec/mongoid/extensions/false_class_spec.rb +3 -1
- data/spec/mongoid/extensions/float_spec.rb +17 -3
- data/spec/mongoid/extensions/hash_spec.rb +123 -1
- data/spec/mongoid/extensions/integer_spec.rb +14 -2
- data/spec/mongoid/extensions/module_spec.rb +2 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/extensions/object_id_spec.rb +2 -0
- data/spec/mongoid/extensions/object_spec.rb +20 -35
- data/spec/mongoid/extensions/range_spec.rb +9 -0
- data/spec/mongoid/extensions/regexp_spec.rb +2 -0
- data/spec/mongoid/extensions/set_spec.rb +2 -0
- data/spec/mongoid/extensions/string_spec.rb +95 -34
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +2 -0
- data/spec/mongoid/extensions/time_spec.rb +29 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +33 -0
- data/spec/mongoid/extensions/true_class_spec.rb +3 -1
- data/spec/mongoid/extensions_spec.rb +16 -2
- data/spec/mongoid/factory_spec.rb +301 -23
- data/spec/mongoid/fields/foreign_key_spec.rb +26 -32
- data/spec/mongoid/fields/localized_spec.rb +6 -4
- data/spec/mongoid/fields/standard_spec.rb +2 -0
- data/spec/mongoid/fields_spec.rb +419 -37
- data/spec/mongoid/findable_spec.rb +84 -20
- data/spec/mongoid/indexable/specification_spec.rb +2 -0
- data/spec/mongoid/indexable_spec.rb +54 -14
- data/spec/mongoid/inspectable_spec.rb +39 -2
- data/spec/mongoid/interceptable_spec.rb +189 -96
- data/spec/mongoid/interceptable_spec_models.rb +76 -0
- data/spec/mongoid/loggable_spec.rb +2 -0
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
- data/spec/mongoid/persistable/creatable_spec.rb +112 -27
- data/spec/mongoid/persistable/deletable_spec.rb +273 -11
- data/spec/mongoid/persistable/destroyable_spec.rb +201 -11
- data/spec/mongoid/persistable/incrementable_spec.rb +23 -7
- data/spec/mongoid/persistable/logical_spec.rb +19 -3
- data/spec/mongoid/persistable/poppable_spec.rb +19 -3
- data/spec/mongoid/persistable/pullable_spec.rb +36 -6
- data/spec/mongoid/persistable/pushable_spec.rb +91 -7
- data/spec/mongoid/persistable/renamable_spec.rb +18 -2
- data/spec/mongoid/persistable/savable_spec.rb +189 -26
- data/spec/mongoid/persistable/settable_spec.rb +149 -18
- data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
- data/spec/mongoid/persistable/updatable_spec.rb +45 -23
- data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
- data/spec/mongoid/persistable_spec.rb +106 -15
- data/spec/mongoid/persistence_context_spec.rb +3 -1
- data/spec/mongoid/positional_spec.rb +2 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
- data/spec/mongoid/query_cache_spec.rb +577 -64
- data/spec/mongoid/relations/proxy_spec.rb +126 -124
- data/spec/mongoid/reloadable_spec.rb +298 -20
- data/spec/mongoid/scopable_spec.rb +102 -37
- data/spec/mongoid/selectable_spec.rb +8 -6
- data/spec/mongoid/serializable_spec.rb +160 -29
- data/spec/mongoid/shardable_models.rb +61 -0
- data/spec/mongoid/shardable_spec.rb +145 -26
- data/spec/mongoid/stateful_spec.rb +3 -1
- data/spec/mongoid/tasks/database_rake_spec.rb +15 -13
- data/spec/mongoid/tasks/database_spec.rb +3 -1
- data/spec/mongoid/threaded_spec.rb +4 -2
- data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
- data/spec/mongoid/timestamps/created_spec.rb +3 -1
- data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
- data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
- data/spec/mongoid/timestamps/updated_spec.rb +5 -3
- data/spec/mongoid/timestamps_spec.rb +8 -6
- data/spec/mongoid/touchable_spec.rb +588 -0
- data/spec/mongoid/touchable_spec_models.rb +53 -0
- data/spec/mongoid/traversable_spec.rb +1167 -1
- data/spec/mongoid/validatable/associated_spec.rb +3 -1
- data/spec/mongoid/validatable/format_spec.rb +2 -0
- data/spec/mongoid/validatable/length_spec.rb +2 -0
- data/spec/mongoid/validatable/numericality_spec.rb +2 -0
- data/spec/mongoid/validatable/presence_spec.rb +33 -26
- data/spec/mongoid/validatable/uniqueness_spec.rb +102 -73
- data/spec/mongoid/validatable_spec.rb +5 -3
- data/spec/mongoid_spec.rb +2 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -1
- data/spec/rails/mongoid_spec.rb +4 -2
- 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 +291 -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 +230 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +120 -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 +15 -0
- data/spec/shared/share/Dockerfile.erb +325 -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 +392 -0
- data/spec/shared/shlib/set_env.sh +169 -0
- data/spec/spec_helper.rb +73 -76
- data/spec/support/authorization.rb +2 -0
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +53 -0
- data/spec/support/expectations.rb +21 -3
- data/spec/support/helpers.rb +11 -0
- data/spec/support/macros.rb +51 -0
- data/spec/support/models/account.rb +38 -0
- data/spec/support/models/acolyte.rb +19 -0
- data/spec/support/models/actor.rb +20 -0
- data/spec/support/models/actress.rb +4 -0
- data/spec/support/models/address.rb +85 -0
- data/spec/support/models/address_component.rb +7 -0
- data/spec/support/models/address_number.rb +8 -0
- data/spec/support/models/agency.rb +7 -0
- data/spec/support/models/agent.rb +18 -0
- data/spec/support/models/album.rb +20 -0
- data/spec/support/models/alert.rb +9 -0
- data/spec/support/models/animal.rb +28 -0
- data/spec/support/models/answer.rb +8 -0
- data/spec/support/models/appointment.rb +9 -0
- data/spec/support/models/armrest.rb +9 -0
- data/spec/{app → support}/models/array_field.rb +0 -0
- data/spec/support/models/article.rb +14 -0
- data/spec/support/models/artist.rb +91 -0
- data/spec/support/models/artwork.rb +6 -0
- data/spec/support/models/audible_sound.rb +3 -0
- data/spec/support/models/audio.rb +7 -0
- data/spec/support/models/augmentation.rb +13 -0
- data/spec/support/models/author.rb +8 -0
- data/spec/support/models/baby.rb +6 -0
- data/spec/support/models/band.rb +37 -0
- data/spec/support/models/bar.rb +12 -0
- data/spec/support/models/basic.rb +8 -0
- data/spec/support/models/bed.rb +3 -0
- data/spec/support/models/big_palette.rb +4 -0
- data/spec/support/models/birthday.rb +15 -0
- data/spec/support/models/bolt.rb +7 -0
- data/spec/support/models/bomb.rb +6 -0
- data/spec/support/models/book.rb +18 -0
- data/spec/support/models/breed.rb +6 -0
- data/spec/support/models/browser.rb +8 -0
- data/spec/support/models/building.rb +8 -0
- data/spec/support/models/building_address.rb +9 -0
- data/spec/support/models/bus.rb +9 -0
- data/spec/support/models/business.rb +7 -0
- data/spec/support/models/callback_test.rb +11 -0
- data/spec/support/models/canvas.rb +27 -0
- data/spec/support/models/car.rb +3 -0
- data/spec/support/models/cat.rb +10 -0
- data/spec/support/models/category.rb +10 -0
- data/spec/support/models/child.rb +6 -0
- data/spec/support/models/child_doc.rb +24 -0
- data/spec/support/models/church.rb +8 -0
- data/spec/support/models/circle.rb +5 -0
- data/spec/support/models/circuit.rb +6 -0
- data/spec/support/models/circus.rb +9 -0
- data/spec/support/models/code.rb +15 -0
- data/spec/support/models/coding/pull_request.rb +11 -0
- data/spec/support/models/coding.rb +3 -0
- data/spec/support/models/comment.rb +18 -0
- data/spec/support/models/company.rb +7 -0
- data/spec/support/models/consumption_period.rb +9 -0
- data/spec/support/models/contextable_item.rb +7 -0
- data/spec/support/models/contractor.rb +7 -0
- data/spec/support/models/cookie.rb +8 -0
- data/spec/support/models/country_code.rb +12 -0
- data/spec/support/models/courier_job.rb +6 -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/support/models/definition.rb +11 -0
- data/spec/support/models/delegating_patient.rb +15 -0
- data/spec/support/models/description.rb +13 -0
- data/spec/support/models/dictionary.rb +18 -0
- data/spec/support/models/division.rb +12 -0
- data/spec/support/models/doctor.rb +14 -0
- data/spec/support/models/dog.rb +9 -0
- data/spec/support/models/dokument.rb +8 -0
- data/spec/support/models/draft.rb +11 -0
- data/spec/support/models/dragon.rb +6 -0
- data/spec/support/models/driver.rb +9 -0
- data/spec/support/models/drug.rb +8 -0
- data/spec/support/models/dungeon.rb +6 -0
- data/spec/support/models/edit.rb +7 -0
- data/spec/support/models/email.rb +8 -0
- data/spec/support/models/employer.rb +7 -0
- data/spec/support/models/entry.rb +8 -0
- data/spec/support/models/eraser.rb +3 -0
- data/spec/support/models/even.rb +9 -0
- data/spec/support/models/event.rb +24 -0
- data/spec/support/models/exhibition.rb +6 -0
- data/spec/support/models/exhibitor.rb +8 -0
- data/spec/support/models/explosion.rb +6 -0
- data/spec/support/models/eye.rb +11 -0
- data/spec/support/models/eye_bowl.rb +11 -0
- data/spec/support/models/face.rb +10 -0
- data/spec/support/models/favorite.rb +8 -0
- data/spec/support/models/filesystem.rb +7 -0
- data/spec/support/models/fire_hydrant.rb +8 -0
- data/spec/support/models/firefox.rb +6 -0
- data/spec/support/models/fish.rb +9 -0
- data/spec/support/models/folder.rb +9 -0
- data/spec/support/models/folder_item.rb +11 -0
- data/spec/support/models/fruits.rb +36 -0
- data/spec/support/models/game.rb +21 -0
- data/spec/support/models/ghost.rb +9 -0
- data/spec/support/models/guitar.rb +4 -0
- data/spec/support/models/hole.rb +12 -0
- data/spec/support/models/home.rb +6 -0
- data/spec/support/models/house.rb +8 -0
- data/spec/support/models/html_writer.rb +5 -0
- data/spec/support/models/id_key.rb +8 -0
- data/spec/support/models/idnodef.rb +7 -0
- data/spec/support/models/image.rb +24 -0
- data/spec/support/models/implant.rb +18 -0
- data/spec/support/models/instrument.rb +8 -0
- data/spec/support/models/item.rb +10 -0
- data/spec/support/models/jar.rb +9 -0
- data/spec/support/models/kaleidoscope.rb +8 -0
- data/spec/support/models/kangaroo.rb +6 -0
- data/spec/support/models/label.rb +50 -0
- data/spec/support/models/language.rb +7 -0
- data/spec/support/models/lat_lng.rb +17 -0
- data/spec/support/models/league.rb +13 -0
- data/spec/support/models/learner.rb +4 -0
- data/spec/support/models/line_item.rb +8 -0
- data/spec/support/models/location.rb +10 -0
- data/spec/support/models/login.rb +10 -0
- data/spec/support/models/manufacturer.rb +9 -0
- data/spec/support/models/meat.rb +6 -0
- data/spec/support/models/membership.rb +7 -0
- data/spec/support/models/message.rb +13 -0
- data/spec/support/models/minim.rb +6 -0
- data/spec/support/models/mixed_drink.rb +6 -0
- data/spec/support/models/mop.rb +24 -0
- data/spec/support/models/movie.rb +15 -0
- data/spec/support/models/my_hash.rb +4 -0
- data/spec/support/models/name.rb +26 -0
- data/spec/support/models/name_only.rb +8 -0
- data/spec/support/models/node.rb +7 -0
- data/spec/support/models/note.rb +19 -0
- data/spec/support/models/nut.rb +7 -0
- data/spec/support/models/odd.rb +9 -0
- data/spec/support/models/order.rb +12 -0
- data/spec/support/models/ordered_post.rb +13 -0
- data/spec/support/models/ordered_preference.rb +8 -0
- data/spec/support/models/oscar.rb +16 -0
- data/spec/support/models/other_owner_object.rb +4 -0
- data/spec/support/models/override.rb +18 -0
- data/spec/support/models/ownable.rb +8 -0
- data/spec/support/models/owner.rb +10 -0
- data/spec/support/models/pack.rb +5 -0
- data/spec/support/models/page.rb +18 -0
- data/spec/support/models/page_question.rb +6 -0
- data/spec/support/models/palette.rb +9 -0
- data/spec/support/models/parent.rb +7 -0
- data/spec/support/models/parent_doc.rb +8 -0
- data/spec/support/models/passport.rb +13 -0
- data/spec/support/models/patient.rb +11 -0
- data/spec/support/models/pdf_writer.rb +5 -0
- data/spec/support/models/pencil.rb +3 -0
- data/spec/support/models/person.rb +230 -0
- data/spec/support/models/pet.rb +25 -0
- data/spec/support/models/pet_owner.rb +8 -0
- data/spec/support/models/phone.rb +13 -0
- data/spec/support/models/piano.rb +4 -0
- data/spec/support/models/pizza.rb +9 -0
- data/spec/support/models/player.rb +37 -0
- data/spec/support/models/post.rb +52 -0
- data/spec/support/models/post_genre.rb +8 -0
- data/spec/support/models/powerup.rb +13 -0
- data/spec/support/models/preference.rb +11 -0
- data/spec/support/models/princess.rb +12 -0
- data/spec/support/models/product.rb +19 -0
- data/spec/support/models/profile.rb +17 -0
- data/spec/support/models/pronunciation.rb +7 -0
- data/spec/support/models/pub.rb +8 -0
- data/spec/support/models/publication/encyclopedia.rb +11 -0
- data/spec/support/models/publication/review.rb +13 -0
- data/spec/support/models/publication.rb +4 -0
- data/spec/support/models/purchase.rb +6 -0
- data/spec/support/models/purchased_item.rb +10 -0
- data/spec/support/models/question.rb +10 -0
- data/spec/support/models/quiz.rb +9 -0
- data/spec/support/models/rating.rb +10 -0
- data/spec/support/models/record.rb +54 -0
- data/spec/support/models/registry.rb +6 -0
- data/spec/support/models/role.rb +9 -0
- data/spec/support/models/root_category.rb +6 -0
- data/spec/support/models/sandwich.rb +11 -0
- data/spec/support/models/scheduler.rb +9 -0
- data/spec/support/models/scribe.rb +7 -0
- data/spec/support/models/sealer.rb +7 -0
- data/spec/support/models/seat.rb +24 -0
- data/spec/support/models/seo.rb +9 -0
- data/spec/support/models/series.rb +7 -0
- data/spec/support/models/server.rb +15 -0
- data/spec/support/models/service.rb +24 -0
- data/spec/support/models/shape.rb +14 -0
- data/spec/support/models/shelf.rb +7 -0
- data/spec/support/models/shipment_address.rb +5 -0
- data/spec/support/models/shipping_container.rb +7 -0
- data/spec/support/models/shipping_pack.rb +5 -0
- data/spec/support/models/shirt.rb +11 -0
- data/spec/support/models/shop.rb +8 -0
- data/spec/support/models/short_agent.rb +6 -0
- data/spec/support/models/short_quiz.rb +7 -0
- data/spec/support/models/simple.rb +7 -0
- data/spec/support/models/slave.rb +8 -0
- data/spec/support/models/song.rb +10 -0
- data/spec/support/models/sound.rb +7 -0
- data/spec/support/models/spacer.rb +7 -0
- data/spec/support/models/square.rb +6 -0
- data/spec/support/models/staff.rb +9 -0
- data/spec/support/models/store_as_dup_test1.rb +7 -0
- data/spec/support/models/store_as_dup_test2.rb +7 -0
- data/spec/support/models/store_as_dup_test3.rb +7 -0
- data/spec/support/models/store_as_dup_test4.rb +7 -0
- data/spec/support/models/strategy.rb +5 -0
- data/spec/support/models/sub_item.rb +5 -0
- data/spec/support/models/subscription.rb +7 -0
- data/spec/support/models/survey.rb +7 -0
- data/spec/support/models/symptom.rb +8 -0
- data/spec/support/models/system_role.rb +7 -0
- data/spec/support/models/tag.rb +10 -0
- data/spec/support/models/target.rb +7 -0
- data/spec/support/models/template.rb +7 -0
- data/spec/support/models/thing.rb +11 -0
- data/spec/support/models/threadlocker.rb +7 -0
- data/spec/support/models/title.rb +5 -0
- data/spec/support/models/tool.rb +10 -0
- data/spec/support/models/topping.rb +7 -0
- data/spec/support/models/toy.rb +9 -0
- data/spec/support/models/track.rb +40 -0
- data/spec/support/models/translation.rb +7 -0
- data/spec/support/models/tree.rb +11 -0
- data/spec/support/models/truck.rb +7 -0
- data/spec/support/models/updatable.rb +7 -0
- data/spec/support/models/user.rb +23 -0
- data/spec/support/models/user_account.rb +12 -0
- data/spec/support/models/validation_callback.rb +12 -0
- data/spec/support/models/vehicle.rb +18 -0
- data/spec/support/models/version.rb +7 -0
- data/spec/support/models/vertex.rb +8 -0
- data/spec/support/models/vet_visit.rb +7 -0
- data/spec/support/models/video.rb +15 -0
- data/spec/support/models/video_game.rb +3 -0
- data/spec/support/models/washer.rb +7 -0
- data/spec/support/models/weapon.rb +13 -0
- data/spec/support/models/wiki_page.rb +17 -0
- data/spec/support/models/word.rb +17 -0
- data/spec/support/models/word_origin.rb +13 -0
- data/spec/support/models/writer.rb +13 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +53 -0
- data/spec/support/spec_config.rb +64 -0
- data.tar.gz.sig +3 -1
- metadata +1301 -830
- metadata.gz.sig +0 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- data/lib/mongoid/matchable/all.rb +0 -27
- data/lib/mongoid/matchable/and.rb +0 -30
- data/lib/mongoid/matchable/default.rb +0 -72
- data/lib/mongoid/matchable/elem_match.rb +0 -28
- data/lib/mongoid/matchable/exists.rb +0 -23
- data/lib/mongoid/matchable/gt.rb +0 -23
- data/lib/mongoid/matchable/gte.rb +0 -23
- data/lib/mongoid/matchable/in.rb +0 -24
- data/lib/mongoid/matchable/lt.rb +0 -23
- data/lib/mongoid/matchable/lte.rb +0 -23
- data/lib/mongoid/matchable/ne.rb +0 -21
- data/lib/mongoid/matchable/nin.rb +0 -22
- data/lib/mongoid/matchable/nor.rb +0 -37
- data/lib/mongoid/matchable/or.rb +0 -33
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/lib/mongoid/matchable/size.rb +0 -21
- data/lib/mongoid/relations/accessors.rb +0 -267
- data/lib/mongoid/relations/auto_save.rb +0 -94
- data/lib/mongoid/relations/binding.rb +0 -218
- data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
- data/lib/mongoid/relations/bindings/embedded/many.rb +0 -43
- data/lib/mongoid/relations/bindings/embedded/one.rb +0 -45
- data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
- data/lib/mongoid/relations/bindings/referenced/many.rb +0 -38
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
- data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
- data/lib/mongoid/relations/bindings.rb +0 -9
- data/lib/mongoid/relations/builder.rb +0 -57
- data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
- data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
- data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -126
- data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
- data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
- data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
- data/lib/mongoid/relations/builders.rb +0 -106
- data/lib/mongoid/relations/cascading/delete.rb +0 -44
- data/lib/mongoid/relations/cascading/destroy.rb +0 -43
- data/lib/mongoid/relations/cascading/nullify.rb +0 -35
- data/lib/mongoid/relations/cascading/restrict.rb +0 -39
- data/lib/mongoid/relations/cascading.rb +0 -56
- data/lib/mongoid/relations/constraint.rb +0 -55
- data/lib/mongoid/relations/conversions.rb +0 -34
- data/lib/mongoid/relations/counter_cache.rb +0 -160
- data/lib/mongoid/relations/cyclic.rb +0 -107
- data/lib/mongoid/relations/eager/base.rb +0 -153
- data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
- data/lib/mongoid/relations/eager/has_many.rb +0 -38
- data/lib/mongoid/relations/eager/has_one.rb +0 -30
- data/lib/mongoid/relations/eager.rb +0 -36
- data/lib/mongoid/relations/embedded/batchable.rb +0 -384
- data/lib/mongoid/relations/embedded/in.rb +0 -241
- data/lib/mongoid/relations/embedded/many.rb +0 -683
- data/lib/mongoid/relations/embedded/one.rb +0 -235
- data/lib/mongoid/relations/macros.rb +0 -367
- data/lib/mongoid/relations/many.rb +0 -242
- data/lib/mongoid/relations/marshalable.rb +0 -32
- data/lib/mongoid/relations/metadata.rb +0 -1179
- data/lib/mongoid/relations/nested_builder.rb +0 -74
- data/lib/mongoid/relations/one.rb +0 -60
- data/lib/mongoid/relations/options.rb +0 -49
- data/lib/mongoid/relations/polymorphic.rb +0 -39
- data/lib/mongoid/relations/proxy.rb +0 -215
- data/lib/mongoid/relations/referenced/in.rb +0 -304
- data/lib/mongoid/relations/referenced/many.rb +0 -812
- data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
- data/lib/mongoid/relations/referenced/one.rb +0 -290
- data/lib/mongoid/relations/reflections.rb +0 -64
- data/lib/mongoid/relations/synchronization.rb +0 -169
- data/lib/mongoid/relations/targets/enumerable.rb +0 -493
- data/lib/mongoid/relations/targets.rb +0 -2
- data/lib/mongoid/relations/touchable.rb +0 -97
- data/lib/mongoid/relations.rb +0 -148
- data/lib/support/ruby_version.rb +0 -26
- data/spec/app/models/account.rb +0 -36
- data/spec/app/models/acolyte.rb +0 -17
- data/spec/app/models/actor.rb +0 -18
- data/spec/app/models/actress.rb +0 -2
- data/spec/app/models/address.rb +0 -79
- data/spec/app/models/address_component.rb +0 -5
- data/spec/app/models/address_number.rb +0 -6
- data/spec/app/models/agency.rb +0 -5
- data/spec/app/models/agent.rb +0 -16
- data/spec/app/models/album.rb +0 -18
- data/spec/app/models/alert.rb +0 -7
- data/spec/app/models/animal.rb +0 -25
- data/spec/app/models/answer.rb +0 -6
- data/spec/app/models/appointment.rb +0 -7
- data/spec/app/models/article.rb +0 -12
- data/spec/app/models/artist.rb +0 -87
- data/spec/app/models/artwork.rb +0 -4
- data/spec/app/models/audio.rb +0 -5
- data/spec/app/models/augmentation.rb +0 -11
- data/spec/app/models/author.rb +0 -6
- data/spec/app/models/baby.rb +0 -4
- data/spec/app/models/band.rb +0 -31
- data/spec/app/models/bar.rb +0 -10
- data/spec/app/models/basic.rb +0 -6
- data/spec/app/models/bed.rb +0 -1
- data/spec/app/models/big_palette.rb +0 -2
- data/spec/app/models/birthday.rb +0 -13
- data/spec/app/models/bomb.rb +0 -4
- data/spec/app/models/book.rb +0 -16
- data/spec/app/models/breed.rb +0 -4
- data/spec/app/models/browser.rb +0 -6
- data/spec/app/models/building.rb +0 -6
- data/spec/app/models/building_address.rb +0 -7
- data/spec/app/models/bus.rb +0 -7
- data/spec/app/models/business.rb +0 -5
- data/spec/app/models/callback_test.rb +0 -9
- data/spec/app/models/canvas.rb +0 -25
- data/spec/app/models/car.rb +0 -1
- data/spec/app/models/cat.rb +0 -8
- data/spec/app/models/category.rb +0 -8
- data/spec/app/models/child.rb +0 -4
- data/spec/app/models/child_doc.rb +0 -22
- data/spec/app/models/church.rb +0 -6
- data/spec/app/models/circle.rb +0 -3
- data/spec/app/models/circuit.rb +0 -4
- data/spec/app/models/circus.rb +0 -7
- data/spec/app/models/code.rb +0 -11
- data/spec/app/models/comment.rb +0 -16
- data/spec/app/models/company.rb +0 -5
- data/spec/app/models/consumption_period.rb +0 -7
- data/spec/app/models/contextable_item.rb +0 -5
- data/spec/app/models/contractor.rb +0 -5
- data/spec/app/models/cookie.rb +0 -6
- data/spec/app/models/country_code.rb +0 -8
- data/spec/app/models/courier_job.rb +0 -4
- data/spec/app/models/definition.rb +0 -9
- data/spec/app/models/description.rb +0 -11
- data/spec/app/models/dictionary.rb +0 -10
- data/spec/app/models/division.rb +0 -10
- data/spec/app/models/doctor.rb +0 -12
- data/spec/app/models/dog.rb +0 -7
- data/spec/app/models/dokument.rb +0 -6
- data/spec/app/models/draft.rb +0 -9
- data/spec/app/models/dragon.rb +0 -4
- data/spec/app/models/driver.rb +0 -7
- data/spec/app/models/drug.rb +0 -6
- data/spec/app/models/dungeon.rb +0 -4
- data/spec/app/models/edit.rb +0 -5
- data/spec/app/models/email.rb +0 -6
- data/spec/app/models/employer.rb +0 -5
- data/spec/app/models/entry.rb +0 -6
- data/spec/app/models/eraser.rb +0 -1
- data/spec/app/models/even.rb +0 -7
- data/spec/app/models/event.rb +0 -22
- data/spec/app/models/exhibition.rb +0 -4
- data/spec/app/models/exhibitor.rb +0 -6
- data/spec/app/models/explosion.rb +0 -4
- data/spec/app/models/eye.rb +0 -9
- data/spec/app/models/eye_bowl.rb +0 -9
- data/spec/app/models/face.rb +0 -8
- data/spec/app/models/favorite.rb +0 -6
- data/spec/app/models/filesystem.rb +0 -5
- data/spec/app/models/fire_hydrant.rb +0 -6
- data/spec/app/models/firefox.rb +0 -4
- data/spec/app/models/fish.rb +0 -7
- data/spec/app/models/folder.rb +0 -7
- data/spec/app/models/folder_item.rb +0 -9
- data/spec/app/models/fruits.rb +0 -34
- data/spec/app/models/game.rb +0 -19
- data/spec/app/models/ghost.rb +0 -7
- data/spec/app/models/home.rb +0 -4
- data/spec/app/models/house.rb +0 -6
- data/spec/app/models/html_writer.rb +0 -3
- data/spec/app/models/id_key.rb +0 -6
- data/spec/app/models/image.rb +0 -22
- data/spec/app/models/implant.rb +0 -16
- data/spec/app/models/item.rb +0 -8
- data/spec/app/models/jar.rb +0 -7
- data/spec/app/models/kaleidoscope.rb +0 -6
- data/spec/app/models/kangaroo.rb +0 -4
- data/spec/app/models/label.rb +0 -47
- data/spec/app/models/language.rb +0 -5
- data/spec/app/models/lat_lng.rb +0 -15
- data/spec/app/models/league.rb +0 -11
- data/spec/app/models/learner.rb +0 -2
- data/spec/app/models/line_item.rb +0 -6
- data/spec/app/models/location.rb +0 -8
- data/spec/app/models/login.rb +0 -8
- data/spec/app/models/manufacturer.rb +0 -7
- data/spec/app/models/meat.rb +0 -4
- data/spec/app/models/membership.rb +0 -4
- data/spec/app/models/message.rb +0 -11
- data/spec/app/models/mixed_drink.rb +0 -4
- data/spec/app/models/movie.rb +0 -13
- data/spec/app/models/my_hash.rb +0 -2
- data/spec/app/models/name.rb +0 -24
- data/spec/app/models/node.rb +0 -5
- data/spec/app/models/note.rb +0 -17
- data/spec/app/models/odd.rb +0 -7
- data/spec/app/models/ordered_post.rb +0 -11
- data/spec/app/models/ordered_preference.rb +0 -6
- data/spec/app/models/oscar.rb +0 -14
- data/spec/app/models/override.rb +0 -16
- data/spec/app/models/ownable.rb +0 -6
- data/spec/app/models/owner.rb +0 -6
- data/spec/app/models/pack.rb +0 -3
- data/spec/app/models/page.rb +0 -16
- data/spec/app/models/page_question.rb +0 -4
- data/spec/app/models/palette.rb +0 -7
- data/spec/app/models/parent.rb +0 -5
- data/spec/app/models/parent_doc.rb +0 -6
- data/spec/app/models/passport.rb +0 -5
- data/spec/app/models/patient.rb +0 -9
- data/spec/app/models/pdf_writer.rb +0 -3
- data/spec/app/models/pencil.rb +0 -1
- data/spec/app/models/person.rb +0 -207
- data/spec/app/models/pet.rb +0 -23
- data/spec/app/models/pet_owner.rb +0 -6
- data/spec/app/models/phone.rb +0 -9
- data/spec/app/models/pizza.rb +0 -7
- data/spec/app/models/player.rb +0 -35
- data/spec/app/models/post.rb +0 -50
- data/spec/app/models/post_genre.rb +0 -6
- data/spec/app/models/powerup.rb +0 -11
- data/spec/app/models/preference.rb +0 -9
- data/spec/app/models/princess.rb +0 -10
- data/spec/app/models/product.rb +0 -17
- data/spec/app/models/profile.rb +0 -5
- data/spec/app/models/pronunciation.rb +0 -5
- data/spec/app/models/pub.rb +0 -6
- data/spec/app/models/purchase.rb +0 -4
- data/spec/app/models/question.rb +0 -8
- data/spec/app/models/quiz.rb +0 -7
- data/spec/app/models/rating.rb +0 -8
- data/spec/app/models/record.rb +0 -52
- data/spec/app/models/registry.rb +0 -4
- data/spec/app/models/role.rb +0 -7
- data/spec/app/models/root_category.rb +0 -4
- data/spec/app/models/sandwich.rb +0 -9
- data/spec/app/models/scheduler.rb +0 -7
- data/spec/app/models/seo.rb +0 -7
- data/spec/app/models/series.rb +0 -4
- data/spec/app/models/server.rb +0 -13
- data/spec/app/models/service.rb +0 -22
- data/spec/app/models/shape.rb +0 -12
- data/spec/app/models/shelf.rb +0 -5
- data/spec/app/models/shipment_address.rb +0 -2
- data/spec/app/models/shipping_container.rb +0 -5
- data/spec/app/models/shipping_pack.rb +0 -3
- data/spec/app/models/shop.rb +0 -6
- data/spec/app/models/short_agent.rb +0 -4
- data/spec/app/models/short_quiz.rb +0 -5
- data/spec/app/models/simple.rb +0 -5
- data/spec/app/models/slave.rb +0 -6
- data/spec/app/models/song.rb +0 -8
- data/spec/app/models/sound.rb +0 -5
- data/spec/app/models/square.rb +0 -4
- data/spec/app/models/staff.rb +0 -7
- data/spec/app/models/store_as_dup_test1.rb +0 -5
- data/spec/app/models/store_as_dup_test2.rb +0 -5
- data/spec/app/models/strategy.rb +0 -3
- data/spec/app/models/sub_item.rb +0 -3
- data/spec/app/models/subscription.rb +0 -5
- data/spec/app/models/survey.rb +0 -5
- data/spec/app/models/symptom.rb +0 -6
- data/spec/app/models/tag.rb +0 -8
- data/spec/app/models/target.rb +0 -5
- data/spec/app/models/template.rb +0 -5
- data/spec/app/models/thing.rb +0 -9
- data/spec/app/models/title.rb +0 -3
- data/spec/app/models/tool.rb +0 -8
- data/spec/app/models/topping.rb +0 -5
- data/spec/app/models/track.rb +0 -38
- data/spec/app/models/translation.rb +0 -5
- data/spec/app/models/tree.rb +0 -9
- data/spec/app/models/truck.rb +0 -3
- data/spec/app/models/user.rb +0 -21
- data/spec/app/models/user_account.rb +0 -10
- data/spec/app/models/validation_callback.rb +0 -10
- data/spec/app/models/vehicle.rb +0 -11
- data/spec/app/models/version.rb +0 -5
- data/spec/app/models/vet_visit.rb +0 -5
- data/spec/app/models/video.rb +0 -13
- data/spec/app/models/video_game.rb +0 -1
- data/spec/app/models/weapon.rb +0 -11
- data/spec/app/models/wiki_page.rb +0 -14
- data/spec/app/models/word.rb +0 -15
- data/spec/app/models/word_origin.rb +0 -11
- data/spec/app/models/writer.rb +0 -11
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
- data/spec/mongoid/matchable/all_spec.rb +0 -31
- data/spec/mongoid/matchable/and_spec.rb +0 -187
- data/spec/mongoid/matchable/default_spec.rb +0 -130
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -86
- data/spec/mongoid/matchable/exists_spec.rb +0 -57
- data/spec/mongoid/matchable/gt_spec.rb +0 -86
- data/spec/mongoid/matchable/gte_spec.rb +0 -84
- data/spec/mongoid/matchable/in_spec.rb +0 -49
- data/spec/mongoid/matchable/lt_spec.rb +0 -85
- data/spec/mongoid/matchable/lte_spec.rb +0 -85
- data/spec/mongoid/matchable/ne_spec.rb +0 -46
- data/spec/mongoid/matchable/nin_spec.rb +0 -48
- data/spec/mongoid/matchable/nor_spec.rb +0 -209
- data/spec/mongoid/matchable/or_spec.rb +0 -131
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
- data/spec/mongoid/matchable/size_spec.rb +0 -25
- data/spec/mongoid/matchable_spec.rb +0 -853
- data/spec/mongoid/relations/accessors_spec.rb +0 -821
- data/spec/mongoid/relations/auto_save_spec.rb +0 -314
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -233
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -230
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
- data/spec/mongoid/relations/builders_spec.rb +0 -253
- data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
- data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
- data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
- data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
- data/spec/mongoid/relations/cascading_spec.rb +0 -355
- data/spec/mongoid/relations/constraint_spec.rb +0 -75
- data/spec/mongoid/relations/conversions_spec.rb +0 -128
- data/spec/mongoid/relations/counter_cache_spec.rb +0 -450
- data/spec/mongoid/relations/cyclic_spec.rb +0 -178
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +0 -133
- data/spec/mongoid/relations/eager/has_many_spec.rb +0 -244
- data/spec/mongoid/relations/eager/has_one_spec.rb +0 -163
- data/spec/mongoid/relations/eager_spec.rb +0 -279
- data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
- data/spec/mongoid/relations/embedded/in_spec.rb +0 -579
- data/spec/mongoid/relations/embedded/many_spec.rb +0 -4412
- data/spec/mongoid/relations/embedded/one_spec.rb +0 -1068
- data/spec/mongoid/relations/macros_spec.rb +0 -1039
- data/spec/mongoid/relations/metadata_spec.rb +0 -1985
- data/spec/mongoid/relations/options_spec.rb +0 -35
- data/spec/mongoid/relations/polymorphic_spec.rb +0 -128
- data/spec/mongoid/relations/referenced/in_spec.rb +0 -1366
- data/spec/mongoid/relations/referenced/many_spec.rb +0 -3816
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3577
- data/spec/mongoid/relations/referenced/one_spec.rb +0 -1240
- data/spec/mongoid/relations/reflections_spec.rb +0 -101
- data/spec/mongoid/relations/synchronization_spec.rb +0 -495
- data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1825
- data/spec/mongoid/relations/touchable_spec.rb +0 -402
- data/spec/mongoid/relations_spec.rb +0 -189
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "spec_helper"
|
|
2
4
|
|
|
3
5
|
describe Mongoid::Contextual::Mongo do
|
|
@@ -7,7 +9,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
7
9
|
describe "##{method}" do
|
|
8
10
|
|
|
9
11
|
before do
|
|
10
|
-
Band.create(name: "Depeche Mode")
|
|
12
|
+
Band.create!(name: "Depeche Mode")
|
|
11
13
|
end
|
|
12
14
|
|
|
13
15
|
context "when the count is zero" do
|
|
@@ -78,11 +80,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
78
80
|
describe "#count" do
|
|
79
81
|
|
|
80
82
|
let!(:depeche) do
|
|
81
|
-
Band.create(name: "Depeche Mode")
|
|
83
|
+
Band.create!(name: "Depeche Mode")
|
|
82
84
|
end
|
|
83
85
|
|
|
84
86
|
let!(:new_order) do
|
|
85
|
-
Band.create(name: "New Order")
|
|
87
|
+
Band.create!(name: "New Order")
|
|
86
88
|
end
|
|
87
89
|
|
|
88
90
|
let(:criteria) do
|
|
@@ -106,11 +108,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
106
108
|
described_class.new(criteria.cache)
|
|
107
109
|
end
|
|
108
110
|
|
|
109
|
-
before do
|
|
110
|
-
expect(context.view).to receive(:count).once.and_return(1)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
111
|
it "returns the count cached value after first call" do
|
|
112
|
+
expect(context.view).to receive(:count_documents).once.and_return(1)
|
|
114
113
|
2.times { expect(context.count).to eq(1) }
|
|
115
114
|
end
|
|
116
115
|
end
|
|
@@ -134,7 +133,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
134
133
|
context "and a limit true" do
|
|
135
134
|
|
|
136
135
|
before do
|
|
137
|
-
2.times { Band.create(name: "Depeche Mode", likes: 1) }
|
|
136
|
+
2.times { Band.create!(name: "Depeche Mode", likes: 1) }
|
|
138
137
|
end
|
|
139
138
|
|
|
140
139
|
let(:count) do
|
|
@@ -152,7 +151,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
152
151
|
context "when provided limit" do
|
|
153
152
|
|
|
154
153
|
before do
|
|
155
|
-
2.times { Band.create(name: "Depeche Mode") }
|
|
154
|
+
2.times { Band.create!(name: "Depeche Mode") }
|
|
156
155
|
end
|
|
157
156
|
|
|
158
157
|
let(:context) do
|
|
@@ -168,7 +167,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
168
167
|
end
|
|
169
168
|
end
|
|
170
169
|
|
|
171
|
-
context 'when a collation is specified'
|
|
170
|
+
context 'when a collation is specified' do
|
|
171
|
+
min_server_version '3.4'
|
|
172
172
|
|
|
173
173
|
let(:context) do
|
|
174
174
|
described_class.new(criteria)
|
|
@@ -191,16 +191,81 @@ describe Mongoid::Contextual::Mongo do
|
|
|
191
191
|
end
|
|
192
192
|
end
|
|
193
193
|
|
|
194
|
+
describe "#estimated_count" do
|
|
195
|
+
|
|
196
|
+
let!(:depeche) do
|
|
197
|
+
Band.create!(name: "Depeche Mode")
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
let!(:new_order) do
|
|
201
|
+
Band.create!(name: "New Order")
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
let(:criteria) do
|
|
205
|
+
Band.where
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
context "when not providing options" do
|
|
209
|
+
it 'returns the correct count' do
|
|
210
|
+
expect(criteria.estimated_count).to eq(2)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
context "when providing options" do
|
|
215
|
+
it 'returns the correct count' do
|
|
216
|
+
expect(criteria.estimated_count(maxTimeMS: 1000)).to eq(2)
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
context "when context is cached" do
|
|
221
|
+
|
|
222
|
+
let(:context) do
|
|
223
|
+
described_class.new(criteria.cache)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "returns the count cached value after first call" do
|
|
227
|
+
expect(context.view).to receive(:estimated_document_count).once.and_return(1)
|
|
228
|
+
2.times do
|
|
229
|
+
context.estimated_count
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
context "when the criteria contains a selector", :focus do
|
|
235
|
+
let(:criteria) do
|
|
236
|
+
Band.where(name: "New Order")
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
context "when not providing options" do
|
|
240
|
+
it 'raises an error' do
|
|
241
|
+
expect do
|
|
242
|
+
criteria.estimated_count
|
|
243
|
+
end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
context "when providing options" do
|
|
248
|
+
it 'raises an error' do
|
|
249
|
+
expect do
|
|
250
|
+
criteria.estimated_count(maxTimeMS: 1000)
|
|
251
|
+
end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
|
|
194
259
|
[ :delete, :delete_all ].each do |method|
|
|
195
260
|
|
|
196
261
|
describe "##{method}" do
|
|
197
262
|
|
|
198
263
|
let!(:depeche_mode) do
|
|
199
|
-
Band.create(name: "Depeche Mode")
|
|
264
|
+
Band.create!(name: "Depeche Mode")
|
|
200
265
|
end
|
|
201
266
|
|
|
202
267
|
let!(:new_order) do
|
|
203
|
-
Band.create(name: "New Order")
|
|
268
|
+
Band.create!(name: "New Order")
|
|
204
269
|
end
|
|
205
270
|
|
|
206
271
|
context "when the selector is contraining" do
|
|
@@ -229,7 +294,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
229
294
|
expect(deleted).to eq(1)
|
|
230
295
|
end
|
|
231
296
|
|
|
232
|
-
context 'when the criteria has a collation'
|
|
297
|
+
context 'when the criteria has a collation' do
|
|
298
|
+
min_server_version '3.4'
|
|
233
299
|
|
|
234
300
|
let(:criteria) do
|
|
235
301
|
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
@@ -300,11 +366,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
300
366
|
describe "##{method}" do
|
|
301
367
|
|
|
302
368
|
let!(:depeche_mode) do
|
|
303
|
-
Band.create(name: "Depeche Mode")
|
|
369
|
+
Band.create!(name: "Depeche Mode")
|
|
304
370
|
end
|
|
305
371
|
|
|
306
372
|
let!(:new_order) do
|
|
307
|
-
Band.create(name: "New Order")
|
|
373
|
+
Band.create!(name: "New Order")
|
|
308
374
|
end
|
|
309
375
|
|
|
310
376
|
context "when the selector is contraining" do
|
|
@@ -333,7 +399,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
333
399
|
expect(destroyed).to eq(1)
|
|
334
400
|
end
|
|
335
401
|
|
|
336
|
-
context 'when the criteria has a collation'
|
|
402
|
+
context 'when the criteria has a collation' do
|
|
403
|
+
min_server_version '3.4'
|
|
337
404
|
|
|
338
405
|
let(:criteria) do
|
|
339
406
|
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
@@ -384,7 +451,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
384
451
|
context 'when the write concern is unacknowledged' do
|
|
385
452
|
|
|
386
453
|
before do
|
|
387
|
-
2.times { Band.create }
|
|
454
|
+
2.times { Band.create! }
|
|
388
455
|
end
|
|
389
456
|
|
|
390
457
|
let(:criteria) do
|
|
@@ -406,27 +473,83 @@ describe Mongoid::Contextual::Mongo do
|
|
|
406
473
|
describe "#distinct" do
|
|
407
474
|
|
|
408
475
|
before do
|
|
409
|
-
Band.create(name: "Depeche Mode", years: 30)
|
|
410
|
-
Band.create(name: "New Order", years: 25)
|
|
476
|
+
Band.create!(name: "Depeche Mode", years: 30, sales: "1E2")
|
|
477
|
+
Band.create!(name: "New Order", years: 25, sales: "2E3")
|
|
478
|
+
Band.create!(name: "10,000 Maniacs", years: 20, sales: "1E2")
|
|
411
479
|
end
|
|
412
480
|
|
|
413
|
-
|
|
481
|
+
with_config_values :legacy_pluck_distinct, true, false do
|
|
482
|
+
context "when limiting the result set" do
|
|
414
483
|
|
|
415
|
-
|
|
416
|
-
|
|
484
|
+
let(:criteria) do
|
|
485
|
+
Band.where(name: "Depeche Mode")
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
let(:context) do
|
|
489
|
+
described_class.new(criteria)
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
it "returns the distinct matching fields" do
|
|
493
|
+
expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
|
|
494
|
+
end
|
|
417
495
|
end
|
|
418
496
|
|
|
419
|
-
|
|
420
|
-
|
|
497
|
+
context "when not limiting the result set" do
|
|
498
|
+
|
|
499
|
+
let(:criteria) do
|
|
500
|
+
Band.criteria
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
let(:context) do
|
|
504
|
+
described_class.new(criteria)
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
it "returns the distinct field values" do
|
|
508
|
+
expect(context.distinct(:name).sort).to eq([ "10,000 Maniacs", "Depeche Mode", "New Order" ].sort)
|
|
509
|
+
end
|
|
421
510
|
end
|
|
422
511
|
|
|
423
|
-
|
|
424
|
-
|
|
512
|
+
context "when providing an aliased field" do
|
|
513
|
+
|
|
514
|
+
let(:criteria) do
|
|
515
|
+
Band.criteria
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
let(:context) do
|
|
519
|
+
described_class.new(criteria)
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
it "returns the distinct field values" do
|
|
523
|
+
expect(context.distinct(:years).sort).to eq([ 20, 25, 30 ])
|
|
524
|
+
end
|
|
425
525
|
end
|
|
426
|
-
end
|
|
427
526
|
|
|
428
|
-
|
|
527
|
+
context 'when a collation is specified' do
|
|
528
|
+
min_server_version '3.4'
|
|
529
|
+
|
|
530
|
+
before do
|
|
531
|
+
Band.create!(name: 'DEPECHE MODE')
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
let(:context) do
|
|
535
|
+
described_class.new(criteria)
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
let(:expected_results) do
|
|
539
|
+
["10,000 Maniacs", "Depeche Mode", "New Order"]
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
let(:criteria) do
|
|
543
|
+
Band.where({}).collation(locale: 'en_US', strength: 2)
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
it 'applies the collation' do
|
|
547
|
+
expect(context.distinct(:name).sort).to eq(expected_results.sort)
|
|
548
|
+
end
|
|
549
|
+
end
|
|
550
|
+
end
|
|
429
551
|
|
|
552
|
+
context "when providing a demongoizable field" do
|
|
430
553
|
let(:criteria) do
|
|
431
554
|
Band.criteria
|
|
432
555
|
end
|
|
@@ -435,46 +558,253 @@ describe Mongoid::Contextual::Mongo do
|
|
|
435
558
|
described_class.new(criteria)
|
|
436
559
|
end
|
|
437
560
|
|
|
438
|
-
|
|
439
|
-
|
|
561
|
+
context "when legacy_pluck_distinct is set" do
|
|
562
|
+
config_override :legacy_pluck_distinct, true
|
|
563
|
+
|
|
564
|
+
it "returns the non-demongoized distinct field values" do
|
|
565
|
+
expect(context.distinct(:sales).sort).to eq([ "1E2", "2E3" ])
|
|
566
|
+
end
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
context "when legacy_pluck_distinct is not set" do
|
|
570
|
+
config_override :legacy_pluck_distinct, false
|
|
571
|
+
|
|
572
|
+
it "returns the non-demongoized distinct field values" do
|
|
573
|
+
expect(context.distinct(:sales).sort).to eq([ BigDecimal("1E2"), BigDecimal("2E3") ])
|
|
574
|
+
end
|
|
440
575
|
end
|
|
441
576
|
end
|
|
442
577
|
|
|
443
|
-
context "when
|
|
578
|
+
context "when getting a localized field" do
|
|
579
|
+
before do
|
|
580
|
+
I18n.locale = :en
|
|
581
|
+
d = Dictionary.create!(description: 'english-text')
|
|
582
|
+
I18n.locale = :de
|
|
583
|
+
d.description = 'deutsch-text'
|
|
584
|
+
d.save!
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
after do
|
|
588
|
+
I18n.locale = :en
|
|
589
|
+
end
|
|
444
590
|
|
|
445
591
|
let(:criteria) do
|
|
446
|
-
|
|
592
|
+
Dictionary.criteria
|
|
447
593
|
end
|
|
448
594
|
|
|
449
595
|
let(:context) do
|
|
450
596
|
described_class.new(criteria)
|
|
451
597
|
end
|
|
452
598
|
|
|
453
|
-
|
|
454
|
-
|
|
599
|
+
context "when getting the field without _translations" do
|
|
600
|
+
context "when legacy_pluck_distinct is set" do
|
|
601
|
+
config_override :legacy_pluck_distinct, true
|
|
602
|
+
|
|
603
|
+
it "gets the full hash" do
|
|
604
|
+
expect(context.distinct(:description)).to eq([{ "de" => "deutsch-text", "en" => "english-text" }])
|
|
605
|
+
end
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
context "when legacy_pluck_distinct is not set" do
|
|
609
|
+
config_override :legacy_pluck_distinct, false
|
|
610
|
+
|
|
611
|
+
it "gets the demongoized localized field" do
|
|
612
|
+
expect(context.distinct(:description)).to eq([ 'deutsch-text' ])
|
|
613
|
+
end
|
|
614
|
+
end
|
|
455
615
|
end
|
|
456
|
-
end
|
|
457
616
|
|
|
458
|
-
|
|
617
|
+
context "when getting the field with _translations" do
|
|
618
|
+
context "when legacy_pluck_distinct is set" do
|
|
619
|
+
config_override :legacy_pluck_distinct, true
|
|
459
620
|
|
|
460
|
-
|
|
461
|
-
|
|
621
|
+
it "gets an empty list" do
|
|
622
|
+
expect(context.distinct(:description_translations)).to eq([])
|
|
623
|
+
end
|
|
624
|
+
end
|
|
625
|
+
|
|
626
|
+
context "when legacy_pluck_distinct is not set" do
|
|
627
|
+
config_override :legacy_pluck_distinct, false
|
|
628
|
+
|
|
629
|
+
it "gets the full hash" do
|
|
630
|
+
expect(context.distinct(:description_translations)).to eq([ { "de" => "deutsch-text", "en" => "english-text" } ])
|
|
631
|
+
end
|
|
632
|
+
end
|
|
462
633
|
end
|
|
463
634
|
|
|
464
|
-
|
|
465
|
-
|
|
635
|
+
context 'when plucking a specific locale' do
|
|
636
|
+
|
|
637
|
+
let(:distinct) do
|
|
638
|
+
context.distinct(:'description.de')
|
|
639
|
+
end
|
|
640
|
+
|
|
641
|
+
context "when legacy_pluck_distinct is set" do
|
|
642
|
+
config_override :legacy_pluck_distinct, true
|
|
643
|
+
|
|
644
|
+
it 'returns the specific translation' do
|
|
645
|
+
expect(distinct).to eq([ 'deutsch-text' ])
|
|
646
|
+
end
|
|
647
|
+
end
|
|
648
|
+
|
|
649
|
+
context "when legacy_pluck_distinct is not set" do
|
|
650
|
+
config_override :legacy_pluck_distinct, false
|
|
651
|
+
|
|
652
|
+
it 'returns the specific translation' do
|
|
653
|
+
expect(distinct).to eq([ "deutsch-text" ])
|
|
654
|
+
end
|
|
655
|
+
end
|
|
466
656
|
end
|
|
467
657
|
|
|
468
|
-
|
|
469
|
-
|
|
658
|
+
context 'when plucking a specific locale from _translations field' do
|
|
659
|
+
|
|
660
|
+
let(:distinct) do
|
|
661
|
+
context.distinct(:'description_translations.de')
|
|
662
|
+
end
|
|
663
|
+
|
|
664
|
+
context "when legacy_pluck_distinct is set" do
|
|
665
|
+
config_override :legacy_pluck_distinct, true
|
|
666
|
+
|
|
667
|
+
it 'returns the empty list' do
|
|
668
|
+
expect(distinct).to eq([])
|
|
669
|
+
end
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
context "when legacy_pluck_distinct is not set" do
|
|
673
|
+
config_override :legacy_pluck_distinct, false
|
|
674
|
+
|
|
675
|
+
it 'returns the specific translations' do
|
|
676
|
+
expect(distinct).to eq(['deutsch-text'])
|
|
677
|
+
end
|
|
678
|
+
end
|
|
470
679
|
end
|
|
471
680
|
|
|
472
|
-
|
|
473
|
-
|
|
681
|
+
context 'when fallbacks are enabled with a locale list' do
|
|
682
|
+
require_fallbacks
|
|
683
|
+
|
|
684
|
+
around(:all) do |example|
|
|
685
|
+
prev_fallbacks = I18n.fallbacks.dup
|
|
686
|
+
I18n.fallbacks[:he] = [ :en ]
|
|
687
|
+
example.run
|
|
688
|
+
I18n.fallbacks = prev_fallbacks
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
after do
|
|
692
|
+
I18n.locale = :en
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
let(:distinct) do
|
|
696
|
+
context.distinct(:description).first
|
|
697
|
+
end
|
|
698
|
+
|
|
699
|
+
context "when legacy_pluck_distinct is set" do
|
|
700
|
+
config_override :legacy_pluck_distinct, true
|
|
701
|
+
|
|
702
|
+
it "does not correctly use the fallback" do
|
|
703
|
+
distinct.should == {"de"=>"deutsch-text", "en"=>"english-text"}
|
|
704
|
+
end
|
|
705
|
+
end
|
|
706
|
+
|
|
707
|
+
context "when legacy_pluck_distinct is not set" do
|
|
708
|
+
config_override :legacy_pluck_distinct, false
|
|
709
|
+
|
|
710
|
+
it "correctly uses the fallback" do
|
|
711
|
+
I18n.locale = :en
|
|
712
|
+
d = Dictionary.create!(description: 'english-text')
|
|
713
|
+
I18n.locale = :he
|
|
714
|
+
distinct.should == "english-text"
|
|
715
|
+
end
|
|
716
|
+
end
|
|
717
|
+
end
|
|
718
|
+
|
|
719
|
+
context "when the localized field is embedded" do
|
|
720
|
+
before do
|
|
721
|
+
p = Passport.new
|
|
722
|
+
I18n.locale = :en
|
|
723
|
+
p.name = "Neil"
|
|
724
|
+
I18n.locale = :he
|
|
725
|
+
p.name = "Nissim"
|
|
726
|
+
|
|
727
|
+
Person.create!(passport: p, employer_id: 12345)
|
|
728
|
+
end
|
|
729
|
+
|
|
730
|
+
after do
|
|
731
|
+
I18n.locale = :en
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
let(:criteria) do
|
|
735
|
+
Person.where(employer_id: 12345)
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
let(:context) do
|
|
739
|
+
described_class.new(criteria)
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
let(:distinct) do
|
|
743
|
+
context.distinct("pass.name").first
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
let(:distinct_translations) do
|
|
747
|
+
context.distinct("pass.name_translations").first
|
|
748
|
+
end
|
|
749
|
+
|
|
750
|
+
let(:distinct_translations_field) do
|
|
751
|
+
context.distinct("pass.name_translations.en").first
|
|
752
|
+
end
|
|
753
|
+
|
|
754
|
+
context "when legacy_pluck_distinct is set" do
|
|
755
|
+
config_override :legacy_pluck_distinct, true
|
|
756
|
+
|
|
757
|
+
it "returns the full hash" do
|
|
758
|
+
expect(distinct).to eq({ "en" => "Neil", "he" => "Nissim" })
|
|
759
|
+
end
|
|
760
|
+
|
|
761
|
+
it "returns the empty hash" do
|
|
762
|
+
expect(distinct_translations).to eq(nil)
|
|
763
|
+
end
|
|
764
|
+
|
|
765
|
+
it "returns the empty hash" do
|
|
766
|
+
expect(distinct_translations_field).to eq(nil)
|
|
767
|
+
end
|
|
768
|
+
end
|
|
769
|
+
|
|
770
|
+
context "when legacy_pluck_distinct is not set" do
|
|
771
|
+
config_override :legacy_pluck_distinct, false
|
|
772
|
+
|
|
773
|
+
it "returns the translation for the current locale" do
|
|
774
|
+
expect(distinct).to eq("Nissim")
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
it "returns the full _translation hash" do
|
|
778
|
+
expect(distinct_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
it "returns the translation for the requested locale" do
|
|
782
|
+
expect(distinct_translations_field).to eq("Neil")
|
|
783
|
+
end
|
|
784
|
+
end
|
|
785
|
+
end
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
context "when getting an embedded field" do
|
|
789
|
+
|
|
790
|
+
let(:label) { Label.new(sales: "1E2") }
|
|
791
|
+
let!(:band) { Band.create!(label: label) }
|
|
792
|
+
let(:criteria) { Band.where(_id: band.id) }
|
|
793
|
+
let(:context) { described_class.new(criteria) }
|
|
794
|
+
|
|
795
|
+
context "when legacy_pluck_distinct is set" do
|
|
796
|
+
config_override :legacy_pluck_distinct, true
|
|
797
|
+
|
|
798
|
+
it "returns the distinct matching fields" do
|
|
799
|
+
expect(context.distinct("label.sales")).to eq([ "1E2" ])
|
|
800
|
+
end
|
|
474
801
|
end
|
|
475
802
|
|
|
476
|
-
|
|
477
|
-
|
|
803
|
+
context "when legacy_pluck_distinct is not set" do
|
|
804
|
+
config_override :legacy_pluck_distinct, false
|
|
805
|
+
it "returns the distinct matching fields" do
|
|
806
|
+
expect(context.distinct("label.sales")).to eq([ BigDecimal("1E2") ])
|
|
807
|
+
end
|
|
478
808
|
end
|
|
479
809
|
end
|
|
480
810
|
end
|
|
@@ -482,7 +812,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
482
812
|
describe "#each" do
|
|
483
813
|
|
|
484
814
|
before do
|
|
485
|
-
Band.create(name: "Depeche Mode")
|
|
815
|
+
Band.create!(name: "Depeche Mode")
|
|
486
816
|
end
|
|
487
817
|
|
|
488
818
|
let(:criteria) do
|
|
@@ -493,7 +823,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
493
823
|
described_class.new(criteria)
|
|
494
824
|
end
|
|
495
825
|
|
|
496
|
-
context 'when the criteria has a collation'
|
|
826
|
+
context 'when the criteria has a collation' do
|
|
827
|
+
min_server_version '3.4'
|
|
497
828
|
|
|
498
829
|
let(:criteria) do
|
|
499
830
|
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
@@ -559,7 +890,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
559
890
|
context "when iterating with next" do
|
|
560
891
|
|
|
561
892
|
before do
|
|
562
|
-
10.times { |i| Band.create(name: "Test #{i}") }
|
|
893
|
+
10.times { |i| Band.create!(name: "Test #{i}") }
|
|
563
894
|
end
|
|
564
895
|
|
|
565
896
|
let(:criteria) do
|
|
@@ -571,12 +902,50 @@ describe Mongoid::Contextual::Mongo do
|
|
|
571
902
|
end
|
|
572
903
|
|
|
573
904
|
it "does not load all documents" do
|
|
574
|
-
|
|
905
|
+
subscriber = Mrss::EventSubscriber.new
|
|
906
|
+
context.view.client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
|
907
|
+
|
|
575
908
|
enum.next
|
|
909
|
+
|
|
910
|
+
find_events = subscriber.all_events.select do |evt|
|
|
911
|
+
evt.command_name == 'find'
|
|
912
|
+
end
|
|
913
|
+
expect(find_events.length).to be(2)
|
|
914
|
+
get_more_events = subscriber.all_events.select do |evt|
|
|
915
|
+
evt.command_name == 'getMore'
|
|
916
|
+
end
|
|
917
|
+
expect(get_more_events.length).to be(0)
|
|
918
|
+
ensure
|
|
919
|
+
context.view.client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
|
|
576
920
|
end
|
|
577
921
|
end
|
|
578
922
|
end
|
|
579
923
|
end
|
|
924
|
+
|
|
925
|
+
context 'when the criteria has a parent document' do
|
|
926
|
+
|
|
927
|
+
before do
|
|
928
|
+
Post.create!(person: person)
|
|
929
|
+
Post.create!(person: person)
|
|
930
|
+
Post.create!(person: person)
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
let(:person) do
|
|
934
|
+
Person.new
|
|
935
|
+
end
|
|
936
|
+
|
|
937
|
+
let(:criteria) do
|
|
938
|
+
person.posts.all
|
|
939
|
+
end
|
|
940
|
+
|
|
941
|
+
let(:persons) do
|
|
942
|
+
criteria.collect(&:person)
|
|
943
|
+
end
|
|
944
|
+
|
|
945
|
+
it 'sets the same parent object on each related object' do
|
|
946
|
+
expect(persons.uniq.size).to eq(1)
|
|
947
|
+
end
|
|
948
|
+
end
|
|
580
949
|
end
|
|
581
950
|
|
|
582
951
|
describe "#eager_load" do
|
|
@@ -591,12 +960,12 @@ describe Mongoid::Contextual::Mongo do
|
|
|
591
960
|
|
|
592
961
|
context "when no documents are returned" do
|
|
593
962
|
|
|
594
|
-
let(:
|
|
963
|
+
let(:game_association) do
|
|
595
964
|
Person.reflect_on_association(:game)
|
|
596
965
|
end
|
|
597
966
|
|
|
598
967
|
it "does not make any additional database queries" do
|
|
599
|
-
expect(
|
|
968
|
+
expect(game_association).to receive(:eager_load).never
|
|
600
969
|
context.send(:eager_load, [])
|
|
601
970
|
end
|
|
602
971
|
end
|
|
@@ -605,7 +974,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
605
974
|
describe "#exists?" do
|
|
606
975
|
|
|
607
976
|
before do
|
|
608
|
-
Band.create(name: "Depeche Mode")
|
|
977
|
+
Band.create!(name: "Depeche Mode")
|
|
609
978
|
end
|
|
610
979
|
|
|
611
980
|
context "when the count is zero" do
|
|
@@ -718,11 +1087,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
718
1087
|
describe "#find_one_and_replace" do
|
|
719
1088
|
|
|
720
1089
|
let!(:depeche) do
|
|
721
|
-
Band.create(name: "Depeche Mode")
|
|
1090
|
+
Band.create!(name: "Depeche Mode")
|
|
722
1091
|
end
|
|
723
1092
|
|
|
724
1093
|
let!(:tool) do
|
|
725
|
-
Band.create(name: "Tool")
|
|
1094
|
+
Band.create!(name: "Tool")
|
|
726
1095
|
end
|
|
727
1096
|
|
|
728
1097
|
context "when the selector matches" do
|
|
@@ -825,7 +1194,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
825
1194
|
end
|
|
826
1195
|
end
|
|
827
1196
|
|
|
828
|
-
context 'when a collation is specified on the criteria'
|
|
1197
|
+
context 'when a collation is specified on the criteria' do
|
|
1198
|
+
min_server_version '3.4'
|
|
829
1199
|
|
|
830
1200
|
let(:criteria) do
|
|
831
1201
|
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
@@ -873,11 +1243,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
873
1243
|
describe "#find_one_and_update" do
|
|
874
1244
|
|
|
875
1245
|
let!(:depeche) do
|
|
876
|
-
Band.create(name: "Depeche Mode")
|
|
1246
|
+
Band.create!(name: "Depeche Mode")
|
|
877
1247
|
end
|
|
878
1248
|
|
|
879
1249
|
let!(:tool) do
|
|
880
|
-
Band.create(name: "Tool")
|
|
1250
|
+
Band.create!(name: "Tool")
|
|
881
1251
|
end
|
|
882
1252
|
|
|
883
1253
|
context "when the selector matches" do
|
|
@@ -978,7 +1348,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
978
1348
|
end
|
|
979
1349
|
end
|
|
980
1350
|
|
|
981
|
-
context 'when a collation is specified on the criteria'
|
|
1351
|
+
context 'when a collation is specified on the criteria' do
|
|
1352
|
+
min_server_version '3.4'
|
|
982
1353
|
|
|
983
1354
|
let(:criteria) do
|
|
984
1355
|
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
@@ -1025,7 +1396,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1025
1396
|
describe "#find_one_and_delete" do
|
|
1026
1397
|
|
|
1027
1398
|
let!(:depeche) do
|
|
1028
|
-
Band.create(name: "Depeche Mode")
|
|
1399
|
+
Band.create!(name: "Depeche Mode")
|
|
1029
1400
|
end
|
|
1030
1401
|
|
|
1031
1402
|
let(:criteria) do
|
|
@@ -1052,7 +1423,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1052
1423
|
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
1053
1424
|
end
|
|
1054
1425
|
|
|
1055
|
-
context 'when a collation is specified on the criteria'
|
|
1426
|
+
context 'when a collation is specified on the criteria' do
|
|
1427
|
+
min_server_version '3.4'
|
|
1056
1428
|
|
|
1057
1429
|
let(:criteria) do
|
|
1058
1430
|
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
@@ -1103,11 +1475,15 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1103
1475
|
describe "##{method}" do
|
|
1104
1476
|
|
|
1105
1477
|
let!(:depeche_mode) do
|
|
1106
|
-
Band.create(name: "Depeche Mode")
|
|
1478
|
+
Band.create!(name: "Depeche Mode")
|
|
1107
1479
|
end
|
|
1108
1480
|
|
|
1109
1481
|
let!(:new_order) do
|
|
1110
|
-
Band.create(name: "New Order")
|
|
1482
|
+
Band.create!(name: "New Order")
|
|
1483
|
+
end
|
|
1484
|
+
|
|
1485
|
+
let!(:rolling_stones) do
|
|
1486
|
+
Band.create!(name: "The Rolling Stones")
|
|
1111
1487
|
end
|
|
1112
1488
|
|
|
1113
1489
|
context "when the context is not cached" do
|
|
@@ -1124,7 +1500,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1124
1500
|
expect(context.send(method)).to eq(depeche_mode)
|
|
1125
1501
|
end
|
|
1126
1502
|
|
|
1127
|
-
context 'when the criteria has a collation'
|
|
1503
|
+
context 'when the criteria has a collation' do
|
|
1504
|
+
min_server_version '3.4'
|
|
1128
1505
|
|
|
1129
1506
|
let(:criteria) do
|
|
1130
1507
|
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
@@ -1149,14 +1526,14 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1149
1526
|
context "when there is sort on the context" do
|
|
1150
1527
|
|
|
1151
1528
|
it "follows the main sort" do
|
|
1152
|
-
expect(context.send(method)).to eq(
|
|
1529
|
+
expect(context.send(method)).to eq(rolling_stones)
|
|
1153
1530
|
end
|
|
1154
1531
|
end
|
|
1155
1532
|
|
|
1156
1533
|
context "when subsequently calling #last" do
|
|
1157
1534
|
|
|
1158
1535
|
it "returns the correct document" do
|
|
1159
|
-
expect(context.send(method)).to eq(
|
|
1536
|
+
expect(context.send(method)).to eq(rolling_stones)
|
|
1160
1537
|
expect(context.last).to eq(depeche_mode)
|
|
1161
1538
|
end
|
|
1162
1539
|
end
|
|
@@ -1181,23 +1558,22 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1181
1558
|
|
|
1182
1559
|
it 'returns the last document, sorted by _id' do
|
|
1183
1560
|
expect(context.send(method)).to eq(depeche_mode)
|
|
1184
|
-
expect(context.last).to eq(
|
|
1561
|
+
expect(context.last).to eq(rolling_stones)
|
|
1185
1562
|
end
|
|
1186
1563
|
end
|
|
1187
1564
|
|
|
1188
|
-
context 'with option {
|
|
1189
|
-
|
|
1565
|
+
context 'with option { id_sort: :none }' do
|
|
1190
1566
|
let(:opts) do
|
|
1191
1567
|
{ id_sort: :none }
|
|
1192
1568
|
end
|
|
1193
1569
|
|
|
1194
|
-
it '
|
|
1570
|
+
it 'applies the sort on _id' do
|
|
1195
1571
|
expect(context.send(method, opts)).to eq(depeche_mode)
|
|
1196
1572
|
end
|
|
1197
1573
|
|
|
1198
1574
|
context 'when calling #last' do
|
|
1199
1575
|
|
|
1200
|
-
it '
|
|
1576
|
+
it 'doesn\'t apply a sort on _id' do
|
|
1201
1577
|
expect(context.send(method, opts)).to eq(depeche_mode)
|
|
1202
1578
|
expect(context.last(opts)).to eq(depeche_mode)
|
|
1203
1579
|
end
|
|
@@ -1215,33 +1591,32 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1215
1591
|
described_class.new(criteria)
|
|
1216
1592
|
end
|
|
1217
1593
|
|
|
1218
|
-
|
|
1219
1594
|
it 'applies the criteria sort' do
|
|
1220
|
-
expect(context.send(method)).to eq(
|
|
1595
|
+
expect(context.send(method)).to eq(rolling_stones)
|
|
1221
1596
|
end
|
|
1222
1597
|
|
|
1223
1598
|
context 'when calling #last' do
|
|
1224
1599
|
|
|
1225
1600
|
it 'applies the criteria sort' do
|
|
1226
|
-
expect(context.send(method)).to eq(
|
|
1601
|
+
expect(context.send(method)).to eq(rolling_stones)
|
|
1227
1602
|
expect(context.last).to eq(depeche_mode)
|
|
1228
1603
|
end
|
|
1229
1604
|
end
|
|
1230
1605
|
|
|
1231
|
-
context 'with option {
|
|
1606
|
+
context 'with option { id_sort: :none }' do
|
|
1232
1607
|
|
|
1233
1608
|
let(:opts) do
|
|
1234
1609
|
{ id_sort: :none }
|
|
1235
1610
|
end
|
|
1236
1611
|
|
|
1237
|
-
it '
|
|
1238
|
-
expect(context.send(method, opts)).to eq(
|
|
1612
|
+
it 'uses the preexisting sort' do
|
|
1613
|
+
expect(context.send(method, opts)).to eq(rolling_stones)
|
|
1239
1614
|
end
|
|
1240
1615
|
|
|
1241
1616
|
context 'when calling #last' do
|
|
1242
1617
|
|
|
1243
|
-
it '
|
|
1244
|
-
expect(context.send(method, opts)).to eq(
|
|
1618
|
+
it 'uses the preexisting sort' do
|
|
1619
|
+
expect(context.send(method, opts)).to eq(rolling_stones)
|
|
1245
1620
|
expect(context.last(opts)).to eq(depeche_mode)
|
|
1246
1621
|
end
|
|
1247
1622
|
end
|
|
@@ -1261,14 +1636,14 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1261
1636
|
context "when there is sort on the context" do
|
|
1262
1637
|
|
|
1263
1638
|
it "follows the main sort" do
|
|
1264
|
-
expect(context.send(method)).to eq(
|
|
1639
|
+
expect(context.send(method)).to eq(rolling_stones)
|
|
1265
1640
|
end
|
|
1266
1641
|
end
|
|
1267
1642
|
|
|
1268
1643
|
context "when subsequently calling #last" do
|
|
1269
1644
|
|
|
1270
1645
|
it "returns the correct document" do
|
|
1271
|
-
expect(context.send(method)).to eq(
|
|
1646
|
+
expect(context.send(method)).to eq(rolling_stones)
|
|
1272
1647
|
expect(context.last).to eq(depeche_mode)
|
|
1273
1648
|
end
|
|
1274
1649
|
end
|
|
@@ -1308,43 +1683,717 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1308
1683
|
end
|
|
1309
1684
|
end
|
|
1310
1685
|
end
|
|
1311
|
-
end
|
|
1312
|
-
end
|
|
1313
1686
|
|
|
1314
|
-
|
|
1687
|
+
context "when including a limit" do
|
|
1315
1688
|
|
|
1316
|
-
|
|
1317
|
-
Band.where(name: "Depeche Mode").no_timeout
|
|
1318
|
-
end
|
|
1689
|
+
context "when the context is not cached" do
|
|
1319
1690
|
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1691
|
+
let(:context) do
|
|
1692
|
+
described_class.new(criteria)
|
|
1693
|
+
end
|
|
1323
1694
|
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1695
|
+
context "when the limit is 1" do
|
|
1696
|
+
let(:criteria) do
|
|
1697
|
+
Band.criteria
|
|
1698
|
+
end
|
|
1327
1699
|
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1700
|
+
let(:docs) do
|
|
1701
|
+
context.send(method, 1)
|
|
1702
|
+
end
|
|
1331
1703
|
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1704
|
+
it "returns an array of documents" do
|
|
1705
|
+
expect(docs).to eq([ depeche_mode ])
|
|
1706
|
+
end
|
|
1707
|
+
end
|
|
1335
1708
|
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1709
|
+
context "when the limit is >1" do
|
|
1710
|
+
let(:criteria) do
|
|
1711
|
+
Band.criteria
|
|
1712
|
+
end
|
|
1713
|
+
|
|
1714
|
+
let(:docs) do
|
|
1715
|
+
context.send(method, 2)
|
|
1716
|
+
end
|
|
1717
|
+
|
|
1718
|
+
it "returns the number of documents in order" do
|
|
1719
|
+
expect(docs).to eq([ depeche_mode, new_order ])
|
|
1720
|
+
end
|
|
1721
|
+
end
|
|
1722
|
+
|
|
1723
|
+
context 'when the criteria has a collation' do
|
|
1724
|
+
min_server_version '3.4'
|
|
1725
|
+
|
|
1726
|
+
let(:criteria) do
|
|
1727
|
+
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
1728
|
+
end
|
|
1729
|
+
|
|
1730
|
+
it "returns the first matching document" do
|
|
1731
|
+
expect(context.send(method, 1)).to eq([ depeche_mode ])
|
|
1732
|
+
end
|
|
1733
|
+
end
|
|
1734
|
+
end
|
|
1735
|
+
|
|
1736
|
+
context "when the context is cached" do
|
|
1737
|
+
|
|
1738
|
+
let(:context) do
|
|
1739
|
+
described_class.new(criteria)
|
|
1740
|
+
end
|
|
1741
|
+
|
|
1742
|
+
context "when the whole context is loaded" do
|
|
1743
|
+
|
|
1744
|
+
before do
|
|
1745
|
+
context.to_a
|
|
1746
|
+
end
|
|
1747
|
+
|
|
1748
|
+
context "when all of the documents are cached" do
|
|
1749
|
+
|
|
1750
|
+
let(:criteria) do
|
|
1751
|
+
Band.all.cache
|
|
1752
|
+
end
|
|
1753
|
+
|
|
1754
|
+
context "when requesting all of the documents" do
|
|
1755
|
+
|
|
1756
|
+
let(:docs) do
|
|
1757
|
+
context.send(method, 3)
|
|
1758
|
+
end
|
|
1759
|
+
|
|
1760
|
+
it "returns all of the documents without touching the database" do
|
|
1761
|
+
expect(context).to receive(:view).never
|
|
1762
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
1763
|
+
end
|
|
1764
|
+
end
|
|
1765
|
+
|
|
1766
|
+
context "when requesting fewer than all of the documents" do
|
|
1767
|
+
|
|
1768
|
+
let(:docs) do
|
|
1769
|
+
context.send(method, 2)
|
|
1770
|
+
end
|
|
1771
|
+
|
|
1772
|
+
it "returns all of the documents without touching the database" do
|
|
1773
|
+
expect(context).to receive(:view).never
|
|
1774
|
+
expect(docs).to eq([ depeche_mode, new_order ])
|
|
1775
|
+
end
|
|
1776
|
+
end
|
|
1777
|
+
end
|
|
1778
|
+
|
|
1779
|
+
context "when only one document is cached" do
|
|
1780
|
+
|
|
1781
|
+
let(:criteria) do
|
|
1782
|
+
Band.where(name: "Depeche Mode").cache
|
|
1783
|
+
end
|
|
1784
|
+
|
|
1785
|
+
context "when requesting one document" do
|
|
1786
|
+
|
|
1787
|
+
let(:docs) do
|
|
1788
|
+
context.send(method, 1)
|
|
1789
|
+
end
|
|
1790
|
+
|
|
1791
|
+
it "returns one document without touching the database" do
|
|
1792
|
+
expect(context).to receive(:view).never
|
|
1793
|
+
expect(docs).to eq([ depeche_mode ])
|
|
1794
|
+
end
|
|
1795
|
+
end
|
|
1796
|
+
end
|
|
1797
|
+
end
|
|
1798
|
+
|
|
1799
|
+
context "when the first method was called before" do
|
|
1800
|
+
|
|
1801
|
+
let(:context) do
|
|
1802
|
+
described_class.new(criteria)
|
|
1803
|
+
end
|
|
1804
|
+
|
|
1805
|
+
let(:criteria) do
|
|
1806
|
+
Band.all.cache
|
|
1807
|
+
end
|
|
1808
|
+
|
|
1809
|
+
before do
|
|
1810
|
+
context.first(before_limit)
|
|
1811
|
+
end
|
|
1812
|
+
|
|
1813
|
+
let(:docs) do
|
|
1814
|
+
context.send(method, limit)
|
|
1815
|
+
end
|
|
1816
|
+
|
|
1817
|
+
context "when getting all of the documents before" do
|
|
1818
|
+
let(:before_limit) { 3 }
|
|
1819
|
+
|
|
1820
|
+
context "when getting all of the documents" do
|
|
1821
|
+
let(:limit) { 3 }
|
|
1822
|
+
|
|
1823
|
+
it "returns all documents without touching the database" do
|
|
1824
|
+
expect(context).to receive(:view).never
|
|
1825
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
1826
|
+
end
|
|
1827
|
+
end
|
|
1828
|
+
|
|
1829
|
+
context "when getting fewer documents" do
|
|
1830
|
+
let(:limit) { 2 }
|
|
1831
|
+
|
|
1832
|
+
it "returns the correct documents without touching the database" do
|
|
1833
|
+
expect(context).to receive(:view).never
|
|
1834
|
+
expect(docs).to eq([ depeche_mode, new_order ])
|
|
1835
|
+
end
|
|
1836
|
+
end
|
|
1837
|
+
end
|
|
1838
|
+
|
|
1839
|
+
context "when getting fewer documents before" do
|
|
1840
|
+
let(:before_limit) { 2 }
|
|
1841
|
+
|
|
1842
|
+
context "when getting the same number of documents" do
|
|
1843
|
+
let(:limit) { 2 }
|
|
1844
|
+
|
|
1845
|
+
it "returns the correct documents without touching the database" do
|
|
1846
|
+
expect(context).to receive(:view).never
|
|
1847
|
+
expect(docs).to eq([ depeche_mode, new_order ])
|
|
1848
|
+
end
|
|
1849
|
+
end
|
|
1850
|
+
|
|
1851
|
+
context "when getting more documents" do
|
|
1852
|
+
let(:limit) { 3 }
|
|
1853
|
+
|
|
1854
|
+
it "returns the correct documents and touches the database" do
|
|
1855
|
+
expect(context).to receive(:view).exactly(3).times.and_call_original
|
|
1856
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
1857
|
+
end
|
|
1858
|
+
end
|
|
1859
|
+
end
|
|
1860
|
+
|
|
1861
|
+
context "when getting one document before" do
|
|
1862
|
+
let(:before_limit) { 1 }
|
|
1863
|
+
|
|
1864
|
+
context "when getting one document" do
|
|
1865
|
+
let(:limit) { 1 }
|
|
1866
|
+
|
|
1867
|
+
it "returns the correct documents without touching the database" do
|
|
1868
|
+
expect(context).to receive(:view).never
|
|
1869
|
+
expect(docs).to eq([ depeche_mode ])
|
|
1870
|
+
end
|
|
1871
|
+
end
|
|
1872
|
+
|
|
1873
|
+
context "when getting more than one document" do
|
|
1874
|
+
let(:limit) { 3 }
|
|
1875
|
+
|
|
1876
|
+
it "returns the correct documents and touches the database" do
|
|
1877
|
+
expect(context).to receive(:view).exactly(3).times.and_call_original
|
|
1878
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
1879
|
+
end
|
|
1880
|
+
end
|
|
1881
|
+
end
|
|
1882
|
+
end
|
|
1883
|
+
end
|
|
1884
|
+
end
|
|
1885
|
+
|
|
1886
|
+
context "when calling #first then #last" do
|
|
1887
|
+
|
|
1888
|
+
let(:context) do
|
|
1889
|
+
described_class.new(criteria)
|
|
1890
|
+
end
|
|
1891
|
+
|
|
1892
|
+
let(:criteria) do
|
|
1893
|
+
Band.all.cache
|
|
1894
|
+
end
|
|
1895
|
+
|
|
1896
|
+
before do
|
|
1897
|
+
context.first(before_limit)
|
|
1898
|
+
end
|
|
1899
|
+
|
|
1900
|
+
let(:docs) do
|
|
1901
|
+
context.last(limit)
|
|
1902
|
+
end
|
|
1903
|
+
|
|
1904
|
+
context "when getting one from the beginning and one from the end" do
|
|
1905
|
+
let(:before_limit) { 2 }
|
|
1906
|
+
let(:limit) { 1 }
|
|
1907
|
+
|
|
1908
|
+
it "gets the correct document" do
|
|
1909
|
+
expect(docs).to eq([rolling_stones])
|
|
1910
|
+
end
|
|
1911
|
+
end
|
|
1912
|
+
end
|
|
1913
|
+
end
|
|
1914
|
+
end
|
|
1915
|
+
|
|
1916
|
+
describe "#last" do
|
|
1917
|
+
let!(:depeche_mode) do
|
|
1918
|
+
Band.create!(name: "Depeche Mode")
|
|
1919
|
+
end
|
|
1920
|
+
|
|
1921
|
+
let!(:new_order) do
|
|
1922
|
+
Band.create!(name: "New Order")
|
|
1923
|
+
end
|
|
1924
|
+
|
|
1925
|
+
let!(:rolling_stones) do
|
|
1926
|
+
Band.create!(name: "The Rolling Stones")
|
|
1927
|
+
end
|
|
1928
|
+
|
|
1929
|
+
context "when the context is not cached" do
|
|
1930
|
+
|
|
1931
|
+
let(:criteria) do
|
|
1932
|
+
Band.where(name: "Depeche Mode")
|
|
1933
|
+
end
|
|
1934
|
+
|
|
1935
|
+
let(:context) do
|
|
1936
|
+
described_class.new(criteria)
|
|
1937
|
+
end
|
|
1938
|
+
|
|
1939
|
+
it "returns the last matching document" do
|
|
1940
|
+
expect(context.last).to eq(depeche_mode)
|
|
1941
|
+
end
|
|
1942
|
+
|
|
1943
|
+
context 'when the criteria has a collation' do
|
|
1944
|
+
min_server_version '3.4'
|
|
1945
|
+
|
|
1946
|
+
let(:criteria) do
|
|
1947
|
+
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
1948
|
+
end
|
|
1949
|
+
|
|
1950
|
+
it "returns the last matching document" do
|
|
1951
|
+
expect(context.last).to eq(depeche_mode)
|
|
1952
|
+
end
|
|
1953
|
+
end
|
|
1954
|
+
end
|
|
1955
|
+
|
|
1956
|
+
context "when using .desc" do
|
|
1957
|
+
|
|
1958
|
+
let(:criteria) do
|
|
1959
|
+
Band.desc(:name)
|
|
1960
|
+
end
|
|
1961
|
+
|
|
1962
|
+
let(:context) do
|
|
1963
|
+
described_class.new(criteria)
|
|
1964
|
+
end
|
|
1965
|
+
|
|
1966
|
+
context "when there is sort on the context" do
|
|
1967
|
+
|
|
1968
|
+
it "follows the main sort" do
|
|
1969
|
+
expect(context.last).to eq(depeche_mode)
|
|
1970
|
+
end
|
|
1971
|
+
end
|
|
1972
|
+
|
|
1973
|
+
context "when subsequently calling #first" do
|
|
1974
|
+
|
|
1975
|
+
it "returns the correct document" do
|
|
1976
|
+
expect(context.last).to eq(depeche_mode)
|
|
1977
|
+
expect(context.first).to eq(rolling_stones)
|
|
1978
|
+
end
|
|
1979
|
+
end
|
|
1980
|
+
end
|
|
1981
|
+
|
|
1982
|
+
context 'when the criteria has no sort' do
|
|
1983
|
+
|
|
1984
|
+
let(:criteria) do
|
|
1985
|
+
Band.all
|
|
1986
|
+
end
|
|
1987
|
+
|
|
1988
|
+
let(:context) do
|
|
1989
|
+
described_class.new(criteria)
|
|
1990
|
+
end
|
|
1991
|
+
|
|
1992
|
+
it 'applies a sort on _id' do
|
|
1993
|
+
expect(context.last).to eq(rolling_stones)
|
|
1994
|
+
end
|
|
1995
|
+
|
|
1996
|
+
context 'when calling #first' do
|
|
1997
|
+
|
|
1998
|
+
it 'returns the first document, sorted by _id' do
|
|
1999
|
+
pending "MONGOID-5416"
|
|
2000
|
+
expect(context.last).to eq(rolling_stones)
|
|
2001
|
+
expect(context.first).to eq(depeche_mode)
|
|
2002
|
+
end
|
|
2003
|
+
end
|
|
2004
|
+
|
|
2005
|
+
context 'with option { id_sort: :none }' do
|
|
2006
|
+
let(:opts) do
|
|
2007
|
+
{ id_sort: :none }
|
|
2008
|
+
end
|
|
2009
|
+
|
|
2010
|
+
it 'doesn\'t apply the sort on _id' do
|
|
2011
|
+
expect(context.last(opts)).to eq(depeche_mode)
|
|
2012
|
+
end
|
|
2013
|
+
|
|
2014
|
+
context 'when calling #first' do
|
|
2015
|
+
|
|
2016
|
+
it 'doesn\'t apply the sort on _id' do
|
|
2017
|
+
pending "MONGOID-5416"
|
|
2018
|
+
expect(context.last(opts)).to eq(rolling_stones)
|
|
2019
|
+
expect(context.first(opts)).to eq(depeche_mode)
|
|
2020
|
+
end
|
|
2021
|
+
end
|
|
2022
|
+
end
|
|
2023
|
+
end
|
|
2024
|
+
|
|
2025
|
+
context 'when the criteria has a sort' do
|
|
2026
|
+
|
|
2027
|
+
let(:criteria) do
|
|
2028
|
+
Band.desc(:name)
|
|
2029
|
+
end
|
|
2030
|
+
|
|
2031
|
+
let(:context) do
|
|
2032
|
+
described_class.new(criteria)
|
|
2033
|
+
end
|
|
2034
|
+
|
|
2035
|
+
|
|
2036
|
+
it 'applies the criteria sort' do
|
|
2037
|
+
expect(context.last).to eq(depeche_mode)
|
|
2038
|
+
end
|
|
2039
|
+
|
|
2040
|
+
context 'when calling #first' do
|
|
2041
|
+
|
|
2042
|
+
it 'applies the criteria sort' do
|
|
2043
|
+
expect(context.last).to eq(depeche_mode)
|
|
2044
|
+
expect(context.first).to eq(rolling_stones)
|
|
2045
|
+
end
|
|
2046
|
+
end
|
|
2047
|
+
|
|
2048
|
+
context 'with option { id_sort: :none }' do
|
|
2049
|
+
|
|
2050
|
+
let(:opts) do
|
|
2051
|
+
{ id_sort: :none }
|
|
2052
|
+
end
|
|
2053
|
+
|
|
2054
|
+
it 'uses the preexisting sort' do
|
|
2055
|
+
expect(context.last(opts)).to eq(depeche_mode)
|
|
2056
|
+
end
|
|
2057
|
+
|
|
2058
|
+
context 'when calling #first' do
|
|
2059
|
+
|
|
2060
|
+
it 'uses the preexisting sort' do
|
|
2061
|
+
expect(context.last(opts)).to eq(depeche_mode)
|
|
2062
|
+
expect(context.first(opts)).to eq(rolling_stones)
|
|
2063
|
+
end
|
|
2064
|
+
end
|
|
2065
|
+
end
|
|
2066
|
+
end
|
|
2067
|
+
|
|
2068
|
+
context "when using .sort" do
|
|
2069
|
+
|
|
2070
|
+
let(:criteria) do
|
|
2071
|
+
Band.all.sort(:name => -1).criteria
|
|
2072
|
+
end
|
|
2073
|
+
|
|
2074
|
+
let(:context) do
|
|
2075
|
+
described_class.new(criteria)
|
|
2076
|
+
end
|
|
2077
|
+
|
|
2078
|
+
context "when there is sort on the context" do
|
|
2079
|
+
|
|
2080
|
+
it "follows the main sort" do
|
|
2081
|
+
expect(context.last).to eq(depeche_mode)
|
|
2082
|
+
end
|
|
2083
|
+
end
|
|
2084
|
+
|
|
2085
|
+
context "when subsequently calling #first" do
|
|
2086
|
+
|
|
2087
|
+
it "returns the correct document" do
|
|
2088
|
+
expect(context.last).to eq(depeche_mode)
|
|
2089
|
+
expect(context.first).to eq(rolling_stones)
|
|
2090
|
+
end
|
|
2091
|
+
end
|
|
2092
|
+
end
|
|
2093
|
+
|
|
2094
|
+
context "when the context is cached" do
|
|
2095
|
+
|
|
2096
|
+
let(:criteria) do
|
|
2097
|
+
Band.where(name: "Depeche Mode").cache
|
|
2098
|
+
end
|
|
2099
|
+
|
|
2100
|
+
let(:context) do
|
|
2101
|
+
described_class.new(criteria)
|
|
2102
|
+
end
|
|
2103
|
+
|
|
2104
|
+
context "when the cache is loaded" do
|
|
2105
|
+
|
|
2106
|
+
before do
|
|
2107
|
+
context.to_a
|
|
2108
|
+
end
|
|
2109
|
+
|
|
2110
|
+
it "returns the last document without touching the database" do
|
|
2111
|
+
expect(context).to receive(:view).never
|
|
2112
|
+
expect(context.last).to eq(depeche_mode)
|
|
2113
|
+
end
|
|
2114
|
+
end
|
|
2115
|
+
|
|
2116
|
+
context "when last method was called before" do
|
|
2117
|
+
|
|
2118
|
+
before do
|
|
2119
|
+
context.last
|
|
2120
|
+
end
|
|
2121
|
+
|
|
2122
|
+
it "returns the last document without touching the database" do
|
|
2123
|
+
expect(context).to receive(:view).never
|
|
2124
|
+
expect(context.last).to eq(depeche_mode)
|
|
2125
|
+
end
|
|
2126
|
+
end
|
|
2127
|
+
end
|
|
2128
|
+
|
|
2129
|
+
context "when including a limit" do
|
|
2130
|
+
|
|
2131
|
+
context "when the context is not cached" do
|
|
2132
|
+
|
|
2133
|
+
let(:context) do
|
|
2134
|
+
described_class.new(criteria)
|
|
2135
|
+
end
|
|
2136
|
+
|
|
2137
|
+
context "when the limit is 1" do
|
|
2138
|
+
let(:criteria) do
|
|
2139
|
+
Band.criteria
|
|
2140
|
+
end
|
|
2141
|
+
|
|
2142
|
+
let(:docs) do
|
|
2143
|
+
context.last(1)
|
|
2144
|
+
end
|
|
2145
|
+
|
|
2146
|
+
it "returns an array of documents" do
|
|
2147
|
+
expect(docs).to eq([ rolling_stones ])
|
|
2148
|
+
end
|
|
2149
|
+
end
|
|
2150
|
+
|
|
2151
|
+
context "when the limit is >1" do
|
|
2152
|
+
let(:criteria) do
|
|
2153
|
+
Band.criteria
|
|
2154
|
+
end
|
|
2155
|
+
|
|
2156
|
+
let(:docs) do
|
|
2157
|
+
context.last(2)
|
|
2158
|
+
end
|
|
2159
|
+
|
|
2160
|
+
it "returns the number of documents in order" do
|
|
2161
|
+
expect(docs).to eq([ new_order, rolling_stones ])
|
|
2162
|
+
end
|
|
2163
|
+
end
|
|
2164
|
+
|
|
2165
|
+
context 'when the criteria has a collation' do
|
|
2166
|
+
min_server_version '3.4'
|
|
2167
|
+
|
|
2168
|
+
let(:criteria) do
|
|
2169
|
+
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
|
2170
|
+
end
|
|
2171
|
+
|
|
2172
|
+
it "returns the first matching document" do
|
|
2173
|
+
expect(context.last(1)).to eq([ depeche_mode ])
|
|
2174
|
+
end
|
|
2175
|
+
end
|
|
2176
|
+
end
|
|
2177
|
+
|
|
2178
|
+
context "when the context is cached" do
|
|
2179
|
+
|
|
2180
|
+
let(:context) do
|
|
2181
|
+
described_class.new(criteria)
|
|
2182
|
+
end
|
|
2183
|
+
|
|
2184
|
+
context "when the whole context is loaded" do
|
|
2185
|
+
|
|
2186
|
+
before do
|
|
2187
|
+
context.to_a
|
|
2188
|
+
end
|
|
2189
|
+
|
|
2190
|
+
context "when all of the documents are cached" do
|
|
2191
|
+
|
|
2192
|
+
let(:criteria) do
|
|
2193
|
+
Band.all.cache
|
|
2194
|
+
end
|
|
2195
|
+
|
|
2196
|
+
context "when requesting all of the documents" do
|
|
2197
|
+
|
|
2198
|
+
let(:docs) do
|
|
2199
|
+
context.last(3)
|
|
2200
|
+
end
|
|
2201
|
+
|
|
2202
|
+
it "returns all of the documents without touching the database" do
|
|
2203
|
+
expect(context).to receive(:view).never
|
|
2204
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
2205
|
+
end
|
|
2206
|
+
end
|
|
2207
|
+
|
|
2208
|
+
context "when requesting fewer than all of the documents" do
|
|
2209
|
+
|
|
2210
|
+
let(:docs) do
|
|
2211
|
+
context.last(2)
|
|
2212
|
+
end
|
|
2213
|
+
|
|
2214
|
+
it "returns all of the documents without touching the database" do
|
|
2215
|
+
expect(context).to receive(:view).never
|
|
2216
|
+
expect(docs).to eq([ new_order, rolling_stones ])
|
|
2217
|
+
end
|
|
2218
|
+
end
|
|
2219
|
+
end
|
|
2220
|
+
|
|
2221
|
+
context "when only one document is cached" do
|
|
2222
|
+
|
|
2223
|
+
let(:criteria) do
|
|
2224
|
+
Band.where(name: "Depeche Mode").cache
|
|
2225
|
+
end
|
|
2226
|
+
|
|
2227
|
+
context "when requesting one document" do
|
|
2228
|
+
|
|
2229
|
+
let(:docs) do
|
|
2230
|
+
context.last(1)
|
|
2231
|
+
end
|
|
2232
|
+
|
|
2233
|
+
it "returns one document without touching the database" do
|
|
2234
|
+
expect(context).to receive(:view).never
|
|
2235
|
+
expect(docs).to eq([ depeche_mode ])
|
|
2236
|
+
end
|
|
2237
|
+
end
|
|
2238
|
+
end
|
|
2239
|
+
end
|
|
2240
|
+
|
|
2241
|
+
context "when the last method was called before" do
|
|
2242
|
+
|
|
2243
|
+
let(:context) do
|
|
2244
|
+
described_class.new(criteria)
|
|
2245
|
+
end
|
|
2246
|
+
|
|
2247
|
+
let(:criteria) do
|
|
2248
|
+
Band.all.cache
|
|
2249
|
+
end
|
|
2250
|
+
|
|
2251
|
+
before do
|
|
2252
|
+
context.last(before_limit)
|
|
2253
|
+
end
|
|
2254
|
+
|
|
2255
|
+
let(:docs) do
|
|
2256
|
+
context.last(limit)
|
|
2257
|
+
end
|
|
2258
|
+
|
|
2259
|
+
context "when getting all of the documents before" do
|
|
2260
|
+
let(:before_limit) { 3 }
|
|
2261
|
+
|
|
2262
|
+
context "when getting all of the documents" do
|
|
2263
|
+
let(:limit) { 3 }
|
|
2264
|
+
|
|
2265
|
+
it "returns all documents without touching the database" do
|
|
2266
|
+
expect(context).to receive(:view).never
|
|
2267
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
2268
|
+
end
|
|
2269
|
+
end
|
|
2270
|
+
|
|
2271
|
+
context "when getting fewer documents" do
|
|
2272
|
+
let(:limit) { 2 }
|
|
2273
|
+
|
|
2274
|
+
it "returns the correct documents without touching the database" do
|
|
2275
|
+
expect(context).to receive(:view).never
|
|
2276
|
+
expect(docs).to eq([ new_order, rolling_stones ])
|
|
2277
|
+
end
|
|
2278
|
+
end
|
|
2279
|
+
end
|
|
2280
|
+
|
|
2281
|
+
context "when getting fewer documents before" do
|
|
2282
|
+
let(:before_limit) { 2 }
|
|
2283
|
+
|
|
2284
|
+
context "when getting the same number of documents" do
|
|
2285
|
+
let(:limit) { 2 }
|
|
2286
|
+
|
|
2287
|
+
it "returns the correct documents without touching the database" do
|
|
2288
|
+
expect(context).to receive(:view).never
|
|
2289
|
+
expect(docs).to eq([ new_order, rolling_stones ])
|
|
2290
|
+
end
|
|
2291
|
+
end
|
|
2292
|
+
|
|
2293
|
+
context "when getting more documents" do
|
|
2294
|
+
let(:limit) { 3 }
|
|
2295
|
+
|
|
2296
|
+
it "returns the correct documents and touches the database" do
|
|
2297
|
+
expect(context).to receive(:view).twice.and_call_original
|
|
2298
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
2299
|
+
end
|
|
2300
|
+
end
|
|
2301
|
+
end
|
|
2302
|
+
|
|
2303
|
+
context "when getting one document before" do
|
|
2304
|
+
let(:before_limit) { 1 }
|
|
2305
|
+
|
|
2306
|
+
context "when getting one document" do
|
|
2307
|
+
let(:limit) { 1 }
|
|
2308
|
+
|
|
2309
|
+
it "returns the correct documents without touching the database" do
|
|
2310
|
+
expect(context).to receive(:view).never
|
|
2311
|
+
expect(docs).to eq([ rolling_stones ])
|
|
2312
|
+
end
|
|
2313
|
+
end
|
|
2314
|
+
|
|
2315
|
+
context "when getting more than one document" do
|
|
2316
|
+
let(:limit) { 3 }
|
|
2317
|
+
|
|
2318
|
+
it "returns the correct documents and touches the database" do
|
|
2319
|
+
expect(context).to receive(:view).twice.and_call_original
|
|
2320
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
2321
|
+
end
|
|
2322
|
+
end
|
|
2323
|
+
end
|
|
2324
|
+
end
|
|
2325
|
+
end
|
|
2326
|
+
end
|
|
2327
|
+
|
|
2328
|
+
context "when calling #last then #first" do
|
|
2329
|
+
|
|
2330
|
+
let(:context) do
|
|
2331
|
+
described_class.new(criteria)
|
|
2332
|
+
end
|
|
2333
|
+
|
|
2334
|
+
let(:criteria) do
|
|
2335
|
+
Band.all.cache
|
|
2336
|
+
end
|
|
2337
|
+
|
|
2338
|
+
before do
|
|
2339
|
+
context.last(before_limit)
|
|
2340
|
+
end
|
|
2341
|
+
|
|
2342
|
+
let(:docs) do
|
|
2343
|
+
context.first(limit)
|
|
2344
|
+
end
|
|
2345
|
+
|
|
2346
|
+
context "when getting one from the beginning and one from the end" do
|
|
2347
|
+
let(:before_limit) { 2 }
|
|
2348
|
+
let(:limit) { 1 }
|
|
2349
|
+
|
|
2350
|
+
it "hits the database" do
|
|
2351
|
+
expect(context).to receive(:view).exactly(3).times.and_call_original
|
|
2352
|
+
docs
|
|
2353
|
+
end
|
|
2354
|
+
|
|
2355
|
+
it "gets the correct document" do
|
|
2356
|
+
pending "MONGOID-5416"
|
|
2357
|
+
expect(docs).to eq([ depeche_mode ])
|
|
2358
|
+
end
|
|
2359
|
+
end
|
|
2360
|
+
end
|
|
2361
|
+
end
|
|
2362
|
+
|
|
2363
|
+
describe "#initialize" do
|
|
2364
|
+
|
|
2365
|
+
let(:criteria) do
|
|
2366
|
+
Band.where(name: "Depeche Mode").no_timeout
|
|
2367
|
+
end
|
|
2368
|
+
|
|
2369
|
+
let(:context) do
|
|
2370
|
+
described_class.new(criteria)
|
|
2371
|
+
end
|
|
2372
|
+
|
|
2373
|
+
it "sets the criteria" do
|
|
2374
|
+
expect(context.criteria).to eq(criteria)
|
|
2375
|
+
end
|
|
2376
|
+
|
|
2377
|
+
it "sets the klass" do
|
|
2378
|
+
expect(context.klass).to eq(Band)
|
|
2379
|
+
end
|
|
2380
|
+
|
|
2381
|
+
it "sets the view" do
|
|
2382
|
+
expect(context.view).to be_a(Mongo::Collection::View)
|
|
2383
|
+
end
|
|
2384
|
+
|
|
2385
|
+
it "sets the view selector" do
|
|
2386
|
+
expect(context.view.selector).to eq({ "name" => "Depeche Mode" })
|
|
2387
|
+
end
|
|
2388
|
+
end
|
|
1340
2389
|
|
|
1341
2390
|
[ :length, :size ].each do |method|
|
|
1342
2391
|
|
|
1343
2392
|
describe "##{method}" do
|
|
1344
2393
|
|
|
1345
2394
|
before do
|
|
1346
|
-
Band.create(name: "Depeche Mode")
|
|
1347
|
-
Band.create(name: "New Order")
|
|
2395
|
+
Band.create!(name: "Depeche Mode")
|
|
2396
|
+
Band.create!(name: "New Order")
|
|
1348
2397
|
end
|
|
1349
2398
|
|
|
1350
2399
|
context "when the criteria has a limit" do
|
|
@@ -1362,12 +2411,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1362
2411
|
end
|
|
1363
2412
|
|
|
1364
2413
|
context "when calling more than once" do
|
|
1365
|
-
|
|
1366
|
-
before do
|
|
1367
|
-
expect(context.view).to receive(:count).once.and_return(2)
|
|
1368
|
-
end
|
|
1369
|
-
|
|
1370
2414
|
it "returns the cached value for subsequent calls" do
|
|
2415
|
+
expect(context.view).to receive(:count_documents).once.and_return(2)
|
|
1371
2416
|
2.times { expect(context.send(method)).to eq(2) }
|
|
1372
2417
|
end
|
|
1373
2418
|
end
|
|
@@ -1376,10 +2421,10 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1376
2421
|
|
|
1377
2422
|
before do
|
|
1378
2423
|
context.entries
|
|
1379
|
-
expect(context.view).to receive(:count).once.and_return(2)
|
|
1380
2424
|
end
|
|
1381
2425
|
|
|
1382
2426
|
it "returns the cached value for all calls" do
|
|
2427
|
+
expect(context.view).to receive(:count_documents).once.and_return(2)
|
|
1383
2428
|
expect(context.send(method)).to eq(2)
|
|
1384
2429
|
end
|
|
1385
2430
|
|
|
@@ -1411,12 +2456,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1411
2456
|
end
|
|
1412
2457
|
|
|
1413
2458
|
context "when calling more than once" do
|
|
1414
|
-
|
|
1415
|
-
before do
|
|
1416
|
-
expect(context.view).to receive(:count).once.and_return(1)
|
|
1417
|
-
end
|
|
1418
|
-
|
|
1419
2459
|
it "returns the cached value for subsequent calls" do
|
|
2460
|
+
expect(context.view).to receive(:count_documents).once.and_return(1)
|
|
1420
2461
|
2.times { expect(context.send(method)).to eq(1) }
|
|
1421
2462
|
end
|
|
1422
2463
|
end
|
|
@@ -1425,10 +2466,10 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1425
2466
|
|
|
1426
2467
|
before do
|
|
1427
2468
|
context.entries
|
|
1428
|
-
expect(context.view).to receive(:count).once.and_return(1)
|
|
1429
2469
|
end
|
|
1430
2470
|
|
|
1431
2471
|
it "returns the cached value for all calls" do
|
|
2472
|
+
expect(context.view).to receive(:count_documents).once.and_return(1)
|
|
1432
2473
|
expect(context.send(method)).to eq(1)
|
|
1433
2474
|
end
|
|
1434
2475
|
|
|
@@ -1450,11 +2491,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1450
2491
|
describe "#limit" do
|
|
1451
2492
|
|
|
1452
2493
|
let!(:depeche_mode) do
|
|
1453
|
-
Band.create(name: "Depeche Mode")
|
|
2494
|
+
Band.create!(name: "Depeche Mode")
|
|
1454
2495
|
end
|
|
1455
2496
|
|
|
1456
2497
|
let!(:new_order) do
|
|
1457
|
-
Band.create(name: "New Order")
|
|
2498
|
+
Band.create!(name: "New Order")
|
|
1458
2499
|
end
|
|
1459
2500
|
|
|
1460
2501
|
let(:criteria) do
|
|
@@ -1470,11 +2511,85 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1470
2511
|
end
|
|
1471
2512
|
end
|
|
1472
2513
|
|
|
2514
|
+
describe "#take" do
|
|
2515
|
+
|
|
2516
|
+
let!(:depeche_mode) do
|
|
2517
|
+
Band.create!(name: "Depeche Mode")
|
|
2518
|
+
end
|
|
2519
|
+
|
|
2520
|
+
let!(:new_order) do
|
|
2521
|
+
Band.create!(name: "New Order")
|
|
2522
|
+
end
|
|
2523
|
+
|
|
2524
|
+
let!(:rolling_stones) do
|
|
2525
|
+
Band.create!(name: "The Rolling Stones")
|
|
2526
|
+
end
|
|
2527
|
+
|
|
2528
|
+
let(:criteria) do
|
|
2529
|
+
Band.all
|
|
2530
|
+
end
|
|
2531
|
+
|
|
2532
|
+
let(:context) do
|
|
2533
|
+
described_class.new(criteria)
|
|
2534
|
+
end
|
|
2535
|
+
|
|
2536
|
+
it "takes the correct number results" do
|
|
2537
|
+
expect(context.take(2)).to eq([ depeche_mode, new_order ])
|
|
2538
|
+
end
|
|
2539
|
+
|
|
2540
|
+
it "returns an array when passing 1" do
|
|
2541
|
+
expect(context.take(1)).to eq([ depeche_mode ])
|
|
2542
|
+
end
|
|
2543
|
+
|
|
2544
|
+
it "does not return an array when not passing an argument" do
|
|
2545
|
+
expect(context.take).to eq(depeche_mode)
|
|
2546
|
+
end
|
|
2547
|
+
|
|
2548
|
+
it "returns all the documents taking more than whats in the db" do
|
|
2549
|
+
expect(context.take(5)).to eq([ depeche_mode, new_order, rolling_stones ])
|
|
2550
|
+
end
|
|
2551
|
+
end
|
|
2552
|
+
|
|
2553
|
+
describe "#take!" do
|
|
2554
|
+
|
|
2555
|
+
let!(:depeche_mode) do
|
|
2556
|
+
Band.create!(name: "Depeche Mode")
|
|
2557
|
+
end
|
|
2558
|
+
|
|
2559
|
+
let!(:new_order) do
|
|
2560
|
+
Band.create!(name: "New Order")
|
|
2561
|
+
end
|
|
2562
|
+
|
|
2563
|
+
let!(:rolling_stones) do
|
|
2564
|
+
Band.create!(name: "The Rolling Stones")
|
|
2565
|
+
end
|
|
2566
|
+
|
|
2567
|
+
let(:criteria) do
|
|
2568
|
+
Band.all
|
|
2569
|
+
end
|
|
2570
|
+
|
|
2571
|
+
let(:context) do
|
|
2572
|
+
described_class.new(criteria)
|
|
2573
|
+
end
|
|
2574
|
+
|
|
2575
|
+
it "takes the first document" do
|
|
2576
|
+
expect(context.take!).to eq(depeche_mode)
|
|
2577
|
+
end
|
|
2578
|
+
|
|
2579
|
+
context "when there are no documents" do
|
|
2580
|
+
it "raises an error" do
|
|
2581
|
+
expect do
|
|
2582
|
+
Person.take!
|
|
2583
|
+
end.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2584
|
+
end
|
|
2585
|
+
end
|
|
2586
|
+
end
|
|
2587
|
+
|
|
1473
2588
|
describe "#map" do
|
|
1474
2589
|
|
|
1475
2590
|
before do
|
|
1476
|
-
Band.create(name: "Depeche Mode")
|
|
1477
|
-
Band.create(name: "New Order")
|
|
2591
|
+
Band.create!(name: "Depeche Mode")
|
|
2592
|
+
Band.create!(name: "New Order")
|
|
1478
2593
|
end
|
|
1479
2594
|
|
|
1480
2595
|
let(:criteria) do
|
|
@@ -1487,7 +2602,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1487
2602
|
|
|
1488
2603
|
context "when passed the symbol field name" do
|
|
1489
2604
|
|
|
1490
|
-
it "performs mapping" do
|
|
2605
|
+
it "performs mapping and warns" do
|
|
2606
|
+
expect(Mongoid::Warnings).to receive(:warn_map_field_deprecated)
|
|
1491
2607
|
expect(context.map(:name)).to eq ["Depeche Mode", "New Order"]
|
|
1492
2608
|
end
|
|
1493
2609
|
end
|
|
@@ -1503,11 +2619,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1503
2619
|
describe "#map_reduce" do
|
|
1504
2620
|
|
|
1505
2621
|
let!(:depeche_mode) do
|
|
1506
|
-
Band.create(name: "Depeche Mode", likes: 200)
|
|
2622
|
+
Band.create!(name: "Depeche Mode", likes: 200)
|
|
1507
2623
|
end
|
|
1508
2624
|
|
|
1509
2625
|
let!(:tool) do
|
|
1510
|
-
Band.create(name: "Tool", likes: 100)
|
|
2626
|
+
Band.create!(name: "Tool", likes: 100)
|
|
1511
2627
|
end
|
|
1512
2628
|
|
|
1513
2629
|
let(:map) do
|
|
@@ -1528,6 +2644,10 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1528
2644
|
}}
|
|
1529
2645
|
end
|
|
1530
2646
|
|
|
2647
|
+
let(:ordered_results) do
|
|
2648
|
+
results['results'].sort_by { |doc| doc['_id'] }
|
|
2649
|
+
end
|
|
2650
|
+
|
|
1531
2651
|
context "when no selection is provided" do
|
|
1532
2652
|
|
|
1533
2653
|
let(:criteria) do
|
|
@@ -1559,36 +2679,40 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1559
2679
|
end
|
|
1560
2680
|
|
|
1561
2681
|
it "contains the entire raw results" do
|
|
1562
|
-
expect(
|
|
2682
|
+
expect(ordered_results).to eq([
|
|
1563
2683
|
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
|
|
1564
2684
|
{ "_id" => "Tool", "value" => { "likes" => 100 }}
|
|
1565
2685
|
])
|
|
1566
2686
|
end
|
|
1567
2687
|
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
end
|
|
2688
|
+
context 'when statistics are available' do
|
|
2689
|
+
max_server_version '4.2'
|
|
1571
2690
|
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
})
|
|
1576
|
-
end
|
|
2691
|
+
it "contains the execution time" do
|
|
2692
|
+
expect(results.time).to_not be_nil
|
|
2693
|
+
end
|
|
1577
2694
|
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
2695
|
+
it "contains the count statistics" do
|
|
2696
|
+
expect(results["counts"]).to eq({
|
|
2697
|
+
"input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
|
|
2698
|
+
})
|
|
2699
|
+
end
|
|
1581
2700
|
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
2701
|
+
it "contains the input count" do
|
|
2702
|
+
expect(results.input).to eq(2)
|
|
2703
|
+
end
|
|
1585
2704
|
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
2705
|
+
it "contains the emitted count" do
|
|
2706
|
+
expect(results.emitted).to eq(2)
|
|
2707
|
+
end
|
|
1589
2708
|
|
|
1590
|
-
|
|
1591
|
-
|
|
2709
|
+
it "contains the reduced count" do
|
|
2710
|
+
expect(results.reduced).to eq(0)
|
|
2711
|
+
end
|
|
2712
|
+
|
|
2713
|
+
it "contains the output count" do
|
|
2714
|
+
expect(results.output).to eq(2)
|
|
2715
|
+
end
|
|
1592
2716
|
end
|
|
1593
2717
|
end
|
|
1594
2718
|
|
|
@@ -1617,35 +2741,39 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1617
2741
|
end
|
|
1618
2742
|
|
|
1619
2743
|
it "contains the entire raw results" do
|
|
1620
|
-
expect(
|
|
2744
|
+
expect(ordered_results).to eq([
|
|
1621
2745
|
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
|
|
1622
2746
|
])
|
|
1623
2747
|
end
|
|
1624
2748
|
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
end
|
|
2749
|
+
context 'when statistics are available' do
|
|
2750
|
+
max_server_version '4.2'
|
|
1628
2751
|
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
})
|
|
1633
|
-
end
|
|
2752
|
+
it "contains the execution time" do
|
|
2753
|
+
expect(results.time).to_not be_nil
|
|
2754
|
+
end
|
|
1634
2755
|
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
2756
|
+
it "contains the count statistics" do
|
|
2757
|
+
expect(results["counts"]).to eq({
|
|
2758
|
+
"input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
|
|
2759
|
+
})
|
|
2760
|
+
end
|
|
1638
2761
|
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
2762
|
+
it "contains the input count" do
|
|
2763
|
+
expect(results.input).to eq(1)
|
|
2764
|
+
end
|
|
1642
2765
|
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
2766
|
+
it "contains the emitted count" do
|
|
2767
|
+
expect(results.emitted).to eq(1)
|
|
2768
|
+
end
|
|
2769
|
+
|
|
2770
|
+
it "contains the reduced count" do
|
|
2771
|
+
expect(results.reduced).to eq(0)
|
|
2772
|
+
end
|
|
1646
2773
|
|
|
1647
|
-
|
|
1648
|
-
|
|
2774
|
+
it "contains the output count" do
|
|
2775
|
+
expect(results.output).to eq(1)
|
|
2776
|
+
end
|
|
1649
2777
|
end
|
|
1650
2778
|
end
|
|
1651
2779
|
|
|
@@ -1685,7 +2813,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1685
2813
|
end
|
|
1686
2814
|
|
|
1687
2815
|
it "contains the entire raw results" do
|
|
1688
|
-
expect(
|
|
2816
|
+
expect(ordered_results).to eq([
|
|
1689
2817
|
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
|
|
1690
2818
|
{ "_id" => "Tool", "value" => { "likes" => 100 }}
|
|
1691
2819
|
])
|
|
@@ -1693,6 +2821,9 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1693
2821
|
end
|
|
1694
2822
|
|
|
1695
2823
|
context "when limiting is provided" do
|
|
2824
|
+
# map/reduce with limit is not supported on sharded clusters:
|
|
2825
|
+
# https://jira.mongodb.org/browse/SERVER-2099
|
|
2826
|
+
require_topology :single, :replica_set
|
|
1696
2827
|
|
|
1697
2828
|
let(:criteria) do
|
|
1698
2829
|
Band.limit(1)
|
|
@@ -1799,6 +2930,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1799
2930
|
end
|
|
1800
2931
|
|
|
1801
2932
|
context "when the output specifies a different db" do
|
|
2933
|
+
# Limit is not supported in sharded clusters
|
|
2934
|
+
require_topology :single, :replica_set
|
|
1802
2935
|
|
|
1803
2936
|
let(:criteria) do
|
|
1804
2937
|
Band.limit(1)
|
|
@@ -1915,11 +3048,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1915
3048
|
describe "#skip" do
|
|
1916
3049
|
|
|
1917
3050
|
let!(:depeche_mode) do
|
|
1918
|
-
Band.create(name: "Depeche Mode")
|
|
3051
|
+
Band.create!(name: "Depeche Mode")
|
|
1919
3052
|
end
|
|
1920
3053
|
|
|
1921
3054
|
let!(:new_order) do
|
|
1922
|
-
Band.create(name: "New Order")
|
|
3055
|
+
Band.create!(name: "New Order")
|
|
1923
3056
|
end
|
|
1924
3057
|
|
|
1925
3058
|
let(:criteria) do
|
|
@@ -1938,11 +3071,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1938
3071
|
describe "#sort" do
|
|
1939
3072
|
|
|
1940
3073
|
let!(:depeche_mode) do
|
|
1941
|
-
Band.create(name: "Depeche Mode")
|
|
3074
|
+
Band.create!(name: "Depeche Mode")
|
|
1942
3075
|
end
|
|
1943
3076
|
|
|
1944
3077
|
let!(:new_order) do
|
|
1945
|
-
Band.create(name: "New Order")
|
|
3078
|
+
Band.create!(name: "New Order")
|
|
1946
3079
|
end
|
|
1947
3080
|
|
|
1948
3081
|
let(:criteria) do
|
|
@@ -1981,11 +3114,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1981
3114
|
describe "#update" do
|
|
1982
3115
|
|
|
1983
3116
|
let!(:depeche_mode) do
|
|
1984
|
-
Band.create(name: "Depeche Mode")
|
|
3117
|
+
Band.create!(name: "Depeche Mode")
|
|
1985
3118
|
end
|
|
1986
3119
|
|
|
1987
3120
|
let!(:new_order) do
|
|
1988
|
-
Band.create(name: "New Order")
|
|
3121
|
+
Band.create!(name: "New Order")
|
|
1989
3122
|
end
|
|
1990
3123
|
|
|
1991
3124
|
let(:criteria) do
|
|
@@ -1999,11 +3132,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
1999
3132
|
context "when adding an element to a HABTM set" do
|
|
2000
3133
|
|
|
2001
3134
|
let(:person) do
|
|
2002
|
-
Person.create
|
|
3135
|
+
Person.create!
|
|
2003
3136
|
end
|
|
2004
3137
|
|
|
2005
3138
|
let(:preference) do
|
|
2006
|
-
Preference.create
|
|
3139
|
+
Preference.create!
|
|
2007
3140
|
end
|
|
2008
3141
|
|
|
2009
3142
|
before do
|
|
@@ -2133,7 +3266,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
2133
3266
|
end
|
|
2134
3267
|
end
|
|
2135
3268
|
|
|
2136
|
-
context 'when provided array filters'
|
|
3269
|
+
context 'when provided array filters' do
|
|
3270
|
+
min_server_version '3.6'
|
|
2137
3271
|
|
|
2138
3272
|
before do
|
|
2139
3273
|
Band.delete_all
|
|
@@ -2141,12 +3275,12 @@ describe Mongoid::Contextual::Mongo do
|
|
|
2141
3275
|
b.labels << Label.new(name: 'Warner')
|
|
2142
3276
|
b.labels << Label.new(name: 'Sony')
|
|
2143
3277
|
b.labels << Label.new(name: 'Cbs')
|
|
2144
|
-
b.save
|
|
3278
|
+
b.save!
|
|
2145
3279
|
|
|
2146
3280
|
b = Band.new(name: 'FKA Twigs')
|
|
2147
3281
|
b.labels << Label.new(name: 'Warner')
|
|
2148
3282
|
b.labels << Label.new(name: 'Cbs')
|
|
2149
|
-
b.save
|
|
3283
|
+
b.save!
|
|
2150
3284
|
end
|
|
2151
3285
|
|
|
2152
3286
|
|
|
@@ -2172,11 +3306,11 @@ describe Mongoid::Contextual::Mongo do
|
|
|
2172
3306
|
describe "#update_all" do
|
|
2173
3307
|
|
|
2174
3308
|
let!(:depeche_mode) do
|
|
2175
|
-
Band.create(name: "Depeche Mode", origin: "Essex")
|
|
3309
|
+
Band.create!(name: "Depeche Mode", origin: "Essex")
|
|
2176
3310
|
end
|
|
2177
3311
|
|
|
2178
3312
|
let!(:new_order) do
|
|
2179
|
-
Band.create(name: "New Order")
|
|
3313
|
+
Band.create!(name: "New Order")
|
|
2180
3314
|
end
|
|
2181
3315
|
|
|
2182
3316
|
let(:criteria) do
|
|
@@ -2305,7 +3439,8 @@ describe Mongoid::Contextual::Mongo do
|
|
|
2305
3439
|
end
|
|
2306
3440
|
end
|
|
2307
3441
|
|
|
2308
|
-
context 'when provided array filters'
|
|
3442
|
+
context 'when provided array filters' do
|
|
3443
|
+
min_server_version '3.6'
|
|
2309
3444
|
|
|
2310
3445
|
before do
|
|
2311
3446
|
Band.delete_all
|
|
@@ -2313,12 +3448,12 @@ describe Mongoid::Contextual::Mongo do
|
|
|
2313
3448
|
b.labels << Label.new(name: 'Warner')
|
|
2314
3449
|
b.labels << Label.new(name: 'Sony')
|
|
2315
3450
|
b.labels << Label.new(name: 'Cbs')
|
|
2316
|
-
b.save
|
|
3451
|
+
b.save!
|
|
2317
3452
|
|
|
2318
3453
|
b = Band.new(name: 'FKA Twigs')
|
|
2319
3454
|
b.labels << Label.new(name: 'Warner')
|
|
2320
3455
|
b.labels << Label.new(name: 'Cbs')
|
|
2321
|
-
b.save
|
|
3456
|
+
b.save!
|
|
2322
3457
|
end
|
|
2323
3458
|
|
|
2324
3459
|
|
|
@@ -2328,7 +3463,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
2328
3463
|
|
|
2329
3464
|
let!(:update) do
|
|
2330
3465
|
context.update_all({ '$set' => { 'labels.$[i].name' => 'Sony' } },
|
|
2331
|
-
|
|
3466
|
+
array_filters: [{ 'i.name' => 'Cbs' }])
|
|
2332
3467
|
end
|
|
2333
3468
|
|
|
2334
3469
|
it 'applies the array filters' do
|
|
@@ -2343,7 +3478,7 @@ describe Mongoid::Contextual::Mongo do
|
|
|
2343
3478
|
|
|
2344
3479
|
describe '#pipeline' do
|
|
2345
3480
|
|
|
2346
|
-
context 'when the criteria has a selector'
|
|
3481
|
+
context 'when the criteria has a selector' do
|
|
2347
3482
|
|
|
2348
3483
|
before do
|
|
2349
3484
|
Artist.index(name: "text")
|