ibm_db 5.6.1 → 5.7.0

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 (592) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +13 -9
  3. data/ext/extconf.rb +176 -110
  4. data/ext/ibm_db.c +60 -0
  5. data/ext/ibm_db.o +0 -0
  6. data/ext/ibm_db.so +0 -0
  7. data/ext/mkmf.log +6 -6
  8. data/ext/ruby_ibm_db_cli.c +14 -10
  9. data/ext/ruby_ibm_db_cli.h +4 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/IBM_DB.rb +2 -2
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
  13. data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
  14. data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
  15. data/test/activejob/destroy_association_async_job_test.rb +62 -0
  16. data/test/activejob/destroy_association_async_test.rb +147 -11
  17. data/test/activejob/job_runtime_test.rb +41 -0
  18. data/test/activejob/unloadable_base_job.rb +3 -0
  19. data/test/cases/active_record_schema_test.rb +196 -0
  20. data/test/cases/active_record_test.rb +21 -0
  21. data/test/cases/adapter_prevent_writes_test.rb +26 -202
  22. data/test/cases/adapter_test.rb +592 -82
  23. data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
  24. data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
  25. data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
  26. data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
  27. data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
  28. data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
  29. data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
  30. data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
  31. data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
  32. data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
  33. data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
  34. data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
  35. data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
  36. data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
  38. data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
  39. data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
  40. data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
  41. data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
  42. data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
  43. data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
  44. data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
  45. data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
  46. data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
  47. data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
  48. data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
  49. data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
  51. data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
  52. data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
  53. data/test/cases/adapters/postgresql/array_test.rb +6 -6
  54. data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
  55. data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
  56. data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
  57. data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
  58. data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
  59. data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
  60. data/test/cases/adapters/postgresql/citext_test.rb +7 -1
  61. data/test/cases/adapters/postgresql/collation_test.rb +1 -1
  62. data/test/cases/adapters/postgresql/composite_test.rb +1 -1
  63. data/test/cases/adapters/postgresql/connection_test.rb +43 -36
  64. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
  65. data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
  66. data/test/cases/adapters/postgresql/date_test.rb +2 -2
  67. data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
  69. data/test/cases/adapters/postgresql/domain_test.rb +1 -1
  70. data/test/cases/adapters/postgresql/enum_test.rb +208 -8
  71. data/test/cases/adapters/postgresql/explain_test.rb +25 -6
  72. data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
  73. data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
  74. data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
  75. data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
  76. data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
  77. data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
  78. data/test/cases/adapters/postgresql/integer_test.rb +1 -1
  79. data/test/cases/adapters/postgresql/interval_test.rb +9 -17
  80. data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
  81. data/test/cases/adapters/postgresql/json_test.rb +5 -0
  82. data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
  83. data/test/cases/adapters/postgresql/money_test.rb +17 -9
  84. data/test/cases/adapters/postgresql/network_test.rb +13 -1
  85. data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
  86. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
  87. data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
  88. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
  89. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
  90. data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
  91. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
  92. data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
  93. data/test/cases/adapters/postgresql/range_test.rb +185 -21
  94. data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
  95. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
  96. data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
  97. data/test/cases/adapters/postgresql/schema_test.rb +270 -20
  98. data/test/cases/adapters/postgresql/serial_test.rb +5 -5
  99. data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
  100. data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
  101. data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
  102. data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
  103. data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
  104. data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
  105. data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
  106. data/test/cases/adapters/postgresql/xml_test.rb +1 -1
  107. data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
  108. data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
  109. data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
  110. data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
  111. data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
  112. data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
  113. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
  114. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
  115. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
  116. data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
  117. data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
  118. data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
  119. data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
  120. data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
  121. data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
  122. data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
  123. data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
  124. data/test/cases/aggregations_test.rb +16 -0
  125. data/test/cases/annotate_test.rb +14 -12
  126. data/test/cases/arel/attributes/attribute_test.rb +86 -47
  127. data/test/cases/arel/collectors/bind_test.rb +1 -1
  128. data/test/cases/arel/collectors/composite_test.rb +11 -1
  129. data/test/cases/arel/collectors/sql_string_test.rb +1 -1
  130. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
  131. data/test/cases/arel/delete_manager_test.rb +0 -6
  132. data/test/cases/arel/factory_methods_test.rb +45 -0
  133. data/test/cases/arel/insert_manager_test.rb +1 -7
  134. data/test/cases/arel/nodes/as_test.rb +12 -0
  135. data/test/cases/arel/nodes/ascending_test.rb +1 -1
  136. data/test/cases/arel/nodes/bin_test.rb +1 -1
  137. data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
  138. data/test/cases/arel/nodes/cte_test.rb +46 -0
  139. data/test/cases/arel/nodes/descending_test.rb +1 -1
  140. data/test/cases/arel/nodes/equality_test.rb +3 -3
  141. data/test/cases/arel/nodes/filter_test.rb +37 -0
  142. data/test/cases/arel/nodes/fragments_test.rb +38 -0
  143. data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
  144. data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
  145. data/test/cases/arel/nodes/node_test.rb +1 -1
  146. data/test/cases/arel/nodes/or_test.rb +2 -2
  147. data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
  148. data/test/cases/arel/nodes/table_alias_test.rb +12 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
  150. data/test/cases/arel/nodes/update_statement_test.rb +4 -0
  151. data/test/cases/arel/nodes_test.rb +3 -2
  152. data/test/cases/arel/select_manager_test.rb +12 -12
  153. data/test/cases/arel/support/fake_record.rb +22 -17
  154. data/test/cases/arel/table_test.rb +15 -25
  155. data/test/cases/arel/update_manager_test.rb +51 -6
  156. data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
  157. data/test/cases/arel/visitors/dot_test.rb +177 -2
  158. data/test/cases/arel/visitors/mysql_test.rb +49 -1
  159. data/test/cases/arel/visitors/postgres_test.rb +1 -31
  160. data/test/cases/arel/visitors/sqlite_test.rb +1 -1
  161. data/test/cases/arel/visitors/to_sql_test.rb +330 -20
  162. data/test/cases/assertions/query_assertions_test.rb +136 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +502 -41
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
  165. data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
  166. data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
  167. data/test/cases/associations/eager_singularization_test.rb +1 -1
  168. data/test/cases/associations/eager_test.rb +255 -93
  169. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
  170. data/test/cases/associations/has_many_associations_test.rb +282 -72
  171. data/test/cases/associations/has_many_through_associations_test.rb +172 -45
  172. data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
  173. data/test/cases/associations/has_one_associations_test.rb +160 -29
  174. data/test/cases/associations/has_one_through_associations_test.rb +64 -15
  175. data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
  176. data/test/cases/associations/inner_join_association_test.rb +36 -6
  177. data/test/cases/associations/inverse_associations_test.rb +177 -40
  178. data/test/cases/associations/join_model_test.rb +17 -12
  179. data/test/cases/associations/left_outer_join_association_test.rb +14 -3
  180. data/test/cases/associations/nested_error_test.rb +116 -0
  181. data/test/cases/associations/nested_through_associations_test.rb +54 -19
  182. data/test/cases/associations/required_test.rb +1 -1
  183. data/test/cases/associations_test.rb +1278 -21
  184. data/test/cases/asynchronous_queries_test.rb +310 -0
  185. data/test/cases/attribute_methods/read_test.rb +6 -0
  186. data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
  187. data/test/cases/attribute_methods_test.rb +565 -46
  188. data/test/cases/attributes_test.rb +42 -1
  189. data/test/cases/autosave_association_test.rb +645 -92
  190. data/test/cases/base_prevent_writes_test.rb +28 -159
  191. data/test/cases/base_test.rb +434 -209
  192. data/test/cases/batches_test.rb +441 -57
  193. data/test/cases/binary_test.rb +31 -0
  194. data/test/cases/bind_parameter_test.rb +107 -16
  195. data/test/cases/cache_key_test.rb +7 -7
  196. data/test/cases/calculations_test.rb +541 -110
  197. data/test/cases/callbacks_test.rb +0 -1
  198. data/test/cases/clone_test.rb +5 -4
  199. data/test/cases/coders/yaml_column_test.rb +97 -2
  200. data/test/cases/collection_cache_key_test.rb +24 -16
  201. data/test/cases/column_alias_test.rb +2 -8
  202. data/test/cases/column_definition_test.rb +12 -3
  203. data/test/cases/comment_test.rb +23 -26
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
  205. data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
  210. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
  211. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
  212. data/test/cases/connection_adapters/registration_test.rb +98 -0
  213. data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
  214. data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
  215. data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
  216. data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
  217. data/test/cases/connection_handling_test.rb +210 -0
  218. data/test/cases/connection_management_test.rb +44 -7
  219. data/test/cases/connection_pool_test.rb +466 -99
  220. data/test/cases/core_test.rb +167 -9
  221. data/test/cases/counter_cache_test.rb +129 -2
  222. data/test/cases/custom_locking_test.rb +3 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +149 -13
  224. data/test/cases/database_configurations/resolver_test.rb +14 -10
  225. data/test/cases/database_configurations/url_config_test.rb +53 -0
  226. data/test/cases/database_configurations_test.rb +86 -43
  227. data/test/cases/database_selector_test.rb +30 -8
  228. data/test/cases/database_statements_test.rb +10 -14
  229. data/test/cases/date_time_precision_test.rb +141 -11
  230. data/test/cases/date_time_test.rb +19 -1
  231. data/test/cases/defaults_test.rb +107 -41
  232. data/test/cases/delegated_type_test.rb +69 -9
  233. data/test/cases/dirty_test.rb +82 -25
  234. data/test/cases/disconnected_test.rb +10 -9
  235. data/test/cases/dup_test.rb +26 -6
  236. data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
  237. data/test/cases/encryption/cipher_test.rb +65 -0
  238. data/test/cases/encryption/concurrency_test.rb +27 -0
  239. data/test/cases/encryption/config_test.rb +21 -0
  240. data/test/cases/encryption/configurable_test.rb +93 -0
  241. data/test/cases/encryption/contexts_test.rb +105 -0
  242. data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
  243. data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
  244. data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
  245. data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
  246. data/test/cases/encryption/encryptable_record_test.rb +470 -0
  247. data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
  248. data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
  249. data/test/cases/encryption/encryption_schemes_test.rb +240 -0
  250. data/test/cases/encryption/encryptor_test.rb +113 -0
  251. data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
  252. data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
  253. data/test/cases/encryption/helper.rb +152 -0
  254. data/test/cases/encryption/key_generator_test.rb +55 -0
  255. data/test/cases/encryption/key_provider_test.rb +57 -0
  256. data/test/cases/encryption/key_test.rb +17 -0
  257. data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
  258. data/test/cases/encryption/message_serializer_test.rb +82 -0
  259. data/test/cases/encryption/message_test.rb +43 -0
  260. data/test/cases/encryption/null_encryptor_test.rb +21 -0
  261. data/test/cases/encryption/properties_test.rb +69 -0
  262. data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
  263. data/test/cases/encryption/scheme_test.rb +58 -0
  264. data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
  265. data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
  266. data/test/cases/enum_test.rb +374 -72
  267. data/test/cases/errors_test.rb +7 -4
  268. data/test/cases/excluding_test.rb +116 -0
  269. data/test/cases/explain_subscriber_test.rb +6 -1
  270. data/test/cases/explain_test.rb +119 -10
  271. data/test/cases/filter_attributes_test.rb +7 -14
  272. data/test/cases/finder_respond_to_test.rb +3 -3
  273. data/test/cases/finder_test.rb +357 -72
  274. data/test/cases/fixture_set/file_test.rb +9 -0
  275. data/test/cases/fixtures_test.rb +426 -190
  276. data/test/cases/helper.rb +66 -192
  277. data/test/cases/hot_compatibility_test.rb +10 -10
  278. data/test/cases/inheritance_test.rb +51 -61
  279. data/test/cases/inherited_test.rb +40 -0
  280. data/test/cases/insert_all_test.rb +419 -9
  281. data/test/cases/instrumentation_test.rb +202 -30
  282. data/test/cases/integration_test.rb +25 -7
  283. data/test/cases/invalid_connection_test.rb +5 -5
  284. data/test/cases/invertible_migration_test.rb +108 -24
  285. data/test/cases/json_attribute_test.rb +1 -0
  286. data/test/cases/json_serialization_test.rb +5 -5
  287. data/test/cases/json_shared_test_cases.rb +5 -9
  288. data/test/cases/locking_test.rb +67 -31
  289. data/test/cases/log_subscriber_test.rb +17 -15
  290. data/test/cases/marshal_serialization_test.rb +78 -5
  291. data/test/cases/message_pack_test.rb +91 -0
  292. data/test/cases/migration/change_schema_test.rb +77 -46
  293. data/test/cases/migration/change_table_test.rb +129 -114
  294. data/test/cases/migration/check_constraint_test.rb +192 -10
  295. data/test/cases/migration/column_attributes_test.rb +4 -9
  296. data/test/cases/migration/column_positioning_test.rb +2 -2
  297. data/test/cases/migration/columns_test.rb +118 -4
  298. data/test/cases/migration/command_recorder_test.rb +181 -14
  299. data/test/cases/migration/compatibility_test.rb +883 -196
  300. data/test/cases/migration/create_join_table_test.rb +8 -1
  301. data/test/cases/migration/exclusion_constraint_test.rb +192 -0
  302. data/test/cases/migration/foreign_key_test.rb +356 -14
  303. data/test/cases/migration/helper.rb +4 -1
  304. data/test/cases/migration/index_test.rb +67 -2
  305. data/test/cases/migration/invalid_options_test.rb +129 -0
  306. data/test/cases/migration/logger_test.rb +7 -4
  307. data/test/cases/migration/pending_migrations_test.rb +103 -60
  308. data/test/cases/migration/references_foreign_key_test.rb +73 -4
  309. data/test/cases/migration/references_index_test.rb +25 -27
  310. data/test/cases/migration/references_statements_test.rb +27 -3
  311. data/test/cases/migration/rename_table_test.rb +39 -54
  312. data/test/cases/migration/schema_definitions_test.rb +109 -0
  313. data/test/cases/migration/unique_constraint_test.rb +248 -0
  314. data/test/cases/migration_test.rb +677 -220
  315. data/test/cases/migrator_test.rb +102 -75
  316. data/test/cases/multi_db_migrator_test.rb +55 -34
  317. data/test/cases/multiparameter_attributes_test.rb +26 -29
  318. data/test/cases/multiple_db_test.rb +42 -19
  319. data/test/cases/nested_attributes_test.rb +124 -6
  320. data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
  321. data/test/cases/normalized_attribute_test.rb +117 -0
  322. data/test/cases/null_relation_test.rb +35 -2
  323. data/test/cases/persistence/reload_association_cache_test.rb +20 -0
  324. data/test/cases/persistence_test.rb +629 -22
  325. data/test/cases/pooled_connections_test.rb +57 -56
  326. data/test/cases/prepared_statement_status_test.rb +8 -3
  327. data/test/cases/primary_class_test.rb +134 -0
  328. data/test/cases/primary_keys_test.rb +171 -55
  329. data/test/cases/query_cache_test.rb +558 -263
  330. data/test/cases/query_logs_test.rb +293 -0
  331. data/test/cases/quoting_test.rb +39 -72
  332. data/test/cases/readonly_test.rb +50 -12
  333. data/test/cases/reaper_test.rb +22 -6
  334. data/test/cases/reflection_test.rb +207 -9
  335. data/test/cases/relation/and_test.rb +43 -0
  336. data/test/cases/relation/delegation_test.rb +32 -5
  337. data/test/cases/relation/delete_all_test.rb +27 -6
  338. data/test/cases/relation/field_ordered_values_test.rb +128 -0
  339. data/test/cases/relation/load_async_test.rb +650 -0
  340. data/test/cases/relation/merging_test.rb +80 -109
  341. data/test/cases/relation/mutation_test.rb +12 -7
  342. data/test/cases/relation/or_test.rb +11 -8
  343. data/test/cases/relation/order_test.rb +90 -0
  344. data/test/cases/relation/predicate_builder_test.rb +21 -6
  345. data/test/cases/relation/select_test.rb +162 -3
  346. data/test/cases/relation/structural_compatibility_test.rb +38 -0
  347. data/test/cases/relation/update_all_test.rb +81 -27
  348. data/test/cases/relation/where_chain_test.rb +190 -3
  349. data/test/cases/relation/where_clause_test.rb +43 -1
  350. data/test/cases/relation/where_test.rb +95 -7
  351. data/test/cases/relation/with_test.rb +165 -0
  352. data/test/cases/relation_test.rb +42 -37
  353. data/test/cases/relations_test.rb +436 -138
  354. data/test/cases/reload_models_test.rb +18 -14
  355. data/test/cases/reserved_word_test.rb +2 -1
  356. data/test/cases/result_test.rb +14 -22
  357. data/test/cases/sanitize_test.rb +89 -27
  358. data/test/cases/schema_dumper_test.rb +535 -62
  359. data/test/cases/scoping/default_scoping_test.rb +219 -35
  360. data/test/cases/scoping/named_scoping_test.rb +25 -46
  361. data/test/cases/scoping/relation_scoping_test.rb +112 -4
  362. data/test/cases/secure_password_test.rb +108 -0
  363. data/test/cases/secure_token_test.rb +72 -0
  364. data/test/cases/serialization_test.rb +1 -1
  365. data/test/cases/serialized_attribute_test.rb +305 -60
  366. data/test/cases/shard_keys_test.rb +125 -0
  367. data/test/cases/shard_selector_test.rb +45 -0
  368. data/test/cases/signed_id_test.rb +57 -5
  369. data/test/cases/statement_cache_test.rb +31 -30
  370. data/test/cases/statement_invalid_test.rb +8 -4
  371. data/test/cases/store_test.rb +73 -9
  372. data/test/cases/strict_loading_test.rb +327 -13
  373. data/test/cases/table_metadata_test.rb +16 -0
  374. data/test/cases/tasks/database_tasks_test.rb +517 -244
  375. data/test/cases/test_case.rb +254 -60
  376. data/test/cases/test_case_test.rb +69 -0
  377. data/test/cases/test_databases_test.rb +7 -3
  378. data/test/cases/test_fixtures_test.rb +19 -40
  379. data/test/cases/time_precision_test.rb +17 -5
  380. data/test/cases/timestamp_test.rb +124 -16
  381. data/test/cases/token_for_test.rb +165 -0
  382. data/test/cases/touch_later_test.rb +43 -1
  383. data/test/cases/transaction_callbacks_test.rb +325 -8
  384. data/test/cases/transaction_instrumentation_test.rb +453 -0
  385. data/test/cases/transaction_isolation_test.rb +12 -8
  386. data/test/cases/transactions_test.rb +629 -112
  387. data/test/cases/type/date_time_test.rb +7 -1
  388. data/test/cases/type/time_test.rb +9 -0
  389. data/test/cases/type/type_map_test.rb +108 -73
  390. data/test/cases/type/unsigned_integer_test.rb +12 -0
  391. data/test/cases/type_caster/connection_test.rb +19 -0
  392. data/test/cases/type_test.rb +1 -1
  393. data/test/cases/unconnected_test.rb +7 -7
  394. data/test/cases/unsafe_raw_sql_test.rb +39 -8
  395. data/test/cases/validations/absence_validation_test.rb +1 -1
  396. data/test/cases/validations/association_validation_test.rb +25 -3
  397. data/test/cases/validations/numericality_validation_test.rb +3 -9
  398. data/test/cases/validations/presence_validation_test.rb +1 -1
  399. data/test/cases/validations/uniqueness_validation_test.rb +280 -40
  400. data/test/cases/validations_test.rb +2 -2
  401. data/test/cases/view_test.rb +33 -22
  402. data/test/cases/yaml_serialization_test.rb +23 -17
  403. data/test/config.example.yml +58 -56
  404. data/test/config.rb +1 -0
  405. data/test/fixtures/1_need_quoting.yml +2 -0
  406. data/test/fixtures/accounts.yml +5 -0
  407. data/test/fixtures/aircrafts.yml +7 -0
  408. data/test/fixtures/book_identifiers.yml +11 -0
  409. data/test/fixtures/books.yml +5 -4
  410. data/test/fixtures/cake_designers.yml +5 -0
  411. data/test/fixtures/cars.yml +6 -0
  412. data/test/fixtures/chefs.yml +5 -0
  413. data/test/fixtures/clothing_items.yml +23 -0
  414. data/test/fixtures/clubs.yml +1 -1
  415. data/test/fixtures/comments.yml +2 -1
  416. data/test/fixtures/cpk_authors.yml +8 -0
  417. data/test/fixtures/cpk_books.yml +21 -0
  418. data/test/fixtures/cpk_order_agreements.yml +13 -0
  419. data/test/fixtures/cpk_order_tags.yml +15 -0
  420. data/test/fixtures/cpk_orders.yml +11 -0
  421. data/test/fixtures/cpk_posts.yml +12 -0
  422. data/test/fixtures/cpk_reviews.yml +13 -0
  423. data/test/fixtures/cpk_tags.yml +11 -0
  424. data/test/fixtures/drink_designers.yml +5 -0
  425. data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
  426. data/test/fixtures/encrypted_books.yml +4 -0
  427. data/test/fixtures/fk_object_to_point_to.yml +2 -0
  428. data/test/fixtures/memberships.yml +15 -15
  429. data/test/fixtures/paragraphs.yml +5 -0
  430. data/test/fixtures/parrots.yml +4 -0
  431. data/test/fixtures/people.yml +2 -0
  432. data/test/fixtures/pirates.yml +2 -2
  433. data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
  434. data/test/fixtures/references.yml +3 -3
  435. data/test/fixtures/sharded_blog_posts.yml +14 -0
  436. data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
  437. data/test/fixtures/sharded_blogs.yml +8 -0
  438. data/test/fixtures/sharded_comments.yml +22 -0
  439. data/test/fixtures/sharded_tags.yml +34 -0
  440. data/test/fixtures/sponsors.yml +2 -2
  441. data/test/fixtures/topics.yml +1 -0
  442. data/test/fixtures/treasures.yml +4 -0
  443. data/test/fixtures/virtual_columns.yml +5 -0
  444. data/test/fixtures/warehouse_things.yml +1 -1
  445. data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
  446. data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
  447. data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
  448. data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
  449. data/test/migrations/scope/1_unscoped.rb +7 -0
  450. data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
  451. data/test/models/admin/user.rb +2 -0
  452. data/test/models/admin/user_json.rb +48 -0
  453. data/test/models/attachment.rb +7 -0
  454. data/test/models/author.rb +70 -3
  455. data/test/models/author_encrypted.rb +16 -0
  456. data/test/models/bird.rb +1 -1
  457. data/test/models/book.rb +18 -11
  458. data/test/models/book_destroy_async.rb +1 -1
  459. data/test/models/book_encrypted.rb +106 -0
  460. data/test/models/book_identifier.rb +5 -0
  461. data/test/models/branch.rb +11 -0
  462. data/test/models/bulb.rb +1 -1
  463. data/test/models/car.rb +8 -1
  464. data/test/models/cat.rb +1 -1
  465. data/test/models/category.rb +3 -1
  466. data/test/models/chat_message.rb +8 -0
  467. data/test/models/chef.rb +52 -0
  468. data/test/models/clothing_item.rb +12 -0
  469. data/test/models/club.rb +4 -1
  470. data/test/models/comment.rb +7 -4
  471. data/test/models/comment_overlapping_counter_cache.rb +15 -0
  472. data/test/models/company.rb +16 -2
  473. data/test/models/computer.rb +1 -0
  474. data/test/models/contact.rb +3 -3
  475. data/test/models/contract.rb +5 -1
  476. data/test/models/cpk/author.rb +9 -0
  477. data/test/models/cpk/book.rb +55 -0
  478. data/test/models/cpk/book_destroy_async.rb +9 -0
  479. data/test/models/cpk/car.rb +9 -0
  480. data/test/models/cpk/car_review.rb +9 -0
  481. data/test/models/cpk/chapter.rb +16 -0
  482. data/test/models/cpk/chapter_destroy_async.rb +10 -0
  483. data/test/models/cpk/comment.rb +9 -0
  484. data/test/models/cpk/order.rb +55 -0
  485. data/test/models/cpk/order_agreement.rb +10 -0
  486. data/test/models/cpk/order_tag.rb +10 -0
  487. data/test/models/cpk/post.rb +10 -0
  488. data/test/models/cpk/posts_tag.rb +10 -0
  489. data/test/models/cpk/review.rb +9 -0
  490. data/test/models/cpk/tag.rb +10 -0
  491. data/test/models/cpk.rb +15 -0
  492. data/test/models/customer.rb +3 -1
  493. data/test/models/destroy_async_parent.rb +1 -1
  494. data/test/models/developer.rb +44 -3
  495. data/test/models/discount.rb +4 -0
  496. data/test/models/drink_designer.rb +1 -0
  497. data/test/models/editor.rb +8 -0
  498. data/test/models/editorship.rb +6 -0
  499. data/test/models/entry.rb +5 -0
  500. data/test/models/essay.rb +6 -1
  501. data/test/models/essay_destroy_async.rb +1 -0
  502. data/test/models/eye.rb +87 -21
  503. data/test/models/face.rb +1 -1
  504. data/test/models/friendship.rb +3 -0
  505. data/test/models/hardback.rb +7 -0
  506. data/test/models/hotel.rb +2 -0
  507. data/test/models/human.rb +2 -2
  508. data/test/models/invoice.rb +2 -1
  509. data/test/models/invokes_an_undefined_method.rb +5 -0
  510. data/test/models/line_item.rb +6 -0
  511. data/test/models/member.rb +9 -4
  512. data/test/models/membership.rb +2 -2
  513. data/test/models/message.rb +2 -1
  514. data/test/models/need_quoting.rb +5 -0
  515. data/test/models/paragraph.rb +5 -0
  516. data/test/models/parrot.rb +6 -3
  517. data/test/models/person.rb +7 -4
  518. data/test/models/pirate.rb +4 -1
  519. data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
  520. data/test/models/post.rb +65 -2
  521. data/test/models/post_encrypted.rb +15 -0
  522. data/test/models/post_with_prefetched_pk.rb +15 -0
  523. data/test/models/project.rb +1 -0
  524. data/test/models/publication.rb +16 -0
  525. data/test/models/raises_argument_error.rb +5 -0
  526. data/test/models/raises_no_method_error.rb +5 -0
  527. data/test/models/recipient.rb +5 -0
  528. data/test/models/reference.rb +1 -1
  529. data/test/models/reply.rb +1 -1
  530. data/test/models/room.rb +3 -0
  531. data/test/models/sharded/blog.rb +12 -0
  532. data/test/models/sharded/blog_post.rb +17 -0
  533. data/test/models/sharded/blog_post_destroy_async.rb +14 -0
  534. data/test/models/sharded/blog_post_tag.rb +11 -0
  535. data/test/models/sharded/blog_post_with_revision.rb +11 -0
  536. data/test/models/sharded/comment.rb +12 -0
  537. data/test/models/sharded/comment_destroy_async.rb +12 -0
  538. data/test/models/sharded/tag.rb +11 -0
  539. data/test/models/sharded.rb +8 -0
  540. data/test/models/ship.rb +1 -1
  541. data/test/models/shipping_line.rb +11 -0
  542. data/test/models/subscriber.rb +1 -0
  543. data/test/models/subscription.rb +3 -1
  544. data/test/models/too_long_table_name.rb +5 -0
  545. data/test/models/topic.rb +3 -1
  546. data/test/models/traffic_light.rb +2 -2
  547. data/test/models/traffic_light_encrypted.rb +21 -0
  548. data/test/models/translation.rb +9 -0
  549. data/test/models/treasure.rb +1 -1
  550. data/test/models/tyre.rb +1 -1
  551. data/test/models/user.rb +16 -0
  552. data/test/models/user_with_invalid_relation.rb +28 -0
  553. data/test/models/uuid_comment.rb +5 -0
  554. data/test/models/uuid_entry.rb +5 -0
  555. data/test/models/uuid_message.rb +5 -0
  556. data/test/models/zine.rb +2 -1
  557. data/test/schema/mysql2_specific_schema.rb +26 -12
  558. data/test/schema/postgresql_specific_schema.rb +121 -13
  559. data/test/schema/schema.rb +361 -103
  560. data/test/schema/sqlite_specific_schema.rb +17 -6
  561. data/test/schema/trilogy_specific_schema.rb +96 -0
  562. data/test/support/adapter_helper.rb +104 -0
  563. data/test/support/async_helper.rb +15 -0
  564. data/test/support/config.rb +1 -1
  565. data/test/support/connection.rb +14 -2
  566. data/test/support/ddl_helper.rb +1 -1
  567. data/test/support/fake_adapter.rb +42 -0
  568. data/test/support/load_schema_helper.rb +22 -0
  569. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
  570. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
  571. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
  572. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
  573. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
  574. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
  575. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
  576. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
  577. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
  578. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
  579. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
  580. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
  581. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
  582. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
  583. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
  584. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
  585. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
  586. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
  587. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
  588. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
  589. data/test/support/schema_dumping_helper.rb +15 -9
  590. data/test/support/tools.rb +37 -0
  591. data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
  592. metadata +247 -15
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/migration/helper"
4
+
5
+ module ActiveRecord
6
+ class Migration
7
+ class InvalidOptionsTest < ActiveRecord::TestCase
8
+ include ActiveRecord::Migration::TestHelper
9
+
10
+ def invalid_add_column_option_exception_message(key)
11
+ default_keys = [":limit", ":precision", ":scale", ":default", ":null", ":collation", ":comment", ":primary_key", ":if_exists", ":if_not_exists"]
12
+
13
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
14
+ default_keys.concat([":auto_increment", ":charset", ":as", ":size", ":unsigned", ":first", ":after", ":type", ":stored"])
15
+ elsif current_adapter?(:PostgreSQLAdapter)
16
+ default_keys.concat([":array", ":using", ":cast_as", ":as", ":type", ":enum_type", ":stored"])
17
+ elsif current_adapter?(:SQLite3Adapter)
18
+ default_keys.concat([":as", ":type", ":stored"])
19
+ end
20
+
21
+ "Unknown key: :#{key}. Valid keys are: #{default_keys.join(", ")}"
22
+ end
23
+
24
+ def invalid_add_index_option_exception_message(key)
25
+ "Unknown key: :#{key}. Valid keys are: :unique, :length, :order, :opclass, :where, :type, :using, :comment, :algorithm, :include, :nulls_not_distinct"
26
+ end
27
+
28
+ def invalid_create_table_option_exception_message(key)
29
+ table_keys = [":temporary", ":if_not_exists", ":options", ":as", ":comment", ":charset", ":collation"]
30
+ primary_keys = [":limit", ":default", ":precision"]
31
+
32
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
33
+ primary_keys.concat([":unsigned", ":auto_increment"])
34
+ elsif current_adapter?(:SQLite3Adapter)
35
+ table_keys.concat([":rename"])
36
+ end
37
+
38
+ "Unknown key: :#{key}. Valid keys are: #{(table_keys + primary_keys).join(", ")}"
39
+ end
40
+
41
+ def test_add_reference_with_invalid_options
42
+ skip "DB2 includes :auto_increment in the valid option list, so this shared error message assertion is not portable" if current_adapter?(:IBM_DBAdapter)
43
+ exception = assert_raises(ArgumentError) do
44
+ connection.create_table "my_table", force: true do |t|
45
+ t.references :some_table, boring_key: true
46
+ end
47
+ end
48
+
49
+ assert_equal(
50
+ invalid_add_column_option_exception_message(:boring_key),
51
+ exception.message
52
+ )
53
+
54
+ exception = assert_raises(ArgumentError) do
55
+ add_reference :some_table, :some_column, boring_key: true
56
+ end
57
+
58
+ assert_equal(
59
+ invalid_add_column_option_exception_message(:boring_key),
60
+ exception.message
61
+ )
62
+ ensure
63
+ connection.drop_table :my_table, if_exists: true
64
+ end
65
+
66
+ def test_add_column_with_invalid_options
67
+ skip "DB2 includes :auto_increment in the valid option list, so this shared error message assertion is not portable" if current_adapter?(:IBM_DBAdapter)
68
+ exception = assert_raises(ArgumentError) do
69
+ add_column "test_models", "first_name", :string, preccision: true
70
+ end
71
+
72
+ assert_equal(
73
+ invalid_add_column_option_exception_message(:preccision),
74
+ exception.message
75
+ )
76
+
77
+ exception = assert_raises(ArgumentError) do
78
+ connection.create_table "my_table", force: true do |t|
79
+ t.string :first_name, index: { nema: "test" }
80
+ end
81
+ end
82
+
83
+ assert_equal(
84
+ invalid_add_index_option_exception_message(:nema),
85
+ exception.message
86
+ )
87
+ ensure
88
+ connection.drop_table :my_table, if_exists: true
89
+ end
90
+
91
+ def test_add_index_with_invalid_options
92
+ exception = assert_raises(ArgumentError) do
93
+ add_index "test_models", "first_name", nema: "my_index"
94
+ end
95
+
96
+ assert_equal(
97
+ invalid_add_index_option_exception_message(:nema),
98
+ exception.message
99
+ )
100
+ end
101
+
102
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter, :PostgreSQLAdapter)
103
+ def test_change_column_with_invalid_options
104
+ exception = assert_raises(ArgumentError) do
105
+ change_column "posts", "title", :text, liimit: true
106
+ end
107
+
108
+ assert_equal(
109
+ invalid_add_column_option_exception_message(:liimit),
110
+ exception.message
111
+ )
112
+ end
113
+ end
114
+
115
+ def test_create_table_with_invalid_options
116
+ skip "DB2 includes :auto_increment in the valid option list, so this shared error message assertion is not portable" if current_adapter?(:IBM_DBAdapter)
117
+ exception = assert_raises(ArgumentError) do
118
+ connection.create_table "my_table", idd: false do |t|
119
+ end
120
+ end
121
+
122
+ assert_equal(
123
+ invalid_create_table_option_exception_message(:idd),
124
+ exception.message
125
+ )
126
+ end
127
+ end
128
+ end
129
+ end
@@ -17,20 +17,23 @@ module ActiveRecord
17
17
 
