ibm_db 5.2.0-x86-mingw32 → 5.3.2-x86-mingw32

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