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,22 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/owner'
4
+ require "models/owner"
3
5
 
4
6
  module ActiveRecord
5
7
  module ConnectionAdapters
6
8
  class SQLite3CreateFolder < ActiveRecord::SQLite3TestCase
7
9
  def test_sqlite_creates_directory
8
10
  Dir.mktmpdir do |dir|
9
- begin
10
- dir = Pathname.new(dir)
11
- @conn = Base.sqlite3_connection :database => dir.join("db/foo.sqlite3"),
12
- :adapter => 'sqlite3',
13
- :timeout => 100
11
+ dir = Pathname.new(dir)
12
+ @conn = Base.sqlite3_connection database: dir.join("db/foo.sqlite3"),
13
+ adapter: "sqlite3",
14
+ timeout: 100
14
15
 
15
- assert Dir.exist? dir.join('db')
16
- assert File.exist? dir.join('db/foo.sqlite3')
17
- ensure
18
- @conn.disconnect! if @conn
19
- end
16
+ assert Dir.exist? dir.join("db")
17
+ assert File.exist? dir.join("db/foo.sqlite3")
18
+ ensure
19
+ @conn.disconnect! if @conn
20
20
  end
21
21
  end
22
22
  end
@@ -1,20 +1,21 @@
1
- require 'cases/helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
2
4
 
3
5
  class SQLite3StatementPoolTest < ActiveRecord::SQLite3TestCase
4
6
  if Process.respond_to?(:fork)
5
7
  def test_cache_is_per_pid
6
-
7
8
  cache = ActiveRecord::ConnectionAdapters::SQLite3Adapter::StatementPool.new(10)
8
- cache['foo'] = 'bar'
9
- assert_equal 'bar', cache['foo']
9
+ cache["foo"] = "bar"
10
+ assert_equal "bar", cache["foo"]
10
11
 
11
12
  pid = fork {
12
- lookup = cache['foo'];
13
+ lookup = cache["foo"]
13
14
  exit!(!lookup)
14
15
  }
15
16
 
16
17
  Process.waitpid pid
17
- assert $?.success?, 'process should exit successfully'
18
+ assert $?.success?, "process should exit successfully"
18
19
  end
19
20
  end
20
21
  end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ class SQLite3TransactionTest < ActiveRecord::SQLite3TestCase
