ibm_db 5.6.1-arm64-darwin-24

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 (753) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +299 -0
  3. data/LICENSE +55 -0
  4. data/MANIFEST +14 -0
  5. data/ParameterizedQueries README +39 -0
  6. data/README +210 -0
  7. data/ext/Makefile +270 -0
  8. data/ext/Makefile.nt32 +181 -0
  9. data/ext/Makefile.nt32.191 +212 -0
  10. data/ext/extconf.rb +320 -0
  11. data/ext/gil_release_version.h +3 -0
  12. data/ext/ibm_db.bundle +0 -0
  13. data/ext/ibm_db.c +11865 -0
  14. data/ext/ibm_db.o +0 -0
  15. data/ext/mkmf.log +98 -0
  16. data/ext/ruby_ibm_db.h +241 -0
  17. data/ext/ruby_ibm_db_cli.c +867 -0
  18. data/ext/ruby_ibm_db_cli.h +508 -0
  19. data/ext/ruby_ibm_db_cli.o +0 -0
  20. data/ext/unicode_support_version.h +3 -0
  21. data/init.rb +42 -0
  22. data/lib/IBM_DB.rb +27 -0
  23. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4407 -0
  24. data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1965 -0
  25. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -0
  26. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -0
  27. data/lib/ibm_db.bundle +0 -0
  28. data/test/active_record/connection_adapters/fake_adapter.rb +52 -0
  29. data/test/activejob/destroy_association_async_test.rb +305 -0
  30. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  31. data/test/activejob/helper.rb +15 -0
  32. data/test/assets/example.log +1 -0
  33. data/test/assets/flowers.jpg +0 -0
  34. data/test/assets/schema_dump_5_1.yml +345 -0
  35. data/test/assets/test.txt +1 -0
  36. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  37. data/test/cases/adapter_test.rb +565 -0
  38. data/test/cases/adapters/mysql2/active_schema_test.rb +203 -0
  39. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  40. data/test/cases/adapters/mysql2/bind_parameter_test.rb +52 -0
  41. data/test/cases/adapters/mysql2/boolean_test.rb +102 -0
  42. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +65 -0
  43. data/test/cases/adapters/mysql2/charset_collation_test.rb +57 -0
  44. data/test/cases/adapters/mysql2/connection_test.rb +208 -0
  45. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  46. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +49 -0
  47. data/test/cases/adapters/mysql2/enum_test.rb +47 -0
  48. data/test/cases/adapters/mysql2/explain_test.rb +23 -0
  49. data/test/cases/adapters/mysql2/json_test.rb +24 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  51. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +238 -0
  52. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  53. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  54. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  55. data/test/cases/adapters/mysql2/schema_migrations_test.rb +64 -0
  56. data/test/cases/adapters/mysql2/schema_test.rb +128 -0
  57. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  58. data/test/cases/adapters/mysql2/sp_test.rb +38 -0
  59. data/test/cases/adapters/mysql2/sql_types_test.rb +16 -0
  60. data/test/cases/adapters/mysql2/table_options_test.rb +125 -0
  61. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  62. data/test/cases/adapters/mysql2/unsigned_type_test.rb +68 -0
  63. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  64. data/test/cases/adapters/postgresql/active_schema_test.rb +113 -0
  65. data/test/cases/adapters/postgresql/array_test.rb +394 -0
  66. data/test/cases/adapters/postgresql/bit_string_test.rb +84 -0
  67. data/test/cases/adapters/postgresql/bytea_test.rb +135 -0
  68. data/test/cases/adapters/postgresql/case_insensitive_test.rb +27 -0
  69. data/test/cases/adapters/postgresql/change_schema_test.rb +40 -0
  70. data/test/cases/adapters/postgresql/cidr_test.rb +27 -0
  71. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  72. data/test/cases/adapters/postgresql/collation_test.rb +55 -0
  73. data/test/cases/adapters/postgresql/composite_test.rb +134 -0
  74. data/test/cases/adapters/postgresql/connection_test.rb +245 -0
  75. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  76. data/test/cases/adapters/postgresql/datatype_test.rb +89 -0
  77. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  78. data/test/cases/adapters/postgresql/domain_test.rb +49 -0
  79. data/test/cases/adapters/postgresql/enum_test.rb +93 -0
  80. data/test/cases/adapters/postgresql/explain_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/extension_migration_test.rb +64 -0
  82. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  83. data/test/cases/adapters/postgresql/full_text_test.rb +46 -0
  84. data/test/cases/adapters/postgresql/geometric_test.rb +372 -0
  85. data/test/cases/adapters/postgresql/hstore_test.rb +390 -0
  86. data/test/cases/adapters/postgresql/infinity_test.rb +108 -0
  87. data/test/cases/adapters/postgresql/integer_test.rb +27 -0
  88. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  89. data/test/cases/adapters/postgresql/json_test.rb +52 -0
  90. data/test/cases/adapters/postgresql/ltree_test.rb +51 -0
  91. data/test/cases/adapters/postgresql/money_test.rb +127 -0
  92. data/test/cases/adapters/postgresql/network_test.rb +102 -0
  93. data/test/cases/adapters/postgresql/numbers_test.rb +51 -0
  94. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  95. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  96. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  97. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +447 -0
  98. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  99. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  100. data/test/cases/adapters/postgresql/quoting_test.rb +50 -0
  101. data/test/cases/adapters/postgresql/range_test.rb +457 -0
  102. data/test/cases/adapters/postgresql/referential_integrity_test.rb +112 -0
  103. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -0
  104. data/test/cases/adapters/postgresql/schema_authorization_test.rb +110 -0
  105. data/test/cases/adapters/postgresql/schema_test.rb +713 -0
  106. data/test/cases/adapters/postgresql/serial_test.rb +156 -0
  107. data/test/cases/adapters/postgresql/statement_pool_test.rb +61 -0
  108. data/test/cases/adapters/postgresql/timestamp_test.rb +92 -0
  109. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  110. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  111. data/test/cases/adapters/postgresql/type_lookup_test.rb +35 -0
  112. data/test/cases/adapters/postgresql/utils_test.rb +64 -0
  113. data/test/cases/adapters/postgresql/uuid_test.rb +411 -0
  114. data/test/cases/adapters/postgresql/xml_test.rb +50 -0
  115. data/test/cases/adapters/sqlite3/collation_test.rb +64 -0
  116. data/test/cases/adapters/sqlite3/copy_table_test.rb +101 -0
  117. data/test/cases/adapters/sqlite3/explain_test.rb +23 -0
  118. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  119. data/test/cases/adapters/sqlite3/quoting_test.rb +79 -0
  120. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  121. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +628 -0
  122. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  123. data/test/cases/adapters/sqlite3/statement_pool_test.rb +21 -0
  124. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  125. data/test/cases/aggregations_test.rb +170 -0
  126. data/test/cases/annotate_test.rb +46 -0
  127. data/test/cases/ar_schema_test.rb +213 -0
  128. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  129. data/test/cases/arel/attributes/math_test.rb +83 -0
  130. data/test/cases/arel/attributes_test.rb +27 -0
  131. data/test/cases/arel/collectors/bind_test.rb +40 -0
  132. data/test/cases/arel/collectors/composite_test.rb +47 -0
  133. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  134. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  135. data/test/cases/arel/crud_test.rb +65 -0
  136. data/test/cases/arel/delete_manager_test.rb +53 -0
  137. data/test/cases/arel/factory_methods_test.rb +46 -0
  138. data/test/cases/arel/helper.rb +45 -0
  139. data/test/cases/arel/insert_manager_test.rb +241 -0
  140. data/test/cases/arel/nodes/and_test.rb +30 -0
  141. data/test/cases/arel/nodes/as_test.rb +36 -0
  142. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  143. data/test/cases/arel/nodes/bin_test.rb +35 -0
  144. data/test/cases/arel/nodes/binary_test.rb +29 -0
  145. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  146. data/test/cases/arel/nodes/case_test.rb +96 -0
  147. data/test/cases/arel/nodes/casted_test.rb +18 -0
  148. data/test/cases/arel/nodes/comment_test.rb +22 -0
  149. data/test/cases/arel/nodes/count_test.rb +35 -0
  150. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  151. data/test/cases/arel/nodes/descending_test.rb +46 -0
  152. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  153. data/test/cases/arel/nodes/equality_test.rb +62 -0
  154. data/test/cases/arel/nodes/extract_test.rb +43 -0
  155. data/test/cases/arel/nodes/false_test.rb +21 -0
  156. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  157. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  158. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  159. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  160. data/test/cases/arel/nodes/node_test.rb +22 -0
  161. data/test/cases/arel/nodes/not_test.rb +31 -0
  162. data/test/cases/arel/nodes/or_test.rb +36 -0
  163. data/test/cases/arel/nodes/over_test.rb +69 -0
  164. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  165. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  166. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  167. data/test/cases/arel/nodes/sum_test.rb +35 -0
  168. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  169. data/test/cases/arel/nodes/true_test.rb +21 -0
  170. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  171. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  172. data/test/cases/arel/nodes/window_test.rb +81 -0
  173. data/test/cases/arel/nodes_test.rb +34 -0
  174. data/test/cases/arel/select_manager_test.rb +1238 -0
  175. data/test/cases/arel/support/fake_record.rb +135 -0
  176. data/test/cases/arel/table_test.rb +216 -0
  177. data/test/cases/arel/update_manager_test.rb +126 -0
  178. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  179. data/test/cases/arel/visitors/dot_test.rb +90 -0
  180. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  181. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  182. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  183. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  184. data/test/cases/associations/association_scope_test.rb +16 -0
  185. data/test/cases/associations/belongs_to_associations_test.rb +1493 -0
  186. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +43 -0
  187. data/test/cases/associations/callbacks_test.rb +208 -0
  188. data/test/cases/associations/cascaded_eager_loading_test.rb +245 -0
  189. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +156 -0
  190. data/test/cases/associations/eager_load_nested_include_test.rb +127 -0
  191. data/test/cases/associations/eager_singularization_test.rb +148 -0
  192. data/test/cases/associations/eager_test.rb +1658 -0
  193. data/test/cases/associations/extension_test.rb +93 -0
  194. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1025 -0
  195. data/test/cases/associations/has_many_associations_test.rb +3074 -0
  196. data/test/cases/associations/has_many_through_associations_test.rb +1580 -0
  197. data/test/cases/associations/has_one_associations_test.rb +872 -0
  198. data/test/cases/associations/has_one_through_associations_test.rb +429 -0
  199. data/test/cases/associations/inner_join_association_test.rb +215 -0
  200. data/test/cases/associations/inverse_associations_test.rb +941 -0
  201. data/test/cases/associations/join_model_test.rb +787 -0
  202. data/test/cases/associations/left_outer_join_association_test.rb +123 -0
  203. data/test/cases/associations/nested_through_associations_test.rb +636 -0
  204. data/test/cases/associations/required_test.rb +127 -0
  205. data/test/cases/associations_test.rb +516 -0
  206. data/test/cases/attribute_decorators_test.rb +126 -0
  207. data/test/cases/attribute_methods/read_test.rb +60 -0
  208. data/test/cases/attribute_methods_test.rb +1124 -0
  209. data/test/cases/attribute_set_test.rb +270 -0
  210. data/test/cases/attribute_test.rb +246 -0
  211. data/test/cases/attributes_test.rb +371 -0
  212. data/test/cases/autosave_association_test.rb +1953 -0
  213. data/test/cases/base_prevent_writes_test.rb +229 -0
  214. data/test/cases/base_test.rb +1770 -0
  215. data/test/cases/batches_test.rb +695 -0
  216. data/test/cases/binary_test.rb +39 -0
  217. data/test/cases/bind_parameter_test.rb +283 -0
  218. data/test/cases/boolean_test.rb +52 -0
  219. data/test/cases/cache_key_test.rb +131 -0
  220. data/test/cases/calculations_test.rb +1361 -0
  221. data/test/cases/callbacks_test.rb +503 -0
  222. data/test/cases/clone_test.rb +45 -0
  223. data/test/cases/coders/json_test.rb +17 -0
  224. data/test/cases/coders/yaml_column_test.rb +66 -0
  225. data/test/cases/collection_cache_key_test.rb +272 -0
  226. data/test/cases/column_alias_test.rb +19 -0
  227. data/test/cases/column_definition_test.rb +34 -0
  228. data/test/cases/comment_test.rb +204 -0
  229. data/test/cases/connection_adapters/adapter_leasing_test.rb +60 -0
  230. data/test/cases/connection_adapters/connection_handler_test.rb +467 -0
  231. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  232. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  233. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  234. data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
  235. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  236. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  237. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  238. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +436 -0
  239. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +81 -0
  240. data/test/cases/connection_adapters/quoting_test.rb +13 -0
  241. data/test/cases/connection_adapters/schema_cache_test.rb +294 -0
  242. data/test/cases/connection_adapters/type_lookup_test.rb +119 -0
  243. data/test/cases/connection_management_test.rb +114 -0
  244. data/test/cases/connection_pool_test.rb +754 -0
  245. data/test/cases/connection_specification/resolver_test.rb +131 -0
  246. data/test/cases/core_test.rb +136 -0
  247. data/test/cases/counter_cache_test.rb +368 -0
  248. data/test/cases/custom_locking_test.rb +19 -0
  249. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  250. data/test/cases/database_configurations/resolver_test.rb +150 -0
  251. data/test/cases/database_configurations_test.rb +145 -0
  252. data/test/cases/database_selector_test.rb +296 -0
  253. data/test/cases/database_statements_test.rb +36 -0
  254. data/test/cases/date_test.rb +36 -0
  255. data/test/cases/date_time_precision_test.rb +129 -0
  256. data/test/cases/date_time_test.rb +76 -0
  257. data/test/cases/defaults_test.rb +254 -0
  258. data/test/cases/delegated_type_test.rb +57 -0
  259. data/test/cases/dirty_test.rb +959 -0
  260. data/test/cases/disconnected_test.rb +30 -0
  261. data/test/cases/dup_test.rb +184 -0
  262. data/test/cases/enum_test.rb +823 -0
  263. data/test/cases/errors_test.rb +16 -0
  264. data/test/cases/explain_subscriber_test.rb +66 -0
  265. data/test/cases/explain_test.rb +79 -0
  266. data/test/cases/filter_attributes_test.rb +153 -0
  267. data/test/cases/finder_respond_to_test.rb +60 -0
  268. data/test/cases/finder_test.rb +1676 -0
  269. data/test/cases/fixture_set/file_test.rb +152 -0
  270. data/test/cases/fixtures_test.rb +1645 -0
  271. data/test/cases/forbidden_attributes_protection_test.rb +130 -0
  272. data/test/cases/habtm_destroy_order_test.rb +61 -0
  273. data/test/cases/helper.rb +233 -0
  274. data/test/cases/hot_compatibility_test.rb +143 -0
  275. data/test/cases/i18n_test.rb +46 -0
  276. data/test/cases/inheritance_test.rb +671 -0
  277. data/test/cases/insert_all_test.rb +489 -0
  278. data/test/cases/instrumentation_test.rb +101 -0
  279. data/test/cases/integration_test.rb +243 -0
  280. data/test/cases/invalid_connection_test.rb +26 -0
  281. data/test/cases/invertible_migration_test.rb +527 -0
  282. data/test/cases/json_attribute_test.rb +35 -0
  283. data/test/cases/json_serialization_test.rb +310 -0
  284. data/test/cases/json_shared_test_cases.rb +290 -0
  285. data/test/cases/locking_test.rb +787 -0
  286. data/test/cases/log_subscriber_test.rb +267 -0
  287. data/test/cases/marshal_serialization_test.rb +39 -0
  288. data/test/cases/migration/change_schema_test.rb +504 -0
  289. data/test/cases/migration/change_table_test.rb +364 -0
  290. data/test/cases/migration/check_constraint_test.rb +162 -0
  291. data/test/cases/migration/column_attributes_test.rb +186 -0
  292. data/test/cases/migration/column_positioning_test.rb +68 -0
  293. data/test/cases/migration/columns_test.rb +326 -0
  294. data/test/cases/migration/command_recorder_test.rb +437 -0
  295. data/test/cases/migration/compatibility_test.rb +673 -0
  296. data/test/cases/migration/create_join_table_test.rb +167 -0
  297. data/test/cases/migration/foreign_key_test.rb +581 -0
  298. data/test/cases/migration/helper.rb +40 -0
  299. data/test/cases/migration/index_test.rb +267 -0
  300. data/test/cases/migration/logger_test.rb +39 -0
  301. data/test/cases/migration/pending_migrations_test.rb +106 -0
  302. data/test/cases/migration/references_foreign_key_test.rb +235 -0
  303. data/test/cases/migration/references_index_test.rb +120 -0
  304. data/test/cases/migration/references_statements_test.rb +137 -0
  305. data/test/cases/migration/rename_table_test.rb +116 -0
  306. data/test/cases/migration_test.rb +1525 -0
  307. data/test/cases/migrator_test.rb +527 -0
  308. data/test/cases/mixin_test.rb +64 -0
  309. data/test/cases/modules_test.rb +174 -0
  310. data/test/cases/multi_db_migrator_test.rb +223 -0
  311. data/test/cases/multiparameter_attributes_test.rb +399 -0
  312. data/test/cases/multiple_db_test.rb +116 -0
  313. data/test/cases/nested_attributes_test.rb +1119 -0
  314. data/test/cases/nested_attributes_with_callbacks_test.rb +146 -0
  315. data/test/cases/null_relation_test.rb +84 -0
  316. data/test/cases/numeric_data_test.rb +93 -0
  317. data/test/cases/persistence_test.rb +1093 -0
  318. data/test/cases/pooled_connections_test.rb +73 -0
  319. data/test/cases/prepared_statement_status_test.rb +48 -0
  320. data/test/cases/primary_keys_test.rb +482 -0
  321. data/test/cases/query_cache_test.rb +915 -0
  322. data/test/cases/quoting_test.rb +303 -0
  323. data/test/cases/readonly_test.rb +120 -0
  324. data/test/cases/reaper_test.rb +199 -0
  325. data/test/cases/reflection_test.rb +520 -0
  326. data/test/cases/relation/delegation_test.rb +76 -0
  327. data/test/cases/relation/delete_all_test.rb +117 -0
  328. data/test/cases/relation/merging_test.rb +434 -0
  329. data/test/cases/relation/mutation_test.rb +145 -0
  330. data/test/cases/relation/or_test.rb +192 -0
  331. data/test/cases/relation/predicate_builder_test.rb +31 -0
  332. data/test/cases/relation/record_fetch_warning_test.rb +42 -0
  333. data/test/cases/relation/select_test.rb +67 -0
  334. data/test/cases/relation/update_all_test.rb +317 -0
  335. data/test/cases/relation/where_chain_test.rb +141 -0
  336. data/test/cases/relation/where_clause_test.rb +257 -0
  337. data/test/cases/relation/where_test.rb +429 -0
  338. data/test/cases/relation_test.rb +482 -0
  339. data/test/cases/relations_test.rb +2251 -0
  340. data/test/cases/reload_models_test.rb +26 -0
  341. data/test/cases/reserved_word_test.rb +141 -0
  342. data/test/cases/result_test.rb +141 -0
  343. data/test/cases/sanitize_test.rb +192 -0
  344. data/test/cases/schema_dumper_test.rb +550 -0
  345. data/test/cases/schema_loading_test.rb +53 -0
  346. data/test/cases/scoping/default_scoping_test.rb +569 -0
  347. data/test/cases/scoping/named_scoping_test.rb +649 -0
  348. data/test/cases/scoping/relation_scoping_test.rb +522 -0
  349. data/test/cases/secure_token_test.rb +47 -0
  350. data/test/cases/serialization_test.rb +106 -0
  351. data/test/cases/serialized_attribute_test.rb +455 -0
  352. data/test/cases/signed_id_test.rb +168 -0
  353. data/test/cases/statement_cache_test.rb +153 -0
  354. data/test/cases/statement_invalid_test.rb +42 -0
  355. data/test/cases/store_test.rb +320 -0
  356. data/test/cases/strict_loading_test.rb +473 -0
  357. data/test/cases/suppressor_test.rb +77 -0
  358. data/test/cases/tasks/database_tasks_test.rb +1526 -0
  359. data/test/cases/tasks/mysql_rake_test.rb +417 -0
  360. data/test/cases/tasks/postgresql_rake_test.rb +534 -0
  361. data/test/cases/tasks/sqlite_rake_test.rb +267 -0
  362. data/test/cases/test_case.rb +142 -0
  363. data/test/cases/test_databases_test.rb +79 -0
  364. data/test/cases/test_fixtures_test.rb +96 -0
  365. data/test/cases/time_precision_test.rb +125 -0
  366. data/test/cases/timestamp_test.rb +504 -0
  367. data/test/cases/touch_later_test.rb +123 -0
  368. data/test/cases/transaction_callbacks_test.rb +772 -0
  369. data/test/cases/transaction_isolation_test.rb +106 -0
  370. data/test/cases/transactions_test.rb +1285 -0
  371. data/test/cases/type/adapter_specific_registry_test.rb +145 -0
  372. data/test/cases/type/date_time_test.rb +16 -0
  373. data/test/cases/type/integer_test.rb +29 -0
  374. data/test/cases/type/string_test.rb +24 -0
  375. data/test/cases/type/time_test.rb +28 -0
  376. data/test/cases/type/type_map_test.rb +178 -0
  377. data/test/cases/type/unsigned_integer_test.rb +19 -0
  378. data/test/cases/type_test.rb +41 -0
  379. data/test/cases/types_test.rb +26 -0
  380. data/test/cases/unconnected_test.rb +46 -0
  381. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  382. data/test/cases/validations/absence_validation_test.rb +75 -0
  383. data/test/cases/validations/association_validation_test.rb +99 -0
  384. data/test/cases/validations/i18n_generate_message_validation_test.rb +102 -0
  385. data/test/cases/validations/i18n_validation_test.rb +87 -0
  386. data/test/cases/validations/length_validation_test.rb +80 -0
  387. data/test/cases/validations/numericality_validation_test.rb +181 -0
  388. data/test/cases/validations/presence_validation_test.rb +105 -0
  389. data/test/cases/validations/uniqueness_validation_test.rb +618 -0
  390. data/test/cases/validations_repair_helper.rb +21 -0
  391. data/test/cases/validations_test.rb +229 -0
  392. data/test/cases/view_test.rb +222 -0
  393. data/test/cases/yaml_serialization_test.rb +166 -0
  394. data/test/config.example.yml +97 -0
  395. data/test/config.rb +7 -0
  396. data/test/config.yml +220 -0
  397. data/test/connections/native_ibm_db/connection.rb +44 -0
  398. data/test/fixtures/accounts.yml +29 -0
  399. data/test/fixtures/admin/accounts.yml +2 -0
  400. data/test/fixtures/admin/randomly_named_a9.yml +7 -0
  401. data/test/fixtures/admin/randomly_named_b0.yml +7 -0
  402. data/test/fixtures/admin/users.yml +10 -0
  403. data/test/fixtures/all/admin +1 -0
  404. data/test/fixtures/all/developers.yml +0 -0
  405. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  406. data/test/fixtures/all/people.yml +0 -0
  407. data/test/fixtures/all/tasks.yml +0 -0
  408. data/test/fixtures/author_addresses.yml +11 -0
  409. data/test/fixtures/author_favorites.yml +4 -0
  410. data/test/fixtures/authors.yml +17 -0
  411. data/test/fixtures/bad_posts.yml +9 -0
  412. data/test/fixtures/binaries.yml +137 -0
  413. data/test/fixtures/books.yml +38 -0
  414. data/test/fixtures/bulbs.yml +5 -0
  415. data/test/fixtures/cars.yml +9 -0
  416. data/test/fixtures/categories/special_categories.yml +9 -0
  417. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  418. data/test/fixtures/categories.yml +19 -0
  419. data/test/fixtures/categories_ordered.yml +7 -0
  420. data/test/fixtures/categories_posts.yml +34 -0
  421. data/test/fixtures/categorizations.yml +23 -0
  422. data/test/fixtures/citations.yml +5 -0
  423. data/test/fixtures/clubs.yml +8 -0
  424. data/test/fixtures/collections.yml +3 -0
  425. data/test/fixtures/colleges.yml +3 -0
  426. data/test/fixtures/comments.yml +72 -0
  427. data/test/fixtures/companies.yml +72 -0
  428. data/test/fixtures/computers.yml +12 -0
  429. data/test/fixtures/content.yml +3 -0
  430. data/test/fixtures/content_positions.yml +3 -0
  431. data/test/fixtures/courses.yml +8 -0
  432. data/test/fixtures/customers.yml +35 -0
  433. data/test/fixtures/dashboards.yml +6 -0
  434. data/test/fixtures/dead_parrots.yml +5 -0
  435. data/test/fixtures/developers.yml +22 -0
  436. data/test/fixtures/developers_projects.yml +17 -0
  437. data/test/fixtures/dog_lovers.yml +7 -0
  438. data/test/fixtures/dogs.yml +4 -0
  439. data/test/fixtures/doubloons.yml +3 -0
  440. data/test/fixtures/edges.yml +5 -0
  441. data/test/fixtures/entrants.yml +14 -0
  442. data/test/fixtures/essays.yml +16 -0
  443. data/test/fixtures/faces.yml +11 -0
  444. data/test/fixtures/fk_test_has_fk.yml +3 -0
  445. data/test/fixtures/fk_test_has_pk.yml +2 -0
  446. data/test/fixtures/friendships.yml +4 -0
  447. data/test/fixtures/funny_jokes.yml +10 -0
  448. data/test/fixtures/humans.yml +5 -0
  449. data/test/fixtures/interests.yml +33 -0
  450. data/test/fixtures/items.yml +3 -0
  451. data/test/fixtures/jobs.yml +7 -0
  452. data/test/fixtures/legacy_things.yml +3 -0
  453. data/test/fixtures/live_parrots.yml +4 -0
  454. data/test/fixtures/mateys.yml +4 -0
  455. data/test/fixtures/member_details.yml +8 -0
  456. data/test/fixtures/member_types.yml +6 -0
  457. data/test/fixtures/members.yml +11 -0
  458. data/test/fixtures/memberships.yml +41 -0
  459. data/test/fixtures/men.yml +5 -0
  460. data/test/fixtures/minimalistics.yml +5 -0
  461. data/test/fixtures/minivans.yml +5 -0
  462. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  463. data/test/fixtures/mixins.yml +29 -0
  464. data/test/fixtures/movies.yml +7 -0
  465. data/test/fixtures/naked/yml/accounts.yml +1 -0
  466. data/test/fixtures/naked/yml/companies.yml +1 -0
  467. data/test/fixtures/naked/yml/courses.yml +1 -0
  468. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  469. data/test/fixtures/naked/yml/parrots.yml +3 -0
  470. data/test/fixtures/naked/yml/trees.yml +3 -0
  471. data/test/fixtures/nodes.yml +29 -0
  472. data/test/fixtures/organizations.yml +5 -0
  473. data/test/fixtures/other_books.yml +26 -0
  474. data/test/fixtures/other_comments.yml +6 -0
  475. data/test/fixtures/other_dogs.yml +2 -0
  476. data/test/fixtures/other_posts.yml +8 -0
  477. data/test/fixtures/other_topics.yml +42 -0
  478. data/test/fixtures/owners.yml +9 -0
  479. data/test/fixtures/parrots.yml +33 -0
  480. data/test/fixtures/parrots_pirates.yml +7 -0
  481. data/test/fixtures/people.yml +24 -0
  482. data/test/fixtures/peoples_treasures.yml +3 -0
  483. data/test/fixtures/pets.yml +19 -0
  484. data/test/fixtures/pirates.yml +15 -0
  485. data/test/fixtures/posts.yml +88 -0
  486. data/test/fixtures/price_estimates.yml +16 -0
  487. data/test/fixtures/products.yml +4 -0
  488. data/test/fixtures/projects.yml +7 -0
  489. data/test/fixtures/randomly_named_a9.yml +7 -0
  490. data/test/fixtures/ratings.yml +14 -0
  491. data/test/fixtures/readers.yml +17 -0
  492. data/test/fixtures/references.yml +17 -0
  493. data/test/fixtures/reserved_words/distinct.yml +5 -0
  494. data/test/fixtures/reserved_words/distinct_select.yml +11 -0
  495. data/test/fixtures/reserved_words/group.yml +14 -0
  496. data/test/fixtures/reserved_words/select.yml +8 -0
  497. data/test/fixtures/reserved_words/values.yml +7 -0
  498. data/test/fixtures/ships.yml +6 -0
  499. data/test/fixtures/speedometers.yml +8 -0
  500. data/test/fixtures/sponsors.yml +15 -0
  501. data/test/fixtures/strict_zines.yml +2 -0
  502. data/test/fixtures/string_key_objects.yml +7 -0
  503. data/test/fixtures/subscribers.yml +11 -0
  504. data/test/fixtures/subscriptions.yml +12 -0
  505. data/test/fixtures/taggings.yml +78 -0
  506. data/test/fixtures/tags.yml +11 -0
  507. data/test/fixtures/tasks.yml +7 -0
  508. data/test/fixtures/teapots.yml +3 -0
  509. data/test/fixtures/to_be_linked/accounts.yml +2 -0
  510. data/test/fixtures/to_be_linked/users.yml +10 -0
  511. data/test/fixtures/topics.yml +49 -0
  512. data/test/fixtures/toys.yml +14 -0
  513. data/test/fixtures/traffic_lights.yml +10 -0
  514. data/test/fixtures/treasures.yml +10 -0
  515. data/test/fixtures/trees.yml +3 -0
  516. data/test/fixtures/uuid_children.yml +3 -0
  517. data/test/fixtures/uuid_parents.yml +2 -0
  518. data/test/fixtures/variants.yml +4 -0
  519. data/test/fixtures/vegetables.yml +20 -0
  520. data/test/fixtures/vertices.yml +4 -0
  521. data/test/fixtures/warehouse-things.yml +3 -0
  522. data/test/fixtures/warehouse_things.yml +3 -0
  523. data/test/fixtures/zines.yml +5 -0
  524. data/test/ibm_db_test.rb +25 -0
  525. data/test/migrations/10_urban/9_add_expressions.rb +13 -0
  526. data/test/migrations/decimal/1_give_me_big_numbers.rb +17 -0
  527. data/test/migrations/magic/1_currencies_have_symbols.rb +13 -0
  528. data/test/migrations/missing/1000_people_have_middle_names.rb +11 -0
  529. data/test/migrations/missing/1_people_have_last_names.rb +11 -0
  530. data/test/migrations/missing/3_we_need_reminders.rb +14 -0
  531. data/test/migrations/missing/4_innocent_jointable.rb +14 -0
  532. data/test/migrations/rename/1_we_need_things.rb +13 -0
  533. data/test/migrations/rename/2_rename_things.rb +11 -0
  534. data/test/migrations/to_copy/1_people_have_hobbies.rb +11 -0
  535. data/test/migrations/to_copy/2_people_have_descriptions.rb +11 -0
  536. data/test/migrations/to_copy2/1_create_articles.rb +9 -0
  537. data/test/migrations/to_copy2/2_create_comments.rb +9 -0
  538. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +11 -0
  539. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +11 -0
  540. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +11 -0
  541. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +9 -0
  542. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +9 -0
  543. data/test/migrations/valid/1_valid_people_have_last_names.rb +11 -0
  544. data/test/migrations/valid/2_we_need_reminders.rb +14 -0
  545. data/test/migrations/valid/3_innocent_jointable.rb +14 -0
  546. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +11 -0
  547. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +14 -0
  548. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +14 -0
  549. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +11 -0
  550. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +14 -0
  551. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +14 -0
  552. data/test/migrations/version_check/20131219224947_migration_version_check.rb +10 -0
  553. data/test/models/account.rb +46 -0
  554. data/test/models/admin/account.rb +5 -0
  555. data/test/models/admin/randomly_named_c1.rb +9 -0
  556. data/test/models/admin/user.rb +48 -0
  557. data/test/models/admin.rb +7 -0
  558. data/test/models/aircraft.rb +7 -0
  559. data/test/models/arunit2_model.rb +5 -0
  560. data/test/models/author.rb +260 -0
  561. data/test/models/auto_id.rb +6 -0
  562. data/test/models/autoloadable/extra_firm.rb +4 -0
  563. data/test/models/binary.rb +4 -0
  564. data/test/models/binary_field.rb +6 -0
  565. data/test/models/bird.rb +24 -0
  566. data/test/models/book.rb +33 -0
  567. data/test/models/book_destroy_async.rb +24 -0
  568. data/test/models/boolean.rb +7 -0
  569. data/test/models/bulb.rb +61 -0
  570. data/test/models/cake_designer.rb +5 -0
  571. data/test/models/car.rb +36 -0
  572. data/test/models/carrier.rb +4 -0
  573. data/test/models/cart.rb +5 -0
  574. data/test/models/cat.rb +12 -0
  575. data/test/models/categorization.rb +21 -0
  576. data/test/models/category.rb +47 -0
  577. data/test/models/chef.rb +10 -0
  578. data/test/models/citation.rb +7 -0
  579. data/test/models/club.rb +28 -0
  580. data/test/models/college.rb +12 -0
  581. data/test/models/column.rb +5 -0
  582. data/test/models/column_name.rb +5 -0
  583. data/test/models/comment.rb +98 -0
  584. data/test/models/company.rb +226 -0
  585. data/test/models/company_in_module.rb +99 -0
  586. data/test/models/computer.rb +5 -0
  587. data/test/models/contact.rb +43 -0
  588. data/test/models/content.rb +42 -0
  589. data/test/models/contract.rb +38 -0
  590. data/test/models/country.rb +5 -0
  591. data/test/models/course.rb +8 -0
  592. data/test/models/customer.rb +85 -0
  593. data/test/models/customer_carrier.rb +16 -0
  594. data/test/models/dashboard.rb +5 -0
  595. data/test/models/default.rb +4 -0
  596. data/test/models/department.rb +6 -0
  597. data/test/models/destroy_async_parent.rb +15 -0
  598. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  599. data/test/models/developer.rb +341 -0
  600. data/test/models/dl_keyed_belongs_to.rb +13 -0
  601. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  602. data/test/models/dl_keyed_has_many.rb +5 -0
  603. data/test/models/dl_keyed_has_many_through.rb +5 -0
  604. data/test/models/dl_keyed_has_one.rb +5 -0
  605. data/test/models/dl_keyed_join.rb +10 -0
  606. data/test/models/dog.rb +7 -0
  607. data/test/models/dog_lover.rb +7 -0
  608. data/test/models/doubloon.rb +14 -0
  609. data/test/models/drink_designer.rb +20 -0
  610. data/test/models/edge.rb +7 -0
  611. data/test/models/electron.rb +7 -0
  612. data/test/models/engine.rb +5 -0
  613. data/test/models/entrant.rb +5 -0
  614. data/test/models/entry.rb +5 -0
  615. data/test/models/essay.rb +8 -0
  616. data/test/models/essay_destroy_async.rb +12 -0
  617. data/test/models/event.rb +5 -0
  618. data/test/models/eye.rb +39 -0
  619. data/test/models/face.rb +17 -0
  620. data/test/models/family.rb +6 -0
  621. data/test/models/family_tree.rb +6 -0
  622. data/test/models/friendship.rb +8 -0
  623. data/test/models/frog.rb +8 -0
  624. data/test/models/guid.rb +4 -0
  625. data/test/models/guitar.rb +6 -0
  626. data/test/models/hotel.rb +13 -0
  627. data/test/models/human.rb +39 -0
  628. data/test/models/image.rb +5 -0
  629. data/test/models/interest.rb +16 -0
  630. data/test/models/invoice.rb +6 -0
  631. data/test/models/item.rb +9 -0
  632. data/test/models/job.rb +9 -0
  633. data/test/models/joke.rb +9 -0
  634. data/test/models/keyboard.rb +5 -0
  635. data/test/models/legacy_thing.rb +5 -0
  636. data/test/models/lesson.rb +13 -0
  637. data/test/models/line_item.rb +5 -0
  638. data/test/models/liquid.rb +6 -0
  639. data/test/models/man.rb +11 -0
  640. data/test/models/matey.rb +6 -0
  641. data/test/models/measurement.rb +4 -0
  642. data/test/models/member.rb +45 -0
  643. data/test/models/member_detail.rb +11 -0
  644. data/test/models/member_type.rb +5 -0
  645. data/test/models/membership.rb +38 -0
  646. data/test/models/mentor.rb +5 -0
  647. data/test/models/message.rb +5 -0
  648. data/test/models/minimalistic.rb +4 -0
  649. data/test/models/minivan.rb +10 -0
  650. data/test/models/mixed_case_monkey.rb +5 -0
  651. data/test/models/mocktail_designer.rb +2 -0
  652. data/test/models/molecule.rb +8 -0
  653. data/test/models/mouse.rb +6 -0
  654. data/test/models/movie.rb +7 -0
  655. data/test/models/node.rb +7 -0
  656. data/test/models/non_primary_key.rb +4 -0
  657. data/test/models/notification.rb +5 -0
  658. data/test/models/numeric_data.rb +12 -0
  659. data/test/models/order.rb +6 -0
  660. data/test/models/organization.rb +16 -0
  661. data/test/models/other_dog.rb +7 -0
  662. data/test/models/owner.rb +39 -0
  663. data/test/models/parrot.rb +36 -0
  664. data/test/models/person.rb +147 -0
  665. data/test/models/personal_legacy_thing.rb +6 -0
  666. data/test/models/pet.rb +20 -0
  667. data/test/models/pet_treasure.rb +8 -0
  668. data/test/models/pirate.rb +116 -0
  669. data/test/models/possession.rb +5 -0
  670. data/test/models/post.rb +371 -0
  671. data/test/models/price_estimate.rb +14 -0
  672. data/test/models/professor.rb +7 -0
  673. data/test/models/project.rb +42 -0
  674. data/test/models/publisher/article.rb +6 -0
  675. data/test/models/publisher/magazine.rb +5 -0
  676. data/test/models/publisher.rb +4 -0
  677. data/test/models/randomly_named_c1.rb +5 -0
  678. data/test/models/rating.rb +8 -0
  679. data/test/models/reader.rb +25 -0
  680. data/test/models/recipe.rb +5 -0
  681. data/test/models/record.rb +4 -0
  682. data/test/models/reference.rb +25 -0
  683. data/test/models/reply.rb +79 -0
  684. data/test/models/room.rb +6 -0
  685. data/test/models/section.rb +6 -0
  686. data/test/models/seminar.rb +6 -0
  687. data/test/models/session.rb +6 -0
  688. data/test/models/ship.rb +42 -0
  689. data/test/models/ship_part.rb +10 -0
  690. data/test/models/shop.rb +19 -0
  691. data/test/models/shop_account.rb +8 -0
  692. data/test/models/speedometer.rb +8 -0
  693. data/test/models/sponsor.rb +10 -0
  694. data/test/models/squeak.rb +6 -0
  695. data/test/models/strict_zine.rb +7 -0
  696. data/test/models/string_key_object.rb +5 -0
  697. data/test/models/student.rb +6 -0
  698. data/test/models/subject.rb +16 -0
  699. data/test/models/subscriber.rb +10 -0
  700. data/test/models/subscription.rb +8 -0
  701. data/test/models/tag.rb +16 -0
  702. data/test/models/tagging.rb +20 -0
  703. data/test/models/task.rb +7 -0
  704. data/test/models/topic.rb +153 -0
  705. data/test/models/toy.rb +10 -0
  706. data/test/models/traffic_light.rb +6 -0
  707. data/test/models/treasure.rb +16 -0
  708. data/test/models/treaty.rb +5 -0
  709. data/test/models/tree.rb +5 -0
  710. data/test/models/tuning_peg.rb +6 -0
  711. data/test/models/tyre.rb +13 -0
  712. data/test/models/user.rb +22 -0
  713. data/test/models/uuid_child.rb +5 -0
  714. data/test/models/uuid_item.rb +8 -0
  715. data/test/models/uuid_parent.rb +5 -0
  716. data/test/models/vegetables.rb +33 -0
  717. data/test/models/vehicle.rb +7 -0
  718. data/test/models/vertex.rb +11 -0
  719. data/test/models/warehouse_thing.rb +7 -0
  720. data/test/models/wheel.rb +5 -0
  721. data/test/models/without_table.rb +5 -0
  722. data/test/models/zine.rb +5 -0
  723. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  724. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  725. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  726. data/test/schema/mysql2_specific_schema.rb +82 -0
  727. data/test/schema/oracle_specific_schema.rb +38 -0
  728. data/test/schema/postgresql_specific_schema.rb +125 -0
  729. data/test/schema/schema.rb +1237 -0
  730. data/test/schema/schema.rb.original +1057 -0
  731. data/test/schema/sqlite_specific_schema.rb +11 -0
  732. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  733. data/test/support/config.rb +43 -0
  734. data/test/support/connection.rb +29 -0
  735. data/test/support/connection_helper.rb +16 -0
  736. data/test/support/ddl_helper.rb +10 -0
  737. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  738. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  739. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  740. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  741. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  742. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  743. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  744. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  745. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  746. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  747. data/test/support/schema_dumping_helper.rb +22 -0
  748. data/test/support/stubs/strong_parameters.rb +40 -0
  749. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  750. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  751. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  752. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  753. metadata +876 -0
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ module ActiveRecord
6
+ class DatabaseConfigurations
7
+ class HashConfigTest < ActiveRecord::TestCase
8
+ def test_pool_default_when_nil
9
+ config = HashConfig.new("default_env", "primary", pool: nil)
10
+ assert_equal 5, config.pool
11
+ end
12
+
13
+ def test_pool_overrides_with_value
14
+ config = HashConfig.new("default_env", "primary", pool: "0")
15
+ assert_equal 0, config.pool
16
+ end
17
+
18
+ def test_when_no_pool_uses_default
19
+ config = HashConfig.new("default_env", "primary", {})
20
+ assert_equal 5, config.pool
21
+ end
22
+
23
+ def test_checkout_timeout_default_when_nil
24
+ config = HashConfig.new("default_env", "primary", checkout_timeout: nil)
25
+ assert_equal 5.0, config.checkout_timeout
26
+ end
27
+
28
+ def test_checkout_timeout_overrides_with_value
29
+ config = HashConfig.new("default_env", "primary", checkout_timeout: "0")
30
+ assert_equal 0.0, config.checkout_timeout
31
+ end
32
+
33
+ def test_when_no_checkout_timeout_uses_default
34
+ config = HashConfig.new("default_env", "primary", {})
35
+ assert_equal 5.0, config.checkout_timeout
36
+ end
37
+
38
+ def test_reaping_frequency_default_when_nil
39
+ config = HashConfig.new("default_env", "primary", reaping_frequency: nil)
40
+ assert_nil config.reaping_frequency
41
+ end
42
+
43
+ def test_reaping_frequency_overrides_with_value
44
+ config = HashConfig.new("default_env", "primary", reaping_frequency: "0")
45
+ assert_equal 0.0, config.reaping_frequency
46
+ end
47
+
48
+ def test_when_no_reaping_frequency_uses_default
49
+ config = HashConfig.new("default_env", "primary", {})
50
+ assert_equal 60.0, config.reaping_frequency
51
+ end
52
+
53
+ def test_idle_timeout_default_when_nil
54
+ config = HashConfig.new("default_env", "primary", idle_timeout: nil)
55
+ assert_nil config.idle_timeout
56
+ end
57
+
58
+ def test_idle_timeout_overrides_with_value
59
+ config = HashConfig.new("default_env", "primary", idle_timeout: "1")
60
+ assert_equal 1.0, config.idle_timeout
61
+ end
62
+
63
+ def test_when_no_idle_timeout_uses_default
64
+ config = HashConfig.new("default_env", "primary", {})
65
+ assert_equal 300.0, config.idle_timeout
66
+ end
67
+
68
+ def test_idle_timeout_nil_when_less_than_or_equal_to_zero
69
+ config = HashConfig.new("default_env", "primary", idle_timeout: "0")
70
+ assert_nil config.idle_timeout
71
+ end
72
+ end
73
+ end
74
+ end
@@ -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
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ class DatabaseStatementsTest < ActiveRecord::TestCase
6
+ def setup
7
+ @connection = ActiveRecord::Base.connection
8
+ end
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
+
17
+ def test_insert_should_return_the_inserted_id
18
+ assert_not_nil return_the_inserted_id(method: :insert)
19
+ end
20
+
21
+ def test_create_should_return_the_inserted_id
22
+ assert_not_nil return_the_inserted_id(method: :create)
23
+ end
24
+
25
+ private
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
35
+ end
36
+ end