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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/person'
5
- require 'models/developer'
6
- require 'models/computer'
7
- require 'models/parrot'
8
- require 'models/company'
4
+ require "models/topic"
5
+ require "models/reply"
6
+ require "models/developer"
7
+ require "models/computer"
8
+ require "models/parrot"
9
+ require "models/company"
10
+ require "models/price_estimate"
9
11
 
10
12
  class ValidationsTest < ActiveRecord::TestCase
11
13
  fixtures :topics, :developers
@@ -17,7 +19,7 @@ class ValidationsTest < ActiveRecord::TestCase
17
19
  def test_valid_uses_create_context_when_new
18
20
  r = WrongReply.new
19
21
  r.title = "Wrong Create"
20
- assert_not r.valid?
22
+ assert_not_predicate r, :valid?
21
23
  assert r.errors[:title].any?, "A reply with a bad title should mark that attribute as invalid"
22
24
  assert_equal ["is Wrong Create"], r.errors[:title], "A reply with a bad content should contain an error"
23
25
  end
@@ -36,8 +38,8 @@ class ValidationsTest < ActiveRecord::TestCase
36
38
  end
37
39
 
38
40
  def test_valid_using_special_context
39
- r = WrongReply.new(:title => "Valid title")
40
- assert !r.valid?(:special_case)
41
+ r = WrongReply.new(title: "Valid title")
42
+ assert_not r.valid?(:special_case)
41
43
  assert_equal "Invalid", r.errors[:author_name].join
42
44
 
43
45
  r.author_name = "secret"
@@ -53,7 +55,7 @@ class ValidationsTest < ActiveRecord::TestCase
53
55
  end
54
56
 
55
57
  def test_invalid_using_multiple_contexts
56
- r = WrongReply.new(:title => 'Wrong Create')
58
+ r = WrongReply.new(title: "Wrong Create")
57
59
  assert r.invalid?([:special_case, :create])
58
60
  assert_equal "Invalid", r.errors[:author_name].join
59
61
  assert_equal "is Wrong Create", r.errors[:title].join
@@ -95,7 +97,7 @@ class ValidationsTest < ActiveRecord::TestCase
95
97
  assert_raise(ActiveRecord::RecordInvalid) do
96
98
  WrongReply.new.validate!(:special_case)
97
99
  end
98
- r = WrongReply.new(:title => "Valid title", :author_name => "secret", :content => "Good")
100
+ r = WrongReply.new(title: "Valid title", author_name: "secret", content: "Good")
99
101
  assert r.validate!(:special_case)
100
102
  end
101
103
 
@@ -107,7 +109,7 @@ class ValidationsTest < ActiveRecord::TestCase
107
109
 
108
110
  def test_exception_on_create_bang_with_block
109
111
  assert_raise(ActiveRecord::RecordInvalid) do
110
- WrongReply.create!({ "title" => "OK" }) do |r|
112
+ WrongReply.create!("title" => "OK") do |r|
111
113
  r.content = nil
112
114
  end
113
115
  end
@@ -123,8 +125,8 @@ class ValidationsTest < ActiveRecord::TestCase
123
125
 
124
126
  def test_save_without_validation
125
127
  reply = WrongReply.new
126
- assert !reply.save
127
- assert reply.save(:validate => false)
128
+ assert_not reply.save
129
+ assert reply.save(validate: false)
128
130
  end
129
131
 
130
132
  def test_validates_acceptance_of_with_non_existent_table
@@ -137,14 +139,23 @@ class ValidationsTest < ActiveRecord::TestCase
137
139
 
138
140
  def test_throw_away_typing
139
141
  d = Developer.new("name" => "David", "salary" => "100,000")
140
- assert !d.valid?
142
+ assert_not_predicate d, :valid?
141
143
  assert_equal 100, d.salary
142
144
  assert_equal "100,000", d.salary_before_type_cast
143
145
  end
144
146
 
