ibm_db 5.6.1 → 5.7.0

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 (592) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +13 -9
  3. data/ext/extconf.rb +176 -110
  4. data/ext/ibm_db.c +60 -0
  5. data/ext/ibm_db.o +0 -0
  6. data/ext/ibm_db.so +0 -0
  7. data/ext/mkmf.log +6 -6
  8. data/ext/ruby_ibm_db_cli.c +14 -10
  9. data/ext/ruby_ibm_db_cli.h +4 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/IBM_DB.rb +2 -2
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
  13. data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
  14. data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
  15. data/test/activejob/destroy_association_async_job_test.rb +62 -0
  16. data/test/activejob/destroy_association_async_test.rb +147 -11
  17. data/test/activejob/job_runtime_test.rb +41 -0
  18. data/test/activejob/unloadable_base_job.rb +3 -0
  19. data/test/cases/active_record_schema_test.rb +196 -0
  20. data/test/cases/active_record_test.rb +21 -0
  21. data/test/cases/adapter_prevent_writes_test.rb +26 -202
  22. data/test/cases/adapter_test.rb +592 -82
  23. data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
  24. data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
  25. data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
  26. data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
  27. data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
  28. data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
  29. data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
  30. data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
  31. data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
  32. data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
  33. data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
  34. data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
  35. data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
  36. data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
  38. data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
  39. data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
  40. data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
  41. data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
  42. data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
  43. data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
  44. data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
  45. data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
  46. data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
  47. data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
  48. data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
  49. data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
  51. data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
  52. data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
  53. data/test/cases/adapters/postgresql/array_test.rb +6 -6
  54. data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
  55. data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
  56. data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
  57. data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
  58. data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
  59. data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
  60. data/test/cases/adapters/postgresql/citext_test.rb +7 -1
  61. data/test/cases/adapters/postgresql/collation_test.rb +1 -1
  62. data/test/cases/adapters/postgresql/composite_test.rb +1 -1
  63. data/test/cases/adapters/postgresql/connection_test.rb +43 -36
  64. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
  65. data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
  66. data/test/cases/adapters/postgresql/date_test.rb +2 -2
  67. data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
  69. data/test/cases/adapters/postgresql/domain_test.rb +1 -1
  70. data/test/cases/adapters/postgresql/enum_test.rb +208 -8
  71. data/test/cases/adapters/postgresql/explain_test.rb +25 -6
  72. data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
  73. data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
  74. data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
  75. data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
  76. data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
  77. data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
  78. data/test/cases/adapters/postgresql/integer_test.rb +1 -1
  79. data/test/cases/adapters/postgresql/interval_test.rb +9 -17
  80. data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
  81. data/test/cases/adapters/postgresql/json_test.rb +5 -0
  82. data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
  83. data/test/cases/adapters/postgresql/money_test.rb +17 -9
  84. data/test/cases/adapters/postgresql/network_test.rb +13 -1
  85. data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
  86. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
  87. data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
  88. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
  89. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
  90. data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
  91. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
  92. data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
  93. data/test/cases/adapters/postgresql/range_test.rb +185 -21
  94. data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
  95. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
  96. data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
  97. data/test/cases/adapters/postgresql/schema_test.rb +270 -20
  98. data/test/cases/adapters/postgresql/serial_test.rb +5 -5
  99. data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
  100. data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
  101. data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
  102. data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
  103. data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
  104. data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
  105. data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
  106. data/test/cases/adapters/postgresql/xml_test.rb +1 -1
  107. data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
  108. data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
  109. data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
  110. data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
  111. data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
  112. data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
  113. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
  114. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
  115. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
  116. data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
  117. data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
  118. data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
  119. data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
  120. data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
  121. data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
  122. data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
  123. data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
  124. data/test/cases/aggregations_test.rb +16 -0
  125. data/test/cases/annotate_test.rb +14 -12
  126. data/test/cases/arel/attributes/attribute_test.rb +86 -47
  127. data/test/cases/arel/collectors/bind_test.rb +1 -1
  128. data/test/cases/arel/collectors/composite_test.rb +11 -1
  129. data/test/cases/arel/collectors/sql_string_test.rb +1 -1
  130. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
  131. data/test/cases/arel/delete_manager_test.rb +0 -6
  132. data/test/cases/arel/factory_methods_test.rb +45 -0
  133. data/test/cases/arel/insert_manager_test.rb +1 -7
  134. data/test/cases/arel/nodes/as_test.rb +12 -0
  135. data/test/cases/arel/nodes/ascending_test.rb +1 -1
  136. data/test/cases/arel/nodes/bin_test.rb +1 -1
  137. data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
  138. data/test/cases/arel/nodes/cte_test.rb +46 -0
  139. data/test/cases/arel/nodes/descending_test.rb +1 -1
  140. data/test/cases/arel/nodes/equality_test.rb +3 -3
  141. data/test/cases/arel/nodes/filter_test.rb +37 -0
  142. data/test/cases/arel/nodes/fragments_test.rb +38 -0
  143. data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
  144. data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
  145. data/test/cases/arel/nodes/node_test.rb +1 -1
  146. data/test/cases/arel/nodes/or_test.rb +2 -2
  147. data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
  148. data/test/cases/arel/nodes/table_alias_test.rb +12 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
  150. data/test/cases/arel/nodes/update_statement_test.rb +4 -0
  151. data/test/cases/arel/nodes_test.rb +3 -2
  152. data/test/cases/arel/select_manager_test.rb +12 -12
  153. data/test/cases/arel/support/fake_record.rb +22 -17
  154. data/test/cases/arel/table_test.rb +15 -25
  155. data/test/cases/arel/update_manager_test.rb +51 -6
  156. data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
  157. data/test/cases/arel/visitors/dot_test.rb +177 -2
  158. data/test/cases/arel/visitors/mysql_test.rb +49 -1
  159. data/test/cases/arel/visitors/postgres_test.rb +1 -31
  160. data/test/cases/arel/visitors/sqlite_test.rb +1 -1
  161. data/test/cases/arel/visitors/to_sql_test.rb +330 -20
  162. data/test/cases/assertions/query_assertions_test.rb +136 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +502 -41
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
  165. data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
  166. data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
  167. data/test/cases/associations/eager_singularization_test.rb +1 -1
  168. data/test/cases/associations/eager_test.rb +255 -93
  169. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
  170. data/test/cases/associations/has_many_associations_test.rb +282 -72
  171. data/test/cases/associations/has_many_through_associations_test.rb +172 -45
  172. data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
  173. data/test/cases/associations/has_one_associations_test.rb +160 -29
  174. data/test/cases/associations/has_one_through_associations_test.rb +64 -15
  175. data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
  176. data/test/cases/associations/inner_join_association_test.rb +36 -6
  177. data/test/cases/associations/inverse_associations_test.rb +177 -40
  178. data/test/cases/associations/join_model_test.rb +17 -12
  179. data/test/cases/associations/left_outer_join_association_test.rb +14 -3
  180. data/test/cases/associations/nested_error_test.rb +116 -0
  181. data/test/cases/associations/nested_through_associations_test.rb +54 -19
  182. data/test/cases/associations/required_test.rb +1 -1
  183. data/test/cases/associations_test.rb +1278 -21
  184. data/test/cases/asynchronous_queries_test.rb +310 -0
  185. data/test/cases/attribute_methods/read_test.rb +6 -0
  186. data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
  187. data/test/cases/attribute_methods_test.rb +565 -46
  188. data/test/cases/attributes_test.rb +42 -1
  189. data/test/cases/autosave_association_test.rb +645 -92
  190. data/test/cases/base_prevent_writes_test.rb +28 -159
  191. data/test/cases/base_test.rb +434 -209
  192. data/test/cases/batches_test.rb +441 -57
  193. data/test/cases/binary_test.rb +31 -0
  194. data/test/cases/bind_parameter_test.rb +107 -16
  195. data/test/cases/cache_key_test.rb +7 -7
  196. data/test/cases/calculations_test.rb +541 -110
  197. data/test/cases/callbacks_test.rb +0 -1
  198. data/test/cases/clone_test.rb +5 -4
  199. data/test/cases/coders/yaml_column_test.rb +97 -2
  200. data/test/cases/collection_cache_key_test.rb +24 -16
  201. data/test/cases/column_alias_test.rb +2 -8
  202. data/test/cases/column_definition_test.rb +12 -3
  203. data/test/cases/comment_test.rb +23 -26
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
  205. data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
  210. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
  211. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
  212. data/test/cases/connection_adapters/registration_test.rb +98 -0
  213. data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
  214. data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
  215. data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
  216. data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
  217. data/test/cases/connection_handling_test.rb +210 -0
  218. data/test/cases/connection_management_test.rb +44 -7
  219. data/test/cases/connection_pool_test.rb +466 -99
  220. data/test/cases/core_test.rb +167 -9
  221. data/test/cases/counter_cache_test.rb +129 -2
  222. data/test/cases/custom_locking_test.rb +3 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +149 -13
  224. data/test/cases/database_configurations/resolver_test.rb +14 -10
  225. data/test/cases/database_configurations/url_config_test.rb +53 -0
  226. data/test/cases/database_configurations_test.rb +86 -43
  227. data/test/cases/database_selector_test.rb +30 -8
  228. data/test/cases/database_statements_test.rb +10 -14
  229. data/test/cases/date_time_precision_test.rb +141 -11
  230. data/test/cases/date_time_test.rb +19 -1
  231. data/test/cases/defaults_test.rb +107 -41
  232. data/test/cases/delegated_type_test.rb +69 -9
  233. data/test/cases/dirty_test.rb +82 -25
  234. data/test/cases/disconnected_test.rb +10 -9
  235. data/test/cases/dup_test.rb +26 -6
  236. data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
  237. data/test/cases/encryption/cipher_test.rb +65 -0
  238. data/test/cases/encryption/concurrency_test.rb +27 -0
  239. data/test/cases/encryption/config_test.rb +21 -0
  240. data/test/cases/encryption/configurable_test.rb +93 -0
  241. data/test/cases/encryption/contexts_test.rb +105 -0
  242. data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
  243. data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
  244. data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
  245. data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
  246. data/test/cases/encryption/encryptable_record_test.rb +470 -0
  247. data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
  248. data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
  249. data/test/cases/encryption/encryption_schemes_test.rb +240 -0
  250. data/test/cases/encryption/encryptor_test.rb +113 -0
  251. data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
  252. data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
  253. data/test/cases/encryption/helper.rb +152 -0
  254. data/test/cases/encryption/key_generator_test.rb +55 -0
  255. data/test/cases/encryption/key_provider_test.rb +57 -0
  256. data/test/cases/encryption/key_test.rb +17 -0
  257. data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
  258. data/test/cases/encryption/message_serializer_test.rb +82 -0
  259. data/test/cases/encryption/message_test.rb +43 -0
  260. data/test/cases/encryption/null_encryptor_test.rb +21 -0
  261. data/test/cases/encryption/properties_test.rb +69 -0
  262. data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
  263. data/test/cases/encryption/scheme_test.rb +58 -0
  264. data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
  265. data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
  266. data/test/cases/enum_test.rb +374 -72
  267. data/test/cases/errors_test.rb +7 -4
  268. data/test/cases/excluding_test.rb +116 -0
  269. data/test/cases/explain_subscriber_test.rb +6 -1
  270. data/test/cases/explain_test.rb +119 -10
  271. data/test/cases/filter_attributes_test.rb +7 -14
  272. data/test/cases/finder_respond_to_test.rb +3 -3
  273. data/test/cases/finder_test.rb +357 -72
  274. data/test/cases/fixture_set/file_test.rb +9 -0
  275. data/test/cases/fixtures_test.rb +426 -190
  276. data/test/cases/helper.rb +66 -192
  277. data/test/cases/hot_compatibility_test.rb +10 -10
  278. data/test/cases/inheritance_test.rb +51 -61
  279. data/test/cases/inherited_test.rb +40 -0
  280. data/test/cases/insert_all_test.rb +419 -9
  281. data/test/cases/instrumentation_test.rb +202 -30
  282. data/test/cases/integration_test.rb +25 -7
  283. data/test/cases/invalid_connection_test.rb +5 -5
  284. data/test/cases/invertible_migration_test.rb +108 -24
  285. data/test/cases/json_attribute_test.rb +1 -0
  286. data/test/cases/json_serialization_test.rb +5 -5
  287. data/test/cases/json_shared_test_cases.rb +5 -9
  288. data/test/cases/locking_test.rb +67 -31
  289. data/test/cases/log_subscriber_test.rb +17 -15
  290. data/test/cases/marshal_serialization_test.rb +78 -5
  291. data/test/cases/message_pack_test.rb +91 -0
  292. data/test/cases/migration/change_schema_test.rb +77 -46
  293. data/test/cases/migration/change_table_test.rb +129 -114
  294. data/test/cases/migration/check_constraint_test.rb +192 -10
  295. data/test/cases/migration/column_attributes_test.rb +4 -9
  296. data/test/cases/migration/column_positioning_test.rb +2 -2
  297. data/test/cases/migration/columns_test.rb +118 -4
  298. data/test/cases/migration/command_recorder_test.rb +181 -14
  299. data/test/cases/migration/compatibility_test.rb +883 -196
  300. data/test/cases/migration/create_join_table_test.rb +8 -1
  301. data/test/cases/migration/exclusion_constraint_test.rb +192 -0
  302. data/test/cases/migration/foreign_key_test.rb +356 -14
  303. data/test/cases/migration/helper.rb +4 -1
  304. data/test/cases/migration/index_test.rb +67 -2
  305. data/test/cases/migration/invalid_options_test.rb +129 -0
  306. data/test/cases/migration/logger_test.rb +7 -4
  307. data/test/cases/migration/pending_migrations_test.rb +103 -60
  308. data/test/cases/migration/references_foreign_key_test.rb +73 -4
  309. data/test/cases/migration/references_index_test.rb +25 -27
  310. data/test/cases/migration/references_statements_test.rb +27 -3
  311. data/test/cases/migration/rename_table_test.rb +39 -54
  312. data/test/cases/migration/schema_definitions_test.rb +109 -0
  313. data/test/cases/migration/unique_constraint_test.rb +248 -0
  314. data/test/cases/migration_test.rb +677 -220
  315. data/test/cases/migrator_test.rb +102 -75
  316. data/test/cases/multi_db_migrator_test.rb +55 -34
  317. data/test/cases/multiparameter_attributes_test.rb +26 -29
  318. data/test/cases/multiple_db_test.rb +42 -19
  319. data/test/cases/nested_attributes_test.rb +124 -6
  320. data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
  321. data/test/cases/normalized_attribute_test.rb +117 -0
  322. data/test/cases/null_relation_test.rb +35 -2
  323. data/test/cases/persistence/reload_association_cache_test.rb +20 -0
  324. data/test/cases/persistence_test.rb +629 -22
  325. data/test/cases/pooled_connections_test.rb +57 -56
  326. data/test/cases/prepared_statement_status_test.rb +8 -3
  327. data/test/cases/primary_class_test.rb +134 -0
  328. data/test/cases/primary_keys_test.rb +171 -55
  329. data/test/cases/query_cache_test.rb +558 -263
  330. data/test/cases/query_logs_test.rb +293 -0
  331. data/test/cases/quoting_test.rb +39 -72
  332. data/test/cases/readonly_test.rb +50 -12
  333. data/test/cases/reaper_test.rb +22 -6
  334. data/test/cases/reflection_test.rb +207 -9
  335. data/test/cases/relation/and_test.rb +43 -0
  336. data/test/cases/relation/delegation_test.rb +32 -5
  337. data/test/cases/relation/delete_all_test.rb +27 -6
  338. data/test/cases/relation/field_ordered_values_test.rb +128 -0
  339. data/test/cases/relation/load_async_test.rb +650 -0
  340. data/test/cases/relation/merging_test.rb +80 -109
  341. data/test/cases/relation/mutation_test.rb +12 -7
  342. data/test/cases/relation/or_test.rb +11 -8
  343. data/test/cases/relation/order_test.rb +90 -0
  344. data/test/cases/relation/predicate_builder_test.rb +21 -6
  345. data/test/cases/relation/select_test.rb +162 -3
  346. data/test/cases/relation/structural_compatibility_test.rb +38 -0
  347. data/test/cases/relation/update_all_test.rb +81 -27
  348. data/test/cases/relation/where_chain_test.rb +190 -3
  349. data/test/cases/relation/where_clause_test.rb +43 -1
  350. data/test/cases/relation/where_test.rb +95 -7
  351. data/test/cases/relation/with_test.rb +165 -0
  352. data/test/cases/relation_test.rb +42 -37
  353. data/test/cases/relations_test.rb +436 -138
  354. data/test/cases/reload_models_test.rb +18 -14
  355. data/test/cases/reserved_word_test.rb +2 -1
  356. data/test/cases/result_test.rb +14 -22
  357. data/test/cases/sanitize_test.rb +89 -27
  358. data/test/cases/schema_dumper_test.rb +535 -62
  359. data/test/cases/scoping/default_scoping_test.rb +219 -35
  360. data/test/cases/scoping/named_scoping_test.rb +25 -46
  361. data/test/cases/scoping/relation_scoping_test.rb +112 -4
  362. data/test/cases/secure_password_test.rb +108 -0
  363. data/test/cases/secure_token_test.rb +72 -0
  364. data/test/cases/serialization_test.rb +1 -1
  365. data/test/cases/serialized_attribute_test.rb +305 -60
  366. data/test/cases/shard_keys_test.rb +125 -0
  367. data/test/cases/shard_selector_test.rb +45 -0
  368. data/test/cases/signed_id_test.rb +57 -5
  369. data/test/cases/statement_cache_test.rb +31 -30
  370. data/test/cases/statement_invalid_test.rb +8 -4
  371. data/test/cases/store_test.rb +73 -9
  372. data/test/cases/strict_loading_test.rb +327 -13
  373. data/test/cases/table_metadata_test.rb +16 -0
  374. data/test/cases/tasks/database_tasks_test.rb +517 -244
  375. data/test/cases/test_case.rb +254 -60
  376. data/test/cases/test_case_test.rb +69 -0
  377. data/test/cases/test_databases_test.rb +7 -3
  378. data/test/cases/test_fixtures_test.rb +19 -40
  379. data/test/cases/time_precision_test.rb +17 -5
  380. data/test/cases/timestamp_test.rb +124 -16
  381. data/test/cases/token_for_test.rb +165 -0
  382. data/test/cases/touch_later_test.rb +43 -1
  383. data/test/cases/transaction_callbacks_test.rb +325 -8
  384. data/test/cases/transaction_instrumentation_test.rb +453 -0
  385. data/test/cases/transaction_isolation_test.rb +12 -8
  386. data/test/cases/transactions_test.rb +629 -112
  387. data/test/cases/type/date_time_test.rb +7 -1
  388. data/test/cases/type/time_test.rb +9 -0
  389. data/test/cases/type/type_map_test.rb +108 -73
  390. data/test/cases/type/unsigned_integer_test.rb +12 -0
  391. data/test/cases/type_caster/connection_test.rb +19 -0
  392. data/test/cases/type_test.rb +1 -1
  393. data/test/cases/unconnected_test.rb +7 -7
  394. data/test/cases/unsafe_raw_sql_test.rb +39 -8
  395. data/test/cases/validations/absence_validation_test.rb +1 -1
  396. data/test/cases/validations/association_validation_test.rb +25 -3
  397. data/test/cases/validations/numericality_validation_test.rb +3 -9
  398. data/test/cases/validations/presence_validation_test.rb +1 -1
  399. data/test/cases/validations/uniqueness_validation_test.rb +280 -40
  400. data/test/cases/validations_test.rb +2 -2
  401. data/test/cases/view_test.rb +33 -22
  402. data/test/cases/yaml_serialization_test.rb +23 -17
  403. data/test/config.example.yml +58 -56
  404. data/test/config.rb +1 -0
  405. data/test/fixtures/1_need_quoting.yml +2 -0
  406. data/test/fixtures/accounts.yml +5 -0
  407. data/test/fixtures/aircrafts.yml +7 -0
  408. data/test/fixtures/book_identifiers.yml +11 -0
  409. data/test/fixtures/books.yml +5 -4
  410. data/test/fixtures/cake_designers.yml +5 -0
  411. data/test/fixtures/cars.yml +6 -0
  412. data/test/fixtures/chefs.yml +5 -0
  413. data/test/fixtures/clothing_items.yml +23 -0
  414. data/test/fixtures/clubs.yml +1 -1
  415. data/test/fixtures/comments.yml +2 -1
  416. data/test/fixtures/cpk_authors.yml +8 -0
  417. data/test/fixtures/cpk_books.yml +21 -0
  418. data/test/fixtures/cpk_order_agreements.yml +13 -0
  419. data/test/fixtures/cpk_order_tags.yml +15 -0
  420. data/test/fixtures/cpk_orders.yml +11 -0
  421. data/test/fixtures/cpk_posts.yml +12 -0
  422. data/test/fixtures/cpk_reviews.yml +13 -0
  423. data/test/fixtures/cpk_tags.yml +11 -0
  424. data/test/fixtures/drink_designers.yml +5 -0
  425. data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
  426. data/test/fixtures/encrypted_books.yml +4 -0
  427. data/test/fixtures/fk_object_to_point_to.yml +2 -0
  428. data/test/fixtures/memberships.yml +15 -15
  429. data/test/fixtures/paragraphs.yml +5 -0
  430. data/test/fixtures/parrots.yml +4 -0
  431. data/test/fixtures/people.yml +2 -0
  432. data/test/fixtures/pirates.yml +2 -2
  433. data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
  434. data/test/fixtures/references.yml +3 -3
  435. data/test/fixtures/sharded_blog_posts.yml +14 -0
  436. data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
  437. data/test/fixtures/sharded_blogs.yml +8 -0
  438. data/test/fixtures/sharded_comments.yml +22 -0
  439. data/test/fixtures/sharded_tags.yml +34 -0
  440. data/test/fixtures/sponsors.yml +2 -2
  441. data/test/fixtures/topics.yml +1 -0
  442. data/test/fixtures/treasures.yml +4 -0
  443. data/test/fixtures/virtual_columns.yml +5 -0
  444. data/test/fixtures/warehouse_things.yml +1 -1
  445. data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
  446. data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
  447. data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
  448. data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
  449. data/test/migrations/scope/1_unscoped.rb +7 -0
  450. data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
  451. data/test/models/admin/user.rb +2 -0
  452. data/test/models/admin/user_json.rb +48 -0
  453. data/test/models/attachment.rb +7 -0
  454. data/test/models/author.rb +70 -3
  455. data/test/models/author_encrypted.rb +16 -0
  456. data/test/models/bird.rb +1 -1
  457. data/test/models/book.rb +18 -11
  458. data/test/models/book_destroy_async.rb +1 -1
  459. data/test/models/book_encrypted.rb +106 -0
  460. data/test/models/book_identifier.rb +5 -0
  461. data/test/models/branch.rb +11 -0
  462. data/test/models/bulb.rb +1 -1
  463. data/test/models/car.rb +8 -1
  464. data/test/models/cat.rb +1 -1
  465. data/test/models/category.rb +3 -1
  466. data/test/models/chat_message.rb +8 -0
  467. data/test/models/chef.rb +52 -0
  468. data/test/models/clothing_item.rb +12 -0
  469. data/test/models/club.rb +4 -1
  470. data/test/models/comment.rb +7 -4
  471. data/test/models/comment_overlapping_counter_cache.rb +15 -0
  472. data/test/models/company.rb +16 -2
  473. data/test/models/computer.rb +1 -0
  474. data/test/models/contact.rb +3 -3
  475. data/test/models/contract.rb +5 -1
  476. data/test/models/cpk/author.rb +9 -0
  477. data/test/models/cpk/book.rb +55 -0
  478. data/test/models/cpk/book_destroy_async.rb +9 -0
  479. data/test/models/cpk/car.rb +9 -0
  480. data/test/models/cpk/car_review.rb +9 -0
  481. data/test/models/cpk/chapter.rb +16 -0
  482. data/test/models/cpk/chapter_destroy_async.rb +10 -0
  483. data/test/models/cpk/comment.rb +9 -0
  484. data/test/models/cpk/order.rb +55 -0
  485. data/test/models/cpk/order_agreement.rb +10 -0
  486. data/test/models/cpk/order_tag.rb +10 -0
  487. data/test/models/cpk/post.rb +10 -0
  488. data/test/models/cpk/posts_tag.rb +10 -0
  489. data/test/models/cpk/review.rb +9 -0
  490. data/test/models/cpk/tag.rb +10 -0
  491. data/test/models/cpk.rb +15 -0
  492. data/test/models/customer.rb +3 -1
  493. data/test/models/destroy_async_parent.rb +1 -1
  494. data/test/models/developer.rb +44 -3
  495. data/test/models/discount.rb +4 -0
  496. data/test/models/drink_designer.rb +1 -0
  497. data/test/models/editor.rb +8 -0
  498. data/test/models/editorship.rb +6 -0
  499. data/test/models/entry.rb +5 -0
  500. data/test/models/essay.rb +6 -1
  501. data/test/models/essay_destroy_async.rb +1 -0
  502. data/test/models/eye.rb +87 -21
  503. data/test/models/face.rb +1 -1
  504. data/test/models/friendship.rb +3 -0
  505. data/test/models/hardback.rb +7 -0
  506. data/test/models/hotel.rb +2 -0
  507. data/test/models/human.rb +2 -2
  508. data/test/models/invoice.rb +2 -1
  509. data/test/models/invokes_an_undefined_method.rb +5 -0
  510. data/test/models/line_item.rb +6 -0
  511. data/test/models/member.rb +9 -4
  512. data/test/models/membership.rb +2 -2
  513. data/test/models/message.rb +2 -1
  514. data/test/models/need_quoting.rb +5 -0
  515. data/test/models/paragraph.rb +5 -0
  516. data/test/models/parrot.rb +6 -3
  517. data/test/models/person.rb +7 -4
  518. data/test/models/pirate.rb +4 -1
  519. data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
  520. data/test/models/post.rb +65 -2
  521. data/test/models/post_encrypted.rb +15 -0
  522. data/test/models/post_with_prefetched_pk.rb +15 -0
  523. data/test/models/project.rb +1 -0
  524. data/test/models/publication.rb +16 -0
  525. data/test/models/raises_argument_error.rb +5 -0
  526. data/test/models/raises_no_method_error.rb +5 -0
  527. data/test/models/recipient.rb +5 -0
  528. data/test/models/reference.rb +1 -1
  529. data/test/models/reply.rb +1 -1
  530. data/test/models/room.rb +3 -0
  531. data/test/models/sharded/blog.rb +12 -0
  532. data/test/models/sharded/blog_post.rb +17 -0
  533. data/test/models/sharded/blog_post_destroy_async.rb +14 -0
  534. data/test/models/sharded/blog_post_tag.rb +11 -0
  535. data/test/models/sharded/blog_post_with_revision.rb +11 -0
  536. data/test/models/sharded/comment.rb +12 -0
  537. data/test/models/sharded/comment_destroy_async.rb +12 -0
  538. data/test/models/sharded/tag.rb +11 -0
  539. data/test/models/sharded.rb +8 -0
  540. data/test/models/ship.rb +1 -1
  541. data/test/models/shipping_line.rb +11 -0
  542. data/test/models/subscriber.rb +1 -0
  543. data/test/models/subscription.rb +3 -1
  544. data/test/models/too_long_table_name.rb +5 -0
  545. data/test/models/topic.rb +3 -1
  546. data/test/models/traffic_light.rb +2 -2
  547. data/test/models/traffic_light_encrypted.rb +21 -0
  548. data/test/models/translation.rb +9 -0
  549. data/test/models/treasure.rb +1 -1
  550. data/test/models/tyre.rb +1 -1
  551. data/test/models/user.rb +16 -0
  552. data/test/models/user_with_invalid_relation.rb +28 -0
  553. data/test/models/uuid_comment.rb +5 -0
  554. data/test/models/uuid_entry.rb +5 -0
  555. data/test/models/uuid_message.rb +5 -0
  556. data/test/models/zine.rb +2 -1
  557. data/test/schema/mysql2_specific_schema.rb +26 -12
  558. data/test/schema/postgresql_specific_schema.rb +121 -13
  559. data/test/schema/schema.rb +361 -103
  560. data/test/schema/sqlite_specific_schema.rb +17 -6
  561. data/test/schema/trilogy_specific_schema.rb +96 -0
  562. data/test/support/adapter_helper.rb +104 -0
  563. data/test/support/async_helper.rb +15 -0
  564. data/test/support/config.rb +1 -1
  565. data/test/support/connection.rb +14 -2
  566. data/test/support/ddl_helper.rb +1 -1
  567. data/test/support/fake_adapter.rb +42 -0
  568. data/test/support/load_schema_helper.rb +22 -0
  569. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
  570. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
  571. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
  572. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
  573. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
  574. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
  575. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
  576. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
  577. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
  578. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
  579. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
  580. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
  581. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
  582. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
  583. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
  584. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
  585. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
  586. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
  587. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
  588. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
  589. data/test/support/schema_dumping_helper.rb +15 -9
  590. data/test/support/tools.rb +37 -0
  591. data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
  592. metadata +247 -15
