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,356 +1,365 @@
1
- require "cases/helper"
2
- require 'support/schema_dumping_helper'
3
-
4
- if ActiveRecord::Base.connection.supports_extensions?
5
- class PostgresqlHstoreTest < ActiveRecord::PostgreSQLTestCase
6
- include SchemaDumpingHelper
7
- class Hstore < ActiveRecord::Base
8
- self.table_name = 'hstores'
1
+ # frozen_string_literal: true
9
2
 
10
- store_accessor :settings, :language, :timezone
11
- end
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+ require "support/stubs/strong_parameters"
12
6
 
13
- class FakeParameters
14
- def to_unsafe_h
15
- { "hi" => "hi" }
16
- end
17
- end
7
+ class PostgresqlHstoreTest < ActiveRecord::PostgreSQLTestCase
8
+ include SchemaDumpingHelper
9
+ class Hstore < ActiveRecord::Base
10
+ self.table_name = "hstores"
18
11
 
19
- def setup
20
- @connection = ActiveRecord::Base.connection
12
+ store_accessor :settings, :language, :timezone
13
+ end
21
14
 
22
- unless @connection.extension_enabled?('hstore')
23
- @connection.enable_extension 'hstore'
24
- @connection.commit_db_transaction
25
- end
15
+ def setup
16
+ @connection = ActiveRecord::Base.connection
26
17
 
27
- @connection.reconnect!
18
+ enable_extension!("hstore", @connection)
28
19
 
29
- @connection.transaction do
30
- @connection.create_table('hstores') do |t|
31
- t.hstore 'tags', :default => ''
32
- t.hstore 'payload', array: true
33
- t.hstore 'settings'
34
- end
20
+ @connection.transaction do
21
+ @connection.create_table("hstores") do |t|
22
+ t.hstore "tags", default: ""
23
+ t.hstore "payload", array: true
24
+ t.hstore "settings"
35
25
  end
36
- Hstore.reset_column_information
37
- @column = Hstore.columns_hash['tags']
38
- @type = Hstore.type_for_attribute("tags")
39
- end
40
-
41
- teardown do
42
- @connection.drop_table 'hstores', if_exists: true
43
26
  end
27
+ Hstore.reset_column_information
28
+ @column = Hstore.columns_hash["tags"]
29
+ @type = Hstore.type_for_attribute("tags")
30
+ end
44
31
 
45
- def test_hstore_included_in_extensions
46
- assert @connection.respond_to?(:extensions), "connection should have a list of extensions"
47
- assert @connection.extensions.include?('hstore'), "extension list should include hstore"
48
- end
32
+ teardown do
33
+ @connection.drop_table "hstores", if_exists: true
34
+ disable_extension!("hstore", @connection)
35
+ end
49
36
 
50
- def test_disable_enable_hstore
51
- assert @connection.extension_enabled?('hstore')
52
- @connection.disable_extension 'hstore'
53
- assert_not @connection.extension_enabled?('hstore')
54
- @connection.enable_extension 'hstore'
55
- assert @connection.extension_enabled?('hstore')
56
- ensure
57
- # Restore column(s) dropped by `drop extension hstore cascade;`
58
- load_schema
59
- end
37
+ def test_hstore_included_in_extensions
38
+ assert_respond_to @connection, :extensions
39
+ assert_includes @connection.extensions, "hstore", "extension list should include hstore"
40
+ end
60
41
 
61
- def test_column
62
- assert_equal :hstore, @column.type
63
- assert_equal "hstore", @column.sql_type
64
- assert_not @column.array?
42
+ def test_disable_enable_hstore
43
+ assert @connection.extension_enabled?("hstore")
44
+ @connection.disable_extension "hstore"
45
+ assert_not @connection.extension_enabled?("hstore")
46
+ @connection.enable_extension "hstore"
47
+ assert @connection.extension_enabled?("hstore")
48
+ ensure
49
+ # Restore column(s) dropped by `drop extension hstore cascade;`
50
+ load_schema
51
+ end
65
52
 
66
- assert_not @type.binary?
67
- end
53
+ def test_column
54
+ assert_equal :hstore, @column.type
55
+ assert_equal "hstore", @column.sql_type
56
+ assert_not_predicate @column, :array?
68
57
 
69
- def test_default
70
- @connection.add_column 'hstores', 'permissions', :hstore, default: '"users"=>"read", "articles"=>"write"'
71
- Hstore.reset_column_information
58
+ assert_not_predicate @type, :binary?
59
+ end
72
60
 
