ibm_db 5.2.0-x86-mingw32 → 5.3.2-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 (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
  require "models/project"
3
5
  require "timeout"
@@ -7,7 +9,7 @@ class PooledConnectionsTest < ActiveRecord::TestCase
7
9
 
8
10
  def setup
9
11
  @per_test_teardown = []
10
- @connection = ActiveRecord::Base.remove_connection
12
+ @connection = ActiveRecord::Base.remove_connection.configuration_hash
11
13
  end
12
14
 
13
15
  teardown do
@@ -18,36 +20,32 @@ class PooledConnectionsTest < ActiveRecord::TestCase
18
20
 
19
21
  # Will deadlock due to lack of Monitor timeouts in 1.9
20
22
  def checkout_checkin_connections(pool_size, threads)
21
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => pool_size, :checkout_timeout => 0.5}))
23
+ ActiveRecord::Base.establish_connection(@connection.merge(pool: pool_size, checkout_timeout: 0.5))
22
24
  @connection_count = 0
23
25
  @timed_out = 0
24
26
  threads.times do
25
27
  Thread.new do
26
- begin
27
- conn = ActiveRecord::Base.connection_pool.checkout
28
- sleep 0.1
29
- ActiveRecord::Base.connection_pool.checkin conn
30
- @connection_count += 1
31
- rescue ActiveRecord::ConnectionTimeoutError
32
- @timed_out += 1
33
- end
28
+ conn = ActiveRecord::Base.connection_pool.checkout
29
+ sleep 0.1
30
+ ActiveRecord::Base.connection_pool.checkin conn
31
+ @connection_count += 1
32
+ rescue ActiveRecord::ConnectionTimeoutError
33
+ @timed_out += 1
34
34
  end.join
35
35
  end
36
36
  end
37
37
 
38
38
  def checkout_checkin_connections_loop(pool_size, loops)
39
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => pool_size, :checkout_timeout => 0.5}))
39
+ ActiveRecord::Base.establish_connection(@connection.merge(pool: pool_size, checkout_timeout: 0.5))
40
40
  @connection_count = 0
41
41
  @timed_out = 0
42
42
  loops.times do
43
- begin
44
- conn = ActiveRecord::Base.connection_pool.checkout
45
- ActiveRecord::Base.connection_pool.checkin conn
46
- @connection_count += 1
47
- ActiveRecord::Base.connection.data_sources
48
- rescue ActiveRecord::ConnectionTimeoutError
49
- @timed_out += 1
50
- end
43
+ conn = ActiveRecord::Base.connection_pool.checkout
44
+ ActiveRecord::Base.connection_pool.checkin conn
45
+ @connection_count += 1
46
+ ActiveRecord::Base.connection.data_sources
47
+ rescue ActiveRecord::ConnectionTimeoutError
48
+ @timed_out += 1
51
49
  end
52
50
  end
53
51
 
@@ -66,16 +64,10 @@ class PooledConnectionsTest < ActiveRecord::TestCase
66
64
  end
67
65
 
68
66
  def test_pooled_connection_remove
69
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => 2, :checkout_timeout => 0.5}))
67
+ ActiveRecord::Base.establish_connection(@connection.merge(pool: 2, checkout_timeout: 0.5))
70
68
  old_connection = ActiveRecord::Base.connection
71
69
  extra_connection = ActiveRecord::Base.connection_pool.checkout
72
70
  ActiveRecord::Base.connection_pool.remove(extra_connection)
73
71
  assert_equal ActiveRecord::Base.connection, old_connection
74
72
  end
