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,1025 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/developer"
5
+ require "models/computer"
6
+ require "models/project"
7
+ require "models/company"
8
+ require "models/course"
9
+ require "models/customer"
10
+ require "models/order"
11
+ require "models/categorization"
12
+ require "models/category"
13
+ require "models/post"
14
+ require "models/author"
15
+ require "models/tag"
16
+ require "models/tagging"
17
+ require "models/parrot"
18
+ require "models/person"
19
+ require "models/pirate"
20
+ require "models/professor"
21
+ require "models/treasure"
22
+ require "models/price_estimate"
23
+ require "models/club"
24
+ require "models/user"
25
+ require "models/member"
26
+ require "models/membership"
27
+ require "models/sponsor"
28
+ require "models/lesson"
29
+ require "models/student"
30
+ require "models/country"
31
+ require "models/treaty"
32
+ require "models/vertex"
33
+ require "models/publisher"
34
+ require "models/publisher/article"
35
+ require "models/publisher/magazine"
36
+ require "active_support/core_ext/string/conversions"
37
+
38
+ class ProjectWithAfterCreateHook < ActiveRecord::Base
39
+ self.table_name = "projects"
40
+ has_and_belongs_to_many :developers,
41
+ class_name: "DeveloperForProjectWithAfterCreateHook",
42
+ join_table: "developers_projects",
43
+ foreign_key: "project_id",
44
+ association_foreign_key: "developer_id"
45
+
46
+ after_create :add_david
47
+
48
+ def add_david
49
+ david = DeveloperForProjectWithAfterCreateHook.find_by_name("David")
50
+ david.projects << self
51
+ end
52
+ end
53
+
54
+ class DeveloperForProjectWithAfterCreateHook < ActiveRecord::Base
55
+ self.table_name = "developers"
56
+ has_and_belongs_to_many :projects,
57
+ class_name: "ProjectWithAfterCreateHook",
58
+ join_table: "developers_projects",
59
+ association_foreign_key: "project_id",
60
+ foreign_key: "developer_id"
61
+ end
62
+
63
+ class ProjectWithSymbolsForKeys < ActiveRecord::Base
64
+ self.table_name = "projects"
65
+ has_and_belongs_to_many :developers,
66
+ class_name: "DeveloperWithSymbolsForKeys",
67
+ join_table: :developers_projects,
68
+ foreign_key: :project_id,
69
+ association_foreign_key: "developer_id"
70
+ end
71
+
72
+ class DeveloperWithSymbolsForKeys < ActiveRecord::Base
73
+ self.table_name = "developers"
74
+ has_and_belongs_to_many :projects,
75
+ class_name: "ProjectWithSymbolsForKeys",
76
+ join_table: :developers_projects,
77
+ association_foreign_key: :project_id,
78
+ foreign_key: "developer_id"
79
+ end
80
+
81
+ class SubDeveloper < Developer
82
+ self.table_name = "developers"
83
+ has_and_belongs_to_many :special_projects,
84
+ join_table: "developers_projects",
85
+ foreign_key: "project_id",
86
+ association_foreign_key: "developer_id"
87
+ end
88
+
89
+ class DeveloperWithSymbolClassName < Developer
90
+ has_and_belongs_to_many :projects, class_name: :ProjectWithSymbolsForKeys
91
+ end
92
+
93
+ class DeveloperWithExtendOption < Developer
94
+ module NamedExtension
95
+ def category
96
+ "sns"
97
+ end
98
+ end
99
+
100
+ has_and_belongs_to_many :projects, extend: NamedExtension
101
+ end
102
+
103
+ class ProjectUnscopingDavidDefaultScope < ActiveRecord::Base
104
+ self.table_name = "projects"
105
+ has_and_belongs_to_many :developers, -> { unscope(where: "name") },
106
+ class_name: "LazyBlockDeveloperCalledDavid",
107
+ join_table: "developers_projects",
108
+ foreign_key: "project_id",
109
+ association_foreign_key: "developer_id"
110
+ end
111
+
112
+ class Kitchen < ActiveRecord::Base
113
+ has_one :sink
114
+ end
115
+
116
+ class Sink < ActiveRecord::Base
117
+ has_and_belongs_to_many :sources, join_table: :edges
118
+ belongs_to :kitchen
119
+ accepts_nested_attributes_for :kitchen
120
+ end
121
+
122
+ class Source < ActiveRecord::Base
123
+ self.table_name = "humans"
124
+ has_and_belongs_to_many :sinks, join_table: :edges
125
+ end
126
+
127
+ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
128
+ fixtures :accounts, :companies, :categories, :posts, :categories_posts, :developers, :projects, :developers_projects,
129
+ :parrots, :pirates, :parrots_pirates, :treasures, :price_estimates, :tags, :taggings, :computers
130
+
131
+ def setup_data_for_habtm_case
132
+ ActiveRecord::Base.connection.execute("delete from countries_treaties")
133
+
134
+ country = Country.new(name: "India")
135
+ country.country_id = "c1"
136
+ country.save!
137
+
138
+ treaty = Treaty.new(name: "peace")
139
+ treaty.treaty_id = "t1"
140
+ country.treaties << treaty
141
+ end
142
+
143
+ def test_marshal_dump
144
+ post = posts :welcome
145
+ preloaded = Post.includes(:categories).find post.id
146
+ assert_equal preloaded, Marshal.load(Marshal.dump(preloaded))
147
+ end
148
+
149
+ def test_should_property_quote_string_primary_keys
150
+ setup_data_for_habtm_case
151
+
152
+ con = ActiveRecord::Base.connection
153
+ sql = "select * from countries_treaties"
154
+ record = con.select_rows(sql).last
155
+ assert_equal "c1", record[0]
156
+ assert_equal "t1", record[1]
157
+ end
158
+
159
+ def test_proper_usage_of_primary_keys_and_join_table
160
+ setup_data_for_habtm_case
161
+
162
+ assert_equal "country_id", Country.primary_key
163
+ assert_equal "treaty_id", Treaty.primary_key
164
+
165
+ country = Country.first
166
+ assert_equal 1, country.treaties.count
167
+ end
168
+
169
+ def test_join_table_composite_primary_key_should_not_warn
170
+ country = Country.new(name: "India")
171
+ country.country_id = "c1"
172
+ country.save!
173
+
174
+ treaty = Treaty.new(name: "peace")
175
+ treaty.treaty_id = "t1"
176
+ warning = capture(:stderr) do
177
+ country.treaties << treaty
178
+ end
179
+ assert_no_match(/WARNING: Active Record does not support composite primary key\./, warning)
180
+ end
181
+
182
+ def test_has_and_belongs_to_many
183
+ david = Developer.find(1)
184
+
185
+ assert_not_empty david.projects
186
+ assert_equal 2, david.projects.size
187
+
188
+ active_record = Project.find(1)
189
+ assert_not_empty active_record.developers
190
+ assert_equal 3, active_record.developers.size
191
+ assert_includes active_record.developers, david
192
+ end
193
+
194
+ def test_adding_single
195
+ jamis = Developer.find(2)
196
+ jamis.projects.reload # causing the collection to load
197
+ action_controller = Project.find(2)
198
+ assert_equal 1, jamis.projects.size
199
+ assert_equal 1, action_controller.developers.size
200
+
201
+ jamis.projects << action_controller
202
+
203
+ assert_equal 2, jamis.projects.size
204
+ assert_equal 2, jamis.projects.reload.size
205
+ assert_equal 2, action_controller.developers.reload.size
206
+ end
207
+
208
+ def test_adding_type_mismatch
209
+ jamis = Developer.find(2)
210
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { jamis.projects << nil }
211
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { jamis.projects << 1 }
212
+ end
213
+
214
+ def test_adding_from_the_project
215
+ jamis = Developer.find(2)
216
+ action_controller = Project.find(2)
217
+ action_controller.developers.reload
218
+ assert_equal 1, jamis.projects.size
219
+ assert_equal 1, action_controller.developers.size
220
+
221
+ action_controller.developers << jamis
222
+
223
+ assert_equal 2, jamis.projects.reload.size
224
+ assert_equal 2, action_controller.developers.size
225
+ assert_equal 2, action_controller.developers.reload.size
226
+ end
227
+
228
+ def test_adding_from_the_project_fixed_timestamp
229
+ jamis = Developer.find(2)
230
+ action_controller = Project.find(2)
231
+ action_controller.developers.reload
232
+ assert_equal 1, jamis.projects.size
233
+ assert_equal 1, action_controller.developers.size
234
+ updated_at = jamis.updated_at
235
+
236
+ action_controller.developers << jamis
237
+
238
+ assert_equal updated_at, jamis.updated_at
239
+ assert_equal 2, jamis.projects.reload.size
240
+ assert_equal 2, action_controller.developers.size
241
+ assert_equal 2, action_controller.developers.reload.size
242
+ end
243
+
244
+ def test_adding_multiple
245
+ aredridel = Developer.new("name" => "Aredridel")
246
+ aredridel.save
247
+ aredridel.projects.reload
248
+ aredridel.projects.push(Project.find(1), Project.find(2))
249
+ assert_equal 2, aredridel.projects.size
250
+ assert_equal 2, aredridel.projects.reload.size
251
+ end
252
+
253
+ def test_adding_a_collection
254
+ aredridel = Developer.new("name" => "Aredridel")
255
+ aredridel.save
256
+ aredridel.projects.reload
257
+ aredridel.projects.concat([Project.find(1), Project.find(2)])
258
+ assert_equal 2, aredridel.projects.size
259
+ assert_equal 2, aredridel.projects.reload.size
260
+ end
261
+
262
+ def test_habtm_adding_before_save
263
+ no_of_devels = Developer.count
264
+ no_of_projects = Project.count
265
+ aredridel = Developer.new("name" => "Aredridel")
266
+ aredridel.projects.concat([Project.find(1), p = Project.new("name" => "Projekt")])
267
+ assert_not_predicate aredridel, :persisted?
268
+ assert_not_predicate p, :persisted?
269
+ assert aredridel.save
270
+ assert_predicate aredridel, :persisted?
271
+ assert_equal no_of_devels + 1, Developer.count
272
+ assert_equal no_of_projects + 1, Project.count
273
+ assert_equal 2, aredridel.projects.size
274
+ assert_equal 2, aredridel.projects.reload.size
275
+ end
276
+
277
+ def test_habtm_saving_multiple_relationships
278
+ new_project = Project.new("name" => "Grimetime")
279
+ amount_of_developers = 4
280
+ developers = (0...amount_of_developers).reverse_each.map { |i| Developer.create(name: "JME #{i}") }
281
+
282
+ new_project.developer_ids = [developers[0].id, developers[1].id]
283
+ new_project.developers_with_callback_ids = [developers[2].id, developers[3].id]
284
+ assert new_project.save
285
+
286
+ new_project.reload
287
+ assert_equal amount_of_developers, new_project.developers.size
288
+ assert_equal developers, new_project.developers
289
+ end
290
+
291
+ def test_habtm_distinct_order_preserved
292
+ assert_equal developers(:poor_jamis, :jamis, :david), projects(:active_record).non_unique_developers
293
+ assert_equal developers(:poor_jamis, :jamis, :david), projects(:active_record).developers
294
+ end
295
+
296
+ def test_habtm_collection_size_from_build
297
+ devel = Developer.create("name" => "Fred Wu")
298
+ devel.projects << Project.create("name" => "Grimetime")
299
+ devel.projects.build
300
+
301
+ assert_equal 2, devel.projects.size
302
+ end
303
+
304
+ def test_habtm_collection_size_from_params
305
+ devel = Developer.new(
306
+ projects_attributes: {
307
+ "0" => {}
308
+ })
309
+
310
+ assert_equal 1, devel.projects.size
311
+ end
312
+
313
+ def test_build
314
+ devel = Developer.find(1)
315
+
316
+ proj = assert_queries(0) { devel.projects.build("name" => "Projekt") }
317
+ assert_not_predicate devel.projects, :loaded?
318
+
319
+ assert_equal devel.projects.last, proj
320
+ assert_predicate devel.projects, :loaded?
321
+
322
+ assert_not_predicate proj, :persisted?
323
+ devel.save
324
+ assert_predicate proj, :persisted?
325
+ assert_equal devel.projects.last, proj
326
+ assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
327
+ end
328
+
329
+ def test_new_aliased_to_build
330
+ devel = Developer.find(1)
331
+
332
+ proj = assert_queries(0) { devel.projects.new("name" => "Projekt") }
333
+ assert_not_predicate devel.projects, :loaded?
334
+
335
+ assert_equal devel.projects.last, proj
336
+ assert_predicate devel.projects, :loaded?
337
+
338
+ assert_not_predicate proj, :persisted?
339
+ devel.save
340
+ assert_predicate proj, :persisted?
341
+ assert_equal devel.projects.last, proj
342
+ assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
343
+ end
344
+
345
+ def test_build_by_new_record
346
+ devel = Developer.new(name: "Marcel", salary: 75000)
347
+ devel.projects.build(name: "Make bed")
348
+ proj2 = devel.projects.build(name: "Lie in it")
349
+ assert_equal devel.projects.last, proj2
350
+ assert_not_predicate proj2, :persisted?
351
+ devel.save
352
+ assert_predicate devel, :persisted?
353
+ assert_predicate proj2, :persisted?
354
+ assert_equal devel.projects.last, proj2
355
+ assert_equal Developer.find_by_name("Marcel").projects.last, proj2 # prove join table is updated
356
+ end
357
+
358
+ def test_create
359
+ devel = Developer.find(1)
360
+ proj = devel.projects.create("name" => "Projekt")
361
+ assert_not_predicate devel.projects, :loaded?
362
+
363
+ assert_equal devel.projects.last, proj
364
+ assert_not_predicate devel.projects, :loaded?
365
+
366
+ assert_predicate proj, :persisted?
367
+ assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
368
+ end
369
+
370
+ def test_creation_respects_hash_condition
371
+ # in Oracle '' is saved as null therefore need to save ' ' in not null column
372
+ post = categories(:general).post_with_conditions.build(body: " ")
373
+
374
+ assert post.save
375
+ assert_equal "Yet Another Testing Title", post.title
376
+
377
+ # in Oracle '' is saved as null therefore need to save ' ' in not null column
378
+ another_post = categories(:general).post_with_conditions.create(body: " ")
379
+
380
+ assert_predicate another_post, :persisted?
381
+ assert_equal "Yet Another Testing Title", another_post.title
382
+ end
383
+
384
+ def test_distinct_after_the_fact
385
+ dev = developers(:jamis)
386
+ dev.projects << projects(:active_record)
387
+ dev.projects << projects(:active_record)
388
+
389
+ assert_equal 3, dev.projects.size
390
+ assert_equal 1, dev.projects.uniq.size
391
+ end
392
+
393
+ def test_distinct_before_the_fact
394
+ projects(:active_record).developers << developers(:jamis)
395
+ projects(:active_record).developers << developers(:david)
396
+ assert_equal 3, projects(:active_record, :reload).developers.size
397
+ end
398
+
399
+ def test_distinct_option_prevents_duplicate_push
400
+ project = projects(:active_record)
401
+ project.developers << developers(:jamis)
402
+ project.developers << developers(:david)
403
+ assert_equal 3, project.developers.size
404
+
405
+ project.developers << developers(:david)
406
+ project.developers << developers(:jamis)
407
+ assert_equal 3, project.developers.size
408
+ end
409
+
410
+ def test_distinct_when_association_already_loaded
411
+ project = projects(:active_record)
412
+ project.developers << [ developers(:jamis), developers(:david), developers(:jamis), developers(:david) ]
413
+ assert_equal 3, Project.includes(:developers).find(project.id).developers.size
414
+ end
415
+
416
+ def test_deleting
417
+ david = Developer.find(1)
418
+ active_record = Project.find(1)
419
+ david.projects.reload
420
+ assert_equal 2, david.projects.size
421
+ assert_equal 3, active_record.developers.size
422
+
423
+ david.projects.delete(active_record)
424
+
425
+ assert_equal 1, david.projects.size
426
+ assert_equal 1, david.projects.reload.size
427
+ assert_equal 2, active_record.developers.reload.size
428
+ end
429
+
430
+ def test_deleting_array
431
+ david = Developer.find(1)
432
+ david.projects.reload
433
+ david.projects.delete(Project.all.to_a)
434
+ assert_equal 0, david.projects.size
435
+ assert_equal 0, david.projects.reload.size
436
+ end
437
+
438
+ def test_deleting_all
439
+ david = Developer.find(1)
440
+ david.projects.reload
441
+ david.projects.clear
442
+ assert_equal 0, david.projects.size
443
+ assert_equal 0, david.projects.reload.size
444
+ end
445
+
446
+ def test_removing_associations_on_destroy
447
+ david = DeveloperWithBeforeDestroyRaise.find(1)
448
+ assert_not_empty david.projects
449
+ david.destroy
450
+ assert_empty david.projects
451
+ assert_empty DeveloperWithBeforeDestroyRaise.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = 1")
452
+ end
453
+
454
+ def test_destroying
455
+ david = Developer.find(1)
456
+ project = Project.find(1)
457
+ david.projects.reload
458
+ assert_equal 2, david.projects.size
459
+ assert_equal 3, project.developers.size
460
+
461
+ assert_no_difference "Project.count" do
462
+ david.projects.destroy(project)
463
+ end
464
+
465
+ join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id} AND project_id = #{project.id}")
466
+ assert_empty join_records
467
+
468
+ assert_equal 1, david.reload.projects.size
469
+ assert_equal 1, david.projects.reload.size
470
+ end
471
+
472
+ def test_destroying_many
473
+ david = Developer.find(1)
474
+ david.projects.reload
475
+ projects = Project.all.to_a
476
+
477
+ assert_no_difference "Project.count" do
478
+ david.projects.destroy(*projects)
479
+ end
480
+
481
+ join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id}")
482
+ assert_empty join_records
483
+
484
+ assert_equal 0, david.reload.projects.size
485
+ assert_equal 0, david.projects.reload.size
486
+ end
487
+
488
+ def test_destroy_all
489
+ david = Developer.find(1)
490
+ david.projects.reload
491
+ assert_not_empty david.projects
492
+
493
+ assert_no_difference "Project.count" do
494
+ david.projects.destroy_all
495
+ end
496
+
497
+ join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id}")
498
+ assert_empty join_records
499
+
500
+ assert_empty david.projects
501
+ assert_empty david.projects.reload
502
+ end
503
+
504
+ def test_destroy_associations_destroys_multiple_associations
505
+ george = parrots(:george)
506
+ assert_not_empty george.pirates
507
+ assert_not_empty george.treasures
508
+
509
+ assert_no_difference "Pirate.count" do
510
+ assert_no_difference "Treasure.count" do
511
+ george.destroy_associations
512
+ end
513
+ end
514
+
515
+ join_records = Parrot.connection.select_all("SELECT * FROM parrots_pirates WHERE parrot_id = #{george.id}")
516
+ assert_empty join_records
517
+ assert_empty george.pirates.reload
518
+
519
+ join_records = Parrot.connection.select_all("SELECT * FROM parrots_treasures WHERE parrot_id = #{george.id}")
520
+ assert_empty join_records
521
+ assert_empty george.treasures.reload
522
+ end
523
+
524
+ def test_associations_with_conditions
525
+ assert_equal 3, projects(:active_record).developers.size
526
+ assert_equal 1, projects(:active_record).developers_named_david.size
527
+ assert_equal 1, projects(:active_record).developers_named_david_with_hash_conditions.size
528
+
529
+ assert_equal developers(:david), projects(:active_record).developers_named_david.find(developers(:david).id)
530
+ assert_equal developers(:david), projects(:active_record).developers_named_david_with_hash_conditions.find(developers(:david).id)
531
+ assert_equal developers(:david), projects(:active_record).salaried_developers.find(developers(:david).id)
532
+
533
+ projects(:active_record).developers_named_david.clear
534
+ assert_equal 2, projects(:active_record, :reload).developers.size
535
+ end
536
+
537
+ def test_find_in_association
538
+ # Using sql
539
+ assert_equal developers(:david), projects(:active_record).developers.find(developers(:david).id), "SQL find"
540
+
541
+ # Using ruby
542
+ active_record = projects(:active_record)
543
+ active_record.developers.reload
544
+ assert_equal developers(:david), active_record.developers.find(developers(:david).id), "Ruby find"
545
+ end
546
+
547
+ def test_include_uses_array_include_after_loaded
548
+ project = projects(:active_record)
549
+ project.developers.load_target
550
+
551
+ developer = project.developers.first
552
+
553
+ assert_queries(0) do
554
+ assert_predicate project.developers, :loaded?
555
+ assert_includes project.developers, developer
556
+ end
557
+ end
558
+
559
+ def test_include_checks_if_record_exists_if_target_not_loaded
560
+ project = projects(:active_record)
561
+ developer = project.developers.first
562
+
563
+ project.reload
564
+ assert_not_predicate project.developers, :loaded?
565
+ assert_queries(1) do
566
+ assert_includes project.developers, developer
567
+ end
568
+ assert_not_predicate project.developers, :loaded?
569
+ end
570
+
571
+ def test_include_returns_false_for_non_matching_record_to_verify_scoping
572
+ project = projects(:active_record)
573
+ developer = Developer.create name: "Bryan", salary: 50_000
574
+
575
+ assert_not_predicate project.developers, :loaded?
576
+ assert_not project.developers.include?(developer)
577
+ end
578
+
579
+ def test_find_with_merged_options
580
+ assert_equal 1, projects(:active_record).limited_developers.size
581
+ assert_equal 1, projects(:active_record).limited_developers.to_a.size
582
+ assert_equal 3, projects(:active_record).limited_developers.limit(nil).to_a.size
583
+ end
584
+
585
+ def test_dynamic_find_should_respect_association_order
586
+ # Developers are ordered 'name DESC, id DESC'
587
+ high_id_jamis = projects(:active_record).developers.create(name: "Jamis")
588
+
589
+ assert_equal high_id_jamis, projects(:active_record).developers.merge(where: "name = 'Jamis'").first
590
+ assert_equal high_id_jamis, projects(:active_record).developers.find_by_name("Jamis")
591
+ end
592
+
593
+ def test_find_should_append_to_association_order
594
+ ordered_developers = projects(:active_record).developers.order("projects.id")
595
+ assert_equal ["developers.name desc, developers.id desc", "projects.id"], ordered_developers.order_values
596
+ end
597
+
598
+ def test_dynamic_find_all_should_respect_readonly_access
599
+ projects(:active_record).readonly_developers.each { |d| assert_raise(ActiveRecord::ReadOnlyRecord) { d.save! } if d.valid? }
600
+ projects(:active_record).readonly_developers.each(&:readonly?)
601
+ end
602
+
603
+ def test_new_with_values_in_collection
604
+ jamis = DeveloperForProjectWithAfterCreateHook.find_by_name("Jamis")
605
+ david = DeveloperForProjectWithAfterCreateHook.find_by_name("David")
606
+ project = ProjectWithAfterCreateHook.new(name: "Cooking with Bertie")
607
+ project.developers << jamis
608
+ project.save!
609
+ project.reload
610
+
611
+ assert_includes project.developers, jamis
612
+ assert_includes project.developers, david
613
+ end
614
+
615
+ def test_find_in_association_with_options
616
+ developers = projects(:active_record).developers.to_a
617
+ assert_equal 3, developers.size
618
+
619
+ assert_equal developers(:poor_jamis), projects(:active_record).developers.where("salary < 10000").first
620
+ end
621
+
622
+ def test_association_with_extend_option
623
+ eponine = DeveloperWithExtendOption.create(name: "Eponine")
624
+ assert_equal "sns", eponine.projects.category
625
+ end
626
+
627
+ def test_replace_with_less
628
+ david = developers(:david)
629
+ david.projects = [projects(:action_controller)]
630
+ assert david.save
631
+ assert_equal 1, david.projects.length
632
+ end
633
+
634
+ def test_replace_with_new
635
+ david = developers(:david)
636
+ david.projects = [projects(:action_controller), Project.new("name" => "ActionWebSearch")]
637
+ david.save
638
+ assert_equal 2, david.projects.length
639
+ assert_not_includes david.projects, projects(:active_record)
640
+ end
641
+
642
+ def test_replace_on_new_object
643
+ new_developer = Developer.new("name" => "Matz")
644
+ new_developer.projects = [projects(:action_controller), Project.new("name" => "ActionWebSearch")]
645
+ new_developer.save
646
+ assert_equal 2, new_developer.projects.length
647
+ end
648
+
649
+ def test_consider_type
650
+ developer = Developer.first
651
+ special_project = SpecialProject.create("name" => "Special Project")
652
+
653
+ other_project = developer.projects.first
654
+ developer.special_projects << special_project
655
+ developer.reload
656
+
657
+ assert_includes developer.projects, special_project
658
+ assert_includes developer.special_projects, special_project
659
+ assert_not_includes developer.special_projects, other_project
660
+ end
661
+
662
+ def test_symbol_join_table
663
+ developer = Developer.first
664
+ sp = developer.sym_special_projects.create("name" => "omg")
665
+ developer.reload
666
+ assert_includes developer.sym_special_projects, sp
667
+ end
668
+
669
+ def test_update_columns_after_push_without_duplicate_join_table_rows
670
+ developer = Developer.new("name" => "Kano")
671
+ project = SpecialProject.create("name" => "Special Project")
672
+ assert developer.save
673
+ developer.projects << project
674
+ developer.update_columns("name" => "Bruza")
675
+ assert_equal 1, Developer.connection.select_value(<<-end_sql).to_i
676
+ SELECT count(*) FROM developers_projects
677
+ WHERE project_id = #{project.id}
678
+ AND developer_id = #{developer.id}
679
+ end_sql
680
+ end
681
+
682
+ def test_updating_attributes_on_non_rich_associations
683
+ welcome = categories(:technology).posts.first
684
+ welcome.title = "Something else"
685
+ assert welcome.save!
686
+ end
687
+
688
+ def test_habtm_respects_select
689
+ categories(:technology).select_testing_posts.reload.each do |o|
690
+ assert_respond_to o, :correctness_marker
691
+ end
692
+ assert_respond_to categories(:technology).select_testing_posts.first, :correctness_marker
693
+ end
694
+
695
+ def test_habtm_selects_all_columns_by_default
696
+ assert_equal Project.column_names.sort, developers(:david).projects.first.attributes.keys.sort
697
+ end
698
+
699
+ def test_habtm_respects_select_query_method
700
+ assert_equal ["id"], developers(:david).projects.select(:id).first.attributes.keys
701
+ end
702
+
703
+ def test_join_middle_table_alias
704
+ assert_equal(
705
+ 2,
706
+ Project.includes(:developers_projects).where.not("developers_projects.joined_on": nil).to_a.size
707
+ )
708
+ end
709
+
710
+ def test_join_table_alias
711
+ assert_equal(
712
+ 3,
713
+ Developer.includes(projects: :developers).where.not("developers_projects_projects_join.joined_on": nil).to_a.size
714
+ )
715
+ end
716
+
717
+ def test_join_with_group
718
+ group = Developer.columns.inject([]) do |g, c|
719
+ g << "developers.#{c.name}"
720
+ g << "developers_projects_2.#{c.name}"
721
+ end
722
+ Project.columns.each { |c| group << "projects.#{c.name}" }
723
+
724
+ assert_equal(
725
+ 3,
726
+ Developer.includes(projects: :developers).where.not("developers_projects_projects_join.joined_on": nil).group(group.join(",")).to_a.size
727
+ )
728
+ end
729
+
730
+ def test_find_grouped
731
+ all_posts_from_category1 = Post.all.merge!(where: "category_id = 1", joins: :categories).to_a
732
+ grouped_posts_of_category1 = Post.all.merge!(where: "category_id = 1", group: "author_id", select: "count(posts.id) as posts_count", joins: :categories).to_a
733
+ assert_equal 5, all_posts_from_category1.size
734
+ assert_equal 2, grouped_posts_of_category1.size
735
+ end
736
+
737
+ def test_find_scoped_grouped
738
+ assert_equal 5, categories(:general).posts_grouped_by_title.to_a.size
739
+ assert_equal 1, categories(:technology).posts_grouped_by_title.to_a.size
740
+ end
741
+
742
+ def test_find_scoped_grouped_having
743
+ assert_equal 2, projects(:active_record).well_paid_salary_groups.to_a.size
744
+ assert projects(:active_record).well_paid_salary_groups.all? { |g| g.salary > 10000 }
745
+ end
746
+
747
+ def test_get_ids
748
+ assert_equal projects(:active_record, :action_controller).map(&:id).sort, developers(:david).project_ids.sort
749
+ assert_equal [projects(:active_record).id], developers(:jamis).project_ids
750
+ end
751
+
752
+ def test_get_ids_for_loaded_associations
753
+ developer = developers(:david)
754
+ developer.projects.reload
755
+ assert_queries(0) do
756
+ developer.project_ids
757
+ developer.project_ids
758
+ end
759
+ end
760
+
761
+ def test_get_ids_for_unloaded_associations_does_not_load_them
762
+ developer = developers(:david)
763
+ assert_not_predicate developer.projects, :loaded?
764
+ assert_equal projects(:active_record, :action_controller).map(&:id).sort, developer.project_ids.sort
765
+ assert_not_predicate developer.projects, :loaded?
766
+ end
767
+
768
+ def test_assign_ids
769
+ developer = Developer.new("name" => "Joe")
770
+ developer.project_ids = projects(:active_record, :action_controller).map(&:id)
771
+ developer.save
772
+ developer.reload
773
+ assert_equal 2, developer.projects.length
774
+ assert_equal [projects(:active_record), projects(:action_controller)].map(&:id).sort, developer.project_ids.sort
775
+ end
776
+
777
+ def test_assign_ids_ignoring_blanks
778
+ developer = Developer.new("name" => "Joe")
779
+ developer.project_ids = [projects(:active_record).id, nil, projects(:action_controller).id, ""]
780
+ developer.save
781
+ developer.reload
782
+ assert_equal 2, developer.projects.length
783
+ assert_equal [projects(:active_record), projects(:action_controller)].map(&:id).sort, developer.project_ids.sort
784
+ end
785
+
786
+ def test_singular_ids_are_reloaded_after_collection_concat
787
+ student = Student.create(name: "Alberto Almagro")
788
+ student.lesson_ids
789
+
790
+ lesson = Lesson.create(name: "DSI")
791
+ student.lessons << lesson
792
+
793
+ assert_includes student.lesson_ids, lesson.id
794
+ end
795
+
796
+ def test_scoped_find_on_through_association_doesnt_return_read_only_records
797
+ tag = Post.find(1).tags.find_by_name("General")
798
+
799
+ assert_nothing_raised do
800
+ tag.save!
801
+ end
802
+ end
803
+
804
+ def test_has_many_through_polymorphic_has_manys_works
805
+ assert_equal ["$10.00", "$20.00"].to_set, pirates(:redbeard).treasure_estimates.map(&:price).to_set
806
+ end
807
+
808
+ def test_symbols_as_keys
809
+ developer = DeveloperWithSymbolsForKeys.new(name: "David")
810
+ project = ProjectWithSymbolsForKeys.new(name: "Rails Testing")
811
+ project.developers << developer
812
+ project.save!
813
+
814
+ assert_equal 1, project.developers.size
815
+ assert_equal 1, developer.projects.size
816
+ assert_equal developer, project.developers.first
817
+ assert_equal project, developer.projects.first
818
+ end
819
+
820
+ def test_dynamic_find_should_respect_association_include
821
+ # SQL error in sort clause if :include is not included
822
+ # due to Unknown column 'authors.id'
823
+ assert Category.find(1).posts_with_authors_sorted_by_author_id.find_by_title("Welcome to the weblog")
824
+ end
825
+
826
+ def test_count
827
+ david = Developer.find(1)
828
+ assert_equal 2, david.projects.count
829
+ end
830
+
831
+ def test_association_proxy_transaction_method_starts_transaction_in_association_class
832
+ assert_called(Post, :transaction) do
833
+ Category.first.posts.transaction do
834
+ # nothing
835
+ end
836
+ end
837
+ end
838
+
839
+ def test_caching_of_columns
840
+ david = Developer.find(1)
841
+ # clear cache possibly created by other tests
842
+ david.projects.reset_column_information
843
+
844
+ assert_queries(:any) { david.projects.columns }
845
+ assert_no_queries { david.projects.columns }
846
+
847
+ ## and again to verify that reset_column_information clears the cache correctly
848
+ david.projects.reset_column_information
849
+
850
+ assert_queries(:any) { david.projects.columns }
851
+ assert_no_queries { david.projects.columns }
852
+ end
853
+
854
+ def test_attributes_are_being_set_when_initialized_from_habtm_association_with_where_clause
855
+ new_developer = projects(:action_controller).developers.where(name: "Marcelo").build
856
+ assert_equal new_developer.name, "Marcelo"
857
+ end
858
+
859
+ def test_attributes_are_being_set_when_initialized_from_habtm_association_with_multiple_where_clauses
860
+ new_developer = projects(:action_controller).developers.where(name: "Marcelo").where(salary: 90_000).build
861
+ assert_equal new_developer.name, "Marcelo"
862
+ assert_equal new_developer.salary, 90_000
863
+ end
864
+
865
+ def test_include_method_in_has_and_belongs_to_many_association_should_return_true_for_instance_added_with_build
866
+ project = Project.new
867
+ developer = project.developers.build
868
+ assert_includes project.developers, developer
869
+ end
870
+
871
+ def test_destruction_does_not_error_without_primary_key
872
+ redbeard = pirates(:redbeard)
873
+ george = parrots(:george)
874
+ redbeard.parrots << george
875
+ assert_equal 2, george.pirates.count
876
+ Pirate.includes(:parrots).where(parrot: redbeard.parrot).find(redbeard.id).destroy
877
+ assert_equal 1, george.pirates.count
878
+ assert_equal [], Pirate.where(id: redbeard.id)
879
+ end
880
+
881
+ def test_has_and_belongs_to_many_associations_on_new_records_use_null_relations
882
+ projects = Developer.new.projects
883
+ assert_queries(0) do
884
+ assert_equal [], projects
885
+ assert_equal [], projects.where(title: "omg")
886
+ assert_equal [], projects.pluck(:title)
887
+ assert_equal 0, projects.count
888
+ end
889
+ end
890
+
891
+ def test_association_with_validate_false_does_not_run_associated_validation_callbacks_on_create
892
+ rich_person = RichPerson.new
893
+
894
+ treasure = Treasure.new
895
+ treasure.rich_people << rich_person
896
+ treasure.valid?
897
+
898
+ assert_equal 1, treasure.rich_people.size
899
+ assert_nil rich_person.first_name, "should not run associated person validation on create when validate: false"
900
+ end
901
+
902
+ def test_association_with_validate_false_does_not_run_associated_validation_callbacks_on_update
903
+ rich_person = RichPerson.create!
904
+ person_first_name = rich_person.first_name
905
+ assert_not_nil person_first_name
906
+
907
+ treasure = Treasure.new
908
+ treasure.rich_people << rich_person
909
+ treasure.valid?
910
+
911
+ assert_equal 1, treasure.rich_people.size
912
+ assert_equal person_first_name, rich_person.first_name, "should not run associated person validation on update when validate: false"
913
+ end
914
+
915
+ def test_custom_join_table
916
+ assert_equal "edges", Vertex.reflect_on_association(:sources).join_table
917
+ end
918
+
919
+ def test_has_and_belongs_to_many_in_a_namespaced_model_pointing_to_a_namespaced_model
920
+ magazine = Publisher::Magazine.create
921
+ article = Publisher::Article.create
922
+ magazine.articles << article
923
+ magazine.save
924
+
925
+ assert_includes magazine.articles, article
926
+ end
927
+
928
+ def test_has_and_belongs_to_many_in_a_namespaced_model_pointing_to_a_non_namespaced_model
929
+ article = Publisher::Article.create
930
+ tag = Tag.create
931
+ article.tags << tag
932
+ article.save
933
+
934
+ assert_includes article.tags, tag
935
+ end
936
+
937
+ def test_redefine_habtm
938
+ child = SubDeveloper.new("name" => "Aredridel")
939
+ child.special_projects << SpecialProject.new("name" => "Special Project")
940
+ assert child.save, "child object should be saved"
941
+ end
942
+
943
+ def test_habtm_with_reflection_using_class_name_and_fixtures
944
+ assert_not_nil Developer._reflections["shared_computers"]
945
+ # Checking the fixture for named association is important here, because it's the only way
946
+ # we've been able to reproduce this bug
947
+ assert_not_nil File.read(File.expand_path("../../fixtures/developers.yml", __dir__)).index("shared_computers")
948
+ assert_equal developers(:david).shared_computers.first, computers(:laptop)
949
+ end
950
+
951
+ def test_with_symbol_class_name
952
+ assert_nothing_raised do
953
+ developer = DeveloperWithSymbolClassName.new
954
+ developer.projects
955
+ end
956
+ end
957
+
958
+ def test_alternate_database
959
+ professor = Professor.create(name: "Plum")
960
+ course = Course.create(name: "Forensics")
961
+ assert_equal 0, professor.courses.count
962
+ assert_nothing_raised do
963
+ professor.courses << course
964
+ end
965
+ assert_equal 1, professor.courses.count
966
+ end
967
+
968
+ def test_habtm_scope_can_unscope
969
+ project = ProjectUnscopingDavidDefaultScope.new
970
+ project.save!
971
+
972
+ developer = LazyBlockDeveloperCalledDavid.new(name: "Not David")
973
+ developer.save!
974
+ project.developers << developer
975
+
976
+ projects = ProjectUnscopingDavidDefaultScope.includes(:developers).where(id: project.id)
977
+ assert_equal 1, projects.first.developers.size
978
+ end
979
+
980
+ def test_preloaded_associations_size
981
+ assert_equal Project.first.salaried_developers.size,
982
+ Project.preload(:salaried_developers).first.salaried_developers.size
983
+
984
+ assert_equal Project.includes(:salaried_developers).references(:salaried_developers).first.salaried_developers.size,
985
+ Project.preload(:salaried_developers).first.salaried_developers.size
986
+
987
+ # Nested HATBM
988
+ first_project = Developer.first.projects.first
989
+ preloaded_first_project =
990
+ Developer.preload(projects: :salaried_developers).
991
+ first.
992
+ projects.
993
+ detect { |p| p.id == first_project.id }
994
+
995
+ assert preloaded_first_project.salaried_developers.loaded?, true
996
+ assert_equal first_project.salaried_developers.size, preloaded_first_project.salaried_developers.size
997
+ end
998
+
999
+ def test_has_and_belongs_to_many_is_useable_with_belongs_to_required_by_default
1000
+ assert_difference "Project.first.developers_required_by_default.size", 1 do
1001
+ Project.first.developers_required_by_default.create!(name: "Sean", salary: 50000)
1002
+ end
1003
+ end
1004
+
1005
+ def test_association_name_is_the_same_as_join_table_name
1006
+ user = User.create!
1007
+ assert_nothing_raised { user.jobs_pool.clear }
1008
+ end
1009
+
1010
+ def test_has_and_belongs_to_many_while_partial_writes_false
1011
+ original_partial_writes = ActiveRecord::Base.partial_writes
1012
+ ActiveRecord::Base.partial_writes = false
1013
+ developer = Developer.new(name: "Mehmet Emin İNAÇ")
1014
+ developer.projects << Project.new(name: "Bounty")
1015
+
1016
+ assert developer.save
1017
+ ensure
1018
+ ActiveRecord::Base.partial_writes = original_partial_writes
1019
+ end
1020
+
1021
+ def test_has_and_belongs_to_many_with_belongs_to
1022
+ sink = Sink.create! kitchen: Kitchen.new, sources: [Source.new]
1023
+ assert_equal 1, sink.sources.count
1024
+ end
1025
+ end