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
@@ -14,151 +14,134 @@ module ActiveRecord
14
14
  end
15
15
 
16
16
  def with_change_table
17
- yield ActiveRecord::Base.connection.update_table_definition(:delete_me, @connection)
17
+ yield ActiveRecord::Base.lease_connection.update_table_definition(:delete_me, @connection)
18
18
  end
19
19
 
20
- def test_references_column_type_adds_id
21
- with_change_table do |t|
22
- if RUBY_VERSION < "2.7"
23
- @connection.expect :add_reference, nil, [:delete_me, :customer, {}]
20
+ if Minitest::Mock.instance_method(:expect).parameters.map(&:first).include?(:keyrest)
21
+ def expect(method, returns, args, **kwargs)
22
+ @connection.expect(method, returns, args, **kwargs)
23
+ end
24
+ else
25
+ def expect(method, returns, args, **kwargs)
26
+ if !kwargs.empty?
27
+ @connection.expect(method, returns, [*args, kwargs])
24
28
  else
25
- @connection.expect :add_reference, nil, [:delete_me, :customer]
29
+ @connection.expect(method, returns, args)
26
30
  end
31
+ end
32
+ end
33
+
34
+ def test_references_column_type_adds_id
35
+ with_change_table do |t|
36
+ expect :add_reference, nil, [:delete_me, :customer]
27
37
  t.references :customer
28
38
  end
29
39
  end
30
40
 
31
41
  def test_remove_references_column_type_removes_id
32
42
  with_change_table do |t|
33
- if RUBY_VERSION < "2.7"
34
- @connection.expect :remove_reference, nil, [:delete_me, :customer, {}]
35
- else
36
- @connection.expect :remove_reference, nil, [:delete_me, :customer]
37
- end
43
+ expect :remove_reference, nil, [:delete_me, :customer]
38
44
  t.remove_references :customer
39
45
  end
40
46
  end
41
47
 
42
48
  def test_add_belongs_to_works_like_add_references
43
49
  with_change_table do |t|
44
- if RUBY_VERSION < "2.7"
45
- @connection.expect :add_reference, nil, [:delete_me, :customer, {}]
46
- else
47
- @connection.expect :add_reference, nil, [:delete_me, :customer]
48
- end
50
+ expect :add_reference, nil, [:delete_me, :customer]
49
51
  t.belongs_to :customer
50
52
  end
51
53
  end
52
54
 
53
55
  def test_remove_belongs_to_works_like_remove_references
54
56
  with_change_table do |t|
55
- if RUBY_VERSION < "2.7"
56
- @connection.expect :remove_reference, nil, [:delete_me, :customer, {}]
57
- else
58
- @connection.expect :remove_reference, nil, [:delete_me, :customer]
59
- end
57
+ expect :remove_reference, nil, [:delete_me, :customer]
60
58
  t.remove_belongs_to :customer
61
59
  end
62
60
  end
63
61
 
64
62
  def test_references_column_type_with_polymorphic_adds_type
65
63
  with_change_table do |t|
66
- @connection.expect :add_reference, nil, [:delete_me, :taggable, polymorphic: true]
64
+ expect :add_reference, nil, [:delete_me, :taggable], polymorphic: true
67
65
  t.references :taggable, polymorphic: true
68
66
  end
69
67
  end
70
68
 
71
69
  def test_remove_references_column_type_with_polymorphic_removes_type
72
70
  with_change_table do |t|
73
- @connection.expect :remove_reference, nil, [:delete_me, :taggable, polymorphic: true]
71
+ expect :remove_reference, nil, [:delete_me, :taggable], polymorphic: true
74
72
  t.remove_references :taggable, polymorphic: true
75
73
  end
76
74
  end
77
75
 
78
76
  def test_references_column_type_with_polymorphic_and_options_null_is_false_adds_table_flag
79
77
  with_change_table do |t|
80
- @connection.expect :add_reference, nil, [:delete_me, :taggable, polymorphic: true, null: false]
78
+ expect :add_reference, nil, [:delete_me, :taggable], polymorphic: true, null: false
81
79
  t.references :taggable, polymorphic: true, null: false
82
80
  end
83
81
  end
84
82
 
85
83
  def test_remove_references_column_type_with_polymorphic_and_options_null_is_false_removes_table_flag
