ibm_db 5.1.0-x86-mingw32 → 5.3.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (624) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +14 -14
  5. data/ext/extconf.rb +4 -4
  6. data/ext/ibm_db.c +62 -57
  7. data/ext/ibm_db.o +0 -0
  8. data/ext/ibm_db.so +0 -0
  9. data/ext/mkmf.log +11 -11
  10. data/ext/ruby_ibm_db_cli.c +1 -0
  11. data/ext/ruby_ibm_db_cli.o +0 -0
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  13. data/lib/ibm_db.so +1 -0
  14. data/lib/mswin32/ibm_db.rb +7 -3
  15. data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  18. data/test/activejob/destroy_association_async_test.rb +305 -0
  19. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  20. data/test/activejob/helper.rb +15 -0
  21. data/test/assets/schema_dump_5_1.yml +345 -0
  22. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  23. data/test/cases/adapter_test.rb +432 -218
  24. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  25. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  27. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  30. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  31. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  33. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  34. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  35. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  36. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  37. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  38. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  39. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  40. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  41. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  42. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  43. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  44. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  45. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  46. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  47. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  48. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  50. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  52. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  55. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  56. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  57. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  58. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  59. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  60. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  61. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  62. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  63. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  64. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  65. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  66. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  67. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  69. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  70. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  71. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  72. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  73. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  74. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  75. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  76. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  77. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  78. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  79. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  80. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  83. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  84. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  85. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  86. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  87. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  88. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  89. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  90. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  91. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  92. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  93. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  94. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  95. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  96. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  97. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  98. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  99. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  100. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  101. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  102. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  103. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  104. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  106. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  107. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  108. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  109. data/test/cases/aggregations_test.rb +14 -12
  110. data/test/cases/annotate_test.rb +46 -0
  111. data/test/cases/ar_schema_test.rb +153 -86
  112. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  113. data/test/cases/arel/attributes/math_test.rb +83 -0
  114. data/test/cases/arel/attributes_test.rb +27 -0
  115. data/test/cases/arel/collectors/bind_test.rb +40 -0
  116. data/test/cases/arel/collectors/composite_test.rb +47 -0
  117. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  118. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  119. data/test/cases/arel/crud_test.rb +65 -0
  120. data/test/cases/arel/delete_manager_test.rb +53 -0
  121. data/test/cases/arel/factory_methods_test.rb +46 -0
  122. data/test/cases/arel/helper.rb +45 -0
  123. data/test/cases/arel/insert_manager_test.rb +241 -0
  124. data/test/cases/arel/nodes/and_test.rb +30 -0
  125. data/test/cases/arel/nodes/as_test.rb +36 -0
  126. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  127. data/test/cases/arel/nodes/bin_test.rb +35 -0
  128. data/test/cases/arel/nodes/binary_test.rb +29 -0
  129. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  130. data/test/cases/arel/nodes/case_test.rb +96 -0
  131. data/test/cases/arel/nodes/casted_test.rb +18 -0
  132. data/test/cases/arel/nodes/comment_test.rb +22 -0
  133. data/test/cases/arel/nodes/count_test.rb +35 -0
  134. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  135. data/test/cases/arel/nodes/descending_test.rb +46 -0
  136. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  137. data/test/cases/arel/nodes/equality_test.rb +62 -0
  138. data/test/cases/arel/nodes/extract_test.rb +43 -0
  139. data/test/cases/arel/nodes/false_test.rb +21 -0
  140. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  141. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  142. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  143. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  144. data/test/cases/arel/nodes/node_test.rb +22 -0
  145. data/test/cases/arel/nodes/not_test.rb +31 -0
  146. data/test/cases/arel/nodes/or_test.rb +36 -0
  147. data/test/cases/arel/nodes/over_test.rb +69 -0
  148. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  149. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  150. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  151. data/test/cases/arel/nodes/sum_test.rb +35 -0
  152. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  153. data/test/cases/arel/nodes/true_test.rb +21 -0
  154. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  155. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  156. data/test/cases/arel/nodes/window_test.rb +81 -0
  157. data/test/cases/arel/nodes_test.rb +34 -0
  158. data/test/cases/arel/select_manager_test.rb +1238 -0
  159. data/test/cases/arel/support/fake_record.rb +135 -0
  160. data/test/cases/arel/table_test.rb +216 -0
  161. data/test/cases/arel/update_manager_test.rb +126 -0
  162. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  163. data/test/cases/arel/visitors/dot_test.rb +90 -0
  164. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  165. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  166. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  167. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  168. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  169. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  170. data/test/cases/associations/callbacks_test.rb +56 -38
  171. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  172. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  173. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  174. data/test/cases/associations/eager_singularization_test.rb +21 -21
  175. data/test/cases/associations/eager_test.rb +559 -415
  176. data/test/cases/associations/extension_test.rb +18 -12
  177. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  178. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  179. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  180. data/test/cases/associations/has_one_associations_test.rb +294 -129
  181. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  182. data/test/cases/associations/inner_join_association_test.rb +114 -38
  183. data/test/cases/associations/inverse_associations_test.rb +606 -398
  184. data/test/cases/associations/join_model_test.rb +158 -148
  185. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  186. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  187. data/test/cases/associations/required_test.rb +35 -10
  188. data/test/cases/associations_test.rb +241 -110
  189. data/test/cases/attribute_methods/read_test.rb +11 -11
  190. data/test/cases/attribute_methods_test.rb +413 -298
  191. data/test/cases/attributes_test.rb +145 -27
  192. data/test/cases/autosave_association_test.rb +681 -436
  193. data/test/cases/base_prevent_writes_test.rb +229 -0
  194. data/test/cases/base_test.rb +599 -542
  195. data/test/cases/batches_test.rb +288 -82
  196. data/test/cases/binary_test.rb +26 -31
  197. data/test/cases/bind_parameter_test.rb +194 -21
  198. data/test/cases/boolean_test.rb +52 -0
  199. data/test/cases/cache_key_test.rb +110 -5
  200. data/test/cases/calculations_test.rb +740 -177
  201. data/test/cases/callbacks_test.rb +74 -207
  202. data/test/cases/clone_test.rb +15 -10
  203. data/test/cases/coders/json_test.rb +2 -0
  204. data/test/cases/coders/yaml_column_test.rb +16 -13
  205. data/test/cases/collection_cache_key_test.rb +177 -20
  206. data/test/cases/column_alias_test.rb +9 -7
  207. data/test/cases/column_definition_test.rb +10 -68
  208. data/test/cases/comment_test.rb +166 -107
  209. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  210. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  211. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  212. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  213. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  214. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  215. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  217. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  218. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  219. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  220. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  221. data/test/cases/connection_management_test.rb +13 -11
  222. data/test/cases/connection_pool_test.rb +316 -83
  223. data/test/cases/core_test.rb +82 -58
  224. data/test/cases/counter_cache_test.rb +204 -50
  225. data/test/cases/custom_locking_test.rb +5 -3
  226. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  227. data/test/cases/database_configurations/resolver_test.rb +150 -0
  228. data/test/cases/database_configurations_test.rb +145 -0
  229. data/test/cases/database_selector_test.rb +296 -0
  230. data/test/cases/database_statements_test.rb +18 -16
  231. data/test/cases/date_test.rb +8 -16
  232. data/test/cases/date_time_precision_test.rb +100 -78
  233. data/test/cases/date_time_test.rb +23 -8
  234. data/test/cases/defaults_test.rb +106 -71
  235. data/test/cases/delegated_type_test.rb +57 -0
  236. data/test/cases/dirty_test.rb +419 -223
  237. data/test/cases/disconnected_test.rb +6 -6
  238. data/test/cases/dup_test.rb +54 -27
  239. data/test/cases/enum_test.rb +461 -82
  240. data/test/cases/errors_test.rb +7 -7
  241. data/test/cases/explain_subscriber_test.rb +17 -15
  242. data/test/cases/explain_test.rb +11 -19
  243. data/test/cases/filter_attributes_test.rb +153 -0
  244. data/test/cases/finder_respond_to_test.rb +14 -14
  245. data/test/cases/finder_test.rb +669 -287
  246. data/test/cases/fixture_set/file_test.rb +34 -38
  247. data/test/cases/fixtures_test.rb +833 -176
  248. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  249. data/test/cases/habtm_destroy_order_test.rb +25 -25
  250. data/test/cases/helper.rb +78 -49
  251. data/test/cases/hot_compatibility_test.rb +33 -32
  252. data/test/cases/i18n_test.rb +18 -17
  253. data/test/cases/inheritance_test.rb +180 -115
  254. data/test/cases/insert_all_test.rb +489 -0
  255. data/test/cases/instrumentation_test.rb +101 -0
  256. data/test/cases/integration_test.rb +119 -31
  257. data/test/cases/invalid_connection_test.rb +18 -16
  258. data/test/cases/invertible_migration_test.rb +183 -43
  259. data/test/cases/json_attribute_test.rb +35 -0
  260. data/test/cases/json_serialization_test.rb +57 -58
  261. data/test/cases/json_shared_test_cases.rb +290 -0
  262. data/test/cases/locking_test.rb +413 -119
  263. data/test/cases/log_subscriber_test.rb +68 -26
  264. data/test/cases/marshal_serialization_test.rb +39 -0
  265. data/test/cases/migration/change_schema_test.rb +118 -72
  266. data/test/cases/migration/change_table_test.rb +138 -30
  267. data/test/cases/migration/check_constraint_test.rb +162 -0
  268. data/test/cases/migration/column_attributes_test.rb +45 -35
  269. data/test/cases/migration/column_positioning_test.rb +18 -6
  270. data/test/cases/migration/columns_test.rb +93 -77
  271. data/test/cases/migration/command_recorder_test.rb +121 -34
  272. data/test/cases/migration/compatibility_test.rb +578 -23
  273. data/test/cases/migration/create_join_table_test.rb +35 -25
  274. data/test/cases/migration/foreign_key_test.rb +503 -284
  275. data/test/cases/migration/helper.rb +4 -3
  276. data/test/cases/migration/index_test.rb +119 -70
  277. data/test/cases/migration/logger_test.rb +9 -6
  278. data/test/cases/migration/pending_migrations_test.rb +88 -34
  279. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  280. data/test/cases/migration/references_index_test.rb +38 -19
  281. data/test/cases/migration/references_statements_test.rb +15 -14
  282. data/test/cases/migration/rename_table_test.rb +53 -30
  283. data/test/cases/migration_test.rb +637 -269
  284. data/test/cases/migrator_test.rb +191 -135
  285. data/test/cases/mixin_test.rb +7 -11
  286. data/test/cases/modules_test.rb +36 -34
  287. data/test/cases/multi_db_migrator_test.rb +223 -0
  288. data/test/cases/multiparameter_attributes_test.rb +60 -33
  289. data/test/cases/multiple_db_test.rb +16 -22
  290. data/test/cases/nested_attributes_test.rb +341 -320
  291. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  292. data/test/cases/null_relation_test.rb +84 -0
  293. data/test/cases/numeric_data_test.rb +93 -0
  294. data/test/cases/persistence_test.rb +361 -269
  295. data/test/cases/pooled_connections_test.rb +18 -26
  296. data/test/cases/prepared_statement_status_test.rb +48 -0
  297. data/test/cases/primary_keys_test.rb +210 -104
  298. data/test/cases/query_cache_test.rb +610 -141
  299. data/test/cases/quoting_test.rb +132 -31
  300. data/test/cases/readonly_test.rb +49 -48
  301. data/test/cases/reaper_test.rb +146 -32
  302. data/test/cases/reflection_test.rb +167 -156
  303. data/test/cases/relation/delegation_test.rb +49 -36
  304. data/test/cases/relation/delete_all_test.rb +117 -0
  305. data/test/cases/relation/merging_test.rb +319 -42
  306. data/test/cases/relation/mutation_test.rb +55 -93
  307. data/test/cases/relation/or_test.rb +129 -29
  308. data/test/cases/relation/predicate_builder_test.rb +21 -6
  309. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  310. data/test/cases/relation/select_test.rb +67 -0
  311. data/test/cases/relation/update_all_test.rb +317 -0
  312. data/test/cases/relation/where_chain_test.rb +68 -32
  313. data/test/cases/relation/where_clause_test.rb +136 -61
  314. data/test/cases/relation/where_test.rb +155 -48
  315. data/test/cases/relation_test.rb +266 -112
  316. data/test/cases/relations_test.rb +969 -744
  317. data/test/cases/reload_models_test.rb +13 -9
  318. data/test/cases/reserved_word_test.rb +141 -0
  319. data/test/cases/result_test.rb +68 -17
  320. data/test/cases/sanitize_test.rb +87 -71
  321. data/test/cases/schema_dumper_test.rb +221 -128
  322. data/test/cases/schema_loading_test.rb +3 -2
  323. data/test/cases/scoping/default_scoping_test.rb +185 -144
  324. data/test/cases/scoping/named_scoping_test.rb +177 -89
  325. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  326. data/test/cases/secure_token_test.rb +18 -3
  327. data/test/cases/serialization_test.rb +30 -28
  328. data/test/cases/serialized_attribute_test.rb +133 -42
  329. data/test/cases/signed_id_test.rb +168 -0
  330. data/test/cases/statement_cache_test.rb +41 -24
  331. data/test/cases/statement_invalid_test.rb +42 -0
  332. data/test/cases/store_test.rb +180 -55
  333. data/test/cases/strict_loading_test.rb +473 -0
  334. data/test/cases/suppressor_test.rb +26 -12
  335. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  336. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  337. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  338. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  339. data/test/cases/test_case.rb +51 -40
  340. data/test/cases/test_databases_test.rb +79 -0
  341. data/test/cases/test_fixtures_test.rb +79 -19
  342. data/test/cases/time_precision_test.rb +98 -76
  343. data/test/cases/timestamp_test.rb +102 -99
  344. data/test/cases/touch_later_test.rb +12 -10
  345. data/test/cases/transaction_callbacks_test.rb +344 -90
  346. data/test/cases/transaction_isolation_test.rb +12 -12
  347. data/test/cases/transactions_test.rb +612 -162
  348. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  349. data/test/cases/type/date_time_test.rb +4 -2
  350. data/test/cases/type/integer_test.rb +4 -2
  351. data/test/cases/type/string_test.rb +10 -8
  352. data/test/cases/type/time_test.rb +28 -0
  353. data/test/cases/type/type_map_test.rb +29 -28
  354. data/test/cases/type/unsigned_integer_test.rb +19 -0
  355. data/test/cases/type_test.rb +2 -0
  356. data/test/cases/types_test.rb +3 -1
  357. data/test/cases/unconnected_test.rb +14 -1
  358. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  359. data/test/cases/validations/absence_validation_test.rb +19 -17
  360. data/test/cases/validations/association_validation_test.rb +30 -28
  361. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  362. data/test/cases/validations/i18n_validation_test.rb +22 -21
  363. data/test/cases/validations/length_validation_test.rb +34 -33
  364. data/test/cases/validations/numericality_validation_test.rb +181 -0
  365. data/test/cases/validations/presence_validation_test.rb +21 -19
  366. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  367. data/test/cases/validations_repair_helper.rb +2 -0
  368. data/test/cases/validations_test.rb +61 -26
  369. data/test/cases/view_test.rb +122 -116
  370. data/test/cases/yaml_serialization_test.rb +79 -34
  371. data/test/config.example.yml +19 -19
  372. data/test/config.rb +3 -1
  373. data/test/config.yml +16 -6
  374. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  375. data/test/fixtures/author_addresses.yml +1 -8
  376. data/test/fixtures/authors.yml +1 -7
  377. data/test/fixtures/binaries.yml +4 -0
  378. data/test/fixtures/books.yml +9 -2
  379. data/test/fixtures/categories_posts.yml +3 -0
  380. data/test/fixtures/citations.yml +5 -0
  381. data/test/fixtures/comments.yml +7 -0
  382. data/test/fixtures/companies.yml +5 -0
  383. data/test/fixtures/computers.yml +2 -0
  384. data/test/fixtures/customers.yml +10 -1
  385. data/test/fixtures/developers.yml +1 -1
  386. data/test/fixtures/essays.yml +10 -0
  387. data/test/fixtures/faces.yml +3 -3
  388. data/test/fixtures/humans.yml +5 -0
  389. data/test/fixtures/interests.yml +7 -7
  390. data/test/fixtures/memberships.yml +7 -0
  391. data/test/fixtures/minimalistics.yml +3 -0
  392. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  393. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  394. data/test/fixtures/naked/yml/parrots.yml +1 -0
  395. data/test/fixtures/other_books.yml +26 -0
  396. data/test/fixtures/other_posts.yml +1 -0
  397. data/test/fixtures/parrots.yml +7 -1
  398. data/test/fixtures/pirates.yml +3 -0
  399. data/test/fixtures/posts.yml +11 -3
  400. data/test/fixtures/readers.yml +6 -0
  401. data/test/fixtures/reserved_words/values.yml +2 -2
  402. data/test/fixtures/sponsors.yml +3 -0
  403. data/test/fixtures/strict_zines.yml +2 -0
  404. data/test/fixtures/subscribers.yml +1 -1
  405. data/test/fixtures/tasks.yml +1 -1
  406. data/test/fixtures/warehouse-things.yml +3 -0
  407. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  408. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  409. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  410. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  411. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  412. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  413. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  414. data/test/migrations/rename/1_we_need_things.rb +2 -0
  415. data/test/migrations/rename/2_rename_things.rb +2 -0
  416. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  417. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  418. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  419. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  420. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  421. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  424. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  425. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  431. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  432. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  434. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  435. data/test/models/account.rb +46 -0
  436. data/test/models/admin/account.rb +3 -1
  437. data/test/models/admin/randomly_named_c1.rb +2 -0
  438. data/test/models/admin/user.rb +16 -8
  439. data/test/models/admin.rb +4 -2
  440. data/test/models/aircraft.rb +3 -1
  441. data/test/models/arunit2_model.rb +2 -0
  442. data/test/models/author.rb +153 -102
  443. data/test/models/auto_id.rb +2 -0
  444. data/test/models/autoloadable/extra_firm.rb +2 -0
  445. data/test/models/binary.rb +3 -1
  446. data/test/models/binary_field.rb +6 -0
  447. data/test/models/bird.rb +13 -1
  448. data/test/models/book.rb +14 -4
  449. data/test/models/book_destroy_async.rb +24 -0
  450. data/test/models/boolean.rb +5 -0
  451. data/test/models/bulb.rb +13 -4
  452. data/test/models/cake_designer.rb +2 -0
  453. data/test/models/car.rb +17 -10
  454. data/test/models/carrier.rb +2 -0
  455. data/test/models/cart.rb +5 -0
  456. data/test/models/cat.rb +2 -0
  457. data/test/models/categorization.rb +8 -6
  458. data/test/models/category.rb +28 -16
  459. data/test/models/chef.rb +2 -0
  460. data/test/models/citation.rb +5 -1
  461. data/test/models/club.rb +13 -10
  462. data/test/models/college.rb +4 -2
  463. data/test/models/column.rb +2 -0
  464. data/test/models/column_name.rb +2 -0
  465. data/test/models/comment.rb +32 -10
  466. data/test/models/company.rb +102 -106
  467. data/test/models/company_in_module.rb +27 -26
  468. data/test/models/computer.rb +3 -1
  469. data/test/models/contact.rb +15 -13
  470. data/test/models/content.rb +5 -3
  471. data/test/models/contract.rb +21 -3
  472. data/test/models/country.rb +2 -4
  473. data/test/models/course.rb +3 -1
  474. data/test/models/customer.rb +10 -8
  475. data/test/models/customer_carrier.rb +2 -0
  476. data/test/models/dashboard.rb +2 -0
  477. data/test/models/default.rb +2 -0
  478. data/test/models/department.rb +2 -0
  479. data/test/models/destroy_async_parent.rb +15 -0
  480. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  481. data/test/models/developer.rb +152 -85
  482. data/test/models/dl_keyed_belongs_to.rb +13 -0
  483. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  484. data/test/models/dl_keyed_has_many.rb +5 -0
  485. data/test/models/dl_keyed_has_many_through.rb +5 -0
  486. data/test/models/dl_keyed_has_one.rb +5 -0
  487. data/test/models/dl_keyed_join.rb +10 -0
  488. data/test/models/dog.rb +2 -0
  489. data/test/models/dog_lover.rb +2 -0
  490. data/test/models/doubloon.rb +3 -1
  491. data/test/models/drink_designer.rb +17 -0
  492. data/test/models/edge.rb +4 -2
  493. data/test/models/electron.rb +2 -0
  494. data/test/models/engine.rb +3 -2
  495. data/test/models/entrant.rb +2 -0
  496. data/test/models/entry.rb +5 -0
  497. data/test/models/essay.rb +6 -3
  498. data/test/models/essay_destroy_async.rb +12 -0
  499. data/test/models/event.rb +3 -1
  500. data/test/models/eye.rb +5 -3
  501. data/test/models/face.rb +14 -6
  502. data/test/models/family.rb +6 -0
  503. data/test/models/family_tree.rb +6 -0
  504. data/test/models/friendship.rb +5 -3
  505. data/test/models/frog.rb +8 -0
  506. data/test/models/guid.rb +3 -1
  507. data/test/models/guitar.rb +2 -0
  508. data/test/models/hotel.rb +5 -3
  509. data/test/models/human.rb +39 -0
  510. data/test/models/image.rb +3 -1
  511. data/test/models/interest.rb +14 -3
  512. data/test/models/invoice.rb +4 -2
  513. data/test/models/item.rb +3 -1
  514. data/test/models/job.rb +5 -3
  515. data/test/models/joke.rb +4 -2
  516. data/test/models/keyboard.rb +3 -1
  517. data/test/models/legacy_thing.rb +2 -0
  518. data/test/models/lesson.rb +2 -0
  519. data/test/models/line_item.rb +3 -1
  520. data/test/models/liquid.rb +2 -0
  521. data/test/models/matey.rb +3 -1
  522. data/test/models/measurement.rb +4 -0
  523. data/test/models/member.rb +23 -20
  524. data/test/models/member_detail.rb +3 -0
  525. data/test/models/member_type.rb +2 -0
  526. data/test/models/membership.rb +4 -1
  527. data/test/models/mentor.rb +3 -1
  528. data/test/models/message.rb +5 -0
  529. data/test/models/minimalistic.rb +2 -0
  530. data/test/models/minivan.rb +3 -2
  531. data/test/models/mixed_case_monkey.rb +3 -1
  532. data/test/models/molecule.rb +2 -0
  533. data/test/models/mouse.rb +6 -0
  534. data/test/models/movie.rb +2 -0
  535. data/test/models/node.rb +4 -2
  536. data/test/models/non_primary_key.rb +2 -0
  537. data/test/models/notification.rb +2 -0
  538. data/test/models/numeric_data.rb +12 -0
  539. data/test/models/order.rb +4 -2
  540. data/test/models/organization.rb +9 -7
  541. data/test/models/other_dog.rb +3 -1
  542. data/test/models/owner.rb +6 -4
  543. data/test/models/parrot.rb +12 -4
  544. data/test/models/person.rb +59 -54
  545. data/test/models/personal_legacy_thing.rb +3 -1
  546. data/test/models/pet.rb +4 -2
  547. data/test/models/pet_treasure.rb +2 -0
  548. data/test/models/pirate.rb +67 -43
  549. data/test/models/possession.rb +3 -1
  550. data/test/models/post.rb +184 -86
  551. data/test/models/price_estimate.rb +11 -1
  552. data/test/models/professor.rb +3 -1
  553. data/test/models/project.rb +14 -12
  554. data/test/models/publisher/article.rb +2 -0
  555. data/test/models/publisher/magazine.rb +2 -0
  556. data/test/models/publisher.rb +2 -0
  557. data/test/models/randomly_named_c1.rb +2 -0
  558. data/test/models/rating.rb +5 -1
  559. data/test/models/reader.rb +7 -5
  560. data/test/models/recipe.rb +2 -0
  561. data/test/models/record.rb +2 -0
  562. data/test/models/reference.rb +6 -3
  563. data/test/models/reply.rb +39 -21
  564. data/test/models/room.rb +6 -0
  565. data/test/models/section.rb +6 -0
  566. data/test/models/seminar.rb +6 -0
  567. data/test/models/session.rb +6 -0
  568. data/test/models/ship.rb +12 -9
  569. data/test/models/ship_part.rb +5 -3
  570. data/test/models/shop.rb +4 -2
  571. data/test/models/shop_account.rb +2 -0
  572. data/test/models/speedometer.rb +2 -0
  573. data/test/models/sponsor.rb +8 -5
  574. data/test/models/squeak.rb +6 -0
  575. data/test/models/strict_zine.rb +7 -0
  576. data/test/models/string_key_object.rb +2 -0
  577. data/test/models/student.rb +2 -0
  578. data/test/models/subscriber.rb +4 -2
  579. data/test/models/subscription.rb +5 -1
  580. data/test/models/tag.rb +6 -3
  581. data/test/models/tagging.rb +13 -6
  582. data/test/models/task.rb +2 -0
  583. data/test/models/topic.rb +54 -19
  584. data/test/models/toy.rb +4 -0
  585. data/test/models/traffic_light.rb +2 -0
  586. data/test/models/treasure.rb +5 -3
  587. data/test/models/treaty.rb +2 -4
  588. data/test/models/tree.rb +2 -0
  589. data/test/models/tuning_peg.rb +2 -0
  590. data/test/models/tyre.rb +2 -0
  591. data/test/models/user.rb +12 -4
  592. data/test/models/uuid_child.rb +2 -0
  593. data/test/models/uuid_item.rb +2 -0
  594. data/test/models/uuid_parent.rb +2 -0
  595. data/test/models/vegetables.rb +12 -3
  596. data/test/models/vertex.rb +6 -4
  597. data/test/models/warehouse_thing.rb +2 -0
  598. data/test/models/wheel.rb +3 -1
  599. data/test/models/without_table.rb +3 -1
  600. data/test/models/zine.rb +3 -1
  601. data/test/schema/mysql2_specific_schema.rb +49 -35
  602. data/test/schema/oracle_specific_schema.rb +13 -15
  603. data/test/schema/postgresql_specific_schema.rb +51 -40
  604. data/test/schema/schema.rb +334 -154
  605. data/test/schema/sqlite_specific_schema.rb +9 -16
  606. data/test/support/config.rb +26 -26
  607. data/test/support/connection.rb +14 -8
  608. data/test/support/connection_helper.rb +3 -1
  609. data/test/support/ddl_helper.rb +2 -0
  610. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  620. data/test/support/schema_dumping_helper.rb +2 -0
  621. data/test/support/stubs/strong_parameters.rb +40 -0
  622. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  624. metadata +196 -11
