ibm_db 5.2.0-x86-mingw32 → 5.4.0-x86-mingw32

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 (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -1,46 +1,59 @@
1
- require 'cases/helper'
2
- require 'models/admin'
3
- require 'models/admin/account'
4
- require 'models/admin/randomly_named_c1'
5
- require 'models/admin/user'
6
- require 'models/binary'
7
- require 'models/book'
8
- require 'models/bulb'
9
- require 'models/category'
10
- require 'models/comment'
11
- require 'models/company'
12
- require 'models/computer'
13
- require 'models/course'
14
- require 'models/developer'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/connection_helper"
5
+ require "models/admin"
6
+ require "models/admin/account"
7
+ require "models/admin/randomly_named_c1"
8
+ require "models/admin/user"
9
+ require "models/binary"
10
+ require "models/book"
11
+ require "models/bulb"
12
+ require "models/category"
13
+ require "models/post"
14
+ require "models/comment"
15
+ require "models/company"
16
+ require "models/computer"
17
+ require "models/course"
18
+ require "models/developer"
15
19
  require "models/dog"
16
- require 'models/doubloon'
17
- require 'models/joke'
18
- require 'models/matey'
20
+ require "models/doubloon"
21
+ require "models/joke"
22
+ require "models/matey"
19
23
  require "models/other_dog"
20
- require 'models/parrot'
21
- require 'models/pirate'
22
- require 'models/post'
23
- require 'models/randomly_named_c1'
24
- require 'models/reply'
25
- require 'models/ship'
26
- require 'models/task'
27
- require 'models/topic'
28
- require 'models/traffic_light'
29
- require 'models/treasure'
30
- require 'tempfile'
24
+ require "models/parrot"
25
+ require "models/pirate"
26
+ require "models/randomly_named_c1"
27
+ require "models/reply"
28
+ require "models/ship"
29
+ require "models/task"
30
+ require "models/topic"
31
+ require "models/traffic_light"
32
+ require "models/treasure"
33
+ require "tempfile"
31
34
 
32
35
  class FixturesTest < ActiveRecord::TestCase
36
+ include ConnectionHelper
37
+
33
38
  self.use_instantiated_fixtures = true
34
39
  self.use_transactional_tests = false
35
40
 
36
41
  # other_topics fixture should not be included here
37
- fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes, :binaries, :traffic_lights
42
+ fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes, :binaries, :traffic_lights, :treasures
38
43
 
39
44
  FIXTURES = %w( accounts binaries companies customers
40
45
  developers developers_projects entrants
41
46
  movies projects subscribers topics tasks )
42
47
  MATCH_ATTRIBUTE_NAME = /[a-zA-Z][-\w]*/
43
48
 
49
+ def setup
50
+ Arel::Table.engine = nil # should not rely on the global Arel::Table.engine
51
+ end
52
+
53
+ def teardown
54
+ Arel::Table.engine = ActiveRecord::Base
55
+ end
56
+
44
57
  def test_clean_fixtures
45
58
  FIXTURES.each do |name|
46
59
  fixtures = nil
@@ -54,13 +67,251 @@ class FixturesTest < ActiveRecord::TestCase
54
67
  end
55
68
  end
56
69
 
70
+ class InsertQuerySubscriber
71
+ attr_reader :events
72
+
73
+ def initialize
74
+ @events = []
75
+ end
76
+
77
+ def call(_, _, _, _, values)
78
+ @events << values[:sql] if /INSERT/.match?(values[:sql])
79
+ end
80
+ end
81
+
82
+ if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter)
83
+ def test_bulk_insert
84
+ subscriber = InsertQuerySubscriber.new
85
+ subscription = ActiveSupport::Notifications.subscribe("sql.active_record", subscriber)
86
+ create_fixtures("bulbs")
87
+ assert_equal 1, subscriber.events.size, "It takes one INSERT query to insert two fixtures"
88
+ ensure
89
+ ActiveSupport::Notifications.unsubscribe(subscription)
90
+ end
91
+
92
+ def test_bulk_insert_multiple_table_with_a_multi_statement_query
93
+ subscriber = InsertQuerySubscriber.new
94
+ subscription = ActiveSupport::Notifications.subscribe("sql.active_record", subscriber)
95
+
96
+ create_fixtures("bulbs", "authors", "computers")
97
+
98
+ expected_sql = <<~EOS.chop
99
+ INSERT INTO #{ActiveRecord::Base.connection.quote_table_name("bulbs")} .*
100
+ INSERT INTO #{ActiveRecord::Base.connection.quote_table_name("authors")} .*
101
+ INSERT INTO #{ActiveRecord::Base.connection.quote_table_name("computers")} .*
102
+ EOS
103
+ assert_equal 1, subscriber.events.size
104
+ assert_match(/#{expected_sql}/, subscriber.events.first)
105
+ ensure
106
+ ActiveSupport::Notifications.unsubscribe(subscription)
107
+ end
108
+
109
+ def test_bulk_insert_with_a_multi_statement_query_raises_an_exception_when_any_insert_fails
110
+ require "models/aircraft"
111
+
112
+ assert_equal false, Aircraft.columns_hash["wheels_count"].null
113
+ fixtures = {
114
+ "aircraft" => [
115
+ { "name" => "working_aircrafts", "wheels_count" => 2 },
116
+ { "name" => "broken_aircrafts", "wheels_count" => nil },
117
+ ]
118
+ }
119
+
120
+ assert_no_difference "Aircraft.count" do
121
+ assert_raises(ActiveRecord::NotNullViolation) do
122
+ ActiveRecord::Base.connection.insert_fixtures_set(fixtures)
123
+ end
124
+ end
125
+ end
126
+
127
+ def test_bulk_insert_with_a_multi_statement_query_in_a_nested_transaction
128
+ fixtures = {
129
+ "traffic_lights" => [
130
+ { "location" => "US", "state" => ["NY"], "long_state" => ["a"] },
131
+ ]
132
+ }
133
+
134
+ assert_difference "TrafficLight.count" do
135
+ ActiveRecord::Base.transaction do
136
+ conn = ActiveRecord::Base.connection
137
+ assert_equal 1, conn.open_transactions
138
+ conn.insert_fixtures_set(fixtures)
139
+ assert_equal 1, conn.open_transactions
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ if current_adapter?(:Mysql2Adapter)
146
+ def test_bulk_insert_with_multi_statements_enabled
147
+ run_without_connection do |orig_connection|
148
+ ActiveRecord::Base.establish_connection(
149
+ orig_connection.merge(flags: %w[MULTI_STATEMENTS])
150
+ )
151
+
152
+ fixtures = {
153
+ "traffic_lights" => [
154
+ { "location" => "US", "state" => ["NY"], "long_state" => ["a"] },
155
+ ]
156
+ }
157
+
158
+ assert_nothing_raised do
159
+ conn = ActiveRecord::Base.connection
160
+ conn.execute("SELECT 1; SELECT 2;")
161
+ conn.raw_connection.abandon_results!
162
+ end
163
+
164
+ assert_difference "TrafficLight.count" do
165
+ ActiveRecord::Base.transaction do
166
+ conn = ActiveRecord::Base.connection
167
+ assert_equal 1, conn.open_transactions
168
+ conn.insert_fixtures_set(fixtures)
169
+ assert_equal 1, conn.open_transactions
170
+ end
171
+ end
172
+
173
+ assert_nothing_raised do
174
+ conn = ActiveRecord::Base.connection
175
+ conn.execute("SELECT 1; SELECT 2;")
176
+ conn.raw_connection.abandon_results!
177
+ end
178
+ end
179
+ end
180
+
181
+ def test_bulk_insert_with_multi_statements_disabled
182
+ run_without_connection do |orig_connection|
183
+ ActiveRecord::Base.establish_connection(
184
+ orig_connection.merge(flags: [])
185
+ )
186
+
187
+ fixtures = {
188
+ "traffic_lights" => [
189
+ { "location" => "US", "state" => ["NY"], "long_state" => ["a"] },
190
+ ]
191
+ }
192
+
193
+ assert_raises(ActiveRecord::StatementInvalid) do
194
+ conn = ActiveRecord::Base.connection
195
+ conn.execute("SELECT 1; SELECT 2;")
196
+ conn.raw_connection.abandon_results!
197
+ end
198
+
199
+ assert_difference "TrafficLight.count" do
200
+ conn = ActiveRecord::Base.connection
201
+ conn.insert_fixtures_set(fixtures)
202
+ end
203
+
204
+ assert_raises(ActiveRecord::StatementInvalid) do
205
+ conn = ActiveRecord::Base.connection
206
+ conn.execute("SELECT 1; SELECT 2;")
207
+ conn.raw_connection.abandon_results!
208
+ end
209
+ end
210
+ end
211
+
212
+ def test_insert_fixtures_set_raises_an_error_when_max_allowed_packet_is_smaller_than_fixtures_set_size
213
+ conn = ActiveRecord::Base.connection
214
+ mysql_margin = 2
215
+ packet_size = 1024
216
+ bytes_needed_to_have_a_1024_bytes_fixture = 906
217
+ fixtures = {
218
+ "traffic_lights" => [
219
+ { "location" => "US", "state" => ["NY"], "long_state" => ["a" * bytes_needed_to_have_a_1024_bytes_fixture] },
220
+ ]
221
+ }
222
+
223
+ conn.stub(:max_allowed_packet, packet_size - mysql_margin) do
224
+ error = assert_raises(ActiveRecord::ActiveRecordError) { conn.insert_fixtures_set(fixtures) }
225
+ assert_match(/Fixtures set is too large #{packet_size}\./, error.message)
226
+ end
227
+ end
228
+
229
+ def test_insert_fixture_set_when_max_allowed_packet_is_bigger_than_fixtures_set_size
230
+ conn = ActiveRecord::Base.connection
231
+ packet_size = 1024
232
+ fixtures = {
233
+ "traffic_lights" => [
234
+ { "location" => "US", "state" => ["NY"], "long_state" => ["a" * 51] },
235
+ ]
236
+ }
237
+
238
+ conn.stub(:max_allowed_packet, packet_size) do
239
+ assert_difference "TrafficLight.count" do
240
+ conn.insert_fixtures_set(fixtures)
241
+ end
242
+ end
243
+ end
244
+
245
+ def test_insert_fixtures_set_split_the_total_sql_into_two_chunks_smaller_than_max_allowed_packet
246
+ subscriber = InsertQuerySubscriber.new
247
+ subscription = ActiveSupport::Notifications.subscribe("sql.active_record", subscriber)
248
+ conn = ActiveRecord::Base.connection
249
+ packet_size = 1024
250
+ fixtures = {
251
+ "traffic_lights" => [
252
+ { "location" => "US", "state" => ["NY"], "long_state" => ["a" * 450] },
253
+ ],
254
+ "comments" => [
255
+ { "post_id" => 1, "body" => "a" * 450 },
256
+ ]
257
+ }
258
+
259
+ conn.stub(:max_allowed_packet, packet_size) do
260
+ conn.insert_fixtures_set(fixtures)
261
+
262
+ assert_equal 2, subscriber.events.size
263
+ assert_operator subscriber.events.first.bytesize, :<, packet_size
264
+ assert_operator subscriber.events.second.bytesize, :<, packet_size
265
+ end
266
+ ensure
267
+ ActiveSupport::Notifications.unsubscribe(subscription)
268
+ end
269
+
270
+ def test_insert_fixtures_set_concat_total_sql_into_a_single_packet_smaller_than_max_allowed_packet
271
+ subscriber = InsertQuerySubscriber.new
272
+ subscription = ActiveSupport::Notifications.subscribe("sql.active_record", subscriber)
273
+ conn = ActiveRecord::Base.connection
274
+ packet_size = 1024
275
+ fixtures = {
276
+ "traffic_lights" => [
277
+ { "location" => "US", "state" => ["NY"], "long_state" => ["a" * 200] },
278
+ ],
279
+ "comments" => [
280
+ { "post_id" => 1, "body" => "a" * 200 },
281
+ ]
282
+ }
283
+
284
+ conn.stub(:max_allowed_packet, packet_size) do
285
+ assert_difference ["TrafficLight.count", "Comment.count"], +1 do
286
+ conn.insert_fixtures_set(fixtures)
287
+ end
288
+ end
289
+ assert_equal 1, subscriber.events.size
290
+ ensure
291
+ ActiveSupport::Notifications.unsubscribe(subscription)
292
+ end
293
+ end
294
+
295
+ def test_auto_value_on_primary_key
296
+ fixtures = [
297
+ { "name" => "first", "wheels_count" => 2 },
298
+ { "name" => "second", "wheels_count" => 3 }
299
+ ]
300
+ conn = ActiveRecord::Base.connection
301
+ assert_nothing_raised do
302
+ conn.insert_fixtures_set({ "aircraft" => fixtures }, ["aircraft"])
303
+ end
304
+ result = conn.select_all("SELECT name, wheels_count FROM aircraft ORDER BY id")
305
+ assert_equal fixtures, result.to_a
306
+ end
307
+
57
308
  def test_broken_yaml_exception
58
- badyaml = Tempfile.new ['foo', '.yml']
59
- badyaml.write 'a: : '
309
+ badyaml = Tempfile.new ["foo", ".yml"]
310
+ badyaml.write "a: : "
60
311
  badyaml.flush
61
312
 
62
313
  dir = File.dirname badyaml.path
63
- name = File.basename badyaml.path, '.yml'
314
+ name = File.basename badyaml.path, ".yml"
64
315
  assert_raises(ActiveRecord::Fixture::FormatError) do
65
316
  ActiveRecord::FixtureSet.create_fixtures(dir, name)
66
317
  end
@@ -71,8 +322,8 @@ class FixturesTest < ActiveRecord::TestCase
71
322
 
72
323
  def test_create_fixtures
73
324
  fixtures = ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, "parrots")
74
- assert Parrot.find_by_name('Curious George'), 'George is not in the database'
75
- assert fixtures.detect { |f| f.name == 'parrots' }, "no fixtures named 'parrots' in #{fixtures.map(&:name).inspect}"
325
+ assert Parrot.find_by_name("Curious George"), "George is not in the database"
326
+ assert fixtures.detect { |f| f.name == "parrots" }, "no fixtures named 'parrots' in #{fixtures.map(&:name).inspect}"
76
327
  end
77
328
 
78
329
  def test_multiple_clean_fixtures
@@ -83,10 +334,10 @@ class FixturesTest < ActiveRecord::TestCase
83
334
  end
84
335
 
85
336
  def test_create_symbol_fixtures
86
- fixtures = ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, :collections, :collections => Course) { Course.connection }
337
+ fixtures = ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, :collections, collections: Course) { Course.connection }
87
338
 
