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,637 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "active_record/tasks/database_tasks"
5
+
6
+ module ActiveRecord
7
+ class PostgreSQLDBCreateTest < ActiveRecord::TestCase
8
+ def setup
9
+ @connection = Class.new { def create_database(*); end }.new
10
+ @configuration = {
11
+ "adapter" => "postgresql",
12
+ "database" => "my-app-db"
13
+ }
14
+ $stdout, @original_stdout = StringIO.new, $stdout
15
+ $stderr, @original_stderr = StringIO.new, $stderr
16
+ end
17
+
18
+ def teardown
19
+ $stdout, $stderr = @original_stdout, @original_stderr
20
+ end
21
+
22
+ def test_establishes_connection_to_postgresql_database
23
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
24
+
25
+ mock = Minitest::Mock.new
26
+ mock.expect(:call, nil, [{ adapter: "postgresql", database: "postgres", schema_search_path: "public" }])
27
+ mock.expect(:call, nil, [db_config])
28
+
29
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
30
+ ActiveRecord::Base.stub(:establish_connection, mock) do
31
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config)
32
+ end
33
+ end
34
+
35
+ assert_mock(mock)
36
+ end
37
+
38
+ def test_creates_database_with_default_encoding
39
+ with_stubbed_connection_establish_connection do
40
+ assert_called_with(
41
+ @connection,
42
+ :create_database,
43
+ ["my-app-db", @configuration.symbolize_keys.merge(encoding: "utf8")]
44
+ ) do
45
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
46
+ end
47
+ end
48
+ end
49
+
50
+ def test_creates_database_with_given_encoding
51
+ with_stubbed_connection_establish_connection do
52
+ assert_called_with(
53
+ @connection,
54
+ :create_database,
55
+ ["my-app-db", @configuration.symbolize_keys.merge(encoding: "latin")]
56
+ ) do
57
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration.
58
+ merge("encoding" => "latin")
59
+ end
60
+ end
61
+ end
62
+
63
+ def test_creates_database_with_given_collation_and_ctype
64
+ with_stubbed_connection_establish_connection do
65
+ assert_called_with(
66
+ @connection,
67
+ :create_database,
68
+ [
69
+ "my-app-db",
70
+ @configuration.symbolize_keys.merge(
71
+ encoding: "utf8",
72
+ collation: "ja_JP.UTF8",
73
+ ctype: "ja_JP.UTF8"
74
+ )
75
+ ]
76
+ ) do
77
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration.
78
+ merge("collation" => "ja_JP.UTF8", "ctype" => "ja_JP.UTF8")
79
+ end
80
+ end
81
+ end
82
+
83
+ def test_establishes_connection_to_new_database
84
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
85
+
86
+ mock = Minitest::Mock.new
87
+ mock.expect(:call, nil, [{ adapter: "postgresql", database: "postgres", schema_search_path: "public" }])
88
+ mock.expect(:call, nil, [db_config])
89
+
90
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
91
+ ActiveRecord::Base.stub(:establish_connection, mock) do
92
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config)
93
+ end
94
+ end
95
+
96
+ assert_mock(mock)
97
+ end
98
+
99
+ def test_db_create_with_error_prints_message
100
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
101
+ ActiveRecord::Base.stub(:establish_connection, -> * { raise Exception }) do
102
+ assert_raises(Exception) { ActiveRecord::Tasks::DatabaseTasks.create @configuration }
103
+ assert_match "Couldn't create '#{@configuration['database']}' database. Please check your configuration.", $stderr.string
104
+ end
105
+ end
106
+ end
107
+
108
+ def test_when_database_created_successfully_outputs_info_to_stdout
109
+ with_stubbed_connection_establish_connection do
110
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
111
+
112
+ assert_equal "Created database 'my-app-db'\n", $stdout.string
113
+ end
114
+ end
115
+
116
+ def test_create_when_database_exists_outputs_info_to_stderr
117
+ with_stubbed_connection_establish_connection do
118
+ ActiveRecord::Base.lease_connection.stub(
119
+ :create_database,
120
+ proc { raise ActiveRecord::DatabaseAlreadyExists }
121
+ ) do
122
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
123
+
124
+ assert_equal "Database 'my-app-db' already exists\n", $stderr.string
125
+ end
126
+ end
127
+ end
128
+
129
+ private
130
+ def with_stubbed_connection_establish_connection(&block)
131
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
132
+ ActiveRecord::Base.stub(:establish_connection, nil, &block)
133
+ end
134
+ end
135
+ end
136
+
137
+ class PostgreSQLDBDropTest < ActiveRecord::TestCase
138
+ def setup
139
+ @connection = Class.new { def drop_database(*); end }.new
140
+ @configuration = {
141
+ "adapter" => "postgresql",
142
+ "database" => "my-app-db"
143
+ }
144
+ $stdout, @original_stdout = StringIO.new, $stdout
145
+ $stderr, @original_stderr = StringIO.new, $stderr
146
+ end
147
+
148
+ def teardown
149
+ $stdout, $stderr = @original_stdout, @original_stderr
150
+ end
151
+
152
+ def test_establishes_connection_to_postgresql_database
153
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
154
+ assert_called_with(
155
+ ActiveRecord::Base,
156
+ :establish_connection,
157
+ [
158
+ adapter: "postgresql",
159
+ database: "postgres",
160
+ schema_search_path: "public"
161
+ ]
162
+ ) do
163
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration
164
+ end
165
+ end
166
+ end
167
+
168
+ def test_drops_database
169
+ with_stubbed_connection_establish_connection do
170
+ assert_called_with(
171
+ @connection,
172
+ :drop_database,
173
+ ["my-app-db"]
174
+ ) do
175
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration
176
+ end
177
+ end
178
+ end
179
+
180
+ def test_when_database_dropped_successfully_outputs_info_to_stdout
181
+ with_stubbed_connection_establish_connection do
182
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration
183
+
184
+ assert_equal "Dropped database 'my-app-db'\n", $stdout.string
185
+ end
186
+ end
187
+
188
+ private
189
+ def with_stubbed_connection_establish_connection(&block)
190
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
191
+ ActiveRecord::Base.stub(:establish_connection, nil, &block)
192
+ end
193
+ end
194
+ end
195
+
196
+ class PostgreSQLPurgeTest < ActiveRecord::TestCase
197
+ def setup
198
+ @connection = Class.new do
199
+ def create_database(*); end
200
+ def drop_database(*); end
201
+ end.new
202
+ @configuration = {
203
+ "adapter" => "postgresql",
204
+ "database" => "my-app-db"
205
+ }
206
+ end
207
+
208
+ def test_clears_active_connections
209
+ with_stubbed_connection do
210
+ ActiveRecord::Base.connection_handler.stub(:establish_connection, nil) do
211
+ assert_called(ActiveRecord::Base.connection_handler, :clear_active_connections!) do
212
+ ActiveRecord::Tasks::DatabaseTasks.purge @configuration
213
+ end
214
+ end
215
+ end
216
+ end
217
+
218
+ def test_establishes_connection_to_postgresql_database
219
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
220
+
221
+ mock = Minitest::Mock.new
222
+ mock.expect(:call, nil, [{ adapter: "postgresql", database: "postgres", schema_search_path: "public" }])
223
+ mock.expect(:call, nil, [db_config])
224
+
225
+ with_stubbed_connection do
226
+ ActiveRecord::Base.stub(:establish_connection, mock) do
227
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
228
+ end
229
+ end
230
+
231
+ assert_mock(mock)
232
+ end
233
+
234
+ def test_drops_database
235
+ with_stubbed_connection do
236
+ ActiveRecord::Base.stub(:establish_connection, nil) do
237
+ assert_called_with(@connection, :drop_database, ["my-app-db"]) do
238
+ ActiveRecord::Tasks::DatabaseTasks.purge @configuration
239
+ end
240
+ end
241
+ end
242
+ end
243
+
244
+ def test_creates_database
245
+ with_stubbed_connection do
246
+ ActiveRecord::Base.stub(:establish_connection, nil) do
247
+ assert_called_with(
248
+ @connection,
249
+ :create_database,
250
+ ["my-app-db", @configuration.symbolize_keys.merge(encoding: "utf8")]
251
+ ) do
252
+ ActiveRecord::Tasks::DatabaseTasks.purge @configuration
253
+ end
254
+ end
255
+ end
256
+ end
257
+
258
+ def test_establishes_connection
259
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
260
+
261
+ mock = Minitest::Mock.new
262
+ mock.expect(:call, nil, [{ adapter: "postgresql", database: "postgres", schema_search_path: "public" }])
263
+ mock.expect(:call, nil, [db_config])
264
+
265
+ with_stubbed_connection do
266
+ ActiveRecord::Base.stub(:establish_connection, mock) do
267
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
268
+ end
269
+ end
270
+
271
+ assert_mock(mock)
272
+ end
273
+
274
+ private
275
+ def with_stubbed_connection(&block)
276
+ ActiveRecord::Base.stub(:lease_connection, @connection, &block)
277
+ end
278
+ end
279
+
280
+ class PostgreSQLDBCharsetTest < ActiveRecord::TestCase
281
+ def setup
282
+ @connection = Class.new do
283
+ def create_database(*); end
284
+ def encoding; end
285
+ end.new
286
+ @configuration = {
287
+ "adapter" => "postgresql",
288
+ "database" => "my-app-db"
289
+ }
290
+ end
291
+
292
+ def test_db_retrieves_charset
293
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
294
+ assert_called(@connection, :encoding) do
295
+ ActiveRecord::Tasks::DatabaseTasks.charset @configuration
296
+ end
297
+ end
298
+ end
299
+ end
300
+
301
+ class PostgreSQLDBCollationTest < ActiveRecord::TestCase
302
+ def setup
303
+ @connection = Class.new { def collation; end }.new
304
+ @configuration = {
305
+ "adapter" => "postgresql",
306
+ "database" => "my-app-db"
307
+ }
308
+ end
309
+
310
+ def test_db_retrieves_collation
311
+ ActiveRecord::Base.stub(:lease_connection, @connection) do
312
+ assert_called(@connection, :collation) do
313
+ ActiveRecord::Tasks::DatabaseTasks.collation @configuration
314
+ end
315
+ end
316
+ end
317
+ end
318
+
319
+ class PostgreSQLStructureDumpTest < ActiveRecord::TestCase
320
+ def setup
321
+ @configuration = {
322
+ "adapter" => "postgresql",
323
+ "database" => "my-app-db"
324
+ }
325
+ @filename = "/tmp/awesome-file.sql"
326
+ FileUtils.touch(@filename)
327
+ end
328
+
329
+ def teardown
330
+ FileUtils.rm_f(@filename)
331
+ end
332
+
333
+ # This test actually runs a dump so we can ensure all the arguments are parsed correctly.
334
+ # All other tests in this class just mock the call (using assert_called_with) to make the tests quicker.
335
+ def test_structure_dump
336
+ assert_equal "", File.read(@filename)
337
+
338
+ config = @configuration.dup
339
+ config["database"] = ARTest.config["connections"]["postgresql"]["arunit"]["database"]
340
+
341
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(config, @filename)
342
+
343
+ assert File.read(@filename).include?("PostgreSQL database dump complete")
344
+ end
345
+
346
+ def test_structure_dump_header_comments_removed
347
+ Kernel.stub(:system, true) do
348
+ raw_dump_sql = <<~SQL
349
+ -- header comment
350
+
351
+ -- more header comment
352
+ statement
353
+ -- lower comment
354
+ SQL
355
+ expected_dump_sql = <<~SQL
356
+ statement
357
+ -- lower comment
358
+ SQL
359
+ File.write(@filename, raw_dump_sql)
360
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
361
+ assert_equal expected_dump_sql, File.readlines(@filename).first(2).join
362
+ end
363
+ end
364
+
365
+ def test_structure_dump_header_comments_with_restrict_commands_removed
366
+ Kernel.stub(:system, true) do
367
+ raw_dump_sql = <<~SQL
368
+ \\restrict pbgv1pF8SxQK6cuT7hwDi21uDYr8wpxKJ3wlLa9Zk5EIO1xBiu84SJQU8fL22PT
369
+
370
+ -- header comment
371
+
372
+ -- more header comment
373
+ statement
374
+ -- lower comment
375
+ \\unrestrict pbgv1pF8SxQK6cuT7hwDi21uDYr8wpxKJ3wlLa9Zk5EIO1xBiu84SJQU8fL22PT
376
+
377
+ other_statement
378
+ SQL
379
+ expected_dump_sql = <<~SQL
380
+ statement
381
+ -- lower comment
382
+ other_statement
383
+ SQL
384
+ File.write(@filename, raw_dump_sql)
385
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
386
+ assert_equal expected_dump_sql, File.readlines(@filename).first(3).join
387
+ end
388
+ end
389
+
390
+ def test_structure_dump_with_env
391
+ expected_env = { "PGHOST" => "my.server.tld", "PGPORT" => "2345", "PGUSER" => "jane", "PGPASSWORD" => "s3cr3t" }
392
+ expected_command = [expected_env, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "my-app-db"]
393
+
394
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
395
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(
396
+ @configuration.merge(host: "my.server.tld", port: 2345, username: "jane", password: "s3cr3t"),
397
+ @filename
398
+ )
399
+ end
400
+ end
401
+
402
+ def test_structure_dump_with_ssl_env
403
+ expected_env = { "PGSSLMODE" => "verify-full", "PGSSLCERT" => "client.crt", "PGSSLKEY" => "client.key", "PGSSLROOTCERT" => "root.crt" }
404
+ expected_command = [expected_env, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "my-app-db"]
405
+
406
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
407
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(
408
+ @configuration.merge(sslmode: "verify-full", sslcert: "client.crt", sslkey: "client.key", sslrootcert: "root.crt"),
409
+ @filename
410
+ )
411
+ end
412
+ end
413
+
414
+ def test_structure_dump_with_extra_flags
415
+ expected_command = [{}, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "--noop", "my-app-db"]
416
+
417
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
418
+ with_structure_dump_flags(["--noop"]) do
419
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
420
+ end
421
+ end
422
+ end
423
+
424
+ def test_structure_dump_with_hash_extra_flags_for_a_different_driver
425
+ expected_command = [{}, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "my-app-db"]
426
+
427
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
428
+ with_structure_dump_flags({ mysql2: ["--noop"] }) do
429
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
430
+ end
431
+ end
432
+ end
433
+
434
+ def test_structure_dump_with_hash_extra_flags_for_the_correct_driver
435
+ expected_command = [{}, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "--noop", "my-app-db"]
436
+
437
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
438
+ with_structure_dump_flags({ postgresql: ["--noop"] }) do
439
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
440
+ end
441
+ end
442
+ end
443
+
444
+ def test_structure_dump_with_ignore_tables
445
+ ActiveRecord::Base.lease_connection.stub(:data_sources, ["foo", "bar", "prefix_foo", "ignored_foo"]) do
446
+ ActiveRecord::SchemaDumper.stub(:ignore_tables, [/^prefix_/, "ignored_foo"]) do
447
+ assert_called_with(
448
+ Kernel,
449
+ :system,
450
+ [{}, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "-T", "prefix_foo", "-T", "ignored_foo", "my-app-db"],
451
+ returns: true
452
+ ) do
453
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
454
+ end
455
+ end
456
+ end
457
+ end
458
+
459
+ def test_structure_dump_with_schema_search_path
460
+ @configuration["schema_search_path"] = "foo,bar"
461
+
462
+ assert_called_with(
463
+ Kernel,
464
+ :system,
465
+ [{}, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "--schema=foo", "--schema=bar", "my-app-db"],
466
+ returns: true
467
+ ) do
468
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
469
+ end
470
+ end
471
+
472
+ def test_structure_dump_with_schema_search_path_and_dump_schemas_all
473
+ @configuration["schema_search_path"] = "foo,bar"
474
+
475
+ assert_called_with(
476
+ Kernel,
477
+ :system,
478
+ [{}, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "my-app-db"],
479
+ returns: true
480
+ ) do
481
+ with_dump_schemas(:all) do
482
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
483
+ end
484
+ end
485
+ end
486
+
487
+ def test_structure_dump_with_dump_schemas_string
488
+ assert_called_with(
489
+ Kernel,
490
+ :system,
491
+ [{}, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", @filename, "--schema=foo", "--schema=bar", "my-app-db"],
492
+ returns: true
493
+ ) do
494
+ with_dump_schemas("foo,bar") do
495
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
496
+ end
497
+ end
498
+ end
499
+
500
+ def test_structure_dump_execution_fails
501
+ filename = "awesome-file.sql"
502
+ assert_called_with(
503
+ Kernel,
504
+ :system,
505
+ [{}, "pg_dump", "--schema-only", "--no-privileges", "--no-owner", "--file", filename, "my-app-db"],
506
+ returns: nil
507
+ ) do
508
+ e = assert_raise(RuntimeError) do
509
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
510
+ end
511
+ assert_match("failed to execute:", e.message)
512
+ end
513
+ end
514
+
515
+ private
516
+ def with_dump_schemas(value, &block)
517
+ old_dump_schemas = ActiveRecord.dump_schemas
518
+ ActiveRecord.dump_schemas = value
519
+ yield
520
+ ensure
521
+ ActiveRecord.dump_schemas = old_dump_schemas
522
+ end
523
+
524
+ def with_structure_dump_flags(flags)
525
+ old = ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags
526
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = flags
527
+ yield
528
+ ensure
529
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = old
530
+ end
531
+ end
532
+
533
+ class PostgreSQLStructureLoadTest < ActiveRecord::TestCase
534
+ def setup
535
+ @configuration = {
536
+ "adapter" => "postgresql",
537
+ "database" => "my-app-db"
538
+ }
539
+ end
540
+
541
+ def test_structure_load
542
+ filename = "awesome-file.sql"
543
+ assert_called_with(
544
+ Kernel,
545
+ :system,
546
+ [{}, "psql", "--set", "ON_ERROR_STOP=1", "--quiet", "--no-psqlrc", "--output", File::NULL, "--file", filename, @configuration["database"]],
547
+ returns: true
548
+ ) do
549
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
550
+ end
551
+ end
552
+
553
+ def test_structure_load_with_extra_flags
554
+ filename = "awesome-file.sql"
555
+ expected_command = [{}, "psql", "--set", "ON_ERROR_STOP=1", "--quiet", "--no-psqlrc", "--output", File::NULL, "--noop", "--file", filename, @configuration["database"]]
556
+
557
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
558
+ with_structure_load_flags(["--noop"]) do
559
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
560
+ end
561
+ end
562
+ end
563
+
564
+ def test_structure_load_with_env
565
+ filename = "awesome-file.sql"
566
+ expected_env = { "PGHOST" => "my.server.tld", "PGPORT" => "2345", "PGUSER" => "jane", "PGPASSWORD" => "s3cr3t" }
567
+ expected_command = [expected_env, "psql", "--set", "ON_ERROR_STOP=1", "--quiet", "--no-psqlrc", "--output", File::NULL, "--noop", "--file", filename, @configuration["database"]]
568
+
569
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
570
+ with_structure_load_flags(["--noop"]) do
571
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(
572
+ @configuration.merge(host: "my.server.tld", port: 2345, username: "jane", password: "s3cr3t"),
573
+ filename
574
+ )
575
+ end
576
+ end
577
+ end
578
+
579
+ def test_structure_load_with_ssl_env
580
+ filename = "awesome-file.sql"
581
+ expected_env = { "PGSSLMODE" => "verify-full", "PGSSLCERT" => "client.crt", "PGSSLKEY" => "client.key", "PGSSLROOTCERT" => "root.crt" }
582
+ expected_command = [expected_env, "psql", "--set", "ON_ERROR_STOP=1", "--quiet", "--no-psqlrc", "--output", File::NULL, "--noop", "--file", filename, @configuration["database"]]
583
+
584
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
585
+ with_structure_load_flags(["--noop"]) do
586
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(
587
+ @configuration.merge(sslmode: "verify-full", sslcert: "client.crt", sslkey: "client.key", sslrootcert: "root.crt"),
588
+ filename
589
+ )
590
+ end
591
+ end
592
+ end
593
+
594
+ def test_structure_load_with_hash_extra_flags_for_a_different_driver
595
+ filename = "awesome-file.sql"
596
+ expected_command = [{}, "psql", "--set", "ON_ERROR_STOP=1", "--quiet", "--no-psqlrc", "--output", File::NULL, "--file", filename, @configuration["database"]]
597
+
598
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
599
+ with_structure_load_flags({ mysql2: ["--noop"] }) do
600
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
601
+ end
602
+ end
603
+ end
604
+
605
+ def test_structure_load_with_hash_extra_flags_for_the_correct_driver
606
+ filename = "awesome-file.sql"
607
+ expected_command = [{}, "psql", "--set", "ON_ERROR_STOP=1", "--quiet", "--no-psqlrc", "--output", File::NULL, "--noop", "--file", filename, @configuration["database"]]
608
+
609
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
610
+ with_structure_load_flags({ postgresql: ["--noop"] }) do
611
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
612
+ end
613
+ end
614
+ end
615
+
616
+ def test_structure_load_accepts_path_with_spaces
617
+ filename = "awesome file.sql"
618
+ assert_called_with(
619
+ Kernel,
620
+ :system,
621
+ [{}, "psql", "--set", "ON_ERROR_STOP=1", "--quiet", "--no-psqlrc", "--output", File::NULL, "--file", filename, @configuration["database"]],
622
+ returns: true
623
+ ) do
624
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
625
+ end
626
+ end
627
+
628
+ private
629
+ def with_structure_load_flags(flags)
630
+ old = ActiveRecord::Tasks::DatabaseTasks.structure_load_flags
631
+ ActiveRecord::Tasks::DatabaseTasks.structure_load_flags = flags
632
+ yield
633
+ ensure
634
+ ActiveRecord::Tasks::DatabaseTasks.structure_load_flags = old
635
+ end
636
+ end
637
+ end
@@ -17,7 +17,7 @@ class PreparedStatementsDisabledTest < ActiveRecord::PostgreSQLTestCase
17
17
  end
18
18
 
19
19
  def test_select_query_works_even_when_prepared_statements_are_disabled
20
- assert_not Developer.connection.prepared_statements
20
+ assert_not Developer.lease_connection.prepared_statements
21
21
 
22
22
  david = developers(:david)
23
23