75
-
76
- private
77
-
78
- def add_record(name)
79
- ActiveRecord::Base.connection_pool.with_connection { Project.create! :name => name }
80
- end
81
73
  end unless in_memory_db?
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/course"
5
+ require "models/entrant"
6
+
7
+ module ActiveRecord
8
+ class PreparedStatementStatusTest < ActiveRecord::TestCase
9
+ def test_prepared_statement_status_is_thread_and_instance_specific
10
+ course_conn = Course.connection
11
+ entrant_conn = Entrant.connection
12
+
13
+ inside = Concurrent::Event.new
14
+ preventing = Concurrent::Event.new
15
+ finished = Concurrent::Event.new
16
+
17
+ assert_not_same course_conn, entrant_conn
18
+
19
+ if ActiveRecord::Base.connection.prepared_statements
20
+ t1 = Thread.new do
21
+ course_conn.unprepared_statement do
22
+ inside.set
23
+ preventing.wait
24
+ assert_not course_conn.prepared_statements
25
+ assert entrant_conn.prepared_statements
26
+ finished.set
27
+ end
28
+ end
29
+
30
+ t2 = Thread.new do
31
+ entrant_conn.unprepared_statement do
32
+ inside.wait
33
+ assert course_conn.prepared_statements
34
+ assert_not entrant_conn.prepared_statements
35
+ preventing.set
36
+ finished.wait
37
+ end
38
+ end
39
+
40
+ t1.join
41
+ t2.join
42
+ else
43
+ assert_not course_conn.prepared_statements
44
+ assert_not entrant_conn.prepared_statements
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
3
- require 'models/topic'
4
- require 'models/reply'
5
- require 'models/subscriber'
6
- require 'models/movie'
7
- require 'models/keyboard'
8
- require 'models/mixed_case_monkey'
9
- require 'models/dashboard'
10
- require 'models/non_primary_key'
4
+ require "support/schema_dumping_helper"
5
+ require "models/topic"
6
+ require "models/reply"
7
+ require "models/subscriber"
8
+ require "models/movie"
9
+ require "models/keyboard"
10
+ require "models/mixed_case_monkey"
11
+ require "models/dashboard"
12
+ require "models/non_primary_key"
11
13
 
12
14
  class PrimaryKeysTest < ActiveRecord::TestCase
13
15
  fixtures :topics, :subscribers, :movies, :mixed_case_monkeys
@@ -46,7 +48,7 @@ class PrimaryKeysTest < ActiveRecord::TestCase
46
48
  topic = Topic.new
47
49
  topic.title = "New Topic"
48
50
  assert_nil topic.id
49
- assert_nothing_raised { topic.save! }
51
+ topic.save!
50
52
  id = topic.id
51
53
 
52
54
  topicReloaded = Topic.find(id)
@@ -55,22 +57,35 @@ class PrimaryKeysTest < ActiveRecord::TestCase
55
57
 
56
58
  def test_customized_primary_key_auto_assigns_on_save
57
59
  Keyboard.delete_all
58
- keyboard = Keyboard.new(:name => 'HHKB')
59
- assert_nothing_raised { keyboard.save! }
60
- assert_equal keyboard.id, Keyboard.find_by_name('HHKB').id
60
+ keyboard = Keyboard.new(name: "HHKB")
61
+ keyboard.save!
62
+ assert_equal keyboard.id, Keyboard.find_by_name("HHKB").id
61
63
  end
62
64
 
63
65
  def test_customized_primary_key_can_be_get_before_saving
64
66
  keyboard = Keyboard.new
65
67
  assert_nil keyboard.id
66
- assert_nothing_raised { assert_nil keyboard.key_number }
68
+ assert_nil keyboard.key_number
67
69
  end
68
70
 
69
71
  def test_customized_string_primary_key_settable_before_save
70
72
  subscriber = Subscriber.new
71
- assert_nothing_raised { subscriber.id = 'webster123' }
72
- assert_equal 'webster123', subscriber.id
73
- assert_equal 'webster123', subscriber.nick
73
+ subscriber.id = "webster123"
74
+ assert_equal "webster123", subscriber.id
75
+ assert_equal "webster123", subscriber.nick
76
+ end
77
+
78
+ def test_update_with_non_primary_key_id_column
79
+ subscriber = Subscriber.first
80
+ subscriber.update(update_count: 1)
81
+ subscriber.reload
82
+ assert_equal 1, subscriber.update_count
83
+ end
84
+
85
+ def test_update_columns_with_non_primary_key_id_column
86
+ subscriber = Subscriber.first
87
+ subscriber.update_columns(id: 1)
88
+ assert_not_equal 1, subscriber.nick
74
89
  end
