ibm_db 5.1.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 (624) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +14 -14
  5. data/ext/extconf.rb +4 -4
  6. data/ext/ibm_db.c +62 -57
  7. data/ext/ibm_db.o +0 -0
  8. data/ext/ibm_db.so +0 -0
  9. data/ext/mkmf.log +11 -11
  10. data/ext/ruby_ibm_db_cli.c +1 -0
  11. data/ext/ruby_ibm_db_cli.o +0 -0
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  13. data/lib/ibm_db.so +1 -0
  14. data/lib/mswin32/ibm_db.rb +7 -3
  15. data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  18. data/test/activejob/destroy_association_async_test.rb +305 -0
  19. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  20. data/test/activejob/helper.rb +15 -0
  21. data/test/assets/schema_dump_5_1.yml +345 -0
  22. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  23. data/test/cases/adapter_test.rb +432 -218
  24. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  25. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  27. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  30. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  31. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  33. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  34. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  35. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  36. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  37. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  38. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  39. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  40. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  41. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  42. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  43. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  44. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  45. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  46. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  47. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  48. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  50. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  52. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  55. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  56. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  57. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  58. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  59. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  60. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  61. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  62. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  63. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  64. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  65. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  66. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  67. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  69. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  70. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  71. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  72. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  73. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  74. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  75. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  76. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  77. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  78. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  79. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  80. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  83. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  84. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  85. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  86. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  87. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  88. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  89. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  90. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  91. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  92. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  93. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  94. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  95. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  96. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  97. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  98. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  99. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  100. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  101. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  102. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  103. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  104. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  106. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  107. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  108. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  109. data/test/cases/aggregations_test.rb +14 -12
  110. data/test/cases/annotate_test.rb +46 -0
  111. data/test/cases/ar_schema_test.rb +153 -86
  112. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  113. data/test/cases/arel/attributes/math_test.rb +83 -0
  114. data/test/cases/arel/attributes_test.rb +27 -0
  115. data/test/cases/arel/collectors/bind_test.rb +40 -0
  116. data/test/cases/arel/collectors/composite_test.rb +47 -0
  117. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  118. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  119. data/test/cases/arel/crud_test.rb +65 -0
  120. data/test/cases/arel/delete_manager_test.rb +53 -0
  121. data/test/cases/arel/factory_methods_test.rb +46 -0
  122. data/test/cases/arel/helper.rb +45 -0
  123. data/test/cases/arel/insert_manager_test.rb +241 -0
  124. data/test/cases/arel/nodes/and_test.rb +30 -0
  125. data/test/cases/arel/nodes/as_test.rb +36 -0
  126. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  127. data/test/cases/arel/nodes/bin_test.rb +35 -0
  128. data/test/cases/arel/nodes/binary_test.rb +29 -0
  129. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  130. data/test/cases/arel/nodes/case_test.rb +96 -0
  131. data/test/cases/arel/nodes/casted_test.rb +18 -0
  132. data/test/cases/arel/nodes/comment_test.rb +22 -0
  133. data/test/cases/arel/nodes/count_test.rb +35 -0
  134. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  135. data/test/cases/arel/nodes/descending_test.rb +46 -0
  136. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  137. data/test/cases/arel/nodes/equality_test.rb +62 -0
  138. data/test/cases/arel/nodes/extract_test.rb +43 -0
  139. data/test/cases/arel/nodes/false_test.rb +21 -0
  140. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  141. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  142. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  143. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  144. data/test/cases/arel/nodes/node_test.rb +22 -0
  145. data/test/cases/arel/nodes/not_test.rb +31 -0
  146. data/test/cases/arel/nodes/or_test.rb +36 -0
  147. data/test/cases/arel/nodes/over_test.rb +69 -0
  148. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  149. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  150. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  151. data/test/cases/arel/nodes/sum_test.rb +35 -0
  152. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  153. data/test/cases/arel/nodes/true_test.rb +21 -0
  154. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  155. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  156. data/test/cases/arel/nodes/window_test.rb +81 -0
  157. data/test/cases/arel/nodes_test.rb +34 -0
  158. data/test/cases/arel/select_manager_test.rb +1238 -0
  159. data/test/cases/arel/support/fake_record.rb +135 -0
  160. data/test/cases/arel/table_test.rb +216 -0
  161. data/test/cases/arel/update_manager_test.rb +126 -0
  162. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  163. data/test/cases/arel/visitors/dot_test.rb +90 -0
  164. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  165. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  166. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  167. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  168. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  169. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  170. data/test/cases/associations/callbacks_test.rb +56 -38
  171. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  172. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  173. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  174. data/test/cases/associations/eager_singularization_test.rb +21 -21
  175. data/test/cases/associations/eager_test.rb +559 -415
  176. data/test/cases/associations/extension_test.rb +18 -12
  177. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  178. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  179. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  180. data/test/cases/associations/has_one_associations_test.rb +294 -129
  181. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  182. data/test/cases/associations/inner_join_association_test.rb +114 -38
  183. data/test/cases/associations/inverse_associations_test.rb +606 -398
  184. data/test/cases/associations/join_model_test.rb +158 -148
  185. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  186. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  187. data/test/cases/associations/required_test.rb +35 -10
  188. data/test/cases/associations_test.rb +241 -110
  189. data/test/cases/attribute_methods/read_test.rb +11 -11
  190. data/test/cases/attribute_methods_test.rb +413 -298
  191. data/test/cases/attributes_test.rb +145 -27
  192. data/test/cases/autosave_association_test.rb +681 -436
  193. data/test/cases/base_prevent_writes_test.rb +229 -0
  194. data/test/cases/base_test.rb +599 -542
  195. data/test/cases/batches_test.rb +288 -82
  196. data/test/cases/binary_test.rb +26 -31
  197. data/test/cases/bind_parameter_test.rb +194 -21
  198. data/test/cases/boolean_test.rb +52 -0
  199. data/test/cases/cache_key_test.rb +110 -5
  200. data/test/cases/calculations_test.rb +740 -177
  201. data/test/cases/callbacks_test.rb +74 -207
  202. data/test/cases/clone_test.rb +15 -10
  203. data/test/cases/coders/json_test.rb +2 -0
  204. data/test/cases/coders/yaml_column_test.rb +16 -13
  205. data/test/cases/collection_cache_key_test.rb +177 -20
  206. data/test/cases/column_alias_test.rb +9 -7
  207. data/test/cases/column_definition_test.rb +10 -68
  208. data/test/cases/comment_test.rb +166 -107
  209. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  210. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  211. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  212. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  213. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  214. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  215. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  217. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  218. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  219. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  220. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  221. data/test/cases/connection_management_test.rb +13 -11
  222. data/test/cases/connection_pool_test.rb +316 -83
  223. data/test/cases/core_test.rb +82 -58
  224. data/test/cases/counter_cache_test.rb +204 -50
  225. data/test/cases/custom_locking_test.rb +5 -3
  226. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  227. data/test/cases/database_configurations/resolver_test.rb +150 -0
  228. data/test/cases/database_configurations_test.rb +145 -0
  229. data/test/cases/database_selector_test.rb +296 -0
  230. data/test/cases/database_statements_test.rb +18 -16
  231. data/test/cases/date_test.rb +8 -16
  232. data/test/cases/date_time_precision_test.rb +100 -78
  233. data/test/cases/date_time_test.rb +23 -8
  234. data/test/cases/defaults_test.rb +106 -71
  235. data/test/cases/delegated_type_test.rb +57 -0
  236. data/test/cases/dirty_test.rb +419 -223
  237. data/test/cases/disconnected_test.rb +6 -6
  238. data/test/cases/dup_test.rb +54 -27
  239. data/test/cases/enum_test.rb +461 -82
  240. data/test/cases/errors_test.rb +7 -7
  241. data/test/cases/explain_subscriber_test.rb +17 -15
  242. data/test/cases/explain_test.rb +11 -19
  243. data/test/cases/filter_attributes_test.rb +153 -0
  244. data/test/cases/finder_respond_to_test.rb +14 -14
  245. data/test/cases/finder_test.rb +669 -287
  246. data/test/cases/fixture_set/file_test.rb +34 -38
  247. data/test/cases/fixtures_test.rb +833 -176
  248. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  249. data/test/cases/habtm_destroy_order_test.rb +25 -25
  250. data/test/cases/helper.rb +78 -49
  251. data/test/cases/hot_compatibility_test.rb +33 -32
  252. data/test/cases/i18n_test.rb +18 -17
  253. data/test/cases/inheritance_test.rb +180 -115
  254. data/test/cases/insert_all_test.rb +489 -0
  255. data/test/cases/instrumentation_test.rb +101 -0
  256. data/test/cases/integration_test.rb +119 -31
  257. data/test/cases/invalid_connection_test.rb +18 -16
  258. data/test/cases/invertible_migration_test.rb +183 -43
  259. data/test/cases/json_attribute_test.rb +35 -0
  260. data/test/cases/json_serialization_test.rb +57 -58
  261. data/test/cases/json_shared_test_cases.rb +290 -0
  262. data/test/cases/locking_test.rb +413 -119
  263. data/test/cases/log_subscriber_test.rb +68 -26
  264. data/test/cases/marshal_serialization_test.rb +39 -0
  265. data/test/cases/migration/change_schema_test.rb +118 -72
  266. data/test/cases/migration/change_table_test.rb +138 -30
  267. data/test/cases/migration/check_constraint_test.rb +162 -0
  268. data/test/cases/migration/column_attributes_test.rb +45 -35
  269. data/test/cases/migration/column_positioning_test.rb +18 -6
  270. data/test/cases/migration/columns_test.rb +93 -77
  271. data/test/cases/migration/command_recorder_test.rb +121 -34
  272. data/test/cases/migration/compatibility_test.rb +578 -23
  273. data/test/cases/migration/create_join_table_test.rb +35 -25
  274. data/test/cases/migration/foreign_key_test.rb +503 -284
  275. data/test/cases/migration/helper.rb +4 -3
  276. data/test/cases/migration/index_test.rb +119 -70
  277. data/test/cases/migration/logger_test.rb +9 -6
  278. data/test/cases/migration/pending_migrations_test.rb +88 -34
  279. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  280. data/test/cases/migration/references_index_test.rb +38 -19
  281. data/test/cases/migration/references_statements_test.rb +15 -14
  282. data/test/cases/migration/rename_table_test.rb +53 -30
  283. data/test/cases/migration_test.rb +637 -269
  284. data/test/cases/migrator_test.rb +191 -135
  285. data/test/cases/mixin_test.rb +7 -11
  286. data/test/cases/modules_test.rb +36 -34
  287. data/test/cases/multi_db_migrator_test.rb +223 -0
  288. data/test/cases/multiparameter_attributes_test.rb +60 -33
  289. data/test/cases/multiple_db_test.rb +16 -22
  290. data/test/cases/nested_attributes_test.rb +341 -320
  291. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  292. data/test/cases/null_relation_test.rb +84 -0
  293. data/test/cases/numeric_data_test.rb +93 -0
  294. data/test/cases/persistence_test.rb +361 -269
  295. data/test/cases/pooled_connections_test.rb +18 -26
  296. data/test/cases/prepared_statement_status_test.rb +48 -0
  297. data/test/cases/primary_keys_test.rb +210 -104
  298. data/test/cases/query_cache_test.rb +610 -141
  299. data/test/cases/quoting_test.rb +132 -31
  300. data/test/cases/readonly_test.rb +49 -48
  301. data/test/cases/reaper_test.rb +146 -32
  302. data/test/cases/reflection_test.rb +167 -156
  303. data/test/cases/relation/delegation_test.rb +49 -36
  304. data/test/cases/relation/delete_all_test.rb +117 -0
  305. data/test/cases/relation/merging_test.rb +319 -42
  306. data/test/cases/relation/mutation_test.rb +55 -93
  307. data/test/cases/relation/or_test.rb +129 -29
  308. data/test/cases/relation/predicate_builder_test.rb +21 -6
  309. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  310. data/test/cases/relation/select_test.rb +67 -0
  311. data/test/cases/relation/update_all_test.rb +317 -0
  312. data/test/cases/relation/where_chain_test.rb +68 -32
  313. data/test/cases/relation/where_clause_test.rb +136 -61
  314. data/test/cases/relation/where_test.rb +155 -48
  315. data/test/cases/relation_test.rb +266 -112
  316. data/test/cases/relations_test.rb +969 -744
  317. data/test/cases/reload_models_test.rb +13 -9
  318. data/test/cases/reserved_word_test.rb +141 -0
  319. data/test/cases/result_test.rb +68 -17
  320. data/test/cases/sanitize_test.rb +87 -71
  321. data/test/cases/schema_dumper_test.rb +221 -128
  322. data/test/cases/schema_loading_test.rb +3 -2
  323. data/test/cases/scoping/default_scoping_test.rb +185 -144
  324. data/test/cases/scoping/named_scoping_test.rb +177 -89
  325. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  326. data/test/cases/secure_token_test.rb +18 -3
  327. data/test/cases/serialization_test.rb +30 -28
  328. data/test/cases/serialized_attribute_test.rb +133 -42
  329. data/test/cases/signed_id_test.rb +168 -0
  330. data/test/cases/statement_cache_test.rb +41 -24
  331. data/test/cases/statement_invalid_test.rb +42 -0
  332. data/test/cases/store_test.rb +180 -55
  333. data/test/cases/strict_loading_test.rb +473 -0
  334. data/test/cases/suppressor_test.rb +26 -12
  335. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  336. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  337. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  338. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  339. data/test/cases/test_case.rb +51 -40
  340. data/test/cases/test_databases_test.rb +79 -0
  341. data/test/cases/test_fixtures_test.rb +79 -19
  342. data/test/cases/time_precision_test.rb +98 -76
  343. data/test/cases/timestamp_test.rb +102 -99
  344. data/test/cases/touch_later_test.rb +12 -10
  345. data/test/cases/transaction_callbacks_test.rb +344 -90
  346. data/test/cases/transaction_isolation_test.rb +12 -12
  347. data/test/cases/transactions_test.rb +612 -162
  348. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  349. data/test/cases/type/date_time_test.rb +4 -2
  350. data/test/cases/type/integer_test.rb +4 -2
  351. data/test/cases/type/string_test.rb +10 -8
  352. data/test/cases/type/time_test.rb +28 -0
  353. data/test/cases/type/type_map_test.rb +29 -28
  354. data/test/cases/type/unsigned_integer_test.rb +19 -0
  355. data/test/cases/type_test.rb +2 -0
  356. data/test/cases/types_test.rb +3 -1
  357. data/test/cases/unconnected_test.rb +14 -1
  358. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  359. data/test/cases/validations/absence_validation_test.rb +19 -17
  360. data/test/cases/validations/association_validation_test.rb +30 -28
  361. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  362. data/test/cases/validations/i18n_validation_test.rb +22 -21
  363. data/test/cases/validations/length_validation_test.rb +34 -33
  364. data/test/cases/validations/numericality_validation_test.rb +181 -0
  365. data/test/cases/validations/presence_validation_test.rb +21 -19
  366. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  367. data/test/cases/validations_repair_helper.rb +2 -0
  368. data/test/cases/validations_test.rb +61 -26
  369. data/test/cases/view_test.rb +122 -116
  370. data/test/cases/yaml_serialization_test.rb +79 -34
  371. data/test/config.example.yml +19 -19
  372. data/test/config.rb +3 -1
  373. data/test/config.yml +16 -6
  374. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  375. data/test/fixtures/author_addresses.yml +1 -8
  376. data/test/fixtures/authors.yml +1 -7
  377. data/test/fixtures/binaries.yml +4 -0
  378. data/test/fixtures/books.yml +9 -2
  379. data/test/fixtures/categories_posts.yml +3 -0
  380. data/test/fixtures/citations.yml +5 -0
  381. data/test/fixtures/comments.yml +7 -0
  382. data/test/fixtures/companies.yml +5 -0
  383. data/test/fixtures/computers.yml +2 -0
  384. data/test/fixtures/customers.yml +10 -1
  385. data/test/fixtures/developers.yml +1 -1
  386. data/test/fixtures/essays.yml +10 -0
  387. data/test/fixtures/faces.yml +3 -3
  388. data/test/fixtures/humans.yml +5 -0
  389. data/test/fixtures/interests.yml +7 -7
  390. data/test/fixtures/memberships.yml +7 -0
  391. data/test/fixtures/minimalistics.yml +3 -0
  392. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  393. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  394. data/test/fixtures/naked/yml/parrots.yml +1 -0
  395. data/test/fixtures/other_books.yml +26 -0
  396. data/test/fixtures/other_posts.yml +1 -0
  397. data/test/fixtures/parrots.yml +7 -1
  398. data/test/fixtures/pirates.yml +3 -0
  399. data/test/fixtures/posts.yml +11 -3
  400. data/test/fixtures/readers.yml +6 -0
  401. data/test/fixtures/reserved_words/values.yml +2 -2
  402. data/test/fixtures/sponsors.yml +3 -0
  403. data/test/fixtures/strict_zines.yml +2 -0
  404. data/test/fixtures/subscribers.yml +1 -1
  405. data/test/fixtures/tasks.yml +1 -1
  406. data/test/fixtures/warehouse-things.yml +3 -0
  407. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  408. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  409. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  410. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  411. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  412. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  413. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  414. data/test/migrations/rename/1_we_need_things.rb +2 -0
  415. data/test/migrations/rename/2_rename_things.rb +2 -0
  416. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  417. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  418. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  419. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  420. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  421. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  424. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  425. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  431. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  432. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  434. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  435. data/test/models/account.rb +46 -0
  436. data/test/models/admin/account.rb +3 -1
  437. data/test/models/admin/randomly_named_c1.rb +2 -0
  438. data/test/models/admin/user.rb +16 -8
  439. data/test/models/admin.rb +4 -2
  440. data/test/models/aircraft.rb +3 -1
  441. data/test/models/arunit2_model.rb +2 -0
  442. data/test/models/author.rb +153 -102
  443. data/test/models/auto_id.rb +2 -0
  444. data/test/models/autoloadable/extra_firm.rb +2 -0
  445. data/test/models/binary.rb +3 -1
  446. data/test/models/binary_field.rb +6 -0
  447. data/test/models/bird.rb +13 -1
  448. data/test/models/book.rb +14 -4
  449. data/test/models/book_destroy_async.rb +24 -0
  450. data/test/models/boolean.rb +5 -0
  451. data/test/models/bulb.rb +13 -4
  452. data/test/models/cake_designer.rb +2 -0
  453. data/test/models/car.rb +17 -10
  454. data/test/models/carrier.rb +2 -0
  455. data/test/models/cart.rb +5 -0
  456. data/test/models/cat.rb +2 -0
  457. data/test/models/categorization.rb +8 -6
  458. data/test/models/category.rb +28 -16
  459. data/test/models/chef.rb +2 -0
  460. data/test/models/citation.rb +5 -1
  461. data/test/models/club.rb +13 -10
  462. data/test/models/college.rb +4 -2
  463. data/test/models/column.rb +2 -0
  464. data/test/models/column_name.rb +2 -0
  465. data/test/models/comment.rb +32 -10
  466. data/test/models/company.rb +102 -106
  467. data/test/models/company_in_module.rb +27 -26
  468. data/test/models/computer.rb +3 -1
  469. data/test/models/contact.rb +15 -13
  470. data/test/models/content.rb +5 -3
  471. data/test/models/contract.rb +21 -3
  472. data/test/models/country.rb +2 -4
  473. data/test/models/course.rb +3 -1
  474. data/test/models/customer.rb +10 -8
  475. data/test/models/customer_carrier.rb +2 -0
  476. data/test/models/dashboard.rb +2 -0
  477. data/test/models/default.rb +2 -0
  478. data/test/models/department.rb +2 -0
  479. data/test/models/destroy_async_parent.rb +15 -0
  480. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  481. data/test/models/developer.rb +152 -85
  482. data/test/models/dl_keyed_belongs_to.rb +13 -0
  483. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  484. data/test/models/dl_keyed_has_many.rb +5 -0
  485. data/test/models/dl_keyed_has_many_through.rb +5 -0
  486. data/test/models/dl_keyed_has_one.rb +5 -0
  487. data/test/models/dl_keyed_join.rb +10 -0
  488. data/test/models/dog.rb +2 -0
  489. data/test/models/dog_lover.rb +2 -0
  490. data/test/models/doubloon.rb +3 -1
  491. data/test/models/drink_designer.rb +17 -0
  492. data/test/models/edge.rb +4 -2
  493. data/test/models/electron.rb +2 -0
  494. data/test/models/engine.rb +3 -2
  495. data/test/models/entrant.rb +2 -0
  496. data/test/models/entry.rb +5 -0
  497. data/test/models/essay.rb +6 -3
  498. data/test/models/essay_destroy_async.rb +12 -0
  499. data/test/models/event.rb +3 -1
  500. data/test/models/eye.rb +5 -3
  501. data/test/models/face.rb +14 -6
  502. data/test/models/family.rb +6 -0
  503. data/test/models/family_tree.rb +6 -0
  504. data/test/models/friendship.rb +5 -3
  505. data/test/models/frog.rb +8 -0
  506. data/test/models/guid.rb +3 -1
  507. data/test/models/guitar.rb +2 -0
  508. data/test/models/hotel.rb +5 -3
  509. data/test/models/human.rb +39 -0
  510. data/test/models/image.rb +3 -1
  511. data/test/models/interest.rb +14 -3
  512. data/test/models/invoice.rb +4 -2
  513. data/test/models/item.rb +3 -1
  514. data/test/models/job.rb +5 -3
  515. data/test/models/joke.rb +4 -2
  516. data/test/models/keyboard.rb +3 -1
  517. data/test/models/legacy_thing.rb +2 -0
  518. data/test/models/lesson.rb +2 -0
  519. data/test/models/line_item.rb +3 -1
  520. data/test/models/liquid.rb +2 -0
  521. data/test/models/matey.rb +3 -1
  522. data/test/models/measurement.rb +4 -0
  523. data/test/models/member.rb +23 -20
  524. data/test/models/member_detail.rb +3 -0
  525. data/test/models/member_type.rb +2 -0
  526. data/test/models/membership.rb +4 -1
  527. data/test/models/mentor.rb +3 -1
  528. data/test/models/message.rb +5 -0
  529. data/test/models/minimalistic.rb +2 -0
  530. data/test/models/minivan.rb +3 -2
  531. data/test/models/mixed_case_monkey.rb +3 -1
  532. data/test/models/molecule.rb +2 -0
  533. data/test/models/mouse.rb +6 -0
  534. data/test/models/movie.rb +2 -0
  535. data/test/models/node.rb +4 -2
  536. data/test/models/non_primary_key.rb +2 -0
  537. data/test/models/notification.rb +2 -0
  538. data/test/models/numeric_data.rb +12 -0
  539. data/test/models/order.rb +4 -2
  540. data/test/models/organization.rb +9 -7
  541. data/test/models/other_dog.rb +3 -1
  542. data/test/models/owner.rb +6 -4
  543. data/test/models/parrot.rb +12 -4
  544. data/test/models/person.rb +59 -54
  545. data/test/models/personal_legacy_thing.rb +3 -1
  546. data/test/models/pet.rb +4 -2
  547. data/test/models/pet_treasure.rb +2 -0
  548. data/test/models/pirate.rb +67 -43
  549. data/test/models/possession.rb +3 -1
  550. data/test/models/post.rb +184 -86
  551. data/test/models/price_estimate.rb +11 -1
  552. data/test/models/professor.rb +3 -1
  553. data/test/models/project.rb +14 -12
  554. data/test/models/publisher/article.rb +2 -0
  555. data/test/models/publisher/magazine.rb +2 -0
  556. data/test/models/publisher.rb +2 -0
  557. data/test/models/randomly_named_c1.rb +2 -0
  558. data/test/models/rating.rb +5 -1
  559. data/test/models/reader.rb +7 -5
  560. data/test/models/recipe.rb +2 -0
  561. data/test/models/record.rb +2 -0
  562. data/test/models/reference.rb +6 -3
  563. data/test/models/reply.rb +39 -21
  564. data/test/models/room.rb +6 -0
  565. data/test/models/section.rb +6 -0
  566. data/test/models/seminar.rb +6 -0
  567. data/test/models/session.rb +6 -0
  568. data/test/models/ship.rb +12 -9
  569. data/test/models/ship_part.rb +5 -3
  570. data/test/models/shop.rb +4 -2
  571. data/test/models/shop_account.rb +2 -0
  572. data/test/models/speedometer.rb +2 -0
  573. data/test/models/sponsor.rb +8 -5
  574. data/test/models/squeak.rb +6 -0
  575. data/test/models/strict_zine.rb +7 -0
  576. data/test/models/string_key_object.rb +2 -0
  577. data/test/models/student.rb +2 -0
  578. data/test/models/subscriber.rb +4 -2
  579. data/test/models/subscription.rb +5 -1
  580. data/test/models/tag.rb +6 -3
  581. data/test/models/tagging.rb +13 -6
  582. data/test/models/task.rb +2 -0
  583. data/test/models/topic.rb +54 -19
  584. data/test/models/toy.rb +4 -0
  585. data/test/models/traffic_light.rb +2 -0
  586. data/test/models/treasure.rb +5 -3
  587. data/test/models/treaty.rb +2 -4
  588. data/test/models/tree.rb +2 -0
  589. data/test/models/tuning_peg.rb +2 -0
  590. data/test/models/tyre.rb +2 -0
  591. data/test/models/user.rb +12 -4
  592. data/test/models/uuid_child.rb +2 -0
  593. data/test/models/uuid_item.rb +2 -0
  594. data/test/models/uuid_parent.rb +2 -0
  595. data/test/models/vegetables.rb +12 -3
  596. data/test/models/vertex.rb +6 -4
  597. data/test/models/warehouse_thing.rb +2 -0
  598. data/test/models/wheel.rb +3 -1
  599. data/test/models/without_table.rb +3 -1
  600. data/test/models/zine.rb +3 -1
  601. data/test/schema/mysql2_specific_schema.rb +49 -35
  602. data/test/schema/oracle_specific_schema.rb +13 -15
  603. data/test/schema/postgresql_specific_schema.rb +51 -40
  604. data/test/schema/schema.rb +334 -154
  605. data/test/schema/sqlite_specific_schema.rb +9 -16
  606. data/test/support/config.rb +26 -26
  607. data/test/support/connection.rb +14 -8
  608. data/test/support/connection_helper.rb +3 -1
  609. data/test/support/ddl_helper.rb +2 -0
  610. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  620. data/test/support/schema_dumping_helper.rb +2 -0
  621. data/test/support/stubs/strong_parameters.rb +40 -0
  622. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  624. metadata +196 -11
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
1
2
 
