ibm_db 5.2.0-x86-mingw32 → 5.3.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,16 +1,24 @@
1
- require 'cases/helper'
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/person'
5
- require 'models/traffic_light'
6
- require 'models/post'
7
- require 'bcrypt'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/person"
5
+ require "models/traffic_light"
6
+ require "models/post"
7
+ require "models/binary_field"
8
8
 
9
9
  class SerializedAttributeTest < ActiveRecord::TestCase
10
10
  fixtures :topics, :posts
11
11
 
12
12
  MyObject = Struct.new :attribute1, :attribute2
13
13
 
14
+ class Topic < ActiveRecord::Base
15
+ serialize :content
16
+ end
17
+
18
+ class ImportantTopic < Topic
19
+ serialize :important, Hash
20
+ end
21
+
14
22
  teardown do
15
23
  Topic.serialize("content")
16
24
  end
@@ -25,7 +33,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
25
33
  def test_serialized_attribute
26
34
  Topic.serialize("content", MyObject)
27
35
 
28
- myobj = MyObject.new('value1', 'value2')
36
+ myobj = MyObject.new("value1", "value2")
29
37
  topic = Topic.create("content" => myobj)
30
38
  assert_equal(myobj, topic.content)
31
39
 
@@ -33,10 +41,31 @@ class SerializedAttributeTest < ActiveRecord::TestCase
33
41
  assert_equal(myobj, topic.content)
34
42
  end
35
43
 
44
+ def test_serialized_attribute_with_default
45
+ klass = Class.new(ActiveRecord::Base) do
46
+ self.table_name = Topic.table_name
47
+ serialize(:content, Hash, default: { key: "value" })
48
+ end
49
+
50
+ t = klass.new
51
+ assert_equal({ key: "value" }, t.content)
52
+ end
53
+
54
+ def test_serialized_attribute_on_custom_attribute_with_default
55
+ klass = Class.new(ActiveRecord::Base) do
56
+ self.table_name = Topic.table_name
57
+ attribute :content, default: { key: "value" }
58
+ serialize :content, Hash
59
+ end
60
+
61
+ t = klass.new
62
+ assert_equal({ key: "value" }, t.content)
63
+ end
64
+
36
65
  def test_serialized_attribute_in_base_class
37
66
  Topic.serialize("content", Hash)
38
67
 
39
- hash = { 'content1' => 'value1', 'content2' => 'value2' }
68
+ hash = { "content1" => "value1", "content2" => "value2" }
40
69
  important_topic = ImportantTopic.create("content" => hash)
41
70
  assert_equal(hash, important_topic.content)
42
71
 
@@ -47,10 +76,10 @@ class SerializedAttributeTest < ActiveRecord::TestCase
47
76
  def test_serialized_attributes_from_database_on_subclass
48
77
  Topic.serialize :content, Hash
49
78
 
50
- t = Reply.new(content: { foo: :bar })
79
+ t = ImportantTopic.new(content: { foo: :bar })
51
80
  assert_equal({ foo: :bar }, t.content)
52
81
  t.save!
53
- t = Reply.last
82
+ t = ImportantTopic.last
54
83
  assert_equal({ foo: :bar }, t.content)
55
84
  end
56
85
 
@@ -97,7 +126,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
97
126
  end
98
127
 
99
128
  def test_serialized_attribute_declared_in_subclass
100
- hash = { 'important1' => 'value1', 'important2' => 'value2' }
129
+ hash = { "important1" => "value1", "important2" => "value2" }
101
130
  important_topic = ImportantTopic.create("important" => hash)
102
131
  assert_equal(hash, important_topic.important)
103
132
 
@@ -107,7 +136,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
107
136
  end
108
137
 
109
138
  def test_serialized_time_attribute
110
- myobj = Time.local(2008,1,1,1,0)
139
+ myobj = Time.local(2008, 1, 1, 1, 0)
111
140
  topic = Topic.create("content" => myobj).reload
112
141
  assert_equal(myobj, topic.content)
113
142
  end
