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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
  require "models/topic"
3
5
  require "models/reply"
@@ -29,7 +31,7 @@ end
29
31
  class ReplyTitle; end
30
32
 
31
33
  class ReplyWithTitleObject < Reply
32
- validates_uniqueness_of :content, :scope => :title
34
+ validates_uniqueness_of :content, scope: :title
33
35
 
34
36
  def title; ReplyTitle.new; end
35
37
  end
@@ -41,13 +43,13 @@ end
41
43
 
42
44
  class BigIntTest < ActiveRecord::Base
43
45
  INT_MAX_VALUE = 2147483647
44
- self.table_name = 'cars'
46
+ self.table_name = "cars"
45
47
  validates :engines_count, uniqueness: true, inclusion: { in: 0..INT_MAX_VALUE }
46
48
  end
47
49
 
48
50
  class BigIntReverseTest < ActiveRecord::Base
49
51
  INT_MAX_VALUE = 2147483647
50
- self.table_name = 'cars'
52
+ self.table_name = "cars"
51
53
  validates :engines_count, inclusion: { in: 0..INT_MAX_VALUE }
52
54
  validates :engines_count, uniqueness: true
53
55
  end
@@ -60,14 +62,14 @@ class TopicWithAfterCreate < Topic
60
62
  after_create :set_author
61
63
 
62
64
  def set_author
63
- update_attributes!(:author_name => "#{title} #{id}")
65
+ update!(author_name: "#{title} #{id}")
64
66
  end
65
67
  end
66
68
 
67
69
  class UniquenessValidationTest < ActiveRecord::TestCase
68
70
  INT_MAX_VALUE = 2147483647
69
71
 
70
- fixtures :topics, 'warehouse_things'
72
+ fixtures :topics, "warehouse_things"
71
73
 
72
74
  repair_validations(Topic, Reply)
73
75
 
@@ -81,8 +83,8 @@ class UniquenessValidationTest < ActiveRecord::TestCase
81
83
  assert t.save, "Should still save t as unique"
82
84
 
83
85
  t2 = Topic.new("title" => "I'm uniqué!")
84
- assert !t2.valid?, "Shouldn't be valid"
85
- assert !t2.save, "Shouldn't save t2 as unique"
86
+ assert_not t2.valid?, "Shouldn't be valid"
87
+ assert_not t2.save, "Shouldn't save t2 as unique"
86
88
  assert_equal ["has already been taken"], t2.errors[:title]
87
89
 
88
90
  t2.title = "Now I am really also unique"
@@ -93,8 +95,8 @@ class UniquenessValidationTest < ActiveRecord::TestCase
93
95
  Topic.alias_attribute :new_title, :title
94
96
  Topic.validates_uniqueness_of(:new_title)
95
97
 
96
- topic = Topic.new(new_title: 'abc')
97
- assert topic.valid?
98
+ topic = Topic.new(new_title: "abc")
99
+ assert_predicate topic, :valid?
98
100
  end
99
101
 
100
102
  def test_validates_uniqueness_with_nil_value
@@ -104,39 +106,39 @@ class UniquenessValidationTest < ActiveRecord::TestCase
104
106
  assert t.save, "Should save t as unique"
105
107
 
106
108
  t2 = Topic.new("title" => nil)
107
- assert !t2.valid?, "Shouldn't be valid"
108
- assert !t2.save, "Shouldn't save t2 as unique"
109
+ assert_not t2.valid?, "Shouldn't be valid"
110
+ assert_not t2.save, "Shouldn't save t2 as unique"
109
111
  assert_equal ["has already been taken"], t2.errors[:title]
110
112
  end
111
113
 
112
114
  def test_validates_uniqueness_with_validates
113
- Topic.validates :title, :uniqueness => true
114
- Topic.create!('title' => 'abc')
115
+ Topic.validates :title, uniqueness: true
116
+ Topic.create!("title" => "abc")
115
117
 
116
- t2 = Topic.new('title' => 'abc')
117
- assert !t2.valid?
118
+ t2 = Topic.new("title" => "abc")
119
+ assert_not_predicate t2, :valid?
118
120
  assert t2.errors[:title]