86
84
  with_change_table do |t|
87
- @connection.expect :remove_reference, nil, [:delete_me, :taggable, polymorphic: true, null: false]
85
+ expect :remove_reference, nil, [:delete_me, :taggable], polymorphic: true, null: false
88
86
  t.remove_references :taggable, polymorphic: true, null: false
89
87
  end
90
88
  end
91
89
 
92
90
  def test_references_column_type_with_polymorphic_and_type
93
91
  with_change_table do |t|
94
- @connection.expect :add_reference, nil, [:delete_me, :taggable, polymorphic: true, type: :string]
92
+ expect :add_reference, nil, [:delete_me, :taggable], polymorphic: true, type: :string
95
93
  t.references :taggable, polymorphic: true, type: :string
96
94
  end
97
95
  end
98
96
 
99
97
  def test_remove_references_column_type_with_polymorphic_and_type
100
98
  with_change_table do |t|
101
- @connection.expect :remove_reference, nil, [:delete_me, :taggable, polymorphic: true, type: :string]
99
+ expect :remove_reference, nil, [:delete_me, :taggable], polymorphic: true, type: :string
102
100
  t.remove_references :taggable, polymorphic: true, type: :string
103
101
  end
104
102
  end
105
103
 
106
104
  def test_timestamps_creates_updated_at_and_created_at
107
105
  with_change_table do |t|
108
- @connection.expect :add_timestamps, nil, [:delete_me, null: true]
106
+ expect :add_timestamps, nil, [:delete_me], null: true
109
107
  t.timestamps null: true
110
108
  end
111
109
  end
112
110
 
113
111
  def test_remove_timestamps_creates_updated_at_and_created_at
114
112
  with_change_table do |t|
115
- @connection.expect :remove_timestamps, nil, [:delete_me, { null: true }]
113
+ expect :remove_timestamps, nil, [:delete_me], null: true
116
114
  t.remove_timestamps(null: true)
117
115
  end
118
116
  end
119
117
 
120
118
  def test_primary_key_creates_primary_key_column
121
119
  with_change_table do |t|
122
- @connection.expect :add_column, nil, [:delete_me, :id, :primary_key, primary_key: true, first: true]
120
+ expect :add_column, nil, [:delete_me, :id, :primary_key], primary_key: true, first: true
123
121
  t.primary_key :id, first: true
124
122
  end
125
123
  end
126
124
 
127
125
  def test_integer_creates_integer_column
128
126
  with_change_table do |t|
129
- if RUBY_VERSION < "2.7"
130
- @connection.expect :add_column, nil, [:delete_me, :foo, :integer, {}]
131
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {}]
132
- else
133
- @connection.expect :add_column, nil, [:delete_me, :foo, :integer]
134
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer]
135
- end
127
+ expect :add_column, nil, [:delete_me, :foo, :integer]
128
+ expect :add_column, nil, [:delete_me, :bar, :integer]
136
129
  t.integer :foo, :bar
137
130
  end
138
131
  end
139
132
 
140
133
  def test_bigint_creates_bigint_column
141
134
  with_change_table do |t|
142
- if RUBY_VERSION < "2.7"
143
- @connection.expect :add_column, nil, [:delete_me, :foo, :bigint, {}]
144
- @connection.expect :add_column, nil, [:delete_me, :bar, :bigint, {}]
145
- else
146
- @connection.expect :add_column, nil, [:delete_me, :foo, :bigint]
147
- @connection.expect :add_column, nil, [:delete_me, :bar, :bigint]
148
- end
135
+ expect :add_column, nil, [:delete_me, :foo, :bigint]
136
+ expect :add_column, nil, [:delete_me, :bar, :bigint]
149
137
  t.bigint :foo, :bar
150
138
  end
151
139
  end
152
140
 
153
141
  def test_string_creates_string_column
154
142
  with_change_table do |t|
155
- if RUBY_VERSION < "2.7"
156
- @connection.expect :add_column, nil, [:delete_me, :foo, :string, {}]
157
- @connection.expect :add_column, nil, [:delete_me, :bar, :string, {}]
158
- else
159
- @connection.expect :add_column, nil, [:delete_me, :foo, :string]
160
- @connection.expect :add_column, nil, [:delete_me, :bar, :string]
161
- end
143
+ expect :add_column, nil, [:delete_me, :foo, :string]
144
+ expect :add_column, nil, [:delete_me, :bar, :string]
162
145
  t.string :foo, :bar
