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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  class PostgresqlInfinityTest < ActiveRecord::PostgreSQLTestCase
@@ -11,11 +13,12 @@ class PostgresqlInfinityTest < ActiveRecord::PostgreSQLTestCase
11
13
  @connection.create_table(:postgresql_infinities) do |t|
12
14
  t.float :float
13
15
  t.datetime :datetime
16
+ t.date :date
14
17
  end
15
18
  end
16
19
 
17
20
  teardown do
18
- @connection.drop_table 'postgresql_infinities', if_exists: true
21
+ @connection.drop_table "postgresql_infinities", if_exists: true
19
22
  end
20
23
 
21
24
  test "type casting infinity on a float column" do
@@ -25,12 +28,12 @@ class PostgresqlInfinityTest < ActiveRecord::PostgreSQLTestCase
25
28
  end
26
29
 
27
30
  test "type casting string on a float column" do
28
- record = PostgresqlInfinity.new(float: 'Infinity')
31
+ record = PostgresqlInfinity.new(float: "Infinity")
29
32
  assert_equal Float::INFINITY, record.float
30
- record = PostgresqlInfinity.new(float: '-Infinity')
33
+ record = PostgresqlInfinity.new(float: "-Infinity")
31
34
  assert_equal(-Float::INFINITY, record.float)
32
- record = PostgresqlInfinity.new(float: 'NaN')
33
- assert_send [record.float, :nan?]
35
+ record = PostgresqlInfinity.new(float: "NaN")
36
+ assert record.float.nan?, "Expected #{record.float} to be NaN"
34
37
  end
35
38
 
36
39
  test "update_all with infinity on a float column" do
@@ -41,11 +44,25 @@ class PostgresqlInfinityTest < ActiveRecord::PostgreSQLTestCase
41
44
  end
42
45
 
43
46
  test "type casting infinity on a datetime column" do
47
+ record = PostgresqlInfinity.create!(datetime: "infinity")
48
+ record.reload
49
+ assert_equal Float::INFINITY, record.datetime
50
+
44
51
  record = PostgresqlInfinity.create!(datetime: Float::INFINITY)
45
52
  record.reload
46
53
  assert_equal Float::INFINITY, record.datetime
47
54
  end
48
55
 
56
+ test "type casting infinity on a date column" do
57
+ record = PostgresqlInfinity.create!(date: "infinity")
58
+ record.reload
59
+ assert_equal Float::INFINITY, record.date
60
+
61
+ record = PostgresqlInfinity.create!(date: Float::INFINITY)
62
+ record.reload
63
+ assert_equal Float::INFINITY, record.date
64
+ end
65
+
49
66
  test "update_all with infinity on a datetime column" do
50
67
  record = PostgresqlInfinity.create!
51
68
  PostgresqlInfinity.update_all(datetime: Float::INFINITY)
@@ -54,16 +71,38 @@ class PostgresqlInfinityTest < ActiveRecord::PostgreSQLTestCase
54
71
  end
55
72
 
56
73
  test "assigning 'infinity' on a datetime column with TZ aware attributes" do
57
- begin
58
- in_time_zone "Pacific Time (US & Canada)" do
59
- record = PostgresqlInfinity.create!(datetime: "infinity")
60
- assert_equal Float::INFINITY, record.datetime
61
- assert_equal record.datetime, record.reload.datetime
62
- end
63
- ensure
64
- # setting time_zone_aware_attributes causes the types to change.
65
- # There is no way to do this automatically since it can be set on a superclass
66
- PostgresqlInfinity.reset_column_information
74
+ in_time_zone "Pacific Time (US & Canada)" do
75
+ record = PostgresqlInfinity.create!(datetime: "infinity")
76
+ assert_equal Float::INFINITY, record.datetime
77
+ assert_equal record.datetime, record.reload.datetime
67
78
  end