2
- require 'cases/helper'
3
- require 'models/company'
4
- require 'models/developer'
5
- require 'models/computer'
6
- require 'models/owner'
7
- require 'models/pet'
3
+ require "cases/helper"
4
+ require "models/company"
5
+ require "models/developer"
6
+ require "models/computer"
7
+ require "models/owner"
8
+ require "models/pet"
8
9
 
9
10
  class IntegrationTest < ActiveRecord::TestCase
10
11
  fixtures :companies, :developers, :owners, :pets
@@ -15,59 +16,85 @@ class IntegrationTest < ActiveRecord::TestCase
15
16
 
16
17
  def test_to_param_returns_nil_if_not_persisted
17
18
  client = Client.new
18
- assert_equal nil, client.to_param
19
+ assert_nil client.to_param
19
20
  end
20
21
 
21
22
  def test_to_param_returns_id_if_not_persisted_but_id_is_set
22
23
  client = Client.new
23
24
  client.id = 1
24
- assert_equal '1', client.to_param
25
+ assert_equal "1", client.to_param
25
26
  end
26
27
 
27
28
  def test_to_param_class_method
28
29
  firm = Firm.find(4)
29
- assert_equal '4-flamboyant-software', firm.to_param
30
+ assert_equal "4-flamboyant-software", firm.to_param
31
+ end
32
+
33
+ def test_to_param_class_method_truncates_words_properly
34
+ firm = Firm.find(4)
35
+ firm.name << ", Inc."
36
+ assert_equal "4-flamboyant-software", firm.to_param
37
+ end
38
+
39
+ def test_to_param_class_method_truncates_after_parameterize
40
+ firm = Firm.find(4)
41
+ firm.name = "Huey, Dewey, & Louie LLC"
42
+ # 123456789T123456789v
43
+ assert_equal "4-huey-dewey-louie-llc", firm.to_param
44
+ end
45
+
46
+ def test_to_param_class_method_truncates_after_parameterize_with_hyphens
47
+ firm = Firm.find(4)
48
+ firm.name = "Door-to-Door Wash-n-Fold Service"
49
+ # 123456789T123456789v
50
+ assert_equal "4-door-to-door-wash-n", firm.to_param
30
51
  end