@@ -4,8 +4,6 @@ require "cases/helper"
4
4
  require "cases/migration/helper"
5
5
 
6
6
  class MultiDbMigratorTest < ActiveRecord::TestCase
7
- self.use_transactional_tests = false
8
-
9
7
  # Use this class to sense if migrations have gone
10
8
  # up or down.
11
9
  class Sensor < ActiveRecord::Migration::Current
@@ -23,22 +21,25 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
23
21
 
24
22
  def setup
25
23
  super
26
- @connection_a = ActiveRecord::Base.connection
27
- @connection_b = ARUnit2Model.connection
24
+ @pool_a = ActiveRecord::Base.connection_pool
25
+ @pool_b = ARUnit2Model.connection_pool
28
26
 
29
- @connection_a.schema_migration.create_table
30
- @connection_b.schema_migration.create_table
27
+ @pool_a.schema_migration.create_table
28
+ @pool_b.schema_migration.create_table
31
29
 
32
- @connection_a.schema_migration.delete_all rescue nil
33
- @connection_b.schema_migration.delete_all rescue nil
30
+ @pool_a.schema_migration.delete_all_versions rescue nil
31
+ @pool_b.schema_migration.delete_all_versions rescue nil
34
32
 
35
33
  @path_a = MIGRATIONS_ROOT + "/valid"