@@ -1,22 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/face'
3
- require 'models/interest'
4
- require 'models/man'
5
- require 'models/topic'
4
+ require "models/face"
5
+ require "models/interest"
6
+ require "models/human"
7
+ require "models/topic"
6
8
 
7
9
  class AbsenceValidationTest < ActiveRecord::TestCase
8
10
  def test_non_association
9
- boy_klass = Class.new(Man) do
11
+ boy_klass = Class.new(Human) do
10
12
  def self.name; "Boy" end
11
13
  validates_absence_of :name
12
14
  end
13
15
 
14
- assert boy_klass.new.valid?
15
- assert_not boy_klass.new(name: "Alex").valid?
16
+ assert_predicate boy_klass.new, :valid?
17
+ assert_not_predicate boy_klass.new(name: "Alex"), :valid?
16
18
  end
17
19
 
18
20
  def test_has_one_marked_for_destruction
19
- boy_klass = Class.new(Man) do
21
+ boy_klass = Class.new(Human) do
20
22
  def self.name; "Boy" end
21
23
  validates_absence_of :face
22
24
  end
@@ -30,7 +32,7 @@ class AbsenceValidationTest < ActiveRecord::TestCase
30
32
  end
31
33
 
32
34
  def test_has_many_marked_for_destruction
