ibm_db 5.2.0-x86-mingw32 β†’ 5.4.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -1,31 +1,37 @@
1
- require 'cases/helper'
2
- require 'models/book'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/author"
5
+ require "models/book"
6
+ require "active_support/log_subscriber/test_helper"
3
7
 
4
8
  class EnumTest < ActiveRecord::TestCase
5
- fixtures :books
9
+ fixtures :books, :authors, :author_addresses
6
10
 
7
11
  setup do
8
12
  @book = books(:awdr)
9
13
  end
10
14
 
11
15
  test "query state by predicate" do
12
- assert @book.published?
13
- assert_not @book.written?
14
- assert_not @book.proposed?
16
+ assert_predicate @book, :published?
17
+ assert_not_predicate @book, :written?
18
+ assert_not_predicate @book, :proposed?
15
19
 
16
- assert @book.read?
17
- assert @book.in_english?
18
- assert @book.author_visibility_visible?
19
- assert @book.illustrator_visibility_visible?
20
- assert @book.with_medium_font_size?
20
+ assert_predicate @book, :read?
21
+ assert_predicate @book, :in_english?
22
+ assert_predicate @book, :author_visibility_visible?
23
+ assert_predicate @book, :illustrator_visibility_visible?
24
+ assert_predicate @book, :with_medium_font_size?
25
+ assert_predicate @book, :medium_to_read?
21
26
  end
22
27
 
23
28
  test "query state with strings" do
24
29
  assert_equal "published", @book.status
25
- assert_equal "read", @book.read_status
30
+ assert_equal "read", @book.last_read
26
31
  assert_equal "english", @book.language
27
32
  assert_equal "visible", @book.author_visibility
28
33
  assert_equal "visible", @book.illustrator_visibility
34
+ assert_equal "medium", @book.difficulty
29
35
  end
30
36
 
31
37
  test "find via scope" do
@@ -34,6 +40,14 @@ class EnumTest < ActiveRecord::TestCase
34
40
  assert_equal @book, Book.in_english.first
35
41
  assert_equal @book, Book.author_visibility_visible.first
36
42
  assert_equal @book, Book.illustrator_visibility_visible.first
43
+ assert_equal @book, Book.medium_to_read.first
44
+ assert_equal books(:ddd), Book.forgotten.first
45
+ assert_equal books(:rfr), authors(:david).unpublished_books.first
46
+ end
47
+
48
+ test "find via negative scope" do
49
+ assert Book.not_published.exclude?(@book)
50
+ assert Book.not_proposed.include?(@book)
37
51
  end
38
52
 
39
53
  test "find via where with values" do
@@ -41,71 +55,84 @@ class EnumTest < ActiveRecord::TestCase
41
55
 
42
56
  assert_equal @book, Book.where(status: published).first
43
57
  assert_not_equal @book, Book.where(status: written).first
44
- assert_equal @book, Book.where(status: [published]).first
45
- assert_not_equal @book, Book.where(status: [written]).first
46
- assert_not_equal @book, Book.where("status <> ?", published).first
47
- assert_equal @book, Book.where("status <> ?", written).first
58
+ assert_equal @book, Book.where(status: [published, published]).first
59
+ assert_not_equal @book, Book.where(status: [written, written]).first
60
+ assert_not_equal @book, Book.where.not(status: published).first
61
+ assert_equal @book, Book.where.not(status: written).first
62
+ end
63
+
64
+ test "find via where with values.to_s" do
65
+ published, written = Book.statuses[:published].to_s, Book.statuses[:written].to_s
66
+
67
+ assert_equal @book, Book.where(status: published).first
68
+ assert_not_equal @book, Book.where(status: written).first
69
+ assert_equal @book, Book.where(status: [published, published]).first
70
+ assert_not_equal @book, Book.where(status: [written, written]).first
71
+ assert_not_equal @book, Book.where.not(status: published).first
72
+ assert_equal @book, Book.where.not(status: written).first
48
73
  end