31
52
 
32
53
  def test_to_param_class_method_truncates
33
54
  firm = Firm.find(4)
34
- firm.name = 'a ' * 100
35
- assert_equal '4-a-a-a-a-a-a-a-a-a', firm.to_param
55
+ firm.name = "a " * 100
56
+ assert_equal "4-a-a-a-a-a-a-a-a-a-a", firm.to_param
36
57
  end
37
58
 
38
59
  def test_to_param_class_method_truncates_edge_case
39
60
  firm = Firm.find(4)
40
- firm.name = 'David HeinemeierHansson'
41
- assert_equal '4-david', firm.to_param
61
+ firm.name = "David HeinemeierHansson"
62
+ assert_equal "4-david", firm.to_param
63
+ end
64
+
65
+ def test_to_param_class_method_truncates_case_shown_in_doc
66
+ firm = Firm.find(4)
67
+ firm.name = "David Heinemeier Hansson"
68
+ assert_equal "4-david-heinemeier", firm.to_param
42
69
  end
43
70
 
44
71
  def test_to_param_class_method_squishes
45
72
  firm = Firm.find(4)
46
73
  firm.name = "ab \n" * 100
47
- assert_equal '4-ab-ab-ab-ab-ab-ab', firm.to_param
74
+ assert_equal "4-ab-ab-ab-ab-ab-ab-ab", firm.to_param
48
75
  end