33
- boy_klass = Class.new(Man) do
35
+ boy_klass = Class.new(Human) do
34
36
  def self.name; "Boy" end
35
37
  validates_absence_of :interests
36
38
  end
@@ -42,32 +44,32 @@ class AbsenceValidationTest < ActiveRecord::TestCase
42
44
  assert_not boy.valid?, "should not be valid if has_many association is present"
43
45
 
44
46
  i2.mark_for_destruction
45
- assert boy.valid?
47
+ assert_predicate boy, :valid?
46
48
  end
47
49
 
48
50
  def test_does_not_call_to_a_on_associations
49
- boy_klass = Class.new(Man) do
51
+ boy_klass = Class.new(Human) do
50
52
  def self.name; "Boy" end
51
53
  validates_absence_of :face
52
54
  end
53
55
 
54
56
  face_with_to_a = Face.new
55
- def face_with_to_a.to_a; ['(/)', '(\)']; end
57
+ def face_with_to_a.to_a; ["(/)", '(\)']; end
56
58
 
57
59
  assert_nothing_raised { boy_klass.new(face: face_with_to_a).valid? }
58
60
  end
59
61
 
60
62
  def test_validates_absence_of_virtual_attribute_on_model
61
63
  repair_validations(Interest) do
62
- Interest.send(:attr_accessor, :token)
64
+ Interest.attr_accessor(:token)
63
65
  Interest.validates_absence_of(:token)