163
146
  end
164
147
  end
@@ -166,176 +149,165 @@ module ActiveRecord
166
149
  if current_adapter?(:PostgreSQLAdapter)
167
150
  def test_json_creates_json_column
168
151
  with_change_table do |t|
169
- if RUBY_VERSION < "2.7"
170
- @connection.expect :add_column, nil, [:delete_me, :foo, :json, {}]
171
- @connection.expect :add_column, nil, [:delete_me, :bar, :json, {}]
172
- else
173
- @connection.expect :add_column, nil, [:delete_me, :foo, :json]
174
- @connection.expect :add_column, nil, [:delete_me, :bar, :json]
175
- end
152
+ expect :add_column, nil, [:delete_me, :foo, :json]
153
+ expect :add_column, nil, [:delete_me, :bar, :json]
176
154
  t.json :foo, :bar
177
155
  end
178
156
  end
179
157
 
180
158
  def test_xml_creates_xml_column
181
159
  with_change_table do |t|
182
- if RUBY_VERSION < "2.7"
183
- @connection.expect :add_column, nil, [:delete_me, :foo, :xml, {}]
184
- @connection.expect :add_column, nil, [:delete_me, :bar, :xml, {}]
185
- else
186
- @connection.expect :add_column, nil, [:delete_me, :foo, :xml]
187
- @connection.expect :add_column, nil, [:delete_me, :bar, :xml]
188
- end
160
+ expect :add_column, nil, [:delete_me, :foo, :xml]
161
+ expect :add_column, nil, [:delete_me, :bar, :xml]
189
162
  t.xml :foo, :bar
190
163
  end
191
164
  end
165
+
166
+ def test_exclusion_constraint_creates_exclusion_constraint
167
+ with_change_table do |t|
168
+ expect :add_exclusion_constraint, nil, [:delete_me, "daterange(start_date, end_date) WITH &&"], using: :gist, where: "start_date IS NOT NULL AND end_date IS NOT NULL", name: "date_overlap"
169
+ t.exclusion_constraint "daterange(start_date, end_date) WITH &&", using: :gist, where: "start_date IS NOT NULL AND end_date IS NOT NULL", name: "date_overlap"
170
+ end
171
+ end
172
+
173
+ def test_remove_exclusion_constraint_removes_exclusion_constraint
174
+ with_change_table do |t|
175
+ expect :remove_exclusion_constraint, nil, [:delete_me], name: "date_overlap"
176
+ t.remove_exclusion_constraint name: "date_overlap"
177
+ end
178
+ end
179
+
180
+ def test_unique_constraint_creates_unique_constraint
181
+ with_change_table do |t|
182
+ expect :add_unique_constraint, nil, [:delete_me, :foo], deferrable: :deferred, name: "unique_constraint"
183
+ t.unique_constraint :foo, deferrable: :deferred, name: "unique_constraint"
184
+ end
185
+ end
186
+
187
+ def test_remove_unique_constraint_removes_unique_constraint
188
+ with_change_table do |t|
189
+ expect :remove_unique_constraint, nil, [:delete_me], name: "unique_constraint"
190
+ t.remove_unique_constraint name: "unique_constraint"
191
+ end
192
+ end
192
193
  end
193
194
 
194
195
  def test_column_creates_column
195
196
  with_change_table do |t|
196
- if RUBY_VERSION < "2.7"
197
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {}]
198
- else
199
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer]
200
- end
197
+ expect :add_column, nil, [:delete_me, :bar, :integer]
201
198
  t.column :bar, :integer
202
199
  end
203
200
  end
204
201
 
205
202
  def test_column_creates_column_with_options
206
203
  with_change_table do |t|
207
- if RUBY_VERSION < "2.7"
208
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer, { null: false }]
209
- else
210
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer, { null: false }]
211
- end
204
+ expect :add_column, nil, [:delete_me, :bar, :integer], null: false
212
205
  t.column :bar, :integer, null: false
213
206
  end
214
207
  end
215
208
 
216
209
  def test_column_creates_column_with_index
217
210
  with_change_table do |t|