73
- assert_equal({"users"=>"read", "articles"=>"write"}, Hstore.column_defaults['permissions'])
74
- assert_equal({"users"=>"read", "articles"=>"write"}, Hstore.new.permissions)
75
- ensure
76
- Hstore.reset_column_information
77
- end
61
+ def test_default
62
+ @connection.add_column "hstores", "permissions", :hstore, default: '"users"=>"read", "articles"=>"write"'
63
+ Hstore.reset_column_information
78
64
 
79
- def test_change_table_supports_hstore
80
- @connection.transaction do
81
- @connection.change_table('hstores') do |t|
82
- t.hstore 'users', default: ''
83
- end
84
- Hstore.reset_column_information
85
- column = Hstore.columns_hash['users']
86
- assert_equal :hstore, column.type
65
+ assert_equal({ "users" => "read", "articles" => "write" }, Hstore.column_defaults["permissions"])
66
+ assert_equal({ "users" => "read", "articles" => "write" }, Hstore.new.permissions)
67
+ ensure
68
+ Hstore.reset_column_information
69
+ end
87
70
 
88
- raise ActiveRecord::Rollback # reset the schema change
71
+ def test_change_table_supports_hstore
72
+ @connection.transaction do
73
+ @connection.change_table("hstores") do |t|
74
+ t.hstore "users", default: ""
89
75
  end
90
- ensure
91
76
  Hstore.reset_column_information
77
+ column = Hstore.columns_hash["users"]
78
+ assert_equal :hstore, column.type
79
+
80
+ raise ActiveRecord::Rollback # reset the schema change
92
81
  end
82
+ ensure
83
+ Hstore.reset_column_information
84
+ end
93
85
 
94
- def test_hstore_migration
95
- hstore_migration = Class.new(ActiveRecord::Migration::Current) do
96
- def change
97
- change_table("hstores") do |t|
98
- t.hstore :keys
99
- end
86
+ def test_hstore_migration
87
+ hstore_migration = Class.new(ActiveRecord::Migration::Current) do
88
+ def change
89
+ change_table("hstores") do |t|
90
+ t.hstore :keys
100
91
  end
101
92
  end
102
-
103
- hstore_migration.new.suppress_messages do
104
- hstore_migration.migrate(:up)
105
- assert_includes @connection.columns(:hstores).map(&:name), "keys"
106
- hstore_migration.migrate(:down)
107
- assert_not_includes @connection.columns(:hstores).map(&:name), "keys"
108
- end
109
93
  end
110
94
 
111
- def test_cast_value_on_write
112
- x = Hstore.new tags: {"bool" => true, "number" => 5}
113
- assert_equal({"bool" => true, "number" => 5}, x.tags_before_type_cast)
114
- assert_equal({"bool" => "true", "number" => "5"}, x.tags)
115
- x.save
116
- assert_equal({"bool" => "true", "number" => "5"}, x.reload.tags)
95
+ hstore_migration.new.suppress_messages do
96
+ hstore_migration.migrate(:up)
97
+ assert_includes @connection.columns(:hstores).map(&:name), "keys"
98
+ hstore_migration.migrate(:down)
99
+ assert_not_includes @connection.columns(:hstores).map(&:name), "keys"
117
100
  end
101
+ end
118
102
 
119
- def test_type_cast_hstore
120
- assert_equal({'1' => '2'}, @type.deserialize("\"1\"=>\"2\""))
121
- assert_equal({}, @type.deserialize(""))
122
- assert_equal({'key'=>nil}, @type.deserialize('key => NULL'))
123
- assert_equal({'c'=>'}','"a"'=>'b "a b'}, @type.deserialize(%q(c=>"}", "\"a\""=>"b \"a b")))
124
- end
103
+ def test_cast_value_on_write
104
+ x = Hstore.new tags: { "bool" => true, "number" => 5 }
105
+ assert_equal({ "bool" => true, "number" => 5 }, x.tags_before_type_cast)
106
+ assert_equal({ "bool" => "true", "number" => "5" }, x.tags)
107
+ x.save
108
+ assert_equal({ "bool" => "true", "number" => "5" }, x.reload.tags)
109
+ end
125
110
 
126
- def test_with_store_accessors
127
- x = Hstore.new(language: "fr", timezone: "GMT")
128
- assert_equal "fr", x.language
129
- assert_equal "GMT", x.timezone
111
+ def test_type_cast_hstore
112
+ assert_equal({ "1" => "2" }, @type.deserialize("\"1\"=>\"2\""))
113
+ assert_equal({}, @type.deserialize(""))
114
+ assert_equal({ "key" => nil }, @type.deserialize("key => NULL"))
115
+ assert_equal({ "c" => "}", '"a"' => 'b "a b' }, @type.deserialize(%q(c=>"}", "\"a\""=>"b \"a b")))
116
+ end
130
117
 
