mongoid 3.1.4 → 3.1.5
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
- data/CHANGELOG.md +34 -0
- data/lib/mongoid/contextual.rb +3 -0
- data/lib/mongoid/criteria.rb +10 -2
- data/lib/mongoid/document.rb +1 -1
- data/lib/mongoid/paranoia.rb +4 -0
- data/lib/mongoid/persistence/upsertion.rb +1 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +16 -2
- data/lib/mongoid/relations/macros.rb +1 -1
- data/lib/mongoid/relations/one.rb +12 -0
- data/lib/mongoid/relations/referenced/in.rb +18 -1
- data/lib/mongoid/relations/referenced/many_to_many.rb +2 -2
- data/lib/mongoid/validations.rb +1 -1
- data/lib/mongoid/validations/localizable.rb +1 -1
- data/lib/mongoid/validations/presence.rb +1 -1
- data/lib/mongoid/validations/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +32 -0
- data/spec/app/models/acolyte.rb +16 -0
- data/spec/app/models/actor.rb +19 -0
- data/spec/app/models/actor_observer.rb +15 -0
- data/spec/app/models/actress.rb +2 -0
- data/spec/app/models/address.rb +72 -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 +13 -0
- data/spec/app/models/artist.rb +66 -0
- data/spec/app/models/artwork.rb +4 -0
- data/spec/app/models/augmentation.rb +11 -0
- data/spec/app/models/author.rb +6 -0
- data/spec/app/models/band.rb +25 -0
- data/spec/app/models/bar.rb +9 -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 +12 -0
- data/spec/app/models/breed.rb +4 -0
- data/spec/app/models/browser.rb +6 -0
- data/spec/app/models/building.rb +7 -0
- data/spec/app/models/building_address.rb +7 -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 +7 -0
- data/spec/app/models/cookie.rb +6 -0
- data/spec/app/models/country_code.rb +8 -0
- data/spec/app/models/definition.rb +8 -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/driver.rb +7 -0
- data/spec/app/models/drug.rb +8 -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 +4 -0
- data/spec/app/models/fire_hydrant.rb +6 -0
- data/spec/app/models/firefox.rb +4 -0
- data/spec/app/models/fish.rb +8 -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 +21 -0
- data/spec/app/models/ghost.rb +7 -0
- data/spec/app/models/home.rb +4 -0
- data/spec/app/models/house.rb +8 -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 +12 -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 +12 -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/paranoid_phone.rb +25 -0
- data/spec/app/models/paranoid_post.rb +36 -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 +201 -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/phone_observer.rb +6 -0
- data/spec/app/models/pizza.rb +7 -0
- data/spec/app/models/player.rb +35 -0
- data/spec/app/models/post.rb +43 -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 +17 -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 +10 -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/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 +4 -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 +17 -0
- data/spec/app/models/video_game.rb +1 -0
- data/spec/app/models/weapon.rb +11 -0
- data/spec/app/models/wiki_page.rb +17 -0
- data/spec/app/models/word.rb +12 -0
- data/spec/app/models/word_origin.rb +11 -0
- data/spec/app/models/writer.rb +11 -0
- data/spec/config/mongoid.yml +40 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +159 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +152 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +106 -0
- data/spec/mongoid/atomic/paths_spec.rb +270 -0
- data/spec/mongoid/atomic/positionable_spec.rb +227 -0
- data/spec/mongoid/atomic_spec.rb +365 -0
- data/spec/mongoid/attributes/processing_spec.rb +149 -0
- data/spec/mongoid/attributes/readonly_spec.rb +169 -0
- data/spec/mongoid/attributes_spec.rb +1705 -0
- data/spec/mongoid/callbacks_spec.rb +1564 -0
- data/spec/mongoid/components_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 +334 -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 +525 -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 +1757 -0
- data/spec/mongoid/copyable_spec.rb +393 -0
- data/spec/mongoid/criteria_spec.rb +5140 -0
- data/spec/mongoid/criterion/destructive_spec.rb +101 -0
- data/spec/mongoid/criterion/inspection_spec.rb +27 -0
- data/spec/mongoid/criterion/marshalable_spec.rb +28 -0
- data/spec/mongoid/criterion/modifiable_spec.rb +409 -0
- data/spec/mongoid/criterion/modification_spec.rb +402 -0
- data/spec/mongoid/criterion/scoping_spec.rb +391 -0
- data/spec/mongoid/dirty_spec.rb +1508 -0
- data/spec/mongoid/document_spec.rb +1146 -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/errors/versioning_not_on_root_spec.rb +29 -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 +368 -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/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 +1253 -0
- data/spec/mongoid/finders_spec.rb +321 -0
- data/spec/mongoid/hierarchy_spec.rb +244 -0
- data/spec/mongoid/identity_map_spec.rb +564 -0
- data/spec/mongoid/indexes_spec.rb +404 -0
- data/spec/mongoid/inspection_spec.rb +57 -0
- data/spec/mongoid/json_spec.rb +33 -0
- data/spec/mongoid/loggable_spec.rb +21 -0
- data/spec/mongoid/matchers/all_spec.rb +31 -0
- data/spec/mongoid/matchers/and_spec.rb +162 -0
- data/spec/mongoid/matchers/default_spec.rb +130 -0
- data/spec/mongoid/matchers/exists_spec.rb +57 -0
- data/spec/mongoid/matchers/gt_spec.rb +74 -0
- data/spec/mongoid/matchers/gte_spec.rb +74 -0
- data/spec/mongoid/matchers/in_spec.rb +25 -0
- data/spec/mongoid/matchers/lt_spec.rb +74 -0
- data/spec/mongoid/matchers/lte_spec.rb +74 -0
- data/spec/mongoid/matchers/ne_spec.rb +25 -0
- data/spec/mongoid/matchers/nin_spec.rb +25 -0
- data/spec/mongoid/matchers/or_spec.rb +106 -0
- data/spec/mongoid/matchers/size_spec.rb +25 -0
- data/spec/mongoid/matchers_spec.rb +532 -0
- data/spec/mongoid/multi_parameter_attributes_spec.rb +128 -0
- data/spec/mongoid/nested_attributes_spec.rb +4945 -0
- data/spec/mongoid/observer_spec.rb +290 -0
- data/spec/mongoid/paranoia_spec.rb +759 -0
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +262 -0
- data/spec/mongoid/persistence/atomic/bit_spec.rb +88 -0
- data/spec/mongoid/persistence/atomic/inc_spec.rb +133 -0
- data/spec/mongoid/persistence/atomic/pop_spec.rb +111 -0
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +77 -0
- data/spec/mongoid/persistence/atomic/pull_spec.rb +80 -0
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +77 -0
- data/spec/mongoid/persistence/atomic/push_spec.rb +77 -0
- data/spec/mongoid/persistence/atomic/rename_spec.rb +42 -0
- data/spec/mongoid/persistence/atomic/sets_spec.rb +154 -0
- data/spec/mongoid/persistence/atomic/unset_spec.rb +65 -0
- data/spec/mongoid/persistence/atomic_spec.rb +216 -0
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +191 -0
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +8 -0
- data/spec/mongoid/persistence/operations/insert_spec.rb +149 -0
- data/spec/mongoid/persistence/operations/remove_spec.rb +113 -0
- data/spec/mongoid/persistence/operations/update_spec.rb +141 -0
- data/spec/mongoid/persistence/operations/upsert_spec.rb +59 -0
- data/spec/mongoid/persistence/operations_spec.rb +313 -0
- data/spec/mongoid/persistence_spec.rb +2279 -0
- data/spec/mongoid/railties/document_spec.rb +24 -0
- data/spec/mongoid/relations/accessors_spec.rb +844 -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 +580 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +3841 -0
- data/spec/mongoid/relations/embedded/one_spec.rb +1055 -0
- data/spec/mongoid/relations/macros_spec.rb +625 -0
- data/spec/mongoid/relations/metadata_spec.rb +2030 -0
- data/spec/mongoid/relations/options_spec.rb +35 -0
- data/spec/mongoid/relations/polymorphic_spec.rb +132 -0
- data/spec/mongoid/relations/proxy_spec.rb +48 -0
- data/spec/mongoid/relations/referenced/in_spec.rb +1501 -0
- data/spec/mongoid/relations/referenced/many_spec.rb +3632 -0
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3561 -0
- data/spec/mongoid/relations/referenced/one_spec.rb +1331 -0
- data/spec/mongoid/relations/reflections_spec.rb +101 -0
- data/spec/mongoid/relations/synchronization_spec.rb +453 -0
- data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
- data/spec/mongoid/relations_spec.rb +188 -0
- data/spec/mongoid/reloading_spec.rb +305 -0
- data/spec/mongoid/scoping_spec.rb +978 -0
- data/spec/mongoid/serialization_spec.rb +833 -0
- data/spec/mongoid/sessions/factory_spec.rb +312 -0
- data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
- data/spec/mongoid/sessions_spec.rb +1111 -0
- data/spec/mongoid/sharding_spec.rb +61 -0
- data/spec/mongoid/state_spec.rb +102 -0
- data/spec/mongoid/threaded_spec.rb +296 -0
- data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
- data/spec/mongoid/timestamps/created_spec.rb +44 -0
- data/spec/mongoid/timestamps/timeless_spec.rb +130 -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/unit_of_work_spec.rb +196 -0
- data/spec/mongoid/validations/associated_spec.rb +183 -0
- data/spec/mongoid/validations/format_spec.rb +83 -0
- data/spec/mongoid/validations/length_spec.rb +223 -0
- data/spec/mongoid/validations/numericality_spec.rb +30 -0
- data/spec/mongoid/validations/presence_spec.rb +592 -0
- data/spec/mongoid/validations/uniqueness_spec.rb +2399 -0
- data/spec/mongoid/validations_spec.rb +309 -0
- data/spec/mongoid/versioning_spec.rb +540 -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 +93 -0
- metadata +826 -6
|
@@ -0,0 +1,1236 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Contextual::Memory do
|
|
4
|
+
|
|
5
|
+
[ :blank?, :empty? ].each do |method|
|
|
6
|
+
|
|
7
|
+
describe "##{method}" do
|
|
8
|
+
|
|
9
|
+
let(:hobrecht) do
|
|
10
|
+
Address.new(street: "hobrecht")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
let(:friedel) do
|
|
14
|
+
Address.new(street: "friedel")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "when there are matching documents" do
|
|
18
|
+
|
|
19
|
+
let(:criteria) do
|
|
20
|
+
Address.where(street: "hobrecht").tap do |crit|
|
|
21
|
+
crit.documents = [ hobrecht, friedel ]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
let(:context) do
|
|
26
|
+
described_class.new(criteria)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "returns false" do
|
|
30
|
+
context.send(method).should be_false
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context "when there are no matching documents" do
|
|
35
|
+
|
|
36
|
+
let(:criteria) do
|
|
37
|
+
Address.where(street: "pfluger").tap do |crit|
|
|
38
|
+
crit.documents = [ hobrecht, friedel ]
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
let(:context) do
|
|
43
|
+
described_class.new(criteria)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "returns true" do
|
|
47
|
+
context.send(method).should be_true
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "#count" do
|
|
54
|
+
|
|
55
|
+
let!(:hobrecht) do
|
|
56
|
+
Address.new(street: "hobrecht")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
let!(:friedel) do
|
|
60
|
+
Address.new(street: "friedel")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
let(:criteria) do
|
|
64
|
+
Address.where(street: "hobrecht").tap do |crit|
|
|
65
|
+
crit.documents = [ hobrecht, friedel ]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
let(:context) do
|
|
70
|
+
described_class.new(criteria)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "context when no arguments are provided" do
|
|
74
|
+
|
|
75
|
+
it "returns the number of matches" do
|
|
76
|
+
context.count.should eq(1)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "when provided a document" do
|
|
81
|
+
|
|
82
|
+
context "when the document matches" do
|
|
83
|
+
|
|
84
|
+
let(:count) do
|
|
85
|
+
context.count(hobrecht)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "returns 1" do
|
|
89
|
+
count.should eq(1)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
context "when the document does not match" do
|
|
94
|
+
|
|
95
|
+
let(:count) do
|
|
96
|
+
context.count(friedel)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "returns 0" do
|
|
100
|
+
count.should eq(0)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
context "when provided a block" do
|
|
106
|
+
|
|
107
|
+
context "when the block evals 1 to true" do
|
|
108
|
+
|
|
109
|
+
let(:count) do
|
|
110
|
+
context.count do |doc|
|
|
111
|
+
doc.street == "hobrecht"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "returns 1" do
|
|
116
|
+
count.should eq(1)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context "when the block evals none to true" do
|
|
121
|
+
|
|
122
|
+
let(:count) do
|
|
123
|
+
context.count do |doc|
|
|
124
|
+
doc.street == "friedel"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "returns 0" do
|
|
129
|
+
count.should eq(0)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
[ :delete, :delete_all ].each do |method|
|
|
136
|
+
|
|
137
|
+
let(:person) do
|
|
138
|
+
Person.create
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
let(:hobrecht) do
|
|
142
|
+
person.addresses.create(street: "hobrecht")
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
let(:friedel) do
|
|
146
|
+
person.addresses.create(street: "friedel")
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
let(:pfluger) do
|
|
150
|
+
person.addresses.create(street: "pfluger")
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
describe "##{method}" do
|
|
154
|
+
|
|
155
|
+
context "when embedded a single level" do
|
|
156
|
+
|
|
157
|
+
let(:criteria) do
|
|
158
|
+
Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
|
|
159
|
+
crit.documents = [ hobrecht, friedel, pfluger ]
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
let(:context) do
|
|
164
|
+
described_class.new(criteria)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
let!(:deleted) do
|
|
168
|
+
context.send(method)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "deletes the first matching document" do
|
|
172
|
+
hobrecht.should be_destroyed
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it "deletes the last matching document" do
|
|
176
|
+
friedel.should be_destroyed
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "does not delete non matching docs" do
|
|
180
|
+
pfluger.should_not be_destroyed
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "removes the docs from the relation" do
|
|
184
|
+
person.addresses.should eq([ pfluger ])
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it "removes the docs from the context" do
|
|
188
|
+
context.entries.should be_empty
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "persists the changes to the database" do
|
|
192
|
+
person.reload.addresses.should eq([ pfluger ])
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
it "returns the number of deleted documents" do
|
|
196
|
+
deleted.should eq(2)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
context "when embedded multiple levels" do
|
|
201
|
+
|
|
202
|
+
let!(:home) do
|
|
203
|
+
hobrecht.locations.create(name: "home")
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
let!(:work) do
|
|
207
|
+
hobrecht.locations.create(name: "work")
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
let(:criteria) do
|
|
211
|
+
Location.where(name: "work").tap do |crit|
|
|
212
|
+
crit.documents = [ home, work ]
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
let(:context) do
|
|
217
|
+
described_class.new(criteria)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
let!(:deleted) do
|
|
221
|
+
context.send(method)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "deletes the first matching document" do
|
|
225
|
+
work.should be_destroyed
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "does not delete non matching docs" do
|
|
229
|
+
home.should_not be_destroyed
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "removes the docs from the relation" do
|
|
233
|
+
person.addresses.first.locations.should eq([ home ])
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
it "removes the docs from the context" do
|
|
237
|
+
context.entries.should be_empty
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "persists the changes to the database" do
|
|
241
|
+
person.reload.addresses.first.locations.should eq([ home ])
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
it "returns the number of deleted documents" do
|
|
245
|
+
deleted.should eq(1)
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
[ :destroy, :destroy_all ].each do |method|
|
|
252
|
+
|
|
253
|
+
let(:person) do
|
|
254
|
+
Person.create
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
let(:hobrecht) do
|
|
258
|
+
person.addresses.create(street: "hobrecht")
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
let(:friedel) do
|
|
262
|
+
person.addresses.create(street: "friedel")
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
let(:pfluger) do
|
|
266
|
+
person.addresses.create(street: "pfluger")
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
let(:criteria) do
|
|
270
|
+
Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
|
|
271
|
+
crit.documents = [ hobrecht, friedel, pfluger ]
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
let(:context) do
|
|
276
|
+
described_class.new(criteria)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
describe "##{method}" do
|
|
280
|
+
|
|
281
|
+
let!(:destroyed) do
|
|
282
|
+
context.send(method)
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it "deletes the first matching document" do
|
|
286
|
+
hobrecht.should be_destroyed
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
it "deletes the last matching document" do
|
|
290
|
+
friedel.should be_destroyed
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
it "does not delete non matching docs" do
|
|
294
|
+
pfluger.should_not be_destroyed
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
it "removes the docs from the relation" do
|
|
298
|
+
person.addresses.should eq([ pfluger ])
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "removes the docs from the context" do
|
|
302
|
+
context.entries.should be_empty
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
it "persists the changes to the database" do
|
|
306
|
+
person.reload.addresses.should eq([ pfluger ])
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
it "returns the number of destroyed documents" do
|
|
310
|
+
destroyed.should eq(2)
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
describe "#distinct" do
|
|
316
|
+
|
|
317
|
+
let(:hobrecht) do
|
|
318
|
+
Address.new(street: "hobrecht")
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
let(:friedel) do
|
|
322
|
+
Address.new(street: "friedel")
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
context "when limiting the result set" do
|
|
326
|
+
|
|
327
|
+
let(:criteria) do
|
|
328
|
+
Address.where(street: "hobrecht").tap do |crit|
|
|
329
|
+
crit.documents = [ hobrecht, hobrecht, friedel ]
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
let(:context) do
|
|
334
|
+
described_class.new(criteria)
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
it "returns the distinct field values" do
|
|
338
|
+
context.distinct(:street).should eq([ "hobrecht" ])
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
context "when not limiting the result set" do
|
|
343
|
+
|
|
344
|
+
let(:criteria) do
|
|
345
|
+
Address.all.tap do |crit|
|
|
346
|
+
crit.documents = [ hobrecht, friedel, friedel ]
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
let(:context) do
|
|
351
|
+
described_class.new(criteria)
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
it "returns the distinct field values" do
|
|
355
|
+
context.distinct(:street).should eq([ "hobrecht", "friedel" ])
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
describe "#each" do
|
|
361
|
+
|
|
362
|
+
let(:hobrecht) do
|
|
363
|
+
Address.new(street: "hobrecht")
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
let(:friedel) do
|
|
367
|
+
Address.new(street: "friedel")
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
let(:criteria) do
|
|
371
|
+
Address.where(street: "hobrecht").tap do |crit|
|
|
372
|
+
crit.documents = [ hobrecht, friedel ]
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
let(:context) do
|
|
377
|
+
described_class.new(criteria)
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
context "when skip and limit outside of range" do
|
|
381
|
+
|
|
382
|
+
before do
|
|
383
|
+
context.skip(10).limit(2)
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
it "contains no documents" do
|
|
387
|
+
context.map(&:street).should be_empty
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
context "when calling next on the enumerator" do
|
|
391
|
+
|
|
392
|
+
it "raises a stop iteration error" do
|
|
393
|
+
expect {
|
|
394
|
+
context.each.next
|
|
395
|
+
}.to raise_error(StopIteration)
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
context "when providing a block" do
|
|
401
|
+
|
|
402
|
+
it "yields mongoid documents to the block" do
|
|
403
|
+
context.each do |doc|
|
|
404
|
+
doc.should be_a(Mongoid::Document)
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
it "iterates over the matching documents" do
|
|
409
|
+
context.each do |doc|
|
|
410
|
+
doc.should eq(hobrecht)
|
|
411
|
+
end
|
|
412
|
+
end
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
context "when no block is provided" do
|
|
416
|
+
|
|
417
|
+
let(:enum) do
|
|
418
|
+
context.each
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
it "returns an enumerator" do
|
|
422
|
+
enum.should be_a(Enumerator)
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
context "when iterating over the enumerator" do
|
|
426
|
+
|
|
427
|
+
context "when iterating with each" do
|
|
428
|
+
|
|
429
|
+
it "yields mongoid documents to the block" do
|
|
430
|
+
enum.each do |doc|
|
|
431
|
+
doc.should be_a(Mongoid::Document)
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
context "when iterating with next" do
|
|
437
|
+
|
|
438
|
+
it "yields mongoid documents" do
|
|
439
|
+
enum.next.should be_a(Mongoid::Document)
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
describe "#exists?" do
|
|
447
|
+
|
|
448
|
+
let(:hobrecht) do
|
|
449
|
+
Address.new(street: "hobrecht")
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
let(:friedel) do
|
|
453
|
+
Address.new(street: "friedel")
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
context "when there are matching documents" do
|
|
457
|
+
|
|
458
|
+
let(:criteria) do
|
|
459
|
+
Address.where(street: "hobrecht").tap do |crit|
|
|
460
|
+
crit.documents = [ hobrecht, friedel ]
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
let(:context) do
|
|
465
|
+
described_class.new(criteria)
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
it "returns true" do
|
|
469
|
+
context.should be_exists
|
|
470
|
+
end
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
context "when there are no matching documents" do
|
|
474
|
+
|
|
475
|
+
let(:criteria) do
|
|
476
|
+
Address.where(street: "pfluger").tap do |crit|
|
|
477
|
+
crit.documents = [ hobrecht, friedel ]
|
|
478
|
+
end
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
let(:context) do
|
|
482
|
+
described_class.new(criteria)
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
it "returns false" do
|
|
486
|
+
context.should_not be_exists
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
[ :first, :one ].each do |method|
|
|
492
|
+
|
|
493
|
+
describe "##{method}" do
|
|
494
|
+
|
|
495
|
+
let(:hobrecht) do
|
|
496
|
+
Address.new(street: "hobrecht")
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
let(:friedel) do
|
|
500
|
+
Address.new(street: "friedel")
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
let(:criteria) do
|
|
504
|
+
Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
|
|
505
|
+
crit.documents = [ hobrecht, friedel ]
|
|
506
|
+
end
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
let(:context) do
|
|
510
|
+
described_class.new(criteria)
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
it "returns the first matching document" do
|
|
514
|
+
context.send(method).should eq(hobrecht)
|
|
515
|
+
end
|
|
516
|
+
end
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
describe "#initialize" do
|
|
520
|
+
|
|
521
|
+
context "when the criteria has no options" do
|
|
522
|
+
|
|
523
|
+
let(:hobrecht) do
|
|
524
|
+
Address.new(street: "hobrecht")
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
let(:friedel) do
|
|
528
|
+
Address.new(street: "friedel")
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
let(:criteria) do
|
|
532
|
+
Address.where(street: "hobrecht").tap do |crit|
|
|
533
|
+
crit.documents = [ hobrecht, friedel ]
|
|
534
|
+
end
|
|
535
|
+
end
|
|
536
|
+
|
|
537
|
+
let(:context) do
|
|
538
|
+
described_class.new(criteria)
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
it "sets the criteria" do
|
|
542
|
+
context.criteria.should eq(criteria)
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
it "sets the klass" do
|
|
546
|
+
context.klass.should eq(Address)
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
it "sets the matching documents" do
|
|
550
|
+
context.documents.should eq([ hobrecht ])
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
context "when the criteria skips" do
|
|
555
|
+
|
|
556
|
+
let(:hobrecht) do
|
|
557
|
+
Address.new(street: "hobrecht")
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
let(:friedel) do
|
|
561
|
+
Address.new(street: "friedel")
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
let(:criteria) do
|
|
565
|
+
Address.all.skip(1).tap do |crit|
|
|
566
|
+
crit.documents = [ hobrecht, friedel ]
|
|
567
|
+
end
|
|
568
|
+
end
|
|
569
|
+
|
|
570
|
+
let(:context) do
|
|
571
|
+
described_class.new(criteria)
|
|
572
|
+
end
|
|
573
|
+
|
|
574
|
+
it "limits the matching documents" do
|
|
575
|
+
context.should eq([ friedel ])
|
|
576
|
+
end
|
|
577
|
+
end
|
|
578
|
+
|
|
579
|
+
context "when the criteria limits" do
|
|
580
|
+
|
|
581
|
+
let(:hobrecht) do
|
|
582
|
+
Address.new(street: "hobrecht")
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
let(:friedel) do
|
|
586
|
+
Address.new(street: "friedel")
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
let(:criteria) do
|
|
590
|
+
Address.all.limit(1).tap do |crit|
|
|
591
|
+
crit.documents = [ hobrecht, friedel ]
|
|
592
|
+
end
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
let(:context) do
|
|
596
|
+
described_class.new(criteria)
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
it "limits the matching documents" do
|
|
600
|
+
context.should eq([ hobrecht ])
|
|
601
|
+
end
|
|
602
|
+
end
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
describe "#last" do
|
|
606
|
+
|
|
607
|
+
let(:hobrecht) do
|
|
608
|
+
Address.new(street: "hobrecht")
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
let(:friedel) do
|
|
612
|
+
Address.new(street: "friedel")
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
let(:criteria) do
|
|
616
|
+
Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
|
|
617
|
+
crit.documents = [ hobrecht, friedel ]
|
|
618
|
+
end
|
|
619
|
+
end
|
|
620
|
+
|
|
621
|
+
let(:context) do
|
|
622
|
+
described_class.new(criteria)
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
it "returns the last matching document" do
|
|
626
|
+
context.last.should eq(friedel)
|
|
627
|
+
end
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
[ :length, :size ].each do |method|
|
|
631
|
+
|
|
632
|
+
describe "##{method}" do
|
|
633
|
+
|
|
634
|
+
let(:hobrecht) do
|
|
635
|
+
Address.new(street: "hobrecht")
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
let(:friedel) do
|
|
639
|
+
Address.new(street: "friedel")
|
|
640
|
+
end
|
|
641
|
+
|
|
642
|
+
context "when there are matching documents" do
|
|
643
|
+
|
|
644
|
+
let(:criteria) do
|
|
645
|
+
Address.where(street: "hobrecht").tap do |crit|
|
|
646
|
+
crit.documents = [ hobrecht, friedel ]
|
|
647
|
+
end
|
|
648
|
+
end
|
|
649
|
+
|
|
650
|
+
let(:context) do
|
|
651
|
+
described_class.new(criteria)
|
|
652
|
+
end
|
|
653
|
+
|
|
654
|
+
it "returns the number of matches" do
|
|
655
|
+
context.send(method).should eq(1)
|
|
656
|
+
end
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
context "when there are no matching documents" do
|
|
660
|
+
|
|
661
|
+
let(:criteria) do
|
|
662
|
+
Address.where(street: "pfluger").tap do |crit|
|
|
663
|
+
crit.documents = [ hobrecht, friedel ]
|
|
664
|
+
end
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
let(:context) do
|
|
668
|
+
described_class.new(criteria)
|
|
669
|
+
end
|
|
670
|
+
|
|
671
|
+
it "returns zero" do
|
|
672
|
+
context.send(method).should eq(0)
|
|
673
|
+
end
|
|
674
|
+
end
|
|
675
|
+
end
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
describe "#limit" do
|
|
679
|
+
|
|
680
|
+
let(:hobrecht) do
|
|
681
|
+
Address.new(street: "hobrecht")
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
let(:friedel) do
|
|
685
|
+
Address.new(street: "friedel")
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
let(:pfluger) do
|
|
689
|
+
Address.new(street: "pfluger")
|
|
690
|
+
end
|
|
691
|
+
|
|
692
|
+
let(:criteria) do
|
|
693
|
+
Address.all.tap do |crit|
|
|
694
|
+
crit.documents = [ hobrecht, friedel, pfluger ]
|
|
695
|
+
end
|
|
696
|
+
end
|
|
697
|
+
|
|
698
|
+
let(:context) do
|
|
699
|
+
described_class.new(criteria)
|
|
700
|
+
end
|
|
701
|
+
|
|
702
|
+
let!(:limit) do
|
|
703
|
+
context.limit(2)
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
it "returns the context" do
|
|
707
|
+
limit.should eq(context)
|
|
708
|
+
end
|
|
709
|
+
|
|
710
|
+
context "when asking for all documents" do
|
|
711
|
+
|
|
712
|
+
context "when only a limit exists" do
|
|
713
|
+
|
|
714
|
+
it "only returns the limited documents" do
|
|
715
|
+
context.entries.should eq([ hobrecht, friedel ])
|
|
716
|
+
end
|
|
717
|
+
end
|
|
718
|
+
|
|
719
|
+
context "when a skip and limit exist" do
|
|
720
|
+
|
|
721
|
+
before do
|
|
722
|
+
limit.skip(1)
|
|
723
|
+
end
|
|
724
|
+
|
|
725
|
+
it "applies the skip before the limit" do
|
|
726
|
+
context.entries.should eq([ friedel, pfluger ])
|
|
727
|
+
end
|
|
728
|
+
end
|
|
729
|
+
end
|
|
730
|
+
end
|
|
731
|
+
|
|
732
|
+
describe "#skip" do
|
|
733
|
+
|
|
734
|
+
let(:hobrecht) do
|
|
735
|
+
Address.new(street: "hobrecht")
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
let(:friedel) do
|
|
739
|
+
Address.new(street: "friedel")
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
let(:pfluger) do
|
|
743
|
+
Address.new(street: "pfluger")
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
let(:criteria) do
|
|
747
|
+
Address.all.tap do |crit|
|
|
748
|
+
crit.documents = [ hobrecht, friedel, pfluger ]
|
|
749
|
+
end
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
let(:context) do
|
|
753
|
+
described_class.new(criteria)
|
|
754
|
+
end
|
|
755
|
+
|
|
756
|
+
let!(:skip) do
|
|
757
|
+
context.skip(1)
|
|
758
|
+
end
|
|
759
|
+
|
|
760
|
+
it "returns the context" do
|
|
761
|
+
skip.should eq(context)
|
|
762
|
+
end
|
|
763
|
+
|
|
764
|
+
context "when asking for all documents" do
|
|
765
|
+
|
|
766
|
+
context "when only a skip exists" do
|
|
767
|
+
|
|
768
|
+
it "skips the correct number" do
|
|
769
|
+
context.entries.should eq([ friedel, pfluger ])
|
|
770
|
+
end
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
context "when a skip and limit exist" do
|
|
774
|
+
|
|
775
|
+
before do
|
|
776
|
+
skip.limit(1)
|
|
777
|
+
end
|
|
778
|
+
|
|
779
|
+
it "applies the skip before the limit" do
|
|
780
|
+
context.entries.should eq([ friedel ])
|
|
781
|
+
end
|
|
782
|
+
end
|
|
783
|
+
end
|
|
784
|
+
end
|
|
785
|
+
|
|
786
|
+
describe "#sort" do
|
|
787
|
+
|
|
788
|
+
let(:hobrecht) do
|
|
789
|
+
Address.new(street: "hobrecht", number: 9, name: "hobrecht")
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
let(:friedel) do
|
|
793
|
+
Address.new(street: "friedel", number: 1, name: "friedel")
|
|
794
|
+
end
|
|
795
|
+
|
|
796
|
+
let(:pfluger) do
|
|
797
|
+
Address.new(street: "pfluger", number: 5, name: "pfluger")
|
|
798
|
+
end
|
|
799
|
+
|
|
800
|
+
let(:criteria) do
|
|
801
|
+
Address.all.tap do |crit|
|
|
802
|
+
crit.documents = [ hobrecht, friedel, pfluger ]
|
|
803
|
+
end
|
|
804
|
+
end
|
|
805
|
+
|
|
806
|
+
let(:context) do
|
|
807
|
+
described_class.new(criteria)
|
|
808
|
+
end
|
|
809
|
+
|
|
810
|
+
context "when providing a single field sort" do
|
|
811
|
+
|
|
812
|
+
context "when the sort is ascending" do
|
|
813
|
+
|
|
814
|
+
let!(:sorted) do
|
|
815
|
+
context.sort(street: 1)
|
|
816
|
+
end
|
|
817
|
+
|
|
818
|
+
it "sorts the documents" do
|
|
819
|
+
context.entries.should eq([ friedel, hobrecht, pfluger ])
|
|
820
|
+
end
|
|
821
|
+
|
|
822
|
+
it "returns the context" do
|
|
823
|
+
sorted.should eq(context)
|
|
824
|
+
end
|
|
825
|
+
end
|
|
826
|
+
|
|
827
|
+
context "when the sort is descending" do
|
|
828
|
+
|
|
829
|
+
context "when sorting on a string" do
|
|
830
|
+
|
|
831
|
+
let!(:sorted) do
|
|
832
|
+
context.sort(street: -1)
|
|
833
|
+
end
|
|
834
|
+
|
|
835
|
+
it "sorts the documents" do
|
|
836
|
+
context.entries.should eq([ pfluger, hobrecht, friedel ])
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
it "returns the context" do
|
|
840
|
+
sorted.should eq(context)
|
|
841
|
+
end
|
|
842
|
+
end
|
|
843
|
+
|
|
844
|
+
context "when sorting on a time" do
|
|
845
|
+
|
|
846
|
+
before do
|
|
847
|
+
pfluger.move_in = 30.days.ago
|
|
848
|
+
hobrecht.move_in = 25.days.ago
|
|
849
|
+
end
|
|
850
|
+
|
|
851
|
+
let!(:sorted) do
|
|
852
|
+
context.sort(move_in: -1)
|
|
853
|
+
end
|
|
854
|
+
|
|
855
|
+
it "sorts the documents" do
|
|
856
|
+
context.entries.should eq([ friedel, hobrecht, pfluger ])
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
it "returns the context" do
|
|
860
|
+
sorted.should eq(context)
|
|
861
|
+
end
|
|
862
|
+
end
|
|
863
|
+
end
|
|
864
|
+
end
|
|
865
|
+
|
|
866
|
+
context "when providing multiple sort fields" do
|
|
867
|
+
|
|
868
|
+
let(:lenau) do
|
|
869
|
+
Address.new(street: "lenau", number: 5, name: "lenau")
|
|
870
|
+
end
|
|
871
|
+
|
|
872
|
+
before do
|
|
873
|
+
criteria.documents.unshift(lenau)
|
|
874
|
+
end
|
|
875
|
+
|
|
876
|
+
context "when the sort is ascending" do
|
|
877
|
+
|
|
878
|
+
let!(:sorted) do
|
|
879
|
+
context.sort(number: 1, street: 1)
|
|
880
|
+
end
|
|
881
|
+
|
|
882
|
+
it "sorts the documents" do
|
|
883
|
+
context.entries.should eq([ friedel, lenau, pfluger, hobrecht ])
|
|
884
|
+
end
|
|
885
|
+
|
|
886
|
+
it "returns the context" do
|
|
887
|
+
sorted.should eq(context)
|
|
888
|
+
end
|
|
889
|
+
end
|
|
890
|
+
|
|
891
|
+
context "when the sort is descending" do
|
|
892
|
+
|
|
893
|
+
let!(:sorted) do
|
|
894
|
+
context.sort(number: -1, street: -1)
|
|
895
|
+
end
|
|
896
|
+
|
|
897
|
+
it "sorts the documents" do
|
|
898
|
+
context.entries.should eq([ hobrecht, pfluger, lenau, friedel ])
|
|
899
|
+
end
|
|
900
|
+
|
|
901
|
+
it "returns the context" do
|
|
902
|
+
sorted.should eq(context)
|
|
903
|
+
end
|
|
904
|
+
end
|
|
905
|
+
end
|
|
906
|
+
|
|
907
|
+
context "when the field is nil" do
|
|
908
|
+
|
|
909
|
+
let!(:sorted) do
|
|
910
|
+
context.sort(state: 1)
|
|
911
|
+
end
|
|
912
|
+
|
|
913
|
+
it "does not sort the documents" do
|
|
914
|
+
context.entries.should eq([ hobrecht, friedel, pfluger ])
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
it "returns the context" do
|
|
918
|
+
sorted.should eq(context)
|
|
919
|
+
end
|
|
920
|
+
end
|
|
921
|
+
|
|
922
|
+
context "with localized field" do
|
|
923
|
+
|
|
924
|
+
let!(:sorted) do
|
|
925
|
+
context.sort("name.en" => 1)
|
|
926
|
+
end
|
|
927
|
+
|
|
928
|
+
it "sorts the documents" do
|
|
929
|
+
context.entries.should eq([ friedel, hobrecht, pfluger ])
|
|
930
|
+
end
|
|
931
|
+
end
|
|
932
|
+
end
|
|
933
|
+
|
|
934
|
+
describe "#update" do
|
|
935
|
+
|
|
936
|
+
let(:person) do
|
|
937
|
+
Person.create
|
|
938
|
+
end
|
|
939
|
+
|
|
940
|
+
let(:hobrecht) do
|
|
941
|
+
person.addresses.create(street: "hobrecht")
|
|
942
|
+
end
|
|
943
|
+
|
|
944
|
+
let(:friedel) do
|
|
945
|
+
person.addresses.create(street: "friedel")
|
|
946
|
+
end
|
|
947
|
+
|
|
948
|
+
let(:pfluger) do
|
|
949
|
+
person.addresses.create(street: "pfluger")
|
|
950
|
+
end
|
|
951
|
+
|
|
952
|
+
context "when the documents are embedded one level" do
|
|
953
|
+
|
|
954
|
+
let(:criteria) do
|
|
955
|
+
Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
|
|
956
|
+
crit.documents = [ hobrecht, friedel, pfluger ]
|
|
957
|
+
end
|
|
958
|
+
end
|
|
959
|
+
|
|
960
|
+
let(:context) do
|
|
961
|
+
described_class.new(criteria)
|
|
962
|
+
end
|
|
963
|
+
|
|
964
|
+
context "when attributes are provided" do
|
|
965
|
+
|
|
966
|
+
before do
|
|
967
|
+
context.update(number: 5)
|
|
968
|
+
end
|
|
969
|
+
|
|
970
|
+
it "updates the first matching document" do
|
|
971
|
+
hobrecht.number.should eq(5)
|
|
972
|
+
end
|
|
973
|
+
|
|
974
|
+
it "does not update the last matching document" do
|
|
975
|
+
friedel.number.should be_nil
|
|
976
|
+
end
|
|
977
|
+
|
|
978
|
+
it "does not update non matching docs" do
|
|
979
|
+
pfluger.number.should be_nil
|
|
980
|
+
end
|
|
981
|
+
|
|
982
|
+
context "when reloading the embedded documents" do
|
|
983
|
+
|
|
984
|
+
it "updates the first matching document" do
|
|
985
|
+
hobrecht.reload.number.should eq(5)
|
|
986
|
+
end
|
|
987
|
+
|
|
988
|
+
it "updates the last matching document" do
|
|
989
|
+
friedel.reload.number.should be_nil
|
|
990
|
+
end
|
|
991
|
+
|
|
992
|
+
it "does not update non matching docs" do
|
|
993
|
+
pfluger.reload.number.should be_nil
|
|
994
|
+
end
|
|
995
|
+
end
|
|
996
|
+
end
|
|
997
|
+
|
|
998
|
+
context "when no attributes are provided" do
|
|
999
|
+
|
|
1000
|
+
it "returns false" do
|
|
1001
|
+
context.update.should be_false
|
|
1002
|
+
end
|
|
1003
|
+
end
|
|
1004
|
+
end
|
|
1005
|
+
|
|
1006
|
+
context "when the documents are embedded multiple levels" do
|
|
1007
|
+
|
|
1008
|
+
let!(:home) do
|
|
1009
|
+
hobrecht.locations.create(name: "home")
|
|
1010
|
+
end
|
|
1011
|
+
|
|
1012
|
+
let!(:work) do
|
|
1013
|
+
hobrecht.locations.create(name: "work")
|
|
1014
|
+
end
|
|
1015
|
+
|
|
1016
|
+
let(:criteria) do
|
|
1017
|
+
Location.where(name: "work").tap do |crit|
|
|
1018
|
+
crit.documents = [ home, work ]
|
|
1019
|
+
end
|
|
1020
|
+
end
|
|
1021
|
+
|
|
1022
|
+
let(:context) do
|
|
1023
|
+
described_class.new(criteria)
|
|
1024
|
+
end
|
|
1025
|
+
|
|
1026
|
+
context "when attributes are provided" do
|
|
1027
|
+
|
|
1028
|
+
before do
|
|
1029
|
+
context.update(number: 5)
|
|
1030
|
+
end
|
|
1031
|
+
|
|
1032
|
+
it "updates the first matching document" do
|
|
1033
|
+
work.number.should eq(5)
|
|
1034
|
+
end
|
|
1035
|
+
|
|
1036
|
+
it "does not update non matching docs" do
|
|
1037
|
+
home.number.should be_nil
|
|
1038
|
+
end
|
|
1039
|
+
|
|
1040
|
+
context "when reloading the embedded documents" do
|
|
1041
|
+
|
|
1042
|
+
it "updates the first matching document" do
|
|
1043
|
+
work.reload.number.should eq(5)
|
|
1044
|
+
end
|
|
1045
|
+
|
|
1046
|
+
it "does not update non matching docs" do
|
|
1047
|
+
home.reload.number.should be_nil
|
|
1048
|
+
end
|
|
1049
|
+
end
|
|
1050
|
+
end
|
|
1051
|
+
|
|
1052
|
+
context "when no attributes are provided" do
|
|
1053
|
+
|
|
1054
|
+
it "returns false" do
|
|
1055
|
+
context.update.should be_false
|
|
1056
|
+
end
|
|
1057
|
+
end
|
|
1058
|
+
end
|
|
1059
|
+
end
|
|
1060
|
+
|
|
1061
|
+
describe "#update_all" do
|
|
1062
|
+
|
|
1063
|
+
let(:person) do
|
|
1064
|
+
Person.create
|
|
1065
|
+
end
|
|
1066
|
+
|
|
1067
|
+
let(:hobrecht) do
|
|
1068
|
+
person.addresses.create(street: "hobrecht")
|
|
1069
|
+
end
|
|
1070
|
+
|
|
1071
|
+
let(:friedel) do
|
|
1072
|
+
person.addresses.create(street: "friedel")
|
|
1073
|
+
end
|
|
1074
|
+
|
|
1075
|
+
let(:pfluger) do
|
|
1076
|
+
person.addresses.create(street: "pfluger")
|
|
1077
|
+
end
|
|
1078
|
+
|
|
1079
|
+
context "when the documents are empty" do
|
|
1080
|
+
|
|
1081
|
+
let(:person_two) do
|
|
1082
|
+
Person.create
|
|
1083
|
+
end
|
|
1084
|
+
|
|
1085
|
+
let(:criteria) do
|
|
1086
|
+
Address.all
|
|
1087
|
+
end
|
|
1088
|
+
|
|
1089
|
+
let(:context) do
|
|
1090
|
+
described_class.new(criteria)
|
|
1091
|
+
end
|
|
1092
|
+
|
|
1093
|
+
it "returns false" do
|
|
1094
|
+
context.update_all({}).should be_false
|
|
1095
|
+
end
|
|
1096
|
+
end
|
|
1097
|
+
|
|
1098
|
+
context "when the documents are embedded one level" do
|
|
1099
|
+
|
|
1100
|
+
let(:criteria) do
|
|
1101
|
+
Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
|
|
1102
|
+
crit.documents = [ hobrecht, friedel, pfluger ]
|
|
1103
|
+
end
|
|
1104
|
+
end
|
|
1105
|
+
|
|
1106
|
+
let(:context) do
|
|
1107
|
+
described_class.new(criteria)
|
|
1108
|
+
end
|
|
1109
|
+
|
|
1110
|
+
context "when providing aliased fields" do
|
|
1111
|
+
|
|
1112
|
+
before do
|
|
1113
|
+
context.update_all(suite: "10B")
|
|
1114
|
+
end
|
|
1115
|
+
|
|
1116
|
+
it "updates the first matching document" do
|
|
1117
|
+
hobrecht.suite.should eq("10B")
|
|
1118
|
+
end
|
|
1119
|
+
|
|
1120
|
+
it "updates the last matching document" do
|
|
1121
|
+
friedel.suite.should eq("10B")
|
|
1122
|
+
end
|
|
1123
|
+
|
|
1124
|
+
it "does not update non matching docs" do
|
|
1125
|
+
pfluger.suite.should be_nil
|
|
1126
|
+
end
|
|
1127
|
+
end
|
|
1128
|
+
|
|
1129
|
+
context "when attributes are provided" do
|
|
1130
|
+
|
|
1131
|
+
before do
|
|
1132
|
+
context.update_all(number: 5)
|
|
1133
|
+
end
|
|
1134
|
+
|
|
1135
|
+
it "updates the first matching document" do
|
|
1136
|
+
hobrecht.number.should eq(5)
|
|
1137
|
+
end
|
|
1138
|
+
|
|
1139
|
+
it "updates the last matching document" do
|
|
1140
|
+
friedel.number.should eq(5)
|
|
1141
|
+
end
|
|
1142
|
+
|
|
1143
|
+
it "does not update non matching docs" do
|
|
1144
|
+
pfluger.number.should be_nil
|
|
1145
|
+
end
|
|
1146
|
+
|
|
1147
|
+
context "when reloading the embedded documents" do
|
|
1148
|
+
|
|
1149
|
+
it "updates the first matching document" do
|
|
1150
|
+
hobrecht.reload.number.should eq(5)
|
|
1151
|
+
end
|
|
1152
|
+
|
|
1153
|
+
it "updates the last matching document" do
|
|
1154
|
+
friedel.reload.number.should eq(5)
|
|
1155
|
+
end
|
|
1156
|
+
|
|
1157
|
+
it "does not update non matching docs" do
|
|
1158
|
+
pfluger.reload.number.should be_nil
|
|
1159
|
+
end
|
|
1160
|
+
end
|
|
1161
|
+
|
|
1162
|
+
context "when updating the documents a second time" do
|
|
1163
|
+
|
|
1164
|
+
before do
|
|
1165
|
+
context.update_all(number: 5)
|
|
1166
|
+
end
|
|
1167
|
+
|
|
1168
|
+
it "does not error on the update" do
|
|
1169
|
+
hobrecht.number.should eq(5)
|
|
1170
|
+
end
|
|
1171
|
+
end
|
|
1172
|
+
end
|
|
1173
|
+
|
|
1174
|
+
context "when no attributes are provided" do
|
|
1175
|
+
|
|
1176
|
+
it "returns false" do
|
|
1177
|
+
context.update_all.should be_false
|
|
1178
|
+
end
|
|
1179
|
+
end
|
|
1180
|
+
end
|
|
1181
|
+
|
|
1182
|
+
context "when the documents are embedded multiple levels" do
|
|
1183
|
+
|
|
1184
|
+
let!(:home) do
|
|
1185
|
+
hobrecht.locations.create(name: "home")
|
|
1186
|
+
end
|
|
1187
|
+
|
|
1188
|
+
let!(:work) do
|
|
1189
|
+
hobrecht.locations.create(name: "work")
|
|
1190
|
+
end
|
|
1191
|
+
|
|
1192
|
+
let(:criteria) do
|
|
1193
|
+
Location.where(name: "work").tap do |crit|
|
|
1194
|
+
crit.documents = [ home, work ]
|
|
1195
|
+
end
|
|
1196
|
+
end
|
|
1197
|
+
|
|
1198
|
+
let(:context) do
|
|
1199
|
+
described_class.new(criteria)
|
|
1200
|
+
end
|
|
1201
|
+
|
|
1202
|
+
context "when attributes are provided" do
|
|
1203
|
+
|
|
1204
|
+
before do
|
|
1205
|
+
context.update_all(number: 5)
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
it "updates the first matching document" do
|
|
1209
|
+
work.number.should eq(5)
|
|
1210
|
+
end
|
|
1211
|
+
|
|
1212
|
+
it "does not update non matching docs" do
|
|
1213
|
+
home.number.should be_nil
|
|
1214
|
+
end
|
|
1215
|
+
|
|
1216
|
+
context "when reloading the embedded documents" do
|
|
1217
|
+
|
|
1218
|
+
it "updates the first matching document" do
|
|
1219
|
+
work.reload.number.should eq(5)
|
|
1220
|
+
end
|
|
1221
|
+
|
|
1222
|
+
it "does not update non matching docs" do
|
|
1223
|
+
home.reload.number.should be_nil
|
|
1224
|
+
end
|
|
1225
|
+
end
|
|
1226
|
+
end
|
|
1227
|
+
|
|
1228
|
+
context "when no attributes are provided" do
|
|
1229
|
+
|
|
1230
|
+
it "returns false" do
|
|
1231
|
+
context.update_all.should be_false
|
|
1232
|
+
end
|
|
1233
|
+
end
|
|
1234
|
+
end
|
|
1235
|
+
end
|
|
1236
|
+
end
|