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,787 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/tag"
5
+ require "models/tagging"
6
+ require "models/post"
7
+ require "models/rating"
8
+ require "models/item"
9
+ require "models/comment"
10
+ require "models/author"
11
+ require "models/category"
12
+ require "models/categorization"
13
+ require "models/vertex"
14
+ require "models/edge"
15
+ require "models/book"
16
+ require "models/citation"
17
+ require "models/aircraft"
18
+ require "models/engine"
19
+ require "models/car"
20
+
21
+ class AssociationsJoinModelTest < ActiveRecord::TestCase
22
+ self.use_transactional_tests = false unless supports_savepoints?
23
+
24
+ fixtures :posts, :authors, :author_addresses, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books,
25
+ # Reload edges table from fixtures as otherwise repeated test was failing
26
+ :edges
27
+
28
+ def test_has_many
29
+ assert_includes authors(:david).categories, categories(:general)
30
+ end
31
+
32
+ def test_has_many_inherited
33
+ assert_includes authors(:mary).categories, categories(:sti_test)
34
+ end
35
+
36
+ def test_inherited_has_many
37
+ assert_includes categories(:sti_test).authors, authors(:mary)
38
+ end
39
+
40
+ def test_has_many_distinct_through_join_model
41
+ assert_equal 2, authors(:mary).categorized_posts.size
42
+ assert_equal 1, authors(:mary).unique_categorized_posts.size
43
+ end
44
+
45
+ def test_has_many_distinct_through_count
46
+ author = authors(:mary)
47
+ assert_not_predicate authors(:mary).unique_categorized_posts, :loaded?
48
+ assert_queries(1) { assert_equal 1, author.unique_categorized_posts.count }
49
+ assert_queries(1) { assert_equal 1, author.unique_categorized_posts.count(:title) }
50
+ assert_queries(1) { assert_equal 0, author.unique_categorized_posts.where(title: nil).count(:title) }
51
+ assert_not_predicate authors(:mary).unique_categorized_posts, :loaded?
52
+ end
53
+
54
+ def test_has_many_distinct_through_find
55
+ assert_equal 1, authors(:mary).unique_categorized_posts.to_a.size
56
+ end
57
+
58
+ def test_polymorphic_has_many_going_through_join_model
59
+ assert_equal tags(:general), tag = posts(:welcome).tags.first
60
+ assert_no_queries do
61
+ tag.tagging
62
+ end
63
+ end
64
+
65
+ def test_count_polymorphic_has_many
66
+ assert_equal 1, posts(:welcome).taggings.count
67
+ assert_equal 1, posts(:welcome).tags.count
68
+ end
69
+
70
+ def test_polymorphic_has_many_going_through_join_model_with_find
71
+ assert_equal tags(:general), tag = posts(:welcome).tags.first
72
+ assert_no_queries do
73
+ tag.tagging
74
+ end
75
+ end
76
+
77
+ def test_polymorphic_has_many_going_through_join_model_with_include_on_source_reflection
78
+ assert_equal tags(:general), tag = posts(:welcome).funky_tags.first
79
+ assert_no_queries do
80
+ tag.tagging
81
+ end
82
+ end
83
+
84
+ def test_polymorphic_has_many_going_through_join_model_with_include_on_source_reflection_with_find
85
+ assert_equal tags(:general), tag = posts(:welcome).funky_tags.first
86
+ assert_no_queries do
87
+ tag.tagging
88
+ end
89
+ end
90
+
91
+ def test_polymorphic_has_many_going_through_join_model_with_custom_select_and_joins
92
+ assert_equal tags(:general), tag = posts(:welcome).tags.add_joins_and_select.first
93
+ assert_nothing_raised { tag.author_id }
94
+ end
95
+
96
+ def test_polymorphic_has_many_going_through_join_model_with_custom_foreign_key
97
+ assert_equal tags(:misc), taggings(:welcome_general).super_tag
98
+ assert_equal tags(:misc), posts(:welcome).super_tags.first
99
+ end
100
+
101
+ def test_polymorphic_has_many_create_model_with_inheritance_and_custom_base_class
102
+ post = SubAbstractStiPost.create title: "SubAbstractStiPost", body: "SubAbstractStiPost body"
103
+ assert_instance_of SubAbstractStiPost, post
104
+
105
+ tagging = tags(:misc).taggings.create(taggable: post)
106
+ assert_equal "SubAbstractStiPost", tagging.taggable_type
107
+ end
108
+
109
+ def test_polymorphic_has_many_going_through_join_model_with_inheritance
110
+ assert_equal tags(:general), posts(:thinking).tags.first
111
+ end
112
+
113
+ def test_polymorphic_has_many_going_through_join_model_with_inheritance_with_custom_class_name
114
+ assert_equal tags(:general), posts(:thinking).funky_tags.first
115
+ end
116
+
117
+ def test_polymorphic_has_many_create_model_with_inheritance
118
+ post = posts(:thinking)
119
+ assert_instance_of SpecialPost, post
120
+
121
+ tagging = tags(:misc).taggings.create(taggable: post)
122
+ assert_equal "Post", tagging.taggable_type
123
+ end
124
+
125
+ def test_polymorphic_has_one_create_model_with_inheritance
126
+ tagging = tags(:misc).create_tagging(taggable: posts(:thinking))
127
+ assert_equal "Post", tagging.taggable_type
128
+ end
129
+
130
+ def test_set_polymorphic_has_many
131
+ tagging = tags(:misc).taggings.create
132
+ posts(:thinking).taggings << tagging
133
+ assert_equal "Post", tagging.taggable_type
134
+ end
135
+
136
+ def test_set_polymorphic_has_one
137
+ tagging = tags(:misc).taggings.create
138
+ posts(:thinking).tagging = tagging
139
+
140
+ assert_equal "Post", tagging.taggable_type
141
+ assert_equal posts(:thinking).id, tagging.taggable_id
142
+ assert_equal posts(:thinking), tagging.taggable
143
+ end
144
+
145
+ def test_set_polymorphic_has_one_on_new_record
146
+ tagging = tags(:misc).taggings.create
147
+ post = Post.new title: "foo", body: "bar"
148
+ post.tagging = tagging
149
+ post.save!
150
+
151
+ assert_equal "Post", tagging.taggable_type
152
+ assert_equal post.id, tagging.taggable_id
153
+ assert_equal post, tagging.taggable
154
+ end
155
+
156
+ def test_create_polymorphic_has_many_with_scope
157
+ old_count = posts(:welcome).taggings.count
158
+ tagging = posts(:welcome).taggings.create(tag: tags(:misc))
159
+ assert_equal "Post", tagging.taggable_type
160
+ assert_equal old_count + 1, posts(:welcome).taggings.count
161
+ end
162
+
163
+ def test_create_bang_polymorphic_with_has_many_scope
164
+ old_count = posts(:welcome).taggings.count
165
+ tagging = posts(:welcome).taggings.create!(tag: tags(:misc))
166
+ assert_equal "Post", tagging.taggable_type
167
+ assert_equal old_count + 1, posts(:welcome).taggings.count
168
+ end
169
+
170
+ def test_create_polymorphic_has_one_with_scope
171
+ old_count = Tagging.count
172
+ tagging = posts(:welcome).create_tagging(tag: tags(:misc))
173
+ assert_equal "Post", tagging.taggable_type
174
+ assert_equal old_count + 1, Tagging.count
175
+ end
176
+
177
+ def test_delete_polymorphic_has_many_with_delete_all
178
+ assert_equal 1, posts(:welcome).taggings.count
179
+ posts(:welcome).taggings.first.update_columns taggable_type: "PostWithHasManyDeleteAll"
180
+ post = find_post_with_dependency(1, :has_many, :taggings, :delete_all)
181
+
182
+ old_count = Tagging.count
183
+ post.destroy
184
+ assert_equal old_count - 1, Tagging.count
185
+ assert_equal 0, posts(:welcome).taggings.count
186
+ end
187
+
188
+ def test_delete_polymorphic_has_many_with_destroy
189
+ assert_equal 1, posts(:welcome).taggings.count
190
+ posts(:welcome).taggings.first.update_columns taggable_type: "PostWithHasManyDestroy"
191
+ post = find_post_with_dependency(1, :has_many, :taggings, :destroy)
192
+
193
+ old_count = Tagging.count
194
+ post.destroy
195
+ assert_equal old_count - 1, Tagging.count
196
+ assert_equal 0, posts(:welcome).taggings.count
197
+ end
198
+
199
+ def test_delete_polymorphic_has_many_with_nullify
200
+ assert_equal 1, posts(:welcome).taggings.count
201
+ posts(:welcome).taggings.first.update_columns taggable_type: "PostWithHasManyNullify"
202
+ post = find_post_with_dependency(1, :has_many, :taggings, :nullify)
203
+
204
+ old_count = Tagging.count
205
+ post.destroy
206
+ assert_equal old_count, Tagging.count
207
+ assert_equal 0, posts(:welcome).taggings.count
208
+ end
209
+
210
+ def test_delete_polymorphic_has_one_with_destroy
211
+ assert posts(:welcome).tagging
212
+ posts(:welcome).tagging.update_columns taggable_type: "PostWithHasOneDestroy"
213
+ post = find_post_with_dependency(1, :has_one, :tagging, :destroy)
214
+
215
+ old_count = Tagging.count
216
+ post.destroy
217
+ assert_equal old_count - 1, Tagging.count
218
+ posts(:welcome).association(:tagging).reload
219
+ assert_nil posts(:welcome).tagging
220
+ end
221
+
222
+ def test_delete_polymorphic_has_one_with_nullify
223
+ assert posts(:welcome).tagging
224
+ posts(:welcome).tagging.update_columns taggable_type: "PostWithHasOneNullify"
225
+ post = find_post_with_dependency(1, :has_one, :tagging, :nullify)
226
+
227
+ old_count = Tagging.count
228
+ post.destroy
229
+ assert_equal old_count, Tagging.count
230
+ posts(:welcome).association(:tagging).reload
231
+ assert_nil posts(:welcome).tagging
232
+ end
233
+
234
+ def test_has_many_with_piggyback
235
+ assert_equal "2", categories(:sti_test).authors_with_select.first.post_id.to_s
236
+ end
237
+
238
+ def test_create_through_has_many_with_piggyback
239
+ category = categories(:sti_test)
240
+ ernie = category.authors_with_select.create(name: "Ernie")
241
+ assert_nothing_raised do
242
+ assert_equal ernie, category.authors_with_select.detect { |a| a.name == "Ernie" }
243
+ end
244
+ end
245
+
246
+ def test_include_has_many_through
247
+ posts = Post.all.merge!(order: "posts.id").to_a
248
+ posts_with_authors = Post.all.merge!(includes: :authors, order: "posts.id").to_a
249
+ assert_equal posts.length, posts_with_authors.length
250
+ posts.length.times do |i|
251
+ assert_equal posts[i].authors.length, assert_no_queries { posts_with_authors[i].authors.length }
252
+ end
253
+ end
254
+
255
+ def test_include_polymorphic_has_one
256
+ post = Post.includes(:tagging).find posts(:welcome).id
257
+ tagging = taggings(:welcome_general)
258
+ assert_no_queries do
259
+ assert_equal tagging, post.tagging
260
+ end
261
+ end
262
+
263
+ def test_include_polymorphic_has_one_defined_in_abstract_parent
264
+ item = Item.includes(:tagging).find items(:dvd).id
265
+ tagging = taggings(:godfather)
266
+ assert_no_queries do
267
+ assert_equal tagging, item.tagging
268
+ end
269
+ end
270
+
271
+ def test_include_polymorphic_has_many_through
272
+ posts = Post.all.merge!(order: "posts.id").to_a
273
+ posts_with_tags = Post.all.merge!(includes: :tags, order: "posts.id").to_a
274
+ assert_equal posts.length, posts_with_tags.length
275
+ posts.length.times do |i|
276
+ assert_equal posts[i].tags.length, assert_no_queries { posts_with_tags[i].tags.length }
277
+ end
278
+ end
279
+
280
+ def test_include_polymorphic_has_many
281
+ posts = Post.all.merge!(order: "posts.id").to_a
282
+ posts_with_taggings = Post.all.merge!(includes: :taggings, order: "posts.id").to_a
283
+ assert_equal posts.length, posts_with_taggings.length
284
+ posts.length.times do |i|
285
+ assert_equal posts[i].taggings.length, assert_no_queries { posts_with_taggings[i].taggings.length }
286
+ end
287
+ end
288
+
289
+ def test_has_many_find_all
290
+ assert_equal [categories(:general)], authors(:david).categories.to_a
291
+ end
292
+
293
+ def test_has_many_find_first
294
+ assert_equal categories(:general), authors(:david).categories.first
295
+ end
296
+
297
+ def test_has_many_with_hash_conditions
298
+ assert_equal categories(:general), authors(:david).categories_like_general.first
299
+ end
300
+
301
+ def test_has_many_find_conditions
302
+ assert_equal categories(:general), authors(:david).categories.where("categories.name = 'General'").first
303
+ assert_nil authors(:david).categories.where("categories.name = 'Technology'").first
304
+ end
305
+
306
+ def test_has_many_array_methods_called_by_method_missing
307
+ assert authors(:david).categories.any? { |category| category.name == "General" }
308
+ assert_nothing_raised { authors(:david).categories.sort }
309
+ end
310
+
311
+ def test_has_many_going_through_join_model_with_custom_foreign_key
312
+ assert_equal [authors(:bob)], posts(:thinking).authors
313
+ assert_equal [authors(:mary)], posts(:authorless).authors
314
+ end
315
+
316
+ def test_has_many_going_through_join_model_with_custom_primary_key
317
+ assert_equal [authors(:david)], posts(:thinking).authors_using_author_id
318
+ end
319
+
320
+ def test_has_many_going_through_polymorphic_join_model_with_custom_primary_key
321
+ assert_equal [tags(:general)], posts(:eager_other).tags_using_author_id
322
+ end
323
+
324
+ def test_has_many_through_with_custom_primary_key_on_belongs_to_source
325
+ assert_equal [authors(:david), authors(:david)], posts(:thinking).author_using_custom_pk
326
+ end
327
+
328
+ def test_has_many_through_with_custom_primary_key_on_has_many_source
329
+ assert_equal [authors(:david), authors(:bob)], posts(:thinking).authors_using_custom_pk.order("authors.id")
330
+ end
331
+
332
+ def test_belongs_to_polymorphic_with_counter_cache
333
+ assert_equal 1, posts(:welcome)[:tags_count]
334
+ tagging = posts(:welcome).taggings.create(tag: tags(:general))
335
+ assert_equal 2, posts(:welcome, :reload)[:tags_count]
336
+ tagging.destroy
337
+ assert_equal 1, posts(:welcome, :reload)[:tags_count]
338
+ end
339
+
340
+ def test_unavailable_through_reflection
341
+ assert_raise(ActiveRecord::HasManyThroughAssociationNotFoundError) { authors(:david).nothings }
342
+ end
343
+
344
+ if defined?(DidYouMean) && DidYouMean.respond_to?(:correct_error)
345
+ def test_exceptions_have_suggestions_for_fix
346
+ error = assert_raise(ActiveRecord::HasManyThroughAssociationNotFoundError) {
347
+ authors(:david).nothings
348
+ }
349
+ assert_match "Did you mean?", error.message
350
+ end
351
+ end
352
+
353
+ def test_has_many_through_join_model_with_conditions
354
+ assert_equal [], posts(:welcome).invalid_taggings
355
+ assert_equal [], posts(:welcome).invalid_tags
356
+ end
357
+
358
+ def test_has_many_polymorphic
359
+ assert_raise ActiveRecord::HasManyThroughAssociationPolymorphicSourceError do
360
+ tags(:general).taggables
361
+ end
362
+
363
+ assert_raise ActiveRecord::HasManyThroughAssociationPolymorphicThroughError do
364
+ taggings(:welcome_general).things
365
+ end
366
+
367
+ assert_raise ActiveRecord::EagerLoadPolymorphicError do
368
+ tags(:general).taggings.includes(:taggable).where("bogus_table.column = 1").references(:bogus_table).to_a
369
+ end
370
+ end
371
+
372
+ def test_has_many_polymorphic_with_source_type
373
+ # added sort by ID as otherwise Oracle select sometimes returned rows in different order
374
+ assert_equal posts(:welcome, :thinking).sort_by(&:id), tags(:general).tagged_posts.sort_by(&:id)
375
+ end
376
+
377
+ def test_has_many_polymorphic_associations_merges_through_scope
378
+ Tag.has_many :null_taggings, -> { none }, class_name: :Tagging
379
+ Tag.has_many :null_tagged_posts, through: :null_taggings, source: "taggable", source_type: "Post"
380
+ assert_equal [], tags(:general).null_tagged_posts
381
+ assert_not_equal [], tags(:general).tagged_posts
382
+ end
383
+
384
+ def test_eager_has_many_polymorphic_with_source_type
385
+ tag_with_include = Tag.all.merge!(includes: :tagged_posts).find(tags(:general).id)
386
+ desired = posts(:welcome, :thinking)
387
+ assert_no_queries do
388
+ # added sort by ID as otherwise test using JRuby was failing as array elements were in different order
389
+ assert_equal desired.sort_by(&:id), tag_with_include.tagged_posts.sort_by(&:id)
390
+ end
391
+ assert_equal 5, tag_with_include.taggings.length
392
+ end
393
+
394
+ def test_has_many_through_has_many_find_all
395
+ assert_equal comments(:greetings), authors(:david).comments.order("comments.id").to_a.first
396
+ end
397
+
398
+ def test_has_many_through_has_many_find_all_with_custom_class
399
+ assert_equal comments(:greetings), authors(:david).funky_comments.order("comments.id").to_a.first
400
+ end
401
+
402
+ def test_has_many_through_has_many_find_first
403
+ assert_equal comments(:greetings), authors(:david).comments.order("comments.id").first
404
+ end
405
+
406
+ def test_has_many_through_has_many_find_conditions
407
+ options = { where: "comments.#{QUOTED_TYPE}='SpecialComment'", order: "comments.id" }
408
+ assert_equal comments(:does_it_hurt), authors(:david).comments.merge(options).first
409
+ end
410
+
411
+ def test_has_many_through_has_many_find_by_id
412
+ assert_equal comments(:more_greetings), authors(:david).comments.find(2)
413
+ end
414
+
415
+ def test_has_many_through_polymorphic_has_one
416
+ assert_equal Tagging.find(1, 2).sort_by(&:id), authors(:david).taggings_2.sort_by(&:id)
417
+ end
418
+
419
+ def test_has_many_through_polymorphic_has_many
420
+ assert_equal taggings(:welcome_general, :thinking_general), authors(:david).taggings.distinct.sort_by(&:id)
421
+ end
422
+
423
+ def test_include_has_many_through_polymorphic_has_many
424
+ author = Author.includes(:taggings).find authors(:david).id
425
+ expected_taggings = taggings(:welcome_general, :thinking_general)
426
+ assert_no_queries do
427
+ assert_equal expected_taggings, author.taggings.uniq.sort_by(&:id)
428
+ end
429
+ end
430
+
431
+ def test_eager_load_has_many_through_has_many
432
+ author = Author.all.merge!(where: ["name = ?", "David"], includes: :comments, order: "comments.id").first
433
+ SpecialComment.new; VerySpecialComment.new
434
+ assert_no_queries do
435
+ assert_equal [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13], author.comments.collect(&:id)
436
+ end
437
+ end
438
+
439
+ def test_eager_load_has_many_through_has_many_with_conditions
440
+ post = Post.all.merge!(includes: :invalid_tags).first
441
+ assert_no_queries do
442
+ post.invalid_tags
443
+ end
444
+ end
445
+
446
+ def test_eager_belongs_to_and_has_one_not_singularized
447
+ assert_nothing_raised do
448
+ Author.all.merge!(includes: :author_address).first
449
+ AuthorAddress.all.merge!(includes: :author).first
450
+ end
451
+ end
452
+
453
+ def test_self_referential_has_many_through
454
+ assert_equal [authors(:mary)], authors(:david).favorite_authors
455
+ assert_equal [], authors(:mary).favorite_authors
456
+ end
457
+
458
+ def test_add_to_self_referential_has_many_through
459
+ new_author = Author.create(name: "Bob")
460
+ authors(:david).author_favorites.create favorite_author: new_author
461
+ assert_equal new_author, authors(:david).reload.favorite_authors.first
462
+ end
463
+
464
+ def test_has_many_through_uses_conditions_specified_on_the_has_many_association
465
+ author = Author.first
466
+ assert_predicate author.comments, :present?
467
+ assert_predicate author.nonexistent_comments, :blank?
468
+ end
469
+
470
+ def test_has_many_through_uses_correct_attributes
471
+ assert_nil posts(:thinking).tags.find_by_name("General").attributes["tag_id"]
472
+ end
473
+
474
+ def test_associating_unsaved_records_with_has_many_through
475
+ saved_post = posts(:thinking)
476
+ new_tag = Tag.new(name: "new")
477
+
478
+ saved_post.tags << new_tag
479
+ assert new_tag.persisted? # consistent with habtm!
480
+ assert_predicate saved_post, :persisted?
481
+ assert_includes saved_post.tags, new_tag
482
+
483
+ assert_predicate new_tag, :persisted?
484
+ assert_includes saved_post.reload.tags.reload, new_tag
485
+
486
+ new_post = Post.new(title: "Association replacement works!", body: "You best believe it.")
487
+ saved_tag = tags(:general)
488
+
489
+ new_post.tags << saved_tag
490
+ assert_not_predicate new_post, :persisted?
491
+ assert_predicate saved_tag, :persisted?
492
+ assert_includes new_post.tags, saved_tag
493
+
494
+ new_post.save!
495
+ assert_predicate new_post, :persisted?
496
+ assert_includes new_post.reload.tags.reload, saved_tag
497
+
498
+ assert_not_predicate posts(:thinking).tags.build, :persisted?
499
+ assert_not_predicate posts(:thinking).tags.new, :persisted?
500
+ end
501
+
502
+ def test_create_associate_when_adding_to_has_many_through
503
+ count = posts(:thinking).tags.count
504
+ push = Tag.create!(name: "pushme")
505
+ post_thinking = posts(:thinking)
506
+ assert_nothing_raised { post_thinking.tags << push }
507
+ assert_nil(wrong = post_thinking.tags.detect { |t| t.class != Tag },
508
+ "Expected a Tag in tags collection, got #{wrong.class}.")
509
+ assert_nil(wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
510
+ "Expected a Tagging in taggings collection, got #{wrong.class}.")
511
+ assert_equal(count + 1, post_thinking.reload.tags.size)
512
+ assert_equal(count + 1, post_thinking.tags.reload.size)
513
+
514
+ assert_kind_of Tag, post_thinking.tags.create!(name: "foo")
515
+ assert_nil(wrong = post_thinking.tags.detect { |t| t.class != Tag },
516
+ "Expected a Tag in tags collection, got #{wrong.class}.")
517
+ assert_nil(wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
518
+ "Expected a Tagging in taggings collection, got #{wrong.class}.")
519
+ assert_equal(count + 2, post_thinking.reload.tags.size)
520
+ assert_equal(count + 2, post_thinking.tags.reload.size)
521
+
522
+ assert_nothing_raised { post_thinking.tags.concat(Tag.create!(name: "abc"), Tag.create!(name: "def")) }
523
+ assert_nil(wrong = post_thinking.tags.detect { |t| t.class != Tag },
524
+ "Expected a Tag in tags collection, got #{wrong.class}.")
525
+ assert_nil(wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
526
+ "Expected a Tagging in taggings collection, got #{wrong.class}.")
527
+ assert_equal(count + 4, post_thinking.reload.tags.size)
528
+ assert_equal(count + 4, post_thinking.tags.reload.size)
529
+
530
+ # Raises if the wrong reflection name is used to set the Edge belongs_to
531
+ assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
532
+ end
533
+
534
+ def test_add_to_join_table_with_no_id
535
+ assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
536
+ end
537
+
538
+ def test_has_many_through_collection_size_doesnt_load_target_if_not_loaded
539
+ author = authors(:david)
540
+ assert_equal 11, author.comments.size
541
+ assert_not_predicate author.comments, :loaded?
542
+ end
543
+
544
+ def test_has_many_through_collection_size_uses_counter_cache_if_it_exists
545
+ c = categories(:general)
546
+ c.categorizations_count = 100
547
+ assert_equal 100, c.categorizations.size
548
+ assert_not_predicate c.categorizations, :loaded?
549
+ end
550
+
551
+ def test_adding_junk_to_has_many_through_should_raise_type_mismatch
552
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { posts(:thinking).tags << "Uhh what now?" }
553
+ end
554
+
555
+ def test_adding_to_has_many_through_should_return_self
556
+ tags = posts(:thinking).tags
557
+ assert_equal tags, posts(:thinking).tags.push(tags(:general))
558
+ end
559
+
560
+ def test_delete_associate_when_deleting_from_has_many_through_with_nonstandard_id
561
+ count = books(:awdr).references.count
562
+ references_before = books(:awdr).references
563
+ book = Book.create!(name: "Getting Real")
564
+ book_awdr = books(:awdr)
565
+ book_awdr.references << book
566
+ assert_equal(count + 1, book_awdr.references.reload.size)
567
+
568
+ assert_nothing_raised { book_awdr.references.delete(book) }
569
+ assert_equal(count, book_awdr.references.size)
570
+ assert_equal(count, book_awdr.references.reload.size)
571
+ assert_equal(references_before.sort, book_awdr.references.sort)
572
+ end
573
+
574
+ def test_delete_associate_when_deleting_from_has_many_through
575
+ count = posts(:thinking).tags.count
576
+ tags_before = posts(:thinking).tags.sort
577
+ tag = Tag.create!(name: "doomed")
578
+ post_thinking = posts(:thinking)
579
+ post_thinking.tags << tag
580
+ assert_equal(count + 1, post_thinking.taggings.reload.size)
581
+ assert_equal(count + 1, post_thinking.reload.tags.reload.size)
582
+ assert_not_equal(tags_before, post_thinking.tags.sort)
583
+
584
+ assert_nothing_raised { post_thinking.tags.delete(tag) }
585
+ assert_equal(count, post_thinking.tags.size)
586
+ assert_equal(count, post_thinking.tags.reload.size)
587
+ assert_equal(count, post_thinking.taggings.reload.size)
588
+ assert_equal(tags_before, post_thinking.tags.sort)
589
+ end
590
+
591
+ def test_delete_associate_when_deleting_from_has_many_through_with_multiple_tags
592
+ count = posts(:thinking).tags.count
593
+ tags_before = posts(:thinking).tags.sort
594
+ doomed = Tag.create!(name: "doomed")
595
+ doomed2 = Tag.create!(name: "doomed2")
596
+ quaked = Tag.create!(name: "quaked")
597
+ post_thinking = posts(:thinking)
598
+ post_thinking.tags << doomed << doomed2
599
+ assert_equal(count + 2, post_thinking.reload.tags.reload.size)
600
+
601
+ assert_nothing_raised { post_thinking.tags.delete(doomed, doomed2, quaked) }
602
+ assert_equal(count, post_thinking.tags.size)
603
+ assert_equal(count, post_thinking.tags.reload.size)
604
+ assert_equal(tags_before, post_thinking.tags.sort)
605
+ end
606
+
607
+ def test_deleting_junk_from_has_many_through_should_raise_type_mismatch
608
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { posts(:thinking).tags.delete(Object.new) }
609
+ end
610
+
611
+ def test_deleting_by_integer_id_from_has_many_through
612
+ post = posts(:thinking)
613
+
614
+ assert_difference "post.tags.count", -1 do
615
+ assert_equal 1, post.tags.delete(1).size
616
+ end
617
+
618
+ assert_equal 0, post.tags.size
619
+ end
620
+
621
+ def test_deleting_by_string_id_from_has_many_through
622
+ post = posts(:thinking)
623
+
624
+ assert_difference "post.tags.count", -1 do
625
+ assert_equal 1, post.tags.delete("1").size
626
+ end
627
+
628
+ assert_equal 0, post.tags.size
629
+ end
630
+
631
+ def test_has_many_through_sum_uses_calculations
632
+ assert_nothing_raised { authors(:david).comments.sum(:post_id) }
633
+ end
634
+
635
+ def test_calculations_on_has_many_through_should_disambiguate_fields
636
+ assert_nothing_raised { authors(:david).categories.maximum(:id) }
637
+ end
638
+
639
+ def test_calculations_on_has_many_through_should_not_disambiguate_fields_unless_necessary
640
+ assert_nothing_raised { authors(:david).categories.maximum("categories.id") }
641
+ end
642
+
643
+ def test_has_many_through_has_many_with_sti
644
+ assert_equal [comments(:does_it_hurt)], authors(:david).special_post_comments
645
+ end
646
+
647
+ def test_distinct_has_many_through_should_retain_order
648
+ comment_ids = authors(:david).comments.map(&:id)
649
+ assert_equal comment_ids.sort, authors(:david).ordered_uniq_comments.map(&:id)
650
+ assert_equal comment_ids.sort.reverse, authors(:david).ordered_uniq_comments_desc.map(&:id)
651
+ end
652
+
653
+ def test_polymorphic_has_many
654
+ expected = taggings(:welcome_general)
655
+ p = Post.all.merge!(includes: :taggings).find(posts(:welcome).id)
656
+ assert_no_queries { assert_includes p.taggings, expected }
657
+ assert_includes posts(:welcome).taggings, taggings(:welcome_general)
658
+ end
659
+
660
+ def test_polymorphic_has_one
661
+ expected = posts(:welcome)
662
+
663
+ tagging = Tagging.all.merge!(includes: :taggable).find(taggings(:welcome_general).id)
664
+ assert_no_queries { assert_equal expected, tagging.taggable }
665
+ end
666
+
667
+ def test_polymorphic_belongs_to
668
+ p = Post.all.merge!(includes: { taggings: :taggable }).find(posts(:welcome).id)
669
+ assert_no_queries { assert_equal posts(:welcome), p.taggings.first.taggable }
670
+ end
671
+
672
+ def test_preload_polymorphic_has_many_through
673
+ posts = Post.all.merge!(order: "posts.id").to_a
674
+ posts_with_tags = Post.all.merge!(includes: :tags, order: "posts.id").to_a
675
+ assert_equal posts.length, posts_with_tags.length
676
+ posts.length.times do |i|
677
+ assert_equal posts[i].tags.length, assert_no_queries { posts_with_tags[i].tags.length }
678
+ end
679
+ end
680
+
681
+ def test_preload_polymorph_many_types
682
+ taggings = Tagging.all.merge!(includes: :taggable, where: ["taggable_type != ?", "FakeModel"]).to_a
683
+ assert_no_queries do
684
+ taggings.first.taggable.id
685
+ taggings[1].taggable.id
686
+ end
687
+
688
+ taggables = taggings.map(&:taggable)
689
+ assert_includes taggables, items(:dvd)
690
+ assert_includes taggables, posts(:welcome)
691
+ end
692
+
693
+ def test_preload_nil_polymorphic_belongs_to
694
+ assert_nothing_raised do
695
+ Tagging.all.merge!(includes: :taggable, where: ["taggable_type IS NULL"]).to_a
696
+ end
697
+ end
698
+
699
+ def test_preload_polymorphic_has_many
700
+ posts = Post.all.merge!(order: "posts.id").to_a
701
+ posts_with_taggings = Post.all.merge!(includes: :taggings, order: "posts.id").to_a
702
+ assert_equal posts.length, posts_with_taggings.length
703
+ posts.length.times do |i|
704
+ assert_equal posts[i].taggings.length, assert_no_queries { posts_with_taggings[i].taggings.length }
705
+ end
706
+ end
707
+
708
+ def test_belongs_to_shared_parent
709
+ comments = Comment.all.merge!(includes: :post, where: "post_id = 1").to_a
710
+ assert_no_queries do
711
+ assert_equal comments.first.post, comments[1].post
712
+ end
713
+ end
714
+
715
+ def test_has_many_through_include_uses_array_include_after_loaded
716
+ david = authors(:david)
717
+ david.categories.load_target
718
+
719
+ category = david.categories.first
720
+
721
+ assert_no_queries do
722
+ assert_predicate david.categories, :loaded?
723
+ assert_includes david.categories, category
724
+ end
725
+ end
726
+
727
+ def test_has_many_through_include_checks_if_record_exists_if_target_not_loaded
728
+ david = authors(:david)
729
+ category = david.categories.first
730
+
731
+ david.reload
732
+ assert_not_predicate david.categories, :loaded?
733
+ assert_queries(1) do
734
+ assert_includes david.categories, category
735
+ end
736
+ assert_not_predicate david.categories, :loaded?
737
+ end
738
+
739
+ def test_has_many_through_include_returns_false_for_non_matching_record_to_verify_scoping
740
+ david = authors(:david)
741
+ category = Category.create!(name: "Not Associated")
742
+
743
+ assert_not_predicate david.categories, :loaded?
744
+ assert_not david.categories.include?(category)
745
+ end
746
+
747
+ def test_has_many_through_goes_through_all_sti_classes
748
+ sub_sti_post = SubStiPost.create!(title: "test", body: "test", author_id: 1)
749
+ new_comment = sub_sti_post.comments.create(body: "test")
750
+
751
+ assert_equal [9, 10, 13, new_comment.id], authors(:david).sti_post_comments.map(&:id).sort
752
+ end
753
+
754
+ def test_has_many_with_pluralize_table_names_false
755
+ aircraft = Aircraft.create!(name: "Airbus 380")
756
+ engine = Engine.create!(car_id: aircraft.id)
757
+ assert_equal aircraft.engines, [engine]
758
+ end
759
+
760
+ def test_proper_error_message_for_eager_load_and_includes_association_errors
761
+ includes_error = assert_raises(ActiveRecord::ConfigurationError) {
762
+ Post.includes(:nonexistent_relation).where(nonexistent_relation: { name: "Rochester" }).find(1)
763
+ }
764
+ assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", includes_error.message)
765
+
766
+ eager_load_error = assert_raises(ActiveRecord::ConfigurationError) {
767
+ Post.eager_load(:nonexistent_relation).where(nonexistent_relation: { name: "Rochester" }).find(1)
768
+ }
769
+ assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", eager_load_error.message)
770
+
771
+ includes_and_eager_load_error = assert_raises(ActiveRecord::ConfigurationError) {
772
+ Post.eager_load(:nonexistent_relation).includes(:nonexistent_relation).where(nonexistent_relation: { name: "Rochester" }).find(1)
773
+ }
774
+ assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", includes_and_eager_load_error.message)
775
+ end
776
+
777
+ private
778
+ # create dynamic Post models to allow different dependency options
779
+ def find_post_with_dependency(post_id, association, association_name, dependency)
780
+ class_name = "PostWith#{association.to_s.classify}#{dependency.to_s.classify}"
781
+ Post.find(post_id).update_columns type: class_name
782
+ klass = Object.const_set(class_name, Class.new(ActiveRecord::Base))
783
+ klass.table_name = "posts"
784
+ klass.public_send(association, association_name, as: :taggable, dependent: dependency)
785
+ klass.find(post_id)
786
+ end
787
+ end