ibm_db 5.6.1 → 5.7.0

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 (592) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +13 -9
  3. data/ext/extconf.rb +176 -110
  4. data/ext/ibm_db.c +60 -0
  5. data/ext/ibm_db.o +0 -0
  6. data/ext/ibm_db.so +0 -0
  7. data/ext/mkmf.log +6 -6
  8. data/ext/ruby_ibm_db_cli.c +14 -10
  9. data/ext/ruby_ibm_db_cli.h +4 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/IBM_DB.rb +2 -2
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
  13. data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
  14. data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
  15. data/test/activejob/destroy_association_async_job_test.rb +62 -0
  16. data/test/activejob/destroy_association_async_test.rb +147 -11
  17. data/test/activejob/job_runtime_test.rb +41 -0
  18. data/test/activejob/unloadable_base_job.rb +3 -0
  19. data/test/cases/active_record_schema_test.rb +196 -0
  20. data/test/cases/active_record_test.rb +21 -0
  21. data/test/cases/adapter_prevent_writes_test.rb +26 -202
  22. data/test/cases/adapter_test.rb +592 -82
  23. data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
  24. data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
  25. data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
  26. data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
  27. data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
  28. data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
  29. data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
  30. data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
  31. data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
  32. data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
  33. data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
  34. data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
  35. data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
  36. data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
  38. data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
  39. data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
  40. data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
  41. data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
  42. data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
  43. data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
  44. data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
  45. data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
  46. data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
  47. data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
  48. data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
  49. data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
  51. data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
  52. data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
  53. data/test/cases/adapters/postgresql/array_test.rb +6 -6
  54. data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
  55. data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
  56. data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
  57. data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
  58. data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
  59. data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
  60. data/test/cases/adapters/postgresql/citext_test.rb +7 -1
  61. data/test/cases/adapters/postgresql/collation_test.rb +1 -1
  62. data/test/cases/adapters/postgresql/composite_test.rb +1 -1
  63. data/test/cases/adapters/postgresql/connection_test.rb +43 -36
  64. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
  65. data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
  66. data/test/cases/adapters/postgresql/date_test.rb +2 -2
  67. data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
  69. data/test/cases/adapters/postgresql/domain_test.rb +1 -1
  70. data/test/cases/adapters/postgresql/enum_test.rb +208 -8
  71. data/test/cases/adapters/postgresql/explain_test.rb +25 -6
  72. data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
  73. data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
  74. data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
  75. data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
  76. data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
  77. data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
  78. data/test/cases/adapters/postgresql/integer_test.rb +1 -1
  79. data/test/cases/adapters/postgresql/interval_test.rb +9 -17
  80. data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
  81. data/test/cases/adapters/postgresql/json_test.rb +5 -0
  82. data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
  83. data/test/cases/adapters/postgresql/money_test.rb +17 -9
  84. data/test/cases/adapters/postgresql/network_test.rb +13 -1
  85. data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
  86. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
  87. data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
  88. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
  89. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
  90. data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
  91. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
  92. data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
  93. data/test/cases/adapters/postgresql/range_test.rb +185 -21
  94. data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
  95. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
  96. data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
  97. data/test/cases/adapters/postgresql/schema_test.rb +270 -20
  98. data/test/cases/adapters/postgresql/serial_test.rb +5 -5
  99. data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
  100. data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
  101. data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
  102. data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
  103. data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
  104. data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
  105. data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
  106. data/test/cases/adapters/postgresql/xml_test.rb +1 -1
  107. data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
  108. data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
  109. data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
  110. data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
  111. data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
  112. data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
  113. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
  114. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
  115. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
  116. data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
  117. data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
  118. data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
  119. data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
  120. data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
  121. data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
  122. data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
  123. data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
  124. data/test/cases/aggregations_test.rb +16 -0
  125. data/test/cases/annotate_test.rb +14 -12
  126. data/test/cases/arel/attributes/attribute_test.rb +86 -47
  127. data/test/cases/arel/collectors/bind_test.rb +1 -1
  128. data/test/cases/arel/collectors/composite_test.rb +11 -1
  129. data/test/cases/arel/collectors/sql_string_test.rb +1 -1
  130. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
  131. data/test/cases/arel/delete_manager_test.rb +0 -6
  132. data/test/cases/arel/factory_methods_test.rb +45 -0
  133. data/test/cases/arel/insert_manager_test.rb +1 -7
  134. data/test/cases/arel/nodes/as_test.rb +12 -0
  135. data/test/cases/arel/nodes/ascending_test.rb +1 -1
  136. data/test/cases/arel/nodes/bin_test.rb +1 -1
  137. data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
  138. data/test/cases/arel/nodes/cte_test.rb +46 -0
  139. data/test/cases/arel/nodes/descending_test.rb +1 -1
  140. data/test/cases/arel/nodes/equality_test.rb +3 -3
  141. data/test/cases/arel/nodes/filter_test.rb +37 -0
  142. data/test/cases/arel/nodes/fragments_test.rb +38 -0
  143. data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
  144. data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
  145. data/test/cases/arel/nodes/node_test.rb +1 -1
  146. data/test/cases/arel/nodes/or_test.rb +2 -2
  147. data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
  148. data/test/cases/arel/nodes/table_alias_test.rb +12 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
  150. data/test/cases/arel/nodes/update_statement_test.rb +4 -0
  151. data/test/cases/arel/nodes_test.rb +3 -2
  152. data/test/cases/arel/select_manager_test.rb +12 -12
  153. data/test/cases/arel/support/fake_record.rb +22 -17
  154. data/test/cases/arel/table_test.rb +15 -25
  155. data/test/cases/arel/update_manager_test.rb +51 -6
  156. data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
  157. data/test/cases/arel/visitors/dot_test.rb +177 -2
  158. data/test/cases/arel/visitors/mysql_test.rb +49 -1
  159. data/test/cases/arel/visitors/postgres_test.rb +1 -31
  160. data/test/cases/arel/visitors/sqlite_test.rb +1 -1
  161. data/test/cases/arel/visitors/to_sql_test.rb +330 -20
  162. data/test/cases/assertions/query_assertions_test.rb +136 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +502 -41
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
  165. data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
  166. data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
  167. data/test/cases/associations/eager_singularization_test.rb +1 -1
  168. data/test/cases/associations/eager_test.rb +255 -93
  169. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
  170. data/test/cases/associations/has_many_associations_test.rb +282 -72
  171. data/test/cases/associations/has_many_through_associations_test.rb +172 -45
  172. data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
  173. data/test/cases/associations/has_one_associations_test.rb +160 -29
  174. data/test/cases/associations/has_one_through_associations_test.rb +64 -15
  175. data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
  176. data/test/cases/associations/inner_join_association_test.rb +36 -6
  177. data/test/cases/associations/inverse_associations_test.rb +177 -40
  178. data/test/cases/associations/join_model_test.rb +17 -12
  179. data/test/cases/associations/left_outer_join_association_test.rb +14 -3
  180. data/test/cases/associations/nested_error_test.rb +116 -0
  181. data/test/cases/associations/nested_through_associations_test.rb +54 -19
  182. data/test/cases/associations/required_test.rb +1 -1
  183. data/test/cases/associations_test.rb +1278 -21
  184. data/test/cases/asynchronous_queries_test.rb +310 -0
  185. data/test/cases/attribute_methods/read_test.rb +6 -0
  186. data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
  187. data/test/cases/attribute_methods_test.rb +565 -46
  188. data/test/cases/attributes_test.rb +42 -1
  189. data/test/cases/autosave_association_test.rb +645 -92
  190. data/test/cases/base_prevent_writes_test.rb +28 -159
  191. data/test/cases/base_test.rb +434 -209
  192. data/test/cases/batches_test.rb +441 -57
  193. data/test/cases/binary_test.rb +31 -0
  194. data/test/cases/bind_parameter_test.rb +107 -16
  195. data/test/cases/cache_key_test.rb +7 -7
  196. data/test/cases/calculations_test.rb +541 -110
  197. data/test/cases/callbacks_test.rb +0 -1
  198. data/test/cases/clone_test.rb +5 -4
  199. data/test/cases/coders/yaml_column_test.rb +97 -2
  200. data/test/cases/collection_cache_key_test.rb +24 -16
  201. data/test/cases/column_alias_test.rb +2 -8
  202. data/test/cases/column_definition_test.rb +12 -3
  203. data/test/cases/comment_test.rb +23 -26
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
  205. data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
  210. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
  211. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
  212. data/test/cases/connection_adapters/registration_test.rb +98 -0
  213. data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
  214. data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
  215. data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
  216. data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
  217. data/test/cases/connection_handling_test.rb +210 -0
  218. data/test/cases/connection_management_test.rb +44 -7
  219. data/test/cases/connection_pool_test.rb +466 -99
  220. data/test/cases/core_test.rb +167 -9
  221. data/test/cases/counter_cache_test.rb +129 -2
  222. data/test/cases/custom_locking_test.rb +3 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +149 -13
  224. data/test/cases/database_configurations/resolver_test.rb +14 -10
  225. data/test/cases/database_configurations/url_config_test.rb +53 -0
  226. data/test/cases/database_configurations_test.rb +86 -43
  227. data/test/cases/database_selector_test.rb +30 -8
  228. data/test/cases/database_statements_test.rb +10 -14
  229. data/test/cases/date_time_precision_test.rb +141 -11
  230. data/test/cases/date_time_test.rb +19 -1
  231. data/test/cases/defaults_test.rb +107 -41
  232. data/test/cases/delegated_type_test.rb +69 -9
  233. data/test/cases/dirty_test.rb +82 -25
  234. data/test/cases/disconnected_test.rb +10 -9
  235. data/test/cases/dup_test.rb +26 -6
  236. data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
  237. data/test/cases/encryption/cipher_test.rb +65 -0
  238. data/test/cases/encryption/concurrency_test.rb +27 -0
  239. data/test/cases/encryption/config_test.rb +21 -0
  240. data/test/cases/encryption/configurable_test.rb +93 -0
  241. data/test/cases/encryption/contexts_test.rb +105 -0
  242. data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
  243. data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
  244. data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
  245. data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
  246. data/test/cases/encryption/encryptable_record_test.rb +470 -0
  247. data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
  248. data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
  249. data/test/cases/encryption/encryption_schemes_test.rb +240 -0
  250. data/test/cases/encryption/encryptor_test.rb +113 -0
  251. data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
  252. data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
  253. data/test/cases/encryption/helper.rb +152 -0
  254. data/test/cases/encryption/key_generator_test.rb +55 -0
  255. data/test/cases/encryption/key_provider_test.rb +57 -0
  256. data/test/cases/encryption/key_test.rb +17 -0
  257. data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
  258. data/test/cases/encryption/message_serializer_test.rb +82 -0
  259. data/test/cases/encryption/message_test.rb +43 -0
  260. data/test/cases/encryption/null_encryptor_test.rb +21 -0
  261. data/test/cases/encryption/properties_test.rb +69 -0
  262. data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
  263. data/test/cases/encryption/scheme_test.rb +58 -0
  264. data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
  265. data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
  266. data/test/cases/enum_test.rb +374 -72
  267. data/test/cases/errors_test.rb +7 -4
  268. data/test/cases/excluding_test.rb +116 -0
  269. data/test/cases/explain_subscriber_test.rb +6 -1
  270. data/test/cases/explain_test.rb +119 -10
  271. data/test/cases/filter_attributes_test.rb +7 -14
  272. data/test/cases/finder_respond_to_test.rb +3 -3
  273. data/test/cases/finder_test.rb +357 -72
  274. data/test/cases/fixture_set/file_test.rb +9 -0
  275. data/test/cases/fixtures_test.rb +426 -190
  276. data/test/cases/helper.rb +66 -192
  277. data/test/cases/hot_compatibility_test.rb +10 -10
  278. data/test/cases/inheritance_test.rb +51 -61
  279. data/test/cases/inherited_test.rb +40 -0
  280. data/test/cases/insert_all_test.rb +419 -9
  281. data/test/cases/instrumentation_test.rb +202 -30
  282. data/test/cases/integration_test.rb +25 -7
  283. data/test/cases/invalid_connection_test.rb +5 -5
  284. data/test/cases/invertible_migration_test.rb +108 -24
  285. data/test/cases/json_attribute_test.rb +1 -0
  286. data/test/cases/json_serialization_test.rb +5 -5
  287. data/test/cases/json_shared_test_cases.rb +5 -9
  288. data/test/cases/locking_test.rb +67 -31
  289. data/test/cases/log_subscriber_test.rb +17 -15
  290. data/test/cases/marshal_serialization_test.rb +78 -5
  291. data/test/cases/message_pack_test.rb +91 -0
  292. data/test/cases/migration/change_schema_test.rb +77 -46
  293. data/test/cases/migration/change_table_test.rb +129 -114
  294. data/test/cases/migration/check_constraint_test.rb +192 -10
  295. data/test/cases/migration/column_attributes_test.rb +4 -9
  296. data/test/cases/migration/column_positioning_test.rb +2 -2
  297. data/test/cases/migration/columns_test.rb +118 -4
  298. data/test/cases/migration/command_recorder_test.rb +181 -14
  299. data/test/cases/migration/compatibility_test.rb +883 -196
  300. data/test/cases/migration/create_join_table_test.rb +8 -1
  301. data/test/cases/migration/exclusion_constraint_test.rb +192 -0
  302. data/test/cases/migration/foreign_key_test.rb +356 -14
  303. data/test/cases/migration/helper.rb +4 -1
  304. data/test/cases/migration/index_test.rb +67 -2
  305. data/test/cases/migration/invalid_options_test.rb +129 -0
  306. data/test/cases/migration/logger_test.rb +7 -4
  307. data/test/cases/migration/pending_migrations_test.rb +103 -60
  308. data/test/cases/migration/references_foreign_key_test.rb +73 -4
  309. data/test/cases/migration/references_index_test.rb +25 -27
  310. data/test/cases/migration/references_statements_test.rb +27 -3
  311. data/test/cases/migration/rename_table_test.rb +39 -54
  312. data/test/cases/migration/schema_definitions_test.rb +109 -0
  313. data/test/cases/migration/unique_constraint_test.rb +248 -0
  314. data/test/cases/migration_test.rb +677 -220
  315. data/test/cases/migrator_test.rb +102 -75
  316. data/test/cases/multi_db_migrator_test.rb +55 -34
  317. data/test/cases/multiparameter_attributes_test.rb +26 -29
  318. data/test/cases/multiple_db_test.rb +42 -19
  319. data/test/cases/nested_attributes_test.rb +124 -6
  320. data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
  321. data/test/cases/normalized_attribute_test.rb +117 -0
  322. data/test/cases/null_relation_test.rb +35 -2
  323. data/test/cases/persistence/reload_association_cache_test.rb +20 -0
  324. data/test/cases/persistence_test.rb +629 -22
  325. data/test/cases/pooled_connections_test.rb +57 -56
  326. data/test/cases/prepared_statement_status_test.rb +8 -3
  327. data/test/cases/primary_class_test.rb +134 -0
  328. data/test/cases/primary_keys_test.rb +171 -55
  329. data/test/cases/query_cache_test.rb +558 -263
  330. data/test/cases/query_logs_test.rb +293 -0
  331. data/test/cases/quoting_test.rb +39 -72
  332. data/test/cases/readonly_test.rb +50 -12
  333. data/test/cases/reaper_test.rb +22 -6
  334. data/test/cases/reflection_test.rb +207 -9
  335. data/test/cases/relation/and_test.rb +43 -0
  336. data/test/cases/relation/delegation_test.rb +32 -5
  337. data/test/cases/relation/delete_all_test.rb +27 -6
  338. data/test/cases/relation/field_ordered_values_test.rb +128 -0
  339. data/test/cases/relation/load_async_test.rb +650 -0
  340. data/test/cases/relation/merging_test.rb +80 -109
  341. data/test/cases/relation/mutation_test.rb +12 -7
  342. data/test/cases/relation/or_test.rb +11 -8
  343. data/test/cases/relation/order_test.rb +90 -0
  344. data/test/cases/relation/predicate_builder_test.rb +21 -6
  345. data/test/cases/relation/select_test.rb +162 -3
  346. data/test/cases/relation/structural_compatibility_test.rb +38 -0
  347. data/test/cases/relation/update_all_test.rb +81 -27
  348. data/test/cases/relation/where_chain_test.rb +190 -3
  349. data/test/cases/relation/where_clause_test.rb +43 -1
  350. data/test/cases/relation/where_test.rb +95 -7
  351. data/test/cases/relation/with_test.rb +165 -0
  352. data/test/cases/relation_test.rb +42 -37
  353. data/test/cases/relations_test.rb +436 -138
  354. data/test/cases/reload_models_test.rb +18 -14
  355. data/test/cases/reserved_word_test.rb +2 -1
  356. data/test/cases/result_test.rb +14 -22
  357. data/test/cases/sanitize_test.rb +89 -27
  358. data/test/cases/schema_dumper_test.rb +535 -62
  359. data/test/cases/scoping/default_scoping_test.rb +219 -35
  360. data/test/cases/scoping/named_scoping_test.rb +25 -46
  361. data/test/cases/scoping/relation_scoping_test.rb +112 -4
  362. data/test/cases/secure_password_test.rb +108 -0
  363. data/test/cases/secure_token_test.rb +72 -0
  364. data/test/cases/serialization_test.rb +1 -1
  365. data/test/cases/serialized_attribute_test.rb +305 -60
  366. data/test/cases/shard_keys_test.rb +125 -0
  367. data/test/cases/shard_selector_test.rb +45 -0
  368. data/test/cases/signed_id_test.rb +57 -5
  369. data/test/cases/statement_cache_test.rb +31 -30
  370. data/test/cases/statement_invalid_test.rb +8 -4
  371. data/test/cases/store_test.rb +73 -9
  372. data/test/cases/strict_loading_test.rb +327 -13
  373. data/test/cases/table_metadata_test.rb +16 -0
  374. data/test/cases/tasks/database_tasks_test.rb +517 -244
  375. data/test/cases/test_case.rb +254 -60
  376. data/test/cases/test_case_test.rb +69 -0
  377. data/test/cases/test_databases_test.rb +7 -3
  378. data/test/cases/test_fixtures_test.rb +19 -40
  379. data/test/cases/time_precision_test.rb +17 -5
  380. data/test/cases/timestamp_test.rb +124 -16
  381. data/test/cases/token_for_test.rb +165 -0
  382. data/test/cases/touch_later_test.rb +43 -1
  383. data/test/cases/transaction_callbacks_test.rb +325 -8
  384. data/test/cases/transaction_instrumentation_test.rb +453 -0
  385. data/test/cases/transaction_isolation_test.rb +12 -8
  386. data/test/cases/transactions_test.rb +629 -112
  387. data/test/cases/type/date_time_test.rb +7 -1
  388. data/test/cases/type/time_test.rb +9 -0
  389. data/test/cases/type/type_map_test.rb +108 -73
  390. data/test/cases/type/unsigned_integer_test.rb +12 -0
  391. data/test/cases/type_caster/connection_test.rb +19 -0
  392. data/test/cases/type_test.rb +1 -1
  393. data/test/cases/unconnected_test.rb +7 -7
  394. data/test/cases/unsafe_raw_sql_test.rb +39 -8
  395. data/test/cases/validations/absence_validation_test.rb +1 -1
  396. data/test/cases/validations/association_validation_test.rb +25 -3
  397. data/test/cases/validations/numericality_validation_test.rb +3 -9
  398. data/test/cases/validations/presence_validation_test.rb +1 -1
  399. data/test/cases/validations/uniqueness_validation_test.rb +280 -40
  400. data/test/cases/validations_test.rb +2 -2
  401. data/test/cases/view_test.rb +33 -22
  402. data/test/cases/yaml_serialization_test.rb +23 -17
  403. data/test/config.example.yml +58 -56
  404. data/test/config.rb +1 -0
  405. data/test/fixtures/1_need_quoting.yml +2 -0
  406. data/test/fixtures/accounts.yml +5 -0
  407. data/test/fixtures/aircrafts.yml +7 -0
  408. data/test/fixtures/book_identifiers.yml +11 -0
  409. data/test/fixtures/books.yml +5 -4
  410. data/test/fixtures/cake_designers.yml +5 -0
  411. data/test/fixtures/cars.yml +6 -0
  412. data/test/fixtures/chefs.yml +5 -0
  413. data/test/fixtures/clothing_items.yml +23 -0
  414. data/test/fixtures/clubs.yml +1 -1
  415. data/test/fixtures/comments.yml +2 -1
  416. data/test/fixtures/cpk_authors.yml +8 -0
  417. data/test/fixtures/cpk_books.yml +21 -0
  418. data/test/fixtures/cpk_order_agreements.yml +13 -0
  419. data/test/fixtures/cpk_order_tags.yml +15 -0
  420. data/test/fixtures/cpk_orders.yml +11 -0
  421. data/test/fixtures/cpk_posts.yml +12 -0
  422. data/test/fixtures/cpk_reviews.yml +13 -0
  423. data/test/fixtures/cpk_tags.yml +11 -0
  424. data/test/fixtures/drink_designers.yml +5 -0
  425. data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
  426. data/test/fixtures/encrypted_books.yml +4 -0
  427. data/test/fixtures/fk_object_to_point_to.yml +2 -0
  428. data/test/fixtures/memberships.yml +15 -15
  429. data/test/fixtures/paragraphs.yml +5 -0
  430. data/test/fixtures/parrots.yml +4 -0
  431. data/test/fixtures/people.yml +2 -0
  432. data/test/fixtures/pirates.yml +2 -2
  433. data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
  434. data/test/fixtures/references.yml +3 -3
  435. data/test/fixtures/sharded_blog_posts.yml +14 -0
  436. data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
  437. data/test/fixtures/sharded_blogs.yml +8 -0
  438. data/test/fixtures/sharded_comments.yml +22 -0
  439. data/test/fixtures/sharded_tags.yml +34 -0
  440. data/test/fixtures/sponsors.yml +2 -2
  441. data/test/fixtures/topics.yml +1 -0
  442. data/test/fixtures/treasures.yml +4 -0
  443. data/test/fixtures/virtual_columns.yml +5 -0
  444. data/test/fixtures/warehouse_things.yml +1 -1
  445. data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
  446. data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
  447. data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
  448. data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
  449. data/test/migrations/scope/1_unscoped.rb +7 -0
  450. data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
  451. data/test/models/admin/user.rb +2 -0
  452. data/test/models/admin/user_json.rb +48 -0
  453. data/test/models/attachment.rb +7 -0
  454. data/test/models/author.rb +70 -3
  455. data/test/models/author_encrypted.rb +16 -0
  456. data/test/models/bird.rb +1 -1
  457. data/test/models/book.rb +18 -11
  458. data/test/models/book_destroy_async.rb +1 -1
  459. data/test/models/book_encrypted.rb +106 -0
  460. data/test/models/book_identifier.rb +5 -0
  461. data/test/models/branch.rb +11 -0
  462. data/test/models/bulb.rb +1 -1
  463. data/test/models/car.rb +8 -1
  464. data/test/models/cat.rb +1 -1
  465. data/test/models/category.rb +3 -1
  466. data/test/models/chat_message.rb +8 -0
  467. data/test/models/chef.rb +52 -0
  468. data/test/models/clothing_item.rb +12 -0
  469. data/test/models/club.rb +4 -1
  470. data/test/models/comment.rb +7 -4
  471. data/test/models/comment_overlapping_counter_cache.rb +15 -0
  472. data/test/models/company.rb +16 -2
  473. data/test/models/computer.rb +1 -0
  474. data/test/models/contact.rb +3 -3
  475. data/test/models/contract.rb +5 -1
  476. data/test/models/cpk/author.rb +9 -0
  477. data/test/models/cpk/book.rb +55 -0
  478. data/test/models/cpk/book_destroy_async.rb +9 -0
  479. data/test/models/cpk/car.rb +9 -0
  480. data/test/models/cpk/car_review.rb +9 -0
  481. data/test/models/cpk/chapter.rb +16 -0
  482. data/test/models/cpk/chapter_destroy_async.rb +10 -0
  483. data/test/models/cpk/comment.rb +9 -0
  484. data/test/models/cpk/order.rb +55 -0
  485. data/test/models/cpk/order_agreement.rb +10 -0
  486. data/test/models/cpk/order_tag.rb +10 -0
  487. data/test/models/cpk/post.rb +10 -0
  488. data/test/models/cpk/posts_tag.rb +10 -0
  489. data/test/models/cpk/review.rb +9 -0
  490. data/test/models/cpk/tag.rb +10 -0
  491. data/test/models/cpk.rb +15 -0
  492. data/test/models/customer.rb +3 -1
  493. data/test/models/destroy_async_parent.rb +1 -1
  494. data/test/models/developer.rb +44 -3
  495. data/test/models/discount.rb +4 -0
  496. data/test/models/drink_designer.rb +1 -0
  497. data/test/models/editor.rb +8 -0
  498. data/test/models/editorship.rb +6 -0
  499. data/test/models/entry.rb +5 -0
  500. data/test/models/essay.rb +6 -1
  501. data/test/models/essay_destroy_async.rb +1 -0
  502. data/test/models/eye.rb +87 -21
  503. data/test/models/face.rb +1 -1
  504. data/test/models/friendship.rb +3 -0
  505. data/test/models/hardback.rb +7 -0
  506. data/test/models/hotel.rb +2 -0
  507. data/test/models/human.rb +2 -2
  508. data/test/models/invoice.rb +2 -1
  509. data/test/models/invokes_an_undefined_method.rb +5 -0
  510. data/test/models/line_item.rb +6 -0
  511. data/test/models/member.rb +9 -4
  512. data/test/models/membership.rb +2 -2
  513. data/test/models/message.rb +2 -1
  514. data/test/models/need_quoting.rb +5 -0
  515. data/test/models/paragraph.rb +5 -0
  516. data/test/models/parrot.rb +6 -3
  517. data/test/models/person.rb +7 -4
  518. data/test/models/pirate.rb +4 -1
  519. data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
  520. data/test/models/post.rb +65 -2
  521. data/test/models/post_encrypted.rb +15 -0
  522. data/test/models/post_with_prefetched_pk.rb +15 -0
  523. data/test/models/project.rb +1 -0
  524. data/test/models/publication.rb +16 -0
  525. data/test/models/raises_argument_error.rb +5 -0
  526. data/test/models/raises_no_method_error.rb +5 -0
  527. data/test/models/recipient.rb +5 -0
  528. data/test/models/reference.rb +1 -1
  529. data/test/models/reply.rb +1 -1
  530. data/test/models/room.rb +3 -0
  531. data/test/models/sharded/blog.rb +12 -0
  532. data/test/models/sharded/blog_post.rb +17 -0
  533. data/test/models/sharded/blog_post_destroy_async.rb +14 -0
  534. data/test/models/sharded/blog_post_tag.rb +11 -0
  535. data/test/models/sharded/blog_post_with_revision.rb +11 -0
  536. data/test/models/sharded/comment.rb +12 -0
  537. data/test/models/sharded/comment_destroy_async.rb +12 -0
  538. data/test/models/sharded/tag.rb +11 -0
  539. data/test/models/sharded.rb +8 -0
  540. data/test/models/ship.rb +1 -1
  541. data/test/models/shipping_line.rb +11 -0
  542. data/test/models/subscriber.rb +1 -0
  543. data/test/models/subscription.rb +3 -1
  544. data/test/models/too_long_table_name.rb +5 -0
  545. data/test/models/topic.rb +3 -1
  546. data/test/models/traffic_light.rb +2 -2
  547. data/test/models/traffic_light_encrypted.rb +21 -0
  548. data/test/models/translation.rb +9 -0
  549. data/test/models/treasure.rb +1 -1
  550. data/test/models/tyre.rb +1 -1
  551. data/test/models/user.rb +16 -0
  552. data/test/models/user_with_invalid_relation.rb +28 -0
  553. data/test/models/uuid_comment.rb +5 -0
  554. data/test/models/uuid_entry.rb +5 -0
  555. data/test/models/uuid_message.rb +5 -0
  556. data/test/models/zine.rb +2 -1
  557. data/test/schema/mysql2_specific_schema.rb +26 -12
  558. data/test/schema/postgresql_specific_schema.rb +121 -13
  559. data/test/schema/schema.rb +361 -103
  560. data/test/schema/sqlite_specific_schema.rb +17 -6
  561. data/test/schema/trilogy_specific_schema.rb +96 -0
  562. data/test/support/adapter_helper.rb +104 -0
  563. data/test/support/async_helper.rb +15 -0
  564. data/test/support/config.rb +1 -1
  565. data/test/support/connection.rb +14 -2
  566. data/test/support/ddl_helper.rb +1 -1
  567. data/test/support/fake_adapter.rb +42 -0
  568. data/test/support/load_schema_helper.rb +22 -0
  569. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
  570. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
  571. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
  572. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
  573. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
  574. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
  575. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
  576. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
  577. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
  578. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
  579. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
  580. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
  581. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
  582. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
  583. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
  584. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
  585. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
  586. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
  587. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
  588. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
  589. data/test/support/schema_dumping_helper.rb +15 -9
  590. data/test/support/tools.rb +37 -0
  591. data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
  592. metadata +247 -15