88
- assert Course.find_by_name('Collection'), 'course is not in the database'
89
- assert fixtures.detect { |f| f.name == 'collections' }, "no fixtures named 'collections' in #{fixtures.map(&:name).inspect}"
339
+ assert Course.find_by_name("Collection"), "course is not in the database"
340
+ assert fixtures.detect { |f| f.name == "collections" }, "no fixtures named 'collections' in #{fixtures.map(&:name).inspect}"
90
341
  end
91
342
 
92
343
  def test_attributes
@@ -95,6 +346,24 @@ class FixturesTest < ActiveRecord::TestCase
95
346
  assert_nil(topics["second"]["author_email_address"])
96
347
  end
97
348
 
349
+ def test_no_args_returns_all
350
+ all_topics = topics
351
+ assert_equal 5, all_topics.length
352
+ assert_equal "The First Topic", all_topics.first["title"]
353
+ assert_equal 5, all_topics.last.id
354
+ end
355
+
356
+ def test_no_args_record_returns_all_without_array
357
+ all_binaries = binaries
358
+ assert_kind_of(Array, all_binaries)
359
+ assert_equal 2, binaries.length
360
+ end
361
+
362
+ def test_nil_raises
363
+ assert_raise(StandardError) { topics(nil) }
364
+ assert_raise(StandardError) { topics([nil]) }
365
+ end
366
+
98
367
  def test_inserts
99
368
  create_fixtures("topics")
100
369
  first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'David'")
@@ -104,64 +373,62 @@ class FixturesTest < ActiveRecord::TestCase
104
373
  assert_nil(second_row["author_email_address"])
105
374
  end
106
375
 