131
- x.save!
132
- x = Hstore.first
133
- assert_equal "fr", x.language
134
- assert_equal "GMT", x.timezone
118
+ def test_with_store_accessors
119
+ x = Hstore.new(language: "fr", timezone: "GMT")
120
+ assert_equal "fr", x.language
121
+ assert_equal "GMT", x.timezone
135
122
 
136
- x.language = "de"
137
- x.save!
123
+ x.save!
124
+ x = Hstore.first
125
+ assert_equal "fr", x.language
126
+ assert_equal "GMT", x.timezone
138
127
 
139
- x = Hstore.first
140
- assert_equal "de", x.language
141
- assert_equal "GMT", x.timezone
142
- end
128
+ x.language = "de"
129
+ x.save!
143
130
 
144
- def test_duplication_with_store_accessors
145
- x = Hstore.new(language: "fr", timezone: "GMT")
146
- assert_equal "fr", x.language
147
- assert_equal "GMT", x.timezone
131
+ x = Hstore.first
132
+ assert_equal "de", x.language
133
+ assert_equal "GMT", x.timezone
134
+ end
148
135
 
149
- y = x.dup
150
- assert_equal "fr", y.language
151
- assert_equal "GMT", y.timezone
152
- end
136
+ def test_duplication_with_store_accessors
137
+ x = Hstore.new(language: "fr", timezone: "GMT")
138
+ assert_equal "fr", x.language
139
+ assert_equal "GMT", x.timezone
153
140
 
154
- def test_yaml_round_trip_with_store_accessors
155
- x = Hstore.new(language: "fr", timezone: "GMT")
156
- assert_equal "fr", x.language
157
- assert_equal "GMT", x.timezone
141
+ y = x.dup
142
+ assert_equal "fr", y.language
143
+ assert_equal "GMT", y.timezone
144
+ end
158
145
 
159
- y = YAML.load(YAML.dump(x))
160
- assert_equal "fr", y.language
161
- assert_equal "GMT", y.timezone
162
- end
146
+ def test_yaml_round_trip_with_store_accessors
147
+ x = Hstore.new(language: "fr", timezone: "GMT")
148
+ assert_equal "fr", x.language
149
+ assert_equal "GMT", x.timezone
163
150
 
164
- def test_changes_in_place
165
- hstore = Hstore.create!(settings: { 'one' => 'two' })
166
- hstore.settings['three'] = 'four'
167
- hstore.save!
168
- hstore.reload
151
+ payload = YAML.dump(x)
152
+ y = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(payload) : YAML.load(payload)
153
+ assert_equal "fr", y.language
154
+ assert_equal "GMT", y.timezone
155
+ end
169
156
 
170
- assert_equal 'four', hstore.settings['three']
171
- assert_not hstore.changed?
172
- end
157
+ def test_changes_with_store_accessors
158
+ x = Hstore.new(language: "de")
159
+ assert x.language_changed?
160
+ assert_nil x.language_was
161
+ assert_equal [nil, "de"], x.language_change
162
+ x.save!
173
163
 
174
- def test_dirty_from_user_equal
175
- settings = { "alongkey" => "anything", "key" => "value" }
176
- hstore = Hstore.create!(settings: settings)
164
+ assert_not x.language_changed?
165
+ x.reload
177
166
 
178
- hstore.settings = { "key" => "value", "alongkey" => "anything" }
179
- assert_equal settings, hstore.settings
180
- refute hstore.changed?
181
- end
167
+ x.settings = nil
168
+ assert x.language_changed?
169
+ assert_equal "de", x.language_was
170
+ assert_equal ["de", nil], x.language_change
171
+ end
182
172
 
183
- def test_hstore_dirty_from_database_equal
184
- settings = { "alongkey" => "anything", "key" => "value" }
185
- hstore = Hstore.create!(settings: settings)
186
- hstore.reload
173
+ def test_changes_in_place
174
+ hstore = Hstore.create!(settings: { "one" => "two" })
175
+ hstore.settings["three"] = "four"
176
+ hstore.save!
177
+ hstore.reload
187
178
 
