ibm_db 5.6.1-arm64-darwin-24

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 (753) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +299 -0
  3. data/LICENSE +55 -0
  4. data/MANIFEST +14 -0
  5. data/ParameterizedQueries README +39 -0
  6. data/README +210 -0
  7. data/ext/Makefile +270 -0
  8. data/ext/Makefile.nt32 +181 -0
  9. data/ext/Makefile.nt32.191 +212 -0
  10. data/ext/extconf.rb +320 -0
  11. data/ext/gil_release_version.h +3 -0
  12. data/ext/ibm_db.bundle +0 -0
  13. data/ext/ibm_db.c +11865 -0
  14. data/ext/ibm_db.o +0 -0
  15. data/ext/mkmf.log +98 -0
  16. data/ext/ruby_ibm_db.h +241 -0
  17. data/ext/ruby_ibm_db_cli.c +867 -0
  18. data/ext/ruby_ibm_db_cli.h +508 -0
  19. data/ext/ruby_ibm_db_cli.o +0 -0
  20. data/ext/unicode_support_version.h +3 -0
  21. data/init.rb +42 -0
  22. data/lib/IBM_DB.rb +27 -0
  23. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4407 -0
  24. data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1965 -0
  25. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -0
  26. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -0
  27. data/lib/ibm_db.bundle +0 -0
  28. data/test/active_record/connection_adapters/fake_adapter.rb +52 -0
  29. data/test/activejob/destroy_association_async_test.rb +305 -0
  30. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  31. data/test/activejob/helper.rb +15 -0
  32. data/test/assets/example.log +1 -0
  33. data/test/assets/flowers.jpg +0 -0
  34. data/test/assets/schema_dump_5_1.yml +345 -0
  35. data/test/assets/test.txt +1 -0
  36. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  37. data/test/cases/adapter_test.rb +565 -0
  38. data/test/cases/adapters/mysql2/active_schema_test.rb +203 -0
  39. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  40. data/test/cases/adapters/mysql2/bind_parameter_test.rb +52 -0
  41. data/test/cases/adapters/mysql2/boolean_test.rb +102 -0
  42. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +65 -0
  43. data/test/cases/adapters/mysql2/charset_collation_test.rb +57 -0
  44. data/test/cases/adapters/mysql2/connection_test.rb +208 -0
  45. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  46. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +49 -0
  47. data/test/cases/adapters/mysql2/enum_test.rb +47 -0
  48. data/test/cases/adapters/mysql2/explain_test.rb +23 -0
  49. data/test/cases/adapters/mysql2/json_test.rb +24 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  51. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +238 -0
  52. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  53. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  54. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  55. data/test/cases/adapters/mysql2/schema_migrations_test.rb +64 -0
  56. data/test/cases/adapters/mysql2/schema_test.rb +128 -0
  57. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  58. data/test/cases/adapters/mysql2/sp_test.rb +38 -0
  59. data/test/cases/adapters/mysql2/sql_types_test.rb +16 -0
  60. data/test/cases/adapters/mysql2/table_options_test.rb +125 -0
  61. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  62. data/test/cases/adapters/mysql2/unsigned_type_test.rb +68 -0
  63. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  64. data/test/cases/adapters/postgresql/active_schema_test.rb +113 -0
  65. data/test/cases/adapters/postgresql/array_test.rb +394 -0
  66. data/test/cases/adapters/postgresql/bit_string_test.rb +84 -0
  67. data/test/cases/adapters/postgresql/bytea_test.rb +135 -0
  68. data/test/cases/adapters/postgresql/case_insensitive_test.rb +27 -0
  69. data/test/cases/adapters/postgresql/change_schema_test.rb +40 -0
  70. data/test/cases/adapters/postgresql/cidr_test.rb +27 -0
  71. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  72. data/test/cases/adapters/postgresql/collation_test.rb +55 -0
  73. data/test/cases/adapters/postgresql/composite_test.rb +134 -0
  74. data/test/cases/adapters/postgresql/connection_test.rb +245 -0
  75. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  76. data/test/cases/adapters/postgresql/datatype_test.rb +89 -0
  77. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  78. data/test/cases/adapters/postgresql/domain_test.rb +49 -0
  79. data/test/cases/adapters/postgresql/enum_test.rb +93 -0
  80. data/test/cases/adapters/postgresql/explain_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/extension_migration_test.rb +64 -0
  82. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  83. data/test/cases/adapters/postgresql/full_text_test.rb +46 -0
  84. data/test/cases/adapters/postgresql/geometric_test.rb +372 -0
  85. data/test/cases/adapters/postgresql/hstore_test.rb +390 -0
  86. data/test/cases/adapters/postgresql/infinity_test.rb +108 -0
  87. data/test/cases/adapters/postgresql/integer_test.rb +27 -0
  88. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  89. data/test/cases/adapters/postgresql/json_test.rb +52 -0
  90. data/test/cases/adapters/postgresql/ltree_test.rb +51 -0
  91. data/test/cases/adapters/postgresql/money_test.rb +127 -0
  92. data/test/cases/adapters/postgresql/network_test.rb +102 -0
  93. data/test/cases/adapters/postgresql/numbers_test.rb +51 -0
  94. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  95. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  96. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  97. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +447 -0
  98. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  99. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  100. data/test/cases/adapters/postgresql/quoting_test.rb +50 -0
  101. data/test/cases/adapters/postgresql/range_test.rb +457 -0
  102. data/test/cases/adapters/postgresql/referential_integrity_test.rb +112 -0
  103. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -0
  104. data/test/cases/adapters/postgresql/schema_authorization_test.rb +110 -0
  105. data/test/cases/adapters/postgresql/schema_test.rb +713 -0
  106. data/test/cases/adapters/postgresql/serial_test.rb +156 -0
  107. data/test/cases/adapters/postgresql/statement_pool_test.rb +61 -0
  108. data/test/cases/adapters/postgresql/timestamp_test.rb +92 -0
  109. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  110. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  111. data/test/cases/adapters/postgresql/type_lookup_test.rb +35 -0
  112. data/test/cases/adapters/postgresql/utils_test.rb +64 -0
  113. data/test/cases/adapters/postgresql/uuid_test.rb +411 -0
  114. data/test/cases/adapters/postgresql/xml_test.rb +50 -0
  115. data/test/cases/adapters/sqlite3/collation_test.rb +64 -0
  116. data/test/cases/adapters/sqlite3/copy_table_test.rb +101 -0
  117. data/test/cases/adapters/sqlite3/explain_test.rb +23 -0
  118. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  119. data/test/cases/adapters/sqlite3/quoting_test.rb +79 -0
  120. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  121. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +628 -0
  122. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  123. data/test/cases/adapters/sqlite3/statement_pool_test.rb +21 -0
  124. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  125. data/test/cases/aggregations_test.rb +170 -0
  126. data/test/cases/annotate_test.rb +46 -0
  127. data/test/cases/ar_schema_test.rb +213 -0
  128. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  129. data/test/cases/arel/attributes/math_test.rb +83 -0
  130. data/test/cases/arel/attributes_test.rb +27 -0
  131. data/test/cases/arel/collectors/bind_test.rb +40 -0
  132. data/test/cases/arel/collectors/composite_test.rb +47 -0
  133. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  134. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  135. data/test/cases/arel/crud_test.rb +65 -0
  136. data/test/cases/arel/delete_manager_test.rb +53 -0
  137. data/test/cases/arel/factory_methods_test.rb +46 -0
  138. data/test/cases/arel/helper.rb +45 -0
  139. data/test/cases/arel/insert_manager_test.rb +241 -0
  140. data/test/cases/arel/nodes/and_test.rb +30 -0
  141. data/test/cases/arel/nodes/as_test.rb +36 -0
  142. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  143. data/test/cases/arel/nodes/bin_test.rb +35 -0
  144. data/test/cases/arel/nodes/binary_test.rb +29 -0
  145. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  146. data/test/cases/arel/nodes/case_test.rb +96 -0
  147. data/test/cases/arel/nodes/casted_test.rb +18 -0
  148. data/test/cases/arel/nodes/comment_test.rb +22 -0
  149. data/test/cases/arel/nodes/count_test.rb +35 -0
  150. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  151. data/test/cases/arel/nodes/descending_test.rb +46 -0
  152. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  153. data/test/cases/arel/nodes/equality_test.rb +62 -0
  154. data/test/cases/arel/nodes/extract_test.rb +43 -0
  155. data/test/cases/arel/nodes/false_test.rb +21 -0
  156. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  157. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  158. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  159. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  160. data/test/cases/arel/nodes/node_test.rb +22 -0
  161. data/test/cases/arel/nodes/not_test.rb +31 -0
  162. data/test/cases/arel/nodes/or_test.rb +36 -0
  163. data/test/cases/arel/nodes/over_test.rb +69 -0
  164. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  165. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  166. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  167. data/test/cases/arel/nodes/sum_test.rb +35 -0
  168. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  169. data/test/cases/arel/nodes/true_test.rb +21 -0
  170. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  171. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  172. data/test/cases/arel/nodes/window_test.rb +81 -0
  173. data/test/cases/arel/nodes_test.rb +34 -0
  174. data/test/cases/arel/select_manager_test.rb +1238 -0
  175. data/test/cases/arel/support/fake_record.rb +135 -0
  176. data/test/cases/arel/table_test.rb +216 -0
  177. data/test/cases/arel/update_manager_test.rb +126 -0
  178. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  179. data/test/cases/arel/visitors/dot_test.rb +90 -0
  180. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  181. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  182. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  183. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  184. data/test/cases/associations/association_scope_test.rb +16 -0
  185. data/test/cases/associations/belongs_to_associations_test.rb +1493 -0
  186. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +43 -0
  187. data/test/cases/associations/callbacks_test.rb +208 -0
  188. data/test/cases/associations/cascaded_eager_loading_test.rb +245 -0
  189. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +156 -0
  190. data/test/cases/associations/eager_load_nested_include_test.rb +127 -0
  191. data/test/cases/associations/eager_singularization_test.rb +148 -0
  192. data/test/cases/associations/eager_test.rb +1658 -0
  193. data/test/cases/associations/extension_test.rb +93 -0
  194. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1025 -0
  195. data/test/cases/associations/has_many_associations_test.rb +3074 -0
  196. data/test/cases/associations/has_many_through_associations_test.rb +1580 -0
  197. data/test/cases/associations/has_one_associations_test.rb +872 -0
  198. data/test/cases/associations/has_one_through_associations_test.rb +429 -0
  199. data/test/cases/associations/inner_join_association_test.rb +215 -0
  200. data/test/cases/associations/inverse_associations_test.rb +941 -0
  201. data/test/cases/associations/join_model_test.rb +787 -0
  202. data/test/cases/associations/left_outer_join_association_test.rb +123 -0
  203. data/test/cases/associations/nested_through_associations_test.rb +636 -0
  204. data/test/cases/associations/required_test.rb +127 -0
  205. data/test/cases/associations_test.rb +516 -0
  206. data/test/cases/attribute_decorators_test.rb +126 -0
  207. data/test/cases/attribute_methods/read_test.rb +60 -0
  208. data/test/cases/attribute_methods_test.rb +1124 -0
  209. data/test/cases/attribute_set_test.rb +270 -0
  210. data/test/cases/attribute_test.rb +246 -0
  211. data/test/cases/attributes_test.rb +371 -0
  212. data/test/cases/autosave_association_test.rb +1953 -0
  213. data/test/cases/base_prevent_writes_test.rb +229 -0
  214. data/test/cases/base_test.rb +1770 -0
  215. data/test/cases/batches_test.rb +695 -0
  216. data/test/cases/binary_test.rb +39 -0
  217. data/test/cases/bind_parameter_test.rb +283 -0
  218. data/test/cases/boolean_test.rb +52 -0
  219. data/test/cases/cache_key_test.rb +131 -0
  220. data/test/cases/calculations_test.rb +1361 -0
  221. data/test/cases/callbacks_test.rb +503 -0
  222. data/test/cases/clone_test.rb +45 -0
  223. data/test/cases/coders/json_test.rb +17 -0
  224. data/test/cases/coders/yaml_column_test.rb +66 -0
  225. data/test/cases/collection_cache_key_test.rb +272 -0
  226. data/test/cases/column_alias_test.rb +19 -0
  227. data/test/cases/column_definition_test.rb +34 -0
  228. data/test/cases/comment_test.rb +204 -0
  229. data/test/cases/connection_adapters/adapter_leasing_test.rb +60 -0
  230. data/test/cases/connection_adapters/connection_handler_test.rb +467 -0
  231. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  232. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  233. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  234. data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
  235. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  236. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  237. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  238. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +436 -0
  239. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +81 -0
  240. data/test/cases/connection_adapters/quoting_test.rb +13 -0
  241. data/test/cases/connection_adapters/schema_cache_test.rb +294 -0
  242. data/test/cases/connection_adapters/type_lookup_test.rb +119 -0
  243. data/test/cases/connection_management_test.rb +114 -0
  244. data/test/cases/connection_pool_test.rb +754 -0
  245. data/test/cases/connection_specification/resolver_test.rb +131 -0
  246. data/test/cases/core_test.rb +136 -0
  247. data/test/cases/counter_cache_test.rb +368 -0
  248. data/test/cases/custom_locking_test.rb +19 -0
  249. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  250. data/test/cases/database_configurations/resolver_test.rb +150 -0
  251. data/test/cases/database_configurations_test.rb +145 -0
  252. data/test/cases/database_selector_test.rb +296 -0
  253. data/test/cases/database_statements_test.rb +36 -0
  254. data/test/cases/date_test.rb +36 -0
  255. data/test/cases/date_time_precision_test.rb +129 -0
  256. data/test/cases/date_time_test.rb +76 -0
  257. data/test/cases/defaults_test.rb +254 -0
  258. data/test/cases/delegated_type_test.rb +57 -0
  259. data/test/cases/dirty_test.rb +959 -0
  260. data/test/cases/disconnected_test.rb +30 -0
  261. data/test/cases/dup_test.rb +184 -0
  262. data/test/cases/enum_test.rb +823 -0
  263. data/test/cases/errors_test.rb +16 -0
  264. data/test/cases/explain_subscriber_test.rb +66 -0
  265. data/test/cases/explain_test.rb +79 -0
  266. data/test/cases/filter_attributes_test.rb +153 -0
  267. data/test/cases/finder_respond_to_test.rb +60 -0
  268. data/test/cases/finder_test.rb +1676 -0
  269. data/test/cases/fixture_set/file_test.rb +152 -0
  270. data/test/cases/fixtures_test.rb +1645 -0
  271. data/test/cases/forbidden_attributes_protection_test.rb +130 -0
  272. data/test/cases/habtm_destroy_order_test.rb +61 -0
  273. data/test/cases/helper.rb +233 -0
  274. data/test/cases/hot_compatibility_test.rb +143 -0
  275. data/test/cases/i18n_test.rb +46 -0
  276. data/test/cases/inheritance_test.rb +671 -0
  277. data/test/cases/insert_all_test.rb +489 -0
  278. data/test/cases/instrumentation_test.rb +101 -0
  279. data/test/cases/integration_test.rb +243 -0
  280. data/test/cases/invalid_connection_test.rb +26 -0
  281. data/test/cases/invertible_migration_test.rb +527 -0
  282. data/test/cases/json_attribute_test.rb +35 -0
  283. data/test/cases/json_serialization_test.rb +310 -0
  284. data/test/cases/json_shared_test_cases.rb +290 -0
  285. data/test/cases/locking_test.rb +787 -0
  286. data/test/cases/log_subscriber_test.rb +267 -0
  287. data/test/cases/marshal_serialization_test.rb +39 -0
  288. data/test/cases/migration/change_schema_test.rb +504 -0
  289. data/test/cases/migration/change_table_test.rb +364 -0
  290. data/test/cases/migration/check_constraint_test.rb +162 -0
  291. data/test/cases/migration/column_attributes_test.rb +186 -0
  292. data/test/cases/migration/column_positioning_test.rb +68 -0
  293. data/test/cases/migration/columns_test.rb +326 -0
  294. data/test/cases/migration/command_recorder_test.rb +437 -0
  295. data/test/cases/migration/compatibility_test.rb +673 -0
  296. data/test/cases/migration/create_join_table_test.rb +167 -0
  297. data/test/cases/migration/foreign_key_test.rb +581 -0
  298. data/test/cases/migration/helper.rb +40 -0
  299. data/test/cases/migration/index_test.rb +267 -0
  300. data/test/cases/migration/logger_test.rb +39 -0
  301. data/test/cases/migration/pending_migrations_test.rb +106 -0
  302. data/test/cases/migration/references_foreign_key_test.rb +235 -0
  303. data/test/cases/migration/references_index_test.rb +120 -0
  304. data/test/cases/migration/references_statements_test.rb +137 -0
  305. data/test/cases/migration/rename_table_test.rb +116 -0
  306. data/test/cases/migration_test.rb +1525 -0
  307. data/test/cases/migrator_test.rb +527 -0
  308. data/test/cases/mixin_test.rb +64 -0
  309. data/test/cases/modules_test.rb +174 -0
  310. data/test/cases/multi_db_migrator_test.rb +223 -0
  311. data/test/cases/multiparameter_attributes_test.rb +399 -0
  312. data/test/cases/multiple_db_test.rb +116 -0
  313. data/test/cases/nested_attributes_test.rb +1119 -0
  314. data/test/cases/nested_attributes_with_callbacks_test.rb +146 -0
  315. data/test/cases/null_relation_test.rb +84 -0
  316. data/test/cases/numeric_data_test.rb +93 -0
  317. data/test/cases/persistence_test.rb +1093 -0
  318. data/test/cases/pooled_connections_test.rb +73 -0
  319. data/test/cases/prepared_statement_status_test.rb +48 -0
  320. data/test/cases/primary_keys_test.rb +482 -0
  321. data/test/cases/query_cache_test.rb +915 -0
  322. data/test/cases/quoting_test.rb +303 -0
  323. data/test/cases/readonly_test.rb +120 -0
  324. data/test/cases/reaper_test.rb +199 -0
  325. data/test/cases/reflection_test.rb +520 -0
  326. data/test/cases/relation/delegation_test.rb +76 -0
  327. data/test/cases/relation/delete_all_test.rb +117 -0
  328. data/test/cases/relation/merging_test.rb +434 -0
  329. data/test/cases/relation/mutation_test.rb +145 -0
  330. data/test/cases/relation/or_test.rb +192 -0
  331. data/test/cases/relation/predicate_builder_test.rb +31 -0
  332. data/test/cases/relation/record_fetch_warning_test.rb +42 -0
  333. data/test/cases/relation/select_test.rb +67 -0
  334. data/test/cases/relation/update_all_test.rb +317 -0
  335. data/test/cases/relation/where_chain_test.rb +141 -0
  336. data/test/cases/relation/where_clause_test.rb +257 -0
  337. data/test/cases/relation/where_test.rb +429 -0
  338. data/test/cases/relation_test.rb +482 -0
  339. data/test/cases/relations_test.rb +2251 -0
  340. data/test/cases/reload_models_test.rb +26 -0
  341. data/test/cases/reserved_word_test.rb +141 -0
  342. data/test/cases/result_test.rb +141 -0
  343. data/test/cases/sanitize_test.rb +192 -0
  344. data/test/cases/schema_dumper_test.rb +550 -0
  345. data/test/cases/schema_loading_test.rb +53 -0
  346. data/test/cases/scoping/default_scoping_test.rb +569 -0
  347. data/test/cases/scoping/named_scoping_test.rb +649 -0
  348. data/test/cases/scoping/relation_scoping_test.rb +522 -0
  349. data/test/cases/secure_token_test.rb +47 -0
  350. data/test/cases/serialization_test.rb +106 -0
  351. data/test/cases/serialized_attribute_test.rb +455 -0
  352. data/test/cases/signed_id_test.rb +168 -0
  353. data/test/cases/statement_cache_test.rb +153 -0
  354. data/test/cases/statement_invalid_test.rb +42 -0
  355. data/test/cases/store_test.rb +320 -0
  356. data/test/cases/strict_loading_test.rb +473 -0
  357. data/test/cases/suppressor_test.rb +77 -0
  358. data/test/cases/tasks/database_tasks_test.rb +1526 -0
  359. data/test/cases/tasks/mysql_rake_test.rb +417 -0
  360. data/test/cases/tasks/postgresql_rake_test.rb +534 -0
  361. data/test/cases/tasks/sqlite_rake_test.rb +267 -0
  362. data/test/cases/test_case.rb +142 -0
  363. data/test/cases/test_databases_test.rb +79 -0
  364. data/test/cases/test_fixtures_test.rb +96 -0
  365. data/test/cases/time_precision_test.rb +125 -0
  366. data/test/cases/timestamp_test.rb +504 -0
  367. data/test/cases/touch_later_test.rb +123 -0
  368. data/test/cases/transaction_callbacks_test.rb +772 -0
  369. data/test/cases/transaction_isolation_test.rb +106 -0
  370. data/test/cases/transactions_test.rb +1285 -0
  371. data/test/cases/type/adapter_specific_registry_test.rb +145 -0
  372. data/test/cases/type/date_time_test.rb +16 -0
  373. data/test/cases/type/integer_test.rb +29 -0
  374. data/test/cases/type/string_test.rb +24 -0
  375. data/test/cases/type/time_test.rb +28 -0
  376. data/test/cases/type/type_map_test.rb +178 -0
  377. data/test/cases/type/unsigned_integer_test.rb +19 -0
  378. data/test/cases/type_test.rb +41 -0
  379. data/test/cases/types_test.rb +26 -0
  380. data/test/cases/unconnected_test.rb +46 -0
  381. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  382. data/test/cases/validations/absence_validation_test.rb +75 -0
  383. data/test/cases/validations/association_validation_test.rb +99 -0
  384. data/test/cases/validations/i18n_generate_message_validation_test.rb +102 -0
  385. data/test/cases/validations/i18n_validation_test.rb +87 -0
  386. data/test/cases/validations/length_validation_test.rb +80 -0
  387. data/test/cases/validations/numericality_validation_test.rb +181 -0
  388. data/test/cases/validations/presence_validation_test.rb +105 -0
  389. data/test/cases/validations/uniqueness_validation_test.rb +618 -0
  390. data/test/cases/validations_repair_helper.rb +21 -0
  391. data/test/cases/validations_test.rb +229 -0
  392. data/test/cases/view_test.rb +222 -0
  393. data/test/cases/yaml_serialization_test.rb +166 -0
  394. data/test/config.example.yml +97 -0
  395. data/test/config.rb +7 -0
  396. data/test/config.yml +220 -0
  397. data/test/connections/native_ibm_db/connection.rb +44 -0
  398. data/test/fixtures/accounts.yml +29 -0
  399. data/test/fixtures/admin/accounts.yml +2 -0
  400. data/test/fixtures/admin/randomly_named_a9.yml +7 -0
  401. data/test/fixtures/admin/randomly_named_b0.yml +7 -0
  402. data/test/fixtures/admin/users.yml +10 -0
  403. data/test/fixtures/all/admin +1 -0
  404. data/test/fixtures/all/developers.yml +0 -0
  405. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  406. data/test/fixtures/all/people.yml +0 -0
  407. data/test/fixtures/all/tasks.yml +0 -0
  408. data/test/fixtures/author_addresses.yml +11 -0
  409. data/test/fixtures/author_favorites.yml +4 -0
  410. data/test/fixtures/authors.yml +17 -0
  411. data/test/fixtures/bad_posts.yml +9 -0
  412. data/test/fixtures/binaries.yml +137 -0
  413. data/test/fixtures/books.yml +38 -0
  414. data/test/fixtures/bulbs.yml +5 -0
  415. data/test/fixtures/cars.yml +9 -0
  416. data/test/fixtures/categories/special_categories.yml +9 -0
  417. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  418. data/test/fixtures/categories.yml +19 -0
  419. data/test/fixtures/categories_ordered.yml +7 -0
  420. data/test/fixtures/categories_posts.yml +34 -0
  421. data/test/fixtures/categorizations.yml +23 -0
  422. data/test/fixtures/citations.yml +5 -0
  423. data/test/fixtures/clubs.yml +8 -0
  424. data/test/fixtures/collections.yml +3 -0
  425. data/test/fixtures/colleges.yml +3 -0
  426. data/test/fixtures/comments.yml +72 -0
  427. data/test/fixtures/companies.yml +72 -0
  428. data/test/fixtures/computers.yml +12 -0
  429. data/test/fixtures/content.yml +3 -0
  430. data/test/fixtures/content_positions.yml +3 -0
  431. data/test/fixtures/courses.yml +8 -0
  432. data/test/fixtures/customers.yml +35 -0
  433. data/test/fixtures/dashboards.yml +6 -0
  434. data/test/fixtures/dead_parrots.yml +5 -0
  435. data/test/fixtures/developers.yml +22 -0
  436. data/test/fixtures/developers_projects.yml +17 -0
  437. data/test/fixtures/dog_lovers.yml +7 -0
  438. data/test/fixtures/dogs.yml +4 -0
  439. data/test/fixtures/doubloons.yml +3 -0
  440. data/test/fixtures/edges.yml +5 -0
  441. data/test/fixtures/entrants.yml +14 -0
  442. data/test/fixtures/essays.yml +16 -0
  443. data/test/fixtures/faces.yml +11 -0
  444. data/test/fixtures/fk_test_has_fk.yml +3 -0
  445. data/test/fixtures/fk_test_has_pk.yml +2 -0
  446. data/test/fixtures/friendships.yml +4 -0
  447. data/test/fixtures/funny_jokes.yml +10 -0
  448. data/test/fixtures/humans.yml +5 -0
  449. data/test/fixtures/interests.yml +33 -0
  450. data/test/fixtures/items.yml +3 -0
  451. data/test/fixtures/jobs.yml +7 -0
  452. data/test/fixtures/legacy_things.yml +3 -0
  453. data/test/fixtures/live_parrots.yml +4 -0
  454. data/test/fixtures/mateys.yml +4 -0
  455. data/test/fixtures/member_details.yml +8 -0
  456. data/test/fixtures/member_types.yml +6 -0
  457. data/test/fixtures/members.yml +11 -0
  458. data/test/fixtures/memberships.yml +41 -0
  459. data/test/fixtures/men.yml +5 -0
  460. data/test/fixtures/minimalistics.yml +5 -0
  461. data/test/fixtures/minivans.yml +5 -0
  462. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  463. data/test/fixtures/mixins.yml +29 -0
  464. data/test/fixtures/movies.yml +7 -0
  465. data/test/fixtures/naked/yml/accounts.yml +1 -0
  466. data/test/fixtures/naked/yml/companies.yml +1 -0
  467. data/test/fixtures/naked/yml/courses.yml +1 -0
  468. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  469. data/test/fixtures/naked/yml/parrots.yml +3 -0
  470. data/test/fixtures/naked/yml/trees.yml +3 -0
  471. data/test/fixtures/nodes.yml +29 -0
  472. data/test/fixtures/organizations.yml +5 -0
  473. data/test/fixtures/other_books.yml +26 -0
  474. data/test/fixtures/other_comments.yml +6 -0
  475. data/test/fixtures/other_dogs.yml +2 -0
  476. data/test/fixtures/other_posts.yml +8 -0
  477. data/test/fixtures/other_topics.yml +42 -0
  478. data/test/fixtures/owners.yml +9 -0
  479. data/test/fixtures/parrots.yml +33 -0
  480. data/test/fixtures/parrots_pirates.yml +7 -0
  481. data/test/fixtures/people.yml +24 -0
  482. data/test/fixtures/peoples_treasures.yml +3 -0
  483. data/test/fixtures/pets.yml +19 -0
  484. data/test/fixtures/pirates.yml +15 -0
  485. data/test/fixtures/posts.yml +88 -0
  486. data/test/fixtures/price_estimates.yml +16 -0
  487. data/test/fixtures/products.yml +4 -0
  488. data/test/fixtures/projects.yml +7 -0
  489. data/test/fixtures/randomly_named_a9.yml +7 -0
  490. data/test/fixtures/ratings.yml +14 -0
  491. data/test/fixtures/readers.yml +17 -0
  492. data/test/fixtures/references.yml +17 -0
  493. data/test/fixtures/reserved_words/distinct.yml +5 -0
  494. data/test/fixtures/reserved_words/distinct_select.yml +11 -0
  495. data/test/fixtures/reserved_words/group.yml +14 -0
  496. data/test/fixtures/reserved_words/select.yml +8 -0
  497. data/test/fixtures/reserved_words/values.yml +7 -0
  498. data/test/fixtures/ships.yml +6 -0
  499. data/test/fixtures/speedometers.yml +8 -0
  500. data/test/fixtures/sponsors.yml +15 -0
  501. data/test/fixtures/strict_zines.yml +2 -0
  502. data/test/fixtures/string_key_objects.yml +7 -0
  503. data/test/fixtures/subscribers.yml +11 -0
  504. data/test/fixtures/subscriptions.yml +12 -0
  505. data/test/fixtures/taggings.yml +78 -0
  506. data/test/fixtures/tags.yml +11 -0
  507. data/test/fixtures/tasks.yml +7 -0
  508. data/test/fixtures/teapots.yml +3 -0
  509. data/test/fixtures/to_be_linked/accounts.yml +2 -0
  510. data/test/fixtures/to_be_linked/users.yml +10 -0
  511. data/test/fixtures/topics.yml +49 -0
  512. data/test/fixtures/toys.yml +14 -0
  513. data/test/fixtures/traffic_lights.yml +10 -0
  514. data/test/fixtures/treasures.yml +10 -0
  515. data/test/fixtures/trees.yml +3 -0
  516. data/test/fixtures/uuid_children.yml +3 -0
  517. data/test/fixtures/uuid_parents.yml +2 -0
  518. data/test/fixtures/variants.yml +4 -0
  519. data/test/fixtures/vegetables.yml +20 -0
  520. data/test/fixtures/vertices.yml +4 -0
  521. data/test/fixtures/warehouse-things.yml +3 -0
  522. data/test/fixtures/warehouse_things.yml +3 -0
  523. data/test/fixtures/zines.yml +5 -0
  524. data/test/ibm_db_test.rb +25 -0
  525. data/test/migrations/10_urban/9_add_expressions.rb +13 -0
  526. data/test/migrations/decimal/1_give_me_big_numbers.rb +17 -0
  527. data/test/migrations/magic/1_currencies_have_symbols.rb +13 -0
  528. data/test/migrations/missing/1000_people_have_middle_names.rb +11 -0
  529. data/test/migrations/missing/1_people_have_last_names.rb +11 -0
  530. data/test/migrations/missing/3_we_need_reminders.rb +14 -0
  531. data/test/migrations/missing/4_innocent_jointable.rb +14 -0
  532. data/test/migrations/rename/1_we_need_things.rb +13 -0
  533. data/test/migrations/rename/2_rename_things.rb +11 -0
  534. data/test/migrations/to_copy/1_people_have_hobbies.rb +11 -0
  535. data/test/migrations/to_copy/2_people_have_descriptions.rb +11 -0
  536. data/test/migrations/to_copy2/1_create_articles.rb +9 -0
  537. data/test/migrations/to_copy2/2_create_comments.rb +9 -0
  538. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +11 -0
  539. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +11 -0
  540. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +11 -0
  541. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +9 -0
  542. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +9 -0
  543. data/test/migrations/valid/1_valid_people_have_last_names.rb +11 -0
  544. data/test/migrations/valid/2_we_need_reminders.rb +14 -0
  545. data/test/migrations/valid/3_innocent_jointable.rb +14 -0
  546. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +11 -0
  547. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +14 -0
  548. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +14 -0
  549. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +11 -0
  550. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +14 -0
  551. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +14 -0
  552. data/test/migrations/version_check/20131219224947_migration_version_check.rb +10 -0
  553. data/test/models/account.rb +46 -0
  554. data/test/models/admin/account.rb +5 -0
  555. data/test/models/admin/randomly_named_c1.rb +9 -0
  556. data/test/models/admin/user.rb +48 -0
  557. data/test/models/admin.rb +7 -0
  558. data/test/models/aircraft.rb +7 -0
  559. data/test/models/arunit2_model.rb +5 -0
  560. data/test/models/author.rb +260 -0
  561. data/test/models/auto_id.rb +6 -0
  562. data/test/models/autoloadable/extra_firm.rb +4 -0
  563. data/test/models/binary.rb +4 -0
  564. data/test/models/binary_field.rb +6 -0
  565. data/test/models/bird.rb +24 -0
  566. data/test/models/book.rb +33 -0
  567. data/test/models/book_destroy_async.rb +24 -0
  568. data/test/models/boolean.rb +7 -0
  569. data/test/models/bulb.rb +61 -0
  570. data/test/models/cake_designer.rb +5 -0
  571. data/test/models/car.rb +36 -0
  572. data/test/models/carrier.rb +4 -0
  573. data/test/models/cart.rb +5 -0
  574. data/test/models/cat.rb +12 -0
  575. data/test/models/categorization.rb +21 -0
  576. data/test/models/category.rb +47 -0
  577. data/test/models/chef.rb +10 -0
  578. data/test/models/citation.rb +7 -0
  579. data/test/models/club.rb +28 -0
  580. data/test/models/college.rb +12 -0
  581. data/test/models/column.rb +5 -0
  582. data/test/models/column_name.rb +5 -0
  583. data/test/models/comment.rb +98 -0
  584. data/test/models/company.rb +226 -0
  585. data/test/models/company_in_module.rb +99 -0
  586. data/test/models/computer.rb +5 -0
  587. data/test/models/contact.rb +43 -0
  588. data/test/models/content.rb +42 -0
  589. data/test/models/contract.rb +38 -0
  590. data/test/models/country.rb +5 -0
  591. data/test/models/course.rb +8 -0
  592. data/test/models/customer.rb +85 -0
  593. data/test/models/customer_carrier.rb +16 -0
  594. data/test/models/dashboard.rb +5 -0
  595. data/test/models/default.rb +4 -0
  596. data/test/models/department.rb +6 -0
  597. data/test/models/destroy_async_parent.rb +15 -0
  598. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  599. data/test/models/developer.rb +341 -0
  600. data/test/models/dl_keyed_belongs_to.rb +13 -0
  601. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  602. data/test/models/dl_keyed_has_many.rb +5 -0
  603. data/test/models/dl_keyed_has_many_through.rb +5 -0
  604. data/test/models/dl_keyed_has_one.rb +5 -0
  605. data/test/models/dl_keyed_join.rb +10 -0
  606. data/test/models/dog.rb +7 -0
  607. data/test/models/dog_lover.rb +7 -0
  608. data/test/models/doubloon.rb +14 -0
  609. data/test/models/drink_designer.rb +20 -0
  610. data/test/models/edge.rb +7 -0
  611. data/test/models/electron.rb +7 -0
  612. data/test/models/engine.rb +5 -0
  613. data/test/models/entrant.rb +5 -0
  614. data/test/models/entry.rb +5 -0
  615. data/test/models/essay.rb +8 -0
  616. data/test/models/essay_destroy_async.rb +12 -0
  617. data/test/models/event.rb +5 -0
  618. data/test/models/eye.rb +39 -0
  619. data/test/models/face.rb +17 -0
  620. data/test/models/family.rb +6 -0
  621. data/test/models/family_tree.rb +6 -0
  622. data/test/models/friendship.rb +8 -0
  623. data/test/models/frog.rb +8 -0
  624. data/test/models/guid.rb +4 -0
  625. data/test/models/guitar.rb +6 -0
  626. data/test/models/hotel.rb +13 -0
  627. data/test/models/human.rb +39 -0
  628. data/test/models/image.rb +5 -0
  629. data/test/models/interest.rb +16 -0
  630. data/test/models/invoice.rb +6 -0
  631. data/test/models/item.rb +9 -0
  632. data/test/models/job.rb +9 -0
  633. data/test/models/joke.rb +9 -0
  634. data/test/models/keyboard.rb +5 -0
  635. data/test/models/legacy_thing.rb +5 -0
  636. data/test/models/lesson.rb +13 -0
  637. data/test/models/line_item.rb +5 -0
  638. data/test/models/liquid.rb +6 -0
  639. data/test/models/man.rb +11 -0
  640. data/test/models/matey.rb +6 -0
  641. data/test/models/measurement.rb +4 -0
  642. data/test/models/member.rb +45 -0
  643. data/test/models/member_detail.rb +11 -0
  644. data/test/models/member_type.rb +5 -0
  645. data/test/models/membership.rb +38 -0
  646. data/test/models/mentor.rb +5 -0
  647. data/test/models/message.rb +5 -0
  648. data/test/models/minimalistic.rb +4 -0
  649. data/test/models/minivan.rb +10 -0
  650. data/test/models/mixed_case_monkey.rb +5 -0
  651. data/test/models/mocktail_designer.rb +2 -0
  652. data/test/models/molecule.rb +8 -0
  653. data/test/models/mouse.rb +6 -0
  654. data/test/models/movie.rb +7 -0
  655. data/test/models/node.rb +7 -0
  656. data/test/models/non_primary_key.rb +4 -0
  657. data/test/models/notification.rb +5 -0
  658. data/test/models/numeric_data.rb +12 -0
  659. data/test/models/order.rb +6 -0
  660. data/test/models/organization.rb +16 -0
  661. data/test/models/other_dog.rb +7 -0
  662. data/test/models/owner.rb +39 -0
  663. data/test/models/parrot.rb +36 -0
  664. data/test/models/person.rb +147 -0
  665. data/test/models/personal_legacy_thing.rb +6 -0
  666. data/test/models/pet.rb +20 -0
  667. data/test/models/pet_treasure.rb +8 -0
  668. data/test/models/pirate.rb +116 -0
  669. data/test/models/possession.rb +5 -0
  670. data/test/models/post.rb +371 -0
  671. data/test/models/price_estimate.rb +14 -0
  672. data/test/models/professor.rb +7 -0
  673. data/test/models/project.rb +42 -0
  674. data/test/models/publisher/article.rb +6 -0
  675. data/test/models/publisher/magazine.rb +5 -0
  676. data/test/models/publisher.rb +4 -0
  677. data/test/models/randomly_named_c1.rb +5 -0
  678. data/test/models/rating.rb +8 -0
  679. data/test/models/reader.rb +25 -0
  680. data/test/models/recipe.rb +5 -0
  681. data/test/models/record.rb +4 -0
  682. data/test/models/reference.rb +25 -0
  683. data/test/models/reply.rb +79 -0
  684. data/test/models/room.rb +6 -0
  685. data/test/models/section.rb +6 -0
  686. data/test/models/seminar.rb +6 -0
  687. data/test/models/session.rb +6 -0
  688. data/test/models/ship.rb +42 -0
  689. data/test/models/ship_part.rb +10 -0
  690. data/test/models/shop.rb +19 -0
  691. data/test/models/shop_account.rb +8 -0
  692. data/test/models/speedometer.rb +8 -0
  693. data/test/models/sponsor.rb +10 -0
  694. data/test/models/squeak.rb +6 -0
  695. data/test/models/strict_zine.rb +7 -0
  696. data/test/models/string_key_object.rb +5 -0
  697. data/test/models/student.rb +6 -0
  698. data/test/models/subject.rb +16 -0
  699. data/test/models/subscriber.rb +10 -0
  700. data/test/models/subscription.rb +8 -0
  701. data/test/models/tag.rb +16 -0
  702. data/test/models/tagging.rb +20 -0
  703. data/test/models/task.rb +7 -0
  704. data/test/models/topic.rb +153 -0
  705. data/test/models/toy.rb +10 -0
  706. data/test/models/traffic_light.rb +6 -0
  707. data/test/models/treasure.rb +16 -0
  708. data/test/models/treaty.rb +5 -0
  709. data/test/models/tree.rb +5 -0
  710. data/test/models/tuning_peg.rb +6 -0
  711. data/test/models/tyre.rb +13 -0
  712. data/test/models/user.rb +22 -0
  713. data/test/models/uuid_child.rb +5 -0
  714. data/test/models/uuid_item.rb +8 -0
  715. data/test/models/uuid_parent.rb +5 -0
  716. data/test/models/vegetables.rb +33 -0
  717. data/test/models/vehicle.rb +7 -0
  718. data/test/models/vertex.rb +11 -0
  719. data/test/models/warehouse_thing.rb +7 -0
  720. data/test/models/wheel.rb +5 -0
  721. data/test/models/without_table.rb +5 -0
  722. data/test/models/zine.rb +5 -0
  723. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  724. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  725. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  726. data/test/schema/mysql2_specific_schema.rb +82 -0
  727. data/test/schema/oracle_specific_schema.rb +38 -0
  728. data/test/schema/postgresql_specific_schema.rb +125 -0
  729. data/test/schema/schema.rb +1237 -0
  730. data/test/schema/schema.rb.original +1057 -0
  731. data/test/schema/sqlite_specific_schema.rb +11 -0
  732. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  733. data/test/support/config.rb +43 -0
  734. data/test/support/connection.rb +29 -0
  735. data/test/support/connection_helper.rb +16 -0
  736. data/test/support/ddl_helper.rb +10 -0
  737. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  738. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  739. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  740. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  741. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  742. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  743. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  744. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  745. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  746. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  747. data/test/support/schema_dumping_helper.rb +22 -0
  748. data/test/support/stubs/strong_parameters.rb +40 -0
  749. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  750. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  751. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  752. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  753. metadata +876 -0