36
34
  @path_b = MIGRATIONS_ROOT + "/to_copy"
37
35
 
38
- @schema_migration_a = @connection_a.schema_migration
39
- @migrations_a = ActiveRecord::MigrationContext.new(@path_a, @schema_migration_a).migrations
40
- @schema_migration_b = @connection_b.schema_migration
41
- @migrations_b = ActiveRecord::MigrationContext.new(@path_b, @schema_migration_b).migrations
36
+ @schema_migration_a = @pool_a.schema_migration
37
+ @internal_metadata_a = @pool_a.internal_metadata
38
+ @migrations_a = ActiveRecord::MigrationContext.new(@path_a, @schema_migration_a, @internal_metadata_a).migrations
39
+
40
+ @schema_migration_b = @pool_b.schema_migration
41
+ @internal_metadata_b = @pool_b.internal_metadata
42
+ @migrations_b = ActiveRecord::MigrationContext.new(@path_b, @schema_migration_b, @internal_metadata_b).migrations
42
43
 
43
44
  @migrations_a_list = [[1, "ValidPeopleHaveLastNames"], [2, "WeNeedReminders"], [3, "InnocentJointable"]]
44
45
  @migrations_b_list = [[1, "PeopleHaveHobbies"], [2, "PeopleHaveDescriptions"]]