49
74
 
50
75
  test "find via where with symbols" do
51
76
  assert_equal @book, Book.where(status: :published).first
52
77
  assert_not_equal @book, Book.where(status: :written).first
53
- assert_equal @book, Book.where(status: [:published]).first
54
- assert_not_equal @book, Book.where(status: [:written]).first
78
+ assert_equal @book, Book.where(status: [:published, :published]).first
79
+ assert_not_equal @book, Book.where(status: [:written, :written]).first
55
80
  assert_not_equal @book, Book.where.not(status: :published).first
56
81
  assert_equal @book, Book.where.not(status: :written).first
82
+ assert_equal books(:ddd), Book.where(last_read: :forgotten).first
57
83
  end
58
84
 
59
85
  test "find via where with strings" do
60
86
  assert_equal @book, Book.where(status: "published").first
61
87
  assert_not_equal @book, Book.where(status: "written").first
62
- assert_equal @book, Book.where(status: ["published"]).first
63
- assert_not_equal @book, Book.where(status: ["written"]).first
88
+ assert_equal @book, Book.where(status: ["published", "published"]).first
89
+ assert_not_equal @book, Book.where(status: ["written", "written"]).first
64
90
  assert_not_equal @book, Book.where.not(status: "published").first
65
91
  assert_equal @book, Book.where.not(status: "written").first
92
+ assert_equal books(:ddd), Book.where(last_read: "forgotten").first
66
93
  end
67
94
 
68
95
  test "build from scope" do
69
- assert Book.written.build.written?
70
- assert_not Book.written.build.proposed?
96
+ assert_predicate Book.written.build, :written?
97
+ assert_not_predicate Book.written.build, :proposed?
71
98
  end
72
99
 
73
100
  test "build from where" do
74
- assert Book.where(status: Book.statuses[:written]).build.written?
75
- assert_not Book.where(status: Book.statuses[:written]).build.proposed?
76
- assert Book.where(status: :written).build.written?
77
- assert_not Book.where(status: :written).build.proposed?
78
- assert Book.where(status: "written").build.written?
79
- assert_not Book.where(status: "written").build.proposed?
101
+ assert_predicate Book.where(status: Book.statuses[:written]).build, :written?
102
+ assert_not_predicate Book.where(status: Book.statuses[:written]).build, :proposed?
103
+ assert_predicate Book.where(status: :written).build, :written?
104
+ assert_not_predicate Book.where(status: :written).build, :proposed?
105
+ assert_predicate Book.where(status: "written").build, :written?
106
+ assert_not_predicate Book.where(status: "written").build, :proposed?
80
107
  end
81
108
 
82
109
  test "update by declaration" do
83
110
  @book.written!
84
- assert @book.written?
111
+ assert_predicate @book, :written?
85
112
  @book.in_english!
86
- assert @book.in_english?
113
+ assert_predicate @book, :in_english?
87
114
  @book.author_visibility_visible!
88
- assert @book.author_visibility_visible?
115
+ assert_predicate @book, :author_visibility_visible?
89
116
  end
90
117
 
91
118
  test "update by setter" do
92
119
  @book.update! status: :written
93
- assert @book.written?
120
+ assert_predicate @book, :written?
94
121
  end
95
122
 
96
123
  test "enum methods are overwritable" do
97
124
  assert_equal "do publish work...", @book.published!
98
- assert @book.published?
125
+ assert_predicate @book, :published?
99
126
  end
100
127
 
101
128
  test "direct assignment" do
102
129
  @book.status = :written
103
- assert @book.written?
130
+ assert_predicate @book, :written?
104
131
  end
105
132
 
106
133
  test "assign string value" do
107
134
  @book.status = "written"
108
- assert @book.written?
135
+ assert_predicate @book, :written?
109
136
  end
110
137
 
111
138
  test "enum changed attributes" do