75
90
 
76
91
  def test_string_key
@@ -83,7 +98,7 @@ class PrimaryKeysTest < ActiveRecord::TestCase
83
98
  subscriber.id = "jdoe"
84
99
  assert_equal("jdoe", subscriber.id)
85
100
  subscriber.name = "John Doe"
86
- assert_nothing_raised { subscriber.save! }
101
+ subscriber.save!
87
102
  assert_equal("jdoe", subscriber.id)
88
103
 
89
104
  subscriberReloaded = Subscriber.find("jdoe")
@@ -120,48 +135,45 @@ class PrimaryKeysTest < ActiveRecord::TestCase
120
135
  def test_delete_should_quote_pkey
121
136
  assert_nothing_raised { MixedCaseMonkey.delete(1) }
122
137
  end
138
+
123
139
  def test_update_counters_should_quote_pkey_and_quote_counter_columns
124
- assert_nothing_raised { MixedCaseMonkey.update_counters(1, :fleaCount => 99) }
140
+ assert_nothing_raised { MixedCaseMonkey.update_counters(1, fleaCount: 99) }
125
141
  end
142
+
126
143
  def test_find_with_one_id_should_quote_pkey
127
144
  assert_nothing_raised { MixedCaseMonkey.find(1) }
128
145
  end
146
+
129
147
  def test_find_with_multiple_ids_should_quote_pkey
130
- assert_nothing_raised { MixedCaseMonkey.find([1,2]) }
148
+ assert_nothing_raised { MixedCaseMonkey.find([1, 2]) }
131
149
  end
150
+
132
151
  def test_instance_update_should_quote_pkey
133
152
  assert_nothing_raised { MixedCaseMonkey.find(1).save }
134
153
  end
154
+
135
155
  def test_instance_destroy_should_quote_pkey
136
156
  assert_nothing_raised { MixedCaseMonkey.find(1).destroy }
137
157
  end
138
158
 
139
- def test_supports_primary_key
140
- assert_nothing_raised do
141
- ActiveRecord::Base.connection.supports_primary_key?
159
+ def test_primary_key_returns_value_if_it_exists
160
+ klass = Class.new(ActiveRecord::Base) do
161
+ self.table_name = "developers"
142
162
  end
143
- end
144
163
 
145
- if ActiveRecord::Base.connection.supports_primary_key?
146
- def test_primary_key_returns_value_if_it_exists
147
- klass = Class.new(ActiveRecord::Base) do
148
- self.table_name = 'developers'
149
- end
164
+ assert_equal "id", klass.primary_key
165
+ end
150
166
 
151
- assert_equal 'id', klass.primary_key
167
+ def test_primary_key_returns_nil_if_it_does_not_exist
168
+ klass = Class.new(ActiveRecord::Base) do
169
+ self.table_name = "developers_projects"
152
170
  end
153
171
 
154
- def test_primary_key_returns_nil_if_it_does_not_exist
155
- klass = Class.new(ActiveRecord::Base) do
156
- self.table_name = 'developers_projects'
157
- end
158
-
159
- assert_nil klass.primary_key
160
- end
172
+ assert_nil klass.primary_key
161
173
  end
162
174
 
163
175
  def test_quoted_primary_key_after_set_primary_key
164
- k = Class.new( ActiveRecord::Base )
176
+ k = Class.new(ActiveRecord::Base)
165
177
  assert_equal k.connection.quote_column_name("id"), k.quoted_primary_key
166
178
  k.primary_key = "foo"
167
179
  assert_equal k.connection.quote_column_name("foo"), k.quoted_primary_key