@@ -55,8 +56,8 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
55
56
  end
56
57
 
57
58
  teardown do
58
- @connection_a.schema_migration.delete_all rescue nil
59
- @connection_b.schema_migration.delete_all rescue nil
59
+ @pool_q.schema_migration.delete_all_versions rescue nil
60
+ @pool_b.schema_migration.delete_all_versions rescue nil
60
61
 
61
62
  ActiveRecord::Migration.verbose = @verbose_was
62
63
  ActiveRecord::Migration.class_eval do
@@ -67,9 +68,16 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
67
68
  end
68
69
  end
69
70
 
70
- def test_schema_migration_class_names
71
- assert_equal "ActiveRecord::SchemaMigration", @schema_migration_a.name
72
- assert_equal "ARUnit2Model::SchemaMigration", @schema_migration_b.name
71
+ def test_schema_migration_is_different_for_different_connections
72
+ assert_not_equal @schema_migration_a, @schema_migration_b
73
+ assert_not_equal @schema_migration_a.instance_variable_get(:@pool), @schema_migration_b.instance_variable_get(:@pool)
74
+ if @pool_a.pool_config.respond_to?(:connection_descriptor)
75
+ assert_equal "ActiveRecord::Base", @pool_a.pool_config.connection_descriptor.name
76
+ assert_equal "ARUnit2Model", @pool_b.pool_config.connection_descriptor.name
77
+ else
78
+ assert_equal "ActiveRecord::Base", @pool_a.pool_config.connection_class.name
79
+ assert_equal "ARUnit2Model", @pool_b.pool_config.connection_class.name
80
+ end
73
81
  end