@@ -117,13 +144,23 @@ class EnumTest < ActiveRecord::TestCase
117
144
  assert_equal old_language, @book.changed_attributes[:language]
118
145
  end
119
146
 
147
+ test "enum value after write symbol" do
148
+ @book.status = :proposed
149
+ assert_equal "proposed", @book.status
150
+ end
151
+
152
+ test "enum value after write string" do
153
+ @book.status = "proposed"
154
+ assert_equal "proposed", @book.status
155
+ end
156
+
120
157
  test "enum changes" do
121
158
  old_status = @book.status
122
159
  old_language = @book.language
123
160
  @book.status = :proposed
124
161
  @book.language = :spanish
125
- assert_equal [old_status, 'proposed'], @book.changes[:status]
126
- assert_equal [old_language, 'spanish'], @book.changes[:language]
162
+ assert_equal [old_status, "proposed"], @book.changes[:status]
163
+ assert_equal [old_language, "spanish"], @book.changes[:language]
127
164
  end
128
165
 
129
166
  test "enum attribute was" do
@@ -145,8 +182,8 @@ class EnumTest < ActiveRecord::TestCase
145
182
  test "enum attribute changed to" do
146
183
  @book.status = :proposed
147
184
  @book.language = :french
148
- assert @book.attribute_changed?(:status, to: 'proposed')
149
- assert @book.attribute_changed?(:language, to: 'french')
185
+ assert @book.attribute_changed?(:status, to: "proposed")
186
+ assert @book.attribute_changed?(:language, to: "french")
150
187
  end
151
188
 
152
189
  test "enum attribute changed from" do
@@ -163,8 +200,8 @@ class EnumTest < ActiveRecord::TestCase
163
200
  old_language = @book.language
164
201
  @book.status = :proposed
165
202
  @book.language = :french
166
- assert @book.attribute_changed?(:status, from: old_status, to: 'proposed')
167
- assert @book.attribute_changed?(:language, from: old_language, to: 'french')
203
+ assert @book.attribute_changed?(:status, from: old_status, to: "proposed")
204
+ assert @book.attribute_changed?(:language, from: old_language, to: "french")
168
205
  end
169
206
 
170
207
  test "enum didn't change" do
@@ -210,18 +247,37 @@ class EnumTest < ActiveRecord::TestCase
210
247
  assert_nil @book.reload.status
211
248
  end
212
249
 
250
+ test "deserialize nil value to enum which defines nil value to hash" do
251
+ assert_equal "forgotten", books(:ddd).last_read
252
+ end
253
+
213
254
  test "assign nil value" do
214
255
  @book.status = nil
215
256
  assert_nil @book.status
216
257
  end
217
258
 
259
+ test "assign nil value to enum which defines nil value to hash" do
260
+ @book.last_read = nil
261
+ assert_equal "forgotten", @book.last_read
262
+ end
263
+
218
264
  test "assign empty string value" do
219
- @book.status = ''
265
+ @book.status = ""
220
266
  assert_nil @book.status
221
267
  end
222
268
 
269
+ test "assign false value to a field defined as not boolean" do
270
+ @book.status = false
271
+ assert_nil @book.status
272
+ end
273
+
274
+ test "assign false value to a field defined as boolean" do
275
+ @book.boolean_status = false
276
+ assert_equal "disabled", @book.boolean_status
277
+ end
278
+
223
279
  test "assign long empty string value" do
224
- @book.status = ' '
280
+ @book.status = " "
225
281
  assert_nil @book.status
226
282
  end
227
283
 
@@ -232,25 +288,66 @@ class EnumTest < ActiveRecord::TestCase
232
288
  end
233
289
 
234
290
  test "building new objects with enum scopes" do