147
+ def test_validates_acceptance_of_with_undefined_attribute_methods
148
+ klass = Class.new(Topic)
149
+ klass.validates_acceptance_of(:approved)
150
+ topic = klass.new(approved: true)
151
+ klass.undefine_attribute_methods
152
+ assert topic.approved
153
+ end
154
+
145
155
  def test_validates_acceptance_of_as_database_column
146
- Topic.validates_acceptance_of(:approved)
147
- topic = Topic.create("approved" => true)
156
+ klass = Class.new(Topic)
157
+ klass.validates_acceptance_of(:approved)
158
+ topic = klass.create("approved" => true)
148
159
  assert topic["approved"]
149
160
  end
150
161
 
@@ -161,10 +172,10 @@ class ValidationsTest < ActiveRecord::TestCase
161
172
  validates_numericality_of :wibble, only_integer: true
162
173
  end
163
174
 
164
- topic = klass.new(wibble: '123-4567')
165
- topic.wibble.gsub!('-', '')
175
+ topic = klass.new(wibble: "123-4567")
176
+ topic.wibble.gsub!("-", "")
166
177
 
167
- assert topic.valid?
178
+ assert_predicate topic, :valid?
168
179
  end
169
180
 
170
181
  def test_numericality_validation_checks_against_raw_value
@@ -173,17 +184,41 @@ class ValidationsTest < ActiveRecord::TestCase
173
184
  ActiveModel::Name.new(self, nil, "Topic")
174
185
  end
175
186
  attribute :wibble, :decimal, scale: 2, precision: 9
176
- validates_numericality_of :wibble, greater_than_or_equal_to: BigDecimal.new("97.18")
187
+ validates_numericality_of :wibble, greater_than_or_equal_to: BigDecimal("97.18")
177
188
  end
178
189
 
179
- assert_not klass.new(wibble: "97.179").valid?
180
- assert_not klass.new(wibble: 97.179).valid?
181
- assert_not klass.new(wibble: BigDecimal.new("97.179")).valid?
190
+ ["97.179", 97.179, BigDecimal("97.179")].each do |raw_value|
191
+ subject = klass.new(wibble: raw_value)
192
+ assert_equal BigDecimal("97.18"), subject.wibble
193
+ assert_predicate subject, :valid?
194
+ end
195
+
196
+ ["97.174", 97.174, BigDecimal("97.174")].each do |raw_value|
197
+ subject = klass.new(wibble: raw_value)
198
+ assert_equal BigDecimal("97.17"), subject.wibble
199
+ assert_not_predicate subject, :valid?
200
+ end
201
+ end
202
+
203
+ def test_numericality_validator_wont_be_affected_by_custom_getter
204
+ price_estimate = PriceEstimate.new(price: 50)
205
+
206
+ assert_equal "$50.00", price_estimate.price
207
+ assert_equal 50, price_estimate.price_before_type_cast
208
+ assert_equal 50, price_estimate.read_attribute(:price)
209
+
210
+ assert_predicate price_estimate, :price_came_from_user?
211
+ assert_predicate price_estimate, :valid?
212
+
213
+ price_estimate.save!
214
+
215
+ assert_not_predicate price_estimate, :price_came_from_user?
216
+ assert_predicate price_estimate, :valid?
182
217
  end
183
218
 
184
219
  def test_acceptance_validator_doesnt_require_db_connection
185
220
  klass = Class.new(ActiveRecord::Base) do
186
- self.table_name = 'posts'
221
+ self.table_name = "posts"
187
222
  end
188
223
  klass.reset_column_information
189
224
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
  require "models/book"
3
5
  require "support/schema_dumping_helper"
@@ -11,13 +13,14 @@ module ViewBehavior
11
13
  end
12
14
 
13
15
  class Ebook < ActiveRecord::Base
16
+ self.table_name = "ebooks"
14
17
  self.primary_key = "id"
15
18
  end
16
19
 
17
20
  def setup
18
21
  super
19
22
  @connection = ActiveRecord::Base.connection