64
66
 
65
- interest = Interest.create!(topic: 'Thought Leadering')
66
- assert interest.valid?
67
+ interest = Interest.create!(topic: "Thought Leadering")
68
+ assert_predicate interest, :valid?
67
69
 
68
- interest.token = 'tl'
70
+ interest.token = "tl"
69
71
 
70
- assert interest.invalid?
72
+ assert_predicate interest, :invalid?
71
73
  end
72
74
  end
73
75
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/man'
5
- require 'models/interest'
4
+ require "models/topic"
5
+ require "models/reply"
6
+ require "models/human"
7
+ require "models/interest"
6
8
 
7
9
  class AssociationValidationTest < ActiveRecord::TestCase
8
10
  fixtures :topics
@@ -14,25 +16,25 @@ class AssociationValidationTest < ActiveRecord::TestCase
14
16
  Reply.validates_presence_of(:content)
15
17
  t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
16
18
  t.replies << [r = Reply.new("title" => "A reply"), r2 = Reply.new("title" => "Another reply", "content" => "non-empty"), r3 = Reply.new("title" => "Yet another reply"), r4 = Reply.new("title" => "The last reply", "content" => "non-empty")]
17
- assert !t.valid?
18
- assert t.errors[:replies].any?
19
+ assert_not_predicate t, :valid?
20
+ assert_predicate t.errors[:replies], :any?
19
21
  assert_equal 1, r.errors.count # make sure all associated objects have been validated