@@ -169,29 +181,47 @@ class PrimaryKeysTest < ActiveRecord::TestCase
169
181
 
170
182
  def test_auto_detect_primary_key_from_schema
171
183
  MixedCaseMonkey.reset_primary_key
172
- assert_equal "monkeyID", MixedCaseMonkey.primary_key
184
+ assert_equal "monkeyid", MixedCaseMonkey.primary_key
173
185
  end
174
186
 
175
187
  def test_primary_key_update_with_custom_key_name
176
- dashboard = Dashboard.create!(dashboard_id: '1')
177
- dashboard.id = '2'
188
+ dashboard = Dashboard.create!(dashboard_id: "1")
189
+ dashboard.id = "2"
178
190
  dashboard.save!
179
191
 
180
192
  dashboard = Dashboard.first
181
- assert_equal '2', dashboard.id
193
+ assert_equal "2", dashboard.id
194
+ end
195
+
196
+ def test_create_without_primary_key_no_extra_query
197
+ skip if current_adapter?(:OracleAdapter, :IBM_DBAdapter)
198
+
199
+ klass = Class.new(ActiveRecord::Base) do
200
+ self.table_name = "dashboards"
201
+ end
202
+ klass.create! # warmup schema cache
203
+ assert_queries(3, ignore_none: true) { klass.create! }
204
+ end
205
+
206
+ def test_assign_id_raises_error_if_primary_key_doesnt_exist
207
+ klass = Class.new(ActiveRecord::Base) do
208
+ self.table_name = "dashboards"
209
+ end
210
+ dashboard = klass.new
211
+ assert_raises(ActiveModel::MissingAttributeError) { dashboard.id = "1" }
182
212
  end
183
213
 
184
214
  if current_adapter?(:PostgreSQLAdapter)
185
215
  def test_serial_with_quoted_sequence_name
186
216
  column = MixedCaseMonkey.columns_hash[MixedCaseMonkey.primary_key]
187
- assert_equal "nextval('\"mixed_case_monkeys_monkeyID_seq\"'::regclass)", column.default_function
188
- assert column.serial?
217
+ assert_equal "nextval('\"mixed_case_monkeys_monkeyid_seq\"'::regclass)", column.default_function
218
+ assert_predicate column, :serial?
189
219
  end
190
220
 
191
221
  def test_serial_with_unquoted_sequence_name
192
222
  column = Topic.columns_hash[Topic.primary_key]
193
223
  assert_equal "nextval('topics_id_seq'::regclass)", column.default_function
194
- assert column.serial?
224
+ assert_predicate column, :serial?
195
225
  end
196
226
  end
197
227
  end
@@ -204,17 +234,54 @@ class PrimaryKeyWithNoConnectionTest < ActiveRecord::TestCase
204
234
  connection = ActiveRecord::Base.remove_connection
205
235
 
206
236
  model = Class.new(ActiveRecord::Base)
207
- model.primary_key = 'foo'
237
+ model.primary_key = "foo"
208
238
 
209
- assert_equal 'foo', model.primary_key
239
+ assert_equal "foo", model.primary_key
210
240
 
211
241
  ActiveRecord::Base.establish_connection(connection)
212
242
 
213
- assert_equal 'foo', model.primary_key
243
+ assert_equal "foo", model.primary_key
214
244
  end
215
245
  end
216
246
  end
217
247
 