@@ -0,0 +1,823 @@
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"
7
+
8
+ class EnumTest < ActiveRecord::TestCase
9
+ fixtures :books, :authors, :author_addresses
10
+
11
+ setup do
12
+ @book = books(:awdr)
13
+ end
14
+
15
+ test "query state by predicate" do
16
+ assert_predicate @book, :published?
17
+ assert_not_predicate @book, :written?
18
+ assert_not_predicate @book, :proposed?
19
+
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?
26
+ end
27
+
28
+ test "query state with strings" do
29
+ assert_equal "published", @book.status
30
+ assert_equal "read", @book.last_read
31
+ assert_equal "english", @book.language
32
+ assert_equal "visible", @book.author_visibility
33
+ assert_equal "visible", @book.illustrator_visibility
34
+ assert_equal "medium", @book.difficulty
35
+ end
36
+
37
+ test "find via scope" do
38
+ assert_equal @book, Book.published.first
39
+ assert_equal @book, Book.read.first
40
+ assert_equal @book, Book.in_english.first
41
+ assert_equal @book, Book.author_visibility_visible.first
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)
51
+ end
52
+
53
+ test "find via where with values" do
54
+ published, written = Book.statuses[:published], Book.statuses[:written]
55
+
56
+ assert_equal @book, Book.where(status: published).first
57
+ assert_not_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
73
+ end
74
+
75
+ test "find via where with symbols" do
76
+ assert_equal @book, Book.where(status: :published).first
77
+ 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
80
+ assert_not_equal @book, Book.where.not(status: :published).first
81
+ assert_equal @book, Book.where.not(status: :written).first
82
+ assert_equal books(:ddd), Book.where(last_read: :forgotten).first
83
+ end
84
+
85
+ test "find via where with strings" do
86
+ assert_equal @book, Book.where(status: "published").first
87
+ 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
90
+ assert_not_equal @book, Book.where.not(status: "published").first
91
+ assert_equal @book, Book.where.not(status: "written").first
92
+ assert_equal books(:ddd), Book.where(last_read: "forgotten").first
93
+ end
94
+
95
+ test "build from scope" do
96
+ assert_predicate Book.written.build, :written?
97
+ assert_not_predicate Book.written.build, :proposed?
98
+ end
99
+
100
+ test "build from where" do
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?
107
+ end
108
+
109
+ test "update by declaration" do
110
+ @book.written!
111
+ assert_predicate @book, :written?
112
+ @book.in_english!
113
+ assert_predicate @book, :in_english?
114
+ @book.author_visibility_visible!
115
+ assert_predicate @book, :author_visibility_visible?
116
+ end
117
+
118
+ test "update by setter" do
119
+ @book.update! status: :written
120
+ assert_predicate @book, :written?
121
+ end
122
+
123
+ test "enum methods are overwritable" do
124
+ assert_equal "do publish work...", @book.published!
125
+ assert_predicate @book, :published?
126
+ end
127
+
128
+ test "direct assignment" do
129
+ @book.status = :written
130
+ assert_predicate @book, :written?
131
+ end
132
+
133
+ test "assign string value" do
134
+ @book.status = "written"
135
+ assert_predicate @book, :written?
136
+ end
137
+
138
+ test "enum changed attributes" do
139
+ old_status = @book.status
140
+ old_language = @book.language
141
+ @book.status = :proposed
142
+ @book.language = :spanish
143
+ assert_equal old_status, @book.changed_attributes[:status]
144
+ assert_equal old_language, @book.changed_attributes[:language]
145
+ end
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
+
157
+ test "enum changes" do
158
+ old_status = @book.status
159
+ old_language = @book.language
160
+ @book.status = :proposed
161
+ @book.language = :spanish
162
+ assert_equal [old_status, "proposed"], @book.changes[:status]
163
+ assert_equal [old_language, "spanish"], @book.changes[:language]
164
+ end
165
+
166
+ test "enum attribute was" do
167
+ old_status = @book.status
168
+ old_language = @book.language
169
+ @book.status = :published
170
+ @book.language = :spanish
171
+ assert_equal old_status, @book.attribute_was(:status)
172
+ assert_equal old_language, @book.attribute_was(:language)
173
+ end
174
+
175
+ test "enum attribute changed" do
176
+ @book.status = :proposed
177
+ @book.language = :french
178
+ assert @book.attribute_changed?(:status)
179
+ assert @book.attribute_changed?(:language)
180
+ end
181
+
182
+ test "enum attribute changed to" do
183
+ @book.status = :proposed
184
+ @book.language = :french
185
+ assert @book.attribute_changed?(:status, to: "proposed")
186
+ assert @book.attribute_changed?(:language, to: "french")
187
+ end
188
+
189
+ test "enum attribute changed from" do
190
+ old_status = @book.status
191
+ old_language = @book.language
192
+ @book.status = :proposed
193
+ @book.language = :french
194
+ assert @book.attribute_changed?(:status, from: old_status)
195
+ assert @book.attribute_changed?(:language, from: old_language)
196
+ end
197
+
198
+ test "enum attribute changed from old status to new status" do
199
+ old_status = @book.status
200
+ old_language = @book.language
201
+ @book.status = :proposed
202
+ @book.language = :french
203
+ assert @book.attribute_changed?(:status, from: old_status, to: "proposed")
204
+ assert @book.attribute_changed?(:language, from: old_language, to: "french")
205
+ end
206
+
207
+ test "enum didn't change" do
208
+ old_status = @book.status
209
+ @book.status = old_status
210
+ assert_not @book.attribute_changed?(:status)
211
+ end
212
+
213
+ test "persist changes that are dirty" do
214
+ @book.status = :proposed
215
+ assert @book.attribute_changed?(:status)
216
+ @book.status = :written
217
+ assert @book.attribute_changed?(:status)
218
+ end
219
+
220
+ test "reverted changes that are not dirty" do
221
+ old_status = @book.status
222
+ @book.status = :proposed
223
+ assert @book.attribute_changed?(:status)
224
+ @book.status = old_status
225
+ assert_not @book.attribute_changed?(:status)
226
+ end
227
+
228
+ test "reverted changes are not dirty going from nil to value and back" do
229
+ book = Book.create!(nullable_status: nil)
230
+
231
+ book.nullable_status = :married
232
+ assert book.attribute_changed?(:nullable_status)
233
+
234
+ book.nullable_status = nil
235
+ assert_not book.attribute_changed?(:nullable_status)
236
+ end
237
+
238
+ test "assign non existing value raises an error" do
239
+ e = assert_raises(ArgumentError) do
240
+ @book.status = :unknown
241
+ end
242
+ assert_equal "'unknown' is not a valid status", e.message
243
+ end
244
+
245
+ test "NULL values from database should be casted to nil" do
246
+ Book.where(id: @book.id).update_all("status = NULL")
247
+ assert_nil @book.reload.status
248
+ end
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
+
254
+ test "assign nil value" do
255
+ @book.status = nil
256
+ assert_nil @book.status
257
+ end
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
+
264
+ test "assign empty string value" do
265
+ @book.status = ""
266
+ assert_nil @book.status
267
+ end
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
+
279
+ test "assign long empty string value" do
280
+ @book.status = " "
281
+ assert_nil @book.status
282
+ end
283
+
284
+ test "constant to access the mapping" do
285
+ assert_equal 0, Book.statuses[:proposed]
286
+ assert_equal 1, Book.statuses["written"]
287
+ assert_equal 2, Book.statuses[:published]
288
+ end
289
+
290
+ test "building new objects with enum scopes" do
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?
295
+ end
296
+
297
+ test "creating new objects with enum scopes" do
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?
302
+ end
303
+
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
348
+ end
349
+
350
+ assert_match(/Enum label name must not be blank/, e.message)
351
+ end
352
+
353
+ test "reserved enum names" do
354
+ klass = Class.new(ActiveRecord::Base) do
355
+ self.table_name = "books"
356
+ enum status: [:proposed, :written, :published]
357
+ end
358
+
359
+ conflicts = [
360
+ :column, # generates class method .columns, which conflicts with an AR method
361
+ :logger, # generates #logger, which conflicts with an AR method
362
+ :attributes, # generates #attributes=, which conflicts with an AR method
363
+ ]
364
+
365
+ conflicts.each_with_index do |name, i|
366
+ e = assert_raises(ArgumentError) do
367
+ klass.class_eval { enum name => ["value_#{i}"] }
368
+ end
369
+ assert_match(/You tried to define an enum named \"#{name}\" on the model/, e.message)
370
+ end
371
+ end
372
+
373
+ test "reserved enum values" do
374
+ klass = Class.new(ActiveRecord::Base) do
375
+ self.table_name = "books"
376
+ enum status: [:proposed, :written, :published]
377
+ end
378
+
379
+ conflicts = [
380
+ :new, # generates a scope that conflicts with an AR class method
381
+ :valid, # generates #valid?, which conflicts with an AR method
382
+ :save, # generates #save!, which conflicts with an AR method
383
+ :proposed, # same value as an existing enum
384
+ :public, :private, :protected, # some important methods on Module and Class
385
+ :name, :parent, :superclass
386
+ ]
387
+
388
+ conflicts.each_with_index do |value, i|
389
+ e = assert_raises(ArgumentError, "enum value `#{value}` should not be allowed") do
390
+ klass.class_eval { enum "status_#{i}" => [value] }
391
+ end
392
+ assert_match(/You tried to define an enum named .* on the model/, e.message)
393
+ end
394
+ end
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
+
414
+ test "overriding enum method should not raise" do
415
+ assert_nothing_raised do
416
+ Class.new(ActiveRecord::Base) do
417
+ self.table_name = "books"
418
+
419
+ def published!
420
+ super
421
+ "do publish work..."
422
+ end
423
+
424
+ enum status: [:proposed, :written, :published]
425
+
426
+ def written!
427
+ super
428
+ "do written work..."
429
+ end
430
+ end
431
+ end
432
+ end
433
+
434
+ test "validate uniqueness" do
435
+ klass = Class.new(ActiveRecord::Base) do
436
+ def self.name; "Book"; end
437
+ enum status: [:proposed, :written]
438
+ validates_uniqueness_of :status
439
+ end
440
+ klass.delete_all
441
+ klass.create!(status: "proposed")
442
+ book = klass.new(status: "written")
443
+ assert_predicate book, :valid?
444
+ book.status = "proposed"
445
+ assert_not_predicate book, :valid?
446
+ end
447
+
448
+ test "validate inclusion of value in array" do
449
+ klass = Class.new(ActiveRecord::Base) do
450
+ def self.name; "Book"; end
451
+ enum status: [:proposed, :written]
452
+ validates_inclusion_of :status, in: ["written"]
453
+ end
454
+ klass.delete_all
455
+ invalid_book = klass.new(status: "proposed")
456
+ assert_not_predicate invalid_book, :valid?
457
+ valid_book = klass.new(status: "written")
458
+ assert_predicate valid_book, :valid?
459
+ end
460
+
461
+ test "enums are distinct per class" do
462
+ klass1 = Class.new(ActiveRecord::Base) do
463
+ self.table_name = "books"
464
+ enum status: [:proposed, :written]
465
+ end
466
+
467
+ klass2 = Class.new(ActiveRecord::Base) do
468
+ self.table_name = "books"
469
+ enum status: [:drafted, :uploaded]
470
+ end
471
+
472
+ book1 = klass1.proposed.create!
473
+ book1.status = :written
474
+ assert_equal ["proposed", "written"], book1.status_change
475
+
476
+ book2 = klass2.drafted.create!
477
+ book2.status = :uploaded
478
+ assert_equal ["drafted", "uploaded"], book2.status_change
479
+ end
480
+
481
+ test "enums are inheritable" do
482
+ subklass1 = Class.new(Book)
483
+
484
+ subklass2 = Class.new(Book) do
485
+ enum status: [:drafted, :uploaded]
486
+ end
487
+
488
+ book1 = subklass1.proposed.create!
489
+ book1.status = :written
490
+ assert_equal ["proposed", "written"], book1.status_change
491
+
492
+ book2 = subklass2.drafted.create!
493
+ book2.status = :uploaded
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)
509
+ end
510
+
511
+ test "declare multiple enums at a time" do
512
+ klass = Class.new(ActiveRecord::Base) do
513
+ self.table_name = "books"
514
+ enum status: [:proposed, :written, :published],
515
+ nullable_status: [:single, :married]
516
+ end
517
+
518
+ book1 = klass.proposed.create!
519
+ assert_predicate book1, :proposed?
520
+
521
+ book2 = klass.single.create!
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?
555
+ end
556
+
557
+ test "enum with alias_attribute" do
558
+ klass = Class.new(ActiveRecord::Base) do
559
+ self.table_name = "books"
560
+ alias_attribute :aliased_status, :status
561
+ enum aliased_status: [:proposed, :written, :published]
562
+ end
563
+
564
+ book = klass.proposed.create!
565
+ assert_predicate book, :proposed?
566
+ assert_equal "proposed", book.aliased_status
567
+
568
+ book = klass.find(book.id)
569
+ assert_predicate book, :proposed?
570
+ assert_equal "proposed", book.aliased_status
571
+ end
572
+
573
+ test "query state by predicate with prefix" do
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?
578
+ end
579
+
580
+ test "query state by predicate with custom prefix" do
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?
621
+ end
622
+
623
+ test "uses default status when no status is provided in fixtures" do
624
+ book = books(:tlg)
625
+ assert book.proposed?, "expected fixture to default to proposed status"
626
+ assert book.in_english?, "expected fixture to default to english language"
627
+ end
628
+
629
+ test "uses default value from database on initialization" do
630
+ book = Book.new
631
+ assert_predicate book, :proposed?
632
+ end
633
+
634
+ test "uses default value from database on initialization when using custom mapping" do
635
+ book = Book.new
636
+ assert_predicate book, :hard?
637
+ end
638
+
639
+ test "data type of Enum type" do
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
822
+ end
823
+ end