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