ibm_db 5.6.1 → 5.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +13 -9
  3. data/ext/extconf.rb +176 -110
  4. data/ext/ibm_db.c +60 -0
  5. data/ext/ibm_db.o +0 -0
  6. data/ext/ibm_db.so +0 -0
  7. data/ext/mkmf.log +6 -6
  8. data/ext/ruby_ibm_db_cli.c +14 -10
  9. data/ext/ruby_ibm_db_cli.h +4 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/IBM_DB.rb +2 -2
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
  13. data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
  14. data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
  15. data/test/activejob/destroy_association_async_job_test.rb +62 -0
  16. data/test/activejob/destroy_association_async_test.rb +147 -11
  17. data/test/activejob/job_runtime_test.rb +41 -0
  18. data/test/activejob/unloadable_base_job.rb +3 -0
  19. data/test/cases/active_record_schema_test.rb +196 -0
  20. data/test/cases/active_record_test.rb +21 -0
  21. data/test/cases/adapter_prevent_writes_test.rb +26 -202
  22. data/test/cases/adapter_test.rb +592 -82
  23. data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
  24. data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
  25. data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
  26. data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
  27. data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
  28. data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
  29. data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
  30. data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
  31. data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
  32. data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
  33. data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
  34. data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
  35. data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
  36. data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
  38. data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
  39. data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
  40. data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
  41. data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
  42. data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
  43. data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
  44. data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
  45. data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
  46. data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
  47. data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
  48. data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
  49. data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
  51. data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
  52. data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
  53. data/test/cases/adapters/postgresql/array_test.rb +6 -6
  54. data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
  55. data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
  56. data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
  57. data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
  58. data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
  59. data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
  60. data/test/cases/adapters/postgresql/citext_test.rb +7 -1
  61. data/test/cases/adapters/postgresql/collation_test.rb +1 -1
  62. data/test/cases/adapters/postgresql/composite_test.rb +1 -1
  63. data/test/cases/adapters/postgresql/connection_test.rb +43 -36
  64. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
  65. data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
  66. data/test/cases/adapters/postgresql/date_test.rb +2 -2
  67. data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
  69. data/test/cases/adapters/postgresql/domain_test.rb +1 -1
  70. data/test/cases/adapters/postgresql/enum_test.rb +208 -8
  71. data/test/cases/adapters/postgresql/explain_test.rb +25 -6
  72. data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
  73. data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
  74. data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
  75. data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
  76. data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
  77. data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
  78. data/test/cases/adapters/postgresql/integer_test.rb +1 -1
  79. data/test/cases/adapters/postgresql/interval_test.rb +9 -17
  80. data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
  81. data/test/cases/adapters/postgresql/json_test.rb +5 -0
  82. data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
  83. data/test/cases/adapters/postgresql/money_test.rb +17 -9
  84. data/test/cases/adapters/postgresql/network_test.rb +13 -1
  85. data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
  86. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
  87. data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
  88. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
  89. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
  90. data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
  91. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
  92. data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
  93. data/test/cases/adapters/postgresql/range_test.rb +185 -21
  94. data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
  95. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
  96. data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
  97. data/test/cases/adapters/postgresql/schema_test.rb +270 -20
  98. data/test/cases/adapters/postgresql/serial_test.rb +5 -5
  99. data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
  100. data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
  101. data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
  102. data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
  103. data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
  104. data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
  105. data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
  106. data/test/cases/adapters/postgresql/xml_test.rb +1 -1
  107. data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
  108. data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
  109. data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
  110. data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
  111. data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
  112. data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
  113. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
  114. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
  115. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
  116. data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
  117. data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
  118. data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
  119. data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
  120. data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
  121. data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
  122. data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
  123. data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
  124. data/test/cases/aggregations_test.rb +16 -0
  125. data/test/cases/annotate_test.rb +14 -12
  126. data/test/cases/arel/attributes/attribute_test.rb +86 -47
  127. data/test/cases/arel/collectors/bind_test.rb +1 -1
  128. data/test/cases/arel/collectors/composite_test.rb +11 -1
  129. data/test/cases/arel/collectors/sql_string_test.rb +1 -1
  130. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
  131. data/test/cases/arel/delete_manager_test.rb +0 -6
  132. data/test/cases/arel/factory_methods_test.rb +45 -0
  133. data/test/cases/arel/insert_manager_test.rb +1 -7
  134. data/test/cases/arel/nodes/as_test.rb +12 -0
  135. data/test/cases/arel/nodes/ascending_test.rb +1 -1
  136. data/test/cases/arel/nodes/bin_test.rb +1 -1
  137. data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
  138. data/test/cases/arel/nodes/cte_test.rb +46 -0
  139. data/test/cases/arel/nodes/descending_test.rb +1 -1
  140. data/test/cases/arel/nodes/equality_test.rb +3 -3
  141. data/test/cases/arel/nodes/filter_test.rb +37 -0
  142. data/test/cases/arel/nodes/fragments_test.rb +38 -0
  143. data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
  144. data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
  145. data/test/cases/arel/nodes/node_test.rb +1 -1
  146. data/test/cases/arel/nodes/or_test.rb +2 -2
  147. data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
  148. data/test/cases/arel/nodes/table_alias_test.rb +12 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
  150. data/test/cases/arel/nodes/update_statement_test.rb +4 -0
  151. data/test/cases/arel/nodes_test.rb +3 -2
  152. data/test/cases/arel/select_manager_test.rb +12 -12
  153. data/test/cases/arel/support/fake_record.rb +22 -17
  154. data/test/cases/arel/table_test.rb +15 -25
  155. data/test/cases/arel/update_manager_test.rb +51 -6
  156. data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
  157. data/test/cases/arel/visitors/dot_test.rb +177 -2
  158. data/test/cases/arel/visitors/mysql_test.rb +49 -1
  159. data/test/cases/arel/visitors/postgres_test.rb +1 -31
  160. data/test/cases/arel/visitors/sqlite_test.rb +1 -1
  161. data/test/cases/arel/visitors/to_sql_test.rb +330 -20
  162. data/test/cases/assertions/query_assertions_test.rb +136 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +502 -41
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
  165. data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
  166. data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
  167. data/test/cases/associations/eager_singularization_test.rb +1 -1
  168. data/test/cases/associations/eager_test.rb +255 -93
  169. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
  170. data/test/cases/associations/has_many_associations_test.rb +282 -72
  171. data/test/cases/associations/has_many_through_associations_test.rb +172 -45
  172. data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
  173. data/test/cases/associations/has_one_associations_test.rb +160 -29
  174. data/test/cases/associations/has_one_through_associations_test.rb +64 -15
  175. data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
  176. data/test/cases/associations/inner_join_association_test.rb +36 -6
  177. data/test/cases/associations/inverse_associations_test.rb +177 -40
  178. data/test/cases/associations/join_model_test.rb +17 -12
  179. data/test/cases/associations/left_outer_join_association_test.rb +14 -3
  180. data/test/cases/associations/nested_error_test.rb +116 -0
  181. data/test/cases/associations/nested_through_associations_test.rb +54 -19
  182. data/test/cases/associations/required_test.rb +1 -1
  183. data/test/cases/associations_test.rb +1278 -21
  184. data/test/cases/asynchronous_queries_test.rb +310 -0
  185. data/test/cases/attribute_methods/read_test.rb +6 -0
  186. data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
  187. data/test/cases/attribute_methods_test.rb +565 -46
  188. data/test/cases/attributes_test.rb +42 -1
  189. data/test/cases/autosave_association_test.rb +645 -92
  190. data/test/cases/base_prevent_writes_test.rb +28 -159
  191. data/test/cases/base_test.rb +434 -209
  192. data/test/cases/batches_test.rb +441 -57
  193. data/test/cases/binary_test.rb +31 -0
  194. data/test/cases/bind_parameter_test.rb +107 -16
  195. data/test/cases/cache_key_test.rb +7 -7
  196. data/test/cases/calculations_test.rb +541 -110
  197. data/test/cases/callbacks_test.rb +0 -1
  198. data/test/cases/clone_test.rb +5 -4
  199. data/test/cases/coders/yaml_column_test.rb +97 -2
  200. data/test/cases/collection_cache_key_test.rb +24 -16
  201. data/test/cases/column_alias_test.rb +2 -8
  202. data/test/cases/column_definition_test.rb +12 -3
  203. data/test/cases/comment_test.rb +23 -26
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
  205. data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
  210. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
  211. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
  212. data/test/cases/connection_adapters/registration_test.rb +98 -0
  213. data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
  214. data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
  215. data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
  216. data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
  217. data/test/cases/connection_handling_test.rb +210 -0
  218. data/test/cases/connection_management_test.rb +44 -7
  219. data/test/cases/connection_pool_test.rb +466 -99
  220. data/test/cases/core_test.rb +167 -9
  221. data/test/cases/counter_cache_test.rb +129 -2
  222. data/test/cases/custom_locking_test.rb +3 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +149 -13
  224. data/test/cases/database_configurations/resolver_test.rb +14 -10
  225. data/test/cases/database_configurations/url_config_test.rb +53 -0
  226. data/test/cases/database_configurations_test.rb +86 -43
  227. data/test/cases/database_selector_test.rb +30 -8
  228. data/test/cases/database_statements_test.rb +10 -14
  229. data/test/cases/date_time_precision_test.rb +141 -11
  230. data/test/cases/date_time_test.rb +19 -1
  231. data/test/cases/defaults_test.rb +107 -41
  232. data/test/cases/delegated_type_test.rb +69 -9
  233. data/test/cases/dirty_test.rb +82 -25
  234. data/test/cases/disconnected_test.rb +10 -9
  235. data/test/cases/dup_test.rb +26 -6
  236. data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
  237. data/test/cases/encryption/cipher_test.rb +65 -0
  238. data/test/cases/encryption/concurrency_test.rb +27 -0
  239. data/test/cases/encryption/config_test.rb +21 -0
  240. data/test/cases/encryption/configurable_test.rb +93 -0
  241. data/test/cases/encryption/contexts_test.rb +105 -0
  242. data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
  243. data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
  244. data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
  245. data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
  246. data/test/cases/encryption/encryptable_record_test.rb +470 -0
  247. data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
  248. data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
  249. data/test/cases/encryption/encryption_schemes_test.rb +240 -0
  250. data/test/cases/encryption/encryptor_test.rb +113 -0
  251. data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
  252. data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
  253. data/test/cases/encryption/helper.rb +152 -0
  254. data/test/cases/encryption/key_generator_test.rb +55 -0
  255. data/test/cases/encryption/key_provider_test.rb +57 -0
  256. data/test/cases/encryption/key_test.rb +17 -0
  257. data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
  258. data/test/cases/encryption/message_serializer_test.rb +82 -0
  259. data/test/cases/encryption/message_test.rb +43 -0
  260. data/test/cases/encryption/null_encryptor_test.rb +21 -0
  261. data/test/cases/encryption/properties_test.rb +69 -0
  262. data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
  263. data/test/cases/encryption/scheme_test.rb +58 -0
  264. data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
  265. data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
  266. data/test/cases/enum_test.rb +374 -72
  267. data/test/cases/errors_test.rb +7 -4
  268. data/test/cases/excluding_test.rb +116 -0
  269. data/test/cases/explain_subscriber_test.rb +6 -1
  270. data/test/cases/explain_test.rb +119 -10
  271. data/test/cases/filter_attributes_test.rb +7 -14
  272. data/test/cases/finder_respond_to_test.rb +3 -3
  273. data/test/cases/finder_test.rb +357 -72
  274. data/test/cases/fixture_set/file_test.rb +9 -0
  275. data/test/cases/fixtures_test.rb +426 -190
  276. data/test/cases/helper.rb +66 -192
  277. data/test/cases/hot_compatibility_test.rb +10 -10
  278. data/test/cases/inheritance_test.rb +51 -61
  279. data/test/cases/inherited_test.rb +40 -0
  280. data/test/cases/insert_all_test.rb +419 -9
  281. data/test/cases/instrumentation_test.rb +202 -30
  282. data/test/cases/integration_test.rb +25 -7
  283. data/test/cases/invalid_connection_test.rb +5 -5
  284. data/test/cases/invertible_migration_test.rb +108 -24
  285. data/test/cases/json_attribute_test.rb +1 -0
  286. data/test/cases/json_serialization_test.rb +5 -5
  287. data/test/cases/json_shared_test_cases.rb +5 -9
  288. data/test/cases/locking_test.rb +67 -31
  289. data/test/cases/log_subscriber_test.rb +17 -15
  290. data/test/cases/marshal_serialization_test.rb +78 -5
  291. data/test/cases/message_pack_test.rb +91 -0
  292. data/test/cases/migration/change_schema_test.rb +77 -46
  293. data/test/cases/migration/change_table_test.rb +129 -114
  294. data/test/cases/migration/check_constraint_test.rb +192 -10
  295. data/test/cases/migration/column_attributes_test.rb +4 -9
  296. data/test/cases/migration/column_positioning_test.rb +2 -2
  297. data/test/cases/migration/columns_test.rb +118 -4
  298. data/test/cases/migration/command_recorder_test.rb +181 -14
  299. data/test/cases/migration/compatibility_test.rb +883 -196
  300. data/test/cases/migration/create_join_table_test.rb +8 -1
  301. data/test/cases/migration/exclusion_constraint_test.rb +192 -0
  302. data/test/cases/migration/foreign_key_test.rb +356 -14
  303. data/test/cases/migration/helper.rb +4 -1
  304. data/test/cases/migration/index_test.rb +67 -2
  305. data/test/cases/migration/invalid_options_test.rb +129 -0
  306. data/test/cases/migration/logger_test.rb +7 -4
  307. data/test/cases/migration/pending_migrations_test.rb +103 -60
  308. data/test/cases/migration/references_foreign_key_test.rb +73 -4
  309. data/test/cases/migration/references_index_test.rb +25 -27
  310. data/test/cases/migration/references_statements_test.rb +27 -3
  311. data/test/cases/migration/rename_table_test.rb +39 -54
  312. data/test/cases/migration/schema_definitions_test.rb +109 -0
  313. data/test/cases/migration/unique_constraint_test.rb +248 -0
  314. data/test/cases/migration_test.rb +677 -220
  315. data/test/cases/migrator_test.rb +102 -75
  316. data/test/cases/multi_db_migrator_test.rb +55 -34
  317. data/test/cases/multiparameter_attributes_test.rb +26 -29
  318. data/test/cases/multiple_db_test.rb +42 -19
  319. data/test/cases/nested_attributes_test.rb +124 -6
  320. data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
  321. data/test/cases/normalized_attribute_test.rb +117 -0
  322. data/test/cases/null_relation_test.rb +35 -2
  323. data/test/cases/persistence/reload_association_cache_test.rb +20 -0
  324. data/test/cases/persistence_test.rb +629 -22
  325. data/test/cases/pooled_connections_test.rb +57 -56
  326. data/test/cases/prepared_statement_status_test.rb +8 -3
  327. data/test/cases/primary_class_test.rb +134 -0
  328. data/test/cases/primary_keys_test.rb +171 -55
  329. data/test/cases/query_cache_test.rb +558 -263
  330. data/test/cases/query_logs_test.rb +293 -0
  331. data/test/cases/quoting_test.rb +39 -72
  332. data/test/cases/readonly_test.rb +50 -12
  333. data/test/cases/reaper_test.rb +22 -6
  334. data/test/cases/reflection_test.rb +207 -9
  335. data/test/cases/relation/and_test.rb +43 -0
  336. data/test/cases/relation/delegation_test.rb +32 -5
  337. data/test/cases/relation/delete_all_test.rb +27 -6
  338. data/test/cases/relation/field_ordered_values_test.rb +128 -0
  339. data/test/cases/relation/load_async_test.rb +650 -0
  340. data/test/cases/relation/merging_test.rb +80 -109
  341. data/test/cases/relation/mutation_test.rb +12 -7
  342. data/test/cases/relation/or_test.rb +11 -8
  343. data/test/cases/relation/order_test.rb +90 -0
  344. data/test/cases/relation/predicate_builder_test.rb +21 -6
  345. data/test/cases/relation/select_test.rb +162 -3
  346. data/test/cases/relation/structural_compatibility_test.rb +38 -0
  347. data/test/cases/relation/update_all_test.rb +81 -27
  348. data/test/cases/relation/where_chain_test.rb +190 -3
  349. data/test/cases/relation/where_clause_test.rb +43 -1
  350. data/test/cases/relation/where_test.rb +95 -7
  351. data/test/cases/relation/with_test.rb +165 -0
  352. data/test/cases/relation_test.rb +42 -37
  353. data/test/cases/relations_test.rb +436 -138
  354. data/test/cases/reload_models_test.rb +18 -14
  355. data/test/cases/reserved_word_test.rb +2 -1
  356. data/test/cases/result_test.rb +14 -22
  357. data/test/cases/sanitize_test.rb +89 -27
  358. data/test/cases/schema_dumper_test.rb +535 -62
  359. data/test/cases/scoping/default_scoping_test.rb +219 -35
  360. data/test/cases/scoping/named_scoping_test.rb +25 -46
  361. data/test/cases/scoping/relation_scoping_test.rb +112 -4
  362. data/test/cases/secure_password_test.rb +108 -0
  363. data/test/cases/secure_token_test.rb +72 -0
  364. data/test/cases/serialization_test.rb +1 -1
  365. data/test/cases/serialized_attribute_test.rb +305 -60
  366. data/test/cases/shard_keys_test.rb +125 -0
  367. data/test/cases/shard_selector_test.rb +45 -0
  368. data/test/cases/signed_id_test.rb +57 -5
  369. data/test/cases/statement_cache_test.rb +31 -30
  370. data/test/cases/statement_invalid_test.rb +8 -4
  371. data/test/cases/store_test.rb +73 -9
  372. data/test/cases/strict_loading_test.rb +327 -13
  373. data/test/cases/table_metadata_test.rb +16 -0
  374. data/test/cases/tasks/database_tasks_test.rb +517 -244
  375. data/test/cases/test_case.rb +254 -60
  376. data/test/cases/test_case_test.rb +69 -0
  377. data/test/cases/test_databases_test.rb +7 -3
  378. data/test/cases/test_fixtures_test.rb +19 -40
  379. data/test/cases/time_precision_test.rb +17 -5
  380. data/test/cases/timestamp_test.rb +124 -16
  381. data/test/cases/token_for_test.rb +165 -0
  382. data/test/cases/touch_later_test.rb +43 -1
  383. data/test/cases/transaction_callbacks_test.rb +325 -8
  384. data/test/cases/transaction_instrumentation_test.rb +453 -0
  385. data/test/cases/transaction_isolation_test.rb +12 -8
  386. data/test/cases/transactions_test.rb +629 -112
  387. data/test/cases/type/date_time_test.rb +7 -1
  388. data/test/cases/type/time_test.rb +9 -0
  389. data/test/cases/type/type_map_test.rb +108 -73
  390. data/test/cases/type/unsigned_integer_test.rb +12 -0
  391. data/test/cases/type_caster/connection_test.rb +19 -0
  392. data/test/cases/type_test.rb +1 -1
  393. data/test/cases/unconnected_test.rb +7 -7
  394. data/test/cases/unsafe_raw_sql_test.rb +39 -8
  395. data/test/cases/validations/absence_validation_test.rb +1 -1
  396. data/test/cases/validations/association_validation_test.rb +25 -3
  397. data/test/cases/validations/numericality_validation_test.rb +3 -9
  398. data/test/cases/validations/presence_validation_test.rb +1 -1
  399. data/test/cases/validations/uniqueness_validation_test.rb +280 -40
  400. data/test/cases/validations_test.rb +2 -2
  401. data/test/cases/view_test.rb +33 -22
  402. data/test/cases/yaml_serialization_test.rb +23 -17
  403. data/test/config.example.yml +58 -56
  404. data/test/config.rb +1 -0
  405. data/test/fixtures/1_need_quoting.yml +2 -0
  406. data/test/fixtures/accounts.yml +5 -0
  407. data/test/fixtures/aircrafts.yml +7 -0
  408. data/test/fixtures/book_identifiers.yml +11 -0
  409. data/test/fixtures/books.yml +5 -4
  410. data/test/fixtures/cake_designers.yml +5 -0
  411. data/test/fixtures/cars.yml +6 -0
  412. data/test/fixtures/chefs.yml +5 -0
  413. data/test/fixtures/clothing_items.yml +23 -0
  414. data/test/fixtures/clubs.yml +1 -1
  415. data/test/fixtures/comments.yml +2 -1
  416. data/test/fixtures/cpk_authors.yml +8 -0
  417. data/test/fixtures/cpk_books.yml +21 -0
  418. data/test/fixtures/cpk_order_agreements.yml +13 -0
  419. data/test/fixtures/cpk_order_tags.yml +15 -0
  420. data/test/fixtures/cpk_orders.yml +11 -0
  421. data/test/fixtures/cpk_posts.yml +12 -0
  422. data/test/fixtures/cpk_reviews.yml +13 -0
  423. data/test/fixtures/cpk_tags.yml +11 -0
  424. data/test/fixtures/drink_designers.yml +5 -0
  425. data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
  426. data/test/fixtures/encrypted_books.yml +4 -0
  427. data/test/fixtures/fk_object_to_point_to.yml +2 -0
  428. data/test/fixtures/memberships.yml +15 -15
  429. data/test/fixtures/paragraphs.yml +5 -0
  430. data/test/fixtures/parrots.yml +4 -0
  431. data/test/fixtures/people.yml +2 -0
  432. data/test/fixtures/pirates.yml +2 -2
  433. data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
  434. data/test/fixtures/references.yml +3 -3
  435. data/test/fixtures/sharded_blog_posts.yml +14 -0
  436. data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
  437. data/test/fixtures/sharded_blogs.yml +8 -0
  438. data/test/fixtures/sharded_comments.yml +22 -0
  439. data/test/fixtures/sharded_tags.yml +34 -0
  440. data/test/fixtures/sponsors.yml +2 -2
  441. data/test/fixtures/topics.yml +1 -0
  442. data/test/fixtures/treasures.yml +4 -0
  443. data/test/fixtures/virtual_columns.yml +5 -0
  444. data/test/fixtures/warehouse_things.yml +1 -1
  445. data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
  446. data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
  447. data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
  448. data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
  449. data/test/migrations/scope/1_unscoped.rb +7 -0
  450. data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
  451. data/test/models/admin/user.rb +2 -0
  452. data/test/models/admin/user_json.rb +48 -0
  453. data/test/models/attachment.rb +7 -0
  454. data/test/models/author.rb +70 -3
  455. data/test/models/author_encrypted.rb +16 -0
  456. data/test/models/bird.rb +1 -1
  457. data/test/models/book.rb +18 -11
  458. data/test/models/book_destroy_async.rb +1 -1
  459. data/test/models/book_encrypted.rb +106 -0
  460. data/test/models/book_identifier.rb +5 -0
  461. data/test/models/branch.rb +11 -0
  462. data/test/models/bulb.rb +1 -1
  463. data/test/models/car.rb +8 -1
  464. data/test/models/cat.rb +1 -1
  465. data/test/models/category.rb +3 -1
  466. data/test/models/chat_message.rb +8 -0
  467. data/test/models/chef.rb +52 -0
  468. data/test/models/clothing_item.rb +12 -0
  469. data/test/models/club.rb +4 -1
  470. data/test/models/comment.rb +7 -4
  471. data/test/models/comment_overlapping_counter_cache.rb +15 -0
  472. data/test/models/company.rb +16 -2
  473. data/test/models/computer.rb +1 -0
  474. data/test/models/contact.rb +3 -3
  475. data/test/models/contract.rb +5 -1
  476. data/test/models/cpk/author.rb +9 -0
  477. data/test/models/cpk/book.rb +55 -0
  478. data/test/models/cpk/book_destroy_async.rb +9 -0
  479. data/test/models/cpk/car.rb +9 -0
  480. data/test/models/cpk/car_review.rb +9 -0
  481. data/test/models/cpk/chapter.rb +16 -0
  482. data/test/models/cpk/chapter_destroy_async.rb +10 -0
  483. data/test/models/cpk/comment.rb +9 -0
  484. data/test/models/cpk/order.rb +55 -0
  485. data/test/models/cpk/order_agreement.rb +10 -0
  486. data/test/models/cpk/order_tag.rb +10 -0
  487. data/test/models/cpk/post.rb +10 -0
  488. data/test/models/cpk/posts_tag.rb +10 -0
  489. data/test/models/cpk/review.rb +9 -0
  490. data/test/models/cpk/tag.rb +10 -0
  491. data/test/models/cpk.rb +15 -0
  492. data/test/models/customer.rb +3 -1
  493. data/test/models/destroy_async_parent.rb +1 -1
  494. data/test/models/developer.rb +44 -3
  495. data/test/models/discount.rb +4 -0
  496. data/test/models/drink_designer.rb +1 -0
  497. data/test/models/editor.rb +8 -0
  498. data/test/models/editorship.rb +6 -0
  499. data/test/models/entry.rb +5 -0
  500. data/test/models/essay.rb +6 -1
  501. data/test/models/essay_destroy_async.rb +1 -0
  502. data/test/models/eye.rb +87 -21
  503. data/test/models/face.rb +1 -1
  504. data/test/models/friendship.rb +3 -0
  505. data/test/models/hardback.rb +7 -0
  506. data/test/models/hotel.rb +2 -0
  507. data/test/models/human.rb +2 -2
  508. data/test/models/invoice.rb +2 -1
  509. data/test/models/invokes_an_undefined_method.rb +5 -0
  510. data/test/models/line_item.rb +6 -0
  511. data/test/models/member.rb +9 -4
  512. data/test/models/membership.rb +2 -2
  513. data/test/models/message.rb +2 -1
  514. data/test/models/need_quoting.rb +5 -0
  515. data/test/models/paragraph.rb +5 -0
  516. data/test/models/parrot.rb +6 -3
  517. data/test/models/person.rb +7 -4
  518. data/test/models/pirate.rb +4 -1
  519. data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
  520. data/test/models/post.rb +65 -2
  521. data/test/models/post_encrypted.rb +15 -0
  522. data/test/models/post_with_prefetched_pk.rb +15 -0
  523. data/test/models/project.rb +1 -0
  524. data/test/models/publication.rb +16 -0
  525. data/test/models/raises_argument_error.rb +5 -0
  526. data/test/models/raises_no_method_error.rb +5 -0
  527. data/test/models/recipient.rb +5 -0
  528. data/test/models/reference.rb +1 -1
  529. data/test/models/reply.rb +1 -1
  530. data/test/models/room.rb +3 -0
  531. data/test/models/sharded/blog.rb +12 -0
  532. data/test/models/sharded/blog_post.rb +17 -0
  533. data/test/models/sharded/blog_post_destroy_async.rb +14 -0
  534. data/test/models/sharded/blog_post_tag.rb +11 -0
  535. data/test/models/sharded/blog_post_with_revision.rb +11 -0
  536. data/test/models/sharded/comment.rb +12 -0
  537. data/test/models/sharded/comment_destroy_async.rb +12 -0
  538. data/test/models/sharded/tag.rb +11 -0
  539. data/test/models/sharded.rb +8 -0
  540. data/test/models/ship.rb +1 -1
  541. data/test/models/shipping_line.rb +11 -0
  542. data/test/models/subscriber.rb +1 -0
  543. data/test/models/subscription.rb +3 -1
  544. data/test/models/too_long_table_name.rb +5 -0
  545. data/test/models/topic.rb +3 -1
  546. data/test/models/traffic_light.rb +2 -2
  547. data/test/models/traffic_light_encrypted.rb +21 -0
  548. data/test/models/translation.rb +9 -0
  549. data/test/models/treasure.rb +1 -1
  550. data/test/models/tyre.rb +1 -1
  551. data/test/models/user.rb +16 -0
  552. data/test/models/user_with_invalid_relation.rb +28 -0
  553. data/test/models/uuid_comment.rb +5 -0
  554. data/test/models/uuid_entry.rb +5 -0
  555. data/test/models/uuid_message.rb +5 -0
  556. data/test/models/zine.rb +2 -1
  557. data/test/schema/mysql2_specific_schema.rb +26 -12
  558. data/test/schema/postgresql_specific_schema.rb +121 -13
  559. data/test/schema/schema.rb +361 -103
  560. data/test/schema/sqlite_specific_schema.rb +17 -6
  561. data/test/schema/trilogy_specific_schema.rb +96 -0
  562. data/test/support/adapter_helper.rb +104 -0
  563. data/test/support/async_helper.rb +15 -0
  564. data/test/support/config.rb +1 -1
  565. data/test/support/connection.rb +14 -2
  566. data/test/support/ddl_helper.rb +1 -1
  567. data/test/support/fake_adapter.rb +42 -0
  568. data/test/support/load_schema_helper.rb +22 -0
  569. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
  570. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
  571. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
  572. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
  573. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
  574. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
  575. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
  576. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
  577. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
  578. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
  579. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
  580. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
  581. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
  582. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
  583. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
  584. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
  585. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
  586. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
  587. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
  588. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
  589. data/test/support/schema_dumping_helper.rb +15 -9
  590. data/test/support/tools.rb +37 -0
  591. data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
  592. metadata +247 -15
