ibm_db 5.2.0-x86-mingw32 → 5.4.0-x86-mingw32

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 (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -0,0 +1,400 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/person"
5
+
6
+ module ActiveRecord
7
+ module ConnectionAdapters
8
+ class ConnectionHandlersMultiDbTest < ActiveRecord::TestCase
9
+ self.use_transactional_tests = false
10
+
11
+ fixtures :people
12
+
13
+ def setup
14
+ @handler = ConnectionHandler.new
15
+ @owner_name = "ActiveRecord::Base"
16
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
17
+ @rw_pool = @handler.establish_connection(db_config)
18
+ @ro_pool = @handler.establish_connection(db_config, role: :reading)
19
+ end
20
+
21
+ def teardown
22
+ clean_up_connection_handler
23
+ end
24
+
25
+ class SecondaryBase < ActiveRecord::Base
26
+ self.abstract_class = true
27
+ end
28
+
29
+ class MultiConnectionTestModel < SecondaryBase
30
+ end
31
+
32
+ def test_multiple_connections_works_in_a_threaded_environment
33
+ tf_writing = Tempfile.open "test_writing"
34
+ tf_reading = Tempfile.open "test_reading"
35
+
36
+ # We need to use a role for reading not named reading, otherwise we'll prevent writes
37
+ # and won't be able to write to the second connection.
38
+ SecondaryBase.connects_to database: { writing: { database: tf_writing.path, adapter: "sqlite3" }, secondary: { database: tf_reading.path, adapter: "sqlite3" } }
39
+
40
+ MultiConnectionTestModel.connection.execute("CREATE TABLE `multi_connection_test_models` (connection_role VARCHAR (255))")
41
+ MultiConnectionTestModel.connection.execute("INSERT INTO multi_connection_test_models VALUES ('writing')")
42
+
43
+ ActiveRecord::Base.connected_to(role: :secondary) do
44
+ MultiConnectionTestModel.connection.execute("CREATE TABLE `multi_connection_test_models` (connection_role VARCHAR (255))")
45
+ MultiConnectionTestModel.connection.execute("INSERT INTO multi_connection_test_models VALUES ('reading')")
46
+ end
47
+
48
+ read_latch = Concurrent::CountDownLatch.new
49
+ write_latch = Concurrent::CountDownLatch.new
50
+
51
+ MultiConnectionTestModel.connection
52
+
53
+ thread = Thread.new do
54
+ MultiConnectionTestModel.connection
55
+
56
+ write_latch.wait
57
+ assert_equal "writing", MultiConnectionTestModel.connection.select_value("SELECT connection_role from multi_connection_test_models")
58
+ read_latch.count_down
59
+ end
60
+
61
+ ActiveRecord::Base.connected_to(role: :secondary) do
62
+ write_latch.count_down
63
+ assert_equal "reading", MultiConnectionTestModel.connection.select_value("SELECT connection_role from multi_connection_test_models")
64
+ read_latch.wait
65
+ end
66
+
67
+ thread.join
68
+ ensure
69
+ tf_reading.close
70
+ tf_reading.unlink
71
+ tf_writing.close
72
+ tf_writing.unlink
73
+ end
74
+
75
+ def test_loading_relations_with_multi_db_connections
76
+ # We need to use a role for reading not named reading, otherwise we'll prevent writes
77
+ # and won't be able to write to the second connection.
78
+ SecondaryBase.connects_to database: { writing: { database: ":memory:", adapter: "sqlite3" }, secondary: { database: ":memory:", adapter: "sqlite3" } }
79
+
80
+ relation = ActiveRecord::Base.connected_to(role: :secondary) do
81
+ MultiConnectionTestModel.connection.execute("CREATE TABLE `multi_connection_test_models` (connection_role VARCHAR (255))")
82
+ MultiConnectionTestModel.create!(connection_role: "reading")
83
+ MultiConnectionTestModel.where(connection_role: "reading")
84
+ end
85
+
86
+ assert_equal "reading", relation.first.connection_role
87
+ end
88
+
89
+ unless in_memory_db?
90
+ def test_establish_connection_using_3_levels_config
91
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
92
+
93
+ config = {
94
+ "default_env" => {
95
+ "readonly" => { "adapter" => "sqlite3", "database" => "test/db/readonly.sqlite3", "replica" => true },
96
+ "default" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
97
+ }
98
+ }
99
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
100
+
101
+ ActiveRecord::Base.connects_to(database: { writing: :default, reading: :readonly })
102
+
103
+ assert_not_nil pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool("ActiveRecord::Base")
104
+ assert_equal "test/db/primary.sqlite3", pool.db_config.database
105
+ assert_equal "default", pool.db_config.name
106
+
107
+ assert_not_nil pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool("ActiveRecord::Base", role: :reading)
108
+ assert_equal "test/db/readonly.sqlite3", pool.db_config.database
109
+ assert_equal "readonly", pool.db_config.name
110
+ ensure
111
+ ActiveRecord::Base.configurations = @prev_configs
112
+ ActiveRecord::Base.establish_connection(:arunit)
113
+ ENV["RAILS_ENV"] = previous_env
114
+ end
115
+
116
+ def test_switching_connections_via_handler
117
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
118
+
119
+ config = {
120
+ "default_env" => {
121
+ "readonly" => { "adapter" => "sqlite3", "database" => "test/db/readonly.sqlite3" },
122
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
123
+ }
124
+ }
125
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
126
+
127
+ ActiveRecord::Base.connects_to(database: { writing: :primary, reading: :readonly })
128
+
129
+ ActiveRecord::Base.connected_to(role: :reading) do
130
+ assert_equal :reading, ActiveRecord::Base.current_role
131
+ assert ActiveRecord::Base.connected_to?(role: :reading)
132
+ assert_not ActiveRecord::Base.connected_to?(role: :writing)
133
+ assert_predicate ActiveRecord::Base.connection, :preventing_writes?
134
+ end
135
+
136
+ ActiveRecord::Base.connected_to(role: :writing) do
137
+ assert_equal :writing, ActiveRecord::Base.current_role
138
+ assert ActiveRecord::Base.connected_to?(role: :writing)
139
+ assert_not ActiveRecord::Base.connected_to?(role: :reading)
140
+ assert_not_predicate ActiveRecord::Base.connection, :preventing_writes?
141
+ end
142
+ ensure
143
+ ActiveRecord::Base.configurations = @prev_configs
144
+ ActiveRecord::Base.establish_connection(:arunit)
145
+ ENV["RAILS_ENV"] = previous_env
146
+ end
147
+
148
+ def test_establish_connection_using_3_levels_config_with_non_default_handlers
149
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
150
+
151
+ config = {
152
+ "default_env" => {
153
+ "readonly" => { "adapter" => "sqlite3", "database" => "test/db/readonly.sqlite3" },
154
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
155
+ }
156
+ }
157
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
158
+
159
+ ActiveRecord::Base.connects_to(database: { default: :primary, readonly: :readonly })
160
+
161
+ assert_not_nil pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool("ActiveRecord::Base", role: :default)
162
+ assert_equal "test/db/primary.sqlite3", pool.db_config.database
163
+
164
+ assert_not_nil pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool("ActiveRecord::Base", role: :readonly)
165
+ assert_equal "test/db/readonly.sqlite3", pool.db_config.database
166
+ ensure
167
+ ActiveRecord::Base.configurations = @prev_configs
168
+ ActiveRecord::Base.establish_connection(:arunit)
169
+ ENV["RAILS_ENV"] = previous_env
170
+ end
171
+
172
+ def test_switching_connections_with_database_url
173
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
174
+ previous_url, ENV["DATABASE_URL"] = ENV["DATABASE_URL"], "postgres://localhost/foo"
175
+
176
+ ActiveRecord::Base.connects_to(database: { writing: "postgres://localhost/bar" })
177
+ assert_equal :writing, ActiveRecord::Base.current_role
178
+ assert ActiveRecord::Base.connected_to?(role: :writing)
179
+
180
+ handler = ActiveRecord::Base.connection_handler
181
+ assert_equal handler, ActiveRecord::Base.connection_handler
182
+
183
+ assert_not_nil pool = handler.retrieve_connection_pool("ActiveRecord::Base")
184
+ assert_equal({ adapter: "postgresql", database: "bar", host: "localhost" }, pool.db_config.configuration_hash)
185
+ ensure
186
+ ActiveRecord::Base.establish_connection(:arunit)
187
+ ENV["RAILS_ENV"] = previous_env
188
+ ENV["DATABASE_URL"] = previous_url
189
+ end
190
+
191
+ def test_switching_connections_with_database_config_hash
192
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
193
+ config = { adapter: "sqlite3", database: "test/db/readonly.sqlite3" }
194
+
195
+ ActiveRecord::Base.connects_to(database: { writing: config })
196
+ assert_equal :writing, ActiveRecord::Base.current_role
197
+ assert ActiveRecord::Base.connected_to?(role: :writing)
198
+
199
+ handler = ActiveRecord::Base.connection_handler
200
+ assert_equal handler, ActiveRecord::Base.connection_handler
201
+
202
+ assert_not_nil pool = handler.retrieve_connection_pool("ActiveRecord::Base")
203
+ assert_equal(config, pool.db_config.configuration_hash)
204
+ ensure
205
+ ActiveRecord::Base.establish_connection(:arunit)
206
+ ENV["RAILS_ENV"] = previous_env
207
+ end
208
+
209
+ def test_switching_connections_with_database_and_role_raises
210
+ error = assert_raises(ArgumentError) do
211
+ assert_deprecated do
212
+ ActiveRecord::Base.connected_to(database: :readonly, role: :writing) { }
213
+ end
214
+ end
215
+ assert_equal "`connected_to` cannot accept a `database` argument with any other arguments.", error.message
216
+ end
217
+
218
+ def test_database_argument_is_deprecated
219
+ assert_deprecated do
220
+ ActiveRecord::Base.connected_to(database: { writing: { adapter: "sqlite3", database: "test/db/primary.sqlite3" } }) { }
221
+ end
222
+ ensure
223
+ ActiveRecord::Base.establish_connection(:arunit)
224
+ end
225
+
226
+ def test_switching_connections_without_database_and_role_raises
227
+ error = assert_raises(ArgumentError) do
228
+ ActiveRecord::Base.connected_to { }
229
+ end
230
+ assert_equal "must provide a `shard` and/or `role`.", error.message
231
+ end
232
+
233
+ def test_switching_connections_with_database_symbol_uses_default_role
234
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
235
+
236
+ config = {
237
+ "default_env" => {
238
+ "animals" => { adapter: "sqlite3", database: "test/db/animals.sqlite3" },
239
+ "primary" => { adapter: "sqlite3", database: "test/db/primary.sqlite3" }
240
+ }
241
+ }
242
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
243
+
244
+ ActiveRecord::Base.connects_to(database: { writing: :animals })
245
+ assert_equal :writing, ActiveRecord::Base.current_role
246
+ assert ActiveRecord::Base.connected_to?(role: :writing)
247
+
248
+ handler = ActiveRecord::Base.connection_handler
249
+ assert_equal handler, ActiveRecord::Base.connection_handler
250
+
251
+ assert_not_nil pool = handler.retrieve_connection_pool("ActiveRecord::Base")
252
+ assert_equal(config["default_env"]["animals"], pool.db_config.configuration_hash)
253
+ ensure
254
+ ActiveRecord::Base.configurations = @prev_configs
255
+ ActiveRecord::Base.establish_connection(:arunit)
256
+ ENV["RAILS_ENV"] = previous_env
257
+ end
258
+
259
+ def test_switching_connections_with_database_hash_uses_passed_role_and_database
260
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
261
+
262
+ config = {
263
+ "default_env" => {
264
+ "animals" => { adapter: "sqlite3", database: "test/db/animals.sqlite3" },
265
+ "primary" => { adapter: "sqlite3", database: "test/db/primary.sqlite3" }
266
+ }
267
+ }
268
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
269
+
270
+ ActiveRecord::Base.connects_to(database: { writing: :primary })
271
+ assert_equal :writing, ActiveRecord::Base.current_role
272
+ assert ActiveRecord::Base.connected_to?(role: :writing)
273
+
274
+ handler = ActiveRecord::Base.connection_handler
275
+ assert_equal handler, ActiveRecord::Base.connection_handler
276
+
277
+ assert_not_nil pool = handler.retrieve_connection_pool("ActiveRecord::Base")
278
+ assert_equal(config["default_env"]["primary"], pool.db_config.configuration_hash)
279
+ ensure
280
+ ActiveRecord::Base.configurations = @prev_configs
281
+ ActiveRecord::Base.establish_connection(:arunit)
282
+ ENV["RAILS_ENV"] = previous_env
283
+ end
284
+
285
+ def test_connects_to_with_single_configuration
286
+ config = {
287
+ "development" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
288
+ }
289
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
290
+
291
+ ActiveRecord::Base.connects_to database: { writing: :development }
292
+
293
+ assert_equal ActiveRecord::Base.connection_handler, ActiveRecord::Base.connection_handler
294
+ assert_equal :writing, ActiveRecord::Base.current_role
295
+ assert ActiveRecord::Base.connected_to?(role: :writing)
296
+ ensure
297
+ ActiveRecord::Base.configurations = @prev_configs
298
+ ActiveRecord::Base.establish_connection(:arunit)
299
+ end
300
+
301
+ def test_connects_to_using_top_level_key_in_two_level_config
302
+ config = {
303
+ "development" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
304
+ "development_readonly" => { "adapter" => "sqlite3", "database" => "test/db/readonly.sqlite3" }
305
+ }
306
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
307
+
308
+ ActiveRecord::Base.connects_to database: { writing: :development, reading: :development_readonly }
309
+
310
+ assert_not_nil pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool("ActiveRecord::Base", role: :reading)
311
+ assert_equal "test/db/readonly.sqlite3", pool.db_config.database
312
+ ensure
313
+ ActiveRecord::Base.configurations = @prev_configs
314
+ ActiveRecord::Base.establish_connection(:arunit)
315
+ end
316
+
317
+ def test_connects_to_returns_array_of_established_connections
318
+ config = {
319
+ "development" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
320
+ "development_readonly" => { "adapter" => "sqlite3", "database" => "test/db/readonly.sqlite3" }
321
+ }
322
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
323
+
324
+ result = ActiveRecord::Base.connects_to database: { writing: :development, reading: :development_readonly }
325
+
326
+ assert_equal(
327
+ [
328
+ ActiveRecord::Base.connection_handler.retrieve_connection_pool("ActiveRecord::Base"),
329
+ ActiveRecord::Base.connection_handler.retrieve_connection_pool("ActiveRecord::Base", role: :reading)
330
+ ],
331
+ result
332
+ )
333
+ ensure
334
+ ActiveRecord::Base.configurations = @prev_configs
335
+ ActiveRecord::Base.establish_connection(:arunit)
336
+ end
337
+ end
338
+
339
+ def test_connection_pools
340
+ assert_equal([@rw_pool], @handler.connection_pools(:writing))
341
+ assert_equal([@ro_pool], @handler.connection_pools(:reading))
342
+ end
343
+
344
+ def test_retrieve_connection
345
+ assert @handler.retrieve_connection(@owner_name)
346
+ assert @handler.retrieve_connection(@owner_name, role: :reading)
347
+ end
348
+
349
+ def test_active_connections?
350
+ assert_not_predicate @handler, :active_connections?
351
+
352
+ assert @handler.retrieve_connection(@owner_name)
353
+ assert @handler.retrieve_connection(@owner_name, role: :reading)
354
+
355
+ assert_predicate @handler, :active_connections?
356
+
357
+ @handler.clear_active_connections!
358
+ assert_not_predicate @handler, :active_connections?
359
+ end
360
+
361
+ def test_retrieve_connection_pool
362
+ assert_not_nil @handler.retrieve_connection_pool(@owner_name)
363
+ assert_not_nil @handler.retrieve_connection_pool(@owner_name, role: :reading)
364
+ end
365
+
366
+ def test_retrieve_connection_pool_with_invalid_id
367
+ assert_nil @handler.retrieve_connection_pool("foo")
368
+ assert_nil @handler.retrieve_connection_pool("foo", role: :reading)
369
+ end
370
+
371
+ def test_calling_connected_to_on_a_non_existent_handler_raises
372
+ error = assert_raises ActiveRecord::ConnectionNotEstablished do
373
+ ActiveRecord::Base.connected_to(role: :non_existent) do
374
+ Person.first
375
+ end
376
+ end
377
+
378
+ assert_equal "No connection pool for 'ActiveRecord::Base' found for the 'non_existent' role.", error.message
379
+ end
380
+
381
+ def test_default_handlers_are_writing_and_reading
382
+ assert_equal :writing, ActiveRecord::Base.writing_role
383
+ assert_equal :reading, ActiveRecord::Base.reading_role
384
+ end
385
+
386
+ def test_an_application_can_change_the_default_handlers
387
+ old_writing = ActiveRecord::Base.writing_role
388
+ old_reading = ActiveRecord::Base.reading_role
389
+ ActiveRecord::Base.writing_role = :default
390
+ ActiveRecord::Base.reading_role = :readonly
391
+
392
+ assert_equal :default, ActiveRecord::Base.writing_role
393
+ assert_equal :readonly, ActiveRecord::Base.reading_role
394
+ ensure
395
+ ActiveRecord::Base.writing_role = old_writing
396
+ ActiveRecord::Base.reading_role = old_reading
397
+ end
398
+ end
399
+ end
400
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/person"
5
+
6
+ module ActiveRecord
7
+ module ConnectionAdapters
8
+ class ConnectionHandlersMultiPoolConfigTest < ActiveRecord::TestCase
9
+ self.use_transactional_tests = false
10
+
11
+ fixtures :people
12
+
13
+ def setup
14
+ @writing_handler = ConnectionHandler.new
15
+ end
16
+
17
+ def teardown
18
+ clean_up_connection_handler
19
+ end
20
+
21
+ unless in_memory_db?
22
+ def test_establish_connection_with_pool_configs
23
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
24
+
25
+ config = {
26
+ "default_env" => {
27
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
28
+ }
29
+ }
30
+
31
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
32
+
33
+ @writing_handler.establish_connection(:primary)
34
+ @writing_handler.establish_connection(:primary, shard: :pool_config_two)
35
+
36
+ default_pool = @writing_handler.retrieve_connection_pool("primary", shard: :default)
37
+ other_pool = @writing_handler.retrieve_connection_pool("primary", shard: :pool_config_two)
38
+
39
+ assert_not_nil default_pool
40
+ assert_not_equal default_pool, other_pool
41
+
42
+ # :default if passed with no key
43
+ assert_equal default_pool, @writing_handler.retrieve_connection_pool("primary")
44
+ ensure
45
+ ActiveRecord::Base.configurations = @prev_configs
46
+ ActiveRecord::Base.establish_connection(:arunit)
47
+ ENV["RAILS_ENV"] = previous_env
48
+ end
49
+
50
+ def test_remove_connection
51
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
52
+
53
+ config = {
54
+ "default_env" => {
55
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
56
+ }
57
+ }
58
+
59
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
60
+
61
+ @writing_handler.establish_connection(:primary)
62
+ @writing_handler.establish_connection(:primary, shard: :pool_config_two)
63
+
64
+ # remove default
65
+ @writing_handler.remove_connection_pool("primary")
66
+
67
+ assert_nil @writing_handler.retrieve_connection_pool("primary")
68
+ assert_not_nil @writing_handler.retrieve_connection_pool("primary", shard: :pool_config_two)
69
+ ensure
70
+ ActiveRecord::Base.configurations = @prev_configs
71
+ ActiveRecord::Base.establish_connection(:arunit)
72
+ ENV["RAILS_ENV"] = previous_env
73
+ end
74
+
75
+ def test_connected?
76
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
77
+
78
+ config = {
79
+ "default_env" => {
80
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
81
+ }
82
+ }
83
+
84
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
85
+
86
+ @writing_handler.establish_connection(:primary)
87
+ @writing_handler.establish_connection(:primary, shard: :pool_config_two)
88
+
89
+ # connect to default
90
+ @writing_handler.connection_pool_list.first.checkout
91
+
92
+ assert @writing_handler.connected?("primary")
93
+ assert @writing_handler.connected?("primary", shard: :default)
94
+ assert_not @writing_handler.connected?("primary", shard: :pool_config_two)
95
+ ensure
96
+ ActiveRecord::Base.configurations = @prev_configs
97
+ ActiveRecord::Base.establish_connection(:arunit)
98
+ ENV["RAILS_ENV"] = previous_env
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end