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,978 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Scoping do
|
|
4
|
+
|
|
5
|
+
describe ".default_scope" do
|
|
6
|
+
|
|
7
|
+
context "when provided a criteria" do
|
|
8
|
+
|
|
9
|
+
let(:criteria) do
|
|
10
|
+
Band.where(name: "Depeche Mode")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
Band.default_scope criteria
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
after do
|
|
18
|
+
Band.default_scoping = nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "adds the default scope to the class" do
|
|
22
|
+
Band.default_scoping.call.should eq(criteria)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "flags as being default scoped" do
|
|
26
|
+
Band.should be_default_scoping
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "when provided a proc" do
|
|
31
|
+
|
|
32
|
+
let(:criteria) do
|
|
33
|
+
Band.where(name: "Depeche Mode")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
before do
|
|
37
|
+
Band.default_scope ->{ criteria }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
after do
|
|
41
|
+
Band.default_scoping = nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "adds the default scope to the class" do
|
|
45
|
+
Band.default_scoping.call.should eq(criteria)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "flags as being default scoped" do
|
|
49
|
+
Band.should be_default_scoping
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "when provided a non proc or criteria" do
|
|
54
|
+
|
|
55
|
+
it "raises an error" do
|
|
56
|
+
expect {
|
|
57
|
+
Band.default_scope({})
|
|
58
|
+
}.to raise_error(Mongoid::Errors::InvalidScope)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context "when there is more then one default_scope" do
|
|
63
|
+
|
|
64
|
+
let(:criteria) do
|
|
65
|
+
Band.where(name: "Depeche Mode")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
let(:additional_criteria) do
|
|
69
|
+
Band.where(origin: "England")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
let(:proc_criteria) do
|
|
73
|
+
->{ Band.where(active: true) }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
let(:rand_criteria) do
|
|
77
|
+
->{ Band.gt(likes: rand(100)) }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
before do
|
|
81
|
+
Band.default_scope criteria
|
|
82
|
+
Band.default_scope additional_criteria
|
|
83
|
+
Band.default_scope proc_criteria
|
|
84
|
+
Band.default_scope rand_criteria
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
after do
|
|
88
|
+
Band.default_scoping = nil
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "adds the first default scope" do
|
|
92
|
+
Band.default_scoping.call.selector["name"].should eq("Depeche Mode")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "adds the additional default scope" do
|
|
96
|
+
Band.default_scoping.call.selector["origin"].should eq("England")
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "adds the proc default scope" do
|
|
100
|
+
Band.default_scoping.call.selector["active"].should be_true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "delays execution of the merge until called" do
|
|
104
|
+
Band.all.selector["likes"].should_not eq(Band.all.selector["likes"])
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "flags as being default scoped" do
|
|
108
|
+
Band.should be_default_scoping
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
describe ".default_scopable?" do
|
|
114
|
+
|
|
115
|
+
context "when a default scope exists" do
|
|
116
|
+
|
|
117
|
+
let(:criteria) do
|
|
118
|
+
Band.where(name: "Depeche Mode")
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
before do
|
|
122
|
+
Band.default_scope ->{ criteria }
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
after do
|
|
126
|
+
Band.default_scoping = nil
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context "when not in an unscoped block" do
|
|
130
|
+
|
|
131
|
+
it "returns true" do
|
|
132
|
+
Band.should be_default_scopable
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
context "when in an unscoped block" do
|
|
137
|
+
|
|
138
|
+
it "returns false" do
|
|
139
|
+
Band.unscoped do
|
|
140
|
+
Band.should_not be_default_scopable
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
context "when a default scope does not exist" do
|
|
147
|
+
|
|
148
|
+
it "returns false" do
|
|
149
|
+
Band.should_not be_default_scopable
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
describe ".queryable" do
|
|
155
|
+
|
|
156
|
+
context "when no criteria exists on the stack" do
|
|
157
|
+
|
|
158
|
+
it "returns an empty criteria" do
|
|
159
|
+
Band.queryable.selector.should be_empty
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
context "when a criteria exists on the stack" do
|
|
164
|
+
|
|
165
|
+
let(:criteria) do
|
|
166
|
+
Band.where(name: "Depeche Mode")
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
before do
|
|
170
|
+
Band.scope_stack.push(criteria)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
after do
|
|
174
|
+
Band.scope_stack.clear
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "returns the criteria on the stack" do
|
|
178
|
+
Band.queryable.should eq(criteria)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
describe ".scope" do
|
|
184
|
+
|
|
185
|
+
context "when provided a criteria" do
|
|
186
|
+
|
|
187
|
+
context "when a block is provided" do
|
|
188
|
+
|
|
189
|
+
before do
|
|
190
|
+
Band.scope(:active, Band.where(active: true)) do
|
|
191
|
+
def add_origin
|
|
192
|
+
tap { |c| c.selector[:origin] = "Deutschland" }
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
after do
|
|
198
|
+
class << Band
|
|
199
|
+
undef_method :active
|
|
200
|
+
end
|
|
201
|
+
Band._declared_scopes.clear
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
let(:scope) do
|
|
205
|
+
Band.active.add_origin
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "adds the extension to the scope" do
|
|
209
|
+
scope.selector.should eq({ "active" => true, "origin" => "Deutschland" })
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
context "when scoping an embedded document" do
|
|
214
|
+
|
|
215
|
+
before do
|
|
216
|
+
Record.scope(
|
|
217
|
+
:tool,
|
|
218
|
+
Record.where(:name.in => [ "undertow", "aenima", "lateralus" ])
|
|
219
|
+
)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
after do
|
|
223
|
+
class << Record
|
|
224
|
+
undef_method :tool
|
|
225
|
+
end
|
|
226
|
+
Record._declared_scopes.clear
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
context "when calling the scope" do
|
|
230
|
+
|
|
231
|
+
let(:band) do
|
|
232
|
+
Band.new
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
let!(:undertow) do
|
|
236
|
+
band.records.build(name: "undertow")
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
let(:scoped) do
|
|
240
|
+
band.records.tool
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "returns the correct documents" do
|
|
244
|
+
scoped.should eq([ undertow ])
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
context "when no block is provided" do
|
|
250
|
+
|
|
251
|
+
before do
|
|
252
|
+
Band.scope(:active, Band.where(active: true).skip(10))
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
after do
|
|
256
|
+
class << Band
|
|
257
|
+
undef_method :active
|
|
258
|
+
end
|
|
259
|
+
Band._declared_scopes.clear
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "adds a method for the scope" do
|
|
263
|
+
Band.should respond_to(:active)
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
context "when calling the scope" do
|
|
267
|
+
|
|
268
|
+
context "when calling from the class" do
|
|
269
|
+
|
|
270
|
+
let(:scope) do
|
|
271
|
+
Band.active
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
it "returns a criteria" do
|
|
275
|
+
scope.should be_a(Mongoid::Criteria)
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
it "contains the proper selector" do
|
|
279
|
+
scope.selector.should eq({ "active" => true })
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
it "contains the proper options" do
|
|
283
|
+
scope.options.should eq({ skip: 10 })
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
context "when chained to another scope" do
|
|
288
|
+
|
|
289
|
+
before do
|
|
290
|
+
Band.scope(:english, Band.where(origin: "England"))
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
after do
|
|
294
|
+
class << Band
|
|
295
|
+
undef_method :english
|
|
296
|
+
end
|
|
297
|
+
Band._declared_scopes.clear
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
let(:scope) do
|
|
301
|
+
Band.english.active
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
it "returns a criteria" do
|
|
305
|
+
scope.should be_a(Mongoid::Criteria)
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
it "contains the proper selector" do
|
|
309
|
+
scope.selector.should eq({ "active" => true, "origin" => "England" })
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
it "contains the proper options" do
|
|
313
|
+
scope.options.should eq({ skip: 10 })
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
it "does not modify the original scope" do
|
|
317
|
+
Band.active.selector.should eq({ "active" => true })
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
context "when chained to a criteria" do
|
|
322
|
+
|
|
323
|
+
let(:criteria) do
|
|
324
|
+
Band.where(origin: "England")
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
let(:scope) do
|
|
328
|
+
criteria.active
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it "returns a criteria" do
|
|
332
|
+
scope.should be_a(Mongoid::Criteria)
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
it "contains the proper selector" do
|
|
336
|
+
scope.selector.should eq({ "origin" => "England", "active" => true })
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
it "contains the proper options" do
|
|
340
|
+
scope.options.should eq({ skip: 10 })
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
it "does not modify the original scope" do
|
|
344
|
+
Band.active.selector.should eq({ "active" => true })
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
it "does not modify the original criteria" do
|
|
348
|
+
criteria.selector.should eq({ "origin" => "England" })
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
context "when the name conflict with an existing method" do
|
|
355
|
+
|
|
356
|
+
context "when raising an error" do
|
|
357
|
+
|
|
358
|
+
before do
|
|
359
|
+
Mongoid.scope_overwrite_exception = true
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
after do
|
|
363
|
+
Mongoid.scope_overwrite_exception = false
|
|
364
|
+
class << Band
|
|
365
|
+
undef_method :active
|
|
366
|
+
end
|
|
367
|
+
Band._declared_scopes.clear
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
it "raises an exception" do
|
|
371
|
+
expect {
|
|
372
|
+
Band.scope(:active, Band.where(active: true))
|
|
373
|
+
Band.scope(:active, Band.where(active: true))
|
|
374
|
+
}.to raise_error(Mongoid::Errors::ScopeOverwrite)
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
context "when not raising an error" do
|
|
379
|
+
|
|
380
|
+
after do
|
|
381
|
+
Mongoid.scope_overwrite_exception = false
|
|
382
|
+
class << Band
|
|
383
|
+
undef_method :active
|
|
384
|
+
end
|
|
385
|
+
Band._declared_scopes.clear
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
it "raises no exception" do
|
|
389
|
+
Band.scope(:active, Band.where(active: true))
|
|
390
|
+
Band.scope(:active, Band.where(active: true))
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
context "when provided a proc" do
|
|
397
|
+
|
|
398
|
+
context "when a block is provided" do
|
|
399
|
+
|
|
400
|
+
before do
|
|
401
|
+
Band.scope(:active, ->{ Band.where(active: true) }) do
|
|
402
|
+
def add_origin
|
|
403
|
+
tap { |c| c.selector[:origin] = "Deutschland" }
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
after do
|
|
409
|
+
class << Band
|
|
410
|
+
undef_method :active
|
|
411
|
+
end
|
|
412
|
+
Band._declared_scopes.clear
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
let(:scope) do
|
|
416
|
+
Band.active.add_origin
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
it "adds the extension to the scope" do
|
|
420
|
+
scope.selector.should eq({ "active" => true, "origin" => "Deutschland" })
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
context "when no block is provided" do
|
|
425
|
+
|
|
426
|
+
before do
|
|
427
|
+
Band.scope(:active, ->{ Band.where(active: true).skip(10) })
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
after do
|
|
431
|
+
class << Band
|
|
432
|
+
undef_method :active
|
|
433
|
+
end
|
|
434
|
+
Band._declared_scopes.clear
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
it "adds a method for the scope" do
|
|
438
|
+
Band.should respond_to(:active)
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
context "when proc return nil" do
|
|
442
|
+
before do
|
|
443
|
+
Band.scope(:named_by, ->(name) { Band.where(name: name) if name})
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
it "return a all criteral" do
|
|
447
|
+
Band.named_by(nil).should be_a(Mongoid::Criteria)
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
context "when calling the scope" do
|
|
452
|
+
|
|
453
|
+
context "when calling from the class" do
|
|
454
|
+
|
|
455
|
+
let(:scope) do
|
|
456
|
+
Band.active
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
it "returns a criteria" do
|
|
460
|
+
scope.should be_a(Mongoid::Criteria)
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
it "contains the proper selector" do
|
|
464
|
+
scope.selector.should eq({ "active" => true })
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
it "contains the proper options" do
|
|
468
|
+
scope.options.should eq({ skip: 10 })
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
context "when chained to another scope" do
|
|
473
|
+
|
|
474
|
+
before do
|
|
475
|
+
Band.scope(:english, ->{ Band.where(origin: "England") })
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
after do
|
|
479
|
+
class << Band
|
|
480
|
+
undef_method :english
|
|
481
|
+
end
|
|
482
|
+
Band._declared_scopes.clear
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
let(:scope) do
|
|
486
|
+
Band.english.active
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
it "returns a criteria" do
|
|
490
|
+
scope.should be_a(Mongoid::Criteria)
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
it "contains the proper selector" do
|
|
494
|
+
scope.selector.should eq({ "active" => true, "origin" => "England" })
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
it "contains the proper options" do
|
|
498
|
+
scope.options.should eq({ skip: 10 })
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
it "does not modify the original scope" do
|
|
502
|
+
Band.active.selector.should eq({ "active" => true })
|
|
503
|
+
end
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
context "when chained to a criteria" do
|
|
507
|
+
|
|
508
|
+
let(:criteria) do
|
|
509
|
+
Band.where(origin: "England")
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
let(:scope) do
|
|
513
|
+
criteria.active
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
it "returns a criteria" do
|
|
517
|
+
scope.should be_a(Mongoid::Criteria)
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
it "contains the proper selector" do
|
|
521
|
+
scope.selector.should eq({ "origin" => "England", "active" => true })
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
it "contains the proper options" do
|
|
525
|
+
scope.options.should eq({ skip: 10 })
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
it "does not modify the original scope" do
|
|
529
|
+
Band.active.selector.should eq({ "active" => true })
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
it "does not modify the original criteria" do
|
|
533
|
+
criteria.selector.should eq({ "origin" => "England" })
|
|
534
|
+
end
|
|
535
|
+
end
|
|
536
|
+
end
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
context "when the name conflict with an existing method" do
|
|
540
|
+
|
|
541
|
+
context "when raising an error" do
|
|
542
|
+
|
|
543
|
+
before do
|
|
544
|
+
Mongoid.scope_overwrite_exception = true
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
after do
|
|
548
|
+
Mongoid.scope_overwrite_exception = false
|
|
549
|
+
class << Band
|
|
550
|
+
undef_method :active
|
|
551
|
+
end
|
|
552
|
+
Band._declared_scopes.clear
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
it "raises an exception" do
|
|
556
|
+
expect {
|
|
557
|
+
Band.scope(:active, ->{ Band.where(active: true) })
|
|
558
|
+
Band.scope(:active, ->{ Band.where(active: true) })
|
|
559
|
+
}.to raise_error(Mongoid::Errors::ScopeOverwrite)
|
|
560
|
+
end
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
context "when not raising an error" do
|
|
564
|
+
|
|
565
|
+
after do
|
|
566
|
+
Mongoid.scope_overwrite_exception = false
|
|
567
|
+
class << Band
|
|
568
|
+
undef_method :active
|
|
569
|
+
end
|
|
570
|
+
Band._declared_scopes.clear
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
it "raises no exception" do
|
|
574
|
+
Band.scope(:active, ->{ Band.where(active: true) })
|
|
575
|
+
Band.scope(:active, ->{ Band.where(active: true) })
|
|
576
|
+
end
|
|
577
|
+
end
|
|
578
|
+
end
|
|
579
|
+
end
|
|
580
|
+
|
|
581
|
+
context "when provided a non proc or criteria" do
|
|
582
|
+
|
|
583
|
+
it "raises an error" do
|
|
584
|
+
expect {
|
|
585
|
+
Band.scope(:active, {})
|
|
586
|
+
}.to raise_error(Mongoid::Errors::InvalidScope)
|
|
587
|
+
end
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
context "when chaining a non proc with a proc" do
|
|
591
|
+
|
|
592
|
+
context "when both scopes are or queries" do
|
|
593
|
+
|
|
594
|
+
let(:time) do
|
|
595
|
+
Time.now
|
|
596
|
+
end
|
|
597
|
+
|
|
598
|
+
before do
|
|
599
|
+
Band.scope(:xxx, Band.any_of({ :aaa.gt => 0 }, { :bbb.gt => 0 }))
|
|
600
|
+
Band.scope(:yyy, ->{ Band.any_of({ :ccc => nil }, { :ccc.gt => time }) })
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
after do
|
|
604
|
+
class << Band
|
|
605
|
+
undef_method :xxx
|
|
606
|
+
undef_method :yyy
|
|
607
|
+
end
|
|
608
|
+
Band._declared_scopes.clear
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
let(:criteria) do
|
|
612
|
+
Band.yyy.xxx
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
it "properly chains the $or queries together" do
|
|
616
|
+
criteria.selector.should eq({
|
|
617
|
+
"$or" => [
|
|
618
|
+
{ "ccc" => nil },
|
|
619
|
+
{ "ccc" => { "$gt" => time }},
|
|
620
|
+
{ "aaa" => { "$gt" => 0.0 }},
|
|
621
|
+
{ "bbb" => { "$gt" => 0.0 }}
|
|
622
|
+
]
|
|
623
|
+
})
|
|
624
|
+
end
|
|
625
|
+
end
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
context "when working with a subclass" do
|
|
629
|
+
|
|
630
|
+
before do
|
|
631
|
+
Shape.scope(:located_at, ->(x,y) {Shape.where(x: x, y: y)})
|
|
632
|
+
Circle.scope(:with_radius, ->(r) {Circle.where(radius: r)})
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
after do
|
|
636
|
+
class << Shape
|
|
637
|
+
undef_method :located_at
|
|
638
|
+
end
|
|
639
|
+
Shape._declared_scopes.clear
|
|
640
|
+
|
|
641
|
+
class << Circle
|
|
642
|
+
undef_method :with_radius
|
|
643
|
+
end
|
|
644
|
+
Circle._declared_scopes.clear
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
let(:shape_scope_keys) do
|
|
648
|
+
Shape.scopes.keys
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
let(:circle_located_at) do
|
|
652
|
+
Circle.located_at(0,0)
|
|
653
|
+
end
|
|
654
|
+
|
|
655
|
+
let(:circle_scope_keys) do
|
|
656
|
+
Circle.scopes.keys
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
it "doesn't include subclass scopes in superclass scope list" do
|
|
660
|
+
expect(shape_scope_keys).to match_array([:located_at])
|
|
661
|
+
end
|
|
662
|
+
|
|
663
|
+
it "includes superclass scope methods on subclass" do
|
|
664
|
+
expect(circle_located_at).to be_a(Mongoid::Criteria)
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
it "includes superclass scopes in subclass scope list" do
|
|
668
|
+
expect(circle_scope_keys).to match_array([:located_at, :with_radius])
|
|
669
|
+
end
|
|
670
|
+
end
|
|
671
|
+
end
|
|
672
|
+
|
|
673
|
+
describe ".scope_stack" do
|
|
674
|
+
|
|
675
|
+
context "when the scope stack has not been accessed" do
|
|
676
|
+
|
|
677
|
+
it "returns an empty array" do
|
|
678
|
+
Band.scope_stack.should eq([])
|
|
679
|
+
end
|
|
680
|
+
end
|
|
681
|
+
|
|
682
|
+
context "when a criteria exists on the current thread" do
|
|
683
|
+
|
|
684
|
+
let(:criteria) do
|
|
685
|
+
Band.where(active: true)
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
before do
|
|
689
|
+
Mongoid::Threaded.scope_stack[Band.object_id] = [ criteria ]
|
|
690
|
+
end
|
|
691
|
+
|
|
692
|
+
after do
|
|
693
|
+
Mongoid::Threaded.scope_stack[Band.object_id].clear
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
it "returns the criteria in the array" do
|
|
697
|
+
Band.scope_stack.should eq([ criteria ])
|
|
698
|
+
end
|
|
699
|
+
end
|
|
700
|
+
end
|
|
701
|
+
|
|
702
|
+
describe ".scoped" do
|
|
703
|
+
|
|
704
|
+
context "when no options are provided" do
|
|
705
|
+
|
|
706
|
+
let(:scoped) do
|
|
707
|
+
Band.scoped
|
|
708
|
+
end
|
|
709
|
+
|
|
710
|
+
it "returns a criteria" do
|
|
711
|
+
scoped.should be_a(Mongoid::Criteria)
|
|
712
|
+
end
|
|
713
|
+
|
|
714
|
+
it "contains an empty selector" do
|
|
715
|
+
scoped.selector.should be_empty
|
|
716
|
+
end
|
|
717
|
+
|
|
718
|
+
it "contains empty options" do
|
|
719
|
+
scoped.options.should be_empty
|
|
720
|
+
end
|
|
721
|
+
end
|
|
722
|
+
|
|
723
|
+
context "when options are provided" do
|
|
724
|
+
|
|
725
|
+
let(:scoped) do
|
|
726
|
+
Band.scoped(skip: 10, limit: 10)
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
it "returns a criteria" do
|
|
730
|
+
scoped.should be_a(Mongoid::Criteria)
|
|
731
|
+
end
|
|
732
|
+
|
|
733
|
+
it "contains an empty selector" do
|
|
734
|
+
scoped.selector.should be_empty
|
|
735
|
+
end
|
|
736
|
+
|
|
737
|
+
it "contains the options" do
|
|
738
|
+
scoped.options.should eq({ skip: 10, limit: 10 })
|
|
739
|
+
end
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
context "when a default scope exists" do
|
|
743
|
+
|
|
744
|
+
let(:criteria) do
|
|
745
|
+
Band.where(name: "Depeche Mode")
|
|
746
|
+
end
|
|
747
|
+
|
|
748
|
+
before do
|
|
749
|
+
Band.default_scope criteria
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
after do
|
|
753
|
+
Band.default_scoping = nil
|
|
754
|
+
end
|
|
755
|
+
|
|
756
|
+
let(:scoped) do
|
|
757
|
+
Band.scoped
|
|
758
|
+
end
|
|
759
|
+
|
|
760
|
+
it "allows the default scope to be added" do
|
|
761
|
+
scoped.selector.should eq({ "name" => "Depeche Mode" })
|
|
762
|
+
end
|
|
763
|
+
|
|
764
|
+
context "when chained after an unscoped criteria" do
|
|
765
|
+
|
|
766
|
+
let(:scoped) do
|
|
767
|
+
Band.unscoped.scoped
|
|
768
|
+
end
|
|
769
|
+
|
|
770
|
+
it "reapplies the default scope" do
|
|
771
|
+
scoped.selector.should eq({ "name" => "Depeche Mode" })
|
|
772
|
+
end
|
|
773
|
+
end
|
|
774
|
+
end
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
describe ".unscoped" do
|
|
778
|
+
|
|
779
|
+
let(:criteria) do
|
|
780
|
+
Band.where(name: "Depeche Mode")
|
|
781
|
+
end
|
|
782
|
+
|
|
783
|
+
before do
|
|
784
|
+
Band.default_scope criteria
|
|
785
|
+
end
|
|
786
|
+
|
|
787
|
+
after do
|
|
788
|
+
Band.default_scoping = nil
|
|
789
|
+
end
|
|
790
|
+
|
|
791
|
+
context "when called directly" do
|
|
792
|
+
|
|
793
|
+
let(:unscoped) do
|
|
794
|
+
Band.unscoped
|
|
795
|
+
end
|
|
796
|
+
|
|
797
|
+
it "removes the default scope from the criteria" do
|
|
798
|
+
unscoped.selector.should be_empty
|
|
799
|
+
end
|
|
800
|
+
|
|
801
|
+
context "when chained after a scoped criteria" do
|
|
802
|
+
|
|
803
|
+
let(:unscoped) do
|
|
804
|
+
Band.scoped.unscoped
|
|
805
|
+
end
|
|
806
|
+
|
|
807
|
+
it "removes all scoping" do
|
|
808
|
+
unscoped.selector.should be_empty
|
|
809
|
+
end
|
|
810
|
+
end
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
context "when used with a block" do
|
|
814
|
+
|
|
815
|
+
context "when a criteria is called in the block" do
|
|
816
|
+
|
|
817
|
+
it "does not allow default scoping to be added in the block" do
|
|
818
|
+
Band.unscoped do
|
|
819
|
+
Band.skip(10).selector.should be_empty
|
|
820
|
+
end
|
|
821
|
+
end
|
|
822
|
+
end
|
|
823
|
+
|
|
824
|
+
context "when a call is made to scoped in the block" do
|
|
825
|
+
|
|
826
|
+
it "does not allow default scoping to be added in the block" do
|
|
827
|
+
Band.unscoped do
|
|
828
|
+
Band.scoped.selector.should be_empty
|
|
829
|
+
end
|
|
830
|
+
end
|
|
831
|
+
end
|
|
832
|
+
|
|
833
|
+
context "when a named scope is called in the block" do
|
|
834
|
+
|
|
835
|
+
before do
|
|
836
|
+
Band.scope(:skipped, Band.skip(10))
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
after do
|
|
840
|
+
class << Band
|
|
841
|
+
undef_method :skipped
|
|
842
|
+
end
|
|
843
|
+
Band._declared_scopes.clear
|
|
844
|
+
end
|
|
845
|
+
|
|
846
|
+
it "does not allow the default scope to be applied" do
|
|
847
|
+
Band.unscoped do
|
|
848
|
+
Band.skipped.selector.should be_empty
|
|
849
|
+
end
|
|
850
|
+
end
|
|
851
|
+
end
|
|
852
|
+
end
|
|
853
|
+
end
|
|
854
|
+
|
|
855
|
+
describe ".with_default_scope" do
|
|
856
|
+
|
|
857
|
+
let(:criteria) do
|
|
858
|
+
Band.where(name: "Depeche Mode")
|
|
859
|
+
end
|
|
860
|
+
|
|
861
|
+
before do
|
|
862
|
+
Band.default_scope criteria
|
|
863
|
+
end
|
|
864
|
+
|
|
865
|
+
after do
|
|
866
|
+
Band.default_scoping = nil
|
|
867
|
+
end
|
|
868
|
+
|
|
869
|
+
context "when inside an unscoped block" do
|
|
870
|
+
|
|
871
|
+
it "returns an empty criteria" do
|
|
872
|
+
Band.unscoped do
|
|
873
|
+
Band.with_default_scope.selector.should be_empty
|
|
874
|
+
end
|
|
875
|
+
end
|
|
876
|
+
end
|
|
877
|
+
|
|
878
|
+
context "when the criteria is unscoped" do
|
|
879
|
+
|
|
880
|
+
let(:scoped) do
|
|
881
|
+
Band.unscoped.with_default_scope
|
|
882
|
+
end
|
|
883
|
+
|
|
884
|
+
it "returns an empty criteria" do
|
|
885
|
+
scoped.selector.should be_empty
|
|
886
|
+
end
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
context "when no unscoping exists" do
|
|
890
|
+
|
|
891
|
+
let(:scoped) do
|
|
892
|
+
Band.with_default_scope
|
|
893
|
+
end
|
|
894
|
+
|
|
895
|
+
it "returns a scoped criteria" do
|
|
896
|
+
scoped.selector.should eq({ "name" => "Depeche Mode" })
|
|
897
|
+
end
|
|
898
|
+
end
|
|
899
|
+
end
|
|
900
|
+
|
|
901
|
+
describe ".with_scope" do
|
|
902
|
+
|
|
903
|
+
let(:criteria) do
|
|
904
|
+
Band.where(active: true)
|
|
905
|
+
end
|
|
906
|
+
|
|
907
|
+
it "yields to the criteria" do
|
|
908
|
+
Band.with_scope(criteria) do |crit|
|
|
909
|
+
crit.selector.should eq({ "active" => true })
|
|
910
|
+
end
|
|
911
|
+
end
|
|
912
|
+
|
|
913
|
+
it "pops the criteria off the stack" do
|
|
914
|
+
Band.with_scope(criteria) {}
|
|
915
|
+
Band.scope_stack.should be_empty
|
|
916
|
+
end
|
|
917
|
+
end
|
|
918
|
+
|
|
919
|
+
describe ".without_default_scope" do
|
|
920
|
+
|
|
921
|
+
it "sets the threading options" do
|
|
922
|
+
Band.without_default_scope do
|
|
923
|
+
Mongoid::Threaded.should be_executing(:without_default_scope)
|
|
924
|
+
end
|
|
925
|
+
end
|
|
926
|
+
end
|
|
927
|
+
|
|
928
|
+
context "when the document is paranoid" do
|
|
929
|
+
|
|
930
|
+
context "when calling a class method" do
|
|
931
|
+
|
|
932
|
+
let(:criteria) do
|
|
933
|
+
Fish.fresh
|
|
934
|
+
end
|
|
935
|
+
|
|
936
|
+
it "includes the deleted_at criteria in the selector" do
|
|
937
|
+
criteria.selector.should eq({
|
|
938
|
+
"deleted_at" => nil, "fresh" => true
|
|
939
|
+
})
|
|
940
|
+
end
|
|
941
|
+
end
|
|
942
|
+
|
|
943
|
+
context "when chaining a class method to unscoped" do
|
|
944
|
+
|
|
945
|
+
let(:criteria) do
|
|
946
|
+
Fish.unscoped.fresh
|
|
947
|
+
end
|
|
948
|
+
|
|
949
|
+
it "does not include the deleted_at in the selector" do
|
|
950
|
+
criteria.selector.should eq({ "fresh" => true })
|
|
951
|
+
end
|
|
952
|
+
end
|
|
953
|
+
|
|
954
|
+
context "when chaining a class method to deleted" do
|
|
955
|
+
|
|
956
|
+
let(:criteria) do
|
|
957
|
+
Fish.deleted.fresh
|
|
958
|
+
end
|
|
959
|
+
|
|
960
|
+
it "includes the deleted_at $ne criteria in the selector" do
|
|
961
|
+
criteria.selector.should eq({
|
|
962
|
+
"deleted_at" => { "$ne" => nil }, "fresh" => true
|
|
963
|
+
})
|
|
964
|
+
end
|
|
965
|
+
end
|
|
966
|
+
|
|
967
|
+
context "when chaining a where to unscoped" do
|
|
968
|
+
|
|
969
|
+
let(:criteria) do
|
|
970
|
+
Fish.unscoped.where(fresh: true)
|
|
971
|
+
end
|
|
972
|
+
|
|
973
|
+
it "includes no default scoping information in the selector" do
|
|
974
|
+
criteria.selector.should eq({ "fresh" => true })
|
|
975
|
+
end
|
|
976
|
+
end
|
|
977
|
+
end
|
|
978
|
+
end
|