@@ -6,17 +6,27 @@ require "models/person"
6
6
  module ActiveRecord
7
7
  module ConnectionAdapters
8
8
  class ConnectionHandlerTest < ActiveRecord::TestCase
9
- self.use_transactional_tests = false
10
-
11
9
  fixtures :people
12
10
 
13
11
  def setup
14
12
  @handler = ConnectionHandler.new
15
- @owner_name = "ActiveRecord::Base"
13
+ @connection_name = "ActiveRecord::Base"
16
14
  db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
17
15
  @pool = @handler.establish_connection(db_config)
18
16
  end
19
17
 
18
+ def teardown
19
+ clean_up_connection_handler
20
+ end
21
+
22
+ def skip_unless_sqlite3_gem_available
23
+ @prev_configs ||= ActiveRecord::Base.configurations
24
+
25
+ return if Gem::Specification.find_all_by_name("sqlite3", ">= 2.1").any?
26
+
27
+ skip "requires sqlite3 gem (>= 2.1)"
28
+ end
29
+
20
30
  def test_default_env_fall_back_to_default_env_when_rails_env_or_rack_env_is_empty_string
21
31
  original_rails_env = ENV["RAILS_ENV"]
22
32
  original_rack_env = ENV["RACK_ENV"]
@@ -29,6 +39,8 @@ module ActiveRecord
29
39
  end