188
- assert_equal settings, hstore.settings
189
- hstore.settings = settings
190
- refute hstore.changed?
191
- end
179
+ assert_equal "four", hstore.settings["three"]
180
+ assert_not_predicate hstore, :changed?
181
+ end
192
182
 
193
- def test_gen1
194
- assert_equal(%q(" "=>""), @type.serialize({' '=>''}))
195
- end
183
+ def test_dirty_from_user_equal
184
+ settings = { "alongkey" => "anything", "key" => "value" }
185
+ hstore = Hstore.create!(settings: settings)
196
186
 
197
- def test_gen2
198
- assert_equal(%q(","=>""), @type.serialize({','=>''}))
199
- end
187
+ hstore.settings = { "key" => "value", "alongkey" => "anything" }
188
+ assert_equal settings, hstore.settings
189
+ assert_not_predicate hstore, :changed?
190
+ end
200
191
 
201
- def test_gen3
202
- assert_equal(%q("="=>""), @type.serialize({'='=>''}))
203
- end
192
+ def test_hstore_dirty_from_database_equal
193
+ settings = { "alongkey" => "anything", "key" => "value" }
194
+ hstore = Hstore.create!(settings: settings)
195
+ hstore.reload
204
196
 
205
- def test_gen4
206
- assert_equal(%q(">"=>""), @type.serialize({'>'=>''}))
207
- end
197
+ assert_equal settings, hstore.settings
198
+ hstore.settings = settings
199
+ assert_not_predicate hstore, :changed?
200
+ end
208
201
 
209
- def test_parse1
210
- assert_equal({'a'=>nil,'b'=>nil,'c'=>'NuLl','null'=>'c'}, @type.deserialize('a=>null,b=>NuLl,c=>"NuLl",null=>c'))
211
- end
202
+ def test_gen1
203
+ assert_equal('" "=>""', @type.serialize(" " => ""))
204
+ end
212
205
 
213
- def test_parse2
214
- assert_equal({" " => " "}, @type.deserialize("\\ =>\\ "))
215
- end
206
+ def test_gen2
207
+ assert_equal('","=>""', @type.serialize("," => ""))
208
+ end
216
209
 
217
- def test_parse3
218
- assert_equal({"=" => ">"}, @type.deserialize("==>>"))
219
- end
210
+ def test_gen3
211
+ assert_equal('"="=>""', @type.serialize("=" => ""))
212
+ end
220
213
 
221
- def test_parse4
222
- assert_equal({"=a"=>"q=w"}, @type.deserialize('\=a=>q=w'))
223
- end
214
+ def test_gen4
215
+ assert_equal('">"=>""', @type.serialize(">" => ""))
216
+ end
224
217
 
225
- def test_parse5
226
- assert_equal({"=a"=>"q=w"}, @type.deserialize('"=a"=>q\=w'))
227
- end
218
+ def test_parse1
219
+ assert_equal({ "a" => nil, "b" => nil, "c" => "NuLl", "null" => "c" }, @type.deserialize('a=>null,b=>NuLl,c=>"NuLl",null=>c'))
220
+ end
228
221
 
229
- def test_parse6
230
- assert_equal({"\"a"=>"q>w"}, @type.deserialize('"\"a"=>q>w'))
231
- end
222
+ def test_parse2
223
+ assert_equal({ " " => " " }, @type.deserialize("\\ =>\\ "))
224
+ end
232
225
 
233
- def test_parse7
234
- assert_equal({"\"a"=>"q\"w"}, @type.deserialize('\"a=>q"w'))
235
- end
226
+ def test_parse3
227
+ assert_equal({ "=" => ">" }, @type.deserialize("==>>"))
228
+ end
236
229
 
237
- def test_rewrite
238
- @connection.execute "insert into hstores (tags) VALUES ('1=>2')"
239
- x = Hstore.first
240
- x.tags = { '"a\'' => 'b' }
241
- assert x.save!
242
- end
230
+ def test_parse4
231
+ assert_equal({ "=a" => "q=w" }, @type.deserialize('\=a=>q=w'))
232
+ end
243
233
 
244
- def test_select
245
- @connection.execute "insert into hstores (tags) VALUES ('1=>2')"
246
- x = Hstore.first
247
- assert_equal({'1' => '2'}, x.tags)
248
- end
234
+ def test_parse5
235
+ assert_equal({ "=a" => "q=w" }, @type.deserialize('"=a"=>q\=w'))
236
+ end
249
237
 
