ibm_db 3.0.4-x86-mingw32 → 3.0.5-x86-mingw32
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/CHANGES +4 -1
- data/LICENSE +1 -1
- data/MANIFEST +14 -14
- data/README +225 -225
- data/ext/Makefile.nt32 +181 -181
- data/ext/Makefile.nt32.191 +212 -212
- data/ext/extconf.rb +291 -291
- data/ext/ibm_db.c +11887 -11884
- data/ext/ruby_ibm_db.h +241 -241
- data/ext/ruby_ibm_db_cli.c +866 -866
- data/ext/ruby_ibm_db_cli.h +500 -500
- data/init.rb +41 -41
- data/lib/IBM_DB.rb +27 -27
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
- data/lib/mswin32/ibm_db.rb +122 -122
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
- data/test/assets/example.log +1 -1
- data/test/assets/test.txt +1 -1
- data/test/cases/adapter_test.rb +276 -261
- data/test/cases/aggregations_test.rb +158 -158
- data/test/cases/ar_schema_test.rb +161 -161
- data/test/cases/associations/association_scope_test.rb +21 -21
- data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
- data/test/cases/associations/callbacks_test.rb +192 -192
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
- data/test/cases/associations/eager_singularization_test.rb +148 -148
- data/test/cases/associations/eager_test.rb +1429 -1411
- data/test/cases/associations/extension_test.rb +82 -82
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
- data/test/cases/associations/has_many_associations_test.rb +2182 -2162
- data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
- data/test/cases/associations/has_one_associations_test.rb +610 -610
- data/test/cases/associations/has_one_through_associations_test.rb +380 -380
- data/test/cases/associations/inner_join_association_test.rb +139 -139
- data/test/cases/associations/inverse_associations_test.rb +706 -693
- data/test/cases/associations/join_model_test.rb +754 -754
- data/test/cases/associations/nested_through_associations_test.rb +579 -579
- data/test/cases/associations/required_test.rb +82 -82
- data/test/cases/associations_test.rb +380 -380
- data/test/cases/attribute_decorators_test.rb +125 -125
- data/test/cases/attribute_methods/read_test.rb +60 -60
- data/test/cases/attribute_methods/serialization_test.rb +29 -29
- data/test/cases/attribute_methods_test.rb +952 -952
- data/test/cases/attribute_set_test.rb +210 -200
- data/test/cases/attribute_test.rb +180 -180
- data/test/cases/attributes_test.rb +136 -136
- data/test/cases/autosave_association_test.rb +1595 -1595
- data/test/cases/base_test.rb +1664 -1638
- data/test/cases/batches_test.rb +212 -212
- data/test/cases/binary_test.rb +52 -52
- data/test/cases/bind_parameter_test.rb +100 -100
- data/test/cases/calculations_test.rb +646 -646
- data/test/cases/callbacks_test.rb +543 -543
- data/test/cases/clone_test.rb +40 -40
- data/test/cases/coders/yaml_column_test.rb +63 -63
- data/test/cases/column_alias_test.rb +17 -17
- data/test/cases/column_definition_test.rb +123 -123
- data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
- data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
- data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
- data/test/cases/connection_adapters/quoting_test.rb +13 -13
- data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
- data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
- data/test/cases/connection_management_test.rb +122 -122
- data/test/cases/connection_pool_test.rb +346 -346
- data/test/cases/connection_specification/resolver_test.rb +116 -116
- data/test/cases/core_test.rb +112 -112
- data/test/cases/counter_cache_test.rb +209 -209
- data/test/cases/custom_locking_test.rb +17 -17
- data/test/cases/database_statements_test.rb +19 -19
- data/test/cases/date_time_test.rb +61 -61
- data/test/cases/defaults_test.rb +223 -223
- data/test/cases/dirty_test.rb +785 -775
- data/test/cases/disconnected_test.rb +28 -28
- data/test/cases/dup_test.rb +157 -157
- data/test/cases/enum_test.rb +290 -290
- data/test/cases/explain_subscriber_test.rb +64 -64
- data/test/cases/explain_test.rb +76 -76
- data/test/cases/finder_respond_to_test.rb +60 -60
- data/test/cases/finder_test.rb +1169 -1166
- data/test/cases/fixture_set/file_test.rb +138 -138
- data/test/cases/fixtures_test.rb +908 -897
- data/test/cases/forbidden_attributes_protection_test.rb +99 -99
- data/test/cases/habtm_destroy_order_test.rb +61 -61
- data/test/cases/helper.rb +210 -210
- data/test/cases/hot_compatibility_test.rb +54 -54
- data/test/cases/i18n_test.rb +45 -45
- data/test/cases/inheritance_test.rb +375 -375
- data/test/cases/integration_test.rb +139 -139
- data/test/cases/invalid_connection_test.rb +22 -22
- data/test/cases/invalid_date_test.rb +32 -32
- data/test/cases/invertible_migration_test.rb +295 -295
- data/test/cases/json_serialization_test.rb +302 -302
- data/test/cases/locking_test.rb +477 -477
- data/test/cases/log_subscriber_test.rb +136 -136
- data/test/cases/migration/change_schema_test - Copy.rb +448 -448
- data/test/cases/migration/change_schema_test.rb +512 -472
- data/test/cases/migration/change_table_test.rb +224 -224
- data/test/cases/migration/column_attributes_test.rb +192 -192
- data/test/cases/migration/column_positioning_test.rb +56 -56
- data/test/cases/migration/columns_test.rb +304 -304
- data/test/cases/migration/command_recorder_test.rb +305 -305
- data/test/cases/migration/create_join_table_test.rb +148 -148
- data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
- data/test/cases/migration/foreign_key_test.rb +328 -360
- data/test/cases/migration/helper.rb +39 -39
- data/test/cases/migration/index_test.rb +216 -216
- data/test/cases/migration/logger_test.rb +36 -36
- data/test/cases/migration/pending_migrations_test.rb +53 -53
- data/test/cases/migration/references_foreign_key_test.rb +169 -214
- data/test/cases/migration/references_index_test.rb +101 -101
- data/test/cases/migration/references_statements_test.rb +116 -116
- data/test/cases/migration/rename_table_test.rb +93 -93
- data/test/cases/migration/table_and_index_test.rb +24 -24
- data/test/cases/migration_test.rb +959 -959
- data/test/cases/migrator_test.rb +388 -388
- data/test/cases/mixin_test.rb +70 -70
- data/test/cases/modules_test.rb +173 -173
- data/test/cases/multiparameter_attributes_test.rb +350 -350
- data/test/cases/multiple_db_test.rb +115 -115
- data/test/cases/nested_attributes_test.rb +1070 -1057
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
- data/test/cases/persistence_test.rb +909 -909
- data/test/cases/pooled_connections_test.rb +81 -81
- data/test/cases/primary_keys_test.rb +237 -237
- data/test/cases/query_cache_test.rb +326 -326
- data/test/cases/quoting_test.rb +156 -156
- data/test/cases/readonly_test.rb +118 -118
- data/test/cases/reaper_test.rb +85 -85
- data/test/cases/reflection_test.rb +463 -454
- data/test/cases/relation/delegation_test.rb +68 -68
- data/test/cases/relation/merging_test.rb +161 -161
- data/test/cases/relation/mutation_test.rb +165 -165
- data/test/cases/relation/predicate_builder_test.rb +14 -14
- data/test/cases/relation/where_chain_test.rb +181 -181
- data/test/cases/relation/where_test.rb +300 -300
- data/test/cases/relation/where_test2.rb +36 -36
- data/test/cases/relation_test.rb +319 -297
- data/test/cases/relations_test.rb +1815 -1815
- data/test/cases/reload_models_test.rb +22 -22
- data/test/cases/result_test.rb +80 -80
- data/test/cases/sanitize_test.rb +83 -83
- data/test/cases/schema_dumper_test.rb +463 -463
- data/test/cases/scoping/default_scoping_test.rb +454 -454
- data/test/cases/scoping/named_scoping_test.rb +524 -524
- data/test/cases/scoping/relation_scoping_test.rb +357 -357
- data/test/cases/serialization_test.rb +104 -104
- data/test/cases/serialized_attribute_test.rb +277 -277
- data/test/cases/statement_cache_test.rb +98 -98
- data/test/cases/store_test.rb +194 -194
- data/test/cases/tasks/database_tasks_test.rb +398 -396
- data/test/cases/tasks/mysql_rake_test.rb +324 -311
- data/test/cases/tasks/postgresql_rake_test.rb +250 -245
- data/test/cases/tasks/sqlite_rake_test.rb +193 -193
- data/test/cases/test_case.rb +123 -123
- data/test/cases/timestamp_test.rb +467 -468
- data/test/cases/transaction_callbacks_test.rb +452 -452
- data/test/cases/transaction_isolation_test.rb +106 -106
- data/test/cases/transactions_test.rb +817 -817
- data/test/cases/type/decimal_test.rb +56 -51
- data/test/cases/type/integer_test.rb +121 -121
- data/test/cases/type/string_test.rb +36 -36
- data/test/cases/type/type_map_test.rb +177 -177
- data/test/cases/type/unsigned_integer_test.rb +18 -18
- data/test/cases/types_test.rb +141 -141
- data/test/cases/unconnected_test.rb +33 -33
- data/test/cases/validations/association_validation_test.rb +86 -86
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
- data/test/cases/validations/i18n_validation_test.rb +90 -90
- data/test/cases/validations/length_validation_test.rb +47 -47
- data/test/cases/validations/presence_validation_test.rb +68 -68
- data/test/cases/validations/uniqueness_validation_test.rb +457 -434
- data/test/cases/validations_repair_helper.rb +23 -23
- data/test/cases/validations_test.rb +165 -165
- data/test/cases/view_test.rb +119 -113
- data/test/cases/xml_serialization_test.rb +457 -457
- data/test/cases/yaml_serialization_test.rb +126 -86
- data/test/config.rb +5 -5
- data/test/config.yml +154 -154
- data/test/connections/native_ibm_db/connection.rb +43 -43
- data/test/fixtures/accounts.yml +29 -29
- data/test/fixtures/admin/accounts.yml +2 -2
- data/test/fixtures/admin/randomly_named_a9.yml +7 -7
- data/test/fixtures/admin/randomly_named_b0.yml +7 -7
- data/test/fixtures/admin/users.yml +10 -10
- data/test/fixtures/author_addresses.yml +17 -17
- data/test/fixtures/author_favorites.yml +3 -3
- data/test/fixtures/authors.yml +23 -23
- data/test/fixtures/binaries.yml +133 -133
- data/test/fixtures/books.yml +11 -11
- data/test/fixtures/bulbs.yml +5 -5
- data/test/fixtures/cars.yml +9 -9
- data/test/fixtures/categories.yml +19 -19
- data/test/fixtures/categories/special_categories.yml +9 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
- data/test/fixtures/categories_ordered.yml +7 -7
- data/test/fixtures/categories_posts.yml +31 -31
- data/test/fixtures/categorizations.yml +23 -23
- data/test/fixtures/clubs.yml +8 -8
- data/test/fixtures/collections.yml +3 -3
- data/test/fixtures/colleges.yml +3 -3
- data/test/fixtures/comments.yml +65 -65
- data/test/fixtures/companies.yml +67 -67
- data/test/fixtures/computers.yml +10 -10
- data/test/fixtures/courses.yml +8 -8
- data/test/fixtures/customers.yml +25 -25
- data/test/fixtures/dashboards.yml +6 -6
- data/test/fixtures/developers.yml +21 -21
- data/test/fixtures/developers_projects.yml +16 -16
- data/test/fixtures/dog_lovers.yml +7 -7
- data/test/fixtures/dogs.yml +4 -4
- data/test/fixtures/doubloons.yml +3 -3
- data/test/fixtures/edges.yml +5 -5
- data/test/fixtures/entrants.yml +14 -14
- data/test/fixtures/essays.yml +6 -6
- data/test/fixtures/faces.yml +11 -11
- data/test/fixtures/fk_test_has_fk.yml +3 -3
- data/test/fixtures/fk_test_has_pk.yml +1 -1
- data/test/fixtures/friendships.yml +4 -4
- data/test/fixtures/funny_jokes.yml +10 -10
- data/test/fixtures/interests.yml +33 -33
- data/test/fixtures/items.yml +3 -3
- data/test/fixtures/jobs.yml +7 -7
- data/test/fixtures/legacy_things.yml +3 -3
- data/test/fixtures/mateys.yml +4 -4
- data/test/fixtures/member_details.yml +8 -8
- data/test/fixtures/member_types.yml +6 -6
- data/test/fixtures/members.yml +11 -11
- data/test/fixtures/memberships.yml +34 -34
- data/test/fixtures/men.yml +5 -5
- data/test/fixtures/minimalistics.yml +2 -2
- data/test/fixtures/minivans.yml +5 -5
- data/test/fixtures/mixed_case_monkeys.yml +6 -6
- data/test/fixtures/mixins.yml +29 -29
- data/test/fixtures/movies.yml +7 -7
- data/test/fixtures/naked/csv/accounts.csv +1 -1
- data/test/fixtures/naked/yml/accounts.yml +1 -1
- data/test/fixtures/naked/yml/companies.yml +1 -1
- data/test/fixtures/naked/yml/courses.yml +1 -1
- data/test/fixtures/organizations.yml +5 -5
- data/test/fixtures/other_topics.yml +42 -42
- data/test/fixtures/owners.yml +9 -9
- data/test/fixtures/parrots.yml +27 -27
- data/test/fixtures/parrots_pirates.yml +7 -7
- data/test/fixtures/people.yml +24 -24
- data/test/fixtures/peoples_treasures.yml +3 -3
- data/test/fixtures/pets.yml +19 -19
- data/test/fixtures/pirates.yml +12 -12
- data/test/fixtures/posts.yml +80 -80
- data/test/fixtures/price_estimates.yml +7 -7
- data/test/fixtures/products.yml +4 -4
- data/test/fixtures/projects.yml +7 -7
- data/test/fixtures/randomly_named_a9.yml +7 -7
- data/test/fixtures/ratings.yml +14 -14
- data/test/fixtures/readers.yml +11 -11
- data/test/fixtures/references.yml +17 -17
- data/test/fixtures/reserved_words/distinct.yml +5 -5
- data/test/fixtures/reserved_words/distinct_select.yml +11 -11
- data/test/fixtures/reserved_words/group.yml +14 -14
- data/test/fixtures/reserved_words/select.yml +8 -8
- data/test/fixtures/reserved_words/values.yml +7 -7
- data/test/fixtures/ships.yml +6 -6
- data/test/fixtures/speedometers.yml +8 -8
- data/test/fixtures/sponsors.yml +12 -12
- data/test/fixtures/string_key_objects.yml +7 -7
- data/test/fixtures/subscribers.yml +10 -10
- data/test/fixtures/subscriptions.yml +12 -12
- data/test/fixtures/taggings.yml +78 -78
- data/test/fixtures/tags.yml +11 -11
- data/test/fixtures/tasks.yml +7 -7
- data/test/fixtures/teapots.yml +3 -3
- data/test/fixtures/to_be_linked/accounts.yml +2 -2
- data/test/fixtures/to_be_linked/users.yml +10 -10
- data/test/fixtures/topics.yml +49 -49
- data/test/fixtures/toys.yml +14 -14
- data/test/fixtures/traffic_lights.yml +9 -9
- data/test/fixtures/treasures.yml +10 -10
- data/test/fixtures/uuid_children.yml +3 -3
- data/test/fixtures/uuid_parents.yml +2 -2
- data/test/fixtures/variants.yml +4 -4
- data/test/fixtures/vegetables.yml +19 -19
- data/test/fixtures/vertices.yml +3 -3
- data/test/fixtures/warehouse_things.yml +2 -2
- data/test/fixtures/zines.yml +5 -5
- data/test/ibm_db_test.rb +24 -24
- data/test/migrations/10_urban/9_add_expressions.rb +11 -11
- data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
- data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
- data/test/migrations/missing/1_people_have_last_names.rb +8 -8
- data/test/migrations/missing/3_we_need_reminders.rb +11 -11
- data/test/migrations/missing/4_innocent_jointable.rb +11 -11
- data/test/migrations/rename/1_we_need_things.rb +10 -10
- data/test/migrations/rename/2_rename_things.rb +8 -8
- data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy2/1_create_articles.rb +7 -7
- data/test/migrations/to_copy2/2_create_comments.rb +7 -7
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
- data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid/2_we_need_reminders.rb +11 -11
- data/test/migrations/valid/3_innocent_jointable.rb +11 -11
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
- data/test/models/admin.rb +4 -4
- data/test/models/admin/account.rb +2 -2
- data/test/models/admin/randomly_named_c1.rb +3 -3
- data/test/models/admin/user.rb +40 -40
- data/test/models/aircraft.rb +4 -4
- data/test/models/arunit2_model.rb +3 -3
- data/test/models/author.rb +212 -212
- data/test/models/auto_id.rb +4 -4
- data/test/models/autoloadable/extra_firm.rb +2 -2
- data/test/models/binary.rb +1 -1
- data/test/models/bird.rb +12 -12
- data/test/models/book.rb +18 -18
- data/test/models/boolean.rb +2 -2
- data/test/models/bulb.rb +51 -51
- data/test/models/cake_designer.rb +3 -3
- data/test/models/car.rb +26 -26
- data/test/models/carrier.rb +2 -2
- data/test/models/categorization.rb +19 -19
- data/test/models/category.rb +35 -35
- data/test/models/chef.rb +7 -3
- data/test/models/citation.rb +3 -3
- data/test/models/club.rb +23 -23
- data/test/models/college.rb +10 -10
- data/test/models/column.rb +3 -3
- data/test/models/column_name.rb +3 -3
- data/test/models/comment.rb +64 -64
- data/test/models/company.rb +228 -225
- data/test/models/company_in_module.rb +98 -98
- data/test/models/computer.rb +3 -3
- data/test/models/contact.rb +41 -41
- data/test/models/contract.rb +20 -20
- data/test/models/country.rb +7 -7
- data/test/models/course.rb +6 -6
- data/test/models/customer.rb +77 -77
- data/test/models/customer_carrier.rb +14 -14
- data/test/models/dashboard.rb +3 -3
- data/test/models/default.rb +2 -2
- data/test/models/department.rb +4 -4
- data/test/models/developer.rb +255 -252
- data/test/models/dog.rb +5 -5
- data/test/models/dog_lover.rb +5 -5
- data/test/models/doubloon.rb +12 -12
- data/test/models/drink_designer.rb +3 -3
- data/test/models/edge.rb +5 -5
- data/test/models/electron.rb +5 -5
- data/test/models/engine.rb +4 -4
- data/test/models/entrant.rb +3 -3
- data/test/models/essay.rb +5 -5
- data/test/models/event.rb +2 -2
- data/test/models/eye.rb +37 -37
- data/test/models/face.rb +9 -9
- data/test/models/friendship.rb +6 -6
- data/test/models/guid.rb +1 -1
- data/test/models/hotel.rb +9 -6
- data/test/models/image.rb +3 -3
- data/test/models/interest.rb +5 -5
- data/test/models/invoice.rb +4 -4
- data/test/models/item.rb +7 -7
- data/test/models/job.rb +7 -7
- data/test/models/joke.rb +7 -7
- data/test/models/keyboard.rb +3 -3
- data/test/models/legacy_thing.rb +3 -3
- data/test/models/lesson.rb +11 -11
- data/test/models/line_item.rb +3 -3
- data/test/models/liquid.rb +4 -4
- data/test/models/man.rb +11 -11
- data/test/models/matey.rb +4 -4
- data/test/models/member.rb +41 -41
- data/test/models/member_detail.rb +7 -7
- data/test/models/member_type.rb +3 -3
- data/test/models/membership.rb +35 -35
- data/test/models/minimalistic.rb +2 -2
- data/test/models/minivan.rb +9 -9
- data/test/models/mixed_case_monkey.rb +3 -3
- data/test/models/molecule.rb +6 -6
- data/test/models/movie.rb +5 -5
- data/test/models/order.rb +4 -4
- data/test/models/organization.rb +14 -14
- data/test/models/owner.rb +34 -34
- data/test/models/parrot.rb +29 -29
- data/test/models/person.rb +143 -143
- data/test/models/personal_legacy_thing.rb +4 -4
- data/test/models/pet.rb +15 -15
- data/test/models/pirate.rb +92 -92
- data/test/models/possession.rb +3 -3
- data/test/models/post.rb +264 -264
- data/test/models/price_estimate.rb +4 -4
- data/test/models/professor.rb +5 -5
- data/test/models/project.rb +31 -29
- data/test/models/publisher.rb +2 -2
- data/test/models/publisher/article.rb +4 -4
- data/test/models/publisher/magazine.rb +3 -3
- data/test/models/randomly_named_c1.rb +3 -3
- data/test/models/rating.rb +4 -4
- data/test/models/reader.rb +23 -23
- data/test/models/record.rb +2 -2
- data/test/models/reference.rb +22 -22
- data/test/models/reply.rb +61 -61
- data/test/models/ship.rb +33 -33
- data/test/models/ship_part.rb +7 -7
- data/test/models/shop.rb +17 -17
- data/test/models/shop_account.rb +6 -6
- data/test/models/speedometer.rb +6 -6
- data/test/models/sponsor.rb +7 -7
- data/test/models/string_key_object.rb +3 -3
- data/test/models/student.rb +4 -4
- data/test/models/subject.rb +16 -16
- data/test/models/subscriber.rb +8 -8
- data/test/models/subscription.rb +4 -4
- data/test/models/tag.rb +7 -7
- data/test/models/tagging.rb +13 -13
- data/test/models/task.rb +5 -5
- data/test/models/topic.rb +124 -124
- data/test/models/toy.rb +6 -6
- data/test/models/traffic_light.rb +4 -4
- data/test/models/treasure.rb +14 -14
- data/test/models/treaty.rb +7 -7
- data/test/models/tyre.rb +11 -11
- data/test/models/uuid_child.rb +3 -3
- data/test/models/uuid_parent.rb +3 -3
- data/test/models/vegetables.rb +24 -24
- data/test/models/vehicle.rb +6 -6
- data/test/models/vertex.rb +9 -9
- data/test/models/warehouse_thing.rb +5 -5
- data/test/models/wheel.rb +3 -3
- data/test/models/without_table.rb +3 -3
- data/test/models/zine.rb +3 -3
- data/test/schema/mysql2_specific_schema.rb +58 -58
- data/test/schema/mysql_specific_schema.rb +70 -70
- data/test/schema/oracle_specific_schema.rb +43 -43
- data/test/schema/postgresql_specific_schema.rb +202 -202
- data/test/schema/schema.rb +952 -938
- data/test/schema/sqlite_specific_schema.rb +21 -21
- data/test/support/config.rb +43 -43
- data/test/support/connection.rb +22 -22
- data/test/support/connection_helper.rb +14 -14
- data/test/support/ddl_helper.rb +8 -8
- data/test/support/schema_dumping_helper.rb +20 -20
- metadata +2 -2
@@ -1,610 +1,610 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/developer'
|
3
|
-
require 'models/computer'
|
4
|
-
require 'models/project'
|
5
|
-
require 'models/company'
|
6
|
-
require 'models/ship'
|
7
|
-
require 'models/pirate'
|
8
|
-
require 'models/car'
|
9
|
-
require 'models/bulb'
|
10
|
-
require 'models/author'
|
11
|
-
require 'models/image'
|
12
|
-
require 'models/post'
|
13
|
-
|
14
|
-
class HasOneAssociationsTest < ActiveRecord::TestCase
|
15
|
-
self.use_transactional_fixtures = false unless supports_savepoints?
|
16
|
-
fixtures :accounts, :companies, :developers, :projects, :developers_projects, :ships, :pirates
|
17
|
-
|
18
|
-
def setup
|
19
|
-
Account.destroyed_account_ids.clear
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_has_one
|
23
|
-
assert_equal companies(:first_firm).account, Account.find(1)
|
24
|
-
assert_equal Account.find(1).credit_limit, companies(:first_firm).account.credit_limit
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_has_one_does_not_use_order_by
|
28
|
-
ActiveRecord::SQLCounter.clear_log
|
29
|
-
companies(:first_firm).account
|
30
|
-
ensure
|
31
|
-
assert ActiveRecord::SQLCounter.log_all.all? { |sql| /order by/i !~ sql }, 'ORDER BY was used in the query'
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_has_one_cache_nils
|
35
|
-
firm = companies(:another_firm)
|
36
|
-
assert_queries(1) { assert_nil firm.account }
|
37
|
-
assert_queries(0) { assert_nil firm.account }
|
38
|
-
|
39
|
-
firms = Firm.all.merge!(:includes => :account).to_a
|
40
|
-
assert_queries(0) { firms.each(&:account) }
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_with_select
|
44
|
-
assert_equal Firm.find(1).account_with_select.attributes.size, 2
|
45
|
-
assert_equal Firm.all.merge!(:includes => :account_with_select).find(1).account_with_select.attributes.size, 2
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_finding_using_primary_key
|
49
|
-
firm = companies(:first_firm)
|
50
|
-
assert_equal Account.find_by_firm_id(firm.id), firm.account
|
51
|
-
firm.firm_id = companies(:rails_core).id
|
52
|
-
assert_equal accounts(:rails_core_account), firm.account_using_primary_key
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_update_with_foreign_and_primary_keys
|
56
|
-
firm = companies(:first_firm)
|
57
|
-
account = firm.account_using_foreign_and_primary_keys
|
58
|
-
assert_equal Account.find_by_firm_name(firm.name), account
|
59
|
-
firm.save
|
60
|
-
firm.reload
|
61
|
-
assert_equal account, firm.account_using_foreign_and_primary_keys
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_can_marshal_has_one_association_with_nil_target
|
65
|
-
firm = Firm.new
|
66
|
-
assert_nothing_raised do
|
67
|
-
assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
|
68
|
-
end
|
69
|
-
|
70
|
-
firm.account
|
71
|
-
assert_nothing_raised do
|
72
|
-
assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_proxy_assignment
|
77
|
-
company = companies(:first_firm)
|
78
|
-
assert_nothing_raised { company.account = company.account }
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_type_mismatch
|
82
|
-
assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = 1 }
|
83
|
-
assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = Project.find(1) }
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_natural_assignment
|
87
|
-
apple = Firm.create("name" => "Apple")
|
88
|
-
citibank = Account.create("credit_limit" => 10)
|
89
|
-
apple.account = citibank
|
90
|
-
assert_equal apple.id, citibank.firm_id
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_natural_assignment_to_nil
|
94
|
-
old_account_id = companies(:first_firm).account.id
|
95
|
-
companies(:first_firm).account = nil
|
96
|
-
companies(:first_firm).save
|
97
|
-
assert_nil companies(:first_firm).account
|
98
|
-
# account is dependent, therefore is destroyed when reference to owner is lost
|
99
|
-
assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) }
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_nullification_on_association_change
|
103
|
-
firm = companies(:rails_core)
|
104
|
-
old_account_id = firm.account.id
|
105
|
-
firm.account = Account.new(:credit_limit => 5)
|
106
|
-
# account is dependent with nullify, therefore its firm_id should be nil
|
107
|
-
assert_nil Account.find(old_account_id).firm_id
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_natural_assignment_to_nil_after_destroy
|
111
|
-
firm = companies(:rails_core)
|
112
|
-
old_account_id = firm.account.id
|
113
|
-
firm.account.destroy
|
114
|
-
firm.account = nil
|
115
|
-
assert_nil companies(:rails_core).account
|
116
|
-
assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) }
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_association_change_calls_delete
|
120
|
-
companies(:first_firm).deletable_account = Account.new(:credit_limit => 5)
|
121
|
-
assert_equal [], Account.destroyed_account_ids[companies(:first_firm).id]
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_association_change_calls_destroy
|
125
|
-
companies(:first_firm).account = Account.new(:credit_limit => 5)
|
126
|
-
assert_equal [companies(:first_firm).id], Account.destroyed_account_ids[companies(:first_firm).id]
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_natural_assignment_to_already_associated_record
|
130
|
-
company = companies(:first_firm)
|
131
|
-
account = accounts(:signals37)
|
132
|
-
assert_equal company.account, account
|
133
|
-
company.account = account
|
134
|
-
company.reload
|
135
|
-
account.reload
|
136
|
-
assert_equal company.account, account
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_dependence
|
140
|
-
num_accounts = Account.count
|
141
|
-
|
142
|
-
firm = Firm.find(1)
|
143
|
-
assert_not_nil firm.account
|
144
|
-
account_id = firm.account.id
|
145
|
-
assert_equal [], Account.destroyed_account_ids[firm.id]
|
146
|
-
|
147
|
-
firm.destroy
|
148
|
-
assert_equal num_accounts - 1, Account.count
|
149
|
-
assert_equal [account_id], Account.destroyed_account_ids[firm.id]
|
150
|
-
end
|
151
|
-
|
152
|
-
def test_exclusive_dependence
|
153
|
-
num_accounts = Account.count
|
154
|
-
|
155
|
-
firm = ExclusivelyDependentFirm.find(9)
|
156
|
-
assert_not_nil firm.account
|
157
|
-
assert_equal [], Account.destroyed_account_ids[firm.id]
|
158
|
-
|
159
|
-
firm.destroy
|
160
|
-
assert_equal num_accounts - 1, Account.count
|
161
|
-
assert_equal [], Account.destroyed_account_ids[firm.id]
|
162
|
-
end
|
163
|
-
|
164
|
-
def test_dependence_with_nil_associate
|
165
|
-
firm = DependentFirm.new(:name => 'nullify')
|
166
|
-
firm.save!
|
167
|
-
assert_nothing_raised { firm.destroy }
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_restrict_with_exception
|
171
|
-
firm = RestrictedWithExceptionFirm.create!(:name => 'restrict')
|
172
|
-
firm.create_account(:credit_limit => 10)
|
173
|
-
|
174
|
-
assert_not_nil firm.account
|
175
|
-
|
176
|
-
assert_raise(ActiveRecord::DeleteRestrictionError) { firm.destroy }
|
177
|
-
assert RestrictedWithExceptionFirm.exists?(:name => 'restrict')
|
178
|
-
assert firm.account.present?
|
179
|
-
end
|
180
|
-
|
181
|
-
def test_restrict_with_error
|
182
|
-
firm = RestrictedWithErrorFirm.create!(:name => 'restrict')
|
183
|
-
firm.create_account(:credit_limit => 10)
|
184
|
-
|
185
|
-
assert_not_nil firm.account
|
186
|
-
|
187
|
-
firm.destroy
|
188
|
-
|
189
|
-
assert !firm.errors.empty?
|
190
|
-
assert_equal "Cannot delete record because a dependent account exists", firm.errors[:base].first
|
191
|
-
assert RestrictedWithErrorFirm.exists?(:name => 'restrict')
|
192
|
-
assert firm.account.present?
|
193
|
-
end
|
194
|
-
|
195
|
-
def test_successful_build_association
|
196
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
197
|
-
firm.save
|
198
|
-
|
199
|
-
account = firm.build_account("credit_limit" => 1000)
|
200
|
-
assert account.save
|
201
|
-
assert_equal account, firm.account
|
202
|
-
end
|
203
|
-
|
204
|
-
def test_build_association_dont_create_transaction
|
205
|
-
assert_no_queries(ignore_none: false) {
|
206
|
-
Firm.new.build_account
|
207
|
-
}
|
208
|
-
end
|
209
|
-
|
210
|
-
def test_building_the_associated_object_with_implicit_sti_base_class
|
211
|
-
firm = DependentFirm.new
|
212
|
-
company = firm.build_company
|
213
|
-
assert_kind_of Company, company, "Expected #{company.class} to be a Company"
|
214
|
-
end
|
215
|
-
|
216
|
-
def test_building_the_associated_object_with_explicit_sti_base_class
|
217
|
-
firm = DependentFirm.new
|
218
|
-
company = firm.build_company(:type => "Company")
|
219
|
-
assert_kind_of Company, company, "Expected #{company.class} to be a Company"
|
220
|
-
end
|
221
|
-
|
222
|
-
def test_building_the_associated_object_with_sti_subclass
|
223
|
-
firm = DependentFirm.new
|
224
|
-
company = firm.build_company(:type => "Client")
|
225
|
-
assert_kind_of Client, company, "Expected #{company.class} to be a Client"
|
226
|
-
end
|
227
|
-
|
228
|
-
def test_building_the_associated_object_with_an_invalid_type
|
229
|
-
firm = DependentFirm.new
|
230
|
-
assert_raise(ActiveRecord::SubclassNotFound) { firm.build_company(:type => "Invalid") }
|
231
|
-
end
|
232
|
-
|
233
|
-
def test_building_the_associated_object_with_an_unrelated_type
|
234
|
-
firm = DependentFirm.new
|
235
|
-
assert_raise(ActiveRecord::SubclassNotFound) { firm.build_company(:type => "Account") }
|
236
|
-
end
|
237
|
-
|
238
|
-
def test_build_and_create_should_not_happen_within_scope
|
239
|
-
pirate = pirates(:blackbeard)
|
240
|
-
scoped_count = pirate.association(:foo_bulb).scope.where_values.count
|
241
|
-
|
242
|
-
bulb = pirate.build_foo_bulb
|
243
|
-
assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
|
244
|
-
|
245
|
-
bulb = pirate.create_foo_bulb
|
246
|
-
assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
|
247
|
-
|
248
|
-
bulb = pirate.create_foo_bulb!
|
249
|
-
assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
|
250
|
-
end
|
251
|
-
|
252
|
-
def test_create_association
|
253
|
-
firm = Firm.create(:name => "GlobalMegaCorp")
|
254
|
-
account = firm.create_account(:credit_limit => 1000)
|
255
|
-
assert_equal account, firm.reload.account
|
256
|
-
end
|
257
|
-
|
258
|
-
def test_create_association_with_bang
|
259
|
-
firm = Firm.create(:name => "GlobalMegaCorp")
|
260
|
-
account = firm.create_account!(:credit_limit => 1000)
|
261
|
-
assert_equal account, firm.reload.account
|
262
|
-
end
|
263
|
-
|
264
|
-
def test_create_association_with_bang_failing
|
265
|
-
firm = Firm.create(:name => "GlobalMegaCorp")
|
266
|
-
assert_raise ActiveRecord::RecordInvalid do
|
267
|
-
firm.create_account!
|
268
|
-
end
|
269
|
-
account = firm.account
|
270
|
-
assert_not_nil account
|
271
|
-
account.credit_limit = 5
|
272
|
-
account.save
|
273
|
-
assert_equal account, firm.reload.account
|
274
|
-
end
|
275
|
-
|
276
|
-
def test_create_with_inexistent_foreign_key_failing
|
277
|
-
firm = Firm.create(name: 'GlobalMegaCorp')
|
278
|
-
|
279
|
-
assert_raises(ActiveRecord::UnknownAttributeError) do
|
280
|
-
firm.create_account_with_inexistent_foreign_key
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
def test_build
|
285
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
286
|
-
firm.save
|
287
|
-
|
288
|
-
firm.account = account = Account.new("credit_limit" => 1000)
|
289
|
-
assert_equal account, firm.account
|
290
|
-
assert account.save
|
291
|
-
assert_equal account, firm.account
|
292
|
-
end
|
293
|
-
|
294
|
-
def test_create
|
295
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
296
|
-
firm.save
|
297
|
-
firm.account = account = Account.create("credit_limit" => 1000)
|
298
|
-
assert_equal account, firm.account
|
299
|
-
end
|
300
|
-
|
301
|
-
def test_create_before_save
|
302
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
303
|
-
firm.account = account = Account.create("credit_limit" => 1000)
|
304
|
-
assert_equal account, firm.account
|
305
|
-
end
|
306
|
-
|
307
|
-
def test_dependence_with_missing_association
|
308
|
-
Account.destroy_all
|
309
|
-
firm = Firm.find(1)
|
310
|
-
assert_nil firm.account
|
311
|
-
firm.destroy
|
312
|
-
end
|
313
|
-
|
314
|
-
def test_dependence_with_missing_association_and_nullify
|
315
|
-
Account.destroy_all
|
316
|
-
firm = DependentFirm.first
|
317
|
-
assert_nil firm.account
|
318
|
-
firm.destroy
|
319
|
-
end
|
320
|
-
|
321
|
-
def test_finding_with_interpolated_condition
|
322
|
-
firm = Firm.first
|
323
|
-
superior = firm.clients.create(:name => 'SuperiorCo')
|
324
|
-
superior.rating = 10
|
325
|
-
superior.save
|
326
|
-
assert_equal 10, firm.clients_with_interpolated_conditions.first.rating
|
327
|
-
end
|
328
|
-
|
329
|
-
def test_assignment_before_child_saved
|
330
|
-
firm = Firm.find(1)
|
331
|
-
firm.account = a = Account.new("credit_limit" => 1000)
|
332
|
-
assert a.persisted?
|
333
|
-
assert_equal a, firm.account
|
334
|
-
assert_equal a, firm.account
|
335
|
-
assert_equal a, firm.account(true)
|
336
|
-
end
|
337
|
-
|
338
|
-
def test_save_still_works_after_accessing_nil_has_one
|
339
|
-
jp = Company.new :name => 'Jaded Pixel'
|
340
|
-
jp.dummy_account.nil?
|
341
|
-
|
342
|
-
assert_nothing_raised do
|
343
|
-
jp.save!
|
344
|
-
end
|
345
|
-
end
|
346
|
-
|
347
|
-
def test_cant_save_readonly_association
|
348
|
-
assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_firm).readonly_account.save! }
|
349
|
-
assert companies(:first_firm).readonly_account.readonly?
|
350
|
-
end
|
351
|
-
|
352
|
-
def test_has_one_proxy_should_not_respond_to_private_methods
|
353
|
-
assert_raise(NoMethodError) { accounts(:signals37).private_method }
|
354
|
-
assert_raise(NoMethodError) { companies(:first_firm).account.private_method }
|
355
|
-
end
|
356
|
-
|
357
|
-
def test_has_one_proxy_should_respond_to_private_methods_via_send
|
358
|
-
accounts(:signals37).send(:private_method)
|
359
|
-
companies(:first_firm).account.send(:private_method)
|
360
|
-
end
|
361
|
-
|
362
|
-
def test_save_of_record_with_loaded_has_one
|
363
|
-
@firm = companies(:first_firm)
|
364
|
-
assert_not_nil @firm.account
|
365
|
-
|
366
|
-
assert_nothing_raised do
|
367
|
-
Firm.find(@firm.id).save!
|
368
|
-
Firm.all.merge!(:includes => :account).find(@firm.id).save!
|
369
|
-
end
|
370
|
-
|
371
|
-
@firm.account.destroy
|
372
|
-
|
373
|
-
assert_nothing_raised do
|
374
|
-
Firm.find(@firm.id).save!
|
375
|
-
Firm.all.merge!(:includes => :account).find(@firm.id).save!
|
376
|
-
end
|
377
|
-
end
|
378
|
-
|
379
|
-
def test_build_respects_hash_condition
|
380
|
-
account = companies(:first_firm).build_account_limit_500_with_hash_conditions
|
381
|
-
assert account.save
|
382
|
-
assert_equal 500, account.credit_limit
|
383
|
-
end
|
384
|
-
|
385
|
-
def test_create_respects_hash_condition
|
386
|
-
account = companies(:first_firm).create_account_limit_500_with_hash_conditions
|
387
|
-
assert account.persisted?
|
388
|
-
assert_equal 500, account.credit_limit
|
389
|
-
end
|
390
|
-
|
391
|
-
def test_attributes_are_being_set_when_initialized_from_has_one_association_with_where_clause
|
392
|
-
new_account = companies(:first_firm).build_account(:firm_name => 'Account')
|
393
|
-
assert_equal new_account.firm_name, "Account"
|
394
|
-
end
|
395
|
-
|
396
|
-
def test_creation_failure_without_dependent_option
|
397
|
-
pirate = pirates(:blackbeard)
|
398
|
-
orig_ship = pirate.ship
|
399
|
-
|
400
|
-
assert_equal ships(:black_pearl), orig_ship
|
401
|
-
new_ship = pirate.create_ship
|
402
|
-
assert_not_equal ships(:black_pearl), new_ship
|
403
|
-
assert_equal new_ship, pirate.ship
|
404
|
-
assert new_ship.new_record?
|
405
|
-
assert_nil orig_ship.pirate_id
|
406
|
-
assert !orig_ship.changed? # check it was saved
|
407
|
-
end
|
408
|
-
|
409
|
-
def test_creation_failure_with_dependent_option
|
410
|
-
pirate = pirates(:blackbeard).becomes(DestructivePirate)
|
411
|
-
orig_ship = pirate.dependent_ship
|
412
|
-
|
413
|
-
new_ship = pirate.create_dependent_ship
|
414
|
-
assert new_ship.new_record?
|
415
|
-
assert orig_ship.destroyed?
|
416
|
-
end
|
417
|
-
|
418
|
-
def test_creation_failure_due_to_new_record_should_raise_error
|
419
|
-
pirate = pirates(:redbeard)
|
420
|
-
new_ship = Ship.new
|
421
|
-
|
422
|
-
error = assert_raise(ActiveRecord::RecordNotSaved) do
|
423
|
-
pirate.ship = new_ship
|
424
|
-
end
|
425
|
-
|
426
|
-
assert_equal "Failed to save the new associated ship.", error.message
|
427
|
-
assert_nil pirate.ship
|
428
|
-
assert_nil new_ship.pirate_id
|
429
|
-
end
|
430
|
-
|
431
|
-
def test_replacement_failure_due_to_existing_record_should_raise_error
|
432
|
-
pirate = pirates(:blackbeard)
|
433
|
-
pirate.ship.name = nil
|
434
|
-
|
435
|
-
assert !pirate.ship.valid?
|
436
|
-
error = assert_raise(ActiveRecord::RecordNotSaved) do
|
437
|
-
pirate.ship = ships(:interceptor)
|
438
|
-
end
|
439
|
-
|
440
|
-
assert_equal ships(:black_pearl), pirate.ship
|
441
|
-
assert_equal pirate.id, pirate.ship.pirate_id
|
442
|
-
assert_equal "Failed to remove the existing associated ship. " +
|
443
|
-
"The record failed to save after its foreign key was set to nil.", error.message
|
444
|
-
end
|
445
|
-
|
446
|
-
def test_replacement_failure_due_to_new_record_should_raise_error
|
447
|
-
pirate = pirates(:blackbeard)
|
448
|
-
new_ship = Ship.new
|
449
|
-
|
450
|
-
error = assert_raise(ActiveRecord::RecordNotSaved) do
|
451
|
-
pirate.ship = new_ship
|
452
|
-
end
|
453
|
-
|
454
|
-
assert_equal "Failed to save the new associated ship.", error.message
|
455
|
-
assert_equal ships(:black_pearl), pirate.ship
|
456
|
-
assert_equal pirate.id, pirate.ship.pirate_id
|
457
|
-
assert_equal pirate.id, ships(:black_pearl).reload.pirate_id
|
458
|
-
assert_nil new_ship.pirate_id
|
459
|
-
end
|
460
|
-
|
461
|
-
def test_association_keys_bypass_attribute_protection
|
462
|
-
car = Car.create(:name => 'honda')
|
463
|
-
|
464
|
-
bulb = car.build_bulb
|
465
|
-
assert_equal car.id, bulb.car_id
|
466
|
-
|
467
|
-
bulb = car.build_bulb :car_id => car.id + 1
|
468
|
-
assert_equal car.id, bulb.car_id
|
469
|
-
|
470
|
-
bulb = car.create_bulb
|
471
|
-
assert_equal car.id, bulb.car_id
|
472
|
-
|
473
|
-
bulb = car.create_bulb :car_id => car.id + 1
|
474
|
-
assert_equal car.id, bulb.car_id
|
475
|
-
end
|
476
|
-
|
477
|
-
def test_association_protect_foreign_key
|
478
|
-
pirate = Pirate.create!(:catchphrase => "Don' botharrr talkin' like one, savvy?")
|
479
|
-
|
480
|
-
ship = pirate.build_ship
|
481
|
-
assert_equal pirate.id, ship.pirate_id
|
482
|
-
|
483
|
-
ship = pirate.build_ship :pirate_id => pirate.id + 1
|
484
|
-
assert_equal pirate.id, ship.pirate_id
|
485
|
-
|
486
|
-
ship = pirate.create_ship
|
487
|
-
assert_equal pirate.id, ship.pirate_id
|
488
|
-
|
489
|
-
ship = pirate.create_ship :pirate_id => pirate.id + 1
|
490
|
-
assert_equal pirate.id, ship.pirate_id
|
491
|
-
end
|
492
|
-
|
493
|
-
def test_build_with_block
|
494
|
-
car = Car.create(:name => 'honda')
|
495
|
-
|
496
|
-
bulb = car.build_bulb{ |b| b.color = 'Red' }
|
497
|
-
assert_equal 'RED!', bulb.color
|
498
|
-
end
|
499
|
-
|
500
|
-
def test_create_with_block
|
501
|
-
car = Car.create(:name => 'honda')
|
502
|
-
|
503
|
-
bulb = car.create_bulb{ |b| b.color = 'Red' }
|
504
|
-
assert_equal 'RED!', bulb.color
|
505
|
-
end
|
506
|
-
|
507
|
-
def test_create_bang_with_block
|
508
|
-
car = Car.create(:name => 'honda')
|
509
|
-
|
510
|
-
bulb = car.create_bulb!{ |b| b.color = 'Red' }
|
511
|
-
assert_equal 'RED!', bulb.color
|
512
|
-
end
|
513
|
-
|
514
|
-
def test_association_attributes_are_available_to_after_initialize
|
515
|
-
car = Car.create(:name => 'honda')
|
516
|
-
bulb = car.create_bulb
|
517
|
-
|
518
|
-
assert_equal car.id, bulb.attributes_after_initialize['car_id']
|
519
|
-
end
|
520
|
-
|
521
|
-
def test_has_one_transaction
|
522
|
-
company = companies(:first_firm)
|
523
|
-
account = Account.find(1)
|
524
|
-
|
525
|
-
company.account # force loading
|
526
|
-
assert_no_queries { company.account = account }
|
527
|
-
|
528
|
-
company.account = nil
|
529
|
-
assert_no_queries { company.account = nil }
|
530
|
-
account = Account.find(2)
|
531
|
-
assert_queries { company.account = account }
|
532
|
-
|
533
|
-
assert_no_queries { Firm.new.account = account }
|
534
|
-
end
|
535
|
-
|
536
|
-
def test_has_one_assignment_dont_trigger_save_on_change_of_same_object
|
537
|
-
pirate = Pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
|
538
|
-
ship = pirate.build_ship(name: 'old name')
|
539
|
-
ship.save!
|
540
|
-
|
541
|
-
ship.name = 'new name'
|
542
|
-
assert ship.changed?
|
543
|
-
assert_queries(1) do
|
544
|
-
# One query for updating name, not triggering query for updating pirate_id
|
545
|
-
pirate.ship = ship
|
546
|
-
end
|
547
|
-
|
548
|
-
assert_equal 'new name', pirate.ship.reload.name
|
549
|
-
end
|
550
|
-
|
551
|
-
def test_has_one_assignment_triggers_save_on_change_on_replacing_object
|
552
|
-
pirate = Pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
|
553
|
-
ship = pirate.build_ship(name: 'old name')
|
554
|
-
ship.save!
|
555
|
-
|
556
|
-
new_ship = Ship.create(name: 'new name')
|
557
|
-
assert_queries(2) do
|
558
|
-
# One query for updating name and second query for updating pirate_id
|
559
|
-
pirate.ship = new_ship
|
560
|
-
end
|
561
|
-
|
562
|
-
assert_equal 'new name', pirate.ship.reload.name
|
563
|
-
end
|
564
|
-
|
565
|
-
def test_has_one_autosave_with_primary_key_manually_set
|
566
|
-
post = Post.create(id: 1234, title: "Some title", body: 'Some content')
|
567
|
-
author = Author.new(id: 33, name: 'Hank Moody')
|
568
|
-
|
569
|
-
author.post = post
|
570
|
-
author.save
|
571
|
-
author.reload
|
572
|
-
|
573
|
-
assert_not_nil author.post
|
574
|
-
assert_equal author.post, post
|
575
|
-
end
|
576
|
-
|
577
|
-
def test_has_one_loading_for_new_record
|
578
|
-
Post.create!(author_id: 42, title: 'foo', body: 'bar')
|
579
|
-
author = Author.new(id: 42)
|
580
|
-
assert author.post
|
581
|
-
end
|
582
|
-
|
583
|
-
def test_has_one_relationship_cannot_have_a_counter_cache
|
584
|
-
assert_raise(ArgumentError) do
|
585
|
-
Class.new(ActiveRecord::Base) do
|
586
|
-
has_one :thing, counter_cache: true
|
587
|
-
end
|
588
|
-
end
|
589
|
-
end
|
590
|
-
|
591
|
-
def test_with_polymorphic_has_one_with_custom_columns_name
|
592
|
-
post = Post.create! :title => 'foo', :body => 'bar'
|
593
|
-
image = Image.create!
|
594
|
-
|
595
|
-
post.main_image = image
|
596
|
-
post.reload
|
597
|
-
|
598
|
-
assert_equal image, post.main_image
|
599
|
-
end
|
600
|
-
|
601
|
-
test 'dangerous association name raises ArgumentError' do
|
602
|
-
[:errors, 'errors', :save, 'save'].each do |name|
|
603
|
-
assert_raises(ArgumentError, "Association #{name} should not be allowed") do
|
604
|
-
Class.new(ActiveRecord::Base) do
|
605
|
-
has_one name
|
606
|
-
end
|
607
|
-
end
|
608
|
-
end
|
609
|
-
end
|
610
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/developer'
|
3
|
+
require 'models/computer'
|
4
|
+
require 'models/project'
|
5
|
+
require 'models/company'
|
6
|
+
require 'models/ship'
|
7
|
+
require 'models/pirate'
|
8
|
+
require 'models/car'
|
9
|
+
require 'models/bulb'
|
10
|
+
require 'models/author'
|
11
|
+
require 'models/image'
|
12
|
+
require 'models/post'
|
13
|
+
|
14
|
+
class HasOneAssociationsTest < ActiveRecord::TestCase
|
15
|
+
self.use_transactional_fixtures = false unless supports_savepoints?
|
16
|
+
fixtures :accounts, :companies, :developers, :projects, :developers_projects, :ships, :pirates
|
17
|
+
|
18
|
+
def setup
|
19
|
+
Account.destroyed_account_ids.clear
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_has_one
|
23
|
+
assert_equal companies(:first_firm).account, Account.find(1)
|
24
|
+
assert_equal Account.find(1).credit_limit, companies(:first_firm).account.credit_limit
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_has_one_does_not_use_order_by
|
28
|
+
ActiveRecord::SQLCounter.clear_log
|
29
|
+
companies(:first_firm).account
|
30
|
+
ensure
|
31
|
+
assert ActiveRecord::SQLCounter.log_all.all? { |sql| /order by/i !~ sql }, 'ORDER BY was used in the query'
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_has_one_cache_nils
|
35
|
+
firm = companies(:another_firm)
|
36
|
+
assert_queries(1) { assert_nil firm.account }
|
37
|
+
assert_queries(0) { assert_nil firm.account }
|
38
|
+
|
39
|
+
firms = Firm.all.merge!(:includes => :account).to_a
|
40
|
+
assert_queries(0) { firms.each(&:account) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_with_select
|
44
|
+
assert_equal Firm.find(1).account_with_select.attributes.size, 2
|
45
|
+
assert_equal Firm.all.merge!(:includes => :account_with_select).find(1).account_with_select.attributes.size, 2
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_finding_using_primary_key
|
49
|
+
firm = companies(:first_firm)
|
50
|
+
assert_equal Account.find_by_firm_id(firm.id), firm.account
|
51
|
+
firm.firm_id = companies(:rails_core).id
|
52
|
+
assert_equal accounts(:rails_core_account), firm.account_using_primary_key
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_update_with_foreign_and_primary_keys
|
56
|
+
firm = companies(:first_firm)
|
57
|
+
account = firm.account_using_foreign_and_primary_keys
|
58
|
+
assert_equal Account.find_by_firm_name(firm.name), account
|
59
|
+
firm.save
|
60
|
+
firm.reload
|
61
|
+
assert_equal account, firm.account_using_foreign_and_primary_keys
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_can_marshal_has_one_association_with_nil_target
|
65
|
+
firm = Firm.new
|
66
|
+
assert_nothing_raised do
|
67
|
+
assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
|
68
|
+
end
|
69
|
+
|
70
|
+
firm.account
|
71
|
+
assert_nothing_raised do
|
72
|
+
assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_proxy_assignment
|
77
|
+
company = companies(:first_firm)
|
78
|
+
assert_nothing_raised { company.account = company.account }
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_type_mismatch
|
82
|
+
assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = 1 }
|
83
|
+
assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = Project.find(1) }
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_natural_assignment
|
87
|
+
apple = Firm.create("name" => "Apple")
|
88
|
+
citibank = Account.create("credit_limit" => 10)
|
89
|
+
apple.account = citibank
|
90
|
+
assert_equal apple.id, citibank.firm_id
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_natural_assignment_to_nil
|
94
|
+
old_account_id = companies(:first_firm).account.id
|
95
|
+
companies(:first_firm).account = nil
|
96
|
+
companies(:first_firm).save
|
97
|
+
assert_nil companies(:first_firm).account
|
98
|
+
# account is dependent, therefore is destroyed when reference to owner is lost
|
99
|
+
assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) }
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_nullification_on_association_change
|
103
|
+
firm = companies(:rails_core)
|
104
|
+
old_account_id = firm.account.id
|
105
|
+
firm.account = Account.new(:credit_limit => 5)
|
106
|
+
# account is dependent with nullify, therefore its firm_id should be nil
|
107
|
+
assert_nil Account.find(old_account_id).firm_id
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_natural_assignment_to_nil_after_destroy
|
111
|
+
firm = companies(:rails_core)
|
112
|
+
old_account_id = firm.account.id
|
113
|
+
firm.account.destroy
|
114
|
+
firm.account = nil
|
115
|
+
assert_nil companies(:rails_core).account
|
116
|
+
assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) }
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_association_change_calls_delete
|
120
|
+
companies(:first_firm).deletable_account = Account.new(:credit_limit => 5)
|
121
|
+
assert_equal [], Account.destroyed_account_ids[companies(:first_firm).id]
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_association_change_calls_destroy
|
125
|
+
companies(:first_firm).account = Account.new(:credit_limit => 5)
|
126
|
+
assert_equal [companies(:first_firm).id], Account.destroyed_account_ids[companies(:first_firm).id]
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_natural_assignment_to_already_associated_record
|
130
|
+
company = companies(:first_firm)
|
131
|
+
account = accounts(:signals37)
|
132
|
+
assert_equal company.account, account
|
133
|
+
company.account = account
|
134
|
+
company.reload
|
135
|
+
account.reload
|
136
|
+
assert_equal company.account, account
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_dependence
|
140
|
+
num_accounts = Account.count
|
141
|
+
|
142
|
+
firm = Firm.find(1)
|
143
|
+
assert_not_nil firm.account
|
144
|
+
account_id = firm.account.id
|
145
|
+
assert_equal [], Account.destroyed_account_ids[firm.id]
|
146
|
+
|
147
|
+
firm.destroy
|
148
|
+
assert_equal num_accounts - 1, Account.count
|
149
|
+
assert_equal [account_id], Account.destroyed_account_ids[firm.id]
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_exclusive_dependence
|
153
|
+
num_accounts = Account.count
|
154
|
+
|
155
|
+
firm = ExclusivelyDependentFirm.find(9)
|
156
|
+
assert_not_nil firm.account
|
157
|
+
assert_equal [], Account.destroyed_account_ids[firm.id]
|
158
|
+
|
159
|
+
firm.destroy
|
160
|
+
assert_equal num_accounts - 1, Account.count
|
161
|
+
assert_equal [], Account.destroyed_account_ids[firm.id]
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_dependence_with_nil_associate
|
165
|
+
firm = DependentFirm.new(:name => 'nullify')
|
166
|
+
firm.save!
|
167
|
+
assert_nothing_raised { firm.destroy }
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_restrict_with_exception
|
171
|
+
firm = RestrictedWithExceptionFirm.create!(:name => 'restrict')
|
172
|
+
firm.create_account(:credit_limit => 10)
|
173
|
+
|
174
|
+
assert_not_nil firm.account
|
175
|
+
|
176
|
+
assert_raise(ActiveRecord::DeleteRestrictionError) { firm.destroy }
|
177
|
+
assert RestrictedWithExceptionFirm.exists?(:name => 'restrict')
|
178
|
+
assert firm.account.present?
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_restrict_with_error
|
182
|
+
firm = RestrictedWithErrorFirm.create!(:name => 'restrict')
|
183
|
+
firm.create_account(:credit_limit => 10)
|
184
|
+
|
185
|
+
assert_not_nil firm.account
|
186
|
+
|
187
|
+
firm.destroy
|
188
|
+
|
189
|
+
assert !firm.errors.empty?
|
190
|
+
assert_equal "Cannot delete record because a dependent account exists", firm.errors[:base].first
|
191
|
+
assert RestrictedWithErrorFirm.exists?(:name => 'restrict')
|
192
|
+
assert firm.account.present?
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_successful_build_association
|
196
|
+
firm = Firm.new("name" => "GlobalMegaCorp")
|
197
|
+
firm.save
|
198
|
+
|
199
|
+
account = firm.build_account("credit_limit" => 1000)
|
200
|
+
assert account.save
|
201
|
+
assert_equal account, firm.account
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_build_association_dont_create_transaction
|
205
|
+
assert_no_queries(ignore_none: false) {
|
206
|
+
Firm.new.build_account
|
207
|
+
}
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_building_the_associated_object_with_implicit_sti_base_class
|
211
|
+
firm = DependentFirm.new
|
212
|
+
company = firm.build_company
|
213
|
+
assert_kind_of Company, company, "Expected #{company.class} to be a Company"
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_building_the_associated_object_with_explicit_sti_base_class
|
217
|
+
firm = DependentFirm.new
|
218
|
+
company = firm.build_company(:type => "Company")
|
219
|
+
assert_kind_of Company, company, "Expected #{company.class} to be a Company"
|
220
|
+
end
|
221
|
+
|
222
|
+
def test_building_the_associated_object_with_sti_subclass
|
223
|
+
firm = DependentFirm.new
|
224
|
+
company = firm.build_company(:type => "Client")
|
225
|
+
assert_kind_of Client, company, "Expected #{company.class} to be a Client"
|
226
|
+
end
|
227
|
+
|
228
|
+
def test_building_the_associated_object_with_an_invalid_type
|
229
|
+
firm = DependentFirm.new
|
230
|
+
assert_raise(ActiveRecord::SubclassNotFound) { firm.build_company(:type => "Invalid") }
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_building_the_associated_object_with_an_unrelated_type
|
234
|
+
firm = DependentFirm.new
|
235
|
+
assert_raise(ActiveRecord::SubclassNotFound) { firm.build_company(:type => "Account") }
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_build_and_create_should_not_happen_within_scope
|
239
|
+
pirate = pirates(:blackbeard)
|
240
|
+
scoped_count = pirate.association(:foo_bulb).scope.where_values.count
|
241
|
+
|
242
|
+
bulb = pirate.build_foo_bulb
|
243
|
+
assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
|
244
|
+
|
245
|
+
bulb = pirate.create_foo_bulb
|
246
|
+
assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
|
247
|
+
|
248
|
+
bulb = pirate.create_foo_bulb!
|
249
|
+
assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_create_association
|
253
|
+
firm = Firm.create(:name => "GlobalMegaCorp")
|
254
|
+
account = firm.create_account(:credit_limit => 1000)
|
255
|
+
assert_equal account, firm.reload.account
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_create_association_with_bang
|
259
|
+
firm = Firm.create(:name => "GlobalMegaCorp")
|
260
|
+
account = firm.create_account!(:credit_limit => 1000)
|
261
|
+
assert_equal account, firm.reload.account
|
262
|
+
end
|
263
|
+
|
264
|
+
def test_create_association_with_bang_failing
|
265
|
+
firm = Firm.create(:name => "GlobalMegaCorp")
|
266
|
+
assert_raise ActiveRecord::RecordInvalid do
|
267
|
+
firm.create_account!
|
268
|
+
end
|
269
|
+
account = firm.account
|
270
|
+
assert_not_nil account
|
271
|
+
account.credit_limit = 5
|
272
|
+
account.save
|
273
|
+
assert_equal account, firm.reload.account
|
274
|
+
end
|
275
|
+
|
276
|
+
def test_create_with_inexistent_foreign_key_failing
|
277
|
+
firm = Firm.create(name: 'GlobalMegaCorp')
|
278
|
+
|
279
|
+
assert_raises(ActiveRecord::UnknownAttributeError) do
|
280
|
+
firm.create_account_with_inexistent_foreign_key
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_build
|
285
|
+
firm = Firm.new("name" => "GlobalMegaCorp")
|
286
|
+
firm.save
|
287
|
+
|
288
|
+
firm.account = account = Account.new("credit_limit" => 1000)
|
289
|
+
assert_equal account, firm.account
|
290
|
+
assert account.save
|
291
|
+
assert_equal account, firm.account
|
292
|
+
end
|
293
|
+
|
294
|
+
def test_create
|
295
|
+
firm = Firm.new("name" => "GlobalMegaCorp")
|
296
|
+
firm.save
|
297
|
+
firm.account = account = Account.create("credit_limit" => 1000)
|
298
|
+
assert_equal account, firm.account
|
299
|
+
end
|
300
|
+
|
301
|
+
def test_create_before_save
|
302
|
+
firm = Firm.new("name" => "GlobalMegaCorp")
|
303
|
+
firm.account = account = Account.create("credit_limit" => 1000)
|
304
|
+
assert_equal account, firm.account
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_dependence_with_missing_association
|
308
|
+
Account.destroy_all
|
309
|
+
firm = Firm.find(1)
|
310
|
+
assert_nil firm.account
|
311
|
+
firm.destroy
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_dependence_with_missing_association_and_nullify
|
315
|
+
Account.destroy_all
|
316
|
+
firm = DependentFirm.first
|
317
|
+
assert_nil firm.account
|
318
|
+
firm.destroy
|
319
|
+
end
|
320
|
+
|
321
|
+
def test_finding_with_interpolated_condition
|
322
|
+
firm = Firm.first
|
323
|
+
superior = firm.clients.create(:name => 'SuperiorCo')
|
324
|
+
superior.rating = 10
|
325
|
+
superior.save
|
326
|
+
assert_equal 10, firm.clients_with_interpolated_conditions.first.rating
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_assignment_before_child_saved
|
330
|
+
firm = Firm.find(1)
|
331
|
+
firm.account = a = Account.new("credit_limit" => 1000)
|
332
|
+
assert a.persisted?
|
333
|
+
assert_equal a, firm.account
|
334
|
+
assert_equal a, firm.account
|
335
|
+
assert_equal a, firm.account(true)
|
336
|
+
end
|
337
|
+
|
338
|
+
def test_save_still_works_after_accessing_nil_has_one
|
339
|
+
jp = Company.new :name => 'Jaded Pixel'
|
340
|
+
jp.dummy_account.nil?
|
341
|
+
|
342
|
+
assert_nothing_raised do
|
343
|
+
jp.save!
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_cant_save_readonly_association
|
348
|
+
assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_firm).readonly_account.save! }
|
349
|
+
assert companies(:first_firm).readonly_account.readonly?
|
350
|
+
end
|
351
|
+
|
352
|
+
def test_has_one_proxy_should_not_respond_to_private_methods
|
353
|
+
assert_raise(NoMethodError) { accounts(:signals37).private_method }
|
354
|
+
assert_raise(NoMethodError) { companies(:first_firm).account.private_method }
|
355
|
+
end
|
356
|
+
|
357
|
+
def test_has_one_proxy_should_respond_to_private_methods_via_send
|
358
|
+
accounts(:signals37).send(:private_method)
|
359
|
+
companies(:first_firm).account.send(:private_method)
|
360
|
+
end
|
361
|
+
|
362
|
+
def test_save_of_record_with_loaded_has_one
|
363
|
+
@firm = companies(:first_firm)
|
364
|
+
assert_not_nil @firm.account
|
365
|
+
|
366
|
+
assert_nothing_raised do
|
367
|
+
Firm.find(@firm.id).save!
|
368
|
+
Firm.all.merge!(:includes => :account).find(@firm.id).save!
|
369
|
+
end
|
370
|
+
|
371
|
+
@firm.account.destroy
|
372
|
+
|
373
|
+
assert_nothing_raised do
|
374
|
+
Firm.find(@firm.id).save!
|
375
|
+
Firm.all.merge!(:includes => :account).find(@firm.id).save!
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
def test_build_respects_hash_condition
|
380
|
+
account = companies(:first_firm).build_account_limit_500_with_hash_conditions
|
381
|
+
assert account.save
|
382
|
+
assert_equal 500, account.credit_limit
|
383
|
+
end
|
384
|
+
|
385
|
+
def test_create_respects_hash_condition
|
386
|
+
account = companies(:first_firm).create_account_limit_500_with_hash_conditions
|
387
|
+
assert account.persisted?
|
388
|
+
assert_equal 500, account.credit_limit
|
389
|
+
end
|
390
|
+
|
391
|
+
def test_attributes_are_being_set_when_initialized_from_has_one_association_with_where_clause
|
392
|
+
new_account = companies(:first_firm).build_account(:firm_name => 'Account')
|
393
|
+
assert_equal new_account.firm_name, "Account"
|
394
|
+
end
|
395
|
+
|
396
|
+
def test_creation_failure_without_dependent_option
|
397
|
+
pirate = pirates(:blackbeard)
|
398
|
+
orig_ship = pirate.ship
|
399
|
+
|
400
|
+
assert_equal ships(:black_pearl), orig_ship
|
401
|
+
new_ship = pirate.create_ship
|
402
|
+
assert_not_equal ships(:black_pearl), new_ship
|
403
|
+
assert_equal new_ship, pirate.ship
|
404
|
+
assert new_ship.new_record?
|
405
|
+
assert_nil orig_ship.pirate_id
|
406
|
+
assert !orig_ship.changed? # check it was saved
|
407
|
+
end
|
408
|
+
|
409
|
+
def test_creation_failure_with_dependent_option
|
410
|
+
pirate = pirates(:blackbeard).becomes(DestructivePirate)
|
411
|
+
orig_ship = pirate.dependent_ship
|
412
|
+
|
413
|
+
new_ship = pirate.create_dependent_ship
|
414
|
+
assert new_ship.new_record?
|
415
|
+
assert orig_ship.destroyed?
|
416
|
+
end
|
417
|
+
|
418
|
+
def test_creation_failure_due_to_new_record_should_raise_error
|
419
|
+
pirate = pirates(:redbeard)
|
420
|
+
new_ship = Ship.new
|
421
|
+
|
422
|
+
error = assert_raise(ActiveRecord::RecordNotSaved) do
|
423
|
+
pirate.ship = new_ship
|
424
|
+
end
|
425
|
+
|
426
|
+
assert_equal "Failed to save the new associated ship.", error.message
|
427
|
+
assert_nil pirate.ship
|
428
|
+
assert_nil new_ship.pirate_id
|
429
|
+
end
|
430
|
+
|
431
|
+
def test_replacement_failure_due_to_existing_record_should_raise_error
|
432
|
+
pirate = pirates(:blackbeard)
|
433
|
+
pirate.ship.name = nil
|
434
|
+
|
435
|
+
assert !pirate.ship.valid?
|
436
|
+
error = assert_raise(ActiveRecord::RecordNotSaved) do
|
437
|
+
pirate.ship = ships(:interceptor)
|
438
|
+
end
|
439
|
+
|
440
|
+
assert_equal ships(:black_pearl), pirate.ship
|
441
|
+
assert_equal pirate.id, pirate.ship.pirate_id
|
442
|
+
assert_equal "Failed to remove the existing associated ship. " +
|
443
|
+
"The record failed to save after its foreign key was set to nil.", error.message
|
444
|
+
end
|
445
|
+
|
446
|
+
def test_replacement_failure_due_to_new_record_should_raise_error
|
447
|
+
pirate = pirates(:blackbeard)
|
448
|
+
new_ship = Ship.new
|
449
|
+
|
450
|
+
error = assert_raise(ActiveRecord::RecordNotSaved) do
|
451
|
+
pirate.ship = new_ship
|
452
|
+
end
|
453
|
+
|
454
|
+
assert_equal "Failed to save the new associated ship.", error.message
|
455
|
+
assert_equal ships(:black_pearl), pirate.ship
|
456
|
+
assert_equal pirate.id, pirate.ship.pirate_id
|
457
|
+
assert_equal pirate.id, ships(:black_pearl).reload.pirate_id
|
458
|
+
assert_nil new_ship.pirate_id
|
459
|
+
end
|
460
|
+
|
461
|
+
def test_association_keys_bypass_attribute_protection
|
462
|
+
car = Car.create(:name => 'honda')
|
463
|
+
|
464
|
+
bulb = car.build_bulb
|
465
|
+
assert_equal car.id, bulb.car_id
|
466
|
+
|
467
|
+
bulb = car.build_bulb :car_id => car.id + 1
|
468
|
+
assert_equal car.id, bulb.car_id
|
469
|
+
|
470
|
+
bulb = car.create_bulb
|
471
|
+
assert_equal car.id, bulb.car_id
|
472
|
+
|
473
|
+
bulb = car.create_bulb :car_id => car.id + 1
|
474
|
+
assert_equal car.id, bulb.car_id
|
475
|
+
end
|
476
|
+
|
477
|
+
def test_association_protect_foreign_key
|
478
|
+
pirate = Pirate.create!(:catchphrase => "Don' botharrr talkin' like one, savvy?")
|
479
|
+
|
480
|
+
ship = pirate.build_ship
|
481
|
+
assert_equal pirate.id, ship.pirate_id
|
482
|
+
|
483
|
+
ship = pirate.build_ship :pirate_id => pirate.id + 1
|
484
|
+
assert_equal pirate.id, ship.pirate_id
|
485
|
+
|
486
|
+
ship = pirate.create_ship
|
487
|
+
assert_equal pirate.id, ship.pirate_id
|
488
|
+
|
489
|
+
ship = pirate.create_ship :pirate_id => pirate.id + 1
|
490
|
+
assert_equal pirate.id, ship.pirate_id
|
491
|
+
end
|
492
|
+
|
493
|
+
def test_build_with_block
|
494
|
+
car = Car.create(:name => 'honda')
|
495
|
+
|
496
|
+
bulb = car.build_bulb{ |b| b.color = 'Red' }
|
497
|
+
assert_equal 'RED!', bulb.color
|
498
|
+
end
|
499
|
+
|
500
|
+
def test_create_with_block
|
501
|
+
car = Car.create(:name => 'honda')
|
502
|
+
|
503
|
+
bulb = car.create_bulb{ |b| b.color = 'Red' }
|
504
|
+
assert_equal 'RED!', bulb.color
|
505
|
+
end
|
506
|
+
|
507
|
+
def test_create_bang_with_block
|
508
|
+
car = Car.create(:name => 'honda')
|
509
|
+
|
510
|
+
bulb = car.create_bulb!{ |b| b.color = 'Red' }
|
511
|
+
assert_equal 'RED!', bulb.color
|
512
|
+
end
|
513
|
+
|
514
|
+
def test_association_attributes_are_available_to_after_initialize
|
515
|
+
car = Car.create(:name => 'honda')
|
516
|
+
bulb = car.create_bulb
|
517
|
+
|
518
|
+
assert_equal car.id, bulb.attributes_after_initialize['car_id']
|
519
|
+
end
|
520
|
+
|
521
|
+
def test_has_one_transaction
|
522
|
+
company = companies(:first_firm)
|
523
|
+
account = Account.find(1)
|
524
|
+
|
525
|
+
company.account # force loading
|
526
|
+
assert_no_queries { company.account = account }
|
527
|
+
|
528
|
+
company.account = nil
|
529
|
+
assert_no_queries { company.account = nil }
|
530
|
+
account = Account.find(2)
|
531
|
+
assert_queries { company.account = account }
|
532
|
+
|
533
|
+
assert_no_queries { Firm.new.account = account }
|
534
|
+
end
|
535
|
+
|
536
|
+
def test_has_one_assignment_dont_trigger_save_on_change_of_same_object
|
537
|
+
pirate = Pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
|
538
|
+
ship = pirate.build_ship(name: 'old name')
|
539
|
+
ship.save!
|
540
|
+
|
541
|
+
ship.name = 'new name'
|
542
|
+
assert ship.changed?
|
543
|
+
assert_queries(1) do
|
544
|
+
# One query for updating name, not triggering query for updating pirate_id
|
545
|
+
pirate.ship = ship
|
546
|
+
end
|
547
|
+
|
548
|
+
assert_equal 'new name', pirate.ship.reload.name
|
549
|
+
end
|
550
|
+
|
551
|
+
def test_has_one_assignment_triggers_save_on_change_on_replacing_object
|
552
|
+
pirate = Pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
|
553
|
+
ship = pirate.build_ship(name: 'old name')
|
554
|
+
ship.save!
|
555
|
+
|
556
|
+
new_ship = Ship.create(name: 'new name')
|
557
|
+
assert_queries(2) do
|
558
|
+
# One query for updating name and second query for updating pirate_id
|
559
|
+
pirate.ship = new_ship
|
560
|
+
end
|
561
|
+
|
562
|
+
assert_equal 'new name', pirate.ship.reload.name
|
563
|
+
end
|
564
|
+
|
565
|
+
def test_has_one_autosave_with_primary_key_manually_set
|
566
|
+
post = Post.create(id: 1234, title: "Some title", body: 'Some content')
|
567
|
+
author = Author.new(id: 33, name: 'Hank Moody')
|
568
|
+
|
569
|
+
author.post = post
|
570
|
+
author.save
|
571
|
+
author.reload
|
572
|
+
|
573
|
+
assert_not_nil author.post
|
574
|
+
assert_equal author.post, post
|
575
|
+
end
|
576
|
+
|
577
|
+
def test_has_one_loading_for_new_record
|
578
|
+
Post.create!(author_id: 42, title: 'foo', body: 'bar')
|
579
|
+
author = Author.new(id: 42)
|
580
|
+
assert author.post
|
581
|
+
end
|
582
|
+
|
583
|
+
def test_has_one_relationship_cannot_have_a_counter_cache
|
584
|
+
assert_raise(ArgumentError) do
|
585
|
+
Class.new(ActiveRecord::Base) do
|
586
|
+
has_one :thing, counter_cache: true
|
587
|
+
end
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
591
|
+
def test_with_polymorphic_has_one_with_custom_columns_name
|
592
|
+
post = Post.create! :title => 'foo', :body => 'bar'
|
593
|
+
image = Image.create!
|
594
|
+
|
595
|
+
post.main_image = image
|
596
|
+
post.reload
|
597
|
+
|
598
|
+
assert_equal image, post.main_image
|
599
|
+
end
|
600
|
+
|
601
|
+
test 'dangerous association name raises ArgumentError' do
|
602
|
+
[:errors, 'errors', :save, 'save'].each do |name|
|
603
|
+
assert_raises(ArgumentError, "Association #{name} should not be allowed") do
|
604
|
+
Class.new(ActiveRecord::Base) do
|
605
|
+
has_one name
|
606
|
+
end
|
607
|
+
end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
end
|