30
40
 
31
41
  def test_establish_connection_using_3_levels_config
42
+ skip_unless_sqlite3_gem_available
43
+
32
44
  previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
33
45
 
34
46
  config = {
@@ -61,41 +73,71 @@ module ActiveRecord
61
73
  ENV["RAILS_ENV"] = previous_env
62
74
  end
63
75
 
76
+ def test_validates_db_configuration_and_raises_on_invalid_adapter
77
+ config = {
78
+ "development" => { "adapter" => "ridiculous" },
79
+ }
80
+
81
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
82
+
83
+ assert_raises(ActiveRecord::AdapterNotFound) do
84
+ ActiveRecord::Base.establish_connection(:development)
85
+ end
86
+ ensure
87
+ ActiveRecord::Base.configurations = @prev_configs
88
+ end
89
+
64
90
  unless in_memory_db?
65
91
  def test_not_setting_writing_role_while_using_another_named_role_raises
66
92
  connection_handler = ActiveRecord::Base.connection_handler
67
93
  ActiveRecord::Base.connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
68
94
 
69
- ActiveRecord::Base.connects_to(shards: { default: { all: :arunit }, one: { all: :arunit } })
95
+ ActiveRecord::Base.connects_to(shards: { default: { also_writing: :arunit }, one: { also_writing: :arunit } })
70
96
 
71
97
  assert_raises(ArgumentError) { setup_shared_connection_pool }
72
98
  ensure
73
99
  ActiveRecord::Base.connection_handler = connection_handler
74
- ActiveRecord::Base.establish_connection :arunit
100
+ end
101
+
102
+ def test_fixtures_dont_raise_if_theres_no_writing_pool_config
103
+ connection_handler = ActiveRecord::Base.connection_handler
104
+ ActiveRecord::Base.connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
105
+
106
+ assert_nothing_raised do
107
+ ActiveRecord::Base.connects_to(database: { reading: :arunit, writing: :arunit })
108
+ end
109
+
110
+ rw_conn = ActiveRecord::Base.connection_handler.retrieve_connection("ActiveRecord::Base", role: :writing)
111
+ ro_conn = ActiveRecord::Base.connection_handler.retrieve_connection("ActiveRecord::Base", role: :reading)
112
+
113
+ assert_equal rw_conn, ro_conn
114
+ ensure
115
+ ActiveRecord::Base.connection_handler = connection_handler
75
116
  end
76
117
 
77
118
  def test_setting_writing_role_while_using_another_named_role_does_not_raise
78
119
  connection_handler = ActiveRecord::Base.connection_handler
79
120
  ActiveRecord::Base.connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
80
- old_role, ActiveRecord::Base.writing_role = ActiveRecord::Base.writing_role, :all
121
+ old_role, ActiveRecord.writing_role = ActiveRecord.writing_role, :also_writing
81
122
 
82
- ActiveRecord::Base.connects_to(shards: { default: { all: :arunit }, one: { all: :arunit } })
123
+ ActiveRecord::Base.connects_to(shards: { default: { also_writing: :arunit }, one: { also_writing: :arunit } })
83
124
 
84
125
  assert_nothing_raised { setup_shared_connection_pool }
85
126
  ensure
86
- ActiveRecord::Base.writing_role = old_role
127
+ ActiveRecord.writing_role = old_role
87
128
  ActiveRecord::Base.connection_handler = connection_handler
88
- ActiveRecord::Base.establish_connection :arunit
89
129
  end
90
130
 
91
131
  def test_establish_connection_with_primary_works_without_deprecation
92
132
  old_config = ActiveRecord::Base.configurations
133
+ skip_unless_sqlite3_gem_available
134
+
93
135
  config = { "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" } }