20
22
  assert_equal 0, r2.errors.count
21
23
  assert_equal 1, r3.errors.count
22
24
  assert_equal 0, r4.errors.count
23
25
  r.content = r3.content = "non-empty"
24
- assert t.valid?
26
+ assert_predicate t, :valid?
25
27
  end
26
28
 
27
29
  def test_validates_associated_one
28
- Reply.validates :topic, :associated => true
29
- Topic.validates_presence_of( :content )
30
+ Reply.validates :topic, associated: true
31
+ Topic.validates_presence_of(:content)
30
32
  r = Reply.new("title" => "A reply", "content" => "with content!")
31
33
  r.topic = Topic.create("title" => "uhohuhoh")
32
- assert !r.valid?
33
- assert r.errors[:topic].any?
34
+ assert_not_predicate r, :valid?
35
+ assert_predicate r.errors[:topic], :any?
34
36
  r.topic.content = "non-empty"
35
- assert r.valid?
37
+ assert_predicate r, :valid?
36
38
  end
37
39
 
38
40
  def test_validates_associated_marked_for_destruction
@@ -40,9 +42,9 @@ class AssociationValidationTest < ActiveRecord::TestCase
40
42
  Reply.validates_presence_of(:content)
41
43
  t = Topic.new
42
44
  t.replies << Reply.new