20
- create_view "ebooks", <<-SQL
23
+ create_view "ebooks", <<~SQL
21
24
  SELECT id, name, status FROM books WHERE format = 'ebook'
22
25
  SQL
23
26
  end
@@ -44,8 +47,7 @@ module ViewBehavior
44
47
 
45
48
  def test_table_exists
46
49
  view_name = Ebook.table_name
47
- # TODO: switch this assertion around once we changed #tables to not return views.
48
- ActiveSupport::Deprecation.silence { assert @connection.table_exists?(view_name), "'#{view_name}' table should exist" }
50
+ assert_not @connection.table_exists?(view_name), "'#{view_name}' table should not exist"
49
51
  end
50
52
 
51
53
  def test_views_ara_valid_data_sources
@@ -60,7 +62,7 @@ module ViewBehavior
60
62
  end
61
63
 
62
64
  def test_attributes
63
- assert_equal({"id" => 2, "name" => "Ruby for Rails", "status" => 0},
65
+ assert_equal({ "id" => 2, "name" => "Ruby for Rails", "status" => 0 },
64
66
  Ebook.first.attributes)
65
67
  end
66
68
 
@@ -75,142 +77,146 @@ module ViewBehavior
75
77
  schema = dump_table_schema "ebooks"
76
78
  assert_no_match %r{create_table "ebooks"}, schema
77
79
  end
78
- end
79
-
80
- if ActiveRecord::Base.connection.supports_views?
81
- class ViewWithPrimaryKeyTest < ActiveRecord::TestCase
82
- include ViewBehavior
83
80
 
84
81
  private
85
- def create_view(name, query)
86
- @connection.execute "CREATE VIEW #{name} AS #{query}"
87
- end
88
-
89
- def drop_view(name)
90
- @connection.execute "DROP VIEW #{name}" if @connection.view_exists? name
91
- end
82
+ def quote_table_name(name)
83
+ @connection.quote_table_name(name)
84
+ end
92
85
  end
93
86
 
94
- class ViewWithoutPrimaryKeyTest < ActiveRecord::TestCase
95
- include SchemaDumpingHelper
96
- fixtures :books
97
-
98
- class Paperback < ActiveRecord::Base; end
99
-
100
- setup do
101
- @connection = ActiveRecord::Base.connection
102
- @connection.execute <<-SQL
103
- CREATE VIEW paperbacks
104
- AS SELECT name, status FROM books WHERE format = 'paperback'
105
- SQL
106
- end
107
-
108
- teardown do
109
- @connection.execute "DROP VIEW paperbacks" if @connection.view_exists? "paperbacks"
110
- end
111
-
112
- def test_reading
113
- books = Paperback.all
114
- assert_equal ["Agile Web Development with Rails"], books.map(&:name)
115
- end
87
+ if ActiveRecord::Base.connection.supports_views?
88
+ class ViewWithPrimaryKeyTest < ActiveRecord::TestCase
89
+ include ViewBehavior
116
90
 
117
- def test_views
118
- assert_equal [Paperback.table_name], @connection.views
119
- end
91
+ private
92
+ def create_view(name, query)
93
+ @connection.execute "CREATE VIEW #{quote_table_name(name)} AS #{query}"
94
+ end
120
95
 
121
- def test_view_exists
122
- view_name = Paperback.table_name
123
- assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
96
+ def drop_view(name)
97
+ @connection.execute "DROP VIEW #{quote_table_name(name)}" if @connection.view_exists? name
98
+ end
124
99
  end
125
100
 
126
- def test_table_exists
127
- view_name = Paperback.table_name
128
- # TODO: switch this assertion around once we changed #tables to not return views.
129
- ActiveSupport::Deprecation.silence { assert @connection.table_exists?(view_name), "'#{view_name}' table should exist" }
130
- end
101
+ class ViewWithoutPrimaryKeyTest < ActiveRecord::TestCase
102
+ include SchemaDumpingHelper
103
+ fixtures :books
131
104
 
132
- def test_column_definitions
133
- assert_equal([["name", :string],
134
- ["status", :integer]], Paperback.columns.map { |c| [c.name, c.type] })
135
- end
105
+ class Paperback < ActiveRecord::Base; end
136
106
 
137
- def test_attributes
138
- assert_equal({"name" => "Agile Web Development with Rails", "status" => 2},
139
- Paperback.first.attributes)
140
- end
107
+ setup do
108
+ @connection = ActiveRecord::Base.connection
109
+ @connection.execute <<~SQL
110
+ CREATE VIEW paperbacks
111
+ AS SELECT name, status FROM books WHERE format = 'paperback'
112
+ SQL
113
+ end
141
114
 
142
- def test_does_not_have_a_primary_key
143
- assert_nil Paperback.primary_key
144
- end
115
+ teardown do
116
+ @connection.execute "DROP VIEW paperbacks" if @connection.view_exists? "paperbacks"
117
+ end
145
118
 
146
- def test_does_not_dump_view_as_table
147
- schema = dump_table_schema "paperbacks"
148
- assert_no_match %r{create_table "paperbacks"}, schema
149
- end
150
- end
119
+ def test_reading
120
+ books = Paperback.all
121
+ assert_equal ["Agile Web Development with Rails"], books.map(&:name)
122
+ end
151
123
 
152
- # sqlite dose not support CREATE, INSERT, and DELETE for VIEW
153
- if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :SQLServerAdapter)
154
- class UpdateableViewTest < ActiveRecord::TestCase
155
- self.use_transactional_tests = false
156
- fixtures :books
124
+ def test_views
125
+ assert_equal [Paperback.table_name], @connection.views
126
+ end
157
127
 