74
82
 
75
83
  def test_finds_migrations
@@ -85,23 +93,23 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
85
93
  end
86
94
 
87
95
  def test_migrations_status
88
- @schema_migration_a.create(version: 2)
89
- @schema_migration_a.create(version: 10)
96
+ @schema_migration_a.create_version(2)
97
+ @schema_migration_a.create_version(10)
90
98
 
91
99
  assert_equal [
92
100
  ["down", "001", "Valid people have last names"],
93
101
  ["up", "002", "We need reminders"],
94
102
  ["down", "003", "Innocent jointable"],
95
103
  ["up", "010", "********** NO FILE **********"],
96
- ], ActiveRecord::MigrationContext.new(@path_a, @schema_migration_a).migrations_status
104
+ ], ActiveRecord::MigrationContext.new(@path_a, @schema_migration_a, @internal_metadata_a).migrations_status
97
105
 
98
- @schema_migration_b.create(version: 4)
106
+ @schema_migration_b.create_version(4)
99
107
 
100
108
  assert_equal [
101
109
  ["down", "001", "People have hobbies"],
102
110
  ["down", "002", "People have descriptions"],
103
111
  ["up", "004", "********** NO FILE **********"]
104
- ], ActiveRecord::MigrationContext.new(@path_b, @schema_migration_b).migrations_status
112
+ ], ActiveRecord::MigrationContext.new(@path_b, @schema_migration_b, @internal_metadata_b).migrations_status
105
113
  end
106
114
 
107
115
  def test_get_all_versions
@@ -134,16 +142,16 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
134
142
  end
135
143
 
136
144
  def test_finds_pending_migrations
137
- @schema_migration_a.create!(version: "1")
145
+ @schema_migration_a.create_version("1")
138
146
  migration_list_a = [ActiveRecord::Migration.new("foo", 1), ActiveRecord::Migration.new("bar", 3)]
139
- migrations_a = ActiveRecord::Migrator.new(:up, migration_list_a, @schema_migration_a).pending_migrations
147
+ migrations_a = ActiveRecord::Migrator.new(:up, migration_list_a, @schema_migration_a, @internal_metadata_a).pending_migrations
140
148
 
141
149
  assert_equal 1, migrations_a.size
142
150
  assert_equal migration_list_a.last, migrations_a.first
143
151
 
144
- @schema_migration_b.create!(version: "1")
152
+ @schema_migration_b.create_version("1")
145
153
  migration_list_b = [ActiveRecord::Migration.new("foo", 1), ActiveRecord::Migration.new("bar", 3)]