218
- if RUBY_VERSION < "2.7"
219
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {}]
220
- @connection.expect :add_index, nil, [:delete_me, :bar, {}]
221
- else
222
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer]
223
- @connection.expect :add_index, nil, [:delete_me, :bar]
224
- end
211
+ expect :add_column, nil, [:delete_me, :bar, :integer]
212
+ expect :add_index, nil, [:delete_me, :bar]
225
213
  t.column :bar, :integer, index: true
226
214
  end
227
215
  end
228
216
 
229
217
  def test_index_creates_index
230
218
  with_change_table do |t|
231
- if RUBY_VERSION < "2.7"
232
- @connection.expect :add_index, nil, [:delete_me, :bar, {}]
233
- else
234
- @connection.expect :add_index, nil, [:delete_me, :bar]
235
- end
219
+ expect :add_index, nil, [:delete_me, :bar]
236
220
  t.index :bar
237
221
  end
238
222
  end
239
223
 
240
224
  def test_index_creates_index_with_options
241
225
  with_change_table do |t|
242
- @connection.expect :add_index, nil, [:delete_me, :bar, { unique: true }]
226
+ expect :add_index, nil, [:delete_me, :bar], unique: true
243
227
  t.index :bar, unique: true
244
228
  end
245
229
  end
246
230
 
247
231
  def test_index_exists
248
232
  with_change_table do |t|
249
- @connection.expect :index_exists?, nil, [:delete_me, :bar, {}]
233
+ expect :index_exists?, nil, [:delete_me, :bar]
250
234
  t.index_exists?(:bar)
251
235
  end
252
236
  end
253
237
 
254
238
  def test_index_exists_with_options
255
239
  with_change_table do |t|
256
- @connection.expect :index_exists?, nil, [:delete_me, :bar, { unique: true }]
240
+ expect :index_exists?, nil, [:delete_me, :bar], unique: true
257
241
  t.index_exists?(:bar, unique: true)
258
242
  end
259
243
  end
260
244
 
261
245
  def test_rename_index_renames_index
262
246
  with_change_table do |t|
263
- @connection.expect :rename_index, nil, [:delete_me, :bar, :baz]
247
+ expect :rename_index, nil, [:delete_me, :bar, :baz]
264
248
  t.rename_index :bar, :baz
265
249
  end
266
250
  end
267
251
 
268
252
  def test_change_changes_column
269
253
  with_change_table do |t|
270
- if RUBY_VERSION < "2.7"
271
- @connection.expect :change_column, nil, [:delete_me, :bar, :string, {}]
272
- else
273
- @connection.expect :change_column, nil, [:delete_me, :bar, :string]
274
- end
254
+ expect :change_column, nil, [:delete_me, :bar, :string]
275
255
  t.change :bar, :string
276
256
  end
277
257
  end
278
258
 
279
259
  def test_change_changes_column_with_options
280
260
  with_change_table do |t|
281
- @connection.expect :change_column, nil, [:delete_me, :bar, :string, { null: true }]
261
+ expect :change_column, nil, [:delete_me, :bar, :string], null: true
282
262
  t.change :bar, :string, null: true
283
263
  end
284
264
  end
285
265
 
286
266
  def test_change_default_changes_column
287
267
  with_change_table do |t|
288
- @connection.expect :change_column_default, nil, [:delete_me, :bar, :string]
268
+ expect :change_column_default, nil, [:delete_me, :bar, :string]
289
269
  t.change_default :bar, :string
290
270
  end
291
271
  end
292
272
 
293
273
  def test_change_null_changes_column
294
274
  with_change_table do |t|
295
- @connection.expect :change_column_null, nil, [:delete_me, :bar, true, nil]
275
+ expect :change_column_null, nil, [:delete_me, :bar, true, nil]
296
276
  t.change_null :bar, true
297
277
  end
298
278
  end
299
279
 
300
280
  def test_remove_drops_single_column
301
281
  with_change_table do |t|
302
- if RUBY_VERSION < "2.7"
303
- @connection.expect :remove_columns, nil, [:delete_me, :bar, {}]
304
- else
305
- @connection.expect :remove_columns, nil, [:delete_me, :bar]
306
- end
282
+ expect :remove_columns, nil, [:delete_me, :bar]
307
283
  t.remove :bar
308
284
  end
309
285
  end
310
286
 
311
287
  def test_remove_drops_multiple_columns
