ibm_db 5.6.1 → 5.7.0
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/ext/Makefile +13 -9
- data/ext/extconf.rb +176 -110
- data/ext/ibm_db.c +60 -0
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +6 -6
- data/ext/ruby_ibm_db_cli.c +14 -10
- data/ext/ruby_ibm_db_cli.h +4 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/IBM_DB.rb +2 -2
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
- data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
- data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
- data/test/activejob/destroy_association_async_job_test.rb +62 -0
- data/test/activejob/destroy_association_async_test.rb +147 -11
- data/test/activejob/job_runtime_test.rb +41 -0
- data/test/activejob/unloadable_base_job.rb +3 -0
- data/test/cases/active_record_schema_test.rb +196 -0
- data/test/cases/active_record_test.rb +21 -0
- data/test/cases/adapter_prevent_writes_test.rb +26 -202
- data/test/cases/adapter_test.rb +592 -82
- data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
- data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
- data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
- data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
- data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
- data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
- data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
- data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
- data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
- data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
- data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
- data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
- data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
- data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
- data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
- data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
- data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
- data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
- data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
- data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
- data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
- data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
- data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
- data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
- data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
- data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
- data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
- data/test/cases/adapters/postgresql/array_test.rb +6 -6
- data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
- data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
- data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
- data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
- data/test/cases/adapters/postgresql/citext_test.rb +7 -1
- data/test/cases/adapters/postgresql/collation_test.rb +1 -1
- data/test/cases/adapters/postgresql/composite_test.rb +1 -1
- data/test/cases/adapters/postgresql/connection_test.rb +43 -36
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
- data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
- data/test/cases/adapters/postgresql/date_test.rb +2 -2
- data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
- data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
- data/test/cases/adapters/postgresql/domain_test.rb +1 -1
- data/test/cases/adapters/postgresql/enum_test.rb +208 -8
- data/test/cases/adapters/postgresql/explain_test.rb +25 -6
- data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
- data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
- data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
- data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
- data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
- data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
- data/test/cases/adapters/postgresql/integer_test.rb +1 -1
- data/test/cases/adapters/postgresql/interval_test.rb +9 -17
- data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
- data/test/cases/adapters/postgresql/json_test.rb +5 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
- data/test/cases/adapters/postgresql/money_test.rb +17 -9
- data/test/cases/adapters/postgresql/network_test.rb +13 -1
- data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
- data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
- data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
- data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
- data/test/cases/adapters/postgresql/range_test.rb +185 -21
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
- data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
- data/test/cases/adapters/postgresql/schema_test.rb +270 -20
- data/test/cases/adapters/postgresql/serial_test.rb +5 -5
- data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
- data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
- data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
- data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
- data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
- data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
- data/test/cases/adapters/postgresql/xml_test.rb +1 -1
- data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
- data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
- data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
- data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
- data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
- data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
- data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
- data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
- data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
- data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
- data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
- data/test/cases/aggregations_test.rb +16 -0
- data/test/cases/annotate_test.rb +14 -12
- data/test/cases/arel/attributes/attribute_test.rb +86 -47
- data/test/cases/arel/collectors/bind_test.rb +1 -1
- data/test/cases/arel/collectors/composite_test.rb +11 -1
- data/test/cases/arel/collectors/sql_string_test.rb +1 -1
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
- data/test/cases/arel/delete_manager_test.rb +0 -6
- data/test/cases/arel/factory_methods_test.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +1 -7
- data/test/cases/arel/nodes/as_test.rb +12 -0
- data/test/cases/arel/nodes/ascending_test.rb +1 -1
- data/test/cases/arel/nodes/bin_test.rb +1 -1
- data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
- data/test/cases/arel/nodes/cte_test.rb +46 -0
- data/test/cases/arel/nodes/descending_test.rb +1 -1
- data/test/cases/arel/nodes/equality_test.rb +3 -3
- data/test/cases/arel/nodes/filter_test.rb +37 -0
- data/test/cases/arel/nodes/fragments_test.rb +38 -0
- data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
- data/test/cases/arel/nodes/node_test.rb +1 -1
- data/test/cases/arel/nodes/or_test.rb +2 -2
- data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
- data/test/cases/arel/nodes/table_alias_test.rb +12 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
- data/test/cases/arel/nodes/update_statement_test.rb +4 -0
- data/test/cases/arel/nodes_test.rb +3 -2
- data/test/cases/arel/select_manager_test.rb +12 -12
- data/test/cases/arel/support/fake_record.rb +22 -17
- data/test/cases/arel/table_test.rb +15 -25
- data/test/cases/arel/update_manager_test.rb +51 -6
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
- data/test/cases/arel/visitors/dot_test.rb +177 -2
- data/test/cases/arel/visitors/mysql_test.rb +49 -1
- data/test/cases/arel/visitors/postgres_test.rb +1 -31
- data/test/cases/arel/visitors/sqlite_test.rb +1 -1
- data/test/cases/arel/visitors/to_sql_test.rb +330 -20
- data/test/cases/assertions/query_assertions_test.rb +136 -0
- data/test/cases/associations/belongs_to_associations_test.rb +502 -41
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
- data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
- data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
- data/test/cases/associations/eager_singularization_test.rb +1 -1
- data/test/cases/associations/eager_test.rb +255 -93
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
- data/test/cases/associations/has_many_associations_test.rb +282 -72
- data/test/cases/associations/has_many_through_associations_test.rb +172 -45
- data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
- data/test/cases/associations/has_one_associations_test.rb +160 -29
- data/test/cases/associations/has_one_through_associations_test.rb +64 -15
- data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
- data/test/cases/associations/inner_join_association_test.rb +36 -6
- data/test/cases/associations/inverse_associations_test.rb +177 -40
- data/test/cases/associations/join_model_test.rb +17 -12
- data/test/cases/associations/left_outer_join_association_test.rb +14 -3
- data/test/cases/associations/nested_error_test.rb +116 -0
- data/test/cases/associations/nested_through_associations_test.rb +54 -19
- data/test/cases/associations/required_test.rb +1 -1
- data/test/cases/associations_test.rb +1278 -21
- data/test/cases/asynchronous_queries_test.rb +310 -0
- data/test/cases/attribute_methods/read_test.rb +6 -0
- data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
- data/test/cases/attribute_methods_test.rb +565 -46
- data/test/cases/attributes_test.rb +42 -1
- data/test/cases/autosave_association_test.rb +645 -92
- data/test/cases/base_prevent_writes_test.rb +28 -159
- data/test/cases/base_test.rb +434 -209
- data/test/cases/batches_test.rb +441 -57
- data/test/cases/binary_test.rb +31 -0
- data/test/cases/bind_parameter_test.rb +107 -16
- data/test/cases/cache_key_test.rb +7 -7
- data/test/cases/calculations_test.rb +541 -110
- data/test/cases/callbacks_test.rb +0 -1
- data/test/cases/clone_test.rb +5 -4
- data/test/cases/coders/yaml_column_test.rb +97 -2
- data/test/cases/collection_cache_key_test.rb +24 -16
- data/test/cases/column_alias_test.rb +2 -8
- data/test/cases/column_definition_test.rb +12 -3
- data/test/cases/comment_test.rb +23 -26
- data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
- data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
- data/test/cases/connection_adapters/registration_test.rb +98 -0
- data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
- data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
- data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
- data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
- data/test/cases/connection_handling_test.rb +210 -0
- data/test/cases/connection_management_test.rb +44 -7
- data/test/cases/connection_pool_test.rb +466 -99
- data/test/cases/core_test.rb +167 -9
- data/test/cases/counter_cache_test.rb +129 -2
- data/test/cases/custom_locking_test.rb +3 -3
- data/test/cases/database_configurations/hash_config_test.rb +149 -13
- data/test/cases/database_configurations/resolver_test.rb +14 -10
- data/test/cases/database_configurations/url_config_test.rb +53 -0
- data/test/cases/database_configurations_test.rb +86 -43
- data/test/cases/database_selector_test.rb +30 -8
- data/test/cases/database_statements_test.rb +10 -14
- data/test/cases/date_time_precision_test.rb +141 -11
- data/test/cases/date_time_test.rb +19 -1
- data/test/cases/defaults_test.rb +107 -41
- data/test/cases/delegated_type_test.rb +69 -9
- data/test/cases/dirty_test.rb +82 -25
- data/test/cases/disconnected_test.rb +10 -9
- data/test/cases/dup_test.rb +26 -6
- data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
- data/test/cases/encryption/cipher_test.rb +65 -0
- data/test/cases/encryption/concurrency_test.rb +27 -0
- data/test/cases/encryption/config_test.rb +21 -0
- data/test/cases/encryption/configurable_test.rb +93 -0
- data/test/cases/encryption/contexts_test.rb +105 -0
- data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
- data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
- data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
- data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
- data/test/cases/encryption/encryptable_record_test.rb +470 -0
- data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
- data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
- data/test/cases/encryption/encryption_schemes_test.rb +240 -0
- data/test/cases/encryption/encryptor_test.rb +113 -0
- data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
- data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
- data/test/cases/encryption/helper.rb +152 -0
- data/test/cases/encryption/key_generator_test.rb +55 -0
- data/test/cases/encryption/key_provider_test.rb +57 -0
- data/test/cases/encryption/key_test.rb +17 -0
- data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
- data/test/cases/encryption/message_serializer_test.rb +82 -0
- data/test/cases/encryption/message_test.rb +43 -0
- data/test/cases/encryption/null_encryptor_test.rb +21 -0
- data/test/cases/encryption/properties_test.rb +69 -0
- data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
- data/test/cases/encryption/scheme_test.rb +58 -0
- data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
- data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
- data/test/cases/enum_test.rb +374 -72
- data/test/cases/errors_test.rb +7 -4
- data/test/cases/excluding_test.rb +116 -0
- data/test/cases/explain_subscriber_test.rb +6 -1
- data/test/cases/explain_test.rb +119 -10
- data/test/cases/filter_attributes_test.rb +7 -14
- data/test/cases/finder_respond_to_test.rb +3 -3
- data/test/cases/finder_test.rb +357 -72
- data/test/cases/fixture_set/file_test.rb +9 -0
- data/test/cases/fixtures_test.rb +426 -190
- data/test/cases/helper.rb +66 -192
- data/test/cases/hot_compatibility_test.rb +10 -10
- data/test/cases/inheritance_test.rb +51 -61
- data/test/cases/inherited_test.rb +40 -0
- data/test/cases/insert_all_test.rb +419 -9
- data/test/cases/instrumentation_test.rb +202 -30
- data/test/cases/integration_test.rb +25 -7
- data/test/cases/invalid_connection_test.rb +5 -5
- data/test/cases/invertible_migration_test.rb +108 -24
- data/test/cases/json_attribute_test.rb +1 -0
- data/test/cases/json_serialization_test.rb +5 -5
- data/test/cases/json_shared_test_cases.rb +5 -9
- data/test/cases/locking_test.rb +67 -31
- data/test/cases/log_subscriber_test.rb +17 -15
- data/test/cases/marshal_serialization_test.rb +78 -5
- data/test/cases/message_pack_test.rb +91 -0
- data/test/cases/migration/change_schema_test.rb +77 -46
- data/test/cases/migration/change_table_test.rb +129 -114
- data/test/cases/migration/check_constraint_test.rb +192 -10
- data/test/cases/migration/column_attributes_test.rb +4 -9
- data/test/cases/migration/column_positioning_test.rb +2 -2
- data/test/cases/migration/columns_test.rb +118 -4
- data/test/cases/migration/command_recorder_test.rb +181 -14
- data/test/cases/migration/compatibility_test.rb +883 -196
- data/test/cases/migration/create_join_table_test.rb +8 -1
- data/test/cases/migration/exclusion_constraint_test.rb +192 -0
- data/test/cases/migration/foreign_key_test.rb +356 -14
- data/test/cases/migration/helper.rb +4 -1
- data/test/cases/migration/index_test.rb +67 -2
- data/test/cases/migration/invalid_options_test.rb +129 -0
- data/test/cases/migration/logger_test.rb +7 -4
- data/test/cases/migration/pending_migrations_test.rb +103 -60
- data/test/cases/migration/references_foreign_key_test.rb +73 -4
- data/test/cases/migration/references_index_test.rb +25 -27
- data/test/cases/migration/references_statements_test.rb +27 -3
- data/test/cases/migration/rename_table_test.rb +39 -54
- data/test/cases/migration/schema_definitions_test.rb +109 -0
- data/test/cases/migration/unique_constraint_test.rb +248 -0
- data/test/cases/migration_test.rb +677 -220
- data/test/cases/migrator_test.rb +102 -75
- data/test/cases/multi_db_migrator_test.rb +55 -34
- data/test/cases/multiparameter_attributes_test.rb +26 -29
- data/test/cases/multiple_db_test.rb +42 -19
- data/test/cases/nested_attributes_test.rb +124 -6
- data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
- data/test/cases/normalized_attribute_test.rb +117 -0
- data/test/cases/null_relation_test.rb +35 -2
- data/test/cases/persistence/reload_association_cache_test.rb +20 -0
- data/test/cases/persistence_test.rb +629 -22
- data/test/cases/pooled_connections_test.rb +57 -56
- data/test/cases/prepared_statement_status_test.rb +8 -3
- data/test/cases/primary_class_test.rb +134 -0
- data/test/cases/primary_keys_test.rb +171 -55
- data/test/cases/query_cache_test.rb +558 -263
- data/test/cases/query_logs_test.rb +293 -0
- data/test/cases/quoting_test.rb +39 -72
- data/test/cases/readonly_test.rb +50 -12
- data/test/cases/reaper_test.rb +22 -6
- data/test/cases/reflection_test.rb +207 -9
- data/test/cases/relation/and_test.rb +43 -0
- data/test/cases/relation/delegation_test.rb +32 -5
- data/test/cases/relation/delete_all_test.rb +27 -6
- data/test/cases/relation/field_ordered_values_test.rb +128 -0
- data/test/cases/relation/load_async_test.rb +650 -0
- data/test/cases/relation/merging_test.rb +80 -109
- data/test/cases/relation/mutation_test.rb +12 -7
- data/test/cases/relation/or_test.rb +11 -8
- data/test/cases/relation/order_test.rb +90 -0
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/select_test.rb +162 -3
- data/test/cases/relation/structural_compatibility_test.rb +38 -0
- data/test/cases/relation/update_all_test.rb +81 -27
- data/test/cases/relation/where_chain_test.rb +190 -3
- data/test/cases/relation/where_clause_test.rb +43 -1
- data/test/cases/relation/where_test.rb +95 -7
- data/test/cases/relation/with_test.rb +165 -0
- data/test/cases/relation_test.rb +42 -37
- data/test/cases/relations_test.rb +436 -138
- data/test/cases/reload_models_test.rb +18 -14
- data/test/cases/reserved_word_test.rb +2 -1
- data/test/cases/result_test.rb +14 -22
- data/test/cases/sanitize_test.rb +89 -27
- data/test/cases/schema_dumper_test.rb +535 -62
- data/test/cases/scoping/default_scoping_test.rb +219 -35
- data/test/cases/scoping/named_scoping_test.rb +25 -46
- data/test/cases/scoping/relation_scoping_test.rb +112 -4
- data/test/cases/secure_password_test.rb +108 -0
- data/test/cases/secure_token_test.rb +72 -0
- data/test/cases/serialization_test.rb +1 -1
- data/test/cases/serialized_attribute_test.rb +305 -60
- data/test/cases/shard_keys_test.rb +125 -0
- data/test/cases/shard_selector_test.rb +45 -0
- data/test/cases/signed_id_test.rb +57 -5
- data/test/cases/statement_cache_test.rb +31 -30
- data/test/cases/statement_invalid_test.rb +8 -4
- data/test/cases/store_test.rb +73 -9
- data/test/cases/strict_loading_test.rb +327 -13
- data/test/cases/table_metadata_test.rb +16 -0
- data/test/cases/tasks/database_tasks_test.rb +517 -244
- data/test/cases/test_case.rb +254 -60
- data/test/cases/test_case_test.rb +69 -0
- data/test/cases/test_databases_test.rb +7 -3
- data/test/cases/test_fixtures_test.rb +19 -40
- data/test/cases/time_precision_test.rb +17 -5
- data/test/cases/timestamp_test.rb +124 -16
- data/test/cases/token_for_test.rb +165 -0
- data/test/cases/touch_later_test.rb +43 -1
- data/test/cases/transaction_callbacks_test.rb +325 -8
- data/test/cases/transaction_instrumentation_test.rb +453 -0
- data/test/cases/transaction_isolation_test.rb +12 -8
- data/test/cases/transactions_test.rb +629 -112
- data/test/cases/type/date_time_test.rb +7 -1
- data/test/cases/type/time_test.rb +9 -0
- data/test/cases/type/type_map_test.rb +108 -73
- data/test/cases/type/unsigned_integer_test.rb +12 -0
- data/test/cases/type_caster/connection_test.rb +19 -0
- data/test/cases/type_test.rb +1 -1
- data/test/cases/unconnected_test.rb +7 -7
- data/test/cases/unsafe_raw_sql_test.rb +39 -8
- data/test/cases/validations/absence_validation_test.rb +1 -1
- data/test/cases/validations/association_validation_test.rb +25 -3
- data/test/cases/validations/numericality_validation_test.rb +3 -9
- data/test/cases/validations/presence_validation_test.rb +1 -1
- data/test/cases/validations/uniqueness_validation_test.rb +280 -40
- data/test/cases/validations_test.rb +2 -2
- data/test/cases/view_test.rb +33 -22
- data/test/cases/yaml_serialization_test.rb +23 -17
- data/test/config.example.yml +58 -56
- data/test/config.rb +1 -0
- data/test/fixtures/1_need_quoting.yml +2 -0
- data/test/fixtures/accounts.yml +5 -0
- data/test/fixtures/aircrafts.yml +7 -0
- data/test/fixtures/book_identifiers.yml +11 -0
- data/test/fixtures/books.yml +5 -4
- data/test/fixtures/cake_designers.yml +5 -0
- data/test/fixtures/cars.yml +6 -0
- data/test/fixtures/chefs.yml +5 -0
- data/test/fixtures/clothing_items.yml +23 -0
- data/test/fixtures/clubs.yml +1 -1
- data/test/fixtures/comments.yml +2 -1
- data/test/fixtures/cpk_authors.yml +8 -0
- data/test/fixtures/cpk_books.yml +21 -0
- data/test/fixtures/cpk_order_agreements.yml +13 -0
- data/test/fixtures/cpk_order_tags.yml +15 -0
- data/test/fixtures/cpk_orders.yml +11 -0
- data/test/fixtures/cpk_posts.yml +12 -0
- data/test/fixtures/cpk_reviews.yml +13 -0
- data/test/fixtures/cpk_tags.yml +11 -0
- data/test/fixtures/drink_designers.yml +5 -0
- data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
- data/test/fixtures/encrypted_books.yml +4 -0
- data/test/fixtures/fk_object_to_point_to.yml +2 -0
- data/test/fixtures/memberships.yml +15 -15
- data/test/fixtures/paragraphs.yml +5 -0
- data/test/fixtures/parrots.yml +4 -0
- data/test/fixtures/people.yml +2 -0
- data/test/fixtures/pirates.yml +2 -2
- data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
- data/test/fixtures/references.yml +3 -3
- data/test/fixtures/sharded_blog_posts.yml +14 -0
- data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
- data/test/fixtures/sharded_blogs.yml +8 -0
- data/test/fixtures/sharded_comments.yml +22 -0
- data/test/fixtures/sharded_tags.yml +34 -0
- data/test/fixtures/sponsors.yml +2 -2
- data/test/fixtures/topics.yml +1 -0
- data/test/fixtures/treasures.yml +4 -0
- data/test/fixtures/virtual_columns.yml +5 -0
- data/test/fixtures/warehouse_things.yml +1 -1
- data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
- data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
- data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
- data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
- data/test/migrations/scope/1_unscoped.rb +7 -0
- data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
- data/test/models/admin/user.rb +2 -0
- data/test/models/admin/user_json.rb +48 -0
- data/test/models/attachment.rb +7 -0
- data/test/models/author.rb +70 -3
- data/test/models/author_encrypted.rb +16 -0
- data/test/models/bird.rb +1 -1
- data/test/models/book.rb +18 -11
- data/test/models/book_destroy_async.rb +1 -1
- data/test/models/book_encrypted.rb +106 -0
- data/test/models/book_identifier.rb +5 -0
- data/test/models/branch.rb +11 -0
- data/test/models/bulb.rb +1 -1
- data/test/models/car.rb +8 -1
- data/test/models/cat.rb +1 -1
- data/test/models/category.rb +3 -1
- data/test/models/chat_message.rb +8 -0
- data/test/models/chef.rb +52 -0
- data/test/models/clothing_item.rb +12 -0
- data/test/models/club.rb +4 -1
- data/test/models/comment.rb +7 -4
- data/test/models/comment_overlapping_counter_cache.rb +15 -0
- data/test/models/company.rb +16 -2
- data/test/models/computer.rb +1 -0
- data/test/models/contact.rb +3 -3
- data/test/models/contract.rb +5 -1
- data/test/models/cpk/author.rb +9 -0
- data/test/models/cpk/book.rb +55 -0
- data/test/models/cpk/book_destroy_async.rb +9 -0
- data/test/models/cpk/car.rb +9 -0
- data/test/models/cpk/car_review.rb +9 -0
- data/test/models/cpk/chapter.rb +16 -0
- data/test/models/cpk/chapter_destroy_async.rb +10 -0
- data/test/models/cpk/comment.rb +9 -0
- data/test/models/cpk/order.rb +55 -0
- data/test/models/cpk/order_agreement.rb +10 -0
- data/test/models/cpk/order_tag.rb +10 -0
- data/test/models/cpk/post.rb +10 -0
- data/test/models/cpk/posts_tag.rb +10 -0
- data/test/models/cpk/review.rb +9 -0
- data/test/models/cpk/tag.rb +10 -0
- data/test/models/cpk.rb +15 -0
- data/test/models/customer.rb +3 -1
- data/test/models/destroy_async_parent.rb +1 -1
- data/test/models/developer.rb +44 -3
- data/test/models/discount.rb +4 -0
- data/test/models/drink_designer.rb +1 -0
- data/test/models/editor.rb +8 -0
- data/test/models/editorship.rb +6 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -1
- data/test/models/essay_destroy_async.rb +1 -0
- data/test/models/eye.rb +87 -21
- data/test/models/face.rb +1 -1
- data/test/models/friendship.rb +3 -0
- data/test/models/hardback.rb +7 -0
- data/test/models/hotel.rb +2 -0
- data/test/models/human.rb +2 -2
- data/test/models/invoice.rb +2 -1
- data/test/models/invokes_an_undefined_method.rb +5 -0
- data/test/models/line_item.rb +6 -0
- data/test/models/member.rb +9 -4
- data/test/models/membership.rb +2 -2
- data/test/models/message.rb +2 -1
- data/test/models/need_quoting.rb +5 -0
- data/test/models/paragraph.rb +5 -0
- data/test/models/parrot.rb +6 -3
- data/test/models/person.rb +7 -4
- data/test/models/pirate.rb +4 -1
- data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
- data/test/models/post.rb +65 -2
- data/test/models/post_encrypted.rb +15 -0
- data/test/models/post_with_prefetched_pk.rb +15 -0
- data/test/models/project.rb +1 -0
- data/test/models/publication.rb +16 -0
- data/test/models/raises_argument_error.rb +5 -0
- data/test/models/raises_no_method_error.rb +5 -0
- data/test/models/recipient.rb +5 -0
- data/test/models/reference.rb +1 -1
- data/test/models/reply.rb +1 -1
- data/test/models/room.rb +3 -0
- data/test/models/sharded/blog.rb +12 -0
- data/test/models/sharded/blog_post.rb +17 -0
- data/test/models/sharded/blog_post_destroy_async.rb +14 -0
- data/test/models/sharded/blog_post_tag.rb +11 -0
- data/test/models/sharded/blog_post_with_revision.rb +11 -0
- data/test/models/sharded/comment.rb +12 -0
- data/test/models/sharded/comment_destroy_async.rb +12 -0
- data/test/models/sharded/tag.rb +11 -0
- data/test/models/sharded.rb +8 -0
- data/test/models/ship.rb +1 -1
- data/test/models/shipping_line.rb +11 -0
- data/test/models/subscriber.rb +1 -0
- data/test/models/subscription.rb +3 -1
- data/test/models/too_long_table_name.rb +5 -0
- data/test/models/topic.rb +3 -1
- data/test/models/traffic_light.rb +2 -2
- data/test/models/traffic_light_encrypted.rb +21 -0
- data/test/models/translation.rb +9 -0
- data/test/models/treasure.rb +1 -1
- data/test/models/tyre.rb +1 -1
- data/test/models/user.rb +16 -0
- data/test/models/user_with_invalid_relation.rb +28 -0
- data/test/models/uuid_comment.rb +5 -0
- data/test/models/uuid_entry.rb +5 -0
- data/test/models/uuid_message.rb +5 -0
- data/test/models/zine.rb +2 -1
- data/test/schema/mysql2_specific_schema.rb +26 -12
- data/test/schema/postgresql_specific_schema.rb +121 -13
- data/test/schema/schema.rb +361 -103
- data/test/schema/sqlite_specific_schema.rb +17 -6
- data/test/schema/trilogy_specific_schema.rb +96 -0
- data/test/support/adapter_helper.rb +104 -0
- data/test/support/async_helper.rb +15 -0
- data/test/support/config.rb +1 -1
- data/test/support/connection.rb +14 -2
- data/test/support/ddl_helper.rb +1 -1
- data/test/support/fake_adapter.rb +42 -0
- data/test/support/load_schema_helper.rb +22 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
- data/test/support/schema_dumping_helper.rb +15 -9
- data/test/support/tools.rb +37 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
- metadata +247 -15
data/test/cases/helper.rb
CHANGED
|
@@ -8,226 +8,100 @@ require "active_record"
|
|
|
8
8
|
require "cases/test_case"
|
|
9
9
|
require "active_support/dependencies"
|
|
10
10
|
require "active_support/logger"
|
|
11
|
+
require "active_support/core_ext/kernel/reporting"
|
|
11
12
|
require "active_support/core_ext/kernel/singleton_class"
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
|
|
15
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = true
|
|
16
|
+
end
|
|
15
17
|
|
|
16
18
|
# TODO: Move all these random hacks into the ARTest namespace and into the support/ dir
|
|
17
19
|
|
|
18
20
|
Thread.abort_on_exception = true
|
|
19
21
|
|
|
20
22
|
# Show backtraces for deprecated behavior for quicker cleanup.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# Disable available locale checks to avoid warnings running the test suite.
|
|
24
|
-
I18n.enforce_available_locales = false
|
|
25
|
-
|
|
26
|
-
# Connect to the database
|
|
27
|
-
ARTest.connect
|
|
28
|
-
|
|
29
|
-
# Quote "type" if it's a reserved word for the current connection.
|
|
30
|
-
QUOTED_TYPE = ActiveRecord::Base.connection.quote_column_name("type")
|
|
31
|
-
|
|
32
|
-
def current_adapter?(*types)
|
|
33
|
-
types.any? do |type|
|
|
34
|
-
ActiveRecord::ConnectionAdapters.const_defined?(type) &&
|
|
35
|
-
ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters.const_get(type))
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def in_memory_db?
|
|
40
|
-
current_adapter?(:SQLite3Adapter) &&
|
|
41
|
-
ActiveRecord::Base.connection_pool.db_config.database == ":memory:"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def mysql_enforcing_gtid_consistency?
|
|
45
|
-
current_adapter?(:Mysql2Adapter) && "ON" == ActiveRecord::Base.connection.show_variable("enforce_gtid_consistency")
|
|
46
|
-
end
|
|
23
|
+
ActiveRecord.deprecator.debug = true
|
|
47
24
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
elsif current_adapter?(:Mysql2Adapter)
|
|
52
|
-
conn = ActiveRecord::Base.connection
|
|
53
|
-
!conn.mariadb? && conn.database_version >= "8.0.13"
|
|
54
|
-
end
|
|
55
|
-
end
|
|
25
|
+
# ActiveRecord::Base.connection is only soft deprecated but we ban it from the test suite
|
|
26
|
+
# to ensure it's not used internally.
|
|
27
|
+
ActiveRecord.permanent_connection_checkout = :disallowed
|
|
56
28
|
|
|
57
|
-
|
|
58
|
-
if current_adapter?(:Mysql2Adapter)
|
|
59
|
-
conn = ActiveRecord::Base.connection
|
|
60
|
-
conn.mariadb? && conn.database_version >= "10.2.1"
|
|
61
|
-
else
|
|
62
|
-
true
|
|
63
|
-
end
|
|
64
|
-
end
|
|
29
|
+
ActiveRecord::Delegation::DelegateCache.delegate_base_methods = false
|
|
65
30
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
supports_partial_index?
|
|
69
|
-
supports_partitioned_indexes?
|
|
70
|
-
supports_expression_index?
|
|
71
|
-
supports_insert_returning?
|
|
72
|
-
supports_insert_on_duplicate_skip?
|
|
73
|
-
supports_insert_on_duplicate_update?
|
|
74
|
-
supports_insert_conflict_target?
|
|
75
|
-
supports_optimizer_hints?
|
|
76
|
-
supports_datetime_with_precision?
|
|
77
|
-
].each do |method_name|
|
|
78
|
-
define_method method_name do
|
|
79
|
-
ActiveRecord::Base.connection.public_send(method_name)
|
|
80
|
-
end
|
|
81
|
-
end
|
|
31
|
+
# Ensure this alias isn't being used by Active Record itself.
|
|
32
|
+
ActiveRecord::Relation.remove_method(:klass)
|
|
82
33
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
yield
|
|
86
|
-
ensure
|
|
87
|
-
old_tz ? ENV["TZ"] = old_tz : ENV.delete("TZ")
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def with_timezone_config(cfg)
|
|
91
|
-
verify_default_timezone_config
|
|
92
|
-
|
|
93
|
-
old_default_zone = ActiveRecord::Base.default_timezone
|
|
94
|
-
old_awareness = ActiveRecord::Base.time_zone_aware_attributes
|
|
95
|
-
old_zone = Time.zone
|
|
96
|
-
|
|
97
|
-
if cfg.has_key?(:default)
|
|
98
|
-
ActiveRecord::Base.default_timezone = cfg[:default]
|
|
99
|
-
end
|
|
100
|
-
if cfg.has_key?(:aware_attributes)
|
|
101
|
-
ActiveRecord::Base.time_zone_aware_attributes = cfg[:aware_attributes]
|
|
102
|
-
end
|
|
103
|
-
if cfg.has_key?(:zone)
|
|
104
|
-
Time.zone = cfg[:zone]
|
|
105
|
-
end
|
|
106
|
-
yield
|
|
107
|
-
ensure
|
|
108
|
-
ActiveRecord::Base.default_timezone = old_default_zone
|
|
109
|
-
ActiveRecord::Base.time_zone_aware_attributes = old_awareness
|
|
110
|
-
Time.zone = old_zone
|
|
111
|
-
end
|
|
34
|
+
# Disable available locale checks to avoid warnings running the test suite.
|
|
35
|
+
I18n.enforce_available_locales = false
|
|
112
36
|
|
|
113
|
-
#
|
|
114
|
-
|
|
115
|
-
EXPECTED_DEFAULT_TIMEZONE = :utc
|
|
116
|
-
EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES = false
|
|
117
|
-
def verify_default_timezone_config
|
|
118
|
-
if Time.zone != EXPECTED_ZONE
|
|
119
|
-
$stderr.puts <<-MSG
|
|
120
|
-
\n#{self}
|
|
121
|
-
Global state `Time.zone` was leaked.
|
|
122
|
-
Expected: #{EXPECTED_ZONE}
|
|
123
|
-
Got: #{Time.zone}
|
|
124
|
-
MSG
|
|
125
|
-
end
|
|
126
|
-
if ActiveRecord::Base.default_timezone != EXPECTED_DEFAULT_TIMEZONE
|
|
127
|
-
$stderr.puts <<-MSG
|
|
128
|
-
\n#{self}
|
|
129
|
-
Global state `ActiveRecord::Base.default_timezone` was leaked.
|
|
130
|
-
Expected: #{EXPECTED_DEFAULT_TIMEZONE}
|
|
131
|
-
Got: #{ActiveRecord::Base.default_timezone}
|
|
132
|
-
MSG
|
|
133
|
-
end
|
|
134
|
-
if ActiveRecord::Base.time_zone_aware_attributes != EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES
|
|
135
|
-
$stderr.puts <<-MSG
|
|
136
|
-
\n#{self}
|
|
137
|
-
Global state `ActiveRecord::Base.time_zone_aware_attributes` was leaked.
|
|
138
|
-
Expected: #{EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES}
|
|
139
|
-
Got: #{ActiveRecord::Base.time_zone_aware_attributes}
|
|
140
|
-
MSG
|
|
141
|
-
end
|
|
142
|
-
end
|
|
37
|
+
# Quote "type" if it's a reserved word for the current connection.
|
|
38
|
+
QUOTED_TYPE = ActiveRecord::Base.lease_connection.quote_column_name("type")
|
|
143
39
|
|
|
144
|
-
|
|
145
|
-
return false unless connection.supports_extensions?
|
|
146
|
-
return connection.reconnect! if connection.extension_enabled?(extension)
|
|
40
|
+
ActiveRecord::Base.automatically_invert_plural_associations = true
|
|
147
41
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
connection.reconnect!
|
|
151
|
-
end
|
|
42
|
+
ActiveRecord.raise_on_assign_to_attr_readonly = true
|
|
43
|
+
ActiveRecord.belongs_to_required_validates_foreign_key = false
|
|
152
44
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
return true unless connection.extension_enabled?(extension)
|
|
45
|
+
ActiveRecord::ConnectionAdapters.register("abstract", "ActiveRecord::ConnectionAdapters::AbstractAdapter", "active_record/connection_adapters/abstract_adapter")
|
|
46
|
+
ActiveRecord::ConnectionAdapters.register("fake", "FakeActiveRecordAdapter", File.expand_path("../support/fake_adapter.rb", __dir__))
|
|
156
47
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
48
|
+
class ActiveRecord::TestCase
|
|
49
|
+
class SQLSubscriber
|
|
50
|
+
attr_reader :logged
|
|
51
|
+
attr_reader :payloads
|
|
160
52
|
|
|
161
|
-
def
|
|
162
|
-
|
|
163
|
-
|
|
53
|
+
def initialize
|
|
54
|
+
@logged = []
|
|
55
|
+
@payloads = []
|
|
56
|
+
end
|
|
164
57
|
|
|
165
|
-
|
|
166
|
-
|
|
58
|
+
def start(name, id, payload)
|
|
59
|
+
@payloads << payload
|
|
60
|
+
@logged << [payload[:sql].squish, payload[:name], payload[:binds]]
|
|
61
|
+
end
|
|
167
62
|
|
|
168
|
-
|
|
63
|
+
def finish(name, id, payload); end
|
|
169
64
|
end
|
|
170
|
-
end
|
|
171
65
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
66
|
+
module InTimeZone
|
|
67
|
+
private
|
|
68
|
+
def in_time_zone(zone)
|
|
69
|
+
old_zone = Time.zone
|
|
70
|
+
old_tz = ActiveRecord::Base.time_zone_aware_attributes
|
|
71
|
+
|
|
72
|
+
Time.zone = zone ? ActiveSupport::TimeZone[zone] : nil
|
|
73
|
+
ActiveRecord::Base.time_zone_aware_attributes = !zone.nil?
|
|
74
|
+
yield
|
|
75
|
+
ensure
|
|
76
|
+
Time.zone = old_zone
|
|
77
|
+
ActiveRecord::Base.time_zone_aware_attributes = old_tz
|
|
78
|
+
end
|
|
179
79
|
end
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def load_schema
|
|
183
|
-
# silence verbose schema loading
|
|
184
|
-
original_stdout = $stdout
|
|
185
|
-
$stdout = StringIO.new
|
|
186
80
|
|
|
187
|
-
|
|
188
|
-
|
|
81
|
+
module WaitForAsyncTestHelper
|
|
82
|
+
private
|
|
83
|
+
def wait_for_async_query(connection = ActiveRecord::Base.lease_connection, timeout: 5)
|
|
84
|
+
return unless connection.async_enabled?
|
|
189
85
|
|
|
190
|
-
|
|
86
|
+
executor = connection.pool.async_executor
|
|
87
|
+
(timeout * 100).times do
|
|
88
|
+
return unless executor.scheduled_task_count > executor.completed_task_count
|
|
89
|
+
sleep 0.01
|
|
90
|
+
end
|
|
191
91
|
|
|
192
|
-
|
|
193
|
-
|
|
92
|
+
raise Timeout::Error, "The async executor wasn't drained after #{timeout} seconds"
|
|
93
|
+
end
|
|
194
94
|
end
|
|
195
|
-
|
|
196
|
-
ActiveRecord::FixtureSet.reset_cache
|
|
197
|
-
ensure
|
|
198
|
-
$stdout = original_stdout
|
|
199
95
|
end
|
|
200
96
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
class SQLSubscriber
|
|
204
|
-
attr_reader :logged
|
|
205
|
-
attr_reader :payloads
|
|
97
|
+
# Encryption
|
|
206
98
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
99
|
+
ActiveRecord::Encryption.configure \
|
|
100
|
+
primary_key: "test master key",
|
|
101
|
+
deterministic_key: "test deterministic key",
|
|
102
|
+
key_derivation_salt: "testing key derivation salt"
|
|
211
103
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
def finish(name, id, payload); end
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
module InTimeZone
|
|
221
|
-
private
|
|
222
|
-
def in_time_zone(zone)
|
|
223
|
-
old_zone = Time.zone
|
|
224
|
-
old_tz = ActiveRecord::Base.time_zone_aware_attributes
|
|
225
|
-
|
|
226
|
-
Time.zone = zone ? ActiveSupport::TimeZone[zone] : nil
|
|
227
|
-
ActiveRecord::Base.time_zone_aware_attributes = !zone.nil?
|
|
228
|
-
yield
|
|
229
|
-
ensure
|
|
230
|
-
Time.zone = old_zone
|
|
231
|
-
ActiveRecord::Base.time_zone_aware_attributes = old_tz
|
|
232
|
-
end
|
|
233
|
-
end
|
|
104
|
+
# Simulate https://github.com/rails/rails/blob/735cba5bed7a54c7397dfeec1bed16033ae286f8/activerecord/lib/active_record/railtie.rb#L392
|
|
105
|
+
ActiveRecord::Encryption.config.extend_queries = true
|
|
106
|
+
ActiveRecord::Encryption::ExtendedDeterministicQueries.install_support
|
|
107
|
+
ActiveRecord::Encryption::ExtendedDeterministicUniquenessValidator.install_support
|
|
@@ -9,7 +9,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
9
9
|
|
|
10
10
|
setup do
|
|
11
11
|
@klass = Class.new(ActiveRecord::Base) do
|
|
12
|
-
|
|
12
|
+
lease_connection.create_table :hot_compatibilities, force: true do |t|
|
|
13
13
|
t.string :foo
|
|
14
14
|
t.string :bar
|
|
15
15
|
end
|
|
@@ -19,7 +19,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
teardown do
|
|
22
|
-
ActiveRecord::Base.
|
|
22
|
+
ActiveRecord::Base.lease_connection.drop_table :hot_compatibilities
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
test "insert after remove_column" do
|
|
@@ -30,7 +30,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
30
30
|
assert_equal 3, @klass.columns.length
|
|
31
31
|
|
|
32
32
|
# remove one of them
|
|
33
|
-
@klass.
|
|
33
|
+
@klass.lease_connection.remove_column :hot_compatibilities, :bar
|
|
34
34
|
|
|
35
35
|
# we still have 3 columns in the cache
|
|
36
36
|
assert_equal 3, @klass.columns.length
|
|
@@ -45,7 +45,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
45
45
|
test "update after remove_column" do
|
|
46
46
|
record = @klass.create! foo: "foo"
|
|
47
47
|
assert_equal 3, @klass.columns.length
|
|
48
|
-
@klass.
|
|
48
|
+
@klass.lease_connection.remove_column :hot_compatibilities, :bar
|
|
49
49
|
assert_equal 3, @klass.columns.length
|
|
50
50
|
|
|
51
51
|
record.reload
|
|
@@ -56,7 +56,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
56
56
|
assert_equal "bar", record.foo
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
if current_adapter?(:PostgreSQLAdapter) && ActiveRecord::Base.
|
|
59
|
+
if current_adapter?(:PostgreSQLAdapter) && ActiveRecord::Base.lease_connection.prepared_statements
|
|
60
60
|
test "cleans up after prepared statement failure in a transaction" do
|
|
61
61
|
with_two_connections do |original_connection, ddl_connection|
|
|
62
62
|
record = @klass.create! bar: "bar"
|
|
@@ -66,7 +66,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
66
66
|
record.reload
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
assert_predicate get_prepared_statement_cache(@klass.lease_connection), :any?,
|
|
70
70
|
"expected prepared statement cache to have something in it"
|
|
71
71
|
|
|
72
72
|
# add a new column
|
|
@@ -78,7 +78,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
80
|
|
|
81
|
-
assert_empty get_prepared_statement_cache(@klass.
|
|
81
|
+
assert_empty get_prepared_statement_cache(@klass.lease_connection),
|
|
82
82
|
"expected prepared statement cache to be empty but it wasn't"
|
|
83
83
|
end
|
|
84
84
|
end
|
|
@@ -92,7 +92,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
92
92
|
record.reload
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
assert_predicate get_prepared_statement_cache(@klass.lease_connection), :any?,
|
|
96
96
|
"expected prepared statement cache to have something in it"
|
|
97
97
|
|
|
98
98
|
# add a new column
|
|
@@ -108,7 +108,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
108
108
|
end
|
|
109
109
|
end
|
|
110
110
|
|
|
111
|
-
assert_empty get_prepared_statement_cache(@klass.
|
|
111
|
+
assert_empty get_prepared_statement_cache(@klass.lease_connection),
|
|
112
112
|
"expected prepared statement cache to be empty but it wasn't"
|
|
113
113
|
end
|
|
114
114
|
end
|
|
@@ -136,7 +136,7 @@ class HotCompatibilityTest < ActiveRecord::TestCase
|
|
|
136
136
|
ActiveRecord::Base.connection_pool.checkin ddl_connection
|
|
137
137
|
end
|
|
138
138
|
ensure
|
|
139
|
-
ActiveRecord::Base.clear_all_connections!
|
|
139
|
+
ActiveRecord::Base.connection_handler.clear_all_connections!(:all)
|
|
140
140
|
end
|
|
141
141
|
end
|
|
142
142
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "active_support/inflector"
|
|
4
|
+
require "zeitwerk"
|
|
3
5
|
require "cases/helper"
|
|
4
6
|
require "models/author"
|
|
5
7
|
require "models/company"
|
|
@@ -11,6 +13,7 @@ require "models/subscriber"
|
|
|
11
13
|
require "models/vegetables"
|
|
12
14
|
require "models/shop"
|
|
13
15
|
require "models/sponsor"
|
|
16
|
+
require "models/club"
|
|
14
17
|
|
|
15
18
|
module InheritanceTestHelper
|
|
16
19
|
def with_store_full_sti_class(&block)
|
|
@@ -43,14 +46,8 @@ class InheritanceTest < ActiveRecord::TestCase
|
|
|
43
46
|
def test_class_with_blank_sti_name
|
|
44
47
|
company = Company.first
|
|
45
48
|
company = company.dup
|
|
46
|
-
company.
|
|
47
|
-
|
|
48
|
-
return " " if name == "type"
|
|
49
|
-
super
|
|
50
|
-
end
|
|
51
|
-
})
|
|
52
|
-
company.save!
|
|
53
|
-
company = Company.all.to_a.find { |x| x.id == company.id }
|
|
49
|
+
company.update!(type: " ")
|
|
50
|
+
company = Company.find(company.id)
|
|
54
51
|
assert_equal " ", company.type
|
|
55
52
|
end
|
|
56
53
|
|
|
@@ -73,37 +70,33 @@ class InheritanceTest < ActiveRecord::TestCase
|
|
|
73
70
|
end
|
|
74
71
|
|
|
75
72
|
def test_compute_type_no_method_error
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
# Done via autoload because you need the exception to happen when the file
|
|
74
|
+
# is required.
|
|
75
|
+
model = "RaisesNoMethodError"
|
|
76
|
+
Object.autoload(model, "#{MODELS_ROOT}/#{model.underscore}")
|
|
77
|
+
assert_raises(NoMethodError) { Company.send(:compute_type, model) }
|
|
78
|
+
ensure
|
|
79
|
+
Object.send(:remove_const, model)
|
|
81
80
|
end
|
|
82
81
|
|
|
83
82
|
def test_compute_type_on_undefined_method
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
ActiveSupport::Dependencies.stub(:safe_constantize, proc { raise e }) do
|
|
94
|
-
exception = assert_raises NameError do
|
|
95
|
-
Company.send :compute_type, "InvalidModel"
|
|
96
|
-
end
|
|
97
|
-
assert_equal error.message, exception.message
|
|
98
|
-
end
|
|
83
|
+
# Done via autoload because you need the exception to happen when the file
|
|
84
|
+
# is required.
|
|
85
|
+
model = "InvokesAnUndefinedMethod"
|
|
86
|
+
Object.autoload(model, "#{MODELS_ROOT}/#{model.underscore}")
|
|
87
|
+
assert_raises(NameError) { Company.send(:compute_type, model) }
|
|
88
|
+
ensure
|
|
89
|
+
Object.send(:remove_const, model)
|
|
99
90
|
end
|
|
100
91
|
|
|
101
92
|
def test_compute_type_argument_error
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
93
|
+
# Done via autoload because you need the exception to happen when the file
|
|
94
|
+
# is required.
|
|
95
|
+
model = "RaisesArgumentError"
|
|
96
|
+
Object.autoload(model, "#{MODELS_ROOT}/#{model.underscore}")
|
|
97
|
+
assert_raises(ArgumentError) { Company.send(:compute_type, model) }
|
|
98
|
+
ensure
|
|
99
|
+
Object.send(:remove_const, model)
|
|
107
100
|
end
|
|
108
101
|
|
|
109
102
|
def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
|
|
@@ -160,8 +153,8 @@ class InheritanceTest < ActiveRecord::TestCase
|
|
|
160
153
|
|
|
161
154
|
def test_company_descends_from_active_record
|
|
162
155
|
assert_not_predicate ActiveRecord::Base, :descends_from_active_record?
|
|
163
|
-
|
|
164
|
-
|
|
156
|
+
assert_predicate AbstractCompany, :descends_from_active_record?, "AbstractCompany should descend from ActiveRecord::Base"
|
|
157
|
+
assert_predicate Company, :descends_from_active_record?, "Company should descend from ActiveRecord::Base"
|
|
165
158
|
assert_not Class.new(Company).descends_from_active_record?, "Company subclass should not descend from ActiveRecord::Base"
|
|
166
159
|
end
|
|
167
160
|
|
|
@@ -196,12 +189,13 @@ class InheritanceTest < ActiveRecord::TestCase
|
|
|
196
189
|
end
|
|
197
190
|
|
|
198
191
|
def test_base_class_activerecord_error
|
|
199
|
-
|
|
200
|
-
|
|
192
|
+
assert_raise(ActiveRecord::ActiveRecordError) do
|
|
193
|
+
Class.new { include ActiveRecord::Inheritance }
|
|
194
|
+
end
|
|
201
195
|
end
|
|
202
196
|
|
|
203
197
|
def test_a_bad_type_column
|
|
204
|
-
Company.
|
|
198
|
+
Company.lease_connection.insert "INSERT INTO companies (id, #{QUOTED_TYPE}, name) VALUES(100, 'bad_class!', 'Not happening')"
|
|
205
199
|
|
|
206
200
|
assert_raise(ActiveRecord::SubclassNotFound) { Company.find(100) }
|
|
207
201
|
end
|
|
@@ -382,13 +376,15 @@ class InheritanceTest < ActiveRecord::TestCase
|
|
|
382
376
|
|
|
383
377
|
def test_new_with_autoload_paths
|
|
384
378
|
path = File.expand_path("../models/autoloadable", __dir__)
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
379
|
+
Zeitwerk.with_loader do |loader|
|
|
380
|
+
loader.push_dir(path)
|
|
381
|
+
loader.setup
|
|
382
|
+
|
|
383
|
+
firm = Company.new(type: "ExtraFirm")
|
|
384
|
+
assert_equal ExtraFirm, firm.class
|
|
385
|
+
ensure
|
|
386
|
+
loader.unload
|
|
387
|
+
end
|
|
392
388
|
end
|
|
393
389
|
|
|
394
390
|
def test_inheritance_condition
|
|
@@ -472,18 +468,17 @@ class InheritanceTest < ActiveRecord::TestCase
|
|
|
472
468
|
|
|
473
469
|
def test_eager_load_belongs_to_something_inherited
|
|
474
470
|
account = Account.all.merge!(includes: :firm).find(1)
|
|
475
|
-
|
|
471
|
+
assert_predicate account.association(:firm), :loaded?, "association was not eager loaded"
|
|
476
472
|
end
|
|
477
473
|
|
|
478
474
|
def test_alt_eager_loading
|
|
479
475
|
cabbage = RedCabbage.all.merge!(includes: :seller).find(4)
|
|
480
|
-
|
|
476
|
+
assert_predicate cabbage.association(:seller), :loaded?, "association was not eager loaded"
|
|
481
477
|
end
|
|
482
478
|
|
|
483
479
|
def test_eager_load_belongs_to_primary_key_quoting
|
|
484
|
-
c = Account.connection
|
|
485
480
|
bind_param = Arel::Nodes::BindParam.new(nil)
|
|
486
|
-
|
|
481
|
+
assert_queries_match(/#{Regexp.escape(quote_table_name("companies.id"))} = (?:#{Regexp.escape(bind_param.to_sql)}|1)/i) do
|
|
487
482
|
Account.all.merge!(includes: :firm).find(1)
|
|
488
483
|
end
|
|
489
484
|
end
|
|
@@ -548,7 +543,7 @@ class InheritanceComputeTypeTest < ActiveRecord::TestCase
|
|
|
548
543
|
|
|
549
544
|
def test_inheritance_new_with_subclass_as_default
|
|
550
545
|
original_type = Company.columns_hash["type"].default
|
|
551
|
-
ActiveRecord::Base.
|
|
546
|
+
ActiveRecord::Base.lease_connection.change_column_default :companies, :type, "Firm"
|
|
552
547
|
Company.reset_column_information
|
|
553
548
|
|
|
554
549
|
firm = Company.new # without arguments
|
|
@@ -567,7 +562,7 @@ class InheritanceComputeTypeTest < ActiveRecord::TestCase
|
|
|
567
562
|
assert_equal "Client", firm.type
|
|
568
563
|
assert_instance_of Client, firm
|
|
569
564
|
ensure
|
|
570
|
-
ActiveRecord::Base.
|
|
565
|
+
ActiveRecord::Base.lease_connection.change_column_default :companies, :type, original_type
|
|
571
566
|
Company.reset_column_information
|
|
572
567
|
end
|
|
573
568
|
end
|
|
@@ -597,17 +592,10 @@ end
|
|
|
597
592
|
|
|
598
593
|
class InheritanceAttributeMappingTest < ActiveRecord::TestCase
|
|
599
594
|
setup do
|
|
600
|
-
@old_registry = ActiveRecord::Type.registry
|
|
601
|
-
ActiveRecord::Type.registry = ActiveRecord::Type.registry.dup
|
|
602
|
-
ActiveRecord::Type.register :omg_sti, InheritanceAttributeMappingTest::OmgStiType
|
|
603
595
|
Company.delete_all
|
|
604
596
|
Sponsor.delete_all
|
|
605
597
|
end
|
|
606
598
|
|
|
607
|
-
teardown do
|
|
608
|
-
ActiveRecord::Type.registry = @old_registry
|
|
609
|
-
end
|
|
610
|
-
|
|
611
599
|
class OmgStiType < ActiveRecord::Type::String
|
|
612
600
|
def cast_value(value)
|
|
613
601
|
if value =~ /\Aomg_(.+)\z/
|
|
@@ -624,6 +612,8 @@ class InheritanceAttributeMappingTest < ActiveRecord::TestCase
|
|
|
624
612
|
end
|
|
625
613
|
end
|
|
626
614
|
|
|
615
|
+
ActiveRecord::Type.register :omg_sti, OmgStiType
|
|
616
|
+
|
|
627
617
|
class Company < ActiveRecord::Base
|
|
628
618
|
self.table_name = "companies"
|
|
629
619
|
attribute :type, :omg_sti
|
|
@@ -644,7 +634,7 @@ class InheritanceAttributeMappingTest < ActiveRecord::TestCase
|
|
|
644
634
|
Empire.create! name: "an Empire"
|
|
645
635
|
|
|
646
636
|
assert_equal [["a Startup", "omg_inheritance_attribute_mapping_test/startup"],
|
|
647
|
-
["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.
|
|
637
|
+
["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.lease_connection.select_rows("SELECT name, type FROM companies").sort
|
|
648
638
|
assert_equal [["a Startup", "InheritanceAttributeMappingTest::Startup"],
|
|
649
639
|
["an Empire", "InheritanceAttributeMappingTest::Empire"]], Company.all.map { |a| [a.name, a.type] }.sort
|
|
650
640
|
|
|
@@ -653,7 +643,7 @@ class InheritanceAttributeMappingTest < ActiveRecord::TestCase
|
|
|
653
643
|
startup.save!
|
|
654
644
|
|
|
655
645
|
assert_equal [["a Startup", "omg_inheritance_attribute_mapping_test/empire"],
|
|
656
|
-
["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.
|
|
646
|
+
["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.lease_connection.select_rows("SELECT name, type FROM companies").sort
|
|
657
647
|
|
|
658
648
|
assert_equal [["a Startup", "InheritanceAttributeMappingTest::Empire"],
|
|
659
649
|
["an Empire", "InheritanceAttributeMappingTest::Empire"]], Company.all.map { |a| [a.name, a.type] }.sort
|
|
@@ -663,7 +653,7 @@ class InheritanceAttributeMappingTest < ActiveRecord::TestCase
|
|
|
663
653
|
startup = Startup.create! name: "a Startup"
|
|
664
654
|
sponsor = Sponsor.create! sponsorable: startup
|
|
665
655
|
|
|
666
|
-
assert_equal ["omg_inheritance_attribute_mapping_test/company"], ActiveRecord::Base.
|
|
656
|
+
assert_equal ["omg_inheritance_attribute_mapping_test/company"], ActiveRecord::Base.lease_connection.select_values("SELECT sponsorable_type FROM sponsors")
|
|
667
657
|
|
|
668
658
|
sponsor = Sponsor.find(sponsor.id)
|
|
669
659
|
assert_equal startup, sponsor.sponsorable
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "cases/helper"
|
|
4
|
+
|
|
5
|
+
module Inherited
|
|
6
|
+
# When running the test with `RAILS_STRICT_WARNINGS` enabled, the `belongs_to`
|
|
7
|
+
# call should not emit a warning that the constant `GeneratedAssociationMethods`
|
|
8
|
+
# is already defined.
|
|
9
|
+
class Person < ActiveRecord::Base; end
|
|
10
|
+
|
|
11
|
+
class Device < ActiveRecord::Base
|
|
12
|
+
def self.inherited(subclass)
|
|
13
|
+
subclass.belongs_to :person, inverse_of: subclass.name.demodulize.tableize.to_sym
|
|
14
|
+
subclass.filter_attributes = [:secret_attribute, :"#{subclass.name.demodulize.downcase}_key"]
|
|
15
|
+
super
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class Computer < Device; end
|
|
20
|
+
|
|
21
|
+
class Vehicle < ActiveRecord::Base
|
|
22
|
+
def self.inherited(subclass)
|
|
23
|
+
super
|
|
24
|
+
subclass.belongs_to :person, inverse_of: subclass.name.demodulize.tableize.to_sym
|
|
25
|
+
subclass.filter_attributes = [:secret_attribute, :"#{subclass.name.demodulize.downcase}_key"]
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class Car < Vehicle; end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class InheritedTest < ActiveRecord::TestCase
|
|
33
|
+
def test_super_before_filter_attributes
|
|
34
|
+
assert_equal %i[secret_attribute car_key], Inherited::Car.filter_attributes
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_super_after_filter_attributes
|
|
38
|
+
assert_equal %i[secret_attribute computer_key], Inherited::Computer.filter_attributes
|
|
39
|
+
end
|
|
40
|
+
end
|