94
136
  ActiveRecord::Base.configurations = config
95
137
 
96
138
  @handler.establish_connection(:primary)
97
139
 
98
- assert_not_deprecated do
140
+ assert_not_deprecated(ActiveRecord.deprecator) do
99
141
  @handler.retrieve_connection("primary")
100
142
  @handler.remove_connection_pool("primary")
101
143
  end
@@ -103,21 +145,9 @@ module ActiveRecord
103
145
  ActiveRecord::Base.configurations = old_config
104
146
  end
105
147
 
106
- def test_retrieve_connection_shows_primary_deprecation_warning_when_established_on_active_record_base
107
- old_config = ActiveRecord::Base.configurations
108
- config = { "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" } }
109
- ActiveRecord::Base.configurations = config
110
-
111
- ActiveRecord::Base.establish_connection(:primary)
112
-
113
- assert_deprecated { @handler.retrieve_connection("primary") }
114
- assert_deprecated { @handler.remove_connection_pool("primary") }
115
- ensure
116
- ActiveRecord::Base.configurations = old_config
117
- ActiveRecord::Base.establish_connection(:arunit)
118
- end
119
-
120
148
  def test_establish_connection_using_3_level_config_defaults_to_default_env_primary_db
149
+ skip_unless_sqlite3_gem_available
150
+
121
151
  previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
