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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  module ActiveRecord
@@ -15,241 +17,420 @@ module ActiveRecord
15
17
  ENV["RAILS_ENV"] = @previous_rails_env
16
18
  end
17
19
 
18
- def resolve_config(config)
19
- ActiveRecord::ConnectionHandling::MergeAndResolveDefaultUrlConfig.new(config).resolve
20
+ def resolve_config(config, env_name = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call)
21
+ configs = ActiveRecord::DatabaseConfigurations.new(config)
22
+ configs.configs_for(env_name: env_name, name: "primary")&.configuration_hash
23
+ end
24
+
25
+ def resolve_db_config(spec, config)
26
+ configs = ActiveRecord::DatabaseConfigurations.new(config)
27
+ configs.resolve(spec)
20
28
  end
21
29
 
22
- def resolve_spec(spec, config)
23
- ConnectionSpecification::Resolver.new(resolve_config(config)).resolve(spec)
30
+ def test_invalid_string_config
31
+ config = { "foo" => "bar" }
32
+
33
+ assert_raises ActiveRecord::DatabaseConfigurations::InvalidConfigurationError do
34
+ resolve_config(config)
35
+ end
36
+ end
37
+
38
+ def test_invalid_symbol_config
39
+ config = { "foo" => :bar }
40
+
41
+ assert_raises ActiveRecord::DatabaseConfigurations::InvalidConfigurationError do
42
+ resolve_config(config)
43
+ end
24
44
  end
25
45
 
26
46
  def test_resolver_with_database_uri_and_current_env_symbol_key
27
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
28
- config = { "not_production" => { "adapter" => "not_postgres", "database" => "not_foo" } }
29
- actual = resolve_spec(:default_env, config)
30
- expected = { "adapter"=>"postgresql", "database"=>"foo", "host"=>"localhost" }
31
- assert_equal expected, actual
47
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
48
+ config = { "not_production" => { "adapter" => "not_postgres", "database" => "not_foo" } }
49
+ actual = resolve_db_config(:default_env, config)
50
+ expected = { adapter: "postgresql", database: "foo", host: "localhost" }
51
+
52
+ assert_equal expected, actual.configuration_hash
32
53
  end
33
54
 
34
55
  def test_resolver_with_database_uri_and_current_env_symbol_key_and_rails_env
35
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
36
- ENV['RAILS_ENV'] = "foo"
56
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
57
+ ENV["RAILS_ENV"] = "foo"
37
58
 
38
- config = { "not_production" => { "adapter" => "not_postgres", "database" => "not_foo" } }
39
- actual = resolve_spec(:foo, config)
40
- expected = { "adapter" => "postgresql", "database" => "foo", "host" => "localhost" }
41
- assert_equal expected, actual
59
+ config = { "not_production" => { "adapter" => "not_postgres", "database" => "not_foo" } }
60
+ actual = resolve_db_config(:foo, config)
61
+ expected = { adapter: "postgresql", database: "foo", host: "localhost" }
62
+
63
+ assert_equal expected, actual.configuration_hash
64
+ end
65
+
66
+ def test_resolver_with_nil_database_url_and_current_env
67
+ ENV["RAILS_ENV"] = "foo"
68
+ config = { "foo" => { "adapter" => "postgres", "url" => ENV["DATABASE_URL"] } }
69
+ actual = resolve_db_config(:foo, config)
70
+ expected_config = { adapter: "postgres", url: nil }
71
+
72
+ assert_equal expected_config, actual.configuration_hash
42
73
  end
43
74
 
44
75
  def test_resolver_with_database_uri_and_current_env_symbol_key_and_rack_env
45
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
46
- ENV['RACK_ENV'] = "foo"
76
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
77
+ ENV["RACK_ENV"] = "foo"
47
78
 
48
- config = { "not_production" => { "adapter" => "not_postgres", "database" => "not_foo" } }
49
- actual = resolve_spec(:foo, config)
50
- expected = { "adapter" => "postgresql", "database" => "foo", "host" => "localhost" }
51
- assert_equal expected, actual
79
+ config = { "not_production" => { "adapter" => "not_postgres", "database" => "not_foo" } }
80
+ actual = resolve_db_config(:foo, config)
81
+ expected = { adapter: "postgresql", database: "foo", host: "localhost" }
82
+
83
+ assert_equal expected, actual.configuration_hash
52
84
  end
53
85
 
54
86
  def test_resolver_with_database_uri_and_known_key
