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,1093 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/aircraft"
5
+ require "models/post"
6
+ require "models/comment"
7
+ require "models/author"
8
+ require "models/topic"
9
+ require "models/reply"
10
+ require "models/category"
11
+ require "models/company"
12
+ require "models/developer"
13
+ require "models/computer"
14
+ require "models/project"
15
+ require "models/minimalistic"
16
+ require "models/parrot"
17
+ require "models/minivan"
18
+ require "models/person"
19
+ require "models/ship"
20
+ require "models/admin"
21
+ require "models/admin/user"
22
+
23
+ class PersistenceTest < ActiveRecord::TestCase
24
+ fixtures :topics, :companies, :developers, :accounts, :minimalistics, :authors, :author_addresses, :posts, :minivans
25
+
26
+ def test_update_many
27
+ topic_data = { 1 => { "content" => "1 updated" }, 2 => { "content" => "2 updated" } }
28
+ updated = Topic.update(topic_data.keys, topic_data.values)
29
+
30
+ assert_equal [1, 2], updated.map(&:id)
31
+ assert_equal "1 updated", Topic.find(1).content
32
+ assert_equal "2 updated", Topic.find(2).content
33
+ end
34
+
35
+ def test_update_many_with_duplicated_ids
36
+ updated = Topic.update([1, 1, 2], [
37
+ { "content" => "1 duplicated" }, { "content" => "1 updated" }, { "content" => "2 updated" }
38
+ ])
39
+
40
+ assert_equal [1, 1, 2], updated.map(&:id)
41
+ assert_equal "1 updated", Topic.find(1).content
42
+ assert_equal "2 updated", Topic.find(2).content
43
+ end
44
+
45
+ def test_update_many_with_invalid_id
46
+ topic_data = { 1 => { "content" => "1 updated" }, 2 => { "content" => "2 updated" }, 99999 => {} }
47
+
48
+ assert_raise(ActiveRecord::RecordNotFound) do
49
+ Topic.update(topic_data.keys, topic_data.values)
50
+ end
51
+
52
+ assert_not_equal "1 updated", Topic.find(1).content
53
+ assert_not_equal "2 updated", Topic.find(2).content
54
+ end
55
+
56
+ def test_class_level_update_without_ids
57
+ topics = Topic.all
58
+ assert_equal 5, topics.length
59
+ topics.each do |topic|
60
+ assert_not_equal "updated", topic.content
61
+ end
62
+
63
+ updated = Topic.update(content: "updated")
64
+ assert_equal 5, updated.length
65
+ updated.each do |topic|
66
+ assert_equal "updated", topic.content
67
+ end
68
+ end
69
+
70
+ def test_class_level_update_is_affected_by_scoping
71
+ topic_data = { 1 => { "content" => "1 updated" }, 2 => { "content" => "2 updated" } }
72
+
73
+ assert_raise(ActiveRecord::RecordNotFound) do
74
+ Topic.where("1=0").scoping { Topic.update(topic_data.keys, topic_data.values) }
75
+ end
76
+
77
+ assert_not_equal "1 updated", Topic.find(1).content
78
+ assert_not_equal "2 updated", Topic.find(2).content
79
+ end
80
+
81
+ def test_delete_all
82
+ assert Topic.count > 0
83
+
84
+ assert_equal Topic.count, Topic.delete_all
85
+ end
86
+
87
+ def test_increment_attribute
88
+ assert_equal 50, accounts(:signals37).credit_limit
89
+
90
+ accounts(:signals37).increment! :credit_limit
91
+ assert_equal 51, accounts(:signals37, :reload).credit_limit
92
+
93
+ accounts(:signals37).increment(:credit_limit).increment!(:credit_limit)
94
+ assert_equal 53, accounts(:signals37, :reload).credit_limit
95
+ end
96
+
97
+ def test_increment_aliased_attribute
98
+ assert_equal 50, accounts(:signals37).available_credit
99
+
100
+ accounts(:signals37).increment!(:available_credit)
101
+ assert_equal 51, accounts(:signals37, :reload).available_credit
102
+
103
+ accounts(:signals37).increment(:available_credit).increment!(:available_credit)
104
+ assert_equal 53, accounts(:signals37, :reload).available_credit
105
+ end
106
+
107
+ def test_increment_nil_attribute
108
+ assert_nil topics(:first).parent_id
109
+ topics(:first).increment! :parent_id
110
+ assert_equal 1, topics(:first).parent_id
111
+ end
112
+
113
+ def test_increment_attribute_by
114
+ assert_equal 50, accounts(:signals37).credit_limit
115
+ accounts(:signals37).increment! :credit_limit, 5
116
+ assert_equal 55, accounts(:signals37, :reload).credit_limit
117
+
118
+ accounts(:signals37).increment(:credit_limit, 1).increment!(:credit_limit, 3)
119
+ assert_equal 59, accounts(:signals37, :reload).credit_limit
120
+ end
121
+
122
+ def test_increment_updates_counter_in_db_using_offset
123
+ a1 = accounts(:signals37)
124
+ initial_credit = a1.credit_limit
125
+ a2 = Account.find(accounts(:signals37).id)
126
+ a1.increment!(:credit_limit)
127
+ a2.increment!(:credit_limit)
128
+ assert_equal initial_credit + 2, a1.reload.credit_limit
129
+ end
130
+
131
+ def test_increment_with_touch_updates_timestamps
132
+ topic = topics(:first)
133
+ assert_equal 1, topic.replies_count
134
+ previously_updated_at = topic.updated_at
135
+ travel(1.second) do
136
+ topic.increment!(:replies_count, touch: true)
137
+ end
138
+ assert_equal 2, topic.reload.replies_count
139
+ assert_operator previously_updated_at, :<, topic.updated_at
140
+ end
141
+
142
+ def test_increment_with_touch_an_attribute_updates_timestamps
143
+ topic = topics(:first)
144
+ assert_equal 1, topic.replies_count
145
+ previously_updated_at = topic.updated_at
146
+ previously_written_on = topic.written_on
147
+ travel(1.second) do
148
+ topic.increment!(:replies_count, touch: :written_on)
149
+ end
150
+ assert_equal 2, topic.reload.replies_count
151
+ assert_operator previously_updated_at, :<, topic.updated_at
152
+ assert_operator previously_written_on, :<, topic.written_on
153
+ end
154
+
155
+ def test_increment_with_no_arg
156
+ topic = topics(:first)
157
+ assert_raises(ArgumentError) { topic.increment! }
158
+ end
159
+
160
+ def test_destroy_many
161
+ clients = Client.find([2, 3])
162
+
163
+ assert_difference("Client.count", -2) do
164
+ destroyed = Client.destroy([2, 3])
165
+ assert_equal clients, destroyed
166
+ assert destroyed.all?(&:frozen?), "destroyed clients should be frozen"
167
+ end
168
+ end
169
+
170
+ def test_destroy_many_with_invalid_id
171
+ clients = Client.find([2, 3])
172
+
173
+ assert_raise(ActiveRecord::RecordNotFound) do
174
+ Client.destroy([2, 3, 99999])
175
+ end
176
+
177
+ assert_equal clients, Client.find([2, 3])
178
+ end
179
+
180
+ def test_becomes
181
+ assert_kind_of Reply, topics(:first).becomes(Reply)
182
+ assert_equal "The First Topic", topics(:first).becomes(Reply).title
183
+ end
184
+
185
+ def test_becomes_after_reload_schema_from_cache
186
+ Reply.define_attribute_methods
187
+ Reply.serialize(:content) # invoke reload_schema_from_cache
188
+ assert_kind_of Reply, topics(:first).becomes(Reply)
189
+ assert_equal "The First Topic", topics(:first).becomes(Reply).title
190
+ end
191
+
192
+ def test_becomes_includes_errors
193
+ company = Company.new(name: nil)
194
+ assert_not_predicate company, :valid?
195
+ original_errors = company.errors
196
+ client = company.becomes(Client)
197
+ assert_equal assert_deprecated { original_errors.keys }, assert_deprecated { client.errors.keys }
198
+ end
199
+
200
+ def test_becomes_errors_base
201
+ child_class = Class.new(Admin::User) do
202
+ store_accessor :settings, :foo
203
+
204
+ def self.name; "Admin::ChildUser"; end
205
+ end
206
+
207
+ admin = Admin::User.new
208
+ admin.errors.add :token, :invalid
209
+ child = admin.becomes(child_class)
210
+
211
+ assert_equal [:token], assert_deprecated { child.errors.keys }
212
+ assert_nothing_raised do
213
+ child.errors.add :foo, :invalid
214
+ end
215
+ end
216
+
217
+ def test_duped_becomes_persists_changes_from_the_original
218
+ original = topics(:first)
219
+ copy = original.dup.becomes(Reply)
220
+ copy.save!
221
+ assert_equal "The First Topic", Topic.find(copy.id).title
222
+ end
223
+
224
+ def test_becomes_wont_break_mutation_tracking
225
+ topic = topics(:first)
226
+ reply = topic.becomes(Reply)
227
+
228
+ assert_equal 1, topic.id_in_database
229
+ assert_empty topic.attributes_in_database
230
+
231
+ assert_equal 1, reply.id_in_database
232
+ assert_empty reply.attributes_in_database
233
+ end
234
+
235
+ def test_becomes_includes_changed_attributes
236
+ company = Company.new(name: "37signals")
237
+ client = company.becomes(Client)
238
+ assert_equal "37signals", client.name
239
+ assert_equal %w{name}, client.changed
240
+ end
241
+
242
+ def test_delete_many
243
+ original_count = Topic.count
244
+ Topic.delete(deleting = [1, 2])
245
+ assert_equal original_count - deleting.size, Topic.count
246
+ end
247
+
248
+ def test_decrement_attribute
249
+ assert_equal 50, accounts(:signals37).credit_limit
250
+
251
+ accounts(:signals37).decrement!(:credit_limit)
252
+ assert_equal 49, accounts(:signals37, :reload).credit_limit
253
+
254
+ accounts(:signals37).decrement(:credit_limit).decrement!(:credit_limit)
255
+ assert_equal 47, accounts(:signals37, :reload).credit_limit
256
+ end
257
+
258
+ def test_decrement_attribute_by
259
+ assert_equal 50, accounts(:signals37).credit_limit
260
+ accounts(:signals37).decrement! :credit_limit, 5
261
+ assert_equal 45, accounts(:signals37, :reload).credit_limit
262
+
263
+ accounts(:signals37).decrement(:credit_limit, 1).decrement!(:credit_limit, 3)
264
+ assert_equal 41, accounts(:signals37, :reload).credit_limit
265
+ end
266
+
267
+ def test_decrement_with_touch_updates_timestamps
268
+ topic = topics(:first)
269
+ assert_equal 1, topic.replies_count
270
+ previously_updated_at = topic.updated_at
271
+ travel(1.second) do
272
+ topic.decrement!(:replies_count, touch: true)
273
+ end
274
+ assert_equal 0, topic.reload.replies_count
275
+ assert_operator previously_updated_at, :<, topic.updated_at
276
+ end
277
+
278
+ def test_decrement_with_touch_an_attribute_updates_timestamps
279
+ topic = topics(:first)
280
+ assert_equal 1, topic.replies_count
281
+ previously_updated_at = topic.updated_at
282
+ previously_written_on = topic.written_on
283
+ travel(1.second) do
284
+ topic.decrement!(:replies_count, touch: :written_on)
285
+ end
286
+ assert_equal 0, topic.reload.replies_count
287
+ assert_operator previously_updated_at, :<, topic.updated_at
288
+ assert_operator previously_written_on, :<, topic.written_on
289
+ end
290
+
291
+ def test_create
292
+ topic = Topic.new
293
+ topic.title = "New Topic"
294
+ topic.save
295
+ topic_reloaded = Topic.find(topic.id)
296
+ assert_equal("New Topic", topic_reloaded.title)
297
+ end
298
+
299
+ def test_save!
300
+ topic = Topic.new(title: "New Topic")
301
+ assert topic.save!
302
+
303
+ reply = WrongReply.new
304
+ assert_raise(ActiveRecord::RecordInvalid) { reply.save! }
305
+ end
306
+
307
+ def test_save_null_string_attributes
308
+ topic = Topic.find(1)
309
+ topic.attributes = { "title" => "null", "author_name" => "null" }
310
+ topic.save!
311
+ topic.reload
312
+ assert_equal("null", topic.title)
313
+ assert_equal("null", topic.author_name)
314
+ end
315
+
316
+ def test_save_nil_string_attributes
317
+ topic = Topic.find(1)
318
+ topic.title = nil
319
+ topic.save!
320
+ topic.reload
321
+ assert_nil topic.title
322
+ end
323
+
324
+ def test_save_for_record_with_only_primary_key
325
+ minimalistic = Minimalistic.new
326
+ assert_nothing_raised { minimalistic.save }
327
+ end
328
+
329
+ def test_save_for_record_with_only_primary_key_that_is_provided
330
+ assert_nothing_raised { Minimalistic.create!(id: 2) }
331
+ end
332
+
333
+ def test_save_with_duping_of_destroyed_object
334
+ developer = Developer.first
335
+ developer.destroy
336
+ new_developer = developer.dup
337
+ new_developer.save
338
+ assert_predicate new_developer, :persisted?
339
+ assert_not_predicate new_developer, :destroyed?
340
+ end
341
+
342
+ def test_create_many
343
+ topics = Topic.create([ { "title" => "first" }, { "title" => "second" }])
344
+ assert_equal 2, topics.size
345
+ assert_equal "first", topics.first.title
346
+ end
347
+
348
+ def test_create_columns_not_equal_attributes
349
+ topic = Topic.instantiate(
350
+ "title" => "Another New Topic",
351
+ "does_not_exist" => "test"
352
+ )
353
+ topic = topic.dup # reset @new_record
354
+ assert_nothing_raised { topic.save }
355
+ assert_predicate topic, :persisted?
356
+ assert_equal "Another New Topic", topic.reload.title
357
+ end
358
+
359
+ def test_create_through_factory_with_block
360
+ topic = Topic.create("title" => "New Topic") do |t|
361
+ t.author_name = "David"
362
+ end
363
+ assert_equal("New Topic", topic.title)
364
+ assert_equal("David", topic.author_name)
365
+ end
366
+
367
+ def test_create_many_through_factory_with_block
368
+ topics = Topic.create([ { "title" => "first" }, { "title" => "second" }]) do |t|
369
+ t.author_name = "David"
370
+ end
371
+ assert_equal 2, topics.size
372
+ topic1, topic2 = Topic.find(topics[0].id), Topic.find(topics[1].id)
373
+ assert_equal "first", topic1.title
374
+ assert_equal "David", topic1.author_name
375
+ assert_equal "second", topic2.title
376
+ assert_equal "David", topic2.author_name
377
+ end
378
+
379
+ def test_update_object
380
+ topic = Topic.new
381
+ topic.title = "Another New Topic"
382
+ topic.written_on = "2003-12-12 23:23:00"
383
+ topic.save
384
+ topic_reloaded = Topic.find(topic.id)
385
+ assert_equal("Another New Topic", topic_reloaded.title)
386
+
387
+ topic_reloaded.title = "Updated topic"
388
+ topic_reloaded.save
389
+
390
+ topic_reloaded_again = Topic.find(topic.id)
391
+
392
+ assert_equal("Updated topic", topic_reloaded_again.title)
393
+ end
394
+
395
+ def test_update_columns_not_equal_attributes
396
+ topic = Topic.new
397
+ topic.title = "Still another topic"
398
+ topic.save
399
+
400
+ topic_reloaded = Topic.instantiate(topic.attributes.merge("does_not_exist" => "test"))
401
+ topic_reloaded.title = "A New Topic"
402
+ assert_nothing_raised { topic_reloaded.save }
403
+ assert_predicate topic_reloaded, :persisted?
404
+ assert_equal "A New Topic", topic_reloaded.reload.title
405
+ end
406
+
407
+ def test_update_for_record_with_only_primary_key
408
+ minimalistic = minimalistics(:first)
409
+ assert_nothing_raised { minimalistic.save }
410
+ end
411
+
412
+ def test_update_sti_type
413
+ assert_instance_of Reply, topics(:second)
414
+
415
+ topic = topics(:second).becomes!(Topic)
416
+ assert_instance_of Topic, topic
417
+ topic.save!
418
+ assert_instance_of Topic, Topic.find(topic.id)
419
+ end
420
+
421
+ def test_preserve_original_sti_type
422
+ reply = topics(:second)
423
+ assert_equal "Reply", reply.type
424
+
425
+ topic = reply.becomes(Topic)
426
+ assert_equal "Reply", reply.type
427
+
428
+ assert_instance_of Topic, topic
429
+ assert_equal "Reply", topic.type
430
+ end
431
+
432
+ def test_update_sti_subclass_type
433
+ assert_instance_of Topic, topics(:first)
434
+
435
+ reply = topics(:first).becomes!(Reply)
436
+ assert_instance_of Reply, reply
437
+ reply.save!
438
+ assert_instance_of Reply, Reply.find(reply.id)
439
+ end
440
+
441
+ def test_becomes_default_sti_subclass
442
+ original_type = Topic.columns_hash["type"].default
443
+ ActiveRecord::Base.connection.change_column_default :topics, :type, "Reply"
444
+ Topic.reset_column_information
445
+
446
+ reply = topics(:second)
447
+ assert_instance_of Reply, reply
448
+
449
+ topic = reply.becomes(Topic)
450
+ assert_instance_of Topic, topic
451
+
452
+ ensure
453
+ ActiveRecord::Base.connection.change_column_default :topics, :type, original_type
454
+ Topic.reset_column_information
455
+ end
456
+
457
+ def test_update_after_create
458
+ klass = Class.new(Topic) do
459
+ def self.name; "Topic"; end
460
+ after_create do
461
+ update_attribute("author_name", "David")
462
+ end
463
+ end
464
+ topic = klass.new
465
+ topic.title = "Another New Topic"
466
+ topic.save
467
+
468
+ topic_reloaded = Topic.find(topic.id)
469
+ assert_equal("Another New Topic", topic_reloaded.title)
470
+ assert_equal("David", topic_reloaded.author_name)
471
+ end
472
+
473
+ def test_update_attribute_does_not_run_sql_if_attribute_is_not_changed
474
+ topic = Topic.create(title: "Another New Topic")
475
+ assert_no_queries do
476
+ assert topic.update_attribute(:title, "Another New Topic")
477
+ end
478
+ end
479
+
480
+ def test_update_does_not_run_sql_if_record_has_not_changed
481
+ topic = Topic.create(title: "Another New Topic")
482
+ assert_no_queries do
483
+ assert topic.update(title: "Another New Topic")
484
+ end
485
+ end
486
+
487
+ def test_delete
488
+ topic = Topic.find(1)
489
+ assert_equal topic, topic.delete, "topic.delete did not return self"
490
+ assert topic.frozen?, "topic not frozen after delete"
491
+ assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) }
492
+ end
493
+
494
+ def test_delete_doesnt_run_callbacks
495
+ Topic.find(1).delete
496
+ assert_not_nil Topic.find(2)
497
+ end
498
+
499
+ def test_delete_isnt_affected_by_scoping
500
+ topic = Topic.find(1)
501
+ assert_difference("Topic.count", -1) do
502
+ Topic.where("1=0").scoping { topic.delete }
503
+ end
504
+ end
505
+
506
+ def test_destroy
507
+ topic = Topic.find(1)
508
+ assert_equal topic, topic.destroy, "topic.destroy did not return self"
509
+ assert topic.frozen?, "topic not frozen after destroy"
510
+ assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) }
511
+ end
512
+
513
+ def test_destroy!
514
+ topic = Topic.find(1)
515
+ assert_equal topic, topic.destroy!, "topic.destroy! did not return self"
516
+ assert topic.frozen?, "topic not frozen after destroy!"
517
+ assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) }
518
+ end
519
+
520
+ def test_find_raises_record_not_found_exception
521
+ assert_raise(ActiveRecord::RecordNotFound) { Topic.find(99999) }
522
+ end
523
+
524
+ def test_update_raises_record_not_found_exception
525
+ assert_raise(ActiveRecord::RecordNotFound) { Topic.update(99999, approved: true) }
526
+ end
527
+
528
+ def test_destroy_raises_record_not_found_exception
529
+ assert_raise(ActiveRecord::RecordNotFound) { Topic.destroy(99999) }
530
+ end
531
+
532
+ def test_update_all
533
+ assert_equal Topic.count, Topic.update_all("content = 'bulk updated!'")
534
+ assert_equal "bulk updated!", Topic.find(1).content
535
+ assert_equal "bulk updated!", Topic.find(2).content
536
+
537
+ assert_equal Topic.count, Topic.update_all(["content = ?", "bulk updated again!"])
538
+ assert_equal "bulk updated again!", Topic.find(1).content
539
+ assert_equal "bulk updated again!", Topic.find(2).content
540
+
541
+ assert_equal Topic.count, Topic.update_all(["content = ?", nil])
542
+ assert_nil Topic.find(1).content
543
+ end
544
+
545
+ def test_update_all_with_hash
546
+ assert_not_nil Topic.find(1).last_read
547
+ assert_equal Topic.count, Topic.update_all(content: "bulk updated with hash!", last_read: nil)
548
+ assert_equal "bulk updated with hash!", Topic.find(1).content
549
+ assert_equal "bulk updated with hash!", Topic.find(2).content
550
+ assert_nil Topic.find(1).last_read
551
+ assert_nil Topic.find(2).last_read
552
+ end
553
+
554
+ def test_delete_new_record
555
+ client = Client.new(name: "37signals")
556
+ client.delete
557
+ assert_predicate client, :frozen?
558
+
559
+ assert_not client.save
560
+ assert_raise(ActiveRecord::RecordNotSaved) { client.save! }
561
+
562
+ assert_predicate client, :frozen?
563
+ assert_raise(RuntimeError) { client.name = "something else" }
564
+ end
565
+
566
+ def test_delete_record_with_associations
567
+ client = Client.find(3)
568
+ client.delete
569
+ assert_predicate client, :frozen?
570
+ assert_kind_of Firm, client.firm
571
+
572
+ assert_not client.save
573
+ assert_raise(ActiveRecord::RecordNotSaved) { client.save! }
574
+
575
+ assert_predicate client, :frozen?
576
+ assert_raise(RuntimeError) { client.name = "something else" }
577
+ end
578
+
579
+ def test_destroy_new_record
580
+ client = Client.new(name: "37signals")
581
+ client.destroy
582
+ assert_predicate client, :frozen?
583
+
584
+ assert_not client.save
585
+ assert_raise(ActiveRecord::RecordNotSaved) { client.save! }
586
+
587
+ assert_predicate client, :frozen?
588
+ assert_raise(RuntimeError) { client.name = "something else" }
589
+ end
590
+
591
+ def test_destroy_record_with_associations
592
+ client = Client.find(3)
593
+ client.destroy
594
+ assert_predicate client, :frozen?
595
+ assert_kind_of Firm, client.firm
596
+
597
+ assert_not client.save
598
+ assert_raise(ActiveRecord::RecordNotSaved) { client.save! }
599
+
600
+ assert_predicate client, :frozen?
601
+ assert_raise(RuntimeError) { client.name = "something else" }
602
+ end
603
+
604
+ def test_update_attribute
605
+ assert_not_predicate Topic.find(1), :approved?
606
+ Topic.find(1).update_attribute("approved", true)
607
+ assert_predicate Topic.find(1), :approved?
608
+
609
+ Topic.find(1).update_attribute(:approved, false)
610
+ assert_not_predicate Topic.find(1), :approved?
611
+
612
+ Topic.find(1).update_attribute(:change_approved_before_save, true)
613
+ assert_predicate Topic.find(1), :approved?
614
+ end
615
+
616
+ def test_update_attribute_for_readonly_attribute
617
+ minivan = Minivan.find("m1")
618
+ assert_raises(ActiveRecord::ActiveRecordError) { minivan.update_attribute(:color, "black") }
619
+ end
620
+
621
+ def test_update_attribute_with_one_updated
622
+ t = Topic.first
623
+ t.update_attribute(:title, "super_title")
624
+ assert_equal "super_title", t.title
625
+ assert_not t.changed?, "topic should not have changed"
626
+ assert_not t.title_changed?, "title should not have changed"
627
+ assert_nil t.title_change, "title change should be nil"
628
+
629
+ t.reload
630
+ assert_equal "super_title", t.title
631
+ end
632
+
633
+ def test_update_attribute_for_updated_at_on
634
+ developer = Developer.find(1)
635
+ prev_month = Time.now.prev_month.change(usec: 0)
636
+
637
+ developer.update_attribute(:updated_at, prev_month)
638
+ assert_equal prev_month, developer.updated_at
639
+
640
+ developer.update_attribute(:salary, 80001)
641
+ assert_not_equal prev_month, developer.updated_at
642
+
643
+ developer.reload
644
+ assert_not_equal prev_month, developer.updated_at
645
+ end
646
+
647
+ def test_update_column
648
+ topic = Topic.find(1)
649
+ topic.update_column("approved", true)
650
+ assert_predicate topic, :approved?
651
+ topic.reload
652
+ assert_predicate topic, :approved?
653
+
654
+ topic.update_column(:approved, false)
655
+ assert_not_predicate topic, :approved?
656
+ topic.reload
657
+ assert_not_predicate topic, :approved?
658
+ end
659
+
660
+ def test_update_column_should_not_use_setter_method
661
+ dev = Developer.find(1)
662
+ dev.instance_eval { def salary=(value); write_attribute(:salary, value * 2); end }
663
+
664
+ dev.update_column(:salary, 80000)
665
+ assert_equal 80000, dev.salary
666
+
667
+ dev.reload
668
+ assert_equal 80000, dev.salary
669
+ end
670
+
671
+ def test_update_column_should_raise_exception_if_new_record
672
+ topic = Topic.new
673
+ assert_raises(ActiveRecord::ActiveRecordError) { topic.update_column("approved", false) }
674
+ end
675
+
676
+ def test_update_column_should_not_leave_the_object_dirty
677
+ topic = Topic.find(1)
678
+ topic.update_column("content", "--- Have a nice day\n...\n")
679
+
680
+ topic.reload
681
+ topic.update_column(:content, "--- You too\n...\n")
682
+ assert_equal [], topic.changed
683
+
684
+ topic.reload
685
+ topic.update_column("content", "--- Have a nice day\n...\n")
686
+ assert_equal [], topic.changed
687
+ end
688
+
689
+ def test_update_column_with_model_having_primary_key_other_than_id
690
+ minivan = Minivan.find("m1")
691
+ new_name = "sebavan"
692
+
693
+ minivan.update_column(:name, new_name)
694
+ assert_equal new_name, minivan.name
695
+ end
696
+
697
+ def test_update_column_for_readonly_attribute
698
+ minivan = Minivan.find("m1")
699
+ prev_color = minivan.color
700
+ assert_raises(ActiveRecord::ActiveRecordError) { minivan.update_column(:color, "black") }
701
+ assert_equal prev_color, minivan.color
702
+ end
703
+
704
+ def test_update_column_should_not_modify_updated_at
705
+ developer = Developer.find(1)
706
+ prev_month = Time.now.prev_month.change(usec: 0)
707
+
708
+ developer.update_column(:updated_at, prev_month)
709
+ assert_equal prev_month, developer.updated_at
710
+
711
+ developer.update_column(:salary, 80001)
712
+ assert_equal prev_month, developer.updated_at
713
+
714
+ developer.reload
715
+ assert_equal prev_month.to_i, developer.updated_at.to_i
716
+ end
717
+
718
+ def test_update_column_with_one_changed_and_one_updated
719
+ t = Topic.order("id").limit(1).first
720
+ author_name = t.author_name
721
+ t.author_name = "John"
722
+ t.update_column(:title, "super_title")
723
+ assert_equal "John", t.author_name
724
+ assert_equal "super_title", t.title
725
+ assert t.changed?, "topic should have changed"
726
+ assert t.author_name_changed?, "author_name should have changed"
727
+
728
+ t.reload
729
+ assert_equal author_name, t.author_name
730
+ assert_equal "super_title", t.title
731
+ end
732
+
733
+ def test_update_column_with_default_scope
734
+ developer = DeveloperCalledDavid.first
735
+ developer.name = "John"
736
+ developer.save!
737
+
738
+ assert developer.update_column(:name, "Will"), "did not update record due to default scope"
739
+ end
740
+
741
+ def test_update_columns
742
+ topic = Topic.find(1)
743
+ topic.update_columns("approved" => true, title: "Sebastian Topic")
744
+ assert_predicate topic, :approved?
745
+ assert_equal "Sebastian Topic", topic.title
746
+ topic.reload
747
+ assert_predicate topic, :approved?
748
+ assert_equal "Sebastian Topic", topic.title
749
+ end
750
+
751
+ def test_update_columns_should_not_use_setter_method
752
+ dev = Developer.find(1)
753
+ dev.instance_eval { def salary=(value); write_attribute(:salary, value * 2); end }
754
+
755
+ dev.update_columns(salary: 80000)
756
+ assert_equal 80000, dev.salary
757
+
758
+ dev.reload
759
+ assert_equal 80000, dev.salary
760
+ end
761
+
762
+ def test_update_columns_should_raise_exception_if_new_record
763
+ topic = Topic.new
764
+ assert_raises(ActiveRecord::ActiveRecordError) { topic.update_columns(approved: false) }
765
+ end
766
+
767
+ def test_update_columns_should_not_leave_the_object_dirty
768
+ topic = Topic.find(1)
769
+ topic.update("content" => "--- Have a nice day\n...\n", :author_name => "Jose")
770
+
771
+ topic.reload
772
+ topic.update_columns(content: "--- You too\n...\n", "author_name" => "Sebastian")
773
+ assert_equal [], topic.changed
774
+
775
+ topic.reload
776
+ topic.update_columns(content: "--- Have a nice day\n...\n", author_name: "Jose")
777
+ assert_equal [], topic.changed
778
+ end
779
+
780
+ def test_update_columns_with_model_having_primary_key_other_than_id
781
+ minivan = Minivan.find("m1")
782
+ new_name = "sebavan"
783
+
784
+ minivan.update_columns(name: new_name)
785
+ assert_equal new_name, minivan.name
786
+ end
787
+
788
+ def test_update_columns_with_one_readonly_attribute
789
+ minivan = Minivan.find("m1")
790
+ prev_color = minivan.color
791
+ prev_name = minivan.name
792
+ assert_raises(ActiveRecord::ActiveRecordError) { minivan.update_columns(name: "My old minivan", color: "black") }
793
+ assert_equal prev_color, minivan.color
794
+ assert_equal prev_name, minivan.name
795
+
796
+ minivan.reload
797
+ assert_equal prev_color, minivan.color
798
+ assert_equal prev_name, minivan.name
799
+ end
800
+
801
+ def test_update_columns_should_not_modify_updated_at
802
+ developer = Developer.find(1)
803
+ prev_month = Time.now.prev_month.change(usec: 0)
804
+
805
+ developer.update_columns(updated_at: prev_month)
806
+ assert_equal prev_month, developer.updated_at
807
+
808
+ developer.update_columns(salary: 80000)
809
+ assert_equal prev_month, developer.updated_at
810
+ assert_equal 80000, developer.salary
811
+
812
+ developer.reload
813
+ assert_equal prev_month.to_i, developer.updated_at.to_i
814
+ assert_equal 80000, developer.salary
815
+ end
816
+
817
+ def test_update_columns_with_one_changed_and_one_updated
818
+ t = Topic.order("id").limit(1).first
819
+ author_name = t.author_name
820
+ t.author_name = "John"
821
+ t.update_columns(title: "super_title")
822
+ assert_equal "John", t.author_name
823
+ assert_equal "super_title", t.title
824
+ assert t.changed?, "topic should have changed"
825
+ assert t.author_name_changed?, "author_name should have changed"
826
+
827
+ t.reload
828
+ assert_equal author_name, t.author_name
829
+ assert_equal "super_title", t.title
830
+ end
831
+
832
+ def test_update_columns_changing_id
833
+ topic = Topic.find(1)
834
+ topic.update_columns(id: 123)
835
+ assert_equal 123, topic.id
836
+ topic.reload
837
+ assert_equal 123, topic.id
838
+ end
839
+
840
+ def test_update_columns_returns_boolean
841
+ topic = Topic.find(1)
842
+ assert_equal true, topic.update_columns(title: "New title")
843
+ end
844
+
845
+ def test_update_columns_with_default_scope
846
+ developer = DeveloperCalledDavid.first
847
+ developer.name = "John"
848
+ developer.save!
849
+
850
+ assert developer.update_columns(name: "Will"), "did not update record due to default scope"
851
+ end
852
+
853
+ def test_update
854
+ topic = Topic.find(1)
855
+ assert_not_predicate topic, :approved?
856
+ assert_equal "The First Topic", topic.title
857
+
858
+ topic.update("approved" => true, "title" => "The First Topic Updated")
859
+ topic.reload
860
+ assert_predicate topic, :approved?
861
+ assert_equal "The First Topic Updated", topic.title
862
+
863
+ topic.update(approved: false, title: "The First Topic")
864
+ topic.reload
865
+ assert_not_predicate topic, :approved?
866
+ assert_equal "The First Topic", topic.title
867
+
868
+ error = assert_raise(ActiveRecord::RecordNotUnique, ActiveRecord::StatementInvalid) do
869
+ topic.update(id: 3, title: "Hm is it possible?")
870
+ end
871
+ assert_not_nil error.cause
872
+ assert_not_equal "Hm is it possible?", Topic.find(3).title
873
+
874
+ topic.update(id: 1234)
875
+ assert_nothing_raised { topic.reload }
876
+ assert_equal topic.title, Topic.find(1234).title
877
+ end
878
+
879
+ def test_update_parameters
880
+ topic = Topic.find(1)
881
+ assert_nothing_raised do
882
+ topic.update({})
883
+ end
884
+
885
+ assert_raises(ArgumentError) do
886
+ topic.update(nil)
887
+ end
888
+ end
889
+
890
+ def test_update!
891
+ Reply.validates_presence_of(:title)
892
+ reply = Reply.find(2)
893
+ assert_equal "The Second Topic of the day", reply.title
894
+ assert_equal "Have a nice day", reply.content
895
+
896
+ reply.update!("title" => "The Second Topic of the day updated", "content" => "Have a nice evening")
897
+ reply.reload
898
+ assert_equal "The Second Topic of the day updated", reply.title
899
+ assert_equal "Have a nice evening", reply.content
900
+
901
+ reply.update!(title: "The Second Topic of the day", content: "Have a nice day")
902
+ reply.reload
903
+ assert_equal "The Second Topic of the day", reply.title
904
+ assert_equal "Have a nice day", reply.content
905
+
906
+ assert_raise(ActiveRecord::RecordInvalid) { reply.update!(title: nil, content: "Have a nice evening") }
907
+ ensure
908
+ Reply.clear_validators!
909
+ end
910
+
911
+ def test_destroyed_returns_boolean
912
+ developer = Developer.first
913
+ assert_equal false, developer.destroyed?
914
+ developer.destroy
915
+ assert_equal true, developer.destroyed?
916
+
917
+ developer = Developer.last
918
+ assert_equal false, developer.destroyed?
919
+ developer.delete
920
+ assert_equal true, developer.destroyed?
921
+ end
922
+
923
+ def test_persisted_returns_boolean
924
+ developer = Developer.new(name: "Jose")
925
+ assert_equal false, developer.persisted?
926
+ developer.save!
927
+ assert_equal true, developer.persisted?
928
+
929
+ developer = Developer.first
930
+ assert_equal true, developer.persisted?
931
+ developer.destroy
932
+ assert_equal false, developer.persisted?
933
+
934
+ developer = Developer.last
935
+ assert_equal true, developer.persisted?
936
+ developer.delete
937
+ assert_equal false, developer.persisted?
938
+ end
939
+
940
+ def test_class_level_destroy
941
+ should_be_destroyed_reply = Reply.create("title" => "hello", "content" => "world")
942
+ Topic.find(1).replies << should_be_destroyed_reply
943
+
944
+ topic = Topic.destroy(1)
945
+ assert_predicate topic, :destroyed?
946
+
947
+ assert_raise(ActiveRecord::RecordNotFound) { Topic.find(1) }
948
+ assert_raise(ActiveRecord::RecordNotFound) { Reply.find(should_be_destroyed_reply.id) }
949
+ end
950
+
951
+ def test_class_level_destroy_is_affected_by_scoping
952
+ should_not_be_destroyed_reply = Reply.create("title" => "hello", "content" => "world")
953
+ Topic.find(1).replies << should_not_be_destroyed_reply
954
+
955
+ assert_raise(ActiveRecord::RecordNotFound) do
956
+ Topic.where("1=0").scoping { Topic.destroy(1) }
957
+ end
958
+
959
+ assert_nothing_raised { Topic.find(1) }
960
+ assert_nothing_raised { Reply.find(should_not_be_destroyed_reply.id) }
961
+ end
962
+
963
+ def test_class_level_delete
964
+ should_not_be_destroyed_reply = Reply.create("title" => "hello", "content" => "world")
965
+ Topic.find(1).replies << should_not_be_destroyed_reply
966
+
967
+ Topic.delete(1)
968
+ assert_raise(ActiveRecord::RecordNotFound) { Topic.find(1) }
969
+ assert_nothing_raised { Reply.find(should_not_be_destroyed_reply.id) }
970
+ end
971
+
972
+ def test_class_level_delete_is_affected_by_scoping
973
+ should_not_be_destroyed_reply = Reply.create("title" => "hello", "content" => "world")
974
+ Topic.find(1).replies << should_not_be_destroyed_reply
975
+
976
+ Topic.where("1=0").scoping { Topic.delete(1) }
977
+ assert_nothing_raised { Topic.find(1) }
978
+ assert_nothing_raised { Reply.find(should_not_be_destroyed_reply.id) }
979
+ end
980
+
981
+ def test_create_with_custom_timestamps
982
+ custom_datetime = 1.hour.ago.beginning_of_day
983
+
984
+ %w(created_at created_on updated_at updated_on).each do |attribute|
985
+ parrot = LiveParrot.create(:name => "colombian", attribute => custom_datetime)
986
+ assert_equal custom_datetime, parrot[attribute]
987
+ end
988
+ end
989
+
990
+ def test_persist_inherited_class_with_different_table_name
991
+ minimalistic_aircrafts = Class.new(Minimalistic) do
992
+ self.table_name = "aircraft"
993
+ end
994
+
995
+ assert_difference "Aircraft.count", 1 do
996
+ aircraft = minimalistic_aircrafts.create(name: "Wright Flyer")
997
+ aircraft.name = "Wright Glider"
998
+ aircraft.save
999
+ end
1000
+
1001
+ assert_equal "Wright Glider", Aircraft.last.name
1002
+ end
1003
+
1004
+ def test_instantiate_creates_a_new_instance
1005
+ post = Post.instantiate("title" => "appropriate documentation", "type" => "SpecialPost")
1006
+ assert_equal "appropriate documentation", post.title
1007
+ assert_instance_of SpecialPost, post
1008
+
1009
+ # body was not initialized
1010
+ assert_raises ActiveModel::MissingAttributeError do
1011
+ post.body
1012
+ end
1013
+ end
1014
+
1015
+ def test_reload_removes_custom_selects
1016
+ post = Post.select("posts.*, 1 as wibble").last!
1017
+
1018
+ assert_equal 1, post[:wibble]
1019
+ assert_nil post.reload[:wibble]
1020
+ end
1021
+
1022
+ def test_find_via_reload
1023
+ post = Post.new
1024
+
1025
+ assert_predicate post, :new_record?
1026
+
1027
+ post.id = 1
1028
+ post.reload
1029
+
1030
+ assert_equal "Welcome to the weblog", post.title
1031
+ assert_not_predicate post, :new_record?
1032
+ end
1033
+
1034
+ def test_reload_via_querycache
1035
+ ActiveRecord::Base.connection.enable_query_cache!
1036
+ ActiveRecord::Base.connection.clear_query_cache
1037
+ assert ActiveRecord::Base.connection.query_cache_enabled, "cache should be on"
1038
+ parrot = Parrot.create(name: "Shane")
1039
+
1040
+ # populate the cache with the SELECT result
1041
+ found_parrot = Parrot.find(parrot.id)
1042
+ assert_equal parrot.id, found_parrot.id
1043
+
1044
+ # Manually update the 'name' attribute in the DB directly
1045
+ assert_equal 1, ActiveRecord::Base.connection.query_cache.length
1046
+ ActiveRecord::Base.uncached do
1047
+ found_parrot.name = "Mary"
1048
+ found_parrot.save
1049
+ end
1050
+
1051
+ # Now reload, and verify that it gets the DB version, and not the querycache version
1052
+ found_parrot.reload
1053
+ assert_equal "Mary", found_parrot.name
1054
+
1055
+ found_parrot = Parrot.find(parrot.id)
1056
+ assert_equal "Mary", found_parrot.name
1057
+ ensure
1058
+ ActiveRecord::Base.connection.disable_query_cache!
1059
+ end
1060
+
1061
+ def test_save_touch_false
1062
+ parrot = Parrot.create!(
1063
+ name: "Bob",
1064
+ created_at: 1.day.ago,
1065
+ updated_at: 1.day.ago)
1066
+
1067
+ created_at = parrot.created_at
1068
+ updated_at = parrot.updated_at
1069
+
1070
+ parrot.name = "Barb"
1071
+ parrot.save!(touch: false)
1072
+ assert_equal parrot.created_at, created_at
1073
+ assert_equal parrot.updated_at, updated_at
1074
+ end
1075
+
1076
+ def test_reset_column_information_resets_children
1077
+ child_class = Class.new(Topic)
1078
+ child_class.new # force schema to load
1079
+
1080
+ ActiveRecord::Base.connection.add_column(:topics, :foo, :string)
1081
+ Topic.reset_column_information
1082
+
1083
+ # this should redefine attribute methods
1084
+ child_class.new
1085
+
1086
+ assert child_class.instance_methods.include?(:foo)
1087
+ assert child_class.instance_methods.include?(:foo_changed?)
1088
+ assert_equal "bar", child_class.new(foo: :bar).foo
1089
+ ensure
1090
+ ActiveRecord::Base.connection.remove_column(:topics, :foo)
1091
+ Topic.reset_column_information
1092
+ end
1093
+ end