mongoid 6.4.4 → 7.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +13 -13
- data/LICENSE +1 -0
- data/README.md +25 -18
- data/Rakefile +28 -5
- data/lib/config/locales/en.yml +76 -50
- data/lib/mongoid/association/accessors.rb +417 -0
- data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +39 -57
- data/lib/mongoid/association/builders.rb +93 -0
- data/lib/mongoid/association/constrainable.rb +46 -0
- data/lib/mongoid/association/depending.rb +140 -0
- data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +13 -11
- data/lib/mongoid/{relations → association}/embedded/batchable.rb +23 -21
- data/lib/mongoid/association/embedded/cyclic.rb +111 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +59 -0
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +41 -0
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +124 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +157 -0
- data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +14 -9
- data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +19 -7
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +555 -0
- data/lib/mongoid/association/embedded/embeds_many.rb +214 -0
- data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +15 -10
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +42 -0
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +133 -0
- data/lib/mongoid/association/embedded/embeds_one.rb +177 -0
- data/lib/mongoid/association/embedded.rb +7 -0
- data/lib/mongoid/association/macros.rb +206 -0
- data/lib/mongoid/{relations → association}/many.rb +32 -59
- data/lib/mongoid/{relations → association}/marshalable.rb +9 -5
- data/lib/mongoid/association/nested/many.rb +202 -0
- data/lib/mongoid/association/nested/nested_buildable.rb +75 -0
- data/lib/mongoid/association/nested/one.rb +129 -0
- data/lib/mongoid/association/nested.rb +18 -0
- data/lib/mongoid/{relations → association}/one.rb +9 -7
- data/lib/mongoid/association/options.rb +155 -0
- data/lib/mongoid/{relations → association}/proxy.rb +59 -69
- data/lib/mongoid/association/referenced/auto_save.rb +82 -0
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +89 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +49 -0
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +74 -0
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +138 -0
- data/lib/mongoid/association/referenced/belongs_to.rb +251 -0
- data/lib/mongoid/association/referenced/counter_cache.rb +165 -0
- data/lib/mongoid/association/referenced/eager.rb +184 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +77 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +43 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +54 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +319 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +297 -0
- data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +9 -6
- data/lib/mongoid/association/referenced/has_many/buildable.rb +41 -0
- data/lib/mongoid/association/referenced/has_many/eager.rb +45 -0
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +517 -0
- data/lib/mongoid/association/referenced/has_many/proxy.rb +581 -0
- data/lib/mongoid/association/referenced/has_many.rb +278 -0
- data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +14 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +67 -0
- data/lib/mongoid/association/referenced/has_one/eager.rb +37 -0
- data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +20 -18
- data/lib/mongoid/association/referenced/has_one/proxy.rb +120 -0
- data/lib/mongoid/association/referenced/has_one.rb +207 -0
- data/lib/mongoid/association/referenced/syncable.rb +172 -0
- data/lib/mongoid/association/referenced.rb +10 -0
- data/lib/mongoid/association/reflections.rb +70 -0
- data/lib/mongoid/association/relatable.rb +514 -0
- data/lib/mongoid/association.rb +152 -0
- data/lib/mongoid/atomic/modifiers.rb +24 -1
- data/lib/mongoid/atomic/paths/embedded/many.rb +5 -3
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -3
- data/lib/mongoid/atomic/paths/embedded.rb +3 -1
- data/lib/mongoid/atomic/paths/root.rb +4 -2
- data/lib/mongoid/atomic/paths.rb +2 -0
- data/lib/mongoid/atomic.rb +16 -4
- data/lib/mongoid/attributes/dynamic.rb +18 -15
- data/lib/mongoid/attributes/nested.rb +29 -16
- data/lib/mongoid/attributes/processing.rb +10 -8
- data/lib/mongoid/attributes/readonly.rb +5 -5
- data/lib/mongoid/attributes.rb +62 -44
- data/lib/mongoid/cacheable.rb +3 -1
- data/lib/mongoid/changeable.rb +4 -2
- data/lib/mongoid/clients/factory.rb +3 -2
- data/lib/mongoid/clients/options.rb +17 -13
- data/lib/mongoid/clients/sessions.rb +23 -4
- data/lib/mongoid/clients/storage_options.rb +7 -5
- data/lib/mongoid/clients/validators/storage.rb +2 -0
- data/lib/mongoid/clients/validators.rb +2 -0
- data/lib/mongoid/clients.rb +2 -0
- data/lib/mongoid/composable.rb +8 -6
- data/lib/mongoid/config/environment.rb +23 -8
- data/lib/mongoid/config/options.rb +20 -12
- data/lib/mongoid/config/validators/client.rb +2 -0
- data/lib/mongoid/config/validators/option.rb +2 -0
- data/lib/mongoid/config/validators.rb +2 -0
- data/lib/mongoid/config.rb +53 -9
- data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +3 -1
- data/lib/mongoid/contextual/atomic.rb +24 -6
- data/lib/mongoid/contextual/command.rb +2 -0
- data/lib/mongoid/contextual/geo_near.rb +6 -4
- data/lib/mongoid/contextual/map_reduce.rb +5 -2
- data/lib/mongoid/contextual/memory.rb +23 -3
- data/lib/mongoid/contextual/mongo.rb +16 -9
- data/lib/mongoid/contextual/none.rb +2 -0
- data/lib/mongoid/contextual/queryable.rb +2 -0
- data/lib/mongoid/contextual.rb +7 -4
- data/lib/mongoid/copyable.rb +14 -7
- data/lib/mongoid/criteria/findable.rb +11 -1
- data/lib/mongoid/criteria/includable.rb +21 -19
- data/lib/mongoid/criteria/inspectable.rb +2 -0
- data/lib/mongoid/criteria/marshalable.rb +2 -0
- data/lib/mongoid/criteria/modifiable.rb +10 -3
- data/lib/mongoid/criteria/options.rb +4 -2
- data/lib/mongoid/criteria/permission.rb +2 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
- data/lib/mongoid/criteria/queryable/expandable.rb +93 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -2
- data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -7
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -2
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -2
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +15 -1
- data/lib/mongoid/criteria/queryable/extensions.rb +2 -0
- data/lib/mongoid/criteria/queryable/key.rb +101 -14
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +158 -15
- data/lib/mongoid/criteria/queryable/optional.rb +5 -3
- data/lib/mongoid/criteria/queryable/options.rb +2 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +14 -6
- data/lib/mongoid/criteria/queryable/selectable.rb +376 -90
- data/lib/mongoid/criteria/queryable/selector.rb +43 -36
- data/lib/mongoid/criteria/queryable/smash.rb +2 -0
- data/lib/mongoid/criteria/queryable/storable.rb +233 -0
- data/lib/mongoid/criteria/queryable.rb +7 -2
- data/lib/mongoid/criteria/scopable.rb +2 -0
- data/lib/mongoid/criteria.rb +27 -6
- data/lib/mongoid/document.rb +16 -4
- data/lib/mongoid/equality.rb +3 -2
- data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
- data/lib/mongoid/errors/callback.rb +2 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
- data/lib/mongoid/errors/delete_restriction.rb +3 -2
- data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -0
- data/lib/mongoid/errors/eager_load.rb +6 -2
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
- data/lib/mongoid/errors/invalid_collection.rb +2 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -0
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +34 -0
- data/lib/mongoid/errors/invalid_field.rb +2 -0
- data/lib/mongoid/errors/invalid_field_option.rb +2 -0
- data/lib/mongoid/errors/invalid_find.rb +2 -0
- data/lib/mongoid/errors/invalid_includes.rb +2 -0
- data/lib/mongoid/errors/invalid_index.rb +2 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -2
- data/lib/mongoid/errors/invalid_path.rb +2 -0
- data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
- data/lib/mongoid/errors/invalid_relation.rb +4 -2
- data/lib/mongoid/errors/invalid_relation_option.rb +31 -0
- data/lib/mongoid/errors/invalid_scope.rb +2 -0
- data/lib/mongoid/errors/invalid_session_use.rb +2 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/invalid_time.rb +2 -0
- data/lib/mongoid/errors/invalid_value.rb +2 -0
- data/lib/mongoid/errors/inverse_not_found.rb +3 -1
- data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
- data/lib/mongoid/errors/mixed_relations.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +2 -0
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
- data/lib/mongoid/errors/no_client_config.rb +4 -2
- data/lib/mongoid/errors/no_client_database.rb +2 -0
- data/lib/mongoid/errors/no_client_hosts.rb +2 -0
- data/lib/mongoid/errors/no_clients_config.rb +2 -0
- data/lib/mongoid/errors/no_default_client.rb +3 -1
- data/lib/mongoid/errors/no_environment.rb +2 -0
- data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
- data/lib/mongoid/errors/no_metadata.rb +2 -0
- data/lib/mongoid/errors/no_parent.rb +2 -0
- data/lib/mongoid/errors/readonly_attribute.rb +2 -0
- data/lib/mongoid/errors/readonly_document.rb +2 -0
- data/lib/mongoid/errors/scope_overwrite.rb +2 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -0
- data/lib/mongoid/errors/unknown_model.rb +27 -0
- data/lib/mongoid/errors/unsaved_document.rb +2 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
- data/lib/mongoid/errors/validations.rb +2 -0
- data/lib/mongoid/errors.rb +6 -0
- data/lib/mongoid/evolvable.rb +3 -1
- data/lib/mongoid/extensions/array.rb +28 -11
- data/lib/mongoid/extensions/big_decimal.rb +2 -0
- data/lib/mongoid/extensions/boolean.rb +2 -0
- data/lib/mongoid/extensions/date.rb +13 -3
- data/lib/mongoid/extensions/date_time.rb +4 -3
- data/lib/mongoid/extensions/decimal128.rb +2 -0
- data/lib/mongoid/extensions/false_class.rb +2 -0
- data/lib/mongoid/extensions/float.rb +5 -3
- data/lib/mongoid/extensions/hash.rb +56 -11
- data/lib/mongoid/extensions/integer.rb +5 -3
- data/lib/mongoid/extensions/module.rb +2 -0
- data/lib/mongoid/extensions/nil_class.rb +2 -0
- data/lib/mongoid/extensions/object.rb +20 -8
- data/lib/mongoid/extensions/object_id.rb +2 -0
- data/lib/mongoid/extensions/range.rb +3 -0
- data/lib/mongoid/extensions/regexp.rb +3 -1
- data/lib/mongoid/extensions/set.rb +2 -0
- data/lib/mongoid/extensions/string.rb +23 -12
- data/lib/mongoid/extensions/symbol.rb +2 -0
- data/lib/mongoid/extensions/time.rb +14 -0
- data/lib/mongoid/extensions/time_with_zone.rb +14 -0
- data/lib/mongoid/extensions/true_class.rb +2 -0
- data/lib/mongoid/extensions.rb +2 -4
- data/lib/mongoid/factory.rb +38 -5
- data/lib/mongoid/fields/foreign_key.rb +8 -6
- data/lib/mongoid/fields/localized.rb +2 -0
- data/lib/mongoid/fields/standard.rb +8 -17
- data/lib/mongoid/fields/validators/macro.rb +17 -3
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields.rb +8 -5
- data/lib/mongoid/findable.rb +9 -4
- data/lib/mongoid/indexable/specification.rb +3 -1
- data/lib/mongoid/indexable/validators/options.rb +2 -0
- data/lib/mongoid/indexable.rb +7 -2
- data/lib/mongoid/inspectable.rb +3 -1
- data/lib/mongoid/interceptable.rb +17 -9
- data/lib/mongoid/loggable.rb +13 -7
- data/lib/mongoid/matchable/all.rb +6 -3
- data/lib/mongoid/matchable/and.rb +3 -1
- data/lib/mongoid/matchable/default.rb +73 -24
- data/lib/mongoid/matchable/elem_match.rb +11 -3
- data/lib/mongoid/matchable/eq.rb +23 -0
- data/lib/mongoid/matchable/exists.rb +2 -0
- data/lib/mongoid/matchable/gt.rb +2 -0
- data/lib/mongoid/matchable/gte.rb +2 -0
- data/lib/mongoid/matchable/in.rb +2 -0
- data/lib/mongoid/matchable/lt.rb +2 -0
- data/lib/mongoid/matchable/lte.rb +2 -0
- data/lib/mongoid/matchable/ne.rb +3 -1
- data/lib/mongoid/matchable/nin.rb +2 -0
- data/lib/mongoid/matchable/nor.rb +2 -1
- data/lib/mongoid/matchable/or.rb +2 -0
- data/lib/mongoid/matchable/regexp.rb +5 -2
- data/lib/mongoid/matchable/size.rb +2 -0
- data/lib/mongoid/matchable.rb +19 -16
- data/lib/mongoid/persistable/creatable.rb +3 -1
- data/lib/mongoid/persistable/deletable.rb +10 -7
- data/lib/mongoid/persistable/destroyable.rb +3 -1
- data/lib/mongoid/persistable/incrementable.rb +7 -3
- data/lib/mongoid/persistable/logical.rb +5 -2
- data/lib/mongoid/persistable/poppable.rb +3 -1
- data/lib/mongoid/persistable/pullable.rb +3 -1
- data/lib/mongoid/persistable/pushable.rb +14 -3
- data/lib/mongoid/persistable/renamable.rb +10 -3
- data/lib/mongoid/persistable/savable.rb +3 -1
- data/lib/mongoid/persistable/settable.rb +60 -13
- data/lib/mongoid/persistable/unsettable.rb +8 -3
- data/lib/mongoid/persistable/updatable.rb +3 -1
- data/lib/mongoid/persistable/upsertable.rb +3 -1
- data/lib/mongoid/persistable.rb +136 -19
- data/lib/mongoid/persistence_context.rb +47 -20
- data/lib/mongoid/positional.rb +3 -1
- data/lib/mongoid/query_cache.rb +76 -29
- data/lib/mongoid/railtie.rb +3 -1
- data/lib/mongoid/railties/controller_runtime.rb +4 -1
- data/lib/mongoid/railties/database.rake +9 -0
- data/lib/mongoid/reloadable.rb +4 -2
- data/lib/mongoid/scopable.rb +2 -1
- data/lib/mongoid/selectable.rb +3 -1
- data/lib/mongoid/serializable.rb +27 -17
- data/lib/mongoid/shardable.rb +60 -6
- data/lib/mongoid/stateful.rb +3 -1
- data/lib/mongoid/tasks/database.rake +12 -5
- data/lib/mongoid/tasks/database.rb +85 -0
- data/lib/mongoid/threaded/lifecycle.rb +2 -0
- data/lib/mongoid/threaded.rb +2 -0
- data/lib/mongoid/timestamps/created/short.rb +2 -0
- data/lib/mongoid/timestamps/created.rb +3 -1
- data/lib/mongoid/timestamps/short.rb +2 -0
- data/lib/mongoid/timestamps/timeless.rb +6 -2
- data/lib/mongoid/timestamps/updated/short.rb +2 -0
- data/lib/mongoid/timestamps/updated.rb +3 -1
- data/lib/mongoid/timestamps.rb +3 -1
- data/lib/mongoid/touchable.rb +110 -0
- data/lib/mongoid/traversable.rb +7 -5
- data/lib/mongoid/validatable/associated.rb +4 -2
- data/lib/mongoid/validatable/format.rb +2 -0
- data/lib/mongoid/validatable/length.rb +2 -0
- data/lib/mongoid/validatable/localizable.rb +2 -0
- data/lib/mongoid/validatable/macros.rb +3 -1
- data/lib/mongoid/validatable/presence.rb +6 -4
- data/lib/mongoid/validatable/queryable.rb +2 -0
- data/lib/mongoid/validatable/uniqueness.rb +9 -7
- data/lib/mongoid/validatable.rb +15 -13
- data/lib/mongoid/version.rb +3 -1
- data/lib/mongoid.rb +11 -2
- data/lib/rails/generators/mongoid/config/config_generator.rb +2 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -26
- data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/mongoid_generator.rb +2 -0
- data/lib/rails/mongoid.rb +4 -2
- data/lib/support/ruby_version.rb +3 -0
- data/spec/README.md +18 -0
- data/spec/app/models/account.rb +3 -0
- data/spec/app/models/acolyte.rb +3 -0
- data/spec/app/models/actor.rb +3 -0
- data/spec/app/models/actress.rb +3 -0
- data/spec/app/models/address.rb +3 -0
- data/spec/app/models/address_component.rb +3 -0
- data/spec/app/models/address_number.rb +3 -0
- data/spec/app/models/agency.rb +3 -0
- data/spec/app/models/agent.rb +3 -0
- data/spec/app/models/album.rb +3 -0
- data/spec/app/models/alert.rb +3 -0
- data/spec/app/models/animal.rb +5 -1
- data/spec/app/models/answer.rb +3 -0
- data/spec/app/models/appointment.rb +3 -0
- data/spec/app/models/array_field.rb +1 -0
- data/spec/app/models/article.rb +3 -0
- data/spec/app/models/artist.rb +3 -0
- data/spec/app/models/artwork.rb +3 -0
- data/spec/app/models/audio.rb +3 -0
- data/spec/app/models/augmentation.rb +3 -0
- data/spec/app/models/author.rb +3 -0
- data/spec/app/models/baby.rb +3 -0
- data/spec/app/models/band.rb +3 -0
- data/spec/app/models/bar.rb +3 -0
- data/spec/app/models/basic.rb +3 -0
- data/spec/app/models/bed.rb +3 -0
- data/spec/app/models/big_palette.rb +3 -0
- data/spec/app/models/birthday.rb +3 -0
- data/spec/app/models/bomb.rb +4 -1
- data/spec/app/models/book.rb +3 -0
- data/spec/app/models/breed.rb +3 -0
- data/spec/app/models/browser.rb +3 -0
- data/spec/app/models/building.rb +3 -0
- data/spec/app/models/building_address.rb +3 -0
- data/spec/app/models/bus.rb +3 -0
- data/spec/app/models/business.rb +3 -0
- data/spec/app/models/callback_test.rb +3 -0
- data/spec/app/models/canvas.rb +3 -0
- data/spec/app/models/car.rb +3 -0
- data/spec/app/models/cat.rb +3 -0
- data/spec/app/models/category.rb +3 -0
- data/spec/app/models/child.rb +3 -0
- data/spec/app/models/child_doc.rb +3 -0
- data/spec/app/models/church.rb +3 -0
- data/spec/app/models/circle.rb +3 -0
- data/spec/app/models/circuit.rb +3 -0
- data/spec/app/models/circus.rb +3 -0
- data/spec/app/models/code.rb +3 -0
- data/spec/app/models/coding/pull_request.rb +12 -0
- data/spec/app/models/coding.rb +4 -0
- data/spec/app/models/comment.rb +3 -0
- data/spec/app/models/company.rb +3 -0
- data/spec/app/models/consumption_period.rb +3 -0
- data/spec/app/models/contextable_item.rb +3 -0
- data/spec/app/models/contractor.rb +3 -0
- data/spec/app/models/cookie.rb +3 -0
- data/spec/app/models/country_code.rb +3 -0
- data/spec/app/models/courier_job.rb +3 -0
- data/spec/app/models/customer.rb +11 -0
- data/spec/app/models/customer_address.rb +12 -0
- data/spec/app/models/definition.rb +3 -0
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/app/models/description.rb +3 -0
- data/spec/app/models/dictionary.rb +9 -0
- data/spec/app/models/division.rb +3 -0
- data/spec/app/models/doctor.rb +3 -0
- data/spec/app/models/dog.rb +3 -0
- data/spec/app/models/dokument.rb +3 -0
- data/spec/app/models/draft.rb +3 -0
- data/spec/app/models/dragon.rb +3 -0
- data/spec/app/models/driver.rb +3 -0
- data/spec/app/models/drug.rb +3 -0
- data/spec/app/models/dungeon.rb +3 -0
- data/spec/app/models/edit.rb +3 -0
- data/spec/app/models/email.rb +3 -0
- data/spec/app/models/employer.rb +3 -0
- data/spec/app/models/entry.rb +3 -0
- data/spec/app/models/eraser.rb +3 -0
- data/spec/app/models/even.rb +3 -0
- data/spec/app/models/event.rb +3 -0
- data/spec/app/models/exhibition.rb +3 -0
- data/spec/app/models/exhibitor.rb +3 -0
- data/spec/app/models/explosion.rb +3 -0
- data/spec/app/models/eye.rb +3 -0
- data/spec/app/models/eye_bowl.rb +3 -0
- data/spec/app/models/face.rb +3 -0
- data/spec/app/models/favorite.rb +3 -0
- data/spec/app/models/filesystem.rb +3 -0
- data/spec/app/models/fire_hydrant.rb +3 -0
- data/spec/app/models/firefox.rb +3 -0
- data/spec/app/models/fish.rb +3 -0
- data/spec/app/models/folder.rb +3 -0
- data/spec/app/models/folder_item.rb +3 -0
- data/spec/app/models/fruits.rb +3 -0
- data/spec/app/models/game.rb +3 -0
- data/spec/app/models/ghost.rb +3 -0
- data/spec/app/models/home.rb +3 -0
- data/spec/app/models/house.rb +3 -0
- data/spec/app/models/html_writer.rb +3 -0
- data/spec/app/models/id_key.rb +3 -0
- data/spec/app/models/image.rb +3 -0
- data/spec/app/models/implant.rb +3 -0
- data/spec/app/models/item.rb +3 -0
- data/spec/app/models/jar.rb +3 -0
- data/spec/app/models/kaleidoscope.rb +3 -0
- data/spec/app/models/kangaroo.rb +4 -1
- data/spec/app/models/label.rb +3 -0
- data/spec/app/models/language.rb +3 -0
- data/spec/app/models/lat_lng.rb +3 -0
- data/spec/app/models/league.rb +3 -0
- data/spec/app/models/learner.rb +3 -0
- data/spec/app/models/line_item.rb +3 -0
- data/spec/app/models/location.rb +3 -0
- data/spec/app/models/login.rb +3 -0
- data/spec/app/models/manufacturer.rb +3 -0
- data/spec/app/models/meat.rb +3 -0
- data/spec/app/models/membership.rb +3 -0
- data/spec/app/models/message.rb +4 -1
- data/spec/app/models/minim.rb +7 -0
- data/spec/app/models/mixed_drink.rb +3 -0
- data/spec/app/models/movie.rb +3 -0
- data/spec/app/models/my_hash.rb +3 -0
- data/spec/app/models/name.rb +3 -0
- data/spec/app/models/name_only.rb +9 -0
- data/spec/app/models/node.rb +3 -0
- data/spec/app/models/note.rb +3 -0
- data/spec/app/models/odd.rb +3 -0
- data/spec/app/models/ordered_post.rb +3 -0
- data/spec/app/models/ordered_preference.rb +3 -0
- data/spec/app/models/oscar.rb +3 -0
- data/spec/app/models/other_owner_object.rb +5 -0
- data/spec/app/models/override.rb +3 -0
- data/spec/app/models/ownable.rb +3 -0
- data/spec/app/models/owner.rb +3 -0
- data/spec/app/models/pack.rb +3 -0
- data/spec/app/models/page.rb +3 -0
- data/spec/app/models/page_question.rb +3 -0
- data/spec/app/models/palette.rb +3 -0
- data/spec/app/models/parent.rb +3 -0
- data/spec/app/models/parent_doc.rb +3 -0
- data/spec/app/models/passport.rb +4 -0
- data/spec/app/models/patient.rb +3 -0
- data/spec/app/models/pdf_writer.rb +3 -0
- data/spec/app/models/pencil.rb +3 -0
- data/spec/app/models/person.rb +10 -2
- data/spec/app/models/pet.rb +3 -0
- data/spec/app/models/pet_owner.rb +3 -0
- data/spec/app/models/phone.rb +4 -0
- data/spec/app/models/pizza.rb +3 -0
- data/spec/app/models/player.rb +3 -0
- data/spec/app/models/post.rb +3 -0
- data/spec/app/models/post_genre.rb +3 -0
- data/spec/app/models/powerup.rb +3 -0
- data/spec/app/models/preference.rb +3 -0
- data/spec/app/models/princess.rb +3 -0
- data/spec/app/models/product.rb +3 -0
- data/spec/app/models/profile.rb +3 -0
- data/spec/app/models/pronunciation.rb +3 -0
- data/spec/app/models/pub.rb +3 -0
- data/spec/app/models/publication/encyclopedia.rb +12 -0
- data/spec/app/models/publication/review.rb +14 -0
- data/spec/app/models/publication.rb +5 -0
- data/spec/app/models/purchase.rb +3 -0
- data/spec/app/models/question.rb +3 -0
- data/spec/app/models/quiz.rb +3 -0
- data/spec/app/models/rating.rb +3 -0
- data/spec/app/models/record.rb +3 -0
- data/spec/app/models/registry.rb +3 -0
- data/spec/app/models/role.rb +3 -0
- data/spec/app/models/root_category.rb +3 -0
- data/spec/app/models/sandwich.rb +3 -0
- data/spec/app/models/scheduler.rb +3 -0
- data/spec/app/models/seo.rb +3 -0
- data/spec/app/models/series.rb +4 -0
- data/spec/app/models/server.rb +3 -0
- data/spec/app/models/service.rb +3 -0
- data/spec/app/models/shape.rb +3 -0
- data/spec/app/models/shelf.rb +3 -0
- data/spec/app/models/shipment_address.rb +4 -0
- data/spec/app/models/shipping_container.rb +3 -0
- data/spec/app/models/shipping_pack.rb +3 -0
- data/spec/app/models/shop.rb +3 -0
- data/spec/app/models/short_agent.rb +3 -0
- data/spec/app/models/short_quiz.rb +3 -0
- data/spec/app/models/simple.rb +3 -0
- data/spec/app/models/slave.rb +3 -0
- data/spec/app/models/song.rb +3 -0
- data/spec/app/models/sound.rb +3 -0
- data/spec/app/models/square.rb +3 -0
- data/spec/app/models/staff.rb +3 -0
- data/spec/app/models/store_as_dup_test1.rb +3 -0
- data/spec/app/models/store_as_dup_test2.rb +3 -0
- data/spec/app/models/store_as_dup_test3.rb +8 -0
- data/spec/app/models/store_as_dup_test4.rb +8 -0
- data/spec/app/models/strategy.rb +3 -0
- data/spec/app/models/sub_item.rb +3 -0
- data/spec/app/models/subscription.rb +3 -0
- data/spec/app/models/survey.rb +3 -0
- data/spec/app/models/symptom.rb +3 -0
- data/spec/app/models/tag.rb +3 -0
- data/spec/app/models/target.rb +3 -0
- data/spec/app/models/template.rb +3 -0
- data/spec/app/models/thing.rb +3 -0
- data/spec/app/models/title.rb +3 -0
- data/spec/app/models/tool.rb +3 -0
- data/spec/app/models/topping.rb +3 -0
- data/spec/app/models/track.rb +3 -0
- data/spec/app/models/translation.rb +3 -0
- data/spec/app/models/tree.rb +3 -0
- data/spec/app/models/truck.rb +3 -0
- data/spec/app/models/updatable.rb +8 -0
- data/spec/app/models/user.rb +3 -0
- data/spec/app/models/user_account.rb +3 -0
- data/spec/app/models/validation_callback.rb +3 -0
- data/spec/app/models/vehicle.rb +3 -0
- data/spec/app/models/version.rb +3 -0
- data/spec/app/models/vertex.rb +9 -0
- data/spec/app/models/vet_visit.rb +3 -0
- data/spec/app/models/video.rb +3 -0
- data/spec/app/models/video_game.rb +3 -0
- data/spec/app/models/weapon.rb +3 -0
- data/spec/app/models/wiki_page.rb +5 -1
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +3 -0
- data/spec/app/models/writer.rb +3 -0
- data/spec/config/mongoid.yml +14 -3
- data/spec/integration/app_spec.rb +287 -0
- data/spec/integration/associations/belongs_to_spec.rb +16 -0
- data/spec/integration/associations/embedded_spec.rb +175 -0
- data/spec/integration/associations/embeds_many_spec.rb +24 -0
- data/spec/integration/associations/embeds_one_spec.rb +24 -0
- data/spec/integration/associations/foreign_key_spec.rb +99 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
- data/spec/integration/associations/has_many_spec.rb +76 -0
- data/spec/integration/associations/has_one_spec.rb +76 -0
- data/spec/integration/associations/reverse_population_spec.rb +35 -0
- data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
- data/spec/integration/bson_regexp_raw_spec.rb +20 -0
- data/spec/integration/callbacks_models.rb +49 -0
- data/spec/integration/callbacks_spec.rb +216 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/criteria/default_scope_spec.rb +21 -0
- data/spec/integration/criteria/logical_spec.rb +94 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/integration/i18n_fallbacks_spec.rb +90 -0
- data/spec/integration/matchable_spec.rb +680 -0
- data/spec/integration/shardable_spec.rb +149 -0
- data/spec/lite_spec_helper.rb +75 -0
- data/spec/mongoid/{relations → association}/accessors_spec.rb +281 -64
- data/spec/mongoid/{relations → association}/auto_save_spec.rb +63 -12
- data/spec/mongoid/{relations → association}/builders_spec.rb +4 -1
- data/spec/mongoid/association/constrainable_spec.rb +118 -0
- data/spec/mongoid/{relations → association}/counter_cache_spec.rb +4 -1
- data/spec/mongoid/association/depending_spec.rb +869 -0
- data/spec/mongoid/{relations → association}/eager_spec.rb +15 -12
- data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +4 -1
- data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +3 -0
- data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +16 -13
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +37 -0
- data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +58 -77
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +904 -0
- data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +6 -3
- data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +20 -45
- data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +127 -182
- data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +865 -0
- data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +7 -4
- data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +17 -34
- data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +42 -84
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +9 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +957 -0
- data/spec/mongoid/{relations → association}/macros_spec.rb +151 -73
- data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +19 -19
- data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +20 -20
- data/spec/mongoid/association/options_spec.rb +1324 -0
- data/spec/mongoid/{relations → association}/polymorphic_spec.rb +69 -34
- data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +10 -7
- data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +49 -79
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +377 -0
- data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +60 -91
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +38 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2026 -0
- data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +8 -5
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +124 -0
- data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +42 -7
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +77 -0
- data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +283 -112
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +50 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1051 -0
- data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +8 -5
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +122 -0
- data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +43 -13
- data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +230 -1
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +24 -0
- data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +33 -94
- data/spec/mongoid/association/referenced/has_many_models.rb +40 -0
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +1228 -0
- data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +7 -4
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +116 -0
- data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +27 -12
- data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +12 -109
- data/spec/mongoid/association/referenced/has_one_models.rb +51 -0
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +1363 -0
- data/spec/mongoid/{relations → association}/reflections_spec.rb +4 -12
- data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +7 -2
- data/spec/mongoid/{relations_spec.rb → association_spec.rb} +4 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +5 -2
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
- data/spec/mongoid/atomic/paths_spec.rb +44 -0
- data/spec/mongoid/atomic_spec.rb +7 -4
- data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
- data/spec/mongoid/attributes/nested_spec.rb +32 -11
- data/spec/mongoid/attributes/readonly_spec.rb +83 -125
- data/spec/mongoid/attributes_spec.rb +60 -9
- data/spec/mongoid/cacheable_spec.rb +3 -0
- data/spec/mongoid/changeable_spec.rb +26 -0
- data/spec/mongoid/clients/factory_spec.rb +57 -33
- data/spec/mongoid/clients/options_spec.rb +81 -56
- data/spec/mongoid/clients/sessions_spec.rb +24 -8
- data/spec/mongoid/clients/transactions_spec.rb +393 -0
- data/spec/mongoid/clients_spec.rb +73 -10
- data/spec/mongoid/composable_spec.rb +3 -0
- data/spec/mongoid/config/environment_spec.rb +3 -0
- data/spec/mongoid/config/options_spec.rb +23 -3
- data/spec/mongoid/config_spec.rb +66 -1
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
- data/spec/mongoid/contextual/atomic_spec.rb +120 -10
- data/spec/mongoid/contextual/geo_near_spec.rb +15 -2
- data/spec/mongoid/contextual/map_reduce_spec.rb +23 -5
- data/spec/mongoid/contextual/memory_spec.rb +22 -0
- data/spec/mongoid/contextual/mongo_spec.rb +113 -57
- data/spec/mongoid/contextual/none_spec.rb +3 -0
- data/spec/mongoid/copyable_spec.rb +93 -6
- data/spec/mongoid/copyable_spec_models.rb +20 -0
- data/spec/mongoid/criteria/findable_spec.rb +58 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +180 -4
- data/spec/mongoid/criteria/options_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +135 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +4 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +10 -7
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +47 -1
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +43 -23
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +31 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +51 -6
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +48 -12
- data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +15 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1865 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1007 -2389
- data/spec/mongoid/criteria/queryable/selector_spec.rb +40 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +190 -0
- data/spec/mongoid/criteria/scopable_spec.rb +3 -0
- data/spec/mongoid/criteria_spec.rb +108 -19
- data/spec/mongoid/document_fields_spec.rb +88 -0
- data/spec/mongoid/document_persistence_context_spec.rb +33 -0
- data/spec/mongoid/document_query_spec.rb +39 -0
- data/spec/mongoid/document_spec.rb +32 -4
- data/spec/mongoid/equality_spec.rb +3 -0
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -0
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
- data/spec/mongoid/errors/eager_load_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
- data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -0
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
- data/spec/mongoid/errors/no_client_config_spec.rb +5 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +6 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +6 -3
- data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
- data/spec/mongoid/errors/no_environment_spec.rb +3 -0
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
- data/spec/mongoid/errors/no_parent_spec.rb +4 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
- data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
- data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
- data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
- data/spec/mongoid/errors/validations_spec.rb +3 -0
- data/spec/mongoid/extensions/array_spec.rb +37 -58
- data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
- data/spec/mongoid/extensions/binary_spec.rb +3 -0
- data/spec/mongoid/extensions/boolean_spec.rb +3 -0
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
- data/spec/mongoid/extensions/date_spec.rb +9 -160
- data/spec/mongoid/extensions/date_time_spec.rb +18 -60
- data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
- data/spec/mongoid/extensions/false_class_spec.rb +3 -0
- data/spec/mongoid/extensions/float_spec.rb +18 -3
- data/spec/mongoid/extensions/hash_spec.rb +124 -1
- data/spec/mongoid/extensions/integer_spec.rb +15 -2
- data/spec/mongoid/extensions/module_spec.rb +3 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
- data/spec/mongoid/extensions/object_id_spec.rb +3 -0
- data/spec/mongoid/extensions/object_spec.rb +21 -35
- data/spec/mongoid/extensions/range_spec.rb +10 -0
- data/spec/mongoid/extensions/regexp_spec.rb +3 -0
- data/spec/mongoid/extensions/set_spec.rb +3 -0
- data/spec/mongoid/extensions/string_spec.rb +95 -33
- data/spec/mongoid/extensions/symbol_spec.rb +3 -0
- data/spec/mongoid/extensions/time_spec.rb +30 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
- data/spec/mongoid/extensions/true_class_spec.rb +3 -0
- data/spec/mongoid/extensions_spec.rb +3 -0
- data/spec/mongoid/factory_spec.rb +46 -1
- data/spec/mongoid/fields/foreign_key_spec.rb +27 -32
- data/spec/mongoid/fields/localized_spec.rb +3 -0
- data/spec/mongoid/fields/standard_spec.rb +3 -0
- data/spec/mongoid/fields_spec.rb +42 -1
- data/spec/mongoid/findable_spec.rb +4 -1
- data/spec/mongoid/indexable/specification_spec.rb +3 -0
- data/spec/mongoid/indexable_spec.rb +27 -12
- data/spec/mongoid/inspectable_spec.rb +3 -0
- data/spec/mongoid/interceptable_spec.rb +87 -1
- data/spec/mongoid/interceptable_spec_models.rb +76 -0
- data/spec/mongoid/loggable_spec.rb +3 -0
- data/spec/mongoid/matchable/all_spec.rb +3 -0
- data/spec/mongoid/matchable/and_spec.rb +3 -0
- data/spec/mongoid/matchable/default_spec.rb +13 -3
- data/spec/mongoid/matchable/elem_match_spec.rb +23 -0
- data/spec/mongoid/matchable/eq_spec.rb +49 -0
- data/spec/mongoid/matchable/exists_spec.rb +3 -0
- data/spec/mongoid/matchable/gt_spec.rb +3 -0
- data/spec/mongoid/matchable/gte_spec.rb +3 -0
- data/spec/mongoid/matchable/in_spec.rb +3 -0
- data/spec/mongoid/matchable/lt_spec.rb +3 -0
- data/spec/mongoid/matchable/lte_spec.rb +3 -0
- data/spec/mongoid/matchable/ne_spec.rb +3 -0
- data/spec/mongoid/matchable/nin_spec.rb +3 -0
- data/spec/mongoid/matchable/nor_spec.rb +1 -0
- data/spec/mongoid/matchable/or_spec.rb +3 -0
- data/spec/mongoid/matchable/regexp_spec.rb +5 -2
- data/spec/mongoid/matchable/size_spec.rb +3 -0
- data/spec/mongoid/matchable_spec.rb +5 -2
- data/spec/mongoid/persistable/creatable_spec.rb +3 -0
- data/spec/mongoid/persistable/deletable_spec.rb +3 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +3 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
- data/spec/mongoid/persistable/logical_spec.rb +17 -0
- data/spec/mongoid/persistable/poppable_spec.rb +17 -0
- data/spec/mongoid/persistable/pullable_spec.rb +31 -0
- data/spec/mongoid/persistable/pushable_spec.rb +86 -1
- data/spec/mongoid/persistable/renamable_spec.rb +17 -0
- data/spec/mongoid/persistable/savable_spec.rb +5 -2
- data/spec/mongoid/persistable/settable_spec.rb +112 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
- data/spec/mongoid/persistable/updatable_spec.rb +3 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +3 -0
- data/spec/mongoid/persistable_spec.rb +106 -14
- data/spec/mongoid/persistence_context_spec.rb +4 -1
- data/spec/mongoid/positional_spec.rb +3 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +48 -0
- data/spec/mongoid/query_cache_spec.rb +131 -65
- data/spec/mongoid/relations/proxy_spec.rb +127 -124
- data/spec/mongoid/reloadable_spec.rb +3 -0
- data/spec/mongoid/scopable_spec.rb +5 -1
- data/spec/mongoid/selectable_spec.rb +3 -0
- data/spec/mongoid/serializable_spec.rb +132 -18
- data/spec/mongoid/shardable_models.rb +61 -0
- data/spec/mongoid/shardable_spec.rb +104 -28
- data/spec/mongoid/stateful_spec.rb +3 -0
- data/spec/mongoid/tasks/database_rake_spec.rb +16 -13
- data/spec/mongoid/tasks/database_spec.rb +4 -1
- data/spec/mongoid/threaded_spec.rb +3 -0
- data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
- data/spec/mongoid/timestamps/created_spec.rb +3 -0
- data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
- data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
- data/spec/mongoid/timestamps/updated_spec.rb +3 -0
- data/spec/mongoid/timestamps_spec.rb +3 -0
- data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +89 -4
- data/spec/mongoid/traversable_spec.rb +3 -0
- data/spec/mongoid/validatable/associated_spec.rb +4 -1
- data/spec/mongoid/validatable/format_spec.rb +3 -0
- data/spec/mongoid/validatable/length_spec.rb +3 -0
- data/spec/mongoid/validatable/numericality_spec.rb +3 -0
- data/spec/mongoid/validatable/presence_spec.rb +10 -6
- data/spec/mongoid/validatable/uniqueness_spec.rb +36 -6
- data/spec/mongoid/validatable_spec.rb +4 -1
- data/spec/mongoid_spec.rb +3 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
- data/spec/rails/mongoid_spec.rb +5 -2
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +211 -0
- data/spec/shared/lib/mrss/constraints.rb +330 -0
- data/spec/shared/lib/mrss/docker_runner.rb +262 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/shared/share/Dockerfile.erb +229 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +270 -0
- data/spec/shared/shlib/set_env.sh +128 -0
- data/spec/spec_helper.rb +56 -55
- data/spec/support/authorization.rb +3 -0
- data/spec/support/child_process_helper.rb +76 -0
- data/spec/support/cluster_config.rb +158 -0
- data/spec/support/constraints.rb +256 -0
- data/spec/support/expectations.rb +22 -3
- data/spec/support/helpers.rb +11 -0
- data/spec/support/lite_constraints.rb +22 -0
- data/spec/support/macros.rb +21 -0
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/shared/time.rb +54 -0
- data/spec/support/spec_config.rb +50 -0
- data.tar.gz.sig +2 -1
- metadata +737 -550
- metadata.gz.sig +0 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- data/lib/mongoid/relations/accessors.rb +0 -267
- data/lib/mongoid/relations/auto_save.rb +0 -94
- data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
- data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
- 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/one.rb +0 -30
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
- 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/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/metadata.rb +0 -1179
- data/lib/mongoid/relations/nested_builder.rb +0 -74
- data/lib/mongoid/relations/options.rb +0 -49
- data/lib/mongoid/relations/polymorphic.rb +0 -39
- 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/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/relations/builders/embedded/in_spec.rb +0 -34
- 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/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/eager/belongs_to_spec.rb +0 -163
- data/spec/mongoid/relations/metadata_spec.rb +0 -1985
- data/spec/mongoid/relations/options_spec.rb +0 -35
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
require "spec_helper"
|
|
5
|
+
require_relative '../has_many_models'
|
|
6
|
+
|
|
7
|
+
describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
8
|
+
context 'with primary_key and foreign_key given' do
|
|
9
|
+
let(:company) { HmmCompany.create!(p: 123) }
|
|
10
|
+
let(:criteria) { company.emails }
|
|
11
|
+
|
|
12
|
+
it 'generates correct query' do
|
|
13
|
+
expect(criteria.selector).to eq('f' => 123)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context 'unscoped' do
|
|
17
|
+
let(:criteria) { company.emails.unscoped }
|
|
18
|
+
|
|
19
|
+
it 'generates correct query' do
|
|
20
|
+
expect(criteria.selector).to eq('f' => 123)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
1
4
|
require "spec_helper"
|
|
2
5
|
|
|
3
|
-
describe Mongoid::
|
|
6
|
+
describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
4
7
|
|
|
5
8
|
before :all do
|
|
6
9
|
Mongoid.raise_not_found_error = true
|
|
@@ -401,7 +404,7 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
401
404
|
end
|
|
402
405
|
|
|
403
406
|
it "sets the target of the relation" do
|
|
404
|
-
expect(person.posts.
|
|
407
|
+
expect(person.posts._target).to eq([ post ])
|
|
405
408
|
end
|
|
406
409
|
|
|
407
410
|
it "sets the foreign key on the relation" do
|
|
@@ -432,7 +435,7 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
432
435
|
end
|
|
433
436
|
|
|
434
437
|
it "sets the target of the relation" do
|
|
435
|
-
expect(person.posts.
|
|
438
|
+
expect(person.posts._target).to eq([ post ])
|
|
436
439
|
end
|
|
437
440
|
|
|
438
441
|
it "sets the foreign key of the relation" do
|
|
@@ -593,7 +596,7 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
593
596
|
end
|
|
594
597
|
|
|
595
598
|
it "sets the target of the relation" do
|
|
596
|
-
expect(movie.ratings.
|
|
599
|
+
expect(movie.ratings._target).to eq([ rating ])
|
|
597
600
|
end
|
|
598
601
|
|
|
599
602
|
it "sets the foreign key on the relation" do
|
|
@@ -624,7 +627,7 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
624
627
|
end
|
|
625
628
|
|
|
626
629
|
it "sets the target of the relation" do
|
|
627
|
-
expect(movie.ratings.
|
|
630
|
+
expect(movie.ratings._target).to eq([ rating ])
|
|
628
631
|
end
|
|
629
632
|
|
|
630
633
|
it "sets the foreign key of the relation" do
|
|
@@ -1039,27 +1042,6 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
1039
1042
|
end
|
|
1040
1043
|
end
|
|
1041
1044
|
|
|
1042
|
-
describe ".builder" do
|
|
1043
|
-
|
|
1044
|
-
let(:builder_klass) do
|
|
1045
|
-
Mongoid::Relations::Builders::Referenced::Many
|
|
1046
|
-
end
|
|
1047
|
-
|
|
1048
|
-
let(:document) do
|
|
1049
|
-
double
|
|
1050
|
-
end
|
|
1051
|
-
|
|
1052
|
-
let(:metadata) do
|
|
1053
|
-
double(extension?: false)
|
|
1054
|
-
end
|
|
1055
|
-
|
|
1056
|
-
it "returns the embedded in builder" do
|
|
1057
|
-
expect(
|
|
1058
|
-
described_class.builder(nil, metadata, document)
|
|
1059
|
-
).to be_a_kind_of(builder_klass)
|
|
1060
|
-
end
|
|
1061
|
-
end
|
|
1062
|
-
|
|
1063
1045
|
describe "#clear" do
|
|
1064
1046
|
|
|
1065
1047
|
context "when the relation is not polymorphic" do
|
|
@@ -1835,44 +1817,48 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
1835
1817
|
end
|
|
1836
1818
|
end
|
|
1837
1819
|
|
|
1838
|
-
describe "
|
|
1820
|
+
describe "#criteria" do
|
|
1839
1821
|
|
|
1840
|
-
let(:
|
|
1841
|
-
|
|
1822
|
+
let(:base) do
|
|
1823
|
+
Movie.new
|
|
1842
1824
|
end
|
|
1843
1825
|
|
|
1844
1826
|
context "when the relation is polymorphic" do
|
|
1845
1827
|
|
|
1846
|
-
let(:
|
|
1828
|
+
let(:association) do
|
|
1847
1829
|
Movie.relations["ratings"]
|
|
1848
1830
|
end
|
|
1849
1831
|
|
|
1850
1832
|
let(:criteria) do
|
|
1851
|
-
|
|
1833
|
+
association.criteria(base)
|
|
1852
1834
|
end
|
|
1853
1835
|
|
|
1854
1836
|
it "includes the type in the criteria" do
|
|
1855
1837
|
expect(criteria.selector).to eq(
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1838
|
+
{
|
|
1839
|
+
"ratable_id" => base.id,
|
|
1840
|
+
"ratable_type" => "Movie"
|
|
1841
|
+
}
|
|
1842
|
+
)
|
|
1861
1843
|
end
|
|
1862
1844
|
end
|
|
1863
1845
|
|
|
1864
1846
|
context "when the relation is not polymorphic" do
|
|
1865
1847
|
|
|
1866
|
-
let(:
|
|
1848
|
+
let(:association) do
|
|
1867
1849
|
Person.relations["posts"]
|
|
1868
1850
|
end
|
|
1869
1851
|
|
|
1852
|
+
let(:base) do
|
|
1853
|
+
Person.new
|
|
1854
|
+
end
|
|
1855
|
+
|
|
1870
1856
|
let(:criteria) do
|
|
1871
|
-
|
|
1857
|
+
association.criteria(base)
|
|
1872
1858
|
end
|
|
1873
1859
|
|
|
1874
1860
|
it "does not include the type in the criteria" do
|
|
1875
|
-
expect(criteria.selector).to eq({ "person_id" => id })
|
|
1861
|
+
expect(criteria.selector).to eq({ "person_id" => base.id })
|
|
1876
1862
|
end
|
|
1877
1863
|
end
|
|
1878
1864
|
end
|
|
@@ -2785,13 +2771,6 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
2785
2771
|
end
|
|
2786
2772
|
end
|
|
2787
2773
|
|
|
2788
|
-
describe ".foreign_key_suffix" do
|
|
2789
|
-
|
|
2790
|
-
it "returns _id" do
|
|
2791
|
-
expect(described_class.foreign_key_suffix).to eq("_id")
|
|
2792
|
-
end
|
|
2793
|
-
end
|
|
2794
|
-
|
|
2795
2774
|
describe "#initialize" do
|
|
2796
2775
|
|
|
2797
2776
|
context "when an illegal mixed relation exists" do
|
|
@@ -2848,13 +2827,6 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
2848
2827
|
end
|
|
2849
2828
|
end
|
|
2850
2829
|
|
|
2851
|
-
describe ".macro" do
|
|
2852
|
-
|
|
2853
|
-
it "returns has_many" do
|
|
2854
|
-
expect(described_class.macro).to eq(:has_many)
|
|
2855
|
-
end
|
|
2856
|
-
end
|
|
2857
|
-
|
|
2858
2830
|
describe "#max" do
|
|
2859
2831
|
|
|
2860
2832
|
let(:person) do
|
|
@@ -2935,7 +2907,8 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
2935
2907
|
expect(posts).to eq([ post_one ])
|
|
2936
2908
|
end
|
|
2937
2909
|
|
|
2938
|
-
context 'when providing a collation'
|
|
2910
|
+
context 'when providing a collation' do
|
|
2911
|
+
min_server_version '3.4'
|
|
2939
2912
|
|
|
2940
2913
|
let(:posts) do
|
|
2941
2914
|
person.posts.where(title: "FIRST").collation(locale: 'en_US', strength: 2)
|
|
@@ -3178,7 +3151,7 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
3178
3151
|
end
|
|
3179
3152
|
end
|
|
3180
3153
|
|
|
3181
|
-
Mongoid::
|
|
3154
|
+
Mongoid::Association::Referenced::HasMany::Proxy.public_instance_methods.each do |method|
|
|
3182
3155
|
|
|
3183
3156
|
context "when checking #{method}" do
|
|
3184
3157
|
|
|
@@ -3199,13 +3172,6 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
3199
3172
|
end
|
|
3200
3173
|
end
|
|
3201
3174
|
|
|
3202
|
-
describe ".stores_foreign_key?" do
|
|
3203
|
-
|
|
3204
|
-
it "returns false" do
|
|
3205
|
-
expect(described_class.stores_foreign_key?).to be false
|
|
3206
|
-
end
|
|
3207
|
-
end
|
|
3208
|
-
|
|
3209
3175
|
describe "#scoped" do
|
|
3210
3176
|
|
|
3211
3177
|
let(:person) do
|
|
@@ -3311,33 +3277,6 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
3311
3277
|
end
|
|
3312
3278
|
end
|
|
3313
3279
|
|
|
3314
|
-
describe ".valid_options" do
|
|
3315
|
-
|
|
3316
|
-
it "returns the valid options" do
|
|
3317
|
-
expect(described_class.valid_options).to eq(
|
|
3318
|
-
[
|
|
3319
|
-
:after_add,
|
|
3320
|
-
:after_remove,
|
|
3321
|
-
:as,
|
|
3322
|
-
:autosave,
|
|
3323
|
-
:before_add,
|
|
3324
|
-
:before_remove,
|
|
3325
|
-
:dependent,
|
|
3326
|
-
:foreign_key,
|
|
3327
|
-
:order,
|
|
3328
|
-
:primary_key
|
|
3329
|
-
]
|
|
3330
|
-
)
|
|
3331
|
-
end
|
|
3332
|
-
end
|
|
3333
|
-
|
|
3334
|
-
describe ".validation_default" do
|
|
3335
|
-
|
|
3336
|
-
it "returns true" do
|
|
3337
|
-
expect(described_class.validation_default).to be true
|
|
3338
|
-
end
|
|
3339
|
-
end
|
|
3340
|
-
|
|
3341
3280
|
context "when the association has an order defined" do
|
|
3342
3281
|
|
|
3343
3282
|
let(:person) do
|
|
@@ -3363,14 +3302,14 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
3363
3302
|
|
|
3364
3303
|
it "order documents" do
|
|
3365
3304
|
expect(person.ordered_posts(true)).to eq(
|
|
3366
|
-
|
|
3367
|
-
|
|
3305
|
+
[post_two, post_three, post_one]
|
|
3306
|
+
)
|
|
3368
3307
|
end
|
|
3369
3308
|
|
|
3370
3309
|
it "chaining order criterias" do
|
|
3371
3310
|
expect(person.ordered_posts.order_by(:title.desc).to_a).to eq(
|
|
3372
|
-
|
|
3373
|
-
|
|
3311
|
+
[post_three, post_two, post_one]
|
|
3312
|
+
)
|
|
3374
3313
|
end
|
|
3375
3314
|
end
|
|
3376
3315
|
|
|
@@ -3396,7 +3335,7 @@ describe Mongoid::Relations::Referenced::Many do
|
|
|
3396
3335
|
|
|
3397
3336
|
before do
|
|
3398
3337
|
Post.collection.find({ _id: post_one.id }).
|
|
3399
|
-
|
|
3338
|
+
update_one({ "$set" => { title: "reloaded" }})
|
|
3400
3339
|
end
|
|
3401
3340
|
|
|
3402
3341
|
let(:reloaded) do
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
class HmmCompany
|
|
5
|
+
include Mongoid::Document
|
|
6
|
+
|
|
7
|
+
field :p, type: Integer
|
|
8
|
+
has_many :emails, primary_key: :p, foreign_key: :f, class_name: 'HmmEmail'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class HmmEmail
|
|
12
|
+
include Mongoid::Document
|
|
13
|
+
|
|
14
|
+
field :f, type: Integer
|
|
15
|
+
belongs_to :company, primary_key: :p, foreign_key: :f, class_name: 'HmmCompany'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class HmmSchool
|
|
19
|
+
include Mongoid::Document
|
|
20
|
+
|
|
21
|
+
has_many :students, class_name: 'HmmStudent'
|
|
22
|
+
|
|
23
|
+
field :district, type: String
|
|
24
|
+
field :team, type: String
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class HmmStudent
|
|
28
|
+
include Mongoid::Document
|
|
29
|
+
|
|
30
|
+
belongs_to :school, class_name: 'HmmSchool'
|
|
31
|
+
|
|
32
|
+
field :name, type: String
|
|
33
|
+
field :grade, type: Integer, default: 3
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class HmmTicket
|
|
37
|
+
include Mongoid::Document
|
|
38
|
+
|
|
39
|
+
belongs_to :person
|
|
40
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
require "spec_helper"
|
|
5
|
+
require_relative './has_many_models'
|
|
6
|
+
|
|
7
|
+
describe Mongoid::Association::Referenced::HasMany do
|
|
8
|
+
context 'when projecting with #only' do
|
|
9
|
+
before do
|
|
10
|
+
school = HmmSchool.create!(district: 'foo')
|
|
11
|
+
HmmStudent.create!(school: school, name: 'Dave', grade: 10)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
let(:school) do
|
|
15
|
+
HmmSchool.where(district: 'foo').only('students._id', 'students.name').first
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let(:student) { school.students.first }
|
|
19
|
+
|
|
20
|
+
it 'populates specified fields only' do
|
|
21
|
+
pending 'https://jira.mongodb.org/browse/MONGOID-4704'
|
|
22
|
+
|
|
23
|
+
expect(student.name).to eq('Dave')
|
|
24
|
+
# has a default value specified in the model
|
|
25
|
+
expect do
|
|
26
|
+
student.grade
|
|
27
|
+
end.to raise_error(ActiveModel::MissingAttributeError)
|
|
28
|
+
expect(student.attributes.keys).to eq(['_id', 'name'])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Delete this test when https://jira.mongodb.org/browse/MONGOID-4704 is
|
|
32
|
+
# implemented and above test is unpended
|
|
33
|
+
it 'fetches all fields' do
|
|
34
|
+
expect(student.name).to eq('Dave')
|
|
35
|
+
expect(student.grade).to eq(10)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,1228 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
require "spec_helper"
|
|
5
|
+
|
|
6
|
+
describe Mongoid::Association::Referenced::HasMany do
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
class OwnerObject; include Mongoid::Document; end
|
|
10
|
+
class BelongingObject; include Mongoid::Document; end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
after do
|
|
14
|
+
Object.send(:remove_const, :BelongingObject)
|
|
15
|
+
Object.send(:remove_const, :OwnerObject)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let(:has_many_class) do
|
|
19
|
+
OwnerObject
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
let(:name) do
|
|
23
|
+
:belonging_objects
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
let(:association) do
|
|
27
|
+
has_many_class.has_many name, options
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
let(:options) do
|
|
31
|
+
{ }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe '#relation_complements' do
|
|
35
|
+
|
|
36
|
+
let(:expected_complements) do
|
|
37
|
+
[
|
|
38
|
+
Mongoid::Association::Referenced::BelongsTo,
|
|
39
|
+
]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'returns the relation complements' do
|
|
43
|
+
expect(association.relation_complements).to eq(expected_complements)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe '#setup!' do
|
|
48
|
+
|
|
49
|
+
it 'sets up a getter for the relation' do
|
|
50
|
+
expect(Mongoid::Association::Accessors).to receive(:define_getter!).with(association)
|
|
51
|
+
association.setup!
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'sets up a ids getter for the relation' do
|
|
55
|
+
expect(Mongoid::Association::Accessors).to receive(:define_ids_getter!).with(association)
|
|
56
|
+
association.setup!
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'sets up a setter for the relation' do
|
|
60
|
+
expect(Mongoid::Association::Accessors).to receive(:define_setter!).with(association)
|
|
61
|
+
association.setup!
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'sets up a ids setter for the relation' do
|
|
65
|
+
expect(Mongoid::Association::Accessors).to receive(:define_ids_setter!).with(association)
|
|
66
|
+
association.setup!
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'sets up an existence check for the relation' do
|
|
70
|
+
expect(Mongoid::Association::Accessors).to receive(:define_existence_check!).with(association)
|
|
71
|
+
association.setup!
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context 'autosave' do
|
|
75
|
+
|
|
76
|
+
context 'when the :autosave option is true' do
|
|
77
|
+
|
|
78
|
+
let(:options) do
|
|
79
|
+
{
|
|
80
|
+
autosave: true
|
|
81
|
+
}
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
let(:association) do
|
|
85
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
86
|
+
# setup! method will be called by the :has_many macro
|
|
87
|
+
described_class.new(has_many_class, name, options)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'sets up autosave' do
|
|
91
|
+
expect(Mongoid::Association::Referenced::AutoSave).to receive(:define_autosave!).with(association)
|
|
92
|
+
association.setup!
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context 'when the :autosave option is false' do
|
|
97
|
+
|
|
98
|
+
let(:options) do
|
|
99
|
+
{
|
|
100
|
+
autosave: false
|
|
101
|
+
}
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'does not set up autosave' do
|
|
105
|
+
expect(Mongoid::Association::Referenced::AutoSave).not_to receive(:define_autosave!)
|
|
106
|
+
association.setup_instance_methods!
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
context 'when the :autosave option is not provided' do
|
|
111
|
+
|
|
112
|
+
let(:association) do
|
|
113
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
114
|
+
# setup! method will be called by the :has_many macro
|
|
115
|
+
described_class.new(has_many_class, name, options)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it 'does not set up autosave' do
|
|
119
|
+
expect(Mongoid::Association::Referenced::AutoSave).not_to receive(:define_autosave!)
|
|
120
|
+
association.setup!
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
context 'when the :validate option is true' do
|
|
126
|
+
|
|
127
|
+
let(:options) do
|
|
128
|
+
{
|
|
129
|
+
validate: true
|
|
130
|
+
}
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
let(:association) do
|
|
134
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
135
|
+
# setup! method will be called by the :has_many macro
|
|
136
|
+
described_class.new(has_many_class, name, options)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it 'sets up validation' do
|
|
140
|
+
expect(has_many_class).to receive(:validates_associated).with(name).and_call_original
|
|
141
|
+
association.setup!
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
context 'when the :validate option is false' do
|
|
146
|
+
|
|
147
|
+
let(:options) do
|
|
148
|
+
{
|
|
149
|
+
validate: false
|
|
150
|
+
}
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it 'does not set up validation' do
|
|
154
|
+
expect(has_many_class).not_to receive(:validates_associated)
|
|
155
|
+
association.setup_instance_methods!
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
context 'when the :validate option is not provided' do
|
|
160
|
+
|
|
161
|
+
let(:association) do
|
|
162
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
163
|
+
# setup! method will be called by the :has_many macro
|
|
164
|
+
described_class.new(has_many_class, name, options)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it 'sets up the validation because it uses the validation default (true)' do
|
|
168
|
+
expect(has_many_class).to receive(:validates_associated).with(name).and_call_original
|
|
169
|
+
association.setup!
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
context 'polymorphic' do
|
|
174
|
+
|
|
175
|
+
context 'when the as option is provided' do
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
let(:options) do
|
|
179
|
+
{
|
|
180
|
+
as: :containable
|
|
181
|
+
}
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
before do
|
|
185
|
+
association
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it 'set the polymorphic attribute on the owner class' do
|
|
189
|
+
expect(has_many_class.polymorphic).to be(true)
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
context 'when the as option is not provided' do
|
|
194
|
+
|
|
195
|
+
it 'does not set the polymorphic attribute on the owner class' do
|
|
196
|
+
expect(has_many_class.polymorphic).to be(false)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context 'dependent' do
|
|
202
|
+
|
|
203
|
+
context 'when the dependent option is provided' do
|
|
204
|
+
|
|
205
|
+
context 'when the dependent option is :delete_all' do
|
|
206
|
+
|
|
207
|
+
let(:options) do
|
|
208
|
+
{
|
|
209
|
+
dependent: :delete_all
|
|
210
|
+
}
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
let(:association) do
|
|
214
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
215
|
+
# setup! method will be called by the :belongs_to macro
|
|
216
|
+
described_class.new(has_many_class, name, options)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it 'sets up the dependency' do
|
|
220
|
+
expect(Mongoid::Association::Depending).to receive(:define_dependency!)
|
|
221
|
+
association.setup!
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
context 'when the dependent option is :destroy' do
|
|
226
|
+
|
|
227
|
+
let(:options) do
|
|
228
|
+
{
|
|
229
|
+
dependent: :destroy
|
|
230
|
+
}
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
let(:association) do
|
|
234
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
235
|
+
# setup! method will be called by the :belongs_to macro
|
|
236
|
+
described_class.new(has_many_class, name, options)
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
it 'sets up the dependency' do
|
|
240
|
+
expect(Mongoid::Association::Depending).to receive(:define_dependency!)
|
|
241
|
+
association.setup!
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
context 'when the dependent option is :nullify' do
|
|
246
|
+
|
|
247
|
+
let(:options) do
|
|
248
|
+
{
|
|
249
|
+
dependent: :nullify
|
|
250
|
+
}
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
let(:association) do
|
|
254
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
255
|
+
# setup! method will be called by the :belongs_to macro
|
|
256
|
+
described_class.new(has_many_class, name, options)
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it 'sets up the dependency' do
|
|
260
|
+
expect(Mongoid::Association::Depending).to receive(:define_dependency!)
|
|
261
|
+
association.setup!
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
context 'when the dependent option is :restrict_with_exception' do
|
|
266
|
+
|
|
267
|
+
let(:options) do
|
|
268
|
+
{
|
|
269
|
+
dependent: :restrict_with_exception
|
|
270
|
+
}
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
let(:association) do
|
|
274
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
275
|
+
# setup! method will be called by the :belongs_to macro
|
|
276
|
+
described_class.new(has_many_class, name, options)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
it 'sets up the dependency' do
|
|
280
|
+
expect(Mongoid::Association::Depending).to receive(:define_dependency!)
|
|
281
|
+
association.setup!
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
context 'when the dependent option is :restrict_with_error' do
|
|
286
|
+
|
|
287
|
+
let(:options) do
|
|
288
|
+
{
|
|
289
|
+
dependent: :restrict_with_error
|
|
290
|
+
}
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
let(:association) do
|
|
294
|
+
# Note that it is necessary to create the association directly, otherwise the
|
|
295
|
+
# setup_instance_methods! method will be called by the :belongs_to macro
|
|
296
|
+
described_class.new(has_many_class, name, options)
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
it 'sets up the dependency' do
|
|
300
|
+
expect(Mongoid::Association::Depending).to receive(:define_dependency!)
|
|
301
|
+
association.setup!
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
context 'when the dependent option is not provided' do
|
|
307
|
+
|
|
308
|
+
it 'does not set up the dependency' do
|
|
309
|
+
expect(Mongoid::Association::Depending).not_to receive(:define_dependency!)
|
|
310
|
+
association.setup!
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
describe '#type' do
|
|
317
|
+
|
|
318
|
+
context 'when polymorphic' do
|
|
319
|
+
|
|
320
|
+
let(:options) do
|
|
321
|
+
{ as: :containable }
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
it 'returns the as attribute followed by "_type"' do
|
|
325
|
+
expect(association.type).to eq("#{options[:as]}_type")
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
context 'when not polymorphic' do
|
|
330
|
+
|
|
331
|
+
it 'returns nil' do
|
|
332
|
+
expect(association.type).to be_nil
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
describe '#inverse_type' do
|
|
338
|
+
|
|
339
|
+
context 'when polymorphic' do
|
|
340
|
+
|
|
341
|
+
let(:options) do
|
|
342
|
+
{ as: :containable }
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
it 'returns nil' do
|
|
346
|
+
expect(association.inverse_type).to be_nil
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
context 'when not polymorphic' do
|
|
351
|
+
|
|
352
|
+
it 'returns nil' do
|
|
353
|
+
expect(association.inverse_type).to be_nil
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
describe '#inverse_type_setter' do
|
|
359
|
+
|
|
360
|
+
context 'when polymorphic' do
|
|
361
|
+
|
|
362
|
+
let(:options) do
|
|
363
|
+
{ as: :containable }
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
it 'returns nil' do
|
|
367
|
+
expect(association.inverse_type).to be_nil
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
context 'when not polymorphic' do
|
|
372
|
+
|
|
373
|
+
it 'returns nil' do
|
|
374
|
+
expect(association.inverse_type).to be_nil
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
describe '#foreign_key' do
|
|
380
|
+
|
|
381
|
+
context 'when options has foreign_key specified' do
|
|
382
|
+
|
|
383
|
+
let(:options) do
|
|
384
|
+
{ foreign_key: :other_object_id }
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
it 'raises returns the foreign key as a String' do
|
|
388
|
+
expect(association.foreign_key).to eq(options[:foreign_key].to_s)
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
context 'when options does not have foreign_key specified' do
|
|
393
|
+
|
|
394
|
+
it 'returns the default foreign key, the name of the inverse followed by "_id"' do
|
|
395
|
+
expect(association.foreign_key).to eq("#{association.inverse}_id")
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
describe '#embedded?' do
|
|
401
|
+
|
|
402
|
+
it 'returns false' do
|
|
403
|
+
expect(association.embedded?).to be(false)
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
describe '#primary_key' do
|
|
408
|
+
|
|
409
|
+
context 'when the :primary_key option is specified' do
|
|
410
|
+
|
|
411
|
+
let(:options) do
|
|
412
|
+
{
|
|
413
|
+
primary_key: 'guid'
|
|
414
|
+
}
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
it 'returns the primary_key' do
|
|
418
|
+
expect(association.primary_key).to eq(options[:primary_key])
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
context 'when the :primary_key option is not specified' do
|
|
423
|
+
|
|
424
|
+
it 'returns the primary_key default' do
|
|
425
|
+
expect(association.primary_key).to eq(Mongoid::Association::Relatable::PRIMARY_KEY_DEFAULT)
|
|
426
|
+
end
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
describe '#relation' do
|
|
431
|
+
|
|
432
|
+
it 'returns Mongoid::Association::Referenced::HasMany::Proxy' do
|
|
433
|
+
expect(association.relation).to be(Mongoid::Association::Referenced::HasMany::Proxy)
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
describe '#validation_default' do
|
|
438
|
+
|
|
439
|
+
it 'returns true' do
|
|
440
|
+
expect(association.validation_default).to be(true)
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
describe '#name' do
|
|
445
|
+
|
|
446
|
+
it 'returns the name of the relation' do
|
|
447
|
+
expect(association.name).to be(name)
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
describe '#options' do
|
|
452
|
+
|
|
453
|
+
it 'returns the options' do
|
|
454
|
+
expect(association.options).to be(options)
|
|
455
|
+
end
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
describe '#merge!' do
|
|
459
|
+
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
describe '#store_as' do
|
|
463
|
+
it 'returns nil' do
|
|
464
|
+
expect(association.store_as).to be_nil
|
|
465
|
+
end
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
describe '#touchable?' do
|
|
469
|
+
|
|
470
|
+
it 'return false' do
|
|
471
|
+
expect(association.send(:touchable?)).to be(false)
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
describe '#order' do
|
|
476
|
+
|
|
477
|
+
context 'when order is specified in the options' do
|
|
478
|
+
|
|
479
|
+
let(:options) do
|
|
480
|
+
{
|
|
481
|
+
order: :rating.desc
|
|
482
|
+
}
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
it 'returns a Criteria Queryable Key' do
|
|
486
|
+
expect(association.order).to be_a(Mongoid::Criteria::Queryable::Key)
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
context 'when order is not specified in the options' do
|
|
491
|
+
|
|
492
|
+
it 'returns nil' do
|
|
493
|
+
expect(association.order).to be_nil
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
describe '#as' do
|
|
499
|
+
|
|
500
|
+
context 'when :as is specified in the options' do
|
|
501
|
+
|
|
502
|
+
let(:options) do
|
|
503
|
+
{
|
|
504
|
+
as: :containable
|
|
505
|
+
}
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
it 'returns the :as option' do
|
|
509
|
+
expect(association.as).to eq(options[:as])
|
|
510
|
+
end
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
context 'when :as is not specified in the options' do
|
|
514
|
+
|
|
515
|
+
it 'returns nil' do
|
|
516
|
+
expect(association.as).to be_nil
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
describe '#polymorphic?' do
|
|
522
|
+
|
|
523
|
+
context 'when :as is specified in the options' do
|
|
524
|
+
|
|
525
|
+
let(:options) do
|
|
526
|
+
{
|
|
527
|
+
as: :containable
|
|
528
|
+
}
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
it 'returns true' do
|
|
532
|
+
expect(association.polymorphic?).to be(true)
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
end
|
|
536
|
+
|
|
537
|
+
context 'when :as is not specified in the options' do
|
|
538
|
+
|
|
539
|
+
it 'returns false' do
|
|
540
|
+
expect(association.polymorphic?).to be(false)
|
|
541
|
+
end
|
|
542
|
+
end
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
describe '#type_setter' do
|
|
546
|
+
|
|
547
|
+
context 'when polymorphic' do
|
|
548
|
+
|
|
549
|
+
let(:options) do
|
|
550
|
+
{ as: :containable }
|
|
551
|
+
end
|
|
552
|
+
|
|
553
|
+
it 'returns the type followed by = as a String' do
|
|
554
|
+
expect(association.type_setter).to eq("containable_type=")
|
|
555
|
+
end
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
context 'when not polymorphic' do
|
|
559
|
+
|
|
560
|
+
it 'returns nil' do
|
|
561
|
+
expect(association.type).to be_nil
|
|
562
|
+
end
|
|
563
|
+
end
|
|
564
|
+
end
|
|
565
|
+
|
|
566
|
+
describe '#dependent' do
|
|
567
|
+
|
|
568
|
+
context 'when the dependent option is provided' do
|
|
569
|
+
|
|
570
|
+
context 'when the dependent option is :delete_all' do
|
|
571
|
+
|
|
572
|
+
let(:options) do
|
|
573
|
+
{
|
|
574
|
+
dependent: :delete_all
|
|
575
|
+
}
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
it 'returns :delete_all' do
|
|
579
|
+
expect(association.dependent).to eq(:delete_all)
|
|
580
|
+
end
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
context 'when the dependent option is :destroy' do
|
|
584
|
+
|
|
585
|
+
let(:options) do
|
|
586
|
+
{
|
|
587
|
+
dependent: :destroy
|
|
588
|
+
}
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
it 'returns :destroy' do
|
|
592
|
+
expect(association.dependent).to eq(:destroy)
|
|
593
|
+
end
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
context 'when the dependent option is :nullify' do
|
|
597
|
+
|
|
598
|
+
let(:options) do
|
|
599
|
+
{
|
|
600
|
+
dependent: :nullify
|
|
601
|
+
}
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
it 'returns :nullify' do
|
|
605
|
+
expect(association.dependent).to eq(:nullify)
|
|
606
|
+
end
|
|
607
|
+
end
|
|
608
|
+
|
|
609
|
+
context 'when the dependent option is :restrict_with_exception' do
|
|
610
|
+
|
|
611
|
+
let(:options) do
|
|
612
|
+
{
|
|
613
|
+
dependent: :restrict_with_exception
|
|
614
|
+
}
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
it 'returns :restrict_with_exception' do
|
|
618
|
+
expect(association.dependent).to eq(:restrict_with_exception)
|
|
619
|
+
end
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
context 'when the dependent option is :restrict_with_error' do
|
|
623
|
+
|
|
624
|
+
let(:options) do
|
|
625
|
+
{
|
|
626
|
+
dependent: :restrict_with_error
|
|
627
|
+
}
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
it 'returns :restrict_with_error' do
|
|
631
|
+
expect(association.dependent).to eq(:restrict_with_error)
|
|
632
|
+
end
|
|
633
|
+
end
|
|
634
|
+
end
|
|
635
|
+
|
|
636
|
+
context 'when the dependent option is not provided' do
|
|
637
|
+
|
|
638
|
+
it 'returns nil' do
|
|
639
|
+
expect(association.dependent).to be_nil
|
|
640
|
+
end
|
|
641
|
+
end
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
describe '#inverse_type' do
|
|
645
|
+
|
|
646
|
+
it 'returns nil' do
|
|
647
|
+
expect(association.inverse_type).to be_nil
|
|
648
|
+
end
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
describe '#bindable?' do
|
|
652
|
+
|
|
653
|
+
it 'returns false' do
|
|
654
|
+
expect(association.bindable?(Person.new)).to be(false)
|
|
655
|
+
end
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
describe '#inverses' do
|
|
659
|
+
|
|
660
|
+
context 'when polymorphic' do
|
|
661
|
+
|
|
662
|
+
before do
|
|
663
|
+
BelongingObject.belongs_to :containable, polymorphic: true
|
|
664
|
+
end
|
|
665
|
+
|
|
666
|
+
let(:options) do
|
|
667
|
+
{
|
|
668
|
+
as: :containable
|
|
669
|
+
}
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
context 'when another object is passed to the method' do
|
|
673
|
+
|
|
674
|
+
let(:instance_of_other_class) do
|
|
675
|
+
BelongingObject.new
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
context 'when the relation class has only one relation whose class matches the owning class' do
|
|
679
|
+
|
|
680
|
+
it 'returns the :as attribute of this association' do
|
|
681
|
+
expect(association.inverses(instance_of_other_class)).to match_array([ :containable ])
|
|
682
|
+
end
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
context 'when :inverse_of is specified' do
|
|
686
|
+
|
|
687
|
+
before do
|
|
688
|
+
options.merge!(inverse_of: :inverse_name)
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
it 'returns the :inverse_of value' do
|
|
692
|
+
expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
|
|
693
|
+
end
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
context 'when inverse_of is not specified' do
|
|
697
|
+
|
|
698
|
+
it 'returns the :as attribute of this association' do
|
|
699
|
+
expect(association.inverses(instance_of_other_class)).to match_array([ :containable ])
|
|
700
|
+
end
|
|
701
|
+
end
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
context 'when another object is not passed to the method' do
|
|
705
|
+
|
|
706
|
+
context 'when inverse_of is specified' do
|
|
707
|
+
|
|
708
|
+
before do
|
|
709
|
+
options.merge!(inverse_of: :inverse_name)
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
it 'returns the :inverse_of value' do
|
|
713
|
+
expect(association.inverses).to eq([ :inverse_name ])
|
|
714
|
+
end
|
|
715
|
+
end
|
|
716
|
+
|
|
717
|
+
context 'when inverse_of is not specified' do
|
|
718
|
+
|
|
719
|
+
it 'returns the :as attribute' do
|
|
720
|
+
expect(association.inverses).to eq([ :containable ])
|
|
721
|
+
end
|
|
722
|
+
end
|
|
723
|
+
end
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
context 'when not polymorphic' do
|
|
727
|
+
|
|
728
|
+
before do
|
|
729
|
+
BelongingObject.belongs_to :owner_object
|
|
730
|
+
end
|
|
731
|
+
|
|
732
|
+
context 'when inverse_of is specified' do
|
|
733
|
+
|
|
734
|
+
before do
|
|
735
|
+
options.merge!(inverse_of: :inverse_name)
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
it 'returns the :inverse_of value' do
|
|
739
|
+
expect(association.inverses).to eq([ :inverse_name ])
|
|
740
|
+
end
|
|
741
|
+
end
|
|
742
|
+
|
|
743
|
+
context 'when inverse_of is not specified' do
|
|
744
|
+
|
|
745
|
+
it 'uses the inverse class to find the inverse name' do
|
|
746
|
+
expect(association.inverses).to eq([ :owner_object ])
|
|
747
|
+
end
|
|
748
|
+
end
|
|
749
|
+
|
|
750
|
+
context 'when :cyclic is specified' do
|
|
751
|
+
|
|
752
|
+
it 'returns the cyclic inverse name' do
|
|
753
|
+
|
|
754
|
+
end
|
|
755
|
+
end
|
|
756
|
+
end
|
|
757
|
+
end
|
|
758
|
+
|
|
759
|
+
describe '##inverse' do
|
|
760
|
+
|
|
761
|
+
context 'when polymorphic' do
|
|
762
|
+
|
|
763
|
+
before do
|
|
764
|
+
BelongingObject.belongs_to :containable, polymorphic: true
|
|
765
|
+
end
|
|
766
|
+
|
|
767
|
+
let(:options) do
|
|
768
|
+
{
|
|
769
|
+
as: :containable
|
|
770
|
+
}
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
context 'when another object is passed to the method' do
|
|
774
|
+
|
|
775
|
+
let(:instance_of_other_class) do
|
|
776
|
+
BelongingObject.new
|
|
777
|
+
end
|
|
778
|
+
|
|
779
|
+
context 'when the relation class has only one relation whose class matches the owning class' do
|
|
780
|
+
|
|
781
|
+
it 'returns the :as attribute of this association' do
|
|
782
|
+
expect(association.inverse(instance_of_other_class)).to eq(:containable)
|
|
783
|
+
end
|
|
784
|
+
end
|
|
785
|
+
|
|
786
|
+
context 'when :inverse_of is specified' do
|
|
787
|
+
|
|
788
|
+
before do
|
|
789
|
+
options.merge!(inverse_of: :inverse_name)
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
it 'returns the :inverse_of value' do
|
|
793
|
+
expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
|
|
794
|
+
end
|
|
795
|
+
end
|
|
796
|
+
|
|
797
|
+
context 'when inverse_of is not specified' do
|
|
798
|
+
|
|
799
|
+
it 'returns the :as attribute of this association' do
|
|
800
|
+
expect(association.inverse(instance_of_other_class)).to eq(:containable)
|
|
801
|
+
end
|
|
802
|
+
end
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
context 'when another object is not passed to the method' do
|
|
806
|
+
|
|
807
|
+
context 'when inverse_of is specified' do
|
|
808
|
+
|
|
809
|
+
before do
|
|
810
|
+
options.merge!(inverse_of: :inverse_name)
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
it 'returns the :inverse_of value' do
|
|
814
|
+
expect(association.inverse).to eq(:inverse_name)
|
|
815
|
+
end
|
|
816
|
+
end
|
|
817
|
+
|
|
818
|
+
context 'when inverse_of is not specified' do
|
|
819
|
+
|
|
820
|
+
it 'returns the :as attribute' do
|
|
821
|
+
expect(association.inverse).to eq(:containable)
|
|
822
|
+
end
|
|
823
|
+
end
|
|
824
|
+
end
|
|
825
|
+
end
|
|
826
|
+
|
|
827
|
+
context 'when not polymorphic' do
|
|
828
|
+
|
|
829
|
+
before do
|
|
830
|
+
BelongingObject.belongs_to :owner_object
|
|
831
|
+
end
|
|
832
|
+
|
|
833
|
+
context 'when inverse_of is specified' do
|
|
834
|
+
|
|
835
|
+
before do
|
|
836
|
+
options.merge!(inverse_of: :inverse_name)
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
it 'returns the :inverse_of value' do
|
|
840
|
+
expect(association.inverse).to eq(:inverse_name)
|
|
841
|
+
end
|
|
842
|
+
end
|
|
843
|
+
|
|
844
|
+
context 'when inverse_of is not specified' do
|
|
845
|
+
|
|
846
|
+
it 'uses the inverse class to find the inverse name' do
|
|
847
|
+
expect(association.inverse).to eq(:owner_object)
|
|
848
|
+
end
|
|
849
|
+
end
|
|
850
|
+
|
|
851
|
+
context 'when :cyclic is specified' do
|
|
852
|
+
|
|
853
|
+
it 'returns the cyclic inverse name' do
|
|
854
|
+
|
|
855
|
+
end
|
|
856
|
+
end
|
|
857
|
+
end
|
|
858
|
+
end
|
|
859
|
+
|
|
860
|
+
describe '#inverse_association' do
|
|
861
|
+
|
|
862
|
+
end
|
|
863
|
+
|
|
864
|
+
describe '#autosave' do
|
|
865
|
+
|
|
866
|
+
context 'when the autosave option is specified' do
|
|
867
|
+
|
|
868
|
+
context 'when the autosave option is true' do
|
|
869
|
+
|
|
870
|
+
let(:options) do
|
|
871
|
+
{
|
|
872
|
+
autosave: true
|
|
873
|
+
}
|
|
874
|
+
end
|
|
875
|
+
|
|
876
|
+
it 'returns true' do
|
|
877
|
+
expect(association.autosave).to be(true)
|
|
878
|
+
end
|
|
879
|
+
end
|
|
880
|
+
|
|
881
|
+
context 'when the autosave option is false' do
|
|
882
|
+
|
|
883
|
+
let(:options) do
|
|
884
|
+
{
|
|
885
|
+
autosave: false
|
|
886
|
+
}
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
it 'returns false' do
|
|
890
|
+
expect(association.autosave).to be(false)
|
|
891
|
+
end
|
|
892
|
+
end
|
|
893
|
+
end
|
|
894
|
+
|
|
895
|
+
context 'when the autosave option is not specified' do
|
|
896
|
+
|
|
897
|
+
it 'returns false' do
|
|
898
|
+
expect(association.autosave).to be(false)
|
|
899
|
+
end
|
|
900
|
+
end
|
|
901
|
+
end
|
|
902
|
+
|
|
903
|
+
describe '#relation_class_name' do
|
|
904
|
+
|
|
905
|
+
context 'when the :class_name option is specified' do
|
|
906
|
+
|
|
907
|
+
let(:options) do
|
|
908
|
+
{ class_name: 'OtherBelongingObject' }
|
|
909
|
+
end
|
|
910
|
+
|
|
911
|
+
it 'returns the class name option' do
|
|
912
|
+
expect(association.relation_class_name).to eq('OtherBelongingObject')
|
|
913
|
+
end
|
|
914
|
+
end
|
|
915
|
+
|
|
916
|
+
context 'when the class_name option is not specified' do
|
|
917
|
+
|
|
918
|
+
it 'uses the name of the relation to deduce the class name' do
|
|
919
|
+
expect(association.relation_class_name).to eq('BelongingObject')
|
|
920
|
+
end
|
|
921
|
+
end
|
|
922
|
+
end
|
|
923
|
+
|
|
924
|
+
describe '#relation_class' do
|
|
925
|
+
|
|
926
|
+
context 'when the :class_name option is specified' do
|
|
927
|
+
|
|
928
|
+
let!(:_class) do
|
|
929
|
+
class OtherBelongingObject; end
|
|
930
|
+
OtherBelongingObject
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
let(:options) do
|
|
934
|
+
{ class_name: 'OtherBelongingObject' }
|
|
935
|
+
end
|
|
936
|
+
|
|
937
|
+
it 'returns the class name option' do
|
|
938
|
+
expect(association.relation_class).to eq(_class)
|
|
939
|
+
end
|
|
940
|
+
end
|
|
941
|
+
|
|
942
|
+
context 'when the class_name option is not specified' do
|
|
943
|
+
|
|
944
|
+
it 'uses the name of the relation to deduce the class name' do
|
|
945
|
+
expect(association.relation_class).to eq(BelongingObject)
|
|
946
|
+
end
|
|
947
|
+
end
|
|
948
|
+
end
|
|
949
|
+
|
|
950
|
+
describe '#inverse_class_name' do
|
|
951
|
+
|
|
952
|
+
it 'returns the name of the owner class' do
|
|
953
|
+
expect(association.inverse_class_name).to eq(OwnerObject.name)
|
|
954
|
+
end
|
|
955
|
+
end
|
|
956
|
+
|
|
957
|
+
describe '#inverse_class' do
|
|
958
|
+
|
|
959
|
+
it 'returns the owner class' do
|
|
960
|
+
expect(association.inverse_class).to be(OwnerObject)
|
|
961
|
+
end
|
|
962
|
+
end
|
|
963
|
+
|
|
964
|
+
describe '#inverse_of' do
|
|
965
|
+
|
|
966
|
+
context 'when :inverse_of is specified in the options' do
|
|
967
|
+
|
|
968
|
+
let(:options) do
|
|
969
|
+
{ inverse_of: :a_belonging_object }
|
|
970
|
+
end
|
|
971
|
+
|
|
972
|
+
it 'returns the inverse_of value' do
|
|
973
|
+
expect(association.inverse_of).to eq(options[:inverse_of])
|
|
974
|
+
end
|
|
975
|
+
end
|
|
976
|
+
|
|
977
|
+
context 'when :inverse_of is not specified in the options' do
|
|
978
|
+
|
|
979
|
+
it 'returns nil' do
|
|
980
|
+
expect(association.inverse_of).to be_nil
|
|
981
|
+
end
|
|
982
|
+
end
|
|
983
|
+
end
|
|
984
|
+
|
|
985
|
+
describe '#key' do
|
|
986
|
+
|
|
987
|
+
it 'returns the primary key' do
|
|
988
|
+
expect(association.key).to eq(association.primary_key)
|
|
989
|
+
end
|
|
990
|
+
end
|
|
991
|
+
|
|
992
|
+
describe '#setter' do
|
|
993
|
+
|
|
994
|
+
it 'returns a string of the name followed by =' do
|
|
995
|
+
expect(association.setter).to eq("#{name}=")
|
|
996
|
+
end
|
|
997
|
+
end
|
|
998
|
+
|
|
999
|
+
describe '#validate?' do
|
|
1000
|
+
|
|
1001
|
+
context 'when :validate is specified in the options' do
|
|
1002
|
+
|
|
1003
|
+
context 'when validate is true' do
|
|
1004
|
+
|
|
1005
|
+
let(:options) do
|
|
1006
|
+
{ validate: true }
|
|
1007
|
+
end
|
|
1008
|
+
|
|
1009
|
+
it 'returns true' do
|
|
1010
|
+
expect(association.send(:validate?)).to be(true)
|
|
1011
|
+
end
|
|
1012
|
+
end
|
|
1013
|
+
|
|
1014
|
+
context 'when validate is false' do
|
|
1015
|
+
|
|
1016
|
+
let(:options) do
|
|
1017
|
+
{ validate: false }
|
|
1018
|
+
end
|
|
1019
|
+
|
|
1020
|
+
it 'returns false' do
|
|
1021
|
+
expect(association.send(:validate?)).to be(false)
|
|
1022
|
+
end
|
|
1023
|
+
end
|
|
1024
|
+
end
|
|
1025
|
+
|
|
1026
|
+
context 'when :validate is not specified in the options' do
|
|
1027
|
+
|
|
1028
|
+
it 'returns the validation_default' do
|
|
1029
|
+
expect(association.send(:validate?)).to eq(association.validation_default)
|
|
1030
|
+
end
|
|
1031
|
+
end
|
|
1032
|
+
end
|
|
1033
|
+
|
|
1034
|
+
describe '#forced_nil_inverse?' do
|
|
1035
|
+
|
|
1036
|
+
it 'returns false' do
|
|
1037
|
+
expect(association.forced_nil_inverse?).to be(false)
|
|
1038
|
+
end
|
|
1039
|
+
end
|
|
1040
|
+
|
|
1041
|
+
describe '#stores_foreign_key?' do
|
|
1042
|
+
|
|
1043
|
+
it 'returns false' do
|
|
1044
|
+
expect(association.stores_foreign_key?).to be(false)
|
|
1045
|
+
end
|
|
1046
|
+
end
|
|
1047
|
+
|
|
1048
|
+
describe '#inverse_setter' do
|
|
1049
|
+
|
|
1050
|
+
context 'when an inverse can be determined' do
|
|
1051
|
+
|
|
1052
|
+
before do
|
|
1053
|
+
BelongingObject.belongs_to :owner_object
|
|
1054
|
+
end
|
|
1055
|
+
|
|
1056
|
+
it 'returns the name of the inverse followed by =' do
|
|
1057
|
+
expect(association.inverse_setter).to eq('owner_object=')
|
|
1058
|
+
end
|
|
1059
|
+
end
|
|
1060
|
+
|
|
1061
|
+
context 'when an inverse cannot be determined' do
|
|
1062
|
+
|
|
1063
|
+
it 'returns nil' do
|
|
1064
|
+
expect(association.inverse_setter).to be_nil
|
|
1065
|
+
end
|
|
1066
|
+
end
|
|
1067
|
+
end
|
|
1068
|
+
|
|
1069
|
+
describe '#extension' do
|
|
1070
|
+
|
|
1071
|
+
context 'when a block is passed' do
|
|
1072
|
+
|
|
1073
|
+
let(:association) do
|
|
1074
|
+
has_many_class.embeds_one name, options do; end
|
|
1075
|
+
end
|
|
1076
|
+
|
|
1077
|
+
it 'defines an extension module' do
|
|
1078
|
+
expect(association.extension).to be_a(Module)
|
|
1079
|
+
end
|
|
1080
|
+
|
|
1081
|
+
it 'returns the extension' do
|
|
1082
|
+
expect(association.extension).to eq(
|
|
1083
|
+
"#{has_many_class.name}::#{has_many_class.name}#{name.to_s.camelize}RelationExtension".constantize)
|
|
1084
|
+
end
|
|
1085
|
+
end
|
|
1086
|
+
|
|
1087
|
+
context 'when an :extension is not specified in the options' do
|
|
1088
|
+
|
|
1089
|
+
it 'returns false' do
|
|
1090
|
+
expect(association.extension).to be_nil
|
|
1091
|
+
end
|
|
1092
|
+
end
|
|
1093
|
+
end
|
|
1094
|
+
|
|
1095
|
+
describe '#foreign_key_setter' do
|
|
1096
|
+
|
|
1097
|
+
it 'returns the foreign key followed by "="' do
|
|
1098
|
+
expect(association.foreign_key_setter).to eq("#{association.foreign_key}=")
|
|
1099
|
+
end
|
|
1100
|
+
end
|
|
1101
|
+
|
|
1102
|
+
describe '#criteria' do
|
|
1103
|
+
|
|
1104
|
+
it 'returns a criteria object' do
|
|
1105
|
+
expect(association.criteria(OwnerObject.new)).to be_a(Mongoid::Criteria)
|
|
1106
|
+
end
|
|
1107
|
+
end
|
|
1108
|
+
|
|
1109
|
+
describe '#destructive?' do
|
|
1110
|
+
|
|
1111
|
+
context 'when the dependent option is provided' do
|
|
1112
|
+
|
|
1113
|
+
context 'when the dependent option is :delete_all' do
|
|
1114
|
+
|
|
1115
|
+
let(:options) do
|
|
1116
|
+
{
|
|
1117
|
+
dependent: :delete_all
|
|
1118
|
+
}
|
|
1119
|
+
end
|
|
1120
|
+
|
|
1121
|
+
it 'returns true' do
|
|
1122
|
+
expect(association.destructive?).to be(true)
|
|
1123
|
+
end
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
context 'when the dependent option is :destroy' do
|
|
1127
|
+
|
|
1128
|
+
let(:options) do
|
|
1129
|
+
{
|
|
1130
|
+
dependent: :destroy
|
|
1131
|
+
}
|
|
1132
|
+
end
|
|
1133
|
+
|
|
1134
|
+
it 'returns true' do
|
|
1135
|
+
expect(association.destructive?).to be(true)
|
|
1136
|
+
end
|
|
1137
|
+
end
|
|
1138
|
+
|
|
1139
|
+
context 'when the dependent option is :nullify' do
|
|
1140
|
+
|
|
1141
|
+
let(:options) do
|
|
1142
|
+
{
|
|
1143
|
+
dependent: :nullify
|
|
1144
|
+
}
|
|
1145
|
+
end
|
|
1146
|
+
|
|
1147
|
+
it 'returns false' do
|
|
1148
|
+
expect(association.destructive?).to be(false)
|
|
1149
|
+
end
|
|
1150
|
+
end
|
|
1151
|
+
|
|
1152
|
+
context 'when the dependent option is :restrict_with_exception' do
|
|
1153
|
+
|
|
1154
|
+
let(:options) do
|
|
1155
|
+
{
|
|
1156
|
+
dependent: :restrict_with_exception
|
|
1157
|
+
}
|
|
1158
|
+
end
|
|
1159
|
+
|
|
1160
|
+
it 'returns false' do
|
|
1161
|
+
expect(association.destructive?).to be(false)
|
|
1162
|
+
end
|
|
1163
|
+
end
|
|
1164
|
+
|
|
1165
|
+
context 'when the dependent option is :restrict_with_error' do
|
|
1166
|
+
|
|
1167
|
+
let(:options) do
|
|
1168
|
+
{
|
|
1169
|
+
dependent: :restrict_with_error
|
|
1170
|
+
}
|
|
1171
|
+
end
|
|
1172
|
+
|
|
1173
|
+
it 'returns false' do
|
|
1174
|
+
expect(association.destructive?).to be(false)
|
|
1175
|
+
end
|
|
1176
|
+
end
|
|
1177
|
+
end
|
|
1178
|
+
|
|
1179
|
+
context 'when the dependent option is not provided' do
|
|
1180
|
+
|
|
1181
|
+
it 'returns false' do
|
|
1182
|
+
expect(association.destructive?).to be(false)
|
|
1183
|
+
end
|
|
1184
|
+
end
|
|
1185
|
+
end
|
|
1186
|
+
|
|
1187
|
+
describe '#nested_builder' do
|
|
1188
|
+
|
|
1189
|
+
it 'returns an instance of Association::Nested::Many' do
|
|
1190
|
+
expect(association.nested_builder({}, {})).to be_a(Mongoid::Association::Nested::Many)
|
|
1191
|
+
end
|
|
1192
|
+
end
|
|
1193
|
+
|
|
1194
|
+
describe '#path' do
|
|
1195
|
+
|
|
1196
|
+
it 'returns an instance of Mongoid::Atomic::Paths::Root' do
|
|
1197
|
+
expect(association.path(double( :_parent => true))).to be_a(Mongoid::Atomic::Paths::Root)
|
|
1198
|
+
end
|
|
1199
|
+
end
|
|
1200
|
+
|
|
1201
|
+
describe '#foreign_key_check' do
|
|
1202
|
+
|
|
1203
|
+
it 'returns the nil' do
|
|
1204
|
+
expect(association.foreign_key_check).to be_nil
|
|
1205
|
+
end
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
describe '#create_relation' do
|
|
1209
|
+
|
|
1210
|
+
let(:owner) do
|
|
1211
|
+
OwnerObject.new
|
|
1212
|
+
end
|
|
1213
|
+
|
|
1214
|
+
let(:target) do
|
|
1215
|
+
[ BelongingObject.new ]
|
|
1216
|
+
end
|
|
1217
|
+
|
|
1218
|
+
before do
|
|
1219
|
+
association
|
|
1220
|
+
BelongingObject.belongs_to :owner_object
|
|
1221
|
+
end
|
|
1222
|
+
|
|
1223
|
+
it 'returns an the target (EmbeddedObject)' do
|
|
1224
|
+
expect(Mongoid::Association::Referenced::HasMany::Proxy).to receive(:new).and_call_original
|
|
1225
|
+
expect(association.create_relation(owner, target)).to be_a(Array)
|
|
1226
|
+
end
|
|
1227
|
+
end
|
|
1228
|
+
end
|