235
- assert Book.written.build.written?
236
- assert Book.read.build.read?
237
- assert Book.in_spanish.build.in_spanish?
238
- assert Book.illustrator_visibility_invisible.build.illustrator_visibility_invisible?
291
+ assert_predicate Book.written.build, :written?
292
+ assert_predicate Book.read.build, :read?
293
+ assert_predicate Book.in_spanish.build, :in_spanish?
294
+ assert_predicate Book.illustrator_visibility_invisible.build, :illustrator_visibility_invisible?
239
295
  end
240
296
 
241
297
  test "creating new objects with enum scopes" do
242
- assert Book.written.create.written?
243
- assert Book.read.create.read?
244
- assert Book.in_spanish.create.in_spanish?
245
- assert Book.illustrator_visibility_invisible.create.illustrator_visibility_invisible?
298
+ assert_predicate Book.written.create, :written?
299
+ assert_predicate Book.read.create, :read?
300
+ assert_predicate Book.in_spanish.create, :in_spanish?
301
+ assert_predicate Book.illustrator_visibility_invisible.create, :illustrator_visibility_invisible?
246
302
  end
247
303
 
248
- test "_before_type_cast returns the enum label (required for form fields)" do
249
- if @book.status_came_from_user?
250
- assert_equal "published", @book.status_before_type_cast
251
- else
252
- assert_equal "published", @book.status
304
+ test "attribute_before_type_cast" do
305
+ assert_equal 2, @book.status_before_type_cast
306
+ assert_equal "published", @book.status
307
+
308
+ @book.status = "published"
309
+
310
+ assert_equal "published", @book.status_before_type_cast
311
+ assert_equal "published", @book.status
312
+ end
313
+
314
+ test "attribute_for_database" do
315
+ assert_equal 2, @book.status_for_database
316
+ assert_equal "published", @book.status
317
+
318
+ @book.status = "published"
319
+
320
+ assert_equal 2, @book.status_for_database
321
+ assert_equal "published", @book.status
322
+ end
323
+
324
+ test "invalid definition values raise an ArgumentError" do
325
+ e = assert_raises(ArgumentError) do
326
+ Class.new(ActiveRecord::Base) do
327
+ self.table_name = "books"
328
+ enum status: [proposed: 1, written: 2, published: 3]
329
+ end
330
+ end
331
+
332
+ assert_match(/must be either a hash, an array of symbols, or an array of strings./, e.message)
333
+
334
+ e = assert_raises(ArgumentError) do
335
+ Class.new(ActiveRecord::Base) do
336
+ self.table_name = "books"
337
+ enum status: { "" => 1, "active" => 2 }
338
+ end
339
+ end
340
+
341
+ assert_match(/Enum label name must not be blank/, e.message)
342
+
343
+ e = assert_raises(ArgumentError) do
344
+ Class.new(ActiveRecord::Base) do
345
+ self.table_name = "books"
346
+ enum status: ["active", ""]
347
+ end
253
348
  end
349
+
350
+ assert_match(/Enum label name must not be blank/, e.message)
254
351
  end
255
352
 
256
353
  test "reserved enum names" do
@@ -296,6 +393,24 @@ class EnumTest < ActiveRecord::TestCase
296
393
  end
297
394
  end
298
395
 
396
+ test "reserved enum values for relation" do
397
+ relation_method_samples = [
398
+ :records,
399
+ :to_ary,
400
+ :scope_for_create
401
+ ]
402
+
403
+ relation_method_samples.each do |value|
404
+ e = assert_raises(ArgumentError, "enum value `#{value}` should not be allowed") do
405
+ Class.new(ActiveRecord::Base) do
406
+ self.table_name = "books"
407
+ enum category: [:other, value]
408
+ end
409
+ end
410
+ assert_match(/You tried to define an enum named .* on the model/, e.message)
411
+ end
412
+ end
413
+
299
414
  test "overriding enum method should not raise" do
300
415
  assert_nothing_raised do
301
416
  Class.new(ActiveRecord::Base) do
@@ -318,29 +433,29 @@ class EnumTest < ActiveRecord::TestCase
318
433
 
319
434
  test "validate uniqueness" do