158
- class PrintedBook < ActiveRecord::Base
159
- self.primary_key = "id"
160
- end
128
+ def test_view_exists
129
+ view_name = Paperback.table_name
130
+ assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
131
+ end
161
132
 
162
- setup do
163
- @connection = ActiveRecord::Base.connection
164
- @connection.execute <<-SQL
165
- CREATE VIEW printed_books
166
- AS SELECT id, name, status, format FROM books WHERE format = 'paperback'
167
- SQL
168
- end
133
+ def test_table_exists
134
+ view_name = Paperback.table_name
135
+ assert_not @connection.table_exists?(view_name), "'#{view_name}' table should not exist"
136
+ end
169
137
 
170
- teardown do
171
- @connection.execute "DROP VIEW printed_books" if @connection.view_exists? "printed_books"
172
- end
138
+ def test_column_definitions
139
+ assert_equal([["name", :string],
140
+ ["status", :integer]], Paperback.columns.map { |c| [c.name, c.type] })
141
+ end
173
142
 
174
- def test_update_record
175
- book = PrintedBook.first
176
- book.name = "AWDwR"
177
- book.save!
178
- book.reload
179
- assert_equal "AWDwR", book.name
180
- end
143
+ def test_attributes
144
+ assert_equal({ "name" => "Agile Web Development with Rails", "status" => 2 },
145
+ Paperback.first.attributes)
146
+ end
181
147
 
182
- def test_insert_record
183
- PrintedBook.create! name: "Rails in Action", status: 0, format: "paperback"
148
+ def test_does_not_have_a_primary_key
149
+ assert_nil Paperback.primary_key
150
+ end
184
151
 
185
- new_book = PrintedBook.last
186
- assert_equal "Rails in Action", new_book.name
152
+ def test_does_not_dump_view_as_table
153
+ schema = dump_table_schema "paperbacks"
154
+ assert_no_match %r{create_table "paperbacks"}, schema
155
+ end
187
156
  end
188
157
 