@@ -124,26 +153,26 @@ class SerializedAttributeTest < ActiveRecord::TestCase
124
153
  end
125
154
 
126
155
  def test_nil_not_serialized_without_class_constraint
127
- assert Topic.new(:content => nil).save
128
- assert_equal 1, Topic.where(:content => nil).count
156
+ assert Topic.new(content: nil).save
157
+ assert_equal 1, Topic.where(content: nil).count
129
158
  end
130
159
 
131
160
  def test_nil_not_serialized_with_class_constraint
132
161
  Topic.serialize :content, Hash
133
- assert Topic.new(:content => nil).save
134
- assert_equal 1, Topic.where(:content => nil).count
162
+ assert Topic.new(content: nil).save
163
+ assert_equal 1, Topic.where(content: nil).count
135
164
  end
136
165
 
137
166
  def test_serialized_attribute_should_raise_exception_on_assignment_with_wrong_type
138
167
  Topic.serialize(:content, Hash)
139
168
  assert_raise(ActiveRecord::SerializationTypeMismatch) do
140
- Topic.new(content: 'string')
169
+ Topic.new(content: "string")
141
170
  end
142
171
  end
143
172
 
144
173
  def test_should_raise_exception_on_serialized_attribute_with_type_mismatch
145
- myobj = MyObject.new('value1', 'value2')
146
- topic = Topic.new(:content => myobj)
174
+ myobj = MyObject.new("value1", "value2")
175
+ topic = Topic.new(content: myobj)
147
176
  assert topic.save
148
177
  Topic.serialize(:content, Hash)
149
178
  assert_raise(ActiveRecord::SerializationTypeMismatch) { Topic.find(topic.id).content }
@@ -152,11 +181,32 @@ class SerializedAttributeTest < ActiveRecord::TestCase
152
181
  def test_serialized_attribute_with_class_constraint
153
182
  settings = { "color" => "blue" }
154
183
  Topic.serialize(:content, Hash)
155
- topic = Topic.new(:content => settings)
184
+ topic = Topic.new(content: settings)
156
185
  assert topic.save
157
186
  assert_equal(settings, Topic.find(topic.id).content)
158
187
  end
159
188
 
189
+ def test_where_by_serialized_attribute_with_array
190
+ settings = [ "color" => "green" ]
191
+ Topic.serialize(:content, Array)
192
+ topic = Topic.create!(content: settings)
193
+ assert_equal topic, Topic.where(content: settings).take
194
+ end
195
+
196
+ def test_where_by_serialized_attribute_with_hash
197
+ settings = { "color" => "green" }
198
+ Topic.serialize(:content, Hash)
199
+ topic = Topic.create!(content: settings)
200
+ assert_equal topic, Topic.where(content: settings).take
201
+ end
202
+
203
+ def test_where_by_serialized_attribute_with_hash_in_array
204
+ settings = { "color" => "green" }
205
+ Topic.serialize(:content, Hash)
206
+ topic = Topic.create!(content: settings)
207
+ assert_equal topic, Topic.where(content: [settings]).take
208
+ end
209
+
160
210
  def test_serialized_default_class
161
211
  Topic.serialize(:content, Hash)
162
212
  topic = Topic.new
@@ -175,17 +225,17 @@ class SerializedAttributeTest < ActiveRecord::TestCase
175
225
  end
176
226
 
177
227
  def test_serialized_boolean_value_true
178
- topic = Topic.new(:content => true)
228
+ topic = Topic.new(content: true)
179
229
  assert topic.save
180
230
  topic = topic.reload
181
- assert_equal topic.content, true
231
+ assert_equal true, topic.content
182
232
  end
183
233
 
184
234
  def test_serialized_boolean_value_false
185
- topic = Topic.new(:content => false)
235
+ topic = Topic.new(content: false)
186
236
  assert topic.save
187
237
  topic = topic.reload
188
- assert_equal topic.content, false
238
+ assert_equal false, topic.content
189
239
  end
190
240
 
191
241
  def test_serialize_with_coder
@@ -200,18 +250,18 @@ class SerializedAttributeTest < ActiveRecord::TestCase
200
250
  end
