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,1564 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Callbacks do
|
|
4
|
+
|
|
5
|
+
class TestClass
|
|
6
|
+
include Mongoid::Callbacks
|
|
7
|
+
|
|
8
|
+
attr_reader :before_save_called, :after_save_called
|
|
9
|
+
|
|
10
|
+
before_save do |object|
|
|
11
|
+
@before_save_called = true
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
after_save do |object|
|
|
15
|
+
@after_save_called = true
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe ".included" do
|
|
20
|
+
|
|
21
|
+
let(:klass) do
|
|
22
|
+
TestClass
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "includes the before_create callback" do
|
|
26
|
+
klass.should respond_to(:before_create)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "includes the after_create callback" do
|
|
30
|
+
klass.should respond_to(:after_create)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "includes the before_destroy callback" do
|
|
34
|
+
klass.should respond_to(:before_destroy)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "includes the after_destroy callback" do
|
|
38
|
+
klass.should respond_to(:after_destroy)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "includes the before_save callback" do
|
|
42
|
+
klass.should respond_to(:before_save)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "includes the after_save callback" do
|
|
46
|
+
klass.should respond_to(:after_save)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "includes the before_update callback" do
|
|
50
|
+
klass.should respond_to(:before_update)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "includes the after_update callback" do
|
|
54
|
+
klass.should respond_to(:after_update)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "includes the before_validation callback" do
|
|
58
|
+
klass.should respond_to(:before_validation)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "includes the after_validation callback" do
|
|
62
|
+
klass.should respond_to(:after_validation)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "includes the after_initialize callback" do
|
|
66
|
+
klass.should respond_to(:after_initialize)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "includes the after_build callback" do
|
|
70
|
+
klass.should respond_to(:after_build)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe ".after_find" do
|
|
75
|
+
|
|
76
|
+
let!(:player) do
|
|
77
|
+
Player.create
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "when the callback is on a root document" do
|
|
81
|
+
|
|
82
|
+
context "when when the document is instantiated" do
|
|
83
|
+
|
|
84
|
+
it "does not execute the callback" do
|
|
85
|
+
player.impressions.should eq(0)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
context "when the document is found via #find" do
|
|
90
|
+
|
|
91
|
+
let(:from_db) do
|
|
92
|
+
Player.find(player.id)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "executes the callback" do
|
|
96
|
+
from_db.impressions.should eq(1)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
context "when the document is found in a criteria" do
|
|
101
|
+
|
|
102
|
+
let(:from_db) do
|
|
103
|
+
Player.where(id: player.id).first
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "executes the callback" do
|
|
107
|
+
from_db.impressions.should eq(1)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context "when the document is reloaded" do
|
|
112
|
+
|
|
113
|
+
let(:from_db) do
|
|
114
|
+
Player.find(player.id)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
before do
|
|
118
|
+
from_db.reload
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "executes the callback" do
|
|
122
|
+
from_db.impressions.should eq(1)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context "when the callback is on an embedded document" do
|
|
128
|
+
|
|
129
|
+
let!(:implant) do
|
|
130
|
+
player.implants.create
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context "when when the document is instantiated" do
|
|
134
|
+
|
|
135
|
+
it "does not execute the callback" do
|
|
136
|
+
implant.impressions.should eq(0)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
context "when the document is found via #find" do
|
|
141
|
+
|
|
142
|
+
let(:from_db) do
|
|
143
|
+
Player.find(player.id).implants.first
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "executes the callback" do
|
|
147
|
+
from_db.impressions.should eq(1)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
context "when the document is found in a criteria" do
|
|
152
|
+
|
|
153
|
+
let(:from_db) do
|
|
154
|
+
Player.find(player.id).implants.find(implant.id)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "executes the callback" do
|
|
158
|
+
from_db.impressions.should eq(1)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
describe ".after_initialize" do
|
|
165
|
+
|
|
166
|
+
let(:game) do
|
|
167
|
+
Game.new
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it "runs after document instantiation" do
|
|
171
|
+
game.name.should eq("Testing")
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
describe ".after_build" do
|
|
176
|
+
|
|
177
|
+
let(:weapon) do
|
|
178
|
+
Player.new(frags: 5).weapons.build
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "runs after document build (references_many)" do
|
|
182
|
+
weapon.name.should eq("Holy Hand Grenade (5)")
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
let(:implant) do
|
|
186
|
+
Player.new(frags: 5).implants.build
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it "runs after document build (embeds_many)" do
|
|
190
|
+
implant.name.should eq('Cochlear Implant (5)')
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
let(:powerup) do
|
|
194
|
+
Player.new(frags: 5).build_powerup
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "runs after document build (references_one)" do
|
|
198
|
+
powerup.name.should eq("Quad Damage (5)")
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
let(:augmentation) do
|
|
202
|
+
Player.new(frags: 5).build_augmentation
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it "runs after document build (embeds_one)" do
|
|
206
|
+
augmentation.name.should eq("Infolink (5)")
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
describe ".before_create" do
|
|
211
|
+
|
|
212
|
+
let(:artist) do
|
|
213
|
+
Artist.new(name: "Depeche Mode")
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
context "callback returns true" do
|
|
217
|
+
|
|
218
|
+
before do
|
|
219
|
+
artist.should_receive(:before_create_stub).once.and_return(true)
|
|
220
|
+
artist.save
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "gets saved" do
|
|
224
|
+
artist.persisted?.should be_true
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
context "callback returns false" do
|
|
229
|
+
|
|
230
|
+
before do
|
|
231
|
+
artist.should_receive(:before_create_stub).once.and_return(false)
|
|
232
|
+
artist.save
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
it "does not get saved" do
|
|
236
|
+
artist.persisted?.should be_false
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
describe ".before_save" do
|
|
242
|
+
|
|
243
|
+
context "when creating" do
|
|
244
|
+
|
|
245
|
+
let(:artist) do
|
|
246
|
+
Artist.new(name: "Depeche Mode")
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
after do
|
|
250
|
+
artist.delete
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
context "when the callback returns true" do
|
|
254
|
+
|
|
255
|
+
before do
|
|
256
|
+
artist.should_receive(:before_save_stub).once.and_return(true)
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it "the save returns true" do
|
|
260
|
+
artist.save.should be_true
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
context "when callback returns false" do
|
|
265
|
+
|
|
266
|
+
before do
|
|
267
|
+
artist.should_receive(:before_save_stub).once.and_return(false)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
it "the save returns false" do
|
|
271
|
+
artist.save.should be_false
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
context "when updating" do
|
|
277
|
+
|
|
278
|
+
let(:artist) do
|
|
279
|
+
Artist.create(name: "Depeche Mode").tap do |artist|
|
|
280
|
+
artist.name = "The Mountain Goats"
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
after do
|
|
285
|
+
artist.delete
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
context "when the callback returns true" do
|
|
289
|
+
|
|
290
|
+
before do
|
|
291
|
+
artist.should_receive(:before_save_stub).once.and_return(true)
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
it "the save returns true" do
|
|
295
|
+
artist.save.should be_true
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
context "when the callback returns false" do
|
|
300
|
+
|
|
301
|
+
before do
|
|
302
|
+
artist.should_receive(:before_save_stub).once.and_return(false)
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
it "the save returns false" do
|
|
306
|
+
artist.save.should be_false
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
describe ".before_destroy" do
|
|
313
|
+
|
|
314
|
+
let(:artist) do
|
|
315
|
+
Artist.create(name: "Depeche Mode")
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
before do
|
|
319
|
+
artist.name = "The Mountain Goats"
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
after do
|
|
323
|
+
artist.delete
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
context "when the callback returns true" do
|
|
327
|
+
|
|
328
|
+
before do
|
|
329
|
+
artist.should_receive(:before_destroy_stub).once.and_return(true)
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
it "the destroy returns true" do
|
|
333
|
+
artist.destroy.should be_true
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
context "when the callback returns false" do
|
|
338
|
+
|
|
339
|
+
before do
|
|
340
|
+
artist.should_receive(:before_destroy_stub).once.and_return(false)
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
it "the destroy returns false" do
|
|
344
|
+
artist.destroy.should be_false
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
context "when cascading callbacks" do
|
|
349
|
+
|
|
350
|
+
let!(:moderat) do
|
|
351
|
+
Band.create!(name: "Moderat")
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
let!(:record) do
|
|
355
|
+
moderat.records.create(name: "Moderat")
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
before do
|
|
359
|
+
moderat.destroy
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
it "executes the child destroy callbacks" do
|
|
363
|
+
record.before_destroy_called.should be_true
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
describe "#run_after_callbacks" do
|
|
369
|
+
|
|
370
|
+
let(:object) do
|
|
371
|
+
TestClass.new
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
before do
|
|
375
|
+
object.run_after_callbacks(:save)
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
it "runs the after callbacks" do
|
|
379
|
+
object.after_save_called.should be_true
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
it "does not run the before callbacks" do
|
|
383
|
+
object.before_save_called.should be_false
|
|
384
|
+
end
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
describe "#run_before_callbacks" do
|
|
388
|
+
|
|
389
|
+
let(:object) do
|
|
390
|
+
TestClass.new
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
before do
|
|
394
|
+
object.run_before_callbacks(:save)
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
it "runs the before callbacks" do
|
|
398
|
+
object.before_save_called.should be_true
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
it "does not run the after callbacks" do
|
|
402
|
+
object.after_save_called.should be_false
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
context "when cascading callbacks" do
|
|
407
|
+
|
|
408
|
+
context "when the parent has a custom callback" do
|
|
409
|
+
|
|
410
|
+
context "when the child does not have the same callback defined" do
|
|
411
|
+
|
|
412
|
+
let(:band) do
|
|
413
|
+
Band.new
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
let!(:record) do
|
|
417
|
+
band.records.build
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
context "when running the callbacks directly" do
|
|
421
|
+
|
|
422
|
+
before(:all) do
|
|
423
|
+
Band.define_model_callbacks(:rearrange)
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
after(:all) do
|
|
427
|
+
Band.reset_callbacks(:rearrange)
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
it "does not cascade to the child" do
|
|
431
|
+
band.run_callbacks(:rearrange).should be_true
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
context "when the callbacks get triggered by a destroy" do
|
|
436
|
+
|
|
437
|
+
before(:all) do
|
|
438
|
+
Band.define_model_callbacks(:rearrange)
|
|
439
|
+
Band.set_callback(:validation, :before) do
|
|
440
|
+
run_callbacks(:rearrange)
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
after(:all) do
|
|
445
|
+
Band.reset_callbacks(:rearrange)
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
let(:attributes) do
|
|
449
|
+
{
|
|
450
|
+
records_attributes: {
|
|
451
|
+
"0" => { "_id" => record.id, "_destroy" => true }
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
it "does not cascade to the child" do
|
|
457
|
+
Band.accepts_nested_attributes_for :records, allow_destroy: true
|
|
458
|
+
band.update_attributes(attributes).should be_true
|
|
459
|
+
end
|
|
460
|
+
end
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
context "when a document can exist in more than 1 level" do
|
|
465
|
+
|
|
466
|
+
let(:band) do
|
|
467
|
+
Band.new
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
let(:record) do
|
|
471
|
+
band.records.build
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
let(:note) do
|
|
475
|
+
Note.new
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
context "when adding the document at multiple levels" do
|
|
479
|
+
|
|
480
|
+
before do
|
|
481
|
+
band.notes.push(note)
|
|
482
|
+
record.notes.push(note)
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
context "when saving the root" do
|
|
486
|
+
|
|
487
|
+
it "only executes the callbacks once for each embed" do
|
|
488
|
+
note.should_receive(:update_saved).twice
|
|
489
|
+
band.save
|
|
490
|
+
end
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
context "when cascading after initialize" do
|
|
496
|
+
|
|
497
|
+
let!(:person) do
|
|
498
|
+
Person.create
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
before do
|
|
502
|
+
person.services.create!(sid: 1)
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
it "doesn't cascade the initialize" do
|
|
506
|
+
Service.any_instance.should_receive(:after_initialize_called=).never
|
|
507
|
+
Person.find(person.id).should eq(person)
|
|
508
|
+
end
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
context "when attempting to cascade on a referenced relation" do
|
|
512
|
+
|
|
513
|
+
it "raises an error" do
|
|
514
|
+
expect {
|
|
515
|
+
Band.has_and_belongs_to_many :tags, cascade_callbacks: true
|
|
516
|
+
}.to raise_error(Mongoid::Errors::InvalidOptions)
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
context "when the documents are embedded one level" do
|
|
521
|
+
|
|
522
|
+
describe "#after_create" do
|
|
523
|
+
|
|
524
|
+
context "when the child is new" do
|
|
525
|
+
|
|
526
|
+
context "when the parent is new" do
|
|
527
|
+
|
|
528
|
+
let(:band) do
|
|
529
|
+
Band.new(name: "Moderat")
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
let!(:label) do
|
|
533
|
+
band.build_label(name: "Mute")
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
before do
|
|
537
|
+
band.save
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
it "executes the callback" do
|
|
541
|
+
label.after_create_called.should be_true
|
|
542
|
+
end
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
context "when the parent is persisted" do
|
|
546
|
+
|
|
547
|
+
let(:band) do
|
|
548
|
+
Band.create(name: "Moderat")
|
|
549
|
+
end
|
|
550
|
+
|
|
551
|
+
let!(:label) do
|
|
552
|
+
band.build_label(name: "Mute")
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
before do
|
|
556
|
+
band.save
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
it "executes the callback" do
|
|
560
|
+
label.after_create_called.should be_true
|
|
561
|
+
end
|
|
562
|
+
end
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
context "when the child is persisted" do
|
|
566
|
+
|
|
567
|
+
let(:band) do
|
|
568
|
+
Band.create(name: "Moderat")
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
let!(:label) do
|
|
572
|
+
band.create_label(name: "Mute")
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
before do
|
|
576
|
+
label.after_create_called = false
|
|
577
|
+
band.save
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
it "does not execute the callback" do
|
|
581
|
+
label.after_create_called.should be_false
|
|
582
|
+
end
|
|
583
|
+
end
|
|
584
|
+
end
|
|
585
|
+
|
|
586
|
+
describe "#after_save" do
|
|
587
|
+
|
|
588
|
+
context "when the child is new" do
|
|
589
|
+
|
|
590
|
+
context "when the parent is new" do
|
|
591
|
+
|
|
592
|
+
let(:band) do
|
|
593
|
+
Band.new(name: "Moderat")
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
let!(:label) do
|
|
597
|
+
band.build_label(name: "Mute")
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
before do
|
|
601
|
+
band.save
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
it "executes the callback" do
|
|
605
|
+
label.after_save_called.should be_true
|
|
606
|
+
end
|
|
607
|
+
end
|
|
608
|
+
|
|
609
|
+
context "when the parent is persisted" do
|
|
610
|
+
|
|
611
|
+
let(:band) do
|
|
612
|
+
Band.create(name: "Moderat")
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
let!(:label) do
|
|
616
|
+
band.build_label(name: "Mute")
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
before do
|
|
620
|
+
band.save
|
|
621
|
+
end
|
|
622
|
+
|
|
623
|
+
it "executes the callback" do
|
|
624
|
+
label.after_save_called.should be_true
|
|
625
|
+
end
|
|
626
|
+
end
|
|
627
|
+
end
|
|
628
|
+
|
|
629
|
+
context "when the child is persisted" do
|
|
630
|
+
|
|
631
|
+
let(:band) do
|
|
632
|
+
Band.create(name: "Moderat")
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
let!(:label) do
|
|
636
|
+
band.create_label(name: "Mute")
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
before do
|
|
640
|
+
band.save
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
it "executes the callback" do
|
|
644
|
+
label.after_save_called.should be_true
|
|
645
|
+
end
|
|
646
|
+
end
|
|
647
|
+
end
|
|
648
|
+
|
|
649
|
+
describe "#after_update" do
|
|
650
|
+
|
|
651
|
+
context "when the child is new" do
|
|
652
|
+
|
|
653
|
+
context "when the parent is new" do
|
|
654
|
+
|
|
655
|
+
let(:band) do
|
|
656
|
+
Band.new(name: "Moderat")
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
let!(:label) do
|
|
660
|
+
band.build_label(name: "Mute")
|
|
661
|
+
end
|
|
662
|
+
|
|
663
|
+
before do
|
|
664
|
+
band.save
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
it "does not execute the callback" do
|
|
668
|
+
label.after_update_called.should be_false
|
|
669
|
+
end
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
context "when the parent is persisted" do
|
|
673
|
+
|
|
674
|
+
let(:band) do
|
|
675
|
+
Band.create(name: "Moderat")
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
let!(:label) do
|
|
679
|
+
band.build_label(name: "Mute")
|
|
680
|
+
end
|
|
681
|
+
|
|
682
|
+
before do
|
|
683
|
+
band.save
|
|
684
|
+
end
|
|
685
|
+
|
|
686
|
+
it "does not execute the callback" do
|
|
687
|
+
label.after_update_called.should be_false
|
|
688
|
+
end
|
|
689
|
+
end
|
|
690
|
+
end
|
|
691
|
+
|
|
692
|
+
context "when the child is persisted" do
|
|
693
|
+
|
|
694
|
+
let(:band) do
|
|
695
|
+
Band.create(name: "Moderat")
|
|
696
|
+
end
|
|
697
|
+
|
|
698
|
+
context "when the child is dirty" do
|
|
699
|
+
|
|
700
|
+
let!(:label) do
|
|
701
|
+
band.create_label(name: "Mute")
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
before do
|
|
705
|
+
label.name = "Nothing"
|
|
706
|
+
band.save
|
|
707
|
+
end
|
|
708
|
+
|
|
709
|
+
it "executes the callback" do
|
|
710
|
+
label.after_update_called.should be_true
|
|
711
|
+
end
|
|
712
|
+
end
|
|
713
|
+
|
|
714
|
+
context "when the child is not dirty" do
|
|
715
|
+
|
|
716
|
+
let!(:label) do
|
|
717
|
+
band.build_label(name: "Mute")
|
|
718
|
+
end
|
|
719
|
+
|
|
720
|
+
before do
|
|
721
|
+
band.save
|
|
722
|
+
end
|
|
723
|
+
|
|
724
|
+
it "does not execute the callback" do
|
|
725
|
+
label.after_update_called.should be_false
|
|
726
|
+
end
|
|
727
|
+
end
|
|
728
|
+
end
|
|
729
|
+
end
|
|
730
|
+
|
|
731
|
+
describe "#after_validation" do
|
|
732
|
+
|
|
733
|
+
context "when the child is new" do
|
|
734
|
+
|
|
735
|
+
context "when the parent is new" do
|
|
736
|
+
|
|
737
|
+
let(:band) do
|
|
738
|
+
Band.new(name: "Moderat")
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
let!(:label) do
|
|
742
|
+
band.build_label(name: "Mute")
|
|
743
|
+
end
|
|
744
|
+
|
|
745
|
+
before do
|
|
746
|
+
band.save
|
|
747
|
+
end
|
|
748
|
+
|
|
749
|
+
it "executes the callback" do
|
|
750
|
+
label.after_validation_called.should be_true
|
|
751
|
+
end
|
|
752
|
+
end
|
|
753
|
+
|
|
754
|
+
context "when the parent is persisted" do
|
|
755
|
+
|
|
756
|
+
let(:band) do
|
|
757
|
+
Band.create(name: "Moderat")
|
|
758
|
+
end
|
|
759
|
+
|
|
760
|
+
let!(:label) do
|
|
761
|
+
band.build_label(name: "Mute")
|
|
762
|
+
end
|
|
763
|
+
|
|
764
|
+
before do
|
|
765
|
+
band.save
|
|
766
|
+
end
|
|
767
|
+
|
|
768
|
+
it "executes the callback" do
|
|
769
|
+
label.after_validation_called.should be_true
|
|
770
|
+
end
|
|
771
|
+
end
|
|
772
|
+
end
|
|
773
|
+
|
|
774
|
+
context "when the child is persisted" do
|
|
775
|
+
|
|
776
|
+
let(:band) do
|
|
777
|
+
Band.create(name: "Moderat")
|
|
778
|
+
end
|
|
779
|
+
|
|
780
|
+
let!(:label) do
|
|
781
|
+
band.create_label(name: "Mute")
|
|
782
|
+
end
|
|
783
|
+
|
|
784
|
+
before do
|
|
785
|
+
band.save
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
it "executes the callback" do
|
|
789
|
+
label.after_validation_called.should be_true
|
|
790
|
+
end
|
|
791
|
+
end
|
|
792
|
+
end
|
|
793
|
+
|
|
794
|
+
describe "#before_create" do
|
|
795
|
+
|
|
796
|
+
context "when the child is new" do
|
|
797
|
+
|
|
798
|
+
context "when the parent is new" do
|
|
799
|
+
|
|
800
|
+
let(:band) do
|
|
801
|
+
Band.new(name: "Moderat")
|
|
802
|
+
end
|
|
803
|
+
|
|
804
|
+
let!(:record) do
|
|
805
|
+
band.records.build(name: "Moderat")
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
before do
|
|
809
|
+
band.save
|
|
810
|
+
end
|
|
811
|
+
|
|
812
|
+
it "executes the callback" do
|
|
813
|
+
record.before_create_called.should be_true
|
|
814
|
+
end
|
|
815
|
+
end
|
|
816
|
+
|
|
817
|
+
context "when the parent is persisted" do
|
|
818
|
+
|
|
819
|
+
let(:band) do
|
|
820
|
+
Band.create(name: "Moderat")
|
|
821
|
+
end
|
|
822
|
+
|
|
823
|
+
let!(:record) do
|
|
824
|
+
band.records.build(name: "Moderat")
|
|
825
|
+
end
|
|
826
|
+
|
|
827
|
+
before do
|
|
828
|
+
band.save
|
|
829
|
+
end
|
|
830
|
+
|
|
831
|
+
it "executes the callback" do
|
|
832
|
+
record.before_create_called.should be_true
|
|
833
|
+
end
|
|
834
|
+
end
|
|
835
|
+
end
|
|
836
|
+
|
|
837
|
+
context "when the child is persisted" do
|
|
838
|
+
|
|
839
|
+
let(:band) do
|
|
840
|
+
Band.create(name: "Moderat")
|
|
841
|
+
end
|
|
842
|
+
|
|
843
|
+
let!(:record) do
|
|
844
|
+
band.records.create(name: "Moderat")
|
|
845
|
+
end
|
|
846
|
+
|
|
847
|
+
before do
|
|
848
|
+
record.before_create_called = false
|
|
849
|
+
band.save
|
|
850
|
+
end
|
|
851
|
+
|
|
852
|
+
it "does not execute the callback" do
|
|
853
|
+
record.before_create_called.should be_false
|
|
854
|
+
end
|
|
855
|
+
end
|
|
856
|
+
end
|
|
857
|
+
|
|
858
|
+
describe "#before_save" do
|
|
859
|
+
|
|
860
|
+
context "when the child is new" do
|
|
861
|
+
|
|
862
|
+
context "when the parent is new" do
|
|
863
|
+
|
|
864
|
+
let(:band) do
|
|
865
|
+
Band.new(name: "Moderat")
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
let!(:record) do
|
|
869
|
+
band.records.build(name: "Moderat")
|
|
870
|
+
end
|
|
871
|
+
|
|
872
|
+
before do
|
|
873
|
+
band.save
|
|
874
|
+
end
|
|
875
|
+
|
|
876
|
+
it "executes the callback" do
|
|
877
|
+
record.before_save_called.should be_true
|
|
878
|
+
end
|
|
879
|
+
|
|
880
|
+
it "persists the change" do
|
|
881
|
+
band.reload.records.first.before_save_called.should be_true
|
|
882
|
+
end
|
|
883
|
+
end
|
|
884
|
+
|
|
885
|
+
context "when the parent is persisted" do
|
|
886
|
+
|
|
887
|
+
let(:band) do
|
|
888
|
+
Band.create(name: "Moderat")
|
|
889
|
+
end
|
|
890
|
+
|
|
891
|
+
let!(:record) do
|
|
892
|
+
band.records.build(name: "Moderat")
|
|
893
|
+
end
|
|
894
|
+
|
|
895
|
+
before do
|
|
896
|
+
band.save
|
|
897
|
+
end
|
|
898
|
+
|
|
899
|
+
it "executes the callback" do
|
|
900
|
+
record.before_save_called.should be_true
|
|
901
|
+
end
|
|
902
|
+
|
|
903
|
+
it "persists the change" do
|
|
904
|
+
band.reload.records.first.before_save_called.should be_true
|
|
905
|
+
end
|
|
906
|
+
end
|
|
907
|
+
end
|
|
908
|
+
|
|
909
|
+
context "when the child is persisted" do
|
|
910
|
+
|
|
911
|
+
let(:band) do
|
|
912
|
+
Band.create(name: "Moderat")
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
let!(:record) do
|
|
916
|
+
band.records.create(name: "Moderat")
|
|
917
|
+
end
|
|
918
|
+
|
|
919
|
+
before do
|
|
920
|
+
band.save
|
|
921
|
+
end
|
|
922
|
+
|
|
923
|
+
it "executes the callback" do
|
|
924
|
+
record.before_save_called.should be_true
|
|
925
|
+
end
|
|
926
|
+
|
|
927
|
+
it "persists the change" do
|
|
928
|
+
band.reload.records.first.before_save_called.should be_true
|
|
929
|
+
end
|
|
930
|
+
end
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
describe "#before_update" do
|
|
934
|
+
|
|
935
|
+
context "when the child is new" do
|
|
936
|
+
|
|
937
|
+
context "when the parent is new" do
|
|
938
|
+
|
|
939
|
+
let(:band) do
|
|
940
|
+
Band.new(name: "Moderat")
|
|
941
|
+
end
|
|
942
|
+
|
|
943
|
+
let!(:record) do
|
|
944
|
+
band.records.build(name: "Moderat")
|
|
945
|
+
end
|
|
946
|
+
|
|
947
|
+
before do
|
|
948
|
+
band.save
|
|
949
|
+
end
|
|
950
|
+
|
|
951
|
+
it "does not execute the callback" do
|
|
952
|
+
record.before_update_called.should be_false
|
|
953
|
+
end
|
|
954
|
+
end
|
|
955
|
+
|
|
956
|
+
context "when the parent is persisted" do
|
|
957
|
+
|
|
958
|
+
let(:band) do
|
|
959
|
+
Band.create(name: "Moderat")
|
|
960
|
+
end
|
|
961
|
+
|
|
962
|
+
let!(:record) do
|
|
963
|
+
band.records.build(name: "Moderat")
|
|
964
|
+
end
|
|
965
|
+
|
|
966
|
+
before do
|
|
967
|
+
band.save
|
|
968
|
+
end
|
|
969
|
+
|
|
970
|
+
it "does not execute the callback" do
|
|
971
|
+
record.before_update_called.should be_false
|
|
972
|
+
end
|
|
973
|
+
end
|
|
974
|
+
end
|
|
975
|
+
|
|
976
|
+
context "when the child is persisted" do
|
|
977
|
+
|
|
978
|
+
let(:band) do
|
|
979
|
+
Band.create(name: "Moderat")
|
|
980
|
+
end
|
|
981
|
+
|
|
982
|
+
let!(:record) do
|
|
983
|
+
band.records.create(name: "Moderat")
|
|
984
|
+
end
|
|
985
|
+
|
|
986
|
+
context "when the child is dirty" do
|
|
987
|
+
|
|
988
|
+
before do
|
|
989
|
+
record.name = "Nothing"
|
|
990
|
+
band.save
|
|
991
|
+
end
|
|
992
|
+
|
|
993
|
+
it "executes the callback" do
|
|
994
|
+
record.before_update_called.should be_true
|
|
995
|
+
end
|
|
996
|
+
|
|
997
|
+
it "persists the change" do
|
|
998
|
+
band.reload.records.first.before_update_called.should be_true
|
|
999
|
+
end
|
|
1000
|
+
end
|
|
1001
|
+
|
|
1002
|
+
context "when the child is not dirty" do
|
|
1003
|
+
|
|
1004
|
+
before do
|
|
1005
|
+
band.save
|
|
1006
|
+
end
|
|
1007
|
+
|
|
1008
|
+
it "does not execute the callback" do
|
|
1009
|
+
record.before_update_called.should be_false
|
|
1010
|
+
end
|
|
1011
|
+
end
|
|
1012
|
+
end
|
|
1013
|
+
end
|
|
1014
|
+
|
|
1015
|
+
describe "#before_validation" do
|
|
1016
|
+
|
|
1017
|
+
context "when the child is new" do
|
|
1018
|
+
|
|
1019
|
+
context "when the parent is new" do
|
|
1020
|
+
|
|
1021
|
+
let(:band) do
|
|
1022
|
+
Band.new(name: "Moderat")
|
|
1023
|
+
end
|
|
1024
|
+
|
|
1025
|
+
let!(:record) do
|
|
1026
|
+
band.records.build(name: "Moderat")
|
|
1027
|
+
end
|
|
1028
|
+
|
|
1029
|
+
before do
|
|
1030
|
+
band.save
|
|
1031
|
+
end
|
|
1032
|
+
|
|
1033
|
+
it "executes the callback" do
|
|
1034
|
+
record.before_validation_called.should be_true
|
|
1035
|
+
end
|
|
1036
|
+
|
|
1037
|
+
it "persists the change" do
|
|
1038
|
+
band.reload.records.first.before_validation_called.should be_true
|
|
1039
|
+
end
|
|
1040
|
+
end
|
|
1041
|
+
|
|
1042
|
+
context "when the parent is persisted" do
|
|
1043
|
+
|
|
1044
|
+
let(:band) do
|
|
1045
|
+
Band.create(name: "Moderat")
|
|
1046
|
+
end
|
|
1047
|
+
|
|
1048
|
+
let!(:record) do
|
|
1049
|
+
band.records.build(name: "Moderat")
|
|
1050
|
+
end
|
|
1051
|
+
|
|
1052
|
+
before do
|
|
1053
|
+
band.save
|
|
1054
|
+
end
|
|
1055
|
+
|
|
1056
|
+
it "executes the callback" do
|
|
1057
|
+
record.before_validation_called.should be_true
|
|
1058
|
+
end
|
|
1059
|
+
|
|
1060
|
+
it "persists the change" do
|
|
1061
|
+
band.reload.records.first.before_validation_called.should be_true
|
|
1062
|
+
end
|
|
1063
|
+
end
|
|
1064
|
+
end
|
|
1065
|
+
|
|
1066
|
+
context "when the child is persisted" do
|
|
1067
|
+
|
|
1068
|
+
let(:band) do
|
|
1069
|
+
Band.create(name: "Moderat")
|
|
1070
|
+
end
|
|
1071
|
+
|
|
1072
|
+
let!(:record) do
|
|
1073
|
+
band.records.create(name: "Moderat")
|
|
1074
|
+
end
|
|
1075
|
+
|
|
1076
|
+
before do
|
|
1077
|
+
band.save
|
|
1078
|
+
end
|
|
1079
|
+
|
|
1080
|
+
it "executes the callback" do
|
|
1081
|
+
record.before_validation_called.should be_true
|
|
1082
|
+
end
|
|
1083
|
+
|
|
1084
|
+
it "persists the change" do
|
|
1085
|
+
band.reload.records.first.before_validation_called.should be_true
|
|
1086
|
+
end
|
|
1087
|
+
end
|
|
1088
|
+
end
|
|
1089
|
+
end
|
|
1090
|
+
|
|
1091
|
+
context "when the document is embedded multiple levels" do
|
|
1092
|
+
|
|
1093
|
+
describe "#before_create" do
|
|
1094
|
+
|
|
1095
|
+
context "when the child is new" do
|
|
1096
|
+
|
|
1097
|
+
context "when the root is new" do
|
|
1098
|
+
|
|
1099
|
+
let(:band) do
|
|
1100
|
+
Band.new(name: "Moderat")
|
|
1101
|
+
end
|
|
1102
|
+
|
|
1103
|
+
let!(:record) do
|
|
1104
|
+
band.records.build(name: "Moderat")
|
|
1105
|
+
end
|
|
1106
|
+
|
|
1107
|
+
let!(:track) do
|
|
1108
|
+
record.tracks.build(name: "Berlin")
|
|
1109
|
+
end
|
|
1110
|
+
|
|
1111
|
+
before do
|
|
1112
|
+
band.save
|
|
1113
|
+
end
|
|
1114
|
+
|
|
1115
|
+
it "executes the callback" do
|
|
1116
|
+
track.before_create_called.should be_true
|
|
1117
|
+
end
|
|
1118
|
+
end
|
|
1119
|
+
|
|
1120
|
+
context "when the root is persisted" do
|
|
1121
|
+
|
|
1122
|
+
let(:band) do
|
|
1123
|
+
Band.create(name: "Moderat")
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
let!(:record) do
|
|
1127
|
+
band.records.build(name: "Moderat")
|
|
1128
|
+
end
|
|
1129
|
+
|
|
1130
|
+
let!(:track) do
|
|
1131
|
+
record.tracks.build(name: "Berlin")
|
|
1132
|
+
end
|
|
1133
|
+
|
|
1134
|
+
before do
|
|
1135
|
+
band.save
|
|
1136
|
+
end
|
|
1137
|
+
|
|
1138
|
+
it "executes the callback" do
|
|
1139
|
+
track.before_create_called.should be_true
|
|
1140
|
+
end
|
|
1141
|
+
end
|
|
1142
|
+
end
|
|
1143
|
+
|
|
1144
|
+
context "when the child is persisted" do
|
|
1145
|
+
|
|
1146
|
+
let(:band) do
|
|
1147
|
+
Band.create(name: "Moderat")
|
|
1148
|
+
end
|
|
1149
|
+
|
|
1150
|
+
let!(:record) do
|
|
1151
|
+
band.records.create(name: "Moderat")
|
|
1152
|
+
end
|
|
1153
|
+
|
|
1154
|
+
let!(:track) do
|
|
1155
|
+
record.tracks.create(name: "Berlin")
|
|
1156
|
+
end
|
|
1157
|
+
|
|
1158
|
+
before do
|
|
1159
|
+
track.before_create_called = false
|
|
1160
|
+
band.save
|
|
1161
|
+
end
|
|
1162
|
+
|
|
1163
|
+
it "does not execute the callback" do
|
|
1164
|
+
track.before_create_called.should be_false
|
|
1165
|
+
end
|
|
1166
|
+
end
|
|
1167
|
+
end
|
|
1168
|
+
|
|
1169
|
+
describe "#before_save" do
|
|
1170
|
+
|
|
1171
|
+
context "when the child is new" do
|
|
1172
|
+
|
|
1173
|
+
context "when the root is new" do
|
|
1174
|
+
|
|
1175
|
+
let(:band) do
|
|
1176
|
+
Band.new(name: "Moderat")
|
|
1177
|
+
end
|
|
1178
|
+
|
|
1179
|
+
let!(:record) do
|
|
1180
|
+
band.records.build(name: "Moderat")
|
|
1181
|
+
end
|
|
1182
|
+
|
|
1183
|
+
let!(:track) do
|
|
1184
|
+
record.tracks.build(name: "Berlin")
|
|
1185
|
+
end
|
|
1186
|
+
|
|
1187
|
+
before do
|
|
1188
|
+
band.save
|
|
1189
|
+
end
|
|
1190
|
+
|
|
1191
|
+
let(:reloaded) do
|
|
1192
|
+
band.reload.records.first
|
|
1193
|
+
end
|
|
1194
|
+
|
|
1195
|
+
it "executes the callback" do
|
|
1196
|
+
track.before_save_called.should be_true
|
|
1197
|
+
end
|
|
1198
|
+
|
|
1199
|
+
it "persists the change" do
|
|
1200
|
+
reloaded.tracks.first.before_save_called.should be_true
|
|
1201
|
+
end
|
|
1202
|
+
end
|
|
1203
|
+
|
|
1204
|
+
context "when the parent is persisted" do
|
|
1205
|
+
|
|
1206
|
+
let(:band) do
|
|
1207
|
+
Band.create(name: "Moderat")
|
|
1208
|
+
end
|
|
1209
|
+
|
|
1210
|
+
let!(:record) do
|
|
1211
|
+
band.records.build(name: "Moderat")
|
|
1212
|
+
end
|
|
1213
|
+
|
|
1214
|
+
let!(:track) do
|
|
1215
|
+
record.tracks.build(name: "Berlin")
|
|
1216
|
+
end
|
|
1217
|
+
|
|
1218
|
+
before do
|
|
1219
|
+
band.save
|
|
1220
|
+
end
|
|
1221
|
+
|
|
1222
|
+
let(:reloaded) do
|
|
1223
|
+
band.reload.records.first
|
|
1224
|
+
end
|
|
1225
|
+
|
|
1226
|
+
it "executes the callback" do
|
|
1227
|
+
track.before_save_called.should be_true
|
|
1228
|
+
end
|
|
1229
|
+
|
|
1230
|
+
it "persists the change" do
|
|
1231
|
+
reloaded.tracks.first.before_save_called.should be_true
|
|
1232
|
+
end
|
|
1233
|
+
end
|
|
1234
|
+
end
|
|
1235
|
+
|
|
1236
|
+
context "when the child is persisted" do
|
|
1237
|
+
|
|
1238
|
+
let(:band) do
|
|
1239
|
+
Band.create(name: "Moderat")
|
|
1240
|
+
end
|
|
1241
|
+
|
|
1242
|
+
let!(:record) do
|
|
1243
|
+
band.records.create(name: "Moderat")
|
|
1244
|
+
end
|
|
1245
|
+
|
|
1246
|
+
let!(:track) do
|
|
1247
|
+
record.tracks.create(name: "Berlin")
|
|
1248
|
+
end
|
|
1249
|
+
|
|
1250
|
+
before do
|
|
1251
|
+
band.save
|
|
1252
|
+
end
|
|
1253
|
+
|
|
1254
|
+
let(:reloaded) do
|
|
1255
|
+
band.reload.records.first
|
|
1256
|
+
end
|
|
1257
|
+
|
|
1258
|
+
it "executes the callback" do
|
|
1259
|
+
track.before_save_called.should be_true
|
|
1260
|
+
end
|
|
1261
|
+
|
|
1262
|
+
it "persists the change" do
|
|
1263
|
+
reloaded.tracks.first.before_save_called.should be_true
|
|
1264
|
+
end
|
|
1265
|
+
end
|
|
1266
|
+
end
|
|
1267
|
+
|
|
1268
|
+
describe "#before_update" do
|
|
1269
|
+
|
|
1270
|
+
context "when the child is new" do
|
|
1271
|
+
|
|
1272
|
+
context "when the parent is new" do
|
|
1273
|
+
|
|
1274
|
+
let(:band) do
|
|
1275
|
+
Band.new(name: "Moderat")
|
|
1276
|
+
end
|
|
1277
|
+
|
|
1278
|
+
let!(:record) do
|
|
1279
|
+
band.records.build(name: "Moderat")
|
|
1280
|
+
end
|
|
1281
|
+
|
|
1282
|
+
let!(:track) do
|
|
1283
|
+
record.tracks.build(name: "Berlin")
|
|
1284
|
+
end
|
|
1285
|
+
|
|
1286
|
+
before do
|
|
1287
|
+
band.save
|
|
1288
|
+
end
|
|
1289
|
+
|
|
1290
|
+
it "does not execute the callback" do
|
|
1291
|
+
track.before_update_called.should be_false
|
|
1292
|
+
end
|
|
1293
|
+
end
|
|
1294
|
+
|
|
1295
|
+
context "when the parent is persisted" do
|
|
1296
|
+
|
|
1297
|
+
let(:band) do
|
|
1298
|
+
Band.create(name: "Moderat")
|
|
1299
|
+
end
|
|
1300
|
+
|
|
1301
|
+
let!(:record) do
|
|
1302
|
+
band.records.build(name: "Moderat")
|
|
1303
|
+
end
|
|
1304
|
+
|
|
1305
|
+
let!(:track) do
|
|
1306
|
+
record.tracks.build(name: "Berlin")
|
|
1307
|
+
end
|
|
1308
|
+
|
|
1309
|
+
before do
|
|
1310
|
+
band.save
|
|
1311
|
+
end
|
|
1312
|
+
|
|
1313
|
+
it "does not execute the callback" do
|
|
1314
|
+
track.before_update_called.should be_false
|
|
1315
|
+
end
|
|
1316
|
+
end
|
|
1317
|
+
end
|
|
1318
|
+
|
|
1319
|
+
context "when the child is persisted" do
|
|
1320
|
+
|
|
1321
|
+
let(:band) do
|
|
1322
|
+
Band.create(name: "Moderat")
|
|
1323
|
+
end
|
|
1324
|
+
|
|
1325
|
+
let!(:record) do
|
|
1326
|
+
band.records.create(name: "Moderat")
|
|
1327
|
+
end
|
|
1328
|
+
|
|
1329
|
+
let!(:track) do
|
|
1330
|
+
record.tracks.create(name: "Berlin")
|
|
1331
|
+
end
|
|
1332
|
+
|
|
1333
|
+
context "when the child is dirty" do
|
|
1334
|
+
|
|
1335
|
+
before do
|
|
1336
|
+
track.name = "Rusty Nails"
|
|
1337
|
+
band.save
|
|
1338
|
+
end
|
|
1339
|
+
|
|
1340
|
+
let(:reloaded) do
|
|
1341
|
+
band.reload.records.first
|
|
1342
|
+
end
|
|
1343
|
+
|
|
1344
|
+
it "executes the callback" do
|
|
1345
|
+
track.before_update_called.should be_true
|
|
1346
|
+
end
|
|
1347
|
+
|
|
1348
|
+
it "persists the change" do
|
|
1349
|
+
reloaded.tracks.first.before_update_called.should be_true
|
|
1350
|
+
end
|
|
1351
|
+
end
|
|
1352
|
+
|
|
1353
|
+
context "when the child is not dirty" do
|
|
1354
|
+
|
|
1355
|
+
before do
|
|
1356
|
+
band.save
|
|
1357
|
+
end
|
|
1358
|
+
|
|
1359
|
+
it "does not execute the callback" do
|
|
1360
|
+
track.before_update_called.should be_false
|
|
1361
|
+
end
|
|
1362
|
+
end
|
|
1363
|
+
end
|
|
1364
|
+
end
|
|
1365
|
+
|
|
1366
|
+
describe "#before_validation" do
|
|
1367
|
+
|
|
1368
|
+
context "when the child is new" do
|
|
1369
|
+
|
|
1370
|
+
context "when the parent is new" do
|
|
1371
|
+
|
|
1372
|
+
let(:band) do
|
|
1373
|
+
Band.new(name: "Moderat")
|
|
1374
|
+
end
|
|
1375
|
+
|
|
1376
|
+
let!(:record) do
|
|
1377
|
+
band.records.build(name: "Moderat")
|
|
1378
|
+
end
|
|
1379
|
+
|
|
1380
|
+
let!(:track) do
|
|
1381
|
+
record.tracks.build(name: "Berlin")
|
|
1382
|
+
end
|
|
1383
|
+
|
|
1384
|
+
before do
|
|
1385
|
+
band.save
|
|
1386
|
+
end
|
|
1387
|
+
|
|
1388
|
+
it "executes the callback" do
|
|
1389
|
+
track.before_validation_called.should be_true
|
|
1390
|
+
end
|
|
1391
|
+
end
|
|
1392
|
+
|
|
1393
|
+
context "when the parent is persisted" do
|
|
1394
|
+
|
|
1395
|
+
let(:band) do
|
|
1396
|
+
Band.create(name: "Moderat")
|
|
1397
|
+
end
|
|
1398
|
+
|
|
1399
|
+
let!(:record) do
|
|
1400
|
+
band.records.build(name: "Moderat")
|
|
1401
|
+
end
|
|
1402
|
+
|
|
1403
|
+
let!(:track) do
|
|
1404
|
+
record.tracks.build(name: "Berlin")
|
|
1405
|
+
end
|
|
1406
|
+
|
|
1407
|
+
before do
|
|
1408
|
+
band.save
|
|
1409
|
+
end
|
|
1410
|
+
|
|
1411
|
+
it "executes the callback" do
|
|
1412
|
+
track.before_validation_called.should be_true
|
|
1413
|
+
end
|
|
1414
|
+
end
|
|
1415
|
+
end
|
|
1416
|
+
|
|
1417
|
+
context "when the child is persisted" do
|
|
1418
|
+
|
|
1419
|
+
let(:band) do
|
|
1420
|
+
Band.create(name: "Moderat")
|
|
1421
|
+
end
|
|
1422
|
+
|
|
1423
|
+
let!(:record) do
|
|
1424
|
+
band.records.create(name: "Moderat")
|
|
1425
|
+
end
|
|
1426
|
+
|
|
1427
|
+
let!(:track) do
|
|
1428
|
+
record.tracks.create(name: "Berlin")
|
|
1429
|
+
end
|
|
1430
|
+
|
|
1431
|
+
before do
|
|
1432
|
+
band.save
|
|
1433
|
+
end
|
|
1434
|
+
|
|
1435
|
+
it "executes the callback" do
|
|
1436
|
+
track.before_validation_called.should be_true
|
|
1437
|
+
end
|
|
1438
|
+
end
|
|
1439
|
+
end
|
|
1440
|
+
end
|
|
1441
|
+
end
|
|
1442
|
+
|
|
1443
|
+
context "callback on valid?" do
|
|
1444
|
+
|
|
1445
|
+
it "goes in all validation callback in good order" do
|
|
1446
|
+
shin = ValidationCallback.new
|
|
1447
|
+
shin.valid?
|
|
1448
|
+
shin.history.should eq([:before_validation, :validate, :after_validation])
|
|
1449
|
+
end
|
|
1450
|
+
end
|
|
1451
|
+
|
|
1452
|
+
context "when creating child documents in callbacks" do
|
|
1453
|
+
|
|
1454
|
+
let(:parent) do
|
|
1455
|
+
ParentDoc.new
|
|
1456
|
+
end
|
|
1457
|
+
|
|
1458
|
+
before do
|
|
1459
|
+
parent.save
|
|
1460
|
+
end
|
|
1461
|
+
|
|
1462
|
+
it "does not duplicate the child documents" do
|
|
1463
|
+
parent.child_docs.create(position: 1)
|
|
1464
|
+
ParentDoc.find(parent.id).child_docs.size.should eq(1)
|
|
1465
|
+
end
|
|
1466
|
+
end
|
|
1467
|
+
|
|
1468
|
+
context "when callbacks cancel persistence" do
|
|
1469
|
+
|
|
1470
|
+
let(:address) do
|
|
1471
|
+
Address.new(street: "123 Sesame")
|
|
1472
|
+
end
|
|
1473
|
+
|
|
1474
|
+
before(:all) do
|
|
1475
|
+
Person.before_save do |doc|
|
|
1476
|
+
doc.mode != :prevent_save
|
|
1477
|
+
end
|
|
1478
|
+
end
|
|
1479
|
+
|
|
1480
|
+
after(:all) do
|
|
1481
|
+
Person.reset_callbacks(:save)
|
|
1482
|
+
end
|
|
1483
|
+
|
|
1484
|
+
context "when creating a document" do
|
|
1485
|
+
|
|
1486
|
+
let(:person) do
|
|
1487
|
+
Person.new(mode: :prevent_save, title: "Associate", addresses: [ address ])
|
|
1488
|
+
end
|
|
1489
|
+
|
|
1490
|
+
it "fails to save" do
|
|
1491
|
+
person.should be_valid
|
|
1492
|
+
person.save.should be_false
|
|
1493
|
+
end
|
|
1494
|
+
|
|
1495
|
+
it "is a new record" do
|
|
1496
|
+
person.should be_a_new_record
|
|
1497
|
+
expect { person.save }.not_to change { person.new_record? }
|
|
1498
|
+
end
|
|
1499
|
+
|
|
1500
|
+
it "is left dirty" do
|
|
1501
|
+
person.should be_changed
|
|
1502
|
+
expect { person.save }.not_to change { person.changed? }
|
|
1503
|
+
end
|
|
1504
|
+
|
|
1505
|
+
it "child documents are left dirty" do
|
|
1506
|
+
address.should be_changed
|
|
1507
|
+
expect { person.save }.not_to change { address.changed? }
|
|
1508
|
+
end
|
|
1509
|
+
end
|
|
1510
|
+
|
|
1511
|
+
context "when updating a document" do
|
|
1512
|
+
|
|
1513
|
+
let(:person) do
|
|
1514
|
+
Person.create.tap do |person|
|
|
1515
|
+
person.attributes = {
|
|
1516
|
+
mode: :prevent_save,
|
|
1517
|
+
title: "Associate",
|
|
1518
|
+
addresses: [ address ]
|
|
1519
|
+
}
|
|
1520
|
+
end
|
|
1521
|
+
end
|
|
1522
|
+
|
|
1523
|
+
it "#save returns false" do
|
|
1524
|
+
person.should be_valid
|
|
1525
|
+
person.save.should be_false
|
|
1526
|
+
end
|
|
1527
|
+
|
|
1528
|
+
it "is a not a new record" do
|
|
1529
|
+
person.should_not be_a_new_record
|
|
1530
|
+
expect { person.save }.not_to change { person.new_record? }
|
|
1531
|
+
end
|
|
1532
|
+
|
|
1533
|
+
it "is left dirty" do
|
|
1534
|
+
person.should be_changed
|
|
1535
|
+
expect { person.save }.not_to change { person.changed? }
|
|
1536
|
+
end
|
|
1537
|
+
|
|
1538
|
+
it "child documents are left dirty" do
|
|
1539
|
+
address.should be_changed
|
|
1540
|
+
expect { person.save }.not_to change { address.changed? }
|
|
1541
|
+
end
|
|
1542
|
+
end
|
|
1543
|
+
end
|
|
1544
|
+
|
|
1545
|
+
context "when loading a model multiple times" do
|
|
1546
|
+
|
|
1547
|
+
before do
|
|
1548
|
+
load "spec/app/models/callback_test.rb"
|
|
1549
|
+
load "spec/app/models/callback_test.rb"
|
|
1550
|
+
end
|
|
1551
|
+
|
|
1552
|
+
let(:callback) do
|
|
1553
|
+
CallbackTest.new
|
|
1554
|
+
end
|
|
1555
|
+
|
|
1556
|
+
context "when saving the document" do
|
|
1557
|
+
|
|
1558
|
+
it "only executes the callbacks once" do
|
|
1559
|
+
callback.should_receive(:execute).once
|
|
1560
|
+
callback.save
|
|
1561
|
+
end
|
|
1562
|
+
end
|
|
1563
|
+
end
|
|
1564
|
+
end
|