18
18
  def setup
19
19
  super
20
- @schema_migration = ActiveRecord::Base.connection.schema_migration
20
+ @schema_migration = ActiveRecord::Base.connection_pool.schema_migration
21
21
  @schema_migration.create_table
22
- @schema_migration.delete_all
22
+ @schema_migration.delete_all_versions
23
+ @internal_metadata = ActiveRecord::Base.connection_pool.internal_metadata
23
24
  end
24
25
 
25
26
  teardown do
26
- @schema_migration.drop_table
27
+ @schema_migration&.delete_all_versions
27
28
  end
28
29
 
29
30
  def test_migration_should_be_run_without_logger
30
31
  previous_logger = ActiveRecord::Base.logger
31
32
  ActiveRecord::Base.logger = nil
32
33
  migrations = [Migration.new("a", 1), Migration.new("b", 2), Migration.new("c", 3)]
33
- ActiveRecord::Migrator.new(:up, migrations, @schema_migration).migrate
34
+ assert_nothing_raised do
35
+ ActiveRecord::Migrator.new(:up, migrations, @schema_migration, @internal_metadata).migrate
36
+ end
34
37
  ensure
35
38
  ActiveRecord::Base.logger = previous_logger
36
39
  end
@@ -1,41 +1,39 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "cases/helper"
4
+ require "active_support/core_ext/hash/deep_merge"
4
5
 