43
- assert t.invalid?
45
+ assert_predicate t, :invalid?
44
46
  t.replies.first.mark_for_destruction
45
- assert t.valid?
47
+ assert_predicate t, :valid?
46
48
  end
47
49
 
48
50
  def test_validates_associated_without_marked_for_destruction
@@ -54,11 +56,11 @@ class AssociationValidationTest < ActiveRecord::TestCase
54
56
  Topic.validates_associated(:replies)
55
57
  t = Topic.new
56
58
  t.define_singleton_method(:replies) { [reply.new] }
57
- assert t.valid?
59
+ assert_predicate t, :valid?
58
60
  end
59
61
 
60
62
  def test_validates_associated_with_custom_message_using_quotes
61
- Reply.validates_associated :topic, :message=> "This string contains 'single' and \"double\" quotes"
63
+ Reply.validates_associated :topic, message: "This string contains 'single' and \"double\" quotes"
62
64
  Topic.validates_presence_of :content
63
65
  r = Reply.create("title" => "A reply", "content" => "with content!")
64
66
  r.topic = Topic.create("title" => "uhohuhoh")
@@ -69,29 +71,29 @@ class AssociationValidationTest < ActiveRecord::TestCase
69
71
  def test_validates_associated_missing
70
72
  Reply.validates_presence_of(:topic)
71
73
  r = Reply.create("title" => "A reply", "content" => "with content!")
72
- assert !r.valid?
73
- assert r.errors[:topic].any?
74
+ assert_not_predicate r, :valid?
75
+ assert_predicate r.errors[:topic], :any?
74
76
 
75
77
  r.topic = Topic.first
76
- assert r.valid?
78
+ assert_predicate r, :valid?
77
79
  end
78
80
 
79
81
  def test_validates_presence_of_belongs_to_association__parent_is_new_record
80
82
  repair_validations(Interest) do
81
- # Note that Interest and Man have the :inverse_of option set
82
- Interest.validates_presence_of(:man)
83
- man = Man.new(:name => 'John')
84
- interest = man.interests.build(:topic => 'Airplanes')
85
- assert interest.valid?, "Expected interest to be valid, but was not. Interest should have a man object associated"
83
+ # Note that Interest and Human have the :inverse_of option set
84
+ Interest.validates_presence_of(:human)
85
+ human = Human.new(name: "John")
86
+ interest = human.interests.build(topic: "Airplanes")
87
+ assert interest.valid?, "Expected interest to be valid, but was not. Interest should have a human object associated"
86
88
  end
87
89
  end
88
90
 
89
91
  def test_validates_presence_of_belongs_to_association__existing_parent
90
92
  repair_validations(Interest) do
91
- Interest.validates_presence_of(:man)
92
- man = Man.create!(:name => 'John')
93
- interest = man.interests.build(:topic => 'Airplanes')
94
- assert interest.valid?, "Expected interest to be valid, but was not. Interest should have a man object associated"
93
+ Interest.validates_presence_of(:human)
94
+ human = Human.create!(name: "John")
95
+ interest = human.interests.build(topic: "Airplanes")
96
+ assert interest.valid?, "Expected interest to be valid, but was not. Interest should have a human object associated"
95
97
  end
96
98
  end
97
99
  end
@@ -1,17 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/topic'
4
+ require "models/topic"
3
5
 
4
6
  class I18nGenerateMessageValidationTest < ActiveRecord::TestCase
7
+ class Backend < I18n::Backend::Simple
8
+ include I18n::Backend::Fallbacks
9
+ end
10
+
5
11
  def setup
6
12
  Topic.clear_validators!
7
13
  @topic = Topic.new
8
- I18n.backend = I18n::Backend::Simple.new
14
+ I18n.backend = Backend.new
9
15
  end
10
16
 
11
17
  def reset_i18n_load_path
12
18
  @old_load_path, @old_backend = I18n.load_path.dup, I18n.backend
13
19
  I18n.load_path.clear
14
- I18n.backend = I18n::Backend::Simple.new
20
+ I18n.backend = Backend.new
15
21
  yield
16
22
  ensure
17
23
  I18n.load_path.replace @old_load_path
@@ -20,20 +26,20 @@ class I18nGenerateMessageValidationTest < ActiveRecord::TestCase
20
26
 
21
27
  # validates_associated: generate_message(attr_name, :invalid, :message => custom_message, :value => value)
22
28
  def test_generate_message_invalid_with_default_message
23
- assert_equal 'is invalid', @topic.errors.generate_message(:title, :invalid, :value => 'title')
29
+ assert_equal "is invalid", @topic.errors.generate_message(:title, :invalid, value: "title")
24
30
  end
25
31
 
26
32
  def test_generate_message_invalid_with_custom_message
27
- assert_equal 'custom message title', @topic.errors.generate_message(:title, :invalid, :message => 'custom message %{value}', :value => 'title')
33
+ assert_equal "custom message title", @topic.errors.generate_message(:title, :invalid, message: "custom message %{value}", value: "title")
28
34
  end
29
35
 
30
36
  # validates_uniqueness_of: generate_message(attr_name, :taken, :message => custom_message)
31
37
  def test_generate_message_taken_with_default_message
32
- assert_equal "has already been taken", @topic.errors.generate_message(:title, :taken, :value => 'title')
38
+ assert_equal "has already been taken", @topic.errors.generate_message(:title, :taken, value: "title")
33
39
  end
34
40
 
35
41
  def test_generate_message_taken_with_custom_message
36
- assert_equal 'custom message title', @topic.errors.generate_message(:title, :taken, :message => 'custom message %{value}', :value => 'title')
42
+ assert_equal "custom message title", @topic.errors.generate_message(:title, :taken, message: "custom message %{value}", value: "title")
37
43
  end
38
44
 
39
45
  # ActiveRecord#RecordInvalid exception
@@ -47,7 +53,7 @@ class I18nGenerateMessageValidationTest < ActiveRecord::TestCase
47
53
 
48
54
  test "RecordInvalid exception translation falls back to the :errors namespace" do
49
55
  reset_i18n_load_path do
50
- I18n.backend.store_translations 'en', :errors => {:messages => {:record_invalid => 'fallback message'}}
56
+ I18n.backend.store_translations "en", errors: { messages: { record_invalid: "fallback message" } }
51
57
  topic = Topic.new
52
58
  topic.errors.add(:title, :blank)