201
251
 
202
252
  Topic.serialize(:content, some_class)
203
- topic = Topic.new(:content => some_class.new('my value'))
253
+ topic = Topic.new(content: some_class.new("my value"))
204
254
  topic.save!
205
255
  topic.reload
206
256
  assert_kind_of some_class, topic.content
207
- assert_equal topic.content, some_class.new('my value')
257
+ assert_equal some_class.new("my value"), topic.content
208
258
  end
209
259
 
210
260
  def test_serialize_attribute_via_select_method_when_time_zone_available
211
261
  with_timezone_config aware_attributes: true do
212
262
  Topic.serialize(:content, MyObject)
213
263
 
214
- myobj = MyObject.new('value1', 'value2')
264
+ myobj = MyObject.new("value1", "value2")
215
265
  topic = Topic.create(content: myobj)
216
266
 
217
267
  assert_equal(myobj, Topic.select(:content).find(topic.id).content)
@@ -220,8 +270,8 @@ class SerializedAttributeTest < ActiveRecord::TestCase
220
270
  end
221
271
 
222
272
  def test_serialize_attribute_can_be_serialized_in_an_integer_column
223
- insures = ['life']
224
- person = SerializedPerson.new(first_name: 'David', insures: insures)
273
+ insures = ["life"]
274
+ person = SerializedPerson.new(first_name: "David", insures: insures)
225
275
  assert person.save
226
276
  person = person.reload
227
277
  assert_equal(insures, person.insures)
@@ -233,6 +283,20 @@ class SerializedAttributeTest < ActiveRecord::TestCase
233
283
  assert_equal [], light.long_state
234
284
  end
235
285
 
286
+ def test_unexpected_serialized_type
287
+ Topic.serialize :content, Hash
288
+ topic = Topic.create!(content: { zomg: true })
289
+
290
+ Topic.serialize :content, Array
291
+
292
+ topic.reload
293
+ error = assert_raise(ActiveRecord::SerializationTypeMismatch) do
294
+ topic.content
295
+ end
296
+ expected = "can't load `content`: was supposed to be a Array, but was a Hash. -- {:zomg=>true}"
297
+ assert_equal expected, error.to_s
298
+ end
299
+
236
300
  def test_serialized_column_should_unserialize_after_update_column
237
301
  t = Topic.create(content: "first")
238
302
  assert_equal("first", t.content)
@@ -256,7 +320,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
256
320
 
257
321
  topic = Topic.new(content: nil)
258
322
 
259
- assert_not topic.content_changed?
323
+ assert_not_predicate topic, :content_changed?
260
324
  end
261
325
 
262
326
  def test_classes_without_no_arg_constructors_are_not_supported
@@ -275,6 +339,38 @@ class SerializedAttributeTest < ActiveRecord::TestCase
275
339
  assert_equal({}, topic.content)
276
340
  end
277
341
 
342
+ if current_adapter?(:Mysql2Adapter)
343
+ def test_is_not_changed_when_stored_in_mysql_blob
344
+ value = %w(Fée)
345
+ model = BinaryField.create!(normal_blob: value, normal_text: value)
346
+ model.reload
347
+
348
+ model.normal_text = value
349
+ assert_not_predicate model, :normal_text_changed?
350
+
351
+ model.normal_blob = value
352
+ assert_not_predicate model, :normal_blob_changed?
353
+ end
354
+
355
+ class FrozenBinaryField < BinaryField
356
+ class FrozenCoder < ActiveRecord::Coders::YAMLColumn
357
+ def dump(obj)
358
+ super&.freeze
359
+ end
360
+ end
361
+ serialize :normal_blob, FrozenCoder.new(:normal_blob, Array)
362
+ end
363
+
364
+ def test_is_not_changed_when_stored_in_mysql_blob_frozen_payload
365
+ value = %w(Fée)
366
+ model = FrozenBinaryField.create!(normal_blob: value, normal_text: value)
367
+ model.reload
368
+
369
+ model.normal_blob = value
370
+ assert_not_predicate model, :normal_blob_changed?
371
+ end
372
+ end
373
+
278
374
  def test_values_cast_from_nil_are_persisted_as_nil