119
121
  end
120
122
 
121
123
  def test_validate_uniqueness_when_integer_out_of_range
122
124
  entry = BigIntTest.create(engines_count: INT_MAX_VALUE + 1)
123
- assert_equal entry.errors[:engines_count], ['is not included in the list']
125
+ assert_equal entry.errors[:engines_count], ["is not included in the list"]
124
126
  end
125
127
 
126
128
  def test_validate_uniqueness_when_integer_out_of_range_show_order_does_not_matter
127
129
  entry = BigIntReverseTest.create(engines_count: INT_MAX_VALUE + 1)
128
- assert_equal entry.errors[:engines_count], ['is not included in the list']
130
+ assert_equal entry.errors[:engines_count], ["is not included in the list"]
129
131
  end
130
132
 
131
133
  def test_validates_uniqueness_with_newline_chars
132
- Topic.validates_uniqueness_of(:title, :case_sensitive => false)
134
+ Topic.validates_uniqueness_of(:title, case_sensitive: false)
133
135
 
134
136
  t = Topic.new("title" => "new\nline")
135
137
  assert t.save, "Should save t as unique"
136
138
  end
137
139
 
138
140
  def test_validate_uniqueness_with_scope
139
- Reply.validates_uniqueness_of(:content, :scope => "parent_id")
141
+ Reply.validates_uniqueness_of(:content, scope: "parent_id")
140
142
 
141
143
  t = Topic.create("title" => "I'm unique!")
142
144
 
@@ -144,7 +146,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
144
146
  assert r1.valid?, "Saving r1"
145
147
 
146
148
  r2 = t.replies.create "title" => "r2", "content" => "hello world"
147
- assert !r2.valid?, "Saving r2 first time"
149
+ assert_not r2.valid?, "Saving r2 first time"
148
150
 
149
151
  r2.content = "something else"
150
152
  assert r2.save, "Saving r2 second time"
@@ -154,8 +156,34 @@ class UniquenessValidationTest < ActiveRecord::TestCase
154
156
  assert r3.valid?, "Saving r3"
155
157
  end
156
158
 
159
+ def test_validate_uniqueness_with_aliases
160
+ Reply.validates_uniqueness_of(:new_content, scope: :new_parent_id)
161
+
162
+ t = Topic.create(title: "I'm unique!")
163
+
164
+ r1 = t.replies.create(title: "r1", content: "hello world")
165
+ assert_predicate r1, :valid?, "Saving r1"
166
+
167
+ r2 = t.replies.create(title: "r2", content: "hello world")
168
+ assert_not_predicate r2, :valid?, "Saving r2 first time"
169
+
170
+ r2.content = "something else"
171
+ assert r2.save, "Saving r2 second time"
172
+
173
+ t2 = Topic.create("title" => "I'm unique too!")
174
+ r3 = t2.replies.create(title: "r3", content: "hello world")
175
+ assert_predicate r3, :valid?, "Saving r3"
176
+ end
177
+
178
+ def test_validate_uniqueness_with_scope_invalid_syntax
179
+ error = assert_raises(ArgumentError) do
180
+ Reply.validates_uniqueness_of(:content, scope: { parent_id: false })
181
+ end
182
+ assert_match(/Pass a symbol or an array of symbols instead/, error.to_s)
183
+ end
184
+
157
185
  def test_validate_uniqueness_with_object_scope
158
- Reply.validates_uniqueness_of(:content, :scope => :topic)
186
+ Reply.validates_uniqueness_of(:content, scope: :topic)
159
187
 
160
188
  t = Topic.create("title" => "I'm unique!")
161
189
 
@@ -163,7 +191,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
163
191
  assert r1.valid?, "Saving r1"
164
192
 
165
193
  r2 = t.replies.create "title" => "r2", "content" => "hello world"
166
- assert !r2.valid?, "Saving r2 first time"
194
+ assert_not r2.valid?, "Saving r2 first time"
167
195
  end
168
196
 
169
197
  def test_validate_uniqueness_with_polymorphic_object_scope
@@ -184,7 +212,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
184
212
  assert r1.valid?, "Saving r1"
185
213
 