5
6
  module ActiveRecord
6
7
  class Migration
7
- if current_adapter?(:SQLite3Adapter) && !in_memory_db?
8
- class PendingMigrationsTest < ActiveRecord::TestCase
9
- setup do
10
- @migration_dir = Dir.mktmpdir("activerecord-migrations-")
11
-
12
- file = ActiveRecord::Base.connection.raw_connection.filename
13
- @conn = ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:", migrations_paths: @migration_dir
14
- source_db = SQLite3::Database.new file
15
- dest_db = ActiveRecord::Base.connection.raw_connection
16
- backup = SQLite3::Backup.new(dest_db, "main", source_db, "main")
17
- backup.step(-1)
18
- backup.finish
8
+ class PendingMigrationsTest < ActiveRecord::TestCase
9
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
10
+ self.use_transactional_tests = false
19
11
 
20
- ActiveRecord::Base.connection.drop_table "schema_migrations", if_exists: true
12
+ setup do
13
+ @tmp_dir = Dir.mktmpdir("pending_migrations_test-")
21
14
 
22
- @app = Minitest::Mock.new
15
+ @original_configurations = ActiveRecord::Base.configurations
16
+ ActiveRecord::Base.configurations = base_config
17
+ ActiveRecord::Base.establish_connection(:primary)
23
18
  end