107
- if ActiveRecord::Base.connection.supports_migrations?
108
- def test_inserts_with_pre_and_suffix
109
- # Reset cache to make finds on the new table work
110
- ActiveRecord::FixtureSet.reset_cache
111
-
112
- ActiveRecord::Base.connection.create_table :prefix_other_topics_suffix do |t|
113
- t.column :title, :string
114
- t.column :author_name, :string
115
- t.column :author_email_address, :string
116
- t.column :written_on, :datetime
117
- t.column :bonus_time, :time
118
- t.column :last_read, :date
119
- t.column :content, :string
120
- t.column :approved, :boolean, :default => true
121
- t.column :replies_count, :integer, :default => 0
122
- t.column :parent_id, :integer
123
- t.column :type, :string, :limit => 50
124
- end
376
+ def test_inserts_with_pre_and_suffix
377
+ # Reset cache to make finds on the new table work
378
+ ActiveRecord::FixtureSet.reset_cache
125
379
 
126
- # Store existing prefix/suffix
127
- old_prefix = ActiveRecord::Base.table_name_prefix
128
- old_suffix = ActiveRecord::Base.table_name_suffix
380
+ ActiveRecord::Base.connection.create_table :prefix_other_topics_suffix do |t|
381
+ t.column :title, :string
382
+ t.column :author_name, :string
383
+ t.column :author_email_address, :string
384
+ t.column :written_on, :datetime
385
+ t.column :bonus_time, :time
386
+ t.column :last_read, :date
387
+ t.column :content, :string
388
+ t.column :approved, :boolean, default: true
389
+ t.column :replies_count, :integer, default: 0
390
+ t.column :parent_id, :integer
391
+ t.column :type, :string, limit: 50
392
+ end
129
393
 
130
- # Set a prefix/suffix we can test against
131
- ActiveRecord::Base.table_name_prefix = 'prefix_'
132
- ActiveRecord::Base.table_name_suffix = '_suffix'
394
+ # Store existing prefix/suffix
395
+ old_prefix = ActiveRecord::Base.table_name_prefix
396
+ old_suffix = ActiveRecord::Base.table_name_suffix
133
397
 
134
- other_topic_klass = Class.new(ActiveRecord::Base) do
135
- def self.name
136
- "OtherTopic"
137
- end
398
+ # Set a prefix/suffix we can test against
399
+ ActiveRecord::Base.table_name_prefix = "prefix_"
400
+ ActiveRecord::Base.table_name_suffix = "_suffix"
401
+
402
+ other_topic_klass = Class.new(ActiveRecord::Base) do
403
+ def self.name
404
+ "OtherTopic"
138
405
  end
406
+ end
139
407
 
140
- topics = [create_fixtures("other_topics")].flatten.first
408
+ topics = [create_fixtures("other_topics")].flatten.first
141
409
 
142
- # This checks for a caching problem which causes a bug in the fixtures
143
- # class-level configuration helper.
144
- assert_not_nil topics, "Fixture data inserted, but fixture objects not returned from create"
410
+ # This checks for a caching problem which causes a bug in the fixtures
411
+ # class-level configuration helper.
412
+ assert_not_nil topics, "Fixture data inserted, but fixture objects not returned from create"
145
413
 
146
- first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_other_topics_suffix WHERE author_name = 'David'")
147
- assert_not_nil first_row, "The prefix_other_topics_suffix table appears to be empty despite create_fixtures: the row with author_name = 'David' was not found"
148
- assert_equal("The First Topic", first_row["title"])
414
+ first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_other_topics_suffix WHERE author_name = 'David'")
415
+ assert_not_nil first_row, "The prefix_other_topics_suffix table appears to be empty despite create_fixtures: the row with author_name = 'David' was not found"
416
+ assert_equal("The First Topic", first_row["title"])
149
417
 
150
- second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_other_topics_suffix WHERE author_name = 'Mary'")
151
- assert_nil(second_row["author_email_address"])
418
+ second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_other_topics_suffix WHERE author_name = 'Mary'")
419
+ assert_nil(second_row["author_email_address"])
152
420
 
153
- assert_equal :prefix_other_topics_suffix, topics.table_name.to_sym
154
- # This assertion should preferably be the last in the list, because calling
155
- # other_topic_klass.table_name sets a class-level instance variable
156
- assert_equal :prefix_other_topics_suffix, other_topic_klass.table_name.to_sym
421
+ assert_equal :prefix_other_topics_suffix, topics.table_name.to_sym
422
+ # This assertion should preferably be the last in the list, because calling
423
+ # other_topic_klass.table_name sets a class-level instance variable
424
+ assert_equal :prefix_other_topics_suffix, other_topic_klass.table_name.to_sym
157
425
 
158
- ensure
159
- # Restore prefix/suffix to its previous values
160
- ActiveRecord::Base.table_name_prefix = old_prefix
161
- ActiveRecord::Base.table_name_suffix = old_suffix
426
+ ensure
427
+ # Restore prefix/suffix to its previous values
428
+ ActiveRecord::Base.table_name_prefix = old_prefix
429
+ ActiveRecord::Base.table_name_suffix = old_suffix
162
430
 
163
- ActiveRecord::Base.connection.drop_table :prefix_other_topics_suffix rescue nil
164
- end
431
+ ActiveRecord::Base.connection.drop_table :prefix_other_topics_suffix rescue nil
165
432
  end
166
433
 
167
434
  def test_insert_with_datetime
@@ -172,7 +439,7 @@ class FixturesTest < ActiveRecord::TestCase
172
439
 
173
440
  def test_logger_level_invariant
174
441
  level = ActiveRecord::Base.logger.level
175
- create_fixtures('topics')
442
+ create_fixtures("topics")
176
443
  assert_equal level, ActiveRecord::Base.logger.level
177
444
  end
178
445
 
@@ -194,35 +461,46 @@ class FixturesTest < ActiveRecord::TestCase
194
461
  end
195
462
 
196
463
  def test_empty_yaml_fixture
197
- assert_not_nil ActiveRecord::FixtureSet.new( Account.connection, "accounts", Account, FIXTURES_ROOT + "/naked/yml/accounts")
464
+ assert_not_nil ActiveRecord::FixtureSet.new(nil, "accounts", Account, FIXTURES_ROOT + "/naked/yml/accounts")
198
465
  end
199
466
 
200
467
  def test_empty_yaml_fixture_with_a_comment_in_it
201
- assert_not_nil ActiveRecord::FixtureSet.new( Account.connection, "companies", Company, FIXTURES_ROOT + "/naked/yml/companies")
468
+ assert_not_nil ActiveRecord::FixtureSet.new(nil, "companies", Company, FIXTURES_ROOT + "/naked/yml/companies")
202
469
  end
203
470
 
204
471
  def test_nonexistent_fixture_file
205
472
  nonexistent_fixture_path = FIXTURES_ROOT + "/imnothere"
206
473
 
207
- #sanity check to make sure that this file never exists
208
- assert Dir[nonexistent_fixture_path+"*"].empty?
474
+ # sanity check to make sure that this file never exists
475
+ assert_empty Dir[nonexistent_fixture_path + "*"]
209
476
 
210
477
  assert_raise(Errno::ENOENT) do
211
- ActiveRecord::FixtureSet.new( Account.connection, "companies", Company, nonexistent_fixture_path)
478
+ ActiveRecord::FixtureSet.new(nil, "companies", Company, nonexistent_fixture_path)
212
479
  end
213
480
  end
214
481
 
215
482
  def test_dirty_dirty_yaml_file
216
- assert_raise(ActiveRecord::Fixture::FormatError) do
217
- ActiveRecord::FixtureSet.new( Account.connection, "courses", Course, FIXTURES_ROOT + "/naked/yml/courses")
483
+ fixture_path = FIXTURES_ROOT + "/naked/yml/courses"
484
+ error = assert_raise(ActiveRecord::Fixture::FormatError) do
485
+ ActiveRecord::FixtureSet.new(nil, "courses", Course, fixture_path)
218
486
  end
487
+ assert_equal "fixture is not a hash: #{fixture_path}.yml", error.to_s
488
+ end
489
+
490
+ def test_yaml_file_with_one_invalid_fixture
491
+ fixture_path = FIXTURES_ROOT + "/naked/yml/courses_with_invalid_key"
492
+ error = assert_raise(ActiveRecord::Fixture::FormatError) do
493
+ ActiveRecord::FixtureSet.new(nil, "courses", Course, fixture_path)
494
+ end
495
+ assert_equal "fixture key is not a hash: #{fixture_path}.yml, keys: [\"two\"]", error.to_s
219
496
  end