186
214
  r2 = ReplyWithTitleObject.create "title" => "r1", "content" => "hello world"
187
- assert !r2.valid?, "Saving r2 first time"
215
+ assert_not r2.valid?, "Saving r2 first time"
188
216
  end
189
217
 
190
218
  def test_validate_uniqueness_with_object_arg
@@ -196,7 +224,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
196
224
  assert r1.valid?, "Saving r1"
197
225
 
198
226
  r2 = t.replies.create "title" => "r2", "content" => "hello world"
199
- assert !r2.valid?, "Saving r2 first time"
227
+ assert_not r2.valid?, "Saving r2 first time"
200
228
  end
201
229
 
202
230
  def test_validate_uniqueness_scoped_to_defining_class
@@ -206,7 +234,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
206
234
  assert r1.valid?, "Saving r1"
207
235
 
208
236
  r2 = t.silly_unique_replies.create "title" => "r2", "content" => "a barrel of fun"
209
- assert !r2.valid?, "Saving r2"
237
+ assert_not r2.valid?, "Saving r2"
210
238
 
211
239
  # Should succeed as validates_uniqueness_of only applies to
212
240
  # UniqueReply and its subclasses
@@ -215,7 +243,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
215
243
  end
216
244
 
217
245
  def test_validate_uniqueness_with_scope_array
218
- Reply.validates_uniqueness_of(:author_name, :scope => [:author_email_address, :parent_id])
246
+ Reply.validates_uniqueness_of(:author_name, scope: [:author_email_address, :parent_id])
219
247
 
220
248
  t = Topic.create("title" => "The earth is actually flat!")
221
249
 
@@ -223,23 +251,23 @@ class UniquenessValidationTest < ActiveRecord::TestCase
223
251
  assert r1.valid?, "Saving r1"
224
252
 
225
253
  r2 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy@rubyonrails.com", "title" => "You're crazy!", "content" => "Crazy reply again..."
226
- assert !r2.valid?, "Saving r2. Double reply by same author."
254
+ assert_not r2.valid?, "Saving r2. Double reply by same author."
227
255
 
228
256
  r2.author_email_address = "jeremy_alt_email@rubyonrails.com"
229
257
  assert r2.save, "Saving r2 the second time."
230
258
 
231
259
  r3 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy_alt_email@rubyonrails.com", "title" => "You're wrong", "content" => "It's cubic"
232
- assert !r3.valid?, "Saving r3"
260
+ assert_not r3.valid?, "Saving r3"
233
261
 
234
262
  r3.author_name = "jj"
235
263
  assert r3.save, "Saving r3 the second time."
236
264
 
237
265
  r3.author_name = "jeremy"
238
- assert !r3.save, "Saving r3 the third time."
266
+ assert_not r3.save, "Saving r3 the third time."
239
267
  end
240
268
 
241
269
  def test_validate_case_insensitive_uniqueness
242
- Topic.validates_uniqueness_of(:title, :parent_id, :case_sensitive => false, :allow_nil => true)
270
+ Topic.validates_uniqueness_of(:title, :parent_id, case_sensitive: false, allow_nil: true)
243
271
 
244
272
  t = Topic.new("title" => "I'm unique!", :parent_id => 2)
245
273
  assert t.save, "Should save t as unique"
@@ -248,17 +276,17 @@ class UniquenessValidationTest < ActiveRecord::TestCase
248
276
  assert t.save, "Should still save t as unique"
249
277
 
250
278
  t2 = Topic.new("title" => "I'm UNIQUE!", :parent_id => 1)
251
- assert !t2.valid?, "Shouldn't be valid"
252
- assert !t2.save, "Shouldn't save t2 as unique"
253
- assert t2.errors[:title].any?
254
- assert t2.errors[:parent_id].any?
279
+ assert_not t2.valid?, "Shouldn't be valid"
280
+ assert_not t2.save, "Shouldn't save t2 as unique"
281
+ assert_predicate t2.errors[:title], :any?
282
+ assert_predicate t2.errors[:parent_id], :any?
255
283
  assert_equal ["has already been taken"], t2.errors[:title]
256
284
 
257
285
  t2.title = "I'm truly UNIQUE!"