312
288
  with_change_table do |t|
313
- if RUBY_VERSION < "2.7"
314
- @connection.expect :remove_columns, nil, [:delete_me, :bar, :baz, {}]
315
- else
316
- @connection.expect :remove_columns, nil, [:delete_me, :bar, :baz]
317
- end
289
+ expect :remove_columns, nil, [:delete_me, :bar, :baz]
318
290
  t.remove :bar, :baz
319
291
  end
320
292
  end
321
293
 
322
294
  def test_remove_drops_multiple_columns_when_column_options_are_given
323
295
  with_change_table do |t|
324
- @connection.expect :remove_columns, nil, [:delete_me, :bar, :baz, type: :string, null: false]
296
+ expect :remove_columns, nil, [:delete_me, :bar, :baz], type: :string, null: false
325
297
  t.remove :bar, :baz, type: :string, null: false
326
298
  end
327
299
  end
328
300
 
329
301
  def test_remove_index_removes_index_with_options
330
302
  with_change_table do |t|
331
- @connection.expect :remove_index, nil, [:delete_me, :bar, { unique: true }]
303
+ expect :remove_index, nil, [:delete_me, :bar], unique: true
332
304
  t.remove_index :bar, unique: true
333
305
  end
334
306
  end
335
307
 
336
308
  def test_rename_renames_column
337
309
  with_change_table do |t|
338
- @connection.expect :rename_column, nil, [:delete_me, :bar, :baz]
310
+ expect :rename_column, nil, [:delete_me, :bar, :baz]
339
311
  t.rename :bar, :baz
340
312
  end
341
313
  end
@@ -348,17 +320,60 @@ module ActiveRecord
348
320
 
349
321
  def test_check_constraint_creates_check_constraint
350
322
  with_change_table do |t|
351
- @connection.expect :add_check_constraint, nil, [:delete_me, "price > discounted_price", name: "price_check"]
323
+ expect :add_check_constraint, nil, [:delete_me, "price > discounted_price"], name: "price_check"
352
324
  t.check_constraint "price > discounted_price", name: "price_check"
353
325
  end
354
326
  end
355
327
 
328
+ def test_check_constraint_exists
329
+ with_change_table do |t|
330
+ expect :check_constraint_exists?, nil, [:delete_me], name: "price_check"
331
+ assert_not t.check_constraint_exists?(name: "price_check")
332
+ end
333
+ end
334
+
356
335
  def test_remove_check_constraint_removes_check_constraint
357
336
  with_change_table do |t|
358
- @connection.expect :remove_check_constraint, nil, [:delete_me, name: "price_check"]
337
+ expect :remove_check_constraint, nil, [:delete_me], name: "price_check"
359
338
  t.remove_check_constraint name: "price_check"
360
339
  end
361
340
  end
341
+
342
+ if current_adapter?(:PostgreSQLAdapter)
343
+ def test_validate_check_constraint
344
+ with_change_table do |t|
345
+ expect :add_check_constraint, nil, [:delete_me, "price > discounted_price"], name: "price_check", validate: false
346
+ t.check_constraint "price > discounted_price", name: "price_check", validate: false
347
+ expect :validate_check_constraint, :nil, [:delete_me, "price_check"]
348
+ t.validate_check_constraint "price_check"
349
+ end
350
+ end
351
+
352
+ def test_validate_constraint
353
+ with_change_table do |t|
354
+ expect :add_check_constraint, nil, [:delete_me, "price > discounted_price"], name: "price_check", validate: false
355
+ t.check_constraint "price > discounted_price", name: "price_check", validate: false
356
+ expect :validate_constraint, :nil, [:delete_me, "price_check"]
357
+ t.validate_constraint "price_check"
358
+ end
359
+ end
360
+ end
361
+
362
+ def test_remove_column_with_if_exists_raises_error
363
+ assert_raises(ArgumentError) do
364
+ with_change_table do |t|
365
+ t.remove :name, if_exists: true
366
+ end
367
+ end
368
+ end
369
+
370
+ def test_add_column_with_if_not_exists_raises_error
371
+ assert_raises(ArgumentError) do
372
+ with_change_table do |t|
373
+ t.string :nickname, if_not_exists: true
374
+ end
375
+ end
376
+ end
362
377
  end
363
378
  end
364
379
  end