248
+ class PrimaryKeyWithAutoIncrementTest < ActiveRecord::TestCase
249
+ self.use_transactional_tests = false
250
+
251
+ class AutoIncrement < ActiveRecord::Base
252
+ end
253
+
254
+ def setup
255
+ @connection = ActiveRecord::Base.connection
256
+ end
257
+
258
+ def teardown
259
+ @connection.drop_table(:auto_increments, if_exists: true)
260
+ end
261
+
262
+ def test_primary_key_with_integer
263
+ @connection.create_table(:auto_increments, id: :integer, force: true)
264
+ assert_auto_incremented
265
+ end
266
+
267
+ def test_primary_key_with_bigint
268
+ @connection.create_table(:auto_increments, id: :bigint, force: true)
269
+ assert_auto_incremented
270
+ end
271
+
272
+ private
273
+ def assert_auto_incremented
274
+ record1 = AutoIncrement.create!
275
+ assert_not_nil record1.id
276
+
277
+ record1.destroy
278
+
279
+ record2 = AutoIncrement.create!
280
+ assert_not_nil record2.id
281
+ assert_operator record2.id, :>, record1.id
282
+ end
283
+ end
284
+
218
285
  class PrimaryKeyAnyTypeTest < ActiveRecord::TestCase
219
286
  include SchemaDumpingHelper
220
287
 
@@ -229,8 +296,7 @@ class PrimaryKeyAnyTypeTest < ActiveRecord::TestCase
229
296
  end
230
297
 
231
298
  teardown do
232
- @connection.drop_table(:barcodes)
233
- #, if_exists: true)
299
+ @connection.drop_table(:barcodes, if_exists: true)
234
300
  end
235
301
 
236
302
  def test_any_type_primary_key
@@ -240,11 +306,22 @@ class PrimaryKeyAnyTypeTest < ActiveRecord::TestCase
240
306
  assert_not column.null
241
307
  assert_equal :string, column.type
242
308
  assert_equal 42, column.limit
309
+ ensure
310
+ Barcode.reset_column_information
243
311
  end
244
312
 
245
313
  test "schema dump primary key includes type and options" do
246
314
  schema = dump_table_schema "barcodes"
247
- assert_match %r{create_table "barcodes", primary_key: "code", id: :string, limit: 42}, schema
315
+ assert_match %r/create_table "barcodes", primary_key: "code", id: { type: :string, limit: 42 }/, schema
316
+ assert_no_match %r{t\.index \["code"\]}, schema
317
+ end
318
+
319
+ if current_adapter?(:Mysql2Adapter) && supports_datetime_with_precision?
320
+ test "schema typed primary key column" do
321
+ @connection.create_table(:scheduled_logs, id: :timestamp, precision: 6, force: true)
322
+ schema = dump_table_schema("scheduled_logs")
323
+ assert_match %r/create_table "scheduled_logs", id: { type: :timestamp, precision: 6.* }/, schema
324
+ end
248
325
  end
249
326
  end
250
327
 
@@ -256,25 +333,43 @@ class CompositePrimaryKeyTest < ActiveRecord::TestCase
256
333
  def setup
257
334
  @connection = ActiveRecord::Base.connection
258
335
  @connection.schema_cache.clear!
259
- @connection.create_table(:barcodes, primary_key: ["region", "code"], force: true) do |t|
336
+ @connection.create_table(:uber_barcodes, primary_key: ["region", "code"], force: true) do |t|
337
+ t.string :region, null: false
338
+ t.integer :code, null: false
339
+ end
340
+ @connection.create_table(:barcodes_reverse, primary_key: ["code", "region"], force: true) do |t|
260
341
  t.string :region, null: false
261
342
  t.integer :code, null: false
262
343
  end
344
+ @connection.create_table(:travels, primary_key: ["from", "to"], force: true) do |t|
345
+ t.string :from, null: false
346
+ t.string :to, null: false
347
+ end
263
348
  end
264
349
 
265
350
  def teardown
266
- @connection.drop_table(:barcodes)
267
- #, if_exists: true)
351
+ @connection.drop_table :uber_barcodes, if_exists: true
352
+ @connection.drop_table :barcodes_reverse, if_exists: true
353
+ @connection.drop_table :travels, if_exists: true
268
354
  end
269
355
 
270
356
  def test_composite_primary_key
