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,915 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/topic"
5
+ require "models/task"
6
+ require "models/category"
7
+ require "models/post"
8
+ require "rack"
9
+
10
+ class QueryCacheTest < ActiveRecord::TestCase
11
+ self.use_transactional_tests = false
12
+
13
+ fixtures :tasks, :topics, :categories, :posts, :categories_posts
14
+
15
+ class ShouldNotHaveExceptionsLogger < ActiveRecord::LogSubscriber
16
+ attr_reader :logger, :events
17
+
18
+ def initialize
19
+ super
20
+ @logger = ::Logger.new File::NULL
21
+ @exception = false
22
+ @events = []
23
+ end
24
+
25
+ def exception?
26
+ @exception
27
+ end
28
+
29
+ def sql(event)
30
+ @events << event
31
+ super
32
+ rescue
33
+ @exception = true
34
+ end
35
+ end
36
+
37
+ def teardown
38
+ Task.connection.clear_query_cache
39
+ ActiveRecord::Base.connection.disable_query_cache!
40
+ super
41
+ end
42
+
43
+ def test_writes_should_always_clear_cache
44
+ assert_cache :off
45
+
46
+ mw = middleware { |env|
47
+ Post.first
48
+ query_cache = ActiveRecord::Base.connection.query_cache
49
+ assert_equal 1, query_cache.length, query_cache.keys
50
+ Post.connection.uncached do
51
+ # should clear the cache
52
+ Post.create!(title: "a new post", body: "and a body")
53
+ end
54
+ query_cache = ActiveRecord::Base.connection.query_cache
55
+ assert_equal 0, query_cache.length, query_cache.keys
56
+ }
57
+ mw.call({})
58
+
59
+ assert_cache :off
60
+ end
61
+
62
+ def test_exceptional_middleware_clears_and_disables_cache_on_error
63
+ assert_cache :off
64
+
65
+ mw = middleware { |env|
66
+ Task.find 1
67
+ Task.find 1
68
+ query_cache = ActiveRecord::Base.connection.query_cache
69
+ assert_equal 1, query_cache.length, query_cache.keys
70
+ raise "lol borked"
71
+ }
72
+ assert_raises(RuntimeError) { mw.call({}) }
73
+
74
+ assert_cache :off
75
+ end
76
+
77
+ def test_query_cache_is_applied_to_legacy_connections_in_all_handlers
78
+ old_value = ActiveRecord::Base.legacy_connection_handling
79
+ ActiveRecord::Base.legacy_connection_handling = true
80
+
81
+ ActiveRecord::Base.connection_handlers = {
82
+ writing: ActiveRecord::Base.default_connection_handler,
83
+ reading: ActiveRecord::ConnectionAdapters::ConnectionHandler.new
84
+ }
85
+
86
+ ActiveRecord::Base.connected_to(role: :reading) do
87
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
88
+ ActiveRecord::Base.establish_connection(db_config)
89
+ end
90
+
91
+ mw = middleware { |env|
92
+ reading_handler = ActiveRecord::Base.connection_handlers[:reading]
93
+ ro_pool = reading_handler.connection_pool_list
94
+ ro_conn = ro_pool.first.connection
95
+ assert_predicate ActiveRecord::Base.connection, :query_cache_enabled
96
+ assert_predicate ro_conn, :query_cache_enabled
97
+ }
98
+
99
+ mw.call({})
100
+ ensure
101
+ clean_up_legacy_connection_handlers
102
+ ActiveRecord::Base.legacy_connection_handling = old_value
103
+ end
104
+
105
+ def test_query_cache_is_applied_to_all_connections
106
+ ActiveRecord::Base.connected_to(role: :reading) do
107
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
108
+ ActiveRecord::Base.establish_connection(db_config)
109
+ end
110
+
111
+ mw = middleware { |env|
112
+ rw_conn = ActiveRecord::Base.connection_handler.connection_pool_list(:writing).first.connection
113
+ assert_predicate rw_conn, :query_cache_enabled
114
+
115
+ ro_conn = ActiveRecord::Base.connection_handler.connection_pool_list(:reading).first.connection
116
+ assert_predicate ActiveRecord::Base.connection, :query_cache_enabled
117
+ assert_predicate ro_conn, :query_cache_enabled
118
+ }
119
+
120
+ mw.call({})
121
+ ensure
122
+ clean_up_connection_handler
123
+ end
124
+
125
+ if Process.respond_to?(:fork) && !in_memory_db?
126
+ def test_query_cache_with_multiple_handlers_and_forked_processes_legacy_handling
127
+ old_value = ActiveRecord::Base.legacy_connection_handling
128
+ ActiveRecord::Base.legacy_connection_handling = true
129
+ ActiveRecord::Base.connection_handlers = {
130
+ writing: ActiveRecord::Base.default_connection_handler,
131
+ reading: ActiveRecord::ConnectionAdapters::ConnectionHandler.new
132
+ }
133
+
134
+ ActiveRecord::Base.connected_to(role: :reading) do
135
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
136
+ ActiveRecord::Base.establish_connection(db_config)
137
+ end
138
+
139
+ rd, wr = IO.pipe
140
+ rd.binmode
141
+ wr.binmode
142
+
143
+ pid = fork {
144
+ rd.close
145
+ status = 0
146
+
147
+ middleware { |env|
148
+ begin
149
+ assert_cache :clean
150
+
151
+ # first request dirties cache
152
+ ActiveRecord::Base.connected_to(role: :reading) do
153
+ Post.first
154
+ assert_cache :dirty
155
+ end
156
+
157
+ # should clear the cache
158
+ Post.create!(title: "a new post", body: "and a body")
159
+
160
+ # fails because cache is still dirty
161
+ ActiveRecord::Base.connected_to(role: :reading) do
162
+ assert_cache :clean
163
+ Post.first
164
+ end
165
+
166
+ rescue Minitest::Assertion => e
167
+ wr.write Marshal.dump e
168
+ status = 1
169
+ end
170
+ }.call({})
171
+
172
+ wr.close
173
+ exit!(status)
174
+ }
175
+
176
+ wr.close
177
+
178
+ Process.waitpid pid
179
+ if !$?.success?
180
+ raise Marshal.load(rd.read)
181
+ else
182
+ assert_predicate $?, :success?
183
+ end
184
+
185
+ rd.close
186
+ ensure
187
+ clean_up_legacy_connection_handlers
188
+ ActiveRecord::Base.legacy_connection_handling = old_value
189
+ end
190
+
191
+ def test_query_cache_with_forked_processes
192
+ ActiveRecord::Base.connected_to(role: :reading) do
193
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
194
+ ActiveRecord::Base.establish_connection(db_config)
195
+ end
196
+
197
+ rd, wr = IO.pipe
198
+ rd.binmode
199
+ wr.binmode
200
+
201
+ pid = fork {
202
+ rd.close
203
+ status = 0
204
+
205
+ middleware { |env|
206
+ begin
207
+ assert_cache :clean
208
+
209
+ # first request dirties cache
210
+ ActiveRecord::Base.connected_to(role: :reading) do
211
+ Post.first
212
+ assert_cache :dirty
213
+ end
214
+
215
+ # should clear the cache
216
+ Post.create!(title: "a new post", body: "and a body")
217
+
218
+ # fails because cache is still dirty
219
+ ActiveRecord::Base.connected_to(role: :reading) do
220
+ assert_cache :clean
221
+ Post.first
222
+ end
223
+
224
+ rescue Minitest::Assertion => e
225
+ wr.write Marshal.dump e
226
+ status = 1
227
+ end
228
+ }.call({})
229
+
230
+ wr.close
231
+ exit!(status)
232
+ }
233
+
234
+ wr.close
235
+
236
+ Process.waitpid pid
237
+ if !$?.success?
238
+ raise Marshal.load(rd.read)
239
+ else
240
+ assert_predicate $?, :success?
241
+ end
242
+
243
+ rd.close
244
+ ensure
245
+ clean_up_connection_handler
246
+ end
247
+ end
248
+
249
+ def test_query_cache_across_threads
250
+ with_temporary_connection_pool do
251
+ if in_memory_db?
252
+ # Separate connections to an in-memory database create an entirely new database,
253
+ # with an empty schema etc, so we just stub out this schema on the fly.
254
+ ActiveRecord::Base.connection_pool.with_connection do |connection|
255
+ connection.create_table :tasks do |t|
256
+ t.datetime :starting
257
+ t.datetime :ending
258
+ end
259
+ end
260
+ ActiveRecord::FixtureSet.create_fixtures(self.class.fixture_path, ["tasks"], {}, ActiveRecord::Base)
261
+ end
262
+
263
+ ActiveRecord::Base.connection_pool.connections.each do |conn|
264
+ assert_cache :off, conn
265
+ end
266
+
267
+ assert_not_predicate ActiveRecord::Base.connection, :nil?
268
+ assert_cache :off
269
+
270
+ middleware {
271
+ assert_cache :clean
272
+
273
+ Task.find 1
274
+ assert_cache :dirty
275
+
276
+ thread_1_connection = ActiveRecord::Base.connection
277
+ ActiveRecord::Base.clear_active_connections!
278
+ assert_cache :off, thread_1_connection
279
+
280
+ started = Concurrent::Event.new
281
+ checked = Concurrent::Event.new
282
+
283
+ thread_2_connection = nil
284
+ thread = Thread.new {
285
+ thread_2_connection = ActiveRecord::Base.connection
286
+
287
+ assert_equal thread_2_connection, thread_1_connection
288
+ assert_cache :off
289
+
290
+ middleware {
291
+ assert_cache :clean
292
+
293
+ Task.find 1
294
+ assert_cache :dirty
295
+
296
+ started.set
297
+ checked.wait
298
+
299
+ ActiveRecord::Base.clear_active_connections!
300
+ }.call({})
301
+ }
302
+
303
+ started.wait
304
+
305
+ thread_1_connection = ActiveRecord::Base.connection
306
+ assert_not_equal thread_1_connection, thread_2_connection
307
+ assert_cache :dirty, thread_2_connection
308
+ checked.set
309
+ thread.join
310
+
311
+ assert_cache :off, thread_2_connection
312
+ }.call({})
313
+
314
+ ActiveRecord::Base.connection_pool.connections.each do |conn|
315
+ assert_cache :off, conn
316
+ end
317
+ ensure
318
+ ActiveRecord::Base.connection_pool.disconnect!
319
+ end
320
+ end
321
+
322
+ def test_middleware_delegates
323
+ called = false
324
+ mw = middleware { |env|
325
+ called = true
326
+ [200, {}, nil]
327
+ }
328
+ mw.call({})
329
+ assert called, "middleware should delegate"
330
+ end
331
+
332
+ def test_middleware_caches
333
+ mw = middleware { |env|
334
+ Task.find 1
335
+ Task.find 1
336
+ query_cache = ActiveRecord::Base.connection.query_cache
337
+ assert_equal 1, query_cache.length, query_cache.keys
338
+ [200, {}, nil]
339
+ }
340
+ mw.call({})
341
+ end
342
+
343
+ def test_cache_enabled_during_call
344
+ assert_cache :off
345
+
346
+ mw = middleware { |env|
347
+ assert_cache :clean
348
+ [200, {}, nil]
349
+ }
350
+ mw.call({})
351
+ end
352
+
353
+ def test_cache_passing_a_relation
354
+ post = Post.first
355
+ Post.cache do
356
+ query = post.categories.select(:post_id)
357
+ assert Post.connection.select_all(query).is_a?(ActiveRecord::Result)
358
+ end
359
+ end
360
+
361
+ def test_find_queries
362
+ assert_queries(2) { Task.find(1); Task.find(1) }
363
+ end
364
+
365
+ def test_find_queries_with_cache
366
+ Task.cache do
367
+ assert_queries(1) { Task.find(1); Task.find(1) }
368
+ end
369
+ end
370
+
371
+ def test_find_queries_with_cache_multi_record
372
+ Task.cache do
373
+ assert_queries(2) { Task.find(1); Task.find(1); Task.find(2) }
374
+ end
375
+ end
376
+
377
+ def test_find_queries_with_multi_cache_blocks
378
+ Task.cache do
379
+ Task.cache do
380
+ assert_queries(2) { Task.find(1); Task.find(2) }
381
+ end
382
+ assert_no_queries { Task.find(1); Task.find(1); Task.find(2) }
383
+ end
384
+ end
385
+
386
+ def test_count_queries_with_cache
387
+ Task.cache do
388
+ assert_queries(1) { Task.count; Task.count }
389
+ end
390
+ end
391
+
392
+ def test_exists_queries_with_cache
393
+ Post.cache do
394
+ assert_queries(1) { Post.exists?; Post.exists? }
395
+ end
396
+ end
397
+
398
+ def test_select_all_with_cache
399
+ Post.cache do
400
+ assert_queries(1) do
401
+ 2.times { Post.connection.select_all(Post.all) }
402
+ end
403
+ end
404
+ end
405
+
406
+ def test_select_one_with_cache
407
+ Post.cache do
408
+ assert_queries(1) do
409
+ 2.times { Post.connection.select_one(Post.all) }
410
+ end
411
+ end
412
+ end
413
+
414
+ def test_select_value_with_cache
415
+ Post.cache do
416
+ assert_queries(1) do
417
+ 2.times { Post.connection.select_value(Post.all) }
418
+ end
419
+ end
420
+ end
421
+
422
+ def test_select_values_with_cache
423
+ Post.cache do
424
+ assert_queries(1) do
425
+ 2.times { Post.connection.select_values(Post.all) }
426
+ end
427
+ end
428
+ end
429
+
430
+ def test_select_rows_with_cache
431
+ Post.cache do
432
+ assert_queries(1) do
433
+ 2.times { Post.connection.select_rows(Post.all) }
434
+ end
435
+ end
436
+ end
437
+
438
+ def test_query_cache_dups_results_correctly
439
+ Task.cache do
440
+ now = Time.now.utc
441
+ task = Task.find 1
442
+ assert_not_equal now, task.starting
443
+ task.starting = now
444
+ task.reload
445
+ assert_not_equal now, task.starting
446
+ end
447
+ end
448
+
449
+ def test_cache_notifications_can_be_overridden
450
+ logger = ShouldNotHaveExceptionsLogger.new
451
+ subscriber = ActiveSupport::Notifications.subscribe "sql.active_record", logger
452
+
453
+ connection = ActiveRecord::Base.connection.dup
454
+
455
+ def connection.cache_notification_info(sql, name, binds)
456
+ super.merge(neat: true)
457
+ end
458
+
459
+ connection.cache do
460
+ connection.select_all "select 1 from SYSIBM.DUAL"
461
+ connection.select_all "select 1 from SYSIBM.DUAL"
462
+ end
463
+
464
+ assert_equal true, logger.events.last.payload[:neat]
465
+ ensure
466
+ ActiveSupport::Notifications.unsubscribe subscriber
467
+ end
468
+
469
+ def test_cache_does_not_raise_exceptions
470
+ logger = ShouldNotHaveExceptionsLogger.new
471
+ subscriber = ActiveSupport::Notifications.subscribe "sql.active_record", logger
472
+
473
+ ActiveRecord::Base.cache do
474
+ assert_queries(1) { Task.find(1); Task.find(1) }
475
+ end
476
+
477
+ assert_not_predicate logger, :exception?
478
+ ensure
479
+ ActiveSupport::Notifications.unsubscribe subscriber
480
+ end
481
+
482
+ def test_query_cache_does_not_allow_sql_key_mutation
483
+ subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |_, _, _, _, payload|
484
+ payload[:sql].downcase!
485
+ end
486
+
487
+ assert_raises FrozenError do
488
+ ActiveRecord::Base.cache do
489
+ assert_queries(1) { Task.find(1); Task.find(1) }
490
+ end
491
+ end
492
+ ensure
493
+ ActiveSupport::Notifications.unsubscribe subscriber
494
+ end
495
+
496
+ def test_cache_is_flat
497
+ Task.cache do
498
+ assert_queries(1) { Topic.find(1); Topic.find(1); }
499
+ end
500
+
501
+ ActiveRecord::Base.cache do
502
+ assert_queries(1) { Task.find(1); Task.find(1) }
503
+ end
504
+ end
505
+
506
+ def test_cache_does_not_wrap_results_in_arrays
507
+ Task.cache do
508
+ assert_equal 2, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
509
+ end
510
+ end
511
+
512
+ def test_cache_is_ignored_for_locked_relations
513
+ task = Task.find 1
514
+
515
+ Task.cache do
516
+ assert_queries(2) { task.lock!; task.lock! }
517
+ end
518
+ end
519
+
520
+ def test_cache_is_available_when_connection_is_connected
521
+ conf = ActiveRecord::Base.configurations
522
+
523
+ ActiveRecord::Base.configurations = {}
524
+ Task.cache do
525
+ assert_queries(1) { Task.find(1); Task.find(1) }
526
+ end
527
+ ensure
528
+ ActiveRecord::Base.configurations = conf
529
+ end
530
+
531
+ def test_cache_is_available_when_using_a_not_connected_connection
532
+ skip "In-Memory DB can't test for using a not connected connection" if in_memory_db?
533
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary").dup
534
+ db_config.owner_name = "test2"
535
+ ActiveRecord::Base.connection_handler.establish_connection(db_config)
536
+ assert_not_predicate Task, :connected?
537
+
538
+ Task.cache do
539
+ assert_queries(1) { Task.find(1); Task.find(1) }
540
+ ensure
541
+ ActiveRecord::Base.connection_handler.remove_connection_pool(db_config.owner_name)
542
+ end
543
+ end
544
+
545
+ def test_query_cache_executes_new_queries_within_block
546
+ ActiveRecord::Base.connection.enable_query_cache!
547
+
548
+ # Warm up the cache by running the query
549
+ assert_queries(1) do
550
+ assert_equal 0, Post.where(title: "test").to_a.count
551
+ end
552
+
553
+ # Check that if the same query is run again, no queries are executed
554
+ assert_no_queries do
555
+ assert_equal 0, Post.where(title: "test").to_a.count
556
+ end
557
+
558
+ ActiveRecord::Base.connection.uncached do
559
+ # Check that new query is executed, avoiding the cache
560
+ assert_queries(1) do
561
+ assert_equal 0, Post.where(title: "test").to_a.count
562
+ end
563
+ end
564
+ end
565
+
566
+ def test_query_cache_doesnt_leak_cached_results_of_rolled_back_queries
567
+ ActiveRecord::Base.connection.enable_query_cache!
568
+ post = Post.first
569
+
570
+ Post.transaction do
571
+ post.update(title: "rollback")
572
+ assert_equal 1, Post.where(title: "rollback").to_a.count
573
+ raise ActiveRecord::Rollback
574
+ end
575
+
576
+ assert_equal 0, Post.where(title: "rollback").to_a.count
577
+
578
+ ActiveRecord::Base.connection.uncached do
579
+ assert_equal 0, Post.where(title: "rollback").to_a.count
580
+ end
581
+
582
+ begin
583
+ Post.transaction do
584
+ post.update(title: "rollback")
585
+ assert_equal 1, Post.where(title: "rollback").to_a.count
586
+ raise "broken"
587
+ end
588
+ rescue Exception
589
+ end
590
+
591
+ assert_equal 0, Post.where(title: "rollback").to_a.count
592
+
593
+ ActiveRecord::Base.connection.uncached do
594
+ assert_equal 0, Post.where(title: "rollback").to_a.count
595
+ end
596
+ end
597
+
598
+ def test_query_cached_even_when_types_are_reset
599
+ Task.cache do
600
+ # Warm the cache
601
+ Task.find(1)
602
+
603
+ # Preload the type cache again (so we don't have those queries issued during our assertions)
604
+ Task.connection.send(:reload_type_map)
605
+
606
+ # Clear places where type information is cached
607
+ Task.reset_column_information
608
+ Task.initialize_find_by_cache
609
+ Task.define_attribute_methods
610
+
611
+ assert_no_queries do
612
+ Task.find(1)
613
+ end
614
+ end
615
+ end
616
+
617
+ def test_query_cache_does_not_establish_connection_if_unconnected
618
+ ActiveRecord::Base.clear_active_connections!
619
+ assert_not ActiveRecord::Base.connection_handler.active_connections? # sanity check
620
+
621
+ middleware {
622
+ assert_not ActiveRecord::Base.connection_handler.active_connections?, "QueryCache forced ActiveRecord::Base to establish a connection in setup"
623
+ }.call({})
624
+
625
+ assert_not ActiveRecord::Base.connection_handler.active_connections?, "QueryCache forced ActiveRecord::Base to establish a connection in cleanup"
626
+ end
627
+
628
+ def test_query_cache_is_enabled_on_connections_established_after_middleware_runs
629
+ ActiveRecord::Base.clear_active_connections!
630
+ assert_not ActiveRecord::Base.connection_handler.active_connections? # sanity check
631
+
632
+ middleware {
633
+ assert_predicate ActiveRecord::Base.connection, :query_cache_enabled
634
+ }.call({})
635
+ assert_not_predicate ActiveRecord::Base.connection, :query_cache_enabled
636
+ end
637
+
638
+ def test_query_caching_is_local_to_the_current_thread
639
+ ActiveRecord::Base.clear_active_connections!
640
+
641
+ middleware {
642
+ assert ActiveRecord::Base.connection_pool.query_cache_enabled
643
+ assert ActiveRecord::Base.connection.query_cache_enabled
644
+
645
+ Thread.new {
646
+ assert_not ActiveRecord::Base.connection_pool.query_cache_enabled
647
+ assert_not ActiveRecord::Base.connection.query_cache_enabled
648
+ }.join
649
+ }.call({})
650
+ end
651
+
652
+ def test_query_cache_is_enabled_on_all_connection_pools
653
+ middleware {
654
+ ActiveRecord::Base.connection_handler.connection_pool_list.each do |pool|
655
+ assert pool.query_cache_enabled
656
+ assert pool.connection.query_cache_enabled
657
+ end
658
+ }.call({})
659
+ end
660
+
661
+ def test_clear_query_cache_is_called_on_all_legacy_connections
662
+ skip "with in memory db, reading role won't be able to see database on writing role" if in_memory_db?
663
+ old_value = ActiveRecord::Base.legacy_connection_handling
664
+ ActiveRecord::Base.legacy_connection_handling = true
665
+
666
+ ActiveRecord::Base.connection_handlers = {
667
+ writing: ActiveRecord::Base.default_connection_handler,
668
+ reading: ActiveRecord::ConnectionAdapters::ConnectionHandler.new
669
+ }
670
+
671
+ ActiveRecord::Base.connected_to(role: :reading) do
672
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
673
+ ActiveRecord::Base.establish_connection(db_config)
674
+ end
675
+
676
+ mw = middleware { |env|
677
+ ActiveRecord::Base.connected_to(role: :reading) do
678
+ @topic = Topic.first
679
+ end
680
+
681
+ assert @topic
682
+
683
+ ActiveRecord::Base.connected_to(role: :writing) do
684
+ @topic.title = "It doesn't have to be crazy at work"
685
+ @topic.save!
686
+ end
687
+
688
+ assert_equal "It doesn't have to be crazy at work", @topic.title
689
+
690
+ ActiveRecord::Base.connected_to(role: :reading) do
691
+ @topic = Topic.first
692
+ assert_equal "It doesn't have to be crazy at work", @topic.title
693
+ end
694
+ }
695
+
696
+ mw.call({})
697
+ ensure
698
+ unless in_memory_db?
699
+ clean_up_legacy_connection_handlers
700
+ ActiveRecord::Base.legacy_connection_handling = old_value
701
+ end
702
+ end
703
+
704
+ def test_clear_query_cache_is_called_on_all_connections
705
+ skip "with in memory db, reading role won't be able to see database on writing role" if in_memory_db?
706
+
707
+ ActiveRecord::Base.connected_to(role: :reading) do
708
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
709
+ ActiveRecord::Base.establish_connection(db_config)
710
+ end
711
+
712
+ mw = middleware { |env|
713
+ ActiveRecord::Base.connected_to(role: :reading) do
714
+ @topic = Topic.first
715
+ end
716
+
717
+ assert @topic
718
+
719
+ ActiveRecord::Base.connected_to(role: :writing) do
720
+ @topic.title = "It doesn't have to be crazy at work"
721
+ @topic.save!
722
+ end
723
+
724
+ assert_equal "It doesn't have to be crazy at work", @topic.title
725
+
726
+ ActiveRecord::Base.connected_to(role: :reading) do
727
+ @topic = Topic.first
728
+ assert_equal "It doesn't have to be crazy at work", @topic.title
729
+ end
730
+ }
731
+
732
+ mw.call({})
733
+ ensure
734
+ clean_up_connection_handler
735
+ end
736
+
737
+ test "query cache is enabled in threads with shared connection" do
738
+ ActiveRecord::Base.connection_pool.lock_thread = true
739
+
740
+ assert_cache :off
741
+
742
+ thread_a = Thread.new do
743
+ middleware { |env|
744
+ assert_cache :clean
745
+ [200, {}, nil]
746
+ }.call({})
747
+ end
748
+
749
+ thread_a.join
750
+
751
+ ActiveRecord::Base.connection_pool.lock_thread = false
752
+ end
753
+
754
+ private
755
+ def with_temporary_connection_pool
756
+ pool_config = ActiveRecord::Base.connection_handler.send(:owner_to_pool_manager).fetch("ActiveRecord::Base").get_pool_config(ActiveRecord::Base.writing_role, :default)
757
+ new_pool = ActiveRecord::ConnectionAdapters::ConnectionPool.new(pool_config)
758
+
759
+ pool_config.stub(:pool, new_pool) do
760
+ yield
761
+ end
762
+ end
763
+
764
+ def middleware(&app)
765
+ executor = Class.new(ActiveSupport::Executor)
766
+ ActiveRecord::QueryCache.install_executor_hooks executor
767
+ lambda { |env| executor.wrap { app.call(env) } }
768
+ end
769
+
770
+ def assert_cache(state, connection = ActiveRecord::Base.connection)
771
+ case state
772
+ when :off
773
+ assert_not connection.query_cache_enabled, "cache should be off"
774
+ assert connection.query_cache.empty?, "cache should be empty"
775
+ when :clean
776
+ assert connection.query_cache_enabled, "cache should be on"
777
+ assert connection.query_cache.empty?, "cache should be empty"
778
+ when :dirty
779
+ assert connection.query_cache_enabled, "cache should be on"
780
+ assert_not connection.query_cache.empty?, "cache should be dirty"
781
+ else
782
+ raise "unknown state"
783
+ end
784
+ end
785
+ end
786
+
787
+ class QueryCacheExpiryTest < ActiveRecord::TestCase
788
+ fixtures :tasks, :posts, :categories, :categories_posts
789
+
790
+ def teardown
791
+ Task.connection.clear_query_cache
792
+ end
793
+
794
+ def test_cache_gets_cleared_after_migration
795
+ # warm the cache
796
+ Post.find(1)
797
+
798
+ # change the column definition
799
+ Post.connection.change_column :posts, :title, :string, limit: 80
800
+ assert_nothing_raised { Post.find(1) }
801
+
802
+ # restore the old definition
803
+ Post.connection.change_column :posts, :title, :string
804
+ end
805
+
806
+ def test_find
807
+ assert_called(Task.connection, :clear_query_cache) do
808
+ assert_not Task.connection.query_cache_enabled
809
+ Task.cache do
810
+ assert Task.connection.query_cache_enabled
811
+ Task.find(1)
812
+
813
+ Task.uncached do
814
+ assert_not Task.connection.query_cache_enabled
815
+ Task.find(1)
816
+ end
817
+
818
+ assert Task.connection.query_cache_enabled
819
+ end
820
+ assert_not Task.connection.query_cache_enabled
821
+ end
822
+ end
823
+
824
+ def test_update
825
+ assert_called(Task.connection, :clear_query_cache, times: 2) do
826
+ Task.cache do
827
+ task = Task.find(1)
828
+ task.starting = Time.now.utc
829
+ task.save!
830
+ end
831
+ end
832
+ end
833
+
834
+ def test_destroy
835
+ assert_called(Task.connection, :clear_query_cache, times: 2) do
836
+ Task.cache do
837
+ Task.find(1).destroy
838
+ end
839
+ end
840
+ end
841
+
842
+ def test_insert
843
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
844
+ Task.cache do
845
+ Task.create!
846
+ end
847
+ end
848
+ end
849
+
850
+ def test_insert_all
851
+ skip unless supports_insert_on_duplicate_skip?
852
+
853
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
854
+ Task.cache { Task.insert({ starting: Time.now }) }
855
+ end
856
+
857
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
858
+ Task.cache { Task.insert_all([{ starting: Time.now }]) }
859
+ end
860
+ end
861
+
862
+ def test_insert_all_bang
863
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
864
+ Task.cache { Task.insert!({ starting: Time.now }) }
865
+ end
866
+
867
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
868
+ Task.cache { Task.insert_all!([{ starting: Time.now }]) }
869
+ end
870
+ end
871
+
872
+ def test_upsert_all
873
+ skip unless supports_insert_on_duplicate_update?
874
+
875
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
876
+ Task.cache { Task.upsert({ starting: Time.now }) }
877
+ end
878
+
879
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
880
+ Task.cache { Task.upsert_all([{ starting: Time.now }]) }
881
+ end
882
+ end
883
+
884
+ def test_cache_is_expired_by_habtm_update
885
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
886
+ ActiveRecord::Base.cache do
887
+ c = Category.first
888
+ p = Post.first
889
+ p.categories << c
890
+ end
891
+ end
892
+ end
893
+
894
+ def test_cache_is_expired_by_habtm_delete
895
+ assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
896
+ ActiveRecord::Base.cache do
897
+ p = Post.find(1)
898
+ assert_predicate p.categories, :any?
899
+ p.categories.delete_all
900
+ end
901
+ end
902
+ end
903
+
904
+ test "threads use the same connection" do
905
+ @connection_1 = ActiveRecord::Base.connection.object_id
906
+
907
+ thread_a = Thread.new do
908
+ @connection_2 = ActiveRecord::Base.connection.object_id
909
+ end
910
+
911
+ thread_a.join
912
+
913
+ assert_equal @connection_1, @connection_2
914
+ end
915
+ end