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.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/owner'
3
- require 'models/pet'
4
- require 'models/topic'
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
- self.save! if save_on_after_create
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 'better pop this txn from the stack!' }
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
- unless current_adapter?(:IBM_DBAdapter)
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!(:title => "New topic", :written_on => Date.today)
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: 'foo')
225
+ r = ReplyWithCallbacks.new(content: "foo")
146
226
  r.save_on_after_create = true
147
227
  r.save!
148
- r.content = 'bar'
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
- assert @first.history.empty?
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
- assert @first.history.empty?
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
- unless current_adapter?(:IBM_DBAdapter)
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(:requires_new => true) do
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(:requires_new => true) do
364
+ Topic.transaction(requires_new: true) do
289
365
  @first.save!
290
366
  raise ActiveRecord::Rollback
291
367
  end
292
- Topic.transaction(:requires_new => true) do
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: 'create') }
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: 'create') }
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
- private
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 TransactionEnrollmentCallbacksTest < ActiveRecord::TestCase
462
-
463
- class TopicWithoutTransactionalEnrollmentCallbacks < ActiveRecord::Base
646
+ class TopicWithHistory < ActiveRecord::Base
464
647
  self.table_name = :topics
465
648
 
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 }
649
+ def self.clear_history
650
+ @@history = []
651
+ end
469
652
 
470
- def history
471
- @history ||= []
653
+ def self.history
654
+ @@history ||= []
472
655
  end
473
656
  end
474
657
 
475
- def setup
476
- @topic = TopicWithoutTransactionalEnrollmentCallbacks.create!
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
- 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?
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 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)
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
- assert_equal [:before_commit, :after_commit], @topic.history
686
+
687
+ topic.destroy
688
+
689
+ assert_equal [:commit_on_destroy], TopicWithCallbacksOnDestroy.history
496
690
  end
497
691
 
498
- def test_rollback_does_not_run_transactions_callbacks_without_enrollment
499
- @topic.transaction do
500
- @topic.content = 'foo'
501
- @topic.save!
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
- assert @topic.history.empty?
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 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
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
- assert_equal [:rollback], @topic.history
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