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
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "cases/json_shared_test_cases"
5
+
6
+ class JsonAttributeTest < ActiveRecord::TestCase
7
+ include JSONSharedTestCases
8
+ self.use_transactional_tests = false
9
+
10
+ class JsonDataTypeOnText < ActiveRecord::Base
11
+ self.table_name = "json_data_type"
12
+
13
+ attribute :payload, :json
14
+ attribute :settings, :json
15
+
16
+ store_accessor :settings, :resolution
17
+ end
18
+
19
+ def setup
20
+ super
21
+ @connection.create_table("json_data_type") do |t|
22
+ t.string "payload"
23
+ t.string "settings"
24
+ end
25
+ end
26
+
27
+ private
28
+ def column_type
29
+ :string
30
+ end
31
+
32
+ def klass
33
+ JsonDataTypeOnText
34
+ end
35
+ end
@@ -1,44 +1,45 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/contact'
3
- require 'models/post'
4
- require 'models/author'
5
- require 'models/tagging'
6
- require 'models/tag'
7
- require 'models/comment'
4
+ require "models/contact"
5
+ require "models/post"
6
+ require "models/author"
7
+ require "models/tagging"
8
+ require "models/tag"
9
+ require "models/comment"
8
10
 
9
11
  module JsonSerializationHelpers
10
12
  private
11
-
12
- def set_include_root_in_json(value)
13
- original_root_in_json = ActiveRecord::Base.include_root_in_json
14
- ActiveRecord::Base.include_root_in_json = value
15
- yield
16
- ensure
17
- ActiveRecord::Base.include_root_in_json = original_root_in_json
18
- end
13
+ def set_include_root_in_json(value)
14
+ original_root_in_json = ActiveRecord::Base.include_root_in_json
15
+ ActiveRecord::Base.include_root_in_json = value
16
+ yield
17
+ ensure
18
+ ActiveRecord::Base.include_root_in_json = original_root_in_json
19
+ end
19
20
  end
20
21
 
21
22
  class JsonSerializationTest < ActiveRecord::TestCase
22
23
  include JsonSerializationHelpers
23
24
 
24
25
  class NamespacedContact < Contact
25
- column :name, :string
26
+ column :name, "string"
26
27
  end
27
28
 
28
29
  def setup
29
30
  @contact = Contact.new(
30
- :name => 'Konata Izumi',
31
- :age => 16,
32
- :avatar => 'binarydata',
33
- :created_at => Time.utc(2006, 8, 1),
34
- :awesome => true,
35
- :preferences => { :shows => 'anime' }
31
+ name: "Konata Izumi",
32
+ age: 16,
33
+ avatar: "binarydata",
34
+ created_at: Time.utc(2006, 8, 1),
35
+ awesome: true,
36
+ preferences: { shows: "anime" }
36
37
  )
37
38
  end
38
39
 
39
40
  def test_should_demodulize_root_in_json
40
41
  set_include_root_in_json(true) do
41
- @contact = NamespacedContact.new name: 'whatever'
42
+ @contact = NamespacedContact.new name: "whatever"
42
43
  json = @contact.to_json