@@ -4,6 +4,7 @@ require "cases/helper"
4
4
  require "models/person"
5
5
  require "models/topic"
6
6
  require "pp"
7
+ require "models/cpk"
7
8
 
8
9
  class NonExistentTable < ActiveRecord::Base; end
9
10
 
@@ -18,16 +19,26 @@ class CoreTest < ActiveRecord::TestCase
18
19
 
19
20
  def test_inspect_instance
20
21
  topic = topics(:first)
21
- assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:inspect)}", bonus_time: "#{topic.bonus_time.to_s(:inspect)}", last_read: "#{topic.last_read.to_s(:inspect)}", content: "Have a nice day", important: nil, approved: false, replies_count: 1, unique_replies_count: 0, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "#{topic.created_at.to_s(:inspect)}", updated_at: "#{topic.updated_at.to_s(:inspect)}">), topic.inspect
22
+ assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_fs(:inspect)}", bonus_time: "#{topic.bonus_time.to_fs(:inspect)}", last_read: "#{topic.last_read.to_fs(:inspect)}", content: "Have a nice day", important: nil, binary_content: nil, approved: false, replies_count: 1, unique_replies_count: 0, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "#{topic.created_at.to_fs(:inspect)}", updated_at: "#{topic.updated_at.to_fs(:inspect)}">), topic.inspect
23
+ end
24
+
25
+ def test_inspect_includes_attributes_from_attributes_for_inspect
26
+ Topic.stub(:attributes_for_inspect, [:id, :title, :author_name]) do
27
+ topic = topics(:first)
28
+
29
+ assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David">), topic.inspect
30
+ end
22
31
  end