279
375
  # This is required to fulfil the following contract, which must be universally
280
376
  # true in Active Record:
@@ -285,7 +381,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
285
381
  topic = Topic.create!(content: {})
286
382
  topic2 = Topic.create!(content: nil)
287
383
 
288
- assert_equal [topic, topic2], Topic.where(content: nil)
384
+ assert_equal [topic, topic2], Topic.where(content: nil).sort_by(&:id)
289
385
  end
290
386
 
291
387
  def test_nil_is_always_persisted_as_null
@@ -326,18 +422,13 @@ class SerializedAttributeTest < ActiveRecord::TestCase
326
422
 
327
423
  topic = model.create!(foo: "bar")
328
424
  topic.foo
329
- refute topic.changed?
425
+ assert_not_predicate topic, :changed?
330
426
  end
331
- end
332
-
333
- class ThreadedSerializedAttributeTest < ActiveRecord::TestCase
334
- self.use_transactional_tests = false
335
- fixtures :topics
336
427
 
337
428
  def test_serialized_attribute_works_under_concurrent_initial_access
338
- model = Topic.dup
429
+ model = Class.new(Topic)
339
430
 
340
- topic = model.last
431
+ topic = model.create!
341
432
  topic.update group: "1"
342
433
 
343
434
  model.serialize :group, JSON
@@ -345,9 +436,9 @@ class ThreadedSerializedAttributeTest < ActiveRecord::TestCase
345
436
 
346
437
  # This isn't strictly necessary for the test, but a little bit of
347
438
  # knowledge of internals allows us to make failures far more likely.
348
- model.define_singleton_method(:define_attribute) do |*args|
439
+ model.define_singleton_method(:define_attribute) do |*args, **options|
349
440
  Thread.pass
350
- super(*args)
441
+ super(*args, **options)
351
442
  end
352
443
 
353
444
  threads = 4.times.map do