250
- def test_array_cycle
251
- assert_array_cycle([{"AA" => "BB", "CC" => "DD"}, {"AA" => nil}])
252
- end
238
+ def test_parse6
239
+ assert_equal({ "\"a" => "q>w" }, @type.deserialize('"\"a"=>q>w'))
240
+ end
253
241
 
254
- def test_array_strings_with_quotes
255
- assert_array_cycle([{'this has' => 'some "s that need to be escaped"'}])
256
- end
242
+ def test_parse7
243
+ assert_equal({ "\"a" => "q\"w" }, @type.deserialize('\"a=>q"w'))
244
+ end
257
245
 
258
- def test_array_strings_with_commas
259
- assert_array_cycle([{'this,has' => 'many,values'}])
260
- end
246
+ def test_rewrite
247
+ @connection.execute "insert into hstores (tags) VALUES ('1=>2')"
248
+ x = Hstore.first
249
+ x.tags = { '"a\'' => "b" }
250
+ assert x.save!
251
+ end
261
252
 
262
- def test_array_strings_with_array_delimiters
263
- assert_array_cycle(['{' => '}'])
264
- end
253
+ def test_select
254
+ @connection.execute "insert into hstores (tags) VALUES ('1=>2')"
255
+ x = Hstore.first
256
+ assert_equal({ "1" => "2" }, x.tags)
257
+ end
265
258
 
266
- def test_array_strings_with_null_strings
267
- assert_array_cycle([{'NULL' => 'NULL'}])
268
- end
259
+ def test_array_cycle
260
+ assert_array_cycle([{ "AA" => "BB", "CC" => "DD" }, { "AA" => nil }])
261
+ end
269
262
 
270
- def test_contains_nils
271
- assert_array_cycle([{'NULL' => nil}])
272
- end
263
+ def test_array_strings_with_quotes
264
+ assert_array_cycle([{ "this has" => 'some "s that need to be escaped"' }])
265
+ end
273
266
 
274
- def test_select_multikey
275
- @connection.execute "insert into hstores (tags) VALUES ('1=>2,2=>3')"
276
- x = Hstore.first
277
- assert_equal({'1' => '2', '2' => '3'}, x.tags)
278
- end
267
+ def test_array_strings_with_commas
268
+ assert_array_cycle([{ "this,has" => "many,values" }])
269
+ end
279
270
 
280
- def test_create
281
- assert_cycle('a' => 'b', '1' => '2')
282
- end
271
+ def test_array_strings_with_array_delimiters
272
+ assert_array_cycle(["{" => "}"])
273
+ end
283
274
 
284
- def test_nil
285
- assert_cycle('a' => nil)
286
- end
275
+ def test_array_strings_with_null_strings
276
+ assert_array_cycle([{ "NULL" => "NULL" }])
277
+ end
287
278
 
288
- def test_quotes
289
- assert_cycle('a' => 'b"ar', '1"foo' => '2')
290
- end
279
+ def test_contains_nils
280
+ assert_array_cycle([{ "NULL" => nil }])
281
+ end
291
282
 
292
- def test_whitespace
293
- assert_cycle('a b' => 'b ar', '1"foo' => '2')
294
- end
283
+ def test_select_multikey
284
+ @connection.execute "insert into hstores (tags) VALUES ('1=>2,2=>3')"
285
+ x = Hstore.first
286
+ assert_equal({ "1" => "2", "2" => "3" }, x.tags)
287
+ end
295
288
 
296
- def test_backslash
297
- assert_cycle('a\\b' => 'b\\ar', '1"foo' => '2')
298
- end
289
+ def test_create
290
+ assert_cycle("a" => "b", "1" => "2")
291
+ end
299
292
 
300
- def test_comma
301
- assert_cycle('a, b' => 'bar', '1"foo' => '2')
302
- end
293
+ def test_nil
294
+ assert_cycle("a" => nil)
295
+ end
303
296
 
304
- def test_arrow
305
- assert_cycle('a=>b' => 'bar', '1"foo' => '2')
306
- end
297
+ def test_quotes
298
+ assert_cycle("a" => 'b"ar', '1"foo' => "2")
299
+ end
307
300
 
308
- def test_quoting_special_characters
309
- assert_cycle('ca' => 'cà', 'ac' => 'àc')
310
- end
301
+ def test_whitespace
302
+ assert_cycle("a b" => "b ar", '1"foo' => "2")
303
+ end
311
304
 
312
- def test_multiline
313
- assert_cycle("a\nb" => "c\nd")
314
- end
305
+ def test_backslash
306
+ assert_cycle('a\\b' => 'b\\ar', '1"foo' => "2")
307
+ end
315
308
 