24
19
 
25
20
  teardown do
26
- @conn.release_connection if @conn
27
- ActiveRecord::Base.establish_connection :arunit
28
- FileUtils.rm_rf(@migration_dir)
21
+ ActiveRecord::Base.configurations = @original_configurations
22
+ ActiveRecord::Base.establish_connection(:arunit)
23
+ FileUtils.rm_rf(@tmp_dir)
29
24
  end
30
25
 
31
26
  def run_migrations
32
- migrator = Base.connection.migration_context
27
+ migrator = Base.connection_pool.migration_context
33
28
  capture(:stdout) { migrator.migrate }
34
29
  end
35
30
 
36
- def create_migration(number, name)
31
+ def create_migration(number, name, database: :primary)
32
+ migration_dir = migrations_path_for(database)
33
+ FileUtils.mkdir_p(migration_dir)
34
+
37
35
  filename = "#{number}_#{name.underscore}.rb"
38
- File.write(File.join(@migration_dir, filename), <<~RUBY)
36
+ File.write(File.join(migration_dir, filename), <<~RUBY)
39
37
  class #{name.classify} < ActiveRecord::Migration::Current
40
38
  end
41
39
  RUBY
@@ -43,63 +41,108 @@ module ActiveRecord
43
41
 
44
42
  def test_errors_if_pending