@@ -0,0 +1,168 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/account"
5
+ require "models/company"
6
+ require "models/toy"
7
+ require "models/matey"
8
+
9
+ SIGNED_ID_VERIFIER_TEST_SECRET = -> { "This is normally set by the railtie initializer when used with Rails!" }
10
+
11
+ ActiveRecord::Base.signed_id_verifier_secret = SIGNED_ID_VERIFIER_TEST_SECRET
12
+
13
+ class SignedIdTest < ActiveRecord::TestCase
14
+ fixtures :accounts, :toys, :companies
15
+
16
+ setup do
17
+ @account = Account.first
18
+ @toy = Toy.first
19
+ end
20
+
21
+ test "find signed record" do
22
+ assert_equal @account, Account.find_signed(@account.signed_id)
23
+ end
24
+
25
+ test "find signed record on relation" do
26
+ assert_equal @account, Account.where("1=1").find_signed(@account.signed_id)
27
+
28
+ assert_nil Account.where("1=0").find_signed(@account.signed_id)
29
+ end
30
+
31
+ test "find signed record with custom primary key" do
32
+ assert_equal @toy, Toy.find_signed(@toy.signed_id)
33
+ end
34
+
35
+ test "find signed record for single table inheritance (STI Models)" do
36
+ assert_equal Company.first, Company.find_signed(Company.first.signed_id)
37
+ end
38
+
39
+ test "find signed record raises UnknownPrimaryKey when a model has no primary key" do
40
+ error = assert_raises(ActiveRecord::UnknownPrimaryKey) do
41
+ Matey.find_signed("this will not be even verified")
42
+ end
43
+ assert_equal "Unknown primary key for table mateys in model Matey.", error.message
44
+ end
45
+
46
+ test "find signed record with a bang" do
47
+ assert_equal @account, Account.find_signed!(@account.signed_id)
48
+ end
49
+
50
+ test "find signed record with a bang on relation" do
51
+ assert_equal @account, Account.where("1=1").find_signed!(@account.signed_id)
52
+
53
+ assert_raises(ActiveRecord::RecordNotFound) do
54
+ Account.where("1=0").find_signed!(@account.signed_id)
55
+ end
56
+ end
57
+
58
+ test "find signed record with a bang with custom primary key" do
59
+ assert_equal @toy, Toy.find_signed!(@toy.signed_id)
60
+ end
61
+
62
+ test "find signed record with a bang for single table inheritance (STI Models)" do
63
+ assert_equal Company.first, Company.find_signed!(Company.first.signed_id)
64
+ end
65
+
66
+ test "fail to find record from broken signed id" do
67
+ assert_nil Account.find_signed("this won't find anything")
68
+ end
69
+
70
+ test "find signed record within expiration date" do
71
+ assert_equal @account, Account.find_signed(@account.signed_id(expires_in: 1.minute))
72
+ end
73
+
74
+ test "fail to find signed record within expiration date" do
75
+ signed_id = @account.signed_id(expires_in: 1.minute)
76
+ travel 2.minutes
77
+ assert_nil Account.find_signed(signed_id)
78
+ end
79
+
80
+ test "fail to find record from that has since been destroyed" do
81
+ signed_id = @account.signed_id(expires_in: 1.minute)
82
+ @account.destroy
83
+ assert_nil Account.find_signed signed_id
84
+ end
85
+
86
+ test "find signed record with purpose" do
87
+ assert_equal @account, Account.find_signed(@account.signed_id(purpose: :v1), purpose: :v1)
88
+ end
89
+
90
+ test "fail to find signed record with purpose" do
91
+ assert_nil Account.find_signed(@account.signed_id(purpose: :v1))
92
+
93
+ assert_nil Account.find_signed(@account.signed_id(purpose: :v1), purpose: :v2)
94
+ end
95
+
96
+ test "finding record from broken signed id raises on the bang" do
97
+ assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
98
+ Account.find_signed! "this will blow up"
99
+ end
100
+ end
101
+
102
+ test "find signed record with a bang within expiration date" do
103
+ assert_equal @account, Account.find_signed!(@account.signed_id(expires_in: 1.minute))
104
+ end
105
+
106
+ test "finding signed record outside expiration date raises on the bang" do
107
+ signed_id = @account.signed_id(expires_in: 1.minute)
108
+ travel 2.minutes
109
+
110
+ assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
111
+ Account.find_signed!(signed_id)
112
+ end
113
+ end
114
+
115
+ test "finding signed record that has been destroyed raises on the bang" do
116
+ signed_id = @account.signed_id(expires_in: 1.minute)
117
+ @account.destroy
118
+
119
+ assert_raises(ActiveRecord::RecordNotFound) do
120
+ Account.find_signed!(signed_id)
121
+ end
122
+ end
123
+
124
+ test "find signed record with bang with purpose" do
125
+ assert_equal @account, Account.find_signed!(@account.signed_id(purpose: :v1), purpose: :v1)
126
+ end
127
+
128
+ test "find signed record with bang with purpose raises" do
129
+ assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
130
+ Account.find_signed!(@account.signed_id(purpose: :v1))
131
+ end
132
+
133
+ assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
134
+ Account.find_signed!(@account.signed_id(purpose: :v1), purpose: :v2)
135
+ end
136
+ end
137
+
138
+ test "fail to work without a signed_id_verifier_secret" do
139
+ ActiveRecord::Base.signed_id_verifier_secret = nil
140
+ Account.instance_variable_set :@signed_id_verifier, nil
141
+
142
+ assert_raises(ArgumentError) do
143
+ @account.signed_id
144
+ end
145
+ ensure
146
+ ActiveRecord::Base.signed_id_verifier_secret = SIGNED_ID_VERIFIER_TEST_SECRET
147
+ end
148
+
149
+ test "fail to work without when signed_id_verifier_secret lambda is nil" do
150
+ ActiveRecord::Base.signed_id_verifier_secret = -> { nil }
151
+ Account.instance_variable_set :@signed_id_verifier, nil
152
+
153
+ assert_raises(ArgumentError) do
154
+ @account.signed_id
155
+ end
156
+ ensure
157
+ ActiveRecord::Base.signed_id_verifier_secret = SIGNED_ID_VERIFIER_TEST_SECRET
158
+ end
159
+
160
+ test "use a custom verifier" do
161
+ old_verifier = Account.signed_id_verifier
162
+ Account.signed_id_verifier = ActiveSupport::MessageVerifier.new("sekret")
163
+ assert_not_equal ActiveRecord::Base.signed_id_verifier, Account.signed_id_verifier
164
+ assert_equal @account, Account.find_signed(@account.signed_id)
165
+ ensure
166
+ Account.signed_id_verifier = old_verifier
167
+ end
168
+ end
@@ -1,8 +1,11 @@
1
- require 'cases/helper'
2
- require 'models/book'
3
- require 'models/liquid'
4
- require 'models/molecule'
5
- require 'models/electron'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/book"
5
+ require "models/liquid"
6
+ require "models/molecule"
7
+ require "models/numeric_data"
8
+ require "models/electron"
6
9
 
