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,8 +1,9 @@
1
- require 'cases/helper'
2
- require 'models/person'
3
- require 'models/topic'
4
- require 'pp'
5
- require 'active_support/core_ext/string/strip'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/person"
5
+ require "models/topic"
6
+ require "pp"
6
7
 
7
8
  class NonExistentTable < ActiveRecord::Base; end
8
9
 
@@ -10,14 +11,25 @@ class CoreTest < ActiveRecord::TestCase
10
11
  fixtures :topics
11
12
 
12
13
  def test_inspect_class
13
- assert_equal 'ActiveRecord::Base', ActiveRecord::Base.inspect
14
- assert_equal 'LoosePerson(abstract)', LoosePerson.inspect
14
+ assert_equal "ActiveRecord::Base", ActiveRecord::Base.inspect
15
+ assert_equal "LoosePerson(abstract)", LoosePerson.inspect
15
16
  assert_match(/^Topic\(id: integer, title: string/, Topic.inspect)
16
17
  end
17
18
 
18
19
  def test_inspect_instance
19
20
  topic = topics(:first)
20
- assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:db)}", bonus_time: "#{topic.bonus_time.to_s(:db)}", last_read: "#{topic.last_read.to_s(:db)}", content: "Have a nice day", important: nil, approved: false, replies_count: 1, unique_replies_count: 0, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "#{topic.created_at.to_s(:db)}", updated_at: "#{topic.updated_at.to_s(:db)}">), topic.inspect
21
+ assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:inspect)}", bonus_time: "#{topic.bonus_time.to_s(:inspect)}", last_read: "#{topic.last_read.to_s(:inspect)}", content: "Have a nice day", important: nil, approved: false, replies_count: 1, unique_replies_count: 0, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "#{topic.created_at.to_s(:inspect)}", updated_at: "#{topic.updated_at.to_s(:inspect)}">), topic.inspect
22
+ end
23
+
24
+ def test_inspect_instance_with_lambda_date_formatter
25
+ before = Time::DATE_FORMATS[:inspect]
26
+ Time::DATE_FORMATS[:inspect] = ->(date) { "my_format" }
27
+ topic = topics(:first)
28
+
29
+ assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "my_format", bonus_time: "my_format", last_read: "2004-04-15", content: "Have a nice day", important: nil, approved: false, replies_count: 1, unique_replies_count: 0, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "my_format", updated_at: "my_format">), topic.inspect
30
+
31
+ ensure
32
+ Time::DATE_FORMATS[:inspect] = before
21
33
  end
22
34
 
23
35
  def test_inspect_new_instance
@@ -25,8 +37,13 @@ class CoreTest < ActiveRecord::TestCase
25
37
  end
26
38
 
27
39
  def test_inspect_limited_select_instance
