ibm_db 5.2.0-x86-mingw32 → 5.4.0-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 (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -1,107 +1,129 @@
1
- require 'cases/helper'
2
- require 'support/schema_dumping_helper'
1
+ # frozen_string_literal: true
3
2
 
4
- if subsecond_precision_supported?
5
- class DateTimePrecisionTest < ActiveRecord::TestCase
6
- include SchemaDumpingHelper
7
- self.use_transactional_tests = false
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
8
5
 
9
- class Foo < ActiveRecord::Base; end
6
+ if supports_datetime_with_precision?
7
+ class DateTimePrecisionTest < ActiveRecord::TestCase
8
+ include SchemaDumpingHelper
9
+ self.use_transactional_tests = false
10
10
 
11
- setup do
12
- @connection = ActiveRecord::Base.connection
13
- Foo.reset_column_information
14
- end
11
+ class Foo < ActiveRecord::Base; end
15
12
 
16
- teardown do
17
- @connection.drop_table :foos
18
- #, if_exists: true
19
- end
13
+ setup do
14
+ @connection = ActiveRecord::Base.connection
15
+ Foo.reset_column_information
16
+ end
20
17
 
21
- def test_datetime_data_type_with_precision
22
- @connection.create_table(:foos, force: true)
23
- @connection.add_column :foos, :created_at, :datetime, precision: 0
24
- @connection.add_column :foos, :updated_at, :datetime, precision: 5
25
- assert_equal 0, Foo.columns_hash['created_at'].precision
26
- assert_equal 5, Foo.columns_hash['updated_at'].precision
27
- end
18
+ teardown do
19
+ @connection.drop_table :foos, if_exists: true
20
+ end
28
21
 
29
- def test_datetime_precision_is_truncated_on_assignment
30
- @connection.create_table(:foos, force: true)
31
- @connection.add_column :foos, :created_at, :datetime, precision: 0
32
- @connection.add_column :foos, :updated_at, :datetime, precision: 6
22
+ def test_datetime_data_type_with_precision
23
+ @connection.create_table(:foos, force: true)
24
+ @connection.add_column :foos, :created_at, :datetime, precision: 0
25
+ @connection.add_column :foos, :updated_at, :datetime, precision: 5
26
+ assert_equal 0, Foo.columns_hash["created_at"].precision
27
+ assert_equal 5, Foo.columns_hash["updated_at"].precision
28
+ end
33
29
 
34
- time = ::Time.now.change(nsec: 123456789)
35
- foo = Foo.new(created_at: time, updated_at: time)
30
+ def test_datetime_precision_is_truncated_on_assignment
31
+ @connection.create_table(:foos, force: true)
32
+ @connection.add_column :foos, :created_at, :datetime, precision: 0
33
+ @connection.add_column :foos, :updated_at, :datetime, precision: 6
36
34
 
37
- assert_equal 0, foo.created_at.nsec
38
- assert_equal 123456000, foo.updated_at.nsec
35
+ time = ::Time.now.change(nsec: 123456789)
36
+ foo = Foo.new(created_at: time, updated_at: time)
39
37
 
40
- foo.save!
41
- foo.reload
38
+ assert_equal 0, foo.created_at.nsec
39
+ assert_equal 123456000, foo.updated_at.nsec
42
40
 
43
- assert_equal 0, foo.created_at.nsec
44
- assert_equal 123456000, foo.updated_at.nsec
45
- end
41
+ foo.save!
42
+ foo.reload
46
43
 
47
- def test_timestamps_helper_with_custom_precision
48
- @connection.create_table(:foos, force: true) do |t|
49
- t.timestamps precision: 4
44
+ assert_equal 0, foo.created_at.nsec
45
+ assert_equal 123456000, foo.updated_at.nsec
50
46
  end
51
- assert_equal 4, Foo.columns_hash['created_at'].precision
52
- assert_equal 4, Foo.columns_hash['updated_at'].precision
53
- end
54
47
 
55
- def test_passing_precision_to_datetime_does_not_set_limit
56
- @connection.create_table(:foos, force: true) do |t|
57
- t.timestamps precision: 4
48
+ unless current_adapter?(:Mysql2Adapter, :IBM_DBAdapter)
49
+ def test_no_datetime_precision_isnt_truncated_on_assignment
50
+ @connection.create_table(:foos, force: true)
51
+ @connection.add_column :foos, :created_at, :datetime
52
+ @connection.add_column :foos, :updated_at, :datetime, precision: 6
53
+
54
+ time = ::Time.now.change(nsec: 123)
55
+ foo = Foo.new(created_at: time, updated_at: time)
56
+
57
+ assert_equal 123, foo.created_at.nsec
58
+ assert_equal 0, foo.updated_at.nsec
59
+
60
+ foo.save!
61
+ foo.reload
62
+
63
+ assert_equal 0, foo.created_at.nsec
64
+ assert_equal 0, foo.updated_at.nsec
65
+ end
58
66
  end
59
- assert_nil Foo.columns_hash['created_at'].limit
60
- assert_nil Foo.columns_hash['updated_at'].limit
61
- end
62
67
 
63
- def test_invalid_datetime_precision_raises_error
64
- assert_raises ActiveRecord::ActiveRecordError do
68
+ def test_timestamps_helper_with_custom_precision
65
69
  @connection.create_table(:foos, force: true) do |t|
66
- t.timestamps precision: 7
70
+ t.timestamps precision: 4
67
71
  end
72
+ assert_equal 4, Foo.columns_hash["created_at"].precision
73
+ assert_equal 4, Foo.columns_hash["updated_at"].precision
68
74
  end
69
- end
70
75
 
71
- def test_formatting_datetime_according_to_precision
72
- @connection.create_table(:foos, force: true) do |t|
73
- t.datetime :created_at, precision: 0
74
- t.datetime :updated_at, precision: 4
76
+ def test_passing_precision_to_datetime_does_not_set_limit
77
+ @connection.create_table(:foos, force: true) do |t|
78
+ t.timestamps precision: 4
79
+ end
80
+ assert_nil Foo.columns_hash["created_at"].limit
81
+ assert_nil Foo.columns_hash["updated_at"].limit
75
82
  end
76
- date = ::Time.utc(2014, 8, 17, 12, 30, 0, 999999)
77
- Foo.create!(created_at: date, updated_at: date)
78
- assert foo = Foo.find_by(created_at: date)
79
- assert_equal 1, Foo.where(updated_at: date).count
80
- assert_equal date.to_s, foo.created_at.to_s
81
- assert_equal date.to_s, foo.updated_at.to_s
82
- assert_equal 000000, foo.created_at.usec
83
- assert_equal 999900, foo.updated_at.usec
84
- end
85
83
 
86
- def test_schema_dump_includes_datetime_precision
87
- @connection.create_table(:foos, force: true) do |t|
88
- t.timestamps precision: 6
84
+ def test_invalid_datetime_precision_raises_error
85
+ assert_raises ArgumentError do
86
+ @connection.create_table(:foos, force: true) do |t|
87
+ t.timestamps precision: 13
88
+ end
89
+ end
89
90
  end
90
- output = dump_table_schema("foos")
91
- assert_match %r{t\.datetime\s+"created_at",\s+precision: 6,\s+null: false$}, output
92
- assert_match %r{t\.datetime\s+"updated_at",\s+precision: 6,\s+null: false$}, output
93
- end
94
91
 
95
- if current_adapter?(:PostgreSQLAdapter, :SQLServerAdapter)
96
- def test_datetime_precision_with_zero_should_be_dumped
92
+ def test_formatting_datetime_according_to_precision
97
93
  @connection.create_table(:foos, force: true) do |t|
98
- t.timestamps precision: 0
94
+ t.datetime :created_at, precision: 0
95
+ t.datetime :updated_at, precision: 4
96
+ end
97
+
98
+ date = ::Time.utc(2014, 8, 17, 12, 30, 0, 999999)
99
+ Foo.create!(created_at: date, updated_at: date)
100
+
101
+ assert foo = Foo.find_by(created_at: date)
102
+ assert_equal 1, Foo.where(updated_at: date).count
103
+ assert_equal date.to_s, foo.created_at.to_s
104
+ assert_equal date.to_s, foo.updated_at.to_s
105
+ assert_equal 000000, foo.created_at.usec
106
+ assert_equal 999900, foo.updated_at.usec
107
+ end
108
+
109
+ def test_schema_dump_includes_datetime_precision
110
+ @connection.create_table(:foos, force: true) do |t|
111
+ t.timestamps precision: 6
99
112
  end
100
113
  output = dump_table_schema("foos")
101
- assert_match %r{t\.datetime\s+"created_at",\s+precision: 0,\s+null: false$}, output
102
- assert_match %r{t\.datetime\s+"updated_at",\s+precision: 0,\s+null: false$}, output
114
+ assert_match %r{t\.datetime\s+"created_at",\s+precision: 6,\s+null: false$}, output
115
+ assert_match %r{t\.datetime\s+"updated_at",\s+precision: 6,\s+null: false$}, output
103
116
  end
104
- end
105
117
 
106
- end
118
+ if current_adapter?(:PostgreSQLAdapter, :SQLServerAdapter)
119
+ def test_datetime_precision_with_zero_should_be_dumped
120
+ @connection.create_table(:foos, force: true) do |t|
121
+ t.timestamps precision: 0
122
+ end
123
+ output = dump_table_schema("foos")
124
+ assert_match %r{t\.datetime\s+"created_at",\s+precision: 0,\s+null: false$}, output
125
+ assert_match %r{t\.datetime\s+"updated_at",\s+precision: 0,\s+null: false$}, output
126
+ end
127
+ end
128
+ end
107
129
  end
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/topic'
3
- require 'models/task'
4
+ require "models/topic"
5
+ require "models/task"
4
6
 
5
7
  class DateTimeTest < ActiveRecord::TestCase
6
8
  include InTimeZone
7
9
 
8
10
  def test_saves_both_date_and_time
9
- with_env_tz 'America/New_York' do
11
+ with_env_tz "America/New_York" do
10
12
  with_timezone_config default: :utc do
11
13
  time_values = [1807, 2, 10, 15, 30, 45]
12
14
  # create DateTime value with local time zone offset
@@ -25,7 +27,7 @@ class DateTimeTest < ActiveRecord::TestCase
25
27
 
26
28
  def test_assign_empty_date_time
27
29
  task = Task.new
28
- task.starting = ''
30
+ task.starting = ""
29
31
  task.ending = nil
30
32
  assert_nil task.starting
31
33
  assert_nil task.ending
@@ -34,28 +36,41 @@ class DateTimeTest < ActiveRecord::TestCase
34
36
  def test_assign_bad_date_time_with_timezone
35
37
  in_time_zone "Pacific Time (US & Canada)" do
36
38
  task = Task.new
37
- task.starting = '2014-07-01T24:59:59GMT'
39
+ task.starting = "2014-07-01T24:59:59GMT"
38
40
  assert_nil task.starting
39
41
  end
40
42
  end
41
43
 
42
44
  def test_assign_empty_date
43
45
  topic = Topic.new
44
- topic.last_read = ''
46
+ topic.last_read = ""
45
47
  assert_nil topic.last_read
46
48
  end
47
49
 
48
50
  def test_assign_empty_time
49
51
  topic = Topic.new
50
- topic.bonus_time = ''
52
+ topic.bonus_time = ""
51
53
  assert_nil topic.bonus_time
52
54
  end
53
55
 
54
56
  def test_assign_in_local_timezone
55
- now = DateTime.now
57
+ now = DateTime.civil(2017, 3, 1, 12, 0, 0)
56
58
  with_timezone_config default: :local do
57
59
  task = Task.new starting: now
58
60
  assert_equal now, task.starting
59
61
  end
60
62
  end
63
+
64
+ def test_date_time_with_string_value_with_subsecond_precision
65
+ skip unless supports_datetime_with_precision?
66
+ string_value = "2017-07-04 14:19:00.5"
67
+ topic = Topic.create(written_on: string_value)
68
+ assert_equal topic, Topic.find_by(written_on: string_value)
69
+ end
70
+
71
+ def test_date_time_with_string_value_with_non_iso_format
72
+ string_value = "04/07/2017 2:19pm"
73
+ topic = Topic.create(written_on: string_value)
74
+ assert_equal topic, Topic.find_by(written_on: string_value)
75
+ end
61
76
  end
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
3
- require 'models/default'
4
- require 'models/entrant'
4
+ require "support/schema_dumping_helper"
5
+ require "models/default"
6
+ require "models/entrant"
5
7
 
6
8
  class DefaultTest < ActiveRecord::TestCase
7
9
  def test_nil_defaults_for_not_null_columns
8
10
  %w(id name course_id).each do |name|
9
11
  column = Entrant.columns_hash[name]
10
- assert !column.null, "#{name} column should be NOT NULL"
12
+ assert_not column.null, "#{name} column should be NOT NULL"
11
13
  assert_not column.default, "#{name} column should be DEFAULT 'nil'"
12
14
  end
13
15
  end
@@ -34,8 +36,7 @@ class DefaultNumbersTest < ActiveRecord::TestCase
34
36
  end
35
37
 
36
38
  teardown do
37
- @connection.drop_table :default_numbers
38
- #, if_exists: true
39
+ @connection.drop_table :default_numbers, if_exists: true
39
40
  end
40
41
 
41
42
  def test_default_positive_integer
@@ -52,7 +53,7 @@ class DefaultNumbersTest < ActiveRecord::TestCase
52
53
 
53
54
  def test_default_decimal_number
54
55
  record = DefaultNumber.new
55
- assert_equal BigDecimal.new("2.78"), record.decimal_number
56
+ assert_equal BigDecimal("2.78"), record.decimal_number
56
57
  assert_equal "2.78", record.decimal_number_before_type_cast
57
58
  end
58
59
  end
@@ -82,15 +83,47 @@ class DefaultStringsTest < ActiveRecord::TestCase
82
83
  end
83
84
  end
84
85
 
86
+ if supports_text_column_with_default?
87
+ class DefaultTextTest < ActiveRecord::TestCase
88
+ class DefaultText < ActiveRecord::Base; end
89
+
90
+ setup do
91
+ @connection = ActiveRecord::Base.connection
92
+ @connection.create_table :default_texts do |t|
93
+ t.text :text_col, default: "Smith"
94
+ t.text :text_col_with_quotes, default: "O'Connor"
95
+ end
96
+ DefaultText.reset_column_information
97
+ end
98
+
99
+ def test_default_texts
100
+ assert_equal "Smith", DefaultText.new.text_col
101
+ end
102
+
103
+ def test_default_texts_containing_single_quotes
104
+ assert_equal "O'Connor", DefaultText.new.text_col_with_quotes
105
+ end
106
+
107
+ teardown do
108
+ @connection.drop_table :default_texts
109
+ end
110
+ end
111
+ end
112
+
85
113
  if current_adapter?(:PostgreSQLAdapter)
86
114
  class PostgresqlDefaultExpressionTest < ActiveRecord::TestCase
87
115
  include SchemaDumpingHelper
88
116
 
89
117
  test "schema dump includes default expression" do
90
118
  output = dump_table_schema("defaults")
91
- assert_match %r/t\.date\s+"modified_date",\s+default: -> { "\('now'::text\)::date" }/, output
119
+ if ActiveRecord::Base.connection.database_version >= 100000
120
+ assert_match %r/t\.date\s+"modified_date",\s+default: -> { "CURRENT_DATE" }/, output
121
+ assert_match %r/t\.datetime\s+"modified_time",\s+default: -> { "CURRENT_TIMESTAMP" }/, output
122
+ else
123
+ assert_match %r/t\.date\s+"modified_date",\s+default: -> { "\('now'::text\)::date" }/, output
124
+ assert_match %r/t\.datetime\s+"modified_time",\s+default: -> { "now\(\)" }/, output
125
+ end
92
126
  assert_match %r/t\.date\s+"modified_date_function",\s+default: -> { "now\(\)" }/, output
93
- assert_match %r/t\.datetime\s+"modified_time",\s+default: -> { "now\(\)" }/, output
94
127
  assert_match %r/t\.datetime\s+"modified_time_function",\s+default: -> { "now\(\)" }/, output
95
128
  end
96
129
  end
@@ -100,10 +133,37 @@ if current_adapter?(:Mysql2Adapter)
100
133
  class MysqlDefaultExpressionTest < ActiveRecord::TestCase
101
134
  include SchemaDumpingHelper
102
135
 
103
- if ActiveRecord::Base.connection.version >= '5.6.0'
136
+ if supports_default_expression?
104
137
  test "schema dump includes default expression" do
138
+ output = dump_table_schema("defaults")
139
+ assert_match %r/t\.binary\s+"uuid",\s+limit: 36,\s+default: -> { "\(uuid\(\)\)" }/i, output
140
+ end
141
+ end
142
+
143
+ if supports_datetime_with_precision?
144
+ test "schema dump datetime includes default expression" do
105
145
  output = dump_table_schema("datetime_defaults")
106
- assert_match %r/t\.datetime\s+"modified_datetime",\s+default: -> { "CURRENT_TIMESTAMP" }/, output
146
+ assert_match %r/t\.datetime\s+"modified_datetime",\s+default: -> { "CURRENT_TIMESTAMP(?:\(\))?" }/i, output
147
+ end
148
+
149
+ test "schema dump datetime includes precise default expression" do
150
+ output = dump_table_schema("datetime_defaults")
151
+ assert_match %r/t\.datetime\s+"precise_datetime",.+default: -> { "CURRENT_TIMESTAMP\(6\)" }/i, output
152
+ end
153
+
154
+ test "schema dump timestamp includes default expression" do
155
+ output = dump_table_schema("timestamp_defaults")
156
+ assert_match %r/t\.timestamp\s+"modified_timestamp",\s+default: -> { "CURRENT_TIMESTAMP(?:\(\))?" }/i, output
157
+ end
158
+
159
+ test "schema dump timestamp includes precise default expression" do
160
+ output = dump_table_schema("timestamp_defaults")
161
+ assert_match %r/t\.timestamp\s+"precise_timestamp",.+default: -> { "CURRENT_TIMESTAMP\(6\)" }/i, output
162
+ end
163
+
164
+ test "schema dump timestamp without default expression" do
165
+ output = dump_table_schema("timestamp_defaults")
166
+ assert_match %r/t\.timestamp\s+"nullable_timestamp"$/, output
107
167
  end
108
168
  end
109
169
  end
@@ -121,99 +181,74 @@ if current_adapter?(:Mysql2Adapter)
121
181
 
122
182
  def using_strict(strict)
123
183
  connection = ActiveRecord::Base.remove_connection
124
- ActiveRecord::Base.establish_connection connection.merge(strict: strict)
184
+ conn_hash = connection.configuration_hash
185
+ ActiveRecord::Base.establish_connection conn_hash.merge(strict: strict)
125
186
  yield
126
187
  ensure
127
188
  ActiveRecord::Base.remove_connection
128
189
  ActiveRecord::Base.establish_connection connection
129
190
  end
130
191
 
131
- # MySQL cannot have defaults on text/blob columns. It reports the
132
- # default value as null.
133
- #
134
- # Despite this, in non-strict mode, MySQL will use an empty string
135
- # as the default value of the field, if no other value is
136
- # specified.
192
+ # Strict mode controls how MySQL handles invalid or missing values
193
+ # in data-change statements such as INSERT or UPDATE. A value can be
194
+ # invalid for several reasons. For example, it might have the wrong
195
+ # data type for the column, or it might be out of range. A value is
196
+ # missing when a new row to be inserted does not contain a value for
197
+ # a non-NULL column that has no explicit DEFAULT clause in its definition.
198
+ # (For a NULL column, NULL is inserted if the value is missing.)
137
199
  #
138
- # Therefore, in non-strict mode, we want column.default to report
139
- # an empty string as its default, to be consistent with that.
200
+ # If strict mode is not in effect, MySQL inserts adjusted values for
201
+ # invalid or missing values and produces warnings. In strict mode,
202
+ # you can produce this behavior by using INSERT IGNORE or UPDATE IGNORE.
140
203
  #
141
- # In strict mode, column.default should be nil.
142
- def test_mysql_text_not_null_defaults_non_strict
204
+ # https://dev.mysql.com/doc/refman/en/sql-mode.html#sql-mode-strict
205
+ def test_mysql_not_null_defaults_non_strict
143
206
  using_strict(false) do
144
- with_text_blob_not_null_table do |klass|
207
+ with_mysql_not_null_table do |klass|
145
208
  record = klass.new
146
- assert_equal '', record.non_null_blob
147
- assert_equal '', record.non_null_text
148
-
149
- assert_nil record.null_blob
150
- assert_nil record.null_text
209
+ assert_nil record.non_null_integer
210
+ assert_nil record.non_null_string
211
+ assert_nil record.non_null_text
212
+ assert_nil record.non_null_blob
151
213
 
152
214
  record.save!
153
215
  record.reload
154
216
 
155
- assert_equal '', record.non_null_text
156
- assert_equal '', record.non_null_blob
157
-
158
- assert_nil record.null_text
159
- assert_nil record.null_blob
217
+ assert_equal 0, record.non_null_integer
218
+ assert_equal "", record.non_null_string
219
+ assert_equal "", record.non_null_text
220
+ assert_equal "", record.non_null_blob
160
221
  end
161
222
  end
162
223
  end
163
224
 
164
- def test_mysql_text_not_null_defaults_strict
225
+ def test_mysql_not_null_defaults_strict
165
226
  using_strict(true) do
166
- with_text_blob_not_null_table do |klass|
227
+ with_mysql_not_null_table do |klass|
167
228
  record = klass.new
168
- assert_nil record.non_null_blob
229
+ assert_nil record.non_null_integer
230
+ assert_nil record.non_null_string
169
231
  assert_nil record.non_null_text
170
- assert_nil record.null_blob
171
- assert_nil record.null_text
232
+ assert_nil record.non_null_blob
172
233
 
173
- assert_raises(ActiveRecord::StatementInvalid) { klass.create }
234
+ assert_raises(ActiveRecord::NotNullViolation) { klass.create }
174
235
  end
175
236
  end
176
237
  end
177
238
 
178
- def with_text_blob_not_null_table
239
+ def with_mysql_not_null_table
179
240
  klass = Class.new(ActiveRecord::Base)
180
- klass.table_name = 'test_mysql_text_not_null_defaults'
241
+ klass.table_name = "test_mysql_not_null_defaults"
181
242
  klass.connection.create_table klass.table_name do |t|
182
- t.column :non_null_text, :text, :null => false
183
- t.column :non_null_blob, :blob, :null => false
184
- t.column :null_text, :text, :null => true
185
- t.column :null_blob, :blob, :null => true
243
+ t.integer :non_null_integer, null: false
244
+ t.string :non_null_string, null: false
245
+ t.text :non_null_text, null: false
246
+ t.blob :non_null_blob, null: false
186
247
  end
187
248
 
188
249
  yield klass
189
250
  ensure
190
251
  klass.connection.drop_table(klass.table_name) rescue nil
191
252
  end
192
-
193
- # MySQL uses an implicit default 0 rather than NULL unless in strict mode.
194
- # We use an implicit NULL so schema.rb is compatible with other databases.
195
- def test_mysql_integer_not_null_defaults
196
- klass = Class.new(ActiveRecord::Base)
197
- klass.table_name = 'test_integer_not_null_default_zero'
198
- klass.connection.create_table klass.table_name do |t|
199
- t.column :zero, :integer, :null => false, :default => 0
200
- t.column :omit, :integer, :null => false
201
- end
202
-
203
- assert_equal '0', klass.columns_hash['zero'].default
204
- assert !klass.columns_hash['zero'].null
205
- assert_equal nil, klass.columns_hash['omit'].default
206
- assert !klass.columns_hash['omit'].null
207
-
208
- assert_raise(ActiveRecord::StatementInvalid) { klass.create! }
209
-
210
- assert_nothing_raised do
211
- instance = klass.create!(:omit => 1)
212
- assert_equal 0, instance.zero
213
- assert_equal 1, instance.omit
214
- end
215
- ensure
216
- klass.connection.drop_table(klass.table_name) rescue nil
217
- end
218
253
  end
219
254
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/entry"
5
+ require "models/message"
6
+ require "models/comment"
7
+
8
+ class DelegatedTypeTest < ActiveRecord::TestCase
9
+ fixtures :comments
10
+
11
+ setup do
12
+ @entry_with_message = Entry.create! entryable: Message.new(subject: "Hello world!")
13
+ @entry_with_comment = Entry.create! entryable: comments(:greetings)
14
+ end
15
+
16
+ test "delegated class" do
17
+ assert_equal Message, @entry_with_message.entryable_class
18
+ assert_equal Comment, @entry_with_comment.entryable_class
19
+ end
20
+
21
+ test "delegated type name" do
22
+ assert_equal "message", @entry_with_message.entryable_name
23
+ assert @entry_with_message.entryable_name.message?
24
+
25
+ assert_equal "comment", @entry_with_comment.entryable_name
26
+ assert @entry_with_comment.entryable_name.comment?
27
+ end
28
+
29
+ test "delegated type predicates" do
30
+ assert @entry_with_message.message?
31
+ assert_not @entry_with_message.comment?
32
+
33
+ assert @entry_with_comment.comment?
34
+ assert_not @entry_with_comment.message?
35
+ end
36
+
37
+ test "scope" do
38
+ assert Entry.messages.first.message?
39
+ assert Entry.comments.first.comment?
40
+ end
41
+
42
+ test "accessor" do
43
+ assert @entry_with_message.message.is_a?(Message)
44
+ assert_nil @entry_with_message.comment
45
+
46
+ assert @entry_with_comment.comment.is_a?(Comment)
47
+ assert_nil @entry_with_comment.message
48
+ end
49
+
50
+ test "association id" do
51
+ assert_equal @entry_with_message.entryable_id, @entry_with_message.message_id
52
+ assert_nil @entry_with_message.comment_id
53
+
54
+ assert_equal @entry_with_comment.entryable_id, @entry_with_comment.comment_id
55
+ assert_nil @entry_with_comment.message_id
56
+ end
57
+ end