ibm_db 5.2.0-x86-mingw32 → 5.4.0-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 +9 -0
- data/LICENSE +55 -18
- data/README +1 -1
- data/debug.log +1 -0
- data/ext/Makefile +28 -24
- data/ext/ibm_db.c +66 -65
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +26 -24
- data/ext/ruby_ibm_db_cli.c +1 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/ibm_db.rb +3 -1
- data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
- data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
- data/test/activejob/destroy_association_async_test.rb +305 -0
- data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
- data/test/activejob/helper.rb +15 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +432 -218
- data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
- data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
- data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
- data/test/cases/adapters/mysql2/connection_test.rb +48 -50
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
- data/test/cases/adapters/mysql2/enum_test.rb +32 -11
- data/test/cases/adapters/mysql2/explain_test.rb +13 -11
- data/test/cases/adapters/mysql2/json_test.rb +17 -188
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
- data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
- data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
- data/test/cases/adapters/mysql2/schema_test.rb +24 -22
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +10 -8
- data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
- data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
- data/test/cases/adapters/postgresql/array_test.rb +118 -63
- data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
- data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
- data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
- data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
- data/test/cases/adapters/postgresql/citext_test.rb +58 -58
- data/test/cases/adapters/postgresql/collation_test.rb +17 -15
- data/test/cases/adapters/postgresql/composite_test.rb +25 -23
- data/test/cases/adapters/postgresql/connection_test.rb +73 -85
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +9 -7
- data/test/cases/adapters/postgresql/enum_test.rb +12 -10
- data/test/cases/adapters/postgresql/explain_test.rb +10 -8
- data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
- data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
- data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
- data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
- data/test/cases/adapters/postgresql/integer_test.rb +2 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +16 -201
- data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
- data/test/cases/adapters/postgresql/money_test.rb +47 -16
- data/test/cases/adapters/postgresql/network_test.rb +36 -28
- data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
- data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
- data/test/cases/adapters/postgresql/range_test.rb +406 -292
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
- data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
- data/test/cases/adapters/postgresql/schema_test.rb +207 -91
- data/test/cases/adapters/postgresql/serial_test.rb +9 -7
- data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
- data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
- data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
- data/test/cases/adapters/postgresql/utils_test.rb +11 -9
- data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
- data/test/cases/adapters/postgresql/xml_test.rb +10 -14
- data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
- data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
- data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +14 -12
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +153 -86
- data/test/cases/arel/attributes/attribute_test.rb +1145 -0
- data/test/cases/arel/attributes/math_test.rb +83 -0
- data/test/cases/arel/attributes_test.rb +27 -0
- data/test/cases/arel/collectors/bind_test.rb +40 -0
- data/test/cases/arel/collectors/composite_test.rb +47 -0
- data/test/cases/arel/collectors/sql_string_test.rb +41 -0
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
- data/test/cases/arel/crud_test.rb +65 -0
- data/test/cases/arel/delete_manager_test.rb +53 -0
- data/test/cases/arel/factory_methods_test.rb +46 -0
- data/test/cases/arel/helper.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +241 -0
- data/test/cases/arel/nodes/and_test.rb +30 -0
- data/test/cases/arel/nodes/as_test.rb +36 -0
- data/test/cases/arel/nodes/ascending_test.rb +46 -0
- data/test/cases/arel/nodes/bin_test.rb +35 -0
- data/test/cases/arel/nodes/binary_test.rb +29 -0
- data/test/cases/arel/nodes/bind_param_test.rb +22 -0
- data/test/cases/arel/nodes/case_test.rb +96 -0
- data/test/cases/arel/nodes/casted_test.rb +18 -0
- data/test/cases/arel/nodes/comment_test.rb +22 -0
- data/test/cases/arel/nodes/count_test.rb +35 -0
- data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
- data/test/cases/arel/nodes/descending_test.rb +46 -0
- data/test/cases/arel/nodes/distinct_test.rb +21 -0
- data/test/cases/arel/nodes/equality_test.rb +62 -0
- data/test/cases/arel/nodes/extract_test.rb +43 -0
- data/test/cases/arel/nodes/false_test.rb +21 -0
- data/test/cases/arel/nodes/grouping_test.rb +26 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
- data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
- data/test/cases/arel/nodes/named_function_test.rb +48 -0
- data/test/cases/arel/nodes/node_test.rb +22 -0
- data/test/cases/arel/nodes/not_test.rb +31 -0
- data/test/cases/arel/nodes/or_test.rb +36 -0
- data/test/cases/arel/nodes/over_test.rb +69 -0
- data/test/cases/arel/nodes/select_core_test.rb +79 -0
- data/test/cases/arel/nodes/select_statement_test.rb +51 -0
- data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
- data/test/cases/arel/nodes/sum_test.rb +35 -0
- data/test/cases/arel/nodes/table_alias_test.rb +29 -0
- data/test/cases/arel/nodes/true_test.rb +21 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
- data/test/cases/arel/nodes/update_statement_test.rb +60 -0
- data/test/cases/arel/nodes/window_test.rb +81 -0
- data/test/cases/arel/nodes_test.rb +34 -0
- data/test/cases/arel/select_manager_test.rb +1238 -0
- data/test/cases/arel/support/fake_record.rb +135 -0
- data/test/cases/arel/table_test.rb +216 -0
- data/test/cases/arel/update_manager_test.rb +126 -0
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
- data/test/cases/arel/visitors/dot_test.rb +90 -0
- data/test/cases/arel/visitors/mysql_test.rb +157 -0
- data/test/cases/arel/visitors/postgres_test.rb +366 -0
- data/test/cases/arel/visitors/sqlite_test.rb +75 -0
- data/test/cases/arel/visitors/to_sql_test.rb +750 -0
- data/test/cases/associations/belongs_to_associations_test.rb +510 -158
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
- data/test/cases/associations/callbacks_test.rb +56 -38
- data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
- data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
- data/test/cases/associations/eager_singularization_test.rb +21 -21
- data/test/cases/associations/eager_test.rb +559 -415
- data/test/cases/associations/extension_test.rb +18 -12
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
- data/test/cases/associations/has_many_associations_test.rb +1038 -465
- data/test/cases/associations/has_many_through_associations_test.rb +558 -249
- data/test/cases/associations/has_one_associations_test.rb +294 -129
- data/test/cases/associations/has_one_through_associations_test.rb +121 -75
- data/test/cases/associations/inner_join_association_test.rb +114 -38
- data/test/cases/associations/inverse_associations_test.rb +606 -398
- data/test/cases/associations/join_model_test.rb +158 -148
- data/test/cases/associations/left_outer_join_association_test.rb +59 -24
- data/test/cases/associations/nested_through_associations_test.rb +166 -109
- data/test/cases/associations/required_test.rb +35 -10
- data/test/cases/associations_test.rb +241 -110
- data/test/cases/attribute_methods/read_test.rb +11 -11
- data/test/cases/attribute_methods_test.rb +413 -298
- data/test/cases/attributes_test.rb +145 -27
- data/test/cases/autosave_association_test.rb +681 -436
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +599 -542
- data/test/cases/batches_test.rb +288 -82
- data/test/cases/binary_test.rb +26 -31
- data/test/cases/bind_parameter_test.rb +194 -21
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +110 -5
- data/test/cases/calculations_test.rb +740 -177
- data/test/cases/callbacks_test.rb +74 -207
- data/test/cases/clone_test.rb +15 -10
- data/test/cases/coders/json_test.rb +2 -0
- data/test/cases/coders/yaml_column_test.rb +16 -13
- data/test/cases/collection_cache_key_test.rb +177 -20
- data/test/cases/column_alias_test.rb +9 -7
- data/test/cases/column_definition_test.rb +10 -68
- data/test/cases/comment_test.rb +166 -107
- data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
- data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
- data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
- data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
- data/test/cases/connection_management_test.rb +13 -11
- data/test/cases/connection_pool_test.rb +316 -83
- data/test/cases/core_test.rb +82 -58
- data/test/cases/counter_cache_test.rb +204 -50
- data/test/cases/custom_locking_test.rb +5 -3
- data/test/cases/database_configurations/hash_config_test.rb +74 -0
- data/test/cases/database_configurations/resolver_test.rb +150 -0
- data/test/cases/database_configurations_test.rb +145 -0
- data/test/cases/database_selector_test.rb +296 -0
- data/test/cases/database_statements_test.rb +18 -16
- data/test/cases/date_test.rb +8 -16
- data/test/cases/date_time_precision_test.rb +100 -78
- data/test/cases/date_time_test.rb +23 -8
- data/test/cases/defaults_test.rb +106 -71
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +419 -223
- data/test/cases/disconnected_test.rb +6 -6
- data/test/cases/dup_test.rb +54 -27
- data/test/cases/enum_test.rb +461 -82
- data/test/cases/errors_test.rb +7 -7
- data/test/cases/explain_subscriber_test.rb +17 -15
- data/test/cases/explain_test.rb +11 -19
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +14 -14
- data/test/cases/finder_test.rb +669 -287
- data/test/cases/fixture_set/file_test.rb +34 -38
- data/test/cases/fixtures_test.rb +833 -176
- data/test/cases/forbidden_attributes_protection_test.rb +32 -67
- data/test/cases/habtm_destroy_order_test.rb +25 -25
- data/test/cases/helper.rb +78 -49
- data/test/cases/hot_compatibility_test.rb +33 -32
- data/test/cases/i18n_test.rb +18 -17
- data/test/cases/inheritance_test.rb +180 -115
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +119 -31
- data/test/cases/invalid_connection_test.rb +18 -16
- data/test/cases/invertible_migration_test.rb +183 -43
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +57 -58
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +413 -119
- data/test/cases/log_subscriber_test.rb +68 -26
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +118 -72
- data/test/cases/migration/change_table_test.rb +138 -30
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +45 -35
- data/test/cases/migration/column_positioning_test.rb +18 -6
- data/test/cases/migration/columns_test.rb +93 -77
- data/test/cases/migration/command_recorder_test.rb +121 -34
- data/test/cases/migration/compatibility_test.rb +578 -23
- data/test/cases/migration/create_join_table_test.rb +35 -25
- data/test/cases/migration/foreign_key_test.rb +503 -284
- data/test/cases/migration/helper.rb +4 -3
- data/test/cases/migration/index_test.rb +119 -70
- data/test/cases/migration/logger_test.rb +9 -6
- data/test/cases/migration/pending_migrations_test.rb +88 -34
- data/test/cases/migration/references_foreign_key_test.rb +164 -150
- data/test/cases/migration/references_index_test.rb +38 -19
- data/test/cases/migration/references_statements_test.rb +15 -14
- data/test/cases/migration/rename_table_test.rb +53 -30
- data/test/cases/migration_test.rb +637 -269
- data/test/cases/migrator_test.rb +191 -135
- data/test/cases/mixin_test.rb +7 -11
- data/test/cases/modules_test.rb +36 -34
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +60 -33
- data/test/cases/multiple_db_test.rb +16 -22
- data/test/cases/nested_attributes_test.rb +341 -320
- data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +361 -269
- data/test/cases/pooled_connections_test.rb +18 -26
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +210 -104
- data/test/cases/query_cache_test.rb +610 -141
- data/test/cases/quoting_test.rb +132 -31
- data/test/cases/readonly_test.rb +49 -48
- data/test/cases/reaper_test.rb +146 -32
- data/test/cases/reflection_test.rb +167 -156
- data/test/cases/relation/delegation_test.rb +49 -36
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +319 -42
- data/test/cases/relation/mutation_test.rb +55 -93
- data/test/cases/relation/or_test.rb +129 -29
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/record_fetch_warning_test.rb +5 -3
- data/test/cases/relation/select_test.rb +67 -0
- data/test/cases/relation/update_all_test.rb +317 -0
- data/test/cases/relation/where_chain_test.rb +68 -32
- data/test/cases/relation/where_clause_test.rb +136 -61
- data/test/cases/relation/where_test.rb +155 -48
- data/test/cases/relation_test.rb +266 -112
- data/test/cases/relations_test.rb +969 -744
- data/test/cases/reload_models_test.rb +13 -9
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +68 -17
- data/test/cases/sanitize_test.rb +87 -71
- data/test/cases/schema_dumper_test.rb +221 -128
- data/test/cases/schema_loading_test.rb +3 -2
- data/test/cases/scoping/default_scoping_test.rb +185 -144
- data/test/cases/scoping/named_scoping_test.rb +177 -89
- data/test/cases/scoping/relation_scoping_test.rb +197 -75
- data/test/cases/secure_token_test.rb +18 -3
- data/test/cases/serialization_test.rb +30 -28
- data/test/cases/serialized_attribute_test.rb +133 -42
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +41 -24
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +180 -55
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +26 -12
- data/test/cases/tasks/database_tasks_test.rb +1258 -194
- data/test/cases/tasks/mysql_rake_test.rb +370 -298
- data/test/cases/tasks/postgresql_rake_test.rb +481 -251
- data/test/cases/tasks/sqlite_rake_test.rb +225 -178
- data/test/cases/test_case.rb +51 -40
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +79 -19
- data/test/cases/time_precision_test.rb +98 -76
- data/test/cases/timestamp_test.rb +102 -99
- data/test/cases/touch_later_test.rb +12 -10
- data/test/cases/transaction_callbacks_test.rb +344 -90
- data/test/cases/transaction_isolation_test.rb +12 -12
- data/test/cases/transactions_test.rb +612 -162
- data/test/cases/type/adapter_specific_registry_test.rb +14 -2
- data/test/cases/type/date_time_test.rb +4 -2
- data/test/cases/type/integer_test.rb +4 -2
- data/test/cases/type/string_test.rb +10 -8
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +29 -28
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +2 -0
- data/test/cases/types_test.rb +3 -1
- data/test/cases/unconnected_test.rb +14 -1
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +19 -17
- data/test/cases/validations/association_validation_test.rb +30 -28
- data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
- data/test/cases/validations/i18n_validation_test.rb +22 -21
- data/test/cases/validations/length_validation_test.rb +34 -33
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +21 -19
- data/test/cases/validations/uniqueness_validation_test.rb +156 -86
- data/test/cases/validations_repair_helper.rb +2 -0
- data/test/cases/validations_test.rb +61 -26
- data/test/cases/view_test.rb +122 -116
- data/test/cases/yaml_serialization_test.rb +79 -34
- data/test/config.example.yml +19 -19
- data/test/config.rb +3 -1
- data/test/config.yml +16 -6
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/author_addresses.yml +1 -8
- data/test/fixtures/authors.yml +1 -7
- data/test/fixtures/binaries.yml +4 -0
- data/test/fixtures/books.yml +9 -2
- data/test/fixtures/categories_posts.yml +3 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/comments.yml +7 -0
- data/test/fixtures/companies.yml +5 -0
- data/test/fixtures/computers.yml +2 -0
- data/test/fixtures/customers.yml +10 -1
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/essays.yml +10 -0
- data/test/fixtures/faces.yml +3 -3
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +7 -7
- data/test/fixtures/memberships.yml +7 -0
- data/test/fixtures/minimalistics.yml +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +2 -2
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +1 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_posts.yml +1 -0
- data/test/fixtures/parrots.yml +7 -1
- data/test/fixtures/pirates.yml +3 -0
- data/test/fixtures/posts.yml +11 -3
- data/test/fixtures/readers.yml +6 -0
- data/test/fixtures/reserved_words/values.yml +2 -2
- data/test/fixtures/sponsors.yml +3 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/subscribers.yml +1 -1
- data/test/fixtures/tasks.yml +1 -1
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +2 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
- data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
- data/test/migrations/missing/1_people_have_last_names.rb +2 -0
- data/test/migrations/missing/3_we_need_reminders.rb +2 -0
- data/test/migrations/missing/4_innocent_jointable.rb +3 -1
- data/test/migrations/rename/1_we_need_things.rb +2 -0
- data/test/migrations/rename/2_rename_things.rb +2 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy2/1_create_articles.rb +2 -0
- data/test/migrations/to_copy2/2_create_comments.rb +3 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +3 -1
- data/test/models/admin/randomly_named_c1.rb +2 -0
- data/test/models/admin/user.rb +16 -8
- data/test/models/admin.rb +4 -2
- data/test/models/aircraft.rb +3 -1
- data/test/models/arunit2_model.rb +2 -0
- data/test/models/author.rb +153 -102
- data/test/models/auto_id.rb +2 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +3 -1
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +13 -1
- data/test/models/book.rb +14 -4
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +5 -0
- data/test/models/bulb.rb +13 -4
- data/test/models/cake_designer.rb +2 -0
- data/test/models/car.rb +17 -10
- data/test/models/carrier.rb +2 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +2 -0
- data/test/models/categorization.rb +8 -6
- data/test/models/category.rb +28 -16
- data/test/models/chef.rb +2 -0
- data/test/models/citation.rb +5 -1
- data/test/models/club.rb +13 -10
- data/test/models/college.rb +4 -2
- data/test/models/column.rb +2 -0
- data/test/models/column_name.rb +2 -0
- data/test/models/comment.rb +32 -10
- data/test/models/company.rb +102 -106
- data/test/models/company_in_module.rb +27 -26
- data/test/models/computer.rb +3 -1
- data/test/models/contact.rb +15 -13
- data/test/models/content.rb +5 -3
- data/test/models/contract.rb +21 -3
- data/test/models/country.rb +2 -4
- data/test/models/course.rb +3 -1
- data/test/models/customer.rb +10 -8
- data/test/models/customer_carrier.rb +2 -0
- data/test/models/dashboard.rb +2 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +2 -0
- data/test/models/destroy_async_parent.rb +15 -0
- data/test/models/destroy_async_parent_soft_delete.rb +20 -0
- data/test/models/developer.rb +152 -85
- data/test/models/dl_keyed_belongs_to.rb +13 -0
- data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
- data/test/models/dl_keyed_has_many.rb +5 -0
- data/test/models/dl_keyed_has_many_through.rb +5 -0
- data/test/models/dl_keyed_has_one.rb +5 -0
- data/test/models/dl_keyed_join.rb +10 -0
- data/test/models/dog.rb +2 -0
- data/test/models/dog_lover.rb +2 -0
- data/test/models/doubloon.rb +3 -1
- data/test/models/drink_designer.rb +17 -0
- data/test/models/edge.rb +4 -2
- data/test/models/electron.rb +2 -0
- data/test/models/engine.rb +3 -2
- data/test/models/entrant.rb +2 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -3
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +3 -1
- data/test/models/eye.rb +5 -3
- data/test/models/face.rb +14 -6
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +5 -3
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +3 -1
- data/test/models/guitar.rb +2 -0
- data/test/models/hotel.rb +5 -3
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +3 -1
- data/test/models/interest.rb +14 -3
- data/test/models/invoice.rb +4 -2
- data/test/models/item.rb +3 -1
- data/test/models/job.rb +5 -3
- data/test/models/joke.rb +4 -2
- data/test/models/keyboard.rb +3 -1
- data/test/models/legacy_thing.rb +2 -0
- data/test/models/lesson.rb +2 -0
- data/test/models/line_item.rb +3 -1
- data/test/models/liquid.rb +2 -0
- data/test/models/matey.rb +3 -1
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +23 -20
- data/test/models/member_detail.rb +3 -0
- data/test/models/member_type.rb +2 -0
- data/test/models/membership.rb +4 -1
- data/test/models/mentor.rb +3 -1
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +3 -2
- data/test/models/mixed_case_monkey.rb +3 -1
- data/test/models/molecule.rb +2 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +2 -0
- data/test/models/node.rb +4 -2
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +2 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +4 -2
- data/test/models/organization.rb +9 -7
- data/test/models/other_dog.rb +3 -1
- data/test/models/owner.rb +6 -4
- data/test/models/parrot.rb +12 -4
- data/test/models/person.rb +59 -54
- data/test/models/personal_legacy_thing.rb +3 -1
- data/test/models/pet.rb +4 -2
- data/test/models/pet_treasure.rb +2 -0
- data/test/models/pirate.rb +67 -43
- data/test/models/possession.rb +3 -1
- data/test/models/post.rb +184 -86
- data/test/models/price_estimate.rb +11 -1
- data/test/models/professor.rb +3 -1
- data/test/models/project.rb +14 -12
- data/test/models/publisher/article.rb +2 -0
- data/test/models/publisher/magazine.rb +2 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/randomly_named_c1.rb +2 -0
- data/test/models/rating.rb +5 -1
- data/test/models/reader.rb +7 -5
- data/test/models/recipe.rb +2 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +6 -3
- data/test/models/reply.rb +39 -21
- data/test/models/room.rb +6 -0
- data/test/models/section.rb +6 -0
- data/test/models/seminar.rb +6 -0
- data/test/models/session.rb +6 -0
- data/test/models/ship.rb +12 -9
- data/test/models/ship_part.rb +5 -3
- data/test/models/shop.rb +4 -2
- data/test/models/shop_account.rb +2 -0
- data/test/models/speedometer.rb +2 -0
- data/test/models/sponsor.rb +8 -5
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +2 -0
- data/test/models/student.rb +2 -0
- data/test/models/subscriber.rb +4 -2
- data/test/models/subscription.rb +5 -1
- data/test/models/tag.rb +6 -3
- data/test/models/tagging.rb +13 -6
- data/test/models/task.rb +2 -0
- data/test/models/topic.rb +54 -19
- data/test/models/toy.rb +4 -0
- data/test/models/traffic_light.rb +2 -0
- data/test/models/treasure.rb +5 -3
- data/test/models/treaty.rb +2 -4
- data/test/models/tree.rb +2 -0
- data/test/models/tuning_peg.rb +2 -0
- data/test/models/tyre.rb +2 -0
- data/test/models/user.rb +12 -4
- data/test/models/uuid_child.rb +2 -0
- data/test/models/uuid_item.rb +2 -0
- data/test/models/uuid_parent.rb +2 -0
- data/test/models/vegetables.rb +12 -3
- data/test/models/vertex.rb +6 -4
- data/test/models/warehouse_thing.rb +2 -0
- data/test/models/wheel.rb +3 -1
- data/test/models/without_table.rb +3 -1
- data/test/models/zine.rb +3 -1
- data/test/schema/mysql2_specific_schema.rb +49 -35
- data/test/schema/oracle_specific_schema.rb +13 -15
- data/test/schema/postgresql_specific_schema.rb +51 -40
- data/test/schema/schema.rb +334 -154
- data/test/schema/sqlite_specific_schema.rb +9 -16
- data/test/support/config.rb +26 -26
- data/test/support/connection.rb +14 -8
- data/test/support/connection_helper.rb +3 -1
- data/test/support/ddl_helper.rb +2 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
- data/test/support/schema_dumping_helper.rb +2 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +192 -14
@@ -1,38 +1,77 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/developer"
|
5
|
+
require "models/project"
|
6
|
+
require "models/company"
|
7
|
+
require "models/topic"
|
8
|
+
require "models/reply"
|
9
|
+
require "models/computer"
|
10
|
+
require "models/post"
|
11
|
+
require "models/author"
|
12
|
+
require "models/tag"
|
13
|
+
require "models/tagging"
|
14
|
+
require "models/comment"
|
15
|
+
require "models/sponsor"
|
16
|
+
require "models/member"
|
17
|
+
require "models/essay"
|
18
|
+
require "models/toy"
|
19
|
+
require "models/invoice"
|
20
|
+
require "models/line_item"
|
21
|
+
require "models/column"
|
22
|
+
require "models/record"
|
23
|
+
require "models/admin"
|
24
|
+
require "models/admin/user"
|
25
|
+
require "models/ship"
|
26
|
+
require "models/treasure"
|
27
|
+
require "models/parrot"
|
28
|
+
require "models/book"
|
29
|
+
require "models/citation"
|
26
30
|
|
27
31
|
class BelongsToAssociationsTest < ActiveRecord::TestCase
|
28
32
|
fixtures :accounts, :companies, :developers, :projects, :topics,
|
29
33
|
:developers_projects, :computers, :authors, :author_addresses,
|
30
|
-
:posts, :tags, :taggings, :comments, :sponsors, :members
|
34
|
+
:essays, :posts, :tags, :taggings, :comments, :sponsors, :members
|
31
35
|
|
32
36
|
def test_belongs_to
|
33
|
-
|
34
|
-
|
35
|
-
|
37
|
+
client = Client.find(3)
|
38
|
+
first_firm = companies(:first_firm)
|
39
|
+
assert_sql(/LIMIT|ROWNUM <=|FETCH FIRST/) do
|
40
|
+
assert_equal first_firm, client.firm
|
41
|
+
assert_equal first_firm.name, client.firm.name
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_where_with_custom_primary_key
|
46
|
+
assert_equal [authors(:david)], Author.where(owned_essay: essays(:david_modest_proposal))
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_find_by_with_custom_primary_key
|
50
|
+
assert_equal authors(:david), Author.find_by(owned_essay: essays(:david_modest_proposal))
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_where_on_polymorphic_association_with_nil
|
54
|
+
assert_equal comments(:greetings), Comment.where(author: nil).first
|
55
|
+
assert_equal comments(:greetings), Comment.where(author: [nil]).first
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_where_on_polymorphic_association_with_empty_array
|
59
|
+
assert_empty Comment.where(author: [])
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_assigning_belongs_to_on_destroyed_object
|
63
|
+
client = Client.create!(name: "Client")
|
64
|
+
client.destroy!
|
65
|
+
assert_raise(FrozenError) { client.firm = nil }
|
66
|
+
assert_raise(FrozenError) { client.firm = Firm.new(name: "Firm") }
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_eager_loading_wont_mutate_owner_record
|
70
|
+
client = Client.eager_load(:firm_with_basic_id).first
|
71
|
+
assert_not_predicate client, :firm_id_came_from_user?
|
72
|
+
|
73
|
+
client = Client.preload(:firm_with_basic_id).first
|
74
|
+
assert_not_predicate client, :firm_id_came_from_user?
|
36
75
|
end
|
37
76
|
|
38
77
|
def test_missing_attribute_error_is_raised_when_no_foreign_key_attribute
|
@@ -40,14 +79,12 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
40
79
|
end
|
41
80
|
|
42
81
|
def test_belongs_to_does_not_use_order_by
|
43
|
-
|
44
|
-
|
45
|
-
ensure
|
46
|
-
assert ActiveRecord::SQLCounter.log_all.all? { |sql| /order by/i !~ sql }, 'ORDER BY was used in the query'
|
82
|
+
sql_log = capture_sql { Client.find(3).firm }
|
83
|
+
assert sql_log.all? { |sql| !/order by/i.match?(sql) }, "ORDER BY was used in the query: #{sql_log}"
|
47
84
|
end
|
48
85
|
|
49
86
|
def test_belongs_to_with_primary_key
|
50
|
-
client = Client.create(:
|
87
|
+
client = Client.create(name: "Primary key client", firm_name: companies(:first_firm).name)
|
51
88
|
assert_equal companies(:first_firm).name, client.firm_with_primary_key.name
|
52
89
|
end
|
53
90
|
|
@@ -60,16 +97,39 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
60
97
|
# on Oracle aliases are truncated to 30 characters and are quoted in uppercase
|
61
98
|
assert_no_match(/"firm_with_primary_keys_compani"\."id"/i, sql)
|
62
99
|
assert_match(/"firm_with_primary_keys_compani"\."name"/i, sql)
|
63
|
-
elsif current_adapter?(:IBM_DBAdapter)
|
64
|
-
# Quoting of column names is not necessary for IBM_DB
|
65
|
-
assert_no_match(/firm_with_primary_keys_companies\.id/i, sql)
|
66
|
-
assert_match(/firm_with_primary_keys_companies\.name/i, sql)
|
67
100
|
else
|
68
|
-
assert_no_match(/
|
69
|
-
assert_match(/
|
101
|
+
assert_no_match(/firm_with_primary_keys_companies\.id/, sql)
|
102
|
+
assert_match(/firm_with_primary_keys_companies\.name/, sql)
|
70
103
|
end
|
71
104
|
end
|
72
105
|
|
106
|
+
def test_optional_relation_can_be_set_per_model
|
107
|
+
model1 = Class.new(ActiveRecord::Base) do
|
108
|
+
self.table_name = "accounts"
|
109
|
+
self.belongs_to_required_by_default = false
|
110
|
+
|
111
|
+
belongs_to :company
|
112
|
+
|
113
|
+
def self.name
|
114
|
+
"FirstModel"
|
115
|
+
end
|
116
|
+
end.new
|
117
|
+
|
118
|
+
model2 = Class.new(ActiveRecord::Base) do
|
119
|
+
self.table_name = "accounts"
|
120
|
+
self.belongs_to_required_by_default = true
|
121
|
+
|
122
|
+
belongs_to :company
|
123
|
+
|
124
|
+
def self.name
|
125
|
+
"SecondModel"
|
126
|
+
end
|
127
|
+
end.new
|
128
|
+
|
129
|
+
assert_predicate model1, :valid?
|
130
|
+
assert_not_predicate model2, :valid?
|
131
|
+
end
|
132
|
+
|
73
133
|
def test_optional_relation
|
74
134
|
original_value = ActiveRecord::Base.belongs_to_required_by_default
|
75
135
|
ActiveRecord::Base.belongs_to_required_by_default = true
|
@@ -81,7 +141,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
81
141
|
end
|
82
142
|
|
83
143
|
account = model.new
|
84
|
-
|
144
|
+
assert_predicate account, :valid?
|
85
145
|
ensure
|
86
146
|
ActiveRecord::Base.belongs_to_required_by_default = original_value
|
87
147
|
end
|
@@ -97,8 +157,8 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
97
157
|
end
|
98
158
|
|
99
159
|
account = model.new
|
100
|
-
|
101
|
-
assert_equal [{error: :blank}], account.errors.details[:company]
|
160
|
+
assert_not_predicate account, :valid?
|
161
|
+
assert_equal [{ error: :blank }], account.errors.details[:company]
|
102
162
|
ensure
|
103
163
|
ActiveRecord::Base.belongs_to_required_by_default = original_value
|
104
164
|
end
|
@@ -114,31 +174,69 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
114
174
|
end
|
115
175
|
|
116
176
|
account = model.new
|
117
|
-
|
118
|
-
assert_equal [{error: :blank}], account.errors.details[:company]
|
177
|
+
assert_not_predicate account, :valid?
|
178
|
+
assert_equal [{ error: :blank }], account.errors.details[:company]
|
119
179
|
ensure
|
120
180
|
ActiveRecord::Base.belongs_to_required_by_default = original_value
|
121
181
|
end
|
122
182
|
|
183
|
+
def test_default
|
184
|
+
david = developers(:david)
|
185
|
+
jamis = developers(:jamis)
|
186
|
+
|
187
|
+
model = Class.new(ActiveRecord::Base) do
|
188
|
+
self.table_name = "ships"
|
189
|
+
def self.name; "Temp"; end
|
190
|
+
belongs_to :developer, default: -> { david }
|
191
|
+
end
|
192
|
+
|
193
|
+
ship = model.create!
|
194
|
+
assert_equal david, ship.developer
|
195
|
+
|
196
|
+
ship = model.create!(developer: jamis)
|
197
|
+
assert_equal jamis, ship.developer
|
198
|
+
|
199
|
+
ship.update!(developer: nil)
|
200
|
+
assert_equal david, ship.developer
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_default_with_lambda
|
204
|
+
model = Class.new(ActiveRecord::Base) do
|
205
|
+
self.table_name = "ships"
|
206
|
+
def self.name; "Temp"; end
|
207
|
+
belongs_to :developer, default: -> { default_developer }
|
208
|
+
|
209
|
+
def default_developer
|
210
|
+
Developer.first
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
ship = model.create!
|
215
|
+
assert_equal developers(:david), ship.developer
|
216
|
+
|
217
|
+
ship = model.create!(developer: developers(:jamis))
|
218
|
+
assert_equal developers(:jamis), ship.developer
|
219
|
+
end
|
220
|
+
|
123
221
|
def test_default_scope_on_relations_is_not_cached
|
124
222
|
counter = 0
|
125
223
|
|
126
224
|
comments = Class.new(ActiveRecord::Base) {
|
127
|
-
self.table_name =
|
128
|
-
self.inheritance_column =
|
225
|
+
self.table_name = "comments"
|
226
|
+
self.inheritance_column = "not_there"
|
129
227
|
|
130
228
|
posts = Class.new(ActiveRecord::Base) {
|
131
|
-
self.table_name =
|
132
|
-
self.inheritance_column =
|
229
|
+
self.table_name = "posts"
|
230
|
+
self.inheritance_column = "not_there"
|
133
231
|
|
134
232
|
default_scope -> {
|
135
233
|
counter += 1
|
136
|
-
where("id = :inc", :
|
234
|
+
where("id = :inc", inc: counter)
|
137
235
|
}
|
138
236
|
|
139
|
-
has_many :comments, :
|
237
|
+
has_many :comments, anonymous_class: comments
|
140
238
|
}
|
141
|
-
belongs_to :post, :
|
239
|
+
belongs_to :post, anonymous_class: posts, inverse_of: false
|
142
240
|
}
|
143
241
|
|
144
242
|
assert_equal 0, counter
|
@@ -163,16 +261,16 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
163
261
|
assert_nil defined?(Region), "This test requires that there is no top-level Region class"
|
164
262
|
|
165
263
|
ActiveRecord::Base.connection.instance_eval do
|
166
|
-
create_table(:admin_regions) { |t| t.string :name }
|
264
|
+
create_table(:admin_regions, force: true) { |t| t.string :name }
|
167
265
|
add_column :admin_users, :region_id, :integer
|
168
266
|
end
|
169
267
|
Admin.const_set "RegionalUser", Class.new(Admin::User) { belongs_to(:region) }
|
170
268
|
Admin.const_set "Region", Class.new(ActiveRecord::Base)
|
171
269
|
|
172
270
|
e = assert_raise(ActiveRecord::AssociationTypeMismatch) {
|
173
|
-
Admin::RegionalUser.new(region:
|
271
|
+
Admin::RegionalUser.new(region: "wrong value")
|
174
272
|
}
|
175
|
-
assert_match(/^Region\([^)]+\) expected, got String\([^)]+\)$/, e.message)
|
273
|
+
assert_match(/^Region\([^)]+\) expected, got "wrong value" which is an instance of String\([^)]+\)$/, e.message)
|
176
274
|
ensure
|
177
275
|
Admin.send :remove_const, "Region" if Admin.const_defined?("Region")
|
178
276
|
Admin.send :remove_const, "RegionalUser" if Admin.const_defined?("RegionalUser")
|
@@ -181,6 +279,8 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
181
279
|
remove_column :admin_users, :region_id if column_exists?(:admin_users, :region_id)
|
182
280
|
drop_table :admin_regions, if_exists: true
|
183
281
|
end
|
282
|
+
|
283
|
+
Admin::User.reset_column_information
|
184
284
|
end
|
185
285
|
|
186
286
|
def test_natural_assignment
|
@@ -207,15 +307,15 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
207
307
|
def test_eager_loading_with_primary_key
|
208
308
|
Firm.create("name" => "Apple")
|
209
309
|
Client.create("name" => "Citibank", :firm_name => "Apple")
|
210
|
-
citibank_result = Client.all.merge!(:
|
211
|
-
|
310
|
+
citibank_result = Client.all.merge!(where: { name: "Citibank" }, includes: :firm_with_primary_key).first
|
311
|
+
assert_predicate citibank_result.association(:firm_with_primary_key), :loaded?
|
212
312
|
end
|
213
313
|
|
214
314
|
def test_eager_loading_with_primary_key_as_symbol
|
215
315
|
Firm.create("name" => "Apple")
|
216
316
|
Client.create("name" => "Citibank", :firm_name => "Apple")
|
217
|
-
citibank_result = Client.all.merge!(:
|
218
|
-
|
317
|
+
citibank_result = Client.all.merge!(where: { name: "Citibank" }, includes: :firm_with_primary_key_symbols).first
|
318
|
+
assert_predicate citibank_result.association(:firm_with_primary_key_symbols), :loaded?
|
219
319
|
end
|
220
320
|
|
221
321
|
def test_creating_the_belonging_object
|
@@ -227,8 +327,17 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
227
327
|
assert_equal apple, citibank.firm
|
228
328
|
end
|
229
329
|
|
330
|
+
def test_creating_the_belonging_object_from_new_record
|
331
|
+
citibank = Account.new("credit_limit" => 10)
|
332
|
+
apple = citibank.create_firm("name" => "Apple")
|
333
|
+
assert_equal apple, citibank.firm
|
334
|
+
citibank.save
|
335
|
+
citibank.reload
|
336
|
+
assert_equal apple, citibank.firm
|
337
|
+
end
|
338
|
+
|
230
339
|
def test_creating_the_belonging_object_with_primary_key
|
231
|
-
client = Client.create(:
|
340
|
+
client = Client.create(name: "Primary key client")
|
232
341
|
apple = client.create_firm_with_primary_key("name" => "Apple")
|
233
342
|
assert_equal apple, client.firm_with_primary_key
|
234
343
|
client.save
|
@@ -251,48 +360,48 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
251
360
|
|
252
361
|
def test_building_the_belonging_object_with_explicit_sti_base_class
|
253
362
|
account = Account.new
|
254
|
-
company = account.build_firm(:
|
363
|
+
company = account.build_firm(type: "Company")
|
255
364
|
assert_kind_of Company, company, "Expected #{company.class} to be a Company"
|
256
365
|
end
|
257
366
|
|
258
367
|
def test_building_the_belonging_object_with_sti_subclass
|
259
368
|
account = Account.new
|
260
|
-
company = account.build_firm(:
|
369
|
+
company = account.build_firm(type: "Firm")
|
261
370
|
assert_kind_of Firm, company, "Expected #{company.class} to be a Firm"
|
262
371
|
end
|
263
372
|
|
264
373
|
def test_building_the_belonging_object_with_an_invalid_type
|
265
374
|
account = Account.new
|
266
|
-
assert_raise(ActiveRecord::SubclassNotFound) { account.build_firm(:
|
375
|
+
assert_raise(ActiveRecord::SubclassNotFound) { account.build_firm(type: "InvalidType") }
|
267
376
|
end
|
268
377
|
|
269
378
|
def test_building_the_belonging_object_with_an_unrelated_type
|
270
379
|
account = Account.new
|
271
|
-
assert_raise(ActiveRecord::SubclassNotFound) { account.build_firm(:
|
380
|
+
assert_raise(ActiveRecord::SubclassNotFound) { account.build_firm(type: "Account") }
|
272
381
|
end
|
273
382
|
|
274
383
|
def test_building_the_belonging_object_with_primary_key
|
275
|
-
client = Client.create(:
|
384
|
+
client = Client.create(name: "Primary key client")
|
276
385
|
apple = client.build_firm_with_primary_key("name" => "Apple")
|
277
386
|
client.save
|
278
387
|
assert_equal apple.name, client.firm_name
|
279
388
|
end
|
280
389
|
|
281
390
|
def test_create!
|
282
|
-
client = Client.create!(:
|
283
|
-
account = client.create_account!(:
|
391
|
+
client = Client.create!(name: "Jimmy")
|
392
|
+
account = client.create_account!(credit_limit: 10)
|
284
393
|
assert_equal account, client.account
|
285
|
-
|
394
|
+
assert_predicate account, :persisted?
|
286
395
|
client.save
|
287
396
|
client.reload
|
288
397
|
assert_equal account, client.account
|
289
398
|
end
|
290
399
|
|
291
400
|
def test_failing_create!
|
292
|
-
client
|
401
|
+
client = Client.create!(name: "Jimmy")
|
293
402
|
assert_raise(ActiveRecord::RecordInvalid) { client.create_account! }
|
294
403
|
assert_not_nil client.account
|
295
|
-
|
404
|
+
assert_predicate client.account, :new_record?
|
296
405
|
end
|
297
406
|
|
298
407
|
def test_reloading_the_belonging_object
|
@@ -305,6 +414,30 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
305
414
|
assert_equal "ODEGY", odegy_account.reload_firm.name
|
306
415
|
end
|
307
416
|
|
417
|
+
def test_reload_the_belonging_object_with_query_cache
|
418
|
+
odegy_account_id = accounts(:odegy_account).id
|
419
|
+
|
420
|
+
connection = ActiveRecord::Base.connection
|
421
|
+
connection.enable_query_cache!
|
422
|
+
connection.clear_query_cache
|
423
|
+
|
424
|
+
# Populate the cache with a query
|
425
|
+
odegy_account = Account.find(odegy_account_id)
|
426
|
+
|
427
|
+
# Populate the cache with a second query
|
428
|
+
odegy_account.firm
|
429
|
+
|
430
|
+
assert_equal 2, connection.query_cache.size
|
431
|
+
|
432
|
+
# Clear the cache and fetch the firm again, populating the cache with a query
|
433
|
+
assert_queries(1) { odegy_account.reload_firm }
|
434
|
+
|
435
|
+
# This query is not cached anymore, so it should make a real SQL query
|
436
|
+
assert_queries(1) { Account.find(odegy_account_id) }
|
437
|
+
ensure
|
438
|
+
ActiveRecord::Base.connection.disable_query_cache!
|
439
|
+
end
|
440
|
+
|
308
441
|
def test_natural_assignment_to_nil
|
309
442
|
client = Client.find(3)
|
310
443
|
client.firm = nil
|
@@ -315,7 +448,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
315
448
|
end
|
316
449
|
|
317
450
|
def test_natural_assignment_to_nil_with_primary_key
|
318
|
-
client = Client.create(:
|
451
|
+
client = Client.create(name: "Primary key client", firm_name: companies(:first_firm).name)
|
319
452
|
client.firm_with_primary_key = nil
|
320
453
|
client.save
|
321
454
|
client.association(:firm_with_primary_key).reload
|
@@ -335,41 +468,52 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
335
468
|
|
336
469
|
def test_polymorphic_association_class
|
337
470
|
sponsor = Sponsor.new
|
338
|
-
assert_nil sponsor.association(:sponsorable).
|
471
|
+
assert_nil sponsor.association(:sponsorable).klass
|
339
472
|
sponsor.association(:sponsorable).reload
|
340
473
|
assert_nil sponsor.sponsorable
|
341
474
|
|
342
|
-
sponsor.sponsorable_type =
|
343
|
-
assert_nil sponsor.association(:sponsorable).
|
475
|
+
sponsor.sponsorable_type = "" # the column doesn't have to be declared NOT NULL
|
476
|
+
assert_nil sponsor.association(:sponsorable).klass
|
344
477
|
sponsor.association(:sponsorable).reload
|
345
478
|
assert_nil sponsor.sponsorable
|
346
479
|
|
347
|
-
sponsor.sponsorable = Member.new :
|
348
|
-
assert_equal Member, sponsor.association(:sponsorable).
|
349
|
-
assert_equal "members", sponsor.association(:sponsorable).aliased_table_name
|
480
|
+
sponsor.sponsorable = Member.new name: "Bert"
|
481
|
+
assert_equal Member, sponsor.association(:sponsorable).klass
|
350
482
|
end
|
351
483
|
|
352
484
|
def test_with_polymorphic_and_condition
|
353
485
|
sponsor = Sponsor.create
|
354
|
-
member = Member.create :
|
486
|
+
member = Member.create name: "Bert"
|
487
|
+
|
355
488
|
sponsor.sponsorable = member
|
489
|
+
sponsor.save!
|
490
|
+
|
491
|
+
assert_equal member, sponsor.sponsorable
|
492
|
+
assert_nil sponsor.sponsorable_with_conditions
|
493
|
+
|
494
|
+
sponsor = Sponsor.preload(:sponsorable, :sponsorable_with_conditions).last
|
356
495
|
|
357
496
|
assert_equal member, sponsor.sponsorable
|
358
497
|
assert_nil sponsor.sponsorable_with_conditions
|
359
498
|
end
|
360
499
|
|
361
500
|
def test_with_select
|
362
|
-
assert_equal 1,
|
363
|
-
assert_equal 1,
|
501
|
+
assert_equal 1, Post.find(2).author_with_select.attributes.size
|
502
|
+
assert_equal 1, Post.includes(:author_with_select).find(2).author_with_select.attributes.size
|
503
|
+
end
|
504
|
+
|
505
|
+
def test_custom_attribute_with_select
|
506
|
+
assert_equal 2, Company.find(2).firm_with_select.attributes.size
|
507
|
+
assert_equal 2, Company.includes(:firm_with_select).find(2).firm_with_select.attributes.size
|
364
508
|
end
|
365
509
|
|
366
510
|
def test_belongs_to_without_counter_cache_option
|
367
511
|
# Ship has a conventionally named `treasures_count` column, but the counter_cache
|
368
512
|
# option is not given on the association.
|
369
|
-
ship = Ship.create(name:
|
513
|
+
ship = Ship.create(name: "Countless")
|
370
514
|
|
371
515
|
assert_no_difference lambda { ship.reload.treasures_count }, "treasures_count should not be changed unless counter_cache is given on the relation" do
|
372
|
-
treasure = Treasure.new(name:
|
516
|
+
treasure = Treasure.new(name: "Gold", ship: ship)
|
373
517
|
treasure.save
|
374
518
|
end
|
375
519
|
|
@@ -391,31 +535,70 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
391
535
|
end
|
392
536
|
|
393
537
|
def test_belongs_to_counter_with_assigning_nil
|
394
|
-
|
395
|
-
|
538
|
+
topic = Topic.create!(title: "debate")
|
539
|
+
reply = Reply.create!(title: "blah!", content: "world around!", topic: topic)
|
540
|
+
|
541
|
+
assert_equal topic.id, reply.parent_id
|
542
|
+
assert_equal 1, topic.reload.replies.size
|
396
543
|
|
397
|
-
|
398
|
-
|
544
|
+
reply.topic = nil
|
545
|
+
reply.reload
|
399
546
|
|
400
|
-
|
547
|
+
assert_equal topic.id, reply.parent_id
|
548
|
+
assert_equal 1, topic.reload.replies.size
|
401
549
|
|
402
|
-
|
550
|
+
reply.topic = nil
|
551
|
+
reply.save!
|
552
|
+
|
553
|
+
assert_equal 0, topic.reload.replies.size
|
554
|
+
end
|
555
|
+
|
556
|
+
def test_belongs_to_counter_with_assigning_new_object
|
557
|
+
topic = Topic.create!(title: "debate")
|
558
|
+
reply = Reply.create!(title: "blah!", content: "world around!", topic: topic)
|
559
|
+
|
560
|
+
assert_equal topic.id, reply.parent_id
|
561
|
+
assert_equal 1, topic.reload.replies_count
|
562
|
+
|
563
|
+
topic2 = reply.build_topic(title: "debate2")
|
564
|
+
reply.save!
|
565
|
+
|
566
|
+
assert_not_equal topic.id, reply.parent_id
|
567
|
+
assert_equal topic2.id, reply.parent_id
|
568
|
+
|
569
|
+
assert_equal 0, topic.reload.replies_count
|
570
|
+
assert_equal 1, topic2.reload.replies_count
|
403
571
|
end
|
404
572
|
|
405
573
|
def test_belongs_to_with_primary_key_counter
|
406
574
|
debate = Topic.create("title" => "debate")
|
407
575
|
debate2 = Topic.create("title" => "debate2")
|
408
|
-
reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "
|
576
|
+
reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate2")
|
577
|
+
|
578
|
+
assert_equal 0, debate.reload.replies_count
|
579
|
+
assert_equal 1, debate2.reload.replies_count
|
580
|
+
|
581
|
+
reply.parent_title = "debate"
|
582
|
+
reply.save!
|
583
|
+
|
584
|
+
assert_equal 1, debate.reload.replies_count
|
585
|
+
assert_equal 0, debate2.reload.replies_count
|
586
|
+
|
587
|
+
assert_no_queries do
|
588
|
+
reply.topic_with_primary_key = debate
|
589
|
+
end
|
409
590
|
|
410
591
|
assert_equal 1, debate.reload.replies_count
|
411
592
|
assert_equal 0, debate2.reload.replies_count
|
412
593
|
|
413
594
|
reply.topic_with_primary_key = debate2
|
595
|
+
reply.save!
|
414
596
|
|
415
597
|
assert_equal 0, debate.reload.replies_count
|
416
598
|
assert_equal 1, debate2.reload.replies_count
|
417
599
|
|
418
600
|
reply.topic_with_primary_key = nil
|
601
|
+
reply.save!
|
419
602
|
|
420
603
|
assert_equal 0, debate.reload.replies_count
|
421
604
|
assert_equal 0, debate2.reload.replies_count
|
@@ -442,11 +625,13 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
442
625
|
assert_equal 1, Topic.find(topic2.id).replies.size
|
443
626
|
|
444
627
|
reply1.topic = nil
|
628
|
+
reply1.save!
|
445
629
|
|
446
630
|
assert_equal 0, Topic.find(topic1.id).replies.size
|
447
631
|
assert_equal 0, Topic.find(topic2.id).replies.size
|
448
632
|
|
449
633
|
reply1.topic = topic1
|
634
|
+
reply1.save!
|
450
635
|
|
451
636
|
assert_equal 1, Topic.find(topic1.id).replies.size
|
452
637
|
assert_equal 0, Topic.find(topic2.id).replies.size
|
@@ -475,14 +660,65 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
475
660
|
end
|
476
661
|
|
477
662
|
def test_belongs_to_counter_after_save
|
478
|
-
topic = Topic.create!(:
|
479
|
-
|
663
|
+
topic = Topic.create!(title: "monday night")
|
664
|
+
|
665
|
+
assert_queries(2) do
|
666
|
+
topic.replies.create!(title: "re: monday night", content: "football")
|
667
|
+
end
|
668
|
+
|
480
669
|
assert_equal 1, Topic.find(topic.id)[:replies_count]
|
481
670
|
|
482
671
|
topic.save!
|
483
672
|
assert_equal 1, Topic.find(topic.id)[:replies_count]
|
484
673
|
end
|
485
674
|
|
675
|
+
def test_belongs_to_counter_after_touch
|
676
|
+
topic = Topic.create!(title: "topic")
|
677
|
+
|
678
|
+
assert_equal 0, topic.replies_count
|
679
|
+
assert_equal 0, topic.after_touch_called
|
680
|
+
|
681
|
+
reply = Reply.create!(title: "blah!", content: "world around!", topic_with_primary_key: topic)
|
682
|
+
|
683
|
+
assert_equal 1, topic.replies_count
|
684
|
+
assert_equal 1, topic.after_touch_called
|
685
|
+
|
686
|
+
reply.destroy!
|
687
|
+
|
688
|
+
assert_equal 0, topic.replies_count
|
689
|
+
assert_equal 2, topic.after_touch_called
|
690
|
+
end
|
691
|
+
|
692
|
+
def test_belongs_to_touch_with_reassigning
|
693
|
+
debate = Topic.create!(title: "debate")
|
694
|
+
debate2 = Topic.create!(title: "debate2")
|
695
|
+
reply = Reply.create!(title: "blah!", content: "world around!", parent_title: "debate2")
|
696
|
+
|
697
|
+
time = 1.day.ago
|
698
|
+
|
699
|
+
debate.touch(time: time)
|
700
|
+
debate2.touch(time: time)
|
701
|
+
|
702
|
+
assert_queries(3) do
|
703
|
+
reply.parent_title = "debate"
|
704
|
+
reply.save!
|
705
|
+
end
|
706
|
+
|
707
|
+
assert_operator debate.reload.updated_at, :>, time
|
708
|
+
assert_operator debate2.reload.updated_at, :>, time
|
709
|
+
|
710
|
+
debate.touch(time: time)
|
711
|
+
debate2.touch(time: time)
|
712
|
+
|
713
|
+
assert_queries(3) do
|
714
|
+
reply.topic_with_primary_key = debate2
|
715
|
+
reply.save!
|
716
|
+
end
|
717
|
+
|
718
|
+
assert_operator debate.reload.updated_at, :>, time
|
719
|
+
assert_operator debate2.reload.updated_at, :>, time
|
720
|
+
end
|
721
|
+
|
486
722
|
def test_belongs_to_with_touch_option_on_touch
|
487
723
|
line_item = LineItem.create!
|
488
724
|
Invoice.create!(line_items: [line_item])
|
@@ -541,7 +777,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
541
777
|
line_item = LineItem.create!
|
542
778
|
Invoice.create!(line_items: [line_item])
|
543
779
|
|
544
|
-
|
780
|
+
assert_no_queries { line_item.save }
|
545
781
|
end
|
546
782
|
|
547
783
|
def test_belongs_to_with_touch_option_on_destroy
|
@@ -578,8 +814,8 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
578
814
|
end
|
579
815
|
|
580
816
|
def test_belongs_to_counter_when_update_columns
|
581
|
-
topic = Topic.create!(:
|
582
|
-
topic.replies.create!(:
|
817
|
+
topic = Topic.create!(title: "37s")
|
818
|
+
topic.replies.create!(title: "re: 37s", content: "rails")
|
583
819
|
assert_equal 1, Topic.find(topic.id)[:replies_count]
|
584
820
|
|
585
821
|
topic.update_columns(content: "rails is wonderful")
|
@@ -590,10 +826,10 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
590
826
|
final_cut = Client.new("name" => "Final Cut")
|
591
827
|
firm = Firm.find(1)
|
592
828
|
final_cut.firm = firm
|
593
|
-
|
829
|
+
assert_not_predicate final_cut, :persisted?
|
594
830
|
assert final_cut.save
|
595
|
-
|
596
|
-
|
831
|
+
assert_predicate final_cut, :persisted?
|
832
|
+
assert_predicate firm, :persisted?
|
597
833
|
assert_equal firm, final_cut.firm
|
598
834
|
final_cut.association(:firm).reload
|
599
835
|
assert_equal firm, final_cut.firm
|
@@ -603,10 +839,10 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
603
839
|
final_cut = Client.new("name" => "Final Cut")
|
604
840
|
firm = Firm.find(1)
|
605
841
|
final_cut.firm_with_primary_key = firm
|
606
|
-
|
842
|
+
assert_not_predicate final_cut, :persisted?
|
607
843
|
assert final_cut.save
|
608
|
-
|
609
|
-
|
844
|
+
assert_predicate final_cut, :persisted?
|
845
|
+
assert_predicate firm, :persisted?
|
610
846
|
assert_equal firm, final_cut.firm_with_primary_key
|
611
847
|
final_cut.association(:firm_with_primary_key).reload
|
612
848
|
assert_equal firm, final_cut.firm_with_primary_key
|
@@ -614,8 +850,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
614
850
|
|
615
851
|
def test_new_record_with_foreign_key_but_no_object
|
616
852
|
client = Client.new("firm_id" => 1)
|
617
|
-
|
618
|
-
assert_equal Firm.all.merge!(:order => "id").first, client.firm_with_basic_id
|
853
|
+
assert_equal Firm.first, client.firm_with_basic_id
|
619
854
|
end
|
620
855
|
|
621
856
|
def test_setting_foreign_key_after_nil_target_loaded
|
@@ -637,7 +872,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
637
872
|
|
638
873
|
def test_dont_find_target_when_foreign_key_is_null
|
639
874
|
tagging = taggings(:thinking_general)
|
640
|
-
|
875
|
+
assert_no_queries { tagging.super_tag }
|
641
876
|
end
|
642
877
|
|
643
878
|
def test_dont_find_target_when_saving_foreign_key_after_stale_association_loaded
|
@@ -652,11 +887,12 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
652
887
|
end
|
653
888
|
|
654
889
|
def test_counter_cache
|
655
|
-
topic = Topic.create :
|
890
|
+
topic = Topic.create title: "Zoom-zoom-zoom"
|
656
891
|
assert_equal 0, topic[:replies_count]
|
657
892
|
|
658
|
-
reply = Reply.create(:
|
893
|
+
reply = Reply.create(title: "re: zoom", content: "speedy quick!")
|
659
894
|
reply.topic = topic
|
895
|
+
reply.save!
|
660
896
|
|
661
897
|
assert_equal 1, topic.reload[:replies_count]
|
662
898
|
assert_equal 1, topic.replies.size
|
@@ -666,10 +902,10 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
666
902
|
end
|
667
903
|
|
668
904
|
def test_counter_cache_double_destroy
|
669
|
-
topic = Topic.create :
|
905
|
+
topic = Topic.create title: "Zoom-zoom-zoom"
|
670
906
|
|
671
907
|
5.times do
|
672
|
-
topic.replies.create(:
|
908
|
+
topic.replies.create(title: "re: zoom", content: "speedy quick!")
|
673
909
|
end
|
674
910
|
|
675
911
|
assert_equal 5, topic.reload[:replies_count]
|
@@ -686,10 +922,10 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
686
922
|
end
|
687
923
|
|
688
924
|
def test_concurrent_counter_cache_double_destroy
|
689
|
-
topic = Topic.create :
|
925
|
+
topic = Topic.create title: "Zoom-zoom-zoom"
|
690
926
|
|
691
927
|
5.times do
|
692
|
-
topic.replies.create(:
|
928
|
+
topic.replies.create(title: "re: zoom", content: "speedy quick!")
|
693
929
|
end
|
694
930
|
|
695
931
|
assert_equal 5, topic.reload[:replies_count]
|
@@ -707,11 +943,12 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
707
943
|
end
|
708
944
|
|
709
945
|
def test_custom_counter_cache
|
710
|
-
reply = Reply.create(:
|
946
|
+
reply = Reply.create(title: "re: zoom", content: "speedy quick!")
|
711
947
|
assert_equal 0, reply[:replies_count]
|
712
948
|
|
713
|
-
silly = SillyReply.create(:
|
949
|
+
silly = SillyReply.create(title: "gaga", content: "boo-boo")
|
714
950
|
silly.reply = reply
|
951
|
+
silly.save!
|
715
952
|
|
716
953
|
assert_equal 1, reply.reload[:replies_count]
|
717
954
|
assert_equal 1, reply.replies.size
|
@@ -734,7 +971,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
734
971
|
def test_association_assignment_sticks
|
735
972
|
post = Post.first
|
736
973
|
|
737
|
-
author1, author2 = Author.all.merge!(:
|
974
|
+
author1, author2 = Author.all.merge!(limit: 2).to_a
|
738
975
|
assert_not_nil author1
|
739
976
|
assert_not_nil author2
|
740
977
|
|
@@ -754,7 +991,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
754
991
|
|
755
992
|
def test_cant_save_readonly_association
|
756
993
|
assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
|
757
|
-
|
994
|
+
assert_predicate companies(:first_client).readonly_firm, :readonly?
|
758
995
|
end
|
759
996
|
|
760
997
|
def test_polymorphic_assignment_foreign_key_type_string
|
@@ -787,7 +1024,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
787
1024
|
def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
|
788
1025
|
# should update when assigning a saved record
|
789
1026
|
essay = Essay.new
|
790
|
-
writer = Author.create(:
|
1027
|
+
writer = Author.create(name: "David")
|
791
1028
|
essay.writer = writer
|
792
1029
|
assert_equal "Author", essay.writer_type
|
793
1030
|
|
@@ -812,7 +1049,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
812
1049
|
|
813
1050
|
def test_assignment_updates_foreign_id_field_for_new_and_saved_records
|
814
1051
|
client = Client.new
|
815
|
-
saved_firm = Firm.create :
|
1052
|
+
saved_firm = Firm.create name: "Saved"
|
816
1053
|
new_firm = Firm.new
|
817
1054
|
|
818
1055
|
client.firm = saved_firm
|
@@ -824,7 +1061,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
824
1061
|
|
825
1062
|
def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
|
826
1063
|
essay = Essay.new
|
827
|
-
saved_writer = Author.create(:
|
1064
|
+
saved_writer = Author.create(name: "David")
|
828
1065
|
new_writer = Author.new
|
829
1066
|
|
830
1067
|
essay.writer = saved_writer
|
@@ -840,7 +1077,7 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
840
1077
|
assert_nil essay.writer_type
|
841
1078
|
|
842
1079
|
essay.writer_id = 1
|
843
|
-
essay.writer_type =
|
1080
|
+
essay.writer_type = "Author"
|
844
1081
|
|
845
1082
|
essay.writer = nil
|
846
1083
|
assert_nil essay.writer_id
|
@@ -862,14 +1099,14 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
862
1099
|
|
863
1100
|
assert_nothing_raised do
|
864
1101
|
Account.find(@account.id).save!
|
865
|
-
Account.all.merge!(:
|
1102
|
+
Account.all.merge!(includes: :firm).find(@account.id).save!
|
866
1103
|
end
|
867
1104
|
|
868
1105
|
@account.firm.delete
|
869
1106
|
|
870
1107
|
assert_nothing_raised do
|
871
1108
|
Account.find(@account.id).save!
|
872
|
-
Account.all.merge!(:
|
1109
|
+
Account.all.merge!(includes: :firm).find(@account.id).save!
|
873
1110
|
end
|
874
1111
|
end
|
875
1112
|
|
@@ -890,18 +1127,58 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
890
1127
|
|
891
1128
|
def test_belongs_to_invalid_dependent_option_raises_exception
|
892
1129
|
error = assert_raise ArgumentError do
|
893
|
-
Class.new(Author).belongs_to :special_author_address, :
|
1130
|
+
Class.new(Author).belongs_to :special_author_address, dependent: :nullify
|
1131
|
+
end
|
1132
|
+
assert_equal error.message, "The :dependent option must be one of [:destroy, :delete, :destroy_async], but is :nullify"
|
1133
|
+
end
|
1134
|
+
|
1135
|
+
class EssayDestroy < ActiveRecord::Base
|
1136
|
+
self.table_name = "essays"
|
1137
|
+
belongs_to :book, dependent: :destroy, class_name: "DestroyableBook"
|
1138
|
+
end
|
1139
|
+
|
1140
|
+
class DestroyableBook < ActiveRecord::Base
|
1141
|
+
self.table_name = "books"
|
1142
|
+
belongs_to :author, class_name: "UndestroyableAuthor", dependent: :destroy
|
1143
|
+
end
|
1144
|
+
|
1145
|
+
class UndestroyableAuthor < ActiveRecord::Base
|
1146
|
+
self.table_name = "authors"
|
1147
|
+
has_one :book, class_name: "DestroyableBook", foreign_key: "author_id"
|
1148
|
+
before_destroy :dont
|
1149
|
+
|
1150
|
+
def dont
|
1151
|
+
throw(:abort)
|
1152
|
+
end
|
1153
|
+
end
|
1154
|
+
|
1155
|
+
def test_dependency_should_halt_parent_destruction
|
1156
|
+
author = UndestroyableAuthor.create!(name: "Test")
|
1157
|
+
book = DestroyableBook.create!(author: author)
|
1158
|
+
|
1159
|
+
assert_no_difference ["UndestroyableAuthor.count", "DestroyableBook.count"] do
|
1160
|
+
assert_not book.destroy
|
1161
|
+
end
|
1162
|
+
end
|
1163
|
+
|
1164
|
+
def test_dependency_should_halt_parent_destruction_with_cascaded_three_levels
|
1165
|
+
author = UndestroyableAuthor.create!(name: "Test")
|
1166
|
+
book = DestroyableBook.create!(author: author)
|
1167
|
+
essay = EssayDestroy.create!(book: book)
|
1168
|
+
|
1169
|
+
assert_no_difference ["UndestroyableAuthor.count", "DestroyableBook.count", "EssayDestroy.count"] do
|
1170
|
+
assert_not essay.destroy
|
1171
|
+
assert_not essay.destroyed?
|
894
1172
|
end
|
895
|
-
assert_equal error.message, 'The :dependent option must be one of [:destroy, :delete], but is :nullify'
|
896
1173
|
end
|
897
1174
|
|
898
1175
|
def test_attributes_are_being_set_when_initialized_from_belongs_to_association_with_where_clause
|
899
|
-
new_firm = accounts(:signals37).build_firm(:
|
1176
|
+
new_firm = accounts(:signals37).build_firm(name: "Apple")
|
900
1177
|
assert_equal new_firm.name, "Apple"
|
901
1178
|
end
|
902
1179
|
|
903
1180
|
def test_attributes_are_set_without_error_when_initialized_from_belongs_to_association_with_array_in_where_clause
|
904
|
-
new_account = Account.where(:
|
1181
|
+
new_account = Account.where(credit_limit: [ 50, 60 ]).new
|
905
1182
|
assert_nil new_account.credit_limit
|
906
1183
|
end
|
907
1184
|
|
@@ -913,31 +1190,42 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
913
1190
|
firm_proxy = client.send(:association_instance_get, :firm)
|
914
1191
|
firm_with_condition_proxy = client.send(:association_instance_get, :firm_with_condition)
|
915
1192
|
|
916
|
-
|
917
|
-
|
1193
|
+
assert_not_predicate firm_proxy, :stale_target?
|
1194
|
+
assert_not_predicate firm_with_condition_proxy, :stale_target?
|
918
1195
|
assert_equal companies(:first_firm), client.firm
|
919
1196
|
assert_equal companies(:first_firm), client.firm_with_condition
|
920
1197
|
|
921
1198
|
client.client_of = companies(:another_firm).id
|
922
1199
|
|
923
|
-
|
924
|
-
|
1200
|
+
assert_predicate firm_proxy, :stale_target?
|
1201
|
+
assert_predicate firm_with_condition_proxy, :stale_target?
|
925
1202
|
assert_equal companies(:another_firm), client.firm
|
926
1203
|
assert_equal companies(:another_firm), client.firm_with_condition
|
927
1204
|
end
|
928
1205
|
|
1206
|
+
def test_destroying_child_with_unloaded_parent_and_foreign_key_and_touch_is_possible_with_has_many_inversing
|
1207
|
+
with_has_many_inversing do
|
1208
|
+
book = Book.create!
|
1209
|
+
citation = book.citations.create!
|
1210
|
+
|
1211
|
+
assert_difference "Citation.count", -1 do
|
1212
|
+
Citation.find(citation.id).destroy
|
1213
|
+
end
|
1214
|
+
end
|
1215
|
+
end
|
1216
|
+
|
929
1217
|
def test_polymorphic_reassignment_of_associated_id_updates_the_object
|
930
1218
|
sponsor = sponsors(:moustache_club_sponsor_for_groucho)
|
931
1219
|
|
932
1220
|
sponsor.sponsorable
|
933
1221
|
proxy = sponsor.send(:association_instance_get, :sponsorable)
|
934
1222
|
|
935
|
-
|
1223
|
+
assert_not_predicate proxy, :stale_target?
|
936
1224
|
assert_equal members(:groucho), sponsor.sponsorable
|
937
1225
|
|
938
1226
|
sponsor.sponsorable_id = members(:some_other_guy).id
|
939
1227
|
|
940
|
-
|
1228
|
+
assert_predicate proxy, :stale_target?
|
941
1229
|
assert_equal members(:some_other_guy), sponsor.sponsorable
|
942
1230
|
end
|
943
1231
|
|
@@ -947,12 +1235,12 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
947
1235
|
sponsor.sponsorable
|
948
1236
|
proxy = sponsor.send(:association_instance_get, :sponsorable)
|
949
1237
|
|
950
|
-
|
1238
|
+
assert_not_predicate proxy, :stale_target?
|
951
1239
|
assert_equal members(:groucho), sponsor.sponsorable
|
952
1240
|
|
953
|
-
sponsor.sponsorable_type =
|
1241
|
+
sponsor.sponsorable_type = "Firm"
|
954
1242
|
|
955
|
-
|
1243
|
+
assert_predicate proxy, :stale_target?
|
956
1244
|
assert_equal companies(:first_firm), sponsor.sponsorable
|
957
1245
|
end
|
958
1246
|
|
@@ -974,9 +1262,20 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
974
1262
|
post = posts(:welcome)
|
975
1263
|
comment = comments(:greetings)
|
976
1264
|
|
977
|
-
|
978
|
-
|
1265
|
+
assert_equal post.id, comment.id
|
1266
|
+
|
1267
|
+
assert_difference "post.reload.tags_count", -1 do
|
1268
|
+
assert_difference "comment.reload.tags_count", +1 do
|
979
1269
|
tagging.taggable = comment
|
1270
|
+
tagging.save!
|
1271
|
+
end
|
1272
|
+
end
|
1273
|
+
|
1274
|
+
assert_difference "comment.reload.tags_count", -1 do
|
1275
|
+
assert_difference "post.reload.tags_count", +1 do
|
1276
|
+
tagging.taggable_type = post.class.polymorphic_name
|
1277
|
+
tagging.taggable_id = post.id
|
1278
|
+
tagging.save!
|
980
1279
|
end
|
981
1280
|
end
|
982
1281
|
end
|
@@ -1022,46 +1321,46 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
1022
1321
|
end
|
1023
1322
|
|
1024
1323
|
def test_build_with_block
|
1025
|
-
client = Client.create(:
|
1324
|
+
client = Client.create(name: "Client Company")
|
1026
1325
|
|
1027
|
-
firm = client.build_firm{ |f| f.name =
|
1028
|
-
assert_equal
|
1326
|
+
firm = client.build_firm { |f| f.name = "Agency Company" }
|
1327
|
+
assert_equal "Agency Company", firm.name
|
1029
1328
|
end
|
1030
1329
|
|
1031
1330
|
def test_create_with_block
|
1032
|
-
client = Client.create(:
|
1331
|
+
client = Client.create(name: "Client Company")
|
1033
1332
|
|
1034
|
-
firm = client.create_firm{ |f| f.name =
|
1035
|
-
assert_equal
|
1333
|
+
firm = client.create_firm { |f| f.name = "Agency Company" }
|
1334
|
+
assert_equal "Agency Company", firm.name
|
1036
1335
|
end
|
1037
1336
|
|
1038
1337
|
def test_create_bang_with_block
|
1039
|
-
client = Client.create(:
|
1338
|
+
client = Client.create(name: "Client Company")
|
1040
1339
|
|
1041
|
-
firm = client.create_firm!{ |f| f.name =
|
1042
|
-
assert_equal
|
1340
|
+
firm = client.create_firm! { |f| f.name = "Agency Company" }
|
1341
|
+
assert_equal "Agency Company", firm.name
|
1043
1342
|
end
|
1044
1343
|
|
1045
1344
|
def test_should_set_foreign_key_on_create_association
|
1046
|
-
client = Client.create! :
|
1345
|
+
client = Client.create! name: "fuu"
|
1047
1346
|
|
1048
|
-
firm = client.create_firm :
|
1347
|
+
firm = client.create_firm name: "baa"
|
1049
1348
|
assert_equal firm.id, client.client_of
|
1050
1349
|
end
|
1051
1350
|
|
1052
1351
|
def test_should_set_foreign_key_on_create_association!
|
1053
|
-
client = Client.create! :
|
1352
|
+
client = Client.create! name: "fuu"
|
1054
1353
|
|
1055
|
-
firm = client.create_firm! :
|
1354
|
+
firm = client.create_firm! name: "baa"
|
1056
1355
|
assert_equal firm.id, client.client_of
|
1057
1356
|
end
|
1058
1357
|
|
1059
1358
|
def test_self_referential_belongs_to_with_counter_cache_assigning_nil
|
1060
|
-
comment = Comment.create! :
|
1359
|
+
comment = Comment.create! post: posts(:thinking), body: "fuu"
|
1061
1360
|
comment.parent = nil
|
1062
1361
|
comment.save!
|
1063
1362
|
|
1064
|
-
|
1363
|
+
assert_nil comment.reload.parent
|
1065
1364
|
assert_equal 0, comments(:greetings).reload.children_count
|
1066
1365
|
end
|
1067
1366
|
|
@@ -1076,13 +1375,51 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
1076
1375
|
assert_equal 1, parent.reload.children_count
|
1077
1376
|
end
|
1078
1377
|
|
1378
|
+
def test_belongs_to_with_out_of_range_value_assigning
|
1379
|
+
model = Class.new(Author) do
|
1380
|
+
def self.name; "Temp"; end
|
1381
|
+
validates :author_address, presence: true
|
1382
|
+
end
|
1383
|
+
|
1384
|
+
author = model.new
|
1385
|
+
author.author_address_id = 9223372036854775808 # out of range in the bigint
|
1386
|
+
|
1387
|
+
assert_nil author.author_address
|
1388
|
+
assert_not_predicate author, :valid?
|
1389
|
+
assert_equal [{ error: :blank }], author.errors.details[:author_address]
|
1390
|
+
end
|
1391
|
+
|
1079
1392
|
def test_polymorphic_with_custom_primary_key
|
1080
1393
|
toy = Toy.create!
|
1081
|
-
sponsor = Sponsor.create!(:
|
1394
|
+
sponsor = Sponsor.create!(sponsorable: toy)
|
1082
1395
|
|
1083
1396
|
assert_equal toy, sponsor.reload.sponsorable
|
1084
1397
|
end
|
1085
1398
|
|
1399
|
+
class SponsorWithTouchInverse < Sponsor
|
1400
|
+
belongs_to :sponsorable, polymorphic: true, inverse_of: :sponsors, touch: true
|
1401
|
+
end
|
1402
|
+
|
1403
|
+
def test_destroying_polymorphic_child_with_unloaded_parent_and_touch_is_possible_with_has_many_inversing
|
1404
|
+
with_has_many_inversing do
|
1405
|
+
toy = Toy.create!
|
1406
|
+
sponsor = toy.sponsors.create!
|
1407
|
+
|
1408
|
+
assert_difference "Sponsor.count", -1 do
|
1409
|
+
SponsorWithTouchInverse.find(sponsor.id).destroy
|
1410
|
+
end
|
1411
|
+
end
|
1412
|
+
end
|
1413
|
+
|
1414
|
+
def test_polymorphic_with_false
|
1415
|
+
assert_nothing_raised do
|
1416
|
+
Class.new(ActiveRecord::Base) do
|
1417
|
+
def self.name; "Post"; end
|
1418
|
+
belongs_to :category, polymorphic: false
|
1419
|
+
end
|
1420
|
+
end
|
1421
|
+
end
|
1422
|
+
|
1086
1423
|
test "stale tracking doesn't care about the type" do
|
1087
1424
|
apple = Firm.create("name" => "Apple")
|
1088
1425
|
citibank = Account.create("credit_limit" => 10)
|
@@ -1092,12 +1429,12 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
1092
1429
|
|
1093
1430
|
citibank.firm_id = apple.id.to_s
|
1094
1431
|
|
1095
|
-
|
1432
|
+
assert_not_predicate citibank.association(:firm), :stale_target?
|
1096
1433
|
end
|
1097
1434
|
|
1098
1435
|
def test_reflect_the_most_recent_change
|
1099
1436
|
author1, author2 = Author.limit(2)
|
1100
|
-
post = Post.new(:
|
1437
|
+
post = Post.new(title: "foo", body: "bar")
|
1101
1438
|
|
1102
1439
|
post.author = author1
|
1103
1440
|
post.author_id = author2.id
|
@@ -1106,8 +1443,8 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
1106
1443
|
assert_equal post.author_id, author2.id
|
1107
1444
|
end
|
1108
1445
|
|
1109
|
-
test
|
1110
|
-
[:errors,
|
1446
|
+
test "dangerous association name raises ArgumentError" do
|
1447
|
+
[:errors, "errors", :save, "save"].each do |name|
|
1111
1448
|
assert_raises(ArgumentError, "Association #{name} should not be allowed") do
|
1112
1449
|
Class.new(ActiveRecord::Base) do
|
1113
1450
|
belongs_to name
|
@@ -1116,16 +1453,31 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
|
1116
1453
|
end
|
1117
1454
|
end
|
1118
1455
|
|
1119
|
-
test
|
1456
|
+
test "belongs_to works with model called Record" do
|
1120
1457
|
record = Record.create!
|
1121
1458
|
Column.create! record: record
|
1122
1459
|
assert_equal 1, Column.count
|
1123
1460
|
end
|
1124
1461
|
|
1125
|
-
def
|
1126
|
-
|
1462
|
+
def test_multiple_counter_cache_with_after_create_update
|
1463
|
+
post = posts(:welcome)
|
1464
|
+
parent = comments(:greetings)
|
1465
|
+
|
1466
|
+
assert_difference "parent.reload.children_count", +1 do
|
1467
|
+
assert_difference "post.reload.comments_count", +1 do
|
1468
|
+
CommentWithAfterCreateUpdate.create(body: "foo", post: post, parent: parent)
|
1469
|
+
end
|
1470
|
+
end
|
1471
|
+
end
|
1472
|
+
|
1473
|
+
test "assigning an association doesn't result in duplicate objects" do
|
1474
|
+
post = Post.create!(title: "title", body: "body")
|
1475
|
+
post.comments = [post.comments.build(body: "body")]
|
1476
|
+
post.save!
|
1127
1477
|
|
1128
|
-
|
1478
|
+
assert_equal 1, post.comments.size
|
1479
|
+
assert_equal 1, Comment.where(post_id: post.id).count
|
1480
|
+
assert_equal post.id, Comment.last.post.id
|
1129
1481
|
end
|
1130
1482
|
end
|
1131
1483
|
|