55
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
56
- config = { "production" => { "adapter" => "not_postgres", "database" => "not_foo", "host" => "localhost" } }
57
- actual = resolve_spec(:production, config)
58
- expected = { "adapter"=>"not_postgres", "database"=>"not_foo", "host"=>"localhost" }
59
- assert_equal expected, actual
87
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
88
+ config = { "production" => { "adapter" => "not_postgres", "database" => "not_foo", "host" => "localhost" } }
89
+ actual = resolve_db_config(:production, config)
90
+ expected = { adapter: "not_postgres", database: "not_foo", host: "localhost" }
91
+
92
+ assert_equal expected, actual.configuration_hash
93
+ end
94
+
95
+ def test_resolver_with_database_uri_and_multiple_envs
96
+ ENV["DATABASE_URL"] = "postgres://localhost"
97
+ ENV["RAILS_ENV"] = "test"
98
+
99
+ config = { "production" => { "adapter" => "postgresql", "database" => "foo_prod" }, "test" => { "adapter" => "postgresql", "database" => "foo_test" } }
100
+ actual = resolve_db_config(:test, config)
101
+ expected = { adapter: "postgresql", database: "foo_test", host: "localhost" }
102
+
103
+ assert_equal expected, actual.configuration_hash
60
104
  end
61
105
 
62
106
  def test_resolver_with_database_uri_and_unknown_symbol_key
63
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
64
- config = { "not_production" => { "adapter" => "not_postgres", "database" => "not_foo" } }
107
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
108
+ config = { "not_production" => { "adapter" => "not_postgres", "database" => "not_foo" } }
65
109
  assert_raises AdapterNotSpecified do
66
- resolve_spec(:production, config)
110
+ resolve_db_config(:production, config)
67
111
  end
68
112
  end
69
113
 
70
114
  def test_resolver_with_database_uri_and_supplied_url
71
- ENV['DATABASE_URL'] = "not-postgres://not-localhost/not_foo"
72
- config = { "production" => { "adapter" => "also_not_postgres", "database" => "also_not_foo" } }
73
- actual = resolve_spec("postgres://localhost/foo", config)
74
- expected = { "adapter"=>"postgresql", "database"=>"foo", "host"=>"localhost" }
75
- assert_equal expected, actual
115
+ ENV["DATABASE_URL"] = "not-postgres://not-localhost/not_foo"
116
+ config = { "production" => { "adapter" => "also_not_postgres", "database" => "also_not_foo" } }
117
+ actual = resolve_db_config("postgres://localhost/foo", config)
118
+ expected = { adapter: "postgresql", database: "foo", host: "localhost" }
119
+
120
+ assert_equal expected, actual.configuration_hash
76
121
  end
77
122
 
78
123
  def test_jdbc_url
79
124
  config = { "production" => { "url" => "jdbc:postgres://localhost/foo" } }
80
- actual = resolve_config(config)
81
- assert_equal config, actual
125
+ actual = resolve_config(config, "production")
126
+ assert_equal config["production"].symbolize_keys, actual
127
+ end
128
+
129
+ def test_http_url
130
+ config = { "production" => { "url" => "http://example.com/path" } }
131
+ actual = resolve_config(config, "production")
132
+ assert_equal config["production"].symbolize_keys, actual
133
+ end
134
+
135
+ def test_https_url
136
+ config = { "production" => { "url" => "https://example.com" } }
137
+ actual = resolve_config(config, "production")
138
+ assert_equal config["production"].symbolize_keys, actual
82
139
  end
83
140
 
84
141
  def test_environment_does_not_exist_in_config_url_does_exist
85
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
86
- config = { "not_default_env" => { "adapter" => "not_postgres", "database" => "not_foo" } }
87
- actual = resolve_config(config)
88
- expect_prod = { "adapter"=>"postgresql", "database"=>"foo", "host"=>"localhost" }
89
- assert_equal expect_prod, actual["default_env"]
142
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
143
+ config = { "not_default_env" => { "adapter" => "not_postgres", "database" => "not_foo" } }
144
+ actual = resolve_config(config, "default_env")
145
+ expect_prod = {
146
+ adapter: "postgresql",
147
+ database: "foo",
148
+ host: "localhost"
149
+ }
150
+
151
+ assert_equal expect_prod, actual
90
152
  end
91
153
 
92
154
  def test_url_with_hyphenated_scheme
