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
@@ -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