53
59
  assert_equal "fallback message", ActiveRecord::RecordInvalid.new(topic).message
@@ -56,29 +62,41 @@ class I18nGenerateMessageValidationTest < ActiveRecord::TestCase
56
62
 
57
63
  test "translation for 'taken' can be overridden" do
58
64
  reset_i18n_load_path do
59
- I18n.backend.store_translations "en", {errors: {attributes: {title: {taken: "Custom taken message" }}}}
60
- assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, :value => 'title')
65
+ I18n.backend.store_translations "en", errors: { attributes: { title: { taken: "Custom taken message" } } }
66
+ assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, value: "title")
61
67
  end
62
68
  end
63
69
 
64
70
  test "translation for 'taken' can be overridden in activerecord scope" do
65
71
  reset_i18n_load_path do
66
- I18n.backend.store_translations "en", {activerecord: {errors: {messages: {taken: "Custom taken message" }}}}
67
- assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, :value => 'title')
72
+ I18n.backend.store_translations "en", activerecord: { errors: { messages: { taken: "Custom taken message" } } }
73
+ assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, value: "title")
68
74
  end
69
75
  end
70
76
 
71
77
  test "translation for 'taken' can be overridden in activerecord model scope" do
72
78
  reset_i18n_load_path do
73
- I18n.backend.store_translations "en", {activerecord: {errors: {models: {topic: {taken: "Custom taken message" }}}}}
74
- assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, :value => 'title')
79
+ I18n.backend.store_translations "en", activerecord: { errors: { models: { topic: { taken: "Custom taken message" } } } }
80
+ assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, value: "title")
75
81
  end
76
82
  end
77
83
 
78
84
  test "translation for 'taken' can be overridden in activerecord attributes scope" do
79
85
  reset_i18n_load_path do
80
- I18n.backend.store_translations "en", {activerecord: {errors: {models: {topic: {attributes: {title: {taken: "Custom taken message" }}}}}}}
81
- assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, :value => 'title')
86
+ I18n.backend.store_translations "en", activerecord: { errors: { models: { topic: { attributes: { title: { taken: "Custom taken message" } } } } } }
87
+ assert_equal "Custom taken message", @topic.errors.generate_message(:title, :taken, value: "title")
88
+ end
89
+ end
90
+
91
+ test "activerecord attributes scope falls back to parent locale before it falls back to the :errors namespace" do
92
+ reset_i18n_load_path do
93
+ I18n.backend.store_translations "en", activerecord: { errors: { models: { topic: { attributes: { title: { taken: "custom en message" } } } } } }
94
+ I18n.backend.store_translations "en-US", errors: { messages: { taken: "generic en-US fallback" } }
95
+
96
+ I18n.with_locale "en-US" do
97
+ assert_equal "custom en message", @topic.errors.generate_message(:title, :taken, value: "title")
98
+ assert_equal "generic en-US fallback", @topic.errors.generate_message(:heading, :taken, value: "heading")
99
+ end
82
100
  end
83
101
  end
84
102
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
+ require "models/topic"
5
+ require "models/reply"
4
6
 
5
7
  class I18nValidationTest < ActiveRecord::TestCase
6
8
  repair_validations(Topic, Reply)
@@ -12,7 +14,7 @@ class I18nValidationTest < ActiveRecord::TestCase
12
14
  @old_load_path, @old_backend = I18n.load_path.dup, I18n.backend
13
15
  I18n.load_path.clear
14
16
  I18n.backend = I18n::Backend::Simple.new
15
- I18n.backend.store_translations('en', :errors => {:messages => {:custom => nil}})
17
+ I18n.backend.store_translations("en", errors: { messages: { custom: nil } })
16
18
  end
17
19
 
18
20
  teardown do
@@ -21,12 +23,12 @@ class I18nValidationTest < ActiveRecord::TestCase
21
23
  end
22
24
 
23
25
  def unique_topic
24
- @unique ||= Topic.create :title => 'unique!'
26
+ @unique ||= Topic.create title: "unique!"
25
27
  end
26
28
 
27
29
  def replied_topic
28
30
  @replied_topic ||= begin
29
- topic = Topic.create(:title => "topic")
31
+ topic = Topic.create(title: "topic")
30
32
  topic.replies << Reply.new
31
33
  topic
32
34
  end
@@ -36,23 +38,22 @@ class I18nValidationTest < ActiveRecord::TestCase
36
38
  # are used to generate tests to keep things DRY
37
39
  #
38
40
  COMMON_CASES = [
39
- # [ case, validation_options, generate_message_options]
41
+ # [ case, validation_options, generate_message_options]
40
42
  [ "given no options", {}, {}],
41
- [ "given custom message", {:message => "custom"}, {:message => "custom"}],
42
- [ "given if condition", {:if => lambda { true }}, {}],
43
- [ "given unless condition", {:unless => lambda { false }}, {}],
44
- [ "given option that is not reserved", {:format => "jpg"}, {:format => "jpg" }]
45
- # TODO Add :on case, but below doesn't work, because then the validation isn't run for some reason
46
- # even when using .save instead .valid?
47
- # [ "given on condition", {on: :save}, {}]
43
+ [ "given custom message", { message: "custom" }, { message: "custom" }],
44
+ [ "given if condition", { if: lambda { true } }, {}],
45
+ [ "given unless condition", { unless: lambda { false } }, {}],
46
+ [ "given option that is not reserved", { format: "jpg" }, { format: "jpg" }],
47
+ [ "given on condition", { on: [:create, :update] }, {}]
48
48
  ]
49
49
 
50
50
  COMMON_CASES.each do |name, validation_options, generate_message_options|
51
51
  test "validates_uniqueness_of on generated message #{name}" do
52
52
  Topic.validates_uniqueness_of :title, validation_options
53
53
  @topic.title = unique_topic.title
54
- assert_called_with(@topic.errors, :generate_message, [:title, :taken, generate_message_options.merge(:value => 'unique!')]) do
54
+ assert_called_with(ActiveModel::Error, :generate_message, [:title, :taken, @topic, generate_message_options.merge(value: "unique!")]) do
55
55
  @topic.valid?
56
+ @topic.errors.messages
56
57
  end
57
58
  end
58
59
  end
@@ -60,27 +61,27 @@ class I18nValidationTest < ActiveRecord::TestCase
60
61
  COMMON_CASES.each do |name, validation_options, generate_message_options|
61
62
  test "validates_associated on generated message #{name}" do
62
63
  Topic.validates_associated :replies, validation_options