189
- def test_update_record_to_fail_view_conditions
190
- book = PrintedBook.first
191
- book.format = "ebook"
192
- book.save!
193
-
194
- assert_raises ActiveRecord::RecordNotFound do
195
- book.reload
158
+ # sqlite dose not support CREATE, INSERT, and DELETE for VIEW
159
+ if current_adapter?(:Mysql2Adapter, :SQLServerAdapter, :PostgreSQLAdapter, :IBM_DBAdapter)
160
+
161
+ class UpdateableViewTest < ActiveRecord::TestCase
162
+ self.use_transactional_tests = false
163
+ fixtures :books
164
+
165
+ class PrintedBook < ActiveRecord::Base
166
+ self.primary_key = "id"
167
+ end
168
+
169
+ setup do
170
+ @connection = ActiveRecord::Base.connection
171
+ @connection.execute <<~SQL
172
+ CREATE VIEW printed_books
173
+ AS SELECT id, name, status, format FROM books WHERE format = 'paperback'
174
+ SQL
175
+ end
176
+
177
+ teardown do
178
+ @connection.execute "DROP VIEW printed_books" if @connection.view_exists? "printed_books"
179
+ end
180
+
181
+ def test_update_record
182
+ book = PrintedBook.first
183
+ book.name = "AWDwR"
184
+ book.save!
185
+ book.reload
186
+ assert_equal "AWDwR", book.name
187
+ end
188
+
189
+ def test_insert_record
190
+ PrintedBook.create! name: "Rails in Action", status: 0, format: "paperback"
191
+
192
+ new_book = PrintedBook.last
193
+ assert_equal "Rails in Action", new_book.name
194
+ end
195
+
196
+ def test_update_record_to_fail_view_conditions
197
+ book = PrintedBook.first
198
+ book.format = "ebook"
199
+ book.save!
200
+
201
+ assert_raises ActiveRecord::RecordNotFound do
202
+ book.reload
203
+ end
204
+ end
196
205
  end
197
- end
198
- end
199
- end # end fo `if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :SQLServerAdapter)`
200
- end # end fo `if ActiveRecord::Base.connection.supports_views?`
206
+ end # end of `if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :SQLServerAdapter)`
207
+ end # end of `if ActiveRecord::Base.connection.supports_views?`
201
208
 
202
- if ActiveRecord::Base.connection.respond_to?(:supports_materialized_views?) &&
203
- ActiveRecord::Base.connection.supports_materialized_views?
204
- class MaterializedViewTest < ActiveRecord::PostgreSQLTestCase
205
- include ViewBehavior
209
+ if ActiveRecord::Base.connection.supports_materialized_views?
210
+ class MaterializedViewTest < ActiveRecord::PostgreSQLTestCase
211
+ include ViewBehavior
206
212
 
207
- private
208
- def create_view(name, query)
209
- @connection.execute "CREATE MATERIALIZED VIEW #{name} AS #{query}"
210
- end
213
+ private
214
+ def create_view(name, query)
215
+ @connection.execute "CREATE MATERIALIZED VIEW #{quote_table_name(name)} AS #{query}"
216
+ end
211
217
 
212
- def drop_view(name)
213
- @connection.execute "DROP MATERIALIZED VIEW #{name}" if @connection.view_exists? name
218
+ def drop_view(name)
219
+ @connection.execute "DROP MATERIALIZED VIEW #{quote_table_name(name)}" if @connection.view_exists? name
220
+ end
214
221
  end
215
222
  end
216
- end
@@ -1,15 +1,17 @@
1
- require 'cases/helper'
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/post'
5
- require 'models/author'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/topic"
5
+ require "models/reply"
6
+ require "models/post"
7
+ require "models/author"
6
8
 
7
9
  class YamlSerializationTest < ActiveRecord::TestCase
8
- fixtures :topics, :authors, :posts
10
+ fixtures :topics, :authors, :author_addresses, :posts
9
11
 
10
12
  def test_to_yaml_with_time_with_zone_should_not_raise_exception
11
13
  with_timezone_config aware_attributes: true, zone: "Pacific Time (US & Canada)" do
