ibm_db 5.6.1-arm64-darwin-24

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 (753) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +299 -0
  3. data/LICENSE +55 -0
  4. data/MANIFEST +14 -0
  5. data/ParameterizedQueries README +39 -0
  6. data/README +210 -0
  7. data/ext/Makefile +270 -0
  8. data/ext/Makefile.nt32 +181 -0
  9. data/ext/Makefile.nt32.191 +212 -0
  10. data/ext/extconf.rb +320 -0
  11. data/ext/gil_release_version.h +3 -0
  12. data/ext/ibm_db.bundle +0 -0
  13. data/ext/ibm_db.c +11865 -0
  14. data/ext/ibm_db.o +0 -0
  15. data/ext/mkmf.log +98 -0
  16. data/ext/ruby_ibm_db.h +241 -0
  17. data/ext/ruby_ibm_db_cli.c +867 -0
  18. data/ext/ruby_ibm_db_cli.h +508 -0
  19. data/ext/ruby_ibm_db_cli.o +0 -0
  20. data/ext/unicode_support_version.h +3 -0
  21. data/init.rb +42 -0
  22. data/lib/IBM_DB.rb +27 -0
  23. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4407 -0
  24. data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1965 -0
  25. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -0
  26. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -0
  27. data/lib/ibm_db.bundle +0 -0
  28. data/test/active_record/connection_adapters/fake_adapter.rb +52 -0
  29. data/test/activejob/destroy_association_async_test.rb +305 -0
  30. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  31. data/test/activejob/helper.rb +15 -0
  32. data/test/assets/example.log +1 -0
  33. data/test/assets/flowers.jpg +0 -0
  34. data/test/assets/schema_dump_5_1.yml +345 -0
  35. data/test/assets/test.txt +1 -0
  36. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  37. data/test/cases/adapter_test.rb +565 -0
  38. data/test/cases/adapters/mysql2/active_schema_test.rb +203 -0
  39. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  40. data/test/cases/adapters/mysql2/bind_parameter_test.rb +52 -0
  41. data/test/cases/adapters/mysql2/boolean_test.rb +102 -0
  42. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +65 -0
  43. data/test/cases/adapters/mysql2/charset_collation_test.rb +57 -0
  44. data/test/cases/adapters/mysql2/connection_test.rb +208 -0
  45. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  46. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +49 -0
  47. data/test/cases/adapters/mysql2/enum_test.rb +47 -0
  48. data/test/cases/adapters/mysql2/explain_test.rb +23 -0
  49. data/test/cases/adapters/mysql2/json_test.rb +24 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  51. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +238 -0
  52. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  53. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  54. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  55. data/test/cases/adapters/mysql2/schema_migrations_test.rb +64 -0
  56. data/test/cases/adapters/mysql2/schema_test.rb +128 -0
  57. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  58. data/test/cases/adapters/mysql2/sp_test.rb +38 -0
  59. data/test/cases/adapters/mysql2/sql_types_test.rb +16 -0
  60. data/test/cases/adapters/mysql2/table_options_test.rb +125 -0
  61. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  62. data/test/cases/adapters/mysql2/unsigned_type_test.rb +68 -0
  63. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  64. data/test/cases/adapters/postgresql/active_schema_test.rb +113 -0
  65. data/test/cases/adapters/postgresql/array_test.rb +394 -0
  66. data/test/cases/adapters/postgresql/bit_string_test.rb +84 -0
  67. data/test/cases/adapters/postgresql/bytea_test.rb +135 -0
  68. data/test/cases/adapters/postgresql/case_insensitive_test.rb +27 -0
  69. data/test/cases/adapters/postgresql/change_schema_test.rb +40 -0
  70. data/test/cases/adapters/postgresql/cidr_test.rb +27 -0
  71. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  72. data/test/cases/adapters/postgresql/collation_test.rb +55 -0
  73. data/test/cases/adapters/postgresql/composite_test.rb +134 -0
  74. data/test/cases/adapters/postgresql/connection_test.rb +245 -0
  75. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  76. data/test/cases/adapters/postgresql/datatype_test.rb +89 -0
  77. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  78. data/test/cases/adapters/postgresql/domain_test.rb +49 -0
  79. data/test/cases/adapters/postgresql/enum_test.rb +93 -0
  80. data/test/cases/adapters/postgresql/explain_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/extension_migration_test.rb +64 -0
  82. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  83. data/test/cases/adapters/postgresql/full_text_test.rb +46 -0
  84. data/test/cases/adapters/postgresql/geometric_test.rb +372 -0
  85. data/test/cases/adapters/postgresql/hstore_test.rb +390 -0
  86. data/test/cases/adapters/postgresql/infinity_test.rb +108 -0
  87. data/test/cases/adapters/postgresql/integer_test.rb +27 -0
  88. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  89. data/test/cases/adapters/postgresql/json_test.rb +52 -0
  90. data/test/cases/adapters/postgresql/ltree_test.rb +51 -0
  91. data/test/cases/adapters/postgresql/money_test.rb +127 -0
  92. data/test/cases/adapters/postgresql/network_test.rb +102 -0
  93. data/test/cases/adapters/postgresql/numbers_test.rb +51 -0
  94. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  95. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  96. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  97. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +447 -0
  98. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  99. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  100. data/test/cases/adapters/postgresql/quoting_test.rb +50 -0
  101. data/test/cases/adapters/postgresql/range_test.rb +457 -0
  102. data/test/cases/adapters/postgresql/referential_integrity_test.rb +112 -0
  103. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -0
  104. data/test/cases/adapters/postgresql/schema_authorization_test.rb +110 -0
  105. data/test/cases/adapters/postgresql/schema_test.rb +713 -0
  106. data/test/cases/adapters/postgresql/serial_test.rb +156 -0
  107. data/test/cases/adapters/postgresql/statement_pool_test.rb +61 -0
  108. data/test/cases/adapters/postgresql/timestamp_test.rb +92 -0
  109. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  110. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  111. data/test/cases/adapters/postgresql/type_lookup_test.rb +35 -0
  112. data/test/cases/adapters/postgresql/utils_test.rb +64 -0
  113. data/test/cases/adapters/postgresql/uuid_test.rb +411 -0
  114. data/test/cases/adapters/postgresql/xml_test.rb +50 -0
  115. data/test/cases/adapters/sqlite3/collation_test.rb +64 -0
  116. data/test/cases/adapters/sqlite3/copy_table_test.rb +101 -0
  117. data/test/cases/adapters/sqlite3/explain_test.rb +23 -0
  118. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  119. data/test/cases/adapters/sqlite3/quoting_test.rb +79 -0
  120. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  121. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +628 -0
  122. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  123. data/test/cases/adapters/sqlite3/statement_pool_test.rb +21 -0
  124. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  125. data/test/cases/aggregations_test.rb +170 -0
  126. data/test/cases/annotate_test.rb +46 -0
  127. data/test/cases/ar_schema_test.rb +213 -0
  128. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  129. data/test/cases/arel/attributes/math_test.rb +83 -0
  130. data/test/cases/arel/attributes_test.rb +27 -0
  131. data/test/cases/arel/collectors/bind_test.rb +40 -0
  132. data/test/cases/arel/collectors/composite_test.rb +47 -0
  133. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  134. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  135. data/test/cases/arel/crud_test.rb +65 -0
  136. data/test/cases/arel/delete_manager_test.rb +53 -0
  137. data/test/cases/arel/factory_methods_test.rb +46 -0
  138. data/test/cases/arel/helper.rb +45 -0
  139. data/test/cases/arel/insert_manager_test.rb +241 -0
  140. data/test/cases/arel/nodes/and_test.rb +30 -0
  141. data/test/cases/arel/nodes/as_test.rb +36 -0
  142. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  143. data/test/cases/arel/nodes/bin_test.rb +35 -0
  144. data/test/cases/arel/nodes/binary_test.rb +29 -0
  145. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  146. data/test/cases/arel/nodes/case_test.rb +96 -0
  147. data/test/cases/arel/nodes/casted_test.rb +18 -0
  148. data/test/cases/arel/nodes/comment_test.rb +22 -0
  149. data/test/cases/arel/nodes/count_test.rb +35 -0
  150. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  151. data/test/cases/arel/nodes/descending_test.rb +46 -0
  152. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  153. data/test/cases/arel/nodes/equality_test.rb +62 -0
  154. data/test/cases/arel/nodes/extract_test.rb +43 -0
  155. data/test/cases/arel/nodes/false_test.rb +21 -0
  156. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  157. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  158. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  159. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  160. data/test/cases/arel/nodes/node_test.rb +22 -0
  161. data/test/cases/arel/nodes/not_test.rb +31 -0
  162. data/test/cases/arel/nodes/or_test.rb +36 -0
  163. data/test/cases/arel/nodes/over_test.rb +69 -0
  164. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  165. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  166. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  167. data/test/cases/arel/nodes/sum_test.rb +35 -0
  168. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  169. data/test/cases/arel/nodes/true_test.rb +21 -0
  170. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  171. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  172. data/test/cases/arel/nodes/window_test.rb +81 -0
  173. data/test/cases/arel/nodes_test.rb +34 -0
  174. data/test/cases/arel/select_manager_test.rb +1238 -0
  175. data/test/cases/arel/support/fake_record.rb +135 -0
  176. data/test/cases/arel/table_test.rb +216 -0
  177. data/test/cases/arel/update_manager_test.rb +126 -0
  178. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  179. data/test/cases/arel/visitors/dot_test.rb +90 -0
  180. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  181. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  182. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  183. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  184. data/test/cases/associations/association_scope_test.rb +16 -0
  185. data/test/cases/associations/belongs_to_associations_test.rb +1493 -0
  186. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +43 -0
  187. data/test/cases/associations/callbacks_test.rb +208 -0
  188. data/test/cases/associations/cascaded_eager_loading_test.rb +245 -0
  189. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +156 -0
  190. data/test/cases/associations/eager_load_nested_include_test.rb +127 -0
  191. data/test/cases/associations/eager_singularization_test.rb +148 -0
  192. data/test/cases/associations/eager_test.rb +1658 -0
  193. data/test/cases/associations/extension_test.rb +93 -0
  194. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1025 -0
  195. data/test/cases/associations/has_many_associations_test.rb +3074 -0
  196. data/test/cases/associations/has_many_through_associations_test.rb +1580 -0
  197. data/test/cases/associations/has_one_associations_test.rb +872 -0
  198. data/test/cases/associations/has_one_through_associations_test.rb +429 -0
  199. data/test/cases/associations/inner_join_association_test.rb +215 -0
  200. data/test/cases/associations/inverse_associations_test.rb +941 -0
  201. data/test/cases/associations/join_model_test.rb +787 -0
  202. data/test/cases/associations/left_outer_join_association_test.rb +123 -0
  203. data/test/cases/associations/nested_through_associations_test.rb +636 -0
  204. data/test/cases/associations/required_test.rb +127 -0
  205. data/test/cases/associations_test.rb +516 -0
  206. data/test/cases/attribute_decorators_test.rb +126 -0
  207. data/test/cases/attribute_methods/read_test.rb +60 -0
  208. data/test/cases/attribute_methods_test.rb +1124 -0
  209. data/test/cases/attribute_set_test.rb +270 -0
  210. data/test/cases/attribute_test.rb +246 -0
  211. data/test/cases/attributes_test.rb +371 -0
  212. data/test/cases/autosave_association_test.rb +1953 -0
  213. data/test/cases/base_prevent_writes_test.rb +229 -0
  214. data/test/cases/base_test.rb +1770 -0
  215. data/test/cases/batches_test.rb +695 -0
  216. data/test/cases/binary_test.rb +39 -0
  217. data/test/cases/bind_parameter_test.rb +283 -0
  218. data/test/cases/boolean_test.rb +52 -0
  219. data/test/cases/cache_key_test.rb +131 -0
  220. data/test/cases/calculations_test.rb +1361 -0
  221. data/test/cases/callbacks_test.rb +503 -0
  222. data/test/cases/clone_test.rb +45 -0
  223. data/test/cases/coders/json_test.rb +17 -0
  224. data/test/cases/coders/yaml_column_test.rb +66 -0
  225. data/test/cases/collection_cache_key_test.rb +272 -0
  226. data/test/cases/column_alias_test.rb +19 -0
  227. data/test/cases/column_definition_test.rb +34 -0
  228. data/test/cases/comment_test.rb +204 -0
  229. data/test/cases/connection_adapters/adapter_leasing_test.rb +60 -0
  230. data/test/cases/connection_adapters/connection_handler_test.rb +467 -0
  231. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  232. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  233. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  234. data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
  235. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  236. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  237. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  238. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +436 -0
  239. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +81 -0
  240. data/test/cases/connection_adapters/quoting_test.rb +13 -0
  241. data/test/cases/connection_adapters/schema_cache_test.rb +294 -0
  242. data/test/cases/connection_adapters/type_lookup_test.rb +119 -0
  243. data/test/cases/connection_management_test.rb +114 -0
  244. data/test/cases/connection_pool_test.rb +754 -0
  245. data/test/cases/connection_specification/resolver_test.rb +131 -0
  246. data/test/cases/core_test.rb +136 -0
  247. data/test/cases/counter_cache_test.rb +368 -0
  248. data/test/cases/custom_locking_test.rb +19 -0
  249. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  250. data/test/cases/database_configurations/resolver_test.rb +150 -0
  251. data/test/cases/database_configurations_test.rb +145 -0
  252. data/test/cases/database_selector_test.rb +296 -0
  253. data/test/cases/database_statements_test.rb +36 -0
  254. data/test/cases/date_test.rb +36 -0
  255. data/test/cases/date_time_precision_test.rb +129 -0
  256. data/test/cases/date_time_test.rb +76 -0
  257. data/test/cases/defaults_test.rb +254 -0
  258. data/test/cases/delegated_type_test.rb +57 -0
  259. data/test/cases/dirty_test.rb +959 -0
  260. data/test/cases/disconnected_test.rb +30 -0
  261. data/test/cases/dup_test.rb +184 -0
  262. data/test/cases/enum_test.rb +823 -0
  263. data/test/cases/errors_test.rb +16 -0
  264. data/test/cases/explain_subscriber_test.rb +66 -0
  265. data/test/cases/explain_test.rb +79 -0
  266. data/test/cases/filter_attributes_test.rb +153 -0
  267. data/test/cases/finder_respond_to_test.rb +60 -0
  268. data/test/cases/finder_test.rb +1676 -0
  269. data/test/cases/fixture_set/file_test.rb +152 -0
  270. data/test/cases/fixtures_test.rb +1645 -0
  271. data/test/cases/forbidden_attributes_protection_test.rb +130 -0
  272. data/test/cases/habtm_destroy_order_test.rb +61 -0
  273. data/test/cases/helper.rb +233 -0
  274. data/test/cases/hot_compatibility_test.rb +143 -0
  275. data/test/cases/i18n_test.rb +46 -0
  276. data/test/cases/inheritance_test.rb +671 -0
  277. data/test/cases/insert_all_test.rb +489 -0
  278. data/test/cases/instrumentation_test.rb +101 -0
  279. data/test/cases/integration_test.rb +243 -0
  280. data/test/cases/invalid_connection_test.rb +26 -0
  281. data/test/cases/invertible_migration_test.rb +527 -0
  282. data/test/cases/json_attribute_test.rb +35 -0
  283. data/test/cases/json_serialization_test.rb +310 -0
  284. data/test/cases/json_shared_test_cases.rb +290 -0
  285. data/test/cases/locking_test.rb +787 -0
  286. data/test/cases/log_subscriber_test.rb +267 -0
  287. data/test/cases/marshal_serialization_test.rb +39 -0
  288. data/test/cases/migration/change_schema_test.rb +504 -0
  289. data/test/cases/migration/change_table_test.rb +364 -0
  290. data/test/cases/migration/check_constraint_test.rb +162 -0
  291. data/test/cases/migration/column_attributes_test.rb +186 -0
  292. data/test/cases/migration/column_positioning_test.rb +68 -0
  293. data/test/cases/migration/columns_test.rb +326 -0
  294. data/test/cases/migration/command_recorder_test.rb +437 -0
  295. data/test/cases/migration/compatibility_test.rb +673 -0
  296. data/test/cases/migration/create_join_table_test.rb +167 -0
  297. data/test/cases/migration/foreign_key_test.rb +581 -0
  298. data/test/cases/migration/helper.rb +40 -0
  299. data/test/cases/migration/index_test.rb +267 -0
  300. data/test/cases/migration/logger_test.rb +39 -0
  301. data/test/cases/migration/pending_migrations_test.rb +106 -0
  302. data/test/cases/migration/references_foreign_key_test.rb +235 -0
  303. data/test/cases/migration/references_index_test.rb +120 -0
  304. data/test/cases/migration/references_statements_test.rb +137 -0
  305. data/test/cases/migration/rename_table_test.rb +116 -0
  306. data/test/cases/migration_test.rb +1525 -0
  307. data/test/cases/migrator_test.rb +527 -0
  308. data/test/cases/mixin_test.rb +64 -0
  309. data/test/cases/modules_test.rb +174 -0
  310. data/test/cases/multi_db_migrator_test.rb +223 -0
  311. data/test/cases/multiparameter_attributes_test.rb +399 -0
  312. data/test/cases/multiple_db_test.rb +116 -0
  313. data/test/cases/nested_attributes_test.rb +1119 -0
  314. data/test/cases/nested_attributes_with_callbacks_test.rb +146 -0
  315. data/test/cases/null_relation_test.rb +84 -0
  316. data/test/cases/numeric_data_test.rb +93 -0
  317. data/test/cases/persistence_test.rb +1093 -0
  318. data/test/cases/pooled_connections_test.rb +73 -0
  319. data/test/cases/prepared_statement_status_test.rb +48 -0
  320. data/test/cases/primary_keys_test.rb +482 -0
  321. data/test/cases/query_cache_test.rb +915 -0
  322. data/test/cases/quoting_test.rb +303 -0
  323. data/test/cases/readonly_test.rb +120 -0
  324. data/test/cases/reaper_test.rb +199 -0
  325. data/test/cases/reflection_test.rb +520 -0
  326. data/test/cases/relation/delegation_test.rb +76 -0
  327. data/test/cases/relation/delete_all_test.rb +117 -0
  328. data/test/cases/relation/merging_test.rb +434 -0
  329. data/test/cases/relation/mutation_test.rb +145 -0
  330. data/test/cases/relation/or_test.rb +192 -0
  331. data/test/cases/relation/predicate_builder_test.rb +31 -0
  332. data/test/cases/relation/record_fetch_warning_test.rb +42 -0
  333. data/test/cases/relation/select_test.rb +67 -0
  334. data/test/cases/relation/update_all_test.rb +317 -0
  335. data/test/cases/relation/where_chain_test.rb +141 -0
  336. data/test/cases/relation/where_clause_test.rb +257 -0
  337. data/test/cases/relation/where_test.rb +429 -0
  338. data/test/cases/relation_test.rb +482 -0
  339. data/test/cases/relations_test.rb +2251 -0
  340. data/test/cases/reload_models_test.rb +26 -0
  341. data/test/cases/reserved_word_test.rb +141 -0
  342. data/test/cases/result_test.rb +141 -0
  343. data/test/cases/sanitize_test.rb +192 -0
  344. data/test/cases/schema_dumper_test.rb +550 -0
  345. data/test/cases/schema_loading_test.rb +53 -0
  346. data/test/cases/scoping/default_scoping_test.rb +569 -0
  347. data/test/cases/scoping/named_scoping_test.rb +649 -0
  348. data/test/cases/scoping/relation_scoping_test.rb +522 -0
  349. data/test/cases/secure_token_test.rb +47 -0
  350. data/test/cases/serialization_test.rb +106 -0
  351. data/test/cases/serialized_attribute_test.rb +455 -0
  352. data/test/cases/signed_id_test.rb +168 -0
  353. data/test/cases/statement_cache_test.rb +153 -0
  354. data/test/cases/statement_invalid_test.rb +42 -0
  355. data/test/cases/store_test.rb +320 -0
  356. data/test/cases/strict_loading_test.rb +473 -0
  357. data/test/cases/suppressor_test.rb +77 -0
  358. data/test/cases/tasks/database_tasks_test.rb +1526 -0
  359. data/test/cases/tasks/mysql_rake_test.rb +417 -0
  360. data/test/cases/tasks/postgresql_rake_test.rb +534 -0
  361. data/test/cases/tasks/sqlite_rake_test.rb +267 -0
  362. data/test/cases/test_case.rb +142 -0
  363. data/test/cases/test_databases_test.rb +79 -0
  364. data/test/cases/test_fixtures_test.rb +96 -0
  365. data/test/cases/time_precision_test.rb +125 -0
  366. data/test/cases/timestamp_test.rb +504 -0
  367. data/test/cases/touch_later_test.rb +123 -0
  368. data/test/cases/transaction_callbacks_test.rb +772 -0
  369. data/test/cases/transaction_isolation_test.rb +106 -0
  370. data/test/cases/transactions_test.rb +1285 -0
  371. data/test/cases/type/adapter_specific_registry_test.rb +145 -0
  372. data/test/cases/type/date_time_test.rb +16 -0
  373. data/test/cases/type/integer_test.rb +29 -0
  374. data/test/cases/type/string_test.rb +24 -0
  375. data/test/cases/type/time_test.rb +28 -0
  376. data/test/cases/type/type_map_test.rb +178 -0
  377. data/test/cases/type/unsigned_integer_test.rb +19 -0
  378. data/test/cases/type_test.rb +41 -0
  379. data/test/cases/types_test.rb +26 -0
  380. data/test/cases/unconnected_test.rb +46 -0
  381. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  382. data/test/cases/validations/absence_validation_test.rb +75 -0
  383. data/test/cases/validations/association_validation_test.rb +99 -0
  384. data/test/cases/validations/i18n_generate_message_validation_test.rb +102 -0
  385. data/test/cases/validations/i18n_validation_test.rb +87 -0
  386. data/test/cases/validations/length_validation_test.rb +80 -0
  387. data/test/cases/validations/numericality_validation_test.rb +181 -0
  388. data/test/cases/validations/presence_validation_test.rb +105 -0
  389. data/test/cases/validations/uniqueness_validation_test.rb +618 -0
  390. data/test/cases/validations_repair_helper.rb +21 -0
  391. data/test/cases/validations_test.rb +229 -0
  392. data/test/cases/view_test.rb +222 -0
  393. data/test/cases/yaml_serialization_test.rb +166 -0
  394. data/test/config.example.yml +97 -0
  395. data/test/config.rb +7 -0
  396. data/test/config.yml +220 -0
  397. data/test/connections/native_ibm_db/connection.rb +44 -0
  398. data/test/fixtures/accounts.yml +29 -0
  399. data/test/fixtures/admin/accounts.yml +2 -0
  400. data/test/fixtures/admin/randomly_named_a9.yml +7 -0
  401. data/test/fixtures/admin/randomly_named_b0.yml +7 -0
  402. data/test/fixtures/admin/users.yml +10 -0
  403. data/test/fixtures/all/admin +1 -0
  404. data/test/fixtures/all/developers.yml +0 -0
  405. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  406. data/test/fixtures/all/people.yml +0 -0
  407. data/test/fixtures/all/tasks.yml +0 -0
  408. data/test/fixtures/author_addresses.yml +11 -0
  409. data/test/fixtures/author_favorites.yml +4 -0
  410. data/test/fixtures/authors.yml +17 -0
  411. data/test/fixtures/bad_posts.yml +9 -0
  412. data/test/fixtures/binaries.yml +137 -0
  413. data/test/fixtures/books.yml +38 -0
  414. data/test/fixtures/bulbs.yml +5 -0
  415. data/test/fixtures/cars.yml +9 -0
  416. data/test/fixtures/categories/special_categories.yml +9 -0
  417. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  418. data/test/fixtures/categories.yml +19 -0
  419. data/test/fixtures/categories_ordered.yml +7 -0
  420. data/test/fixtures/categories_posts.yml +34 -0
  421. data/test/fixtures/categorizations.yml +23 -0
  422. data/test/fixtures/citations.yml +5 -0
  423. data/test/fixtures/clubs.yml +8 -0
  424. data/test/fixtures/collections.yml +3 -0
  425. data/test/fixtures/colleges.yml +3 -0
  426. data/test/fixtures/comments.yml +72 -0
  427. data/test/fixtures/companies.yml +72 -0
  428. data/test/fixtures/computers.yml +12 -0
  429. data/test/fixtures/content.yml +3 -0
  430. data/test/fixtures/content_positions.yml +3 -0
  431. data/test/fixtures/courses.yml +8 -0
  432. data/test/fixtures/customers.yml +35 -0
  433. data/test/fixtures/dashboards.yml +6 -0
  434. data/test/fixtures/dead_parrots.yml +5 -0
  435. data/test/fixtures/developers.yml +22 -0
  436. data/test/fixtures/developers_projects.yml +17 -0
  437. data/test/fixtures/dog_lovers.yml +7 -0
  438. data/test/fixtures/dogs.yml +4 -0
  439. data/test/fixtures/doubloons.yml +3 -0
  440. data/test/fixtures/edges.yml +5 -0
  441. data/test/fixtures/entrants.yml +14 -0
  442. data/test/fixtures/essays.yml +16 -0
  443. data/test/fixtures/faces.yml +11 -0
  444. data/test/fixtures/fk_test_has_fk.yml +3 -0
  445. data/test/fixtures/fk_test_has_pk.yml +2 -0
  446. data/test/fixtures/friendships.yml +4 -0
  447. data/test/fixtures/funny_jokes.yml +10 -0
  448. data/test/fixtures/humans.yml +5 -0
  449. data/test/fixtures/interests.yml +33 -0
  450. data/test/fixtures/items.yml +3 -0
  451. data/test/fixtures/jobs.yml +7 -0
  452. data/test/fixtures/legacy_things.yml +3 -0
  453. data/test/fixtures/live_parrots.yml +4 -0
  454. data/test/fixtures/mateys.yml +4 -0
  455. data/test/fixtures/member_details.yml +8 -0
  456. data/test/fixtures/member_types.yml +6 -0
  457. data/test/fixtures/members.yml +11 -0
  458. data/test/fixtures/memberships.yml +41 -0
  459. data/test/fixtures/men.yml +5 -0
  460. data/test/fixtures/minimalistics.yml +5 -0
  461. data/test/fixtures/minivans.yml +5 -0
  462. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  463. data/test/fixtures/mixins.yml +29 -0
  464. data/test/fixtures/movies.yml +7 -0
  465. data/test/fixtures/naked/yml/accounts.yml +1 -0
  466. data/test/fixtures/naked/yml/companies.yml +1 -0
  467. data/test/fixtures/naked/yml/courses.yml +1 -0
  468. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  469. data/test/fixtures/naked/yml/parrots.yml +3 -0
  470. data/test/fixtures/naked/yml/trees.yml +3 -0
  471. data/test/fixtures/nodes.yml +29 -0
  472. data/test/fixtures/organizations.yml +5 -0
  473. data/test/fixtures/other_books.yml +26 -0
  474. data/test/fixtures/other_comments.yml +6 -0
  475. data/test/fixtures/other_dogs.yml +2 -0
  476. data/test/fixtures/other_posts.yml +8 -0
  477. data/test/fixtures/other_topics.yml +42 -0
  478. data/test/fixtures/owners.yml +9 -0
  479. data/test/fixtures/parrots.yml +33 -0
  480. data/test/fixtures/parrots_pirates.yml +7 -0
  481. data/test/fixtures/people.yml +24 -0
  482. data/test/fixtures/peoples_treasures.yml +3 -0
  483. data/test/fixtures/pets.yml +19 -0
  484. data/test/fixtures/pirates.yml +15 -0
  485. data/test/fixtures/posts.yml +88 -0
  486. data/test/fixtures/price_estimates.yml +16 -0
  487. data/test/fixtures/products.yml +4 -0
  488. data/test/fixtures/projects.yml +7 -0
  489. data/test/fixtures/randomly_named_a9.yml +7 -0
  490. data/test/fixtures/ratings.yml +14 -0
  491. data/test/fixtures/readers.yml +17 -0
  492. data/test/fixtures/references.yml +17 -0
  493. data/test/fixtures/reserved_words/distinct.yml +5 -0
  494. data/test/fixtures/reserved_words/distinct_select.yml +11 -0
  495. data/test/fixtures/reserved_words/group.yml +14 -0
  496. data/test/fixtures/reserved_words/select.yml +8 -0
  497. data/test/fixtures/reserved_words/values.yml +7 -0
  498. data/test/fixtures/ships.yml +6 -0
  499. data/test/fixtures/speedometers.yml +8 -0
  500. data/test/fixtures/sponsors.yml +15 -0
  501. data/test/fixtures/strict_zines.yml +2 -0
  502. data/test/fixtures/string_key_objects.yml +7 -0
  503. data/test/fixtures/subscribers.yml +11 -0
  504. data/test/fixtures/subscriptions.yml +12 -0
  505. data/test/fixtures/taggings.yml +78 -0
  506. data/test/fixtures/tags.yml +11 -0
  507. data/test/fixtures/tasks.yml +7 -0
  508. data/test/fixtures/teapots.yml +3 -0
  509. data/test/fixtures/to_be_linked/accounts.yml +2 -0
  510. data/test/fixtures/to_be_linked/users.yml +10 -0
  511. data/test/fixtures/topics.yml +49 -0
  512. data/test/fixtures/toys.yml +14 -0
  513. data/test/fixtures/traffic_lights.yml +10 -0
  514. data/test/fixtures/treasures.yml +10 -0
  515. data/test/fixtures/trees.yml +3 -0
  516. data/test/fixtures/uuid_children.yml +3 -0
  517. data/test/fixtures/uuid_parents.yml +2 -0
  518. data/test/fixtures/variants.yml +4 -0
  519. data/test/fixtures/vegetables.yml +20 -0
  520. data/test/fixtures/vertices.yml +4 -0
  521. data/test/fixtures/warehouse-things.yml +3 -0
  522. data/test/fixtures/warehouse_things.yml +3 -0
  523. data/test/fixtures/zines.yml +5 -0
  524. data/test/ibm_db_test.rb +25 -0
  525. data/test/migrations/10_urban/9_add_expressions.rb +13 -0
  526. data/test/migrations/decimal/1_give_me_big_numbers.rb +17 -0
  527. data/test/migrations/magic/1_currencies_have_symbols.rb +13 -0
  528. data/test/migrations/missing/1000_people_have_middle_names.rb +11 -0
  529. data/test/migrations/missing/1_people_have_last_names.rb +11 -0
  530. data/test/migrations/missing/3_we_need_reminders.rb +14 -0
  531. data/test/migrations/missing/4_innocent_jointable.rb +14 -0
  532. data/test/migrations/rename/1_we_need_things.rb +13 -0
  533. data/test/migrations/rename/2_rename_things.rb +11 -0
  534. data/test/migrations/to_copy/1_people_have_hobbies.rb +11 -0
  535. data/test/migrations/to_copy/2_people_have_descriptions.rb +11 -0
  536. data/test/migrations/to_copy2/1_create_articles.rb +9 -0
  537. data/test/migrations/to_copy2/2_create_comments.rb +9 -0
  538. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +11 -0
  539. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +11 -0
  540. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +11 -0
  541. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +9 -0
  542. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +9 -0
  543. data/test/migrations/valid/1_valid_people_have_last_names.rb +11 -0
  544. data/test/migrations/valid/2_we_need_reminders.rb +14 -0
  545. data/test/migrations/valid/3_innocent_jointable.rb +14 -0
  546. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +11 -0
  547. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +14 -0
  548. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +14 -0
  549. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +11 -0
  550. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +14 -0
  551. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +14 -0
  552. data/test/migrations/version_check/20131219224947_migration_version_check.rb +10 -0
  553. data/test/models/account.rb +46 -0
  554. data/test/models/admin/account.rb +5 -0
  555. data/test/models/admin/randomly_named_c1.rb +9 -0
  556. data/test/models/admin/user.rb +48 -0
  557. data/test/models/admin.rb +7 -0
  558. data/test/models/aircraft.rb +7 -0
  559. data/test/models/arunit2_model.rb +5 -0
  560. data/test/models/author.rb +260 -0
  561. data/test/models/auto_id.rb +6 -0
  562. data/test/models/autoloadable/extra_firm.rb +4 -0
  563. data/test/models/binary.rb +4 -0
  564. data/test/models/binary_field.rb +6 -0
  565. data/test/models/bird.rb +24 -0
  566. data/test/models/book.rb +33 -0
  567. data/test/models/book_destroy_async.rb +24 -0
  568. data/test/models/boolean.rb +7 -0
  569. data/test/models/bulb.rb +61 -0
  570. data/test/models/cake_designer.rb +5 -0
  571. data/test/models/car.rb +36 -0
  572. data/test/models/carrier.rb +4 -0
  573. data/test/models/cart.rb +5 -0
  574. data/test/models/cat.rb +12 -0
  575. data/test/models/categorization.rb +21 -0
  576. data/test/models/category.rb +47 -0
  577. data/test/models/chef.rb +10 -0
  578. data/test/models/citation.rb +7 -0
  579. data/test/models/club.rb +28 -0
  580. data/test/models/college.rb +12 -0
  581. data/test/models/column.rb +5 -0
  582. data/test/models/column_name.rb +5 -0
  583. data/test/models/comment.rb +98 -0
  584. data/test/models/company.rb +226 -0
  585. data/test/models/company_in_module.rb +99 -0
  586. data/test/models/computer.rb +5 -0
  587. data/test/models/contact.rb +43 -0
  588. data/test/models/content.rb +42 -0
  589. data/test/models/contract.rb +38 -0
  590. data/test/models/country.rb +5 -0
  591. data/test/models/course.rb +8 -0
  592. data/test/models/customer.rb +85 -0
  593. data/test/models/customer_carrier.rb +16 -0
  594. data/test/models/dashboard.rb +5 -0
  595. data/test/models/default.rb +4 -0
  596. data/test/models/department.rb +6 -0
  597. data/test/models/destroy_async_parent.rb +15 -0
  598. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  599. data/test/models/developer.rb +341 -0
  600. data/test/models/dl_keyed_belongs_to.rb +13 -0
  601. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  602. data/test/models/dl_keyed_has_many.rb +5 -0
  603. data/test/models/dl_keyed_has_many_through.rb +5 -0
  604. data/test/models/dl_keyed_has_one.rb +5 -0
  605. data/test/models/dl_keyed_join.rb +10 -0
  606. data/test/models/dog.rb +7 -0
  607. data/test/models/dog_lover.rb +7 -0
  608. data/test/models/doubloon.rb +14 -0
  609. data/test/models/drink_designer.rb +20 -0
  610. data/test/models/edge.rb +7 -0
  611. data/test/models/electron.rb +7 -0
  612. data/test/models/engine.rb +5 -0
  613. data/test/models/entrant.rb +5 -0
  614. data/test/models/entry.rb +5 -0
  615. data/test/models/essay.rb +8 -0
  616. data/test/models/essay_destroy_async.rb +12 -0
  617. data/test/models/event.rb +5 -0
  618. data/test/models/eye.rb +39 -0
  619. data/test/models/face.rb +17 -0
  620. data/test/models/family.rb +6 -0
  621. data/test/models/family_tree.rb +6 -0
  622. data/test/models/friendship.rb +8 -0
  623. data/test/models/frog.rb +8 -0
  624. data/test/models/guid.rb +4 -0
  625. data/test/models/guitar.rb +6 -0
  626. data/test/models/hotel.rb +13 -0
  627. data/test/models/human.rb +39 -0
  628. data/test/models/image.rb +5 -0
  629. data/test/models/interest.rb +16 -0
  630. data/test/models/invoice.rb +6 -0
  631. data/test/models/item.rb +9 -0
  632. data/test/models/job.rb +9 -0
  633. data/test/models/joke.rb +9 -0
  634. data/test/models/keyboard.rb +5 -0
  635. data/test/models/legacy_thing.rb +5 -0
  636. data/test/models/lesson.rb +13 -0
  637. data/test/models/line_item.rb +5 -0
  638. data/test/models/liquid.rb +6 -0
  639. data/test/models/man.rb +11 -0
  640. data/test/models/matey.rb +6 -0
  641. data/test/models/measurement.rb +4 -0
  642. data/test/models/member.rb +45 -0
  643. data/test/models/member_detail.rb +11 -0
  644. data/test/models/member_type.rb +5 -0
  645. data/test/models/membership.rb +38 -0
  646. data/test/models/mentor.rb +5 -0
  647. data/test/models/message.rb +5 -0
  648. data/test/models/minimalistic.rb +4 -0
  649. data/test/models/minivan.rb +10 -0
  650. data/test/models/mixed_case_monkey.rb +5 -0
  651. data/test/models/mocktail_designer.rb +2 -0
  652. data/test/models/molecule.rb +8 -0
  653. data/test/models/mouse.rb +6 -0
  654. data/test/models/movie.rb +7 -0
  655. data/test/models/node.rb +7 -0
  656. data/test/models/non_primary_key.rb +4 -0
  657. data/test/models/notification.rb +5 -0
  658. data/test/models/numeric_data.rb +12 -0
  659. data/test/models/order.rb +6 -0
  660. data/test/models/organization.rb +16 -0
  661. data/test/models/other_dog.rb +7 -0
  662. data/test/models/owner.rb +39 -0
  663. data/test/models/parrot.rb +36 -0
  664. data/test/models/person.rb +147 -0
  665. data/test/models/personal_legacy_thing.rb +6 -0
  666. data/test/models/pet.rb +20 -0
  667. data/test/models/pet_treasure.rb +8 -0
  668. data/test/models/pirate.rb +116 -0
  669. data/test/models/possession.rb +5 -0
  670. data/test/models/post.rb +371 -0
  671. data/test/models/price_estimate.rb +14 -0
  672. data/test/models/professor.rb +7 -0
  673. data/test/models/project.rb +42 -0
  674. data/test/models/publisher/article.rb +6 -0
  675. data/test/models/publisher/magazine.rb +5 -0
  676. data/test/models/publisher.rb +4 -0
  677. data/test/models/randomly_named_c1.rb +5 -0
  678. data/test/models/rating.rb +8 -0
  679. data/test/models/reader.rb +25 -0
  680. data/test/models/recipe.rb +5 -0
  681. data/test/models/record.rb +4 -0
  682. data/test/models/reference.rb +25 -0
  683. data/test/models/reply.rb +79 -0
  684. data/test/models/room.rb +6 -0
  685. data/test/models/section.rb +6 -0
  686. data/test/models/seminar.rb +6 -0
  687. data/test/models/session.rb +6 -0
  688. data/test/models/ship.rb +42 -0
  689. data/test/models/ship_part.rb +10 -0
  690. data/test/models/shop.rb +19 -0
  691. data/test/models/shop_account.rb +8 -0
  692. data/test/models/speedometer.rb +8 -0
  693. data/test/models/sponsor.rb +10 -0
  694. data/test/models/squeak.rb +6 -0
  695. data/test/models/strict_zine.rb +7 -0
  696. data/test/models/string_key_object.rb +5 -0
  697. data/test/models/student.rb +6 -0
  698. data/test/models/subject.rb +16 -0
  699. data/test/models/subscriber.rb +10 -0
  700. data/test/models/subscription.rb +8 -0
  701. data/test/models/tag.rb +16 -0
  702. data/test/models/tagging.rb +20 -0
  703. data/test/models/task.rb +7 -0
  704. data/test/models/topic.rb +153 -0
  705. data/test/models/toy.rb +10 -0
  706. data/test/models/traffic_light.rb +6 -0
  707. data/test/models/treasure.rb +16 -0
  708. data/test/models/treaty.rb +5 -0
  709. data/test/models/tree.rb +5 -0
  710. data/test/models/tuning_peg.rb +6 -0
  711. data/test/models/tyre.rb +13 -0
  712. data/test/models/user.rb +22 -0
  713. data/test/models/uuid_child.rb +5 -0
  714. data/test/models/uuid_item.rb +8 -0
  715. data/test/models/uuid_parent.rb +5 -0
  716. data/test/models/vegetables.rb +33 -0
  717. data/test/models/vehicle.rb +7 -0
  718. data/test/models/vertex.rb +11 -0
  719. data/test/models/warehouse_thing.rb +7 -0
  720. data/test/models/wheel.rb +5 -0
  721. data/test/models/without_table.rb +5 -0
  722. data/test/models/zine.rb +5 -0
  723. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  724. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  725. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  726. data/test/schema/mysql2_specific_schema.rb +82 -0
  727. data/test/schema/oracle_specific_schema.rb +38 -0
  728. data/test/schema/postgresql_specific_schema.rb +125 -0
  729. data/test/schema/schema.rb +1237 -0
  730. data/test/schema/schema.rb.original +1057 -0
  731. data/test/schema/sqlite_specific_schema.rb +11 -0
  732. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  733. data/test/support/config.rb +43 -0
  734. data/test/support/connection.rb +29 -0
  735. data/test/support/connection_helper.rb +16 -0
  736. data/test/support/ddl_helper.rb +10 -0
  737. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  738. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  739. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  740. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  741. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  742. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  743. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  744. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  745. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  746. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  747. data/test/support/schema_dumping_helper.rb +22 -0
  748. data/test/support/stubs/strong_parameters.rb +40 -0
  749. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  750. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  751. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  752. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  753. metadata +876 -0