271
- assert_equal ["region", "code"], @connection.primary_keys("barcodes")
357
+ pri = @connection.primary_keys("uber_barcodes")
358
+ assert_equal ["region", "code"], @connection.primary_keys("uber_barcodes")
359
+ end
360
+
361
+ def test_composite_primary_key_with_reserved_words
362
+ assert_equal ["from", "to"], @connection.primary_keys("travels")
363
+ end
364
+
365
+ def test_composite_primary_key_out_of_order
366
+ assert_equal ["code", "region"], @connection.primary_keys("barcodes_reverse")
272
367
  end
273
368
 
274
369
  def test_primary_key_issues_warning
275
370
  model = Class.new(ActiveRecord::Base) do
276
371
  def self.table_name
277
- "barcodes"
372
+ "uber_barcodes"
278
373
  end
279
374
  end
280
375
  warning = capture(:stderr) do
@@ -284,42 +379,45 @@ class CompositePrimaryKeyTest < ActiveRecord::TestCase
284
379
  end
285
380
 
286
381
  def test_collectly_dump_composite_primary_key
287
- schema = dump_table_schema "barcodes"
288
- assert_match %r{create_table "barcodes", primary_key: \["region", "code"\]}, schema
382
+ schema = dump_table_schema "uber_barcodes"
383
+ assert_match %r{create_table "uber_barcodes", primary_key: \["region", "code"\]}, schema
384
+ end
385
+
386
+ def test_dumping_composite_primary_key_out_of_order
387
+ schema = dump_table_schema "barcodes_reverse"
388
+ assert_match %r{create_table "barcodes_reverse", primary_key: \["code", "region"\]}, schema
289
389
  end
290
390
  end
291
391
 
292
- if current_adapter?(:Mysql2Adapter)
293
- class PrimaryKeyBigintNilDefaultTest < ActiveRecord::TestCase
294
- include SchemaDumpingHelper
392
+ class PrimaryKeyIntegerNilDefaultTest < ActiveRecord::TestCase
393
+ include SchemaDumpingHelper
295
394
 
296
- self.use_transactional_tests = false
395
+ self.use_transactional_tests = false
297
396
 
298
- def setup
299
- @connection = ActiveRecord::Base.connection
300
- @connection.create_table(:bigint_defaults, id: :bigint, default: nil, force: true)
301
- end
397
+ def setup
398
+ @connection = ActiveRecord::Base.connection
399
+ end
302
400
 
303
- def teardown
304
- @connection.drop_table :bigint_defaults
305
- #, if_exists: true
306
- end
401
+ def teardown
402
+ @connection.drop_table :int_defaults, if_exists: true
403
+ end
307
404
 
308
- test "primary key with bigint allows default override via nil" do
309
- column = @connection.columns(:bigint_defaults).find { |c| c.name == 'id' }
310
- assert column.bigint?
311
- assert_not column.auto_increment?
312
- end
405
+ def test_schema_dump_primary_key_integer_with_default_nil
406
+ skip if current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
407
+ @connection.create_table(:int_defaults, id: :integer, default: nil, force: true)
408
+ schema = dump_table_schema "int_defaults"
409
+ assert_match %r{create_table "int_defaults", id: :integer, default: nil}, schema
410
+ end
313
411
 
314
- test "schema dump primary key with bigint default nil" do
315
- schema = dump_table_schema "bigint_defaults"
316
- assert_match %r{create_table "bigint_defaults", id: :bigint, default: nil}, schema
317
- end
412
+ def test_schema_dump_primary_key_bigint_with_default_nil
413
+ @connection.create_table(:int_defaults, id: :bigint, default: nil, force: true)
414
+ schema = dump_table_schema "int_defaults"
415
+ assert_match %r{create_table "int_defaults", id: :bigint, default: nil}, schema
318
416
  end
319
417
  end
320
418
 
321
419
  if current_adapter?(:PostgreSQLAdapter, :Mysql2Adapter)
322
- class PrimaryKeyBigSerialTest < ActiveRecord::TestCase
420
+ class PrimaryKeyIntegerTest < ActiveRecord::TestCase
323
421
  include SchemaDumpingHelper