122
152
 
123
153
  config = {
@@ -134,7 +164,7 @@ module ActiveRecord
134
164
 
135
165
  ActiveRecord::Base.establish_connection
136
166
 
137
- assert_match "test/db/primary.sqlite3", ActiveRecord::Base.connection.pool.db_config.database
167
+ assert_match "test/db/primary.sqlite3", ActiveRecord::Base.lease_connection.pool.db_config.database
138
168
  ensure
139
169
  ActiveRecord::Base.configurations = @prev_configs
140
170
  ENV["RAILS_ENV"] = previous_env
@@ -142,6 +172,8 @@ module ActiveRecord
142
172
  end
143
173
 
144
174
  def test_establish_connection_using_2_level_config_defaults_to_default_env_primary_db
175
+ skip_unless_sqlite3_gem_available
176
+
145
177
  previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
146
178
 
147
179
  config = {
@@ -156,39 +188,32 @@ module ActiveRecord
156
188
 
157
189
  ActiveRecord::Base.establish_connection
158
190
 
159
- assert_match "test/db/primary.sqlite3", ActiveRecord::Base.connection.pool.db_config.database
191
+ assert_match "test/db/primary.sqlite3", ActiveRecord::Base.lease_connection.pool.db_config.database
160
192
  ensure
161
193
  ActiveRecord::Base.configurations = @prev_configs
162
194
  ENV["RAILS_ENV"] = previous_env
163
195
  ActiveRecord::Base.establish_connection(:arunit)
164
196
  end
165
-
166
- def test_remove_connection_is_deprecated
167
- expected = @handler.retrieve_connection_pool(@owner_name).db_config.configuration_hash
168
-
169
- config_hash = assert_deprecated do
170
- @handler.remove_connection(@owner_name)
171
- end
172
-
173
- assert_equal expected, config_hash
174
- ensure
175
- ActiveRecord::Base.establish_connection(:arunit)
176
- end
177
197
  end
178
198
 
179
199
  def test_establish_connection_using_two_level_configurations
200
+ skip_unless_sqlite3_gem_available
201
+
180
202
  config = { "development" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" } }
181
203
  @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
182
204
 
183
205
  @handler.establish_connection(:development)
184
206
 
185
207
  assert_not_nil pool = @handler.retrieve_connection_pool("development")
208
+ assert_not_predicate pool.lease_connection, :preventing_writes?
186
209
  assert_equal "test/db/primary.sqlite3", pool.db_config.database
187
210
  ensure
188
211
  ActiveRecord::Base.configurations = @prev_configs
189
212
  end
190
213
 
191
214
  def test_establish_connection_using_top_level_key_in_two_level_config
215
+ skip_unless_sqlite3_gem_available
216
+
192
217
  config = {
193
218
  "development" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
194
219
  "development_readonly" => { "adapter" => "sqlite3", "database" => "test/db/readonly.sqlite3" }
@@ -198,6 +223,25 @@ module ActiveRecord
198
223
  @handler.establish_connection(:development_readonly)
199
224
 
200
225
  assert_not_nil pool = @handler.retrieve_connection_pool("development_readonly")
226
+ assert_not_predicate pool.lease_connection, :preventing_writes?
227
+ assert_equal "test/db/readonly.sqlite3", pool.db_config.database
228
+ ensure
229
+ ActiveRecord::Base.configurations = @prev_configs
230
+ end
231
+
232
+ def test_establish_connection_with_string_owner_name
233
+ skip_unless_sqlite3_gem_available
234
+
235
+ config = {
236
+ "development" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
237
+ "development_readonly" => { "adapter" => "sqlite3", "database" => "test/db/readonly.sqlite3" }
238
+ }
239
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
240
+
241
+ @handler.establish_connection(:development_readonly, owner_name: "custom_connection")
242
+
243
+ assert_not_nil pool = @handler.retrieve_connection_pool("custom_connection")
244
+ assert_not_predicate pool.lease_connection, :preventing_writes?
201
245
  assert_equal "test/db/readonly.sqlite3", pool.db_config.database
202
246
  ensure
203
247
  ActiveRecord::Base.configurations = @prev_configs
@@ -209,13 +253,13 @@ module ActiveRecord
209
253
  development: {
210
254
  primary: {
211
255
  adapter: "sqlite3",
212
- database: "test/db/development.sqlite3",
256
+ database: "test/storage/development.sqlite3",
213
257
  },
214
258
  },
215
259
  test: {
216
260
  primary: {
217
261
  adapter: "sqlite3",
218
- database: "test/db/test.sqlite3",
262
+ database: "test/storage/test.sqlite3",
219
263
  },
220
264
  },
221
265
  }
@@ -234,19 +278,19 @@ module ActiveRecord
234
278
  end
235
279
 
236
280
  def test_retrieve_connection
237
- assert @handler.retrieve_connection(@owner_name)
281
+ assert @handler.retrieve_connection(@connection_name)
238
282
  end
239
283
 
240
284
  def test_active_connections?
241
- assert_not_predicate @handler, :active_connections?
242
- assert @handler.retrieve_connection(@owner_name)
243
- assert_predicate @handler, :active_connections?
244
- @handler.clear_active_connections!
245
- assert_not_predicate @handler, :active_connections?
285
+ assert_not @handler.active_connections?(:all)
286
+ assert @handler.retrieve_connection(@connection_name)
287
+ assert @handler.active_connections?(:all)
288
+ @handler.clear_active_connections!(:all)
289
+ assert_not @handler.active_connections?(:all)
246
290
  end
247
291
 
248
292
  def test_retrieve_connection_pool
249
- assert_not_nil @handler.retrieve_connection_pool(@owner_name)
293
+ assert_not_nil @handler.retrieve_connection_pool(@connection_name)
250
294
  end
251
295
 
252
296
  def test_retrieve_connection_pool_with_invalid_id
@@ -260,15 +304,15 @@ module ActiveRecord
260
304
  def test_a_class_using_custom_pool_and_switching_back_to_primary
261
305
  klass2 = Class.new(Base) { def self.name; "klass2"; end }
262
306
 
263
- assert_same klass2.connection, ActiveRecord::Base.connection
307
+ assert_same klass2.lease_connection, ActiveRecord::Base.lease_connection
264
308
 
265
309
  pool = klass2.establish_connection(ActiveRecord::Base.connection_pool.db_config.configuration_hash)
266
- assert_same klass2.connection, pool.connection
267
- assert_not_same klass2.connection, ActiveRecord::Base.connection
310
+ assert_same klass2.lease_connection, pool.lease_connection
311
+ assert_not_same klass2.lease_connection, ActiveRecord::Base.lease_connection
268
312
 
269
313
  klass2.remove_connection
270
314
 
271
- assert_same klass2.connection, ActiveRecord::Base.connection
315
+ assert_same klass2.lease_connection, ActiveRecord::Base.lease_connection
272
316
  end
273
317
 
274
318
  class ApplicationRecord < ActiveRecord::Base
@@ -297,6 +341,7 @@ module ActiveRecord
297
341
  ActiveRecord::Base.connection_specification_name = "readonly"
298
342
  assert_equal "readonly", klassC.connection_specification_name
299
343
  ensure
344
+ ApplicationRecord.remove_connection
300
345
  Object.send :remove_const, :ApplicationRecord
301
346
  ActiveRecord::Base.connection_specification_name = "ActiveRecord::Base"
302
347
  end
@@ -304,18 +349,18 @@ module ActiveRecord
304
349
  def test_remove_connection_should_not_remove_parent
305
350
  klass2 = Class.new(Base) { def self.name; "klass2"; end }
306
351
  klass2.remove_connection
307
- assert_not_nil ActiveRecord::Base.connection
308
- assert_same klass2.connection, ActiveRecord::Base.connection
352
+ assert_not_nil ActiveRecord::Base.lease_connection
353
+ assert_same klass2.lease_connection, ActiveRecord::Base.lease_connection
309
354
  end
310
355
 
311
356
  def test_default_handlers_are_writing_and_reading
312
- assert_equal :writing, ActiveRecord::Base.writing_role
313
- assert_equal :reading, ActiveRecord::Base.reading_role
357
+ assert_equal :writing, ActiveRecord.writing_role
358
+ assert_equal :reading, ActiveRecord.reading_role
314
359
  end
315
360
 
316
361
  if Process.respond_to?(:fork)
317
362
  def test_connection_pool_per_pid
318
- object_id = ActiveRecord::Base.connection.object_id
363
+ object_id = ActiveRecord::Base.lease_connection.object_id
319
364
 
320
365
  rd, wr = IO.pipe
321
366
  rd.binmode
@@ -323,7 +368,7 @@ module ActiveRecord
323
368
 
324
369
  pid = fork {
325
370
  rd.close
326
- wr.write Marshal.dump ActiveRecord::Base.connection.object_id
371
+ wr.write Marshal.dump ActiveRecord::Base.lease_connection.object_id
327
372
  wr.close
328
373
  exit!
329
374
  }
@@ -336,8 +381,8 @@ module ActiveRecord
336
381
  end
337
382
 
338
383
  def test_forked_child_doesnt_mangle_parent_connection
339
- object_id = ActiveRecord::Base.connection.object_id
340
- assert_predicate ActiveRecord::Base.connection, :active?
384
+ object_id = ActiveRecord::Base.lease_connection.object_id
385
+ assert_predicate ActiveRecord::Base.lease_connection, :active?
341
386
 
342
387
  rd, wr = IO.pipe
343
388
  rd.binmode
@@ -345,9 +390,9 @@ module ActiveRecord
345
390
 
346
391
  pid = fork {
347
392
  rd.close
348
- if ActiveRecord::Base.connection.active?
349
- wr.write Marshal.dump ActiveRecord::Base.connection.object_id
350
- end
393
+ wr.write Marshal.dump [
394
+ ActiveRecord::Base.lease_connection.object_id,
395
+ ]
351
396
  wr.close
352
397
 
353
398
  exit # allow finalizers to run
@@ -356,31 +401,32 @@ module ActiveRecord
356
401
  wr.close
357
402
 
358
403
  Process.waitpid pid
359
- assert_not_equal object_id, Marshal.load(rd.read)
404
+ child_id = Marshal.load(rd.read)
405
+ assert_not_equal object_id, child_id
360
406
  rd.close
361
407
 
362
- assert_equal 3, ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM people")
408
+ assert_equal 3, ActiveRecord::Base.lease_connection.select_value("SELECT COUNT(*) FROM people")
363
409
  end
364
410
 
365
411
  unless in_memory_db?
366
412
  def test_forked_child_recovers_from_disconnected_parent
367
- object_id = ActiveRecord::Base.connection.object_id
368
- assert_predicate ActiveRecord::Base.connection, :active?
413
+ object_id = ActiveRecord::Base.lease_connection.object_id
414
+ assert_predicate ActiveRecord::Base.lease_connection, :active?
369
415
 
370
416
  rd, wr = IO.pipe
371
417
  rd.binmode
372
418
  wr.binmode
373
419
 
374
420
  outer_pid = fork {
375
- ActiveRecord::Base.connection.disconnect!
421
+ ActiveRecord::Base.lease_connection.disconnect!
376
422
 
377
423
  pid = fork {
378
424
  rd.close
379
- if ActiveRecord::Base.connection.active?
380
- pair = [ActiveRecord::Base.connection.object_id,
381
- ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM people")]
382
- wr.write Marshal.dump pair
383
- end
425
+ wr.write Marshal.dump [
426
+ !!ActiveRecord::Base.lease_connection.active?,
427
+ ActiveRecord::Base.lease_connection.object_id,
428
+ ActiveRecord::Base.lease_connection.select_value("SELECT COUNT(*) FROM people"),
429
+ ]
384
430
  wr.close
385
431
 
386
432
  exit # allow finalizers to run
@@ -392,20 +438,20 @@ module ActiveRecord
392
438
  wr.close
393
439
 
394
440
  Process.waitpid outer_pid
395
- child_id, child_count = Marshal.load(rd.read)
441
+ active, child_id, child_count = Marshal.load(rd.read)
396
442
 
443
+ assert_equal false, active
397
444
  assert_not_equal object_id, child_id
398
445
  rd.close
399
446
 
400
447
  assert_equal 3, child_count
401
448
 
402
449
  # Outer connection is unaffected
403
- assert_equal 6, ActiveRecord::Base.connection.select_value("SELECT 2 * COUNT(*) FROM people")
450
+ assert_equal 6, ActiveRecord::Base.lease_connection.select_value("SELECT 2 * COUNT(*) FROM people")
404
451
  end
405
452
  end
406
453
 
407
454
  def test_retrieve_connection_pool_copies_schema_cache_from_ancestor_pool
408
- @pool.schema_cache = @pool.connection.schema_cache
409
455
  @pool.schema_cache.add("posts")
410
456
 
411
457
  rd, wr = IO.pipe
@@ -414,7 +460,7 @@ module ActiveRecord
414
460
 
415
461
  pid = fork {
416
462
  rd.close
417
- pool = @handler.retrieve_connection_pool(@owner_name)
463
+ pool = @handler.retrieve_connection_pool(@connection_name)
418
464
  wr.write Marshal.dump pool.schema_cache.size
419
465
  wr.close
420
466
  exit!
@@ -427,38 +473,38 @@ module ActiveRecord
427
473
  rd.close
428
474
  end
429
475
 
430
- def test_pool_from_any_process_for_uses_most_recent_spec
431
- skip unless current_adapter?(:SQLite3Adapter)
476
+ if current_adapter?(:SQLite3Adapter)
477
+ def test_pool_from_any_process_for_uses_most_recent_spec
478
+ file = Tempfile.new "lol.sqlite3"
432
479
 
433
- file = Tempfile.new "lol.sqlite3"
480
+ rd, wr = IO.pipe
481
+ rd.binmode
482
+ wr.binmode
434
483
 
435
- rd, wr = IO.pipe
436
- rd.binmode
437
- wr.binmode
484
+ pid = fork do
485
+ config_hash = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary").configuration_hash.merge(database: file.path)
486
+ ActiveRecord::Base.establish_connection(config_hash)
438
487
 
439
- pid = fork do
440
- config_hash = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary").configuration_hash.merge(database: file.path)
441
- ActiveRecord::Base.establish_connection(config_hash)
488
+ pid2 = fork do
489
+ wr.write ActiveRecord::Base.connection_db_config.database
490
+ wr.close
491
+ end
442
492
 
443
- pid2 = fork do
444
- wr.write ActiveRecord::Base.connection_db_config.database
445
- wr.close
493
+ Process.waitpid pid2
446
494
  end
447
495
 
448
- Process.waitpid pid2
449
- end
496
+ Process.waitpid pid
450
497
 
451
- Process.waitpid pid
452
-
453
- wr.close
498
+ wr.close
454
499
 
455
- assert_equal file.path, rd.read
500
+ assert_equal file.path, rd.read
456
501
 
457
- rd.close
458
- ensure
459
- if file
460
- file.close
461
- file.unlink
502
+ rd.close
503
+ ensure
504
+ if file
505
+ file.close
506
+ file.unlink
507
+ end
462
508
  end
463
509
  end
464
510
  end