@@ -0,0 +1,772 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/owner"
5
+ require "models/pet"
6
+ require "models/topic"
7
+
8
+ class TransactionCallbacksTest < ActiveRecord::TestCase
9
+ fixtures :topics, :owners, :pets
10
+
11
+ class ReplyWithCallbacks < ActiveRecord::Base
12
+ self.table_name = :topics
13
+
14
+ belongs_to :topic, foreign_key: "parent_id"
15
+
16
+ validates_presence_of :content
17
+
18
+ after_commit :do_after_commit, on: :create
19
+
20
+ attr_accessor :save_on_after_create
21
+ after_create do
22
+ save! if save_on_after_create
23
+ end
24
+
25
+ def history
26
+ @history ||= []
27
+ end
28
+
29
+ def do_after_commit
30
+ history << :commit_on_create
31
+ end
32
+ end
33
+
34
+ class TopicWithCallbacks < ActiveRecord::Base
35
+ self.table_name = :topics
36
+
37
+ has_many :replies, class_name: "ReplyWithCallbacks", foreign_key: "parent_id"
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
+
46
+ before_commit { |record| record.do_before_commit(nil) }
47
+ after_commit { |record| record.do_after_commit(nil) }
48
+ after_save_commit { |record| record.do_after_commit(:save) }
49
+ after_create_commit { |record| record.do_after_commit(:create) }
50
+ after_update_commit { |record| record.do_after_commit(:update) }
51
+ after_destroy_commit { |record| record.do_after_commit(:destroy) }
52
+ after_rollback { |record| record.do_after_rollback(nil) }
53
+ after_rollback(on: :create) { |record| record.do_after_rollback(:create) }
54
+ after_rollback(on: :update) { |record| record.do_after_rollback(:update) }
55
+ after_rollback(on: :destroy) { |record| record.do_after_rollback(:destroy) }
56
+
57
+ def history
58
+ @history ||= []
59
+ end
60
+
61
+ def before_commit_block(on = nil, &block)
62
+ @before_commit ||= {}
63
+ @before_commit[on] ||= []
64
+ @before_commit[on] << block
65
+ end
66
+
67
+ def after_commit_block(on = nil, &block)
68
+ @after_commit ||= {}
69
+ @after_commit[on] ||= []
70
+ @after_commit[on] << block
71
+ end
72
+
73
+ def after_rollback_block(on = nil, &block)
74
+ @after_rollback ||= {}
75
+ @after_rollback[on] ||= []
76
+ @after_rollback[on] << block
77
+ end
78
+
79
+ def do_before_commit(on)
80
+ blocks = @before_commit[on] if defined?(@before_commit)
81
+ blocks.each { |b| b.call(self) } if blocks
82
+ end
83
+
84
+ def do_after_commit(on)
85
+ blocks = @after_commit[on] if defined?(@after_commit)
86
+ blocks.each { |b| b.call(self) } if blocks
87
+ end
88
+
89
+ def do_after_rollback(on)
90
+ blocks = @after_rollback[on] if defined?(@after_rollback)
91
+ blocks.each { |b| b.call(self) } if blocks
92
+ end
93
+ end
94
+
95
+ def setup
96
+ @first = TopicWithCallbacks.find(1)
97
+ end
98
+
99
+ # FIXME: Test behavior, not implementation.
100
+ def test_before_commit_exception_should_pop_transaction_stack
101
+ @first.before_commit_block { raise "better pop this txn from the stack!" }
102
+
103
+ original_txn = @first.class.connection.current_transaction
104
+
105
+ begin
106
+ @first.save!
107
+ fail
108
+ rescue
109
+ assert_equal original_txn, @first.class.connection.current_transaction
110
+ end
111
+ end
112
+
113
+ def test_call_after_commit_after_transaction_commits
114
+ @first.after_commit_block { |r| r.history << :after_commit }
115
+ @first.after_rollback_block { |r| r.history << :after_rollback }
116
+
117
+ @first.save!
118
+ assert_equal [:after_commit], @first.history
119
+ end
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
+
178
+ def test_only_call_after_commit_on_update_after_transaction_commits_for_existing_record
179
+ add_transaction_execution_blocks @first
180
+
181
+ @first.save!
182
+ assert_equal [:commit_on_update], @first.history
183
+ end
184
+
185
+ def test_only_call_after_commit_on_destroy_after_transaction_commits_for_destroyed_record
186
+ add_transaction_execution_blocks @first
187
+
188
+ @first.destroy
189
+ assert_equal [:commit_on_destroy], @first.history
190
+ end
191
+
192
+ def test_only_call_after_commit_on_create_after_transaction_commits_for_new_record
193
+ new_record = TopicWithCallbacks.new(title: "New topic", written_on: Date.today)
194
+ add_transaction_execution_blocks new_record
195
+
196
+ new_record.save!
197
+ assert_equal [:commit_on_create], new_record.history
198
+ end
199
+
200
+ def test_only_call_after_commit_on_create_after_transaction_commits_for_new_record_if_create_succeeds_creating_through_association
201
+ topic = TopicWithCallbacks.create!(title: "New topic", written_on: Date.today)
202
+ reply = topic.replies.create
203
+
204
+ assert_equal [], reply.history
205
+ end
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
+
224
+ def test_only_call_after_commit_on_create_and_doesnt_leaky
225
+ r = ReplyWithCallbacks.new(content: "foo")
226
+ r.save_on_after_create = true
227
+ r.save!
228
+ r.content = "bar"
229
+ r.save!
230
+ r.save!
231
+ assert_equal [:commit_on_create], r.history
232
+ end
233
+
234
+ def test_only_call_after_commit_on_update_after_transaction_commits_for_existing_record_on_touch
235
+ add_transaction_execution_blocks @first
236
+
237
+ @first.touch
238
+ assert_equal [:commit_on_update], @first.history
239
+ end
240
+
241
+ def test_only_call_after_commit_on_top_level_transactions
242
+ @first.after_commit_block { |r| r.history << :after_commit }
243
+ assert_empty @first.history
244
+
245
+ @first.transaction do
246
+ @first.transaction(requires_new: true) do
247
+ @first.touch
248
+ end
249
+ assert_empty @first.history
250
+ end
251
+ assert_equal [:after_commit], @first.history
252
+ end
253
+
254
+ def test_call_after_rollback_after_transaction_rollsback
255
+ @first.after_commit_block { |r| r.history << :after_commit }
256
+ @first.after_rollback_block { |r| r.history << :after_rollback }
257
+
258
+ Topic.transaction do
259
+ @first.save!
260
+ raise ActiveRecord::Rollback
261
+ end
262
+
263
+ assert_equal [:after_rollback], @first.history
264
+ end
265
+
266
+ def test_only_call_after_rollback_on_update_after_transaction_rollsback_for_existing_record
267
+ add_transaction_execution_blocks @first
268
+
269
+ Topic.transaction do
270
+ @first.save!
271
+ raise ActiveRecord::Rollback
272
+ end
273
+
274
+ assert_equal [:rollback_on_update], @first.history
275
+ end
276
+
277
+ def test_only_call_after_rollback_on_update_after_transaction_rollsback_for_existing_record_on_touch
278
+ add_transaction_execution_blocks @first
279
+
280
+ Topic.transaction do
281
+ @first.touch
282
+ raise ActiveRecord::Rollback
283
+ end
284
+
285
+ assert_equal [:rollback_on_update], @first.history
286
+ end
287
+
288
+ def test_only_call_after_rollback_on_destroy_after_transaction_rollsback_for_destroyed_record
289
+ add_transaction_execution_blocks @first
290
+
291
+ Topic.transaction do
292
+ @first.destroy
293
+ raise ActiveRecord::Rollback
294
+ end
295
+
296
+ assert_equal [:rollback_on_destroy], @first.history
297
+ end
298
+
299
+ def test_only_call_after_rollback_on_create_after_transaction_rollsback_for_new_record
300
+ new_record = TopicWithCallbacks.new(title: "New topic", written_on: Date.today)
301
+ add_transaction_execution_blocks new_record
302
+
303
+ Topic.transaction do
304
+ new_record.save!
305
+ raise ActiveRecord::Rollback
306
+ end
307
+
308
+ assert_equal [:rollback_on_create], new_record.history
309
+ end
310
+
311
+ def test_call_after_rollback_when_commit_fails
312
+ @first.after_commit_block { |r| r.history << :after_commit }
313
+ @first.after_rollback_block { |r| r.history << :after_rollback }
314
+
315
+ assert_raises RuntimeError do
316
+ @first.transaction do
317
+ tx = @first.class.connection.transaction_manager.current_transaction
318
+ def tx.commit
319
+ raise
320
+ end
321
+
322
+ @first.save
323
+ end
324
+ end
325
+
326
+ assert_equal [:after_rollback], @first.history
327
+ end
328
+
329
+ def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint
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) }
334
+
335
+ second = TopicWithCallbacks.find(3)
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) }
340
+
341
+ Topic.transaction do
342
+ @first.save!
343
+ Topic.transaction(requires_new: true) do
344
+ second.save!
345
+ raise ActiveRecord::Rollback
346
+ end
347
+ end
348
+
349
+ assert_equal 1, @first.commits
350
+ assert_equal 0, @first.rollbacks
351
+ assert_equal 0, second.commits
352
+ assert_equal 1, second.rollbacks
353
+ end
354
+
355
+ def test_only_call_after_rollback_on_records_rolled_back_to_a_savepoint_when_release_savepoint_fails
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
358
+
359
+ @first.after_rollback_block { |r| r.rollbacks(1) }
360
+ @first.after_commit_block { |r| r.commits(1) }
361
+
362
+ Topic.transaction do
363
+ @first.save
364
+ Topic.transaction(requires_new: true) do
365
+ @first.save!
366
+ raise ActiveRecord::Rollback
367
+ end
368
+ Topic.transaction(requires_new: true) do
369
+ @first.save!
370
+ raise ActiveRecord::Rollback
371
+ end
372
+ end
373
+
374
+ assert_equal 1, @first.commits
375
+ assert_equal 2, @first.rollbacks
376
+ end
377
+
378
+ def test_after_commit_callback_should_not_swallow_errors
379
+ @first.after_commit_block { fail "boom" }
380
+ assert_raises(RuntimeError) do
381
+ Topic.transaction do
382
+ @first.save!
383
+ end
384
+ end
385
+ end
386
+
387
+ def test_after_commit_callback_when_raise_should_not_restore_state
388
+ first = TopicWithCallbacks.new
389
+ second = TopicWithCallbacks.new
390
+ first.after_commit_block { fail "boom" }
391
+ second.after_commit_block { fail "boom" }
392
+
393
+ begin
394
+ Topic.transaction do
395
+ first.save!
396
+ assert_not_nil first.id
397
+ second.save!
398
+ assert_not_nil second.id
399
+ end
400
+ rescue
401
+ end
402
+ assert_not_nil first.id
403
+ assert_not_nil second.id
404
+ assert first.reload
405
+ end
406
+
407
+ def test_after_rollback_callback_should_not_swallow_errors_when_set_to_raise
408
+ error_class = Class.new(StandardError)
409
+ @first.after_rollback_block { raise error_class }
410
+ assert_raises(error_class) do
411
+ Topic.transaction do
412
+ @first.save!
413
+ raise ActiveRecord::Rollback
414
+ end
415
+ end
416
+ end
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
+
435
+ def test_after_rollback_callback_when_raise_should_restore_state
436
+ error_class = Class.new(StandardError)
437
+
438
+ first = TopicWithCallbacks.new
439
+ second = TopicWithCallbacks.new
440
+ first.after_rollback_block { raise error_class }
441
+ second.after_rollback_block { raise error_class }
442
+
443
+ begin
444
+ Topic.transaction do
445
+ first.save!
446
+ assert_not_nil first.id
447
+ second.save!
448
+ assert_not_nil second.id
449
+ raise ActiveRecord::Rollback
450
+ end
451
+ rescue error_class
452
+ end
453
+ assert_nil first.id
454
+ assert_nil second.id
455
+ end
456
+
457
+ def test_after_rollback_callbacks_should_validate_on_condition
458
+ assert_raise(ArgumentError) { Topic.after_rollback(on: :save) }
459
+ e = assert_raise(ArgumentError) { Topic.after_rollback(on: "create") }
460
+ assert_match(/:on conditions for after_commit and after_rollback callbacks have to be one of \[:create, :destroy, :update\]/, e.message)
461
+ end
462
+
463
+ def test_after_commit_callbacks_should_validate_on_condition
464
+ assert_raise(ArgumentError) { Topic.after_commit(on: :save) }
465
+ e = assert_raise(ArgumentError) { Topic.after_commit(on: "create") }
466
+ assert_match(/:on conditions for after_commit and after_rollback callbacks have to be one of \[:create, :destroy, :update\]/, e.message)
467
+ end
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
+
489
+ def test_saving_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_call_callbacks_on_the_parent_object
490
+ pet = Pet.first
491
+ owner = pet.owner
492
+ flag = false
493
+
494
+ owner.on_after_commit do
495
+ flag = true
496
+ end
497
+
498
+ pet.name = "Fluffy the Third"
499
+ pet.save
500
+
501
+ assert flag
502
+ end
503
+
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
549
+
550
+ assert_empty opts
551
+ end
552
+
553
+ private
554
+ def add_transaction_execution_blocks(record)
555
+ record.after_commit_block(:create) { |r| r.history << :commit_on_create }
556
+ record.after_commit_block(:update) { |r| r.history << :commit_on_update }
557
+ record.after_commit_block(:destroy) { |r| r.history << :commit_on_destroy }
558
+ record.after_rollback_block(:create) { |r| r.history << :rollback_on_create }
559
+ record.after_rollback_block(:update) { |r| r.history << :rollback_on_update }
560
+ record.after_rollback_block(:destroy) { |r| r.history << :rollback_on_destroy }
561
+ end
562
+ end
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
+
586
+ class CallbacksOnMultipleActionsTest < ActiveRecord::TestCase
587
+ self.use_transactional_tests = false
588
+
589
+ class TopicWithCallbacksOnMultipleActions < ActiveRecord::Base
590
+ self.table_name = :topics
591
+
592
+ after_commit(on: [:create, :destroy]) { |record| record.history << :create_and_destroy }
593
+ after_commit(on: [:create, :update]) { |record| record.history << :create_and_update }
594
+ after_commit(on: [:update, :destroy]) { |record| record.history << :update_and_destroy }
595
+
596
+ before_commit(if: :save_before_commit_history) { |record| record.history << :before_commit }
597
+ before_commit(if: :update_title) { |record| record.update(title: "before commit title") }
598
+
599
+ def clear_history
600
+ @history = []
601
+ end
602
+
603
+ def history
604
+ @history ||= []
605
+ end
606
+
607
+ attr_accessor :save_before_commit_history, :update_title
608
+ end
609
+
610
+ def test_after_commit_on_multiple_actions
611
+ topic = TopicWithCallbacksOnMultipleActions.new
612
+ topic.save
613
+ assert_equal [:create_and_update, :create_and_destroy], topic.history
614
+
615
+ topic.clear_history
616
+ topic.approved = true
617
+ topic.save
618
+ assert_equal [:update_and_destroy, :create_and_update], topic.history
619
+
620
+ topic.clear_history
621
+ topic.destroy
622
+ assert_equal [:update_and_destroy, :create_and_destroy], topic.history
623
+ end
624
+
625
+ def test_before_commit_actions
626
+ topic = TopicWithCallbacksOnMultipleActions.new
627
+ topic.save_before_commit_history = true
628
+ topic.save
629
+
630
+ assert_equal [:before_commit, :create_and_update, :create_and_destroy], topic.history
631
+ end
632
+
633
+ def test_before_commit_update_in_same_transaction
634
+ topic = TopicWithCallbacksOnMultipleActions.new
635
+ topic.update_title = true
636
+ topic.save
637
+
638
+ assert_equal "before commit title", topic.title
639
+ assert_equal "before commit title", topic.reload.title
640
+ end
641
+ end
642
+
643
+ class CallbacksOnDestroyUpdateActionRaceTest < ActiveRecord::TestCase
644
+ self.use_transactional_tests = false
645
+
646
+ class TopicWithHistory < ActiveRecord::Base
647
+ self.table_name = :topics
648
+
649
+ def self.clear_history
650
+ @@history = []
651
+ end
652
+
653
+ def self.history
654
+ @@history ||= []
655
+ end
656
+ end
657
+
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
666
+ end
667
+
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
675
+ end
676
+
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
685
+ end
686
+
687
+ topic.destroy
688
+
689
+ assert_equal [:commit_on_destroy], TopicWithCallbacksOnDestroy.history
690
+ end
691
+
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
706
+ raise ActiveRecord::Rollback
707
+ end
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
715
+ end
716
+
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 ||= []
748
+ end
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
771
+ end
772
+ end