6
+ test "shared_cached? is true when cache-mode is enabled" do
7
+ with_connection(flags: shared_cache_flags) do |conn|
8
+ assert_predicate(conn, :shared_cache?)
9
+ end
10
+ end
11
+
12
+ test "shared_cached? is false when cache-mode is disabled" do
13
+ flags = ::SQLite3::Constants::Open::READWRITE | SQLite3::Constants::Open::CREATE
14
+
15
+ with_connection(flags: flags) do |conn|
16
+ assert_not_predicate(conn, :shared_cache?)
17
+ end
18
+ end
19
+
20
+ test "raises when trying to open a transaction in a isolation level other than `read_uncommitted`" do
21
+ with_connection do |conn|
22
+ assert_raises(ActiveRecord::TransactionIsolationError) do
23
+ conn.transaction(requires_new: true, isolation: :something) do
24
+ conn.transaction_manager.materialize_transactions
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ test "raises when trying to open a read_uncommitted transaction but shared-cache mode is turned off" do
31
+ with_connection do |conn|
32
+ error = assert_raises(StandardError) do
33
+ conn.transaction(requires_new: true, isolation: :read_uncommitted) do
34
+ conn.transaction_manager.materialize_transactions
35
+ end
36
+ end
37
+
38
+ assert_match("You need to enable the shared-cache mode", error.message)
39
+ end
40
+ end
41
+
42
+ test "opens a `read_uncommitted` transaction" do
43
+ with_connection(flags: shared_cache_flags) do |conn1|
44
+ conn1.create_table(:zines) { |t| t.column(:title, :string) } if in_memory_db?
45
+ conn1.transaction do
46
+ conn1.transaction_manager.materialize_transactions
47
+ conn1.execute("INSERT INTO zines (title) VALUES ('foo')")
48
+
49
+ with_connection(flags: shared_cache_flags) do |conn2|
50
+ conn2.transaction(joinable: false, isolation: :read_uncommitted) do
51
+ assert_not_empty(conn2.execute("SELECT * FROM zines WHERE title = 'foo'"))
52
+ end
53
+ end
54
+
55
+ raise ActiveRecord::Rollback
56
+ end
57
+ end
58
+ end
59
+
60
+ test "reset the read_uncommitted PRAGMA when a transaction is rolled back" do
61
+ with_connection(flags: shared_cache_flags) do |conn|
62
+ conn.transaction(joinable: false, isolation: :read_uncommitted) do
63
+ assert_not(read_uncommitted?(conn))
64
+ conn.transaction_manager.materialize_transactions
65
+ assert(read_uncommitted?(conn))
66
+
67
+ raise ActiveRecord::Rollback
68
+ end
69
+
70
+ assert_not(read_uncommitted?(conn))
71
+ end
72
+ end
73
+
74
+ test "reset the read_uncommitted PRAGMA when a transaction is committed" do
75
+ with_connection(flags: shared_cache_flags) do |conn|
76
+ conn.transaction(joinable: false, isolation: :read_uncommitted) do
77
+ assert_not(read_uncommitted?(conn))
78
+ conn.transaction_manager.materialize_transactions
79
+ assert(read_uncommitted?(conn))
80
+ end
81
+
82
+ assert_not(read_uncommitted?(conn))
83
+ end
84
+ end
85
+
86
+ test "set the read_uncommitted PRAGMA to its previous value" do
87
+ with_connection(flags: shared_cache_flags) do |conn|
88
+ conn.transaction(joinable: false, isolation: :read_uncommitted) do
89
+ conn.instance_variable_get(:@connection).read_uncommitted = true
90
+ assert(read_uncommitted?(conn))
91
+ conn.transaction_manager.materialize_transactions
92
+ assert(read_uncommitted?(conn))
93
+ end
94
+
95
+ assert(read_uncommitted?(conn))
96
+ end
97
+ end
98
+
99
+ private
100
+ def read_uncommitted?(conn)
101
+ conn.instance_variable_get(:@connection).get_first_value("PRAGMA read_uncommitted") != 0
102
+ end
103
+
104
+ def shared_cache_flags
105
+ ::SQLite3::Constants::Open::READWRITE | SQLite3::Constants::Open::CREATE | ::SQLite3::Constants::Open::SHAREDCACHE
106
+ end
107
+
108
+ def with_connection(options = {})
109
+ options = options.dup
110
+ if in_memory_db?
111
+ options[:database] ||= "file::memory:"
112
+ options[:flags] = options[:flags].to_i | ::SQLite3::Constants::Open::URI | ::SQLite3::Constants::Open::READWRITE
113
+ else
114
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
115
+ options[:database] ||= db_config.database
116
+ end
117
+ conn = ActiveRecord::Base.sqlite3_connection(options)
118
+
119
+ yield(conn)
120
+ ensure
121
+ conn.disconnect! if conn
122
+ end
123
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/customer'
4
+ require "models/customer"
3
5
 
4
6
  class AggregationsTest < ActiveRecord::TestCase
5
7
  fixtures :customers
@@ -25,7 +27,7 @@ class AggregationsTest < ActiveRecord::TestCase
25
27
 
26
28
  def test_immutable_value_objects
27
29
  customers(:david).balance = Money.new(100)
28
- assert_raise(frozen_error_class) { customers(:david).balance.instance_eval { @amount = 20 } }
30
+ assert_raise(FrozenError) { customers(:david).balance.instance_eval { @amount = 20 } }
29
31
  end
30
32
 
31
33
  def test_inferred_mapping
@@ -51,17 +53,17 @@ class AggregationsTest < ActiveRecord::TestCase
51
53
 
