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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ module ActiveRecord
6
+ module ConnectionAdapters
7
+ class PoolConfig
8
+ class ResolverTest < ActiveRecord::TestCase
9
+ def resolve_db_config(pool_config, config = {})
10
+ configs = ActiveRecord::DatabaseConfigurations.new(config)
11
+ configs.resolve(pool_config)
12
+ end
13
+
14
+ def test_url_invalid_adapter
15
+ error = assert_raises(LoadError) do
16
+ Base.connection_handler.establish_connection "ridiculous://foo?encoding=utf8"
17
+ end
18
+
19
+ assert_match "Could not load the 'ridiculous' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile.", error.message
20
+ end
21
+
22
+ def test_error_if_no_adapter_method
23
+ error = assert_raises(AdapterNotFound) do
24
+ Base.connection_handler.establish_connection "abstract://foo?encoding=utf8"
25
+ end
26
+
27
+ assert_match "database configuration specifies nonexistent abstract adapter", error.message
28
+ end
29
+
30
+ # The abstract adapter is used simply to bypass the bit of code that
31
+ # checks that the adapter file can be required in.
32
+
33
+ def test_url_from_environment
34
+ pool_config = resolve_db_config :production, "production" => "abstract://foo?encoding=utf8"
35
+
36
+ assert_equal({
37
+ adapter: "abstract",
38
+ host: "foo",
39
+ encoding: "utf8"
40
+ }, pool_config.configuration_hash)
41
+ end
42
+
43
+ def test_url_sub_key
44
+ pool_config = resolve_db_config :production, "production" => { "url" => "abstract://foo?encoding=utf8" }
45
+
46
+ assert_equal({
47
+ adapter: "abstract",
48
+ host: "foo",
49
+ encoding: "utf8"
50
+ }, pool_config.configuration_hash)
51
+ end
52
+
53
+ def test_url_sub_key_merges_correctly
54
+ hash = { "url" => "abstract://foo?encoding=utf8&", "adapter" => "sqlite3", "host" => "bar", "pool" => "3" }
55
+ pool_config = resolve_db_config :production, "production" => hash
56
+
57
+ assert_equal({
58
+ adapter: "abstract",
59
+ host: "foo",
60
+ encoding: "utf8",
61
+ pool: "3"
62
+ }, pool_config.configuration_hash)
63
+ end
64
+
65
+ def test_url_host_no_db
66
+ pool_config = resolve_db_config "abstract://foo?encoding=utf8"
67
+ assert_equal({
68
+ adapter: "abstract",
69
+ host: "foo",
70
+ encoding: "utf8"
71
+ }, pool_config.configuration_hash)
72
+ end
73
+
74
+ def test_url_missing_scheme
75
+ assert_raises ActiveRecord::DatabaseConfigurations::InvalidConfigurationError do
76
+ resolve_db_config "foo"
77
+ end
78
+ end
79
+
80
+ def test_url_host_db
81
+ pool_config = resolve_db_config "abstract://foo/bar?encoding=utf8"
82
+ assert_equal({
83
+ adapter: "abstract",
84
+ database: "bar",
85
+ host: "foo",
86
+ encoding: "utf8"
87
+ }, pool_config.configuration_hash)
88
+ end
89
+
90
+ def test_url_port
91
+ pool_config = resolve_db_config "abstract://foo:123?encoding=utf8"
92
+
93
+ assert_equal({
94
+ adapter: "abstract",
95
+ port: 123,
96
+ host: "foo",
97
+ encoding: "utf8"
98
+ }, pool_config.configuration_hash)
99
+ end
100
+
101
+ def test_encoded_password
102
+ password = "am@z1ng_p@ssw0rd#!"
103
+ encoded_password = URI.encode_www_form_component(password)
104
+ pool_config = resolve_db_config "abstract://foo:#{encoded_password}@localhost/bar"
105
+
106
+ assert_equal password, pool_config.configuration_hash[:password]
107
+ end
108
+
109
+ def test_url_with_authority_for_sqlite3
110
+ pool_config = resolve_db_config "sqlite3:///foo_test"
111
+
112
+ assert_equal("/foo_test", pool_config.database)
113
+ end
114
+
115
+ def test_url_absolute_path_for_sqlite3
116
+ pool_config = resolve_db_config "sqlite3:/foo_test"
117
+
118
+ assert_equal("/foo_test", pool_config.database)
119
+ end
120
+
121
+ def test_url_relative_path_for_sqlite3
122
+ pool_config = resolve_db_config "sqlite3:foo_test"
123
+
124
+ assert_equal("foo_test", pool_config.database)
125
+ end
126
+
127
+ def test_url_memory_db_for_sqlite3
128
+ pool_config = resolve_db_config "sqlite3::memory:"
129
+ assert_equal(":memory:", pool_config.database)
130
+ end
131
+
132
+ def test_url_sub_key_for_sqlite3
133
+ pool_config = resolve_db_config :production, "production" => { "url" => "sqlite3:foo?encoding=utf8" }
134
+
135
+ assert_equal({
136
+ adapter: "sqlite3",
137
+ database: "foo",
138
+ encoding: "utf8"
139
+ }, pool_config.configuration_hash)
140
+ end
141
+
142
+ def test_pool_config_with_invalid_type
143
+ assert_raises TypeError do
144
+ Base.connection_handler.establish_connection(Object.new)
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ class DatabaseConfigurationsTest < ActiveRecord::TestCase
6
+ unless in_memory_db?
7
+ def test_empty_returns_true_when_db_configs_are_empty
8
+ old_config = ActiveRecord::Base.configurations
9
+ config = {}
10
+
11
+ ActiveRecord::Base.configurations = config
12
+
13
+ assert_predicate ActiveRecord::Base.configurations, :empty?
14
+ assert_predicate ActiveRecord::Base.configurations, :blank?
15
+ ensure
16
+ ActiveRecord::Base.configurations = old_config
17
+ ActiveRecord::Base.establish_connection :arunit
18
+ end
19
+ end
20
+
21
+ def test_configs_for_getter_with_env_name
22
+ configs = ActiveRecord::Base.configurations.configs_for(env_name: "arunit")
23
+
24
+ assert_equal 1, configs.size
25
+ assert_equal ["arunit"], configs.map(&:env_name)
26
+ end
27
+
28
+ def test_configs_for_getter_with_name
29
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "arunit2"
30
+
31
+ config = ActiveRecord::Base.configurations.configs_for(name: "primary")
32
+
33
+ assert_equal "arunit2", config.env_name
34
+ assert_equal "primary", config.name
35
+ ensure
36
+ ENV["RAILS_ENV"] = previous_env
37
+ end
38
+
39
+ def test_configs_for_getter_with_env_and_name
40
+ config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
41
+
42
+ assert_equal "arunit", config.env_name
43
+ assert_equal "primary", config.name
44
+ end
45
+
46
+ def test_default_hash_returns_config_hash_from_default_env
47
+ original_rails_env = ENV["RAILS_ENV"]
48
+ ENV["RAILS_ENV"] = "arunit"
49
+
50
+ assert_deprecated do
51
+ assert_equal ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary").configuration_hash, ActiveRecord::Base.configurations.default_hash
52
+ end
53
+ ensure
54
+ ENV["RAILS_ENV"] = original_rails_env
55
+ end
56
+
57
+ def test_find_db_config_returns_first_config_for_env
58
+ config = ActiveRecord::DatabaseConfigurations.new({
59
+ "test" => {
60
+ "config_1" => {
61
+ "database" => "db"
62
+ },
63
+ "config_2" => {
64
+ "database" => "db"
65
+ },
66
+ "config_3" => {
67
+ "database" => "db"
68
+ },
69
+ }
70
+ })
71
+
72
+ assert_equal "config_1", config.find_db_config("test").name
73
+ end
74
+
75
+ def test_find_db_config_returns_a_db_config_object_for_the_given_env
76
+ config = ActiveRecord::Base.configurations.find_db_config("arunit2")
77
+
78
+ assert_equal "arunit2", config.env_name
79
+ assert_equal "primary", config.name
80
+ end
81
+
82
+ def test_find_db_config_prioritize_db_config_object_for_the_current_env
83
+ config = ActiveRecord::DatabaseConfigurations.new({
84
+ "primary" => {
85
+ "adapter" => "randomadapter"
86
+ },
87
+ ActiveRecord::ConnectionHandling::DEFAULT_ENV.call => {
88
+ "primary" => {
89
+ "adapter" => "sqlite3",
90
+ "database" => ":memory:"
91
+ }
92
+ }
93
+ }).find_db_config("primary")
94
+
95
+ assert_equal "primary", config.name
96
+ assert_equal ActiveRecord::ConnectionHandling::DEFAULT_ENV.call, config.env_name
97
+ assert_equal ":memory:", config.database
98
+ end
99
+
100
+ def test_to_h_turns_db_config_object_back_into_a_hash_and_is_deprecated
101
+ configs = ActiveRecord::Base.configurations
102
+ assert_equal "ActiveRecord::DatabaseConfigurations", configs.class.name
103
+ assert_deprecated do
104
+ assert_equal "Hash", configs.to_h.class.name
105
+ assert_equal ["arunit", "arunit2", "arunit_without_prepared_statements"], ActiveRecord::Base.configurations.to_h.keys.sort
106
+ end
107
+ end
108
+ end
109
+
110
+ class LegacyDatabaseConfigurationsTest < ActiveRecord::TestCase
111
+ def test_can_turn_configurations_into_a_hash_and_is_deprecated
112
+ assert_deprecated do
113
+ assert ActiveRecord::Base.configurations.to_h.is_a?(Hash), "expected to be a hash but was not."
114
+ assert_equal ["arunit", "arunit2", "arunit_without_prepared_statements"].sort, ActiveRecord::Base.configurations.to_h.keys.sort
115
+ end
116
+ end
117
+
118
+ def test_deprecated_config_method
119
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
120
+
121
+ assert_equal db_config.configuration_hash.stringify_keys, assert_deprecated { db_config.config }
122
+ end
123
+
124
+ def test_unsupported_method_raises
125
+ assert_raises NoMethodError do
126
+ ActiveRecord::Base.configurations.fetch(:foo)
127
+ end
128
+ end
129
+
130
+ def test_spec_name_in_configs_for_is_deprecated
131
+ assert_deprecated do
132
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
133
+
134
+ assert_equal "primary", db_config.name
135
+ end
136
+ end
137
+
138
+ def test_spec_name_getter_is_deprecated
139
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
140
+
141
+ assert_deprecated do
142
+ assert_equal "primary", db_config.spec_name
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,296 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/person"
5
+ require "action_dispatch"
6
+
7
+ module ActiveRecord
8
+ class DatabaseSelectorTest < ActiveRecord::TestCase
9
+ setup do
10
+ @session_store = {}
11
+ @session = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session.new(@session_store)
12
+ end
13
+
14
+ teardown do
15
+ clean_up_connection_handler
16
+ end
17
+
18
+ def test_empty_session
19
+ assert_equal Time.at(0), @session.last_write_timestamp
20
+ end
21
+
22
+ def test_writing_the_session_timestamps
23
+ assert @session.update_last_write_timestamp
24
+
25
+ session2 = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session.new(@session_store)
26
+ assert_equal @session.last_write_timestamp, session2.last_write_timestamp
27
+ end
28
+
29
+ def test_writing_session_time_changes
30
+ assert @session.update_last_write_timestamp
31
+
32
+ before = @session.last_write_timestamp
33
+ sleep(0.1)
34
+
35
+ assert @session.update_last_write_timestamp
36
+ assert_not_equal before, @session.last_write_timestamp
37
+ end
38
+
39
+ def test_read_from_replicas
40
+ @session_store[:last_write] = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session.convert_time_to_timestamp(Time.now - 5.seconds)
41
+
42
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session)
43
+
44
+ called = false
45
+ resolver.read do
46
+ called = true
47
+ assert ActiveRecord::Base.connected_to?(role: :reading)
48
+ end
49
+ assert called
50
+ end
51
+
52
+ unless in_memory_db?
53
+ def test_can_write_while_reading_from_replicas_if_explicit
54
+ @session_store[:last_write] = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session.convert_time_to_timestamp(Time.now - 5.seconds)
55
+
56
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session)
57
+
58
+ called = false
59
+ resolver.read do
60
+ ActiveRecord::Base.establish_connection :arunit
61
+
62
+ called = true
63
+
64
+ assert ActiveRecord::Base.connected_to?(role: :reading)
65
+ assert_predicate ActiveRecord::Base.connection, :preventing_writes?
66
+
67
+ ActiveRecord::Base.connected_to(role: :writing, prevent_writes: false) do
68
+ assert ActiveRecord::Base.connected_to?(role: :writing)
69
+ assert_not_predicate ActiveRecord::Base.connection, :preventing_writes?
70
+ end
71
+
72
+ assert ActiveRecord::Base.connected_to?(role: :reading)
73
+ assert_predicate ActiveRecord::Base.connection, :preventing_writes?
74
+ end
75
+ assert called
76
+ end
77
+ end
78
+
79
+ def test_read_from_primary
80
+ @session_store[:last_write] = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session.convert_time_to_timestamp(Time.now)
81
+
82
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session)
83
+
84
+ called = false
85
+ resolver.read do
86
+ called = true
87
+ assert ActiveRecord::Base.connected_to?(role: :writing)
88
+ end
89
+ assert called
90
+ end
91
+
92
+ def test_write_to_primary
93
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session)
94
+
95
+ # Session should start empty
96
+ assert_nil @session_store[:last_write]
97
+
98
+ called = false
99
+ resolver.write do
100
+ assert ActiveRecord::Base.connected_to?(role: :writing)
101
+ called = true
102
+ end
103
+ assert called
104
+
105
+ # and be populated by the last write time
106
+ assert @session_store[:last_write]
107
+ end
108
+
109
+ def test_write_to_primary_and_update_custom_context
110
+ custom_context = Class.new(ActiveRecord::Middleware::DatabaseSelector::Resolver::Session) do
111
+ def update_last_write_timestamp
112
+ super
113
+ @wrote_to_primary = true
114
+ end
115
+
116
+ def save(response)
117
+ response[:wrote_to_primary] = @wrote_to_primary
118
+ end
119
+ end
120
+
121
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(custom_context.new(@session_store))
122
+
123
+ # Session should start empty
124
+ assert_nil @session_store[:last_write]
125
+
126
+ called = false
127
+ resolver.write do
128
+ assert ActiveRecord::Base.connected_to?(role: :writing)
129
+ called = true
130
+ end
131
+ assert called
132
+ response = {}
133
+ resolver.update_context(response)
134
+
135
+ # and be populated by the last write time
136
+ assert @session_store[:last_write]
137
+ # plus the response updated
138
+ assert response[:wrote_to_primary]
139
+ end
140
+
141
+ def test_write_to_primary_with_exception
142
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session)
143
+
144
+ # Session should start empty
145
+ assert_nil @session_store[:last_write]
146
+
147
+ called = false
148
+ assert_raises(ActiveRecord::RecordNotFound) do
149
+ resolver.write do
150
+ assert ActiveRecord::Base.connected_to?(role: :writing)
151
+ called = true
152
+ raise ActiveRecord::RecordNotFound
153
+ end
154
+ end
155
+ assert called
156
+
157
+ # and be populated by the last write time
158
+ assert @session_store[:last_write]
159
+ end
160
+
161
+ def test_read_from_primary_with_options
162
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session, delay: 5.seconds)
163
+
164
+ # Session should start empty
165
+ assert_nil @session_store[:last_write]
166
+
167
+ called = false
168
+ resolver.write do
169
+ assert ActiveRecord::Base.connected_to?(role: :writing)
170
+ called = true
171
+ end
172
+ assert called
173
+
174
+ # and be populated by the last write time
175
+ assert @session_store[:last_write]
176
+
177
+ read = false
178
+ resolver.read do
179
+ assert ActiveRecord::Base.connected_to?(role: :writing)
180
+ read = true
181
+ end
182
+ assert read
183
+ end
184
+
185
+ def test_preventing_writes_turns_off_for_primary_write
186
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session, delay: 5.seconds)
187
+
188
+ # Session should start empty
189
+ assert_nil @session_store[:last_write]
190
+
191
+ called = false
192
+ resolver.write do
193
+ assert ActiveRecord::Base.connected_to?(role: :writing)
194
+ called = true
195
+ end
196
+ assert called
197
+
198
+ # and be populated by the last write time
199
+ assert @session_store[:last_write]
200
+
201
+ read = false
202
+ write = false
203
+ resolver.read do
204
+ assert ActiveRecord::Base.connected_to?(role: :writing)
205
+ assert_predicate ActiveRecord::Base.connection, :preventing_writes?
206
+ read = true
207
+
208
+ resolver.write do
209
+ assert ActiveRecord::Base.connected_to?(role: :writing)
210
+ assert_not_predicate ActiveRecord::Base.connection, :preventing_writes?
211
+ write = true
212
+ end
213
+ end
214
+
215
+ assert write
216
+ assert read
217
+ end
218
+
219
+ def test_preventing_writes_works_in_a_threaded_environment
220
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session, delay: 5.seconds)
221
+ inside_preventing = Concurrent::Event.new
222
+ finished_checking = Concurrent::Event.new
223
+
224
+ @session.update_last_write_timestamp
225
+
226
+ t1 = Thread.new do
227
+ resolver.read do
228
+ inside_preventing.wait
229
+ assert ActiveRecord::Base.connected_to?(role: :writing)
230
+ assert_predicate ActiveRecord::Base.connection, :preventing_writes?
231
+ finished_checking.set
232
+ end
233
+ end
234
+
235
+ t2 = Thread.new do
236
+ resolver.write do
237
+ assert ActiveRecord::Base.connected_to?(role: :writing)
238
+ assert_not_predicate ActiveRecord::Base.connection, :preventing_writes?
239
+ inside_preventing.set
240
+ finished_checking.wait
241
+ end
242
+ end
243
+
244
+ t3 = Thread.new do
245
+ resolver.read do
246
+ assert ActiveRecord::Base.connected_to?(role: :writing)
247
+ assert_predicate ActiveRecord::Base.connection, :preventing_writes?
248
+ end
249
+ end
250
+
251
+ t1.join
252
+ t2.join
253
+ t3.join
254
+ end
255
+
256
+ def test_read_from_replica_with_no_delay
257
+ resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session, delay: 0.seconds)
258
+
259
+ # Session should start empty
260
+ assert_nil @session_store[:last_write]
261
+
262
+ called = false
263
+ resolver.write do
264
+ assert ActiveRecord::Base.connected_to?(role: :writing)
265
+ called = true
266
+ end
267
+ assert called
268
+
269
+ # and be populated by the last write time
270
+ assert @session_store[:last_write]
271
+
272
+ read = false
273
+ resolver.read do
274
+ assert ActiveRecord::Base.connected_to?(role: :reading)
275
+ read = true
276
+ end
277
+ assert read
278
+ end
279
+
280
+ def test_the_middleware_chooses_writing_role_with_POST_request
281
+ middleware = ActiveRecord::Middleware::DatabaseSelector.new(lambda { |env|
282
+ assert ActiveRecord::Base.connected_to?(role: :writing)
283
+ [200, {}, ["body"]]
284
+ })
285
+ assert_equal [200, {}, ["body"]], middleware.call("REQUEST_METHOD" => "POST")
286
+ end
287
+
288
+ def test_the_middleware_chooses_reading_role_with_GET_request
289
+ middleware = ActiveRecord::Middleware::DatabaseSelector.new(lambda { |env|
290
+ assert ActiveRecord::Base.connected_to?(role: :reading)
291
+ [200, {}, ["body"]]
292
+ })
293
+ assert_equal [200, {}, ["body"]], middleware.call("REQUEST_METHOD" => "GET")
294
+ end
295
+ end
296
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  class DatabaseStatementsTest < ActiveRecord::TestCase
@@ -5,6 +7,13 @@ class DatabaseStatementsTest < ActiveRecord::TestCase
5
7
  @connection = ActiveRecord::Base.connection