45
43
  create_migration "01", "create_foo"
46
-
47
- assert_raises ActiveRecord::PendingMigrationError do
48
- CheckPending.new(@app).call({})
49
- end
50
-
51
- # Continues failing
52
- assert_raises ActiveRecord::PendingMigrationError do
53
- CheckPending.new(@app).call({})
54
- end
44
+ assert_pending_migrations("01_create_foo.rb")
55
45
  end
56
46
 
57
47
  def test_checks_if_supported
58
48
  run_migrations
59
-
60
- check_pending = CheckPending.new(@app)
61
-
62
- @app.expect :call, nil, [{}]
63
- check_pending.call({})
64
- @app.verify
65
-
66
- # With cached result
67
- @app.expect :call, nil, [{}]
68
- check_pending.call({})
69
- @app.verify
49
+ assert_no_pending_migrations
70
50
  end
71
51
 
72
52
  def test_okay_with_no_migrations
73
- check_pending = CheckPending.new(@app)
74
-
75
- @app.expect :call, nil, [{}]
76
- check_pending.call({})
77
- @app.verify
78
-
79
- # With cached result
80
- @app.expect :call, nil, [{}]
81
- check_pending.call({})
82
- @app.verify
53
+ assert_no_pending_migrations
83
54
  end
84
55
 