49
76
 
50
77
  def test_to_param_class_method_multibyte_character
51
78
  firm = Firm.find(4)
52
79
  firm.name = "戦場ヶ原 ひたぎ"
53
- assert_equal '4', firm.to_param
80
+ assert_equal "4", firm.to_param
54
81
  end
55
82
 
56
83
  def test_to_param_class_method_uses_default_if_blank
57
84
  firm = Firm.find(4)
58
85
  firm.name = nil
59
- assert_equal '4', firm.to_param
60
- firm.name = ' '
61
- assert_equal '4', firm.to_param
86
+ assert_equal "4", firm.to_param
87
+ firm.name = " "
88
+ assert_equal "4", firm.to_param
62
89
  end
63
90
 
64
91
  def test_to_param_class_method_uses_default_if_not_persisted
65
- firm = Firm.new(name: 'Fancy Shirts')
66
- assert_equal nil, firm.to_param
92
+ firm = Firm.new(name: "Fancy Shirts")
93
+ assert_nil firm.to_param
67
94
  end
68
95
 
69
96
  def test_to_param_with_no_arguments
70
- assert_equal 'Firm', Firm.to_param
97
+ assert_equal "Firm", Firm.to_param
71
98
  end
72
99
 
73
100
  def test_cache_key_for_existing_record_is_not_timezone_dependent