320
435
  klass = Class.new(ActiveRecord::Base) do
321
- def self.name; 'Book'; end
436
+ def self.name; "Book"; end
322
437
  enum status: [:proposed, :written]
323
438
  validates_uniqueness_of :status
324
439
  end
325
440
  klass.delete_all
326
441
  klass.create!(status: "proposed")
327
442
  book = klass.new(status: "written")
328
- assert book.valid?
443
+ assert_predicate book, :valid?
329
444
  book.status = "proposed"
330
- assert_not book.valid?
445
+ assert_not_predicate book, :valid?
331
446
  end
332
447
 
333
448
  test "validate inclusion of value in array" do
334
449
  klass = Class.new(ActiveRecord::Base) do
335
- def self.name; 'Book'; end
450
+ def self.name; "Book"; end
336
451
  enum status: [:proposed, :written]
337
452
  validates_inclusion_of :status, in: ["written"]
338
453
  end
339
454
  klass.delete_all
340
455
  invalid_book = klass.new(status: "proposed")
341
- assert_not invalid_book.valid?
456
+ assert_not_predicate invalid_book, :valid?
342
457
  valid_book = klass.new(status: "written")
343
- assert valid_book.valid?
458
+ assert_predicate valid_book, :valid?
344
459
  end
345
460
 
346
461
  test "enums are distinct per class" do
@@ -356,11 +471,11 @@ class EnumTest < ActiveRecord::TestCase
356
471
 
357
472
  book1 = klass1.proposed.create!
358
473
  book1.status = :written
359
- assert_equal ['proposed', 'written'], book1.status_change
474
+ assert_equal ["proposed", "written"], book1.status_change
360
475
 
361
476
  book2 = klass2.drafted.create!
362
477
  book2.status = :uploaded
363
- assert_equal ['drafted', 'uploaded'], book2.status_change
478
+ assert_equal ["drafted", "uploaded"], book2.status_change
364
479
  end
365
480
 
366
481
  test "enums are inheritable" do
@@ -372,11 +487,25 @@ class EnumTest < ActiveRecord::TestCase
372
487
 
373
488
  book1 = subklass1.proposed.create!
374
489
  book1.status = :written
375
- assert_equal ['proposed', 'written'], book1.status_change
490
+ assert_equal ["proposed", "written"], book1.status_change
376
491
 
377
492
  book2 = subklass2.drafted.create!
378
493
  book2.status = :uploaded
