ibm_db 5.2.0-x86-mingw32 → 5.4.0-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +9 -0
- data/LICENSE +55 -18
- data/README +1 -1
- data/debug.log +1 -0
- data/ext/Makefile +28 -24
- data/ext/ibm_db.c +66 -65
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +26 -24
- data/ext/ruby_ibm_db_cli.c +1 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/ibm_db.rb +3 -1
- data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
- data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
- data/test/activejob/destroy_association_async_test.rb +305 -0
- data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
- data/test/activejob/helper.rb +15 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +432 -218
- data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
- data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
- data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
- data/test/cases/adapters/mysql2/connection_test.rb +48 -50
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
- data/test/cases/adapters/mysql2/enum_test.rb +32 -11
- data/test/cases/adapters/mysql2/explain_test.rb +13 -11
- data/test/cases/adapters/mysql2/json_test.rb +17 -188
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
- data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
- data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
- data/test/cases/adapters/mysql2/schema_test.rb +24 -22
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +10 -8
- data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
- data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
- data/test/cases/adapters/postgresql/array_test.rb +118 -63
- data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
- data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
- data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
- data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
- data/test/cases/adapters/postgresql/citext_test.rb +58 -58
- data/test/cases/adapters/postgresql/collation_test.rb +17 -15
- data/test/cases/adapters/postgresql/composite_test.rb +25 -23
- data/test/cases/adapters/postgresql/connection_test.rb +73 -85
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +9 -7
- data/test/cases/adapters/postgresql/enum_test.rb +12 -10
- data/test/cases/adapters/postgresql/explain_test.rb +10 -8
- data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
- data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
- data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
- data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
- data/test/cases/adapters/postgresql/integer_test.rb +2 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +16 -201
- data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
- data/test/cases/adapters/postgresql/money_test.rb +47 -16
- data/test/cases/adapters/postgresql/network_test.rb +36 -28
- data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
- data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
- data/test/cases/adapters/postgresql/range_test.rb +406 -292
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
- data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
- data/test/cases/adapters/postgresql/schema_test.rb +207 -91
- data/test/cases/adapters/postgresql/serial_test.rb +9 -7
- data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
- data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
- data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
- data/test/cases/adapters/postgresql/utils_test.rb +11 -9
- data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
- data/test/cases/adapters/postgresql/xml_test.rb +10 -14
- data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
- data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
- data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +14 -12
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +153 -86
- data/test/cases/arel/attributes/attribute_test.rb +1145 -0
- data/test/cases/arel/attributes/math_test.rb +83 -0
- data/test/cases/arel/attributes_test.rb +27 -0
- data/test/cases/arel/collectors/bind_test.rb +40 -0
- data/test/cases/arel/collectors/composite_test.rb +47 -0
- data/test/cases/arel/collectors/sql_string_test.rb +41 -0
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
- data/test/cases/arel/crud_test.rb +65 -0
- data/test/cases/arel/delete_manager_test.rb +53 -0
- data/test/cases/arel/factory_methods_test.rb +46 -0
- data/test/cases/arel/helper.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +241 -0
- data/test/cases/arel/nodes/and_test.rb +30 -0
- data/test/cases/arel/nodes/as_test.rb +36 -0
- data/test/cases/arel/nodes/ascending_test.rb +46 -0
- data/test/cases/arel/nodes/bin_test.rb +35 -0
- data/test/cases/arel/nodes/binary_test.rb +29 -0
- data/test/cases/arel/nodes/bind_param_test.rb +22 -0
- data/test/cases/arel/nodes/case_test.rb +96 -0
- data/test/cases/arel/nodes/casted_test.rb +18 -0
- data/test/cases/arel/nodes/comment_test.rb +22 -0
- data/test/cases/arel/nodes/count_test.rb +35 -0
- data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
- data/test/cases/arel/nodes/descending_test.rb +46 -0
- data/test/cases/arel/nodes/distinct_test.rb +21 -0
- data/test/cases/arel/nodes/equality_test.rb +62 -0
- data/test/cases/arel/nodes/extract_test.rb +43 -0
- data/test/cases/arel/nodes/false_test.rb +21 -0
- data/test/cases/arel/nodes/grouping_test.rb +26 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
- data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
- data/test/cases/arel/nodes/named_function_test.rb +48 -0
- data/test/cases/arel/nodes/node_test.rb +22 -0
- data/test/cases/arel/nodes/not_test.rb +31 -0
- data/test/cases/arel/nodes/or_test.rb +36 -0
- data/test/cases/arel/nodes/over_test.rb +69 -0
- data/test/cases/arel/nodes/select_core_test.rb +79 -0
- data/test/cases/arel/nodes/select_statement_test.rb +51 -0
- data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
- data/test/cases/arel/nodes/sum_test.rb +35 -0
- data/test/cases/arel/nodes/table_alias_test.rb +29 -0
- data/test/cases/arel/nodes/true_test.rb +21 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
- data/test/cases/arel/nodes/update_statement_test.rb +60 -0
- data/test/cases/arel/nodes/window_test.rb +81 -0
- data/test/cases/arel/nodes_test.rb +34 -0
- data/test/cases/arel/select_manager_test.rb +1238 -0
- data/test/cases/arel/support/fake_record.rb +135 -0
- data/test/cases/arel/table_test.rb +216 -0
- data/test/cases/arel/update_manager_test.rb +126 -0
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
- data/test/cases/arel/visitors/dot_test.rb +90 -0
- data/test/cases/arel/visitors/mysql_test.rb +157 -0
- data/test/cases/arel/visitors/postgres_test.rb +366 -0
- data/test/cases/arel/visitors/sqlite_test.rb +75 -0
- data/test/cases/arel/visitors/to_sql_test.rb +750 -0
- data/test/cases/associations/belongs_to_associations_test.rb +510 -158
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
- data/test/cases/associations/callbacks_test.rb +56 -38
- data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
- data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
- data/test/cases/associations/eager_singularization_test.rb +21 -21
- data/test/cases/associations/eager_test.rb +559 -415
- data/test/cases/associations/extension_test.rb +18 -12
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
- data/test/cases/associations/has_many_associations_test.rb +1038 -465
- data/test/cases/associations/has_many_through_associations_test.rb +558 -249
- data/test/cases/associations/has_one_associations_test.rb +294 -129
- data/test/cases/associations/has_one_through_associations_test.rb +121 -75
- data/test/cases/associations/inner_join_association_test.rb +114 -38
- data/test/cases/associations/inverse_associations_test.rb +606 -398
- data/test/cases/associations/join_model_test.rb +158 -148
- data/test/cases/associations/left_outer_join_association_test.rb +59 -24
- data/test/cases/associations/nested_through_associations_test.rb +166 -109
- data/test/cases/associations/required_test.rb +35 -10
- data/test/cases/associations_test.rb +241 -110
- data/test/cases/attribute_methods/read_test.rb +11 -11
- data/test/cases/attribute_methods_test.rb +413 -298
- data/test/cases/attributes_test.rb +145 -27
- data/test/cases/autosave_association_test.rb +681 -436
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +599 -542
- data/test/cases/batches_test.rb +288 -82
- data/test/cases/binary_test.rb +26 -31
- data/test/cases/bind_parameter_test.rb +194 -21
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +110 -5
- data/test/cases/calculations_test.rb +740 -177
- data/test/cases/callbacks_test.rb +74 -207
- data/test/cases/clone_test.rb +15 -10
- data/test/cases/coders/json_test.rb +2 -0
- data/test/cases/coders/yaml_column_test.rb +16 -13
- data/test/cases/collection_cache_key_test.rb +177 -20
- data/test/cases/column_alias_test.rb +9 -7
- data/test/cases/column_definition_test.rb +10 -68
- data/test/cases/comment_test.rb +166 -107
- data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
- data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
- data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
- data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
- data/test/cases/connection_management_test.rb +13 -11
- data/test/cases/connection_pool_test.rb +316 -83
- data/test/cases/core_test.rb +82 -58
- data/test/cases/counter_cache_test.rb +204 -50
- data/test/cases/custom_locking_test.rb +5 -3
- data/test/cases/database_configurations/hash_config_test.rb +74 -0
- data/test/cases/database_configurations/resolver_test.rb +150 -0
- data/test/cases/database_configurations_test.rb +145 -0
- data/test/cases/database_selector_test.rb +296 -0
- data/test/cases/database_statements_test.rb +18 -16
- data/test/cases/date_test.rb +8 -16
- data/test/cases/date_time_precision_test.rb +100 -78
- data/test/cases/date_time_test.rb +23 -8
- data/test/cases/defaults_test.rb +106 -71
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +419 -223
- data/test/cases/disconnected_test.rb +6 -6
- data/test/cases/dup_test.rb +54 -27
- data/test/cases/enum_test.rb +461 -82
- data/test/cases/errors_test.rb +7 -7
- data/test/cases/explain_subscriber_test.rb +17 -15
- data/test/cases/explain_test.rb +11 -19
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +14 -14
- data/test/cases/finder_test.rb +669 -287
- data/test/cases/fixture_set/file_test.rb +34 -38
- data/test/cases/fixtures_test.rb +833 -176
- data/test/cases/forbidden_attributes_protection_test.rb +32 -67
- data/test/cases/habtm_destroy_order_test.rb +25 -25
- data/test/cases/helper.rb +78 -49
- data/test/cases/hot_compatibility_test.rb +33 -32
- data/test/cases/i18n_test.rb +18 -17
- data/test/cases/inheritance_test.rb +180 -115
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +119 -31
- data/test/cases/invalid_connection_test.rb +18 -16
- data/test/cases/invertible_migration_test.rb +183 -43
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +57 -58
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +413 -119
- data/test/cases/log_subscriber_test.rb +68 -26
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +118 -72
- data/test/cases/migration/change_table_test.rb +138 -30
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +45 -35
- data/test/cases/migration/column_positioning_test.rb +18 -6
- data/test/cases/migration/columns_test.rb +93 -77
- data/test/cases/migration/command_recorder_test.rb +121 -34
- data/test/cases/migration/compatibility_test.rb +578 -23
- data/test/cases/migration/create_join_table_test.rb +35 -25
- data/test/cases/migration/foreign_key_test.rb +503 -284
- data/test/cases/migration/helper.rb +4 -3
- data/test/cases/migration/index_test.rb +119 -70
- data/test/cases/migration/logger_test.rb +9 -6
- data/test/cases/migration/pending_migrations_test.rb +88 -34
- data/test/cases/migration/references_foreign_key_test.rb +164 -150
- data/test/cases/migration/references_index_test.rb +38 -19
- data/test/cases/migration/references_statements_test.rb +15 -14
- data/test/cases/migration/rename_table_test.rb +53 -30
- data/test/cases/migration_test.rb +637 -269
- data/test/cases/migrator_test.rb +191 -135
- data/test/cases/mixin_test.rb +7 -11
- data/test/cases/modules_test.rb +36 -34
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +60 -33
- data/test/cases/multiple_db_test.rb +16 -22
- data/test/cases/nested_attributes_test.rb +341 -320
- data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +361 -269
- data/test/cases/pooled_connections_test.rb +18 -26
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +210 -104
- data/test/cases/query_cache_test.rb +610 -141
- data/test/cases/quoting_test.rb +132 -31
- data/test/cases/readonly_test.rb +49 -48
- data/test/cases/reaper_test.rb +146 -32
- data/test/cases/reflection_test.rb +167 -156
- data/test/cases/relation/delegation_test.rb +49 -36
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +319 -42
- data/test/cases/relation/mutation_test.rb +55 -93
- data/test/cases/relation/or_test.rb +129 -29
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/record_fetch_warning_test.rb +5 -3
- data/test/cases/relation/select_test.rb +67 -0
- data/test/cases/relation/update_all_test.rb +317 -0
- data/test/cases/relation/where_chain_test.rb +68 -32
- data/test/cases/relation/where_clause_test.rb +136 -61
- data/test/cases/relation/where_test.rb +155 -48
- data/test/cases/relation_test.rb +266 -112
- data/test/cases/relations_test.rb +969 -744
- data/test/cases/reload_models_test.rb +13 -9
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +68 -17
- data/test/cases/sanitize_test.rb +87 -71
- data/test/cases/schema_dumper_test.rb +221 -128
- data/test/cases/schema_loading_test.rb +3 -2
- data/test/cases/scoping/default_scoping_test.rb +185 -144
- data/test/cases/scoping/named_scoping_test.rb +177 -89
- data/test/cases/scoping/relation_scoping_test.rb +197 -75
- data/test/cases/secure_token_test.rb +18 -3
- data/test/cases/serialization_test.rb +30 -28
- data/test/cases/serialized_attribute_test.rb +133 -42
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +41 -24
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +180 -55
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +26 -12
- data/test/cases/tasks/database_tasks_test.rb +1258 -194
- data/test/cases/tasks/mysql_rake_test.rb +370 -298
- data/test/cases/tasks/postgresql_rake_test.rb +481 -251
- data/test/cases/tasks/sqlite_rake_test.rb +225 -178
- data/test/cases/test_case.rb +51 -40
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +79 -19
- data/test/cases/time_precision_test.rb +98 -76
- data/test/cases/timestamp_test.rb +102 -99
- data/test/cases/touch_later_test.rb +12 -10
- data/test/cases/transaction_callbacks_test.rb +344 -90
- data/test/cases/transaction_isolation_test.rb +12 -12
- data/test/cases/transactions_test.rb +612 -162
- data/test/cases/type/adapter_specific_registry_test.rb +14 -2
- data/test/cases/type/date_time_test.rb +4 -2
- data/test/cases/type/integer_test.rb +4 -2
- data/test/cases/type/string_test.rb +10 -8
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +29 -28
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +2 -0
- data/test/cases/types_test.rb +3 -1
- data/test/cases/unconnected_test.rb +14 -1
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +19 -17
- data/test/cases/validations/association_validation_test.rb +30 -28
- data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
- data/test/cases/validations/i18n_validation_test.rb +22 -21
- data/test/cases/validations/length_validation_test.rb +34 -33
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +21 -19
- data/test/cases/validations/uniqueness_validation_test.rb +156 -86
- data/test/cases/validations_repair_helper.rb +2 -0
- data/test/cases/validations_test.rb +61 -26
- data/test/cases/view_test.rb +122 -116
- data/test/cases/yaml_serialization_test.rb +79 -34
- data/test/config.example.yml +19 -19
- data/test/config.rb +3 -1
- data/test/config.yml +16 -6
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/author_addresses.yml +1 -8
- data/test/fixtures/authors.yml +1 -7
- data/test/fixtures/binaries.yml +4 -0
- data/test/fixtures/books.yml +9 -2
- data/test/fixtures/categories_posts.yml +3 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/comments.yml +7 -0
- data/test/fixtures/companies.yml +5 -0
- data/test/fixtures/computers.yml +2 -0
- data/test/fixtures/customers.yml +10 -1
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/essays.yml +10 -0
- data/test/fixtures/faces.yml +3 -3
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +7 -7
- data/test/fixtures/memberships.yml +7 -0
- data/test/fixtures/minimalistics.yml +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +2 -2
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +1 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_posts.yml +1 -0
- data/test/fixtures/parrots.yml +7 -1
- data/test/fixtures/pirates.yml +3 -0
- data/test/fixtures/posts.yml +11 -3
- data/test/fixtures/readers.yml +6 -0
- data/test/fixtures/reserved_words/values.yml +2 -2
- data/test/fixtures/sponsors.yml +3 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/subscribers.yml +1 -1
- data/test/fixtures/tasks.yml +1 -1
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +2 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
- data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
- data/test/migrations/missing/1_people_have_last_names.rb +2 -0
- data/test/migrations/missing/3_we_need_reminders.rb +2 -0
- data/test/migrations/missing/4_innocent_jointable.rb +3 -1
- data/test/migrations/rename/1_we_need_things.rb +2 -0
- data/test/migrations/rename/2_rename_things.rb +2 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy2/1_create_articles.rb +2 -0
- data/test/migrations/to_copy2/2_create_comments.rb +3 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +3 -1
- data/test/models/admin/randomly_named_c1.rb +2 -0
- data/test/models/admin/user.rb +16 -8
- data/test/models/admin.rb +4 -2
- data/test/models/aircraft.rb +3 -1
- data/test/models/arunit2_model.rb +2 -0
- data/test/models/author.rb +153 -102
- data/test/models/auto_id.rb +2 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +3 -1
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +13 -1
- data/test/models/book.rb +14 -4
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +5 -0
- data/test/models/bulb.rb +13 -4
- data/test/models/cake_designer.rb +2 -0
- data/test/models/car.rb +17 -10
- data/test/models/carrier.rb +2 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +2 -0
- data/test/models/categorization.rb +8 -6
- data/test/models/category.rb +28 -16
- data/test/models/chef.rb +2 -0
- data/test/models/citation.rb +5 -1
- data/test/models/club.rb +13 -10
- data/test/models/college.rb +4 -2
- data/test/models/column.rb +2 -0
- data/test/models/column_name.rb +2 -0
- data/test/models/comment.rb +32 -10
- data/test/models/company.rb +102 -106
- data/test/models/company_in_module.rb +27 -26
- data/test/models/computer.rb +3 -1
- data/test/models/contact.rb +15 -13
- data/test/models/content.rb +5 -3
- data/test/models/contract.rb +21 -3
- data/test/models/country.rb +2 -4
- data/test/models/course.rb +3 -1
- data/test/models/customer.rb +10 -8
- data/test/models/customer_carrier.rb +2 -0
- data/test/models/dashboard.rb +2 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +2 -0
- data/test/models/destroy_async_parent.rb +15 -0
- data/test/models/destroy_async_parent_soft_delete.rb +20 -0
- data/test/models/developer.rb +152 -85
- data/test/models/dl_keyed_belongs_to.rb +13 -0
- data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
- data/test/models/dl_keyed_has_many.rb +5 -0
- data/test/models/dl_keyed_has_many_through.rb +5 -0
- data/test/models/dl_keyed_has_one.rb +5 -0
- data/test/models/dl_keyed_join.rb +10 -0
- data/test/models/dog.rb +2 -0
- data/test/models/dog_lover.rb +2 -0
- data/test/models/doubloon.rb +3 -1
- data/test/models/drink_designer.rb +17 -0
- data/test/models/edge.rb +4 -2
- data/test/models/electron.rb +2 -0
- data/test/models/engine.rb +3 -2
- data/test/models/entrant.rb +2 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -3
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +3 -1
- data/test/models/eye.rb +5 -3
- data/test/models/face.rb +14 -6
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +5 -3
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +3 -1
- data/test/models/guitar.rb +2 -0
- data/test/models/hotel.rb +5 -3
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +3 -1
- data/test/models/interest.rb +14 -3
- data/test/models/invoice.rb +4 -2
- data/test/models/item.rb +3 -1
- data/test/models/job.rb +5 -3
- data/test/models/joke.rb +4 -2
- data/test/models/keyboard.rb +3 -1
- data/test/models/legacy_thing.rb +2 -0
- data/test/models/lesson.rb +2 -0
- data/test/models/line_item.rb +3 -1
- data/test/models/liquid.rb +2 -0
- data/test/models/matey.rb +3 -1
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +23 -20
- data/test/models/member_detail.rb +3 -0
- data/test/models/member_type.rb +2 -0
- data/test/models/membership.rb +4 -1
- data/test/models/mentor.rb +3 -1
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +3 -2
- data/test/models/mixed_case_monkey.rb +3 -1
- data/test/models/molecule.rb +2 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +2 -0
- data/test/models/node.rb +4 -2
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +2 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +4 -2
- data/test/models/organization.rb +9 -7
- data/test/models/other_dog.rb +3 -1
- data/test/models/owner.rb +6 -4
- data/test/models/parrot.rb +12 -4
- data/test/models/person.rb +59 -54
- data/test/models/personal_legacy_thing.rb +3 -1
- data/test/models/pet.rb +4 -2
- data/test/models/pet_treasure.rb +2 -0
- data/test/models/pirate.rb +67 -43
- data/test/models/possession.rb +3 -1
- data/test/models/post.rb +184 -86
- data/test/models/price_estimate.rb +11 -1
- data/test/models/professor.rb +3 -1
- data/test/models/project.rb +14 -12
- data/test/models/publisher/article.rb +2 -0
- data/test/models/publisher/magazine.rb +2 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/randomly_named_c1.rb +2 -0
- data/test/models/rating.rb +5 -1
- data/test/models/reader.rb +7 -5
- data/test/models/recipe.rb +2 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +6 -3
- data/test/models/reply.rb +39 -21
- data/test/models/room.rb +6 -0
- data/test/models/section.rb +6 -0
- data/test/models/seminar.rb +6 -0
- data/test/models/session.rb +6 -0
- data/test/models/ship.rb +12 -9
- data/test/models/ship_part.rb +5 -3
- data/test/models/shop.rb +4 -2
- data/test/models/shop_account.rb +2 -0
- data/test/models/speedometer.rb +2 -0
- data/test/models/sponsor.rb +8 -5
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +2 -0
- data/test/models/student.rb +2 -0
- data/test/models/subscriber.rb +4 -2
- data/test/models/subscription.rb +5 -1
- data/test/models/tag.rb +6 -3
- data/test/models/tagging.rb +13 -6
- data/test/models/task.rb +2 -0
- data/test/models/topic.rb +54 -19
- data/test/models/toy.rb +4 -0
- data/test/models/traffic_light.rb +2 -0
- data/test/models/treasure.rb +5 -3
- data/test/models/treaty.rb +2 -4
- data/test/models/tree.rb +2 -0
- data/test/models/tuning_peg.rb +2 -0
- data/test/models/tyre.rb +2 -0
- data/test/models/user.rb +12 -4
- data/test/models/uuid_child.rb +2 -0
- data/test/models/uuid_item.rb +2 -0
- data/test/models/uuid_parent.rb +2 -0
- data/test/models/vegetables.rb +12 -3
- data/test/models/vertex.rb +6 -4
- data/test/models/warehouse_thing.rb +2 -0
- data/test/models/wheel.rb +3 -1
- data/test/models/without_table.rb +3 -1
- data/test/models/zine.rb +3 -1
- data/test/schema/mysql2_specific_schema.rb +49 -35
- data/test/schema/oracle_specific_schema.rb +13 -15
- data/test/schema/postgresql_specific_schema.rb +51 -40
- data/test/schema/schema.rb +334 -154
- data/test/schema/sqlite_specific_schema.rb +9 -16
- data/test/support/config.rb +26 -26
- data/test/support/connection.rb +14 -8
- data/test/support/connection_helper.rb +3 -1
- data/test/support/ddl_helper.rb +2 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
- data/test/support/schema_dumping_helper.rb +2 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +192 -14
@@ -1,16 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/person"
|
5
|
+
require "models/traffic_light"
|
6
|
+
require "models/post"
|
7
|
+
require "models/binary_field"
|
8
8
|
|
9
9
|
class SerializedAttributeTest < ActiveRecord::TestCase
|
10
10
|
fixtures :topics, :posts
|
11
11
|
|
12
12
|
MyObject = Struct.new :attribute1, :attribute2
|
13
13
|
|
14
|
+
class Topic < ActiveRecord::Base
|
15
|
+
serialize :content
|
16
|
+
end
|
17
|
+
|
18
|
+
class ImportantTopic < Topic
|
19
|
+
serialize :important, Hash
|
20
|
+
end
|
21
|
+
|
14
22
|
teardown do
|
15
23
|
Topic.serialize("content")
|
16
24
|
end
|
@@ -25,7 +33,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
25
33
|
def test_serialized_attribute
|
26
34
|
Topic.serialize("content", MyObject)
|
27
35
|
|
28
|
-
myobj = MyObject.new(
|
36
|
+
myobj = MyObject.new("value1", "value2")
|
29
37
|
topic = Topic.create("content" => myobj)
|
30
38
|
assert_equal(myobj, topic.content)
|
31
39
|
|
@@ -33,10 +41,31 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
33
41
|
assert_equal(myobj, topic.content)
|
34
42
|
end
|
35
43
|
|
44
|
+
def test_serialized_attribute_with_default
|
45
|
+
klass = Class.new(ActiveRecord::Base) do
|
46
|
+
self.table_name = Topic.table_name
|
47
|
+
serialize(:content, Hash, default: { key: "value" })
|
48
|
+
end
|
49
|
+
|
50
|
+
t = klass.new
|
51
|
+
assert_equal({ key: "value" }, t.content)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_serialized_attribute_on_custom_attribute_with_default
|
55
|
+
klass = Class.new(ActiveRecord::Base) do
|
56
|
+
self.table_name = Topic.table_name
|
57
|
+
attribute :content, default: { key: "value" }
|
58
|
+
serialize :content, Hash
|
59
|
+
end
|
60
|
+
|
61
|
+
t = klass.new
|
62
|
+
assert_equal({ key: "value" }, t.content)
|
63
|
+
end
|
64
|
+
|
36
65
|
def test_serialized_attribute_in_base_class
|
37
66
|
Topic.serialize("content", Hash)
|
38
67
|
|
39
|
-
hash = {
|
68
|
+
hash = { "content1" => "value1", "content2" => "value2" }
|
40
69
|
important_topic = ImportantTopic.create("content" => hash)
|
41
70
|
assert_equal(hash, important_topic.content)
|
42
71
|
|
@@ -47,10 +76,10 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
47
76
|
def test_serialized_attributes_from_database_on_subclass
|
48
77
|
Topic.serialize :content, Hash
|
49
78
|
|
50
|
-
t =
|
79
|
+
t = ImportantTopic.new(content: { foo: :bar })
|
51
80
|
assert_equal({ foo: :bar }, t.content)
|
52
81
|
t.save!
|
53
|
-
t =
|
82
|
+
t = ImportantTopic.last
|
54
83
|
assert_equal({ foo: :bar }, t.content)
|
55
84
|
end
|
56
85
|
|
@@ -97,7 +126,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
97
126
|
end
|
98
127
|
|
99
128
|
def test_serialized_attribute_declared_in_subclass
|
100
|
-
hash = {
|
129
|
+
hash = { "important1" => "value1", "important2" => "value2" }
|
101
130
|
important_topic = ImportantTopic.create("important" => hash)
|
102
131
|
assert_equal(hash, important_topic.important)
|
103
132
|
|
@@ -107,7 +136,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
107
136
|
end
|
108
137
|
|
109
138
|
def test_serialized_time_attribute
|
110
|
-
myobj = Time.local(2008,1,1,1,0)
|
139
|
+
myobj = Time.local(2008, 1, 1, 1, 0)
|
111
140
|
topic = Topic.create("content" => myobj).reload
|
112
141
|
assert_equal(myobj, topic.content)
|
113
142
|
end
|
@@ -124,26 +153,26 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
124
153
|
end
|
125
154
|
|
126
155
|
def test_nil_not_serialized_without_class_constraint
|
127
|
-
assert Topic.new(:
|
128
|
-
assert_equal 1, Topic.where(:
|
156
|
+
assert Topic.new(content: nil).save
|
157
|
+
assert_equal 1, Topic.where(content: nil).count
|
129
158
|
end
|
130
159
|
|
131
160
|
def test_nil_not_serialized_with_class_constraint
|
132
161
|
Topic.serialize :content, Hash
|
133
|
-
assert Topic.new(:
|
134
|
-
assert_equal 1, Topic.where(:
|
162
|
+
assert Topic.new(content: nil).save
|
163
|
+
assert_equal 1, Topic.where(content: nil).count
|
135
164
|
end
|
136
165
|
|
137
166
|
def test_serialized_attribute_should_raise_exception_on_assignment_with_wrong_type
|
138
167
|
Topic.serialize(:content, Hash)
|
139
168
|
assert_raise(ActiveRecord::SerializationTypeMismatch) do
|
140
|
-
Topic.new(content:
|
169
|
+
Topic.new(content: "string")
|
141
170
|
end
|
142
171
|
end
|
143
172
|
|
144
173
|
def test_should_raise_exception_on_serialized_attribute_with_type_mismatch
|
145
|
-
myobj = MyObject.new(
|
146
|
-
topic = Topic.new(:
|
174
|
+
myobj = MyObject.new("value1", "value2")
|
175
|
+
topic = Topic.new(content: myobj)
|
147
176
|
assert topic.save
|
148
177
|
Topic.serialize(:content, Hash)
|
149
178
|
assert_raise(ActiveRecord::SerializationTypeMismatch) { Topic.find(topic.id).content }
|
@@ -152,11 +181,32 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
152
181
|
def test_serialized_attribute_with_class_constraint
|
153
182
|
settings = { "color" => "blue" }
|
154
183
|
Topic.serialize(:content, Hash)
|
155
|
-
topic = Topic.new(:
|
184
|
+
topic = Topic.new(content: settings)
|
156
185
|
assert topic.save
|
157
186
|
assert_equal(settings, Topic.find(topic.id).content)
|
158
187
|
end
|
159
188
|
|
189
|
+
def test_where_by_serialized_attribute_with_array
|
190
|
+
settings = [ "color" => "green" ]
|
191
|
+
Topic.serialize(:content, Array)
|
192
|
+
topic = Topic.create!(content: settings)
|
193
|
+
assert_equal topic, Topic.where(content: settings).take
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_where_by_serialized_attribute_with_hash
|
197
|
+
settings = { "color" => "green" }
|
198
|
+
Topic.serialize(:content, Hash)
|
199
|
+
topic = Topic.create!(content: settings)
|
200
|
+
assert_equal topic, Topic.where(content: settings).take
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_where_by_serialized_attribute_with_hash_in_array
|
204
|
+
settings = { "color" => "green" }
|
205
|
+
Topic.serialize(:content, Hash)
|
206
|
+
topic = Topic.create!(content: settings)
|
207
|
+
assert_equal topic, Topic.where(content: [settings]).take
|
208
|
+
end
|
209
|
+
|
160
210
|
def test_serialized_default_class
|
161
211
|
Topic.serialize(:content, Hash)
|
162
212
|
topic = Topic.new
|
@@ -175,17 +225,17 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
175
225
|
end
|
176
226
|
|
177
227
|
def test_serialized_boolean_value_true
|
178
|
-
topic = Topic.new(:
|
228
|
+
topic = Topic.new(content: true)
|
179
229
|
assert topic.save
|
180
230
|
topic = topic.reload
|
181
|
-
assert_equal topic.content
|
231
|
+
assert_equal true, topic.content
|
182
232
|
end
|
183
233
|
|
184
234
|
def test_serialized_boolean_value_false
|
185
|
-
topic = Topic.new(:
|
235
|
+
topic = Topic.new(content: false)
|
186
236
|
assert topic.save
|
187
237
|
topic = topic.reload
|
188
|
-
assert_equal topic.content
|
238
|
+
assert_equal false, topic.content
|
189
239
|
end
|
190
240
|
|
191
241
|
def test_serialize_with_coder
|
@@ -200,18 +250,18 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
200
250
|
end
|
201
251
|
|
202
252
|
Topic.serialize(:content, some_class)
|
203
|
-
topic = Topic.new(:
|
253
|
+
topic = Topic.new(content: some_class.new("my value"))
|
204
254
|
topic.save!
|
205
255
|
topic.reload
|
206
256
|
assert_kind_of some_class, topic.content
|
207
|
-
assert_equal
|
257
|
+
assert_equal some_class.new("my value"), topic.content
|
208
258
|
end
|
209
259
|
|
210
260
|
def test_serialize_attribute_via_select_method_when_time_zone_available
|
211
261
|
with_timezone_config aware_attributes: true do
|
212
262
|
Topic.serialize(:content, MyObject)
|
213
263
|
|
214
|
-
myobj = MyObject.new(
|
264
|
+
myobj = MyObject.new("value1", "value2")
|
215
265
|
topic = Topic.create(content: myobj)
|
216
266
|
|
217
267
|
assert_equal(myobj, Topic.select(:content).find(topic.id).content)
|
@@ -220,8 +270,8 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
220
270
|
end
|
221
271
|
|
222
272
|
def test_serialize_attribute_can_be_serialized_in_an_integer_column
|
223
|
-
insures = [
|
224
|
-
person = SerializedPerson.new(first_name:
|
273
|
+
insures = ["life"]
|
274
|
+
person = SerializedPerson.new(first_name: "David", insures: insures)
|
225
275
|
assert person.save
|
226
276
|
person = person.reload
|
227
277
|
assert_equal(insures, person.insures)
|
@@ -233,6 +283,20 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
233
283
|
assert_equal [], light.long_state
|
234
284
|
end
|
235
285
|
|
286
|
+
def test_unexpected_serialized_type
|
287
|
+
Topic.serialize :content, Hash
|
288
|
+
topic = Topic.create!(content: { zomg: true })
|
289
|
+
|
290
|
+
Topic.serialize :content, Array
|
291
|
+
|
292
|
+
topic.reload
|
293
|
+
error = assert_raise(ActiveRecord::SerializationTypeMismatch) do
|
294
|
+
topic.content
|
295
|
+
end
|
296
|
+
expected = "can't load `content`: was supposed to be a Array, but was a Hash. -- {:zomg=>true}"
|
297
|
+
assert_equal expected, error.to_s
|
298
|
+
end
|
299
|
+
|
236
300
|
def test_serialized_column_should_unserialize_after_update_column
|
237
301
|
t = Topic.create(content: "first")
|
238
302
|
assert_equal("first", t.content)
|
@@ -256,7 +320,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
256
320
|
|
257
321
|
topic = Topic.new(content: nil)
|
258
322
|
|
259
|
-
|
323
|
+
assert_not_predicate topic, :content_changed?
|
260
324
|
end
|
261
325
|
|
262
326
|
def test_classes_without_no_arg_constructors_are_not_supported
|
@@ -275,6 +339,38 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
275
339
|
assert_equal({}, topic.content)
|
276
340
|
end
|
277
341
|
|
342
|
+
if current_adapter?(:Mysql2Adapter)
|
343
|
+
def test_is_not_changed_when_stored_in_mysql_blob
|
344
|
+
value = %w(Fée)
|
345
|
+
model = BinaryField.create!(normal_blob: value, normal_text: value)
|
346
|
+
model.reload
|
347
|
+
|
348
|
+
model.normal_text = value
|
349
|
+
assert_not_predicate model, :normal_text_changed?
|
350
|
+
|
351
|
+
model.normal_blob = value
|
352
|
+
assert_not_predicate model, :normal_blob_changed?
|
353
|
+
end
|
354
|
+
|
355
|
+
class FrozenBinaryField < BinaryField
|
356
|
+
class FrozenCoder < ActiveRecord::Coders::YAMLColumn
|
357
|
+
def dump(obj)
|
358
|
+
super&.freeze
|
359
|
+
end
|
360
|
+
end
|
361
|
+
serialize :normal_blob, FrozenCoder.new(:normal_blob, Array)
|
362
|
+
end
|
363
|
+
|
364
|
+
def test_is_not_changed_when_stored_in_mysql_blob_frozen_payload
|
365
|
+
value = %w(Fée)
|
366
|
+
model = FrozenBinaryField.create!(normal_blob: value, normal_text: value)
|
367
|
+
model.reload
|
368
|
+
|
369
|
+
model.normal_blob = value
|
370
|
+
assert_not_predicate model, :normal_blob_changed?
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
278
374
|
def test_values_cast_from_nil_are_persisted_as_nil
|
279
375
|
# This is required to fulfil the following contract, which must be universally
|
280
376
|
# true in Active Record:
|
@@ -285,7 +381,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
285
381
|
topic = Topic.create!(content: {})
|
286
382
|
topic2 = Topic.create!(content: nil)
|
287
383
|
|
288
|
-
assert_equal [topic, topic2], Topic.where(content: nil)
|
384
|
+
assert_equal [topic, topic2], Topic.where(content: nil).sort_by(&:id)
|
289
385
|
end
|
290
386
|
|
291
387
|
def test_nil_is_always_persisted_as_null
|
@@ -326,18 +422,13 @@ class SerializedAttributeTest < ActiveRecord::TestCase
|
|
326
422
|
|
327
423
|
topic = model.create!(foo: "bar")
|
328
424
|
topic.foo
|
329
|
-
|
425
|
+
assert_not_predicate topic, :changed?
|
330
426
|
end
|
331
|
-
end
|
332
|
-
|
333
|
-
class ThreadedSerializedAttributeTest < ActiveRecord::TestCase
|
334
|
-
self.use_transactional_tests = false
|
335
|
-
fixtures :topics
|
336
427
|
|
337
428
|
def test_serialized_attribute_works_under_concurrent_initial_access
|
338
|
-
model = Topic
|
429
|
+
model = Class.new(Topic)
|
339
430
|
|
340
|
-
topic = model.
|
431
|
+
topic = model.create!
|
341
432
|
topic.update group: "1"
|
342
433
|
|
343
434
|
model.serialize :group, JSON
|
@@ -345,9 +436,9 @@ class ThreadedSerializedAttributeTest < ActiveRecord::TestCase
|
|
345
436
|
|
346
437
|
# This isn't strictly necessary for the test, but a little bit of
|
347
438
|
# knowledge of internals allows us to make failures far more likely.
|
348
|
-
model.define_singleton_method(:define_attribute) do |*args|
|
439
|
+
model.define_singleton_method(:define_attribute) do |*args, **options|
|
349
440
|
Thread.pass
|
350
|
-
super(*args)
|
441
|
+
super(*args, **options)
|
351
442
|
end
|
352
443
|
|
353
444
|
threads = 4.times.map do
|
@@ -0,0 +1,168 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/account"
|
5
|
+
require "models/company"
|
6
|
+
require "models/toy"
|
7
|
+
require "models/matey"
|
8
|
+
|
9
|
+
SIGNED_ID_VERIFIER_TEST_SECRET = -> { "This is normally set by the railtie initializer when used with Rails!" }
|
10
|
+
|
11
|
+
ActiveRecord::Base.signed_id_verifier_secret = SIGNED_ID_VERIFIER_TEST_SECRET
|
12
|
+
|
13
|
+
class SignedIdTest < ActiveRecord::TestCase
|
14
|
+
fixtures :accounts, :toys, :companies
|
15
|
+
|
16
|
+
setup do
|
17
|
+
@account = Account.first
|
18
|
+
@toy = Toy.first
|
19
|
+
end
|
20
|
+
|
21
|
+
test "find signed record" do
|
22
|
+
assert_equal @account, Account.find_signed(@account.signed_id)
|
23
|
+
end
|
24
|
+
|
25
|
+
test "find signed record on relation" do
|
26
|
+
assert_equal @account, Account.where("1=1").find_signed(@account.signed_id)
|
27
|
+
|
28
|
+
assert_nil Account.where("1=0").find_signed(@account.signed_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
test "find signed record with custom primary key" do
|
32
|
+
assert_equal @toy, Toy.find_signed(@toy.signed_id)
|
33
|
+
end
|
34
|
+
|
35
|
+
test "find signed record for single table inheritance (STI Models)" do
|
36
|
+
assert_equal Company.first, Company.find_signed(Company.first.signed_id)
|
37
|
+
end
|
38
|
+
|
39
|
+
test "find signed record raises UnknownPrimaryKey when a model has no primary key" do
|
40
|
+
error = assert_raises(ActiveRecord::UnknownPrimaryKey) do
|
41
|
+
Matey.find_signed("this will not be even verified")
|
42
|
+
end
|
43
|
+
assert_equal "Unknown primary key for table mateys in model Matey.", error.message
|
44
|
+
end
|
45
|
+
|
46
|
+
test "find signed record with a bang" do
|
47
|
+
assert_equal @account, Account.find_signed!(@account.signed_id)
|
48
|
+
end
|
49
|
+
|
50
|
+
test "find signed record with a bang on relation" do
|
51
|
+
assert_equal @account, Account.where("1=1").find_signed!(@account.signed_id)
|
52
|
+
|
53
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
54
|
+
Account.where("1=0").find_signed!(@account.signed_id)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
test "find signed record with a bang with custom primary key" do
|
59
|
+
assert_equal @toy, Toy.find_signed!(@toy.signed_id)
|
60
|
+
end
|
61
|
+
|
62
|
+
test "find signed record with a bang for single table inheritance (STI Models)" do
|
63
|
+
assert_equal Company.first, Company.find_signed!(Company.first.signed_id)
|
64
|
+
end
|
65
|
+
|
66
|
+
test "fail to find record from broken signed id" do
|
67
|
+
assert_nil Account.find_signed("this won't find anything")
|
68
|
+
end
|
69
|
+
|
70
|
+
test "find signed record within expiration date" do
|
71
|
+
assert_equal @account, Account.find_signed(@account.signed_id(expires_in: 1.minute))
|
72
|
+
end
|
73
|
+
|
74
|
+
test "fail to find signed record within expiration date" do
|
75
|
+
signed_id = @account.signed_id(expires_in: 1.minute)
|
76
|
+
travel 2.minutes
|
77
|
+
assert_nil Account.find_signed(signed_id)
|
78
|
+
end
|
79
|
+
|
80
|
+
test "fail to find record from that has since been destroyed" do
|
81
|
+
signed_id = @account.signed_id(expires_in: 1.minute)
|
82
|
+
@account.destroy
|
83
|
+
assert_nil Account.find_signed signed_id
|
84
|
+
end
|
85
|
+
|
86
|
+
test "find signed record with purpose" do
|
87
|
+
assert_equal @account, Account.find_signed(@account.signed_id(purpose: :v1), purpose: :v1)
|
88
|
+
end
|
89
|
+
|
90
|
+
test "fail to find signed record with purpose" do
|
91
|
+
assert_nil Account.find_signed(@account.signed_id(purpose: :v1))
|
92
|
+
|
93
|
+
assert_nil Account.find_signed(@account.signed_id(purpose: :v1), purpose: :v2)
|
94
|
+
end
|
95
|
+
|
96
|
+
test "finding record from broken signed id raises on the bang" do
|
97
|
+
assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
|
98
|
+
Account.find_signed! "this will blow up"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
test "find signed record with a bang within expiration date" do
|
103
|
+
assert_equal @account, Account.find_signed!(@account.signed_id(expires_in: 1.minute))
|
104
|
+
end
|
105
|
+
|
106
|
+
test "finding signed record outside expiration date raises on the bang" do
|
107
|
+
signed_id = @account.signed_id(expires_in: 1.minute)
|
108
|
+
travel 2.minutes
|
109
|
+
|
110
|
+
assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
|
111
|
+
Account.find_signed!(signed_id)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
test "finding signed record that has been destroyed raises on the bang" do
|
116
|
+
signed_id = @account.signed_id(expires_in: 1.minute)
|
117
|
+
@account.destroy
|
118
|
+
|
119
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
120
|
+
Account.find_signed!(signed_id)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
test "find signed record with bang with purpose" do
|
125
|
+
assert_equal @account, Account.find_signed!(@account.signed_id(purpose: :v1), purpose: :v1)
|
126
|
+
end
|
127
|
+
|
128
|
+
test "find signed record with bang with purpose raises" do
|
129
|
+
assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
|
130
|
+
Account.find_signed!(@account.signed_id(purpose: :v1))
|
131
|
+
end
|
132
|
+
|
133
|
+
assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
|
134
|
+
Account.find_signed!(@account.signed_id(purpose: :v1), purpose: :v2)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
test "fail to work without a signed_id_verifier_secret" do
|
139
|
+
ActiveRecord::Base.signed_id_verifier_secret = nil
|
140
|
+
Account.instance_variable_set :@signed_id_verifier, nil
|
141
|
+
|
142
|
+
assert_raises(ArgumentError) do
|
143
|
+
@account.signed_id
|
144
|
+
end
|
145
|
+
ensure
|
146
|
+
ActiveRecord::Base.signed_id_verifier_secret = SIGNED_ID_VERIFIER_TEST_SECRET
|
147
|
+
end
|
148
|
+
|
149
|
+
test "fail to work without when signed_id_verifier_secret lambda is nil" do
|
150
|
+
ActiveRecord::Base.signed_id_verifier_secret = -> { nil }
|
151
|
+
Account.instance_variable_set :@signed_id_verifier, nil
|
152
|
+
|
153
|
+
assert_raises(ArgumentError) do
|
154
|
+
@account.signed_id
|
155
|
+
end
|
156
|
+
ensure
|
157
|
+
ActiveRecord::Base.signed_id_verifier_secret = SIGNED_ID_VERIFIER_TEST_SECRET
|
158
|
+
end
|
159
|
+
|
160
|
+
test "use a custom verifier" do
|
161
|
+
old_verifier = Account.signed_id_verifier
|
162
|
+
Account.signed_id_verifier = ActiveSupport::MessageVerifier.new("sekret")
|
163
|
+
assert_not_equal ActiveRecord::Base.signed_id_verifier, Account.signed_id_verifier
|
164
|
+
assert_equal @account, Account.find_signed(@account.signed_id)
|
165
|
+
ensure
|
166
|
+
Account.signed_id_verifier = old_verifier
|
167
|
+
end
|
168
|
+
end
|
@@ -1,8 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/book"
|
5
|
+
require "models/liquid"
|
6
|
+
require "models/molecule"
|
7
|
+
require "models/numeric_data"
|
8
|
+
require "models/electron"
|
6
9
|
|
7
10
|
module ActiveRecord
|
8
11
|
class StatementCacheTest < ActiveRecord::TestCase
|
@@ -10,22 +13,20 @@ module ActiveRecord
|
|
10
13
|
@connection = ActiveRecord::Base.connection
|
11
14
|
end
|
12
15
|
|
13
|
-
#Cache v 1.1 tests
|
14
16
|
def test_statement_cache
|
15
17
|
Book.create(name: "my book")
|
16
18
|
Book.create(name: "my other book")
|
17
19
|
|
18
20
|
cache = StatementCache.create(Book.connection) do |params|
|
19
|
-
Book.where(:
|
21
|
+
Book.where(name: params.bind)
|
20
22
|
end
|
21
23
|
|
22
|
-
b = cache.execute([ "my book" ], Book
|
24
|
+
b = cache.execute([ "my book" ], Book.connection)
|
23
25
|
assert_equal "my book", b[0].name
|
24
|
-
b = cache.execute([ "my other book" ], Book
|
26
|
+
b = cache.execute([ "my other book" ], Book.connection)
|
25
27
|
assert_equal "my other book", b[0].name
|
26
28
|
end
|
27
29
|
|
28
|
-
|
29
30
|
def test_statement_cache_id
|
30
31
|
b1 = Book.create(name: "my book")
|
31
32
|
b2 = Book.create(name: "my other book")
|
@@ -34,9 +35,9 @@ module ActiveRecord
|
|
34
35
|
Book.where(id: params.bind)
|
35
36
|
end
|
36
37
|
|
37
|
-
b = cache.execute([ b1.id ], Book
|
38
|
+
b = cache.execute([ b1.id ], Book.connection)
|
38
39
|
assert_equal b1.name, b[0].name
|
39
|
-
b = cache.execute([ b2.id ], Book
|
40
|
+
b = cache.execute([ b2.id ], Book.connection)
|
40
41
|
assert_equal b2.name, b[0].name
|
41
42
|
end
|
42
43
|
|
@@ -50,8 +51,6 @@ module ActiveRecord
|
|
50
51
|
assert_equal("my other book", b.name)
|
51
52
|
end
|
52
53
|
|
53
|
-
#End
|
54
|
-
|
55
54
|
def test_statement_cache_with_simple_statement
|
56
55
|
cache = ActiveRecord::StatementCache.create(Book.connection) do |params|
|
57
56
|
Book.where(name: "my book").where("author_id > 3")
|
@@ -59,23 +58,28 @@ module ActiveRecord
|
|
59
58
|
|
60
59
|
Book.create(name: "my book", author_id: 4)
|
61
60
|
|
62
|
-
books = cache.execute([], Book
|
61
|
+
books = cache.execute([], Book.connection)
|
63
62
|
assert_equal "my book", books[0].name
|
64
63
|
end
|
65
64
|
|
66
65
|
def test_statement_cache_with_complex_statement
|
67
66
|
cache = ActiveRecord::StatementCache.create(Book.connection) do |params|
|
68
|
-
Liquid.joins(:
|
67
|
+
Liquid.joins(molecules: :electrons).where("molecules.name" => "dioxane", "electrons.name" => "lepton")
|
69
68
|
end
|
70
69
|
|
71
|
-
salty = Liquid.create(name:
|
72
|
-
molecule = salty.molecules.create(name:
|
73
|
-
molecule.electrons.create(name:
|
70
|
+
salty = Liquid.create(name: "salty")
|
71
|
+
molecule = salty.molecules.create(name: "dioxane")
|
72
|
+
molecule.electrons.create(name: "lepton")
|
74
73
|
|
75
|
-
liquids = cache.execute([], Book
|
74
|
+
liquids = cache.execute([], Book.connection)
|
76
75
|
assert_equal "salty", liquids[0].name
|
77
76
|
end
|
78
77
|
|
78
|
+
def test_statement_cache_with_strictly_cast_attribute
|
79
|
+
row = NumericData.create(temperature: 1.5)
|
80
|
+
assert_equal row, NumericData.find_by(temperature: 1.5)
|
81
|
+
end
|
82
|
+
|
79
83
|
def test_statement_cache_values_differ
|
80
84
|
cache = ActiveRecord::StatementCache.create(Book.connection) do |params|
|
81
85
|
Book.where(name: "my book")
|
@@ -85,13 +89,13 @@ module ActiveRecord
|
|
85
89
|
Book.create(name: "my book")
|
86
90
|
end
|
87
91
|
|
88
|
-
first_books = cache.execute([], Book
|
92
|
+
first_books = cache.execute([], Book.connection)
|
89
93
|
|
90
94
|
3.times do
|
91
95
|
Book.create(name: "my book")
|
92
96
|
end
|
93
97
|
|
94
|
-
additional_books = cache.execute([], Book
|
98
|
+
additional_books = cache.execute([], Book.connection)
|
95
99
|
assert first_books != additional_books
|
96
100
|
end
|
97
101
|
|
@@ -104,7 +108,7 @@ module ActiveRecord
|
|
104
108
|
Book.find_by(name: "my other book")
|
105
109
|
end
|
106
110
|
|
107
|
-
|
111
|
+
assert_not_equal book, other_book
|
108
112
|
end
|
109
113
|
|
110
114
|
def test_find_by_does_not_use_statement_cache_if_table_name_is_changed
|
@@ -114,7 +118,7 @@ module ActiveRecord
|
|
114
118
|
|
115
119
|
# changing the table name should change the query that is not cached.
|
116
120
|
Book.table_name = :birds
|
117
|
-
assert_nil Book.find_by(name:
|
121
|
+
assert_nil Book.find_by(name: book.name)
|
118
122
|
ensure
|
119
123
|
Book.table_name = :books
|
120
124
|
end
|
@@ -132,5 +136,18 @@ module ActiveRecord
|
|
132
136
|
ensure
|
133
137
|
Book.table_name = :books
|
134
138
|
end
|
139
|
+
|
140
|
+
def test_find_association_does_not_use_statement_cache_if_table_name_is_changed
|
141
|
+
salty = Liquid.create(name: "salty")
|
142
|
+
molecule = salty.molecules.create(name: "dioxane")
|
143
|
+
|
144
|
+
assert_equal salty, molecule.liquid
|
145
|
+
|
146
|
+
Liquid.table_name = :birds
|
147
|
+
|
148
|
+
assert_nil molecule.reload_liquid
|
149
|
+
ensure
|
150
|
+
Liquid.table_name = :liquid
|
151
|
+
end
|
135
152
|
end
|
136
153
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/book"
|
5
|
+
|
6
|
+
module ActiveRecord
|
7
|
+
class StatementInvalidTest < ActiveRecord::TestCase
|
8
|
+
fixtures :books
|
9
|
+
|
10
|
+
class MockDatabaseError < StandardError
|
11
|
+
def result
|
12
|
+
0
|
13
|
+
end
|
14
|
+
|
15
|
+
def error_number
|
16
|
+
0
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
test "message contains no sql" do
|
21
|
+
sql = Book.where(author_id: 96, cover: "hard").to_sql
|
22
|
+
error = assert_raises(ActiveRecord::StatementInvalid) do
|
23
|
+
Book.connection.send(:log, sql, Book.name) do
|
24
|
+
raise MockDatabaseError
|
25
|
+
end
|
26
|
+
end
|
27
|
+
assert_not error.message.include?("SELECT")
|
28
|
+
end
|
29
|
+
|
30
|
+
test "statement and binds are set on select" do
|
31
|
+
sql = Book.where(author_id: 96, cover: "hard").to_sql
|
32
|
+
binds = [Minitest::Mock.new, Minitest::Mock.new]
|
33
|
+
error = assert_raises(ActiveRecord::StatementInvalid) do
|
34
|
+
Book.connection.send(:log, sql, Book.name, binds) do
|
35
|
+
raise MockDatabaseError
|
36
|
+
end
|
37
|
+
end
|
38
|
+
assert_equal error.sql, sql
|
39
|
+
assert_equal error.binds, binds
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|