79
+ ensure
80
+ # setting time_zone_aware_attributes causes the types to change.
81
+ # There is no way to do this automatically since it can be set on a superclass
82
+ PostgresqlInfinity.reset_column_information
83
+ end
84
+
85
+ test "where clause with infinite range on a datetime column" do
86
+ record = PostgresqlInfinity.create!(datetime: Time.current)
87
+
88
+ string = PostgresqlInfinity.where(datetime: "-infinity".."infinity")
89
+ assert_equal record, string.take
90
+
91
+ infinity = PostgresqlInfinity.where(datetime: -::Float::INFINITY..::Float::INFINITY)
92
+ assert_equal record, infinity.take
93
+
94
+ assert_equal infinity.to_sql, string.to_sql
95
+ end
96
+
97
+ test "where clause with infinite range on a date column" do
98
+ record = PostgresqlInfinity.create!(date: Date.current)
99
+
100
+ string = PostgresqlInfinity.where(date: "-infinity".."infinity")
101
+ assert_equal record, string.take
102
+
103
+ infinity = PostgresqlInfinity.where(date: -::Float::INFINITY..::Float::INFINITY)
104
+ assert_equal record, infinity.take
105
+
106
+ assert_equal infinity.to_sql, string.to_sql
68
107
  end
69
108
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
  require "active_support/core_ext/numeric/bytes"
3
5
 
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ class PostgresqlIntervalTest < ActiveRecord::PostgreSQLTestCase
7
+ include SchemaDumpingHelper
8
+
9
+ class IntervalDataType < ActiveRecord::Base
10
+ attribute :maximum_term, :interval
11
+ attribute :minimum_term, :interval, precision: 3
12
+ attribute :default_term, :interval
13
+ attribute :all_terms, :interval, array: true
14
+ attribute :legacy_term, :string
15
+ end
16
+
17
+ class DeprecatedIntervalDataType < ActiveRecord::Base; end
18
+
19
+ def setup
20
+ @connection = ActiveRecord::Base.connection
21
+ @connection.transaction do
22
+ @connection.create_table("interval_data_types") do |t|
23
+ t.interval "maximum_term"
24
+ t.interval "minimum_term", precision: 3
25
+ t.interval "default_term", default: "P3Y"
26
+ t.interval "all_terms", array: true
27
+ t.interval "legacy_term"
28
+ end
29
+ @connection.create_table("deprecated_interval_data_types") do |t|
30
+ t.interval "duration"
31
+ end
32
+ end
33
+ @column_max = IntervalDataType.columns_hash["maximum_term"]
34
+ @column_min = IntervalDataType.columns_hash["minimum_term"]
35
+ assert(@column_max.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLColumn))
36
+ assert(@column_min.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLColumn))
37
+ assert_nil @column_max.precision
38
+ assert_equal 3, @column_min.precision
39
+ end
40
+
41
+ teardown do
42
+ @connection.execute "DROP TABLE IF EXISTS interval_data_types"
43
+ @connection.execute "DROP TABLE IF EXISTS deprecated_interval_data_types"
44
+ end
45
+
46
+ def test_column
47
+ assert_equal :interval, @column_max.type
48
+ assert_equal :interval, @column_min.type
49
+ assert_equal "interval", @column_max.sql_type
50
+ assert_equal "interval(3)", @column_min.sql_type
51
+ end
52
+
53
+ def test_interval_type
54
+ IntervalDataType.create!(
55
+ maximum_term: 6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.seconds,
56
+ minimum_term: 1.year + 2.month + 3.days + 4.hours + 5.minutes + (6.234567).seconds,
57
+ all_terms: [1.month, 1.year, 1.hour],
58
+ legacy_term: "33 years",
59
+ )
60
+ i = IntervalDataType.last!
61
+ assert_equal "P6Y5M4DT3H2M1S", i.maximum_term.iso8601
62
+ assert_equal "P1Y2M3DT4H5M6.235S", i.minimum_term.iso8601
63
+ assert_equal "P3Y", i.default_term.iso8601
64
+ assert_equal %w[ P1M P1Y PT1H ], i.all_terms.map(&:iso8601)
65
+ assert_equal "P33Y", i.legacy_term
66
+ end
67
+
68
+ def test_interval_type_cast_from_invalid_string
69
+ i = IntervalDataType.create!(maximum_term: "1 year 2 minutes")
70
+ i.reload
71
+ assert_nil i.maximum_term
72
+ end
73
+
74
+ def test_interval_type_cast_from_numeric
75
+ i = IntervalDataType.create!(minimum_term: 36000)
76
+ i.reload
77
+ assert_equal "PT10H", i.minimum_term.iso8601
78
+ end
79
+
80
+ def test_interval_type_cast_string_and_numeric_from_user
81
+ i = IntervalDataType.new(maximum_term: "P1YT2M", minimum_term: "PT10H", legacy_term: "P1DT1H")
82
+ assert i.maximum_term.is_a?(ActiveSupport::Duration)
83
+ assert i.legacy_term.is_a?(String)
84
+ assert_equal "P1YT2M", i.maximum_term.iso8601
85
+ assert_equal "PT10H", i.minimum_term.iso8601
86
+ assert_equal "P1DT1H", i.legacy_term
87
+ end
88
+
89
+ def test_deprecated_legacy_type
90
+ assert_deprecated do
91
+ DeprecatedIntervalDataType.new
92
+ end
93
+ end
94
+
95
+ def test_schema_dump_with_default_value
96
+ output = dump_table_schema "interval_data_types"
97
+ assert_match %r{t\.interval "default_term", default: "P3Y"}, output
98
+ end
99
+ end
@@ -1,223 +1,38 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
4
+ require "cases/json_shared_test_cases"
3
5
 