379
- assert_equal ['drafted', 'uploaded'], book2.status_change
494
+ assert_equal ["drafted", "uploaded"], book2.status_change
495
+ end
496
+
497
+ test "attempting to modify enum raises error" do
498
+ e = assert_raises(RuntimeError) do
499
+ Book.statuses["bad_enum"] = 40
500
+ end
501
+
502
+ assert_match(/can't modify frozen/, e.message)
503
+
504
+ e = assert_raises(RuntimeError) do
505
+ Book.statuses.delete("published")
506
+ end
507
+
508
+ assert_match(/can't modify frozen/, e.message)
380
509
  end
381
510
 
382
511
  test "declare multiple enums at a time" do
@@ -387,10 +516,42 @@ class EnumTest < ActiveRecord::TestCase
387
516
  end
388
517
 
389
518
  book1 = klass.proposed.create!
390
- assert book1.proposed?
519
+ assert_predicate book1, :proposed?
391
520
 
392
521
  book2 = klass.single.create!
393
- assert book2.single?
522
+ assert_predicate book2, :single?
523
+ end
524
+
525
+ test "declare multiple enums with { _prefix: true }" do
526
+ klass = Class.new(ActiveRecord::Base) do
527
+ self.table_name = "books"
528
+
529
+ enum(
530
+ status: [:value_1],
531
+ last_read: [:value_1],
532
+ _prefix: true
533
+ )
534
+ end
535
+
536
+ instance = klass.new
537
+ assert_respond_to instance, :status_value_1?
538
+ assert_respond_to instance, :last_read_value_1?
539
+ end
540
+
541
+ test "declare multiple enums with { _suffix: true }" do
542
+ klass = Class.new(ActiveRecord::Base) do
543
+ self.table_name = "books"
544
+
545
+ enum(
546
+ status: [:value_1],
547
+ last_read: [:value_1],
548
+ _suffix: true
549
+ )
550
+ end
551
+
552
+ instance = klass.new
553
+ assert_respond_to instance, :value_1_status?
554
+ assert_respond_to instance, :value_1_last_read?
394
555
  end
395
556
 
396
557
  test "enum with alias_attribute" do
@@ -401,25 +562,62 @@ class EnumTest < ActiveRecord::TestCase
401
562
  end
402
563
 
403
564
  book = klass.proposed.create!
404
- assert book.proposed?
405
- assert_equal 'proposed', book.aliased_status
565
+ assert_predicate book, :proposed?
566
+ assert_equal "proposed", book.aliased_status
406
567
 
407
568
  book = klass.find(book.id)
408
- assert book.proposed?
409
- assert_equal 'proposed', book.aliased_status
569
+ assert_predicate book, :proposed?
570
+ assert_equal "proposed", book.aliased_status
410
571
  end
411
572
 
412
573
  test "query state by predicate with prefix" do
413
- assert @book.author_visibility_visible?
414
- assert_not @book.author_visibility_invisible?
415
- assert @book.illustrator_visibility_visible?
416
- assert_not @book.illustrator_visibility_invisible?
574
+ assert_predicate @book, :author_visibility_visible?
575
+ assert_not_predicate @book, :author_visibility_invisible?
576
+ assert_predicate @book, :illustrator_visibility_visible?
577
+ assert_not_predicate @book, :illustrator_visibility_invisible?
417
578
  end
418
579
 
419
580
  test "query state by predicate with custom prefix" do
420
- assert @book.in_english?
421
- assert_not @book.in_spanish?
422
- assert_not @book.in_french?
581
+ assert_predicate @book, :in_english?
582
+ assert_not_predicate @book, :in_spanish?
583
+ assert_not_predicate @book, :in_french?
584
+ end
585
+
586
+ test "query state by predicate with custom suffix" do
587
+ assert_predicate @book, :medium_to_read?
588
+ assert_not_predicate @book, :easy_to_read?
589
+ assert_not_predicate @book, :hard_to_read?
590
+ end
591
+
592
+ test "enum methods with custom suffix defined" do
593
+ assert_respond_to @book.class, :easy_to_read
594
+ assert_respond_to @book.class, :medium_to_read
595
+ assert_respond_to @book.class, :hard_to_read
596
+
597
+ assert_respond_to @book, :easy_to_read?
598
+ assert_respond_to @book, :medium_to_read?
599
+ assert_respond_to @book, :hard_to_read?
600
+
601
+ assert_respond_to @book, :easy_to_read!
602
+ assert_respond_to @book, :medium_to_read!
603
+ assert_respond_to @book, :hard_to_read!
604
+ end
605
+
606
+ test "update enum attributes with custom suffix" do
607
+ @book.medium_to_read!
608
+ assert_not_predicate @book, :easy_to_read?
609
+ assert_predicate @book, :medium_to_read?
610
+ assert_not_predicate @book, :hard_to_read?
611
+
612
+ @book.easy_to_read!
613
+ assert_predicate @book, :easy_to_read?
614
+ assert_not_predicate @book, :medium_to_read?
615
+ assert_not_predicate @book, :hard_to_read?
616
+
617
+ @book.hard_to_read!
618
+ assert_not_predicate @book, :easy_to_read?
619
+ assert_not_predicate @book, :medium_to_read?
620
+ assert_predicate @book, :hard_to_read?
423
621
  end
424
622
 
425
623
  test "uses default status when no status is provided in fixtures" do
@@ -430,15 +628,196 @@ class EnumTest < ActiveRecord::TestCase
430
628
 
431
629
  test "uses default value from database on initialization" do
432
630
  book = Book.new
433
- assert book.proposed?
631
+ assert_predicate book, :proposed?
434
632
  end
435
633
 
436
634
  test "uses default value from database on initialization when using custom mapping" do
437
635
  book = Book.new
438
- assert book.hard?
636
+ assert_predicate book, :hard?
439
637
  end
440
638
 
441
639
  test "data type of Enum type" do
442
- assert_equal :integer, Book.type_for_attribute('status').type
640
+ assert_equal :integer, Book.type_for_attribute("status").type
641
+ end
642
+
643
+ test "enum on custom attribute with default" do
644
+ klass = Class.new(ActiveRecord::Base) do
645
+ self.table_name = "books"
646
+ attribute :status, default: 2
647
+ enum status: [:proposed, :written, :published]
648
+ end
649
+
650
+ assert_equal "published", klass.new.status
651
+ end
652
+
653
+ test "overloaded default" do
654
+ klass = Class.new(ActiveRecord::Base) do
655
+ self.table_name = "books"
656
+ enum status: [:proposed, :written, :published], _default: :published
657
+ end
658
+
659
+ assert_equal "published", klass.new.status
660
+ end
661
+
662
+ test "scopes can be disabled" do
663
+ klass = Class.new(ActiveRecord::Base) do
664
+ self.table_name = "books"
665
+ enum status: [:proposed, :written], _scopes: false
666
+ end
667
+
668
+ assert_raises(NoMethodError) { klass.proposed }
669
+ end
670
+
671
+ test "scopes are named like methods" do
672
+ klass = Class.new(ActiveRecord::Base) do
673
+ self.table_name = "cats"
674
+ enum breed: { "American Bobtail" => 0, "Balinese-Javanese" => 1 }
675
+ end
676
+
677
+ assert_respond_to klass, :American_Bobtail
678
+ assert_respond_to klass, :Balinese_Javanese
679
+ end
680
+
681
+ test "capital characters for enum names" do
682
+ klass = Class.new(ActiveRecord::Base) do
683
+ self.table_name = "computers"
684
+ enum extendedWarranty: [:extendedSilver, :extendedGold]
685
+ end
686
+
687
+ computer = klass.extendedSilver.build
688
+ assert_predicate computer, :extendedSilver?
689
+ assert_not_predicate computer, :extendedGold?
690
+ end
691
+
692
+ test "unicode characters for enum names" do
693
+ klass = Class.new(ActiveRecord::Base) do
694
+ self.table_name = "books"
695
+ enum language: [:πŸ‡ΊπŸ‡Έ, :πŸ‡ͺπŸ‡Έ, :πŸ‡«πŸ‡·]
696
+ end
697
+
698
+ book = klass.πŸ‡ΊπŸ‡Έ.build
699
+ assert_predicate book, :πŸ‡ΊπŸ‡Έ?
700
+ assert_not_predicate book, :πŸ‡ͺπŸ‡Έ?
701
+ end
702
+
703
+ test "mangling collision for enum names" do
704
+ klass = Class.new(ActiveRecord::Base) do
705
+ self.table_name = "computers"
706
+ enum timezone: [:"Etc/GMT+1", :"Etc/GMT-1"]
707
+ end
708
+
709
+ computer = klass.public_send(:"Etc/GMT+1").build
710
+ assert_predicate computer, :"Etc/GMT+1?"
711
+ assert_not_predicate computer, :"Etc/GMT-1?"
712
+ end
713
+
714
+ test "deserialize enum value to original hash key" do
715
+ proposed = Struct.new(:to_s).new("proposed")
716
+ written = Struct.new(:to_s).new("written")
717
+ klass = Class.new(ActiveRecord::Base) do
718
+ self.table_name = "books"
719
+ enum status: { proposed => 0, written => 1 }
720
+ end
721
+
722
+ book = klass.create!(status: 0)
723
+ assert_equal proposed, book.status
724
+ assert_predicate book, :proposed?
725
+ assert_not_predicate book, :written?
726
+ end
727
+
728
+ test "enum logs a warning if auto-generated negative scopes would clash with other enum names" do
729
+ old_logger = ActiveRecord::Base.logger
730
+ logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
731
+
732
+ ActiveRecord::Base.logger = logger
733
+
734
+ expected_message_1 = "Enum element 'not_sent' in Book uses the prefix 'not_'."\
735
+ " This has caused a conflict with auto generated negative scopes."\
736
+ " Avoid using enum elements starting with 'not' where the positive form is also an element."
737
+
738
+ # this message comes from ActiveRecord::Scoping::Named, but it's worth noting that both occur in this case
739
+ expected_message_2 = "Creating scope :not_sent. Overwriting existing method Book.not_sent."
740
+
741
+ Class.new(ActiveRecord::Base) do
742
+ def self.name
743
+ "Book"
744
+ end
745
+ silence_warnings do
746
+ enum status: [:sent, :not_sent]
747
+ end
748
+ end
749
+
750
+ assert_includes(logger.logged(:warn), expected_message_1)
751
+ assert_includes(logger.logged(:warn), expected_message_2)
752
+ ensure
753
+ ActiveRecord::Base.logger = old_logger
754
+ end
755
+
756
+ test "enum logs a warning if auto-generated negative scopes would clash with other enum names regardless of order" do
757
+ old_logger = ActiveRecord::Base.logger
758
+ logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
759
+
760
+ ActiveRecord::Base.logger = logger
761
+
762
+ expected_message_1 = "Enum element 'not_sent' in Book uses the prefix 'not_'."\
763
+ " This has caused a conflict with auto generated negative scopes."\
764
+ " Avoid using enum elements starting with 'not' where the positive form is also an element."
765
+
766
+ # this message comes from ActiveRecord::Scoping::Named, but it's worth noting that both occur in this case
767
+ expected_message_2 = "Creating scope :not_sent. Overwriting existing method Book.not_sent."
768
+
769
+ Class.new(ActiveRecord::Base) do
770
+ def self.name
771
+ "Book"
772
+ end
773
+ silence_warnings do
774
+ enum status: [:not_sent, :sent]
775
+ end
776
+ end
777
+
778
+ assert_includes(logger.logged(:warn), expected_message_1)
779
+ assert_includes(logger.logged(:warn), expected_message_2)
780
+ ensure
781
+ ActiveRecord::Base.logger = old_logger
782
+ end
783
+
784
+ test "enum doesn't log a warning if no clashes detected" do
785
+ old_logger = ActiveRecord::Base.logger
786
+ logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
787
+
788
+ ActiveRecord::Base.logger = logger
789
+
790
+ Class.new(ActiveRecord::Base) do
791
+ def self.name
792
+ "Book"
793
+ end
794
+ silence_warnings do
795
+ enum status: [:not_sent]
796
+ end
797
+ end
798
+
799
+ assert_empty(logger.logged(:warn))
800
+ ensure
801
+ ActiveRecord::Base.logger = old_logger
802
+ end
803
+
804
+ test "enum doesn't log a warning if opting out of scopes" do
805
+ old_logger = ActiveRecord::Base.logger
806
+ logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
807
+
808
+ ActiveRecord::Base.logger = logger
809
+
810
+ Class.new(ActiveRecord::Base) do
811
+ def self.name
812
+ "Book"
813
+ end
814
+ silence_warnings do
815
+ enum status: [:not_sent, :sent], _scopes: false
816
+ end
817
+ end
818
+
819
+ assert_empty(logger.logged(:warn))
820
+ ensure
821
+ ActiveRecord::Base.logger = old_logger
443
822
  end
444
823
  end