146
- migrations_b = ActiveRecord::Migrator.new(:up, migration_list_b, @schema_migration_b).pending_migrations
154
+ migrations_b = ActiveRecord::Migrator.new(:up, migration_list_b, @schema_migration_b, @internal_metadata_b).pending_migrations
147
155
 
148
156
  assert_equal 1, migrations_b.size
149
157
  assert_equal migration_list_b.last, migrations_b.first
@@ -151,25 +159,27 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
151
159
 
152
160
  def test_migrator_db_has_no_schema_migrations_table
153
161
  _, migrator = migrator_class(3)
154
- migrator = migrator.new(@path_a, @schema_migration_a)
162
+ migrator = migrator.new(@path_a, @schema_migration_a, @internal_metadata_a)
155
163
 
156
164
  @schema_migration_a.drop_table
157
- assert_not @connection_a.table_exists?("schema_migrations")
165
+ assert_not @pool_a.lease_connection.table_exists?("schema_migrations")
158
166
  migrator.migrate(1)
159
- assert @connection_a.table_exists?("schema_migrations")
167
+ assert @pool_a.lease_connection.table_exists?("schema_migrations")
168
+ migrator.rollback
160
169
 
161
170
  _, migrator = migrator_class(3)
162
- migrator = migrator.new(@path_b, @schema_migration_b)
171
+ migrator = migrator.new(@path_b, @schema_migration_b, @internal_metadata_b)
163
172
 
164
173
  @schema_migration_b.drop_table
165
- assert_not @connection_b.table_exists?("schema_migrations")
174
+ assert_not @pool_b.lease_connection.table_exists?("schema_migrations")
166
175
  migrator.migrate(1)
167
- assert @connection_b.table_exists?("schema_migrations")
176
+ assert @pool_b.lease_connection.table_exists?("schema_migrations")
177
+ migrator.rollback
168
178
  end
169
179
 
170
180
  def test_migrator_forward
171
181
  _, migrator = migrator_class(3)
172
- migrator = migrator.new(@path_a, @schema_migration_a)
182
+ migrator = migrator.new(@path_a, @schema_migration_a, @internal_metadata_a)
173
183
  migrator.migrate(1)
174
184
  assert_equal(1, migrator.current_version)
175
185
 
@@ -180,7 +190,7 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
180
190
  assert_equal(3, migrator.current_version)
181
191
 
182
192
  _, migrator_b = migrator_class(3)
183
- migrator_b = migrator_b.new(@path_b, @schema_migration_b)
193
+ migrator_b = migrator_b.new(@path_b, @schema_migration_b, @internal_metadata_b)
184
194
  migrator_b.migrate(1)
185
195
  assert_equal(1, migrator_b.current_version)
186
196
 
@@ -191,6 +201,17 @@ class MultiDbMigratorTest < ActiveRecord::TestCase
191
201
  assert_equal(3, migrator_b.current_version)
192
202
  end
193
203
 
204
+ def test_internal_metadata_stores_environment
205
+ current_env = ActiveRecord::Base.lease_connection.pool.db_config.env_name
206
+ migrations_path = MIGRATIONS_ROOT + "/valid"
207
+ migrator = ActiveRecord::MigrationContext.new(migrations_path, @schema_migration_b, @internal_metadata_b)
208
+
209
+ migrator.up
210
+ assert_equal current_env, @internal_metadata_b[:environment]
211
+ ensure
212
+ migrator.down if migrator && !current_adapter?(:IBM_DBAdapter)
213
+ end
214
+
194
215
  private
195
216
  def m(name, version)
196
217
  x = Sensor.new name, version
@@ -107,8 +107,8 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase
107
107
  }
108
108
  topic = Topic.find(1)
109
109
  topic.attributes = attributes
110
- # testing against to_s(:db) representation because either a Time or a DateTime might be returned, depending on platform
111
- assert_equal "1850-06-24 16:24:00", topic.written_on.to_s(:db)
110
+ # testing against to_fs(:db) representation because either a Time or a DateTime might be returned, depending on platform
111
+ assert_equal "1850-06-24 16:24:00", topic.written_on.to_fs(:db)
112
112
  end
113
113
 
114
114
  def test_multiparameter_attributes_on_time_will_raise_on_big_time_if_missing_date_parts
@@ -249,36 +249,33 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase
249
249
  Topic.reset_column_information
250
250
  end
251
251
 
252
- # Oracle does not have a TIME datatype.
253
- unless current_adapter?(:OracleAdapter)
254
- def test_multiparameter_attributes_on_time_only_column_with_time_zone_aware_attributes_does_not_do_time_zone_conversion
255
- with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
256
- Topic.reset_column_information
257
- attributes = {
258
- "bonus_time(1i)" => "2000", "bonus_time(2i)" => "1", "bonus_time(3i)" => "1",
259
- "bonus_time(4i)" => "16", "bonus_time(5i)" => "24"
260
- }
261
- topic = Topic.find(1)
262
- topic.attributes = attributes
263
- assert_equal Time.zone.local(2000, 1, 1, 16, 24, 0), topic.bonus_time
264
- assert_not_predicate topic.bonus_time, :utc?
265
-
266
- attributes = {
267
- "written_on(1i)" => "2000", "written_on(2i)" => "", "written_on(3i)" => "",
268
- "written_on(4i)" => "", "written_on(5i)" => ""
269
- }
270
- topic.attributes = attributes
271
- assert_nil topic.written_on
272
- end
273
- ensure
252
+ def test_multiparameter_attributes_on_time_only_column_with_time_zone_aware_attributes_does_not_do_time_zone_conversion
253
+ with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
274
254
  Topic.reset_column_information
275
- end
255
+ attributes = {
256
+ "bonus_time(1i)" => "2000", "bonus_time(2i)" => "1", "bonus_time(3i)" => "1",
257
+ "bonus_time(4i)" => "16", "bonus_time(5i)" => "24"
258
+ }
259
+ topic = Topic.find(1)
260
+ topic.attributes = attributes
261
+ assert_equal Time.zone.local(2000, 1, 1, 16, 24, 0), topic.bonus_time
262
+ assert_not_predicate topic.bonus_time, :utc?
276
263
 
277
- def test_multiparameter_attributes_setting_time_attribute
278
- topic = Topic.new("bonus_time(4i)" => "01", "bonus_time(5i)" => "05")
279
- assert_equal 1, topic.bonus_time.hour
280
- assert_equal 5, topic.bonus_time.min
264
+ attributes = {
265
+ "written_on(1i)" => "2000", "written_on(2i)" => "", "written_on(3i)" => "",
266
+ "written_on(4i)" => "", "written_on(5i)" => ""
267
+ }
268
+ topic.attributes = attributes
269
+ assert_nil topic.written_on
281
270
  end
271
+ ensure
272
+ Topic.reset_column_information
273
+ end
274
+
275
+ def test_multiparameter_attributes_setting_time_attribute
276
+ topic = Topic.new("bonus_time(4i)" => "01", "bonus_time(5i)" => "05")
277
+ assert_equal 1, topic.bonus_time.hour
278
+ assert_equal 5, topic.bonus_time.min
282
279
  end
283
280
 
