mongoid_rails4 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3213 -0
- data/LICENSE +20 -0
- data/README.md +62 -0
- data/Rakefile +35 -0
- data/lib/config/locales/en.yml +448 -0
- data/lib/mongoid.rb +104 -0
- data/lib/mongoid/atomic.rb +384 -0
- data/lib/mongoid/atomic/modifiers.rb +317 -0
- data/lib/mongoid/atomic/paths.rb +3 -0
- data/lib/mongoid/atomic/paths/embedded.rb +28 -0
- data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
- data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
- data/lib/mongoid/atomic/paths/root.rb +39 -0
- data/lib/mongoid/attributes.rb +284 -0
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +147 -0
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/changeable.rb +379 -0
- data/lib/mongoid/composable.rb +104 -0
- data/lib/mongoid/config.rb +263 -0
- data/lib/mongoid/config/environment.rb +44 -0
- data/lib/mongoid/config/options.rb +74 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +54 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
- data/lib/mongoid/contextual/atomic.rb +180 -0
- data/lib/mongoid/contextual/command.rb +61 -0
- data/lib/mongoid/contextual/eager.rb +158 -0
- data/lib/mongoid/contextual/find_and_modify.rb +69 -0
- data/lib/mongoid/contextual/geo_near.rb +238 -0
- data/lib/mongoid/contextual/map_reduce.rb +324 -0
- data/lib/mongoid/contextual/memory.rb +440 -0
- data/lib/mongoid/contextual/mongo.rb +676 -0
- data/lib/mongoid/contextual/queryable.rb +25 -0
- data/lib/mongoid/contextual/text_search.rb +180 -0
- data/lib/mongoid/copyable.rb +67 -0
- data/lib/mongoid/criteria.rb +562 -0
- data/lib/mongoid/criteria/findable.rb +179 -0
- data/lib/mongoid/criteria/inspectable.rb +25 -0
- data/lib/mongoid/criteria/marshalable.rb +50 -0
- data/lib/mongoid/criteria/modifiable.rb +189 -0
- data/lib/mongoid/criteria/scopable.rb +158 -0
- data/lib/mongoid/document.rb +361 -0
- data/lib/mongoid/equality.rb +66 -0
- data/lib/mongoid/errors.rb +40 -0
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +25 -0
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +111 -0
- data/lib/mongoid/errors/eager_load.rb +22 -0
- data/lib/mongoid/errors/invalid_collection.rb +18 -0
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_field.rb +64 -0
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +19 -0
- data/lib/mongoid/errors/invalid_includes.rb +32 -0
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +28 -0
- data/lib/mongoid/errors/invalid_path.rb +21 -0
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +22 -0
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +32 -0
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +92 -0
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +19 -0
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_metadata.rb +21 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +21 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +19 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/validations.rb +29 -0
- data/lib/mongoid/evolvable.rb +19 -0
- data/lib/mongoid/extensions.rb +35 -0
- data/lib/mongoid/extensions/array.rb +180 -0
- data/lib/mongoid/extensions/big_decimal.rb +69 -0
- data/lib/mongoid/extensions/boolean.rb +21 -0
- data/lib/mongoid/extensions/date.rb +77 -0
- data/lib/mongoid/extensions/date_time.rb +73 -0
- data/lib/mongoid/extensions/false_class.rb +38 -0
- data/lib/mongoid/extensions/float.rb +56 -0
- data/lib/mongoid/extensions/hash.rb +209 -0
- data/lib/mongoid/extensions/integer.rb +67 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +33 -0
- data/lib/mongoid/extensions/object.rb +274 -0
- data/lib/mongoid/extensions/object_id.rb +54 -0
- data/lib/mongoid/extensions/range.rb +79 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +199 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +88 -0
- data/lib/mongoid/extensions/time_with_zone.rb +56 -0
- data/lib/mongoid/extensions/true_class.rb +38 -0
- data/lib/mongoid/factory.rb +46 -0
- data/lib/mongoid/fields.rb +542 -0
- data/lib/mongoid/fields/foreign_key.rb +174 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +273 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +92 -0
- data/lib/mongoid/findable.rb +133 -0
- data/lib/mongoid/identity_map.rb +163 -0
- data/lib/mongoid/indexable.rb +147 -0
- data/lib/mongoid/indexable/specification.rb +115 -0
- data/lib/mongoid/indexable/validators/options.rb +103 -0
- data/lib/mongoid/inspectable.rb +59 -0
- data/lib/mongoid/interceptable.rb +265 -0
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/matchable/all.rb +27 -0
- data/lib/mongoid/matchable/and.rb +30 -0
- data/lib/mongoid/matchable/default.rb +72 -0
- data/lib/mongoid/matchable/exists.rb +23 -0
- data/lib/mongoid/matchable/gt.rb +21 -0
- data/lib/mongoid/matchable/gte.rb +21 -0
- data/lib/mongoid/matchable/in.rb +24 -0
- data/lib/mongoid/matchable/lt.rb +21 -0
- data/lib/mongoid/matchable/lte.rb +21 -0
- data/lib/mongoid/matchable/ne.rb +21 -0
- data/lib/mongoid/matchable/nin.rb +21 -0
- data/lib/mongoid/matchable/or.rb +33 -0
- data/lib/mongoid/matchable/size.rb +21 -0
- data/lib/mongoid/persistable.rb +207 -0
- data/lib/mongoid/persistable/creatable.rb +189 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +55 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +151 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/railtie.rb +156 -0
- data/lib/mongoid/railties/database.rake +97 -0
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/relations.rb +162 -0
- data/lib/mongoid/relations/accessors.rb +299 -0
- data/lib/mongoid/relations/auto_save.rb +106 -0
- data/lib/mongoid/relations/binding.rb +218 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
- data/lib/mongoid/relations/builder.rb +57 -0
- data/lib/mongoid/relations/builders.rb +104 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
- data/lib/mongoid/relations/cascading.rb +56 -0
- data/lib/mongoid/relations/cascading/delete.rb +44 -0
- data/lib/mongoid/relations/cascading/destroy.rb +43 -0
- data/lib/mongoid/relations/cascading/nullify.rb +35 -0
- data/lib/mongoid/relations/cascading/restrict.rb +39 -0
- data/lib/mongoid/relations/constraint.rb +49 -0
- data/lib/mongoid/relations/conversions.rb +34 -0
- data/lib/mongoid/relations/counter_cache.rb +105 -0
- data/lib/mongoid/relations/cyclic.rb +107 -0
- data/lib/mongoid/relations/embedded/batchable.rb +355 -0
- data/lib/mongoid/relations/embedded/in.rb +231 -0
- data/lib/mongoid/relations/embedded/many.rb +639 -0
- data/lib/mongoid/relations/embedded/one.rb +223 -0
- data/lib/mongoid/relations/macros.rb +356 -0
- data/lib/mongoid/relations/many.rb +208 -0
- data/lib/mongoid/relations/marshalable.rb +32 -0
- data/lib/mongoid/relations/metadata.rb +1174 -0
- data/lib/mongoid/relations/nested_builder.rb +74 -0
- data/lib/mongoid/relations/one.rb +48 -0
- data/lib/mongoid/relations/options.rb +48 -0
- data/lib/mongoid/relations/polymorphic.rb +39 -0
- data/lib/mongoid/relations/proxy.rb +270 -0
- data/lib/mongoid/relations/referenced/in.rb +297 -0
- data/lib/mongoid/relations/referenced/many.rb +787 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
- data/lib/mongoid/relations/referenced/one.rb +290 -0
- data/lib/mongoid/relations/reflections.rb +62 -0
- data/lib/mongoid/relations/synchronization.rb +169 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +473 -0
- data/lib/mongoid/relations/touchable.rb +94 -0
- data/lib/mongoid/reloadable.rb +95 -0
- data/lib/mongoid/scopable.rb +379 -0
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/serializable.rb +170 -0
- data/lib/mongoid/sessions.rb +330 -0
- data/lib/mongoid/sessions/factory.rb +129 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/options.rb +141 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/shardable.rb +65 -0
- data/lib/mongoid/state.rb +97 -0
- data/lib/mongoid/threaded.rb +383 -0
- data/lib/mongoid/threaded/lifecycle.rb +164 -0
- data/lib/mongoid/timestamps.rb +15 -0
- data/lib/mongoid/timestamps/created.rb +30 -0
- data/lib/mongoid/timestamps/created/short.rb +19 -0
- data/lib/mongoid/timestamps/short.rb +10 -0
- data/lib/mongoid/timestamps/updated.rb +39 -0
- data/lib/mongoid/timestamps/updated/short.rb +19 -0
- data/lib/mongoid/traversable.rb +192 -0
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validatable.rb +180 -0
- data/lib/mongoid/validatable/associated.rb +48 -0
- data/lib/mongoid/validatable/format.rb +20 -0
- data/lib/mongoid/validatable/length.rb +20 -0
- data/lib/mongoid/validatable/localizable.rb +30 -0
- data/lib/mongoid/validatable/macros.rb +94 -0
- data/lib/mongoid/validatable/presence.rb +86 -0
- data/lib/mongoid/validatable/queryable.rb +30 -0
- data/lib/mongoid/validatable/uniqueness.rb +330 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
- data/lib/rails/generators/mongoid_generator.rb +65 -0
- data/lib/rails/mongoid.rb +180 -0
- data/lib/support/ruby_version.rb +26 -0
- data/spec/app/models/account.rb +28 -0
- data/spec/app/models/acolyte.rb +17 -0
- data/spec/app/models/actor.rb +18 -0
- data/spec/app/models/actress.rb +2 -0
- data/spec/app/models/address.rb +77 -0
- data/spec/app/models/address_component.rb +5 -0
- data/spec/app/models/address_number.rb +6 -0
- data/spec/app/models/agency.rb +5 -0
- data/spec/app/models/agent.rb +12 -0
- data/spec/app/models/album.rb +14 -0
- data/spec/app/models/alert.rb +5 -0
- data/spec/app/models/animal.rb +25 -0
- data/spec/app/models/answer.rb +4 -0
- data/spec/app/models/appointment.rb +7 -0
- data/spec/app/models/article.rb +10 -0
- data/spec/app/models/artist.rb +66 -0
- data/spec/app/models/artwork.rb +4 -0
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/augmentation.rb +11 -0
- data/spec/app/models/author.rb +4 -0
- data/spec/app/models/band.rb +26 -0
- data/spec/app/models/bar.rb +10 -0
- data/spec/app/models/basic.rb +6 -0
- data/spec/app/models/bed.rb +1 -0
- data/spec/app/models/big_palette.rb +2 -0
- data/spec/app/models/birthday.rb +13 -0
- data/spec/app/models/book.rb +13 -0
- data/spec/app/models/breed.rb +4 -0
- data/spec/app/models/browser.rb +6 -0
- data/spec/app/models/building.rb +5 -0
- data/spec/app/models/building_address.rb +5 -0
- data/spec/app/models/bus.rb +7 -0
- data/spec/app/models/business.rb +5 -0
- data/spec/app/models/callback_recorder.rb +25 -0
- data/spec/app/models/callback_test.rb +9 -0
- data/spec/app/models/canvas.rb +25 -0
- data/spec/app/models/car.rb +1 -0
- data/spec/app/models/cat.rb +8 -0
- data/spec/app/models/category.rb +8 -0
- data/spec/app/models/child.rb +4 -0
- data/spec/app/models/child_doc.rb +22 -0
- data/spec/app/models/church.rb +4 -0
- data/spec/app/models/circle.rb +3 -0
- data/spec/app/models/circuit.rb +4 -0
- data/spec/app/models/circus.rb +7 -0
- data/spec/app/models/code.rb +5 -0
- data/spec/app/models/comment.rb +16 -0
- data/spec/app/models/contractor.rb +5 -0
- data/spec/app/models/cookie.rb +6 -0
- data/spec/app/models/country_code.rb +8 -0
- data/spec/app/models/definition.rb +7 -0
- data/spec/app/models/description.rb +11 -0
- data/spec/app/models/dictionary.rb +10 -0
- data/spec/app/models/division.rb +10 -0
- data/spec/app/models/doctor.rb +12 -0
- data/spec/app/models/dog.rb +7 -0
- data/spec/app/models/dokument.rb +5 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/driver.rb +7 -0
- data/spec/app/models/drug.rb +6 -0
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/email.rb +6 -0
- data/spec/app/models/employer.rb +5 -0
- data/spec/app/models/entry.rb +6 -0
- data/spec/app/models/eraser.rb +1 -0
- data/spec/app/models/event.rb +22 -0
- data/spec/app/models/exhibition.rb +4 -0
- data/spec/app/models/exhibitor.rb +5 -0
- data/spec/app/models/eye.rb +9 -0
- data/spec/app/models/eye_bowl.rb +9 -0
- data/spec/app/models/face.rb +8 -0
- data/spec/app/models/favorite.rb +6 -0
- data/spec/app/models/filesystem.rb +5 -0
- data/spec/app/models/fire_hydrant.rb +6 -0
- data/spec/app/models/firefox.rb +4 -0
- data/spec/app/models/fish.rb +7 -0
- data/spec/app/models/folder.rb +7 -0
- data/spec/app/models/folder_item.rb +9 -0
- data/spec/app/models/fruits.rb +28 -0
- data/spec/app/models/game.rb +19 -0
- data/spec/app/models/ghost.rb +7 -0
- data/spec/app/models/home.rb +4 -0
- data/spec/app/models/house.rb +6 -0
- data/spec/app/models/html_writer.rb +3 -0
- data/spec/app/models/image.rb +22 -0
- data/spec/app/models/implant.rb +16 -0
- data/spec/app/models/item.rb +8 -0
- data/spec/app/models/jar.rb +7 -0
- data/spec/app/models/label.rb +40 -0
- data/spec/app/models/language.rb +5 -0
- data/spec/app/models/lat_lng.rb +15 -0
- data/spec/app/models/league.rb +11 -0
- data/spec/app/models/learner.rb +2 -0
- data/spec/app/models/line_item.rb +6 -0
- data/spec/app/models/location.rb +8 -0
- data/spec/app/models/login.rb +8 -0
- data/spec/app/models/manufacturer.rb +7 -0
- data/spec/app/models/meat.rb +4 -0
- data/spec/app/models/membership.rb +4 -0
- data/spec/app/models/mixed_drink.rb +4 -0
- data/spec/app/models/movie.rb +13 -0
- data/spec/app/models/my_hash.rb +2 -0
- data/spec/app/models/name.rb +23 -0
- data/spec/app/models/node.rb +5 -0
- data/spec/app/models/note.rb +12 -0
- data/spec/app/models/ordered_post.rb +6 -0
- data/spec/app/models/ordered_preference.rb +6 -0
- data/spec/app/models/oscar.rb +15 -0
- data/spec/app/models/override.rb +16 -0
- data/spec/app/models/ownable.rb +6 -0
- data/spec/app/models/owner.rb +6 -0
- data/spec/app/models/pack.rb +3 -0
- data/spec/app/models/page.rb +5 -0
- data/spec/app/models/page_question.rb +4 -0
- data/spec/app/models/palette.rb +7 -0
- data/spec/app/models/parent.rb +5 -0
- data/spec/app/models/parent_doc.rb +6 -0
- data/spec/app/models/passport.rb +5 -0
- data/spec/app/models/patient.rb +9 -0
- data/spec/app/models/pdf_writer.rb +3 -0
- data/spec/app/models/pencil.rb +1 -0
- data/spec/app/models/person.rb +205 -0
- data/spec/app/models/pet.rb +23 -0
- data/spec/app/models/pet_owner.rb +6 -0
- data/spec/app/models/phone.rb +11 -0
- data/spec/app/models/pizza.rb +7 -0
- data/spec/app/models/player.rb +35 -0
- data/spec/app/models/post.rb +44 -0
- data/spec/app/models/powerup.rb +11 -0
- data/spec/app/models/preference.rb +9 -0
- data/spec/app/models/princess.rb +8 -0
- data/spec/app/models/product.rb +15 -0
- data/spec/app/models/profile.rb +5 -0
- data/spec/app/models/pronunciation.rb +5 -0
- data/spec/app/models/purchase.rb +4 -0
- data/spec/app/models/question.rb +8 -0
- data/spec/app/models/quiz.rb +7 -0
- data/spec/app/models/rating.rb +8 -0
- data/spec/app/models/record.rb +46 -0
- data/spec/app/models/registry.rb +4 -0
- data/spec/app/models/role.rb +7 -0
- data/spec/app/models/root_category.rb +4 -0
- data/spec/app/models/sandwich.rb +4 -0
- data/spec/app/models/scheduler.rb +7 -0
- data/spec/app/models/seo.rb +7 -0
- data/spec/app/models/series.rb +4 -0
- data/spec/app/models/server.rb +13 -0
- data/spec/app/models/service.rb +22 -0
- data/spec/app/models/shape.rb +12 -0
- data/spec/app/models/shelf.rb +5 -0
- data/spec/app/models/shipping_container.rb +5 -0
- data/spec/app/models/shipping_pack.rb +3 -0
- data/spec/app/models/shop.rb +6 -0
- data/spec/app/models/short_agent.rb +4 -0
- data/spec/app/models/short_quiz.rb +5 -0
- data/spec/app/models/slave.rb +6 -0
- data/spec/app/models/song.rb +8 -0
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/square.rb +4 -0
- data/spec/app/models/strategy.rb +3 -0
- data/spec/app/models/sub_item.rb +3 -0
- data/spec/app/models/subscription.rb +4 -0
- data/spec/app/models/survey.rb +5 -0
- data/spec/app/models/symptom.rb +6 -0
- data/spec/app/models/tag.rb +8 -0
- data/spec/app/models/target.rb +5 -0
- data/spec/app/models/template.rb +5 -0
- data/spec/app/models/thing.rb +9 -0
- data/spec/app/models/title.rb +3 -0
- data/spec/app/models/tool.rb +8 -0
- data/spec/app/models/topping.rb +5 -0
- data/spec/app/models/track.rb +38 -0
- data/spec/app/models/translation.rb +5 -0
- data/spec/app/models/tree.rb +9 -0
- data/spec/app/models/truck.rb +3 -0
- data/spec/app/models/user.rb +21 -0
- data/spec/app/models/user_account.rb +10 -0
- data/spec/app/models/validation_callback.rb +10 -0
- data/spec/app/models/vehicle.rb +11 -0
- data/spec/app/models/version.rb +5 -0
- data/spec/app/models/vet_visit.rb +5 -0
- data/spec/app/models/video.rb +13 -0
- data/spec/app/models/weapon.rb +11 -0
- data/spec/app/models/wiki_page.rb +14 -0
- data/spec/app/models/word.rb +15 -0
- data/spec/app/models/word_origin.rb +11 -0
- data/spec/app/models/writer.rb +11 -0
- data/spec/config/mongoid.yml +38 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
- data/spec/mongoid/atomic/paths_spec.rb +270 -0
- data/spec/mongoid/atomic_spec.rb +365 -0
- data/spec/mongoid/attributes/nested_spec.rb +4832 -0
- data/spec/mongoid/attributes/readonly_spec.rb +169 -0
- data/spec/mongoid/attributes_spec.rb +1412 -0
- data/spec/mongoid/changeable_spec.rb +1507 -0
- data/spec/mongoid/composable_spec.rb +24 -0
- data/spec/mongoid/config/environment_spec.rb +83 -0
- data/spec/mongoid/config/options_spec.rb +56 -0
- data/spec/mongoid/config_spec.rb +318 -0
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
- data/spec/mongoid/contextual/atomic_spec.rb +529 -0
- data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
- data/spec/mongoid/contextual/memory_spec.rb +1236 -0
- data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
- data/spec/mongoid/contextual/text_search_spec.rb +207 -0
- data/spec/mongoid/copyable_spec.rb +393 -0
- data/spec/mongoid/criteria/findable_spec.rb +1189 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
- data/spec/mongoid/criteria/scopable_spec.rb +391 -0
- data/spec/mongoid/criteria_spec.rb +3821 -0
- data/spec/mongoid/document_spec.rb +1205 -0
- data/spec/mongoid/equality_spec.rb +241 -0
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
- data/spec/mongoid/errors/callback_spec.rb +29 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
- data/spec/mongoid/errors/eager_load_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
- data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
- data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
- data/spec/mongoid/errors/no_environment_spec.rb +29 -0
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
- data/spec/mongoid/errors/no_parent_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
- data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
- data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
- data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
- data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
- data/spec/mongoid/errors/validations_spec.rb +45 -0
- data/spec/mongoid/extensions/array_spec.rb +638 -0
- data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
- data/spec/mongoid/extensions/binary_spec.rb +60 -0
- data/spec/mongoid/extensions/boolean_spec.rb +135 -0
- data/spec/mongoid/extensions/date_spec.rb +235 -0
- data/spec/mongoid/extensions/date_time_spec.rb +155 -0
- data/spec/mongoid/extensions/false_class_spec.rb +42 -0
- data/spec/mongoid/extensions/float_spec.rb +133 -0
- data/spec/mongoid/extensions/hash_spec.rb +333 -0
- data/spec/mongoid/extensions/integer_spec.rb +136 -0
- data/spec/mongoid/extensions/module_spec.rb +42 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
- data/spec/mongoid/extensions/object_id_spec.rb +946 -0
- data/spec/mongoid/extensions/object_spec.rb +292 -0
- data/spec/mongoid/extensions/range_spec.rb +105 -0
- data/spec/mongoid/extensions/regexp_spec.rb +47 -0
- data/spec/mongoid/extensions/set_spec.rb +33 -0
- data/spec/mongoid/extensions/string_spec.rb +357 -0
- data/spec/mongoid/extensions/symbol_spec.rb +76 -0
- data/spec/mongoid/extensions/time_spec.rb +467 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
- data/spec/mongoid/extensions/true_class_spec.rb +42 -0
- data/spec/mongoid/extensions_spec.rb +15 -0
- data/spec/mongoid/factory_spec.rb +185 -0
- data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
- data/spec/mongoid/fields/localized_spec.rb +386 -0
- data/spec/mongoid/fields/standard_spec.rb +166 -0
- data/spec/mongoid/fields_spec.rb +1229 -0
- data/spec/mongoid/findable_spec.rb +342 -0
- data/spec/mongoid/identity_map_spec.rb +564 -0
- data/spec/mongoid/indexable/specification_spec.rb +87 -0
- data/spec/mongoid/indexable_spec.rb +504 -0
- data/spec/mongoid/inspectable_spec.rb +49 -0
- data/spec/mongoid/interceptable_spec.rb +1564 -0
- data/spec/mongoid/loggable_spec.rb +21 -0
- data/spec/mongoid/matchable/all_spec.rb +31 -0
- data/spec/mongoid/matchable/and_spec.rb +162 -0
- data/spec/mongoid/matchable/default_spec.rb +130 -0
- data/spec/mongoid/matchable/exists_spec.rb +57 -0
- data/spec/mongoid/matchable/gt_spec.rb +75 -0
- data/spec/mongoid/matchable/gte_spec.rb +74 -0
- data/spec/mongoid/matchable/in_spec.rb +25 -0
- data/spec/mongoid/matchable/lt_spec.rb +74 -0
- data/spec/mongoid/matchable/lte_spec.rb +74 -0
- data/spec/mongoid/matchable/ne_spec.rb +25 -0
- data/spec/mongoid/matchable/nin_spec.rb +25 -0
- data/spec/mongoid/matchable/or_spec.rb +106 -0
- data/spec/mongoid/matchable/size_spec.rb +25 -0
- data/spec/mongoid/matchable_spec.rb +532 -0
- data/spec/mongoid/persistable/creatable_spec.rb +512 -0
- data/spec/mongoid/persistable/deletable_spec.rb +205 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +432 -0
- data/spec/mongoid/persistable/settable_spec.rb +139 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +522 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/positional_spec.rb +227 -0
- data/spec/mongoid/railties/document_spec.rb +24 -0
- data/spec/mongoid/relations/accessors_spec.rb +736 -0
- data/spec/mongoid/relations/auto_save_spec.rb +261 -0
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
- data/spec/mongoid/relations/builders_spec.rb +226 -0
- data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
- data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
- data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
- data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
- data/spec/mongoid/relations/cascading_spec.rb +355 -0
- data/spec/mongoid/relations/constraint_spec.rb +74 -0
- data/spec/mongoid/relations/conversions_spec.rb +126 -0
- data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
- data/spec/mongoid/relations/cyclic_spec.rb +156 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
- data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
- data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
- data/spec/mongoid/relations/macros_spec.rb +613 -0
- data/spec/mongoid/relations/metadata_spec.rb +1917 -0
- data/spec/mongoid/relations/options_spec.rb +35 -0
- data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
- data/spec/mongoid/relations/proxy_spec.rb +48 -0
- data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
- data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
- data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
- data/spec/mongoid/relations/reflections_spec.rb +101 -0
- data/spec/mongoid/relations/synchronization_spec.rb +449 -0
- data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
- data/spec/mongoid/relations/touchable_spec.rb +296 -0
- data/spec/mongoid/relations_spec.rb +188 -0
- data/spec/mongoid/reloadable_spec.rb +305 -0
- data/spec/mongoid/scopable_spec.rb +926 -0
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/serializable_spec.rb +862 -0
- data/spec/mongoid/sessions/factory_spec.rb +312 -0
- data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
- data/spec/mongoid/sessions/options_spec.rb +71 -0
- data/spec/mongoid/sessions_spec.rb +1078 -0
- data/spec/mongoid/shardable_spec.rb +61 -0
- data/spec/mongoid/state_spec.rb +102 -0
- data/spec/mongoid/threaded_spec.rb +258 -0
- data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
- data/spec/mongoid/timestamps/created_spec.rb +44 -0
- data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
- data/spec/mongoid/timestamps/updated_spec.rb +86 -0
- data/spec/mongoid/timestamps_spec.rb +112 -0
- data/spec/mongoid/traversable_spec.rb +244 -0
- data/spec/mongoid/unit_of_work_spec.rb +196 -0
- data/spec/mongoid/validatable/associated_spec.rb +183 -0
- data/spec/mongoid/validatable/format_spec.rb +83 -0
- data/spec/mongoid/validatable/length_spec.rb +119 -0
- data/spec/mongoid/validatable/numericality_spec.rb +30 -0
- data/spec/mongoid/validatable/presence_spec.rb +511 -0
- data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
- data/spec/mongoid/validatable_spec.rb +309 -0
- data/spec/mongoid_spec.rb +74 -0
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
- data/spec/rails/mongoid_spec.rb +462 -0
- data/spec/spec_helper.rb +103 -0
- metadata +1159 -0
@@ -0,0 +1,1289 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Relations::Referenced::One do
|
4
|
+
|
5
|
+
describe "#=" do
|
6
|
+
|
7
|
+
context "when the relationship is an illegal embedded reference" do
|
8
|
+
|
9
|
+
let(:game) do
|
10
|
+
Game.new
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:video) do
|
14
|
+
Video.new
|
15
|
+
end
|
16
|
+
|
17
|
+
it "raises a mixed relation error" do
|
18
|
+
expect {
|
19
|
+
game.video = video
|
20
|
+
}.to raise_error(Mongoid::Errors::MixedRelations)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when the relation is cyclic" do
|
25
|
+
|
26
|
+
let(:user) do
|
27
|
+
User.new
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:role) do
|
31
|
+
Role.new
|
32
|
+
end
|
33
|
+
|
34
|
+
before do
|
35
|
+
user.role = role
|
36
|
+
end
|
37
|
+
|
38
|
+
it "does not raise an error" do
|
39
|
+
expect(user.role).to eq(role)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when the relation is not polymorphic" do
|
44
|
+
|
45
|
+
context "when the parent is a new record" do
|
46
|
+
|
47
|
+
let(:person) do
|
48
|
+
Person.new
|
49
|
+
end
|
50
|
+
|
51
|
+
let(:game) do
|
52
|
+
Game.new
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:metadata) do
|
56
|
+
Game.relations["person"]
|
57
|
+
end
|
58
|
+
|
59
|
+
before do
|
60
|
+
metadata.should_receive(:criteria).never
|
61
|
+
person.game = game
|
62
|
+
end
|
63
|
+
|
64
|
+
it "sets the target of the relation" do
|
65
|
+
expect(person.game.target).to eq(game)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "sets the foreign key on the relation" do
|
69
|
+
expect(game.person_id).to eq(person.id)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "sets the base on the inverse relation" do
|
73
|
+
expect(game.person).to eq(person)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "sets the same instance on the inverse relation" do
|
77
|
+
expect(game.person).to eql(person)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "does not save the target" do
|
81
|
+
expect(game).to_not be_persisted
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "when the parent is not a new record" do
|
86
|
+
|
87
|
+
let(:person) do
|
88
|
+
Person.create
|
89
|
+
end
|
90
|
+
|
91
|
+
let(:game) do
|
92
|
+
Game.new
|
93
|
+
end
|
94
|
+
|
95
|
+
before do
|
96
|
+
person.game = game
|
97
|
+
end
|
98
|
+
|
99
|
+
it "sets the target of the relation" do
|
100
|
+
expect(person.game.target).to eq(game)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "sets the foreign key of the relation" do
|
104
|
+
expect(game.person_id).to eq(person.id)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "sets the base on the inverse relation" do
|
108
|
+
expect(game.person).to eq(person)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "sets the same instance on the inverse relation" do
|
112
|
+
expect(game.person).to eql(person)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "saves the target" do
|
116
|
+
expect(game).to be_persisted
|
117
|
+
end
|
118
|
+
|
119
|
+
context "when reloading the parent" do
|
120
|
+
|
121
|
+
before do
|
122
|
+
person.reload
|
123
|
+
end
|
124
|
+
|
125
|
+
context "when setting a new document on the relation" do
|
126
|
+
|
127
|
+
before do
|
128
|
+
person.game = Game.new
|
129
|
+
end
|
130
|
+
|
131
|
+
it "detaches the previous relation" do
|
132
|
+
expect {
|
133
|
+
game.reload
|
134
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "when relation have a different primary_key" do
|
141
|
+
|
142
|
+
let(:person) do
|
143
|
+
Person.create
|
144
|
+
end
|
145
|
+
|
146
|
+
let(:cat) do
|
147
|
+
Cat.new
|
148
|
+
end
|
149
|
+
|
150
|
+
before do
|
151
|
+
person.cat = cat
|
152
|
+
end
|
153
|
+
|
154
|
+
it "sets the target of the relation" do
|
155
|
+
expect(person.cat.target).to eq(cat)
|
156
|
+
end
|
157
|
+
|
158
|
+
it "sets the foreign key of the relation" do
|
159
|
+
expect(cat.person_id).to eq(person.username)
|
160
|
+
end
|
161
|
+
|
162
|
+
it "sets the base on the inverse relation" do
|
163
|
+
expect(cat.person).to eq(person)
|
164
|
+
end
|
165
|
+
|
166
|
+
it "sets the same instance on the inverse relation" do
|
167
|
+
expect(cat.person).to eql(person)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "saves the target" do
|
171
|
+
expect(cat).to be_persisted
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context "when the relation is polymorphic" do
|
177
|
+
|
178
|
+
context "when the parent is a new record" do
|
179
|
+
|
180
|
+
let(:bar) do
|
181
|
+
Bar.new
|
182
|
+
end
|
183
|
+
|
184
|
+
let(:rating) do
|
185
|
+
Rating.new
|
186
|
+
end
|
187
|
+
|
188
|
+
before do
|
189
|
+
bar.rating = rating
|
190
|
+
end
|
191
|
+
|
192
|
+
it "sets the target of the relation" do
|
193
|
+
expect(bar.rating.target).to eq(rating)
|
194
|
+
end
|
195
|
+
|
196
|
+
it "sets the foreign key on the relation" do
|
197
|
+
expect(rating.ratable_id).to eq(bar.id)
|
198
|
+
end
|
199
|
+
|
200
|
+
it "sets the base on the inverse relation" do
|
201
|
+
expect(rating.ratable).to eq(bar)
|
202
|
+
end
|
203
|
+
|
204
|
+
it "sets the same instance on the inverse relation" do
|
205
|
+
expect(rating.ratable).to eql(bar)
|
206
|
+
end
|
207
|
+
|
208
|
+
it "does not save the target" do
|
209
|
+
expect(rating).to_not be_persisted
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context "when the parent is not a new record" do
|
214
|
+
|
215
|
+
let(:bar) do
|
216
|
+
Bar.create
|
217
|
+
end
|
218
|
+
|
219
|
+
let(:rating) do
|
220
|
+
Rating.new
|
221
|
+
end
|
222
|
+
|
223
|
+
before do
|
224
|
+
bar.rating = rating
|
225
|
+
end
|
226
|
+
|
227
|
+
it "sets the target of the relation" do
|
228
|
+
expect(bar.rating.target).to eq(rating)
|
229
|
+
end
|
230
|
+
|
231
|
+
it "sets the foreign key of the relation" do
|
232
|
+
expect(rating.ratable_id).to eq(bar.id)
|
233
|
+
end
|
234
|
+
|
235
|
+
it "sets the base on the inverse relation" do
|
236
|
+
expect(rating.ratable).to eq(bar)
|
237
|
+
end
|
238
|
+
|
239
|
+
it "sets the same instance on the inverse relation" do
|
240
|
+
expect(rating.ratable).to eql(bar)
|
241
|
+
end
|
242
|
+
|
243
|
+
it "saves the target" do
|
244
|
+
expect(rating).to be_persisted
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
context "when replacing an existing persisted (dependent: :destroy) relation" do
|
249
|
+
|
250
|
+
let!(:person) do
|
251
|
+
Person.create
|
252
|
+
end
|
253
|
+
|
254
|
+
let!(:game) do
|
255
|
+
person.create_game(name: "Starcraft")
|
256
|
+
end
|
257
|
+
|
258
|
+
context "with a new one created via the parent" do
|
259
|
+
|
260
|
+
let!(:new_game) do
|
261
|
+
person.create_game(name: "Starcraft 2")
|
262
|
+
end
|
263
|
+
|
264
|
+
it "sets the new relation on the parent" do
|
265
|
+
expect(person.game).to eq(new_game)
|
266
|
+
end
|
267
|
+
|
268
|
+
it "removes the old foreign key reference" do
|
269
|
+
expect(game.person_id).to be_nil
|
270
|
+
end
|
271
|
+
|
272
|
+
it "removes the reference to the parent" do
|
273
|
+
expect(game.person).to be_nil
|
274
|
+
end
|
275
|
+
|
276
|
+
it "destroys the old child" do
|
277
|
+
expect(game).to be_destroyed
|
278
|
+
end
|
279
|
+
|
280
|
+
it "leaves the old child unpersisted" do
|
281
|
+
expect(game.persisted?).to be_false
|
282
|
+
end
|
283
|
+
|
284
|
+
it "leaves the new child persisted" do
|
285
|
+
expect(new_game.persisted?).to be_true
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
context "with a new one built via the parent" do
|
290
|
+
|
291
|
+
let!(:new_game) do
|
292
|
+
person.build_game(name: "Starcraft 2")
|
293
|
+
end
|
294
|
+
|
295
|
+
it "sets the new relation on the parent" do
|
296
|
+
expect(person.game).to eq(new_game)
|
297
|
+
end
|
298
|
+
|
299
|
+
it "removes the old foreign key reference" do
|
300
|
+
expect(game.person_id).to be_nil
|
301
|
+
end
|
302
|
+
|
303
|
+
it "removes the reference to the parent" do
|
304
|
+
expect(game.person).to be_nil
|
305
|
+
end
|
306
|
+
|
307
|
+
it "does not destroy the old child" do
|
308
|
+
expect(game).to_not be_destroyed
|
309
|
+
end
|
310
|
+
|
311
|
+
it "leaves the old child persisted" do
|
312
|
+
expect(game.persisted?).to be_true
|
313
|
+
end
|
314
|
+
|
315
|
+
it "leaves the new child unpersisted" do
|
316
|
+
expect(new_game.persisted?).to be_false
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
context "when replacing an existing unpersisted (dependent: :destroy) relation" do
|
322
|
+
|
323
|
+
let!(:person) do
|
324
|
+
Person.create
|
325
|
+
end
|
326
|
+
|
327
|
+
let!(:game) do
|
328
|
+
person.build_game(name: "Starcraft")
|
329
|
+
end
|
330
|
+
|
331
|
+
context "with a new one created via the parent" do
|
332
|
+
|
333
|
+
let!(:new_game) do
|
334
|
+
person.create_game(name: "Starcraft 2")
|
335
|
+
end
|
336
|
+
|
337
|
+
it "sets the new relation on the parent" do
|
338
|
+
expect(person.game).to eq(new_game)
|
339
|
+
end
|
340
|
+
|
341
|
+
it "removes the old foreign key reference" do
|
342
|
+
expect(game.person_id).to be_nil
|
343
|
+
end
|
344
|
+
|
345
|
+
it "removes the reference to the parent" do
|
346
|
+
expect(game.person).to be_nil
|
347
|
+
end
|
348
|
+
|
349
|
+
it "destroys the old child" do
|
350
|
+
expect(game).to be_destroyed
|
351
|
+
end
|
352
|
+
|
353
|
+
it "leaves the old child unpersisted" do
|
354
|
+
expect(game.persisted?).to be_false
|
355
|
+
end
|
356
|
+
|
357
|
+
it "leaves the new child persisted" do
|
358
|
+
expect(new_game.persisted?).to be_true
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
context "with a new one built via the parent" do
|
363
|
+
|
364
|
+
let!(:new_game) do
|
365
|
+
person.build_game(name: "Starcraft 2")
|
366
|
+
end
|
367
|
+
|
368
|
+
it "sets the new relation on the parent" do
|
369
|
+
expect(person.game).to eq(new_game)
|
370
|
+
end
|
371
|
+
|
372
|
+
it "removes the old foreign key reference" do
|
373
|
+
expect(game.person_id).to be_nil
|
374
|
+
end
|
375
|
+
|
376
|
+
it "removes the reference to the parent" do
|
377
|
+
expect(game.person).to be_nil
|
378
|
+
end
|
379
|
+
|
380
|
+
it "does not destroy the old child" do
|
381
|
+
expect(game).to_not be_destroyed
|
382
|
+
end
|
383
|
+
|
384
|
+
it "leaves the old child unpersisted" do
|
385
|
+
expect(game.persisted?).to be_false
|
386
|
+
end
|
387
|
+
|
388
|
+
it "leaves the new child unpersisted" do
|
389
|
+
expect(new_game.persisted?).to be_false
|
390
|
+
end
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
context "when replacing an existing persisted (dependent: :nullify) relation" do
|
395
|
+
|
396
|
+
let!(:person) do
|
397
|
+
Person.create
|
398
|
+
end
|
399
|
+
|
400
|
+
let!(:cat) do
|
401
|
+
person.create_cat(name: "Cuddles")
|
402
|
+
end
|
403
|
+
|
404
|
+
context "with a new one created via the parent" do
|
405
|
+
|
406
|
+
let!(:new_cat) do
|
407
|
+
person.create_cat(name: "Brutus")
|
408
|
+
end
|
409
|
+
|
410
|
+
it "sets the new relation on the parent" do
|
411
|
+
expect(person.cat).to eq(new_cat)
|
412
|
+
end
|
413
|
+
|
414
|
+
it "removes the old foreign key reference" do
|
415
|
+
expect(cat.person_id).to be_nil
|
416
|
+
end
|
417
|
+
|
418
|
+
it "removes the reference to the parent" do
|
419
|
+
expect(cat.person).to be_nil
|
420
|
+
end
|
421
|
+
|
422
|
+
it "does not destroy the old child" do
|
423
|
+
expect(cat).to_not be_destroyed
|
424
|
+
end
|
425
|
+
|
426
|
+
it "leaves the old child persisted" do
|
427
|
+
expect(cat.persisted?).to be_true
|
428
|
+
end
|
429
|
+
|
430
|
+
it "leaves the new child persisted" do
|
431
|
+
expect(new_cat.persisted?).to be_true
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
context "with a new one built via the parent" do
|
436
|
+
|
437
|
+
let!(:new_cat) do
|
438
|
+
person.build_cat(name: "Brutus")
|
439
|
+
end
|
440
|
+
|
441
|
+
it "sets the new relation on the parent" do
|
442
|
+
expect(person.cat).to eq(new_cat)
|
443
|
+
end
|
444
|
+
|
445
|
+
it "removes the old foreign key reference" do
|
446
|
+
expect(cat.person_id).to be_nil
|
447
|
+
end
|
448
|
+
|
449
|
+
it "removes the reference to the parent" do
|
450
|
+
expect(cat.person).to be_nil
|
451
|
+
end
|
452
|
+
|
453
|
+
it "does not destroy the old child" do
|
454
|
+
expect(cat).to_not be_destroyed
|
455
|
+
end
|
456
|
+
|
457
|
+
it "leaves the old child persisted" do
|
458
|
+
expect(cat.persisted?).to be_true
|
459
|
+
end
|
460
|
+
|
461
|
+
it "leaves the new child unpersisted" do
|
462
|
+
expect(new_cat.persisted?).to be_false
|
463
|
+
end
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
context "when replacing an existing unpersisted (dependent: :nullify) relation" do
|
468
|
+
|
469
|
+
let!(:person) do
|
470
|
+
Person.create
|
471
|
+
end
|
472
|
+
|
473
|
+
let!(:cat) do
|
474
|
+
person.build_cat(name: "Cuddles")
|
475
|
+
end
|
476
|
+
|
477
|
+
context "with a new one created via the parent" do
|
478
|
+
|
479
|
+
let!(:new_cat) do
|
480
|
+
person.create_cat(name: "Brutus")
|
481
|
+
end
|
482
|
+
|
483
|
+
it "sets the new relation on the parent" do
|
484
|
+
expect(person.cat).to eq(new_cat)
|
485
|
+
end
|
486
|
+
|
487
|
+
it "removes the old foreign key reference" do
|
488
|
+
expect(cat.person_id).to be_nil
|
489
|
+
end
|
490
|
+
|
491
|
+
it "removes the reference to the parent" do
|
492
|
+
expect(cat.person).to be_nil
|
493
|
+
end
|
494
|
+
|
495
|
+
it "does not destroy the old child" do
|
496
|
+
expect(cat).to_not be_destroyed
|
497
|
+
end
|
498
|
+
|
499
|
+
it "leaves the old child unpersisted" do
|
500
|
+
expect(cat.persisted?).to be_false
|
501
|
+
end
|
502
|
+
|
503
|
+
it "leaves the new child persisted" do
|
504
|
+
expect(new_cat.persisted?).to be_true
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
context "with a new one built via the parent" do
|
509
|
+
|
510
|
+
let!(:new_cat) do
|
511
|
+
person.build_cat(name: "Brutus")
|
512
|
+
end
|
513
|
+
|
514
|
+
it "sets the new relation on the parent" do
|
515
|
+
expect(person.cat).to eq(new_cat)
|
516
|
+
end
|
517
|
+
|
518
|
+
it "removes the old foreign key reference" do
|
519
|
+
expect(cat.person_id).to be_nil
|
520
|
+
end
|
521
|
+
|
522
|
+
it "removes the reference to the parent" do
|
523
|
+
expect(cat.person).to be_nil
|
524
|
+
end
|
525
|
+
|
526
|
+
it "does not destroy the old child" do
|
527
|
+
expect(cat).to_not be_destroyed
|
528
|
+
end
|
529
|
+
|
530
|
+
it "leaves the old child unpersisted" do
|
531
|
+
expect(cat.persisted?).to be_false
|
532
|
+
end
|
533
|
+
|
534
|
+
it "leaves the new child unpersisted" do
|
535
|
+
expect(new_cat.persisted?).to be_false
|
536
|
+
end
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
context "when replacing an existing relation with a new one" do
|
541
|
+
|
542
|
+
let!(:person) do
|
543
|
+
Person.create
|
544
|
+
end
|
545
|
+
|
546
|
+
context "when dependent is destroy" do
|
547
|
+
|
548
|
+
let!(:game) do
|
549
|
+
person.create_game(name: "Starcraft")
|
550
|
+
end
|
551
|
+
|
552
|
+
let!(:new_game) do
|
553
|
+
Game.create(name: "Starcraft 2")
|
554
|
+
end
|
555
|
+
|
556
|
+
before do
|
557
|
+
person.game = new_game
|
558
|
+
end
|
559
|
+
|
560
|
+
it "sets the new relation on the parent" do
|
561
|
+
expect(person.game).to eq(new_game)
|
562
|
+
end
|
563
|
+
|
564
|
+
it "removes the old foreign key reference" do
|
565
|
+
expect(game.person_id).to be_nil
|
566
|
+
end
|
567
|
+
|
568
|
+
it "removes the reference to the parent" do
|
569
|
+
expect(game.person).to be_nil
|
570
|
+
end
|
571
|
+
|
572
|
+
it "destroys the old child" do
|
573
|
+
expect(game).to be_destroyed
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
context "when dependent is not set" do
|
578
|
+
|
579
|
+
let!(:account) do
|
580
|
+
person.create_account(name: "savings")
|
581
|
+
end
|
582
|
+
|
583
|
+
let!(:new_account) do
|
584
|
+
Account.create(name: "checking")
|
585
|
+
end
|
586
|
+
|
587
|
+
before do
|
588
|
+
person.account = new_account
|
589
|
+
end
|
590
|
+
|
591
|
+
it "sets the new relation on the parent" do
|
592
|
+
expect(person.account).to eq(new_account)
|
593
|
+
end
|
594
|
+
|
595
|
+
it "removes the old foreign key reference" do
|
596
|
+
expect(account.person_id).to be_nil
|
597
|
+
end
|
598
|
+
|
599
|
+
it "removes the reference to the parent" do
|
600
|
+
expect(account.person).to be_nil
|
601
|
+
end
|
602
|
+
|
603
|
+
it "nullifies the old child" do
|
604
|
+
expect(account).to_not be_destroyed
|
605
|
+
end
|
606
|
+
end
|
607
|
+
end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
|
611
|
+
describe "#= nil" do
|
612
|
+
|
613
|
+
context "when the relation is not polymorphic" do
|
614
|
+
|
615
|
+
context "when the parent is a new record" do
|
616
|
+
|
617
|
+
let(:person) do
|
618
|
+
Person.new
|
619
|
+
end
|
620
|
+
|
621
|
+
let(:game) do
|
622
|
+
Game.new
|
623
|
+
end
|
624
|
+
|
625
|
+
before do
|
626
|
+
person.game = game
|
627
|
+
person.game = nil
|
628
|
+
end
|
629
|
+
|
630
|
+
it "sets the relation to nil" do
|
631
|
+
expect(person.game).to be_nil
|
632
|
+
end
|
633
|
+
|
634
|
+
it "removed the inverse relation" do
|
635
|
+
expect(game.person).to be_nil
|
636
|
+
end
|
637
|
+
|
638
|
+
it "removes the foreign key value" do
|
639
|
+
expect(game.person_id).to be_nil
|
640
|
+
end
|
641
|
+
end
|
642
|
+
|
643
|
+
context "when the parent is not a new record" do
|
644
|
+
|
645
|
+
let(:person) do
|
646
|
+
Person.create
|
647
|
+
end
|
648
|
+
|
649
|
+
let(:game) do
|
650
|
+
Game.new
|
651
|
+
end
|
652
|
+
|
653
|
+
before do
|
654
|
+
person.game = game
|
655
|
+
person.game = nil
|
656
|
+
end
|
657
|
+
|
658
|
+
it "sets the relation to nil" do
|
659
|
+
expect(person.game).to be_nil
|
660
|
+
end
|
661
|
+
|
662
|
+
it "removed the inverse relation" do
|
663
|
+
expect(game.person).to be_nil
|
664
|
+
end
|
665
|
+
|
666
|
+
it "removes the foreign key value" do
|
667
|
+
expect(game.person_id).to be_nil
|
668
|
+
end
|
669
|
+
|
670
|
+
it "deletes the target from the database" do
|
671
|
+
expect(game).to be_destroyed
|
672
|
+
end
|
673
|
+
end
|
674
|
+
end
|
675
|
+
|
676
|
+
context "when the relation is polymorphic" do
|
677
|
+
|
678
|
+
context "when the parent is a new record" do
|
679
|
+
|
680
|
+
let(:bar) do
|
681
|
+
Bar.new
|
682
|
+
end
|
683
|
+
|
684
|
+
let(:rating) do
|
685
|
+
Rating.new
|
686
|
+
end
|
687
|
+
|
688
|
+
before do
|
689
|
+
bar.rating = rating
|
690
|
+
bar.rating = nil
|
691
|
+
end
|
692
|
+
|
693
|
+
it "sets the relation to nil" do
|
694
|
+
expect(bar.rating).to be_nil
|
695
|
+
end
|
696
|
+
|
697
|
+
it "removed the inverse relation" do
|
698
|
+
expect(rating.ratable).to be_nil
|
699
|
+
end
|
700
|
+
|
701
|
+
it "removes the foreign key value" do
|
702
|
+
expect(rating.ratable_id).to be_nil
|
703
|
+
end
|
704
|
+
end
|
705
|
+
|
706
|
+
context "when the parent is not a new record" do
|
707
|
+
|
708
|
+
let(:bar) do
|
709
|
+
Bar.create
|
710
|
+
end
|
711
|
+
|
712
|
+
let(:rating) do
|
713
|
+
Rating.new
|
714
|
+
end
|
715
|
+
|
716
|
+
before do
|
717
|
+
bar.rating = rating
|
718
|
+
bar.rating = nil
|
719
|
+
end
|
720
|
+
|
721
|
+
it "sets the relation to nil" do
|
722
|
+
expect(bar.rating).to be_nil
|
723
|
+
end
|
724
|
+
|
725
|
+
it "removed the inverse relation" do
|
726
|
+
expect(rating.ratable).to be_nil
|
727
|
+
end
|
728
|
+
|
729
|
+
it "removes the foreign key value" do
|
730
|
+
expect(rating.ratable_id).to be_nil
|
731
|
+
end
|
732
|
+
|
733
|
+
it "applies the appropriate dependent option" do
|
734
|
+
expect(rating).to_not be_destroyed
|
735
|
+
end
|
736
|
+
end
|
737
|
+
end
|
738
|
+
end
|
739
|
+
|
740
|
+
describe "#build_#\{name}" do
|
741
|
+
|
742
|
+
context "when the relationship is an illegal embedded reference" do
|
743
|
+
|
744
|
+
let(:game) do
|
745
|
+
Game.new
|
746
|
+
end
|
747
|
+
|
748
|
+
it "raises a mixed relation error" do
|
749
|
+
expect {
|
750
|
+
game.build_video(title: "Tron")
|
751
|
+
}.to raise_error(Mongoid::Errors::MixedRelations)
|
752
|
+
end
|
753
|
+
end
|
754
|
+
|
755
|
+
context "when the relation is not polymorphic" do
|
756
|
+
|
757
|
+
context "when using object ids" do
|
758
|
+
|
759
|
+
let(:person) do
|
760
|
+
Person.create
|
761
|
+
end
|
762
|
+
|
763
|
+
let(:game) do
|
764
|
+
person.build_game(score: 50)
|
765
|
+
end
|
766
|
+
|
767
|
+
it "returns a new document" do
|
768
|
+
expect(game.score).to eq(50)
|
769
|
+
end
|
770
|
+
|
771
|
+
it "sets the foreign key on the document" do
|
772
|
+
expect(game.person_id).to eq(person.id)
|
773
|
+
end
|
774
|
+
|
775
|
+
it "sets the inverse relation" do
|
776
|
+
expect(game.person).to eq(person)
|
777
|
+
end
|
778
|
+
|
779
|
+
it "does not save the built document" do
|
780
|
+
expect(game).to_not be_persisted
|
781
|
+
end
|
782
|
+
end
|
783
|
+
|
784
|
+
context "when providing no attributes" do
|
785
|
+
|
786
|
+
let(:person) do
|
787
|
+
Person.create
|
788
|
+
end
|
789
|
+
|
790
|
+
let(:game) do
|
791
|
+
person.build_game
|
792
|
+
end
|
793
|
+
|
794
|
+
it "sets the foreign key on the document" do
|
795
|
+
expect(game.person_id).to eq(person.id)
|
796
|
+
end
|
797
|
+
|
798
|
+
it "sets the inverse relation" do
|
799
|
+
expect(game.person).to eq(person)
|
800
|
+
end
|
801
|
+
|
802
|
+
it "does not save the built document" do
|
803
|
+
expect(game).to_not be_persisted
|
804
|
+
end
|
805
|
+
end
|
806
|
+
|
807
|
+
context "when providing nil attributes" do
|
808
|
+
|
809
|
+
let(:person) do
|
810
|
+
Person.create
|
811
|
+
end
|
812
|
+
|
813
|
+
let(:game) do
|
814
|
+
person.build_game(nil)
|
815
|
+
end
|
816
|
+
|
817
|
+
it "sets the foreign key on the document" do
|
818
|
+
expect(game.person_id).to eq(person.id)
|
819
|
+
end
|
820
|
+
|
821
|
+
it "sets the inverse relation" do
|
822
|
+
expect(game.person).to eq(person)
|
823
|
+
end
|
824
|
+
|
825
|
+
it "does not save the built document" do
|
826
|
+
expect(game).to_not be_persisted
|
827
|
+
end
|
828
|
+
end
|
829
|
+
end
|
830
|
+
|
831
|
+
context "when the relation is polymorphic" do
|
832
|
+
|
833
|
+
context "when using object ids" do
|
834
|
+
|
835
|
+
let(:bar) do
|
836
|
+
Bar.create
|
837
|
+
end
|
838
|
+
|
839
|
+
let(:rating) do
|
840
|
+
bar.build_rating(value: 5)
|
841
|
+
end
|
842
|
+
|
843
|
+
it "returns a new document" do
|
844
|
+
expect(rating.value).to eq(5)
|
845
|
+
end
|
846
|
+
|
847
|
+
it "sets the foreign key on the document" do
|
848
|
+
expect(rating.ratable_id).to eq(bar.id)
|
849
|
+
end
|
850
|
+
|
851
|
+
it "sets the inverse relation" do
|
852
|
+
expect(rating.ratable).to eq(bar)
|
853
|
+
end
|
854
|
+
|
855
|
+
it "does not save the built document" do
|
856
|
+
expect(rating).to_not be_persisted
|
857
|
+
end
|
858
|
+
end
|
859
|
+
end
|
860
|
+
end
|
861
|
+
|
862
|
+
describe ".builder" do
|
863
|
+
|
864
|
+
let(:builder_klass) do
|
865
|
+
Mongoid::Relations::Builders::Referenced::One
|
866
|
+
end
|
867
|
+
|
868
|
+
let(:document) do
|
869
|
+
double
|
870
|
+
end
|
871
|
+
|
872
|
+
let(:metadata) do
|
873
|
+
double(extension?: false)
|
874
|
+
end
|
875
|
+
|
876
|
+
it "returns the embedded in builder" do
|
877
|
+
expect(
|
878
|
+
described_class.builder(nil, metadata, document)
|
879
|
+
).to be_a_kind_of(builder_klass)
|
880
|
+
end
|
881
|
+
end
|
882
|
+
|
883
|
+
describe "#create_#\{name}" do
|
884
|
+
|
885
|
+
context "when the relationship is an illegal embedded reference" do
|
886
|
+
|
887
|
+
let(:game) do
|
888
|
+
Game.new
|
889
|
+
end
|
890
|
+
|
891
|
+
it "raises a mixed relation error" do
|
892
|
+
expect {
|
893
|
+
game.create_video(title: "Tron")
|
894
|
+
}.to raise_error(Mongoid::Errors::MixedRelations)
|
895
|
+
end
|
896
|
+
end
|
897
|
+
|
898
|
+
context "when the relation is not polymorphic" do
|
899
|
+
|
900
|
+
let(:person) do
|
901
|
+
Person.create
|
902
|
+
end
|
903
|
+
|
904
|
+
let(:game) do
|
905
|
+
person.create_game(score: 50)
|
906
|
+
end
|
907
|
+
|
908
|
+
it "returns a new document" do
|
909
|
+
expect(game.score).to eq(50)
|
910
|
+
end
|
911
|
+
|
912
|
+
it "sets the foreign key on the document" do
|
913
|
+
expect(game.person_id).to eq(person.id)
|
914
|
+
end
|
915
|
+
|
916
|
+
it "sets the inverse relation" do
|
917
|
+
expect(game.person).to eq(person)
|
918
|
+
end
|
919
|
+
|
920
|
+
it "saves the document" do
|
921
|
+
expect(game).to be_persisted
|
922
|
+
end
|
923
|
+
end
|
924
|
+
|
925
|
+
context "when providing no attributes" do
|
926
|
+
|
927
|
+
let(:person) do
|
928
|
+
Person.create
|
929
|
+
end
|
930
|
+
|
931
|
+
let(:game) do
|
932
|
+
person.create_game
|
933
|
+
end
|
934
|
+
|
935
|
+
it "sets the foreign key on the document" do
|
936
|
+
expect(game.person_id).to eq(person.id)
|
937
|
+
end
|
938
|
+
|
939
|
+
it "sets the inverse relation" do
|
940
|
+
expect(game.person).to eq(person)
|
941
|
+
end
|
942
|
+
|
943
|
+
it "saves the document" do
|
944
|
+
expect(game).to be_persisted
|
945
|
+
end
|
946
|
+
end
|
947
|
+
|
948
|
+
context "when providing nil attributes" do
|
949
|
+
|
950
|
+
let(:person) do
|
951
|
+
Person.create
|
952
|
+
end
|
953
|
+
|
954
|
+
let(:game) do
|
955
|
+
person.create_game(nil)
|
956
|
+
end
|
957
|
+
|
958
|
+
it "sets the foreign key on the document" do
|
959
|
+
expect(game.person_id).to eq(person.id)
|
960
|
+
end
|
961
|
+
|
962
|
+
it "sets the inverse relation" do
|
963
|
+
expect(game.person).to eq(person)
|
964
|
+
end
|
965
|
+
|
966
|
+
it "saves the document" do
|
967
|
+
expect(game).to be_persisted
|
968
|
+
end
|
969
|
+
end
|
970
|
+
|
971
|
+
context "when the relation is polymorphic" do
|
972
|
+
|
973
|
+
let(:bar) do
|
974
|
+
Bar.create
|
975
|
+
end
|
976
|
+
|
977
|
+
let(:rating) do
|
978
|
+
bar.create_rating(value: 5)
|
979
|
+
end
|
980
|
+
|
981
|
+
it "returns a new document" do
|
982
|
+
expect(rating.value).to eq(5)
|
983
|
+
end
|
984
|
+
|
985
|
+
it "sets the foreign key on the document" do
|
986
|
+
expect(rating.ratable_id).to eq(bar.id)
|
987
|
+
end
|
988
|
+
|
989
|
+
it "sets the inverse relation" do
|
990
|
+
expect(rating.ratable).to eq(bar)
|
991
|
+
end
|
992
|
+
|
993
|
+
it "saves the document" do
|
994
|
+
expect(rating).to be_persisted
|
995
|
+
end
|
996
|
+
end
|
997
|
+
end
|
998
|
+
|
999
|
+
describe ".criteria" do
|
1000
|
+
|
1001
|
+
let(:id) do
|
1002
|
+
Moped::BSON::ObjectId.new
|
1003
|
+
end
|
1004
|
+
|
1005
|
+
context "when the relation is polymorphic" do
|
1006
|
+
|
1007
|
+
let(:metadata) do
|
1008
|
+
Book.relations["rating"]
|
1009
|
+
end
|
1010
|
+
|
1011
|
+
let(:criteria) do
|
1012
|
+
described_class.criteria(metadata, id, Book)
|
1013
|
+
end
|
1014
|
+
|
1015
|
+
it "includes the type in the criteria" do
|
1016
|
+
expect(criteria.selector).to eq(
|
1017
|
+
{
|
1018
|
+
"ratable_id" => id,
|
1019
|
+
"ratable_type" => "Book"
|
1020
|
+
}
|
1021
|
+
)
|
1022
|
+
end
|
1023
|
+
end
|
1024
|
+
|
1025
|
+
context "when the relation is not polymorphic" do
|
1026
|
+
|
1027
|
+
let(:metadata) do
|
1028
|
+
Person.relations["game"]
|
1029
|
+
end
|
1030
|
+
|
1031
|
+
let(:criteria) do
|
1032
|
+
described_class.criteria(metadata, id, Person)
|
1033
|
+
end
|
1034
|
+
|
1035
|
+
it "does not include the type in the criteria" do
|
1036
|
+
expect(criteria.selector).to eq({ "person_id" => id })
|
1037
|
+
end
|
1038
|
+
end
|
1039
|
+
end
|
1040
|
+
|
1041
|
+
describe ".eager_load" do
|
1042
|
+
|
1043
|
+
before do
|
1044
|
+
Mongoid.identity_map_enabled = true
|
1045
|
+
end
|
1046
|
+
|
1047
|
+
after do
|
1048
|
+
Mongoid.identity_map_enabled = false
|
1049
|
+
end
|
1050
|
+
|
1051
|
+
context "when the relation is not polymorphic" do
|
1052
|
+
|
1053
|
+
let!(:person) do
|
1054
|
+
Person.create
|
1055
|
+
end
|
1056
|
+
|
1057
|
+
let!(:game) do
|
1058
|
+
person.create_game(name: "Tron")
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
let(:metadata) do
|
1062
|
+
Person.relations["game"]
|
1063
|
+
end
|
1064
|
+
|
1065
|
+
let!(:eager) do
|
1066
|
+
described_class.eager_load(metadata, Person.all.map(&:_id))
|
1067
|
+
end
|
1068
|
+
|
1069
|
+
let(:map) do
|
1070
|
+
Mongoid::IdentityMap.get(Game, {"person_id" => person.id})
|
1071
|
+
end
|
1072
|
+
|
1073
|
+
it "puts the documents in the identity map" do
|
1074
|
+
expect(map).to eq(game)
|
1075
|
+
end
|
1076
|
+
end
|
1077
|
+
|
1078
|
+
context "when the relation is polymorphic" do
|
1079
|
+
|
1080
|
+
let!(:book) do
|
1081
|
+
Book.create(name: "Game of Thrones")
|
1082
|
+
end
|
1083
|
+
|
1084
|
+
let!(:movie) do
|
1085
|
+
Movie.create(name: "Bladerunner")
|
1086
|
+
end
|
1087
|
+
|
1088
|
+
let!(:movie_rating) do
|
1089
|
+
movie.ratings.create(value: 10)
|
1090
|
+
end
|
1091
|
+
|
1092
|
+
let!(:book_rating) do
|
1093
|
+
book.create_rating(value: 10)
|
1094
|
+
end
|
1095
|
+
|
1096
|
+
let(:metadata) do
|
1097
|
+
Book.relations["rating"]
|
1098
|
+
end
|
1099
|
+
|
1100
|
+
let!(:eager) do
|
1101
|
+
described_class.eager_load(metadata, Book.all.map(&:_id))
|
1102
|
+
end
|
1103
|
+
|
1104
|
+
let(:map) do
|
1105
|
+
Mongoid::IdentityMap.get(Rating, {"ratable_id" => book.id})
|
1106
|
+
end
|
1107
|
+
|
1108
|
+
it "puts the documents in the identity map" do
|
1109
|
+
expect(map).to eq(book_rating)
|
1110
|
+
end
|
1111
|
+
end
|
1112
|
+
end
|
1113
|
+
|
1114
|
+
describe ".embedded?" do
|
1115
|
+
|
1116
|
+
it "returns false" do
|
1117
|
+
expect(described_class).to_not be_embedded
|
1118
|
+
end
|
1119
|
+
end
|
1120
|
+
|
1121
|
+
describe ".foreign_key_suffix" do
|
1122
|
+
|
1123
|
+
it "returns _id" do
|
1124
|
+
expect(described_class.foreign_key_suffix).to eq("_id")
|
1125
|
+
end
|
1126
|
+
end
|
1127
|
+
|
1128
|
+
describe ".macro" do
|
1129
|
+
|
1130
|
+
it "returns has_one" do
|
1131
|
+
expect(described_class.macro).to eq(:has_one)
|
1132
|
+
end
|
1133
|
+
end
|
1134
|
+
|
1135
|
+
describe "#nullify" do
|
1136
|
+
|
1137
|
+
let(:person) do
|
1138
|
+
Person.create
|
1139
|
+
end
|
1140
|
+
|
1141
|
+
let!(:game) do
|
1142
|
+
person.create_game(name: "Starcraft II")
|
1143
|
+
end
|
1144
|
+
|
1145
|
+
context "when the instance has been set" do
|
1146
|
+
|
1147
|
+
before do
|
1148
|
+
person.game.nullify
|
1149
|
+
end
|
1150
|
+
|
1151
|
+
it "removes the foreign key from the target" do
|
1152
|
+
expect(game.person_id).to be_nil
|
1153
|
+
end
|
1154
|
+
|
1155
|
+
it "removes the reference from the target" do
|
1156
|
+
expect(game.person).to be_nil
|
1157
|
+
end
|
1158
|
+
end
|
1159
|
+
|
1160
|
+
context "when the instance has been reloaded" do
|
1161
|
+
|
1162
|
+
let(:from_db) do
|
1163
|
+
Person.find(person.id)
|
1164
|
+
end
|
1165
|
+
|
1166
|
+
let(:game_reloaded) do
|
1167
|
+
Game.find(game.id)
|
1168
|
+
end
|
1169
|
+
|
1170
|
+
before do
|
1171
|
+
from_db.game.nullify
|
1172
|
+
end
|
1173
|
+
|
1174
|
+
it "removes the foreign key from the target" do
|
1175
|
+
expect(game_reloaded.person_id).to be_nil
|
1176
|
+
end
|
1177
|
+
|
1178
|
+
it "removes the reference from the target" do
|
1179
|
+
expect(game_reloaded.person).to be_nil
|
1180
|
+
end
|
1181
|
+
end
|
1182
|
+
end
|
1183
|
+
|
1184
|
+
describe "#respond_to?" do
|
1185
|
+
|
1186
|
+
let(:person) do
|
1187
|
+
Person.new
|
1188
|
+
end
|
1189
|
+
|
1190
|
+
let!(:game) do
|
1191
|
+
person.build_game(name: "Tron")
|
1192
|
+
end
|
1193
|
+
|
1194
|
+
let(:document) do
|
1195
|
+
person.game
|
1196
|
+
end
|
1197
|
+
|
1198
|
+
Mongoid::Document.public_instance_methods(true).each do |method|
|
1199
|
+
|
1200
|
+
context "when checking #{method}" do
|
1201
|
+
|
1202
|
+
it "returns true" do
|
1203
|
+
expect(document.respond_to?(method)).to be_true
|
1204
|
+
end
|
1205
|
+
end
|
1206
|
+
end
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
describe ".stores_foreign_key?" do
|
1210
|
+
|
1211
|
+
it "returns false" do
|
1212
|
+
expect(described_class.stores_foreign_key?).to be_false
|
1213
|
+
end
|
1214
|
+
end
|
1215
|
+
|
1216
|
+
describe ".valid_options" do
|
1217
|
+
|
1218
|
+
it "returns the valid options" do
|
1219
|
+
expect(described_class.valid_options).to eq(
|
1220
|
+
[ :as, :autobuild, :autosave, :dependent, :foreign_key, :primary_key ]
|
1221
|
+
)
|
1222
|
+
end
|
1223
|
+
end
|
1224
|
+
|
1225
|
+
describe ".validation_default" do
|
1226
|
+
|
1227
|
+
it "returns true" do
|
1228
|
+
expect(described_class.validation_default).to be_true
|
1229
|
+
end
|
1230
|
+
end
|
1231
|
+
|
1232
|
+
context "when reloading the relation" do
|
1233
|
+
|
1234
|
+
let!(:person) do
|
1235
|
+
Person.create
|
1236
|
+
end
|
1237
|
+
|
1238
|
+
let!(:game_one) do
|
1239
|
+
Game.create(name: "Warcraft 3")
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
let!(:game_two) do
|
1243
|
+
Game.create(name: "Starcraft 2")
|
1244
|
+
end
|
1245
|
+
|
1246
|
+
before do
|
1247
|
+
person.game = game_one
|
1248
|
+
end
|
1249
|
+
|
1250
|
+
context "when the relation references the same document" do
|
1251
|
+
|
1252
|
+
before do
|
1253
|
+
Game.collection.find({ _id: game_one.id }).
|
1254
|
+
update({ "$set" => { name: "Diablo 2" }})
|
1255
|
+
end
|
1256
|
+
|
1257
|
+
let(:reloaded) do
|
1258
|
+
person.game(true)
|
1259
|
+
end
|
1260
|
+
|
1261
|
+
it "reloads the document from the database" do
|
1262
|
+
expect(reloaded.name).to eq("Diablo 2")
|
1263
|
+
end
|
1264
|
+
|
1265
|
+
it "sets a new document instance" do
|
1266
|
+
expect(reloaded).to_not equal(game_one)
|
1267
|
+
end
|
1268
|
+
end
|
1269
|
+
|
1270
|
+
context "when the relation references a different document" do
|
1271
|
+
|
1272
|
+
before do
|
1273
|
+
person.game = game_two
|
1274
|
+
end
|
1275
|
+
|
1276
|
+
let(:reloaded) do
|
1277
|
+
person.game(true)
|
1278
|
+
end
|
1279
|
+
|
1280
|
+
it "reloads the new document from the database" do
|
1281
|
+
expect(reloaded.name).to eq("Starcraft 2")
|
1282
|
+
end
|
1283
|
+
|
1284
|
+
it "sets a new document instance" do
|
1285
|
+
expect(reloaded).to_not equal(game_one)
|
1286
|
+
end
|
1287
|
+
end
|
1288
|
+
end
|
1289
|
+
end
|