93
- ENV['DATABASE_URL'] = "ibm-db://localhost/foo"
94
- config = { "default_env" => { "adapter" => "not_postgres", "database" => "not_foo", "host" => "localhost" } }
95
- actual = resolve_spec(:default_env, config)
96
- expected = { "adapter"=>"ibm_db", "database"=>"foo", "host"=>"localhost" }
97
- assert_equal expected, actual
155
+ ENV["DATABASE_URL"] = "ibm-db://localhost/foo"
156
+ config = { "default_env" => { "adapter" => "not_postgres", "database" => "not_foo", "host" => "localhost" } }
157
+ actual = resolve_db_config(:default_env, config)
158
+ expected = { adapter: "ibm_db", database: "foo", host: "localhost" }
159
+
160
+ assert_equal expected, actual.configuration_hash
98
161
  end
99
162
 
100
163
  def test_string_connection
101
164
  config = { "default_env" => "postgres://localhost/foo" }
102
- actual = resolve_config(config)
103
- expected = { "default_env" =>
104
- { "adapter" => "postgresql",
105
- "database" => "foo",
106
- "host" => "localhost"
107
- }
108
- }
165
+ actual = resolve_config(config, "default_env")
166
+ expected = {
167
+ adapter: "postgresql",
168
+ database: "foo",
169
+ host: "localhost"
170
+ }
171
+
109
172
  assert_equal expected, actual
110
173
  end
111
174
 
112
175
  def test_url_sub_key
113
176
  config = { "default_env" => { "url" => "postgres://localhost/foo" } }
114
177
  actual = resolve_config(config)
115
- expected = { "default_env" =>
116
- { "adapter" => "postgresql",
117
- "database" => "foo",
118
- "host" => "localhost"
119
- }
120
- }
178
+ expected = {
179
+ adapter: "postgresql",
180
+ database: "foo",
181
+ host: "localhost"
182
+ }
183
+
184
+ assert_equal expected, actual
185
+ end
186
+
187
+ def test_url_removed_from_hash
188
+ config = { "default_env" => { "url" => "postgres://localhost/foo" } }
189
+ actual = resolve_db_config(:default_env, config)
190
+
191
+ assert_not_includes actual.configuration_hash, :url
192
+ end
193
+
194
+ def test_url_with_equals_in_query_value
195
+ config = { "default_env" => { "url" => "postgresql://localhost/foo?options=-cmyoption=on" } }
196
+ actual = resolve_config(config)
197
+ expected = { options: "-cmyoption=on", adapter: "postgresql", database: "foo", host: "localhost" }
121
198
  assert_equal expected, actual
122
199
  end
123
200
 
124
201
  def test_hash
125
202
  config = { "production" => { "adapter" => "postgres", "database" => "foo" } }
126
- actual = resolve_config(config)
127
- assert_equal config, actual
203
+ actual = resolve_config(config, "production")
204
+ assert_equal config["production"].symbolize_keys, actual
128
205
  end
129
206
 
130
207
  def test_blank
131
208
  config = {}
132
- actual = resolve_config(config)
133
- assert_equal config, actual
209
+ actual = resolve_config(config, "default_env")
210
+ assert_nil actual
134
211
  end
135
212
 
136
213
  def test_blank_with_database_url
137
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
214
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
138
215
 
139
216
  config = {}
140
217
  actual = resolve_config(config)
141
- expected = { "adapter" => "postgresql",
142
- "database" => "foo",
143
- "host" => "localhost" }
144
- assert_equal expected, actual["default_env"]
145
- assert_equal nil, actual["production"]
146
- assert_equal nil, actual["development"]
147
- assert_equal nil, actual["test"]
148
- assert_equal nil, actual[:default_env]
149
- assert_equal nil, actual[:production]
150
- assert_equal nil, actual[:development]
151
- assert_equal nil, actual[:test]
218
+ expected = {
219
+ adapter: "postgresql",
220
+ database: "foo",
221
+ host: "localhost"
222
+ }
223
+
224
+ assert_equal expected, actual
152
225
  end
153
226
 
154
227
  def test_blank_with_database_url_with_rails_env
155
- ENV['RAILS_ENV'] = "not_production"
156
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
228
+ ENV["RAILS_ENV"] = "not_production"
229
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
157
230
 
158
231
  config = {}
159
232
  actual = resolve_config(config)
160
- expected = { "adapter" => "postgresql",
161
- "database" => "foo",
162
- "host" => "localhost" }
163
-
164
- assert_equal expected, actual["not_production"]
165
- assert_equal nil, actual["production"]
166
- assert_equal nil, actual["default_env"]
167
- assert_equal nil, actual["development"]
168
- assert_equal nil, actual["test"]
169
- assert_equal nil, actual[:default_env]
170
- assert_equal nil, actual[:not_production]
171
- assert_equal nil, actual[:production]
172
- assert_equal nil, actual[:development]
173
- assert_equal nil, actual[:test]
233
+ expected = {
234
+ adapter: "postgresql",
235
+ database: "foo",
236
+ host: "localhost"
237
+ }
238
+
239
+ assert_equal expected, actual
174
240
  end