52
54
  Customer.update_all("gps_location = '24x113'")
53
55
  customers(:david).reload
54
- assert_equal '24x113', customers(:david)['gps_location']
56
+ assert_equal "24x113", customers(:david)["gps_location"]
55
57
 
56
- assert_equal GpsLocation.new('24x113'), customers(:david).gps_location
58
+ assert_equal GpsLocation.new("24x113"), customers(:david).gps_location
57
59
  end
58
60
 
59
61
  def test_gps_equality
60
- assert_equal GpsLocation.new('39x110'), GpsLocation.new('39x110')
62
+ assert_equal GpsLocation.new("39x110"), GpsLocation.new("39x110")
61
63
  end
62
64
 
63
65
  def test_gps_inequality
64
- assert_not_equal GpsLocation.new('39x110'), GpsLocation.new('39x111')
66
+ assert_not_equal GpsLocation.new("39x110"), GpsLocation.new("39x111")
65
67
  end
66
68
 
67
69
  def test_allow_nil_gps_is_nil
@@ -102,7 +104,7 @@ class AggregationsTest < ActiveRecord::TestCase
102
104
  end
103
105
 
104
106
  def test_nil_assignment_results_in_nil
105
- customers(:david).gps_location = GpsLocation.new('39x111')
107
+ customers(:david).gps_location = GpsLocation.new("39x111")
106
108
  assert_not_nil customers(:david).gps_location
107
109
  customers(:david).gps_location = nil
108
110
  assert_nil customers(:david).gps_location
@@ -129,13 +131,13 @@ class AggregationsTest < ActiveRecord::TestCase
129
131
  end
130
132
 
131
133
  def test_custom_constructor
132
- assert_equal 'Barney GUMBLE', customers(:barney).fullname.to_s
134
+ assert_equal "Barney GUMBLE", customers(:barney).fullname.to_s
133
135
  assert_kind_of Fullname, customers(:barney).fullname
134
136
  end
135
137
 
136
138
  def test_custom_converter
137
- customers(:barney).fullname = 'Barnoit Gumbleau'
138
- assert_equal 'Barnoit GUMBLEAU', customers(:barney).fullname.to_s
139
+ customers(:barney).fullname = "Barnoit Gumbleau"
140
+ assert_equal "Barnoit GUMBLEAU", customers(:barney).fullname.to_s
139
141
  assert_kind_of Fullname, customers(:barney).fullname
140
142
  end
141
143
 
@@ -154,11 +156,11 @@ class OverridingAggregationsTest < ActiveRecord::TestCase
154
156
  class DifferentName; end
155
157
 
156
158
  class Person < ActiveRecord::Base
157
- composed_of :composed_of, :mapping => %w(person_first_name first_name)
159
+ composed_of :composed_of, mapping: %w(person_first_name first_name)
158
160
  end
159
161
 
160
162
  class DifferentPerson < Person
161
- composed_of :composed_of, :class_name => 'DifferentName', :mapping => %w(different_person_first_name first_name)
163
+ composed_of :composed_of, class_name: "DifferentName", mapping: %w(different_person_first_name first_name)
162
164
  end
163
165
 