12
- topic = Topic.new(:written_on => DateTime.now)
14
+ topic = Topic.new(written_on: DateTime.now)
13
15
  assert_nothing_raised { topic.to_yaml }
14
16
  end
15
17
  end
@@ -17,26 +19,26 @@ class YamlSerializationTest < ActiveRecord::TestCase
17
19
  def test_roundtrip
18
20
  topic = Topic.first
19
21
  assert topic
20
- t = YAML.load YAML.dump topic
22
+ t = yaml_load YAML.dump topic
21
23
  assert_equal topic, t
22
24
  end
23
25
 
24
26
  def test_roundtrip_serialized_column
25
- topic = Topic.new(:content => {:omg=>:lol})
26
- assert_equal({:omg=>:lol}, YAML.load(YAML.dump(topic)).content)
27
+ topic = Topic.new(content: { omg: :lol })
28
+ assert_equal({ omg: :lol }, yaml_load(YAML.dump(topic)).content)
27
29
  end
28
30
 
29
31
  def test_psych_roundtrip
30
32
  topic = Topic.first
31
33
  assert topic
32
- t = Psych.load Psych.dump topic
34
+ t = yaml_load Psych.dump topic
33
35
  assert_equal topic, t
34
36
  end
35
37
 
36
38
  def test_psych_roundtrip_new_object
37
39
  topic = Topic.new
38
40
  assert topic
39
- t = Psych.load Psych.dump topic
41
+ t = yaml_load Psych.dump topic
40
42
  assert_equal topic.attributes, t.attributes
41
43
  end
42
44
 
@@ -47,38 +49,38 @@ class YamlSerializationTest < ActiveRecord::TestCase
47
49
  def test_raw_types_are_not_changed_on_round_trip
48
50
  topic = Topic.new(parent_id: "123")
49
51
  assert_equal "123", topic.parent_id_before_type_cast
50
- assert_equal "123", YAML.load(YAML.dump(topic)).parent_id_before_type_cast
52
+ assert_equal "123", yaml_load(YAML.dump(topic)).parent_id_before_type_cast
51
53
  end
52
54
 
53
55
  def test_cast_types_are_not_changed_on_round_trip
54
56
  topic = Topic.new(parent_id: "123")
55
57
  assert_equal 123, topic.parent_id
56
- assert_equal 123, YAML.load(YAML.dump(topic)).parent_id
58
+ assert_equal 123, yaml_load(YAML.dump(topic)).parent_id
57
59
  end
58
60
 
59
61
  def test_new_records_remain_new_after_round_trip
60
62
  topic = Topic.new
61
63
 
62
64
  assert topic.new_record?, "Sanity check that new records are new"
63
- assert YAML.load(YAML.dump(topic)).new_record?, "Record should be new after deserialization"
65
+ assert yaml_load(YAML.dump(topic)).new_record?, "Record should be new after deserialization"
64
66
 
65
67
  topic.save!
66
68
 
67
69
  assert_not topic.new_record?, "Saved records are not new"
68
- assert_not YAML.load(YAML.dump(topic)).new_record?, "Saved record should not be new after deserialization"
70
+ assert_not yaml_load(YAML.dump(topic)).new_record?, "Saved record should not be new after deserialization"
69
71
 
70
- topic = Topic.select('title').last
72
+ topic = Topic.select("title").last
71
73
 
72
74
  assert_not topic.new_record?, "Loaded records without ID are not new"
73
- assert_not YAML.load(YAML.dump(topic)).new_record?, "Record should not be new after deserialization"
75
+ assert_not yaml_load(YAML.dump(topic)).new_record?, "Record should not be new after deserialization"
74
76
  end
75
77
 
76
78
  def test_types_of_virtual_columns_are_not_changed_on_round_trip
77
- author = Author.select('authors.*, count(posts.id) as posts_count')
79
+ author = Author.select("authors.*, count(posts.id) as posts_count")
78
80
  .joins(:posts)