85
56
  # Regression test for https://github.com/rails/rails/pull/29759
86
57
  def test_understands_migrations_created_out_of_order
87
58
  # With a prior file before even initialization
88
59
  create_migration "05", "create_bar"
89
- run_migrations
90
-
91
- check_pending = CheckPending.new(@app)
92
-
93
- @app.expect :call, nil, [{}]
94
- check_pending.call({})
95
- @app.verify
60
+ quietly { run_migrations }
61
+ assert_no_pending_migrations
96
62
 
97
63
  # It understands the new migration created at 01
98
64
  create_migration "01", "create_foo"
99
- assert_raises ActiveRecord::PendingMigrationError do
100
- check_pending.call({})
101
- end
65
+ assert_pending_migrations("01_create_foo.rb")
66
+ end
67
+
68
+ def test_with_multiple_database
69
+ create_migration "01", "create_bar", database: :primary
70
+ create_migration "02", "create_foo", database: :secondary
71
+ assert_pending_migrations("01_create_bar.rb", "02_create_foo.rb")
72
+
73
+ ActiveRecord::Base.establish_connection(:secondary)
74
+ quietly { run_migrations }
75
+
76
+ ActiveRecord::Base.establish_connection(:primary)
77
+ quietly { run_migrations }
78
+
79
+ assert_no_pending_migrations
80
+ end
81
+
82
+ def test_with_stdlib_logger
83
+ old, ActiveRecord::Base.logger = ActiveRecord::Base.logger, ::Logger.new(StringIO.new)
84
+ assert_nothing_raised { CheckPending.new(proc { }).call({}) }
85
+ ensure
86
+ ActiveRecord::Base.logger = old
102
87
  end