43
44
  assert_match %r{^\{"namespaced_contact":\{}, json
44
45
  end
@@ -51,7 +52,7 @@ class JsonSerializationTest < ActiveRecord::TestCase
51
52
  assert_match %r{^\{"contact":\{}, json
52
53
  assert_match %r{"name":"Konata Izumi"}, json
53
54
  assert_match %r{"age":16}, json
54
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
55
+ assert_includes json, %("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})
55
56
  assert_match %r{"awesome":true}, json
56
57
  assert_match %r{"preferences":\{"shows":"anime"\}}, json
57
58
  end
@@ -62,28 +63,28 @@ class JsonSerializationTest < ActiveRecord::TestCase
62
63
 
63
64
  assert_match %r{"name":"Konata Izumi"}, json
64
65
  assert_match %r{"age":16}, json
65
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
66
+ assert_includes json, %("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})
66
67
  assert_match %r{"awesome":true}, json
67
68
  assert_match %r{"preferences":\{"shows":"anime"\}}, json
68
69
  end
69
70
 
70
71
  def test_should_allow_attribute_filtering_with_only
71
- json = @contact.to_json(:only => [:name, :age])
72
+ json = @contact.to_json(only: [:name, :age])
72
73
 
73
74
  assert_match %r{"name":"Konata Izumi"}, json
74
75
  assert_match %r{"age":16}, json
75
76
  assert_no_match %r{"awesome":true}, json
76
- assert !json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
77
+ assert_not_includes json, %("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})
77
78
  assert_no_match %r{"preferences":\{"shows":"anime"\}}, json
78
79
  end
79
80
 
80
81
  def test_should_allow_attribute_filtering_with_except
81
- json = @contact.to_json(:except => [:name, :age])
82
+ json = @contact.to_json(except: [:name, :age])
82
83
 
83
84
  assert_no_match %r{"name":"Konata Izumi"}, json
84
85
  assert_no_match %r{"age":16}, json
85
86
  assert_match %r{"awesome":true}, json
86
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
87
+ assert_includes json, %("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})
87
88
  assert_match %r{"preferences":\{"shows":"anime"\}}, json
88
89
  end
89
90
 
@@ -93,10 +94,10 @@ class JsonSerializationTest < ActiveRecord::TestCase
93
94
  def @contact.favorite_quote; "Constraints are liberating"; end
94
95
 
95
96
  # Single method.
96
- assert_match %r{"label":"Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label)
97
+ assert_match %r{"label":"Has cheezburger"}, @contact.to_json(only: :name, methods: :label)
97
98
 
98
99
  # Both methods.
99
- methods_json = @contact.to_json(:only => :name, :methods => [:label, :favorite_quote])
100
+ methods_json = @contact.to_json(only: :name, methods: [:label, :favorite_quote])
100
101
  assert_match %r{"label":"Has cheezburger"}, methods_json
101
102
  assert_match %r{"favorite_quote":"Constraints are liberating"}, methods_json
102
103
  end
@@ -113,7 +114,7 @@ class JsonSerializationTest < ActiveRecord::TestCase
113
114
  end
114
115
 
115
116
  def test_uses_serializable_hash_with_only_option
116
- def @contact.serializable_hash(options=nil)
117
+ def @contact.serializable_hash(options = nil)
117
118
  super(only: %w(name))
118
119
  end
119
120
 
@@ -124,7 +125,7 @@ class JsonSerializationTest < ActiveRecord::TestCase
124
125
  end
125
126
 
126
127
  def test_uses_serializable_hash_with_except_option
127
- def @contact.serializable_hash(options=nil)
128
+ def @contact.serializable_hash(options = nil)
128
129
  super(except: %w(age))
129
130
  end
130
131
 
@@ -136,7 +137,7 @@ class JsonSerializationTest < ActiveRecord::TestCase
136
137
 
137
138
  def test_does_not_include_inheritance_column_from_sti
138
139
  @contact = ContactSti.new(@contact.attributes)
139
- assert_equal 'ContactSti', @contact.type
140
+ assert_equal "ContactSti", @contact.type
140
141
 
141
142
  json = @contact.to_json
142
143
  assert_match %r{"name":"Konata Izumi"}, json
@@ -146,9 +147,9 @@ class JsonSerializationTest < ActiveRecord::TestCase
146
147
 
147
148
  def test_serializable_hash_with_default_except_option_and_excluding_inheritance_column_from_sti
148
149
  @contact = ContactSti.new(@contact.attributes)
149
- assert_equal 'ContactSti', @contact.type
150
+ assert_equal "ContactSti", @contact.type
150
151
 
151
- def @contact.serializable_hash(options={})
152
+ def @contact.serializable_hash(options = {})
152
153
  super({ except: %w(age) }.merge!(options))
153
154
  end
154
155
 
@@ -160,15 +161,13 @@ class JsonSerializationTest < ActiveRecord::TestCase
160
161
  end
161
162
 
162
163
  def test_serializable_hash_should_not_modify_options_in_argument
163
- options = { :only => :name }
164
- @contact.serializable_hash(options)
165
-
166
- assert_nil options[:except]
164
+ options = { only: :name }.freeze
165
+ assert_nothing_raised { @contact.serializable_hash(options) }
167
166
  end
168
167
  end
169
168
 
170
169
  class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
171
- fixtures :authors, :posts, :comments, :tags, :taggings
170
+ fixtures :authors, :author_addresses, :posts, :comments, :tags, :taggings
172
171
 
173
172
  include JsonSerializationHelpers
174
173
 
@@ -178,7 +177,7 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
178
177
  end
179
178
 
180
179
  def test_includes_uses_association_name
181
- json = @david.to_json(:include => :posts)
180
+ json = @david.to_json(include: :posts)
182
181
 
183
182
  assert_match %r{"posts":\[}, json
184
183
 
@@ -194,7 +193,7 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
194
193
  end
195
194
 
196
195
  def test_includes_uses_association_name_and_applies_attribute_filters
197
- json = @david.to_json(:include => { :posts => { :only => :title } })
196
+ json = @david.to_json(include: { posts: { only: :title } })
198
197
 
199
198
  assert_match %r{"name":"David"}, json
200
199
  assert_match %r{"posts":\[}, json
@@ -207,7 +206,7 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
207
206
  end
208
207
 
209
208
  def test_includes_fetches_second_level_associations
210
- json = @david.to_json(:include => { :posts => { :include => { :comments => { :only => :body } } } })
209
+ json = @david.to_json(include: { posts: { include: { comments: { only: :body } } } })
211
210
 
212
211
  assert_match %r{"name":"David"}, json
213
212
  assert_match %r{"posts":\[}, json
@@ -220,12 +219,12 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
220
219
 
221
220
  def test_includes_fetches_nth_level_associations
222
221
  json = @david.to_json(
223
- :include => {
224
- :posts => {
225
- :include => {
226
- :taggings => {
227
- :include => {
228
- :tag => { :only => :name }
222
+ include: {
223
+ posts: {
224
+ include: {
225
+ taggings: {
226
+ include: {
227
+ tag: { only: :name }
229
228
  }
230
229
  }
231
230
  }
@@ -241,8 +240,8 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
241
240
 
242
241
  def test_includes_doesnt_merge_opts_from_base
243
242
  json = @david.to_json(
244
- :only => :id,
245
- :include => :posts
243
+ only: :id,
244
+ include: :posts
246
245
  )
247
246
 
248
247
  assert_match %{"title":"Welcome to the weblog"}, json
@@ -250,11 +249,11 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
250
249
 
251
250
  def test_should_not_call_methods_on_associations_that_dont_respond
252
251
  def @david.favorite_quote; "Constraints are liberating"; end
253
- json = @david.to_json(:include => :posts, :methods => :favorite_quote)
252
+ json = @david.to_json(include: :posts, methods: :favorite_quote)
254
253
 
255
- assert !@david.posts.first.respond_to?(:favorite_quote)
254
+ assert_not_respond_to @david.posts.first, :favorite_quote
256
255
  assert_match %r{"favorite_quote":"Constraints are liberating"}, json
257
- assert_equal %r{"favorite_quote":}.match(json).size, 1
256
+ assert_equal 1, %r{"favorite_quote":}.match(json).size
258
257
  end
259
258
 
260
259
  def test_should_allow_only_option_for_list_of_authors
@@ -278,15 +277,15 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
278
277
  def test_should_allow_includes_for_list_of_authors
279
278
  authors = [@david, @mary]
280
279
  json = ActiveSupport::JSON.encode(authors,
281
- :only => :name,
282
- :include => {
283
- :posts => { :only => :id }
280
+ only: :name,
281
+ include: {
282
+ posts: { only: :id }
284
283
  }
285
284
  )
286
285
 
287
286
  ['"name":"David"', '"posts":[', '{"id":1}', '{"id":2}', '{"id":4}',
288
287
  '{"id":5}', '{"id":6}', '"name":"Mary"', '"posts":[', '{"id":7}', '{"id":9}'].each do |fragment|
289
- assert json.include?(fragment), json
288
+ assert_includes json, fragment, json
290
289
  end
291
290
  end
292
291
 
@@ -0,0 +1,290 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "support/schema_dumping_helper"
4
+ require "pp"
5
+
6
+ module JSONSharedTestCases
7
+ include SchemaDumpingHelper
8
+
9
+ class JsonDataType < ActiveRecord::Base
10
+ self.table_name = "json_data_type"
11
+
12
+ store_accessor :settings, :resolution
13
+ end
14
+
15
+ def setup
16
+ @connection = ActiveRecord::Base.connection
17
+ end
18
+
19
+ def teardown
20
+ @connection.drop_table :json_data_type, if_exists: true
21
+ klass.reset_column_information
22
+ end
23
+
24
+ def test_column
25
+ column = klass.columns_hash["payload"]
26
+ assert_equal column_type, column.type
27
+ assert_type_match column_type, column.sql_type
28
+
29
+ type = klass.type_for_attribute("payload")
30
+ assert_not_predicate type, :binary?
31
+ end
32
+
33
+ def test_change_table_supports_json
34
+ @connection.change_table("json_data_type") do |t|
35
+ t.public_send column_type, "users"
36
+ end
37
+ klass.reset_column_information
38
+ column = klass.columns_hash["users"]
39
+ assert_equal column_type, column.type
40
+ assert_type_match column_type, column.sql_type
41
+ end
42
+
43
+ def test_schema_dumping
44
+ output = dump_table_schema("json_data_type")
45
+ assert_match(/t\.#{column_type}\s+"settings"/, output)
46
+ end
47
+
48
+ def test_cast_value_on_write
49
+ x = klass.new(payload: { "string" => "foo", :symbol => :bar })
50
+ assert_equal({ "string" => "foo", :symbol => :bar }, x.payload_before_type_cast)
51
+ assert_equal({ "string" => "foo", "symbol" => "bar" }, x.payload)
52
+ x.save!
53
+ assert_equal({ "string" => "foo", "symbol" => "bar" }, x.reload.payload)
54
+ end
55
+
56
+ def test_type_cast_json
57
+ type = klass.type_for_attribute("payload")
58
+
59
+ data = '{"a_key":"a_value"}'
60
+ hash = type.deserialize(data)
61
+ assert_equal({ "a_key" => "a_value" }, hash)
62
+ assert_equal({ "a_key" => "a_value" }, type.deserialize(data))
63
+
64
+ assert_equal({}, type.deserialize("{}"))
65
+ assert_equal({ "key" => nil }, type.deserialize('{"key": null}'))
66
+ assert_equal({ "c" => "}", '"a"' => 'b "a b' }, type.deserialize(%q({"c":"}", "\"a\"":"b \"a b"})))
67
+ end
68
+
69
+ def test_rewrite
70
+ @connection.execute(insert_statement_per_database('{"k":"v"}'))
71
+ x = klass.first
72
+ x.payload = { '"a\'' => "b" }
73
+ assert x.save!
74
+ end
75
+
76
+ def test_select
77
+ @connection.execute(insert_statement_per_database('{"k":"v"}'))
78
+ x = klass.first
79
+ assert_equal({ "k" => "v" }, x.payload)
80
+ end
81
+
82
+ def test_select_multikey
83
+ @connection.execute(insert_statement_per_database('{"k1":"v1", "k2":"v2", "k3":[1,2,3]}'))
84
+ x = klass.first
85
+ assert_equal({ "k1" => "v1", "k2" => "v2", "k3" => [1, 2, 3] }, x.payload)
86
+ end
87
+
88
+ def test_null_json
89
+ @connection.execute(insert_statement_per_database("null"))
90
+ x = klass.first
91
+ assert_nil(x.payload)
92
+ end
93
+
94
+ def test_select_nil_json_after_create
95
+ json = klass.create!(payload: nil)
96
+ x = klass.where(payload: nil).first
97
+ assert_equal(json, x)
98
+ end
99
+
100
+ def test_select_nil_json_after_update
101
+ json = klass.create!(payload: "foo")
102
+ x = klass.where(payload: nil).first
103
+ assert_nil(x)
104
+
105
+ json.update(payload: nil)
106
+ x = klass.where(payload: nil).first
107
+ assert_equal(json.reload, x)
108
+ end
109
+
110
+ def test_select_array_json_value
111
+ @connection.execute(insert_statement_per_database('["v0",{"k1":"v1"}]'))
112
+ x = klass.first
113
+ assert_equal(["v0", { "k1" => "v1" }], x.payload)
114
+ end
115
+
116
+ def test_rewrite_array_json_value
117
+ @connection.execute(insert_statement_per_database('["v0",{"k1":"v1"}]'))
118
+ x = klass.first
119
+ x.payload = ["v1", { "k2" => "v2" }, "v3"]
120
+ assert x.save!
121
+ end
122
+
123
+ def test_with_store_accessors
124
+ x = klass.new(resolution: "320×480")
125
+ assert_equal "320×480", x.resolution
126
+
127
+ x.save!
128
+ x = klass.first
129
+ assert_equal "320×480", x.resolution
130
+
131
+ x.resolution = "640×1136"
132
+ x.save!
133
+
134
+ x = klass.first
135
+ assert_equal "640×1136", x.resolution
136
+ end
137
+
138
+ def test_duplication_with_store_accessors
139
+ x = klass.new(resolution: "320×480")
140
+ assert_equal "320×480", x.resolution
141
+
142
+ y = x.dup
143
+ assert_equal "320×480", y.resolution
144
+ end
145
+
146
+ def test_yaml_round_trip_with_store_accessors
147
+ x = klass.new(resolution: "320×480")
148
+ assert_equal "320×480", x.resolution
149
+
150
+ payload = YAML.dump(x)
151
+ y = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(payload) : YAML.load(payload)
152
+ assert_equal "320×480", y.resolution
153
+ end
154
+
155
+ def test_changes_in_place
156
+ json = klass.new
157
+ assert_not_predicate json, :changed?
158
+
159
+ json.payload = { "one" => "two" }
160
+ assert_predicate json, :changed?
161
+ assert_predicate json, :payload_changed?
162
+
163
+ json.save!
164
+ assert_not_predicate json, :changed?
165
+
166
+ json.payload["three"] = "four"
167
+ assert_predicate json, :payload_changed?
168
+
169
+ json.save!
170
+ json.reload
171
+
172
+ assert_equal({ "one" => "two", "three" => "four" }, json.payload)
173
+ assert_not_predicate json, :changed?
174
+ end
175
+
176
+ def test_changes_in_place_ignores_key_order
177
+ json = klass.new
178
+ assert_not_predicate json, :changed?
179
+
180
+ json.payload = { "three" => "four", "one" => "two" }
181
+ json.save!
182
+ json.reload
183
+
184
+ json.payload = { "three" => "four", "one" => "two" }
185
+ assert_not_predicate json, :changed?
186
+
187
+ json.payload = [{ "three" => "four", "one" => "two" }, { "seven" => "eight", "five" => "six" }]
188
+ json.save!
189
+ json.reload
190
+
191
+ json.payload = [{ "three" => "four", "one" => "two" }, { "seven" => "eight", "five" => "six" }]
192
+ assert_not_predicate json, :changed?
193
+ end
194
+
195
+ def test_changes_in_place_with_ruby_object
196
+ time = Time.now.utc
197
+ json = klass.create!(payload: time)
198
+
199
+ json.reload
200
+ assert_not_predicate json, :changed?
201
+
202
+ json.payload = time
203
+ assert_not_predicate json, :changed?
204
+ end
205
+
206
+ def test_assigning_string_literal
207
+ json = klass.create!(payload: "foo")
208
+ assert_equal "foo", json.payload
209
+ end
210
+
211
+ def test_assigning_number
212
+ json = klass.create!(payload: 1.234)
213
+ assert_equal 1.234, json.payload
214
+ end
215
+
216
+ def test_assigning_boolean
217
+ json = klass.create!(payload: true)
218
+ assert_equal true, json.payload
219
+ end
220
+
221
+ def test_not_compatible_with_serialize_json
222
+ new_klass = Class.new(klass) do
223
+ serialize :payload, JSON
224
+ end
225
+ assert_raises(ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError) do
226
+ new_klass.new
227
+ end
228
+ end
229
+
230
+ class MySettings
231
+ def initialize(hash); @hash = hash end
232
+ def to_hash; @hash end
233
+ def self.load(hash); new(hash) end
234
+ def self.dump(object); object.to_hash end
235
+ end
236
+
237
+ def test_json_with_serialized_attributes
238
+ new_klass = Class.new(klass) do
239
+ serialize :settings, MySettings
240
+ end
241
+
242
+ new_klass.create!(settings: MySettings.new("one" => "two"))
243
+ record = new_klass.first
244
+
245
+ assert_instance_of MySettings, record.settings
246
+ assert_equal({ "one" => "two" }, record.settings.to_hash)
247
+
248
+ record.settings = MySettings.new("three" => "four")
249
+ record.save!
250
+
251
+ assert_equal({ "three" => "four" }, record.reload.settings.to_hash)
252
+ end
253
+
254
+ class JsonDataTypeWithFilter < ActiveRecord::Base
255
+ self.table_name = "json_data_type"
256
+
257
+ attribute :payload, :json
258
+
259
+ def self.filter_attributes
260
+ # Rails.application.config.filter_parameters += [:password]
261
+ super + [:password]
262
+ end
263
+ end
264
+
265
+ def test_pretty_print
266
+ x = JsonDataTypeWithFilter.create!(payload: {})
267
+ x.payload[11] = "foo"
268
+ io = StringIO.new
269
+ PP.pp(x, io)
270
+ assert io.string
271
+ end
272
+
273
+ private
274
+ def klass
275
+ JsonDataType
276
+ end
277
+
278
+ def assert_type_match(type, sql_type)
279
+ native_type = ActiveRecord::Base.connection.native_database_types[type][:name]
280
+ assert_match %r(\A#{native_type}\b), sql_type
281
+ end
282
+
283
+ def insert_statement_per_database(values)
284
+ if current_adapter?(:OracleAdapter)
285
+ "insert into json_data_type (id, payload) VALUES (json_data_type_seq.nextval, '#{values}')"
286
+ else
287
+ "insert into json_data_type (payload) VALUES ('#{values}')"
288
+ end
289
+ end
290
+ end