79
- .group('authors.id')
81
+ .group("authors.id", "authors.name", "authors.author_address_id", "authors.author_address_extra_id", "authors.organization_id", "authors.owned_essay_id")
80
82
  .first
81
- dumped = YAML.load(YAML.dump(author))
83
+ dumped = yaml_load(YAML.dump(author))
82
84
 
83
85
  assert_equal 5, author.posts_count
84
86
  assert_equal 5, dumped.posts_count
@@ -88,34 +90,77 @@ class YamlSerializationTest < ActiveRecord::TestCase
88
90
  coder = {}
89
91
  Topic.first.encode_with(coder)
90
92
 
91
- assert coder['active_record_yaml_version']
93
+ assert coder["active_record_yaml_version"]
94
+ end
95
+
96
+ def test_deserializing_rails_v2_yaml
97
+ topic = yaml_load(yaml_fixture("rails_v2"))
98
+
99
+ assert_not_predicate topic, :new_record?
100
+ assert_equal 1, topic.id
101
+ assert_equal "The First Topic", topic.title
102
+ assert_equal "Have a nice day", topic.content
103
+ end
104
+
105
+ def test_deserializing_rails_v1_mysql_yaml
106
+ topic = yaml_load(yaml_fixture("rails_v1_mysql"))
107
+
108
+ assert_not_predicate topic, :new_record?
109
+ assert_equal 1, topic.id
110
+ assert_equal "The First Topic", topic.title
111
+ assert_equal "Have a nice day", topic.content
92
112
  end
93
113
 
94
114
  def test_deserializing_rails_41_yaml
95
- topic = YAML.load(yaml_fixture("rails_4_1"))
115
+ topic = assert_deprecated do
116
+ yaml_load(yaml_fixture("rails_4_1"))
117
+ end
96
118
 
97
- assert topic.new_record?
98
- assert_equal nil, topic.id
119
+ assert_predicate topic, :new_record?
120
+ assert_nil topic.id
99
121
  assert_equal "The First Topic", topic.title
100
122
  assert_equal({ omg: :lol }, topic.content)
101
123
  end
102
124
 
103
125
  def test_deserializing_rails_4_2_0_yaml
104
- topic = YAML.load(yaml_fixture("rails_4_2_0"))
126
+ topic = assert_deprecated do
127
+ yaml_load(yaml_fixture("rails_4_2_0"))
128
+ end
105
129
 
106
- assert_not topic.new_record?
130
+ assert_not_predicate topic, :new_record?
107
131
  assert_equal 1, topic.id
108
132
  assert_equal "The First Topic", topic.title
109
133
  assert_equal("Have a nice day", topic.content)
110
134
  end
111
135
 
112
- private
136
+ def test_yaml_encoding_keeps_mutations
137
+ author = Author.first
138
+ author.name = "Sean"
139
+ dumped = yaml_load(YAML.dump(author))
140
+
141
+ assert_equal "Sean", dumped.name
142
+ assert_equal author.name_was, dumped.name_was
143
+ assert_equal author.changes, dumped.changes
144
+ end
145
+
146
+ def test_yaml_encoding_keeps_false_values
147
+ topic = Topic.first
148
+ topic.approved = false
149
+ dumped = yaml_load(YAML.dump(topic))
113
150
 
114
- def yaml_fixture(file_name)
115
- path = File.expand_path(
116
- "../../support/yaml_compatibility_fixtures/#{file_name}.yml",
117
- __FILE__
118
- )
119
- File.read(path)
151
+ assert_equal false, dumped.approved
120
152
  end
153
+
154
+ private
155
+ def yaml_load(payload)
156
+ YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(payload) : YAML.load(payload)
157
+ end
158
+
159
+ def yaml_fixture(file_name)
160
+ path = File.expand_path(
161
+ "support/yaml_compatibility_fixtures/#{file_name}.yml",
162
+ TEST_ROOT
163
+ )
164
+ File.read(path)
165
+ end
121
166
  end