324
422
 
325
423
  self.use_transactional_tests = false
@@ -329,47 +427,55 @@ if current_adapter?(:PostgreSQLAdapter, :Mysql2Adapter)
329
427
 
330
428
  setup do
331
429
  @connection = ActiveRecord::Base.connection
332
- if current_adapter?(:PostgreSQLAdapter)
333
- @connection.create_table(:widgets, id: :bigserial, force: true)
334
- else
335
- @connection.create_table(:widgets, id: :bigint, force: true)
336
- end
430
+ @pk_type = current_adapter?(:PostgreSQLAdapter) ? :serial : :integer
337
431
  end
338
432
 
339
433
  teardown do
340
- @connection.drop_table :widgets
341
- #, if_exists: true
342
- Widget.reset_column_information
434
+ @connection.drop_table :widgets, if_exists: true
343
435
  end
344
436
 
345
- test "primary key column type with bigserial" do
346
- column_type = Widget.type_for_attribute(Widget.primary_key)
347
- assert_equal :integer, column_type.type
348
- assert_equal 8, column_type.limit
437
+ test "primary key column type with serial/integer" do
438
+ @connection.create_table(:widgets, id: @pk_type, force: true)
439
+ column = @connection.columns(:widgets).find { |c| c.name == "id" }
440
+ assert_equal :integer, column.type
441
+ assert_not_predicate column, :bigint?
349
442
  end
350
443
 
351
- test "primary key with bigserial are automatically numbered" do
444
+ test "primary key with serial/integer are automatically numbered" do
445
+ @connection.create_table(:widgets, id: @pk_type, force: true)
352
446
  widget = Widget.create!
353
447
  assert_not_nil widget.id
354
448
  end
355
449
 
356
- test "schema dump primary key with bigserial" do
450
+ test "schema dump primary key with serial/integer" do
451
+ @connection.create_table(:widgets, id: @pk_type, force: true)
357
452
  schema = dump_table_schema "widgets"
358
- if current_adapter?(:PostgreSQLAdapter)
359
- assert_match %r{create_table "widgets", id: :bigserial, force: :cascade}, schema
360
- else
361
- assert_match %r{create_table "widgets", id: :bigint, force: :cascade}, schema
362
- end
453
+ assert_match %r{create_table "widgets", id: :#{@pk_type}, }, schema
363
454
  end
364
455
 
365
456
  if current_adapter?(:Mysql2Adapter)
366
457
  test "primary key column type with options" do
367
- @connection.create_table(:widgets, id: :primary_key, limit: 8, unsigned: true, force: true)
368
- column = @connection.columns(:widgets).find { |c| c.name == 'id' }
369
- assert column.auto_increment?
458
+ @connection.create_table(:widgets, id: :primary_key, limit: 4, unsigned: true, force: true)
459
+ column = @connection.columns(:widgets).find { |c| c.name == "id" }
460
+ assert_predicate column, :auto_increment?
370
461
  assert_equal :integer, column.type
371
- assert_equal 8, column.limit
372
- assert column.unsigned?
462
+ assert_not_predicate column, :bigint?
463
+ assert_predicate column, :unsigned?
464
+
465
+ schema = dump_table_schema "widgets"
466
+ assert_match %r/create_table "widgets", id: { type: :integer, unsigned: true }/, schema
467
+ end
468
+
469
+ test "bigint primary key with unsigned" do
470
+ @connection.create_table(:widgets, id: :bigint, unsigned: true, force: true)
471
+ column = @connection.columns(:widgets).find { |c| c.name == "id" }
472
+ assert_predicate column, :auto_increment?
473
+ assert_equal :integer, column.type
474
+ assert_predicate column, :bigint?
475
+ assert_predicate column, :unsigned?
476
+
477
+ schema = dump_table_schema "widgets"
478
+ assert_match %r/create_table "widgets", id: { type: :bigint, unsigned: true }/, schema
373
479
  end
374
480
  end
375
481
  end