258
- assert !t2.valid?, "Shouldn't be valid"
259
- assert !t2.save, "Shouldn't save t2 as unique"
260
- assert t2.errors[:title].empty?
261
- assert t2.errors[:parent_id].any?
286
+ assert_not t2.valid?, "Shouldn't be valid"
287
+ assert_not t2.save, "Shouldn't save t2 as unique"
288
+ assert_empty t2.errors[:title]
289
+ assert_predicate t2.errors[:parent_id], :any?
262
290
 
263
291
  t2.parent_id = 4
264
292
  assert t2.save, "Should now save t2 as unique"
@@ -272,15 +300,15 @@ class UniquenessValidationTest < ActiveRecord::TestCase
272
300
  assert t_utf8.save, "Should save t_utf8 as unique"
273
301
 
274
302
  # If database hasn't UTF-8 character set, this test fails
275
- if Topic.all.merge!(:select => 'LOWER(title) AS title').find(t_utf8.id).title == "я тоже уникальный!"
303
+ if Topic.all.merge!(select: "LOWER(title) AS title").find(t_utf8.id).title == "я тоже уникальный!"
276
304
  t2_utf8 = Topic.new("title" => "я тоже УНИКАЛЬНЫЙ!")
277
- assert !t2_utf8.valid?, "Shouldn't be valid"
278
- assert !t2_utf8.save, "Shouldn't save t2_utf8 as unique"
305
+ assert_not t2_utf8.valid?, "Shouldn't be valid"
306
+ assert_not t2_utf8.save, "Shouldn't save t2_utf8 as unique"
279
307
  end
280
308
  end
281
309
 
282
310
  def test_validate_case_sensitive_uniqueness_with_special_sql_like_chars
283
- Topic.validates_uniqueness_of(:title, :case_sensitive => true)
311
+ Topic.validates_uniqueness_of(:title, case_sensitive: true)
284
312
 
285
313
  t = Topic.new("title" => "I'm unique!")
286
314
  assert t.save, "Should save t as unique"
@@ -293,7 +321,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
293
321
  end
294
322
 
295
323
  def test_validate_case_insensitive_uniqueness_with_special_sql_like_chars
296
- Topic.validates_uniqueness_of(:title, :case_sensitive => false)
324
+ Topic.validates_uniqueness_of(:title, case_sensitive: false)
297
325
 
298
326
  t = Topic.new("title" => "I'm unique!")
299
327
  assert t.save, "Should save t as unique"
@@ -305,8 +333,33 @@ class UniquenessValidationTest < ActiveRecord::TestCase
305
333
  assert t3.save, "Should save t3 as unique"
306
334
  end
307
335
 
336
+ def test_validate_uniqueness_by_default_database_collation
337
+ Topic.validates_uniqueness_of(:author_email_address)
338
+
339
+ topic1 = Topic.new(author_email_address: "david@loudthinking.com")
340
+ topic2 = Topic.new(author_email_address: "David@loudthinking.com")
341
+
342
+ assert_equal 1, Topic.where(author_email_address: "david@loudthinking.com").count
343
+
344
+ assert_not topic1.valid?
345
+ assert_not topic1.save
346
+
347
+ if current_adapter?(:Mysql2Adapter)
348
+ # Case insensitive collation (utf8mb4_0900_ai_ci) by default.
349
+ # Should not allow "David" if "david" exists.
350
+ assert_not topic2.valid?
351
+ assert_not topic2.save
352
+ else
353
+ assert topic2.valid?
354
+ assert topic2.save
355
+ end
356
+
357
+ assert_equal 1, Topic.where(author_email_address: "david@loudthinking.com").count
358
+ assert_equal 1, Topic.where(author_email_address: "David@loudthinking.com").count
359
+ end
360
+
308
361
  def test_validate_case_sensitive_uniqueness
309
- Topic.validates_uniqueness_of(:title, :case_sensitive => true, :allow_nil => true)
362
+ Topic.validates_uniqueness_of(:title, case_sensitive: true, allow_nil: true)
310
363
 
311
364
  t = Topic.new("title" => "I'm unique!")
312
365
  assert t.save, "Should save t as unique"
