ibm_db 5.2.0-x86-mingw32 → 5.3.2-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/ext/Makefile +15 -13
- data/ext/ibm_db.c +62 -57
- 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 +1463 -1279
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/rb3x/i386/ruby30/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 +190 -14
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require "models/owner"
|
5
|
+
require "models/pet"
|
6
|
+
require "models/topic"
|
5
7
|
|
6
8
|
class TransactionCallbacksTest < ActiveRecord::TestCase
|
7
9
|
fixtures :topics, :owners, :pets
|
@@ -17,7 +19,7 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
17
19
|
|
18
20
|
attr_accessor :save_on_after_create
|
19
21
|
after_create do
|
20
|
-
|
22
|
+
save! if save_on_after_create
|
21
23
|
end
|
22
24
|
|
23
25
|
def history
|
@@ -34,8 +36,16 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
34
36
|
|
35
37
|
has_many :replies, class_name: "ReplyWithCallbacks", foreign_key: "parent_id"
|
36
38
|
|
39
|
+
attr_accessor :abort_before_update, :abort_before_destroy
|
40
|
+
|
41
|
+
before_update { throw :abort if abort_before_update }
|
42
|
+
before_destroy { throw :abort if abort_before_destroy }
|
43
|
+
|
44
|
+
before_destroy { self.class.find(id).touch if persisted? }
|
45
|
+
|
37
46
|
before_commit { |record| record.do_before_commit(nil) }
|
38
47
|
after_commit { |record| record.do_after_commit(nil) }
|
48
|
+
after_save_commit { |record| record.do_after_commit(:save) }
|
39
49
|
after_create_commit { |record| record.do_after_commit(:create) }
|
40
50
|
after_update_commit { |record| record.do_after_commit(:update) }
|
41
51
|
after_destroy_commit { |record| record.do_after_commit(:destroy) }
|
@@ -68,17 +78,17 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
68
78
|
|
69
79
|
def do_before_commit(on)
|
70
80
|
blocks = @before_commit[on] if defined?(@before_commit)
|
71
|
-
blocks.each{|b| b.call(self)} if blocks
|
81
|
+
blocks.each { |b| b.call(self) } if blocks
|
72
82
|
end
|
73
83
|
|
74
84
|
def do_after_commit(on)
|
75
85
|
blocks = @after_commit[on] if defined?(@after_commit)
|
76
|
-
blocks.each{|b| b.call(self)} if blocks
|
86
|
+
blocks.each { |b| b.call(self) } if blocks
|
77
87
|
end
|
78
88
|
|
79
89
|
def do_after_rollback(on)
|
80
90
|
blocks = @after_rollback[on] if defined?(@after_rollback)
|
81
|
-
blocks.each{|b| b.call(self)} if blocks
|
91
|
+
blocks.each { |b| b.call(self) } if blocks
|
82
92
|
end
|
83
93
|
end
|
84
94
|
|
@@ -88,7 +98,7 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
88
98
|
|
89
99
|
# FIXME: Test behavior, not implementation.
|
90
100
|
def test_before_commit_exception_should_pop_transaction_stack
|
91
|
-
@first.before_commit_block { raise
|
101
|
+
@first.before_commit_block { raise "better pop this txn from the stack!" }
|
92
102
|
|
93
103
|
original_txn = @first.class.connection.current_transaction
|
94
104
|
|
@@ -101,13 +111,70 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
101
111
|
end
|
102
112
|
|
103
113
|
def test_call_after_commit_after_transaction_commits
|
104
|
-
@first.after_commit_block{|r| r.history << :after_commit}
|
105
|
-
@first.after_rollback_block{|r| r.history << :after_rollback}
|
114
|
+
@first.after_commit_block { |r| r.history << :after_commit }
|
115
|
+
@first.after_rollback_block { |r| r.history << :after_rollback }
|
106
116
|
|
107
117
|
@first.save!
|
108
118
|
assert_equal [:after_commit], @first.history
|
109
119
|
end
|
110
120
|
|
121
|
+
def test_dont_call_any_callbacks_after_transaction_commits_for_invalid_record
|
122
|
+
@first.after_commit_block { |r| r.history << :after_commit }
|
123
|
+
@first.after_rollback_block { |r| r.history << :after_rollback }
|
124
|
+
|
125
|
+
def @first.valid?(*)
|
126
|
+
false
|
127
|
+
end
|
128
|
+
|
129
|
+
assert_not @first.save
|
130
|
+
assert_equal [], @first.history
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_dont_call_any_callbacks_after_explicit_transaction_commits_for_invalid_record
|
134
|
+
@first.after_commit_block { |r| r.history << :after_commit }
|
135
|
+
@first.after_rollback_block { |r| r.history << :after_rollback }
|
136
|
+
|
137
|
+
def @first.valid?(*)
|
138
|
+
false
|
139
|
+
end
|
140
|
+
|
141
|
+
@first.transaction do
|
142
|
+
assert_not @first.save
|
143
|
+
end
|
144
|
+
assert_equal [], @first.history
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_dont_call_after_commit_on_update_based_on_previous_transaction
|
148
|
+
@first.save!
|
149
|
+
add_transaction_execution_blocks(@first)
|
150
|
+
|
151
|
+
@first.abort_before_update = true
|
152
|
+
@first.transaction { @first.save }
|
153
|
+
|
154
|
+
assert_empty @first.history
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_dont_call_after_commit_on_destroy_based_on_previous_transaction
|
158
|
+
@first.destroy!
|
159
|
+
add_transaction_execution_blocks(@first)
|
160
|
+
|
161
|
+
@first.abort_before_destroy = true
|
162
|
+
@first.transaction { @first.destroy }
|
163
|
+
|
164
|
+
assert_empty @first.history
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_only_call_after_commit_on_save_after_transaction_commits_for_saving_record
|
168
|
+
record = TopicWithCallbacks.new(title: "New topic", written_on: Date.today)
|
169
|
+
record.after_commit_block(:save) { |r| r.history << :after_save }
|
170
|
+
|
171
|
+
record.save!
|
172
|
+
assert_equal [:after_save], record.history
|
173
|
+
|
174
|
+
record.update!(title: "Another topic")
|
175
|
+
assert_equal [:after_save, :after_save], record.history
|
176
|
+
end
|
177
|
+
|
111
178
|
def test_only_call_after_commit_on_update_after_transaction_commits_for_existing_record
|
112
179
|
add_transaction_execution_blocks @first
|
113
180
|
|
@@ -123,11 +190,7 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
123
190
|
end
|
124
191
|
|
125
192
|
def test_only_call_after_commit_on_create_after_transaction_commits_for_new_record
|
126
|
-
|
127
|
-
new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Date.today)
|
128
|
-
else
|
129
|
-
new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Time.now)
|
130
|
-
end
|
193
|
+
new_record = TopicWithCallbacks.new(title: "New topic", written_on: Date.today)
|
131
194
|
add_transaction_execution_blocks new_record
|
132
195
|
|
133
196
|
new_record.save!
|
@@ -135,17 +198,34 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
135
198
|
end
|
136
199
|
|
137
200
|
def test_only_call_after_commit_on_create_after_transaction_commits_for_new_record_if_create_succeeds_creating_through_association
|
138
|
-
topic = TopicWithCallbacks.create!(:
|
201
|
+
topic = TopicWithCallbacks.create!(title: "New topic", written_on: Date.today)
|
139
202
|
reply = topic.replies.create
|
140
203
|
|
141
204
|
assert_equal [], reply.history
|
142
205
|
end
|
143
206
|
|
207
|
+
def test_only_call_after_commit_on_destroy_after_transaction_commits_for_destroyed_new_record
|
208
|
+
new_record = TopicWithCallbacks.new(title: "New topic", written_on: Date.today)
|
209
|
+
add_transaction_execution_blocks new_record
|
210
|
+
|
211
|
+
new_record.destroy
|
212
|
+
assert_equal [:commit_on_destroy], new_record.history
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_save_in_after_create_commit_wont_invoke_extra_after_create_commit
|
216
|
+
new_record = TopicWithCallbacks.new(title: "New topic", written_on: Date.today)
|
217
|
+
add_transaction_execution_blocks new_record
|
218
|
+
new_record.after_commit_block(:create) { |r| r.save! }
|
219
|
+
|
220
|
+
new_record.save!
|
221
|
+
assert_equal [:commit_on_create, :commit_on_update], new_record.history
|
222
|
+
end
|
223
|
+
|
144
224
|
def test_only_call_after_commit_on_create_and_doesnt_leaky
|
145
|
-
r = ReplyWithCallbacks.new(content:
|
225
|
+
r = ReplyWithCallbacks.new(content: "foo")
|
146
226
|
r.save_on_after_create = true
|
147
227
|
r.save!
|
148
|
-
r.content =
|
228
|
+
r.content = "bar"
|
149
229
|
r.save!
|
150
230
|
r.save!
|
151
231
|
assert_equal [:commit_on_create], r.history
|
@@ -159,21 +239,21 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
159
239
|
end
|
160
240
|
|
161
241
|
def test_only_call_after_commit_on_top_level_transactions
|
162
|
-
@first.after_commit_block{|r| r.history << :after_commit}
|
163
|
-
|
242
|
+
@first.after_commit_block { |r| r.history << :after_commit }
|
243
|
+
assert_empty @first.history
|
164
244
|
|
165
245
|
@first.transaction do
|
166
246
|
@first.transaction(requires_new: true) do
|
167
247
|
@first.touch
|
168
248
|
end
|
169
|
-
|
249
|
+
assert_empty @first.history
|
170
250
|
end
|
171
251
|
assert_equal [:after_commit], @first.history
|
172
252
|
end
|
173
253
|
|
174
254
|
def test_call_after_rollback_after_transaction_rollsback
|
175
|
-
@first.after_commit_block{|r| r.history << :after_commit}
|
176
|
-
@first.after_rollback_block{|r| r.history << :after_rollback}
|
255
|
+
@first.after_commit_block { |r| r.history << :after_commit }
|
256
|
+
@first.after_rollback_block { |r| r.history << :after_rollback }
|
177
257
|
|
178
258
|
Topic.transaction do
|
179
259
|
@first.save!
|
@@ -217,11 +297,7 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
217
297
|
end
|
218
298
|
|
219
299
|
def test_only_call_after_rollback_on_create_after_transaction_rollsback_for_new_record
|
220
|
-
|
221
|
-
new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Date.today)
|
222
|
-
else
|
223
|
-
new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Time.now)
|
224
|
-
end
|
300
|
+
new_record = TopicWithCallbacks.new(title: "New topic", written_on: Date.today)
|
225
301
|
add_transaction_execution_blocks new_record
|
226
302
|
|
227
303
|
Topic.transaction do
|
@@ -251,20 +327,20 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
251
327
|
end
|
252
328
|
|
253
329
|
def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint
|
254
|
-
def @first.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
|
255
|
-
def @first.commits(i=0); @commits ||= 0; @commits += i if i; end
|
256
|
-
@first.after_rollback_block{|r| r.rollbacks(1)}
|
257
|
-
@first.after_commit_block{|r| r.commits(1)}
|
330
|
+
def @first.rollbacks(i = 0); @rollbacks ||= 0; @rollbacks += i if i; end
|
331
|
+
def @first.commits(i = 0); @commits ||= 0; @commits += i if i; end
|
332
|
+
@first.after_rollback_block { |r| r.rollbacks(1) }
|
333
|
+
@first.after_commit_block { |r| r.commits(1) }
|
258
334
|
|
259
335
|
second = TopicWithCallbacks.find(3)
|
260
|
-
def second.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
|
261
|
-
def second.commits(i=0); @commits ||= 0; @commits += i if i; end
|
262
|
-
second.after_rollback_block{|r| r.rollbacks(1)}
|
263
|
-
second.after_commit_block{|r| r.commits(1)}
|
336
|
+
def second.rollbacks(i = 0); @rollbacks ||= 0; @rollbacks += i if i; end
|
337
|
+
def second.commits(i = 0); @commits ||= 0; @commits += i if i; end
|
338
|
+
second.after_rollback_block { |r| r.rollbacks(1) }
|
339
|
+
second.after_commit_block { |r| r.commits(1) }
|
264
340
|
|
265
341
|
Topic.transaction do
|
266
342
|
@first.save!
|
267
|
-
Topic.transaction(:
|
343
|
+
Topic.transaction(requires_new: true) do
|
268
344
|
second.save!
|
269
345
|
raise ActiveRecord::Rollback
|
270
346
|
end
|
@@ -277,19 +353,19 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
277
353
|
end
|
278
354
|
|
279
355
|
def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint_when_release_savepoint_fails
|
280
|
-
def @first.rollbacks(i=0); @rollbacks ||= 0; @rollbacks += i if i; end
|
281
|
-
def @first.commits(i=0); @commits ||= 0; @commits += i if i; end
|
356
|
+
def @first.rollbacks(i = 0); @rollbacks ||= 0; @rollbacks += i if i; end
|
357
|
+
def @first.commits(i = 0); @commits ||= 0; @commits += i if i; end
|
282
358
|
|
283
|
-
@first.after_rollback_block{|r| r.rollbacks(1)}
|
284
|
-
@first.after_commit_block{|r| r.commits(1)}
|
359
|
+
@first.after_rollback_block { |r| r.rollbacks(1) }
|
360
|
+
@first.after_commit_block { |r| r.commits(1) }
|
285
361
|
|
286
362
|
Topic.transaction do
|
287
363
|
@first.save
|
288
|
-
Topic.transaction(:
|
364
|
+
Topic.transaction(requires_new: true) do
|
289
365
|
@first.save!
|
290
366
|
raise ActiveRecord::Rollback
|
291
367
|
end
|
292
|
-
Topic.transaction(:
|
368
|
+
Topic.transaction(requires_new: true) do
|
293
369
|
@first.save!
|
294
370
|
raise ActiveRecord::Rollback
|
295
371
|
end
|
@@ -300,7 +376,7 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
300
376
|
end
|
301
377
|
|
302
378
|
def test_after_commit_callback_should_not_swallow_errors
|
303
|
-
@first.after_commit_block{ fail "boom" }
|
379
|
+
@first.after_commit_block { fail "boom" }
|
304
380
|
assert_raises(RuntimeError) do
|
305
381
|
Topic.transaction do
|
306
382
|
@first.save!
|
@@ -311,8 +387,8 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
311
387
|
def test_after_commit_callback_when_raise_should_not_restore_state
|
312
388
|
first = TopicWithCallbacks.new
|
313
389
|
second = TopicWithCallbacks.new
|
314
|
-
first.after_commit_block{ fail "boom" }
|
315
|
-
second.after_commit_block{ fail "boom" }
|
390
|
+
first.after_commit_block { fail "boom" }
|
391
|
+
second.after_commit_block { fail "boom" }
|
316
392
|
|
317
393
|
begin
|
318
394
|
Topic.transaction do
|
@@ -330,7 +406,7 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
330
406
|
|
331
407
|
def test_after_rollback_callback_should_not_swallow_errors_when_set_to_raise
|
332
408
|
error_class = Class.new(StandardError)
|
333
|
-
@first.after_rollback_block{ raise error_class }
|
409
|
+
@first.after_rollback_block { raise error_class }
|
334
410
|
assert_raises(error_class) do
|
335
411
|
Topic.transaction do
|
336
412
|
@first.save!
|
@@ -339,13 +415,30 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
339
415
|
end
|
340
416
|
end
|
341
417
|
|
418
|
+
def test_after_commit_callback_should_not_rollback_state_that_already_been_succeeded
|
419
|
+
klass = Class.new(TopicWithCallbacks) do
|
420
|
+
self.inheritance_column = nil
|
421
|
+
validates :title, presence: true
|
422
|
+
end
|
423
|
+
|
424
|
+
first = klass.new(title: "foo")
|
425
|
+
first.after_commit_block { |r| r.update(title: nil) if r.persisted? }
|
426
|
+
first.save!
|
427
|
+
|
428
|
+
assert_predicate first, :persisted?
|
429
|
+
assert_not_nil first.id
|
430
|
+
ensure
|
431
|
+
first.destroy!
|
432
|
+
end
|
433
|
+
uses_transaction :test_after_commit_callback_should_not_rollback_state_that_already_been_succeeded
|
434
|
+
|
342
435
|
def test_after_rollback_callback_when_raise_should_restore_state
|
343
436
|
error_class = Class.new(StandardError)
|
344
437
|
|
345
438
|
first = TopicWithCallbacks.new
|
346
439
|
second = TopicWithCallbacks.new
|
347
|
-
first.after_rollback_block{ raise error_class }
|
348
|
-
second.after_rollback_block{ raise error_class }
|
440
|
+
first.after_rollback_block { raise error_class }
|
441
|
+
second.after_rollback_block { raise error_class }
|
349
442
|
|
350
443
|
begin
|
351
444
|
Topic.transaction do
|
@@ -363,16 +456,36 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
363
456
|
|
364
457
|
def test_after_rollback_callbacks_should_validate_on_condition
|
365
458
|
assert_raise(ArgumentError) { Topic.after_rollback(on: :save) }
|
366
|
-
e = assert_raise(ArgumentError) { Topic.after_rollback(on:
|
459
|
+
e = assert_raise(ArgumentError) { Topic.after_rollback(on: "create") }
|
367
460
|
assert_match(/:on conditions for after_commit and after_rollback callbacks have to be one of \[:create, :destroy, :update\]/, e.message)
|
368
461
|
end
|
369
462
|
|
370
463
|
def test_after_commit_callbacks_should_validate_on_condition
|
371
464
|
assert_raise(ArgumentError) { Topic.after_commit(on: :save) }
|
372
|
-
e = assert_raise(ArgumentError) { Topic.after_commit(on:
|
465
|
+
e = assert_raise(ArgumentError) { Topic.after_commit(on: "create") }
|
373
466
|
assert_match(/:on conditions for after_commit and after_rollback callbacks have to be one of \[:create, :destroy, :update\]/, e.message)
|
374
467
|
end
|
375
468
|
|
469
|
+
def test_after_commit_chain_not_called_on_errors
|
470
|
+
record_1 = TopicWithCallbacks.create!
|
471
|
+
record_2 = TopicWithCallbacks.create!
|
472
|
+
record_3 = TopicWithCallbacks.create!
|
473
|
+
callbacks = []
|
474
|
+
record_1.after_commit_block { raise }
|
475
|
+
record_2.after_commit_block { callbacks << record_2.id }
|
476
|
+
record_3.after_commit_block { callbacks << record_3.id }
|
477
|
+
begin
|
478
|
+
TopicWithCallbacks.transaction do
|
479
|
+
record_1.save!
|
480
|
+
record_2.save!
|
481
|
+
record_3.save!
|
482
|
+
end
|
483
|
+
rescue
|
484
|
+
# From record_1.after_commit
|
485
|
+
end
|
486
|
+
assert_equal [], callbacks
|
487
|
+
end
|
488
|
+
|
376
489
|
def test_saving_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_call_callbacks_on_the_parent_object
|
377
490
|
pet = Pet.first
|
378
491
|
owner = pet.owner
|
@@ -388,8 +501,56 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
388
501
|
assert flag
|
389
502
|
end
|
390
503
|
|
391
|
-
|
504
|
+
def test_saving_two_records_that_override_object_id_should_run_after_commit_callbacks_for_both
|
505
|
+
klass = Class.new(TopicWithCallbacks) do
|
506
|
+
define_method(:object_id) { 42 }
|
507
|
+
end
|
508
|
+
|
509
|
+
records = [klass.new, klass.new]
|
510
|
+
|
511
|
+
klass.transaction do
|
512
|
+
records.each do |record|
|
513
|
+
record.after_commit_block { |r| r.history << :after_commit }
|
514
|
+
record.save!
|
515
|
+
end
|
516
|
+
end
|
517
|
+
|
518
|
+
assert_equal [:after_commit], records.first.history
|
519
|
+
assert_equal [:after_commit], records.second.history
|
520
|
+
end
|
521
|
+
|
522
|
+
def test_saving_two_records_that_override_object_id_should_run_after_rollback_callbacks_for_both
|
523
|
+
klass = Class.new(TopicWithCallbacks) do
|
524
|
+
define_method(:object_id) { 42 }
|
525
|
+
end
|
526
|
+
|
527
|
+
records = [klass.new, klass.new]
|
528
|
+
|
529
|
+
klass.transaction do
|
530
|
+
records.each do |record|
|
531
|
+
record.after_rollback_block { |r| r.history << :after_rollback }
|
532
|
+
record.save!
|
533
|
+
end
|
534
|
+
raise ActiveRecord::Rollback
|
535
|
+
end
|
536
|
+
|
537
|
+
assert_equal [:after_rollback], records.first.history
|
538
|
+
assert_equal [:after_rollback], records.second.history
|
539
|
+
end
|
540
|
+
|
541
|
+
def test_after_commit_does_not_mutate_the_if_options_array
|
542
|
+
opts = []
|
543
|
+
|
544
|
+
Class.new(ActiveRecord::Base) do
|
545
|
+
self.table_name = "topics"
|
546
|
+
|
547
|
+
after_commit(if: opts, on: :create) { }
|
548
|
+
end
|
392
549
|
|
550
|
+
assert_empty opts
|
551
|
+
end
|
552
|
+
|
553
|
+
private
|
393
554
|
def add_transaction_execution_blocks(record)
|
394
555
|
record.after_commit_block(:create) { |r| r.history << :commit_on_create }
|
395
556
|
record.after_commit_block(:update) { |r| r.history << :commit_on_update }
|
@@ -400,6 +561,28 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
400
561
|
end
|
401
562
|
end
|
402
563
|
|
564
|
+
class TransactionAfterCommitCallbacksWithOptimisticLockingTest < ActiveRecord::TestCase
|
565
|
+
class PersonWithCallbacks < ActiveRecord::Base
|
566
|
+
self.table_name = :people
|
567
|
+
|
568
|
+
after_create_commit { |record| record.history << :commit_on_create }
|
569
|
+
after_update_commit { |record| record.history << :commit_on_update }
|
570
|
+
after_destroy_commit { |record| record.history << :commit_on_destroy }
|
571
|
+
|
572
|
+
def history
|
573
|
+
@history ||= []
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
def test_after_commit_callbacks_with_optimistic_locking
|
578
|
+
person = PersonWithCallbacks.create!(first_name: "first name")
|
579
|
+
person.update!(first_name: "another name")
|
580
|
+
person.destroy
|
581
|
+
|
582
|
+
assert_equal [:commit_on_create, :commit_on_update, :commit_on_destroy], person.history
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
403
586
|
class CallbacksOnMultipleActionsTest < ActiveRecord::TestCase
|
404
587
|
self.use_transactional_tests = false
|
405
588
|
|
@@ -457,62 +640,133 @@ class CallbacksOnMultipleActionsTest < ActiveRecord::TestCase
|
|
457
640
|
end
|
458
641
|
end
|
459
642
|
|
643
|
+
class CallbacksOnDestroyUpdateActionRaceTest < ActiveRecord::TestCase
|
644
|
+
self.use_transactional_tests = false
|
460
645
|
|
461
|
-
class
|
462
|
-
|
463
|
-
class TopicWithoutTransactionalEnrollmentCallbacks < ActiveRecord::Base
|
646
|
+
class TopicWithHistory < ActiveRecord::Base
|
464
647
|
self.table_name = :topics
|
465
648
|
|
466
|
-
|
467
|
-
|
468
|
-
|
649
|
+
def self.clear_history
|
650
|
+
@@history = []
|
651
|
+
end
|
469
652
|
|
470
|
-
def history
|
471
|
-
|
653
|
+
def self.history
|
654
|
+
@@history ||= []
|
472
655
|
end
|
473
656
|
end
|
474
657
|
|
475
|
-
|
476
|
-
|
658
|
+
class TopicWithCallbacksOnDestroy < TopicWithHistory
|
659
|
+
after_commit(on: :destroy) { |record| record.class.history << :commit_on_destroy }
|
660
|
+
after_rollback(on: :destroy) { |record| record.class.history << :rollback_on_destroy }
|
661
|
+
|
662
|
+
before_destroy :before_destroy_for_transaction
|
663
|
+
|
664
|
+
private
|
665
|
+
def before_destroy_for_transaction; end
|
477
666
|
end
|
478
667
|
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
668
|
+
class TopicWithCallbacksOnUpdate < TopicWithHistory
|
669
|
+
after_commit(on: :update) { |record| record.class.history << :commit_on_update }
|
670
|
+
|
671
|
+
before_save :before_save_for_transaction
|
672
|
+
|
673
|
+
private
|
674
|
+
def before_save_for_transaction; end
|
485
675
|
end
|
486
676
|
|
487
|
-
def
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
677
|
+
def test_trigger_once_on_multiple_deletions
|
678
|
+
TopicWithCallbacksOnDestroy.clear_history
|
679
|
+
topic = TopicWithCallbacksOnDestroy.new
|
680
|
+
topic.save
|
681
|
+
topic_clone = TopicWithCallbacksOnDestroy.find(topic.id)
|
682
|
+
|
683
|
+
topic.define_singleton_method(:before_destroy_for_transaction) do
|
684
|
+
topic_clone.destroy
|
494
685
|
end
|
495
|
-
|
686
|
+
|
687
|
+
topic.destroy
|
688
|
+
|
689
|
+
assert_equal [:commit_on_destroy], TopicWithCallbacksOnDestroy.history
|
496
690
|
end
|
497
691
|
|
498
|
-
def
|
499
|
-
|
500
|
-
|
501
|
-
|
692
|
+
def test_rollback_on_multiple_deletions
|
693
|
+
TopicWithCallbacksOnDestroy.clear_history
|
694
|
+
topic = TopicWithCallbacksOnDestroy.new
|
695
|
+
topic.save
|
696
|
+
topic_clone = TopicWithCallbacksOnDestroy.find(topic.id)
|
697
|
+
|
698
|
+
topic.define_singleton_method(:before_destroy_for_transaction) do
|
699
|
+
topic_clone.update!(author_name: "Test Author Clone")
|
700
|
+
topic_clone.destroy
|
701
|
+
end
|
702
|
+
|
703
|
+
TopicWithCallbacksOnDestroy.transaction do
|
704
|
+
topic.update!(author_name: "Test Author")
|
705
|
+
topic.destroy
|
502
706
|
raise ActiveRecord::Rollback
|
503
707
|
end
|
504
|
-
|
708
|
+
|
709
|
+
assert_not_predicate topic, :destroyed?
|
710
|
+
assert_not_predicate topic_clone, :destroyed?
|
711
|
+
assert_equal [nil, "Test Author"], topic.author_name_change_to_be_saved
|
712
|
+
assert_equal [nil, "Test Author Clone"], topic_clone.author_name_change_to_be_saved
|
713
|
+
|
714
|
+
assert_equal [:rollback_on_destroy], TopicWithCallbacksOnDestroy.history
|
505
715
|
end
|
506
716
|
|
507
|
-
def
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
717
|
+
def test_trigger_on_update_where_row_was_deleted
|
718
|
+
TopicWithCallbacksOnUpdate.clear_history
|
719
|
+
topic = TopicWithCallbacksOnUpdate.new
|
720
|
+
topic.save
|
721
|
+
topic_clone = TopicWithCallbacksOnUpdate.find(topic.id)
|
722
|
+
|
723
|
+
topic_clone.define_singleton_method(:before_save_for_transaction) do
|
724
|
+
topic.destroy
|
725
|
+
end
|
726
|
+
|
727
|
+
topic_clone.author_name = "Test Author"
|
728
|
+
topic_clone.save
|
729
|
+
|
730
|
+
assert_equal [], TopicWithCallbacksOnUpdate.history
|
731
|
+
end
|
732
|
+
end
|
733
|
+
|
734
|
+
class CallbacksOnActionAndConditionTest < ActiveRecord::TestCase
|
735
|
+
self.use_transactional_tests = false
|
736
|
+
|
737
|
+
class TopicWithCallbacksOnActionAndCondition < ActiveRecord::Base
|
738
|
+
self.table_name = :topics
|
739
|
+
|
740
|
+
after_commit(on: [:create, :update], if: :run_callback?) { |record| record.history << :create_or_update }
|
741
|
+
|
742
|
+
def clear_history
|
743
|
+
@history = []
|
744
|
+
end
|
745
|
+
|
746
|
+
def history
|
747
|
+
@history ||= []
|
515
748
|
end
|
516
|
-
|
749
|
+
|
750
|
+
def run_callback?
|
751
|
+
self.history << :run_callback?
|
752
|
+
true
|
753
|
+
end
|
754
|
+
|
755
|
+
attr_accessor :save_before_commit_history, :update_title
|
756
|
+
end
|
757
|
+
|
758
|
+
def test_callback_on_action_with_condition
|
759
|
+
topic = TopicWithCallbacksOnActionAndCondition.new
|
760
|
+
topic.save
|
761
|
+
assert_equal [:run_callback?, :create_or_update], topic.history
|
762
|
+
|
763
|
+
topic.clear_history
|
764
|
+
topic.approved = true
|
765
|
+
topic.save
|
766
|
+
assert_equal [:run_callback?, :create_or_update], topic.history
|
767
|
+
|
768
|
+
topic.clear_history
|
769
|
+
topic.destroy
|
770
|
+
assert_equal [], topic.history
|
517
771
|
end
|
518
772
|
end
|