63
- assert_called_with(replied_topic.errors, :generate_message, [:replies, :invalid, generate_message_options.merge(:value => replied_topic.replies)]) do
64
+ assert_called_with(ActiveModel::Error, :generate_message, [:replies, :invalid, replied_topic, generate_message_options.merge(value: replied_topic.replies)]) do
64
65
  replied_topic.save
66
+ replied_topic.errors.messages
65
67
  end
66
68
  end
67
69
  end
68
70
 
69
71
  def test_validates_associated_finds_custom_model_key_translation
70
- I18n.backend.store_translations 'en', :activerecord => {:errors => {:models => {:topic => {:attributes => {:replies => {:invalid => 'custom message'}}}}}}
71
- I18n.backend.store_translations 'en', :activerecord => {:errors => {:messages => {:invalid => 'global message'}}}
72
+ I18n.backend.store_translations "en", activerecord: { errors: { models: { topic: { attributes: { replies: { invalid: "custom message" } } } } } }
73
+ I18n.backend.store_translations "en", activerecord: { errors: { messages: { invalid: "global message" } } }
72
74
 
73
75
  Topic.validates_associated :replies
74
76
  replied_topic.valid?
75
- assert_equal ['custom message'], replied_topic.errors[:replies].uniq
77
+ assert_equal ["custom message"], replied_topic.errors[:replies].uniq
76
78
  end
77
79
 
78
80
  def test_validates_associated_finds_global_default_translation
79
- I18n.backend.store_translations 'en', :activerecord => {:errors => {:messages => {:invalid => 'global message'}}}
81
+ I18n.backend.store_translations "en", activerecord: { errors: { messages: { invalid: "global message" } } }
80
82
 
81
83
  Topic.validates_associated :replies
82
84
  replied_topic.valid?
83
- assert_equal ['global message'], replied_topic.errors[:replies]
85
+ assert_equal ["global message"], replied_topic.errors[:replies]
84
86
  end
85
-
86
87
  end
@@ -1,79 +1,80 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/owner'
3
- require 'models/pet'
4
- require 'models/person'
4
+ require "models/owner"
5
+ require "models/pet"
6
+ require "models/person"
5
7
 
6
8
  class LengthValidationTest < ActiveRecord::TestCase
7
9
  fixtures :owners
8
10
 
9
11
  setup do
10
12
  @owner = Class.new(Owner) do
11
- def self.name; 'Owner'; end
13
+ def self.name; "Owner"; end
12
14
  end
13
15
  end
14
16
 
15
-
16
17
  def test_validates_size_of_association
17
18
  assert_nothing_raised { @owner.validates_size_of :pets, minimum: 1 }
18
- o = @owner.new('name' => 'nopets')
19
- assert !o.save
20
- assert o.errors[:pets].any?
21
- o.pets.build('name' => 'apet')
22
- assert o.valid?
19
+ o = @owner.new("name" => "nopets")
20
+ assert_not o.save
21
+ assert_predicate o.errors[:pets], :any?
22
+ o.pets.build("name" => "apet")
23
+ assert_predicate o, :valid?
23
24
  end
24
25
 
25
26
  def test_validates_size_of_association_using_within
26
27
  assert_nothing_raised { @owner.validates_size_of :pets, within: 1..2 }
27
- o = @owner.new('name' => 'nopets')
28
- assert !o.save
29
- assert o.errors[:pets].any?
28
+ o = @owner.new("name" => "nopets")
29
+ assert_not o.save
30
+ assert_predicate o.errors[:pets], :any?
30
31
 
31
- o.pets.build('name' => 'apet')
32
- assert o.valid?
32
+ o.pets.build("name" => "apet")
33
+ assert_predicate o, :valid?
33
34
 
34
- 2.times { o.pets.build('name' => 'apet') }
35
- assert !o.save
36
- assert o.errors[:pets].any?
35
+ 2.times { o.pets.build("name" => "apet") }
36
+ assert_not o.save
37
+ assert_predicate o.errors[:pets], :any?
37
38
  end
38
39
 
39
40
  def test_validates_size_of_association_utf8
40
41
  @owner.validates_size_of :pets, minimum: 1
41
- o = @owner.new('name' => 'あいうえおかきくけこ')
42
- assert !o.save
43
- assert o.errors[:pets].any?
44
- o.pets.build('name' => 'あいうえおかきくけこ')
45
- assert o.valid?
42
+ o = @owner.new("name" => "あいうえおかきくけこ")
43
+ assert_not o.save
44
+ assert_predicate o.errors[:pets], :any?
45
+ o.pets.build("name" => "あいうえおかきくけこ")
46
+ assert_predicate o, :valid?
46
47
  end
47
48
 
48
49
  def test_validates_size_of_respects_records_marked_for_destruction
49
50
  @owner.validates_size_of :pets, minimum: 1
50
51
  owner = @owner.new
51
52
  assert_not owner.save
52
- assert owner.errors[:pets].any?
53
+ assert_predicate owner.errors[:pets], :any?
53
54
  pet = owner.pets.build
54
- assert owner.valid?
55
+ assert_predicate owner, :valid?
55
56
  assert owner.save
56
57
 
57
58
  pet_count = Pet.count
58
- assert_not owner.update_attributes pets_attributes: [ {_destroy: 1, id: pet.id} ]
59
- assert_not owner.valid?
60
- assert owner.errors[:pets].any?
59
+ assert_not owner.update pets_attributes: [ { _destroy: 1, id: pet.id } ]
60
+ assert_not_predicate owner, :valid?
61
+ assert_predicate owner.errors[:pets], :any?
61
62
  assert_equal pet_count, Pet.count
62
63
  end
63
64
 
64
65
  def test_validates_length_of_virtual_attribute_on_model
65
66
  repair_validations(Pet) do
66
- Pet.send(:attr_accessor, :nickname)
67
+ Pet.attr_accessor(:nickname)
67
68
  Pet.validates_length_of(:name, minimum: 1)
68
69
  Pet.validates_length_of(:nickname, minimum: 1)
69
70
 
70
- pet = Pet.create!(name: 'Fancy Pants', nickname: 'Fancy')
71
+ pet = Pet.create!(name: "Fancy Pants", nickname: "Fancy")
71
72
 
72
- assert pet.valid?
73
+ assert_predicate pet, :valid?
73
74
 
74
- pet.nickname = ''
75
+ pet.nickname = ""
75
76
 
76
- assert pet.invalid?
77
+ assert_predicate pet, :invalid?
77
78
  end
78
79
  end
79
80
  end