6
8
  end
7
9
 
10
+ unless current_adapter?(:OracleAdapter)
11
+ def test_exec_insert
12
+ result = @connection.exec_insert("INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)", nil, [])
13
+ assert_not_nil @connection.send(:last_inserted_id, result)
14
+ end
15
+ end
16
+
8
17
  def test_insert_should_return_the_inserted_id
9
18
  assert_not_nil return_the_inserted_id(method: :insert)
10
19
  end
@@ -13,22 +22,15 @@ class DatabaseStatementsTest < ActiveRecord::TestCase
13
22
  assert_not_nil return_the_inserted_id(method: :create)
14
23
  end
15
24
 
16
- def test_insert_update_delete_sql_is_deprecated
17
- assert_deprecated { @connection.insert_sql("INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)") }
18
- assert_deprecated { @connection.update_sql("UPDATE accounts SET credit_limit = 6000 WHERE firm_id = 42") }
19
- assert_deprecated { @connection.delete_sql("DELETE FROM accounts WHERE firm_id = 42") }
20
- end
21
-
22
25
  private
23
-
24
- def return_the_inserted_id(method:)
25
- # Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
26
- if current_adapter?(:OracleAdapter)
27
- sequence_name = "accounts_seq"
28
- id_value = @connection.next_sequence_value(sequence_name)
29
- @connection.send(method, "INSERT INTO accounts (id, firm_id,credit_limit) VALUES (accounts_seq.nextval,42,5000)", nil, :id, id_value, sequence_name)
30
- else
31
- @connection.send(method, "INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)")
26
+ def return_the_inserted_id(method:)
27
+ # Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
28
+ if current_adapter?(:OracleAdapter)
29
+ sequence_name = "accounts_seq"
30
+ id_value = @connection.next_sequence_value(sequence_name)
31
+ @connection.send(method, "INSERT INTO accounts (id, firm_id,credit_limit) VALUES (accounts_seq.nextval,42,5000)", nil, :id, id_value, sequence_name)
32
+ else
33
+ @connection.send(method, "INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)")
34
+ end
32
35
  end
