ibm_db 3.0.5-x86-mingw32 → 5.0.5-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 +5 -5
- data/CHANGES +4 -0
- data/LICENSE +1 -1
- data/ParameterizedQueries README +6 -6
- data/README +38 -55
- data/ext/Makefile +269 -0
- data/ext/extconf.rb +34 -3
- data/ext/gil_release_version +3 -0
- data/ext/ibm_db-i386-mingw32.def +2 -0
- data/ext/ibm_db.c +100 -108
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +110 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/ext/unicode_support_version +3 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
- data/lib/mswin32/ibm_db.rb +7 -39
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
- data/test/cases/adapter_test.rb +133 -58
- data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
- data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
- data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
- data/test/cases/adapters/mysql2/connection_test.rb +210 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
- data/test/cases/adapters/mysql2/enum_test.rb +26 -0
- data/test/cases/adapters/mysql2/explain_test.rb +21 -0
- data/test/cases/adapters/mysql2/json_test.rb +195 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
- data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
- data/test/cases/adapters/mysql2/schema_test.rb +126 -0
- data/test/cases/adapters/mysql2/sp_test.rb +36 -0
- data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
- data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
- data/test/cases/adapters/postgresql/array_test.rb +339 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
- data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
- data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
- data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
- data/test/cases/adapters/postgresql/citext_test.rb +78 -0
- data/test/cases/adapters/postgresql/collation_test.rb +53 -0
- data/test/cases/adapters/postgresql/composite_test.rb +132 -0
- data/test/cases/adapters/postgresql/connection_test.rb +257 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
- data/test/cases/adapters/postgresql/domain_test.rb +47 -0
- data/test/cases/adapters/postgresql/enum_test.rb +91 -0
- data/test/cases/adapters/postgresql/explain_test.rb +20 -0
- data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
- data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
- data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
- data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
- data/test/cases/adapters/postgresql/integer_test.rb +25 -0
- data/test/cases/adapters/postgresql/json_test.rb +237 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
- data/test/cases/adapters/postgresql/money_test.rb +96 -0
- data/test/cases/adapters/postgresql/network_test.rb +94 -0
- data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
- data/test/cases/adapters/postgresql/range_test.rb +343 -0
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
- data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
- data/test/cases/adapters/postgresql/schema_test.rb +597 -0
- data/test/cases/adapters/postgresql/serial_test.rb +154 -0
- data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
- data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
- data/test/cases/adapters/postgresql/utils_test.rb +62 -0
- data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
- data/test/cases/adapters/postgresql/xml_test.rb +54 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
- data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
- data/test/cases/aggregations_test.rb +11 -1
- data/test/cases/ar_schema_test.rb +35 -50
- data/test/cases/associations/association_scope_test.rb +1 -6
- data/test/cases/associations/belongs_to_associations_test.rb +122 -10
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
- data/test/cases/associations/callbacks_test.rb +5 -7
- data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
- data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
- data/test/cases/associations/eager_test.rb +158 -73
- data/test/cases/associations/extension_test.rb +7 -2
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
- data/test/cases/associations/has_many_associations_test.rb +362 -43
- data/test/cases/associations/has_many_through_associations_test.rb +108 -41
- data/test/cases/associations/has_one_associations_test.rb +105 -8
- data/test/cases/associations/has_one_through_associations_test.rb +6 -3
- data/test/cases/associations/inner_join_association_test.rb +3 -3
- data/test/cases/associations/inverse_associations_test.rb +38 -11
- data/test/cases/associations/join_model_test.rb +59 -36
- data/test/cases/associations/left_outer_join_association_test.rb +88 -0
- data/test/cases/associations/nested_through_associations_test.rb +2 -2
- data/test/cases/associations/required_test.rb +25 -5
- data/test/cases/associations_test.rb +39 -34
- data/test/cases/attribute_decorators_test.rb +9 -8
- data/test/cases/attribute_methods/read_test.rb +5 -5
- data/test/cases/attribute_methods_test.rb +97 -40
- data/test/cases/attribute_set_test.rb +64 -4
- data/test/cases/attribute_test.rb +84 -18
- data/test/cases/attributes_test.rb +151 -34
- data/test/cases/autosave_association_test.rb +149 -36
- data/test/cases/base_test.rb +290 -241
- data/test/cases/batches_test.rb +299 -22
- data/test/cases/binary_test.rb +2 -10
- data/test/cases/bind_parameter_test.rb +76 -66
- data/test/cases/cache_key_test.rb +26 -0
- data/test/cases/calculations_test.rb +167 -15
- data/test/cases/callbacks_test.rb +161 -68
- data/test/cases/coders/json_test.rb +15 -0
- data/test/cases/collection_cache_key_test.rb +115 -0
- data/test/cases/column_definition_test.rb +26 -57
- data/test/cases/comment_test.rb +145 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
- data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
- data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
- data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
- data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
- data/test/cases/connection_management_test.rb +46 -56
- data/test/cases/connection_pool_test.rb +195 -20
- data/test/cases/connection_specification/resolver_test.rb +15 -0
- data/test/cases/counter_cache_test.rb +10 -5
- data/test/cases/custom_locking_test.rb +1 -1
- data/test/cases/database_statements_test.rb +18 -3
- data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
- data/test/cases/date_time_precision_test.rb +107 -0
- data/test/cases/defaults_test.rb +85 -89
- data/test/cases/dirty_test.rb +30 -52
- data/test/cases/disconnected_test.rb +4 -2
- data/test/cases/enum_test.rb +178 -24
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_test.rb +32 -21
- data/test/cases/finder_test.rb +273 -148
- data/test/cases/fixture_set/file_test.rb +18 -0
- data/test/cases/fixtures_test.rb +112 -32
- data/test/cases/forbidden_attributes_protection_test.rb +69 -3
- data/test/cases/helper.rb +10 -16
- data/test/cases/hot_compatibility_test.rb +89 -1
- data/test/cases/inheritance_test.rb +284 -53
- data/test/cases/integration_test.rb +23 -7
- data/test/cases/invalid_connection_test.rb +4 -2
- data/test/cases/invertible_migration_test.rb +124 -32
- data/test/cases/json_serialization_test.rb +11 -2
- data/test/cases/locking_test.rb +22 -6
- data/test/cases/log_subscriber_test.rb +106 -17
- data/test/cases/migration/change_schema_test.rb +60 -114
- data/test/cases/migration/change_table_test.rb +34 -2
- data/test/cases/migration/column_attributes_test.rb +7 -23
- data/test/cases/migration/column_positioning_test.rb +8 -8
- data/test/cases/migration/columns_test.rb +17 -11
- data/test/cases/migration/command_recorder_test.rb +47 -2
- data/test/cases/migration/compatibility_test.rb +118 -0
- data/test/cases/migration/create_join_table_test.rb +21 -12
- data/test/cases/migration/foreign_key_test.rb +52 -18
- data/test/cases/migration/index_test.rb +14 -12
- data/test/cases/migration/logger_test.rb +1 -1
- data/test/cases/migration/pending_migrations_test.rb +0 -1
- data/test/cases/migration/references_foreign_key_test.rb +59 -7
- data/test/cases/migration/references_index_test.rb +4 -4
- data/test/cases/migration/references_statements_test.rb +26 -6
- data/test/cases/migration/rename_table_test.rb +25 -25
- data/test/cases/migration_test.rb +279 -81
- data/test/cases/migrator_test.rb +91 -8
- data/test/cases/mixin_test.rb +0 -2
- data/test/cases/modules_test.rb +3 -4
- data/test/cases/multiparameter_attributes_test.rb +24 -2
- data/test/cases/multiple_db_test.rb +11 -4
- data/test/cases/nested_attributes_test.rb +61 -33
- data/test/cases/persistence_test.rb +102 -10
- data/test/cases/pooled_connections_test.rb +3 -3
- data/test/cases/primary_keys_test.rb +170 -31
- data/test/cases/query_cache_test.rb +216 -96
- data/test/cases/quoting_test.rb +65 -19
- data/test/cases/readonly_test.rb +2 -1
- data/test/cases/reflection_test.rb +68 -22
- data/test/cases/relation/delegation_test.rb +3 -8
- data/test/cases/relation/merging_test.rb +10 -14
- data/test/cases/relation/mutation_test.rb +42 -24
- data/test/cases/relation/or_test.rb +92 -0
- data/test/cases/relation/predicate_builder_test.rb +4 -2
- data/test/cases/relation/record_fetch_warning_test.rb +40 -0
- data/test/cases/relation/where_chain_test.rb +23 -99
- data/test/cases/relation/where_clause_test.rb +182 -0
- data/test/cases/relation/where_test.rb +45 -23
- data/test/cases/relation_test.rb +67 -58
- data/test/cases/relations_test.rb +249 -38
- data/test/cases/result_test.rb +10 -0
- data/test/cases/sanitize_test.rb +108 -15
- data/test/cases/schema_dumper_test.rb +119 -125
- data/test/cases/schema_loading_test.rb +52 -0
- data/test/cases/scoping/default_scoping_test.rb +113 -39
- data/test/cases/scoping/named_scoping_test.rb +46 -9
- data/test/cases/scoping/relation_scoping_test.rb +47 -4
- data/test/cases/secure_token_test.rb +32 -0
- data/test/cases/serialization_test.rb +1 -1
- data/test/cases/serialized_attribute_test.rb +93 -6
- data/test/cases/statement_cache_test.rb +38 -0
- data/test/cases/store_test.rb +2 -1
- data/test/cases/suppressor_test.rb +63 -0
- data/test/cases/tasks/database_tasks_test.rb +73 -9
- data/test/cases/tasks/mysql_rake_test.rb +139 -118
- data/test/cases/tasks/postgresql_rake_test.rb +60 -6
- data/test/cases/tasks/sqlite_rake_test.rb +30 -3
- data/test/cases/test_case.rb +28 -20
- data/test/cases/test_fixtures_test.rb +36 -0
- data/test/cases/time_precision_test.rb +103 -0
- data/test/cases/timestamp_test.rb +44 -10
- data/test/cases/touch_later_test.rb +121 -0
- data/test/cases/transaction_callbacks_test.rb +128 -62
- data/test/cases/transaction_isolation_test.rb +2 -2
- data/test/cases/transactions_test.rb +61 -43
- data/test/cases/type/adapter_specific_registry_test.rb +133 -0
- data/test/cases/type/date_time_test.rb +14 -0
- data/test/cases/type/integer_test.rb +2 -96
- data/test/cases/type/string_test.rb +0 -14
- data/test/cases/type_test.rb +39 -0
- data/test/cases/types_test.rb +1 -118
- data/test/cases/unconnected_test.rb +1 -1
- data/test/cases/validations/absence_validation_test.rb +73 -0
- data/test/cases/validations/association_validation_test.rb +13 -2
- data/test/cases/validations/i18n_validation_test.rb +6 -10
- data/test/cases/validations/length_validation_test.rb +62 -30
- data/test/cases/validations/presence_validation_test.rb +36 -1
- data/test/cases/validations/uniqueness_validation_test.rb +128 -37
- data/test/cases/validations_repair_helper.rb +2 -6
- data/test/cases/validations_test.rb +36 -7
- data/test/cases/view_test.rb +102 -5
- data/test/cases/yaml_serialization_test.rb +21 -26
- data/test/config.example.yml +97 -0
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/books.yml +20 -0
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/naked/yml/parrots.yml +2 -0
- data/test/fixtures/naked/yml/trees.yml +3 -0
- data/test/fixtures/nodes.yml +29 -0
- data/test/fixtures/other_comments.yml +6 -0
- data/test/fixtures/other_dogs.yml +2 -0
- data/test/fixtures/other_posts.yml +7 -0
- data/test/fixtures/price_estimates.yml +10 -1
- data/test/fixtures/trees.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +1 -1
- data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
- data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
- data/test/migrations/missing/1_people_have_last_names.rb +2 -2
- data/test/migrations/missing/3_we_need_reminders.rb +2 -2
- data/test/migrations/missing/4_innocent_jointable.rb +2 -2
- data/test/migrations/rename/1_we_need_things.rb +2 -2
- data/test/migrations/rename/2_rename_things.rb +2 -2
- data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy2/1_create_articles.rb +1 -1
- data/test/migrations/to_copy2/2_create_comments.rb +1 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
- data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
- data/test/models/admin/randomly_named_c1.rb +6 -2
- data/test/models/aircraft.rb +1 -0
- data/test/models/author.rb +4 -7
- data/test/models/bird.rb +1 -1
- data/test/models/book.rb +5 -0
- data/test/models/bulb.rb +2 -1
- data/test/models/car.rb +3 -0
- data/test/models/cat.rb +10 -0
- data/test/models/chef.rb +1 -0
- data/test/models/club.rb +2 -0
- data/test/models/comment.rb +17 -5
- data/test/models/company.rb +4 -2
- data/test/models/company_in_module.rb +1 -1
- data/test/models/contact.rb +1 -1
- data/test/models/content.rb +40 -0
- data/test/models/customer.rb +8 -2
- data/test/models/developer.rb +19 -0
- data/test/models/face.rb +1 -1
- data/test/models/guitar.rb +4 -0
- data/test/models/hotel.rb +2 -0
- data/test/models/member.rb +1 -0
- data/test/models/member_detail.rb +4 -3
- data/test/models/mentor.rb +3 -0
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/node.rb +5 -0
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +3 -0
- data/test/models/other_dog.rb +5 -0
- data/test/models/owner.rb +4 -1
- data/test/models/parrot.rb +6 -7
- data/test/models/person.rb +0 -1
- data/test/models/pet.rb +3 -0
- data/test/models/pet_treasure.rb +6 -0
- data/test/models/pirate.rb +3 -3
- data/test/models/post.rb +18 -9
- data/test/models/project.rb +9 -0
- data/test/models/randomly_named_c1.rb +1 -1
- data/test/models/recipe.rb +3 -0
- data/test/models/ship.rb +8 -2
- data/test/models/tag.rb +6 -0
- data/test/models/topic.rb +2 -8
- data/test/models/tree.rb +3 -0
- data/test/models/tuning_peg.rb +4 -0
- data/test/models/user.rb +14 -0
- data/test/models/uuid_item.rb +6 -0
- data/test/schema/mysql2_specific_schema.rb +33 -23
- data/test/schema/oracle_specific_schema.rb +1 -4
- data/test/schema/postgresql_specific_schema.rb +36 -124
- data/test/schema/schema.rb +170 -65
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +1 -5
- data/test/support/connection.rb +1 -0
- data/test/support/schema_dumping_helper.rb +1 -1
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
- metadata +146 -30
- data/lib/mswin32/rb19x/ibm_db.so +0 -0
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
- data/test/cases/attribute_methods/serialization_test.rb +0 -29
- data/test/cases/migration/change_schema_test - Copy.rb +0 -448
- data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
- data/test/cases/migration/table_and_index_test.rb +0 -24
- data/test/cases/relation/where_test2.rb +0 -36
- data/test/cases/type/decimal_test.rb +0 -56
- data/test/cases/type/unsigned_integer_test.rb +0 -18
- data/test/cases/xml_serialization_test.rb +0 -457
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/schema/mysql_specific_schema.rb +0 -70
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'cases/helper'
|
2
|
+
require 'models/invoice'
|
3
|
+
require 'models/line_item'
|
4
|
+
require 'models/topic'
|
5
|
+
require 'models/node'
|
6
|
+
require 'models/tree'
|
7
|
+
|
8
|
+
class TouchLaterTest < ActiveRecord::TestCase
|
9
|
+
fixtures :nodes, :trees
|
10
|
+
|
11
|
+
def test_touch_laster_raise_if_non_persisted
|
12
|
+
invoice = Invoice.new
|
13
|
+
Invoice.transaction do
|
14
|
+
assert_not invoice.persisted?
|
15
|
+
assert_raises(ActiveRecord::ActiveRecordError) do
|
16
|
+
invoice.touch_later
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_touch_later_dont_set_dirty_attributes
|
22
|
+
invoice = Invoice.create!
|
23
|
+
invoice.touch_later
|
24
|
+
assert_not invoice.changed?
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_touch_later_respects_no_touching_policy
|
28
|
+
time = Time.now.utc - 25.days
|
29
|
+
topic = Topic.create!(updated_at: time, created_at: time)
|
30
|
+
Topic.no_touching do
|
31
|
+
topic.touch_later
|
32
|
+
end
|
33
|
+
assert_equal time.to_i, topic.updated_at.to_i
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_touch_later_update_the_attributes
|
37
|
+
time = Time.now.utc - 25.days
|
38
|
+
topic = Topic.create!(updated_at: time, created_at: time)
|
39
|
+
assert_equal time.to_i, topic.updated_at.to_i
|
40
|
+
assert_equal time.to_i, topic.created_at.to_i
|
41
|
+
|
42
|
+
Topic.transaction do
|
43
|
+
topic.touch_later(:created_at)
|
44
|
+
assert_not_equal time.to_i, topic.updated_at.to_i
|
45
|
+
assert_not_equal time.to_i, topic.created_at.to_i
|
46
|
+
|
47
|
+
assert_equal time.to_i, topic.reload.updated_at.to_i
|
48
|
+
assert_equal time.to_i, topic.reload.created_at.to_i
|
49
|
+
end
|
50
|
+
assert_not_equal time.to_i, topic.reload.updated_at.to_i
|
51
|
+
assert_not_equal time.to_i, topic.reload.created_at.to_i
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_touch_touches_immediately
|
55
|
+
time = Time.now.utc - 25.days
|
56
|
+
topic = Topic.create!(updated_at: time, created_at: time)
|
57
|
+
assert_equal time.to_i, topic.updated_at.to_i
|
58
|
+
assert_equal time.to_i, topic.created_at.to_i
|
59
|
+
|
60
|
+
Topic.transaction do
|
61
|
+
topic.touch_later(:created_at)
|
62
|
+
topic.touch
|
63
|
+
|
64
|
+
assert_not_equal time, topic.reload.updated_at
|
65
|
+
assert_not_equal time, topic.reload.created_at
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_touch_later_an_association_dont_autosave_parent
|
70
|
+
time = Time.now.utc - 25.days
|
71
|
+
line_item = LineItem.create!(amount: 1)
|
72
|
+
invoice = Invoice.create!(line_items: [line_item])
|
73
|
+
invoice.touch(time: time)
|
74
|
+
|
75
|
+
Invoice.transaction do
|
76
|
+
line_item.update(amount: 2)
|
77
|
+
assert_equal time.to_i, invoice.reload.updated_at.to_i
|
78
|
+
end
|
79
|
+
|
80
|
+
assert_not_equal time.to_i, invoice.updated_at.to_i
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_touch_touches_immediately_with_a_custom_time
|
84
|
+
time = (Time.now.utc - 25.days).change(nsec: 0)
|
85
|
+
topic = Topic.create!(updated_at: time, created_at: time)
|
86
|
+
assert_equal time, topic.updated_at
|
87
|
+
assert_equal time, topic.created_at
|
88
|
+
|
89
|
+
Topic.transaction do
|
90
|
+
topic.touch_later(:created_at)
|
91
|
+
time = Time.now.utc - 2.days
|
92
|
+
topic.touch(time: time)
|
93
|
+
|
94
|
+
assert_equal time.to_i, topic.reload.updated_at.to_i
|
95
|
+
assert_equal time.to_i, topic.reload.created_at.to_i
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_touch_later_dont_hit_the_db
|
100
|
+
invoice = Invoice.create!
|
101
|
+
assert_queries(0) do
|
102
|
+
invoice.touch_later
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_touching_three_deep
|
107
|
+
previous_tree_updated_at = trees(:root).updated_at
|
108
|
+
previous_grandparent_updated_at = nodes(:grandparent).updated_at
|
109
|
+
previous_parent_updated_at = nodes(:parent_a).updated_at
|
110
|
+
previous_child_updated_at = nodes(:child_one_of_a).updated_at
|
111
|
+
|
112
|
+
travel 5.seconds do
|
113
|
+
Node.create! parent: nodes(:child_one_of_a), tree: trees(:root)
|
114
|
+
end
|
115
|
+
|
116
|
+
assert_not_equal nodes(:child_one_of_a).reload.updated_at, previous_child_updated_at
|
117
|
+
assert_not_equal nodes(:parent_a).reload.updated_at, previous_parent_updated_at
|
118
|
+
assert_not_equal nodes(:grandparent).reload.updated_at, previous_grandparent_updated_at
|
119
|
+
assert_not_equal trees(:root).reload.updated_at, previous_tree_updated_at
|
120
|
+
end
|
121
|
+
end
|
@@ -4,7 +4,6 @@ require 'models/pet'
|
|
4
4
|
require 'models/topic'
|
5
5
|
|
6
6
|
class TransactionCallbacksTest < ActiveRecord::TestCase
|
7
|
-
self.use_transactional_fixtures = false
|
8
7
|
fixtures :topics, :owners, :pets
|
9
8
|
|
10
9
|
class ReplyWithCallbacks < ActiveRecord::Base
|
@@ -35,10 +34,11 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
35
34
|
|
36
35
|
has_many :replies, class_name: "ReplyWithCallbacks", foreign_key: "parent_id"
|
37
36
|
|
37
|
+
before_commit { |record| record.do_before_commit(nil) }
|
38
38
|
after_commit { |record| record.do_after_commit(nil) }
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
after_create_commit { |record| record.do_after_commit(:create) }
|
40
|
+
after_update_commit { |record| record.do_after_commit(:update) }
|
41
|
+
after_destroy_commit { |record| record.do_after_commit(:destroy) }
|
42
42
|
after_rollback { |record| record.do_after_rollback(nil) }
|
43
43
|
after_rollback(on: :create) { |record| record.do_after_rollback(:create) }
|
44
44
|
after_rollback(on: :update) { |record| record.do_after_rollback(:update) }
|
@@ -48,6 +48,12 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
48
48
|
@history ||= []
|
49
49
|
end
|
50
50
|
|
51
|
+
def before_commit_block(on = nil, &block)
|
52
|
+
@before_commit ||= {}
|
53
|
+
@before_commit[on] ||= []
|
54
|
+
@before_commit[on] << block
|
55
|
+
end
|
56
|
+
|
51
57
|
def after_commit_block(on = nil, &block)
|
52
58
|
@after_commit ||= {}
|
53
59
|
@after_commit[on] ||= []
|
@@ -60,6 +66,11 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
60
66
|
@after_rollback[on] << block
|
61
67
|
end
|
62
68
|
|
69
|
+
def do_before_commit(on)
|
70
|
+
blocks = @before_commit[on] if defined?(@before_commit)
|
71
|
+
blocks.each{|b| b.call(self)} if blocks
|
72
|
+
end
|
73
|
+
|
63
74
|
def do_after_commit(on)
|
64
75
|
blocks = @after_commit[on] if defined?(@after_commit)
|
65
76
|
blocks.each{|b| b.call(self)} if blocks
|
@@ -75,6 +86,20 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
75
86
|
@first = TopicWithCallbacks.find(1)
|
76
87
|
end
|
77
88
|
|
89
|
+
# FIXME: Test behavior, not implementation.
|
90
|
+
def test_before_commit_exception_should_pop_transaction_stack
|
91
|
+
@first.before_commit_block { raise 'better pop this txn from the stack!' }
|
92
|
+
|
93
|
+
original_txn = @first.class.connection.current_transaction
|
94
|
+
|
95
|
+
begin
|
96
|
+
@first.save!
|
97
|
+
fail
|
98
|
+
rescue
|
99
|
+
assert_equal original_txn, @first.class.connection.current_transaction
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
78
103
|
def test_call_after_commit_after_transaction_commits
|
79
104
|
@first.after_commit_block{|r| r.history << :after_commit}
|
80
105
|
@first.after_rollback_block{|r| r.history << :after_rollback}
|
@@ -99,9 +124,9 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
99
124
|
|
100
125
|
def test_only_call_after_commit_on_create_after_transaction_commits_for_new_record
|
101
126
|
unless current_adapter?(:IBM_DBAdapter)
|
102
|
-
|
127
|
+
new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Date.today)
|
103
128
|
else
|
104
|
-
|
129
|
+
new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Time.now)
|
105
130
|
end
|
106
131
|
add_transaction_execution_blocks new_record
|
107
132
|
|
@@ -193,9 +218,9 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
193
218
|
|
194
219
|
def test_only_call_after_rollback_on_create_after_transaction_rollsback_for_new_record
|
195
220
|
unless current_adapter?(:IBM_DBAdapter)
|
196
|
-
|
221
|
+
new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Date.today)
|
197
222
|
else
|
198
|
-
|
223
|
+
new_record = TopicWithCallbacks.new(:title => "New topic", :written_on => Time.now)
|
199
224
|
end
|
200
225
|
add_transaction_execution_blocks new_record
|
201
226
|
|
@@ -208,21 +233,21 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
208
233
|
end
|
209
234
|
|
210
235
|
def test_call_after_rollback_when_commit_fails
|
211
|
-
@first.
|
212
|
-
|
213
|
-
@first.class.connection.singleton_class.class_eval do
|
214
|
-
def commit_db_transaction; raise "boom!"; end
|
215
|
-
end
|
236
|
+
@first.after_commit_block { |r| r.history << :after_commit }
|
237
|
+
@first.after_rollback_block { |r| r.history << :after_rollback }
|
216
238
|
|
217
|
-
|
218
|
-
@first.
|
239
|
+
assert_raises RuntimeError do
|
240
|
+
@first.transaction do
|
241
|
+
tx = @first.class.connection.transaction_manager.current_transaction
|
242
|
+
def tx.commit
|
243
|
+
raise
|
244
|
+
end
|
219
245
|
|
220
|
-
|
221
|
-
|
222
|
-
ensure
|
223
|
-
@first.class.connection.singleton_class.send(:remove_method, :commit_db_transaction)
|
224
|
-
@first.class.connection.singleton_class.send(:alias_method, :commit_db_transaction, :real_method_commit_db_transaction)
|
246
|
+
@first.save
|
247
|
+
end
|
225
248
|
end
|
249
|
+
|
250
|
+
assert_equal [:after_rollback], @first.history
|
226
251
|
end
|
227
252
|
|
228
253
|
def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint
|
@@ -274,47 +299,6 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
274
299
|
assert_equal 2, @first.rollbacks
|
275
300
|
end
|
276
301
|
|
277
|
-
def test_after_transaction_callbacks_should_prevent_callbacks_from_being_called
|
278
|
-
old_transaction_config = ActiveRecord::Base.raise_in_transactional_callbacks
|
279
|
-
ActiveRecord::Base.raise_in_transactional_callbacks = false
|
280
|
-
|
281
|
-
def @first.last_after_transaction_error=(e); @last_transaction_error = e; end
|
282
|
-
def @first.last_after_transaction_error; @last_transaction_error; end
|
283
|
-
@first.after_commit_block{|r| r.last_after_transaction_error = :commit; raise "fail!";}
|
284
|
-
@first.after_rollback_block{|r| r.last_after_transaction_error = :rollback; raise "fail!";}
|
285
|
-
|
286
|
-
second = TopicWithCallbacks.find(3)
|
287
|
-
second.after_commit_block{|r| r.history << :after_commit}
|
288
|
-
second.after_rollback_block{|r| r.history << :after_rollback}
|
289
|
-
|
290
|
-
Topic.transaction do
|
291
|
-
@first.save!
|
292
|
-
second.save!
|
293
|
-
end
|
294
|
-
assert_equal :commit, @first.last_after_transaction_error
|
295
|
-
assert_equal [:after_commit], second.history
|
296
|
-
|
297
|
-
second.history.clear
|
298
|
-
Topic.transaction do
|
299
|
-
@first.save!
|
300
|
-
second.save!
|
301
|
-
raise ActiveRecord::Rollback
|
302
|
-
end
|
303
|
-
assert_equal :rollback, @first.last_after_transaction_error
|
304
|
-
assert_equal [:after_rollback], second.history
|
305
|
-
ensure
|
306
|
-
ActiveRecord::Base.raise_in_transactional_callbacks = old_transaction_config
|
307
|
-
end
|
308
|
-
|
309
|
-
def test_after_commit_should_not_raise_when_raise_in_transactional_callbacks_false
|
310
|
-
old_transaction_config = ActiveRecord::Base.raise_in_transactional_callbacks
|
311
|
-
ActiveRecord::Base.raise_in_transactional_callbacks = false
|
312
|
-
@first.after_commit_block{ fail "boom" }
|
313
|
-
Topic.transaction { @first.save! }
|
314
|
-
ensure
|
315
|
-
ActiveRecord::Base.raise_in_transactional_callbacks = old_transaction_config
|
316
|
-
end
|
317
|
-
|
318
302
|
def test_after_commit_callback_should_not_swallow_errors
|
319
303
|
@first.after_commit_block{ fail "boom" }
|
320
304
|
assert_raises(RuntimeError) do
|
@@ -417,7 +401,7 @@ class TransactionCallbacksTest < ActiveRecord::TestCase
|
|
417
401
|
end
|
418
402
|
|
419
403
|
class CallbacksOnMultipleActionsTest < ActiveRecord::TestCase
|
420
|
-
self.
|
404
|
+
self.use_transactional_tests = false
|
421
405
|
|
422
406
|
class TopicWithCallbacksOnMultipleActions < ActiveRecord::Base
|
423
407
|
self.table_name = :topics
|
@@ -426,6 +410,9 @@ class CallbacksOnMultipleActionsTest < ActiveRecord::TestCase
|
|
426
410
|
after_commit(on: [:create, :update]) { |record| record.history << :create_and_update }
|
427
411
|
after_commit(on: [:update, :destroy]) { |record| record.history << :update_and_destroy }
|
428
412
|
|
413
|
+
before_commit(if: :save_before_commit_history) { |record| record.history << :before_commit }
|
414
|
+
before_commit(if: :update_title) { |record| record.update(title: "before commit title") }
|
415
|
+
|
429
416
|
def clear_history
|
430
417
|
@history = []
|
431
418
|
end
|
@@ -433,6 +420,8 @@ class CallbacksOnMultipleActionsTest < ActiveRecord::TestCase
|
|
433
420
|
def history
|
434
421
|
@history ||= []
|
435
422
|
end
|
423
|
+
|
424
|
+
attr_accessor :save_before_commit_history, :update_title
|
436
425
|
end
|
437
426
|
|
438
427
|
def test_after_commit_on_multiple_actions
|
@@ -449,4 +438,81 @@ class CallbacksOnMultipleActionsTest < ActiveRecord::TestCase
|
|
449
438
|
topic.destroy
|
450
439
|
assert_equal [:update_and_destroy, :create_and_destroy], topic.history
|
451
440
|
end
|
441
|
+
|
442
|
+
def test_before_commit_actions
|
443
|
+
topic = TopicWithCallbacksOnMultipleActions.new
|
444
|
+
topic.save_before_commit_history = true
|
445
|
+
topic.save
|
446
|
+
|
447
|
+
assert_equal [:before_commit, :create_and_update, :create_and_destroy], topic.history
|
448
|
+
end
|
449
|
+
|
450
|
+
def test_before_commit_update_in_same_transaction
|
451
|
+
topic = TopicWithCallbacksOnMultipleActions.new
|
452
|
+
topic.update_title = true
|
453
|
+
topic.save
|
454
|
+
|
455
|
+
assert_equal "before commit title", topic.title
|
456
|
+
assert_equal "before commit title", topic.reload.title
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
|
461
|
+
class TransactionEnrollmentCallbacksTest < ActiveRecord::TestCase
|
462
|
+
|
463
|
+
class TopicWithoutTransactionalEnrollmentCallbacks < ActiveRecord::Base
|
464
|
+
self.table_name = :topics
|
465
|
+
|
466
|
+
before_commit_without_transaction_enrollment { |r| r.history << :before_commit }
|
467
|
+
after_commit_without_transaction_enrollment { |r| r.history << :after_commit }
|
468
|
+
after_rollback_without_transaction_enrollment { |r| r.history << :rollback }
|
469
|
+
|
470
|
+
def history
|
471
|
+
@history ||= []
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
def setup
|
476
|
+
@topic = TopicWithoutTransactionalEnrollmentCallbacks.create!
|
477
|
+
end
|
478
|
+
|
479
|
+
def test_commit_does_not_run_transactions_callbacks_without_enrollment
|
480
|
+
@topic.transaction do
|
481
|
+
@topic.content = 'foo'
|
482
|
+
@topic.save!
|
483
|
+
end
|
484
|
+
assert @topic.history.empty?
|
485
|
+
end
|
486
|
+
|
487
|
+
def test_commit_run_transactions_callbacks_with_explicit_enrollment
|
488
|
+
@topic.transaction do
|
489
|
+
2.times do
|
490
|
+
@topic.content = 'foo'
|
491
|
+
@topic.save!
|
492
|
+
end
|
493
|
+
@topic.class.connection.add_transaction_record(@topic)
|
494
|
+
end
|
495
|
+
assert_equal [:before_commit, :after_commit], @topic.history
|
496
|
+
end
|
497
|
+
|
498
|
+
def test_rollback_does_not_run_transactions_callbacks_without_enrollment
|
499
|
+
@topic.transaction do
|
500
|
+
@topic.content = 'foo'
|
501
|
+
@topic.save!
|
502
|
+
raise ActiveRecord::Rollback
|
503
|
+
end
|
504
|
+
assert @topic.history.empty?
|
505
|
+
end
|
506
|
+
|
507
|
+
def test_rollback_run_transactions_callbacks_with_explicit_enrollment
|
508
|
+
@topic.transaction do
|
509
|
+
2.times do
|
510
|
+
@topic.content = 'foo'
|
511
|
+
@topic.save!
|
512
|
+
end
|
513
|
+
@topic.class.connection.add_transaction_record(@topic)
|
514
|
+
raise ActiveRecord::Rollback
|
515
|
+
end
|
516
|
+
assert_equal [:rollback], @topic.history
|
517
|
+
end
|
452
518
|
end
|
@@ -2,7 +2,7 @@ require 'cases/helper'
|
|
2
2
|
|
3
3
|
unless ActiveRecord::Base.connection.supports_transaction_isolation?
|
4
4
|
class TransactionIsolationUnsupportedTest < ActiveRecord::TestCase
|
5
|
-
self.
|
5
|
+
self.use_transactional_tests = false
|
6
6
|
|
7
7
|
class Tag < ActiveRecord::Base
|
8
8
|
end
|
@@ -17,7 +17,7 @@ end
|
|
17
17
|
|
18
18
|
if ActiveRecord::Base.connection.supports_transaction_isolation?
|
19
19
|
class TransactionIsolationTest < ActiveRecord::TestCase
|
20
|
-
self.
|
20
|
+
self.use_transactional_tests = false
|
21
21
|
|
22
22
|
class Tag < ActiveRecord::Base
|
23
23
|
self.table_name = 'tags'
|
@@ -9,11 +9,11 @@ require 'models/post'
|
|
9
9
|
require 'models/movie'
|
10
10
|
|
11
11
|
class TransactionTest < ActiveRecord::TestCase
|
12
|
-
self.
|
12
|
+
self.use_transactional_tests = false
|
13
13
|
fixtures :topics, :developers, :authors, :posts, :author_addresses
|
14
14
|
|
15
15
|
def setup
|
16
|
-
@first, @second = Topic.find(1, 2).sort_by
|
16
|
+
@first, @second = Topic.find(1, 2).sort_by(&:id)
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_persisted_in_a_model_with_custom_primary_key_after_failed_save
|
@@ -58,6 +58,11 @@ class TransactionTest < ActiveRecord::TestCase
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
def test_add_to_null_transaction
|
62
|
+
topic = Topic.new
|
63
|
+
topic.add_to_transaction
|
64
|
+
end
|
65
|
+
|
61
66
|
def test_successful_with_return
|
62
67
|
committed = false
|
63
68
|
|
@@ -188,7 +193,7 @@ class TransactionTest < ActiveRecord::TestCase
|
|
188
193
|
assert posts_count > 0
|
189
194
|
status = author.update(name: nil, post_ids: [])
|
190
195
|
assert !status
|
191
|
-
assert_equal posts_count, author.posts
|
196
|
+
assert_equal posts_count, author.posts.reload.size
|
192
197
|
end
|
193
198
|
|
194
199
|
def test_update_should_rollback_on_failure!
|
@@ -198,7 +203,17 @@ class TransactionTest < ActiveRecord::TestCase
|
|
198
203
|
assert_raise(ActiveRecord::RecordInvalid) do
|
199
204
|
author.update!(name: nil, post_ids: [])
|
200
205
|
end
|
201
|
-
assert_equal posts_count, author.posts
|
206
|
+
assert_equal posts_count, author.posts.reload.size
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_cancellation_from_returning_false_in_before_filter
|
210
|
+
def @first.before_save_for_transaction
|
211
|
+
false
|
212
|
+
end
|
213
|
+
|
214
|
+
assert_deprecated do
|
215
|
+
@first.save
|
216
|
+
end
|
202
217
|
end
|
203
218
|
|
204
219
|
def test_cancellation_from_before_destroy_rollbacks_in_destroy
|
@@ -477,13 +492,17 @@ class TransactionTest < ActiveRecord::TestCase
|
|
477
492
|
end
|
478
493
|
|
479
494
|
def test_rollback_when_commit_raises
|
480
|
-
Topic.connection
|
481
|
-
|
482
|
-
|
495
|
+
assert_called(Topic.connection, :begin_db_transaction) do
|
496
|
+
Topic.connection.stub(:commit_db_transaction, ->{ raise('OH NOES') }) do
|
497
|
+
assert_called(Topic.connection, :rollback_db_transaction) do
|
483
498
|
|
484
|
-
|
485
|
-
|
486
|
-
|
499
|
+
e = assert_raise RuntimeError do
|
500
|
+
Topic.transaction do
|
501
|
+
# do nothing
|
502
|
+
end
|
503
|
+
end
|
504
|
+
assert_equal 'OH NOES', e.message
|
505
|
+
end
|
487
506
|
end
|
488
507
|
end
|
489
508
|
end
|
@@ -491,44 +510,42 @@ class TransactionTest < ActiveRecord::TestCase
|
|
491
510
|
def test_rollback_when_saving_a_frozen_record
|
492
511
|
topic = Topic.new(:title => 'test')
|
493
512
|
topic.freeze
|
494
|
-
e = assert_raise(
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
513
|
+
e = assert_raise(frozen_error_class) { topic.save }
|
514
|
+
# Not good enough, but we can't do much
|
515
|
+
# about it since there is no specific error
|
516
|
+
# for frozen objects.
|
517
|
+
assert_match(/frozen/i, e.message)
|
518
|
+
assert !topic.persisted?, "not persisted"
|
499
519
|
assert_nil topic.id
|
500
520
|
assert topic.frozen?, 'not frozen'
|
501
521
|
end
|
502
522
|
|
503
|
-
|
504
|
-
|
505
|
-
# and there's nothing we can do about it.
|
506
|
-
if !RUBY_VERSION.start_with?('1.9') && !in_memory_db?
|
507
|
-
def test_rollback_when_thread_killed
|
508
|
-
queue = Queue.new
|
509
|
-
thread = Thread.new do
|
510
|
-
Topic.transaction do
|
511
|
-
@first.approved = true
|
512
|
-
@second.approved = false
|
513
|
-
@first.save
|
523
|
+
def test_rollback_when_thread_killed
|
524
|
+
return if in_memory_db?
|
514
525
|
|
515
|
-
|
516
|
-
|
526
|
+
queue = Queue.new
|
527
|
+
thread = Thread.new do
|
528
|
+
Topic.transaction do
|
529
|
+
@first.approved = true
|
530
|
+
@second.approved = false
|
531
|
+
@first.save
|
517
532
|
|
518
|
-
|
519
|
-
|
533
|
+
queue.push nil
|
534
|
+
sleep
|
535
|
+
|
536
|
+
@second.save
|
520
537
|
end
|
538
|
+
end
|
521
539
|
|
522
|
-
|
523
|
-
|
524
|
-
|
540
|
+
queue.pop
|
541
|
+
thread.kill
|
542
|
+
thread.join
|
525
543
|
|
526
|
-
|
527
|
-
|
544
|
+
assert @first.approved?, "First should still be changed in the objects"
|
545
|
+
assert !@second.approved?, "Second should still be changed in the objects"
|
528
546
|
|
529
|
-
|
530
|
-
|
531
|
-
end
|
547
|
+
assert !Topic.find(1).approved?, "First shouldn't have been approved"
|
548
|
+
assert Topic.find(2).approved?, "Second should still be approved"
|
532
549
|
end
|
533
550
|
|
534
551
|
def test_restore_active_record_state_for_all_records_in_a_transaction
|
@@ -686,7 +703,8 @@ class TransactionTest < ActiveRecord::TestCase
|
|
686
703
|
end
|
687
704
|
end
|
688
705
|
ensure
|
689
|
-
connection.drop_table
|
706
|
+
connection.drop_table 'transaction_without_primary_keys'
|
707
|
+
#, if_exists: true
|
690
708
|
end
|
691
709
|
|
692
710
|
private
|
@@ -696,14 +714,14 @@ class TransactionTest < ActiveRecord::TestCase
|
|
696
714
|
meta = class << topic; self; end
|
697
715
|
meta.send("define_method", "before_#{filter}_for_transaction") do
|
698
716
|
Book.create
|
699
|
-
|
717
|
+
throw(:abort)
|
700
718
|
end
|
701
719
|
end
|
702
720
|
end
|
703
721
|
end
|
704
722
|
|
705
723
|
class TransactionsWithTransactionalFixturesTest < ActiveRecord::TestCase
|
706
|
-
self.
|
724
|
+
self.use_transactional_tests = true
|
707
725
|
fixtures :topics
|
708
726
|
|
709
727
|
def test_automatic_savepoint_in_outer_transaction
|
@@ -760,7 +778,7 @@ if current_adapter?(:PostgreSQLAdapter)
|
|
760
778
|
end
|
761
779
|
end
|
762
780
|
|
763
|
-
threads.each
|
781
|
+
threads.each(&:join)
|
764
782
|
end
|
765
783
|
end
|
766
784
|
|
@@ -808,7 +826,7 @@ if current_adapter?(:PostgreSQLAdapter)
|
|
808
826
|
Developer.connection.close
|
809
827
|
end
|
810
828
|
|
811
|
-
threads.each
|
829
|
+
threads.each(&:join)
|
812
830
|
end
|
813
831
|
|
814
832
|
assert_equal original_salary, Developer.find(1).salary
|