175
241
 
176
242
  def test_blank_with_database_url_with_rack_env
177
- ENV['RACK_ENV'] = "not_production"
178
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
243
+ ENV["RACK_ENV"] = "not_production"
244
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
179
245
 
180
246
  config = {}
181
247
  actual = resolve_config(config)
182
- expected = { "adapter" => "postgresql",
183
- "database" => "foo",
184
- "host" => "localhost" }
185
-
186
- assert_equal expected, actual["not_production"]
187
- assert_equal nil, actual["production"]
188
- assert_equal nil, actual["default_env"]
189
- assert_equal nil, actual["development"]
190
- assert_equal nil, actual["test"]
191
- assert_equal nil, actual[:default_env]
192
- assert_equal nil, actual[:not_production]
193
- assert_equal nil, actual[:production]
194
- assert_equal nil, actual[:development]
195
- assert_equal nil, actual[:test]
248
+ expected = {
249
+ adapter: "postgresql",
250
+ database: "foo",
251
+ host: "localhost"
252
+ }
253
+
254
+ assert_equal expected, actual
196
255
  end
197
256
 
198
257
  def test_database_url_with_ipv6_host_and_port
199
- ENV['DATABASE_URL'] = "postgres://[::1]:5454/foo"
258
+ ENV["DATABASE_URL"] = "postgres://[::1]:5454/foo"
200
259
 
201
260
  config = {}
202
261
  actual = resolve_config(config)
203
- expected = { "adapter" => "postgresql",
204
- "database" => "foo",
205
- "host" => "::1",
206
- "port" => 5454 }
207
- assert_equal expected, actual["default_env"]
262
+ expected = {
263
+ adapter: "postgresql",
264
+ database: "foo",
265
+ host: "::1",
266
+ port: 5454
267
+ }
268
+
269
+ assert_equal expected, actual
208
270
  end
209
271
 
210
272
  def test_url_sub_key_with_database_url
211
- ENV['DATABASE_URL'] = "NOT-POSTGRES://localhost/NOT_FOO"
273
+ ENV["DATABASE_URL"] = "NOT-POSTGRES://localhost/NOT_FOO"
212
274
 
213
275
  config = { "default_env" => { "url" => "postgres://localhost/foo" } }
214
276
  actual = resolve_config(config)
215
- expected = { "default_env" =>
216
- { "adapter" => "postgresql",
217
- "database" => "foo",
218
- "host" => "localhost"
219
- }
220
- }
277
+ expected = {
278
+ adapter: "postgresql",
279
+ database: "foo",
280
+ host: "localhost"
281
+ }
282
+
221
283
  assert_equal expected, actual
222
284
  end
223
285
 
286
+ def test_no_url_sub_key_with_database_url_doesnt_trample_other_envs
287
+ ENV["DATABASE_URL"] = "postgres://localhost/baz"
288
+
289
+ config = { "default_env" => { "database" => "foo" }, "other_env" => { "url" => "postgres://foohost/bardb" } }
290
+ expected = {
291
+ default_env: {
292
+ database: "baz",
293
+ adapter: "postgresql",
294
+ host: "localhost"
295
+ },
296
+ other_env: {
297
+ adapter: "postgresql",
298
+ database: "bardb",
299
+ host: "foohost"
300
+ }
301
+ }
302
+
303
+ assert_equal expected[:default_env], resolve_config(config, "default_env")
304
+ assert_equal expected[:other_env], resolve_config(config, "other_env")
305
+ end
306
+
224
307
  def test_merge_no_conflicts_with_database_url
225
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
308
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
226
309
 
227
- config = {"default_env" => { "pool" => "5" } }
310
+ config = { "default_env" => { "pool" => "5" } }
228
311
  actual = resolve_config(config)
229
- expected = { "default_env" =>
230
- { "adapter" => "postgresql",
231
- "database" => "foo",
232
- "host" => "localhost",
233
- "pool" => "5"
234
- }
235
- }
312
+ expected = {
313
+ adapter: "postgresql",
314
+ database: "foo",
315
+ host: "localhost",
316
+ pool: "5"
317
+ }
318
+
236
319
  assert_equal expected, actual
237
320
  end
238
321
 