220
497
 
221
498
  def test_yaml_file_with_invalid_column
222
499
  e = assert_raise(ActiveRecord::Fixture::FixtureError) do
223
500
  ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/naked/yml", "parrots")
224
501
  end
225
- assert_equal(%(table "parrots" has no column named "arrr".), e.message)
502
+
503
+ assert_equal(%(table "parrots" has no columns named "arrr", "foobar".), e.message)
226
504
  end
227
505
 
228
506
  def test_yaml_file_with_symbol_columns
@@ -231,11 +509,11 @@ class FixturesTest < ActiveRecord::TestCase
231
509
 
232
510
  def test_omap_fixtures
233
511
  assert_nothing_raised do
234
- fixtures = ActiveRecord::FixtureSet.new(Account.connection, 'categories', Category, FIXTURES_ROOT + "/categories_ordered")
512
+ fixtures = ActiveRecord::FixtureSet.new(nil, "categories", Category, FIXTURES_ROOT + "/categories_ordered")
235
513
 
236
514
  fixtures.each.with_index do |(name, fixture), i|
237
515
  assert_equal "fixture_no_#{i}", name
238
- assert_equal "Category #{i}", fixture['name']
516
+ assert_equal "Category #{i}", fixture["name"]
239
517
  end
240
518
  end
241
519
  end
@@ -251,10 +529,11 @@ class FixturesTest < ActiveRecord::TestCase
251
529
  end
252
530
 
253
531
  def test_binary_in_fixtures
254
- data = File.open(ASSETS_ROOT + "/flowers.jpg", 'rb') { |f| f.read }
255
- data.force_encoding('ASCII-8BIT')
532
+ data = File.binread(ASSETS_ROOT + "/flowers.jpg")
533
+ data.force_encoding("ASCII-8BIT")
256
534
  data.freeze
257
535
  assert_equal data, @flowers.data
536
+ assert_equal data, @binary_helper.data
258
537
  end
259
538
 
260
539
  def test_serialized_fixtures
@@ -262,8 +541,8 @@ class FixturesTest < ActiveRecord::TestCase
262
541
  end
263
542
 
264
543
  def test_fixtures_are_set_up_with_database_env_variable
265
- db_url_tmp = ENV['DATABASE_URL']
266
- ENV['DATABASE_URL'] = "sqlite3::memory:"
544
+ db_url_tmp = ENV["DATABASE_URL"]
545
+ ENV["DATABASE_URL"] = "sqlite3::memory:"
267
546
  ActiveRecord::Base.stub(:configurations, {}) do
268
547
  test_case = Class.new(ActiveRecord::TestCase) do
269
548
  fixtures :accounts
@@ -278,11 +557,11 @@ class FixturesTest < ActiveRecord::TestCase
278
557
  assert result.passed?, "Expected #{result.name} to pass:\n#{result}"
279
558
  end
280
559
  ensure
281
- ENV['DATABASE_URL'] = db_url_tmp
560
+ ENV["DATABASE_URL"] = db_url_tmp
282
561
  end
283
562
  end
284
563
 
285
- class HasManyThroughFixture < ActiveSupport::TestCase
564
+ class HasManyThroughFixture < ActiveRecord::TestCase
286
565
  def make_model(name)
287
566
  Class.new(ActiveRecord::Base) { define_singleton_method(:name) { name } }
288
567
  end
@@ -293,17 +572,17 @@ class HasManyThroughFixture < ActiveSupport::TestCase
293
572
  treasure = make_model "Treasure"
294
573
 
295
574
  pt.table_name = "parrots_treasures"
296
- pt.belongs_to :parrot, :anonymous_class => parrot
297
- pt.belongs_to :treasure, :anonymous_class => treasure
575
+ pt.belongs_to :parrot, anonymous_class: parrot
576
+ pt.belongs_to :treasure, anonymous_class: treasure
298
577
 
299
- parrot.has_many :parrot_treasures, :anonymous_class => pt
300
- parrot.has_many :treasures, :through => :parrot_treasures
578
+ parrot.has_many :parrot_treasures, anonymous_class: pt
579
+ parrot.has_many :treasures, through: :parrot_treasures
301
580
 
302
- parrots = File.join FIXTURES_ROOT, 'parrots'
581
+ parrots = File.join FIXTURES_ROOT, "parrots"
303
582
 
304
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
583
+ fs = ActiveRecord::FixtureSet.new(nil, "parrots", parrot, parrots)
305
584
  rows = fs.table_rows
306
- assert_equal load_has_and_belongs_to_many['parrots_treasures'], rows['parrots_treasures']
585
+ assert_equal load_has_and_belongs_to_many["parrots_treasures"], rows["parrots_treasures"]
307
586
  end
308
587
 
309
588
  def test_has_many_through_with_renamed_table
@@ -311,26 +590,30 @@ class HasManyThroughFixture < ActiveSupport::TestCase
311
590
  parrot = make_model "Parrot"
312
591
  treasure = make_model "Treasure"
313
592
 
314
- pt.belongs_to :parrot, :anonymous_class => parrot
315
- pt.belongs_to :treasure, :anonymous_class => treasure
593
+ pt.belongs_to :parrot, anonymous_class: parrot
594
+ pt.belongs_to :treasure, anonymous_class: treasure
316
595
 
317
- parrot.has_many :parrot_treasures, :anonymous_class => pt
318
- parrot.has_many :treasures, :through => :parrot_treasures
596
+ parrot.has_many :parrot_treasures, anonymous_class: pt
597
+ parrot.has_many :treasures, through: :parrot_treasures
319
598
 
320
- parrots = File.join FIXTURES_ROOT, 'parrots'
599
+ parrots = File.join FIXTURES_ROOT, "parrots"
321
600
 
322
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
601
+ fs = ActiveRecord::FixtureSet.new(nil, "parrots", parrot, parrots)
323
602
  rows = fs.table_rows
324
- assert_equal load_has_and_belongs_to_many['parrots_treasures'], rows['parrot_treasures']
603
+ assert_equal load_has_and_belongs_to_many["parrots_treasures"], rows["parrot_treasures"]
604
+ end
605
+
606
+ def test_has_and_belongs_to_many_order
607
+ assert_equal ["parrots", "parrots_treasures"], load_has_and_belongs_to_many.keys
325
608
  end
326
609
 
327
610
  def load_has_and_belongs_to_many
328
611
  parrot = make_model "Parrot"
329
612
  parrot.has_and_belongs_to_many :treasures
330
613
 
331
- parrots = File.join FIXTURES_ROOT, 'parrots'
614
+ parrots = File.join FIXTURES_ROOT, "parrots"
332
615
 
333
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
616
+ fs = ActiveRecord::FixtureSet.new(nil, "parrots", parrot, parrots)
334
617
  fs.table_rows
335
618
  end
336
619
  end
@@ -339,9 +622,10 @@ if Account.connection.respond_to?(:reset_pk_sequence!)
339
622
  class FixturesResetPkSequenceTest < ActiveRecord::TestCase
340
623
  fixtures :accounts
341
624
  fixtures :companies
625
+ self.use_transactional_tests = false
342
626
 
343
627
  def setup
344
- @instances = [Account.new(:credit_limit => 50), Company.new(:name => 'RoR Consulting'), Course.new(name: 'Test')]
628
+ @instances = [Account.new(credit_limit: 50), Company.new(name: "RoR Consulting"), Course.new(name: "Test")]
345
629
  ActiveRecord::FixtureSet.reset_cache # make sure tables get reinitialized
346
630
  end
347
631
 
@@ -370,7 +654,7 @@ if Account.connection.respond_to?(:reset_pk_sequence!)
370
654
  def test_create_fixtures_resets_sequences_when_not_cached
371
655
  @instances.each do |instance|
372
656
  max_id = create_fixtures(instance.class.table_name).first.fixtures.inject(0) do |_max_id, (_, fixture)|
373
- fixture_id = fixture['id'].to_i
657
+ fixture_id = fixture["id"].to_i
374
658
  fixture_id > _max_id ? fixture_id : _max_id
375
659
  end
376
660
 
@@ -387,14 +671,14 @@ class FixturesWithoutInstantiationTest < ActiveRecord::TestCase
387
671
  fixtures :topics, :developers, :accounts
388
672
 
389
673
  def test_without_complete_instantiation
