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,581 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ if ActiveRecord::Base.connection.supports_foreign_keys?
7
+ module ActiveRecord
8
+ class Migration
9
+ class ForeignKeyInCreateTest < ActiveRecord::TestCase
10
+ def test_foreign_keys
11
+ foreign_keys = ActiveRecord::Base.connection.foreign_keys("fk_test_has_fk")
12
+ assert_equal 1, foreign_keys.size
13
+
14
+ fk = foreign_keys.first
15
+ assert_equal "fk_test_has_fk", fk.from_table
16
+ assert_equal "fk_test_has_pk", fk.to_table
17
+ assert_equal "fk_id", fk.column
18
+ assert_equal "pk_id", fk.primary_key
19
+ assert_equal "fk_name", fk.name unless current_adapter?(:SQLite3Adapter)
20
+ end
21
+ end
22
+
23
+ class ForeignKeyChangeColumnTest < ActiveRecord::TestCase
24
+ self.use_transactional_tests = false
25
+
26
+ class Rocket < ActiveRecord::Base
27
+ has_many :astronauts
28
+ end
29
+
30
+ class Astronaut < ActiveRecord::Base
31
+ belongs_to :rocket
32
+ end
33
+
34
+ class CreateRocketsMigration < ActiveRecord::Migration::Current
35
+ def change
36
+ create_table :rockets do |t|
37
+ t.string :name
38
+ end
39
+
40
+ create_table :astronauts do |t|
41
+ t.string :name
42
+ t.references :rocket, foreign_key: true
43
+ end
44
+ end
45
+ end
46
+
47
+ def setup
48
+ @connection = ActiveRecord::Base.connection
49
+ @migration = CreateRocketsMigration.new
50
+ silence_stream($stdout) { @migration.migrate(:up) }
51
+ Rocket.reset_table_name
52
+ Rocket.reset_column_information
53
+ Astronaut.reset_table_name
54
+ Astronaut.reset_column_information
55
+ end
56
+
57
+ def teardown
58
+ silence_stream($stdout) { @migration.migrate(:down) }
59
+ Rocket.reset_table_name
60
+ Rocket.reset_column_information
61
+ Astronaut.reset_table_name
62
+ Astronaut.reset_column_information
63
+ end
64
+
65
+ def test_change_column_of_parent_table
66
+ rocket = Rocket.create!(name: "myrocket")
67
+ rocket.astronauts << Astronaut.create!
68
+
69
+ @connection.change_column_null Rocket.table_name, :name, false
70
+
71
+ foreign_keys = @connection.foreign_keys(Astronaut.table_name)
72
+ assert_equal 1, foreign_keys.size
73
+
74
+ fk = foreign_keys.first
75
+ assert_equal "myrocket", Rocket.first.name
76
+ assert_equal Astronaut.table_name, fk.from_table
77
+ assert_equal Rocket.table_name, fk.to_table
78
+ end
79
+
80
+ def test_rename_column_of_child_table
81
+ rocket = Rocket.create!(name: "myrocket")
82
+ rocket.astronauts << Astronaut.create!
83
+
84
+ @connection.rename_column Astronaut.table_name, :name, :astronaut_name
85
+
86
+ foreign_keys = @connection.foreign_keys(Astronaut.table_name)
87
+ assert_equal 1, foreign_keys.size
88
+
89
+ fk = foreign_keys.first
90
+ assert_equal "myrocket", Rocket.first.name
91
+ assert_equal Astronaut.table_name, fk.from_table
92
+ assert_equal Rocket.table_name, fk.to_table
93
+ end
94
+
95
+ def test_rename_reference_column_of_child_table
96
+ if current_adapter?(:Mysql2Adapter) && !@connection.send(:supports_rename_index?)
97
+ skip "Cannot drop index, needed in a foreign key constraint"
98
+ end
99
+
100
+ rocket = Rocket.create!(name: "myrocket")
101
+ rocket.astronauts << Astronaut.create!
102
+
103
+ @connection.rename_column Astronaut.table_name, :rocket_id, :new_rocket_id
104
+
105
+ foreign_keys = @connection.foreign_keys(Astronaut.table_name)
106
+ assert_equal 1, foreign_keys.size
107
+
108
+ fk = foreign_keys.first
109
+ assert_equal "myrocket", Rocket.first.name
110
+ assert_equal Astronaut.table_name, fk.from_table
111
+ assert_equal Rocket.table_name, fk.to_table
112
+ assert_equal "new_rocket_id", fk.options[:column]
113
+ end
114
+
115
+ def test_remove_reference_column_of_child_table
116
+ rocket = Rocket.create!(name: "myrocket")
117
+ rocket.astronauts << Astronaut.create!
118
+
119
+ @connection.remove_column Astronaut.table_name, :rocket_id
120
+
121
+ assert_empty @connection.foreign_keys(Astronaut.table_name)
122
+ end
123
+
124
+ def test_remove_foreign_key_by_column
125
+ rocket = Rocket.create!(name: "myrocket")
126
+ rocket.astronauts << Astronaut.create!
127
+
128
+ @connection.remove_foreign_key Astronaut.table_name, column: :rocket_id
129
+
130
+ assert_empty @connection.foreign_keys(Astronaut.table_name)
131
+ end
132
+
133
+ def test_remove_foreign_key_by_column_in_change_table
134
+ rocket = Rocket.create!(name: "myrocket")
135
+ rocket.astronauts << Astronaut.create!
136
+
137
+ @connection.change_table Astronaut.table_name do |t|
138
+ t.remove_foreign_key column: :rocket_id
139
+ end
140
+
141
+ assert_empty @connection.foreign_keys(Astronaut.table_name)
142
+ end
143
+ end
144
+
145
+ class ForeignKeyChangeColumnWithPrefixTest < ForeignKeyChangeColumnTest
146
+ setup do
147
+ ActiveRecord::Base.table_name_prefix = "p_"
148
+ end
149
+
150
+ teardown do
151
+ ActiveRecord::Base.table_name_prefix = nil
152
+ end
153
+ end
154
+
155
+ class ForeignKeyChangeColumnWithSuffixTest < ForeignKeyChangeColumnTest
156
+ setup do
157
+ ActiveRecord::Base.table_name_suffix = "_s"
158
+ end
159
+
160
+ teardown do
161
+ ActiveRecord::Base.table_name_suffix = nil
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ module ActiveRecord
168
+ class Migration
169
+ class ForeignKeyTest < ActiveRecord::TestCase
170
+ include SchemaDumpingHelper
171
+ include ActiveSupport::Testing::Stream
172
+
173
+ class Rocket < ActiveRecord::Base
174
+ end
175
+
176
+ class Astronaut < ActiveRecord::Base
177
+ end
178
+
179
+ setup do
180
+ @connection = ActiveRecord::Base.connection
181
+ @connection.create_table "rockets", force: true do |t|
182
+ t.string :name
183
+ end
184
+
185
+ @connection.create_table "astronauts", force: true do |t|
186
+ t.string :name
187
+ t.references :rocket
188
+ end
189
+ end
190
+
191
+ teardown do
192
+ @connection.drop_table "astronauts", if_exists: true rescue nil
193
+ @connection.drop_table "rockets", if_exists: true rescue nil
194
+ end
195
+
196
+ def test_foreign_keys
197
+ foreign_keys = @connection.foreign_keys("fk_test_has_fk")
198
+ assert_equal 1, foreign_keys.size
199
+
200
+ fk = foreign_keys.first
201
+ assert_equal "fk_test_has_fk", fk.from_table
202
+ assert_equal "fk_test_has_pk", fk.to_table
203
+ assert_equal "fk_id", fk.column
204
+ assert_equal "pk_id", fk.primary_key
205
+ assert_equal "fk_name", fk.name unless current_adapter?(:SQLite3Adapter)
206
+ end
207
+
208
+ def test_add_foreign_key_inferes_column
209
+ @connection.add_foreign_key :astronauts, :rockets
210
+
211
+ foreign_keys = @connection.foreign_keys("astronauts")
212
+ assert_equal 1, foreign_keys.size
213
+
214
+ fk = foreign_keys.first
215
+ assert_equal "astronauts", fk.from_table
216
+ assert_equal "rockets", fk.to_table
217
+ assert_equal "rocket_id", fk.column
218
+ assert_equal "id", fk.primary_key
219
+ assert_equal "fk_rails_78146ddd2e", fk.name unless current_adapter?(:SQLite3Adapter)
220
+ end
221
+
222
+ def test_add_foreign_key_with_column
223
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
224
+
225
+ foreign_keys = @connection.foreign_keys("astronauts")
226
+ assert_equal 1, foreign_keys.size
227
+
228
+ fk = foreign_keys.first
229
+ assert_equal "astronauts", fk.from_table
230
+ assert_equal "rockets", fk.to_table
231
+ assert_equal "rocket_id", fk.column
232
+ assert_equal "id", fk.primary_key
233
+ assert_equal "fk_rails_78146ddd2e", fk.name unless current_adapter?(:SQLite3Adapter)
234
+ end
235
+
236
+ def test_add_foreign_key_with_non_standard_primary_key
237
+ @connection.create_table :space_shuttles, id: false, force: true do |t|
238
+ t.bigint :pk, primary_key: true
239
+ end
240
+
241
+ @connection.add_foreign_key(:astronauts, :space_shuttles,
242
+ column: "rocket_id", primary_key: "pk", name: "custom_pk")
243
+
244
+ foreign_keys = @connection.foreign_keys("astronauts")
245
+ assert_equal 1, foreign_keys.size
246
+
247
+ fk = foreign_keys.first
248
+ assert_equal "astronauts", fk.from_table
249
+ assert_equal "space_shuttles", fk.to_table
250
+ assert_equal "pk", fk.primary_key
251
+ ensure
252
+ @connection.remove_foreign_key :astronauts, name: "custom_pk", to_table: "space_shuttles"
253
+ @connection.drop_table :space_shuttles
254
+ end
255
+
256
+ def test_add_on_delete_restrict_foreign_key
257
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :restrict
258
+
259
+ foreign_keys = @connection.foreign_keys("astronauts")
260
+ assert_equal 1, foreign_keys.size
261
+
262
+ fk = foreign_keys.first
263
+ if current_adapter?(:Mysql2Adapter)
264
+ # ON DELETE RESTRICT is the default on MySQL
265
+ assert_nil fk.on_delete
266
+ else
267
+ assert_equal :restrict, fk.on_delete
268
+ end
269
+ end
270
+
271
+ def test_add_on_delete_cascade_foreign_key
272
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :cascade
273
+
274
+ foreign_keys = @connection.foreign_keys("astronauts")
275
+ assert_equal 1, foreign_keys.size
276
+
277
+ fk = foreign_keys.first
278
+ assert_equal :cascade, fk.on_delete
279
+ end
280
+
281
+ def test_add_on_delete_nullify_foreign_key
282
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify
283
+
284
+ foreign_keys = @connection.foreign_keys("astronauts")
285
+ assert_equal 1, foreign_keys.size
286
+
287
+ fk = foreign_keys.first
288
+ assert_equal :nullify, fk.on_delete
289
+ end
290
+
291
+ def test_on_update_and_on_delete_raises_with_invalid_values
292
+ assert_raises ArgumentError do
293
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :invalid
294
+ end
295
+
296
+ assert_raises ArgumentError do
297
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :invalid
298
+ end
299
+ end
300
+
301
+ def test_add_foreign_key_with_on_update
302
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :nullify
303
+
304
+ foreign_keys = @connection.foreign_keys("astronauts")
305
+ assert_equal 1, foreign_keys.size
306
+
307
+ fk = foreign_keys.first
308
+ assert_equal :nullify, fk.on_update
309
+ end
310
+
311
+ def test_add_foreign_key_with_non_existent_from_table_raises
312
+ e = assert_raises ArgumentError do
313
+ @connection.add_foreign_key :missions, :rockets
314
+ end
315
+ assert_match(/missions/i, e.message)
316
+ end
317
+
318
+ def test_add_foreign_key_with_non_existent_to_table_raises
319
+ e = assert_raises ArgumentError do
320
+ @connection.add_foreign_key :missions, :rockets
321
+ end
322
+ assert_match(/missions/i, e.message)
323
+ end
324
+
325
+ def test_foreign_key_exists
326
+ @connection.add_foreign_key :astronauts, :rockets
327
+
328
+ assert @connection.foreign_key_exists?(:astronauts, :rockets)
329
+ assert_not @connection.foreign_key_exists?(:astronauts, :stars)
330
+ end
331
+
332
+ def test_foreign_key_exists_by_column
333
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
334
+
335
+ assert @connection.foreign_key_exists?(:astronauts, column: "rocket_id")
336
+ assert_not @connection.foreign_key_exists?(:astronauts, column: "star_id")
337
+ end
338
+
339
+ def test_foreign_key_exists_by_name
340
+ skip if current_adapter?(:SQLite3Adapter)
341
+
342
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"
343
+
344
+ assert @connection.foreign_key_exists?(:astronauts, name: "fancy_named_fk")
345
+ assert_not @connection.foreign_key_exists?(:astronauts, name: "other_fancy_named_fk")
346
+ end
347
+
348
+ def test_foreign_key_exists_in_change_table
349
+ @connection.change_table(:astronauts) do |t|
350
+ t.foreign_key :rockets, column: "rocket_id", name: "fancy_named_fk"
351
+
352
+ assert t.foreign_key_exists?(column: "rocket_id")
353
+ assert_not t.foreign_key_exists?(column: "star_id")
354
+
355
+ unless current_adapter?(:SQLite3Adapter)
356
+ assert t.foreign_key_exists?(name: "fancy_named_fk")
357
+ assert_not t.foreign_key_exists?(name: "other_fancy_named_fk")
358
+ end
359
+ end
360
+ end
361
+
362
+ def test_remove_foreign_key_inferes_column
363
+ @connection.add_foreign_key :astronauts, :rockets
364
+
365
+ assert_equal 1, @connection.foreign_keys("astronauts").size
366
+ @connection.remove_foreign_key :astronauts, :rockets
367
+ assert_equal [], @connection.foreign_keys("astronauts")
368
+ end
369
+
370
+ def test_remove_foreign_key_by_column
371
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
372
+
373
+ assert_equal 1, @connection.foreign_keys("astronauts").size
374
+ @connection.remove_foreign_key :astronauts, column: "rocket_id"
375
+ assert_equal [], @connection.foreign_keys("astronauts")
376
+ end
377
+
378
+ def test_remove_foreign_key_by_symbol_column
379
+ @connection.add_foreign_key :astronauts, :rockets, column: :rocket_id
380
+
381
+ assert_equal 1, @connection.foreign_keys("astronauts").size
382
+ @connection.remove_foreign_key :astronauts, column: :rocket_id
383
+ assert_equal [], @connection.foreign_keys("astronauts")
384
+ end
385
+
386
+ def test_remove_foreign_key_by_name
387
+ skip if current_adapter?(:SQLite3Adapter)
388
+
389
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"
390
+
391
+ assert_equal 1, @connection.foreign_keys("astronauts").size
392
+ @connection.remove_foreign_key :astronauts, name: "fancy_named_fk"
393
+ assert_equal [], @connection.foreign_keys("astronauts")
394
+ end
395
+
396
+ def test_remove_foreign_non_existing_foreign_key_raises
397
+ e = assert_raises ArgumentError do
398
+ @connection.remove_foreign_key :astronauts, :rockets
399
+ end
400
+ assert_equal "Table 'astronauts' has no foreign key for rockets", e.message
401
+ end
402
+
403
+ def test_remove_foreign_key_by_the_select_one_on_the_same_table
404
+ @connection.add_foreign_key :astronauts, :rockets
405
+ @connection.add_reference :astronauts, :myrocket, foreign_key: { to_table: :rockets }
406
+
407
+ assert_equal 2, @connection.foreign_keys("astronauts").size
408
+
409
+ @connection.remove_foreign_key :astronauts, :rockets, column: "myrocket_id"
410
+
411
+ assert_equal [["astronauts", "rockets", "rocket_id"]],
412
+ @connection.foreign_keys("astronauts").map { |fk| [fk.from_table, fk.to_table, fk.column] }
413
+ end
414
+
415
+ if ActiveRecord::Base.connection.supports_validate_constraints?
416
+ def test_add_invalid_foreign_key
417
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", validate: false
418
+
419
+ foreign_keys = @connection.foreign_keys("astronauts")
420
+ assert_equal 1, foreign_keys.size
421
+
422
+ fk = foreign_keys.first
423
+ assert_not_predicate fk, :validated?
424
+ end
425
+
426
+ def test_validate_foreign_key_infers_column
427
+ @connection.add_foreign_key :astronauts, :rockets, validate: false
428
+ assert_not_predicate @connection.foreign_keys("astronauts").first, :validated?
429
+
430
+ @connection.validate_foreign_key :astronauts, :rockets
431
+ assert_predicate @connection.foreign_keys("astronauts").first, :validated?
432
+ end
433
+
434
+ def test_validate_foreign_key_by_column
435
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", validate: false
436
+ assert_not_predicate @connection.foreign_keys("astronauts").first, :validated?
437
+
438
+ @connection.validate_foreign_key :astronauts, column: "rocket_id"
439
+ assert_predicate @connection.foreign_keys("astronauts").first, :validated?
440
+ end
441
+
442
+ def test_validate_foreign_key_by_symbol_column
443
+ @connection.add_foreign_key :astronauts, :rockets, column: :rocket_id, validate: false
444
+ assert_not_predicate @connection.foreign_keys("astronauts").first, :validated?
445
+
446
+ @connection.validate_foreign_key :astronauts, column: :rocket_id
447
+ assert_predicate @connection.foreign_keys("astronauts").first, :validated?
448
+ end
449
+
450
+ def test_validate_foreign_key_by_name
451
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk", validate: false
452
+ assert_not_predicate @connection.foreign_keys("astronauts").first, :validated?
453
+
454
+ @connection.validate_foreign_key :astronauts, name: "fancy_named_fk"
455
+ assert_predicate @connection.foreign_keys("astronauts").first, :validated?
456
+ end
457
+
458
+ def test_validate_foreign_non_existing_foreign_key_raises
459
+ assert_raises ArgumentError do
460
+ @connection.validate_foreign_key :astronauts, :rockets
461
+ end
462
+ end
463
+
464
+ def test_validate_constraint_by_name
465
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk", validate: false
466
+
467
+ @connection.validate_constraint :astronauts, "fancy_named_fk"
468
+ assert_predicate @connection.foreign_keys("astronauts").first, :validated?
469
+ end
470
+ else
471
+ # Foreign key should still be created, but should not be invalid
472
+ def test_add_invalid_foreign_key
473
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", validate: false
474
+
475
+ foreign_keys = @connection.foreign_keys("astronauts")
476
+ assert_equal 1, foreign_keys.size
477
+
478
+ fk = foreign_keys.first
479
+ assert_predicate fk, :validated?
480
+ end
481
+ end
482
+
483
+ def test_schema_dumping
484
+ @connection.add_foreign_key :astronauts, :rockets
485
+ output = dump_table_schema "astronauts"
486
+ assert_match %r{\s+add_foreign_key "astronauts", "rockets"$}, output
487
+ end
488
+
489
+ def test_schema_dumping_with_options
490
+ output = dump_table_schema "fk_test_has_fk"
491
+ if current_adapter?(:SQLite3Adapter)
492
+ assert_match %r{\s+add_foreign_key "fk_test_has_fk", "fk_test_has_pk", column: "fk_id", primary_key: "pk_id"$}, output
493
+ else
494
+ assert_match %r{\s+add_foreign_key "fk_test_has_fk", "fk_test_has_pk", column: "fk_id", primary_key: "pk_id", name: "fk_name"$}, output
495
+ end
496
+ end
497
+
498
+ def test_schema_dumping_with_custom_fk_ignore_pattern
499
+ original_pattern = ActiveRecord::SchemaDumper.fk_ignore_pattern
500
+ ActiveRecord::SchemaDumper.fk_ignore_pattern = /^ignored_/
501
+ @connection.add_foreign_key :astronauts, :rockets, name: :ignored_fk_astronauts_rockets
502
+
503
+ output = dump_table_schema "astronauts"
504
+ assert_match %r{\s+add_foreign_key "astronauts", "rockets"$}, output
505
+
506
+ ActiveRecord::SchemaDumper.fk_ignore_pattern = original_pattern
507
+ end
508
+
509
+ def test_schema_dumping_on_delete_and_on_update_options
510
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify, on_update: :cascade
511
+
512
+ output = dump_table_schema "astronauts"
513
+ assert_match %r{\s+add_foreign_key "astronauts",.+on_update: :cascade,.+on_delete: :nullify$}, output
514
+ end
515
+
516
+ class CreateCitiesAndHousesMigration < ActiveRecord::Migration::Current
517
+ def change
518
+ create_table("cities") { |t| }
519
+
520
+ create_table("houses") do |t|
521
+ t.references :city
522
+ end
523
+ add_foreign_key :houses, :cities, column: "city_id"
524
+
525
+ # remove and re-add to test that schema is updated and not accidentally cached
526
+ remove_foreign_key :houses, :cities
527
+ add_foreign_key :houses, :cities, column: "city_id", on_delete: :cascade
528
+ end
529
+ end
530
+
531
+ def test_add_foreign_key_is_reversible
532
+ migration = CreateCitiesAndHousesMigration.new
533
+ silence_stream($stdout) { migration.migrate(:up) }
534
+ assert_equal 1, @connection.foreign_keys("houses").size
535
+ ensure
536
+ silence_stream($stdout) { migration.migrate(:down) }
537
+ end
538
+
539
+ def test_foreign_key_constraint_is_not_cached_incorrectly
540
+ migration = CreateCitiesAndHousesMigration.new
541
+ silence_stream($stdout) { migration.migrate(:up) }
542
+ output = dump_table_schema "houses"
543
+ assert_match %r{\s+add_foreign_key "houses",.+on_delete: :cascade$}, output
544
+ ensure
545
+ silence_stream($stdout) { migration.migrate(:down) }
546
+ end
547
+
548
+ class CreateSchoolsAndClassesMigration < ActiveRecord::Migration::Current
549
+ def change
550
+ create_table(:schools)
551
+
552
+ create_table(:classes) do |t|
553
+ t.references :school
554
+ end
555
+ add_foreign_key :classes, :schools, validate: true
556
+ end
557
+ end
558
+
559
+ def test_add_foreign_key_with_prefix
560
+ ActiveRecord::Base.table_name_prefix = "p_"
561
+ migration = CreateSchoolsAndClassesMigration.new
562
+ silence_stream($stdout) { migration.migrate(:up) }
563
+ assert_equal 1, @connection.foreign_keys("p_classes").size
564
+ ensure
565
+ silence_stream($stdout) { migration.migrate(:down) }
566
+ ActiveRecord::Base.table_name_prefix = nil
567
+ end
568
+
569
+ def test_add_foreign_key_with_suffix
570
+ ActiveRecord::Base.table_name_suffix = "_s"
571
+ migration = CreateSchoolsAndClassesMigration.new
572
+ silence_stream($stdout) { migration.migrate(:up) }
573
+ assert_equal 1, @connection.foreign_keys("classes_s").size
574
+ ensure
575
+ silence_stream($stdout) { migration.migrate(:down) }
576
+ ActiveRecord::Base.table_name_suffix = nil
577
+ end
578
+ end
579
+ end
580
+ end
581
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ module ActiveRecord
6
+ class Migration
7
+ class << self; attr_accessor :message_count; end
8
+ self.message_count = 0
9
+
10
+ module TestHelper
11
+ attr_reader :connection, :table_name
12
+
13
+ CONNECTION_METHODS = %w[add_column remove_column rename_column add_index change_column rename_table column_exists? index_exists? add_reference add_belongs_to remove_reference remove_references remove_belongs_to]
14
+
15
+ class TestModel < ActiveRecord::Base
16
+ self.table_name = :test_models
17
+ end
18
+
19
+ def setup
20
+ super
21
+ @connection = ActiveRecord::Base.connection
22
+ connection.create_table :test_models do |t|
23
+ t.timestamps null: true
24
+ end
25
+
26
+ TestModel.reset_column_information
27
+ end
28
+
29
+ def teardown
30
+ super
31
+ TestModel.reset_table_name
32
+ TestModel.reset_sequence_name
33
+ connection.drop_table :test_models, if_exists: true
34
+ end
35
+
36
+ private
37
+ delegate(*CONNECTION_METHODS, to: :connection)
38
+ end
39
+ end
40
+ end