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,433 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "active_record/tasks/database_tasks"
5
+
6
+ module ActiveRecord
7
+ class MysqlDBCreateTest < ActiveRecord::TestCase
8
+ def setup
9
+ @connection = Class.new do
10
+ def create_database(*); end
11
+ def error_number(_); end
12
+ end.new
13
+ @configuration = {
14
+ "adapter" => "mysql2",
15
+ "database" => "my-app-db"
16
+ }
17
+ $stdout, @original_stdout = StringIO.new, $stdout
18
+ $stderr, @original_stderr = StringIO.new, $stderr
19
+ end
20
+
21
+ def teardown
22
+ $stdout, $stderr = @original_stdout, @original_stderr
23
+ end
24
+
25
+ def test_establishes_connection_without_database
26
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
27
+
28
+ mock = Minitest::Mock.new
29
+ mock.expect(:call, nil, [adapter: "mysql2", database: nil])
30
+ mock.expect(:call, nil, [db_config])
31
+
32
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
33
+ ActiveRecord::Base.stub(:establish_connection, mock) do
34
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config)
35
+ end
36
+ end
37
+
38
+ assert_mock(mock)
39
+ end
40
+
41
+ def test_creates_database_with_no_default_options
42
+ with_stubbed_connection_establish_connection do
43
+ assert_called_with(@connection, :create_database, ["my-app-db", {}]) do
44
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
45
+ end
46
+ end
47
+ end
48
+
49
+ def test_creates_database_with_given_encoding
50
+ with_stubbed_connection_establish_connection do
51
+ assert_called_with(@connection, :create_database, ["my-app-db", charset: "latin1"]) do
52
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration.merge("encoding" => "latin1")
53
+ end
54
+ end
55
+ end
56
+
57
+ def test_creates_database_with_given_collation
58
+ with_stubbed_connection_establish_connection do
59
+ assert_called_with(
60
+ @connection,
61
+ :create_database,
62
+ ["my-app-db", collation: "latin1_swedish_ci"]
63
+ ) do
64
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration.merge("collation" => "latin1_swedish_ci")
65
+ end
66
+ end
67
+ end
68
+
69
+ def test_when_database_created_successfully_outputs_info_to_stdout
70
+ with_stubbed_connection_establish_connection do
71
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
72
+
73
+ assert_equal "Created database 'my-app-db'\n", $stdout.string
74
+ end
75
+ end
76
+
77
+ def test_create_when_database_exists_outputs_info_to_stderr
78
+ with_stubbed_connection_establish_connection do
79
+ ActiveRecord::Base.lease_connection.stub(
80
+ :create_database,
81
+ proc { raise ActiveRecord::DatabaseAlreadyExists }
82
+ ) do
83
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
84
+
85
+ assert_equal "Database 'my-app-db' already exists\n", $stderr.string
86
+ end
87
+ end
88
+ end
89
+
90
+ private
91
+ def with_stubbed_connection_establish_connection(&block)
92
+ ActiveRecord::Base.stub(:establish_connection, nil) do
93
+ ActiveRecord::Base.stub(:lease_connection, @connection, &block)
94
+ end
95
+ end
96
+ end
97
+
98
+ class MysqlDBCreateWithInvalidPermissionsTest < ActiveRecord::TestCase
99
+ def setup
100
+ @error = Mysql2::Error.new("Invalid permissions")
101
+ @configuration = {
102
+ "adapter" => "mysql2",
103
+ "database" => "my-app-db",
104
+ "username" => "pat",
105
+ "password" => "wossname"
106
+ }
107
+ $stdout, @original_stdout = StringIO.new, $stdout
108
+ $stderr, @original_stderr = StringIO.new, $stderr
109
+ end
110
+
111
+ def teardown
112
+ $stdout, $stderr = @original_stdout, @original_stderr
113
+ end
114
+
115
+ def test_raises_error
116
+ ActiveRecord::Base.stub(:establish_connection, -> * { raise @error }) do
117
+ assert_raises(Mysql2::Error, "Invalid permissions") do
118
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ class MySQLDBDropTest < ActiveRecord::TestCase
125
+ def setup
126
+ @connection = Class.new { def drop_database(name); end }.new
127
+ @configuration = {
128
+ "adapter" => "mysql2",
129
+ "database" => "my-app-db"
130
+ }
131
+ $stdout, @original_stdout = StringIO.new, $stdout
132
+ $stderr, @original_stderr = StringIO.new, $stderr
133
+ end
134
+
135
+ def teardown
136
+ $stdout, $stderr = @original_stdout, @original_stderr
137
+ end
138
+
139
+ def test_establishes_connection_to_mysql_database
140
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
141
+
142
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
143
+ assert_called_with(
144
+ ActiveRecord::Base,
145
+ :establish_connection,
146
+ [db_config]
147
+ ) do
148
+ ActiveRecord::Tasks::DatabaseTasks.drop(db_config)
149
+ end
150
+ end
151
+ end
152
+
153
+ def test_drops_database
154
+ with_stubbed_connection_establish_connection do
155
+ assert_called_with(@connection, :drop_database, ["my-app-db"]) do
156
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration
157
+ end
158
+ end
159
+ end
160
+
161
+ def test_when_database_dropped_successfully_outputs_info_to_stdout
162
+ with_stubbed_connection_establish_connection do
163
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration
164
+
165
+ assert_equal "Dropped database 'my-app-db'\n", $stdout.string
166
+ end
167
+ end
168
+
169
+ private
170
+ def with_stubbed_connection_establish_connection(&block)
171
+ ActiveRecord::Base.stub(:establish_connection, nil) do
172
+ ActiveRecord::Base.stub(:lease_connection, @connection, &block)
173
+ end
174
+ end
175
+ end
176
+
177
+ class MySQLPurgeTest < ActiveRecord::TestCase
178
+ def setup
179
+ @connection = Class.new { def recreate_database(*); end }.new
180
+ @configuration = {
181
+ "adapter" => "mysql2",
182
+ "database" => "test-db"
183
+ }
184
+ end
185
+
186
+ def test_establishes_connection_without_database
187
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
188
+
189
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
190
+ assert_called(ActiveRecord::Base, :establish_connection, times: 2) do
191
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
192
+ end
193
+ end
194
+ end
195
+
196
+ def test_recreates_database_with_no_default_options
197
+ with_stubbed_connection_establish_connection do
198
+ assert_called_with(@connection, :recreate_database, ["test-db", {}]) do
199
+ ActiveRecord::Tasks::DatabaseTasks.purge @configuration
200
+ end
201
+ end
202
+ end
203
+
204
+ def test_recreates_database_with_the_given_options
205
+ with_stubbed_connection_establish_connection do
206
+ assert_called_with(
207
+ @connection,
208
+ :recreate_database,
209
+ ["test-db", charset: "latin", collation: "latin1_swedish_ci"]
210
+ ) do
211
+ ActiveRecord::Tasks::DatabaseTasks.purge @configuration.merge(
212
+ "encoding" => "latin", "collation" => "latin1_swedish_ci")
213
+ end
214
+ end
215
+ end
216
+
217
+ private
218
+ def with_stubbed_connection_establish_connection(&block)
219
+ ActiveRecord::Base.stub(:establish_connection, nil) do
220
+ ActiveRecord::Base.stub(:lease_connection, @connection, &block)
221
+ end
222
+ end
223
+ end
224
+
225
+ class MysqlDBCharsetTest < ActiveRecord::TestCase
226
+ def setup
227
+ @connection = Class.new { def charset; end }.new
228
+ @configuration = {
229
+ "adapter" => "mysql2",
230
+ "database" => "my-app-db"
231
+ }
232
+ end
233
+
234
+ def test_db_retrieves_charset
235
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
236
+ assert_called(@connection, :charset) do
237
+ ActiveRecord::Tasks::DatabaseTasks.charset @configuration
238
+ end
239
+ end
240
+ end
241
+ end
242
+
243
+ class MysqlDBCollationTest < ActiveRecord::TestCase
244
+ def setup
245
+ @connection = Class.new { def collation; end }.new
246
+ @configuration = {
247
+ "adapter" => "mysql2",
248
+ "database" => "my-app-db"
249
+ }
250
+ end
251
+
252
+ def test_db_retrieves_collation
253
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
254
+ assert_called(@connection, :collation) do
255
+ ActiveRecord::Tasks::DatabaseTasks.collation @configuration
256
+ end
257
+ end
258
+ end
259
+ end
260
+
261
+ class MySQLStructureDumpTest < ActiveRecord::TestCase
262
+ def setup
263
+ @configuration = {
264
+ "adapter" => "mysql2",
265
+ "database" => "test-db"
266
+ }
267
+ end
268
+
269
+ def test_structure_dump
270
+ filename = "awesome-file.sql"
271
+ assert_called_with(
272
+ Kernel,
273
+ :system,
274
+ ["mysqldump", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"],
275
+ returns: true
276
+ ) do
277
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
278
+ end
279
+ end
280
+
281
+ def test_structure_dump_with_extra_flags
282
+ filename = "awesome-file.sql"
283
+ expected_command = ["mysqldump", "--noop", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"]
284
+
285
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
286
+ with_structure_dump_flags(["--noop"]) do
287
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
288
+ end
289
+ end
290
+ end
291
+
292
+ def test_structure_dump_with_hash_extra_flags_for_a_different_driver
293
+ filename = "awesome-file.sql"
294
+ expected_command = ["mysqldump", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"]
295
+
296
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
297
+ with_structure_dump_flags({ postgresql: ["--noop"] }) do
298
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
299
+ end
300
+ end
301
+ end
302
+
303
+ def test_structure_dump_with_hash_extra_flags_for_the_correct_driver
304
+ filename = "awesome-file.sql"
305
+ expected_command = ["mysqldump", "--noop", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"]
306
+
307
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
308
+ with_structure_dump_flags({ mysql2: ["--noop"] }) do
309
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
310
+ end
311
+ end
312
+ end
313
+
314
+ def test_structure_dump_with_ignore_tables
315
+ filename = "awesome-file.sql"
316
+ ActiveRecord::Base.lease_connection.stub(:data_sources, ["foo", "bar", "prefix_foo", "ignored_foo"]) do
317
+ ActiveRecord::SchemaDumper.stub(:ignore_tables, [/^prefix_/, "ignored_foo"]) do
318
+ assert_called_with(
319
+ Kernel,
320
+ :system,
321
+ ["mysqldump", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "--ignore-table=test-db.prefix_foo", "--ignore-table=test-db.ignored_foo", "test-db"],
322
+ returns: true
323
+ ) do
324
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
325
+ end
326
+ end
327
+ end
328
+ end
329
+
330
+ def test_warn_when_external_structure_dump_command_execution_fails
331
+ filename = "awesome-file.sql"
332
+ assert_called_with(
333
+ Kernel,
334
+ :system,
335
+ ["mysqldump", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"],
336
+ returns: false
337
+ ) do
338
+ e = assert_raise(RuntimeError) {
339
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
340
+ }
341
+ assert_match(/^failed to execute: `mysqldump`$/, e.message)
342
+ end
343
+ end
344
+
345
+ def test_structure_dump_with_port_number
346
+ filename = "awesome-file.sql"
347
+ assert_called_with(
348
+ Kernel,
349
+ :system,
350
+ ["mysqldump", "--port=10000", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"],
351
+ returns: true
352
+ ) do
353
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(
354
+ @configuration.merge("port" => 10000),
355
+ filename)
356
+ end
357
+ end
358
+
359
+ def test_structure_dump_with_ssl
360
+ filename = "awesome-file.sql"
361
+ assert_called_with(
362
+ Kernel,
363
+ :system,
364
+ ["mysqldump", "--ssl-ca=ca.crt", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"],
365
+ returns: true
366
+ ) do
367
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(
368
+ @configuration.merge("sslca" => "ca.crt"),
369
+ filename)
370
+ end
371
+ end
372
+
373
+ private
374
+ def with_structure_dump_flags(flags)
375
+ old = ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags
376
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = flags
377
+ yield
378
+ ensure
379
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = old
380
+ end
381
+ end
382
+
383
+ class MySQLStructureLoadTest < ActiveRecord::TestCase
384
+ def setup
385
+ @configuration = {
386
+ "adapter" => "mysql2",
387
+ "database" => "test-db"
388
+ }
389
+ end
390
+
391
+ def test_structure_load
392
+ filename = "awesome-file.sql"
393
+ expected_command = ["mysql", "--noop", "--execute", %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}, "--database", "test-db"]
394
+
395
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
396
+ with_structure_load_flags(["--noop"]) do
397
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
398
+ end
399
+ end
400
+ end
401
+
402
+ def test_structure_load_with_hash_extra_flags_for_a_different_driver
403
+ filename = "awesome-file.sql"
404
+ expected_command = ["mysql", "--execute", %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}, "--database", "test-db"]
405
+
406
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
407
+ with_structure_load_flags({ postgresql: ["--noop"] }) do
408
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
409
+ end
410
+ end
411
+ end
412
+
413
+ def test_structure_load_with_hash_extra_flags_for_the_correct_driver
414
+ filename = "awesome-file.sql"
415
+ expected_command = ["mysql", "--noop", "--execute", %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}, "--database", "test-db"]
416
+
417
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
418
+ with_structure_load_flags({ mysql2: ["--noop"] }) do
419
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
420
+ end
421
+ end
422
+ end
423
+
424
+ private
425
+ def with_structure_load_flags(flags)
426
+ old = ActiveRecord::Tasks::DatabaseTasks.structure_load_flags
427
+ ActiveRecord::Tasks::DatabaseTasks.structure_load_flags = flags
428
+ yield
429
+ ensure
430
+ ActiveRecord::Tasks::DatabaseTasks.structure_load_flags = old
431
+ end
432
+ end
433
+ end
@@ -4,7 +4,7 @@ require "cases/helper"
4
4
 
5
5
  class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
6
6
  def setup
7
- ActiveRecord::Base.connection.materialize_transactions
7
+ ActiveRecord::Base.lease_connection.materialize_transactions
8
8
 
9
9
  ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
10
10
  def execute(sql, name = nil) sql end
@@ -73,6 +73,11 @@ class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
73
73
  expected = %(CREATE INDEX IF NOT EXISTS "index_people_on_last_name" ON "people" ("last_name"))
74
74
  assert_equal expected, add_index(:people, :last_name, if_not_exists: true)
75
75
 
76
+ if supports_nulls_not_distinct?
77
+ expected = %(CREATE INDEX "index_people_on_last_name" ON "people" ("last_name") NULLS NOT DISTINCT)
78
+ assert_equal expected, add_index(:people, :last_name, nulls_not_distinct: true)
79
+ end
80
+
76
81
  assert_raise ArgumentError do
77
82
  add_index(:people, :last_name, algorithm: :copy)
78
83
  end
@@ -106,8 +111,7 @@ class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
106
111
  end
107
112
 
108
113
  private
109
- def method_missing(method_symbol, *arguments)
110
- ActiveRecord::Base.connection.public_send(method_symbol, *arguments)
114
+ def method_missing(...)
115
+ ActiveRecord::Base.lease_connection.public_send(...)
111
116
  end
112
- ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
113
117
  end
@@ -12,7 +12,7 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
12
12
  end
13
13
 
14
14
  def setup
15
- @connection = ActiveRecord::Base.connection
15
+ @connection = ActiveRecord::Base.lease_connection
16
16
 
17
17
  enable_extension!("hstore", @connection)
18
18
 
@@ -49,7 +49,7 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
49
49
 
50
50
  def test_not_compatible_with_serialize_array
51
51
  new_klass = Class.new(PgArray) do
52
- serialize :tags, Array
52
+ serialize :tags, type: Array
53
53
  end
54
54
  assert_raises(ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError) do
55
55
  new_klass.new
@@ -65,7 +65,7 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
65
65
 
66
66
  def test_array_with_serialized_attributes
67
67
  new_klass = Class.new(PgArray) do
68
- serialize :tags, MyTags
68
+ serialize :tags, coder: MyTags
69
69
  end
70
70
 
71
71
  new_klass.create!(tags: MyTags.new(["one", "two"]))
@@ -269,7 +269,7 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
269
269
  oid = ActiveRecord::ConnectionAdapters::PostgreSQL::OID
270
270
  comma_delim = oid::Array.new(ActiveRecord::Type::String.new, ",")
271
271
  semicolon_delim = oid::Array.new(ActiveRecord::Type::String.new, ";")
272
- conn = PgArray.connection
272
+ conn = PgArray.lease_connection
273
273
 
274
274
  assert_equal %({"hello,",world;}), conn.type_cast(comma_delim.serialize(strings))
275
275
  assert_equal %({hello,;"world;"}), conn.type_cast(semicolon_delim.serialize(strings))
@@ -354,11 +354,11 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
354
354
  def self.model_name; ActiveModel::Name.new(PgArray) end
355
355
  end
356
356
  e1 = klass.create("tags" => ["black", "blue"])
357
- assert e1.persisted?, "Saving e1"
357
+ assert_predicate e1, :persisted?, "Saving e1"
358
358
 
359
359
  e2 = klass.create("tags" => ["black", "blue"])
360
360
  assert_not e2.persisted?, "e2 shouldn't be valid"
361
- assert e2.errors[:tags].any?, "Should have errors for tags"
361
+ assert_predicate e2.errors[:tags], :any?, "Should have errors for tags"
362
362
  assert_equal ["has already been taken"], e2.errors[:tags], "Should have uniqueness message for tags"
363
363
  end
364
364
 
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/post"
5
+
6
+ module ActiveRecord
7
+ module ConnectionAdapters
8
+ class PostgreSQLAdapter
9
+ class BindParameterTest < ActiveRecord::PostgreSQLTestCase
10
+ fixtures :posts
11
+
12
+ def test_where_with_string_for_string_column_using_bind_parameters
13
+ assert_quoted_as "'Welcome to the weblog'", "Welcome to the weblog", match: 1
14
+ end
15
+
16
+ def test_where_with_integer_for_string_column_using_bind_parameters
17
+ assert_quoted_as "0", 0
18
+ end
19
+
20
+ def test_where_with_float_for_string_column_using_bind_parameters
21
+ assert_quoted_as "0.0", 0.0
22
+ end
23
+
24
+ def test_where_with_boolean_for_string_column_using_bind_parameters
25
+ assert_quoted_as "FALSE", false
26
+ end
27
+
28
+ def test_where_with_decimal_for_string_column_using_bind_parameters
29
+ assert_quoted_as "0.0", BigDecimal(0)
30
+ end
31
+
32
+ def test_where_with_rational_for_string_column_using_bind_parameters
33
+ assert_quoted_as "0/1", Rational(0)
34
+ end
35
+
36
+ private
37
+ def assert_quoted_as(expected, value, match: 0)
38
+ relation = Post.where("title = ?", value)
39
+ assert_equal(
40
+ %{SELECT "posts".* FROM "posts" WHERE (title = #{expected})},
41
+ relation.to_sql,
42
+ )
43
+ if match == 0
44
+ assert_empty relation.to_a
45
+ else
46
+ assert_equal match, relation.count
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -11,7 +11,7 @@ class PostgresqlBitStringTest < ActiveRecord::PostgreSQLTestCase
11
11
  class PostgresqlBitString < ActiveRecord::Base; end
12
12
 
13
13
  def setup
14
- @connection = ActiveRecord::Base.connection
14
+ @connection = ActiveRecord::Base.lease_connection
15
15
  @connection.create_table("postgresql_bit_strings", force: true) do |t|
16
16
  t.bit :a_bit, default: "00000011", limit: 8
17
17
  t.bit_varying :a_bit_varying, default: "0011", limit: 4
@@ -59,7 +59,7 @@ class PostgresqlBitStringTest < ActiveRecord::PostgreSQLTestCase
59
59
  assert_match %r{t\.bit_varying\s+"a_bit_varying",\s+limit: 4,\s+default: "0011"$}, output
60
60
  end
61
61
 
62
- if ActiveRecord::Base.connection.prepared_statements
62
+ if ActiveRecord::Base.lease_connection.prepared_statements
63
63
  def test_assigning_invalid_hex_string_raises_exception
64
64
  assert_raises(ActiveRecord::StatementInvalid) { PostgresqlBitString.create! a_bit: "FF" }
65
65
  assert_raises(ActiveRecord::StatementInvalid) { PostgresqlBitString.create! a_bit_varying: "F" }
@@ -11,7 +11,7 @@ class PostgresqlByteaTest < ActiveRecord::PostgreSQLTestCase
11
11
  end
12
12
 
13
13
  def setup
14
- @connection = ActiveRecord::Base.connection
14
+ @connection = ActiveRecord::Base.lease_connection
15
15
  @connection.transaction do
16
16
  @connection.create_table("bytea_data_type") do |t|
17
17
  t.binary "payload"
@@ -87,7 +87,7 @@ class PostgresqlByteaTest < ActiveRecord::PostgreSQLTestCase
87
87
 
88
88
  def test_via_to_sql_with_complicating_connection
89
89
  Thread.new do
90
- other_conn = ActiveRecord::Base.connection
90
+ other_conn = ActiveRecord::Base.lease_connection
91
91
  other_conn.execute("SET standard_conforming_strings = off")
92
92
  other_conn.execute("SET escape_string_warning = off")
93
93
  end.join
@@ -118,7 +118,7 @@ class PostgresqlByteaTest < ActiveRecord::PostgreSQLTestCase
118
118
 
119
119
  def test_serialize
120
120
  klass = Class.new(ByteaDataType) {
121
- serialize :serialized, Serializer.new
121
+ serialize :serialized, coder: Serializer.new
122
122
  }
123
123
  obj = klass.new
124
124
  obj.serialized = "hello world"
@@ -6,7 +6,7 @@ class PostgresqlCaseInsensitiveTest < ActiveRecord::PostgreSQLTestCase
6
6
  class Default < ActiveRecord::Base; end
7
7
 
8
8
  def test_case_insensitiveness
9
- connection = ActiveRecord::Base.connection
9
+ connection = ActiveRecord::Base.lease_connection
10
10
 
11
11
  attr = Default.arel_table[:char1]
12
12
  comparison = connection.case_insensitive_comparison(attr, nil)
@@ -9,7 +9,7 @@ module ActiveRecord
9
9
 
10
10
  def setup
11
11
  super
12
- @connection = ActiveRecord::Base.connection
12
+ @connection = ActiveRecord::Base.lease_connection
13
13
  connection.create_table(:strings) do |t|
14
14
  t.string :somedate
15
15
  end
@@ -29,6 +29,37 @@ module ActiveRecord
29
29
  assert_equal :datetime, connection.columns(:strings).find { |c| c.name == "somedate" }.type
30
30
  end
31
31
 
32
+ def test_change_type_with_symbol_with_timestamptz
33
+ connection.change_column :strings, :somedate, :timestamptz, cast_as: :timestamptz
34
+ assert_equal :timestamptz, connection.columns(:strings).find { |c| c.name == "somedate" }.type
35
+ end
36
+
37
+ def test_change_type_with_symbol_using_datetime
38
+ connection.change_column :strings, :somedate, :datetime, cast_as: :datetime
39
+ assert_equal :datetime, connection.columns(:strings).find { |c| c.name == "somedate" }.type
40
+ end
41
+
42
+ def test_change_type_with_symbol_using_timestamp_with_timestamptz_as_default
43
+ with_postgresql_datetime_type(:timestamptz) do
44
+ connection.change_column :strings, :somedate, :timestamp, cast_as: :timestamp
45
+ assert_equal :timestamp, connection.columns(:strings).find { |c| c.name == "somedate" }.type
46
+ end
47
+ end
48
+
49
+ def test_change_type_with_symbol_with_timestamptz_as_default
50
+ with_postgresql_datetime_type(:timestamptz) do
51
+ connection.change_column :strings, :somedate, :timestamptz, cast_as: :timestamptz
52
+ assert_equal :datetime, connection.columns(:strings).find { |c| c.name == "somedate" }.type
53
+ end
54
+ end
55
+
56
+ def test_change_type_with_symbol_using_datetime_with_timestamptz_as_default
57
+ with_postgresql_datetime_type(:timestamptz) do
58
+ connection.change_column :strings, :somedate, :datetime, cast_as: :datetime
59
+ assert_equal :datetime, connection.columns(:strings).find { |c| c.name == "somedate" }.type
60
+ end
61
+ end
62
+
32
63
  def test_change_type_with_array
33
64
  connection.change_column :strings, :somedate, :timestamp, array: true, cast_as: :timestamp
34
65
  column = connection.columns(:strings).find { |c| c.name == "somedate" }