284
281
  def test_multiparameter_attributes_on_time_with_empty_seconds
@@ -9,26 +9,26 @@ class MultipleDbTest < ActiveRecord::TestCase
9
9
  self.use_transactional_tests = false
10
10
 
11
11
  def setup
12
- @courses = create_fixtures("courses") { Course.retrieve_connection }
13
- @colleges = create_fixtures("colleges") { College.retrieve_connection }
12
+ @courses = create_fixtures("courses")
13
+ @colleges = create_fixtures("colleges")
14
14
  @entrants = create_fixtures("entrants")
15
15
  end
16
16
 
17
17
  def test_connected
18
- assert_not_nil Entrant.connection
19
- assert_not_nil Course.connection
18
+ assert_not_nil Entrant.lease_connection
19
+ assert_not_nil Course.lease_connection
20
20
  end
21
21
 
22
22
  def test_proper_connection
23
- assert_not_equal(Entrant.connection, Course.connection)
24
- assert_equal(Entrant.connection, Entrant.retrieve_connection)
25
- assert_equal(Course.connection, Course.retrieve_connection)
26
- assert_equal(ActiveRecord::Base.connection, Entrant.connection)
23
+ assert_not_equal(Entrant.lease_connection, Course.lease_connection)
24
+ assert_equal(Entrant.lease_connection, Entrant.retrieve_connection)
25
+ assert_equal(Course.lease_connection, Course.retrieve_connection)
26
+ assert_equal(ActiveRecord::Base.lease_connection, Entrant.lease_connection)
27
27
  end
28
28
 
29
29
  def test_swapping_the_connection
30
30
  old_spec_name, Course.connection_specification_name = Course.connection_specification_name, "ActiveRecord::Base"
31
- assert_equal(Entrant.connection, Course.connection)
31
+ assert_equal(Entrant.lease_connection, Course.lease_connection)
32
32
  ensure
33
33
  Course.connection_specification_name = old_spec_name
34
34
  end
@@ -58,12 +58,12 @@ class MultipleDbTest < ActiveRecord::TestCase
58
58
  end
59
59
 
60
60
  def test_course_connection_should_survive_reloads
61
- assert Course.connection
61
+ assert Course.lease_connection
62
62
 
63
63
  assert Object.send(:remove_const, :Course)
64
64
  assert load("models/course.rb")
65
65
 
66
- assert Course.connection
66
+ assert Course.lease_connection
67
67
  end
68
68
 
69
69
  def test_transactions_across_databases
@@ -92,25 +92,48 @@ class MultipleDbTest < ActiveRecord::TestCase
92
92
  end
93
93
 
94
94
  def test_connection
95
- assert_same Entrant.connection, Bird.connection
96
- assert_not_same Entrant.connection, Course.connection
95
+ assert_same Entrant.lease_connection, Bird.lease_connection
96
+ assert_not_same Entrant.lease_connection, Course.lease_connection
97
97
  end
98
98
 
99
99
  unless in_memory_db?
100
100
  def test_count_on_custom_connection
101
- ActiveRecord::Base.remove_connection
101
+ assert_equal ARUnit2Model.lease_connection, College.lease_connection
102
+ assert_not_equal ActiveRecord::Base.lease_connection, College.lease_connection
102
103
  assert_equal 1, College.count
103
- ensure
104
- ActiveRecord::Base.establish_connection :arunit
105
104
  end
106
105
 
107
106
  def test_associations_should_work_when_model_has_no_connection
108
- ActiveRecord::Base.remove_connection
109
107
  assert_nothing_raised do
110
108
  College.first.courses.first
111
109
  end
112
- ensure
113
- ActiveRecord::Base.establish_connection :arunit
114
110
  end
115
111
  end
112
+
113
+ def test_exception_contains_connection_pool
114
+ error = assert_raises(ActiveRecord::StatementInvalid) do
115
+ Course.where(wrong_column: "wrong").first!
116
+ end
117
+
118
+ assert_equal Course.lease_connection.pool, error.connection_pool
119
+ end
120
+
121
+ def test_exception_contains_correct_pool
122
+ course_conn = Course.lease_connection
123
+ entrant_conn = Entrant.lease_connection
124
+
125
+ assert_not_equal course_conn, entrant_conn
126
+
127
+ course_error = assert_raises(ActiveRecord::StatementInvalid) do
128
+ course_conn.execute("SELECT * FROM entrants")
129
+ end
130
+
131
+ assert_equal course_conn.pool, course_error.connection_pool
132
+
133
+ entrant_error = assert_raises(ActiveRecord::StatementInvalid) do
134
+ entrant_conn.execute("SELECT * FROM courses")
135
+ end
136
+
137
+ assert_equal entrant_conn.pool, entrant_error.connection_pool
138
+ end
116
139
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "cases/helper"
4
4
  require "models/pirate"
5
+ require "models/developer"
5
6
  require "models/ship"
6
7
  require "models/ship_part"
7
8
  require "models/bird"
@@ -11,6 +12,9 @@ require "models/human"
11
12
  require "models/interest"
12
13
  require "models/owner"
13
14
  require "models/pet"
15
+ require "models/entry"
16
+ require "models/message"
17
+ require "models/cpk"
14
18
  require "active_support/hash_with_indifferent_access"
15
19
 
16
20
  class TestNestedAttributesInGeneral < ActiveRecord::TestCase
@@ -229,6 +233,17 @@ class TestNestedAttributesInGeneral < ActiveRecord::TestCase
229
233
  )
230
234
  end
231
235
  end
236
+
237
+ def test_updating_models_with_cpk_provided_as_strings
238
+ book = Cpk::Book.create!(id: [1, 2], shop_id: 3)
239
+ book.chapters.create!(id: [1, 3], title: "Title")
240
+
241
+ assert_queries_count(4) do
242
+ book.update!(chapters_attributes: { id: ["1", "3"], title: "New title" })
243
+ end
244
+ assert_equal 1, book.reload.chapters.count
245
+ assert_equal "New title", book.chapters.first.title
246
+ end
232
247
  end
233
248
 
234
249
  class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
@@ -359,6 +374,15 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
359
374
  assert_equal "Mister Pablo", @pirate.ship.name
360
375
  end
361
376
 
377
+ def test_should_defer_updating_nested_associations_until_after_base_attributes_are_set
378
+ ship = @pirate.ship
379
+
380
+ ship_part = ShipPart.new
381
+ ship_part.attributes = { ship_attributes: { name: "Prometheus" }, ship_id: ship.id }
382
+
383
+ assert_equal "Prometheus", ship_part.ship.name
384
+ end
385
+
362
386
  def test_should_not_destroy_the_associated_model_until_the_parent_is_saved
363
387
  @pirate.attributes = { ship_attributes: { id: @ship.id, _destroy: "1" } }
364
388
 
@@ -377,6 +401,7 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
377
401
 
378
402
  def test_should_accept_update_only_option
379
403
  @pirate.update(update_only_ship_attributes: { id: @pirate.ship.id, name: "Mayflower" })
404
+ assert_equal "Mayflower", @pirate.reload.ship.name
380
405
  end
381
406
 
382
407
  def test_should_create_new_model_when_nothing_is_there_and_update_only_is_true
@@ -419,6 +444,13 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
419
444
 
420
445
  Pirate.accepts_nested_attributes_for :update_only_ship, update_only: true, allow_destroy: false