4
6
  module PostgresqlJSONSharedTestCases
5
- include SchemaDumpingHelper
6
-
7
- class JsonDataType < ActiveRecord::Base
8
- self.table_name = 'json_data_type'
9
-
10
- store_accessor :settings, :resolution
11
- end
7
+ include JSONSharedTestCases
12
8
 
13
9
  def setup
14
- @connection = ActiveRecord::Base.connection
15
- begin
16
- @connection.create_table('json_data_type') do |t|
17
- t.public_send column_type, 'payload', default: {} # t.json 'payload', default: {}
18
- t.public_send column_type, 'settings' # t.json 'settings'
19
- t.public_send column_type, 'objects', array: true # t.json 'objects', array: true
20
- end
21
- rescue ActiveRecord::StatementInvalid
22
- skip "do not test on PostgreSQL without #{column_type} type."
10
+ super
11
+ @connection.create_table("json_data_type") do |t|
12
+ t.public_send column_type, "payload", default: {} # t.json 'payload', default: {}
13
+ t.public_send column_type, "settings" # t.json 'settings'
14
+ t.public_send column_type, "objects", array: true # t.json 'objects', array: true
23
15
  end
24
- end
25
-
26
- def teardown
27
- @connection.drop_table :json_data_type, if_exists: true
28
- JsonDataType.reset_column_information
29
- end
30
-
31
- def test_column
32
- column = JsonDataType.columns_hash["payload"]
33
- assert_equal column_type, column.type
34
- assert_equal column_type.to_s, column.sql_type
35
- assert_not column.array?
36
-
37
- type = JsonDataType.type_for_attribute("payload")
38
- assert_not type.binary?
16
+ rescue ActiveRecord::StatementInvalid
17
+ skip "do not test on PostgreSQL without #{column_type} type."
39
18
  end
40
19
 
41
20
  def test_default
