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
|
@@ -4,8 +4,6 @@ require "cases/helper"
|
|
|
4
4
|
require "cases/migration/helper"
|
|
5
5
|
|
|
6
6
|
class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
7
|
-
self.use_transactional_tests = false
|
|
8
|
-
|
|
9
7
|
# Use this class to sense if migrations have gone
|
|
10
8
|
# up or down.
|
|
11
9
|
class Sensor < ActiveRecord::Migration::Current
|
|
@@ -23,22 +21,25 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
|
23
21
|
|
|
24
22
|
def setup
|
|
25
23
|
super
|
|
26
|
-
@
|
|
27
|
-
@
|
|
24
|
+
@pool_a = ActiveRecord::Base.connection_pool
|
|
25
|
+
@pool_b = ARUnit2Model.connection_pool
|
|
28
26
|
|
|
29
|
-
@
|
|
30
|
-
@
|
|
27
|
+
@pool_a.schema_migration.create_table
|
|
28
|
+
@pool_b.schema_migration.create_table
|
|
31
29
|
|
|
32
|
-
@
|
|
33
|
-
@
|
|
30
|
+
@pool_a.schema_migration.delete_all_versions rescue nil
|
|
31
|
+
@pool_b.schema_migration.delete_all_versions rescue nil
|
|
34
32
|
|
|
35
33
|
@path_a = MIGRATIONS_ROOT + "/valid"
|
|
36
34
|
@path_b = MIGRATIONS_ROOT + "/to_copy"
|
|
37
35
|
|
|
38
|
-
@schema_migration_a = @
|
|
39
|
-
@
|
|
40
|
-
@
|
|
41
|
-
|
|
36
|
+
@schema_migration_a = @pool_a.schema_migration
|
|
37
|
+
@internal_metadata_a = @pool_a.internal_metadata
|
|
38
|
+
@migrations_a = ActiveRecord::MigrationContext.new(@path_a, @schema_migration_a, @internal_metadata_a).migrations
|
|
39
|
+
|
|
40
|
+
@schema_migration_b = @pool_b.schema_migration
|
|
41
|
+
@internal_metadata_b = @pool_b.internal_metadata
|
|
42
|
+
@migrations_b = ActiveRecord::MigrationContext.new(@path_b, @schema_migration_b, @internal_metadata_b).migrations
|
|
42
43
|
|
|
43
44
|
@migrations_a_list = [[1, "ValidPeopleHaveLastNames"], [2, "WeNeedReminders"], [3, "InnocentJointable"]]
|
|
44
45
|
@migrations_b_list = [[1, "PeopleHaveHobbies"], [2, "PeopleHaveDescriptions"]]
|
|
@@ -55,8 +56,8 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
|
55
56
|
end
|
|
56
57
|
|
|
57
58
|
teardown do
|
|
58
|
-
@
|
|
59
|
-
@
|
|
59
|
+
@pool_q.schema_migration.delete_all_versions rescue nil
|
|
60
|
+
@pool_b.schema_migration.delete_all_versions rescue nil
|
|
60
61
|
|
|
61
62
|
ActiveRecord::Migration.verbose = @verbose_was
|
|
62
63
|
ActiveRecord::Migration.class_eval do
|
|
@@ -67,9 +68,16 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
|
67
68
|
end
|
|
68
69
|
end
|
|
69
70
|
|
|
70
|
-
def
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
def test_schema_migration_is_different_for_different_connections
|
|
72
|
+
assert_not_equal @schema_migration_a, @schema_migration_b
|
|
73
|
+
assert_not_equal @schema_migration_a.instance_variable_get(:@pool), @schema_migration_b.instance_variable_get(:@pool)
|
|
74
|
+
if @pool_a.pool_config.respond_to?(:connection_descriptor)
|
|
75
|
+
assert_equal "ActiveRecord::Base", @pool_a.pool_config.connection_descriptor.name
|
|
76
|
+
assert_equal "ARUnit2Model", @pool_b.pool_config.connection_descriptor.name
|
|
77
|
+
else
|
|
78
|
+
assert_equal "ActiveRecord::Base", @pool_a.pool_config.connection_class.name
|
|
79
|
+
assert_equal "ARUnit2Model", @pool_b.pool_config.connection_class.name
|
|
80
|
+
end
|
|
73
81
|
end
|
|
74
82
|
|
|
75
83
|
def test_finds_migrations
|
|
@@ -85,23 +93,23 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
|
85
93
|
end
|
|
86
94
|
|
|
87
95
|
def test_migrations_status
|
|
88
|
-
@schema_migration_a.
|
|
89
|
-
@schema_migration_a.
|
|
96
|
+
@schema_migration_a.create_version(2)
|
|
97
|
+
@schema_migration_a.create_version(10)
|
|
90
98
|
|
|
91
99
|
assert_equal [
|
|
92
100
|
["down", "001", "Valid people have last names"],
|
|
93
101
|
["up", "002", "We need reminders"],
|
|
94
102
|
["down", "003", "Innocent jointable"],
|
|
95
103
|
["up", "010", "********** NO FILE **********"],
|
|
96
|
-
], ActiveRecord::MigrationContext.new(@path_a, @schema_migration_a).migrations_status
|
|
104
|
+
], ActiveRecord::MigrationContext.new(@path_a, @schema_migration_a, @internal_metadata_a).migrations_status
|
|
97
105
|
|
|
98
|
-
@schema_migration_b.
|
|
106
|
+
@schema_migration_b.create_version(4)
|
|
99
107
|
|
|
100
108
|
assert_equal [
|
|
101
109
|
["down", "001", "People have hobbies"],
|
|
102
110
|
["down", "002", "People have descriptions"],
|
|
103
111
|
["up", "004", "********** NO FILE **********"]
|
|
104
|
-
], ActiveRecord::MigrationContext.new(@path_b, @schema_migration_b).migrations_status
|
|
112
|
+
], ActiveRecord::MigrationContext.new(@path_b, @schema_migration_b, @internal_metadata_b).migrations_status
|
|
105
113
|
end
|
|
106
114
|
|
|
107
115
|
def test_get_all_versions
|
|
@@ -134,16 +142,16 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
|
134
142
|
end
|
|
135
143
|
|
|
136
144
|
def test_finds_pending_migrations
|
|
137
|
-
@schema_migration_a.
|
|
145
|
+
@schema_migration_a.create_version("1")
|
|
138
146
|
migration_list_a = [ActiveRecord::Migration.new("foo", 1), ActiveRecord::Migration.new("bar", 3)]
|
|
139
|
-
migrations_a = ActiveRecord::Migrator.new(:up, migration_list_a, @schema_migration_a).pending_migrations
|
|
147
|
+
migrations_a = ActiveRecord::Migrator.new(:up, migration_list_a, @schema_migration_a, @internal_metadata_a).pending_migrations
|
|
140
148
|
|
|
141
149
|
assert_equal 1, migrations_a.size
|
|
142
150
|
assert_equal migration_list_a.last, migrations_a.first
|
|
143
151
|
|
|
144
|
-
@schema_migration_b.
|
|
152
|
+
@schema_migration_b.create_version("1")
|
|
145
153
|
migration_list_b = [ActiveRecord::Migration.new("foo", 1), ActiveRecord::Migration.new("bar", 3)]
|
|
146
|
-
migrations_b = ActiveRecord::Migrator.new(:up, migration_list_b, @schema_migration_b).pending_migrations
|
|
154
|
+
migrations_b = ActiveRecord::Migrator.new(:up, migration_list_b, @schema_migration_b, @internal_metadata_b).pending_migrations
|
|
147
155
|
|
|
148
156
|
assert_equal 1, migrations_b.size
|
|
149
157
|
assert_equal migration_list_b.last, migrations_b.first
|
|
@@ -151,25 +159,27 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
|
151
159
|
|
|
152
160
|
def test_migrator_db_has_no_schema_migrations_table
|
|
153
161
|
_, migrator = migrator_class(3)
|
|
154
|
-
migrator = migrator.new(@path_a, @schema_migration_a)
|
|
162
|
+
migrator = migrator.new(@path_a, @schema_migration_a, @internal_metadata_a)
|
|
155
163
|
|
|
156
164
|
@schema_migration_a.drop_table
|
|
157
|
-
assert_not @
|
|
165
|
+
assert_not @pool_a.lease_connection.table_exists?("schema_migrations")
|
|
158
166
|
migrator.migrate(1)
|
|
159
|
-
assert @
|
|
167
|
+
assert @pool_a.lease_connection.table_exists?("schema_migrations")
|
|
168
|
+
migrator.rollback
|
|
160
169
|
|
|
161
170
|
_, migrator = migrator_class(3)
|
|
162
|
-
migrator = migrator.new(@path_b, @schema_migration_b)
|
|
171
|
+
migrator = migrator.new(@path_b, @schema_migration_b, @internal_metadata_b)
|
|
163
172
|
|
|
164
173
|
@schema_migration_b.drop_table
|
|
165
|
-
assert_not @
|
|
174
|
+
assert_not @pool_b.lease_connection.table_exists?("schema_migrations")
|
|
166
175
|
migrator.migrate(1)
|
|
167
|
-
assert @
|
|
176
|
+
assert @pool_b.lease_connection.table_exists?("schema_migrations")
|
|
177
|
+
migrator.rollback
|
|
168
178
|
end
|
|
169
179
|
|
|
170
180
|
def test_migrator_forward
|
|
171
181
|
_, migrator = migrator_class(3)
|
|
172
|
-
migrator = migrator.new(@path_a, @schema_migration_a)
|
|
182
|
+
migrator = migrator.new(@path_a, @schema_migration_a, @internal_metadata_a)
|
|
173
183
|
migrator.migrate(1)
|
|
174
184
|
assert_equal(1, migrator.current_version)
|
|
175
185
|
|
|
@@ -180,7 +190,7 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
|
180
190
|
assert_equal(3, migrator.current_version)
|
|
181
191
|
|
|
182
192
|
_, migrator_b = migrator_class(3)
|
|
183
|
-
migrator_b = migrator_b.new(@path_b, @schema_migration_b)
|
|
193
|
+
migrator_b = migrator_b.new(@path_b, @schema_migration_b, @internal_metadata_b)
|
|
184
194
|
migrator_b.migrate(1)
|
|
185
195
|
assert_equal(1, migrator_b.current_version)
|
|
186
196
|
|
|
@@ -191,6 +201,17 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
|
|
|
191
201
|
assert_equal(3, migrator_b.current_version)
|
|
192
202
|
end
|
|
193
203
|
|
|
204
|
+
def test_internal_metadata_stores_environment
|
|
205
|
+
current_env = ActiveRecord::Base.lease_connection.pool.db_config.env_name
|
|
206
|
+
migrations_path = MIGRATIONS_ROOT + "/valid"
|
|
207
|
+
migrator = ActiveRecord::MigrationContext.new(migrations_path, @schema_migration_b, @internal_metadata_b)
|
|
208
|
+
|
|
209
|
+
migrator.up
|
|
210
|
+
assert_equal current_env, @internal_metadata_b[:environment]
|
|
211
|
+
ensure
|
|
212
|
+
migrator.down if migrator && !current_adapter?(:IBM_DBAdapter)
|
|
213
|
+
end
|
|
214
|
+
|
|
194
215
|
private
|
|
195
216
|
def m(name, version)
|
|
196
217
|
x = Sensor.new name, version
|
|
@@ -107,8 +107,8 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase
|
|
|
107
107
|
}
|
|
108
108
|
topic = Topic.find(1)
|
|
109
109
|
topic.attributes = attributes
|
|
110
|
-
# testing against
|
|
111
|
-
assert_equal "1850-06-24 16:24:00", topic.written_on.
|
|
110
|
+
# testing against to_fs(:db) representation because either a Time or a DateTime might be returned, depending on platform
|
|
111
|
+
assert_equal "1850-06-24 16:24:00", topic.written_on.to_fs(:db)
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
def test_multiparameter_attributes_on_time_will_raise_on_big_time_if_missing_date_parts
|
|
@@ -249,36 +249,33 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase
|
|
|
249
249
|
Topic.reset_column_information
|
|
250
250
|
end
|
|
251
251
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
def test_multiparameter_attributes_on_time_only_column_with_time_zone_aware_attributes_does_not_do_time_zone_conversion
|
|
255
|
-
with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
|
|
256
|
-
Topic.reset_column_information
|
|
257
|
-
attributes = {
|
|
258
|
-
"bonus_time(1i)" => "2000", "bonus_time(2i)" => "1", "bonus_time(3i)" => "1",
|
|
259
|
-
"bonus_time(4i)" => "16", "bonus_time(5i)" => "24"
|
|
260
|
-
}
|
|
261
|
-
topic = Topic.find(1)
|
|
262
|
-
topic.attributes = attributes
|
|
263
|
-
assert_equal Time.zone.local(2000, 1, 1, 16, 24, 0), topic.bonus_time
|
|
264
|
-
assert_not_predicate topic.bonus_time, :utc?
|
|
265
|
-
|
|
266
|
-
attributes = {
|
|
267
|
-
"written_on(1i)" => "2000", "written_on(2i)" => "", "written_on(3i)" => "",
|
|
268
|
-
"written_on(4i)" => "", "written_on(5i)" => ""
|
|
269
|
-
}
|
|
270
|
-
topic.attributes = attributes
|
|
271
|
-
assert_nil topic.written_on
|
|
272
|
-
end
|
|
273
|
-
ensure
|
|
252
|
+
def test_multiparameter_attributes_on_time_only_column_with_time_zone_aware_attributes_does_not_do_time_zone_conversion
|
|
253
|
+
with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
|
|
274
254
|
Topic.reset_column_information
|
|
275
|
-
|
|
255
|
+
attributes = {
|
|
256
|
+
"bonus_time(1i)" => "2000", "bonus_time(2i)" => "1", "bonus_time(3i)" => "1",
|
|
257
|
+
"bonus_time(4i)" => "16", "bonus_time(5i)" => "24"
|
|
258
|
+
}
|
|
259
|
+
topic = Topic.find(1)
|
|
260
|
+
topic.attributes = attributes
|
|
261
|
+
assert_equal Time.zone.local(2000, 1, 1, 16, 24, 0), topic.bonus_time
|
|
262
|
+
assert_not_predicate topic.bonus_time, :utc?
|
|
276
263
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
264
|
+
attributes = {
|
|
265
|
+
"written_on(1i)" => "2000", "written_on(2i)" => "", "written_on(3i)" => "",
|
|
266
|
+
"written_on(4i)" => "", "written_on(5i)" => ""
|
|
267
|
+
}
|
|
268
|
+
topic.attributes = attributes
|
|
269
|
+
assert_nil topic.written_on
|
|
281
270
|
end
|
|
271
|
+
ensure
|
|
272
|
+
Topic.reset_column_information
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def test_multiparameter_attributes_setting_time_attribute
|
|
276
|
+
topic = Topic.new("bonus_time(4i)" => "01", "bonus_time(5i)" => "05")
|
|
277
|
+
assert_equal 1, topic.bonus_time.hour
|
|
278
|
+
assert_equal 5, topic.bonus_time.min
|
|
282
279
|
end
|
|
283
280
|
|
|
284
281
|
def test_multiparameter_attributes_on_time_with_empty_seconds
|
|
@@ -9,26 +9,26 @@ class MultipleDbTest < ActiveRecord::TestCase
|
|
|
9
9
|
self.use_transactional_tests = false
|
|
10
10
|
|
|
11
11
|
def setup
|
|
12
|
-
@courses = create_fixtures("courses")
|
|
13
|
-
@colleges = create_fixtures("colleges")
|
|
12
|
+
@courses = create_fixtures("courses")
|
|
13
|
+
@colleges = create_fixtures("colleges")
|
|
14
14
|
@entrants = create_fixtures("entrants")
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def test_connected
|
|
18
|
-
assert_not_nil Entrant.
|
|
19
|
-
assert_not_nil Course.
|
|
18
|
+
assert_not_nil Entrant.lease_connection
|
|
19
|
+
assert_not_nil Course.lease_connection
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def test_proper_connection
|
|
23
|
-
assert_not_equal(Entrant.
|
|
24
|
-
assert_equal(Entrant.
|
|
25
|
-
assert_equal(Course.
|
|
26
|
-
assert_equal(ActiveRecord::Base.
|
|
23
|
+
assert_not_equal(Entrant.lease_connection, Course.lease_connection)
|
|
24
|
+
assert_equal(Entrant.lease_connection, Entrant.retrieve_connection)
|
|
25
|
+
assert_equal(Course.lease_connection, Course.retrieve_connection)
|
|
26
|
+
assert_equal(ActiveRecord::Base.lease_connection, Entrant.lease_connection)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def test_swapping_the_connection
|
|
30
30
|
old_spec_name, Course.connection_specification_name = Course.connection_specification_name, "ActiveRecord::Base"
|
|
31
|
-
assert_equal(Entrant.
|
|
31
|
+
assert_equal(Entrant.lease_connection, Course.lease_connection)
|
|
32
32
|
ensure
|
|
33
33
|
Course.connection_specification_name = old_spec_name
|
|
34
34
|
end
|
|
@@ -58,12 +58,12 @@ class MultipleDbTest < ActiveRecord::TestCase
|
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def test_course_connection_should_survive_reloads
|
|
61
|
-
assert Course.
|
|
61
|
+
assert Course.lease_connection
|
|
62
62
|
|
|
63
63
|
assert Object.send(:remove_const, :Course)
|
|
64
64
|
assert load("models/course.rb")
|
|
65
65
|
|
|
66
|
-
assert Course.
|
|
66
|
+
assert Course.lease_connection
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def test_transactions_across_databases
|
|
@@ -92,25 +92,48 @@ class MultipleDbTest < ActiveRecord::TestCase
|
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
def test_connection
|
|
95
|
-
assert_same Entrant.
|
|
96
|
-
assert_not_same Entrant.
|
|
95
|
+
assert_same Entrant.lease_connection, Bird.lease_connection
|
|
96
|
+
assert_not_same Entrant.lease_connection, Course.lease_connection
|
|
97
97
|
end
|
|
98
98
|
|
|
99
99
|
unless in_memory_db?
|
|
100
100
|
def test_count_on_custom_connection
|
|
101
|
-
|
|
101
|
+
assert_equal ARUnit2Model.lease_connection, College.lease_connection
|
|
102
|
+
assert_not_equal ActiveRecord::Base.lease_connection, College.lease_connection
|
|
102
103
|
assert_equal 1, College.count
|
|
103
|
-
ensure
|
|
104
|
-
ActiveRecord::Base.establish_connection :arunit
|
|
105
104
|
end
|
|
106
105
|
|
|
107
106
|
def test_associations_should_work_when_model_has_no_connection
|
|
108
|
-
ActiveRecord::Base.remove_connection
|
|
109
107
|
assert_nothing_raised do
|
|
110
108
|
College.first.courses.first
|
|
111
109
|
end
|
|
112
|
-
ensure
|
|
113
|
-
ActiveRecord::Base.establish_connection :arunit
|
|
114
110
|
end
|
|
115
111
|
end
|
|
112
|
+
|
|
113
|
+
def test_exception_contains_connection_pool
|
|
114
|
+
error = assert_raises(ActiveRecord::StatementInvalid) do
|
|
115
|
+
Course.where(wrong_column: "wrong").first!
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
assert_equal Course.lease_connection.pool, error.connection_pool
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_exception_contains_correct_pool
|
|
122
|
+
course_conn = Course.lease_connection
|
|
123
|
+
entrant_conn = Entrant.lease_connection
|
|
124
|
+
|
|
125
|
+
assert_not_equal course_conn, entrant_conn
|
|
126
|
+
|
|
127
|
+
course_error = assert_raises(ActiveRecord::StatementInvalid) do
|
|
128
|
+
course_conn.execute("SELECT * FROM entrants")
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
assert_equal course_conn.pool, course_error.connection_pool
|
|
132
|
+
|
|
133
|
+
entrant_error = assert_raises(ActiveRecord::StatementInvalid) do
|
|
134
|
+
entrant_conn.execute("SELECT * FROM courses")
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
assert_equal entrant_conn.pool, entrant_error.connection_pool
|
|
138
|
+
end
|
|
116
139
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require "cases/helper"
|
|
4
4
|
require "models/pirate"
|
|
5
|
+
require "models/developer"
|
|
5
6
|
require "models/ship"
|
|
6
7
|
require "models/ship_part"
|
|
7
8
|
require "models/bird"
|
|
@@ -11,6 +12,9 @@ require "models/human"
|
|
|
11
12
|
require "models/interest"
|
|
12
13
|
require "models/owner"
|
|
13
14
|
require "models/pet"
|
|
15
|
+
require "models/entry"
|
|
16
|
+
require "models/message"
|
|
17
|
+
require "models/cpk"
|
|
14
18
|
require "active_support/hash_with_indifferent_access"
|
|
15
19
|
|
|
16
20
|
class TestNestedAttributesInGeneral < ActiveRecord::TestCase
|
|
@@ -229,6 +233,17 @@ class TestNestedAttributesInGeneral < ActiveRecord::TestCase
|
|
|
229
233
|
)
|
|
230
234
|
end
|
|
231
235
|
end
|
|
236
|
+
|
|
237
|
+
def test_updating_models_with_cpk_provided_as_strings
|
|
238
|
+
book = Cpk::Book.create!(id: [1, 2], shop_id: 3)
|
|
239
|
+
book.chapters.create!(id: [1, 3], title: "Title")
|
|
240
|
+
|
|
241
|
+
assert_queries_count(4) do
|
|
242
|
+
book.update!(chapters_attributes: { id: ["1", "3"], title: "New title" })
|
|
243
|
+
end
|
|
244
|
+
assert_equal 1, book.reload.chapters.count
|
|
245
|
+
assert_equal "New title", book.chapters.first.title
|
|
246
|
+
end
|
|
232
247
|
end
|
|
233
248
|
|
|
234
249
|
class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
|
|
@@ -359,6 +374,15 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
|
|
|
359
374
|
assert_equal "Mister Pablo", @pirate.ship.name
|
|
360
375
|
end
|
|
361
376
|
|
|
377
|
+
def test_should_defer_updating_nested_associations_until_after_base_attributes_are_set
|
|
378
|
+
ship = @pirate.ship
|
|
379
|
+
|
|
380
|
+
ship_part = ShipPart.new
|
|
381
|
+
ship_part.attributes = { ship_attributes: { name: "Prometheus" }, ship_id: ship.id }
|
|
382
|
+
|
|
383
|
+
assert_equal "Prometheus", ship_part.ship.name
|
|
384
|
+
end
|
|
385
|
+
|
|
362
386
|
def test_should_not_destroy_the_associated_model_until_the_parent_is_saved
|
|
363
387
|
@pirate.attributes = { ship_attributes: { id: @ship.id, _destroy: "1" } }
|
|
364
388
|
|
|
@@ -377,6 +401,7 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
|
|
|
377
401
|
|
|
378
402
|
def test_should_accept_update_only_option
|
|
379
403
|
@pirate.update(update_only_ship_attributes: { id: @pirate.ship.id, name: "Mayflower" })
|
|
404
|
+
assert_equal "Mayflower", @pirate.reload.ship.name
|
|
380
405
|
end
|
|
381
406
|
|
|
382
407
|
def test_should_create_new_model_when_nothing_is_there_and_update_only_is_true
|
|
@@ -419,6 +444,13 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
|
|
|
419
444
|
|
|
420
445
|
Pirate.accepts_nested_attributes_for :update_only_ship, update_only: true, allow_destroy: false
|
|
421
446
|
end
|
|
447
|
+
|
|
448
|
+
def test_should_raise_an_argument_error_if_something_other_than_a_hash_is_passed_in
|
|
449
|
+
exception = assert_raise ArgumentError do
|
|
450
|
+
@pirate.update(ship_attributes: "foo")
|
|
451
|
+
end
|
|
452
|
+
assert_equal "Hash expected for `ship` attributes, got String", exception.message
|
|
453
|
+
end
|
|
422
454
|
end
|
|
423
455
|
|
|
424
456
|
class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase
|
|
@@ -595,6 +627,13 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase
|
|
|
595
627
|
|
|
596
628
|
Ship.accepts_nested_attributes_for :update_only_pirate, update_only: true, allow_destroy: false
|
|
597
629
|
end
|
|
630
|
+
|
|
631
|
+
def test_should_raise_an_argument_error_if_something_other_than_a_hash_is_passed_in
|
|
632
|
+
exception = assert_raise ArgumentError do
|
|
633
|
+
@ship.update(pirate_attributes: "foo")
|
|
634
|
+
end
|
|
635
|
+
assert_equal "Hash expected for `pirate` attributes, got String", exception.message
|
|
636
|
+
end
|
|
598
637
|
end
|
|
599
638
|
|
|
600
639
|
module NestedAttributesOnACollectionAssociationTests
|
|
@@ -765,7 +804,7 @@ module NestedAttributesOnACollectionAssociationTests
|
|
|
765
804
|
exception = assert_raise ArgumentError do
|
|
766
805
|
@pirate.public_send(association_setter, "foo")
|
|
767
806
|
end
|
|
768
|
-
assert_equal %{Hash or Array expected for
|
|
807
|
+
assert_equal %{Hash or Array expected for `#{@association_name}` attributes, got String}, exception.message
|
|
769
808
|
end
|
|
770
809
|
|
|
771
810
|
def test_should_work_with_update_as_well
|
|
@@ -850,6 +889,21 @@ module NestedAttributesOnACollectionAssociationTests
|
|
|
850
889
|
end
|
|
851
890
|
end
|
|
852
891
|
|
|
892
|
+
def test_assigning_nested_attributes_target
|
|
893
|
+
params = @alternate_params[association_getter].values
|
|
894
|
+
@pirate.public_send(association_setter, params)
|
|
895
|
+
@pirate.save
|
|
896
|
+
assert_equal [@child_1, @child_2], @pirate.association(@association_name).nested_attributes_target
|
|
897
|
+
end
|
|
898
|
+
|
|
899
|
+
def test_assigning_nested_attributes_target_with_nil_placeholder_for_rejected_item
|
|
900
|
+
params = @alternate_params[association_getter].values
|
|
901
|
+
params.insert(1, {})
|
|
902
|
+
@pirate.public_send(association_setter, params)
|
|
903
|
+
@pirate.save
|
|
904
|
+
assert_equal [@child_1, nil, @child_2], @pirate.association(@association_name).nested_attributes_target
|
|
905
|
+
end
|
|
906
|
+
|
|
853
907
|
private
|
|
854
908
|
def association_setter
|
|
855
909
|
@association_setter ||= "#{@association_name}_attributes=".to_sym
|
|
@@ -1093,7 +1147,7 @@ class TestHasManyAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveR
|
|
|
1093
1147
|
part = ship.parts.build(name: "Stern")
|
|
1094
1148
|
ship.treasures.build(looter: part)
|
|
1095
1149
|
|
|
1096
|
-
|
|
1150
|
+
assert_queries_count(5) do
|
|
1097
1151
|
ship.save!
|
|
1098
1152
|
end
|
|
1099
1153
|
end
|
|
@@ -1106,14 +1160,78 @@ class TestHasManyAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveR
|
|
|
1106
1160
|
end
|
|
1107
1161
|
end
|
|
1108
1162
|
|
|
1109
|
-
class
|
|
1110
|
-
setup
|
|
1111
|
-
|
|
1163
|
+
class TestIndexErrorsWithNestedAttributesOnlyMode < ActiveRecord::TestCase
|
|
1164
|
+
def setup
|
|
1165
|
+
tuning_peg_class = Class.new(ActiveRecord::Base) do
|
|
1166
|
+
self.table_name = "tuning_pegs"
|
|
1167
|
+
def self.name; "TuningPeg"; end
|
|
1168
|
+
|
|
1169
|
+
validates_numericality_of :pitch
|
|
1170
|
+
end
|
|
1171
|
+
|
|
1172
|
+
@guitar_class = Class.new(ActiveRecord::Base) do
|
|
1173
|
+
has_many :tuning_pegs, index_errors: :nested_attributes_order, anonymous_class: tuning_peg_class
|
|
1174
|
+
accepts_nested_attributes_for :tuning_pegs, reject_if: lambda { |attrs| attrs[:pitch]&.odd? }
|
|
1175
|
+
|
|
1176
|
+
def self.name; "Guitar"; end
|
|
1177
|
+
end
|
|
1112
1178
|
end
|
|
1113
1179
|
|
|
1180
|
+
test "index in nested_attributes_order order" do
|
|
1181
|
+
guitar = @guitar_class.create!
|
|
1182
|
+
guitar.tuning_pegs.create!(pitch: 1)
|
|
1183
|
+
peg2 = guitar.tuning_pegs.create!(pitch: 2)
|
|
1184
|
+
|
|
1185
|
+
assert_predicate guitar, :valid?
|
|
1186
|
+
|
|
1187
|
+
guitar.update(tuning_pegs_attributes: [{ id: peg2.id, pitch: nil }])
|
|
1188
|
+
|
|
1189
|
+
assert_not_predicate guitar, :valid?
|
|
1190
|
+
assert_equal [:"tuning_pegs[0].pitch"], guitar.errors.messages.keys
|
|
1191
|
+
end
|
|
1192
|
+
|
|
1193
|
+
test "index unaffected by reject_if" do
|
|
1194
|
+
guitar = @guitar_class.create!
|
|
1195
|
+
|
|
1196
|
+
guitar.update(
|
|
1197
|
+
tuning_pegs_attributes: [
|
|
1198
|
+
{ pitch: 1 },
|
|
1199
|
+
{ pitch: nil },
|
|
1200
|
+
]
|
|
1201
|
+
)
|
|
1202
|
+
|
|
1203
|
+
assert_not_predicate guitar, :valid?
|
|
1204
|
+
assert_equal [:"tuning_pegs[1].pitch"], guitar.errors.messages.keys
|
|
1205
|
+
end
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
class TestNestedAttributesWithExtend < ActiveRecord::TestCase
|
|
1114
1209
|
def test_extend_affects_nested_attributes
|
|
1115
|
-
|
|
1210
|
+
super_pirate = Class.new(ActiveRecord::Base) do
|
|
1211
|
+
self.table_name = "pirates"
|
|
1212
|
+
|
|
1213
|
+
has_many :treasures, as: :looter, extend: Pirate::PostTreasuresExtension
|
|
1214
|
+
self.accepts_nested_attributes_for :treasures
|
|
1215
|
+
|
|
1216
|
+
def self.name
|
|
1217
|
+
"SuperPirate"
|
|
1218
|
+
end
|
|
1219
|
+
end
|
|
1220
|
+
|
|
1221
|
+
pirate = super_pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
|
|
1116
1222
|
pirate.treasures_attributes = [{ id: nil }]
|
|
1117
1223
|
assert_equal "from extension", pirate.treasures[0].name
|
|
1118
1224
|
end
|
|
1119
1225
|
end
|
|
1226
|
+
|
|
1227
|
+
class TestNestedAttributesForDelegatedType < ActiveRecord::TestCase
|
|
1228
|
+
setup do
|
|
1229
|
+
Entry.accepts_nested_attributes_for :entryable
|
|
1230
|
+
@entry = Entry.new(entryable_type: "Message", entryable_attributes: { subject: "Hello world!" })
|
|
1231
|
+
end
|
|
1232
|
+
|
|
1233
|
+
def test_should_build_a_new_record_based_on_the_delegated_type
|
|
1234
|
+
assert_not_predicate @entry.entryable, :persisted?
|
|
1235
|
+
assert_equal "Hello world!", @entry.entryable.subject
|
|
1236
|
+
end
|
|
1237
|
+
end
|
|
@@ -138,9 +138,9 @@ class NestedAttributesWithCallbacksTest < ActiveRecord::TestCase
|
|
|
138
138
|
|
|
139
139
|
def assert_assignment_affects_records_in_target(association_name)
|
|
140
140
|
association = @pirate.public_send(association_name)
|
|
141
|
-
|
|
141
|
+
assert_predicate association.detect { |b| b == bird_to_update }, :name_changed?,
|
|
142
142
|
"Update record not updated"
|
|
143
|
-
|
|
143
|
+
assert_predicate association.detect { |b| b == bird_to_destroy }, :marked_for_destruction?,
|
|
144
144
|
"Destroy record not marked for destruction"
|
|
145
145
|
end
|
|
146
146
|
end
|