421
446
  end
447
+
448
+ def test_should_raise_an_argument_error_if_something_other_than_a_hash_is_passed_in
449
+ exception = assert_raise ArgumentError do
450
+ @pirate.update(ship_attributes: "foo")
451
+ end
452
+ assert_equal "Hash expected for `ship` attributes, got String", exception.message
453
+ end
422
454
  end
423
455
 
424
456
  class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase
@@ -595,6 +627,13 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase
595
627
 
596
628
  Ship.accepts_nested_attributes_for :update_only_pirate, update_only: true, allow_destroy: false
597
629
  end
630
+
631
+ def test_should_raise_an_argument_error_if_something_other_than_a_hash_is_passed_in
632
+ exception = assert_raise ArgumentError do
633
+ @ship.update(pirate_attributes: "foo")
634
+ end
635
+ assert_equal "Hash expected for `pirate` attributes, got String", exception.message
636
+ end
598
637
  end
599
638
 
600
639
  module NestedAttributesOnACollectionAssociationTests
@@ -765,7 +804,7 @@ module NestedAttributesOnACollectionAssociationTests
765
804
  exception = assert_raise ArgumentError do
766
805
  @pirate.public_send(association_setter, "foo")
767
806
  end
768
- assert_equal %{Hash or Array expected for attribute `#{@association_name}`, got String ("foo")}, exception.message
807
+ assert_equal %{Hash or Array expected for `#{@association_name}` attributes, got String}, exception.message
769
808
  end
770
809
 
771
810
  def test_should_work_with_update_as_well
@@ -850,6 +889,21 @@ module NestedAttributesOnACollectionAssociationTests
850
889
  end
851
890
  end
852
891
 
892
+ def test_assigning_nested_attributes_target
893
+ params = @alternate_params[association_getter].values
894
+ @pirate.public_send(association_setter, params)
895
+ @pirate.save
896
+ assert_equal [@child_1, @child_2], @pirate.association(@association_name).nested_attributes_target
897
+ end
898
+
899
+ def test_assigning_nested_attributes_target_with_nil_placeholder_for_rejected_item
900
+ params = @alternate_params[association_getter].values
901
+ params.insert(1, {})
902
+ @pirate.public_send(association_setter, params)
903
+ @pirate.save
904
+ assert_equal [@child_1, nil, @child_2], @pirate.association(@association_name).nested_attributes_target
905
+ end
906
+
853
907
  private
854
908
  def association_setter
855
909
  @association_setter ||= "#{@association_name}_attributes=".to_sym
@@ -1093,7 +1147,7 @@ class TestHasManyAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveR
1093
1147
  part = ship.parts.build(name: "Stern")
1094
1148
  ship.treasures.build(looter: part)
1095
1149
 
1096
- assert_queries 3 do
1150
+ assert_queries_count(5) do
1097
1151
  ship.save!
1098
1152
  end
1099
1153
  end
@@ -1106,14 +1160,78 @@ class TestHasManyAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveR
1106
1160
  end
1107
1161
  end
1108
1162
 
1109
- class TestNestedAttributesWithExtend < ActiveRecord::TestCase
1110
- setup do
1111
- Pirate.accepts_nested_attributes_for :treasures
1163
+ class TestIndexErrorsWithNestedAttributesOnlyMode < ActiveRecord::TestCase
1164
+ def setup
1165
+ tuning_peg_class = Class.new(ActiveRecord::Base) do
1166
+ self.table_name = "tuning_pegs"
1167
+ def self.name; "TuningPeg"; end
1168
+
1169
+ validates_numericality_of :pitch
1170
+ end
1171
+
1172
+ @guitar_class = Class.new(ActiveRecord::Base) do
1173
+ has_many :tuning_pegs, index_errors: :nested_attributes_order, anonymous_class: tuning_peg_class
1174
+ accepts_nested_attributes_for :tuning_pegs, reject_if: lambda { |attrs| attrs[:pitch]&.odd? }
1175
+
1176
+ def self.name; "Guitar"; end
1177
+ end
1112
1178
  end
1113
1179
 
1180
+ test "index in nested_attributes_order order" do
1181
+ guitar = @guitar_class.create!
1182
+ guitar.tuning_pegs.create!(pitch: 1)
1183
+ peg2 = guitar.tuning_pegs.create!(pitch: 2)
1184
+
1185
+ assert_predicate guitar, :valid?
1186
+
1187
+ guitar.update(tuning_pegs_attributes: [{ id: peg2.id, pitch: nil }])
1188
+
1189
+ assert_not_predicate guitar, :valid?
1190
+ assert_equal [:"tuning_pegs[0].pitch"], guitar.errors.messages.keys
1191
+ end
1192
+
1193
+ test "index unaffected by reject_if" do
1194
+ guitar = @guitar_class.create!
1195
+
1196
+ guitar.update(
1197
+ tuning_pegs_attributes: [
1198
+ { pitch: 1 },
1199
+ { pitch: nil },
1200
+ ]
1201
+ )
1202
+
1203
+ assert_not_predicate guitar, :valid?
1204
+ assert_equal [:"tuning_pegs[1].pitch"], guitar.errors.messages.keys
1205
+ end
1206
+ end
1207
+
1208
+ class TestNestedAttributesWithExtend < ActiveRecord::TestCase
1114
1209
  def test_extend_affects_nested_attributes
1115
- pirate = Pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
1210
+ super_pirate = Class.new(ActiveRecord::Base) do
1211
+ self.table_name = "pirates"
1212
+
1213
+ has_many :treasures, as: :looter, extend: Pirate::PostTreasuresExtension
1214
+ self.accepts_nested_attributes_for :treasures
1215
+
1216
+ def self.name
1217
+ "SuperPirate"
1218
+ end
1219
+ end
1220
+
1221
+ pirate = super_pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
1116
1222
  pirate.treasures_attributes = [{ id: nil }]
1117
1223
  assert_equal "from extension", pirate.treasures[0].name
1118
1224
  end
1119
1225
  end
1226
+
1227
+ class TestNestedAttributesForDelegatedType < ActiveRecord::TestCase
1228
+ setup do
1229
+ Entry.accepts_nested_attributes_for :entryable
1230
+ @entry = Entry.new(entryable_type: "Message", entryable_attributes: { subject: "Hello world!" })
1231
+ end
1232
+
1233
+ def test_should_build_a_new_record_based_on_the_delegated_type
1234
+ assert_not_predicate @entry.entryable, :persisted?
1235
+ assert_equal "Hello world!", @entry.entryable.subject
1236
+ end
1237
+ end
@@ -138,9 +138,9 @@ class NestedAttributesWithCallbacksTest < ActiveRecord::TestCase
138
138
 
139
139
  def assert_assignment_affects_records_in_target(association_name)
140
140
  association = @pirate.public_send(association_name)
141
- assert association.detect { |b| b == bird_to_update }.name_changed?,
141
+ assert_predicate association.detect { |b| b == bird_to_update }, :name_changed?,
142
142
  "Update record not updated"
143
- assert association.detect { |b| b == bird_to_destroy }.marked_for_destruction?,
143
+ assert_predicate association.detect { |b| b == bird_to_destroy }, :marked_for_destruction?,
144
144
  "Destroy record not marked for destruction"
145
145
  end
146
146
  end