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

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