ibm_db 5.2.0 → 5.3.1

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 (622) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +6 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +12 -12
  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 +11 -11
  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 +1458 -1279
  12. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  13. data/test/activejob/destroy_association_async_test.rb +305 -0
  14. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  15. data/test/activejob/helper.rb +15 -0
  16. data/test/assets/schema_dump_5_1.yml +345 -0
  17. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  18. data/test/cases/adapter_test.rb +432 -218
  19. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  20. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  21. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  22. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  23. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  24. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  25. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  26. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  27. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  28. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  29. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  30. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  31. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  32. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  33. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  34. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  35. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  36. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  37. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  38. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  39. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  40. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  41. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  42. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  43. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  44. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  45. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  46. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  47. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  48. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  49. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  50. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  51. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  52. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  53. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  54. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  55. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  56. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  57. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  58. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  59. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  60. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  61. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  62. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  63. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  64. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  65. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  66. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  67. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  68. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  69. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  70. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  71. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  72. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  73. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  74. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  75. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  76. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  77. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  78. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  79. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  80. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  81. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  82. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  83. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  84. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  85. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  86. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  87. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  88. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  89. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  90. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  91. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  92. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  93. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  94. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  95. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  96. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  97. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  98. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  99. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  100. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  101. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  102. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  103. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  104. data/test/cases/aggregations_test.rb +14 -12
  105. data/test/cases/annotate_test.rb +46 -0
  106. data/test/cases/ar_schema_test.rb +153 -86
  107. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  108. data/test/cases/arel/attributes/math_test.rb +83 -0
  109. data/test/cases/arel/attributes_test.rb +27 -0
  110. data/test/cases/arel/collectors/bind_test.rb +40 -0
  111. data/test/cases/arel/collectors/composite_test.rb +47 -0
  112. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  113. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  114. data/test/cases/arel/crud_test.rb +65 -0
  115. data/test/cases/arel/delete_manager_test.rb +53 -0
  116. data/test/cases/arel/factory_methods_test.rb +46 -0
  117. data/test/cases/arel/helper.rb +45 -0
  118. data/test/cases/arel/insert_manager_test.rb +241 -0
  119. data/test/cases/arel/nodes/and_test.rb +30 -0
  120. data/test/cases/arel/nodes/as_test.rb +36 -0
  121. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  122. data/test/cases/arel/nodes/bin_test.rb +35 -0
  123. data/test/cases/arel/nodes/binary_test.rb +29 -0
  124. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  125. data/test/cases/arel/nodes/case_test.rb +96 -0
  126. data/test/cases/arel/nodes/casted_test.rb +18 -0
  127. data/test/cases/arel/nodes/comment_test.rb +22 -0
  128. data/test/cases/arel/nodes/count_test.rb +35 -0
  129. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  130. data/test/cases/arel/nodes/descending_test.rb +46 -0
  131. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  132. data/test/cases/arel/nodes/equality_test.rb +62 -0
  133. data/test/cases/arel/nodes/extract_test.rb +43 -0
  134. data/test/cases/arel/nodes/false_test.rb +21 -0
  135. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  136. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  137. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  138. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  139. data/test/cases/arel/nodes/node_test.rb +22 -0
  140. data/test/cases/arel/nodes/not_test.rb +31 -0
  141. data/test/cases/arel/nodes/or_test.rb +36 -0
  142. data/test/cases/arel/nodes/over_test.rb +69 -0
  143. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  144. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  145. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  146. data/test/cases/arel/nodes/sum_test.rb +35 -0
  147. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  148. data/test/cases/arel/nodes/true_test.rb +21 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  150. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  151. data/test/cases/arel/nodes/window_test.rb +81 -0
  152. data/test/cases/arel/nodes_test.rb +34 -0
  153. data/test/cases/arel/select_manager_test.rb +1238 -0
  154. data/test/cases/arel/support/fake_record.rb +135 -0
  155. data/test/cases/arel/table_test.rb +216 -0
  156. data/test/cases/arel/update_manager_test.rb +126 -0
  157. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  158. data/test/cases/arel/visitors/dot_test.rb +90 -0
  159. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  160. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  161. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  162. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  165. data/test/cases/associations/callbacks_test.rb +56 -38
  166. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  167. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  168. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  169. data/test/cases/associations/eager_singularization_test.rb +21 -21
  170. data/test/cases/associations/eager_test.rb +559 -415
  171. data/test/cases/associations/extension_test.rb +18 -12
  172. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  173. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  174. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  175. data/test/cases/associations/has_one_associations_test.rb +294 -129
  176. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  177. data/test/cases/associations/inner_join_association_test.rb +114 -38
  178. data/test/cases/associations/inverse_associations_test.rb +606 -398
  179. data/test/cases/associations/join_model_test.rb +158 -148
  180. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  181. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  182. data/test/cases/associations/required_test.rb +35 -10
  183. data/test/cases/associations_test.rb +241 -110
  184. data/test/cases/attribute_methods/read_test.rb +11 -11
  185. data/test/cases/attribute_methods_test.rb +413 -298
  186. data/test/cases/attributes_test.rb +145 -27
  187. data/test/cases/autosave_association_test.rb +681 -436
  188. data/test/cases/base_prevent_writes_test.rb +229 -0
  189. data/test/cases/base_test.rb +599 -542
  190. data/test/cases/batches_test.rb +288 -82
  191. data/test/cases/binary_test.rb +26 -31
  192. data/test/cases/bind_parameter_test.rb +194 -21
  193. data/test/cases/boolean_test.rb +52 -0
  194. data/test/cases/cache_key_test.rb +110 -5
  195. data/test/cases/calculations_test.rb +737 -174
  196. data/test/cases/callbacks_test.rb +74 -207
  197. data/test/cases/clone_test.rb +15 -10
  198. data/test/cases/coders/json_test.rb +2 -0
  199. data/test/cases/coders/yaml_column_test.rb +16 -13
  200. data/test/cases/collection_cache_key_test.rb +177 -20
  201. data/test/cases/column_alias_test.rb +9 -7
  202. data/test/cases/column_definition_test.rb +10 -68
  203. data/test/cases/comment_test.rb +166 -107
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  205. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  210. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  211. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  212. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  213. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  214. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  215. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  216. data/test/cases/connection_management_test.rb +13 -11
  217. data/test/cases/connection_pool_test.rb +316 -83
  218. data/test/cases/core_test.rb +82 -58
  219. data/test/cases/counter_cache_test.rb +204 -50
  220. data/test/cases/custom_locking_test.rb +5 -3
  221. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  222. data/test/cases/database_configurations/resolver_test.rb +150 -0
  223. data/test/cases/database_configurations_test.rb +145 -0
  224. data/test/cases/database_selector_test.rb +296 -0
  225. data/test/cases/database_statements_test.rb +18 -16
  226. data/test/cases/date_test.rb +8 -16
  227. data/test/cases/date_time_precision_test.rb +100 -78
  228. data/test/cases/date_time_test.rb +23 -8
  229. data/test/cases/defaults_test.rb +106 -71
  230. data/test/cases/delegated_type_test.rb +57 -0
  231. data/test/cases/dirty_test.rb +419 -223
  232. data/test/cases/disconnected_test.rb +6 -6
  233. data/test/cases/dup_test.rb +54 -27
  234. data/test/cases/enum_test.rb +461 -82
  235. data/test/cases/errors_test.rb +7 -7
  236. data/test/cases/explain_subscriber_test.rb +17 -15
  237. data/test/cases/explain_test.rb +11 -19
  238. data/test/cases/filter_attributes_test.rb +153 -0
  239. data/test/cases/finder_respond_to_test.rb +14 -14
  240. data/test/cases/finder_test.rb +669 -287
  241. data/test/cases/fixture_set/file_test.rb +34 -38
  242. data/test/cases/fixtures_test.rb +833 -176
  243. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  244. data/test/cases/habtm_destroy_order_test.rb +25 -25
  245. data/test/cases/helper.rb +78 -49
  246. data/test/cases/hot_compatibility_test.rb +33 -32
  247. data/test/cases/i18n_test.rb +18 -17
  248. data/test/cases/inheritance_test.rb +180 -115
  249. data/test/cases/insert_all_test.rb +489 -0
  250. data/test/cases/instrumentation_test.rb +101 -0
  251. data/test/cases/integration_test.rb +119 -31
  252. data/test/cases/invalid_connection_test.rb +18 -16
  253. data/test/cases/invertible_migration_test.rb +183 -43
  254. data/test/cases/json_attribute_test.rb +35 -0
  255. data/test/cases/json_serialization_test.rb +57 -58
  256. data/test/cases/json_shared_test_cases.rb +290 -0
  257. data/test/cases/locking_test.rb +413 -119
  258. data/test/cases/log_subscriber_test.rb +68 -26
  259. data/test/cases/marshal_serialization_test.rb +39 -0
  260. data/test/cases/migration/change_schema_test.rb +118 -72
  261. data/test/cases/migration/change_table_test.rb +138 -30
  262. data/test/cases/migration/check_constraint_test.rb +162 -0
  263. data/test/cases/migration/column_attributes_test.rb +45 -35
  264. data/test/cases/migration/column_positioning_test.rb +18 -6
  265. data/test/cases/migration/columns_test.rb +93 -77
  266. data/test/cases/migration/command_recorder_test.rb +121 -34
  267. data/test/cases/migration/compatibility_test.rb +578 -23
  268. data/test/cases/migration/create_join_table_test.rb +35 -25
  269. data/test/cases/migration/foreign_key_test.rb +503 -284
  270. data/test/cases/migration/helper.rb +4 -3
  271. data/test/cases/migration/index_test.rb +119 -70
  272. data/test/cases/migration/logger_test.rb +9 -6
  273. data/test/cases/migration/pending_migrations_test.rb +88 -34
  274. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  275. data/test/cases/migration/references_index_test.rb +38 -19
  276. data/test/cases/migration/references_statements_test.rb +15 -14
  277. data/test/cases/migration/rename_table_test.rb +53 -30
  278. data/test/cases/migration_test.rb +637 -269
  279. data/test/cases/migrator_test.rb +191 -135
  280. data/test/cases/mixin_test.rb +7 -11
  281. data/test/cases/modules_test.rb +36 -34
  282. data/test/cases/multi_db_migrator_test.rb +223 -0
  283. data/test/cases/multiparameter_attributes_test.rb +60 -33
  284. data/test/cases/multiple_db_test.rb +16 -22
  285. data/test/cases/nested_attributes_test.rb +341 -320
  286. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  287. data/test/cases/null_relation_test.rb +84 -0
  288. data/test/cases/numeric_data_test.rb +93 -0
  289. data/test/cases/persistence_test.rb +361 -269
  290. data/test/cases/pooled_connections_test.rb +18 -26
  291. data/test/cases/prepared_statement_status_test.rb +48 -0
  292. data/test/cases/primary_keys_test.rb +210 -104
  293. data/test/cases/query_cache_test.rb +610 -141
  294. data/test/cases/quoting_test.rb +132 -31
  295. data/test/cases/readonly_test.rb +49 -48
  296. data/test/cases/reaper_test.rb +146 -32
  297. data/test/cases/reflection_test.rb +167 -156
  298. data/test/cases/relation/delegation_test.rb +49 -36
  299. data/test/cases/relation/delete_all_test.rb +117 -0
  300. data/test/cases/relation/merging_test.rb +319 -42
  301. data/test/cases/relation/mutation_test.rb +55 -93
  302. data/test/cases/relation/or_test.rb +129 -29
  303. data/test/cases/relation/predicate_builder_test.rb +21 -6
  304. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  305. data/test/cases/relation/select_test.rb +67 -0
  306. data/test/cases/relation/update_all_test.rb +317 -0
  307. data/test/cases/relation/where_chain_test.rb +68 -32
  308. data/test/cases/relation/where_clause_test.rb +136 -61
  309. data/test/cases/relation/where_test.rb +155 -48
  310. data/test/cases/relation_test.rb +266 -112
  311. data/test/cases/relations_test.rb +969 -744
  312. data/test/cases/reload_models_test.rb +13 -9
  313. data/test/cases/reserved_word_test.rb +141 -0
  314. data/test/cases/result_test.rb +68 -17
  315. data/test/cases/sanitize_test.rb +87 -71
  316. data/test/cases/schema_dumper_test.rb +221 -128
  317. data/test/cases/schema_loading_test.rb +3 -2
  318. data/test/cases/scoping/default_scoping_test.rb +185 -144
  319. data/test/cases/scoping/named_scoping_test.rb +177 -89
  320. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  321. data/test/cases/secure_token_test.rb +18 -3
  322. data/test/cases/serialization_test.rb +30 -28
  323. data/test/cases/serialized_attribute_test.rb +133 -42
  324. data/test/cases/signed_id_test.rb +168 -0
  325. data/test/cases/statement_cache_test.rb +41 -24
  326. data/test/cases/statement_invalid_test.rb +42 -0
  327. data/test/cases/store_test.rb +180 -55
  328. data/test/cases/strict_loading_test.rb +473 -0
  329. data/test/cases/suppressor_test.rb +26 -12
  330. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  331. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  332. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  333. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  334. data/test/cases/test_case.rb +51 -40
  335. data/test/cases/test_databases_test.rb +79 -0
  336. data/test/cases/test_fixtures_test.rb +79 -19
  337. data/test/cases/time_precision_test.rb +98 -76
  338. data/test/cases/timestamp_test.rb +102 -99
  339. data/test/cases/touch_later_test.rb +12 -10
  340. data/test/cases/transaction_callbacks_test.rb +344 -90
  341. data/test/cases/transaction_isolation_test.rb +12 -12
  342. data/test/cases/transactions_test.rb +612 -162
  343. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  344. data/test/cases/type/date_time_test.rb +4 -2
  345. data/test/cases/type/integer_test.rb +4 -2
  346. data/test/cases/type/string_test.rb +10 -8
  347. data/test/cases/type/time_test.rb +28 -0
  348. data/test/cases/type/type_map_test.rb +29 -28
  349. data/test/cases/type/unsigned_integer_test.rb +19 -0
  350. data/test/cases/type_test.rb +2 -0
  351. data/test/cases/types_test.rb +3 -1
  352. data/test/cases/unconnected_test.rb +14 -1
  353. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  354. data/test/cases/validations/absence_validation_test.rb +19 -17
  355. data/test/cases/validations/association_validation_test.rb +30 -28
  356. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  357. data/test/cases/validations/i18n_validation_test.rb +22 -21
  358. data/test/cases/validations/length_validation_test.rb +34 -33
  359. data/test/cases/validations/numericality_validation_test.rb +181 -0
  360. data/test/cases/validations/presence_validation_test.rb +21 -19
  361. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  362. data/test/cases/validations_repair_helper.rb +2 -0
  363. data/test/cases/validations_test.rb +61 -26
  364. data/test/cases/view_test.rb +122 -116
  365. data/test/cases/yaml_serialization_test.rb +79 -34
  366. data/test/config.example.yml +19 -19
  367. data/test/config.rb +3 -1
  368. data/test/config.yml +16 -6
  369. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  370. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  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/randomly_named_a9.yml +7 -7
  398. data/test/fixtures/readers.yml +6 -0
  399. data/test/fixtures/reserved_words/values.yml +2 -2
  400. data/test/fixtures/sponsors.yml +3 -0
  401. data/test/fixtures/strict_zines.yml +2 -0
  402. data/test/fixtures/subscribers.yml +1 -1
  403. data/test/fixtures/tasks.yml +1 -1
  404. data/test/fixtures/warehouse-things.yml +3 -0
  405. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  406. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  407. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  408. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  409. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  410. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  411. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  412. data/test/migrations/rename/1_we_need_things.rb +2 -0
  413. data/test/migrations/rename/2_rename_things.rb +2 -0
  414. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  415. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  416. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  417. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  418. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  421. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  422. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  423. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  424. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  425. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  426. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  432. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  433. data/test/models/account.rb +46 -0
  434. data/test/models/admin/account.rb +3 -1
  435. data/test/models/admin/randomly_named_c1.rb +2 -0
  436. data/test/models/admin/user.rb +16 -8
  437. data/test/models/admin.rb +4 -2
  438. data/test/models/aircraft.rb +3 -1
  439. data/test/models/arunit2_model.rb +2 -0
  440. data/test/models/author.rb +153 -102
  441. data/test/models/auto_id.rb +2 -0
  442. data/test/models/autoloadable/extra_firm.rb +2 -0
  443. data/test/models/binary.rb +3 -1
  444. data/test/models/binary_field.rb +6 -0
  445. data/test/models/bird.rb +13 -1
  446. data/test/models/book.rb +14 -4
  447. data/test/models/book_destroy_async.rb +24 -0
  448. data/test/models/boolean.rb +5 -0
  449. data/test/models/bulb.rb +13 -4
  450. data/test/models/cake_designer.rb +2 -0
  451. data/test/models/car.rb +17 -10
  452. data/test/models/carrier.rb +2 -0
  453. data/test/models/cart.rb +5 -0
  454. data/test/models/cat.rb +2 -0
  455. data/test/models/categorization.rb +8 -6
  456. data/test/models/category.rb +28 -16
  457. data/test/models/chef.rb +2 -0
  458. data/test/models/citation.rb +5 -1
  459. data/test/models/club.rb +13 -10
  460. data/test/models/college.rb +4 -2
  461. data/test/models/column.rb +2 -0
  462. data/test/models/column_name.rb +2 -0
  463. data/test/models/comment.rb +32 -10
  464. data/test/models/company.rb +102 -106
  465. data/test/models/company_in_module.rb +27 -26
  466. data/test/models/computer.rb +3 -1
  467. data/test/models/contact.rb +15 -13
  468. data/test/models/content.rb +5 -3
  469. data/test/models/contract.rb +21 -3
  470. data/test/models/country.rb +2 -4
  471. data/test/models/course.rb +3 -1
  472. data/test/models/customer.rb +10 -8
  473. data/test/models/customer_carrier.rb +2 -0
  474. data/test/models/dashboard.rb +2 -0
  475. data/test/models/default.rb +2 -0
  476. data/test/models/department.rb +2 -0
  477. data/test/models/destroy_async_parent.rb +15 -0
  478. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  479. data/test/models/developer.rb +152 -85
  480. data/test/models/dl_keyed_belongs_to.rb +13 -0
  481. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  482. data/test/models/dl_keyed_has_many.rb +5 -0
  483. data/test/models/dl_keyed_has_many_through.rb +5 -0
  484. data/test/models/dl_keyed_has_one.rb +5 -0
  485. data/test/models/dl_keyed_join.rb +10 -0
  486. data/test/models/dog.rb +2 -0
  487. data/test/models/dog_lover.rb +2 -0
  488. data/test/models/doubloon.rb +3 -1
  489. data/test/models/drink_designer.rb +17 -0
  490. data/test/models/edge.rb +4 -2
  491. data/test/models/electron.rb +2 -0
  492. data/test/models/engine.rb +3 -2
  493. data/test/models/entrant.rb +2 -0
  494. data/test/models/entry.rb +5 -0
  495. data/test/models/essay.rb +6 -3
  496. data/test/models/essay_destroy_async.rb +12 -0
  497. data/test/models/event.rb +3 -1
  498. data/test/models/eye.rb +5 -3
  499. data/test/models/face.rb +14 -6
  500. data/test/models/family.rb +6 -0
  501. data/test/models/family_tree.rb +6 -0
  502. data/test/models/friendship.rb +5 -3
  503. data/test/models/frog.rb +8 -0
  504. data/test/models/guid.rb +3 -1
  505. data/test/models/guitar.rb +2 -0
  506. data/test/models/hotel.rb +5 -3
  507. data/test/models/human.rb +39 -0
  508. data/test/models/image.rb +3 -1
  509. data/test/models/interest.rb +14 -3
  510. data/test/models/invoice.rb +4 -2
  511. data/test/models/item.rb +3 -1
  512. data/test/models/job.rb +5 -3
  513. data/test/models/joke.rb +4 -2
  514. data/test/models/keyboard.rb +3 -1
  515. data/test/models/legacy_thing.rb +2 -0
  516. data/test/models/lesson.rb +2 -0
  517. data/test/models/line_item.rb +3 -1
  518. data/test/models/liquid.rb +2 -0
  519. data/test/models/matey.rb +3 -1
  520. data/test/models/measurement.rb +4 -0
  521. data/test/models/member.rb +23 -20
  522. data/test/models/member_detail.rb +3 -0
  523. data/test/models/member_type.rb +2 -0
  524. data/test/models/membership.rb +4 -1
  525. data/test/models/mentor.rb +3 -1
  526. data/test/models/message.rb +5 -0
  527. data/test/models/minimalistic.rb +2 -0
  528. data/test/models/minivan.rb +3 -2
  529. data/test/models/mixed_case_monkey.rb +3 -1
  530. data/test/models/molecule.rb +2 -0
  531. data/test/models/mouse.rb +6 -0
  532. data/test/models/movie.rb +2 -0
  533. data/test/models/node.rb +4 -2
  534. data/test/models/non_primary_key.rb +2 -0
  535. data/test/models/notification.rb +2 -0
  536. data/test/models/numeric_data.rb +12 -0
  537. data/test/models/order.rb +4 -2
  538. data/test/models/organization.rb +9 -7
  539. data/test/models/other_dog.rb +3 -1
  540. data/test/models/owner.rb +6 -4
  541. data/test/models/parrot.rb +12 -4
  542. data/test/models/person.rb +59 -54
  543. data/test/models/personal_legacy_thing.rb +3 -1
  544. data/test/models/pet.rb +4 -2
  545. data/test/models/pet_treasure.rb +2 -0
  546. data/test/models/pirate.rb +67 -43
  547. data/test/models/possession.rb +3 -1
  548. data/test/models/post.rb +184 -86
  549. data/test/models/price_estimate.rb +11 -1
  550. data/test/models/professor.rb +3 -1
  551. data/test/models/project.rb +14 -12
  552. data/test/models/publisher/article.rb +2 -0
  553. data/test/models/publisher/magazine.rb +2 -0
  554. data/test/models/publisher.rb +2 -0
  555. data/test/models/randomly_named_c1.rb +2 -0
  556. data/test/models/rating.rb +5 -1
  557. data/test/models/reader.rb +7 -5
  558. data/test/models/recipe.rb +2 -0
  559. data/test/models/record.rb +2 -0
  560. data/test/models/reference.rb +6 -3
  561. data/test/models/reply.rb +39 -21
  562. data/test/models/room.rb +6 -0
  563. data/test/models/section.rb +6 -0
  564. data/test/models/seminar.rb +6 -0
  565. data/test/models/session.rb +6 -0
  566. data/test/models/ship.rb +12 -9
  567. data/test/models/ship_part.rb +5 -3
  568. data/test/models/shop.rb +4 -2
  569. data/test/models/shop_account.rb +2 -0
  570. data/test/models/speedometer.rb +2 -0
  571. data/test/models/sponsor.rb +8 -5
  572. data/test/models/squeak.rb +6 -0
  573. data/test/models/strict_zine.rb +7 -0
  574. data/test/models/string_key_object.rb +2 -0
  575. data/test/models/student.rb +2 -0
  576. data/test/models/subscriber.rb +4 -2
  577. data/test/models/subscription.rb +5 -1
  578. data/test/models/tag.rb +6 -3
  579. data/test/models/tagging.rb +13 -6
  580. data/test/models/task.rb +2 -0
  581. data/test/models/topic.rb +54 -19
  582. data/test/models/toy.rb +4 -0
  583. data/test/models/traffic_light.rb +2 -0
  584. data/test/models/treasure.rb +5 -3
  585. data/test/models/treaty.rb +2 -4
  586. data/test/models/tree.rb +2 -0
  587. data/test/models/tuning_peg.rb +2 -0
  588. data/test/models/tyre.rb +2 -0
  589. data/test/models/user.rb +12 -4
  590. data/test/models/uuid_child.rb +2 -0
  591. data/test/models/uuid_item.rb +2 -0
  592. data/test/models/uuid_parent.rb +2 -0
  593. data/test/models/vegetables.rb +12 -3
  594. data/test/models/vertex.rb +6 -4
  595. data/test/models/warehouse_thing.rb +2 -0
  596. data/test/models/wheel.rb +3 -1
  597. data/test/models/without_table.rb +3 -1
  598. data/test/models/zine.rb +3 -1
  599. data/test/schema/mysql2_specific_schema.rb +49 -35
  600. data/test/schema/oracle_specific_schema.rb +13 -15
  601. data/test/schema/postgresql_specific_schema.rb +51 -40
  602. data/test/schema/schema.rb +334 -154
  603. data/test/schema/sqlite_specific_schema.rb +9 -16
  604. data/test/support/config.rb +26 -26
  605. data/test/support/connection.rb +14 -8
  606. data/test/support/connection_helper.rb +3 -1
  607. data/test/support/ddl_helper.rb +2 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  618. data/test/support/schema_dumping_helper.rb +2 -0
  619. data/test/support/stubs/strong_parameters.rb +40 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  621. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  622. metadata +185 -4
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionHandling
3
5
  def fake_connection(config)