88
+
89
+ private
90
+ def assert_pending_migrations(*expected_migrations)
91
+ 2.times do
92
+ assert_raises ActiveRecord::PendingMigrationError do
93
+ ActiveRecord::Migration.check_all_pending!
94
+ end
95
+
96
+ error = assert_raises ActiveRecord::PendingMigrationError do
97
+ CheckPending.new(proc { flunk }).call({})
98
+ end
99
+
100
+ assert_includes error.message, "Migrations are pending."
101
+ expected_migrations.each do |migration|
102
+ assert_includes error.message, migration
103
+ end
104
+ end
105
+ end
106
+
107
+ def assert_no_pending_migrations
108
+ app = Minitest::Mock.new
109
+ check_pending = CheckPending.new(app)
110
+
111
+ 2.times do
112
+ assert_nothing_raised do
113
+ ActiveRecord::Migration.check_all_pending!
114
+ end
115
+
116
+ app.expect :call, nil, [{}]
117
+ check_pending.call({})
118
+ app.verify
119
+ end
120
+ end
121
+
122
+ def database_path_for(database_name)
123
+ File.join(@tmp_dir, "#{database_name}.sqlite3")
124
+ end
125
+
126
+ def migrations_path_for(database_name)
127
+ File.join(@tmp_dir, "#{database_name}-migrations")
128
+ end
129
+
130
+ def base_config(additional_config = {})
131
+ {
132
+ ActiveRecord::ConnectionHandling::DEFAULT_ENV.call => {
133
+ primary: {
134
+ adapter: "sqlite3",
135
+ database: database_path_for(:primary),
136
+ migrations_paths: migrations_path_for(:primary),
137
+ },
138
+ secondary: {
139
+ adapter: "sqlite3",
140
+ database: database_path_for(:secondary),
141
+ migrations_paths: migrations_path_for(:secondary),
142
+ },
143
+ }.deep_merge(additional_config)
144
+ }
145
+ end
103
146
  end
104
147
  end
105
148
  end
@@ -2,12 +2,14 @@
2
2
 
3
3
  require "cases/helper"
4
4
 
5
- if ActiveRecord::Base.connection.supports_foreign_keys?
5
+ if ActiveRecord::Base.lease_connection.supports_foreign_keys?
6
6
  module ActiveRecord
7
7
  class Migration
8
8
  class ReferencesForeignKeyInCreateTest < ActiveRecord::TestCase
9
9
  setup do
10
- @connection = ActiveRecord::Base.connection
10
+ @connection = ActiveRecord::Base.lease_connection
11
+ @connection.drop_table :testings, if_exists: true rescue nil
12
+ @connection.drop_table :testing, if_exists: true rescue nil
11
13
  @connection.create_table(:testing_parents, force: true)
12
14
  end
13
15
 
@@ -35,7 +37,7 @@ if ActiveRecord::Base.connection.supports_foreign_keys?
35
37
  end
36
38
 
37
39
  test "foreign keys can be created in one query when index is not added" do
38
- assert_queries(1) do
40
+ assert_queries_count(1) do
39
41
  @connection.create_table :testings do |t|
40
42
  t.references :testing_parent, foreign_key: true, index: false
41
43
  end
@@ -43,6 +45,9 @@ if ActiveRecord::Base.connection.supports_foreign_keys?
43
45
  end
44
46
 
45
47
  test "options hash can be passed" do
48
+ assert current_adapter?(:IBM_DBAdapter)
49
+ skip "DB2 requires a unique constraint, not just a unique index, for referenced parent keys" if current_adapter?(:IBM_DBAdapter)
50
+
46
51
  @connection.change_table :testing_parents do |t|
47
52
  t.references :other, index: { unique: true }
48
53
  end
@@ -62,6 +67,48 @@ if ActiveRecord::Base.connection.supports_foreign_keys?
62
67
  assert_equal([["testings", "testing_parents", "parent_id"]],
63
68
  fks.map { |fk| [fk.from_table, fk.to_table, fk.column] })
64
69
  end
70
+
71
+ if ActiveRecord::Base.lease_connection.supports_deferrable_constraints?
72
+ test "deferrable: false option can be passed" do
73
+ @connection.create_table :testings do |t|
74
+ t.references :testing_parent, foreign_key: { deferrable: false }
75
+ end
76
+
77
+ fks = @connection.foreign_keys("testings")
78
+ assert_equal([["testings", "testing_parents", "testing_parent_id", false]],
79
+ fks.map { |fk| [fk.from_table, fk.to_table, fk.column, fk.deferrable] })
80
+ end
81
+
82
+ test "deferrable: :immediate option can be passed" do
83
+ @connection.create_table :testings do |t|
84
+ t.references :testing_parent, foreign_key: { deferrable: :immediate }
85
+ end
86
+
87
+ fks = @connection.foreign_keys("testings")
88
+ assert_equal([["testings", "testing_parents", "testing_parent_id", :immediate]],
89
+ fks.map { |fk| [fk.from_table, fk.to_table, fk.column, fk.deferrable] })
90
+ end
91
+
92
+ test "deferrable: :deferred option can be passed" do
93
+ @connection.create_table :testings do |t|
94
+ t.references :testing_parent, foreign_key: { deferrable: :deferred }
95
+ end
96
+
97
+ fks = @connection.foreign_keys("testings")
98
+ assert_equal([["testings", "testing_parents", "testing_parent_id", :deferred]],
99
+ fks.map { |fk| [fk.from_table, fk.to_table, fk.column, fk.deferrable] })
100
+ end
101
+
102
+ test "deferrable and on_(delete|update) option can be passed" do
103
+ @connection.create_table :testings do |t|
104
+ t.references :testing_parent, foreign_key: { on_update: :cascade, on_delete: :cascade, deferrable: :immediate }
105
+ end
106
+
107
+ fks = @connection.foreign_keys("testings")
108
+ assert_equal([["testings", "testing_parents", "testing_parent_id", :cascade, :cascade, :immediate]],
109
+ fks.map { |fk| [fk.from_table, fk.to_table, fk.column, fk.on_delete, fk.on_update, fk.deferrable] })
110
+ end
111
+ end
65
112
  end
66
113
  end
67
114
  end
@@ -70,7 +117,9 @@ if ActiveRecord::Base.connection.supports_foreign_keys?
70
117
  class Migration
71
118
  class ReferencesForeignKeyTest < ActiveRecord::TestCase
72
119
  setup do
73
- @connection = ActiveRecord::Base.connection
120
+ @connection = ActiveRecord::Base.lease_connection
121
+ @connection.drop_table :testings, if_exists: true rescue nil
122
+ @connection.drop_table :testing, if_exists: true rescue nil
74
123
  @connection.create_table(:testing_parents, force: true)
75
124
  end
76
125
 
@@ -108,6 +157,8 @@ if ActiveRecord::Base.connection.supports_foreign_keys?
108
157
  end
109
158
 
110
159
  test "foreign keys accept options when changing the table" do