316
- class TagCollection
317
- def initialize(hash); @hash = hash end
318
- def to_hash; @hash end
319
- def self.load(hash); new(hash) end
320
- def self.dump(object); object.to_hash end
321
- end
309
+ def test_comma
310
+ assert_cycle("a, b" => "bar", '1"foo' => "2")
311
+ end
322
312
 
323
- class HstoreWithSerialize < Hstore
324
- serialize :tags, TagCollection
325
- end
313
+ def test_arrow
314
+ assert_cycle("a=>b" => "bar", '1"foo' => "2")
315
+ end
326
316
 
327
- def test_hstore_with_serialized_attributes
328
- HstoreWithSerialize.create! tags: TagCollection.new({"one" => "two"})
329
- record = HstoreWithSerialize.first
330
- assert_instance_of TagCollection, record.tags
331
- assert_equal({"one" => "two"}, record.tags.to_hash)
332
- record.tags = TagCollection.new("three" => "four")
333
- record.save!
334
- assert_equal({"three" => "four"}, HstoreWithSerialize.first.tags.to_hash)
335
- end
317
+ def test_quoting_special_characters
318
+ assert_cycle("ca" => "", "ac" => "àc")
319
+ end
336
320
 
337
- def test_clone_hstore_with_serialized_attributes
338
- HstoreWithSerialize.create! tags: TagCollection.new({"one" => "two"})
339
- record = HstoreWithSerialize.first
340
- dupe = record.dup
341
- assert_equal({"one" => "two"}, dupe.tags.to_hash)
342
- end
321
+ def test_multiline
322
+ assert_cycle("a\nb" => "c\nd")
323
+ end
343
324
 
344
- def test_schema_dump_with_shorthand
345
- output = dump_table_schema("hstores")
346
- assert_match %r[t\.hstore "tags",\s+default: {}], output
347
- end
325
+ class TagCollection
326
+ def initialize(hash); @hash = hash end
327
+ def to_hash; @hash end
328
+ def self.load(hash); new(hash) end
329
+ def self.dump(object); object.to_hash end
330
+ end
348
331
 
349
- def test_supports_to_unsafe_h_values
350
- assert_equal("\"hi\"=>\"hi\"", @type.serialize(FakeParameters.new))
351
- end
332
+ class HstoreWithSerialize < Hstore
333
+ serialize :tags, TagCollection
334
+ end
335
+
336
+ def test_hstore_with_serialized_attributes
337
+ HstoreWithSerialize.create! tags: TagCollection.new("one" => "two")
338
+ record = HstoreWithSerialize.first
339
+ assert_instance_of TagCollection, record.tags
340
+ assert_equal({ "one" => "two" }, record.tags.to_hash)
341
+ record.tags = TagCollection.new("three" => "four")
342
+ record.save!
343
+ assert_equal({ "three" => "four" }, HstoreWithSerialize.first.tags.to_hash)
344
+ end
352
345
 
353
- private
346
+ def test_clone_hstore_with_serialized_attributes
347
+ HstoreWithSerialize.create! tags: TagCollection.new("one" => "two")
348
+ record = HstoreWithSerialize.first
349
+ dupe = record.dup
350
+ assert_equal({ "one" => "two" }, dupe.tags.to_hash)
351
+ end
352
+
353
+ def test_schema_dump_with_shorthand
354
+ output = dump_table_schema("hstores")
355
+ assert_match %r[t\.hstore "tags",\s+default: {}], output
356
+ end
357
+
358
+ def test_supports_to_unsafe_h_values
359
+ assert_equal "\"hi\"=>\"hi\"", @type.serialize(ProtectedParams.new("hi" => "hi"))
360
+ end
361
+
362
+ private
354
363
  def assert_array_cycle(array)
355
364
  # test creation
356
365
  x = Hstore.create!(payload: array)
@@ -367,16 +376,15 @@ if ActiveRecord::Base.connection.supports_extensions?
367
376
 
368
377
  def assert_cycle(hash)
369
378
  # test creation
370
- x = Hstore.create!(:tags => hash)
379
+ x = Hstore.create!(tags: hash)
371
380
  x.reload
372
381
  assert_equal(hash, x.tags)
373
382
 
374
383
  # test updating
375
- x = Hstore.create!(:tags => {})
384
+ x = Hstore.create!(tags: {})
376
385
  x.tags = hash
377
386
  x.save!
378
387
  x.reload
379
388
  assert_equal(hash, x.tags)
380
389
  end
381
- end
382
390
  end