7
10
  module ActiveRecord
8
11
  class StatementCacheTest < ActiveRecord::TestCase
@@ -10,22 +13,20 @@ module ActiveRecord
10
13
  @connection = ActiveRecord::Base.connection
11
14
  end
12
15
 
13
- #Cache v 1.1 tests
14
16
  def test_statement_cache
15
17
  Book.create(name: "my book")
16
18
  Book.create(name: "my other book")
17
19
 
18
20
  cache = StatementCache.create(Book.connection) do |params|
19
- Book.where(:name => params.bind)
21
+ Book.where(name: params.bind)
20
22
  end
21
23
 
22
- b = cache.execute([ "my book" ], Book, Book.connection)
24
+ b = cache.execute([ "my book" ], Book.connection)
23
25
  assert_equal "my book", b[0].name
24
- b = cache.execute([ "my other book" ], Book, Book.connection)
26
+ b = cache.execute([ "my other book" ], Book.connection)
25
27
  assert_equal "my other book", b[0].name
26
28
  end
27
29
 
28
-
29
30
  def test_statement_cache_id
30
31
  b1 = Book.create(name: "my book")
31
32
  b2 = Book.create(name: "my other book")
@@ -34,9 +35,9 @@ module ActiveRecord
34
35
  Book.where(id: params.bind)
35
36
  end
36
37
 
37
- b = cache.execute([ b1.id ], Book, Book.connection)
38
+ b = cache.execute([ b1.id ], Book.connection)
38
39
  assert_equal b1.name, b[0].name
39
- b = cache.execute([ b2.id ], Book, Book.connection)
40
+ b = cache.execute([ b2.id ], Book.connection)
40
41
  assert_equal b2.name, b[0].name
41
42
  end
42
43
 
@@ -50,8 +51,6 @@ module ActiveRecord
50
51
  assert_equal("my other book", b.name)
51
52
  end
52
53
 
53
- #End
54
-
55
54
  def test_statement_cache_with_simple_statement
56
55
  cache = ActiveRecord::StatementCache.create(Book.connection) do |params|
57
56
  Book.where(name: "my book").where("author_id > 3")
@@ -59,23 +58,28 @@ module ActiveRecord
59
58
 
60
59
  Book.create(name: "my book", author_id: 4)
61
60
 
62
- books = cache.execute([], Book, Book.connection)
61
+ books = cache.execute([], Book.connection)
63
62
  assert_equal "my book", books[0].name
64
63
  end
65
64
 
66
65
  def test_statement_cache_with_complex_statement
67
66
  cache = ActiveRecord::StatementCache.create(Book.connection) do |params|
68
- Liquid.joins(:molecules => :electrons).where('molecules.name' => 'dioxane', 'electrons.name' => 'lepton')
67
+ Liquid.joins(molecules: :electrons).where("molecules.name" => "dioxane", "electrons.name" => "lepton")
69
68
  end
70
69
 