@@ -127,29 +154,90 @@ class IntegrationTest < ActiveRecord::TestCase
127
154
  end
128
155
 
129
156
  def test_cache_key_format_is_precise_enough
130
- skip("Subsecond precision is not supported") unless subsecond_precision_supported?
157
+ skip("Subsecond precision is not supported") unless supports_datetime_with_precision?
131
158
  dev = Developer.first
132
159
  key = dev.cache_key
133
- dev.touch
160
+ travel_to dev.updated_at + 0.000001 do
161
+ dev.touch
162
+ end
134
163
  assert_not_equal key, dev.cache_key
135
164
  end
136
165
 
137
166
  def test_cache_key_format_is_not_too_precise
138
- skip("Subsecond precision is not supported") unless subsecond_precision_supported?
139
167
  dev = Developer.first
140
168
  dev.touch
141
169
  key = dev.cache_key
142
170
  assert_equal key, dev.reload.cache_key
143
171
  end
144
172
 
145
- def test_named_timestamps_for_cache_key
146
- owner = owners(:blackbeard)
147
- assert_equal "owners/#{owner.id}-#{owner.happy_at.utc.to_s(:usec)}", owner.cache_key(:updated_at, :happy_at)
173
+ def test_cache_version_format_is_precise_enough
174
+ skip("Subsecond precision is not supported") unless supports_datetime_with_precision?
175
+ with_cache_versioning do
176
+ dev = Developer.first
177
+ version = dev.cache_version.to_param
178
+ travel_to Developer.first.updated_at + 0.000001 do
179
+ dev.touch
180
+ end
181
+ assert_not_equal version, dev.cache_version.to_param
182
+ end
148
183
  end
149
184
 