164
166
  def test_composed_of_aggregation_redefinition_reflections_should_differ_and_not_inherited
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/post"
5
+
6
+ class AnnotateTest < ActiveRecord::TestCase
7
+ fixtures :posts
8
+
9
+ def test_annotate_wraps_content_in_an_inline_comment
10
+ quoted_posts_id, quoted_posts = regexp_escape_table_name("posts.id"), regexp_escape_table_name("posts")
11
+
12
+ assert_sql(%r{\ASELECT #{quoted_posts_id} FROM #{quoted_posts} /\* foo \*/}i) do
13
+ posts = Post.select(:id).annotate("foo")
14
+ assert posts.first
15
+ end
16
+ end
17
+
18
+ def test_annotate_is_sanitized
19
+ quoted_posts_id, quoted_posts = regexp_escape_table_name("posts.id"), regexp_escape_table_name("posts")
20
+
21
+ assert_sql(%r{\ASELECT #{quoted_posts_id} FROM #{quoted_posts} /\* foo \*/}i) do
22
+ posts = Post.select(:id).annotate("*/foo/*")
23
+ assert posts.first
24
+ end
25
+
26
+ assert_sql(%r{\ASELECT #{quoted_posts_id} FROM #{quoted_posts} /\* foo \*/}i) do
27
+ posts = Post.select(:id).annotate("**//foo//**")
28
+ assert posts.first
29
+ end
30
+
31
+ assert_sql(%r{\ASELECT #{quoted_posts_id} FROM #{quoted_posts} /\* foo \*/ /\* bar \*/}i) do
32
+ posts = Post.select(:id).annotate("*/foo/*").annotate("*/bar")
33
+ assert posts.first
34
+ end
35
+
36
+ assert_sql(%r{\ASELECT #{quoted_posts_id} FROM #{quoted_posts} /\* \+ MAX_EXECUTION_TIME\(1\) \*/}i) do
37
+ posts = Post.select(:id).annotate("+ MAX_EXECUTION_TIME(1)")
38
+ assert posts.first
39
+ end
40
+ end
41
+
42
+ private
43
+ def regexp_escape_table_name(name)
44
+ Regexp.escape(Post.connection.quote_table_name(name))
45
+ end
46
+ end
@@ -1,126 +1,178 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
- if ActiveRecord::Base.connection.supports_migrations?
5
+ class ActiveRecordSchemaTest < ActiveRecord::TestCase
6
+ self.use_transactional_tests = false
7
+
8
+ setup do
9
+ @original_verbose = ActiveRecord::Migration.verbose
10
+ ActiveRecord::Migration.verbose = false
11
+ @connection = ActiveRecord::Base.connection
12
+ @schema_migration = @connection.schema_migration
13
+ @schema_migration.drop_table
14
+ end
15
+
16
+ teardown do
17
+ @connection.drop_table :fruits rescue nil
18
+ @connection.drop_table :nep_fruits rescue nil
19
+ @connection.drop_table :nep_schema_migrations rescue nil
20
+ @connection.drop_table :has_timestamps rescue nil
21
+ @connection.drop_table :multiple_indexes rescue nil
22
+ @schema_migration.delete_all rescue nil
23
+ ActiveRecord::Migration.verbose = @original_verbose
24
+ end
4
25
 
5
- class ActiveRecordSchemaTest < ActiveRecord::TestCase
6
- self.use_transactional_tests = false
26
+ def test_has_primary_key
27
+ old_primary_key_prefix_type = ActiveRecord::Base.primary_key_prefix_type
28
+ ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
29
+ assert_equal "version", @schema_migration.primary_key
7
30
 
8
- setup do
9
- @original_verbose = ActiveRecord::Migration.verbose
10
- ActiveRecord::Migration.verbose = false
11
- @connection = ActiveRecord::Base.connection
12
- ActiveRecord::SchemaMigration.drop_table
31
+ @schema_migration.create_table
32
+ assert_difference "@schema_migration.count", 1 do
33
+ @schema_migration.create version: 12
13
34
  end
35
+ ensure
36
+ @schema_migration.drop_table
37
+ ActiveRecord::Base.primary_key_prefix_type = old_primary_key_prefix_type
38
+ end
14
39
 
15
- teardown do
16
- @connection.drop_table :fruits rescue nil
17
- @connection.drop_table :nep_fruits rescue nil
18
- @connection.drop_table :nep_schema_migrations rescue nil
19
- @connection.drop_table :has_timestamps rescue nil
20
- @connection.drop_table :multiple_indexes rescue nil
21
- ActiveRecord::SchemaMigration.delete_all rescue nil
22
- ActiveRecord::Migration.verbose = @original_verbose
40
+ def test_schema_define
41
+ ActiveRecord::Schema.define(version: 7) do
42
+ create_table :fruits do |t|
43
+ t.column :color, :string
44
+ t.column :fruit_size, :string # NOTE: "size" is reserved in Oracle
45
+ t.column :texture, :string
46
+ t.column :flavor, :string
47
+ end
23
48
  end
24
49
 
25
- def test_has_primary_key
26
- old_primary_key_prefix_type = ActiveRecord::Base.primary_key_prefix_type
27
- ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
28
- assert_equal "version", ActiveRecord::SchemaMigration.primary_key
50
+ assert_nothing_raised { @connection.select_all "SELECT * FROM fruits" }
51
+ assert_nothing_raised { @connection.select_all "SELECT * FROM schema_migrations" }
52
+ assert_equal 7, @connection.migration_context.current_version
53
+ end
29
54
 
30
- ActiveRecord::SchemaMigration.create_table
31
- assert_difference "ActiveRecord::SchemaMigration.count", 1 do
32
- ActiveRecord::SchemaMigration.create version: 12
55
+ def test_schema_define_with_table_name_prefix
56
+ old_table_name_prefix = ActiveRecord::Base.table_name_prefix
57
+ ActiveRecord::Base.table_name_prefix = "nep_"
58
+ @schema_migration.reset_table_name
59
+ ActiveRecord::InternalMetadata.reset_table_name
60
+ ActiveRecord::Schema.define(version: 7) do
61
+ create_table :fruits do |t|
62
+ t.column :color, :string
63
+ t.column :fruit_size, :string # NOTE: "size" is reserved in Oracle
64
+ t.column :texture, :string
65
+ t.column :flavor, :string
33
66
  end
34
- ensure
35
- ActiveRecord::SchemaMigration.drop_table
36
- ActiveRecord::Base.primary_key_prefix_type = old_primary_key_prefix_type
37
67
  end
68
+ assert_equal 7, @connection.migration_context.current_version
69
+ ensure
70
+ ActiveRecord::Base.table_name_prefix = old_table_name_prefix
71
+ @schema_migration.reset_table_name
72
+ ActiveRecord::InternalMetadata.reset_table_name
73
+ end
38
74
 
39
- def test_schema_define
40
- ActiveRecord::Schema.define(:version => 7) do
41
- create_table :fruits do |t|
42
- t.column :color, :string
43
- t.column :fruit_size, :string # NOTE: "size" is reserved in Oracle
44
- t.column :texture, :string
45
- t.column :flavor, :string
75
+ def test_schema_raises_an_error_for_invalid_column_type
76
+ assert_raise NoMethodError do
77
+ ActiveRecord::Schema.define(version: 8) do
78
+ create_table :vegetables do |t|
79
+ t.unknown :color
46
80
  end
47
81
  end
82
+ end
83
+ end
48
84
 
49
- assert_nothing_raised { @connection.select_all "SELECT * FROM fruits" }
50
- assert_nothing_raised { @connection.select_all "SELECT * FROM schema_migrations" }
51
- assert_equal 7, ActiveRecord::Migrator::current_version
85
+ def test_schema_subclass
86
+ Class.new(ActiveRecord::Schema).define(version: 9) do
87
+ create_table :fruits
52
88
  end
89
+ assert_nothing_raised { @connection.select_all "SELECT * FROM fruits" }
90
+ end
53
91
 
54
- def test_schema_define_w_table_name_prefix
55
- table_name = ActiveRecord::SchemaMigration.table_name
56
- old_table_name_prefix = ActiveRecord::Base.table_name_prefix
57
- ActiveRecord::Base.table_name_prefix = "nep_"
58
- ActiveRecord::SchemaMigration.table_name = "nep_#{table_name}"
59
- ActiveRecord::Schema.define(:version => 7) do
60
- create_table :fruits do |t|
61
- t.column :color, :string
62
- t.column :fruit_size, :string # NOTE: "size" is reserved in Oracle
63
- t.column :texture, :string
64
- t.column :flavor, :string
65
- end
92
+ def test_normalize_version
93
+ assert_equal "118", @schema_migration.normalize_migration_number("0000118")
94
+ assert_equal "002", @schema_migration.normalize_migration_number("2")
95
+ assert_equal "017", @schema_migration.normalize_migration_number("0017")
96
+ assert_equal "20131219224947", @schema_migration.normalize_migration_number("20131219224947")
97
+ end
98
+
99
+ def test_schema_load_with_multiple_indexes_for_column_of_different_names
100
+ ActiveRecord::Schema.define do
101
+ create_table :multiple_indexes do |t|
102
+ t.string "foo"
103
+ t.index ["foo"], name: "multiple_indexes_foo_1"
104
+ t.index ["foo"], name: "multiple_indexes_foo_2"
66
105
  end
67
- assert_equal 7, ActiveRecord::Migrator::current_version
68
- ensure
69
- ActiveRecord::Base.table_name_prefix = old_table_name_prefix
70
- ActiveRecord::SchemaMigration.table_name = table_name
71
106
  end
72
107
 
73
- def test_schema_raises_an_error_for_invalid_column_type
74
- assert_raise NoMethodError do
75
- ActiveRecord::Schema.define(:version => 8) do
76
- create_table :vegetables do |t|
77
- t.unknown :color
78
- end
79
- end
108
+ indexes = @connection.indexes("multiple_indexes")
109
+
110
+ assert_equal 2, indexes.length
111
+ assert_equal ["multiple_indexes_foo_1", "multiple_indexes_foo_2"], indexes.collect(&:name).sort
112
+ end
113
+
114
+ def test_timestamps_without_null_set_null_to_false_on_create_table
115
+ ActiveRecord::Schema.define do
116
+ create_table :has_timestamps do |t|
117
+ t.timestamps
80
118
  end
81
119
  end
82
120
 
83
- def test_schema_subclass
84
- Class.new(ActiveRecord::Schema).define(:version => 9) do
85
- create_table :fruits
121
+ assert @connection.column_exists?(:has_timestamps, :created_at, null: false)
122
+ assert @connection.column_exists?(:has_timestamps, :updated_at, null: false)
123
+ end
124
+
125
+ def test_timestamps_without_null_set_null_to_false_on_change_table
126
+ ActiveRecord::Schema.define do
127
+ create_table :has_timestamps
128
+
129
+ change_table :has_timestamps do |t|
130
+ t.timestamps default: Time.now
86
131
  end
87
- assert_nothing_raised { @connection.select_all "SELECT * FROM fruits" }
88
132
  end
89
133
 
90
- def test_normalize_version
91
- assert_equal "118", ActiveRecord::SchemaMigration.normalize_migration_number("0000118")
92
- assert_equal "002", ActiveRecord::SchemaMigration.normalize_migration_number("2")
93
- assert_equal "017", ActiveRecord::SchemaMigration.normalize_migration_number("0017")
94
- assert_equal "20131219224947", ActiveRecord::SchemaMigration.normalize_migration_number("20131219224947")
95
- end
134
+ assert @connection.column_exists?(:has_timestamps, :created_at, null: false)
135
+ assert @connection.column_exists?(:has_timestamps, :updated_at, null: false)
136
+ end
96
137
 
97
- def test_schema_load_with_multiple_indexes_for_column_of_different_names
138
+ if ActiveRecord::Base.connection.supports_bulk_alter?
139
+ def test_timestamps_without_null_set_null_to_false_on_change_table_with_bulk
98
140
  ActiveRecord::Schema.define do
99
- create_table :multiple_indexes do |t|
100
- t.string "foo"
101
- t.index ["foo"], name: "multiple_indexes_foo_1"
102
- t.index ["foo"], name: "multiple_indexes_foo_2"
141
+ create_table :has_timestamps
142
+
143
+ change_table :has_timestamps, bulk: true do |t|
144
+ t.timestamps default: Time.now
103
145
  end
104
146
  end
105
147
 
106
- indexes = @connection.indexes("multiple_indexes")
148
+ assert @connection.column_exists?(:has_timestamps, :created_at, null: false)
149
+ assert @connection.column_exists?(:has_timestamps, :updated_at, null: false)
150
+ end
151
+ end
107
152
 
108
- assert_equal 2, indexes.length
109
- assert_equal ["multiple_indexes_foo_1", "multiple_indexes_foo_2"], indexes.collect(&:name).sort
153
+ def test_timestamps_without_null_set_null_to_false_on_add_timestamps
154
+ ActiveRecord::Schema.define do
155
+ create_table :has_timestamps
156
+ add_timestamps :has_timestamps, default: Time.now
110
157
  end
111
158
 
112
- def test_timestamps_without_null_set_null_to_false_on_create_table
159
+ assert @connection.column_exists?(:has_timestamps, :created_at, null: false)
160
+ assert @connection.column_exists?(:has_timestamps, :updated_at, null: false)
161
+ end
162
+
163
+ if supports_datetime_with_precision?
164
+ def test_timestamps_sets_precision_on_create_table
113
165
  ActiveRecord::Schema.define do
114
166
  create_table :has_timestamps do |t|
115
167
  t.timestamps
116
168
  end
117
169
  end
118
170
 
119
- assert !@connection.columns(:has_timestamps).find { |c| c.name == 'created_at' }.null
120
- assert !@connection.columns(:has_timestamps).find { |c| c.name == 'updated_at' }.null
171
+ assert @connection.column_exists?(:has_timestamps, :created_at, precision: 6, null: false)
172
+ assert @connection.column_exists?(:has_timestamps, :updated_at, precision: 6, null: false)
121
173
  end
122
174
 
123
- def test_timestamps_without_null_set_null_to_false_on_change_table
175
+ def test_timestamps_sets_precision_on_change_table
124
176
  ActiveRecord::Schema.define do
125
177
  create_table :has_timestamps
126
178
 
@@ -129,18 +181,33 @@ if ActiveRecord::Base.connection.supports_migrations?
129
181
  end
130
182
  end
131
183
 
132
- assert !@connection.columns(:has_timestamps).find { |c| c.name == 'created_at' }.null
133
- assert !@connection.columns(:has_timestamps).find { |c| c.name == 'updated_at' }.null
184
+ assert @connection.column_exists?(:has_timestamps, :created_at, precision: 6, null: false)
185
+ assert @connection.column_exists?(:has_timestamps, :updated_at, precision: 6, null: false)
186
+ end
187
+
188
+ if ActiveRecord::Base.connection.supports_bulk_alter?
189
+ def test_timestamps_sets_precision_on_change_table_with_bulk
190
+ ActiveRecord::Schema.define do
191
+ create_table :has_timestamps
192
+
193
+ change_table :has_timestamps, bulk: true do |t|
194
+ t.timestamps default: Time.now
195
+ end
196
+ end
197
+
198
+ assert @connection.column_exists?(:has_timestamps, :created_at, precision: 6, null: false)
199
+ assert @connection.column_exists?(:has_timestamps, :updated_at, precision: 6, null: false)
200
+ end
134
201
  end
135
202
 
136
- def test_timestamps_without_null_set_null_to_false_on_add_timestamps
203
+ def test_timestamps_sets_precision_on_add_timestamps
137
204
  ActiveRecord::Schema.define do
138
205
  create_table :has_timestamps
139
206
  add_timestamps :has_timestamps, default: Time.now
140
207
  end
141
208
 
142
- assert !@connection.columns(:has_timestamps).find { |c| c.name == 'created_at' }.null
143
- assert !@connection.columns(:has_timestamps).find { |c| c.name == 'updated_at' }.null
209
+ assert @connection.column_exists?(:has_timestamps, :created_at, precision: 6, null: false)
210
+ assert @connection.column_exists?(:has_timestamps, :updated_at, precision: 6, null: false)
144
211
  end
145
212
  end
146
213
  end