239
322
  def test_merge_conflicts_with_database_url
240
- ENV['DATABASE_URL'] = "postgres://localhost/foo"
323
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
324
+
325
+ config = { "default_env" => { "adapter" => "NOT-POSTGRES", "database" => "NOT-FOO", "pool" => "5" } }
326
+ actual = resolve_config(config)
327
+ expected = {
328
+ adapter: "postgresql",
329
+ database: "foo",
330
+ host: "localhost",
331
+ pool: "5"
332
+ }
241
333
 
242
- config = {"default_env" => { "adapter" => "NOT-POSTGRES", "database" => "NOT-FOO", "pool" => "5" } }
334
+ assert_equal expected, actual
335
+ end
336
+
337
+ def test_merge_no_conflicts_with_database_url_and_adapter
338
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
339
+
340
+ config = { "default_env" => { "adapter" => "postgresql", "pool" => "5" } }
243
341
  actual = resolve_config(config)
244
- expected = { "default_env" =>
245
- { "adapter" => "postgresql",
246
- "database" => "foo",
247
- "host" => "localhost",
248
- "pool" => "5"
249
- }
250
- }
342
+ expected = {
343
+ adapter: "postgresql",
344
+ database: "foo",
345
+ host: "localhost",
346
+ pool: "5"
347
+ }
348
+
251
349
  assert_equal expected, actual
252
350
  end
351
+
352
+ def test_merge_no_conflicts_with_database_url_and_numeric_pool
353
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
354
+
355
+ config = { "default_env" => { "pool" => 5 } }
356
+ actual = resolve_config(config)
357
+ expected = {
358
+ adapter: "postgresql",
359
+ database: "foo",
360
+ host: "localhost",
361
+ pool: 5
362
+ }
363
+
364
+ assert_equal expected, actual
365
+ end
366
+
367
+ def test_tiered_configs_with_database_url
368
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
369
+
370
+ config = {
371
+ "default_env" => {
372
+ "primary" => { "pool" => 5 },
373
+ "animals" => { "pool" => 5 }
374
+ }
375
+ }
376
+
377
+ configs = ActiveRecord::DatabaseConfigurations.new(config)
378
+ actual = configs.configs_for(env_name: "default_env", name: "primary").configuration_hash
379
+ expected = {
380
+ adapter: "postgresql",
381
+ database: "foo",
382
+ host: "localhost",
383
+ pool: 5
384
+ }
385
+
386
+ assert_equal expected, actual
387
+
388
+ configs = ActiveRecord::DatabaseConfigurations.new(config)
389
+ actual = configs.configs_for(env_name: "default_env", name: "animals").configuration_hash
390
+ expected = { pool: 5 }
391
+
392
+ assert_equal expected, actual
393
+ end
394
+
395
+ def test_separate_database_env_vars
396
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
397
+ ENV["PRIMARY_DATABASE_URL"] = "postgres://localhost/primary"
398
+ ENV["ANIMALS_DATABASE_URL"] = "postgres://localhost/animals"
399
+
400
+ config = {
401
+ "default_env" => {
402
+ "primary" => { "pool" => 5 },
403
+ "animals" => { "pool" => 5 }
404
+ }
405
+ }
406
+
407
+ configs = ActiveRecord::DatabaseConfigurations.new(config)
408
+ actual = configs.configs_for(env_name: "default_env", name: "primary").configuration_hash
409
+ assert_equal "primary", actual[:database]
410
+
411
+ configs = ActiveRecord::DatabaseConfigurations.new(config)
412
+ actual = configs.configs_for(env_name: "default_env", name: "animals").configuration_hash
413
+ assert_equal "animals", actual[:database]
414
+ ensure
415
+ ENV.delete("PRIMARY_DATABASE_URL")
416
+ ENV.delete("ANIMALS_DATABASE_URL")
417
+ end
418
+
419
+ def test_does_not_change_other_environments
420
+ ENV["DATABASE_URL"] = "postgres://localhost/foo"
421
+ config = { "production" => { "adapter" => "not_postgres", "database" => "not_foo", "host" => "localhost" }, "default_env" => {} }
422
+
423
+ actual = resolve_db_config(:production, config)
424
+ assert_equal config["production"].symbolize_keys, actual.configuration_hash
425
+
426
+ actual = resolve_db_config(:default_env, config)
427
+
428
+ assert_equal({
429
+ host: "localhost",
430
+ database: "foo",
431
+ adapter: "postgresql",
432
+ }, actual.configuration_hash)
433
+ end
253
434
  end
254
435
  end
255
436
  end