150
- def test_cache_key_when_named_timestamp_is_nil
151
- owner = owners(:blackbeard)
152
- owner.happy_at = nil
153
- assert_equal "owners/#{owner.id}", owner.cache_key(:happy_at)
185
+ def test_cache_version_format_is_not_too_precise
186
+ with_cache_versioning do
187
+ dev = Developer.first
188
+ dev.touch
189
+ key = dev.cache_version.to_param
190
+ assert_equal key, dev.reload.cache_version.to_param
191
+ end
192
+ end
193
+
194
+ def test_cache_key_is_stable_with_versioning_on
195
+ with_cache_versioning do
196
+ developer = Developer.first
197
+ first_key = developer.cache_key
198
+
199
+ developer.touch
200
+ second_key = developer.cache_key
201
+
202
+ assert_equal first_key, second_key
203
+ end
204
+ end
205
+
206
+ def test_cache_version_changes_with_versioning_on
207
+ with_cache_versioning do
208
+ developer = Developer.first
209
+ first_version = developer.cache_version
210
+
211
+ travel 10.seconds do
212
+ developer.touch
213
+ end
214
+
215
+ second_version = developer.cache_version
216
+
217
+ assert_not_equal first_version, second_version
218
+ end
219
+ end
220
+
221
+ def test_cache_key_retains_version_when_custom_timestamp_is_used
222
+ with_cache_versioning do
223
+ developer = Developer.first
224
+ first_key = developer.cache_key_with_version
225
+
226
+ travel 10.seconds do
227
+ developer.touch
228
+ end
229
+
230
+ second_key = developer.cache_key_with_version
231
+
232
+ assert_not_equal first_key, second_key
233
+ end
234
+ end
235
+
236
+ def with_cache_versioning(value = true)
237
+ @old_cache_versioning = ActiveRecord::Base.cache_versioning
238
+ ActiveRecord::Base.cache_versioning = value
239
+ yield
240
+ ensure
241
+ ActiveRecord::Base.cache_versioning = @old_cache_versioning
154
242
  end
155
243
  end
@@ -1,24 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
- if current_adapter?(:Mysql2Adapter)
4
- class TestAdapterWithInvalidConnection < ActiveRecord::TestCase
5
- self.use_transactional_tests = false
5
+ if current_adapter?(:Mysql2Adapter) or current_adapter?(:IBM_DBAdapter)
6
+ class TestAdapterWithInvalidConnection < ActiveRecord::TestCase
7
+ self.use_transactional_tests = false
6
8
 
7
- class Bird < ActiveRecord::Base
8
- end
9
+ class Bird < ActiveRecord::Base
10
+ end
9
11
 
10
- def setup
11
- # Can't just use current adapter; sqlite3 will create a database
12
- # file on the fly.
13
- Bird.establish_connection adapter: 'mysql2', database: 'i_do_not_exist'
14
- end
12
+ def setup
13
+ # Can't just use current adapter; sqlite3 will create a database
14
+ # file on the fly.
15
+ Bird.establish_connection adapter: "ibm_db", database: "i_do_not_exist"
16
+ end
15
17
 
16
- teardown do
17
- Bird.remove_connection
18
- end
18
+ teardown do
19
+ Bird.remove_connection
20
+ end
19
21
 
20
- test "inspect on Model class does not raise" do
21
- assert_equal "#{Bird.name} (call '#{Bird.name}.connection' to establish a connection)", Bird.inspect
22
+ test "inspect on Model class does not raise" do
23
+ assert_equal "#{Bird.name} (call '#{Bird.name}.connection' to establish a connection)", Bird.inspect
24
+ end
22
25
  end
23
26
  end
24
- end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  class Horse < ActiveRecord::Base
@@ -6,7 +8,7 @@ end
6
8
  module ActiveRecord
7
9
  class InvertibleMigrationTest < ActiveRecord::TestCase
8
10
  class SilentMigration < ActiveRecord::Migration::Current
9
- def write(text = '')
11
+ def write(text = "")
10
12
  # sssshhhhh!!
11
13
  end
12
14
  end
@@ -16,6 +18,24 @@ module ActiveRecord
16
18
  create_table("horses") do |t|
17
19
  t.column :content, :text
18
20
  t.column :remind_at, :datetime
21
+ t.column :place_id, :integer
22
+ end
23
+ end
24
+ end
25
+
26
+ class InvertibleChangeTableMigration < SilentMigration
27
+ def change
28
+ change_table("horses") do |t|
29
+ t.column :name, :string
30
+ t.remove :remind_at, type: :datetime
31
+ end
32
+ end
33
+ end
34
+
35
+ class InvertibleTransactionMigration < InvertibleMigration
36
+ def change
37
+ transaction do
38
+ super
19
39
  end
20
40
  end
21
41
  end
@@ -67,6 +87,7 @@ module ActiveRecord
67
87
  t.column :name, :string
68
88
  t.column :color, :string
69
89
  t.index [:name, :color]
90
+ t.index [:color]
70
91
  end
71
92
  end
72
93
  end
@@ -75,6 +96,7 @@ module ActiveRecord
75
96
  def change
76
97
  change_table("horses") do |t|
77
98
  t.remove_index [:name, :color]
99
+ t.remove_index [:color], if_exists: true
78
100
  end
79
101
  end
80
102
  end
@@ -93,6 +115,32 @@ module ActiveRecord
93
115
  end
94
116
  end
95
117
 
118
+ class ChangeColumnComment1 < SilentMigration
119
+ def change
120
+ create_table("horses") do |t|
121
+ t.column :name, :string, comment: "Sekitoba"
122
+ end
123
+ end
124
+ end
125
+
126
+ class ChangeColumnComment2 < SilentMigration
127
+ def change
128
+ change_column_comment :horses, :name, from: "Sekitoba", to: "Diomed"
129
+ end
130
+ end
131
+
132
+ class ChangeTableComment1 < SilentMigration
133
+ def change
134
+ create_table("horses", comment: "Sekitoba")
135
+ end
136
+ end
137
+
138
+ class ChangeTableComment2 < SilentMigration
139
+ def change
140
+ change_table_comment :horses, from: "Sekitoba", to: "Diomed"
141
+ end
142
+ end
143
+
96
144
  class DisableExtension1 < SilentMigration
97
145
  def change
98
146
  enable_extension "hstore"
@@ -151,6 +199,12 @@ module ActiveRecord
151
199
  end
152
200
  end
153
201
 
202
+ class RevertNonNamedExpressionIndexMigration < SilentMigration
203
+ def change
204
+ add_index :horses, "remind_at, place_id"
205
+ end
206
+ end
207
+
154
208
  class RevertCustomForeignKeyTable < SilentMigration
155
209
  def change
156
210
  change_table(:horses) do |t|
@@ -159,16 +213,23 @@ module ActiveRecord
159
213
  end
160
214
  end
161
215
 
216
+ class UpOnlyMigration < SilentMigration
217
+ def change
218
+ add_column :horses, :oldie, :integer, default: 0
219
+ up_only { execute "update horses set oldie = 1" }
220
+ end
221
+ end
222
+
223
+ self.use_transactional_tests = false
224
+
162
225
  setup do
163
226
  @verbose_was, ActiveRecord::Migration.verbose = ActiveRecord::Migration.verbose, false
164
227
  end
165
228
 