@@ -9,7 +11,7 @@ module ActiveRecord
9
11
  class FakeAdapter < AbstractAdapter
10
12
  attr_accessor :data_sources, :primary_keys
11
13
 
12
- @columns = Hash.new { |h,k| h[k] = [] }
14
+ @columns = Hash.new { |h, k| h[k] = [] }
13
15
  class << self
14
16
  attr_reader :columns
15
17
  end
@@ -30,7 +32,8 @@ module ActiveRecord
30
32
  name.to_s,
31
33
  options[:default],
32
34
  fetch_type_metadata(sql_type),
33
- options[:null])
35
+ options[:null],
36
+ )
34
37
  end
35
38
 
36
39
  def columns(table_name)
@@ -0,0 +1,305 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "activejob/helper"
4
+
5
+ require "models/book_destroy_async"
6
+ require "models/essay_destroy_async"
7
+ require "models/tag"
8
+ require "models/tagging"
9
+ require "models/essay"
10
+ require "models/category"
11
+ require "models/post"
12
+ require "models/content"
13
+ require "models/destroy_async_parent"
14
+ require "models/destroy_async_parent_soft_delete"
15
+ require "models/dl_keyed_belongs_to"
16
+ require "models/dl_keyed_belongs_to_soft_delete"
17
+ require "models/dl_keyed_has_one"
18
+ require "models/dl_keyed_join"
19
+ require "models/dl_keyed_has_many"
20
+ require "models/dl_keyed_has_many_through"
21
+
22
+ class DestroyAssociationAsyncTest < ActiveRecord::TestCase
23
+ self.use_transactional_tests = false
24
+
25
+ include ActiveJob::TestHelper
26
+
27
+ test "destroying a record destroys the has_many :through records using a job" do
28
+ tag = Tag.create!(name: "Der be treasure")
29
+ tag2 = Tag.create!(name: "Der be rum")
30
+ book = BookDestroyAsync.create!
31
+ book.tags << [tag, tag2]
32
+ book.save!
33
+
34
+ book.destroy
35
+
36
+ assert_difference -> { Tag.count }, -2 do
37
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
38
+ end
39
+ ensure
40
+ Tag.delete_all
41
+ BookDestroyAsync.delete_all
42
+ end
43
+
44
+ test "destroying a scoped has_many through only deletes within the scope deleted" do
45
+ tag = Tag.create!(name: "Der be treasure")
46
+ tag2 = Tag.create!(name: "Der be rum")
47
+ parent = BookDestroyAsyncWithScopedTags.create!
48
+ parent.tags << [tag, tag2]
49
+ parent.save!
50
+
51
+ parent.reload # force the association to be reloaded
52
+
53
+ parent.destroy
54
+
55
+ assert_difference -> { Tag.count }, -1 do
56
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
57
+ end
58
+ assert_raises ActiveRecord::RecordNotFound do
59
+ tag2.reload
60
+ end
61
+ assert tag.reload
62
+ ensure
63
+ Tag.delete_all
64
+ Tagging.delete_all
65
+ BookDestroyAsyncWithScopedTags.delete_all
66
+ end
67
+
68
+ test "enqueues the has_many through to be deleted with custom primary key" do
69
+ dl_keyed_has_many = DlKeyedHasManyThrough.create!
70
+ dl_keyed_has_many2 = DlKeyedHasManyThrough.create!
71
+ parent = DestroyAsyncParent.create!
72
+ parent.dl_keyed_has_many_through << [dl_keyed_has_many2, dl_keyed_has_many]
73
+ parent.save!
74
+ parent.destroy
75
+
76
+ assert_difference -> { DlKeyedJoin.count }, -2 do
77
+ assert_difference -> { DlKeyedHasManyThrough.count }, -2 do
78
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
79
+ end
80
+ end
81
+ ensure
82
+ DlKeyedHasManyThrough.delete_all
83
+ DestroyAsyncParent.delete_all
84
+ DlKeyedJoin.delete_all
85
+ end
86
+
87
+ test "belongs to" do
88
+ essay = EssayDestroyAsync.create!(name: "Der be treasure")
89
+ book = BookDestroyAsync.create!(name: "Arr, matey!")
90
+ essay.book = book
91
+ essay.save!
92
+ essay.destroy
93
+
94
+ assert_difference -> { BookDestroyAsync.count }, -1 do
95
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
96
+ end
97
+ ensure
98
+ EssayDestroyAsync.delete_all
99
+ BookDestroyAsync.delete_all
100
+ end
101
+
102
+ test "enqueues belongs_to to be deleted with custom primary key" do
103
+ belongs = DlKeyedBelongsTo.create!
104
+ parent = DestroyAsyncParent.create!
105
+ belongs.destroy_async_parent = parent
106
+ belongs.save!
107
+ belongs.destroy
108
+
109
+ assert_difference -> { DestroyAsyncParent.count }, -1 do
110
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
111
+ end
112
+ ensure
113
+ DlKeyedBelongsTo.delete_all
114
+ DestroyAsyncParent.delete_all
115
+ end
116
+
117
+ test "has_one" do
118
+ content = Content.create(title: "hello")
119
+ book = BookDestroyAsync.create!(name: "Arr, matey!")
120
+ book.content = content
121
+ book.save!
122
+ book.destroy
123
+
124
+ assert_difference -> { Content.count }, -1 do
125
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
126
+ end
127
+ ensure
128
+ Content.delete_all
129
+ BookDestroyAsync.delete_all
130
+ end
131
+
132
+
133
+ test "enqueues has_one to be deleted with custom primary key" do
134
+ child = DlKeyedHasOne.create!
135
+ parent = DestroyAsyncParent.create!
136
+ parent.dl_keyed_has_one = child
137
+ parent.save!
138
+ parent.destroy
139
+
140
+ assert_difference -> { DlKeyedHasOne.count }, -1 do
141
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
142
+ end
143
+ ensure
144
+ DlKeyedHasOne.delete_all
145
+ DestroyAsyncParent.delete_all
146
+ end
147
+
148
+
149
+ test "has_many" do
150
+ essay = EssayDestroyAsync.create!(name: "Der be treasure")
151
+ essay2 = EssayDestroyAsync.create!(name: "Der be rum")
152
+ book = BookDestroyAsync.create!(name: "Arr, matey!")
153
+ book.essays << [essay, essay2]
154
+ book.save!
155
+ book.destroy
156
+
157
+ assert_difference -> { EssayDestroyAsync.count }, -2 do
158
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
159
+ end
160
+ ensure
161
+ EssayDestroyAsync.delete_all
162
+ BookDestroyAsync.delete_all
163
+ end
164
+
165
+ test "has_many with sti parent class destroys all children class records" do
166
+ book = BookDestroyAsync.create!
167
+ LongEssayDestroyAsync.create!(book: book)
168
+ ShortEssayDestroyAsync.create!(book: book)
169
+ book.destroy
170
+
171
+ assert_difference -> { EssayDestroyAsync.count }, -2 do
172
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
173
+ end
174
+ end
175
+
176
+ test "enqueues the has_many to be deleted with custom primary key" do
177
+ dl_keyed_has_many = DlKeyedHasMany.new
178
+ parent = DestroyAsyncParent.create!
179
+ parent.dl_keyed_has_many << [dl_keyed_has_many]
180
+
181
+ parent.save!
182
+ parent.destroy
183
+
184
+ assert_difference -> { DlKeyedHasMany.count }, -1 do
185
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
186
+ end
187
+ ensure
188
+ DlKeyedHasMany.delete_all
189
+ DestroyAsyncParent.delete_all
190
+ end
191
+
192
+ test "not enqueue the job if transaction is not committed" do
193
+ dl_keyed_has_many = DlKeyedHasMany.new
194
+ parent = DestroyAsyncParent.create!
195
+ parent.dl_keyed_has_many << [dl_keyed_has_many]
196
+
197
+ parent.save!
198
+ assert_no_enqueued_jobs do
199
+ DestroyAsyncParent.transaction do
200
+ parent.destroy
201
+ raise ActiveRecord::Rollback
202
+ end
203
+ end
204
+ ensure
205
+ DlKeyedHasMany.delete_all
206
+ DestroyAsyncParent.delete_all
207
+ end
208
+
209
+ test "has many ensures function for parent" do
210
+ tag = Tag.create!(name: "Der be treasure")
211
+ tag2 = Tag.create!(name: "Der be rum")
212
+ parent = DestroyAsyncParentSoftDelete.create!
213
+ parent.tags << [tag, tag2]
214
+ parent.save!
215
+
216
+ parent.run_callbacks(:destroy)
217
+ parent.run_callbacks(:commit)
218
+
219
+ assert_no_difference -> { Tag.count } do
220
+ assert_raises ActiveRecord::DestroyAssociationAsyncError do
221
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
222
+ end
223
+ end
224
+
225
+ parent.destroy
226
+ assert_difference -> { Tag.count }, -2 do
227
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
228
+ end
229
+ ensure
230
+ Tag.delete_all
231
+ DestroyAsyncParentSoftDelete.delete_all
232
+ end
233
+
234
+ test "has one ensures function for parent" do
235
+ child = DlKeyedHasOne.create!
236
+ parent = DestroyAsyncParentSoftDelete.create!
237
+ parent.dl_keyed_has_one = child
238
+ parent.save!
239
+
240
+ parent.run_callbacks(:destroy)
241
+ parent.run_callbacks(:commit)
242
+
243
+ assert_no_difference -> { DlKeyedHasOne.count } do
244
+ assert_raises ActiveRecord::DestroyAssociationAsyncError do
245
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
246
+ end
247
+ end
248
+
249
+ parent.destroy
250
+ assert_difference -> { DlKeyedHasOne.count }, -1 do
251
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
252
+ end
253
+ ensure
254
+ DlKeyedHasOne.delete_all
255
+ DestroyAsyncParentSoftDelete.delete_all
256
+ end
257
+
258
+ test "enqueues belongs_to to be deleted with ensuring function" do
259
+ belongs = DlKeyedBelongsToSoftDelete.create!
260
+ parent = DestroyAsyncParentSoftDelete.create!
261
+ belongs.destroy_async_parent_soft_delete = parent
262
+ belongs.save!
263
+
264
+ belongs.run_callbacks(:destroy)
265
+ belongs.run_callbacks(:commit)
266
+
267
+ assert_raises ActiveRecord::DestroyAssociationAsyncError do
268
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
269
+ end
270
+
271
+ assert_not parent.reload.deleted?
272
+
273
+ belongs.destroy
274
+ perform_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
275
+ assert parent.reload.deleted?
276
+ ensure
277
+ DlKeyedBelongsToSoftDelete.delete_all
278
+ DestroyAsyncParentSoftDelete.delete_all
279
+ end
280
+
281
+ test "Don't enqueue with no relations" do
282
+ parent = DestroyAsyncParent.create!
283
+ parent.destroy
284
+
285
+ assert_no_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
286
+ ensure
287
+ DestroyAsyncParent.delete_all
288
+ end
289
+
290
+ test "Rollback prevents jobs from being enqueued" do
291
+ tag = Tag.create!(name: "Der be treasure")
292
+ tag2 = Tag.create!(name: "Der be rum")
293
+ book = BookDestroyAsync.create!
294
+ book.tags << [tag, tag2]
295
+ book.save!
296
+ ActiveRecord::Base.transaction do
297
+ book.destroy
298
+ raise ActiveRecord::Rollback
299
+ end
300
+ assert_no_enqueued_jobs only: ActiveRecord::DestroyAssociationAsyncJob
301
+ end
302
+ ensure
303
+ Tag.delete_all
304
+ BookDestroyAsync.delete_all
305
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ class UnusedDestroyAsync < ActiveRecord::Base
6
+ self.destroy_association_async_job = nil
7
+ end
8
+
9
+ class UnusedBelongsTo < ActiveRecord::Base
10
+ self.destroy_association_async_job = nil
11
+ end
12
+
13
+ class ActiveJobNotPresentTest < ActiveRecord::TestCase
14
+ test "has_one dependent destroy_async requires activejob" do
15
+ assert_raises ActiveRecord::ActiveJobRequiredError do
16
+ UnusedDestroyAsync.has_one :unused_belongs_to, dependent: :destroy_async
17
+ end
18
+ end
19
+
20
+ test "has_many dependent destroy_async requires activejob" do
21
+ assert_raises ActiveRecord::ActiveJobRequiredError do
22
+ UnusedDestroyAsync.has_many :essay_destroy_asyncs, dependent: :destroy_async
23
+ end
24
+ end
25
+
26
+ test "belong_to dependent destroy_async requires activejob" do
27
+ assert_raises ActiveRecord::ActiveJobRequiredError do
28
+ UnusedBelongsTo.belongs_to :unused_destroy_asyncs, dependent: :destroy_async
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ require "global_id"
6
+ GlobalID.app = "ActiveRecordExampleApp"
7
+ ActiveRecord::Base.include GlobalID::Identification
8
+
9
+ require "active_job"
10
+ ActiveJob::Base.queue_adapter = :test
11
+ ActiveJob::Base.logger = ActiveSupport::Logger.new(nil)
12
+
13
+ require_relative "../../../tools/test_common"
14
+
15
+ ActiveRecord::Base.destroy_association_async_job = ActiveRecord::DestroyAssociationAsyncJob
@@ -0,0 +1,345 @@
1
+ --- !ruby/object:ActiveRecord::ConnectionAdapters::SchemaCache
2
+ columns:
3
+ posts:
4
+ - &1 !ruby/object:ActiveRecord::ConnectionAdapters::Column
5
+ name: id
6
+ table_name: posts
7
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
8
+ sql_type: INTEGER
9
+ type: :integer
10
+ limit:
11
+ precision:
12
+ scale:
13
+ 'null': false
14
+ default:
15
+ default_function:
16
+ collation:
17
+ comment:
18
+ - &2 !ruby/object:ActiveRecord::ConnectionAdapters::Column
19
+ name: author_id
20
+ table_name: posts
21
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
22
+ sql_type: integer
23
+ type: :integer
24
+ limit:
25
+ precision:
26
+ scale:
27
+ 'null': true
28
+ default:
29
+ default_function:
30
+ collation:
31
+ comment:
32
+ - &3 !ruby/object:ActiveRecord::ConnectionAdapters::Column
33
+ name: title
34
+ table_name: posts
35
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
36
+ sql_type: varchar
37
+ type: :string
38
+ limit:
39
+ precision:
40
+ scale:
41
+ 'null': false
42
+ default:
43
+ default_function:
44
+ collation:
45
+ comment:
46
+ - &4 !ruby/object:ActiveRecord::ConnectionAdapters::Column
47
+ name: body
48
+ table_name: posts
49
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
50
+ sql_type: text
51
+ type: :text
52
+ limit:
53
+ precision:
54
+ scale:
55
+ 'null': false
56
+ default:
57
+ default_function:
58
+ collation:
59
+ comment:
60
+ - &5 !ruby/object:ActiveRecord::ConnectionAdapters::Column
61
+ name: type
62
+ table_name: posts
63
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
64
+ sql_type: varchar
65
+ type: :string
66
+ limit:
67
+ precision:
68
+ scale:
69
+ 'null': true
70
+ default:
71
+ default_function:
72
+ collation:
73
+ comment:
74
+ - &6 !ruby/object:ActiveRecord::ConnectionAdapters::Column
75
+ name: comments_count
76
+ table_name: posts
77
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
78
+ sql_type: integer
79
+ type: :integer
80
+ limit:
81
+ precision:
82
+ scale:
83
+ 'null': true
84
+ default: '0'
85
+ default_function:
86
+ collation:
87
+ comment:
88
+ - &7 !ruby/object:ActiveRecord::ConnectionAdapters::Column
89
+ name: taggings_with_delete_all_count
90
+ table_name: posts
91
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
92
+ sql_type: integer
93
+ type: :integer
94
+ limit:
95
+ precision:
96
+ scale:
97
+ 'null': true
98
+ default: '0'
99
+ default_function:
100
+ collation:
101
+ comment:
102
+ - &8 !ruby/object:ActiveRecord::ConnectionAdapters::Column
103
+ name: taggings_with_destroy_count
104
+ table_name: posts
105
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
106
+ sql_type: integer
107
+ type: :integer
108
+ limit:
109
+ precision:
110
+ scale:
111
+ 'null': true
112
+ default: '0'
113
+ default_function:
114
+ collation:
115
+ comment:
116
+ - &9 !ruby/object:ActiveRecord::ConnectionAdapters::Column
117
+ name: tags_count
118
+ table_name: posts
119
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
120
+ sql_type: integer
121
+ type: :integer
122
+ limit:
123
+ precision:
124
+ scale:
125
+ 'null': true
126
+ default: '0'
127
+ default_function:
128
+ collation:
129
+ comment:
130
+ - &10 !ruby/object:ActiveRecord::ConnectionAdapters::Column
131
+ name: tags_with_destroy_count
132
+ table_name: posts
133
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
134
+ sql_type: integer
135
+ type: :integer
136
+ limit:
137
+ precision:
138
+ scale:
139
+ 'null': true
140
+ default: '0'
141
+ default_function:
142
+ collation:
143
+ comment:
144
+ - &11 !ruby/object:ActiveRecord::ConnectionAdapters::Column
145
+ name: tags_with_nullify_count
146
+ table_name: posts
147
+ sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
148
+ sql_type: integer
149
+ type: :integer
150
+ limit:
151
+ precision:
152
+ scale:
153
+ 'null': true
154
+ default: '0'
155
+ default_function:
156
+ collation:
157
+ comment:
158
+ columns_hash:
159
+ posts:
160
+ id: *1
161
+ author_id: *2
162
+ title: *3
163
+ body: *4
164
+ type: *5
165
+ comments_count: *6
166
+ taggings_with_delete_all_count: *7
167
+ taggings_with_destroy_count: *8
168
+ tags_count: *9
169
+ tags_with_destroy_count: *10
170
+ tags_with_nullify_count: *11
171
+ primary_keys:
172
+ posts: id
173
+ data_sources:
174
+ ar_internal_metadata: true
175
+ table_with_autoincrement: true
176
+ accounts: true
177
+ admin_accounts: true
178
+ admin_users: true
179
+ aircraft: true
180
+ articles: true
181
+ articles_magazines: true
182
+ articles_tags: true
183
+ audit_logs: true
184
+ authors: true
185
+ author_addresses: true
186
+ author_favorites: true
187
+ auto_id_tests: true
188
+ binaries: true
189
+ birds: true
190
+ books: true
191
+ booleans: true
192
+ bulbs: true
193
+ CamelCase: true
194
+ cars: true
195
+ carriers: true
196
+ categories: true
197
+ categories_posts: true
198
+ categorizations: true
199
+ citations: true
200
+ clubs: true
201
+ collections: true
202
+ colnametests: true
203
+ columns: true
204
+ comments: true
205
+ companies: true
206
+ content: true
207
+ content_positions: true
208
+ vegetables: true
209
+ computers: true
210
+ computers_developers: true
211
+ contracts: true
212
+ customers: true
213
+ customer_carriers: true
214
+ dashboards: true
215
+ developers: true
216
+ developers_projects: true
217
+ dog_lovers: true
218
+ dogs: true
219
+ doubloons: true
220
+ edges: true
221
+ engines: true
222
+ entrants: true
223
+ essays: true
224
+ events: true
225
+ eyes: true
226
+ funny_jokes: true
227
+ cold_jokes: true
228
+ friendships: true
229
+ goofy_string_id: true
230
+ having: true
231
+ guids: true
232
+ guitars: true
233
+ inept_wizards: true
234
+ integer_limits: true
235
+ invoices: true
236
+ iris: true
237
+ items: true
238
+ jobs: true
239
+ jobs_pool: true
240
+ keyboards: true
241
+ legacy_things: true
242
+ lessons: true
243
+ lessons_students: true
244
+ students: true
245
+ lint_models: true
246
+ line_items: true
247
+ lions: true
248
+ lock_without_defaults: true
249
+ lock_without_defaults_cust: true
250
+ magazines: true
251
+ mateys: true
252
+ members: true
253
+ member_details: true
254
+ member_friends: true
255
+ memberships: true
256
+ member_types: true
257
+ mentors: true
258
+ minivans: true
259
+ minimalistics: true
260
+ mixed_case_monkeys: true
261
+ mixins: true
262
+ movies: true
263
+ notifications: true
264
+ numeric_data: true
265
+ orders: true
266
+ organizations: true
267
+ owners: true
268
+ paint_colors: true
269
+ paint_textures: true
270
+ parrots: true
271
+ parrots_pirates: true
272
+ parrots_treasures: true
273
+ people: true
274
+ peoples_treasures: true
275
+ personal_legacy_things: true
276
+ pets: true
277
+ pets_treasures: true
278
+ pirates: true
279
+ posts: true
280
+ serialized_posts: true
281
+ images: true
282
+ price_estimates: true
283
+ products: true
284
+ product_types: true
285
+ projects: true
286
+ randomly_named_table1: true
287
+ randomly_named_table2: true
288
+ randomly_named_table3: true
289
+ ratings: true
290
+ readers: true
291
+ references: true
292
+ shape_expressions: true
293
+ ships: true
294
+ ship_parts: true
295
+ prisoners: true
296
+ shop_accounts: true
297
+ speedometers: true
298
+ sponsors: true
299
+ string_key_objects: true
300
+ subscribers: true
301
+ subscriptions: true
302
+ tags: true
303
+ taggings: true
304
+ tasks: true
305
+ topics: true
306
+ toys: true
307
+ traffic_lights: true
308
+ treasures: true
309
+ tuning_pegs: true
310
+ tyres: true
311
+ variants: true
312
+ vertices: true
313
+ warehouse_things: true
314
+ circles: true
315
+ squares: true
316
+ triangles: true
317
+ non_poly_ones: true
318
+ non_poly_twos: true
319
+ humans: true
320
+ faces: true
321
+ interests: true
322
+ zines: true
323
+ wheels: true
324
+ countries: true
325
+ treaties: true
326
+ countries_treaties: true
327
+ liquid: true
328
+ molecules: true
329
+ electrons: true
330
+ weirds: true
331
+ nodes: true
332
+ trees: true
333
+ hotels: true
334
+ departments: true
335
+ cake_designers: true
336
+ drink_designers: true
337
+ chefs: true
338
+ recipes: true
339
+ records: true
340
+ overloaded_types: true
341
+ users: true
342
+ test_with_keyword_column_name: true
343
+ fk_test_has_pk: true
344
+ fk_test_has_fk: true
345
+ version: 0