390
- assert !defined?(@first)
391
- assert !defined?(@topics)
392
- assert !defined?(@developers)
393
- assert !defined?(@accounts)
674
+ assert_not defined?(@first)
675
+ assert_not defined?(@topics)
676
+ assert_not defined?(@developers)
677
+ assert_not defined?(@accounts)
394
678
  end
395
679
 
396
680
  def test_fixtures_from_root_yml_without_instantiation
397
- assert !defined?(@unknown), "@unknown is not defined"
681
+ assert_not defined?(@unknown), "@unknown is not defined"
398
682
  end
399
683
 
400
684
  def test_visibility_of_accessor_method
@@ -416,7 +700,7 @@ class FixturesWithoutInstantiationTest < ActiveRecord::TestCase
416
700
  def test_reloading_fixtures_through_accessor_methods
417
701
  topic = Struct.new(:title)
418
702
  assert_equal "The First Topic", topics(:first).title
419
- assert_called(@loaded_fixtures['topics']['first'], :find, returns: topic.new("Fresh Topic!")) do
703
+ assert_called(@loaded_fixtures["topics"]["first"], :find, returns: topic.new("Fresh Topic!")) do
420
704
  assert_equal "Fresh Topic!", topics(:first, true).title
421
705
  end
422
706
  end
@@ -429,7 +713,7 @@ class FixturesWithoutInstanceInstantiationTest < ActiveRecord::TestCase
429
713
  fixtures :topics, :developers, :accounts
430
714
 
431
715
  def test_without_instance_instantiation
432
- assert !defined?(@first), "@first is not defined"
716
+ assert_not defined?(@first), "@first is not defined"
433
717
  end
434
718
  end
435
719
 
@@ -511,13 +795,13 @@ class OverRideFixtureMethodTest < ActiveRecord::TestCase
511
795
 
512
796
  def topics(name)
513
797
  topic = super
514
- topic.title = 'omg'
798
+ topic.title = "omg"
515
799
  topic
516
800
  end
517
801
 
518
802
  def test_fixture_methods_can_be_overridden
519
803
  x = topics :first
520
- assert_equal 'omg', x.title
804
+ assert_equal "omg", x.title
521
805
  end
522
806
  end
523
807
 
@@ -525,7 +809,7 @@ class FixtureWithSetModelClassTest < ActiveRecord::TestCase
525
809
  fixtures :other_posts, :other_comments
526
810
 
527
811
  # Set to false to blow away fixtures cache and ensure our fixtures are loaded
528
- # and thus takes into account the +set_model_class+.
812
+ # and thus takes into account the `model_class` set in the fixture.
529
813
  self.use_transactional_tests = false
530
814
 
531
815
  def test_uses_fixture_class_defined_in_yaml
@@ -545,7 +829,7 @@ class SetFixtureClassPrevailsTest < ActiveRecord::TestCase
545
829
  fixtures :bad_posts
546
830
 
547
831
  # Set to false to blow away fixtures cache and ensure our fixtures are loaded
548
- # and thus takes into account the +set_model_class+.
832
+ # and thus takes into account our `set_fixture_class`.
549
833
  self.use_transactional_tests = false
550
834
 
551
835
  def test_uses_set_fixture_class
@@ -554,10 +838,10 @@ class SetFixtureClassPrevailsTest < ActiveRecord::TestCase
554
838
  end
555
839
 
556
840
  class CheckSetTableNameFixturesTest < ActiveRecord::TestCase
557
- set_fixture_class :funny_jokes => Joke
841
+ set_fixture_class funny_jokes: Joke
558
842
  fixtures :funny_jokes
559
843
  # Set to false to blow away fixtures cache and ensure our fixtures are loaded
560
- # and thus takes into account our set_fixture_class
844
+ # and thus takes into account our `set_fixture_class`.
561
845
  self.use_transactional_tests = false
562
846
 
563
847
  def test_table_method
@@ -566,10 +850,10 @@ class CheckSetTableNameFixturesTest < ActiveRecord::TestCase
566
850
  end
567
851
 
568
852
  class FixtureNameIsNotTableNameFixturesTest < ActiveRecord::TestCase
569
- set_fixture_class :items => Book
853
+ set_fixture_class items: Book
570
854
  fixtures :items
571
855
  # Set to false to blow away fixtures cache and ensure our fixtures are loaded
572
- # and thus takes into account our set_fixture_class
856
+ # and thus takes into account our `set_fixture_class`.
573
857
  self.use_transactional_tests = false
574
858
 
575
859
  def test_named_accessor
@@ -578,10 +862,10 @@ class FixtureNameIsNotTableNameFixturesTest < ActiveRecord::TestCase
578
862
  end
579
863
 
580
864
  class FixtureNameIsNotTableNameMultipleFixturesTest < ActiveRecord::TestCase
581
- set_fixture_class :items => Book, :funny_jokes => Joke
865
+ set_fixture_class items: Book, funny_jokes: Joke
582
866
  fixtures :items, :funny_jokes
583
867
  # Set to false to blow away fixtures cache and ensure our fixtures are loaded
584
- # and thus takes into account our set_fixture_class
868
+ # and thus takes into account our `set_fixture_class`.
585
869
  self.use_transactional_tests = false
586
870
 
587
871
  def test_named_accessor_of_differently_named_fixture
@@ -594,7 +878,7 @@ class FixtureNameIsNotTableNameMultipleFixturesTest < ActiveRecord::TestCase
594
878
  end
595
879
 
596
880
  class CustomConnectionFixturesTest < ActiveRecord::TestCase
597
- set_fixture_class :courses => Course
881
+ set_fixture_class courses: Course
598
882
  fixtures :courses
599
883
  self.use_transactional_tests = false
600
884
 
@@ -609,7 +893,7 @@ class CustomConnectionFixturesTest < ActiveRecord::TestCase
609
893
  end
610
894
 
611
895
  class TransactionalFixturesOnCustomConnectionTest < ActiveRecord::TestCase
612
- set_fixture_class :courses => Course
896
+ set_fixture_class courses: Course
613
897
  fixtures :courses
614
898
  self.use_transactional_tests = true
615
899
 
@@ -623,6 +907,83 @@ class TransactionalFixturesOnCustomConnectionTest < ActiveRecord::TestCase
623
907
  end
624
908
  end
625
909
 
910
+ class TransactionalFixturesOnConnectionNotification < ActiveRecord::TestCase
911
+ self.use_transactional_tests = true
912
+ self.use_instantiated_fixtures = false
913
+
914
+ def test_transaction_created_on_connection_notification
915
+ connection = Class.new do
916
+ attr_accessor :pool
917
+
918
+ def transaction_open?; end
919
+ def begin_transaction(*args); end
920
+ def rollback_transaction(*args); end
921
+ end.new
922
+
923
+ connection.pool = Class.new do
924
+ def lock_thread=(lock_thread); end
925
+ end.new
926
+
927
+ assert_called_with(connection, :begin_transaction, [joinable: false, _lazy: false]) do
928
+ fire_connection_notification(connection)
929
+ end
930
+ end
931
+
932
+ def test_notification_established_transactions_are_rolled_back
933
+ connection = Class.new do
934
+ attr_accessor :rollback_transaction_called
935
+ attr_accessor :pool
936
+
937
+ def transaction_open?; true; end
938
+ def begin_transaction(*args); end
939
+ def rollback_transaction(*args)
940
+ @rollback_transaction_called = true
941
+ end
942
+ end.new
943
+
944
+ connection.pool = Class.new do
945
+ def lock_thread=(lock_thread); end
946
+ end.new
947
+
948
+ fire_connection_notification(connection)
949
+ teardown_fixtures
950
+
951
+ assert(connection.rollback_transaction_called, "Expected <mock connection>#rollback_transaction to be called but was not")
952
+ end
953
+
954
+ def test_transaction_created_on_connection_notification_for_shard
955
+ connection = Class.new do
956
+ attr_accessor :pool
957
+
958
+ def transaction_open?; end
959
+ def begin_transaction(*args); end
960
+ def rollback_transaction(*args); end
961
+ end.new
962
+
963
+ connection.pool = Class.new do
964
+ def lock_thread=(lock_thread); end
965
+ end.new
966
+
967
+ assert_called_with(connection, :begin_transaction, [joinable: false, _lazy: false]) do
968
+ fire_connection_notification(connection, shard: :shard_two)
969
+ end
970
+ end
971
+
972
+ private
973
+ def fire_connection_notification(connection, shard: ActiveRecord::Base.default_shard)
974
+ assert_called_with(ActiveRecord::Base.connection_handler, :retrieve_connection, ["book", { shard: shard }], returns: connection) do
975
+ message_bus = ActiveSupport::Notifications.instrumenter
976
+ payload = {
977
+ spec_name: "book",
978
+ shard: shard,
979
+ config: nil,
980
+ }
981
+
982
+ message_bus.instrument("!connection.active_record", payload) { }
983
+ end
984
+ end
985
+ end
986
+
626
987
  class InvalidTableNameFixturesTest < ActiveRecord::TestCase