71
- salty = Liquid.create(name: 'salty')
72
- molecule = salty.molecules.create(name: 'dioxane')
73
- molecule.electrons.create(name: 'lepton')
70
+ salty = Liquid.create(name: "salty")
71
+ molecule = salty.molecules.create(name: "dioxane")
72
+ molecule.electrons.create(name: "lepton")
74
73
 
75
- liquids = cache.execute([], Book, Book.connection)
74
+ liquids = cache.execute([], Book.connection)
76
75
  assert_equal "salty", liquids[0].name
77
76
  end
78
77
 
78
+ def test_statement_cache_with_strictly_cast_attribute
79
+ row = NumericData.create(temperature: 1.5)
80
+ assert_equal row, NumericData.find_by(temperature: 1.5)
81
+ end
82
+
79
83
  def test_statement_cache_values_differ
80
84
  cache = ActiveRecord::StatementCache.create(Book.connection) do |params|
81
85
  Book.where(name: "my book")
@@ -85,13 +89,13 @@ module ActiveRecord
85
89
  Book.create(name: "my book")
86
90
  end
87
91
 
88
- first_books = cache.execute([], Book, Book.connection)
92
+ first_books = cache.execute([], Book.connection)
89
93
 
90
94
  3.times do
91
95
  Book.create(name: "my book")
92
96
  end
93
97
 
94
- additional_books = cache.execute([], Book, Book.connection)
98
+ additional_books = cache.execute([], Book.connection)
95
99
  assert first_books != additional_books
96
100
  end
97
101
 
@@ -104,7 +108,7 @@ module ActiveRecord
104
108
  Book.find_by(name: "my other book")
105
109
  end
106
110
 
107
- refute_equal book, other_book
111
+ assert_not_equal book, other_book
108
112
  end
109
113
 
110
114
  def test_find_by_does_not_use_statement_cache_if_table_name_is_changed
@@ -114,7 +118,7 @@ module ActiveRecord
114
118
 
115
119
  # changing the table name should change the query that is not cached.
116
120
  Book.table_name = :birds
117
- assert_nil Book.find_by(name: "my book")
121
+ assert_nil Book.find_by(name: book.name)
118
122
  ensure
119
123
  Book.table_name = :books
120
124
  end
@@ -132,5 +136,18 @@ module ActiveRecord
132
136
  ensure
133
137
  Book.table_name = :books
134
138
  end
139
+
140
+ def test_find_association_does_not_use_statement_cache_if_table_name_is_changed
141
+ salty = Liquid.create(name: "salty")
142
+ molecule = salty.molecules.create(name: "dioxane")
143
+
144
+ assert_equal salty, molecule.liquid
145
+
146
+ Liquid.table_name = :birds
147
+
148
+ assert_nil molecule.reload_liquid
149
+ ensure
150
+ Liquid.table_name = :liquid
151
+ end
135
152
  end
136
153
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/book"
5
+
6
+ module ActiveRecord
7
+ class StatementInvalidTest < ActiveRecord::TestCase
8
+ fixtures :books
9
+
10
+ class MockDatabaseError < StandardError
11
+ def result
12
+ 0
13
+ end
14
+
15
+ def error_number
16
+ 0
17
+ end
18
+ end
19
+
20
+ test "message contains no sql" do
21
+ sql = Book.where(author_id: 96, cover: "hard").to_sql
22
+ error = assert_raises(ActiveRecord::StatementInvalid) do
23
+ Book.connection.send(:log, sql, Book.name) do
24
+ raise MockDatabaseError
25
+ end
26
+ end
27
+ assert_not error.message.include?("SELECT")
28
+ end
29
+
30
+ test "statement and binds are set on select" do
31
+ sql = Book.where(author_id: 96, cover: "hard").to_sql
32
+ binds = [Minitest::Mock.new, Minitest::Mock.new]
33
+ error = assert_raises(ActiveRecord::StatementInvalid) do
34
+ Book.connection.send(:log, sql, Book.name, binds) do
35
+ raise MockDatabaseError
36
+ end
37
+ end
38
+ assert_equal error.sql, sql
39
+ assert_equal error.binds, binds
40
+ end
41
+ end
42
+ end