33
- end
34
36
  end
@@ -1,5 +1,7 @@
1
- require 'cases/helper'
2
- require 'models/topic'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/topic"
3
5
 
4
6
  class DateTest < ActiveRecord::TestCase
5
7
  def test_date_with_time_value
@@ -9,7 +11,7 @@ class DateTest < ActiveRecord::TestCase
9
11
  end
10
12
 
11
13
  def test_date_with_string_value
12
- string_value = '2016-05-11 19:00:00'
14
+ string_value = "2016-05-11 19:00:00"
13
15
  topic = Topic.create(last_read: string_value)
14
16
  assert_equal topic, Topic.find_by(last_read: string_value)
15
17
  end
@@ -21,23 +23,13 @@ class DateTest < ActiveRecord::TestCase
21
23
 
22
24
  valid_dates.each do |date_src|
23
25
  topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
24
- # Oracle DATE columns are datetime columns and Oracle adapter returns Time value
25
- if current_adapter?(:OracleAdapter)
26
- assert_equal(topic.last_read.to_date, Date.new(*date_src))
27
- else
28
- assert_equal(topic.last_read, Date.new(*date_src))
29
- end
26
+ assert_equal(topic.last_read, Date.new(*date_src))
30
27
  end
31
28
 
32
29
  invalid_dates.each do |date_src|
33
30
  assert_nothing_raised do
34
- topic = Topic.new({"last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s})
35
- # Oracle DATE columns are datetime columns and Oracle adapter returns Time value
36
- if current_adapter?(:OracleAdapter)
37
- assert_equal(topic.last_read.to_date, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
38
- else
39
- assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
40
- end
31
+ topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
32
+ assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
41
33
  end
42
34
  end
43
35
  end