627
988
  fixtures :funny_jokes
628
989
  # Set to false to blow away fixtures cache and ensure our fixtures are loaded
@@ -637,10 +998,10 @@ class InvalidTableNameFixturesTest < ActiveRecord::TestCase
637
998
  end
638
999
 
639
1000
  class CheckEscapedYamlFixturesTest < ActiveRecord::TestCase
640
- set_fixture_class :funny_jokes => Joke
1001
+ set_fixture_class funny_jokes: Joke
641
1002
  fixtures :funny_jokes
642
1003
  # Set to false to blow away fixtures cache and ensure our fixtures are loaded
643
- # and thus takes into account our set_fixture_class
1004
+ # and thus takes into account our `set_fixture_class`.
644
1005
  self.use_transactional_tests = false
645
1006
 
646
1007
  def test_proper_escaped_fixture
@@ -680,7 +1041,7 @@ class FixturesBrokenRollbackTest < ActiveRecord::TestCase
680
1041
 
681
1042
  private
682
1043
  def load_fixtures(config)
683
- raise 'argh'
1044
+ raise "argh"
684
1045
  end
685
1046
  end
686
1047
 
@@ -690,7 +1051,7 @@ class LoadAllFixturesTest < ActiveRecord::TestCase
690
1051
  self.class.fixtures :all
691
1052
 
692
1053
  if File.symlink? FIXTURES_ROOT + "/all/admin"
693
- assert_equal %w(admin/accounts admin/users developers people tasks), fixture_table_names.sort
1054
+ assert_equal %w(admin/accounts admin/users developers namespaced/accounts people tasks), fixture_table_names.sort
694
1055
  end
695
1056
  ensure
696
1057
  ActiveRecord::FixtureSet.reset_cache
@@ -699,11 +1060,11 @@ end
699
1060
 
700
1061
  class LoadAllFixturesWithPathnameTest < ActiveRecord::TestCase
701
1062
  def test_all_there
702
- self.class.fixture_path = Pathname.new(FIXTURES_ROOT).join('all')
1063
+ self.class.fixture_path = Pathname.new(FIXTURES_ROOT).join("all")
703
1064
  self.class.fixtures :all
704
1065
 
705
1066
  if File.symlink? FIXTURES_ROOT + "/all/admin"
706
- assert_equal %w(admin/accounts admin/users developers people tasks), fixture_table_names.sort
1067
+ assert_equal %w(admin/accounts admin/users developers namespaced/accounts people tasks), fixture_table_names.sort
707
1068
  end
708
1069
  ensure
709
1070
  ActiveRecord::FixtureSet.reset_cache
@@ -712,7 +1073,7 @@ end
712
1073
 
713
1074
  class FasterFixturesTest < ActiveRecord::TestCase
714
1075
  self.use_transactional_tests = false
715
- fixtures :categories, :authors
1076
+ fixtures :categories, :authors, :author_addresses
716
1077
 
717
1078
  def load_extra_fixture(name)
718
1079
  fixture = create_fixtures(name).first
@@ -721,28 +1082,30 @@ class FasterFixturesTest < ActiveRecord::TestCase
721
1082
  end
722
1083
 
723
1084
  def test_cache
724
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'categories')
725
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'authors')
1085
+ assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, "categories")
1086
+ assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, "authors")
726
1087
 
727
1088
  assert_no_queries do
728
- create_fixtures('categories')
729
- create_fixtures('authors')
1089
+ create_fixtures("categories")
1090
+ create_fixtures("authors")
730
1091
  end
731
1092
 
732
- load_extra_fixture('posts')
733
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'posts')
1093
+ load_extra_fixture("posts")
1094
+ assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, "posts")
734
1095
  self.class.setup_fixture_accessors :posts
735
- assert_equal 'Welcome to the weblog', posts(:welcome).title
1096
+ assert_equal "Welcome to the weblog", posts(:welcome).title
736
1097
  end
737
1098
  end
738
1099
 
739
1100
  class FoxyFixturesTest < ActiveRecord::TestCase
1101
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
1102
+ self.use_transactional_tests = false
740
1103
  fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers,
741
1104
  :developers, :"admin/accounts", :"admin/users", :live_parrots, :dead_parrots, :books
742
1105
 
743
- if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
744
- require 'models/uuid_parent'
745
- require 'models/uuid_child'
1106
+ if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
1107
+ require "models/uuid_parent"
1108
+ require "models/uuid_child"
746
1109
  fixtures :uuid_parents, :uuid_children
747
1110
  end
748
1111
 
@@ -759,21 +1122,21 @@ class FoxyFixturesTest < ActiveRecord::TestCase
759
1122
  assert_equal 207281424, ActiveRecord::FixtureSet.identify(:ruby)
760
1123
  assert_equal 1066363776, ActiveRecord::FixtureSet.identify(:sapphire_2)
761
1124
 
762
- assert_equal 'f92b6bda-0d0d-5fe1-9124-502b18badded', ActiveRecord::FixtureSet.identify(:daddy, :uuid)
763
- assert_equal 'b4b10018-ad47-595d-b42f-d8bdaa6d01bf', ActiveRecord::FixtureSet.identify(:sonny, :uuid)
1125
+ assert_equal "f92b6bda-0d0d-5fe1-9124-502b18badded", ActiveRecord::FixtureSet.identify(:daddy, :uuid)
1126
+ assert_equal "b4b10018-ad47-595d-b42f-d8bdaa6d01bf", ActiveRecord::FixtureSet.identify(:sonny, :uuid)
764
1127
  end
765
1128
 
766
1129
  TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
767
1130
 
768
1131
  def test_populates_timestamp_columns
769
1132
  TIMESTAMP_COLUMNS.each do |property|
770
- assert_not_nil(parrots(:george).send(property), "should set #{property}")
1133
+ assert_not_nil(parrots(:george).public_send(property), "should set #{property}")
771
1134
  end
772
1135
  end
773
1136
 
774
1137
  def test_does_not_populate_timestamp_columns_if_model_has_set_record_timestamps_to_false
775
1138
  TIMESTAMP_COLUMNS.each do |property|
776
- assert_nil(ships(:black_pearl).send(property), "should not set #{property}")
1139
+ assert_nil(ships(:black_pearl).public_send(property), "should not set #{property}")
777
1140
  end
778
1141
  end
779
1142
 
@@ -781,7 +1144,7 @@ class FoxyFixturesTest < ActiveRecord::TestCase
781
1144
  last = nil
782
1145
 
783
1146
  TIMESTAMP_COLUMNS.each do |property|
784
- current = parrots(:george).send(property)
1147
+ current = parrots(:george).public_send(property)
785
1148
  last ||= current
786
1149
 
787
1150
  assert_equal(last, current)
@@ -829,13 +1192,13 @@ class FoxyFixturesTest < ActiveRecord::TestCase
829
1192
  def test_supports_inline_habtm
830
1193
  assert(parrots(:george).treasures.include?(treasures(:diamond)))
831
1194
  assert(parrots(:george).treasures.include?(treasures(:sapphire)))
832
- assert(!parrots(:george).treasures.include?(treasures(:ruby)))
1195
+ assert_not(parrots(:george).treasures.include?(treasures(:ruby)))
833
1196
  end
834
1197
 
835
1198
  def test_supports_inline_habtm_with_specified_id
836
1199
  assert(parrots(:polly).treasures.include?(treasures(:ruby)))
837
1200
  assert(parrots(:polly).treasures.include?(treasures(:sapphire)))
838
- assert(!parrots(:polly).treasures.include?(treasures(:diamond)))
1201
+ assert_not(parrots(:polly).treasures.include?(treasures(:diamond)))
839
1202
  end
840
1203
 
841
1204
  def test_supports_yaml_arrays