166
229
  teardown do
167
230
  %w[horses new_horses].each do |table|
168
- ActiveSupport::Deprecation.silence do
169
- if ActiveRecord::Base.connection.table_exists?(table)
170
- ActiveRecord::Base.connection.drop_table(table)
171
- end
231
+ if ActiveRecord::Base.connection.table_exists?(table)
232
+ ActiveRecord::Base.connection.drop_table(table)
172
233
  end
173
234
  end
174
235
  ActiveRecord::Migration.verbose = @verbose_was
@@ -199,14 +260,14 @@ module ActiveRecord
199
260
  def test_migrate_up
200
261
  migration = InvertibleMigration.new
201
262
  migration.migrate(:up)
202
- ActiveSupport::Deprecation.silence { assert migration.connection.table_exists?("horses"), "horses should exist" }
263
+ assert migration.connection.table_exists?("horses"), "horses should exist"
203
264
  end
204
265
 
205
266
  def test_migrate_down
206
267
  migration = InvertibleMigration.new
207
268
  migration.migrate :up
208
269
  migration.migrate :down
209
- ActiveSupport::Deprecation.silence { assert !migration.connection.table_exists?("horses") }
270
+ assert_not migration.connection.table_exists?("horses")
210
271
  end
211
272
 
212
273
  def test_migrate_revert
@@ -214,36 +275,39 @@ module ActiveRecord
214
275
  revert = InvertibleRevertMigration.new
215
276
  migration.migrate :up
216
277
  revert.migrate :up
217
- ActiveSupport::Deprecation.silence { assert !migration.connection.table_exists?("horses") }
278
+ assert_not migration.connection.table_exists?("horses")
218
279
  revert.migrate :down
219
- ActiveSupport::Deprecation.silence { assert migration.connection.table_exists?("horses") }
280
+ assert migration.connection.table_exists?("horses")
281
+ migration.migrate :down
282
+ assert_not migration.connection.table_exists?("horses")
283
+ end
284
+
285
+ def test_migrate_revert_change_table
286
+ InvertibleMigration.new.migrate :up
287
+ migration = InvertibleChangeTableMigration.new
288
+ migration.migrate :up
289
+ assert_not migration.connection.column_exists?(:horses, :remind_at)
220
290
  migration.migrate :down
221
- ActiveSupport::Deprecation.silence { assert !migration.connection.table_exists?("horses") }
291
+ assert migration.connection.column_exists?(:horses, :remind_at)
222
292
  end
223
293
 
224
294
  def test_migrate_revert_by_part
225
295
  InvertibleMigration.new.migrate :up
226
296
  received = []
227
297
  migration = InvertibleByPartsMigration.new
