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,290 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Observer do
|
|
4
|
+
|
|
5
|
+
let(:recorder) do
|
|
6
|
+
CallbackRecorder.instance
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
after do
|
|
10
|
+
recorder.reset
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "is an instance of an active model observer" do
|
|
14
|
+
ActorObserver.instance.should be_a_kind_of(ActiveModel::Observer)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "when the oberserver observes a different class" do
|
|
18
|
+
|
|
19
|
+
before(:all) do
|
|
20
|
+
class BandObserver < Mongoid::Observer
|
|
21
|
+
observe :record
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
after(:all) do
|
|
26
|
+
Object.send(:remove_const, :BandObserver)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "returns the proper observed classes" do
|
|
30
|
+
BandObserver.observed_classes.should eq([ Record ])
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context "when the observer is for an embedded document" do
|
|
35
|
+
|
|
36
|
+
before do
|
|
37
|
+
PhoneObserver.instance
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
let(:person) do
|
|
41
|
+
Person.create
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
let!(:phone) do
|
|
45
|
+
person.phone_numbers.create(number: "0152-1111-1111")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context "when updating the embedded document" do
|
|
49
|
+
|
|
50
|
+
before do
|
|
51
|
+
phone.update_attribute(:number, "0152-2222-2222")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "contains the updated value in the observer" do
|
|
55
|
+
phone.number_in_observer.should eq("0152-2222-2222")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "when the observer has descendants" do
|
|
61
|
+
|
|
62
|
+
let!(:observer) do
|
|
63
|
+
ActorObserver.instance
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
let!(:actress) do
|
|
67
|
+
Actress.create!(name: "Tina Fey")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "observes descendent class" do
|
|
71
|
+
observer.last_after_create_record.try(:name).should eq(actress.name)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "when the observer is disabled" do
|
|
76
|
+
|
|
77
|
+
let!(:observer) do
|
|
78
|
+
ActorObserver.instance
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
let(:actor) do
|
|
82
|
+
Actor.create!(name: "Johnny Depp")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "does not fire the observer" do
|
|
86
|
+
Actor.observers.disable(:all) do
|
|
87
|
+
actor and observer.last_after_create_record.should_not eq(actor)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
context "when all observers are disabled" do
|
|
93
|
+
|
|
94
|
+
let!(:observer) do
|
|
95
|
+
ActorObserver.instance
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
let(:actor) do
|
|
99
|
+
Actor.create!(name: "Johnny Depp")
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "does not fire the observer" do
|
|
103
|
+
Mongoid.observers.disable(:all) do
|
|
104
|
+
actor and observer.last_after_create_record.should_not eq(actor)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
context "when the document is new" do
|
|
110
|
+
|
|
111
|
+
let!(:actor) do
|
|
112
|
+
Actor.new
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "observes after initialize" do
|
|
116
|
+
recorder.last_callback.should eq(:after_initialize)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "calls after initialize once" do
|
|
120
|
+
recorder.call_count[:after_initialize].should eq(1)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "contains the model of the callback" do
|
|
124
|
+
recorder.last_record[:after_initialize].should eq(actor)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
context "when the document is being created" do
|
|
129
|
+
|
|
130
|
+
let!(:actor) do
|
|
131
|
+
Actor.create!
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
[ :before_create,
|
|
135
|
+
:after_create,
|
|
136
|
+
:around_create,
|
|
137
|
+
:before_save,
|
|
138
|
+
:after_save,
|
|
139
|
+
:around_save ].each do |callback|
|
|
140
|
+
|
|
141
|
+
it "observes #{callback}" do
|
|
142
|
+
recorder.call_count[callback].should eq(1)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "contains the model of the callback" do
|
|
146
|
+
recorder.last_record[callback].should eq(actor)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
context "when the document is being updated" do
|
|
152
|
+
|
|
153
|
+
let!(:actor) do
|
|
154
|
+
Actor.create!
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
[ :before_update,
|
|
158
|
+
:after_update,
|
|
159
|
+
:around_update,
|
|
160
|
+
:before_save,
|
|
161
|
+
:after_save,
|
|
162
|
+
:around_save ].each do |callback|
|
|
163
|
+
|
|
164
|
+
before do
|
|
165
|
+
recorder.reset
|
|
166
|
+
actor.update_attributes!(name: "Johnny Depp")
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
it "observes #{callback}" do
|
|
170
|
+
recorder.call_count[callback].should eq(1)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "contains the model of the callback" do
|
|
174
|
+
recorder.last_record[callback].should eq(actor)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
context "when the document is being upserted" do
|
|
180
|
+
|
|
181
|
+
let!(:actor) do
|
|
182
|
+
Actor.create!
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
[ :before_upsert,
|
|
186
|
+
:after_upsert,
|
|
187
|
+
:around_upsert ].each do |callback|
|
|
188
|
+
|
|
189
|
+
before do
|
|
190
|
+
recorder.reset
|
|
191
|
+
actor.upsert
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it "observes #{callback}" do
|
|
195
|
+
recorder.call_count[callback].should eq(1)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
it "contains the model of the callback" do
|
|
199
|
+
recorder.last_record[callback].should eq(actor)
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
context "when custom callbacks are being fired" do
|
|
205
|
+
|
|
206
|
+
let!(:actor) do
|
|
207
|
+
Actor.create!
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
[ :before_custom,
|
|
211
|
+
:after_custom,
|
|
212
|
+
:around_custom ].each do |callback|
|
|
213
|
+
|
|
214
|
+
before do
|
|
215
|
+
recorder.reset
|
|
216
|
+
actor.run_callbacks(:custom) do
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it "observes #{callback}" do
|
|
221
|
+
recorder.call_count[callback].should eq(1)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "contains the model of the callback" do
|
|
225
|
+
recorder.last_record[callback].should eq(actor)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context "when the document is being destroyed" do
|
|
231
|
+
|
|
232
|
+
let!(:actor) do
|
|
233
|
+
Actor.create!
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
[ :before_destroy, :after_destroy, :around_destroy ].each do |callback|
|
|
237
|
+
|
|
238
|
+
before do
|
|
239
|
+
recorder.reset
|
|
240
|
+
actor.destroy
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "observes #{callback}" do
|
|
244
|
+
recorder.call_count[callback].should eq(1)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
it "contains the model of the callback" do
|
|
248
|
+
recorder.last_record[callback].should eq(actor)
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
context "when the document is being validated" do
|
|
254
|
+
|
|
255
|
+
let!(:actor) do
|
|
256
|
+
Actor.new
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
[:before_validation, :after_validation].each do |callback|
|
|
260
|
+
|
|
261
|
+
before do
|
|
262
|
+
recorder.reset
|
|
263
|
+
actor.valid?
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
it "observes #{callback}" do
|
|
267
|
+
recorder.call_count[callback].should eq(1)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
it "contains the model of the callback" do
|
|
271
|
+
recorder.last_record[callback].should eq(actor)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
context "when using a custom callback" do
|
|
277
|
+
|
|
278
|
+
let(:actor) do
|
|
279
|
+
Actor.new
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
before do
|
|
283
|
+
actor.do_something
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
it "notifies the observers once" do
|
|
287
|
+
actor.after_custom_count.should eq(1)
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|
|
@@ -0,0 +1,759 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Paranoia do
|
|
4
|
+
|
|
5
|
+
describe ".scoped" do
|
|
6
|
+
|
|
7
|
+
it "returns a scoped criteria" do
|
|
8
|
+
ParanoidPost.scoped.selector.should eq({ "deleted_at" => nil })
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe ".deleted" do
|
|
13
|
+
|
|
14
|
+
context "when called on a root document" do
|
|
15
|
+
|
|
16
|
+
let(:post) do
|
|
17
|
+
ParanoidPost.create(title: "testing")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
before do
|
|
21
|
+
post.destroy
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
let(:deleted) do
|
|
25
|
+
ParanoidPost.deleted
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "returns the deleted documents" do
|
|
29
|
+
deleted.should eq([ post ])
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "when called on an embedded document" do
|
|
34
|
+
|
|
35
|
+
let(:person) do
|
|
36
|
+
Person.create
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
let(:phone) do
|
|
40
|
+
person.paranoid_phones.create
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
before do
|
|
44
|
+
phone.destroy
|
|
45
|
+
person.reload
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "returns the deleted documents" do
|
|
49
|
+
person.paranoid_phones.deleted.should eq([ phone ])
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "returns the correct count" do
|
|
53
|
+
person.paranoid_phones.deleted.count.should eq(1)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "#destroy!" do
|
|
59
|
+
|
|
60
|
+
context "when the document is a root" do
|
|
61
|
+
|
|
62
|
+
let(:post) do
|
|
63
|
+
ParanoidPost.create(title: "testing")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
before do
|
|
67
|
+
post.destroy!
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
let(:raw) do
|
|
71
|
+
ParanoidPost.collection.find(_id: post.id).first
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "hard deletes the document" do
|
|
75
|
+
raw.should be_nil
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "executes the before destroy callbacks" do
|
|
79
|
+
post.before_destroy_called.should be_true
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "executes the after destroy callbacks" do
|
|
83
|
+
post.after_destroy_called.should be_true
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
context "when the document is embedded" do
|
|
88
|
+
|
|
89
|
+
let(:person) do
|
|
90
|
+
Person.create
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
let(:phone) do
|
|
94
|
+
person.paranoid_phones.create(number: "911")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
before do
|
|
98
|
+
phone.destroy!
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
let(:raw) do
|
|
102
|
+
Person.collection.find(_id: person.id).first
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "hard deletes the document" do
|
|
106
|
+
raw["paranoid_phones"].should be_empty
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "executes the before destroy callbacks" do
|
|
110
|
+
phone.before_destroy_called.should be_true
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "executes the after destroy callbacks" do
|
|
114
|
+
phone.after_destroy_called.should be_true
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
context "when the document has a dependent relation" do
|
|
119
|
+
|
|
120
|
+
let(:post) do
|
|
121
|
+
ParanoidPost.create(title: "test")
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
let!(:author) do
|
|
125
|
+
post.authors.create(name: "poe")
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
before do
|
|
129
|
+
post.destroy!
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it "cascades the dependent option" do
|
|
133
|
+
expect {
|
|
134
|
+
author.reload
|
|
135
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
describe "#destroy" do
|
|
141
|
+
|
|
142
|
+
context "when the document is a root" do
|
|
143
|
+
|
|
144
|
+
let(:post) do
|
|
145
|
+
ParanoidPost.create(title: "testing")
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
before do
|
|
149
|
+
post.destroy
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
let(:raw) do
|
|
153
|
+
ParanoidPost.collection.find(_id: post.id).first
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "soft deletes the document" do
|
|
157
|
+
raw["deleted_at"].should be_within(1).of(Time.now)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it "does not return the document in a find" do
|
|
161
|
+
expect {
|
|
162
|
+
ParanoidPost.find(post.id)
|
|
163
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "executes the before destroy callbacks" do
|
|
167
|
+
post.before_destroy_called.should be_true
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it "executes the after destroy callbacks" do
|
|
171
|
+
post.after_destroy_called.should be_true
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
context "when the document is embedded" do
|
|
176
|
+
|
|
177
|
+
let(:person) do
|
|
178
|
+
Person.create
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
let(:phone) do
|
|
182
|
+
person.paranoid_phones.create(number: "911")
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
before do
|
|
186
|
+
phone.destroy
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
let(:raw) do
|
|
190
|
+
Person.collection.find(_id: person.id).first
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "soft deletes the document" do
|
|
194
|
+
raw["paranoid_phones"].first["deleted_at"].should be_within(1).of(Time.now)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "does not return the document in a find" do
|
|
198
|
+
expect {
|
|
199
|
+
person.paranoid_phones.find(phone.id)
|
|
200
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it "does not include the document in the relation" do
|
|
204
|
+
person.paranoid_phones.scoped.should be_empty
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it "executes the before destroy callbacks" do
|
|
208
|
+
phone.before_destroy_called.should be_true
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it "executes the after destroy callbacks" do
|
|
212
|
+
phone.after_destroy_called.should be_true
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
context "when the document has a dependent: :delete relation" do
|
|
217
|
+
|
|
218
|
+
let(:post) do
|
|
219
|
+
ParanoidPost.create(title: "test")
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
let!(:author) do
|
|
223
|
+
post.authors.create(name: "poe")
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
before do
|
|
227
|
+
post.destroy
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
it "cascades the dependent option" do
|
|
231
|
+
expect {
|
|
232
|
+
author.reload
|
|
233
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
context "when the document has a dependent: :restrict relation" do
|
|
238
|
+
|
|
239
|
+
let(:post) do
|
|
240
|
+
ParanoidPost.create(title: "test")
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
let!(:title) do
|
|
244
|
+
post.titles.create
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
before do
|
|
248
|
+
begin
|
|
249
|
+
post.destroy
|
|
250
|
+
rescue Mongoid::Errors::DeleteRestriction
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
it "does not destroy the document" do
|
|
255
|
+
post.should_not be_destroyed
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
describe "#destroyed?" do
|
|
261
|
+
|
|
262
|
+
context "when the document is a root" do
|
|
263
|
+
|
|
264
|
+
let(:post) do
|
|
265
|
+
ParanoidPost.create(title: "testing")
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
context "when the document is hard deleted" do
|
|
269
|
+
|
|
270
|
+
before do
|
|
271
|
+
post.destroy!
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
it "returns true" do
|
|
275
|
+
post.should be_destroyed
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
context "when the document is soft deleted" do
|
|
280
|
+
|
|
281
|
+
before do
|
|
282
|
+
post.destroy
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it "returns true" do
|
|
286
|
+
post.should be_destroyed
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
context "when the document is embedded" do
|
|
292
|
+
|
|
293
|
+
let(:person) do
|
|
294
|
+
Person.create
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
let(:phone) do
|
|
298
|
+
person.paranoid_phones.create(number: "911")
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
context "when the document is hard deleted" do
|
|
302
|
+
|
|
303
|
+
before do
|
|
304
|
+
phone.destroy!
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
it "returns true" do
|
|
308
|
+
phone.should be_destroyed
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
context "when the document is soft deleted" do
|
|
313
|
+
|
|
314
|
+
before do
|
|
315
|
+
phone.destroy
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
it "returns true" do
|
|
319
|
+
phone.should be_destroyed
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
describe "#deleted?" do
|
|
326
|
+
|
|
327
|
+
context "when the document is a root" do
|
|
328
|
+
|
|
329
|
+
let(:post) do
|
|
330
|
+
ParanoidPost.create(title: "testing")
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
context "when the document is hard deleted" do
|
|
334
|
+
|
|
335
|
+
before do
|
|
336
|
+
post.destroy!
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
it "returns true" do
|
|
340
|
+
post.should be_deleted
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
context "when the document is soft deleted" do
|
|
345
|
+
|
|
346
|
+
before do
|
|
347
|
+
post.destroy
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
it "returns true" do
|
|
351
|
+
post.should be_deleted
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
context "when the document is embedded" do
|
|
357
|
+
|
|
358
|
+
let(:person) do
|
|
359
|
+
Person.create
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
let(:phone) do
|
|
363
|
+
person.paranoid_phones.create(number: "911")
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
context "when the document is hard deleted" do
|
|
367
|
+
|
|
368
|
+
before do
|
|
369
|
+
phone.destroy!
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
it "returns true" do
|
|
373
|
+
phone.should be_deleted
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
context "when the document is soft deleted" do
|
|
378
|
+
|
|
379
|
+
before do
|
|
380
|
+
phone.destroy
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
it "returns true" do
|
|
384
|
+
phone.should be_deleted
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
describe "#destroyed?" do
|
|
391
|
+
|
|
392
|
+
context "when the document is a root" do
|
|
393
|
+
|
|
394
|
+
let(:post) do
|
|
395
|
+
ParanoidPost.create(title: "testing")
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
context "when the document is hard deleted" do
|
|
399
|
+
|
|
400
|
+
before do
|
|
401
|
+
post.destroy!
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
it "returns false" do
|
|
405
|
+
post.should_not be_persisted
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
context "when the document is soft deleted" do
|
|
410
|
+
|
|
411
|
+
before do
|
|
412
|
+
post.destroy
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
it "returns false" do
|
|
416
|
+
post.should_not be_persisted
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
context "when the document is reloaded" do
|
|
421
|
+
|
|
422
|
+
before do
|
|
423
|
+
post.destroy
|
|
424
|
+
post.reload
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
it "returns false" do
|
|
428
|
+
post.should_not be_persisted
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
describe "#delete!" do
|
|
435
|
+
|
|
436
|
+
context "when the document is a root" do
|
|
437
|
+
|
|
438
|
+
let(:post) do
|
|
439
|
+
ParanoidPost.create(title: "testing")
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
before do
|
|
443
|
+
post.delete!
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
let(:raw) do
|
|
447
|
+
ParanoidPost.collection.find(_id: post.id).first
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
it "hard deletes the document" do
|
|
451
|
+
raw.should be_nil
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
context "when the document is embedded" do
|
|
456
|
+
|
|
457
|
+
let(:person) do
|
|
458
|
+
Person.create
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
let(:phone) do
|
|
462
|
+
person.paranoid_phones.create(number: "911")
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
before do
|
|
466
|
+
phone.delete!
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
let(:raw) do
|
|
470
|
+
Person.collection.find(_id: person.id).first
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
it "hard deletes the document" do
|
|
474
|
+
raw["paranoid_phones"].should be_empty
|
|
475
|
+
end
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
context "when the document has a dependent relation" do
|
|
479
|
+
|
|
480
|
+
let(:post) do
|
|
481
|
+
ParanoidPost.create(title: "test")
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
let!(:author) do
|
|
485
|
+
post.authors.create(name: "poe")
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
before do
|
|
489
|
+
post.delete!
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
it "cascades the dependent option" do
|
|
493
|
+
expect {
|
|
494
|
+
author.reload
|
|
495
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
496
|
+
end
|
|
497
|
+
end
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
describe "#delete" do
|
|
501
|
+
|
|
502
|
+
context "when the document is a root" do
|
|
503
|
+
|
|
504
|
+
let(:post) do
|
|
505
|
+
ParanoidPost.create(title: "testing")
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
before do
|
|
509
|
+
post.delete
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
let(:raw) do
|
|
513
|
+
ParanoidPost.collection.find(_id: post.id).first
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
it "soft deletes the document" do
|
|
517
|
+
raw["deleted_at"].should be_within(1).of(Time.now)
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
it "does not return the document in a find" do
|
|
521
|
+
expect {
|
|
522
|
+
ParanoidPost.find(post.id)
|
|
523
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
it "clears out the persistence options" do
|
|
527
|
+
Mongoid::Threaded.persistence_options(ParanoidPost).should be_nil
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
it "clears out the identity map" do
|
|
531
|
+
Mongoid::IdentityMap.should be_empty
|
|
532
|
+
end
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
context "when the document is embedded" do
|
|
536
|
+
|
|
537
|
+
let(:person) do
|
|
538
|
+
Person.create
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
let(:phone) do
|
|
542
|
+
person.paranoid_phones.create(number: "911")
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
before do
|
|
546
|
+
phone.delete
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
let(:raw) do
|
|
550
|
+
Person.collection.find(_id: person.id).first
|
|
551
|
+
end
|
|
552
|
+
|
|
553
|
+
it "soft deletes the document" do
|
|
554
|
+
raw["paranoid_phones"].first["deleted_at"].should be_within(1).of(Time.now)
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
it "does not return the document in a find" do
|
|
558
|
+
expect {
|
|
559
|
+
person.paranoid_phones.find(phone.id)
|
|
560
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
it "does not include the document in the relation" do
|
|
564
|
+
person.paranoid_phones.scoped.should be_empty
|
|
565
|
+
end
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
context "when the document has a dependent relation" do
|
|
569
|
+
|
|
570
|
+
let(:post) do
|
|
571
|
+
ParanoidPost.create(title: "test")
|
|
572
|
+
end
|
|
573
|
+
|
|
574
|
+
let!(:author) do
|
|
575
|
+
post.authors.create(name: "poe")
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
before do
|
|
579
|
+
post.delete
|
|
580
|
+
end
|
|
581
|
+
|
|
582
|
+
it "cascades the dependent option" do
|
|
583
|
+
expect {
|
|
584
|
+
author.reload
|
|
585
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
586
|
+
end
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
context "when the document has a dependent: :restrict relation" do
|
|
590
|
+
|
|
591
|
+
let(:post) do
|
|
592
|
+
ParanoidPost.create(title: "test")
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
let!(:title) do
|
|
596
|
+
post.titles.create
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
before do
|
|
600
|
+
begin
|
|
601
|
+
post.delete
|
|
602
|
+
rescue Mongoid::Errors::DeleteRestriction
|
|
603
|
+
end
|
|
604
|
+
end
|
|
605
|
+
|
|
606
|
+
it "does not destroy the document" do
|
|
607
|
+
post.should_not be_destroyed
|
|
608
|
+
end
|
|
609
|
+
end
|
|
610
|
+
end
|
|
611
|
+
|
|
612
|
+
describe "#remove" do
|
|
613
|
+
|
|
614
|
+
let(:post) do
|
|
615
|
+
ParanoidPost.new
|
|
616
|
+
end
|
|
617
|
+
|
|
618
|
+
let!(:time) do
|
|
619
|
+
Time.now
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
before do
|
|
623
|
+
post.remove
|
|
624
|
+
end
|
|
625
|
+
|
|
626
|
+
it "sets the deleted flag" do
|
|
627
|
+
post.should be_destroyed
|
|
628
|
+
end
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
describe "#restore" do
|
|
632
|
+
|
|
633
|
+
context "when the document is a root" do
|
|
634
|
+
|
|
635
|
+
let(:post) do
|
|
636
|
+
ParanoidPost.create(title: "testing")
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
before do
|
|
640
|
+
post.delete
|
|
641
|
+
post.restore
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
it "removes the deleted at time" do
|
|
645
|
+
post.deleted_at.should be_nil
|
|
646
|
+
end
|
|
647
|
+
|
|
648
|
+
it "persists the change" do
|
|
649
|
+
post.reload.deleted_at.should be_nil
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
it "marks document again as persisted" do
|
|
653
|
+
post.persisted?.should be_true
|
|
654
|
+
end
|
|
655
|
+
end
|
|
656
|
+
|
|
657
|
+
context "when the document is embedded" do
|
|
658
|
+
|
|
659
|
+
let(:person) do
|
|
660
|
+
Person.create
|
|
661
|
+
end
|
|
662
|
+
|
|
663
|
+
let(:phone) do
|
|
664
|
+
person.paranoid_phones.create(number: "911")
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
before do
|
|
668
|
+
phone.delete
|
|
669
|
+
phone.restore
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
it "removes the deleted at time" do
|
|
673
|
+
phone.deleted_at.should be_nil
|
|
674
|
+
end
|
|
675
|
+
|
|
676
|
+
it "persists the change" do
|
|
677
|
+
person.reload.paranoid_phones.first.deleted_at.should be_nil
|
|
678
|
+
end
|
|
679
|
+
end
|
|
680
|
+
end
|
|
681
|
+
|
|
682
|
+
describe ".scoped" do
|
|
683
|
+
|
|
684
|
+
let(:scoped) do
|
|
685
|
+
ParanoidPost.scoped
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
it "returns a scoped criteria" do
|
|
689
|
+
scoped.selector.should eq({ "deleted_at" => nil })
|
|
690
|
+
end
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
describe "#set" do
|
|
694
|
+
|
|
695
|
+
let!(:post) do
|
|
696
|
+
ParanoidPost.create
|
|
697
|
+
end
|
|
698
|
+
|
|
699
|
+
let(:time) do
|
|
700
|
+
20.days.ago
|
|
701
|
+
end
|
|
702
|
+
|
|
703
|
+
before do
|
|
704
|
+
post.set(:deleted_at, time)
|
|
705
|
+
end
|
|
706
|
+
|
|
707
|
+
it "persists the change" do
|
|
708
|
+
post.reload.deleted_at.should be_within(1).of(time)
|
|
709
|
+
end
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
describe ".unscoped" do
|
|
713
|
+
|
|
714
|
+
let(:unscoped) do
|
|
715
|
+
ParanoidPost.unscoped
|
|
716
|
+
end
|
|
717
|
+
|
|
718
|
+
it "returns an unscoped criteria" do
|
|
719
|
+
unscoped.selector.should eq({})
|
|
720
|
+
end
|
|
721
|
+
end
|
|
722
|
+
|
|
723
|
+
describe "#to_param" do
|
|
724
|
+
|
|
725
|
+
let(:post) do
|
|
726
|
+
ParanoidPost.new(title: "testing")
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
context "when the document is new" do
|
|
730
|
+
|
|
731
|
+
it "still returns nil" do
|
|
732
|
+
post.to_param.should be_nil
|
|
733
|
+
end
|
|
734
|
+
end
|
|
735
|
+
|
|
736
|
+
context "when the document is not deleted" do
|
|
737
|
+
|
|
738
|
+
before do
|
|
739
|
+
post.save
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
it "returns the id as a string" do
|
|
743
|
+
post.to_param.should eq(post.id.to_s)
|
|
744
|
+
end
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
context "when the document is deleted" do
|
|
748
|
+
|
|
749
|
+
before do
|
|
750
|
+
post.save
|
|
751
|
+
post.delete
|
|
752
|
+
end
|
|
753
|
+
|
|
754
|
+
it "returns the id as a string" do
|
|
755
|
+
post.to_param.should eq(post.id.to_s)
|
|
756
|
+
end
|
|
757
|
+
end
|
|
758
|
+
end
|
|
759
|
+
end
|