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
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
1
4
|
require "spec_helper"
|
|
2
5
|
|
|
3
|
-
describe Mongoid::
|
|
6
|
+
describe Mongoid::Association::Nested::Many do
|
|
4
7
|
|
|
5
|
-
let(:
|
|
6
|
-
|
|
7
|
-
name: :addresses,
|
|
8
|
-
relation: Mongoid::Relations::Embedded::Many
|
|
9
|
-
)
|
|
8
|
+
let(:association) do
|
|
9
|
+
Person.relations['addresses']
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
let(:person) do
|
|
@@ -18,7 +18,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
18
18
|
context "when the option is provided" do
|
|
19
19
|
|
|
20
20
|
let(:builder) do
|
|
21
|
-
described_class.new(
|
|
21
|
+
described_class.new(association, {}, allow_destroy: true)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
it "returns the option" do
|
|
@@ -29,7 +29,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
29
29
|
context "when the option is not provided" do
|
|
30
30
|
|
|
31
31
|
let(:builder) do
|
|
32
|
-
described_class.new(
|
|
32
|
+
described_class.new(association, {}, {})
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
it "returns false" do
|
|
@@ -51,7 +51,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
51
51
|
context "when attributes are over limit" do
|
|
52
52
|
|
|
53
53
|
let(:builder) do
|
|
54
|
-
described_class.new(
|
|
54
|
+
described_class.new(association, attributes, limit: 2)
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
it "raises an error" do
|
|
@@ -65,7 +65,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
65
65
|
|
|
66
66
|
let(:builder) do
|
|
67
67
|
described_class.new(
|
|
68
|
-
|
|
68
|
+
association,
|
|
69
69
|
attributes,
|
|
70
70
|
reject_if: ->(attrs){ attrs[:city].blank? }
|
|
71
71
|
)
|
|
@@ -85,7 +85,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
85
85
|
|
|
86
86
|
let(:builder) do
|
|
87
87
|
described_class.new(
|
|
88
|
-
|
|
88
|
+
association,
|
|
89
89
|
attributes,
|
|
90
90
|
reject_if: :reject_if_city_is_empty
|
|
91
91
|
)
|
|
@@ -112,7 +112,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
let(:builder) do
|
|
115
|
-
described_class.new(
|
|
115
|
+
described_class.new(association, attributes)
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
before do
|
|
@@ -131,7 +131,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
131
131
|
end
|
|
132
132
|
|
|
133
133
|
let(:builder) do
|
|
134
|
-
described_class.new(
|
|
134
|
+
described_class.new(association, attributes)
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
before do
|
|
@@ -155,7 +155,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
155
155
|
end
|
|
156
156
|
|
|
157
157
|
let(:builder) do
|
|
158
|
-
described_class.new(
|
|
158
|
+
described_class.new(association, attributes, {})
|
|
159
159
|
end
|
|
160
160
|
|
|
161
161
|
it "sorts the attributes" do
|
|
@@ -174,7 +174,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
174
174
|
context "when the proc matches" do
|
|
175
175
|
|
|
176
176
|
let(:builder) do
|
|
177
|
-
described_class.new(
|
|
177
|
+
described_class.new(association, {}, options)
|
|
178
178
|
end
|
|
179
179
|
|
|
180
180
|
it "returns true" do
|
|
@@ -185,7 +185,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
185
185
|
context "when the proc does not match" do
|
|
186
186
|
|
|
187
187
|
let(:builder) do
|
|
188
|
-
described_class.new(
|
|
188
|
+
described_class.new(association, {}, options)
|
|
189
189
|
end
|
|
190
190
|
|
|
191
191
|
it "returns false" do
|
|
@@ -197,7 +197,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
197
197
|
context "when the proc is not provided" do
|
|
198
198
|
|
|
199
199
|
let(:builder) do
|
|
200
|
-
described_class.new(
|
|
200
|
+
described_class.new(association, {}, {})
|
|
201
201
|
end
|
|
202
202
|
|
|
203
203
|
it "returns false" do
|
|
@@ -211,7 +211,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
211
211
|
context "when the option is provided" do
|
|
212
212
|
|
|
213
213
|
let(:builder) do
|
|
214
|
-
described_class.new(
|
|
214
|
+
described_class.new(association, {}, update_only: true)
|
|
215
215
|
end
|
|
216
216
|
|
|
217
217
|
it "returns the option" do
|
|
@@ -222,7 +222,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
|
|
|
222
222
|
context "when the option is not provided" do
|
|
223
223
|
|
|
224
224
|
let(:builder) do
|
|
225
|
-
described_class.new(
|
|
225
|
+
described_class.new(association, {}, {})
|
|
226
226
|
end
|
|
227
227
|
|
|
228
228
|
it "returns false" do
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
1
4
|
require "spec_helper"
|
|
2
5
|
|
|
3
|
-
describe Mongoid::
|
|
6
|
+
describe Mongoid::Association::Nested::One do
|
|
4
7
|
|
|
5
|
-
let(:
|
|
6
|
-
|
|
7
|
-
name: :name,
|
|
8
|
-
relation: Mongoid::Relations::Embedded::One
|
|
9
|
-
)
|
|
8
|
+
let(:association) do
|
|
9
|
+
Person.relations['name']
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
describe "#allow_destroy?" do
|
|
@@ -14,7 +14,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
14
14
|
context "when the option is provided" do
|
|
15
15
|
|
|
16
16
|
let(:builder) do
|
|
17
|
-
described_class.new(
|
|
17
|
+
described_class.new(association, {}, allow_destroy: true)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
it "returns the option" do
|
|
@@ -25,7 +25,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
25
25
|
context "when the option is not provided" do
|
|
26
26
|
|
|
27
27
|
let(:builder) do
|
|
28
|
-
described_class.new(
|
|
28
|
+
described_class.new(association, {}, {})
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
it "returns false" do
|
|
@@ -47,7 +47,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
let(:builder) do
|
|
50
|
-
described_class.new(
|
|
50
|
+
described_class.new(association, { last_name: "Lang" }, options)
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
before do
|
|
@@ -66,7 +66,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
let(:builder) do
|
|
69
|
-
described_class.new(
|
|
69
|
+
described_class.new(association, { last_name: "Lang" }, options)
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
before do
|
|
@@ -91,7 +91,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
let(:builder) do
|
|
94
|
-
described_class.new(
|
|
94
|
+
described_class.new(association, {
|
|
95
95
|
_id: name.id,
|
|
96
96
|
last_name: "Lang"
|
|
97
97
|
}, options)
|
|
@@ -113,7 +113,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
113
113
|
end
|
|
114
114
|
|
|
115
115
|
let(:builder) do
|
|
116
|
-
described_class.new(
|
|
116
|
+
described_class.new(association, {
|
|
117
117
|
last_name: "Lang"
|
|
118
118
|
}, options)
|
|
119
119
|
end
|
|
@@ -138,7 +138,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
138
138
|
end
|
|
139
139
|
|
|
140
140
|
let(:builder) do
|
|
141
|
-
described_class.new(
|
|
141
|
+
described_class.new(association, {
|
|
142
142
|
id: name.id,
|
|
143
143
|
last_name: "Lang",
|
|
144
144
|
_destroy: true
|
|
@@ -160,7 +160,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
160
160
|
context "when the attribute exists" do
|
|
161
161
|
|
|
162
162
|
let(:builder) do
|
|
163
|
-
described_class.new(
|
|
163
|
+
described_class.new(association, { _destroy: true }, {})
|
|
164
164
|
end
|
|
165
165
|
|
|
166
166
|
it "returns the value" do
|
|
@@ -171,7 +171,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
171
171
|
context "when the attribute does not exist" do
|
|
172
172
|
|
|
173
173
|
let(:builder) do
|
|
174
|
-
described_class.new(
|
|
174
|
+
described_class.new(association, {}, {})
|
|
175
175
|
end
|
|
176
176
|
|
|
177
177
|
it "returns nil" do
|
|
@@ -191,7 +191,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
191
191
|
context "when the proc matches" do
|
|
192
192
|
|
|
193
193
|
let(:builder) do
|
|
194
|
-
described_class.new(
|
|
194
|
+
described_class.new(association, {}, options)
|
|
195
195
|
end
|
|
196
196
|
|
|
197
197
|
it "returns true" do
|
|
@@ -202,7 +202,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
202
202
|
context "when the proc does not match" do
|
|
203
203
|
|
|
204
204
|
let(:builder) do
|
|
205
|
-
described_class.new(
|
|
205
|
+
described_class.new(association, {}, options)
|
|
206
206
|
end
|
|
207
207
|
|
|
208
208
|
it "returns false" do
|
|
@@ -214,7 +214,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
214
214
|
context "when the proc is not provided" do
|
|
215
215
|
|
|
216
216
|
let(:builder) do
|
|
217
|
-
described_class.new(
|
|
217
|
+
described_class.new(association, {}, {})
|
|
218
218
|
end
|
|
219
219
|
|
|
220
220
|
it "returns false" do
|
|
@@ -228,7 +228,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
228
228
|
context "when the option is provided" do
|
|
229
229
|
|
|
230
230
|
let(:builder) do
|
|
231
|
-
described_class.new(
|
|
231
|
+
described_class.new(association, {}, update_only: true)
|
|
232
232
|
end
|
|
233
233
|
|
|
234
234
|
it "returns the option" do
|
|
@@ -239,7 +239,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
|
|
|
239
239
|
context "when the option is not provided" do
|
|
240
240
|
|
|
241
241
|
let(:builder) do
|
|
242
|
-
described_class.new(
|
|
242
|
+
described_class.new(association, {}, {})
|
|
243
243
|
end
|
|
244
244
|
|
|
245
245
|
it "returns false" do
|
|
@@ -0,0 +1,1324 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
require "spec_helper"
|
|
5
|
+
|
|
6
|
+
describe Mongoid::Association::Options do
|
|
7
|
+
|
|
8
|
+
STORES_FOREIGN_KEY =
|
|
9
|
+
[
|
|
10
|
+
Mongoid::Association::Referenced::HasAndBelongsToMany,
|
|
11
|
+
Mongoid::Association::Referenced::BelongsTo
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
[
|
|
15
|
+
Mongoid::Association::Embedded::EmbeddedIn,
|
|
16
|
+
Mongoid::Association::Embedded::EmbedsMany,
|
|
17
|
+
Mongoid::Association::Embedded::EmbedsOne,
|
|
18
|
+
Mongoid::Association::Referenced::BelongsTo,
|
|
19
|
+
Mongoid::Association::Referenced::HasMany,
|
|
20
|
+
Mongoid::Association::Referenced::HasOne,
|
|
21
|
+
Mongoid::Association::Referenced::HasAndBelongsToMany
|
|
22
|
+
].each do |association_class|
|
|
23
|
+
|
|
24
|
+
context "when the association type is #{association_class}" do
|
|
25
|
+
|
|
26
|
+
let(:class_left) do
|
|
27
|
+
class ClassLeft; include Mongoid::Document; end
|
|
28
|
+
ClassLeft
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
let(:class_right) do
|
|
32
|
+
class ClassRight; include Mongoid::Document; end
|
|
33
|
+
ClassRight
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
let(:association) do
|
|
37
|
+
association_class.new(class_left, :name, options)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
let(:options) do
|
|
41
|
+
{}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe 'the :as option' do
|
|
45
|
+
|
|
46
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:as) do
|
|
47
|
+
|
|
48
|
+
context 'when :as is in the options' do
|
|
49
|
+
|
|
50
|
+
let(:options) do
|
|
51
|
+
{
|
|
52
|
+
as: :nameable
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'returns the :as value' do
|
|
57
|
+
expect(association.as).to eq(:nameable)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context 'when :as is not in the options' do
|
|
62
|
+
|
|
63
|
+
it 'returns nil' do
|
|
64
|
+
expect(association.as).to be_nil
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:as) do
|
|
70
|
+
|
|
71
|
+
it 'returns nil' do
|
|
72
|
+
expect(association.as).to be_nil
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context 'when the option is provided' do
|
|
76
|
+
|
|
77
|
+
let(:options) do
|
|
78
|
+
{
|
|
79
|
+
as: :nameable
|
|
80
|
+
}
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
84
|
+
expect {
|
|
85
|
+
association
|
|
86
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
describe '#autobuilding?' do
|
|
93
|
+
|
|
94
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:autobuild) do
|
|
95
|
+
|
|
96
|
+
context 'when :autobuild is in the options' do
|
|
97
|
+
|
|
98
|
+
context 'when :autobuild is true' do
|
|
99
|
+
|
|
100
|
+
let(:options) do
|
|
101
|
+
{
|
|
102
|
+
autobuild: true
|
|
103
|
+
}
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it 'returns true' do
|
|
107
|
+
expect(association.autobuilding?).to be(true)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context 'when :autobuild is false' do
|
|
112
|
+
|
|
113
|
+
let(:options) do
|
|
114
|
+
{
|
|
115
|
+
autobuild: false
|
|
116
|
+
}
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it 'returns false' do
|
|
120
|
+
expect(association.autobuilding?).to be(false)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context 'when :autobuild is nil' do
|
|
125
|
+
|
|
126
|
+
let(:options) do
|
|
127
|
+
{
|
|
128
|
+
autobuild: nil
|
|
129
|
+
}
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'returns false' do
|
|
133
|
+
expect(association.autobuilding?).to be(false)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context 'when :autobuild is not in the options' do
|
|
139
|
+
|
|
140
|
+
it 'returns false' do
|
|
141
|
+
expect(association.autobuilding?).to be(false)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:autobuild) do
|
|
147
|
+
|
|
148
|
+
it 'returns false' do
|
|
149
|
+
expect(association.autobuilding?).to be(false)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
context 'when the option is provided' do
|
|
153
|
+
|
|
154
|
+
let(:options) do
|
|
155
|
+
{
|
|
156
|
+
autobuild: false
|
|
157
|
+
}
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
161
|
+
expect {
|
|
162
|
+
association
|
|
163
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
describe '#autosave?' do
|
|
170
|
+
|
|
171
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:autosave) do
|
|
172
|
+
|
|
173
|
+
context 'when :autosave is in the options' do
|
|
174
|
+
|
|
175
|
+
context 'when :autosave is true' do
|
|
176
|
+
|
|
177
|
+
let(:options) do
|
|
178
|
+
{
|
|
179
|
+
autosave: true
|
|
180
|
+
}
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it 'returns true' do
|
|
184
|
+
expect(association.autosave?).to be(true)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
context 'when :autosave is false' do
|
|
189
|
+
|
|
190
|
+
let(:options) do
|
|
191
|
+
{
|
|
192
|
+
autosave: false
|
|
193
|
+
}
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it 'returns false' do
|
|
197
|
+
expect(association.autosave?).to be(false)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context 'when :autosave is nil' do
|
|
202
|
+
|
|
203
|
+
let(:options) do
|
|
204
|
+
{
|
|
205
|
+
autosave: nil
|
|
206
|
+
}
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it 'returns false' do
|
|
210
|
+
expect(association.autosave?).to be(false)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
context 'when :autosave is not in the options' do
|
|
216
|
+
|
|
217
|
+
it 'returns false' do
|
|
218
|
+
expect(association.autosave?).to be(false)
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:autosave) do
|
|
224
|
+
|
|
225
|
+
it 'returns false' do
|
|
226
|
+
expect(association.autosave?).to be(false)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
context 'when the option is provided' do
|
|
230
|
+
|
|
231
|
+
let(:options) do
|
|
232
|
+
{
|
|
233
|
+
autosave: false
|
|
234
|
+
}
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
238
|
+
expect {
|
|
239
|
+
association
|
|
240
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
describe 'the :dependent option' do
|
|
247
|
+
|
|
248
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:dependent) do
|
|
249
|
+
|
|
250
|
+
context 'when :dependent is in the options' do
|
|
251
|
+
|
|
252
|
+
let(:options) do
|
|
253
|
+
{
|
|
254
|
+
dependent: :delete_all
|
|
255
|
+
}
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
it 'returns the :dependent value' do
|
|
259
|
+
expect(association.dependent).to eq(options[:dependent])
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
context 'when :dependent is not in the options' do
|
|
264
|
+
|
|
265
|
+
it 'returns nil' do
|
|
266
|
+
expect(association.dependent).to be_nil
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:dependent) do
|
|
272
|
+
|
|
273
|
+
it 'returns nil' do
|
|
274
|
+
expect(association.dependent).to be_nil
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
context 'when the option is provided' do
|
|
278
|
+
|
|
279
|
+
let(:options) do
|
|
280
|
+
{
|
|
281
|
+
dependent: :delete_all
|
|
282
|
+
}
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
286
|
+
expect {
|
|
287
|
+
association
|
|
288
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
describe 'the :foreign_key option' do
|
|
295
|
+
|
|
296
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:foreign_key) do
|
|
297
|
+
|
|
298
|
+
context 'when the :foreign_key option is specified' do
|
|
299
|
+
|
|
300
|
+
let(:options) do
|
|
301
|
+
{
|
|
302
|
+
foreign_key: :some_field
|
|
303
|
+
}
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
it 'returns the foreign_key as a String' do
|
|
307
|
+
expect(association.foreign_key).to eq(options[:foreign_key].to_s)
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
context 'when the association stores the foreign key', if: association_class::VALID_OPTIONS.include?(:foreign_key) &&
|
|
312
|
+
STORES_FOREIGN_KEY.include?(association_class) do
|
|
313
|
+
|
|
314
|
+
context 'when :foreign_key option is not specified' do
|
|
315
|
+
|
|
316
|
+
it 'returns the name followed by the foreign_key_suffix' do
|
|
317
|
+
expect(association.foreign_key).to eq("name#{association.class::FOREIGN_KEY_SUFFIX}")
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
context 'when the association does not store the foreign key', if: association_class::VALID_OPTIONS.include?(:foreign_key) &&
|
|
323
|
+
!STORES_FOREIGN_KEY.include?(association_class) do
|
|
324
|
+
|
|
325
|
+
context 'when :foreign_key option is not specified' do
|
|
326
|
+
|
|
327
|
+
before do
|
|
328
|
+
allow(association).to receive(:inverse).and_return(:other)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it 'returns the inverse name followed by the foreign_key_suffix' do
|
|
332
|
+
expect(association.foreign_key).to eq("other#{association.class::FOREIGN_KEY_SUFFIX}")
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:foreign_key) do
|
|
339
|
+
|
|
340
|
+
it 'returns nil' do
|
|
341
|
+
expect(association.dependent).to be_nil
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
context 'when the option is provided' do
|
|
345
|
+
|
|
346
|
+
let(:options) do
|
|
347
|
+
{
|
|
348
|
+
foreign_key: :some_field
|
|
349
|
+
}
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
353
|
+
expect {
|
|
354
|
+
association
|
|
355
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
describe 'the :primary_key option' do
|
|
362
|
+
|
|
363
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:primary_key) do
|
|
364
|
+
|
|
365
|
+
context 'when the option is specified' do
|
|
366
|
+
|
|
367
|
+
let(:options) do
|
|
368
|
+
{
|
|
369
|
+
primary_key: :other_id
|
|
370
|
+
}
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
it 'returns the primary_key from the options as a String' do
|
|
374
|
+
expect(association.primary_key).to eq(options[:primary_key].to_s)
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
context 'when the option is not specified' do
|
|
379
|
+
|
|
380
|
+
it 'returns the default primary key' do
|
|
381
|
+
expect(association.primary_key).to eq(Mongoid::Association::Relatable::PRIMARY_KEY_DEFAULT)
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:primary_key) do
|
|
387
|
+
|
|
388
|
+
it 'returns nil' do
|
|
389
|
+
expect(association.primary_key).to be_nil
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
context 'when the option is provided' do
|
|
393
|
+
|
|
394
|
+
let(:options) do
|
|
395
|
+
{
|
|
396
|
+
primary_key: :other_id
|
|
397
|
+
}
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
401
|
+
expect {
|
|
402
|
+
association
|
|
403
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
describe 'the :after_add option' do
|
|
410
|
+
|
|
411
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:after_add) do
|
|
412
|
+
|
|
413
|
+
context 'when the :after_add option is specified' do
|
|
414
|
+
|
|
415
|
+
let(:options) do
|
|
416
|
+
{
|
|
417
|
+
after_add: :method_name
|
|
418
|
+
}
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
it 'retrieves the after_add method name from the association' do
|
|
422
|
+
expect(association.get_callbacks(:after_add)).to eq(Array(options[:after_add]))
|
|
423
|
+
end
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
context 'when the :after_add option is not specified' do
|
|
427
|
+
|
|
428
|
+
it 'returns nil' do
|
|
429
|
+
expect(association.get_callbacks(:after_add)).to be_empty
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:after_add) do
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
it 'returns nil' do
|
|
438
|
+
expect(association.get_callbacks(:after_add)).to be_empty
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
context 'when the option is provided' do
|
|
442
|
+
|
|
443
|
+
let(:options) do
|
|
444
|
+
{
|
|
445
|
+
after_add: :method_name
|
|
446
|
+
}
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
450
|
+
expect {
|
|
451
|
+
association
|
|
452
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
describe 'the :after_remove option' do
|
|
459
|
+
|
|
460
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:after_remove) do
|
|
461
|
+
|
|
462
|
+
context 'when the :after_remove option is specified' do
|
|
463
|
+
|
|
464
|
+
let(:options) do
|
|
465
|
+
{
|
|
466
|
+
after_remove: :method_name
|
|
467
|
+
}
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
it 'retrieves the after_remove method name from the association' do
|
|
471
|
+
expect(association.get_callbacks(:after_remove)).to eq(Array(options[:after_remove]))
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
context 'when the :after_remove option is not specified' do
|
|
476
|
+
|
|
477
|
+
it 'returns nil' do
|
|
478
|
+
expect(association.get_callbacks(:after_remove)).to be_empty
|
|
479
|
+
end
|
|
480
|
+
end
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:after_remove) do
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
it 'returns nil' do
|
|
487
|
+
expect(association.get_callbacks(:after_remove)).to be_empty
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
context 'when the option is provided' do
|
|
491
|
+
|
|
492
|
+
let(:options) do
|
|
493
|
+
{
|
|
494
|
+
after_remove: :method_name
|
|
495
|
+
}
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
499
|
+
expect {
|
|
500
|
+
association
|
|
501
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
502
|
+
end
|
|
503
|
+
end
|
|
504
|
+
end
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
describe 'the :before_add option' do
|
|
508
|
+
|
|
509
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:before_add) do
|
|
510
|
+
|
|
511
|
+
context 'when the :before_add option is specified' do
|
|
512
|
+
|
|
513
|
+
let(:options) do
|
|
514
|
+
{
|
|
515
|
+
before_add: :method_name
|
|
516
|
+
}
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
it 'retrieves the before_add method name from the association' do
|
|
520
|
+
expect(association.get_callbacks(:before_add)).to eq(Array(options[:before_add]))
|
|
521
|
+
end
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
context 'when the :before_add option is not specified' do
|
|
525
|
+
|
|
526
|
+
it 'returns nil' do
|
|
527
|
+
expect(association.get_callbacks(:before_add)).to be_empty
|
|
528
|
+
end
|
|
529
|
+
end
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:before_add) do
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
it 'returns nil' do
|
|
536
|
+
expect(association.get_callbacks(:before_add)).to be_empty
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
context 'when the option is provided' do
|
|
540
|
+
|
|
541
|
+
let(:options) do
|
|
542
|
+
{
|
|
543
|
+
before_add: :method_name
|
|
544
|
+
}
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
548
|
+
expect {
|
|
549
|
+
association
|
|
550
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
end
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
describe 'the :before_remove option' do
|
|
557
|
+
|
|
558
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:before_remove) do
|
|
559
|
+
|
|
560
|
+
context 'when the :before_remove option is specified' do
|
|
561
|
+
|
|
562
|
+
let(:options) do
|
|
563
|
+
{
|
|
564
|
+
before_remove: :method_name
|
|
565
|
+
}
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
it 'retrieves the before_remove method name from the association' do
|
|
569
|
+
expect(association.get_callbacks(:before_remove)).to eq(Array(options[:before_remove]))
|
|
570
|
+
end
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
context 'when the :before_remove option is not specified' do
|
|
574
|
+
|
|
575
|
+
it 'returns nil' do
|
|
576
|
+
expect(association.get_callbacks(:before_remove)).to be_empty
|
|
577
|
+
end
|
|
578
|
+
end
|
|
579
|
+
end
|
|
580
|
+
|
|
581
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:before_remove) do
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
it 'returns nil' do
|
|
585
|
+
expect(association.get_callbacks(:before_remove)).to be_empty
|
|
586
|
+
end
|
|
587
|
+
|
|
588
|
+
context 'when the option is provided' do
|
|
589
|
+
|
|
590
|
+
let(:options) do
|
|
591
|
+
{
|
|
592
|
+
before_remove: :method_name
|
|
593
|
+
}
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
597
|
+
expect {
|
|
598
|
+
association
|
|
599
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
600
|
+
end
|
|
601
|
+
end
|
|
602
|
+
end
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
describe '#indexed?' do
|
|
607
|
+
|
|
608
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:index) do
|
|
609
|
+
|
|
610
|
+
context 'when :index is in the options' do
|
|
611
|
+
|
|
612
|
+
context 'when :index is true' do
|
|
613
|
+
|
|
614
|
+
let(:options) do
|
|
615
|
+
{
|
|
616
|
+
index: true
|
|
617
|
+
}
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
it 'returns true' do
|
|
621
|
+
expect(association.indexed?).to be(true)
|
|
622
|
+
end
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
context 'when :index is false' do
|
|
626
|
+
|
|
627
|
+
let(:options) do
|
|
628
|
+
{
|
|
629
|
+
index: false
|
|
630
|
+
}
|
|
631
|
+
end
|
|
632
|
+
|
|
633
|
+
it 'returns false' do
|
|
634
|
+
expect(association.indexed?).to be(false)
|
|
635
|
+
end
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
context 'when :index is nil' do
|
|
639
|
+
|
|
640
|
+
let(:options) do
|
|
641
|
+
{
|
|
642
|
+
index: nil
|
|
643
|
+
}
|
|
644
|
+
end
|
|
645
|
+
|
|
646
|
+
it 'returns false' do
|
|
647
|
+
expect(association.indexed?).to be(false)
|
|
648
|
+
end
|
|
649
|
+
end
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
context 'when :index is not in the options' do
|
|
653
|
+
|
|
654
|
+
it 'returns false' do
|
|
655
|
+
expect(association.indexed?).to be(false)
|
|
656
|
+
end
|
|
657
|
+
end
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:index) do
|
|
661
|
+
|
|
662
|
+
it 'returns false' do
|
|
663
|
+
expect(association.indexed?).to be(false)
|
|
664
|
+
end
|
|
665
|
+
|
|
666
|
+
context 'when the option is provided' do
|
|
667
|
+
|
|
668
|
+
let(:options) do
|
|
669
|
+
{
|
|
670
|
+
index: true
|
|
671
|
+
}
|
|
672
|
+
end
|
|
673
|
+
|
|
674
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
675
|
+
expect {
|
|
676
|
+
association
|
|
677
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
678
|
+
end
|
|
679
|
+
end
|
|
680
|
+
end
|
|
681
|
+
end
|
|
682
|
+
|
|
683
|
+
describe 'the :order option' do
|
|
684
|
+
|
|
685
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:order) do
|
|
686
|
+
|
|
687
|
+
context 'when :order is in the options' do
|
|
688
|
+
|
|
689
|
+
let(:options) do
|
|
690
|
+
{
|
|
691
|
+
order: :rating.desc
|
|
692
|
+
}
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
it 'returns a Mongoid::Criteria::Queryable::Key' do
|
|
696
|
+
expect(association.order).to be_a(Mongoid::Criteria::Queryable::Key)
|
|
697
|
+
end
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
context 'when :order is not in the options' do
|
|
701
|
+
|
|
702
|
+
it 'returns nil' do
|
|
703
|
+
expect(association.order).to be_nil
|
|
704
|
+
end
|
|
705
|
+
end
|
|
706
|
+
end
|
|
707
|
+
|
|
708
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:order) do
|
|
709
|
+
|
|
710
|
+
it 'returns nil' do
|
|
711
|
+
expect(association.order).to be_nil
|
|
712
|
+
end
|
|
713
|
+
|
|
714
|
+
context 'when the option is provided' do
|
|
715
|
+
|
|
716
|
+
let(:options) do
|
|
717
|
+
{
|
|
718
|
+
order: :rating.desc
|
|
719
|
+
}
|
|
720
|
+
end
|
|
721
|
+
|
|
722
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
723
|
+
expect {
|
|
724
|
+
association
|
|
725
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
726
|
+
end
|
|
727
|
+
end
|
|
728
|
+
end
|
|
729
|
+
end
|
|
730
|
+
|
|
731
|
+
describe '#polymorphic' do
|
|
732
|
+
|
|
733
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:polymorphic) do
|
|
734
|
+
|
|
735
|
+
context 'when :polymorphic is in the options' do
|
|
736
|
+
|
|
737
|
+
context 'when :polymorphic is true' do
|
|
738
|
+
|
|
739
|
+
let(:options) do
|
|
740
|
+
{
|
|
741
|
+
polymorphic: true
|
|
742
|
+
}
|
|
743
|
+
end
|
|
744
|
+
|
|
745
|
+
it 'returns true' do
|
|
746
|
+
expect(association.polymorphic?).to be(true)
|
|
747
|
+
end
|
|
748
|
+
end
|
|
749
|
+
|
|
750
|
+
context 'when :polymorphic is false' do
|
|
751
|
+
|
|
752
|
+
let(:options) do
|
|
753
|
+
{
|
|
754
|
+
polymorphic: false
|
|
755
|
+
}
|
|
756
|
+
end
|
|
757
|
+
|
|
758
|
+
it 'returns false' do
|
|
759
|
+
expect(association.polymorphic?).to be(false)
|
|
760
|
+
end
|
|
761
|
+
end
|
|
762
|
+
|
|
763
|
+
context 'when :polymorphic is nil' do
|
|
764
|
+
|
|
765
|
+
let(:options) do
|
|
766
|
+
{
|
|
767
|
+
polymorphic: nil
|
|
768
|
+
}
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
it 'returns false' do
|
|
772
|
+
expect(association.polymorphic?).to be(false)
|
|
773
|
+
end
|
|
774
|
+
end
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
context 'when :polymorphic is not in the options' do
|
|
778
|
+
|
|
779
|
+
it 'returns false' do
|
|
780
|
+
expect(association.polymorphic?).to be(false)
|
|
781
|
+
end
|
|
782
|
+
end
|
|
783
|
+
end
|
|
784
|
+
|
|
785
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:polymorphic) do
|
|
786
|
+
|
|
787
|
+
it 'returns false' do
|
|
788
|
+
expect(association.polymorphic?).to be(false)
|
|
789
|
+
end
|
|
790
|
+
|
|
791
|
+
context 'when the option is provided' do
|
|
792
|
+
|
|
793
|
+
let(:options) do
|
|
794
|
+
{
|
|
795
|
+
polymorphic: true
|
|
796
|
+
}
|
|
797
|
+
end
|
|
798
|
+
|
|
799
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
800
|
+
expect {
|
|
801
|
+
association
|
|
802
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
803
|
+
end
|
|
804
|
+
end
|
|
805
|
+
end
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
describe '#cascading_callbacks?' do
|
|
809
|
+
|
|
810
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:cascade_callbacks) do
|
|
811
|
+
|
|
812
|
+
context 'when :cascade_callbacks is in the options' do
|
|
813
|
+
|
|
814
|
+
context 'when :cascade_callbacks is true' do
|
|
815
|
+
|
|
816
|
+
let(:options) do
|
|
817
|
+
{
|
|
818
|
+
cascade_callbacks: true
|
|
819
|
+
}
|
|
820
|
+
end
|
|
821
|
+
|
|
822
|
+
it 'returns true' do
|
|
823
|
+
expect(association.cascading_callbacks?).to be(true)
|
|
824
|
+
end
|
|
825
|
+
end
|
|
826
|
+
|
|
827
|
+
context 'when :cascade_callbacks is false' do
|
|
828
|
+
|
|
829
|
+
let(:options) do
|
|
830
|
+
{
|
|
831
|
+
cascade_callbacks: false
|
|
832
|
+
}
|
|
833
|
+
end
|
|
834
|
+
|
|
835
|
+
it 'returns false' do
|
|
836
|
+
expect(association.cascading_callbacks?).to be(false)
|
|
837
|
+
end
|
|
838
|
+
end
|
|
839
|
+
|
|
840
|
+
context 'when :cascade_callbacks is nil' do
|
|
841
|
+
|
|
842
|
+
let(:options) do
|
|
843
|
+
{
|
|
844
|
+
cascade_callbacks: nil
|
|
845
|
+
}
|
|
846
|
+
end
|
|
847
|
+
|
|
848
|
+
it 'returns false' do
|
|
849
|
+
expect(association.cascading_callbacks?).to be(false)
|
|
850
|
+
end
|
|
851
|
+
end
|
|
852
|
+
end
|
|
853
|
+
|
|
854
|
+
context 'when :cascade_callbacks is not in the options' do
|
|
855
|
+
|
|
856
|
+
it 'returns false' do
|
|
857
|
+
expect(association.cascading_callbacks?).to be(false)
|
|
858
|
+
end
|
|
859
|
+
end
|
|
860
|
+
end
|
|
861
|
+
|
|
862
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:cascade_callbacks) do
|
|
863
|
+
|
|
864
|
+
it 'returns false' do
|
|
865
|
+
expect(association.cascading_callbacks?).to be(false)
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
context 'when the option is provided' do
|
|
869
|
+
|
|
870
|
+
let(:options) do
|
|
871
|
+
{
|
|
872
|
+
cascade_callbacks: true
|
|
873
|
+
}
|
|
874
|
+
end
|
|
875
|
+
|
|
876
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
877
|
+
expect {
|
|
878
|
+
association
|
|
879
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
880
|
+
end
|
|
881
|
+
end
|
|
882
|
+
end
|
|
883
|
+
end
|
|
884
|
+
|
|
885
|
+
describe '#cyclic?' do
|
|
886
|
+
|
|
887
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:cyclic) do
|
|
888
|
+
|
|
889
|
+
context 'when :cyclic is in the options' do
|
|
890
|
+
|
|
891
|
+
context 'when :cyclic is true' do
|
|
892
|
+
|
|
893
|
+
let(:options) do
|
|
894
|
+
{
|
|
895
|
+
cyclic: true
|
|
896
|
+
}
|
|
897
|
+
end
|
|
898
|
+
|
|
899
|
+
it 'returns true' do
|
|
900
|
+
expect(association.cyclic?).to be(true)
|
|
901
|
+
end
|
|
902
|
+
end
|
|
903
|
+
|
|
904
|
+
context 'when :cyclic is false' do
|
|
905
|
+
|
|
906
|
+
let(:options) do
|
|
907
|
+
{
|
|
908
|
+
cyclic: false
|
|
909
|
+
}
|
|
910
|
+
end
|
|
911
|
+
|
|
912
|
+
it 'returns false' do
|
|
913
|
+
expect(association.cyclic?).to be(false)
|
|
914
|
+
end
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
context 'when :cyclic is nil' do
|
|
918
|
+
|
|
919
|
+
let(:options) do
|
|
920
|
+
{
|
|
921
|
+
cyclic: nil
|
|
922
|
+
}
|
|
923
|
+
end
|
|
924
|
+
|
|
925
|
+
it 'returns false' do
|
|
926
|
+
expect(association.cyclic?).to be(false)
|
|
927
|
+
end
|
|
928
|
+
end
|
|
929
|
+
end
|
|
930
|
+
|
|
931
|
+
context 'when :cyclic is not in the options' do
|
|
932
|
+
|
|
933
|
+
it 'returns false' do
|
|
934
|
+
expect(association.cyclic?).to be(false)
|
|
935
|
+
end
|
|
936
|
+
end
|
|
937
|
+
end
|
|
938
|
+
|
|
939
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:cyclic) do
|
|
940
|
+
|
|
941
|
+
it 'returns false' do
|
|
942
|
+
expect(association.cyclic?).to be(false)
|
|
943
|
+
end
|
|
944
|
+
|
|
945
|
+
context 'when the option is provided' do
|
|
946
|
+
|
|
947
|
+
let(:options) do
|
|
948
|
+
{
|
|
949
|
+
cyclic: true
|
|
950
|
+
}
|
|
951
|
+
end
|
|
952
|
+
|
|
953
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
954
|
+
expect {
|
|
955
|
+
association
|
|
956
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
957
|
+
end
|
|
958
|
+
end
|
|
959
|
+
end
|
|
960
|
+
end
|
|
961
|
+
|
|
962
|
+
describe 'the :store_as option' do
|
|
963
|
+
|
|
964
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:store_as) do
|
|
965
|
+
|
|
966
|
+
context 'when :store_as is in the options' do
|
|
967
|
+
|
|
968
|
+
let(:options) do
|
|
969
|
+
{
|
|
970
|
+
store_as: :another_name
|
|
971
|
+
}
|
|
972
|
+
end
|
|
973
|
+
|
|
974
|
+
it 'returns the :store_as value' do
|
|
975
|
+
expect(association.store_as).to eq(options[:store_as].to_s)
|
|
976
|
+
end
|
|
977
|
+
end
|
|
978
|
+
|
|
979
|
+
context 'when :store_as is not in the options' do
|
|
980
|
+
|
|
981
|
+
it 'returns the name as a string' do
|
|
982
|
+
expect(association.store_as).to eq("name")
|
|
983
|
+
end
|
|
984
|
+
end
|
|
985
|
+
end
|
|
986
|
+
|
|
987
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:store_as) do
|
|
988
|
+
|
|
989
|
+
it 'returns nil' do
|
|
990
|
+
expect(association.store_as).to be_nil
|
|
991
|
+
end
|
|
992
|
+
|
|
993
|
+
context 'when the option is provided' do
|
|
994
|
+
|
|
995
|
+
let(:options) do
|
|
996
|
+
{
|
|
997
|
+
store_as: :another_name
|
|
998
|
+
}
|
|
999
|
+
end
|
|
1000
|
+
|
|
1001
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
1002
|
+
expect {
|
|
1003
|
+
association
|
|
1004
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
1005
|
+
end
|
|
1006
|
+
end
|
|
1007
|
+
end
|
|
1008
|
+
end
|
|
1009
|
+
|
|
1010
|
+
describe 'the :class_name option' do
|
|
1011
|
+
|
|
1012
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:class_name) do
|
|
1013
|
+
|
|
1014
|
+
context 'when :class_name is in the options' do
|
|
1015
|
+
|
|
1016
|
+
let(:options) do
|
|
1017
|
+
{
|
|
1018
|
+
class_name: :a_class
|
|
1019
|
+
}
|
|
1020
|
+
end
|
|
1021
|
+
|
|
1022
|
+
it 'returns the :class_name value' do
|
|
1023
|
+
expect(association.class_name).to eq(:a_class)
|
|
1024
|
+
end
|
|
1025
|
+
end
|
|
1026
|
+
|
|
1027
|
+
context 'when :class_name is not in the options' do
|
|
1028
|
+
|
|
1029
|
+
it 'returns the name deduced from the association name' do
|
|
1030
|
+
expect(association.class_name).to eq(ActiveSupport::Inflector.classify(:name))
|
|
1031
|
+
end
|
|
1032
|
+
end
|
|
1033
|
+
end
|
|
1034
|
+
|
|
1035
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:class_name) do
|
|
1036
|
+
|
|
1037
|
+
it 'returns the name deduced from the association name' do
|
|
1038
|
+
expect(association.class_name).to eq(ActiveSupport::Inflector.classify(:name))
|
|
1039
|
+
end
|
|
1040
|
+
|
|
1041
|
+
context 'when the option is provided' do
|
|
1042
|
+
|
|
1043
|
+
let(:options) do
|
|
1044
|
+
{
|
|
1045
|
+
class_name: :a_class
|
|
1046
|
+
}
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
it 'should support the option' do
|
|
1050
|
+
fail('All association types should support this option')
|
|
1051
|
+
end
|
|
1052
|
+
end
|
|
1053
|
+
end
|
|
1054
|
+
end
|
|
1055
|
+
|
|
1056
|
+
describe '#counter_cached?' do
|
|
1057
|
+
|
|
1058
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:counter_cache) do
|
|
1059
|
+
|
|
1060
|
+
context 'when :counter_cache is in the options' do
|
|
1061
|
+
|
|
1062
|
+
context 'when :counter_cache is true' do
|
|
1063
|
+
|
|
1064
|
+
let(:options) do
|
|
1065
|
+
{
|
|
1066
|
+
counter_cache: true
|
|
1067
|
+
}
|
|
1068
|
+
end
|
|
1069
|
+
|
|
1070
|
+
it 'returns true' do
|
|
1071
|
+
expect(association.counter_cached?).to be(true)
|
|
1072
|
+
end
|
|
1073
|
+
end
|
|
1074
|
+
|
|
1075
|
+
context 'when :counter_cache is false' do
|
|
1076
|
+
|
|
1077
|
+
let(:options) do
|
|
1078
|
+
{
|
|
1079
|
+
counter_cache: false
|
|
1080
|
+
}
|
|
1081
|
+
end
|
|
1082
|
+
|
|
1083
|
+
it 'returns false' do
|
|
1084
|
+
expect(association.counter_cached?).to be(false)
|
|
1085
|
+
end
|
|
1086
|
+
end
|
|
1087
|
+
|
|
1088
|
+
context 'when :counter_cache is nil' do
|
|
1089
|
+
|
|
1090
|
+
let(:options) do
|
|
1091
|
+
{
|
|
1092
|
+
counter_cache: nil
|
|
1093
|
+
}
|
|
1094
|
+
end
|
|
1095
|
+
|
|
1096
|
+
it 'returns false' do
|
|
1097
|
+
expect(association.counter_cached?).to be(false)
|
|
1098
|
+
end
|
|
1099
|
+
end
|
|
1100
|
+
end
|
|
1101
|
+
|
|
1102
|
+
context 'when :counter_cache is not in the options' do
|
|
1103
|
+
|
|
1104
|
+
it 'returns false' do
|
|
1105
|
+
expect(association.counter_cached?).to be(false)
|
|
1106
|
+
end
|
|
1107
|
+
end
|
|
1108
|
+
end
|
|
1109
|
+
|
|
1110
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:counter_cache) do
|
|
1111
|
+
|
|
1112
|
+
it 'returns false' do
|
|
1113
|
+
expect(association.counter_cached?).to be(false)
|
|
1114
|
+
end
|
|
1115
|
+
|
|
1116
|
+
context 'when the option is provided' do
|
|
1117
|
+
|
|
1118
|
+
let(:options) do
|
|
1119
|
+
{
|
|
1120
|
+
counter_cache: :column_name
|
|
1121
|
+
}
|
|
1122
|
+
end
|
|
1123
|
+
|
|
1124
|
+
it 'raises a Mongoid::Errors::InvalidRelationOption error' do
|
|
1125
|
+
expect {
|
|
1126
|
+
association
|
|
1127
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelationOption)
|
|
1128
|
+
end
|
|
1129
|
+
end
|
|
1130
|
+
end
|
|
1131
|
+
end
|
|
1132
|
+
|
|
1133
|
+
describe '#extension' do
|
|
1134
|
+
|
|
1135
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:extend) do
|
|
1136
|
+
|
|
1137
|
+
context 'when a block is passed' do
|
|
1138
|
+
|
|
1139
|
+
let!(:association) do
|
|
1140
|
+
association_class.new(class_left, :name, options) do; end
|
|
1141
|
+
end
|
|
1142
|
+
|
|
1143
|
+
after do
|
|
1144
|
+
Object.send(:remove_const, :ClassLeft)
|
|
1145
|
+
end
|
|
1146
|
+
|
|
1147
|
+
it 'defines an extension module' do
|
|
1148
|
+
expect(ClassLeft::ClassLeftNameRelationExtension).to be_a(Module)
|
|
1149
|
+
end
|
|
1150
|
+
|
|
1151
|
+
it 'returns the extension' do
|
|
1152
|
+
expect(association.extension).to eq(ClassLeft::ClassLeftNameRelationExtension)
|
|
1153
|
+
end
|
|
1154
|
+
end
|
|
1155
|
+
|
|
1156
|
+
context 'when a module name is passed' do
|
|
1157
|
+
|
|
1158
|
+
before do
|
|
1159
|
+
class ClassLeft; end
|
|
1160
|
+
module ClassLeft::Handle; end
|
|
1161
|
+
end
|
|
1162
|
+
|
|
1163
|
+
let(:options) do
|
|
1164
|
+
{
|
|
1165
|
+
extend: ClassLeft::Handle
|
|
1166
|
+
}
|
|
1167
|
+
end
|
|
1168
|
+
|
|
1169
|
+
let!(:association) do
|
|
1170
|
+
association_class.new(class_left, :name, options)
|
|
1171
|
+
end
|
|
1172
|
+
|
|
1173
|
+
it 'returns the extension' do
|
|
1174
|
+
expect(association.extension).to eq(ClassLeft::Handle)
|
|
1175
|
+
end
|
|
1176
|
+
end
|
|
1177
|
+
|
|
1178
|
+
context 'when a block is not passed' do
|
|
1179
|
+
|
|
1180
|
+
it 'does not define an extension module' do
|
|
1181
|
+
expect(defined?(ClassLeft::ClassLeftNameRelationExtension)).to be_nil
|
|
1182
|
+
end
|
|
1183
|
+
|
|
1184
|
+
it 'returns nil' do
|
|
1185
|
+
expect(association.extension).to be_nil
|
|
1186
|
+
end
|
|
1187
|
+
end
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
end
|
|
1191
|
+
|
|
1192
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:extend) do
|
|
1193
|
+
|
|
1194
|
+
it 'should support the option' do
|
|
1195
|
+
fail('All association types should support this option')
|
|
1196
|
+
end
|
|
1197
|
+
end
|
|
1198
|
+
end
|
|
1199
|
+
|
|
1200
|
+
describe 'the :inverse_of option' do
|
|
1201
|
+
|
|
1202
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:inverse_of) do
|
|
1203
|
+
|
|
1204
|
+
context 'when :inverse_of is in the options' do
|
|
1205
|
+
|
|
1206
|
+
let(:options) do
|
|
1207
|
+
{
|
|
1208
|
+
inverse_of: :inverse_name
|
|
1209
|
+
}
|
|
1210
|
+
end
|
|
1211
|
+
|
|
1212
|
+
it 'returns the :inverse_of value' do
|
|
1213
|
+
expect(association.inverse_of).to eq(:inverse_name)
|
|
1214
|
+
end
|
|
1215
|
+
end
|
|
1216
|
+
|
|
1217
|
+
context 'when :inverse_of is not in the options' do
|
|
1218
|
+
|
|
1219
|
+
it 'returns nil' do
|
|
1220
|
+
expect(association.inverse_of).to be_nil
|
|
1221
|
+
end
|
|
1222
|
+
end
|
|
1223
|
+
end
|
|
1224
|
+
|
|
1225
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:inverse_of) do
|
|
1226
|
+
|
|
1227
|
+
it 'returns nil' do
|
|
1228
|
+
expect(association.inverse_of).to be_nil
|
|
1229
|
+
end
|
|
1230
|
+
|
|
1231
|
+
|
|
1232
|
+
context 'when the option is provided' do
|
|
1233
|
+
|
|
1234
|
+
let(:options) do
|
|
1235
|
+
{
|
|
1236
|
+
inverse_of: :inverse_name
|
|
1237
|
+
}
|
|
1238
|
+
end
|
|
1239
|
+
|
|
1240
|
+
it 'should support the option' do
|
|
1241
|
+
fail('All association types should support this option')
|
|
1242
|
+
end
|
|
1243
|
+
end
|
|
1244
|
+
end
|
|
1245
|
+
end
|
|
1246
|
+
|
|
1247
|
+
describe '#validate?' do
|
|
1248
|
+
|
|
1249
|
+
context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:validate) do
|
|
1250
|
+
|
|
1251
|
+
context 'when :validate is in the options' do
|
|
1252
|
+
|
|
1253
|
+
context 'when :validate is true' do
|
|
1254
|
+
|
|
1255
|
+
let(:options) do
|
|
1256
|
+
{
|
|
1257
|
+
validate: true
|
|
1258
|
+
}
|
|
1259
|
+
end
|
|
1260
|
+
|
|
1261
|
+
it 'returns true' do
|
|
1262
|
+
expect(association.send(:validate?)).to be(true)
|
|
1263
|
+
end
|
|
1264
|
+
end
|
|
1265
|
+
|
|
1266
|
+
context 'when :validate is false' do
|
|
1267
|
+
|
|
1268
|
+
let(:options) do
|
|
1269
|
+
{
|
|
1270
|
+
validate: false
|
|
1271
|
+
}
|
|
1272
|
+
end
|
|
1273
|
+
|
|
1274
|
+
it 'returns false' do
|
|
1275
|
+
expect(association.send(:validate?)).to be(false)
|
|
1276
|
+
end
|
|
1277
|
+
end
|
|
1278
|
+
|
|
1279
|
+
context 'when :validate is nil' do
|
|
1280
|
+
|
|
1281
|
+
let(:options) do
|
|
1282
|
+
{
|
|
1283
|
+
validate: nil
|
|
1284
|
+
}
|
|
1285
|
+
end
|
|
1286
|
+
|
|
1287
|
+
it 'returns the validation default' do
|
|
1288
|
+
expect(association.send(:validate?)).to be(association.validation_default)
|
|
1289
|
+
end
|
|
1290
|
+
end
|
|
1291
|
+
end
|
|
1292
|
+
|
|
1293
|
+
context 'when :validate is not in the options' do
|
|
1294
|
+
|
|
1295
|
+
it 'returns the validation default' do
|
|
1296
|
+
expect(association.send(:validate?)).to be(association.validation_default)
|
|
1297
|
+
end
|
|
1298
|
+
end
|
|
1299
|
+
end
|
|
1300
|
+
|
|
1301
|
+
context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:validate) do
|
|
1302
|
+
|
|
1303
|
+
it 'returns false' do
|
|
1304
|
+
expect(association.send(:validate?)).to be(false)
|
|
1305
|
+
end
|
|
1306
|
+
|
|
1307
|
+
|
|
1308
|
+
context 'when the option is provided' do
|
|
1309
|
+
|
|
1310
|
+
let(:options) do
|
|
1311
|
+
{
|
|
1312
|
+
validate: true
|
|
1313
|
+
}
|
|
1314
|
+
end
|
|
1315
|
+
|
|
1316
|
+
it 'should support the option' do
|
|
1317
|
+
fail('All association types should support this option')
|
|
1318
|
+
end
|
|
1319
|
+
end
|
|
1320
|
+
end
|
|
1321
|
+
end
|
|
1322
|
+
end
|
|
1323
|
+
end
|
|
1324
|
+
end
|