228
- migration.test = ->(dir){
229
- ActiveSupport::Deprecation.silence do
230
- assert migration.connection.table_exists?("horses")
231
- assert migration.connection.table_exists?("new_horses")
232
- end
298
+ migration.test = ->(dir) {
299
+ assert migration.connection.table_exists?("horses")
300
+ assert migration.connection.table_exists?("new_horses")
233
301
  received << dir
234
302
  }
235
303
  migration.migrate :up
236
304
  assert_equal [:both, :up], received
237
- ActiveSupport::Deprecation.silence do
238
- assert !migration.connection.table_exists?("horses")
239
- assert migration.connection.table_exists?("new_horses")
240
- end
305
+ assert_not migration.connection.table_exists?("horses")
306
+ assert migration.connection.table_exists?("new_horses")
241
307
  migration.migrate :down
242
308
  assert_equal [:both, :up, :both, :down], received
243
- ActiveSupport::Deprecation.silence do
244
- assert migration.connection.table_exists?("horses")
245
- assert !migration.connection.table_exists?("new_horses")
246
- end
309
+ assert migration.connection.table_exists?("horses")
310
+ assert_not migration.connection.table_exists?("new_horses")
247
311
  end
248
312
 
249
313
  def test_migrate_revert_whole_migration
@@ -252,25 +316,34 @@ module ActiveRecord
252
316
  revert = RevertWholeMigration.new(klass)
253
317
  migration.migrate :up
254
318
  revert.migrate :up
255
- ActiveSupport::Deprecation.silence { assert !migration.connection.table_exists?("horses") }
319
+ assert_not migration.connection.table_exists?("horses")
256
320
  revert.migrate :down
257
- ActiveSupport::Deprecation.silence { assert migration.connection.table_exists?("horses") }
321
+ assert migration.connection.table_exists?("horses")
258
322
  migration.migrate :down
259
- ActiveSupport::Deprecation.silence { assert !migration.connection.table_exists?("horses") }
323
+ assert_not migration.connection.table_exists?("horses")
260
324
  end
261
325
  end
262
326
 
263
327
  def test_migrate_nested_revert_whole_migration
264
328
  revert = NestedRevertWholeMigration.new(InvertibleRevertMigration)
265
329
  revert.migrate :down
266
- ActiveSupport::Deprecation.silence { assert revert.connection.table_exists?("horses") }
330
+ assert revert.connection.table_exists?("horses")
267
331
  revert.migrate :up
268
- ActiveSupport::Deprecation.silence { assert !revert.connection.table_exists?("horses") }
332
+ assert_not revert.connection.table_exists?("horses")
333
+ end
334
+
335
+ def test_migrate_revert_transaction
336
+ migration = InvertibleTransactionMigration.new
337
+ migration.migrate :up
338
+ assert migration.connection.table_exists?("horses")
339
+ migration.migrate :down
340
+ assert_not migration.connection.table_exists?("horses")
269
341
  end
270
342
 
271
343
  def test_migrate_revert_change_column_default
272
344
  migration1 = ChangeColumnDefault1.new
273
345
  migration1.migrate(:up)
346
+ Horse.reset_column_information
274
347
  assert_equal "Sekitoba", Horse.new.name
275
348
 
276
349
  migration2 = ChangeColumnDefault2.new
@@ -283,29 +356,65 @@ module ActiveRecord
283
356
  assert_equal "Sekitoba", Horse.new.name
284
357
  end
285
358
 
359
+ if ActiveRecord::Base.connection.supports_comments?
360
+ def test_migrate_revert_change_column_comment
361
+ migration1 = ChangeColumnComment1.new
362
+ migration1.migrate(:up)
363
+ Horse.reset_column_information
364
+ assert_equal "Sekitoba", Horse.columns_hash["name"].comment
365
+
366
+ migration2 = ChangeColumnComment2.new
367
+ migration2.migrate(:up)
368
+ Horse.reset_column_information
369
+ assert_equal "Diomed", Horse.columns_hash["name"].comment
370
+
371
+ migration2.migrate(:down)
372
+ Horse.reset_column_information
373
+ assert_equal "Sekitoba", Horse.columns_hash["name"].comment
374
+ end
375
+
376
+ def test_migrate_revert_change_table_comment
377
+ connection = ActiveRecord::Base.connection
378
+ migration1 = ChangeTableComment1.new
379
+ migration1.migrate(:up)
380
+ assert_equal "Sekitoba", connection.table_comment("horses")
381
+
382
+ migration2 = ChangeTableComment2.new
383
+ migration2.migrate(:up)
384
+ assert_equal "Diomed", connection.table_comment("horses")
385
+
386
+ migration2.migrate(:down)
387
+ assert_equal "Sekitoba", connection.table_comment("horses")
388
+ end
389
+ end
390
+
286
391
  if current_adapter?(:PostgreSQLAdapter)
287
392
  def test_migrate_enable_and_disable_extension
288
393
  migration1 = InvertibleMigration.new
289
394
  migration2 = DisableExtension1.new
290
395
  migration3 = DisableExtension2.new
291
396
 
397
+ assert_equal true, Horse.connection.extension_available?("hstore")
398
+
292
399
  migration1.migrate(:up)
293
400
  migration2.migrate(:up)
294
- assert_equal true, Horse.connection.extension_enabled?('hstore')
401
+ assert_equal true, Horse.connection.extension_enabled?("hstore")
295
402
 
296
403
  migration3.migrate(:up)
297
- assert_equal false, Horse.connection.extension_enabled?('hstore')
404
+ assert_equal false, Horse.connection.extension_enabled?("hstore")
298
405
 
299
406
  migration3.migrate(:down)
300
- assert_equal true, Horse.connection.extension_enabled?('hstore')
407
+ assert_equal true, Horse.connection.extension_enabled?("hstore")
301
408
 
302
409
  migration2.migrate(:down)
303
- assert_equal false, Horse.connection.extension_enabled?('hstore')
410
+ assert_equal false, Horse.connection.extension_enabled?("hstore")
411
+ ensure
412
+ enable_extension!("hstore", ActiveRecord::Base.connection)
304
413
  end
305
414
  end
306
415
 
307
416
  def test_revert_order
308
- block = Proc.new{|t| t.string :name }
417
+ block = Proc.new { |t| t.string :name }
309
418
  recorder = ActiveRecord::Migration::CommandRecorder.new(ActiveRecord::Base.connection)
310
419
  recorder.instance_eval do
311
420
  create_table("apples", &block)
@@ -330,35 +439,35 @@ module ActiveRecord
330
439
 
331
440
  def test_legacy_up
332
441
  LegacyMigration.migrate :up
333
- ActiveSupport::Deprecation.silence { assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist" }
442
+ assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist"
334
443
  end
335
444
 
336
445
  def test_legacy_down
337
446
  LegacyMigration.migrate :up
338
447
  LegacyMigration.migrate :down
339
- ActiveSupport::Deprecation.silence { assert !ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist" }
448
+ assert_not ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist"
340
449
  end
341
450
 
342
451
  def test_up
343
452
  LegacyMigration.up
344
- ActiveSupport::Deprecation.silence { assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist" }
453
+ assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist"
345
454
  end
346
455
 
347
456
  def test_down
348
457
  LegacyMigration.up
349
458
  LegacyMigration.down
350
- ActiveSupport::Deprecation.silence { assert !ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist" }
459
+ assert_not ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist"
351
460
  end
352
461
 
353
462
  def test_migrate_down_with_table_name_prefix
354
- ActiveRecord::Base.table_name_prefix = 'p_'
355
- ActiveRecord::Base.table_name_suffix = '_s'
463
+ ActiveRecord::Base.table_name_prefix = "p_"
464
+ ActiveRecord::Base.table_name_suffix = "_s"
356
465
  migration = InvertibleMigration.new
357
466
  migration.migrate(:up)
358
467
  assert_nothing_raised { migration.migrate(:down) }
359
- ActiveSupport::Deprecation.silence { assert !ActiveRecord::Base.connection.table_exists?("p_horses_s"), "p_horses_s should not exist" }
468
+ assert_not ActiveRecord::Base.connection.table_exists?("p_horses_s"), "p_horses_s should not exist"
360
469
  ensure
361
- ActiveRecord::Base.table_name_prefix = ActiveRecord::Base.table_name_suffix = ''
470
+ ActiveRecord::Base.table_name_prefix = ActiveRecord::Base.table_name_suffix = ""
362
471
  end
363
472
 
364
473
  def test_migrations_can_handle_foreign_keys_to_specific_tables
@@ -369,7 +478,7 @@ module ActiveRecord
369
478
  end
370
479
 
371
480
  # MySQL 5.7 and Oracle do not allow to create duplicate indexes on the same columns
372
- unless current_adapter?(:Mysql2Adapter, :OracleAdapter)
481
+ unless current_adapter?(:Mysql2Adapter, :OracleAdapter, :IBM_DBAdapter)
373
482
  def test_migrate_revert_add_index_with_name
374
483
  RevertNamedIndexMigration1.new.migrate(:up)
375
484
  RevertNamedIndexMigration2.new.migrate(:up)
@@ -378,10 +487,41 @@ module ActiveRecord
378
487
  connection = ActiveRecord::Base.connection
379
488
  assert connection.index_exists?(:horses, :content),
380
489
  "index on content should exist"
381
- assert !connection.index_exists?(:horses, :content, name: "horses_index_named"),
490
+ assert_not connection.index_exists?(:horses, :content, name: "horses_index_named"),
382
491
  "horses_index_named index should not exist"
383
492
  end
384
493
  end
385
494
 
495
+ def test_migrate_revert_add_index_without_name_on_expression
496
+ InvertibleMigration.new.migrate(:up)
497
+ RevertNonNamedExpressionIndexMigration.new.migrate(:up)
498
+
499
+ connection = ActiveRecord::Base.connection
500
+ assert connection.index_exists?(:horses, [:remind_at, :place_id]),
501
+ "index on remind_at and place_id should exist"
502
+
503
+ RevertNonNamedExpressionIndexMigration.new.migrate(:down)
504
+
505
+ assert_not connection.index_exists?(:horses, [:remind_at, :place_id]),
506
+ "index on remind_at and place_id should not exist"
507
+ end
508
+
509
+ def test_up_only
510
+ InvertibleMigration.new.migrate(:up)
511
+ horse1 = Horse.create
512
+ # populates existing horses with oldie = 1 but new ones have default 0
513
+ UpOnlyMigration.new.migrate(:up)
514
+ Horse.reset_column_information
515
+ horse1.reload
516
+ horse2 = Horse.create
517
+
518
+ assert 1, horse1.oldie # created before migration
519
+ assert 0, horse2.oldie # created after migration
520
+
521
+ UpOnlyMigration.new.migrate(:down) # should be no error
522
+ connection = ActiveRecord::Base.connection
523
+ assert_not connection.column_exists?(:horses, :oldie)
524
+ Horse.reset_column_information
525
+ end
386
526
  end
387
527
  end