@@ -317,41 +370,41 @@ class UniquenessValidationTest < ActiveRecord::TestCase
317
370
  t2 = Topic.new("title" => "I'M UNIQUE!")
318
371
  assert t2.valid?, "Should be valid"
319
372
  assert t2.save, "Should save t2 as unique"
320
- assert t2.errors[:title].empty?
321
- assert t2.errors[:parent_id].empty?
373
+ assert_empty t2.errors[:title]
374
+ assert_empty t2.errors[:parent_id]
322
375
  assert_not_equal ["has already been taken"], t2.errors[:title]
323
376
 
324
377
  t3 = Topic.new("title" => "I'M uNiQUe!")
325
378
  assert t3.valid?, "Should be valid"
326
379
  assert t3.save, "Should save t2 as unique"
327
- assert t3.errors[:title].empty?
328
- assert t3.errors[:parent_id].empty?
380
+ assert_empty t3.errors[:title]
381
+ assert_empty t3.errors[:parent_id]
329
382
  assert_not_equal ["has already been taken"], t3.errors[:title]
330
383
  end
331
384
 
332
385
  def test_validate_case_sensitive_uniqueness_with_attribute_passed_as_integer
333
- Topic.validates_uniqueness_of(:title, :case_sensitive => true)
334
- Topic.create!('title' => 101)
386
+ Topic.validates_uniqueness_of(:title, case_sensitive: true)
387
+ Topic.create!("title" => 101)
335
388
 
336
- t2 = Topic.new('title' => 101)
337
- assert !t2.valid?
389
+ t2 = Topic.new("title" => 101)
390
+ assert_not_predicate t2, :valid?
338
391
  assert t2.errors[:title]
339
392
  end
340
393
 
341
394
  def test_validate_uniqueness_with_non_standard_table_names
342
- i1 = WarehouseThing.create(:value => 1000)
343
- assert !i1.valid?, "i1 should not be valid"
395
+ i1 = WarehouseThing.create(value: 1000)
396
+ assert_not i1.valid?, "i1 should not be valid"
344
397
  assert i1.errors[:value].any?, "Should not be empty"
345
398
  end
346
399
 
347
400
  def test_validates_uniqueness_inside_scoping
348
401
  Topic.validates_uniqueness_of(:title)
349
402
 
350
- Topic.where(:author_name => "David").scoping do
403
+ Topic.where(author_name: "David").scoping do
351
404
  t1 = Topic.new("title" => "I'm unique!", "author_name" => "Mary")
352
405
  assert t1.save
353
406
  t2 = Topic.new("title" => "I'm unique!", "author_name" => "David")
354
- assert !t2.valid?
407
+ assert_not_predicate t2, :valid?
355
408
  end
356
409
  end
357
410
 
@@ -385,7 +438,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
385
438
 
386
439
  def test_validate_uniqueness_with_limit_and_utf8
387
440
  if current_adapter?(:SQLite3Adapter)
388
- # Event.title has limit 5, but does SQLite doesn't truncate.
441
+ # Event.title has limit 5, but SQLite doesn't truncate.
389
442
  e1 = Event.create(title: "一二三四五六七八")
390
443
  assert e1.valid?, "Could not create an event with a unique 8 characters title"
391
444
 
@@ -403,30 +456,30 @@ class UniquenessValidationTest < ActiveRecord::TestCase
403
456
  end
404
457
 
405
458
  def test_validate_straight_inheritance_uniqueness
406
- w1 = IneptWizard.create(:name => "Rincewind", :city => "Ankh-Morpork")
459
+ w1 = IneptWizard.create(name: "Rincewind", city: "Ankh-Morpork")
407
460
  assert w1.valid?, "Saving w1"
408
461
 
409
462
  # Should use validation from base class (which is abstract)
410
- w2 = IneptWizard.new(:name => "Rincewind", :city => "Quirm")
411
- assert !w2.valid?, "w2 shouldn't be valid"
463
+ w2 = IneptWizard.new(name: "Rincewind", city: "Quirm")
464
+ assert_not w2.valid?, "w2 shouldn't be valid"
412
465
  assert w2.errors[:name].any?, "Should have errors for name"