23
32
 
24
33
  def test_inspect_instance_with_lambda_date_formatter
25
34
  before = Time::DATE_FORMATS[:inspect]
26
- Time::DATE_FORMATS[:inspect] = ->(date) { "my_format" }
27
- topic = topics(:first)
28
35
 
29
- assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "my_format", bonus_time: "my_format", last_read: "2004-04-15", content: "Have a nice day", important: nil, approved: false, replies_count: 1, unique_replies_count: 0, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "my_format", updated_at: "my_format">), topic.inspect
36
+ Topic.stub(:attributes_for_inspect, [:id, :last_read]) do
37
+ Time::DATE_FORMATS[:inspect] = ->(date) { "my_format" }
38
+ topic = topics(:first)
30
39
 
40
+ assert_equal %(#<Topic id: 1, last_read: "2004-04-15">), topic.inspect
41
+ end
31
42
  ensure
32
43
  Time::DATE_FORMATS[:inspect] = before
33
44
  end
@@ -36,9 +47,15 @@ class CoreTest < ActiveRecord::TestCase
36
47
  assert_match(/Topic id: nil/, Topic.new.inspect)
37
48
  end
38
49
 
50
+ def test_inspect_singleton_instance
51
+ assert_match(/#<Class:#<Topic:\w+>>/, Topic.new.singleton_class.inspect)
52
+ end
53
+
39
54
  def test_inspect_limited_select_instance
40
- assert_equal %(#<Topic id: 1>), Topic.all.merge!(select: "id", where: "id = 1").first.inspect
41
- assert_equal %(#<Topic id: 1, title: "The First Topic">), Topic.all.merge!(select: "id, title", where: "id = 1").first.inspect
55
+ Topic.stub(:attributes_for_inspect, [:id, :title]) do
56
+ assert_equal %(#<Topic id: 1>), Topic.all.merge!(select: "id", where: "id = 1").first.inspect
57
+ assert_equal %(#<Topic id: 1, title: "The First Topic">), Topic.all.merge!(select: "id, title", where: "id = 1").first.inspect
58
+ end
42
59
  end
43
60
 
44
61
  def test_inspect_instance_with_non_primary_key_id_attribute
@@ -50,6 +67,45 @@ class CoreTest < ActiveRecord::TestCase
50
67
  assert_equal "NonExistentTable(Table doesn't exist)", NonExistentTable.inspect
51
68
  end
52
69
 
70
+ def test_inspect_with_attributes_for_inspect_all_lists_all_attributes
71
+ Topic.stub(:attributes_for_inspect, :all) do
72
+ topic = topics(:first)
73
+
74
+ assert_equal <<~STRING.squish, topic.inspect
75
+ #<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_fs(:inspect)}", bonus_time: "#{topic.bonus_time.to_fs(:inspect)}", last_read: "#{topic.last_read.to_fs(:inspect)}", content: "Have a nice day", important: nil, binary_content: nil, approved: false, replies_count: 1, unique_replies_count: 0, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "#{topic.created_at.to_fs(:inspect)}", updated_at: "#{topic.updated_at.to_fs(:inspect)}">
76
+ STRING
77
+ end
78
+ end
79
+
80
+ def test_inspect_relation_with_virtual_field
81
+ relation = Topic.limit(1).select("1 as virtual_field")
82
+ assert_match(/virtual_field: 1/, relation.first.full_inspect)
83
+ end
84
+
85
+ def test_inspect_with_overridden_attribute_for_inspect
86
+ topic = topics(:first)
87
+
88
+ topic.instance_eval do
89
+ def attribute_for_inspect(attr_name)
90
+ if attr_name == "title"
91
+ title.upcase.inspect
92
+ else
93
+ super
94
+ end
95
+ end
96
+ end
97
+
98
+ assert_match(/title: "THE FIRST TOPIC"/, topic.full_inspect)
99
+ end
100
+
101
+ def test_full_inspect_lists_all_attributes
102
+ topic = topics(:first)
103
+
104
+ assert_equal <<~STRING.squish, topic.full_inspect
105
+ #<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_fs(:inspect)}", bonus_time: "#{topic.bonus_time.to_fs(:inspect)}", last_read: "#{topic.last_read.to_fs(:inspect)}", content: "Have a nice day", important: nil, binary_content: nil, approved: false, replies_count: 1, unique_replies_count: 0, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "#{topic.created_at.to_fs(:inspect)}", updated_at: "#{topic.updated_at.to_fs(:inspect)}">
106
+ STRING
107
+ end
108
+
53
109
  def test_pretty_print_new
54
110
  topic = Topic.new
55
111
  actual = +""
@@ -65,6 +121,7 @@ class CoreTest < ActiveRecord::TestCase
65
121
  last_read: nil,
66
122
  content: nil,
67
123
  important: nil,
124
+ binary_content: nil,
68
125
  approved: true,
69
126
  replies_count: 0,
70
127
  unique_replies_count: 0,
@@ -89,11 +146,12 @@ class CoreTest < ActiveRecord::TestCase
89
146
  title: "The First Topic",
90
147
  author_name: "David",
91
148
  author_email_address: "david@loudthinking.com",
92
- written_on: 2003-07-16 14:28:11(?:\.2233)? UTC,
93
- bonus_time: 2000-01-01 14:28:00 UTC,
94
- last_read: Thu, 15 Apr 2004,
149
+ written_on: "2003-07-16 14:28:11\\.223300000 \\+0000",
150
+ bonus_time: "2000-01-01 14:28:00\\.000000000 \\+0000",
151
+ last_read: "2004-04-15",
95
152
  content: "Have a nice day",
96
153
  important: nil,
154
+ binary_content: nil,
97
155
  approved: false,
98
156
  replies_count: 1,
99
157
  unique_replies_count: 0,
@@ -107,6 +165,37 @@ class CoreTest < ActiveRecord::TestCase
107
165
  assert_match(/\A#{expected}\z/, actual)
108
166
  end
109
167
 
168
+ def test_pretty_print_full
169
+ Topic.stub(:attributes_for_inspect, :all) do
170
+ topic = topics(:first)
171
+ actual = +""
172
+ PP.pp(topic, StringIO.new(actual))
173
+ expected = <<~PRETTY
174
+ #<Topic:0x\\w+
175
+ id: 1,
176
+ title: "The First Topic",
177
+ author_name: "David",
178
+ author_email_address: "david@loudthinking.com",
179
+ written_on: "2003-07-16 14:28:11\\.223300000 \\+0000",
180
+ bonus_time: "2000-01-01 14:28:00\\.000000000 \\+0000",
181
+ last_read: "2004-04-15",
182
+ content: "Have a nice day",
183
+ important: nil,
184
+ binary_content: nil,
185
+ approved: false,
186
+ replies_count: 1,
187
+ unique_replies_count: 0,
188
+ parent_id: nil,
189
+ parent_title: nil,
190
+ type: nil,
191
+ group: nil,
192
+ created_at: [^,]+,
193
+ updated_at: [^,>]+>
194
+ PRETTY
195
+ assert_match(/\A#{expected}\z/, actual)
196
+ end
197
+ end
198
+
110
199
  def test_pretty_print_uninitialized
111
200
  topic = Topic.allocate
112
201
  actual = +""
@@ -133,4 +222,73 @@ class CoreTest < ActiveRecord::TestCase
133
222
  PP.pp(topic, StringIO.new(actual))
134
223
  assert_match(/id: 1/, actual)
135
224
  end
225
+
226
+ def test_pretty_print_with_overridden_attribute_for_inspect
227
+ topic = topics(:first)
228
+
229
+ topic.instance_eval do
230
+ def attribute_for_inspect(attr_name)
231
+ if attr_name == "title"
232
+ title.upcase.inspect
233
+ else
234
+ super
235
+ end
236
+ end
237
+ end
238
+
239
+ Topic.stub(:attributes_for_inspect, :all) do
240
+ actual = +""
241
+ PP.pp(topic, StringIO.new(actual))
242
+ assert_match(/title: "THE FIRST TOPIC"/, actual)
243
+ end
244
+ end
245
+
246
+ def test_find_by_cache_does_not_duplicate_entries
247
+ Topic.initialize_find_by_cache
248
+ using_prepared_statements = Topic.lease_connection.prepared_statements
249
+ topic_find_by_cache = Topic.instance_variable_get("@find_by_statement_cache")[using_prepared_statements]
250
+
251
+ assert_difference -> { topic_find_by_cache.size }, +1 do
252
+ Topic.find(1)
253
+ end
254
+ assert_no_difference -> { topic_find_by_cache.size } do
255
+ Topic.find_by(id: 1)
256
+ end
257
+ end
258
+
259
+ def test_composite_pk_models_added_to_a_set
260
+ library = Set.new
261
+ # with primary key present
262
+ library << Cpk::Book.new(id: [1, 2])
263
+
264
+ # duplicate
265
+ library << Cpk::Book.new(id: [1, 3])
266
+ library << Cpk::Book.new(id: [1, 3])
267
+
268
+ # without primary key being set
269
+ library << Cpk::Book.new(title: "Book A")
270
+ library << Cpk::Book.new(title: "Book B")
271
+
272
+ assert_equal 4, library.size
273
+ end
274
+
275
+ def test_composite_pk_models_equality
276
+ assert Cpk::Book.new(id: [1, 2]) == Cpk::Book.new(id: [1, 2])
277
+
278
+ assert_not Cpk::Book.new(id: [1, 2]) == Cpk::Book.new(id: [1, 3])
279
+ assert_not Cpk::Book.new == Cpk::Book.new
280
+ assert_not Cpk::Book.new(title: "Book A") == Cpk::Book.new(title: "Book B")
281
+ assert_not Cpk::Book.new(author_id: 1) == Cpk::Book.new(author_id: 1)
282
+ assert_not Cpk::Book.new(author_id: 1, title: "Same title") == Cpk::Book.new(author_id: 1, title: "Same title")
283
+ end
284
+
285
+ def test_composite_pk_models_hash
286
+ assert_equal Cpk::Book.new(id: [1, 2]).hash, Cpk::Book.new(id: [1, 2]).hash
287
+
288
+ assert_not_equal Cpk::Book.new(id: [1, 2]).hash, Cpk::Book.new(id: [1, 3]).hash
289
+ assert_not_equal Cpk::Book.new.hash, Cpk::Book.new.hash
290
+ assert_not_equal Cpk::Book.new(title: "Book A").hash, Cpk::Book.new(title: "Book B").hash
291
+ assert_not_equal Cpk::Book.new(author_id: 1).hash, Cpk::Book.new(author_id: 1).hash
292
+ assert_not_equal Cpk::Book.new(author_id: 1, title: "Same title").hash, Cpk::Book.new(author_id: 1, title: "Same title").hash
293
+ end
136
294
  end
@@ -2,24 +2,28 @@
2
2
 
3
3
  require "cases/helper"
4
4
  require "models/topic"
5
+ require "models/bulb"
6
+ require "models/person"
5
7
  require "models/car"
6
8
  require "models/aircraft"
7
9
  require "models/wheel"
8
10
  require "models/engine"
11
+ require "models/tyre"
9
12
  require "models/reply"
10
13
  require "models/category"
11
14
  require "models/categorization"
12
15
  require "models/dog"
13
16
  require "models/dog_lover"
14
- require "models/person"
15
17
  require "models/friendship"
16
18
  require "models/subscriber"
17
19
  require "models/subscription"
18
20
  require "models/book"
21
+ require "models/cpk"
19
22
  require "active_support/core_ext/enumerable"
20
23
 
21
24
  class CounterCacheTest < ActiveRecord::TestCase
22
- fixtures :topics, :categories, :categorizations, :cars, :dogs, :dog_lovers, :people, :friendships, :subscribers, :subscriptions, :books
25
+ fixtures :topics, :categories, :categorizations, :cars, :dogs, :dog_lovers, :people, :friendships, :subscribers, :subscriptions, :books,
26
+ :cpk_orders, :cpk_books
23
27
 
24
28
  class ::SpecialTopic < ::Topic
25
29
  has_many :special_replies, foreign_key: "parent_id"
@@ -40,12 +44,45 @@ class CounterCacheTest < ActiveRecord::TestCase
40
44
  end
41
45
  end
42
46
 
47
+ test "increment counter by specific amount" do
48
+ assert_difference -> { @topic.reload.replies_count }, +2 do
49
+ Topic.increment_counter(:replies_count, @topic.id, by: 2)
50
+ end
51
+ end
52
+
53
+ test "increment counter for cpk model" do
54
+ order = Cpk::Order.first
55
+ assert_difference -> { order.reload.books_count } do
56
+ Cpk::Order.increment_counter(:books_count, order.id)
57
+ end
58
+ end
59
+
60
+ test "increment counter for multiple cpk model records" do
61
+ order1, order2 = Cpk::Order.first(2)
62
+ assert_difference [-> { order1.reload.books_count }, -> { order2.reload.books_count }] do
63
+ Cpk::Order.increment_counter(:books_count, [order1.id, order2.id])
64
+ end
65
+ end
66
+
43
67
  test "decrement counter" do
44
68
  assert_difference "@topic.reload.replies_count", -1 do
45
69
  Topic.decrement_counter(:replies_count, @topic.id)
46
70
  end
47
71
  end
48
72
 
73
+ test "decrement counter by specific amount" do
74
+ assert_difference "@topic.reload.replies_count", -2 do
75
+ Topic.decrement_counter(:replies_count, @topic.id, by: 2)
76
+ end
77
+ end
78
+
79
+ test "decrement counter for cpk model" do
80
+ order = Cpk::Order.first
81
+ assert_difference -> { order.reload.books_count }, -1 do
82
+ Cpk::Order.decrement_counter(:books_count, order.id)
83
+ end
84
+ end
85
+
49
86
  test "reset counters" do
50
87
  # throw the count off by 1
51
88
  Topic.increment_counter(:replies_count, @topic.id)
@@ -114,6 +151,38 @@ class CounterCacheTest < ActiveRecord::TestCase
114
151
  end
115
152
  end
116
153
 
154
+ test "reset counter skips query for correct counter" do
155
+ Topic.reset_counters(@topic.id, :replies_count)
156
+
157
+ # SELECT "topics".* FROM "topics" WHERE "topics"."id" = ? LIMIT ?
158
+ # SELECT COUNT(*) FROM "topics" WHERE "topics"."type" IN (?, ?, ?, ?, ?) AND "topics"."parent_id" = ?
159
+ assert_queries_count(2) do
160
+ Topic.reset_counters(@topic.id, :replies_count)
161
+ end
162
+ end
163
+
164
+ test "reset counter performs query for correct counter with touch: true" do
165
+ Topic.reset_counters(@topic.id, :replies_count)
166
+
167
+ # SELECT "topics".* FROM "topics" WHERE "topics"."id" = ? LIMIT ?
168
+ # SELECT COUNT(*) FROM "topics" WHERE "topics"."type" IN (?, ?, ?, ?, ?) AND "topics"."parent_id" = ?
169
+ # UPDATE "topics" SET "updated_at" = ? WHERE "topics"."id" = ?
170
+ assert_queries_count(3) do
171
+ Topic.reset_counters(@topic.id, :replies_count, touch: true)
172
+ end
173
+ end
174
+
175
+ test "reset counters for cpk model" do
176
+ order = Cpk::Order.first
177
+ # throw the count off by 1
178
+ Cpk::Order.increment_counter(:books_count, order.id)
179
+
180
+ # check that it gets reset
181
+ assert_difference -> { order.reload.books_count }, -1 do
182
+ Cpk::Order.reset_counters(order.id, :books)
183
+ end
184
+ end
185
+
117
186
  test "update counter with initial null value" do
118
187
  category = categories(:general)
119
188
  assert_equal 2, category.categorizations.count
@@ -143,6 +212,13 @@ class CounterCacheTest < ActiveRecord::TestCase
143
212
  end
144
213
  end
145
214
 
215
+ test "update counter for decrement for cpk model" do
216
+ order = Cpk::Order.first
217
+ assert_difference -> { order.reload.books_count }, -3 do
218
+ Cpk::Order.update_counters(order.id, books_count: -3)
219
+ end
220
+ end
221
+
146
222
  test "update other counters on parent destroy" do
147
223
  david, joanna = dog_lovers(:david, :joanna)
148
224
  _ = joanna # squelch a warning
@@ -215,6 +291,15 @@ class CounterCacheTest < ActiveRecord::TestCase
215
291
  end
216
292
  end
217
293
 
294
+ test "removing association updates counter" do
295
+ michael = people(:michael)
296
+ car = cars(:honda)
297
+
298
+ assert_difference -> { michael.reload.cars_count }, -1 do
299
+ car.destroy
300
+ end
301
+ end
302
+
218
303
  test "update counters doesn't touch timestamps by default" do
219
304
  @topic.update_column :updated_at, 5.minutes.ago
220
305
  previously_updated_at = @topic.updated_at
@@ -354,6 +439,48 @@ class CounterCacheTest < ActiveRecord::TestCase
354
439
  end
355
440
  end
356
441
 
442
+ test "counter_cache_column?" do
443
+ assert Person.counter_cache_column?("cars_count")
444
+ assert_not Car.counter_cache_column?("cars_count")
445
+ end
446
+
447
+ test "inactive counter cache" do
448
+ car = Car.new
449
+ car.bulbs = [Bulb.new, Bulb.new]
450
+ car.save!
451
+
452
+ assert_equal 2, car.bulbs_count
453
+ car.reload
454
+
455
+ assert_queries_count(5) do
456
+ assert_equal 2, car.bulbs.size
457
+ assert_equal 2, car.bulbs.count
458
+ assert_not_predicate car.bulbs, :empty?
459
+ assert_predicate car.bulbs, :any?
460
+ assert_not_predicate car.bulbs, :none?
461
+ end
462
+ end
463
+
464
+ test "active counter cache" do
465
+ car = Car.new
466
+ car.tyres = [Tyre.new, Tyre.new]
467
+ car.save!
468
+
469
+ assert_equal 2, car.custom_tyres_count
470
+ car.reload
471
+
472
+ assert_no_queries do
473
+ assert_equal 2, car.tyres.size
474
+ assert_not_predicate car.tyres, :empty?
475
+ assert_predicate car.tyres, :any?
476
+ assert_not_predicate car.tyres, :none?
477
+ end
478
+
479
+ assert_queries_count(1) do
480
+ assert_equal 2, car.tyres.count
481
+ end
482
+ end
483
+
357
484
  private
358
485
  def assert_touching(record, *attributes)
359
486
  record.update_columns attributes.index_with(5.minutes.ago)
@@ -7,10 +7,10 @@ module ActiveRecord
7
7
  class CustomLockingTest < ActiveRecord::TestCase
8
8
  fixtures :people
9
9
 
10
- def test_custom_lock
11
- if current_adapter?(:Mysql2Adapter)
10
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
11
+ def test_custom_lock
12
12
  assert_match "SHARE MODE", Person.lock("LOCK IN SHARE MODE").to_sql
13
- assert_sql(/LOCK IN SHARE MODE/) do
13
+ assert_queries_match(/LOCK IN SHARE MODE/) do
14
14
  Person.all.merge!(lock: "LOCK IN SHARE MODE").find(1)
15
15
  end
16
16
  end
@@ -6,69 +6,205 @@ module ActiveRecord
6
6
  class DatabaseConfigurations
7
7
  class HashConfigTest < ActiveRecord::TestCase
8
8
  def test_pool_default_when_nil
9
- config = HashConfig.new("default_env", "primary", pool: nil)
9
+ config = HashConfig.new("default_env", "primary", pool: nil, adapter: "abstract")
10
10
  assert_equal 5, config.pool
11
11
  end
12
12
 
13
13
  def test_pool_overrides_with_value
14
- config = HashConfig.new("default_env", "primary", pool: "0")
14
+ config = HashConfig.new("default_env", "primary", pool: "0", adapter: "abstract")
15
15
  assert_equal 0, config.pool
16
16
  end
17
17
 
18
18
  def test_when_no_pool_uses_default
19
- config = HashConfig.new("default_env", "primary", {})
19
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
20
20
  assert_equal 5, config.pool
21
21
  end
22
22
 
23
+ def test_min_threads_with_value
24
+ config = HashConfig.new("default_env", "primary", min_threads: "1", adapter: "abstract")
25
+ assert_equal 1, config.min_threads
26
+ end
27
+
28
+ def test_min_threads_default
29
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
30
+ assert_equal 0, config.min_threads
31
+ end
32
+
33
+ def test_max_threads_with_value
34
+ config = HashConfig.new("default_env", "primary", max_threads: "10", adapter: "abstract")
35
+ assert_equal 10, config.max_threads
36
+ end
37
+
38
+ def test_max_threads_default_uses_pool_default
39
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
40
+ assert_equal 5, config.pool
41
+ assert_equal 5, config.max_threads
42
+ end
43
+
44
+ def test_max_threads_uses_pool_when_set
45
+ config = HashConfig.new("default_env", "primary", pool: 1, adapter: "abstract")
46
+ assert_equal 1, config.pool
47
+ assert_equal 1, config.max_threads
48
+ end
49
+
50
+ def test_max_queue_is_pool_multiplied_by_4
51
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
52
+ assert_equal 5, config.max_threads
53
+ assert_equal config.max_threads * 4, config.max_queue
54
+ end
55
+
23
56
  def test_checkout_timeout_default_when_nil
24
- config = HashConfig.new("default_env", "primary", checkout_timeout: nil)
57
+ config = HashConfig.new("default_env", "primary", checkout_timeout: nil, adapter: "abstract")
25
58
  assert_equal 5.0, config.checkout_timeout
26
59
  end
27
60
 
28
61
  def test_checkout_timeout_overrides_with_value
29
- config = HashConfig.new("default_env", "primary", checkout_timeout: "0")
62
+ config = HashConfig.new("default_env", "primary", checkout_timeout: "0", adapter: "abstract")
30
63
  assert_equal 0.0, config.checkout_timeout
31
64
  end
32
65
 
33
66
  def test_when_no_checkout_timeout_uses_default
34
- config = HashConfig.new("default_env", "primary", {})
67
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
35
68
  assert_equal 5.0, config.checkout_timeout
36
69
  end
37
70
 
38
71
  def test_reaping_frequency_default_when_nil
39
- config = HashConfig.new("default_env", "primary", reaping_frequency: nil)
72
+ config = HashConfig.new("default_env", "primary", reaping_frequency: nil, adapter: "abstract")
40
73
  assert_nil config.reaping_frequency
41
74
  end
42
75
 
43
76
  def test_reaping_frequency_overrides_with_value
44
- config = HashConfig.new("default_env", "primary", reaping_frequency: "0")
77
+ config = HashConfig.new("default_env", "primary", reaping_frequency: "0", adapter: "abstract")
45
78
  assert_equal 0.0, config.reaping_frequency
46
79
  end
47
80
 
48
81
  def test_when_no_reaping_frequency_uses_default
49
- config = HashConfig.new("default_env", "primary", {})
82
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
50
83
  assert_equal 60.0, config.reaping_frequency
51
84
  end
52
85
 
53
86
  def test_idle_timeout_default_when_nil
54
- config = HashConfig.new("default_env", "primary", idle_timeout: nil)
87
+ config = HashConfig.new("default_env", "primary", idle_timeout: nil, adapter: "abstract")
55
88
  assert_nil config.idle_timeout
56
89
  end
57
90
 
58
91
  def test_idle_timeout_overrides_with_value
59
- config = HashConfig.new("default_env", "primary", idle_timeout: "1")
92
+ config = HashConfig.new("default_env", "primary", idle_timeout: "1", adapter: "abstract")
60
93
  assert_equal 1.0, config.idle_timeout
61
94
  end
62
95
 
63
96
  def test_when_no_idle_timeout_uses_default
64
- config = HashConfig.new("default_env", "primary", {})
97
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
65
98
  assert_equal 300.0, config.idle_timeout
66
99
  end
67
100
 
68
101
  def test_idle_timeout_nil_when_less_than_or_equal_to_zero
69
- config = HashConfig.new("default_env", "primary", idle_timeout: "0")
102
+ config = HashConfig.new("default_env", "primary", idle_timeout: "0", adapter: "abstract")
70
103
  assert_nil config.idle_timeout
71
104
  end
105
+
106
+ def test_default_schema_dump_value
107
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
108
+ assert_equal "schema.rb", config.schema_dump
109
+ end
110
+
111
+ def test_schema_dump_value_set_to_filename
112
+ config = HashConfig.new("default_env", "primary", { schema_dump: "my_schema.rb", adapter: "abstract" })
113
+ assert_equal "my_schema.rb", config.schema_dump
114
+ end
115
+
116
+ def test_schema_dump_value_set_to_nil
117
+ config = HashConfig.new("default_env", "primary", { schema_dump: nil, adapter: "abstract" })
118
+ assert_nil config.schema_dump
119
+ end
120
+
121
+ def test_schema_dump_value_set_to_false
122
+ config = HashConfig.new("default_env", "primary", { schema_dump: false, adapter: "abstract" })
123
+ assert_nil config.schema_dump
124
+ end
125
+
126
+ def test_database_tasks_defaults_to_true
127
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
128
+ assert_equal true, config.database_tasks?
129
+ end
130
+
131
+ def test_database_tasks_overrides_with_value
132
+ config = HashConfig.new("default_env", "primary", database_tasks: false, adapter: "abstract")
133
+ assert_equal false, config.database_tasks?
134
+
135
+ config = HashConfig.new("default_env", "primary", database_tasks: "str", adapter: "abstract")
136
+ assert_equal true, config.database_tasks?
137
+ end
138
+
139
+ def test_schema_cache_path_default_for_primary
140
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
141
+ assert_equal "db/schema_cache.yml", config.default_schema_cache_path
142
+ end
143
+
144
+ def test_schema_cache_path_default_for_custom_name
145
+ config = HashConfig.new("default_env", "alternate", adapter: "abstract")
146
+ assert_equal "db/alternate_schema_cache.yml", config.default_schema_cache_path
147
+ end
148
+
149
+ def test_schema_cache_path_default_for_different_db_dir
150
+ config = HashConfig.new("default_env", "alternate", adapter: "abstract")
151
+ assert_equal "my_db/alternate_schema_cache.yml", config.default_schema_cache_path("my_db")
152
+ end
153
+
154
+ def test_schema_cache_path_configuration_hash
155
+ config = HashConfig.new("default_env", "primary", { schema_cache_path: "db/config_schema_cache.yml", adapter: "abstract" })
156
+ assert_equal "db/config_schema_cache.yml", config.schema_cache_path
157
+ end
158
+
159
+ def test_lazy_schema_cache_path
160
+ config = HashConfig.new("default_env", "primary", { schema_cache_path: "db/config_schema_cache.yml", adapter: "abstract" })
161
+ assert_equal "db/config_schema_cache.yml", config.lazy_schema_cache_path
162
+ end
163
+
164
+ def test_lazy_schema_cache_path_uses_default_if_config_is_not_present
165
+ config = HashConfig.new("default_env", "alternate", { adapter: "abstract" })
166
+ assert_equal "db/alternate_schema_cache.yml", config.lazy_schema_cache_path
167
+ end
168
+
169
+ def test_validate_checks_the_adapter_exists
170
+ config = HashConfig.new("default_env", "primary", adapter: "abstract")
171
+ assert config.validate!
172
+ config = HashConfig.new("default_env", "primary", adapter: "potato")
173
+ assert_raises(ActiveRecord::AdapterNotFound) do
174
+ config.validate!
175
+ end
176
+ end
177
+
178
+ def test_inspect_does_not_show_secrets
179
+ config = HashConfig.new("default_env", "primary", { adapter: "abstract", password: "hunter2" })
180
+ assert_equal "#<ActiveRecord::DatabaseConfigurations::HashConfig env_name=default_env name=primary adapter_class=ActiveRecord::ConnectionAdapters::AbstractAdapter>", config.inspect
181
+ end
182
+
183
+ def test_seeds_defaults_to_primary
184
+ config = HashConfig.new("default_env", "primary", { adapter: "abstract" })
185
+ assert_equal true, config.seeds?
186
+
187
+ config = HashConfig.new("default_env", "primary", { adapter: "abstract", seeds: false })
188
+ assert_equal false, config.seeds?
189
+
190
+ config = HashConfig.new("default_env", "primary", { adapter: "abstract", seeds: true })
191
+ assert_equal true, config.seeds?
192
+
193
+ config = HashConfig.new("default_env", "secondary", { adapter: "abstract" })
194
+ config.stub(:primary?, false) do # primary? will return nil without proper Base.configurations
195
+ assert_equal false, config.seeds?
196
+ end
197
+
198
+ config = HashConfig.new("default_env", "secondary", { adapter: "abstract", seeds: false })
199
+ config.stub(:primary?, false) do # primary? will return nil without proper Base.configurations
200
+ assert_equal false, config.seeds?
201
+ end
202
+
203
+ config = HashConfig.new("default_env", "secondary", { adapter: "abstract", seeds: true })
204
+ config.stub(:primary?, false) do # primary? will return nil without proper Base.configurations
205
+ assert_equal true, config.seeds?
206
+ end
207
+ end
72
208
  end
73
209
  end
74
210
  end