@@ -885,20 +1248,20 @@ class FoxyFixturesTest < ActiveRecord::TestCase
885
1248
  end
886
1249
 
887
1250
  def test_namespaced_models
888
- assert admin_accounts(:signals37).users.include?(admin_users(:david))
1251
+ assert_includes admin_accounts(:signals37).users, admin_users(:david)
889
1252
  assert_equal 2, admin_accounts(:signals37).users.size
890
1253
  end
891
1254
 
892
1255
  def test_resolves_enums
893
- assert books(:awdr).published?
894
- assert books(:awdr).read?
895
- assert books(:rfr).proposed?
896
- assert books(:ddd).published?
1256
+ assert_predicate books(:awdr), :published?
1257
+ assert_predicate books(:awdr), :read?
1258
+ assert_predicate books(:rfr), :proposed?
1259
+ assert_predicate books(:ddd), :published?
897
1260
  end
898
1261
  end
899
1262
 
900
1263
  class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
901
- fixtures :parrots
1264
+ fixtures :parrots, :pirates, :parrots_pirates, :treasures
902
1265
 
903
1266
  # This seemingly useless assertion catches a bug that caused the fixtures
904
1267
  # setup code call nil[]
@@ -910,14 +1273,14 @@ end
910
1273
  class CustomNameForFixtureOrModelTest < ActiveRecord::TestCase
911
1274
  ActiveRecord::FixtureSet.reset_cache
912
1275
 
913
- set_fixture_class :randomly_named_a9 =>
1276
+ set_fixture_class :randomly_named_a9 =>
914
1277
  ClassNameThatDoesNotFollowCONVENTIONS,
915
1278
  :'admin/randomly_named_a9' =>
916
1279
  Admin::ClassNameThatDoesNotFollowCONVENTIONS1,
917
- 'admin/randomly_named_b0' =>
1280
+ "admin/randomly_named_b0" =>
918
1281
  Admin::ClassNameThatDoesNotFollowCONVENTIONS2
919
1282
 
920
- fixtures :randomly_named_a9, 'admin/randomly_named_a9',
1283
+ fixtures :randomly_named_a9, "admin/randomly_named_a9",
921
1284
  :'admin/randomly_named_b0'
922
1285
 
923
1286
  def test_named_accessor_for_randomly_named_fixture_and_class
@@ -933,8 +1296,39 @@ class CustomNameForFixtureOrModelTest < ActiveRecord::TestCase
933
1296
  end
934
1297
 
935
1298
  def test_table_name_is_defined_in_the_model
936
- assert_equal 'randomly_named_table2', ActiveRecord::FixtureSet::all_loaded_fixtures["admin/randomly_named_a9"].table_name
937
- assert_equal 'randomly_named_table2', Admin::ClassNameThatDoesNotFollowCONVENTIONS1.table_name
1299
+ assert_equal "randomly_named_table2", ActiveRecord::FixtureSet.all_loaded_fixtures["admin/randomly_named_a9"].table_name
1300
+ assert_equal "randomly_named_table2", Admin::ClassNameThatDoesNotFollowCONVENTIONS1.table_name
1301
+ end
1302
+ end
1303
+
1304
+ class IgnoreFixturesTest < ActiveRecord::TestCase
1305
+ fixtures :other_books, :parrots
1306
+
1307
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
1308
+ # without interfering with other tests that use the same `model_class`.
1309
+ self.use_transactional_tests = false
1310
+
1311
+ test "ignores books fixtures" do
1312
+ assert_raise(StandardError) { other_books(:published) }
1313
+ assert_raise(StandardError) { other_books(:published_paperback) }
1314
+ assert_raise(StandardError) { other_books(:published_ebook) }
1315
+
1316
+ assert_equal 2, Book.count
1317
+ assert_equal "Agile Web Development with Rails", other_books(:awdr).name
1318
+ assert_equal "published", other_books(:awdr).status
1319
+ assert_equal "paperback", other_books(:awdr).format
1320
+ assert_equal "english", other_books(:awdr).language
1321
+
1322
+ assert_equal "Ruby for Rails", other_books(:rfr).name
1323
+ assert_equal "ebook", other_books(:rfr).format
1324
+ assert_equal "published", other_books(:rfr).status
1325
+ end
1326
+
1327
+ test "ignores parrots fixtures" do
1328
+ assert_raise(StandardError) { parrots(:DEFAULT) }
1329
+ assert_raise(StandardError) { parrots(:DEAD_PARROT) }
1330
+
1331
+ assert_equal "DeadParrot", parrots(:polly).parrot_sti_class
938
1332
  end
939
1333
  end
940
1334
 
@@ -962,15 +1356,15 @@ end
962
1356
 
963
1357
  class FixtureClassNamesTest < ActiveRecord::TestCase
964
1358
  def setup
965
- @saved_cache = self.fixture_class_names.dup
1359
+ @saved_cache = fixture_class_names.dup
966
1360
  end
967
1361
 
968
1362
  def teardown
969
- self.fixture_class_names.replace(@saved_cache)
1363
+ fixture_class_names.replace(@saved_cache)
970
1364
  end
971
1365
 
972
1366
  test "fixture_class_names returns nil for unregistered identifier" do
973
- assert_nil self.fixture_class_names['unregistered_identifier']
1367
+ assert_nil fixture_class_names["unregistered_identifier"]
974
1368
  end
975
1369
  end
976
1370
 
@@ -986,3 +1380,266 @@ class SameNameDifferentDatabaseFixturesTest < ActiveRecord::TestCase
986
1380
  assert_kind_of OtherDog, other_dogs(:lassie)
987
1381
  end
988
1382
  end