413
466
  assert_equal ["has already been taken"], w2.errors[:name], "Should have uniqueness message for name"
414
467
 
415
- w3 = Conjurer.new(:name => "Rincewind", :city => "Quirm")
416
- assert !w3.valid?, "w3 shouldn't be valid"
468
+ w3 = Conjurer.new(name: "Rincewind", city: "Quirm")
469
+ assert_not w3.valid?, "w3 shouldn't be valid"
417
470
  assert w3.errors[:name].any?, "Should have errors for name"
418
471
  assert_equal ["has already been taken"], w3.errors[:name], "Should have uniqueness message for name"
419
472
 
420
- w4 = Conjurer.create(:name => "The Amazing Bonko", :city => "Quirm")
473
+ w4 = Conjurer.create(name: "The Amazing Bonko", city: "Quirm")
421
474
  assert w4.valid?, "Saving w4"
422
475
 
423
- w5 = Thaumaturgist.new(:name => "The Amazing Bonko", :city => "Lancre")
424
- assert !w5.valid?, "w5 shouldn't be valid"
476
+ w5 = Thaumaturgist.new(name: "The Amazing Bonko", city: "Lancre")
477
+ assert_not w5.valid?, "w5 shouldn't be valid"
425
478
  assert w5.errors[:name].any?, "Should have errors for name"
426
479
  assert_equal ["has already been taken"], w5.errors[:name], "Should have uniqueness message for name"
427
480
 
428
- w6 = Thaumaturgist.new(:name => "Mustrum Ridcully", :city => "Quirm")
429
- assert !w6.valid?, "w6 shouldn't be valid"
481
+ w6 = Thaumaturgist.new(name: "Mustrum Ridcully", city: "Quirm")
482
+ assert_not w6.valid?, "w6 shouldn't be valid"
430
483
  assert w6.errors[:city].any?, "Should have errors for city"
431
484
  assert_equal ["has already been taken"], w6.errors[:city], "Should have uniqueness message for city"
432
485
  end
@@ -437,7 +490,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
437
490
  Topic.create("title" => "I'm an unapproved topic", "approved" => false)
438
491
 
439
492
  t3 = Topic.new("title" => "I'm a topic", "approved" => true)
440
- assert !t3.valid?, "t3 shouldn't be valid"
493
+ assert_not t3.valid?, "t3 shouldn't be valid"
441
494
 
442
495
  t4 = Topic.new("title" => "I'm an unapproved topic", "approved" => false)
443
496
  assert t4.valid?, "t4 should be valid"
@@ -449,18 +502,35 @@ class UniquenessValidationTest < ActiveRecord::TestCase
449
502
  }
450
503
  end
451
504
 
505
+ def test_validate_uniqueness_with_conditions_with_record_arg
506
+ Topic.validates_uniqueness_of :title, conditions: ->(record) {
507
+ where(written_on: record.written_on.beginning_of_day..record.written_on.end_of_day)
508
+ }
509
+
510
+ today_midday = Time.current.midday
511
+
512
+ todays_topic = Topic.new(title: "Highlights of the Day", written_on: today_midday)
513
+ assert todays_topic.save, "1st topic written today with this title should save"
514
+
515
+ todays_topic_duplicate = Topic.new(title: "Highlights of the Day", written_on: today_midday + 1.minute)
516
+ assert todays_topic_duplicate.invalid?, "2nd topic written today with this title should be invalid"
517
+
518
+ tomorrows_topic = Topic.new(title: "Highlights of the Day", written_on: today_midday + 1.day)
519
+ assert tomorrows_topic.valid?, "1st topic written tomorrow with this title should be valid"
520
+ end
521
+
452
522
  def test_validate_uniqueness_on_existing_relation
453
523
  event = Event.create
454
- assert TopicWithUniqEvent.create(event: event).valid?
524
+ assert_predicate TopicWithUniqEvent.create(event: event), :valid?
455
525
 
456
526
  topic = TopicWithUniqEvent.new(event: event)
457
- assert_not topic.valid?
458
- assert_equal ['has already been taken'], topic.errors[:event]
527
+ assert_not_predicate topic, :valid?
528
+ assert_equal ["has already been taken"], topic.errors[:event]
459
529
  end
