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,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "active_record/connection_adapters/postgresql/utils"
5
+
6
+ class PostgreSQLUtilsTest < ActiveRecord::PostgreSQLTestCase
7
+ Name = ActiveRecord::ConnectionAdapters::PostgreSQL::Name
8
+ include ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
9
+
10
+ def test_extract_schema_qualified_name
11
+ {
12
+ %(table_name) => [nil, "table_name"],
13
+ %("table.name") => [nil, "table.name"],
14
+ %(schema.table_name) => %w{schema table_name},
15
+ %("schema".table_name) => %w{schema table_name},
16
+ %(schema."table_name") => %w{schema table_name},
17
+ %("schema"."table_name") => %w{schema table_name},
18
+ %("even spaces".table) => ["even spaces", "table"],
19
+ %(schema."table.name") => ["schema", "table.name"]
20
+ }.each do |given, expect|
21
+ assert_equal Name.new(*expect), extract_schema_qualified_name(given)
22
+ end
23
+ end
24
+ end
25
+
26
+ class PostgreSQLNameTest < ActiveRecord::PostgreSQLTestCase
27
+ Name = ActiveRecord::ConnectionAdapters::PostgreSQL::Name
28
+
29
+ test "represents itself as schema.name" do
30
+ obj = Name.new("public", "articles")
31
+ assert_equal "public.articles", obj.to_s
32
+ end
33
+
34
+ test "without schema, represents itself as name only" do
35
+ obj = Name.new(nil, "articles")
36
+ assert_equal "articles", obj.to_s
37
+ end
38
+
39
+ test "quoted returns a string representation usable in a query" do
40
+ assert_equal %("articles"), Name.new(nil, "articles").quoted
41
+ assert_equal %("public"."articles"), Name.new("public", "articles").quoted
42
+ end
43
+
44
+ test "prevents double quoting" do
45
+ name = Name.new('"quoted_schema"', '"quoted_table"')
46
+ assert_equal "quoted_schema.quoted_table", name.to_s
47
+ assert_equal %("quoted_schema"."quoted_table"), name.quoted
48
+ end
49
+
50
+ test "equality based on state" do
51
+ assert_equal Name.new("access", "users"), Name.new("access", "users")
52
+ assert_equal Name.new(nil, "users"), Name.new(nil, "users")
53
+ assert_not_equal Name.new(nil, "users"), Name.new("access", "users")
54
+ assert_not_equal Name.new("access", "users"), Name.new("public", "users")
55
+ assert_not_equal Name.new("public", "users"), Name.new("public", "articles")
56
+ end
57
+
58
+ test "can be used as hash key" do
59
+ hash = { Name.new("schema", "article_seq") => "success" }
60
+ assert_equal "success", hash[Name.new("schema", "article_seq")]
61
+ assert_nil hash[Name.new("schema", "articles")]
62
+ assert_nil hash[Name.new("public", "article_seq")]
63
+ end
64
+ end
@@ -0,0 +1,411 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ module PostgresqlUUIDHelper
7
+ def connection
8
+ @connection ||= ActiveRecord::Base.connection
9
+ end
10
+
11
+ def drop_table(name)
12
+ connection.drop_table name, if_exists: true
13
+ end
14
+
15
+ def uuid_function
16
+ connection.supports_pgcrypto_uuid? ? "gen_random_uuid()" : "uuid_generate_v4()"
17
+ end
18
+
19
+ def uuid_default
20
+ connection.supports_pgcrypto_uuid? ? {} : { default: uuid_function }
21
+ end
22
+ end
23
+
24
+ class PostgresqlUUIDTest < ActiveRecord::PostgreSQLTestCase
25
+ include PostgresqlUUIDHelper
26
+ include SchemaDumpingHelper
27
+
28
+ class UUIDType < ActiveRecord::Base
29
+ self.table_name = "uuid_data_type"
30
+ end
31
+
32
+ setup do
33
+ enable_extension!("uuid-ossp", connection)
34
+ enable_extension!("pgcrypto", connection) if connection.supports_pgcrypto_uuid?
35
+
36
+ connection.create_table "uuid_data_type" do |t|
37
+ t.uuid "guid"
38
+ end
39
+ end
40
+
41
+ teardown do
42
+ drop_table "uuid_data_type"
43
+ end
44
+
45
+ if ActiveRecord::Base.connection.respond_to?(:supports_pgcrypto_uuid?) &&
46
+ ActiveRecord::Base.connection.supports_pgcrypto_uuid?
47
+ def test_uuid_column_default
48
+ connection.add_column :uuid_data_type, :thingy, :uuid, null: false, default: "gen_random_uuid()"
49
+ UUIDType.reset_column_information
50
+ column = UUIDType.columns_hash["thingy"]
51
+ assert_equal "gen_random_uuid()", column.default_function
52
+ end
53
+ end
54
+
55
+ def test_change_column_default
56
+ connection.add_column :uuid_data_type, :thingy, :uuid, null: false, default: "uuid_generate_v1()"
57
+ UUIDType.reset_column_information
58
+ column = UUIDType.columns_hash["thingy"]
59
+ assert_equal "uuid_generate_v1()", column.default_function
60
+
61
+ connection.change_column :uuid_data_type, :thingy, :uuid, null: false, default: "uuid_generate_v4()"
62
+ UUIDType.reset_column_information
63
+ column = UUIDType.columns_hash["thingy"]
64
+ assert_equal "uuid_generate_v4()", column.default_function
65
+ ensure
66
+ UUIDType.reset_column_information
67
+ end
68
+
69
+ def test_add_column_with_null_true_and_default_nil
70
+ connection.add_column :uuid_data_type, :thingy, :uuid, null: true, default: nil
71
+
72
+ UUIDType.reset_column_information
73
+ column = UUIDType.columns_hash["thingy"]
74
+
75
+ assert column.null
76
+ assert_nil column.default
77
+ end
78
+
79
+ def test_add_column_with_default_array
80
+ connection.add_column :uuid_data_type, :thingy, :uuid, array: true, default: []
81
+
82
+ UUIDType.reset_column_information
83
+ column = UUIDType.columns_hash["thingy"]
84
+
85
+ assert_predicate column, :array?
86
+ assert_equal "{}", column.default
87
+
88
+ schema = dump_table_schema "uuid_data_type"
89
+ assert_match %r{t\.uuid "thingy", default: \[\], array: true$}, schema
90
+ end
91
+
92
+ def test_data_type_of_uuid_types
93
+ column = UUIDType.columns_hash["guid"]
94
+ assert_equal :uuid, column.type
95
+ assert_equal "uuid", column.sql_type
96
+ assert_not_predicate column, :array?
97
+
98
+ type = UUIDType.type_for_attribute("guid")
99
+ assert_not_predicate type, :binary?
100
+ end
101
+
102
+ def test_treat_blank_uuid_as_nil
103
+ UUIDType.create! guid: ""
104
+ assert_nil(UUIDType.last.guid)
105
+ end
106
+
107
+ def test_treat_invalid_uuid_as_nil
108
+ uuid = UUIDType.create! guid: "foobar"
109
+ assert_nil(uuid.guid)
110
+ end
111
+
112
+ def test_invalid_uuid_dont_modify_before_type_cast
113
+ uuid = UUIDType.new guid: "foobar"
114
+ assert_equal "foobar", uuid.guid_before_type_cast
115
+ end
116
+
117
+ def test_invalid_uuid_dont_match_to_nil
118
+ UUIDType.create!
119
+ assert_empty UUIDType.where(guid: "")
120
+ assert_empty UUIDType.where(guid: "foobar")
121
+ end
122
+
123
+ def test_uuid_change_case_does_not_mark_dirty
124
+ model = UUIDType.create!(guid: "abcd-0123-4567-89ef-dead-beef-0101-1010")
125
+ model.guid = model.guid.swapcase
126
+ assert_not_predicate model, :changed?
127
+ end
128
+
129
+ class DuckUUID
130
+ def initialize(uuid)
131
+ @uuid = uuid
132
+ end
133
+
134
+ def to_s
135
+ @uuid
136
+ end
137
+ end
138
+
139
+ def test_acceptable_uuid_regex
140
+ # Valid uuids
141
+ ["A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11",
142
+ "{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}",
143
+ "a0eebc999c0b4ef8bb6d6bb9bd380a11",
144
+ "a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11",
145
+ "{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}",
146
+ # The following is not a valid RFC 4122 UUID, but PG doesn't seem to care,
147
+ # so we shouldn't block it either. (Pay attention to "fb6d" – the "f" here
148
+ # is invalid – it must be one of 8, 9, A, B, a, b according to the spec.)
149
+ "{a0eebc99-9c0b-4ef8-fb6d-6bb9bd380a11}",
150
+ # Support Object-Oriented UUIDs which respond to #to_s
151
+ DuckUUID.new("A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11"),
152
+ ].each do |valid_uuid|
153
+ uuid = UUIDType.new guid: valid_uuid
154
+ assert_instance_of String, uuid.guid
155
+ end
156
+
157
+ # Invalid uuids
158
+ [["A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11"],
159
+ Hash.new,
160
+ 0,
161
+ 0.0,
162
+ true,
163
+ "Z0000C99-9C0B-4EF8-BB6D-6BB9BD380A11",
164
+ "a0eebc999r0b4ef8ab6d6bb9bd380a11",
165
+ "a0ee-bc99------4ef8-bb6d-6bb9-bd38-0a11",
166
+ "{a0eebc99-bb6d6bb9-bd380a11}",
167
+ "{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11",
168
+ "a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}"].each do |invalid_uuid|
169
+ uuid = UUIDType.new guid: invalid_uuid
170
+ assert_nil uuid.guid
171
+ end
172
+ end
173
+
174
+ def test_uuid_formats
175
+ ["A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11",
176
+ "{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}",
177
+ "a0eebc999c0b4ef8bb6d6bb9bd380a11",
178
+ "a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11",
179
+ "{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}"].each do |valid_uuid|
180
+ UUIDType.create(guid: valid_uuid)
181
+ uuid = UUIDType.last
182
+ assert_equal "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", uuid.guid
183
+ end
184
+ end
185
+
186
+ def test_schema_dump_with_shorthand
187
+ output = dump_table_schema "uuid_data_type"
188
+ assert_match %r{t\.uuid "guid"}, output
189
+ end
190
+
191
+ def test_uniqueness_validation_ignores_uuid
192
+ klass = Class.new(ActiveRecord::Base) do
193
+ self.table_name = "uuid_data_type"
194
+ validates :guid, uniqueness: { case_sensitive: false }
195
+
196
+ def self.name
197
+ "UUIDType"
198
+ end
199
+ end
200
+
201
+ record = klass.create!(guid: "a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11")
202
+ duplicate = klass.new(guid: record.guid)
203
+
204
+ assert record.guid.present? # Ensure we actually are testing a UUID
205
+ assert_not_predicate duplicate, :valid?
206
+ end
207
+ end
208
+
209
+ class PostgresqlUUIDGenerationTest < ActiveRecord::PostgreSQLTestCase
210
+ include PostgresqlUUIDHelper
211
+ include SchemaDumpingHelper
212
+
213
+ class UUID < ActiveRecord::Base
214
+ self.table_name = "pg_uuids"
215
+ end
216
+
217
+ setup do
218
+ connection.create_table("pg_uuids", id: :uuid, default: "uuid_generate_v1()") do |t|
219
+ t.string "name"
220
+ t.uuid "other_uuid", default: "uuid_generate_v4()"
221
+ end
222
+
223
+ # Create custom PostgreSQL function to generate UUIDs
224
+ # to test dumping tables which columns have defaults with custom functions
225
+ connection.execute <<~SQL
226
+ CREATE OR REPLACE FUNCTION my_uuid_generator() RETURNS uuid
227
+ AS $$ SELECT * FROM #{uuid_function} $$
228
+ LANGUAGE SQL VOLATILE;
229
+ SQL
230
+
231
+ # Create such a table with custom function as default value generator
232
+ connection.create_table("pg_uuids_2", id: :uuid, default: "my_uuid_generator()") do |t|
233
+ t.string "name"
234
+ t.uuid "other_uuid_2", default: "my_uuid_generator()"
235
+ end
236
+
237
+ connection.create_table("pg_uuids_3", id: :uuid, **uuid_default) do |t|
238
+ t.string "name"
239
+ end
240
+ end
241
+
242
+ teardown do
243
+ drop_table "pg_uuids"
244
+ drop_table "pg_uuids_2"
245
+ drop_table "pg_uuids_3"
246
+ connection.execute "DROP FUNCTION IF EXISTS my_uuid_generator();"
247
+ end
248
+
249
+ def test_id_is_uuid
250
+ assert_equal :uuid, UUID.columns_hash["id"].type
251
+ assert UUID.primary_key
252
+ end
253
+
254
+ def test_id_has_a_default
255
+ u = UUID.create
256
+ assert_not_nil u.id
257
+ end
258
+
259
+ def test_auto_create_uuid
260
+ u = UUID.create
261
+ u.reload
262
+ assert_not_nil u.other_uuid
263
+ end
264
+
265
+ def test_pk_and_sequence_for_uuid_primary_key
266
+ pk, seq = connection.pk_and_sequence_for("pg_uuids")
267
+ assert_equal "id", pk
268
+ assert_nil seq
269
+ end
270
+
271
+ def test_schema_dumper_for_uuid_primary_key
272
+ schema = dump_table_schema "pg_uuids"
273
+ assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: -> { "uuid_generate_v1\(\)" }/, schema)
274
+ assert_match(/t\.uuid "other_uuid", default: -> { "uuid_generate_v4\(\)" }/, schema)
275
+ end
276
+
277
+ def test_schema_dumper_for_uuid_primary_key_with_custom_default
278
+ schema = dump_table_schema "pg_uuids_2"
279
+ assert_match(/\bcreate_table "pg_uuids_2", id: :uuid, default: -> { "my_uuid_generator\(\)" }/, schema)
280
+ assert_match(/t\.uuid "other_uuid_2", default: -> { "my_uuid_generator\(\)" }/, schema)
281
+ end
282
+
283
+ def test_schema_dumper_for_uuid_primary_key_default
284
+ schema = dump_table_schema "pg_uuids_3"
285
+ if connection.supports_pgcrypto_uuid?
286
+ assert_match(/\bcreate_table "pg_uuids_3", id: :uuid, default: -> { "gen_random_uuid\(\)" }/, schema)
287
+ else
288
+ assert_match(/\bcreate_table "pg_uuids_3", id: :uuid, default: -> { "uuid_generate_v4\(\)" }/, schema)
289
+ end
290
+ end
291
+
292
+ def test_schema_dumper_for_uuid_primary_key_default_in_legacy_migration
293
+ @verbose_was = ActiveRecord::Migration.verbose
294
+ ActiveRecord::Migration.verbose = false
295
+
296
+ migration = Class.new(ActiveRecord::Migration[5.0]) do
297
+ def version; 101 end
298
+ def migrate(x)
299
+ create_table("pg_uuids_4", id: :uuid)
300
+ end
301
+ end.new
302
+ ActiveRecord::Migrator.new(:up, [migration], ActiveRecord::Base.connection.schema_migration).migrate
303
+
304
+ schema = dump_table_schema "pg_uuids_4"
305
+ assert_match(/\bcreate_table "pg_uuids_4", id: :uuid, default: -> { "uuid_generate_v4\(\)" }/, schema)
306
+ ensure
307
+ drop_table "pg_uuids_4"
308
+ ActiveRecord::Migration.verbose = @verbose_was
309
+ ActiveRecord::Base.connection.schema_migration.delete_all
310
+ end
311
+ uses_transaction :test_schema_dumper_for_uuid_primary_key_default_in_legacy_migration
312
+ end
313
+
314
+ class PostgresqlUUIDTestNilDefault < ActiveRecord::PostgreSQLTestCase
315
+ include PostgresqlUUIDHelper
316
+ include SchemaDumpingHelper
317
+
318
+ setup do
319
+ connection.create_table("pg_uuids", id: false) do |t|
320
+ t.primary_key :id, :uuid, default: nil
321
+ t.string "name"
322
+ end
323
+ end
324
+
325
+ teardown do
326
+ drop_table "pg_uuids"
327
+ end
328
+
329
+ def test_id_allows_default_override_via_nil
330
+ col_desc = connection.execute("SELECT pg_get_expr(d.adbin, d.adrelid) as default
331
+ FROM pg_attribute a
332
+ LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
333
+ WHERE a.attname='id' AND a.attrelid = 'pg_uuids'::regclass").first
334
+ assert_nil col_desc["default"]
335
+ end
336
+
337
+ def test_schema_dumper_for_uuid_primary_key_with_default_override_via_nil
338
+ schema = dump_table_schema "pg_uuids"
339
+ assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: nil/, schema)
340
+ end
341
+
342
+ def test_schema_dumper_for_uuid_primary_key_with_default_nil_in_legacy_migration
343
+ @verbose_was = ActiveRecord::Migration.verbose
344
+ ActiveRecord::Migration.verbose = false
345
+
346
+ migration = Class.new(ActiveRecord::Migration[5.0]) do
347
+ def version; 101 end
348
+ def migrate(x)
349
+ create_table("pg_uuids_4", id: :uuid, default: nil)
350
+ end
351
+ end.new
352
+ ActiveRecord::Migrator.new(:up, [migration], ActiveRecord::Base.connection.schema_migration).migrate
353
+
354
+ schema = dump_table_schema "pg_uuids_4"
355
+ assert_match(/\bcreate_table "pg_uuids_4", id: :uuid, default: nil/, schema)
356
+ ensure
357
+ drop_table "pg_uuids_4"
358
+ ActiveRecord::Migration.verbose = @verbose_was
359
+ ActiveRecord::Base.connection.schema_migration.delete_all
360
+ end
361
+ uses_transaction :test_schema_dumper_for_uuid_primary_key_with_default_nil_in_legacy_migration
362
+ end
363
+
364
+ class PostgresqlUUIDTestInverseOf < ActiveRecord::PostgreSQLTestCase
365
+ include PostgresqlUUIDHelper
366
+
367
+ class UuidPost < ActiveRecord::Base
368
+ self.table_name = "pg_uuid_posts"
369
+ has_many :uuid_comments, inverse_of: :uuid_post
370
+ end
371
+
372
+ class UuidComment < ActiveRecord::Base
373
+ self.table_name = "pg_uuid_comments"
374
+ belongs_to :uuid_post
375
+ end
376
+
377
+ setup do
378
+ connection.transaction do
379
+ connection.create_table("pg_uuid_posts", id: :uuid, **uuid_default) do |t|
380
+ t.string "title"
381
+ end
382
+ connection.create_table("pg_uuid_comments", id: :uuid, **uuid_default) do |t|
383
+ t.references :uuid_post, type: :uuid
384
+ t.string "content"
385
+ end
386
+ end
387
+ end
388
+
389
+ teardown do
390
+ drop_table "pg_uuid_comments"
391
+ drop_table "pg_uuid_posts"
392
+ end
393
+
394
+ def test_collection_association_with_uuid
395
+ post = UuidPost.create!
396
+ comment = post.uuid_comments.create!
397
+ assert post.uuid_comments.find(comment.id)
398
+ end
399
+
400
+ def test_find_with_uuid
401
+ UuidPost.create!
402
+ assert_raise ActiveRecord::RecordNotFound do
403
+ UuidPost.find(123456)
404
+ end
405
+ end
406
+
407
+ def test_find_by_with_uuid
408
+ UuidPost.create!
409
+ assert_nil UuidPost.find_by(id: 789)
410
+ end
411
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ class PostgresqlXMLTest < ActiveRecord::PostgreSQLTestCase
7
+ include SchemaDumpingHelper
8
+ class XmlDataType < ActiveRecord::Base
9
+ self.table_name = "xml_data_type"
10
+ end
11
+
12
+ def setup
13
+ @connection = ActiveRecord::Base.connection
14
+ @connection.create_table("xml_data_type") do |t|
15
+ t.xml "payload"
16
+ end
17
+ @column = XmlDataType.columns_hash["payload"]
18
+ end
19
+
20
+ teardown do
21
+ @connection.drop_table "xml_data_type", if_exists: true
22
+ end
23
+
24
+ def test_column
25
+ assert_equal :xml, @column.type
26
+ end
27
+
28
+ def test_null_xml
29
+ @connection.execute "insert into xml_data_type (payload) VALUES(null)"
30
+ assert_nil XmlDataType.first.payload
31
+ end
32
+
33
+ def test_round_trip
34
+ data = XmlDataType.new(payload: "<foo>bar</foo>")
35
+ assert_equal "<foo>bar</foo>", data.payload
36
+ data.save!
37
+ assert_equal "<foo>bar</foo>", data.reload.payload
38
+ end
39
+
40
+ def test_update_all
41
+ data = XmlDataType.create!
42
+ XmlDataType.update_all(payload: "<bar>baz</bar>")
43
+ assert_equal "<bar>baz</bar>", data.reload.payload
44
+ end
45
+
46
+ def test_schema_dump_with_shorthand
47
+ output = dump_table_schema("xml_data_type")
48
+ assert_match %r{t\.xml "payload"}, output
49
+ end
50
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ class SQLite3CollationTest < ActiveRecord::SQLite3TestCase
7
+ include SchemaDumpingHelper
8
+
9
+ def setup
10
+ @connection = ActiveRecord::Base.connection
11
+ @connection.create_table :collation_table_sqlite3, force: true do |t|
12
+ t.string :string_nocase, collation: "NOCASE"
13
+ t.text :text_rtrim, collation: "RTRIM"
14
+ # The decimal column might interfere with collation parsing.
15
+ # Thus, add this column type and some other string column afterwards.
16
+ t.decimal :decimal_col, precision: 6, scale: 2
17
+ t.string :string_after_decimal_nocase, collation: "NOCASE"
18
+ end
19
+ end
20
+
21
+ def teardown
22
+ @connection.drop_table :collation_table_sqlite3, if_exists: true
23
+ end
24
+
25
+ test "string column with collation" do
26
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "string_nocase" }
27
+ assert_equal :string, column.type
28
+ assert_equal "NOCASE", column.collation
29
+
30
+ # Verify collation of a column behind the decimal column as well.
31
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "string_after_decimal_nocase" }
32
+ assert_equal :string, column.type
33
+ assert_equal "NOCASE", column.collation
34
+ end
35
+
36
+ test "text column with collation" do
37
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "text_rtrim" }
38
+ assert_equal :text, column.type
39
+ assert_equal "RTRIM", column.collation
40
+ end
41
+
42
+ test "add column with collation" do
43
+ @connection.add_column :collation_table_sqlite3, :title, :string, collation: "RTRIM"
44
+
45
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "title" }
46
+ assert_equal :string, column.type
47
+ assert_equal "RTRIM", column.collation
48
+ end
49
+
50
+ test "change column with collation" do
51
+ @connection.add_column :collation_table_sqlite3, :description, :string
52
+ @connection.change_column :collation_table_sqlite3, :description, :text, collation: "RTRIM"
53
+
54
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "description" }
55
+ assert_equal :text, column.type
56
+ assert_equal "RTRIM", column.collation
57
+ end
58
+
59
+ test "schema dump includes collation" do
60
+ output = dump_table_schema("collation_table_sqlite3")
61
+ assert_match %r{t\.string\s+"string_nocase",\s+collation: "NOCASE"$}, output
62
+ assert_match %r{t\.text\s+"text_rtrim",\s+collation: "RTRIM"$}, output
63
+ end
64
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ class CopyTableTest < ActiveRecord::SQLite3TestCase
6
+ fixtures :customers
7
+
8
+ def setup
9
+ @connection = ActiveRecord::Base.connection
10
+ class << @connection
11
+ public :copy_table, :table_structure, :indexes
12
+ end
13
+ end
14
+
15
+ def test_copy_table(from = "customers", to = "customers2", options = {})
16
+ assert_nothing_raised { copy_table(from, to, options) }
17
+ assert_equal row_count(from), row_count(to)
18
+
19
+ if block_given?
20
+ yield from, to, options
21
+ else
22
+ assert_equal column_names(from), column_names(to)
23
+ end
24
+
25
+ @connection.drop_table(to) rescue nil
26
+ end
27
+
28
+ def test_copy_table_renaming_column
29
+ test_copy_table("customers", "customers2",
30
+ rename: { "name" => "person_name" }) do |from, to, options|
31
+ expected = column_values(from, "name")
32
+ assert_equal expected, column_values(to, "person_name")
33
+ assert expected.any?, "No values in table: #{expected.inspect}"
34
+ end
35
+ end
36
+
37
+ def test_copy_table_allows_to_pass_options_to_create_table
38
+ @connection.create_table("blocker_table")
39
+ test_copy_table("customers", "blocker_table", force: true)
40
+ end
41
+
42
+ def test_copy_table_with_index
43
+ test_copy_table("comments", "comments_with_index") do
44
+ @connection.add_index("comments_with_index", ["post_id", "type"])
45
+ test_copy_table("comments_with_index", "comments_with_index2") do
46
+ assert_nil table_indexes_without_name("comments_with_index")
47
+ assert_nil table_indexes_without_name("comments_with_index2")
48
+ end
49
+ end
50
+ end
51
+
52
+ def test_copy_table_without_primary_key
53
+ test_copy_table("developers_projects", "programmers_projects") do
54
+ assert_nil @connection.primary_key("programmers_projects")
55
+ end
56
+ end
57
+
58
+ def test_copy_table_with_id_col_that_is_not_primary_key
59
+ test_copy_table("goofy_string_id", "goofy_string_id2") do
60
+ original_id = @connection.columns("goofy_string_id").detect { |col| col.name == "id" }
61
+ copied_id = @connection.columns("goofy_string_id2").detect { |col| col.name == "id" }
62
+ assert_equal original_id.type, copied_id.type
63
+ assert_equal original_id.sql_type, copied_id.sql_type
64
+ assert_nil original_id.limit
65
+ assert_nil copied_id.limit
66
+ end
67
+ end
68
+
69
+ def test_copy_table_with_unconventional_primary_key
70
+ test_copy_table("owners", "owners_unconventional") do
71
+ original_pk = @connection.primary_key("owners")
72
+ copied_pk = @connection.primary_key("owners_unconventional")
73
+ assert_equal original_pk, copied_pk
74
+ end
75
+ end
76
+
77
+ def test_copy_table_with_binary_column
78
+ test_copy_table "binaries", "binaries2"
79
+ end
80
+
81
+ private
82
+ def copy_table(from, to, options = {})
83
+ @connection.copy_table(from, to, { temporary: true }.merge(options))
84
+ end
85
+
86
+ def column_names(table)
87
+ @connection.table_structure(table).map { |column| column["name"] }
88
+ end
89
+
90
+ def column_values(table, column)
91
+ @connection.select_all("SELECT #{column} FROM #{table} ORDER BY id").map { |row| row[column] }
92
+ end
93
+
94
+ def table_indexes_without_name(table)
95
+ @connection.indexes(table).delete(:name)
96
+ end
97
+
98
+ def row_count(table)
99
+ @connection.select_one("SELECT COUNT(*) AS count FROM #{table}")["count"]
100
+ end
101
+ end