1383
+
1384
+ class NilFixturePathTest < ActiveRecord::TestCase
1385
+ test "raises an error when all fixtures loaded" do
1386
+ error = assert_raises(StandardError) do
1387
+ TestCase = Class.new(ActiveRecord::TestCase)
1388
+ TestCase.class_eval do
1389
+ self.fixture_path = nil
1390
+ fixtures :all
1391
+ end
1392
+ end
1393
+ assert_equal <<~MSG.squish, error.message
1394
+ No fixture path found.
1395
+ Please set `NilFixturePathTest::TestCase.fixture_path`.
1396
+ MSG
1397
+ end
1398
+ end
1399
+
1400
+ class FileFixtureConflictTest < ActiveRecord::TestCase
1401
+ def self.file_fixture_path
1402
+ FIXTURES_ROOT + "/all/admin"
1403
+ end
1404
+
1405
+ test "ignores file fixtures" do
1406
+ self.class.fixture_path = FIXTURES_ROOT + "/all"
1407
+ self.class.fixtures :all
1408
+
1409
+ assert_equal %w(developers namespaced/accounts people tasks), fixture_table_names.sort
1410
+ end
1411
+ end
1412
+
1413
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
1414
+ class MultipleFixtureConnectionsTest < ActiveRecord::TestCase
1415
+ include ActiveRecord::TestFixtures
1416
+
1417
+ fixtures :dogs
1418
+
1419
+ def setup
1420
+ @old_handler = ActiveRecord::Base.connection_handler
1421
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
1422
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(ENV["RAILS_ENV"], "readonly", readonly_config)
1423
+
1424
+ teardown_shared_connection_pool
1425
+
1426
+ handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
1427
+ ActiveRecord::Base.connection_handler = handler
1428
+ handler.establish_connection(db_config)
1429
+
1430
+ ActiveRecord::Base.connects_to(database: { writing: :default, reading: :readonly })
1431
+
1432
+ setup_shared_connection_pool
1433
+ end
1434
+
1435
+ def teardown
1436
+ ActiveRecord::Base.configurations = @prev_configs
1437
+ ActiveRecord::Base.connection_handler = @old_handler
1438
+ clean_up_connection_handler
1439
+ end
1440
+
1441
+ def test_uses_writing_connection_for_fixtures
1442
+ ActiveRecord::Base.connected_to(role: :reading) do
1443
+ Dog.first
1444
+
1445
+ assert_nothing_raised do
1446
+ ActiveRecord::Base.connected_to(role: :writing) { Dog.create! alias: "Doggo" }
1447
+ end
1448
+ end
1449
+ end
1450
+
1451
+ def test_writing_and_reading_connections_are_the_same
1452
+ handler = ActiveRecord::Base.connection_handler
1453
+ rw_conn = handler.retrieve_connection_pool("ActiveRecord::Base", role: :writing).connection
1454
+ ro_conn = handler.retrieve_connection_pool("ActiveRecord::Base", role: :reading).connection
1455
+
1456
+ assert_equal rw_conn, ro_conn
1457
+
1458
+ teardown_shared_connection_pool
1459
+
1460
+ rw_conn = handler.retrieve_connection_pool("ActiveRecord::Base", role: :writing).connection
1461
+ ro_conn = handler.retrieve_connection_pool("ActiveRecord::Base", role: :reading).connection
1462
+
1463
+ assert_not_equal rw_conn, ro_conn
1464
+ end
1465
+
1466
+ def test_writing_and_reading_connections_are_the_same_for_non_default_shards
1467
+ ActiveRecord::Base.connects_to shards: {
1468
+ default: { writing: :default, reading: :readonly },
1469
+ two: { writing: :default, reading: :readonly }
1470
+ }
1471
+
1472
+ handler = ActiveRecord::Base.connection_handler
1473
+ rw_conn = handler.retrieve_connection_pool("ActiveRecord::Base", role: :writing, shard: :two).connection
1474
+ ro_conn = handler.retrieve_connection_pool("ActiveRecord::Base", role: :reading, shard: :two).connection
1475
+
1476
+ assert_equal rw_conn, ro_conn
1477
+
1478
+ teardown_shared_connection_pool
1479
+
1480
+ rw_conn = handler.retrieve_connection_pool("ActiveRecord::Base", role: :writing, shard: :two).connection
1481
+ ro_conn = handler.retrieve_connection_pool("ActiveRecord::Base", role: :reading, shard: :two).connection
1482
+
1483
+ assert_not_equal rw_conn, ro_conn
1484
+ end
1485
+
1486
+ def test_only_existing_connections_are_replaced
1487
+ ActiveRecord::Base.connects_to shards: {
1488
+ default: { writing: :default, reading: :readonly },
1489
+ two: { writing: :default }
1490
+ }
1491
+
1492
+ setup_shared_connection_pool
1493
+
1494
+ assert_raises(ActiveRecord::ConnectionNotEstablished) do
1495
+ ActiveRecord::Base.connected_to(role: :reading, shard: :two) do
1496
+ ActiveRecord::Base.retrieve_connection
1497
+ end
1498
+ end
1499
+ end
1500
+
1501
+ def test_only_existing_connections_are_restored
1502
+ clean_up_connection_handler
1503
+ teardown_shared_connection_pool
1504
+
1505
+ assert_raises(ActiveRecord::ConnectionNotEstablished) do
1506
+ ActiveRecord::Base.connected_to(role: :reading) do
1507
+ ActiveRecord::Base.retrieve_connection
1508
+ end
1509
+ end
1510
+ end
1511
+
1512
+ private
1513
+ def config
1514
+ { "default" => default_config, "readonly" => readonly_config }
1515
+ end
1516
+
1517
+ def default_config
1518
+ { "adapter" => "sqlite3", "database" => "test/fixtures/fixture_database.sqlite3" }
1519
+ end
1520
+
1521
+ def readonly_config
1522
+ default_config.merge("replica" => true)
1523
+ end
1524
+ end
1525
+
1526
+ class MultipleFixtureLegacyConnectionsTest < ActiveRecord::TestCase
1527
+ include ActiveRecord::TestFixtures
1528
+
1529
+ fixtures :dogs
1530
+
1531
+ def setup
1532
+ @old_value = ActiveRecord::Base.legacy_connection_handling
1533
+ ActiveRecord::Base.legacy_connection_handling = true
1534
+
1535
+ @old_handler = ActiveRecord::Base.connection_handler
1536
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
1537
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(ENV["RAILS_ENV"], "readonly", readonly_config)
1538
+
1539
+ teardown_shared_connection_pool
1540
+
1541
+ handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
1542
+ ActiveRecord::Base.connection_handler = handler
1543
+ handler.establish_connection(db_config)
1544
+ ActiveRecord::Base.connection_handlers = {}
1545
+ ActiveRecord::Base.connects_to(database: { writing: :default, reading: :readonly })
1546
+
1547
+ setup_shared_connection_pool
1548
+ end
1549
+
1550
+ def teardown
1551
+ ActiveRecord::Base.configurations = @prev_configs
1552
+ ActiveRecord::Base.connection_handler = @old_handler
1553
+ clean_up_legacy_connection_handlers
1554
+ ActiveRecord::Base.legacy_connection_handling = false
1555
+ end
1556
+
1557
+ def test_uses_writing_connection_for_fixtures
1558
+ ActiveRecord::Base.connected_to(role: :reading) do
1559
+ Dog.first
1560
+
1561
+ assert_nothing_raised do
1562
+ ActiveRecord::Base.connected_to(role: :writing) { Dog.create! alias: "Doggo" }
1563
+ end
1564
+ end
1565
+ end
1566
+
1567
+ def test_writing_and_reading_connections_are_the_same_with_legacy_handling
1568
+ writing = ActiveRecord::Base.connection_handlers[:writing]
1569
+ reading = ActiveRecord::Base.connection_handlers[:reading]
1570
+
1571
+ rw_conn = writing.retrieve_connection_pool("ActiveRecord::Base").connection
1572
+ ro_conn = reading.retrieve_connection_pool("ActiveRecord::Base").connection
1573
+
1574
+ assert_equal rw_conn, ro_conn
1575
+
1576
+ teardown_shared_connection_pool
1577
+
1578
+ rw_conn = writing.retrieve_connection_pool("ActiveRecord::Base").connection
1579
+ ro_conn = reading.retrieve_connection_pool("ActiveRecord::Base").connection
1580
+
1581
+ assert_not_equal rw_conn, ro_conn
1582
+ end
1583
+
1584
+ def test_writing_and_reading_connections_are_the_same_for_non_default_shards_with_legacy_handling
1585
+ ActiveRecord::Base.connects_to shards: {
1586
+ default: { writing: :default, reading: :readonly },
1587
+ two: { writing: :default, reading: :readonly }
1588
+ }
1589
+
1590
+ writing = ActiveRecord::Base.connection_handlers[:writing]
1591
+ reading = ActiveRecord::Base.connection_handlers[:reading]
1592
+
1593
+ rw_conn = writing.retrieve_connection_pool("ActiveRecord::Base", shard: :two).connection
1594
+ ro_conn = reading.retrieve_connection_pool("ActiveRecord::Base", shard: :two).connection
1595
+
1596
+ assert_equal rw_conn, ro_conn
1597
+
1598
+ teardown_shared_connection_pool
1599
+
1600
+ rw_conn = writing.retrieve_connection_pool("ActiveRecord::Base", shard: :two).connection
1601
+ ro_conn = reading.retrieve_connection_pool("ActiveRecord::Base", shard: :two).connection
1602
+
1603
+ assert_not_equal rw_conn, ro_conn
1604
+ end
1605
+
1606
+ def test_only_existing_connections_are_replaced
1607
+ ActiveRecord::Base.connects_to shards: {
1608
+ default: { writing: :default, reading: :readonly },
1609
+ two: { writing: :default }
1610
+ }
1611
+
1612
+ setup_shared_connection_pool
1613
+
1614
+ assert_raises(ActiveRecord::ConnectionNotEstablished) do
1615
+ ActiveRecord::Base.connected_to(role: :reading, shard: :two) do
1616
+ ActiveRecord::Base.retrieve_connection
1617
+ end
1618
+ end
1619
+ end
1620
+
1621
+ def test_only_existing_connections_are_restored
1622
+ clean_up_legacy_connection_handlers
1623
+ teardown_shared_connection_pool
1624
+
1625
+ assert_raises(ActiveRecord::ConnectionNotEstablished) do
1626
+ ActiveRecord::Base.connected_to(role: :reading) do
1627
+ ActiveRecord::Base.retrieve_connection
1628
+ end
1629
+ end
1630
+ end
1631
+
1632
+ private
1633
+ def config
1634
+ { "default" => default_config, "readonly" => readonly_config }
1635
+ end
1636
+
1637
+ def default_config
1638
+ { "adapter" => "sqlite3", "database" => "test/fixtures/fixture_database.sqlite3" }
1639
+ end
1640
+
1641
+ def readonly_config
1642
+ default_config.merge("replica" => true)
1643
+ end
1644
+ end
1645
+ end