460
530
 
461
531
  def test_validate_uniqueness_on_empty_relation
462
532
  topic = TopicWithUniqEvent.new
463
- assert topic.valid?
533
+ assert_predicate topic, :valid?
464
534
  end
465
535
 
466
536
  def test_validate_uniqueness_of_custom_primary_key
@@ -479,7 +549,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
479
549
  key2 = klass.create!(key_number: 11)
480
550
 
481
551
  key2.key_number = 10
482
- assert_not key2.valid?
552
+ assert_not_predicate key2, :valid?
483
553
  end
484
554
 
485
555
  def test_validate_uniqueness_without_primary_key
@@ -492,8 +562,8 @@ class UniquenessValidationTest < ActiveRecord::TestCase
492
562
  end
493
563
 
494
564
  abc = klass.create!(dashboard_id: "abc")
495
- assert klass.new(dashboard_id: "xyz").valid?
496
- assert_not klass.new(dashboard_id: "abc").valid?
565
+ assert_predicate klass.new(dashboard_id: "xyz"), :valid?
566
+ assert_not_predicate klass.new(dashboard_id: "abc"), :valid?
497
567
 
498
568
  abc.dashboard_id = "def"
499
569
 
@@ -501,7 +571,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
501
571
  abc.save!
502
572
  end
503
573
  assert_match(/\AUnknown primary key for table dashboards in model/, e.message)
504
- assert_match(/Can not validate uniqueness for persisted record without primary key.\z/, e.message)
574
+ assert_match(/Cannot validate uniqueness for persisted record without primary key.\z/, e.message)
505
575
  end
506
576
 
507
577
  def test_validate_uniqueness_ignores_itself_when_primary_key_changed
@@ -517,31 +587,31 @@ class UniquenessValidationTest < ActiveRecord::TestCase
517
587
 
518
588
  def test_validate_uniqueness_with_after_create_performing_save
519
589
  TopicWithAfterCreate.validates_uniqueness_of(:title)
520
- topic = TopicWithAfterCreate.create!(:title => "Title1")
590
+ topic = TopicWithAfterCreate.create!(title: "Title1")
521
591
  assert topic.author_name.start_with?("Title1")
522
592
 
523
- topic2 = TopicWithAfterCreate.new(:title => "Title1")
524
- refute topic2.valid?
593
+ topic2 = TopicWithAfterCreate.new(title: "Title1")
594
+ assert_not_predicate topic2, :valid?
525
595
  assert_equal(["has already been taken"], topic2.errors[:title])
526
596
  end
527
597
 
528
598
  def test_validate_uniqueness_uuid
529
599
  skip unless current_adapter?(:PostgreSQLAdapter)
530
- item = UuidItem.create!(uuid: SecureRandom.uuid, title: 'item1')
531
- item.update(title: 'item1-title2')
600
+ item = UuidItem.create!(uuid: SecureRandom.uuid, title: "item1")
601
+ item.update(title: "item1-title2")
532
602
  assert_empty item.errors
533
603
 
534
- item2 = UuidValidatingItem.create!(uuid: SecureRandom.uuid, title: 'item2')
535
- item2.update(title: 'item2-title2')
604
+ item2 = UuidValidatingItem.create!(uuid: SecureRandom.uuid, title: "item2")
605
+ item2.update(title: "item2-title2")
536
606
  assert_empty item2.errors
537
607
  end
538
608
 
539
609
  def test_validate_uniqueness_regular_id
540
- item = CoolTopic.create!(title: 'MyItem')
610
+ item = CoolTopic.create!(title: "MyItem")
541
611
  assert_empty item.errors
542
612
 
543
- item2 = CoolTopic.new(id: item.id, title: 'MyItem2')
544
- refute item2.valid?
613
+ item2 = CoolTopic.new(id: item.id, title: "MyItem2")
614
+ assert_not_predicate item2, :valid?
545
615
 
546
616
  assert_equal(["has already been taken"], item2.errors[:id])
547
617
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ValidationsRepairHelper
3
5
  extend ActiveSupport::Concern