42
- @connection.add_column 'json_data_type', 'permissions', column_type, default: {"users": "read", "posts": ["read", "write"]}
43
- JsonDataType.reset_column_information
44
-
45
- assert_equal({"users"=>"read", "posts"=>["read", "write"]}, JsonDataType.column_defaults['permissions'])
46
- assert_equal({"users"=>"read", "posts"=>["read", "write"]}, JsonDataType.new.permissions)
47
- ensure
48
- JsonDataType.reset_column_information
49
- end
50
-
51
- def test_change_table_supports_json
52
- @connection.transaction do
53
- @connection.change_table('json_data_type') do |t|
54
- t.public_send column_type, 'users', default: '{}' # t.json 'users', default: '{}'
55
- end
56
- JsonDataType.reset_column_information
57
- column = JsonDataType.columns_hash['users']
58
- assert_equal column_type, column.type
59
-
60
- raise ActiveRecord::Rollback # reset the schema change
61
- end
62
- ensure
63
- JsonDataType.reset_column_information
64
- end
65
-
66
- def test_schema_dumping
67
- output = dump_table_schema("json_data_type")
68
- assert_match(/t\.#{column_type.to_s}\s+"payload",\s+default: {}/, output)
69
- end
21
+ @connection.add_column "json_data_type", "permissions", column_type, default: { "users": "read", "posts": ["read", "write"] }
22
+ klass.reset_column_information
70
23
 
71
- def test_cast_value_on_write
72
- x = JsonDataType.new payload: {"string" => "foo", :symbol => :bar}
73
- assert_equal({"string" => "foo", :symbol => :bar}, x.payload_before_type_cast)
74
- assert_equal({"string" => "foo", "symbol" => "bar"}, x.payload)
75
- x.save
76
- assert_equal({"string" => "foo", "symbol" => "bar"}, x.reload.payload)
24
+ assert_equal({ "users" => "read", "posts" => ["read", "write"] }, klass.column_defaults["permissions"])
25
+ assert_equal({ "users" => "read", "posts" => ["read", "write"] }, klass.new.permissions)
77
26
  end
78
27
 
79
28
  def test_deserialize_with_array
80
- x = JsonDataType.new(objects: ["foo" => "bar"])
29
+ x = klass.new(objects: ["foo" => "bar"])
81
30
  assert_equal ["foo" => "bar"], x.objects
82
31
  x.save!
83
32
  assert_equal ["foo" => "bar"], x.objects
84
33
  x.reload
85
34
  assert_equal ["foo" => "bar"], x.objects
86
35
  end
87
-
88
- def test_type_cast_json
89
- type = JsonDataType.type_for_attribute("payload")
90
-
91
- data = "{\"a_key\":\"a_value\"}"
92
- hash = type.deserialize(data)
93
- assert_equal({'a_key' => 'a_value'}, hash)
94
- assert_equal({'a_key' => 'a_value'}, type.deserialize(data))
95
-
96
- assert_equal({}, type.deserialize("{}"))
97
- assert_equal({'key'=>nil}, type.deserialize('{"key": null}'))
98
- assert_equal({'c'=>'}','"a"'=>'b "a b'}, type.deserialize(%q({"c":"}", "\"a\"":"b \"a b"})))
99
- end
100
-
101
- def test_rewrite
102
- @connection.execute "insert into json_data_type (payload) VALUES ('{\"k\":\"v\"}')"
103
- x = JsonDataType.first
104
- x.payload = { '"a\'' => 'b' }
105
- assert x.save!
106
- end
107
-
108
- def test_select
109
- @connection.execute "insert into json_data_type (payload) VALUES ('{\"k\":\"v\"}')"
110
- x = JsonDataType.first
111
- assert_equal({'k' => 'v'}, x.payload)
112
- end
113
-
114
- def test_select_multikey
115
- @connection.execute %q|insert into json_data_type (payload) VALUES ('{"k1":"v1", "k2":"v2", "k3":[1,2,3]}')|
116
- x = JsonDataType.first
117
- assert_equal({'k1' => 'v1', 'k2' => 'v2', 'k3' => [1,2,3]}, x.payload)
118
- end
119
-
120
- def test_null_json
121
- @connection.execute %q|insert into json_data_type (payload) VALUES(null)|
122
- x = JsonDataType.first
123
- assert_equal(nil, x.payload)
124
- end
125
-
126
- def test_select_nil_json_after_create
127
- json = JsonDataType.create(payload: nil)
128
- x = JsonDataType.where(payload:nil).first
129
- assert_equal(json, x)
130
- end
131
-
132
- def test_select_nil_json_after_update
133
- json = JsonDataType.create(payload: "foo")
134
- x = JsonDataType.where(payload:nil).first
135
- assert_equal(nil, x)
136
-
137
- json.update_attributes payload: nil
138
- x = JsonDataType.where(payload:nil).first
139
- assert_equal(json.reload, x)
140
- end
141
-
142
- def test_select_array_json_value
143
- @connection.execute %q|insert into json_data_type (payload) VALUES ('["v0",{"k1":"v1"}]')|
144
- x = JsonDataType.first
145
- assert_equal(['v0', {'k1' => 'v1'}], x.payload)
146
- end
147
-
148
- def test_rewrite_array_json_value
149
- @connection.execute %q|insert into json_data_type (payload) VALUES ('["v0",{"k1":"v1"}]')|
150
- x = JsonDataType.first
151
- x.payload = ['v1', {'k2' => 'v2'}, 'v3']
152
- assert x.save!
153
- end
154
-
155
- def test_with_store_accessors
156
- x = JsonDataType.new(resolution: "320×480")
157
- assert_equal "320×480", x.resolution
158
-
159
- x.save!
160
- x = JsonDataType.first
161
- assert_equal "320×480", x.resolution
162
-
163
- x.resolution = "640×1136"
164
- x.save!
165
-
166
- x = JsonDataType.first
167
- assert_equal "640×1136", x.resolution
168
- end
169
-
170
- def test_duplication_with_store_accessors
171
- x = JsonDataType.new(resolution: "320×480")
172
- assert_equal "320×480", x.resolution
173
-
174
- y = x.dup
175
- assert_equal "320×480", y.resolution
176
- end
177
-
178
- def test_yaml_round_trip_with_store_accessors
179
- x = JsonDataType.new(resolution: "320×480")
180
- assert_equal "320×480", x.resolution
181
-
182
- y = YAML.load(YAML.dump(x))
183
- assert_equal "320×480", y.resolution
184
- end
185
-
186
- def test_changes_in_place
187
- json = JsonDataType.new
188
- assert_not json.changed?
189
-
190
- json.payload = { 'one' => 'two' }
191
- assert json.changed?
192
- assert json.payload_changed?
193
-
194
- json.save!
195
- assert_not json.changed?
196
-
197
- json.payload['three'] = 'four'
198
- assert json.payload_changed?
199
-
200
- json.save!
201
- json.reload
202
-
203
- assert_equal({ 'one' => 'two', 'three' => 'four' }, json.payload)
204
- assert_not json.changed?
205
- end
206
-
207
- def test_assigning_string_literal
208
- json = JsonDataType.create(payload: "foo")
209
- assert_equal "foo", json.payload
210
- end
211
-
212
- def test_assigning_number
213
- json = JsonDataType.create(payload: 1.234)
214
- assert_equal 1.234, json.payload
215
- end
216
-
217
- def test_assigning_boolean
218
- json = JsonDataType.create(payload: true)
219
- assert_equal true, json.payload
220
- end
221
36
  end
222
37
 
223
38
  class PostgresqlJSONTest < ActiveRecord::PostgreSQLTestCase
@@ -1,49 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
4
+ require "support/schema_dumping_helper"
3
5
 
4
6
  class PostgresqlLtreeTest < ActiveRecord::PostgreSQLTestCase
5
7
  include SchemaDumpingHelper
6
8
  class Ltree < ActiveRecord::Base
7
- self.table_name = 'ltrees'
9
+ self.table_name = "ltrees"
8
10
  end
9
11
 
10
12
  def setup
11
13
  @connection = ActiveRecord::Base.connection
12
14
 
13
- enable_extension!('ltree', @connection)
15
+ enable_extension!("ltree", @connection)
14
16
 
15
- @connection.transaction do
16
- @connection.create_table('ltrees') do |t|
17
- t.ltree 'path'
18
- end
17
+ @connection.create_table("ltrees") do |t|
18
+ t.ltree "path"
19
19
  end
20
- rescue ActiveRecord::StatementInvalid
21
- skip "do not test on PG without ltree"
22
20
  end
23
21
 
24
22
  teardown do
25
- @connection.drop_table 'ltrees', if_exists: true
23
+ @connection.drop_table "ltrees", if_exists: true
26
24
  end
27
25
 
28
26
  def test_column
29
- column = Ltree.columns_hash['path']
27
+ column = Ltree.columns_hash["path"]
30
28
  assert_equal :ltree, column.type
31
29
  assert_equal "ltree", column.sql_type
32
- assert_not column.array?
30
+ assert_not_predicate column, :array?
33
31
 
34
- type = Ltree.type_for_attribute('path')
35
- assert_not type.binary?
32
+ type = Ltree.type_for_attribute("path")
33
+ assert_not_predicate type, :binary?
36
34
  end
37
35
 
38
36
  def test_write
39
- ltree = Ltree.new(path: '1.2.3.4')
37
+ ltree = Ltree.new(path: "1.2.3.4")
40
38
  assert ltree.save!
41
39
  end
42
40
 
43
41
  def test_select
44
42
  @connection.execute "insert into ltrees (path) VALUES ('1.2.3')"
45
43
  ltree = Ltree.first
46
- assert_equal '1.2.3', ltree.path
44
+ assert_equal "1.2.3", ltree.path
47
45
  end
48
46
 
49
47
  def test_schema_dump_with_shorthand
@@ -1,22 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
4
+ require "support/schema_dumping_helper"
3
5
 
4
6
  class PostgresqlMoneyTest < ActiveRecord::PostgreSQLTestCase
5
7
  include SchemaDumpingHelper
6
8
 
7
- class PostgresqlMoney < ActiveRecord::Base; end
9
+ class PostgresqlMoney < ActiveRecord::Base
10
+ validates :depth, numericality: true
11
+ end
8
12
 
9
13
  setup do
10
14
  @connection = ActiveRecord::Base.connection
11
15
  @connection.execute("set lc_monetary = 'C'")
12
- @connection.create_table('postgresql_moneys', force: true) do |t|
16
+ @connection.create_table("postgresql_moneys", force: true) do |t|
13
17
  t.money "wealth"
14
18
  t.money "depth", default: "150.55"
15
19
  end
16
20
  end
17
21
 
18
22
  teardown do
19
- @connection.drop_table 'postgresql_moneys', if_exists: true
23
+ @connection.drop_table "postgresql_moneys", if_exists: true
20
24
  end
21
25
 
22
26
  def test_column
@@ -24,15 +28,16 @@ class PostgresqlMoneyTest < ActiveRecord::PostgreSQLTestCase
24
28
  assert_equal :money, column.type
25
29
  assert_equal "money", column.sql_type
26
30
  assert_equal 2, column.scale
27
- assert_not column.array?
31
+ assert_not_predicate column, :array?
28
32
 
29
33
  type = PostgresqlMoney.type_for_attribute("wealth")
30
- assert_not type.binary?
34
+ assert_not_predicate type, :binary?
31
35
  end
32
36
 
33
37
  def test_default
34
- assert_equal BigDecimal.new("150.55"), PostgresqlMoney.column_defaults['depth']
35
- assert_equal BigDecimal.new("150.55"), PostgresqlMoney.new.depth
38
+ assert_equal BigDecimal("150.55"), PostgresqlMoney.column_defaults["depth"]
39
+ assert_equal BigDecimal("150.55"), PostgresqlMoney.new.depth
40
+ assert_equal "150.55", PostgresqlMoney.new.depth_before_type_cast
36
41
  end
37
42
 
38
43
  def test_money_values
@@ -43,14 +48,40 @@ class PostgresqlMoneyTest < ActiveRecord::PostgreSQLTestCase
43
48
  second_money = PostgresqlMoney.find(2)
44
49
  assert_equal 567.89, first_money.wealth
45
50
  assert_equal(-567.89, second_money.wealth)
51
+ assert_equal 567.89, @connection.query_value("SELECT wealth FROM postgresql_moneys WHERE id = 1")
52
+ assert_equal(-567.89, @connection.query_value("SELECT wealth FROM postgresql_moneys WHERE id = 2"))
46
53
  end
47
54
 
48
55
  def test_money_type_cast
49
- type = PostgresqlMoney.type_for_attribute('wealth')
50
- assert_equal(12345678.12, type.cast("$12,345,678.12"))
51
- assert_equal(12345678.12, type.cast("$12.345.678,12"))
52
- assert_equal(-1.15, type.cast("-$1.15"))
53
- assert_equal(-2.25, type.cast("($2.25)"))
56
+ type = PostgresqlMoney.type_for_attribute("wealth")
57
+ assert_equal(12345678.12, type.cast(+"$12,345,678.12"))
58
+ assert_equal(12345678.12, type.cast(+"$12.345.678,12"))
59
+ assert_equal(12345678.12, type.cast(+"12,345,678.12"))
60
+ assert_equal(12345678.12, type.cast(+"12.345.678,12"))
61
+ assert_equal(-1.15, type.cast(+"-$1.15"))
62
+ assert_equal(-2.25, type.cast(+"($2.25)"))
63
+ assert_equal(-1.15, type.cast(+"-1.15"))
64
+ assert_equal(-2.25, type.cast(+"(2.25)"))
65
+ end
66
+
67
+ def test_money_regex_backtracking
68
+ type = PostgresqlMoney.type_for_attribute("wealth")
69
+ Timeout.timeout(0.1) do
70
+ assert_equal(0.0, type.cast("$" + "," * 100000 + ".11!"))
71
+ assert_equal(0.0, type.cast("$" + "." * 100000 + ",11!"))
72
+ end
73
+ end
74
+
75
+ def test_sum_with_type_cast
76
+ @connection.execute("INSERT INTO postgresql_moneys (id, wealth) VALUES (1, '123.45'::money)")
77
+
78
+ assert_equal BigDecimal("123.45"), PostgresqlMoney.sum("id * wealth")
79
+ end
80
+
81
+ def test_pluck_with_type_cast
82
+ @connection.execute("INSERT INTO postgresql_moneys (id, wealth) VALUES (1, '123.45'::money)")
83
+
84
+ assert_equal [BigDecimal("123.45")], PostgresqlMoney.pluck(Arel.sql("id * wealth"))
54
85
  end
55
86
 
56
87
  def test_schema_dumping
@@ -60,10 +91,10 @@ class PostgresqlMoneyTest < ActiveRecord::PostgreSQLTestCase
60
91
  end
61
92
 
62
93
  def test_create_and_update_money
63
- money = PostgresqlMoney.create(wealth: "987.65")
94
+ money = PostgresqlMoney.create(wealth: +"987.65")
64
95
  assert_equal 987.65, money.wealth
65
96
 
66
- new_value = BigDecimal.new('123.45')
97
+ new_value = BigDecimal("123.45")
67
98
  money.wealth = new_value
68
99
  money.save!
69
100
  money.reload
@@ -80,7 +111,7 @@ class PostgresqlMoneyTest < ActiveRecord::PostgreSQLTestCase
80
111
 
81
112
  def test_update_all_with_money_big_decimal
82
113
  money = PostgresqlMoney.create!
83
- PostgresqlMoney.update_all(wealth: '123.45'.to_d)
114
+ PostgresqlMoney.update_all(wealth: "123.45".to_d)
84
115
  money.reload
85
116
 
86
117
  assert_equal 123.45, money.wealth