28
- assert_equal %(#<Topic id: 1>), Topic.all.merge!(:select => 'id', :where => 'id = 1').first.inspect
29
- assert_equal %(#<Topic id: 1, title: "The First Topic">), Topic.all.merge!(:select => 'id, title', :where => 'id = 1').first.inspect
40
+ assert_equal %(#<Topic id: 1>), Topic.all.merge!(select: "id", where: "id = 1").first.inspect
41
+ assert_equal %(#<Topic id: 1, title: "The First Topic">), Topic.all.merge!(select: "id, title", where: "id = 1").first.inspect
42
+ end
43
+
44
+ def test_inspect_instance_with_non_primary_key_id_attribute
45
+ topic = topics(:first).becomes(TitlePrimaryKeyTopic)
46
+ assert_match(/id: 1/, topic.inspect)
30
47
  end
31
48
 
32
49
  def test_inspect_class_without_table
@@ -35,68 +52,68 @@ class CoreTest < ActiveRecord::TestCase
35
52
 
36
53
  def test_pretty_print_new
37
54
  topic = Topic.new
38
- actual = ''
55
+ actual = +""
39
56
  PP.pp(topic, StringIO.new(actual))
40
- expected = <<-PRETTY.strip_heredoc
41
- #<Topic:0xXXXXXX
42
- id: nil,
43
- title: nil,
44
- author_name: nil,
45
- author_email_address: "test@test.com",
46
- written_on: nil,
47
- bonus_time: nil,
48
- last_read: nil,
49
- content: nil,
50
- important: nil,
51
- approved: true,
52
- replies_count: 0,
53
- unique_replies_count: 0,
54
- parent_id: nil,
55
- parent_title: nil,
56
- type: nil,
57
- group: nil,
58
- created_at: nil,
59
- updated_at: nil>
57
+ expected = <<~PRETTY
58
+ #<Topic:0xXXXXXX
59
+ id: nil,
60
+ title: nil,
61
+ author_name: nil,
62
+ author_email_address: "test@test.com",
63
+ written_on: nil,
64
+ bonus_time: nil,
65
+ last_read: nil,
66
+ content: nil,
67
+ important: nil,
68
+ approved: true,
69
+ replies_count: 0,
70
+ unique_replies_count: 0,
71
+ parent_id: nil,
72
+ parent_title: nil,
73
+ type: nil,
74
+ group: nil,
75
+ created_at: nil,
76
+ updated_at: nil>
60
77
  PRETTY
61
- assert actual.start_with?(expected.split('XXXXXX').first)
62
- assert actual.end_with?(expected.split('XXXXXX').last)
78
+ assert actual.start_with?(expected.split("XXXXXX").first)
79
+ assert actual.end_with?(expected.split("XXXXXX").last)
63
80
  end
64
81
 
65
82
  def test_pretty_print_persisted
66
83
  topic = topics(:first)
67
- actual = ''
84
+ actual = +""
68
85
  PP.pp(topic, StringIO.new(actual))
69
- expected = <<-PRETTY.strip_heredoc
70
- #<Topic:0x\\w+
71
- id: 1,
72
- title: "The First Topic",
73
- author_name: "David",
74
- author_email_address: "david@loudthinking.com",
75
- written_on: 2003-07-16 14:28:11 UTC,
76
- bonus_time: 2000-01-01 14:28:00 UTC,
77
- last_read: Thu, 15 Apr 2004,
78
- content: "Have a nice day",
79
- important: nil,
80
- approved: false,
81
- replies_count: 1,
82
- unique_replies_count: 0,
83
- parent_id: nil,
84
- parent_title: nil,
85
- type: nil,
86
- group: nil,
87
- created_at: [^,]+,
88
- updated_at: [^,>]+>
86
+ expected = <<~PRETTY
87
+ #<Topic:0x\\w+
88
+ id: 1,
89
+ title: "The First Topic",
90
+ author_name: "David",
91
+ author_email_address: "david@loudthinking.com",
92
+ written_on: 2003-07-16 14:28:11(?:\.2233)? UTC,
93
+ bonus_time: 2000-01-01 14:28:00 UTC,
94
+ last_read: Thu, 15 Apr 2004,
95
+ content: "Have a nice day",
96
+ important: nil,
97
+ approved: false,
98
+ replies_count: 1,
99
+ unique_replies_count: 0,
100
+ parent_id: nil,
101
+ parent_title: nil,
102
+ type: nil,
103
+ group: nil,
104
+ created_at: [^,]+,
105
+ updated_at: [^,>]+>
89
106
  PRETTY
90
107
  assert_match(/\A#{expected}\z/, actual)
91
108
  end
92
109
 
93
110
  def test_pretty_print_uninitialized
94
111
  topic = Topic.allocate
95
- actual = ''
112
+ actual = +""
96
113
  PP.pp(topic, StringIO.new(actual))
97
114
  expected = "#<Topic:XXXXXX not initialized>\n"
98
- assert actual.start_with?(expected.split('XXXXXX').first)
99
- assert actual.end_with?(expected.split('XXXXXX').last)
115
+ assert actual.start_with?(expected.split("XXXXXX").first)
116
+ assert actual.end_with?(expected.split("XXXXXX").last)
100
117
  end
101
118
 
102
119
  def test_pretty_print_overridden_by_inspect
@@ -105,8 +122,15 @@ class CoreTest < ActiveRecord::TestCase
105
122
  "inspecting topic"
106
123
  end
107
124
  end
108
- actual = ''
125
+ actual = +""
109
126
  PP.pp(subtopic.new, StringIO.new(actual))
110
127
  assert_equal "inspecting topic\n", actual
111
128
  end
129
+
130
+ def test_pretty_print_with_non_primary_key_id_attribute
131
+ topic = topics(:first).becomes(TitlePrimaryKeyTopic)
132
+ actual = +""
133
+ PP.pp(topic, StringIO.new(actual))
134
+ assert_match(/id: 1/, actual)
135
+ end
112
136
  end
@@ -1,30 +1,33 @@
1
- require 'cases/helper'
2
- require 'models/topic'
3
- require 'models/car'
4
- require 'models/aircraft'
5
- require 'models/wheel'
6
- require 'models/engine'
7
- require 'models/reply'
8
- require 'models/category'
9
- require 'models/categorization'
10
- require 'models/dog'
11
- require 'models/dog_lover'
12
- require 'models/person'
13
- require 'models/friendship'
14
- require 'models/subscriber'
15
- require 'models/subscription'
16
- require 'models/book'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/topic"
5
+ require "models/car"
6
+ require "models/aircraft"
7
+ require "models/wheel"
8
+ require "models/engine"
9
+ require "models/reply"
10
+ require "models/category"
11
+ require "models/categorization"
12
+ require "models/dog"
13
+ require "models/dog_lover"
14
+ require "models/person"
15
+ require "models/friendship"
16
+ require "models/subscriber"
17
+ require "models/subscription"
18
+ require "models/book"
19
+ require "active_support/core_ext/enumerable"
17
20
 
18
21
  class CounterCacheTest < ActiveRecord::TestCase
19
22
  fixtures :topics, :categories, :categorizations, :cars, :dogs, :dog_lovers, :people, :friendships, :subscribers, :subscriptions, :books
20
23
 
21
24
  class ::SpecialTopic < ::Topic
22
- has_many :special_replies, :foreign_key => 'parent_id'
23
- has_many :lightweight_special_replies, -> { select('topics.id, topics.title') }, :foreign_key => 'parent_id', :class_name => 'SpecialReply'
25
+ has_many :special_replies, foreign_key: "parent_id"
26
+ has_many :lightweight_special_replies, -> { select("topics.id, topics.title") }, foreign_key: "parent_id", class_name: "SpecialReply"
24
27
  end
25
28
 
26
29
  class ::SpecialReply < ::Reply
27
- belongs_to :special_topic, :foreign_key => 'parent_id', :counter_cache => 'replies_count'
30
+ belongs_to :special_topic, foreign_key: "parent_id", counter_cache: "replies_count"
28
31
  end
29
32
 
30
33
  setup do
@@ -32,13 +35,13 @@ class CounterCacheTest < ActiveRecord::TestCase
32
35
  end
33
36
 
34
37
  test "increment counter" do
35
- assert_difference '@topic.reload.replies_count' do
38
+ assert_difference "@topic.reload.replies_count" do
36
39
  Topic.increment_counter(:replies_count, @topic.id)
37
40
  end
38
41
  end
39
42
 
40
43
  test "decrement counter" do
41
- assert_difference '@topic.reload.replies_count', -1 do
44
+ assert_difference "@topic.reload.replies_count", -1 do
42
45
  Topic.decrement_counter(:replies_count, @topic.id)
43
46
  end
44
47
  end
@@ -48,7 +51,7 @@ class CounterCacheTest < ActiveRecord::TestCase
48
51
  Topic.increment_counter(:replies_count, @topic.id)
49
52
 
50
53
  # check that it gets reset
51
- assert_difference '@topic.reload.replies_count', -1 do
54
+ assert_difference "@topic.reload.replies_count", -1 do
52
55
  Topic.reset_counters(@topic.id, :replies)
53
56
  end
54
57
  end
@@ -58,31 +61,31 @@ class CounterCacheTest < ActiveRecord::TestCase
58
61
  Topic.increment_counter(:replies_count, @topic.id)
59
62
 
60
63
  # check that it gets reset
61
- assert_difference '@topic.reload.replies_count', -1 do
64
+ assert_difference "@topic.reload.replies_count", -1 do
62
65
  Topic.reset_counters(@topic.id, :replies_count)
63
66
  end
64
67
  end
65
68
 
66
- test 'reset multiple counters' do
69
+ test "reset multiple counters" do
67
70
  Topic.update_counters @topic.id, replies_count: 1, unique_replies_count: 1
68
- assert_difference ['@topic.reload.replies_count', '@topic.reload.unique_replies_count'], -1 do
71
+ assert_difference ["@topic.reload.replies_count", "@topic.reload.unique_replies_count"], -1 do
69
72
  Topic.reset_counters(@topic.id, :replies, :unique_replies)
70
73
  end
71
74
  end
72
75
 
73
76
  test "reset counters with string argument" do
74
- Topic.increment_counter('replies_count', @topic.id)
77
+ Topic.increment_counter("replies_count", @topic.id)
75
78
 
76
- assert_difference '@topic.reload.replies_count', -1 do
77
- Topic.reset_counters(@topic.id, 'replies')
79
+ assert_difference "@topic.reload.replies_count", -1 do
80
+ Topic.reset_counters(@topic.id, "replies")
78
81
  end
79
82
  end
80
83
 
81
84
  test "reset counters with modularized and camelized classnames" do
82
- special = SpecialTopic.create!(:title => 'Special')
85
+ special = SpecialTopic.create!(title: "Special")
83
86
  SpecialTopic.increment_counter(:replies_count, special.id)
84
87
 
85
- assert_difference 'special.reload.replies_count', -1 do
88
+ assert_difference "special.reload.replies_count", -1 do
86
89
  SpecialTopic.reset_counters(special.id, :special_replies)
87
90
  end
88
91
  end
@@ -103,10 +106,10 @@ class CounterCacheTest < ActiveRecord::TestCase
103
106
  DogLover.increment_counter(:bred_dogs_count, david.id)
104
107
  DogLover.increment_counter(:trained_dogs_count, david.id)
105
108
 
106
- assert_difference 'david.reload.bred_dogs_count', -1 do
109
+ assert_difference "david.reload.bred_dogs_count", -1 do
107
110
  DogLover.reset_counters(david.id, :bred_dogs)
108
111
  end
109
- assert_difference 'david.reload.trained_dogs_count', -1 do
112
+ assert_difference "david.reload.trained_dogs_count", -1 do
110
113
  DogLover.reset_counters(david.id, :trained_dogs)
111
114
  end
112
115
  end
@@ -116,35 +119,35 @@ class CounterCacheTest < ActiveRecord::TestCase
116
119
  assert_equal 2, category.categorizations.count
117
120
  assert_nil category.categorizations_count
118
121
 
119
- Category.update_counters(category.id, :categorizations_count => category.categorizations.count)
122
+ Category.update_counters(category.id, categorizations_count: category.categorizations.count)
120
123
  assert_equal 2, category.reload.categorizations_count
121
124
  end
122
125
 
123
126
  test "update counter for decrement" do
124
- assert_difference '@topic.reload.replies_count', -3 do
125
- Topic.update_counters(@topic.id, :replies_count => -3)
127
+ assert_difference "@topic.reload.replies_count", -3 do
128
+ Topic.update_counters(@topic.id, replies_count: -3)
126
129
  end
127
130
  end
128
131
 
129
132
  test "update counters of multiple records" do
130
133
  t1, t2 = topics(:first, :second)
131
134
 
132
- assert_difference ['t1.reload.replies_count', 't2.reload.replies_count'], 2 do
133
- Topic.update_counters([t1.id, t2.id], :replies_count => 2)
135
+ assert_difference ["t1.reload.replies_count", "t2.reload.replies_count"], 2 do
136
+ Topic.update_counters([t1.id, t2.id], replies_count: 2)
134
137
  end
135
138
  end
136
139
 
137
- test 'update multiple counters' do
138
- assert_difference ['@topic.reload.replies_count', '@topic.reload.unique_replies_count'], 2 do
140
+ test "update multiple counters" do
141
+ assert_difference ["@topic.reload.replies_count", "@topic.reload.unique_replies_count"], 2 do
139
142
  Topic.update_counters @topic.id, replies_count: 2, unique_replies_count: 2
140
143
  end
141
144
  end
142
145
 
143
146
  test "update other counters on parent destroy" do
144
147
  david, joanna = dog_lovers(:david, :joanna)
145
- joanna = joanna # squelch a warning
148
+ _ = joanna # squelch a warning
146
149
 
147
- assert_difference 'joanna.reload.dogs_count', -1 do
150
+ assert_difference "joanna.reload.dogs_count", -1 do
148
151
  david.destroy
149
152
  end
150
153
  end
@@ -157,12 +160,12 @@ class CounterCacheTest < ActiveRecord::TestCase
157
160
  end
158
161
 
159
162
  test "reset counter of has_many :through association" do
160
- subscriber = subscribers('second')
161
- Subscriber.reset_counters(subscriber.id, 'books')
162
- Subscriber.increment_counter('books_count', subscriber.id)
163
+ subscriber = subscribers("second")
164
+ Subscriber.reset_counters(subscriber.id, "books")
165
+ Subscriber.increment_counter("books_count", subscriber.id)
163
166
 
164
- assert_difference 'subscriber.reload.books_count', -1 do
165
- Subscriber.reset_counters(subscriber.id, 'books')
167
+ assert_difference "subscriber.reload.books_count", -1 do
168
+ Subscriber.reset_counters(subscriber.id, "books")
166
169
  end
167
170
  end
168
171
 
@@ -174,10 +177,10 @@ class CounterCacheTest < ActiveRecord::TestCase
174
177
  end
175
178
 
176
179
  test "reset counter works with select declared on association" do
177
- special = SpecialTopic.create!(:title => 'Special')
180
+ special = SpecialTopic.create!(title: "Special")
178
181
  SpecialTopic.increment_counter(:replies_count, special.id)
179
182
 
180
- assert_difference 'special.reload.replies_count', -1 do
183
+ assert_difference "special.reload.replies_count", -1 do
181
184
  SpecialTopic.reset_counters(special.id, :lightweight_special_replies)
182
185
  end
183
186
  end
@@ -203,12 +206,163 @@ class CounterCacheTest < ActiveRecord::TestCase
203
206
  test "update counters in a polymorphic relationship" do
204
207
  aircraft = Aircraft.create!
205
208
 
206
- assert_difference 'aircraft.reload.wheels_count' do
209
+ assert_difference "aircraft.reload.wheels_count" do
207
210
  aircraft.wheels << Wheel.create!
208
211
  end
209
212
 
210
- assert_difference 'aircraft.reload.wheels_count', -1 do
213
+ assert_difference "aircraft.reload.wheels_count", -1 do
211
214
  aircraft.wheels.first.destroy
212
215
  end
213
216
  end
217
+
218
+ test "update counters doesn't touch timestamps by default" do
219
+ @topic.update_column :updated_at, 5.minutes.ago
220
+ previously_updated_at = @topic.updated_at
221
+
222
+ Topic.update_counters(@topic.id, replies_count: -1)
223
+
224
+ assert_equal previously_updated_at, @topic.updated_at
225
+ end
226
+
227
+ test "update counters doesn't touch timestamps with touch: []" do
228
+ @topic.update_column :updated_at, 5.minutes.ago
229
+ previously_updated_at = @topic.updated_at
230
+
231
+ Topic.update_counters(@topic.id, replies_count: -1, touch: [])
232
+
233
+ assert_equal previously_updated_at, @topic.updated_at
234
+ end
235
+
236
+ test "update counters with touch: true" do
237
+ assert_touching @topic, :updated_at do
238
+ Topic.update_counters(@topic.id, replies_count: -1, touch: true)
239
+ end
240
+ end
241
+
242
+ test "update counters of multiple records with touch: true" do
243
+ t1, t2 = topics(:first, :second)
244
+
245
+ assert_touching t1, :updated_at do
246
+ assert_difference ["t1.reload.replies_count", "t2.reload.replies_count"], 2 do
247
+ Topic.update_counters([t1.id, t2.id], replies_count: 2, touch: true)
248
+ end
249
+ end
250
+ end
251
+
252
+ test "update multiple counters with touch: true" do
253
+ assert_touching @topic, :updated_at do
254
+ Topic.update_counters(@topic.id, replies_count: 2, unique_replies_count: 2, touch: true)
255
+ end
256
+ end
257
+
258
+ test "reset counters with touch: true" do
259
+ assert_touching @topic, :updated_at do
260
+ Topic.reset_counters(@topic.id, :replies, touch: true)
261
+ end
262
+ end
263
+
264
+ test "reset multiple counters with touch: true" do
265
+ assert_touching @topic, :updated_at do
266
+ Topic.update_counters(@topic.id, replies_count: 1, unique_replies_count: 1)
267
+ Topic.reset_counters(@topic.id, :replies, :unique_replies, touch: { time: Time.now.utc })
268
+ end
269
+ end
270
+
271
+ test "increment counters with touch: true" do
272
+ assert_touching @topic, :updated_at do
273
+ Topic.increment_counter(:replies_count, @topic.id, touch: true)
274
+ end
275
+ end
276
+
277
+ test "decrement counters with touch: true" do
278
+ assert_touching @topic, :updated_at do
279
+ Topic.decrement_counter(:replies_count, @topic.id, touch: true)
280
+ end
281
+ end
282
+
283
+ test "update counters with touch: :written_on" do
284
+ assert_touching @topic, :updated_at, :written_on do
285
+ Topic.update_counters(@topic.id, replies_count: -1, touch: :written_on)
286
+ end
287
+ end
288
+
289
+ test "update multiple counters with touch: :written_on" do
290
+ assert_touching @topic, :updated_at, :written_on do
291
+ Topic.update_counters(@topic.id, replies_count: 2, unique_replies_count: 2, touch: :written_on)
292
+ end
293
+ end
294
+
295
+ test "reset counters with touch: :written_on" do
296
+ assert_touching @topic, :updated_at, :written_on do
297
+ Topic.reset_counters(@topic.id, :replies, touch: :written_on)
298
+ end
299
+ end
300
+
301
+ test "reset multiple counters with touch: :written_on" do
302
+ assert_touching @topic, :updated_at, :written_on do
303
+ Topic.update_counters(@topic.id, replies_count: 1, unique_replies_count: 1)
304
+ Topic.reset_counters(@topic.id, :replies, :unique_replies, touch: :written_on)
305
+ end
306
+ end
307
+
308
+ test "increment counters with touch: :written_on" do
309
+ assert_touching @topic, :updated_at, :written_on do
310
+ Topic.increment_counter(:replies_count, @topic.id, touch: :written_on)
311
+ end
312
+ end
313
+
314
+ test "decrement counters with touch: :written_on" do
315
+ assert_touching @topic, :updated_at, :written_on do
316
+ Topic.decrement_counter(:replies_count, @topic.id, touch: :written_on)
317
+ end
318
+ end
319
+
320
+ test "update counters with touch: %i( updated_at written_on )" do
321
+ assert_touching @topic, :updated_at, :written_on do
322
+ Topic.update_counters(@topic.id, replies_count: -1, touch: %i( updated_at written_on ))
323
+ end
324
+ end
325
+
326
+ test "update multiple counters with touch: %i( updated_at written_on )" do
327
+ assert_touching @topic, :updated_at, :written_on do
328
+ Topic.update_counters(@topic.id, replies_count: 2, unique_replies_count: 2, touch: %i( updated_at written_on ))
329
+ end
330
+ end
331
+
332
+ test "reset counters with touch: %i( updated_at written_on )" do
333
+ assert_touching @topic, :updated_at, :written_on do
334
+ Topic.reset_counters(@topic.id, :replies, touch: %i( updated_at written_on ))
335
+ end
336
+ end
337
+
338
+ test "reset multiple counters with touch: %i( updated_at written_on )" do
339
+ assert_touching @topic, :updated_at, :written_on do
340
+ Topic.update_counters(@topic.id, replies_count: 1, unique_replies_count: 1)
341
+ Topic.reset_counters(@topic.id, :replies, :unique_replies, touch: %i( updated_at written_on ))
342
+ end
343
+ end
344
+
345
+ test "increment counters with touch: %i( updated_at written_on )" do
346
+ assert_touching @topic, :updated_at, :written_on do
347
+ Topic.increment_counter(:replies_count, @topic.id, touch: %i( updated_at written_on ))
348
+ end
349
+ end
350
+
351
+ test "decrement counters with touch: %i( updated_at written_on )" do
352
+ assert_touching @topic, :updated_at, :written_on do
353
+ Topic.decrement_counter(:replies_count, @topic.id, touch: %i( updated_at written_on ))
354
+ end
355
+ end
356
+
357
+ private
358
+ def assert_touching(record, *attributes)
359
+ record.update_columns attributes.index_with(5.minutes.ago)
360
+ touch_times = attributes.index_with { |attr| record.public_send(attr) }
361
+
362
+ yield
363
+
364
+ touch_times.each do |attr, previous_touch_time|
365
+ assert_operator previous_touch_time, :<, record.reload.public_send(attr)
366
+ end
367
+ end
214
368
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/person'
4
+ require "models/person"
3
5
 
4
6
  module ActiveRecord
5
7
  class CustomLockingTest < ActiveRecord::TestCase
@@ -7,9 +9,9 @@ module ActiveRecord
7
9
 
8
10
  def test_custom_lock
9
11
  if current_adapter?(:Mysql2Adapter)
10
- assert_match 'SHARE MODE', Person.lock('LOCK IN SHARE MODE').to_sql
12
+ assert_match "SHARE MODE", Person.lock("LOCK IN SHARE MODE").to_sql
11
13
  assert_sql(/LOCK IN SHARE MODE/) do
12
- Person.all.merge!(:lock => 'LOCK IN SHARE MODE').find(1)
14
+ Person.all.merge!(lock: "LOCK IN SHARE MODE").find(1)
13
15
  end
14
16
  end
15
17
  end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ module ActiveRecord
6
+ class DatabaseConfigurations
7
+ class HashConfigTest < ActiveRecord::TestCase
8
+ def test_pool_default_when_nil
9
+ config = HashConfig.new("default_env", "primary", pool: nil)
10
+ assert_equal 5, config.pool
11
+ end
12
+
13
+ def test_pool_overrides_with_value
14
+ config = HashConfig.new("default_env", "primary", pool: "0")
15
+ assert_equal 0, config.pool
16
+ end
17
+
18
+ def test_when_no_pool_uses_default
19
+ config = HashConfig.new("default_env", "primary", {})
20
+ assert_equal 5, config.pool
21
+ end
22
+
23
+ def test_checkout_timeout_default_when_nil
24
+ config = HashConfig.new("default_env", "primary", checkout_timeout: nil)
25
+ assert_equal 5.0, config.checkout_timeout
26
+ end
27
+
28
+ def test_checkout_timeout_overrides_with_value
29
+ config = HashConfig.new("default_env", "primary", checkout_timeout: "0")
30
+ assert_equal 0.0, config.checkout_timeout
31
+ end
32
+
33
+ def test_when_no_checkout_timeout_uses_default
34
+ config = HashConfig.new("default_env", "primary", {})
35
+ assert_equal 5.0, config.checkout_timeout
36
+ end
37
+
38
+ def test_reaping_frequency_default_when_nil
39
+ config = HashConfig.new("default_env", "primary", reaping_frequency: nil)
40
+ assert_nil config.reaping_frequency
41
+ end
42
+
43
+ def test_reaping_frequency_overrides_with_value
44
+ config = HashConfig.new("default_env", "primary", reaping_frequency: "0")
45
+ assert_equal 0.0, config.reaping_frequency
46
+ end
47
+
48
+ def test_when_no_reaping_frequency_uses_default
49
+ config = HashConfig.new("default_env", "primary", {})
50
+ assert_equal 60.0, config.reaping_frequency
51
+ end
52
+
53
+ def test_idle_timeout_default_when_nil
54
+ config = HashConfig.new("default_env", "primary", idle_timeout: nil)
55
+ assert_nil config.idle_timeout
56
+ end
57
+
58
+ def test_idle_timeout_overrides_with_value
59
+ config = HashConfig.new("default_env", "primary", idle_timeout: "1")
60
+ assert_equal 1.0, config.idle_timeout
61
+ end
62
+
63
+ def test_when_no_idle_timeout_uses_default
64
+ config = HashConfig.new("default_env", "primary", {})
65
+ assert_equal 300.0, config.idle_timeout
66
+ end
67
+
68
+ def test_idle_timeout_nil_when_less_than_or_equal_to_zero
69
+ config = HashConfig.new("default_env", "primary", idle_timeout: "0")
70
+ assert_nil config.idle_timeout
71
+ end
72
+ end
73
+ end
74
+ end