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,267 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ module ActiveRecord
6
+ class Migration
7
+ class IndexTest < ActiveRecord::TestCase
8
+ attr_reader :connection, :table_name
9
+
10
+ def setup
11
+ super
12
+ @connection = ActiveRecord::Base.connection
13
+ @table_name = :testings
14
+
15
+ connection.create_table table_name do |t|
16
+ t.column :foo, :string, limit: 100
17
+ t.column :bar, :string, limit: 100
18
+
19
+ t.string :first_name
20
+ t.string :last_name, limit: 100
21
+ t.string :key, limit: 100
22
+ t.boolean :administrator
23
+ end
24
+ end
25
+
26
+ teardown do
27
+ connection.drop_table :testings rescue nil
28
+ ActiveRecord::Base.primary_key_prefix_type = nil
29
+ end
30
+
31
+ def test_rename_index
32
+ # keep the names short to make Oracle and similar behave
33
+ connection.add_index(table_name, [:foo], name: "old_idx")
34
+ connection.rename_index(table_name, "old_idx", "new_idx")
35
+
36
+ assert_not connection.index_name_exists?(table_name, "old_idx")
37
+ assert connection.index_name_exists?(table_name, "new_idx")
38
+ end
39
+
40
+ def test_rename_index_with_symbol
41
+ # keep the names short to make Oracle and similar behave
42
+ connection.add_index(table_name, [:foo], name: :old_idx)
43
+ connection.rename_index(table_name, :old_idx, :new_idx)
44
+
45
+ assert_not connection.index_name_exists?(table_name, "old_idx")
46
+ assert connection.index_name_exists?(table_name, "new_idx")
47
+ end
48
+
49
+ def test_rename_index_too_long
50
+ too_long_index_name = good_index_name + "x"
51
+ # keep the names short to make Oracle and similar behave
52
+ connection.add_index(table_name, [:foo], name: "old_idx")
53
+ e = assert_raises(ArgumentError) {
54
+ connection.rename_index(table_name, "old_idx", too_long_index_name)
55
+ }
56
+ assert_match(/too long; the limit is #{connection.index_name_length} characters/, e.message)
57
+
58
+ assert connection.index_name_exists?(table_name, "old_idx")
59
+ end
60
+
61
+ def test_remove_nonexistent_index
62
+ assert_raise(ArgumentError) { connection.remove_index(table_name, "no_such_index") }
63
+ end
64
+
65
+ def test_add_index_works_with_long_index_names
66
+ connection.add_index(table_name, "foo", name: good_index_name)
67
+
68
+ assert connection.index_name_exists?(table_name, good_index_name)
69
+ connection.remove_index(table_name, name: good_index_name)
70
+ end
71
+
72
+ def test_add_index_does_not_accept_too_long_index_names
73
+ too_long_index_name = good_index_name + "x"
74
+
75
+ e = assert_raises(ArgumentError) {
76
+ connection.add_index(table_name, "foo", name: too_long_index_name)
77
+ }
78
+ assert_match(/too long; the limit is #{connection.index_name_length} characters/, e.message)
79
+
80
+ assert_not connection.index_name_exists?(table_name, too_long_index_name)
81
+ connection.add_index(table_name, "foo", name: good_index_name)
82
+ end
83
+
84
+ def test_add_index_which_already_exists_does_not_raise_error_with_option
85
+ connection.add_index(table_name, "foo")
86
+
87
+ assert_nothing_raised do
88
+ connection.add_index(table_name, "foo", if_not_exists: true)
89
+ end
90
+
91
+ assert connection.index_name_exists?(table_name, "index_testings_on_foo")
92
+ end
93
+
94
+ def test_add_index_with_if_not_exists_matches_exact_index
95
+ connection.add_index(table_name, [:foo, :bar], unique: false, name: "index_testings_on_foo_bar")
96
+
97
+ assert connection.index_name_exists?(table_name, "index_testings_on_foo_bar")
98
+
99
+ assert_nothing_raised do
100
+ connection.add_index(table_name, [:foo, :bar], unique: true, if_not_exists: true)
101
+ end
102
+
103
+ assert connection.index_name_exists?(table_name, "index_testings_on_foo_and_bar")
104
+ end
105
+
106
+ def test_remove_index_which_does_not_exist_doesnt_raise_with_option
107
+ connection.add_index(table_name, "foo")
108
+
109
+ connection.remove_index(table_name, "foo")
110
+
111
+ assert_raises ArgumentError do
112
+ connection.remove_index(table_name, "foo")
113
+ end
114
+
115
+ assert_nothing_raised do
116
+ connection.remove_index(table_name, "foo", if_exists: true)
117
+ end
118
+ end
119
+
120
+ def test_remove_index_with_name_which_does_not_exist_doesnt_raise_with_option
121
+ connection.add_index(table_name, [:foo], name: "foo")
122
+
123
+ assert connection.index_exists?(table_name, :foo, name: "foo")
124
+
125
+ connection.remove_index(table_name, nil, name: "foo", if_exists: true)
126
+
127
+ assert_not connection.index_exists?(table_name, :foo, name: "foo")
128
+ end
129
+
130
+ def test_internal_index_with_name_matching_database_limit
131
+ good_index_name = "x" * connection.index_name_length
132
+ connection.add_index(table_name, "foo", name: good_index_name, internal: true)
133
+
134
+ assert connection.index_name_exists?(table_name, good_index_name)
135
+ connection.remove_index(table_name, name: good_index_name)
136
+ end
137
+
138
+ def test_index_symbol_names
139
+ connection.add_index table_name, :foo, name: :symbol_index_name
140
+ assert connection.index_exists?(table_name, :foo, name: :symbol_index_name)
141
+
142
+ connection.remove_index table_name, name: :symbol_index_name
143
+ assert_not connection.index_exists?(table_name, :foo, name: :symbol_index_name)
144
+ end
145
+
146
+ def test_index_exists
147
+ connection.add_index :testings, :foo
148
+
149
+ assert connection.index_exists?(:testings, :foo)
150
+ assert_not connection.index_exists?(:testings, :bar)
151
+ end
152
+
153
+ def test_index_exists_on_multiple_columns
154
+ connection.add_index :testings, [:foo, :bar]
155
+
156
+ assert connection.index_exists?(:testings, [:foo, :bar])
157
+ end
158
+
159
+ def test_index_exists_with_custom_name_checks_columns
160
+ connection.add_index :testings, [:foo, :bar], name: "my_index"
161
+ assert connection.index_exists?(:testings, [:foo, :bar], name: "my_index")
162
+ assert_not connection.index_exists?(:testings, [:foo], name: "my_index")
163
+ end
164
+
165
+ def test_valid_index_options
166
+ assert_raise ArgumentError do
167
+ connection.add_index :testings, :foo, unqiue: true
168
+ end
169
+ end
170
+
171
+ def test_unique_index_exists
172
+ connection.add_index :testings, :foo, unique: true
173
+
174
+ assert connection.index_exists?(:testings, :foo, unique: true)
175
+ end
176
+
177
+ def test_named_index_exists
178
+ connection.add_index :testings, :foo, name: "custom_index_name"
179
+
180
+ assert connection.index_exists?(:testings, :foo)
181
+ assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
182
+ assert_not connection.index_exists?(:testings, :foo, name: "other_index_name")
183
+ end
184
+
185
+ def test_remove_named_index
186
+ connection.add_index :testings, :foo, name: "index_testings_on_custom_index_name"
187
+
188
+ assert connection.index_exists?(:testings, :foo)
189
+
190
+ assert_raise(ArgumentError) { connection.remove_index(:testings, "custom_index_name") }
191
+
192
+ connection.remove_index :testings, :foo
193
+ assert_not connection.index_exists?(:testings, :foo)
194
+ end
195
+
196
+ def test_add_index_attribute_length_limit
197
+ connection.add_index :testings, [:foo, :bar], length: { foo: 10, bar: nil }
198
+
199
+ assert connection.index_exists?(:testings, [:foo, :bar])
200
+ end
201
+
202
+ def test_add_index
203
+ connection.add_index("testings", "last_name")
204
+ connection.remove_index("testings", "last_name")
205
+
206
+ connection.add_index("testings", ["last_name", "first_name"])
207
+ connection.remove_index("testings", column: ["last_name", "first_name"])
208
+
209
+ connection.add_index("testings", ["last_name", "first_name"])
210
+ connection.remove_index("testings", name: :index_testings_on_last_name_and_first_name)
211
+ connection.add_index("testings", ["last_name", "first_name"])
212
+ connection.remove_index("testings", "last_name_and_first_name")
213
+
214
+ connection.add_index("testings", ["last_name", "first_name"])
215
+ connection.remove_index("testings", ["last_name", "first_name"])
216
+
217
+ connection.add_index("testings", ["last_name"], length: 10)
218
+ connection.remove_index("testings", "last_name")
219
+
220
+ connection.add_index("testings", ["last_name"], length: { last_name: 10 })
221
+ connection.remove_index("testings", ["last_name"])
222
+
223
+ connection.add_index("testings", ["last_name", "first_name"], length: 10)
224
+ connection.remove_index("testings", ["last_name", "first_name"])
225
+
226
+ connection.add_index("testings", ["last_name", "first_name"], length: { last_name: 10, first_name: 20 })
227
+ connection.remove_index("testings", ["last_name", "first_name"])
228
+
229
+ connection.add_index("testings", "key", unique: true)
230
+ connection.remove_index("testings", "key", unique: true)
231
+
232
+ connection.add_index("testings", ["key"], name: "key_idx", unique: true)
233
+ connection.remove_index("testings", name: "key_idx", unique: true)
234
+
235
+ connection.add_index("testings", %w(last_name first_name administrator), name: "named_admin")
236
+ connection.remove_index("testings", name: "named_admin")
237
+
238
+ # Selected adapters support index sort order
239
+ if current_adapter?(:SQLite3Adapter, :Mysql2Adapter, :PostgreSQLAdapter)
240
+ connection.add_index("testings", ["last_name"], order: { last_name: :desc })
241
+ connection.remove_index("testings", ["last_name"])
242
+ connection.add_index("testings", ["last_name", "first_name"], order: { last_name: :desc })
243
+ connection.remove_index("testings", ["last_name", "first_name"])
244
+ connection.add_index("testings", ["last_name", "first_name"], order: { last_name: :desc, first_name: :asc })
245
+ connection.remove_index("testings", ["last_name", "first_name"])
246
+ connection.add_index("testings", ["last_name", "first_name"], order: :desc)
247
+ connection.remove_index("testings", ["last_name", "first_name"])
248
+ end
249
+ end
250
+
251
+ if current_adapter?(:PostgreSQLAdapter)
252
+ def test_add_partial_index
253
+ connection.add_index("testings", "last_name", where: "first_name = 'john doe'")
254
+ assert connection.index_exists?("testings", "last_name")
255
+
256
+ connection.remove_index("testings", "last_name")
257
+ assert_not connection.index_exists?("testings", "last_name")
258
+ end
259
+ end
260
+
261
+ private
262
+ def good_index_name
263
+ "x" * connection.index_name_length
264
+ end
265
+ end
266
+ end
267
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ module ActiveRecord
6
+ class Migration
7
+ class LoggerTest < ActiveRecord::TestCase
8
+ # MySQL can't roll back ddl changes
9
+ self.use_transactional_tests = false
10
+
11
+ Migration = Struct.new(:name, :version) do
12
+ def disable_ddl_transaction; false end
13
+ def migrate(direction)
14
+ # do nothing
15
+ end
16
+ end
17
+
18
+ def setup
19
+ super
20
+ @schema_migration = ActiveRecord::Base.connection.schema_migration
21
+ @schema_migration.create_table
22
+ @schema_migration.delete_all
23
+ end
24
+
25
+ teardown do
26
+ @schema_migration.drop_table
27
+ end
28
+
29
+ def test_migration_should_be_run_without_logger
30
+ previous_logger = ActiveRecord::Base.logger
31
+ ActiveRecord::Base.logger = nil
32
+ migrations = [Migration.new("a", 1), Migration.new("b", 2), Migration.new("c", 3)]
33
+ ActiveRecord::Migrator.new(:up, migrations, @schema_migration).migrate
34
+ ensure
35
+ ActiveRecord::Base.logger = previous_logger
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ module ActiveRecord
6
+ class Migration
7
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
8
+ class PendingMigrationsTest < ActiveRecord::TestCase
9
+ setup do
10
+ @migration_dir = Dir.mktmpdir("activerecord-migrations-")
11
+
12
+ file = ActiveRecord::Base.connection.raw_connection.filename
13
+ @conn = ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:", migrations_paths: @migration_dir
14
+ source_db = SQLite3::Database.new file
15
+ dest_db = ActiveRecord::Base.connection.raw_connection
16
+ backup = SQLite3::Backup.new(dest_db, "main", source_db, "main")
17
+ backup.step(-1)
18
+ backup.finish
19
+
20
+ ActiveRecord::Base.connection.drop_table "schema_migrations", if_exists: true
21
+
22
+ @app = Minitest::Mock.new
23
+ end
24
+
25
+ teardown do
26
+ @conn.release_connection if @conn
27
+ ActiveRecord::Base.establish_connection :arunit
28
+ FileUtils.rm_rf(@migration_dir)
29
+ end
30
+
31
+ def run_migrations
32
+ migrator = Base.connection.migration_context
33
+ capture(:stdout) { migrator.migrate }
34
+ end
35
+
36
+ def create_migration(number, name)
37
+ filename = "#{number}_#{name.underscore}.rb"
38
+ File.write(File.join(@migration_dir, filename), <<~RUBY)
39
+ class #{name.classify} < ActiveRecord::Migration::Current
40
+ end
41
+ RUBY
42
+ end
43
+
44
+ def test_errors_if_pending
45
+ create_migration "01", "create_foo"
46
+
47
+ assert_raises ActiveRecord::PendingMigrationError do
48
+ CheckPending.new(@app).call({})
49
+ end
50
+
51
+ # Continues failing
52
+ assert_raises ActiveRecord::PendingMigrationError do
53
+ CheckPending.new(@app).call({})
54
+ end
55
+ end
56
+
57
+ def test_checks_if_supported
58
+ run_migrations
59
+
60
+ check_pending = CheckPending.new(@app)
61
+
62
+ @app.expect :call, nil, [{}]
63
+ check_pending.call({})
64
+ @app.verify
65
+
66
+ # With cached result
67
+ @app.expect :call, nil, [{}]
68
+ check_pending.call({})
69
+ @app.verify
70
+ end
71
+
72
+ def test_okay_with_no_migrations
73
+ check_pending = CheckPending.new(@app)
74
+
75
+ @app.expect :call, nil, [{}]
76
+ check_pending.call({})
77
+ @app.verify
78
+
79
+ # With cached result
80
+ @app.expect :call, nil, [{}]
81
+ check_pending.call({})
82
+ @app.verify
83
+ end
84
+
85
+ # Regression test for https://github.com/rails/rails/pull/29759
86
+ def test_understands_migrations_created_out_of_order
87
+ # With a prior file before even initialization
88
+ create_migration "05", "create_bar"
89
+ run_migrations
90
+
91
+ check_pending = CheckPending.new(@app)
92
+
93
+ @app.expect :call, nil, [{}]
94
+ check_pending.call({})
95
+ @app.verify
96
+
97
+ # It understands the new migration created at 01
98
+ create_migration "01", "create_foo"
99
+ assert_raises ActiveRecord::PendingMigrationError do
100
+ check_pending.call({})
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,235 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ if ActiveRecord::Base.connection.supports_foreign_keys?
6
+ module ActiveRecord
7
+ class Migration
8
+ class ReferencesForeignKeyInCreateTest < ActiveRecord::TestCase
9
+ setup do
10
+ @connection = ActiveRecord::Base.connection
11
+ @connection.create_table(:testing_parents, force: true)
12
+ end
13
+
14
+ teardown do
15
+ @connection.drop_table "testings", if_exists: true
16
+ @connection.drop_table "testing_parents", if_exists: true
17
+ end
18
+
19
+ test "foreign keys can be created with the table" do
20
+ @connection.create_table :testings do |t|
21
+ t.references :testing_parent, foreign_key: true
22
+ end
23
+
24
+ fk = @connection.foreign_keys("testings").first
25
+ assert_equal "testings", fk.from_table
26
+ assert_equal "testing_parents", fk.to_table
27
+ end
28
+
29
+ test "no foreign key is created by default" do
30
+ @connection.create_table :testings do |t|
31
+ t.references :testing_parent
32
+ end
33
+
34
+ assert_equal [], @connection.foreign_keys("testings")
35
+ end
36
+
37
+ test "foreign keys can be created in one query when index is not added" do
38
+ assert_queries(1) do
39
+ @connection.create_table :testings do |t|
40
+ t.references :testing_parent, foreign_key: true, index: false
41
+ end
42
+ end
43
+ end
44
+
45
+ test "options hash can be passed" do
46
+ @connection.change_table :testing_parents do |t|
47
+ t.references :other, index: { unique: true }
48
+ end
49
+ @connection.create_table :testings do |t|
50
+ t.references :testing_parent, foreign_key: { primary_key: :other_id }
51
+ end
52
+
53
+ fk = @connection.foreign_keys("testings").find { |k| k.to_table == "testing_parents" }
54
+ assert_equal "other_id", fk.primary_key
55
+ end
56
+
57
+ test "to_table option can be passed" do
58
+ @connection.create_table :testings do |t|
59
+ t.references :parent, foreign_key: { to_table: :testing_parents }
60
+ end
61
+ fks = @connection.foreign_keys("testings")
62
+ assert_equal([["testings", "testing_parents", "parent_id"]],
63
+ fks.map { |fk| [fk.from_table, fk.to_table, fk.column] })
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ module ActiveRecord
70
+ class Migration
71
+ class ReferencesForeignKeyTest < ActiveRecord::TestCase
72
+ setup do
73
+ @connection = ActiveRecord::Base.connection
74
+ @connection.create_table(:testing_parents, force: true)
75
+ end
76
+
77
+ teardown do
78
+ @connection.drop_table "testings", if_exists: true
79
+ @connection.drop_table "testing_parents", if_exists: true
80
+ end
81
+
82
+ test "foreign keys cannot be added to polymorphic relations when creating the table" do
83
+ @connection.create_table :testings do |t|
84
+ assert_raises(ArgumentError) do
85
+ t.references :testing_parent, polymorphic: true, foreign_key: true
86
+ end
87
+ end
88
+ end
89
+
90
+ test "foreign keys can be created while changing the table" do
91
+ @connection.create_table :testings
92
+ @connection.change_table :testings do |t|
93
+ t.references :testing_parent, foreign_key: true
94
+ end
95
+
96
+ fk = @connection.foreign_keys("testings").first
97
+ assert_equal "testings", fk.from_table
98
+ assert_equal "testing_parents", fk.to_table
99
+ end
100
+
101
+ test "foreign keys are not added by default when changing the table" do
102
+ @connection.create_table :testings
103
+ @connection.change_table :testings do |t|
104
+ t.references :testing_parent
105
+ end
106
+
107
+ assert_equal [], @connection.foreign_keys("testings")
108
+ end
109
+
110
+ test "foreign keys accept options when changing the table" do
111
+ @connection.change_table :testing_parents do |t|
112
+ t.references :other, index: { unique: true }
113
+ end
114
+ @connection.create_table :testings
115
+ @connection.change_table :testings do |t|
116
+ t.references :testing_parent, foreign_key: { primary_key: :other_id }
117
+ end
118
+
119
+ fk = @connection.foreign_keys("testings").find { |k| k.to_table == "testing_parents" }
120
+ assert_equal "other_id", fk.primary_key
121
+ end
122
+
123
+ test "foreign keys cannot be added to polymorphic relations when changing the table" do
124
+ @connection.create_table :testings
125
+ @connection.change_table :testings do |t|
126
+ assert_raises(ArgumentError) do
127
+ t.references :testing_parent, polymorphic: true, foreign_key: true
128
+ end
129
+ end
130
+ end
131
+
132
+ test "foreign key column can be removed" do
133
+ @connection.create_table :testings do |t|
134
+ t.references :testing_parent, index: true, foreign_key: true
135
+ end
136
+
137
+ assert_difference "@connection.foreign_keys('testings').size", -1 do
138
+ @connection.remove_reference :testings, :testing_parent, foreign_key: true
139
+ end
140
+ end
141
+
142
+ test "removing column removes foreign key" do
143
+ @connection.create_table :testings do |t|
144
+ t.references :testing_parent, index: true, foreign_key: true
145
+ end
146
+
147
+ assert_difference "@connection.foreign_keys('testings').size", -1 do
148
+ @connection.remove_column :testings, :testing_parent_id
149
+ end
150
+ end
151
+
152
+ test "foreign key methods respect pluralize_table_names" do
153
+ original_pluralize_table_names = ActiveRecord::Base.pluralize_table_names
154
+ ActiveRecord::Base.pluralize_table_names = false
155
+ @connection.create_table :testing
156
+ @connection.change_table :testing_parents do |t|
157
+ t.references :testing, foreign_key: true
158
+ end
159
+
160
+ fk = @connection.foreign_keys("testing_parents").first
161
+ assert_equal "testing_parents", fk.from_table
162
+ assert_equal "testing", fk.to_table
163
+
164
+ assert_difference "@connection.foreign_keys('testing_parents').size", -1 do
165
+ @connection.remove_reference :testing_parents, :testing, foreign_key: true
166
+ end
167
+ ensure
168
+ ActiveRecord::Base.pluralize_table_names = original_pluralize_table_names
169
+ @connection.drop_table "testing", if_exists: true
170
+ end
171
+
172
+ class CreateDogsMigration < ActiveRecord::Migration::Current
173
+ def change
174
+ create_table :dog_owners
175
+
176
+ create_table :dogs do |t|
177
+ t.references :dog_owner, foreign_key: true
178
+ end
179
+ end
180
+ end
181
+
182
+ def test_references_foreign_key_with_prefix
183
+ ActiveRecord::Base.table_name_prefix = "p_"
184
+ migration = CreateDogsMigration.new
185
+ silence_stream($stdout) { migration.migrate(:up) }
186
+ assert_equal 1, @connection.foreign_keys("p_dogs").size
187
+ ensure
188
+ silence_stream($stdout) { migration.migrate(:down) }
189
+ ActiveRecord::Base.table_name_prefix = nil
190
+ end
191
+
192
+ def test_references_foreign_key_with_suffix
193
+ ActiveRecord::Base.table_name_suffix = "_s"
194
+ migration = CreateDogsMigration.new
195
+ silence_stream($stdout) { migration.migrate(:up) }
196
+ assert_equal 1, @connection.foreign_keys("dogs_s").size
197
+ ensure
198
+ silence_stream($stdout) { migration.migrate(:down) }
199
+ ActiveRecord::Base.table_name_suffix = nil
200
+ end
201
+
202
+ test "multiple foreign keys can be added to the same table" do
203
+ @connection.create_table :testings do |t|
204
+ t.references :parent1, foreign_key: { to_table: :testing_parents }
205
+ t.references :parent2, foreign_key: { to_table: :testing_parents }
206
+ t.references :self_join, foreign_key: { to_table: :testings }
207
+ end
208
+
209
+ fks = @connection.foreign_keys("testings").sort_by(&:column)
210
+
211
+ fk_definitions = fks.map { |fk| [fk.from_table, fk.to_table, fk.column] }
212
+ assert_equal([["testings", "testing_parents", "parent1_id"],
213
+ ["testings", "testing_parents", "parent2_id"],
214
+ ["testings", "testings", "self_join_id"]], fk_definitions)
215
+ end
216
+
217
+ test "multiple foreign keys can be removed to the selected one" do
218
+ @connection.create_table :testings do |t|
219
+ t.references :parent1, foreign_key: { to_table: :testing_parents }
220
+ t.references :parent2, foreign_key: { to_table: :testing_parents }
221
+ end
222
+
223
+ assert_difference "@connection.foreign_keys('testings').size", -1 do
224
+ @connection.remove_reference :testings, :parent1, foreign_key: { to_table: :testing_parents }
225
+ end
226
+
227
+ fks = @connection.foreign_keys("testings").sort_by(&:column)
228
+
229
+ fk_definitions = fks.map { |fk| [fk.from_table, fk.to_table, fk.column] }
230
+ assert_equal([["testings", "testing_parents", "parent2_id"]], fk_definitions)
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end