160
+ skip "DB2 requires a unique constraint, not just a unique index, for referenced parent keys" if current_adapter?(:IBM_DBAdapter)
161
+
111
162
  @connection.change_table :testing_parents do |t|
112
163
  t.references :other, index: { unique: true }
113
164
  end
@@ -169,6 +220,24 @@ if ActiveRecord::Base.connection.supports_foreign_keys?
169
220
  @connection.drop_table "testing", if_exists: true
170
221
  end
171
222
 
223
+ test "remove_reference responds to if_exists option" do
224
+ @connection.create_table :testings
225
+
226
+ assert_nothing_raised do
227
+ @connection.remove_reference :testings, :nonexistent, foreign_key: true, if_exists: true
228
+ end
229
+ end
230
+
231
+ test "add_reference responds to if_not_exists option" do
232
+ @connection.create_table :testings do |t|
233
+ t.references :testing, foreign_key: true
234
+ end
235
+
236
+ assert_nothing_raised do
237
+ @connection.add_reference :testings, :testing, foreign_key: true, if_not_exists: true
238
+ end
239
+ end
240
+
172
241
  class CreateDogsMigration < ActiveRecord::Migration::Current
173
242
  def change
174
243
  create_table :dog_owners
@@ -9,8 +9,10 @@ module ActiveRecord
9
9
 
10
10
  def setup
11
11
  super
12
- @connection = ActiveRecord::Base.connection
12
+ @connection = ActiveRecord::Base.lease_connection
13
13
  @table_name = :testings
14
+ connection.drop_table :testings, if_exists: true rescue nil
15
+ connection.drop_table :testing, if_exists: true rescue nil
14
16
  end
15
17
 
16
18
  teardown do
@@ -51,22 +53,20 @@ module ActiveRecord
51
53
  assert connection.index_exists?(table_name, :bar_id, name: :index_testings_on_bar_id, unique: true)
52
54
  end
53
55
 
54
- unless current_adapter? :OracleAdapter
55
- def test_creates_polymorphic_index
56
- connection.create_table table_name do |t|
57
- t.references :foo, polymorphic: true, index: true
58
- end
59
-
60
- assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo)
56
+ def test_creates_polymorphic_index
57
+ connection.create_table table_name do |t|
58
+ t.references :foo, polymorphic: true, index: true
61
59
  end
62
60
 
63
- def test_creates_polymorphic_index_with_custom_name
64
- connection.create_table table_name do |t|
65
- t.references :foo, polymorphic: true, index: { name: :testings_foo_index }
66
- end
61
+ assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo)
62
+ end
67
63
 
68
- assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :testings_foo_index)
64
+ def test_creates_polymorphic_index_with_custom_name
65
+ connection.create_table table_name do |t|
66
+ t.references :foo, polymorphic: true, index: { name: :testings_foo_index }
69
67
  end
68
+
69
+ assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :testings_foo_index)
70
70
  end
71
71
 
72
72
  def test_creates_index_for_existing_table
@@ -96,24 +96,22 @@ module ActiveRecord
96
96
  assert_not connection.index_exists?(table_name, :foo_id, name: :index_testings_on_foo_id)
97
97
  end
98
98
 
99
- unless current_adapter? :OracleAdapter
100
- def test_creates_polymorphic_index_for_existing_table
101
- connection.create_table table_name
102
- connection.change_table table_name do |t|
103
- t.references :foo, polymorphic: true, index: true
104
- end
105
-
106
- assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo)
99
+ def test_creates_polymorphic_index_for_existing_table
100
+ connection.create_table table_name
101
+ connection.change_table table_name do |t|
102
+ t.references :foo, polymorphic: true, index: true
107
103
  end
108
104
 
109
- def test_creates_polymorphic_index_for_existing_table_with_custom_name
110
- connection.create_table table_name
111
- connection.change_table table_name do |t|
112
- t.references :foo, polymorphic: true, index: { name: :testings_foo_index }
113
- end
105
+ assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo)
106
+ end
114
107
 
115
- assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :testings_foo_index)
108
+ def test_creates_polymorphic_index_for_existing_table_with_custom_name
109
+ connection.create_table table_name
110
+ connection.change_table table_name do |t|
111
+ t.references :foo, polymorphic: true, index: { name: :testings_foo_index }
116
112
  end
113
+
114
+ assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :testings_foo_index)
117
115
  end
118
116
  end
119
117
  end
@@ -7,10 +7,10 @@ module ActiveRecord
7
7
  class ReferencesStatementsTest < ActiveRecord::TestCase
8
8
  include ActiveRecord::Migration::TestHelper
9
9
 
10
- self.use_transactional_tests = false
11
-
12
10
  def setup
13
11
  super
12
+ connection.drop_table :testings, if_exists: true rescue nil
13
+ connection.drop_table :testing, if_exists: true rescue nil
14
14
  @table_name = :test_models
15
15
 
16
16
  add_column table_name, :supplier_id, :integer
@@ -22,6 +22,13 @@ module ActiveRecord
22
22
  assert column_exists?(table_name, :user_id, :integer)
23
23
  end
24
24
 
25
+ def test_primary_key_and_references_columns_should_be_identical_type
26
+ add_reference table_name, :user
27
+ pk = connection.send(:column_for, :users, :id)
28
+ ref = connection.send(:column_for, table_name, :user_id)
29
+ assert_equal pk.sql_type, ref.sql_type
30
+ end
31
+
25
32
  def test_does_not_create_reference_type_column
26
33
  add_reference table_name, :taggable
27
34
  assert_not column_exists?(table_name, :taggable_type, :string)
@@ -62,7 +69,8 @@ module ActiveRecord
62
69
 
63
70
  def test_does_not_share_options_with_reference_type_column
64
71
  add_reference table_name, :taggable, type: :integer, limit: 2, polymorphic: true
65
- assert column_exists?(table_name, :taggable_id, :integer)
72
+ skip "DB2 always applies column size constraints to polymorphic type columns" if ENV['ARCONN'] == 'ibm_db'
73
+ assert column_exists?(table_name, :taggable_id, :integer, limit: 2)
66
74
  assert column_exists?(table_name, :taggable_type, :string)
67
75
  assert_not column_exists?(table_name, :taggable_type, :string, limit: 2)
68
76
  end
@@ -125,6 +133,22 @@ module ActiveRecord
125
133
  assert_not column_exists?(table_name, :supplier_id, :integer)
126
134
  end
127
135
 
136
+ def test_responds_to_if_exists_option
137
+ with_polymorphic_column do
138
+ assert_nothing_raised do
139
+ remove_reference table_name, :nonexistent, polymorphic: true, if_exists: true
140
+ end
141
+ end
142
+ end
143
+
144
+ def test_responds_to_if_not_exists_option
145
+ with_polymorphic_column do
146
+ assert_nothing_raised do
147
+ add_reference table_name, :supplier, polymorphic: true, if_not_exists: true
148
+ end
149
+ end
150
+ end
151
+
128
152
  private
129
153
  def with_polymorphic_column
130
154
  add_column table_name, :supplier_type, :string