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
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ describe "Distinct" do
8
+ describe "equality" do
9
+ it "is equal to other distinct nodes" do
10
+ array = [Distinct.new, Distinct.new]
11
+ assert_equal 1, array.uniq.size
12
+ end
13
+
14
+ it "is not equal with other nodes" do
15
+ array = [Distinct.new, Node.new]
16
+ assert_equal 2, array.uniq.size
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ describe "equality" do
8
+ # FIXME: backwards compat
9
+ describe "backwards compat" do
10
+ describe "to_sql" do
11
+ it "takes an engine" do
12
+ engine = FakeRecord::Base.new
13
+ engine.connection.extend Module.new {
14
+ attr_accessor :quote_count
15
+ def quote(*args) @quote_count += 1; super; end
16
+ def quote_column_name(*args) @quote_count += 1; super; end
17
+ def quote_table_name(*args) @quote_count += 1; super; end
18
+ }
19
+ engine.connection.quote_count = 0
20
+
21
+ attr = Table.new(:users)[:id]
22
+ test = attr.eq(10)
23
+ test.to_sql engine
24
+ _(engine.connection.quote_count).must_equal 3
25
+ end
26
+ end
27
+ end
28
+
29
+ describe "or" do
30
+ it "makes an OR node" do
31
+ attr = Table.new(:users)[:id]
32
+ left = attr.eq(10)
33
+ right = attr.eq(11)
34
+ node = left.or right
35
+ _(node.expr.left).must_equal left
36
+ _(node.expr.right).must_equal right
37
+ end
38
+ end
39
+
40
+ describe "and" do
41
+ it "makes and AND node" do
42
+ attr = Table.new(:users)[:id]
43
+ left = attr.eq(10)
44
+ right = attr.eq(11)
45
+ node = left.and right
46
+ _(node.left).must_equal left
47
+ _(node.right).must_equal right
48
+ end
49
+ end
50
+
51
+ it "is equal with equal ivars" do
52
+ array = [Equality.new("foo", "bar"), Equality.new("foo", "bar")]
53
+ assert_equal 1, array.uniq.size
54
+ end
55
+
56
+ it "is not equal with different ivars" do
57
+ array = [Equality.new("foo", "bar"), Equality.new("foo", "baz")]
58
+ assert_equal 2, array.uniq.size
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ class Arel::Nodes::ExtractTest < Arel::Spec
6
+ it "should extract field" do
7
+ table = Arel::Table.new :users
8
+ _(table[:timestamp].extract("date").to_sql).must_be_like %{
9
+ EXTRACT(DATE FROM "users"."timestamp")
10
+ }
11
+ end
12
+
13
+ describe "as" do
14
+ it "should alias the extract" do
15
+ table = Arel::Table.new :users
16
+ _(table[:timestamp].extract("date").as("foo").to_sql).must_be_like %{
17
+ EXTRACT(DATE FROM "users"."timestamp") AS foo
18
+ }
19
+ end
20
+
21
+ it "should not mutate the extract" do
22
+ table = Arel::Table.new :users
23
+ extract = table[:timestamp].extract("date")
24
+ before = extract.dup
25
+ extract.as("foo")
26
+ assert_equal extract, before
27
+ end
28
+ end
29
+
30
+ describe "equality" do
31
+ it "is equal with equal ivars" do
32
+ table = Arel::Table.new :users
33
+ array = [table[:attr].extract("foo"), table[:attr].extract("foo")]
34
+ assert_equal 1, array.uniq.size
35
+ end
36
+
37
+ it "is not equal with different ivars" do
38
+ table = Arel::Table.new :users
39
+ array = [table[:attr].extract("foo"), table[:attr].extract("bar")]
40
+ assert_equal 2, array.uniq.size
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ describe "False" do
8
+ describe "equality" do
9
+ it "is equal to other false nodes" do
10
+ array = [False.new, False.new]
11
+ assert_equal 1, array.uniq.size
12
+ end
13
+
14
+ it "is not equal with other nodes" do
15
+ array = [False.new, Node.new]
16
+ assert_equal 2, array.uniq.size
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ class GroupingTest < Arel::Spec
8
+ it "should create Equality nodes" do
9
+ grouping = Grouping.new(Nodes.build_quoted("foo"))
10
+ _(grouping.eq("foo").to_sql).must_be_like "('foo') = 'foo'"
11
+ end
12
+
13
+ describe "equality" do
14
+ it "is equal with equal ivars" do
15
+ array = [Grouping.new("foo"), Grouping.new("foo")]
16
+ assert_equal 1, array.uniq.size
17
+ end
18
+
19
+ it "is not equal with different ivars" do
20
+ array = [Grouping.new("foo"), Grouping.new("bar")]
21
+ assert_equal 2, array.uniq.size
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ class TestInfixOperation < Arel::Test
8
+ def test_construct
9
+ operation = InfixOperation.new :+, 1, 2
10
+ assert_equal :+, operation.operator
11
+ assert_equal 1, operation.left
12
+ assert_equal 2, operation.right
13
+ end
14
+
15
+ def test_operation_alias
16
+ operation = InfixOperation.new :+, 1, 2
17
+ aliaz = operation.as("zomg")
18
+ assert_kind_of As, aliaz
19
+ assert_equal operation, aliaz.left
20
+ assert_equal "zomg", aliaz.right
21
+ end
22
+
23
+ def test_operation_ordering
24
+ operation = InfixOperation.new :+, 1, 2
25
+ ordering = operation.desc
26
+ assert_kind_of Descending, ordering
27
+ assert_equal operation, ordering.expr
28
+ assert ordering.descending?
29
+ end
30
+
31
+ def test_equality_with_same_ivars
32
+ array = [InfixOperation.new(:+, 1, 2), InfixOperation.new(:+, 1, 2)]
33
+ assert_equal 1, array.uniq.size
34
+ end
35
+
36
+ def test_inequality_with_different_ivars
37
+ array = [InfixOperation.new(:+, 1, 2), InfixOperation.new(:+, 1, 3)]
38
+ assert_equal 2, array.uniq.size
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ describe Arel::Nodes::InsertStatement do
6
+ describe "#clone" do
7
+ it "clones columns and values" do
8
+ statement = Arel::Nodes::InsertStatement.new
9
+ statement.columns = %w[a b c]
10
+ statement.values = %w[x y z]
11
+
12
+ dolly = statement.clone
13
+ _(dolly.columns).must_equal statement.columns
14
+ _(dolly.values).must_equal statement.values
15
+
16
+ _(dolly.columns).wont_be_same_as statement.columns
17
+ _(dolly.values).wont_be_same_as statement.values
18
+ end
19
+ end
20
+
21
+ describe "equality" do
22
+ it "is equal with equal ivars" do
23
+ statement1 = Arel::Nodes::InsertStatement.new
24
+ statement1.columns = %w[a b c]
25
+ statement1.values = %w[x y z]
26
+ statement2 = Arel::Nodes::InsertStatement.new
27
+ statement2.columns = %w[a b c]
28
+ statement2.values = %w[x y z]
29
+ array = [statement1, statement2]
30
+ assert_equal 1, array.uniq.size
31
+ end
32
+
33
+ it "is not equal with different ivars" do
34
+ statement1 = Arel::Nodes::InsertStatement.new
35
+ statement1.columns = %w[a b c]
36
+ statement1.values = %w[x y z]
37
+ statement2 = Arel::Nodes::InsertStatement.new
38
+ statement2.columns = %w[a b c]
39
+ statement2.values = %w[1 2 3]
40
+ array = [statement1, statement2]
41
+ assert_equal 2, array.uniq.size
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ class TestNamedFunction < Arel::Test
8
+ def test_construct
9
+ function = NamedFunction.new "omg", "zomg"
10
+ assert_equal "omg", function.name
11
+ assert_equal "zomg", function.expressions
12
+ end
13
+
14
+ def test_function_alias
15
+ function = NamedFunction.new "omg", "zomg"
16
+ function = function.as("wth")
17
+ assert_equal "omg", function.name
18
+ assert_equal "zomg", function.expressions
19
+ assert_kind_of SqlLiteral, function.alias
20
+ assert_equal "wth", function.alias
21
+ end
22
+
23
+ def test_construct_with_alias
24
+ function = NamedFunction.new "omg", "zomg", "wth"
25
+ assert_equal "omg", function.name
26
+ assert_equal "zomg", function.expressions
27
+ assert_kind_of SqlLiteral, function.alias
28
+ assert_equal "wth", function.alias
29
+ end
30
+
31
+ def test_equality_with_same_ivars
32
+ array = [
33
+ NamedFunction.new("omg", "zomg", "wth"),
34
+ NamedFunction.new("omg", "zomg", "wth")
35
+ ]
36
+ assert_equal 1, array.uniq.size
37
+ end
38
+
39
+ def test_inequality_with_different_ivars
40
+ array = [
41
+ NamedFunction.new("omg", "zomg", "wth"),
42
+ NamedFunction.new("zomg", "zomg", "wth")
43
+ ]
44
+ assert_equal 2, array.uniq.size
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ class TestNode < Arel::Test
7
+ def test_includes_factory_methods
8
+ assert Arel::Nodes::Node.new.respond_to?(:create_join)
9
+ end
10
+
11
+ def test_all_nodes_are_nodes
12
+ Nodes.constants.map { |k|
13
+ Nodes.const_get(k)
14
+ }.grep(Class).each do |klass|
15
+ next if Nodes::SqlLiteral == klass
16
+ next if Nodes::BindParam == klass
17
+ next if /^Arel::Nodes::(?:Test|.*Test$)/.match?(klass.name)
18
+ assert klass.ancestors.include?(Nodes::Node), klass.name
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ describe "not" do
8
+ describe "#not" do
9
+ it "makes a NOT node" do
10
+ attr = Table.new(:users)[:id]
11
+ expr = attr.eq(10)
12
+ node = expr.not
13
+ _(node).must_be_kind_of Not
14
+ _(node.expr).must_equal expr
15
+ end
16
+ end
17
+
18
+ describe "equality" do
19
+ it "is equal with equal ivars" do
20
+ array = [Not.new("foo"), Not.new("foo")]
21
+ assert_equal 1, array.uniq.size
22
+ end
23
+
24
+ it "is not equal with different ivars" do
25
+ array = [Not.new("foo"), Not.new("baz")]
26
+ assert_equal 2, array.uniq.size
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ describe "or" do
8
+ describe "#or" do
9
+ it "makes an OR node" do
10
+ attr = Table.new(:users)[:id]
11
+ left = attr.eq(10)
12
+ right = attr.eq(11)
13
+ node = left.or right
14
+ _(node.expr.left).must_equal left
15
+ _(node.expr.right).must_equal right
16
+
17
+ oror = node.or(right)
18
+ _(oror.expr.left).must_equal node
19
+ _(oror.expr.right).must_equal right
20
+ end
21
+ end
22
+
23
+ describe "equality" do
24
+ it "is equal with equal ivars" do
25
+ array = [Or.new("foo", "bar"), Or.new("foo", "bar")]
26
+ assert_equal 1, array.uniq.size
27
+ end
28
+
29
+ it "is not equal with different ivars" do
30
+ array = [Or.new("foo", "bar"), Or.new("foo", "baz")]
31
+ assert_equal 2, array.uniq.size
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ class Arel::Nodes::OverTest < Arel::Spec
6
+ describe "as" do
7
+ it "should alias the expression" do
8
+ table = Arel::Table.new :users
9
+ _(table[:id].count.over.as("foo").to_sql).must_be_like %{
10
+ COUNT("users"."id") OVER () AS foo
11
+ }
12
+ end
13
+ end
14
+
15
+ describe "with literal" do
16
+ it "should reference the window definition by name" do
17
+ table = Arel::Table.new :users
18
+ _(table[:id].count.over("foo").to_sql).must_be_like %{
19
+ COUNT("users"."id") OVER "foo"
20
+ }
21
+ end
22
+ end
23
+
24
+ describe "with SQL literal" do
25
+ it "should reference the window definition by name" do
26
+ table = Arel::Table.new :users
27
+ _(table[:id].count.over(Arel.sql("foo")).to_sql).must_be_like %{
28
+ COUNT("users"."id") OVER foo
29
+ }
30
+ end
31
+ end
32
+
33
+ describe "with no expression" do
34
+ it "should use empty definition" do
35
+ table = Arel::Table.new :users
36
+ _(table[:id].count.over.to_sql).must_be_like %{
37
+ COUNT("users"."id") OVER ()
38
+ }
39
+ end
40
+ end
41
+
42
+ describe "with expression" do
43
+ it "should use definition in sub-expression" do
44
+ table = Arel::Table.new :users
45
+ window = Arel::Nodes::Window.new.order(table["foo"])
46
+ _(table[:id].count.over(window).to_sql).must_be_like %{
47
+ COUNT("users"."id") OVER (ORDER BY \"users\".\"foo\")
48
+ }
49
+ end
50
+ end
51
+
52
+ describe "equality" do
53
+ it "is equal with equal ivars" do
54
+ array = [
55
+ Arel::Nodes::Over.new("foo", "bar"),
56
+ Arel::Nodes::Over.new("foo", "bar")
57
+ ]
58
+ assert_equal 1, array.uniq.size
59
+ end
60
+
61
+ it "is not equal with different ivars" do
62
+ array = [
63
+ Arel::Nodes::Over.new("foo", "bar"),
64
+ Arel::Nodes::Over.new("foo", "baz")
65
+ ]
66
+ assert_equal 2, array.uniq.size
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Nodes
7
+ class TestSelectCore < Arel::Test
8
+ def test_clone
9
+ core = Arel::Nodes::SelectCore.new
10
+ core.froms = %w[a b c]
11
+ core.projections = %w[d e f]
12
+ core.wheres = %w[g h i]
13
+
14
+ dolly = core.clone
15
+
16
+ assert_equal core.froms, dolly.froms
17
+ assert_equal core.projections, dolly.projections
18
+ assert_equal core.wheres, dolly.wheres
19
+
20
+ assert_not_same core.froms, dolly.froms
21
+ assert_not_same core.projections, dolly.projections
22
+ assert_not_same core.wheres, dolly.wheres
23
+ end
24
+
25
+ def test_set_quantifier
26
+ core = Arel::Nodes::SelectCore.new
27
+ core.set_quantifier = Arel::Nodes::Distinct.new
28
+ viz = Arel::Visitors::ToSql.new Table.engine.connection_pool
29
+ assert_match "DISTINCT", viz.accept(core, Collectors::SQLString.new).value
30
+ end
31
+
32
+ def test_equality_with_same_ivars
33
+ core1 = SelectCore.new
34
+ core1.froms = %w[a b c]
35
+ core1.projections = %w[d e f]
36
+ core1.wheres = %w[g h i]
37
+ core1.groups = %w[j k l]
38
+ core1.windows = %w[m n o]
39
+ core1.havings = %w[p q r]
40
+ core1.comment = Arel::Nodes::Comment.new(["comment"])
41
+ core2 = SelectCore.new
42
+ core2.froms = %w[a b c]
43
+ core2.projections = %w[d e f]
44
+ core2.wheres = %w[g h i]
45
+ core2.groups = %w[j k l]
46
+ core2.windows = %w[m n o]
47
+ core2.havings = %w[p q r]
48
+ core2.comment = Arel::Nodes::Comment.new(["comment"])
49
+ array = [core1, core2]
50
+ assert_equal 1, array.uniq.size
51
+ end
52
+
53
+ def test_inequality_with_different_ivars
54
+ core1 = SelectCore.new
55
+ core1.froms = %w[a b c]
56
+ core1.projections = %w[d e f]
57
+ core1.wheres = %w[g h i]
58
+ core1.groups = %w[j k l]
59
+ core1.windows = %w[m n o]
60
+ core1.havings = %w[p q r]
61
+ core1.comment = Arel::Nodes::Comment.new(["comment"])
62
+ core2 = SelectCore.new
63
+ core2.froms = %w[a b c]
64
+ core2.projections = %w[d e f]
65
+ core2.wheres = %w[g h i]
66
+ core2.groups = %w[j k l]
67
+ core2.windows = %w[m n o]
68
+ core2.havings = %w[l o l]
69
+ core2.comment = Arel::Nodes::Comment.new(["comment"])
70
+ array = [core1, core2]
71
+ assert_equal 2, array.uniq.size
72
+ core2.havings = %w[p q r]
73
+ core2.comment = Arel::Nodes::Comment.new(["other"])
74
+ array = [core1, core2]
75
+ assert_equal 2, array.uniq.size
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ describe Arel::Nodes::SelectStatement do
6
+ describe "#clone" do
7
+ it "clones cores" do
8
+ statement = Arel::Nodes::SelectStatement.new %w[a b c]
9
+
10
+ dolly = statement.clone
11
+ _(dolly.cores).must_equal statement.cores
12
+ _(dolly.cores).wont_be_same_as statement.cores
13
+ end
14
+ end
15
+
16
+ describe "equality" do
17
+ it "is equal with equal ivars" do
18
+ statement1 = Arel::Nodes::SelectStatement.new %w[a b c]
19
+ statement1.offset = 1
20
+ statement1.limit = 2
21
+ statement1.lock = false
22
+ statement1.orders = %w[x y z]
23
+ statement1.with = "zomg"
24
+ statement2 = Arel::Nodes::SelectStatement.new %w[a b c]
25
+ statement2.offset = 1
26
+ statement2.limit = 2
27
+ statement2.lock = false
28
+ statement2.orders = %w[x y z]
29
+ statement2.with = "zomg"
30
+ array = [statement1, statement2]
31
+ assert_equal 1, array.uniq.size
32
+ end
33
+
34
+ it "is not equal with different ivars" do
35
+ statement1 = Arel::Nodes::SelectStatement.new %w[a b c]
36
+ statement1.offset = 1
37
+ statement1.limit = 2
38
+ statement1.lock = false
39
+ statement1.orders = %w[x y z]
40
+ statement1.with = "zomg"
41
+ statement2 = Arel::Nodes::SelectStatement.new %w[a b c]
42
+ statement2.offset = 1
43
+ statement2.limit = 2
44
+ statement2.lock = false
45
+ statement2.orders = %w[x y z]
46
+ statement2.with = "wth"
47
+ array = [statement1, statement2]
48
+ assert_equal 2, array.uniq.size
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+ require "yaml"
5
+
6
+ module Arel
7
+ module Nodes
8
+ class SqlLiteralTest < Arel::Spec
9
+ before do
10
+ @visitor = Visitors::ToSql.new Table.engine.connection
11
+ end
12
+
13
+ def compile(node)
14
+ @visitor.accept(node, Collectors::SQLString.new).value
15
+ end
16
+
17
+ describe "sql" do
18
+ it "makes a sql literal node" do
19
+ sql = Arel.sql "foo"
20
+ _(sql).must_be_kind_of Arel::Nodes::SqlLiteral
21
+ end
22
+ end
23
+
24
+ describe "count" do
25
+ it "makes a count node" do
26
+ node = SqlLiteral.new("*").count
27
+ _(compile(node)).must_be_like %{ COUNT(*) }
28
+ end
29
+
30
+ it "makes a distinct node" do
31
+ node = SqlLiteral.new("*").count true
32
+ _(compile(node)).must_be_like %{ COUNT(DISTINCT *) }
33
+ end
34
+ end
35
+
36
+ describe "equality" do
37
+ it "makes an equality node" do
38
+ node = SqlLiteral.new("foo").eq(1)
39
+ _(compile(node)).must_be_like %{ foo = 1 }
40
+ end
41
+
42
+ it "is equal with equal contents" do
43
+ array = [SqlLiteral.new("foo"), SqlLiteral.new("foo")]
44
+ assert_equal 1, array.uniq.size
45
+ end
46
+
47
+ it "is not equal with different contents" do
48
+ array = [SqlLiteral.new("foo"), SqlLiteral.new("bar")]
49
+ assert_equal 2, array.uniq.size
50
+ end
51
+ end
52
+
53
+ describe 'grouped "or" equality' do
54
+ it "makes a grouping node with an or node" do
55
+ node = SqlLiteral.new("foo").eq_any([1, 2])
56
+ _(compile(node)).must_be_like %{ (foo = 1 OR foo = 2) }
57
+ end
58
+ end
59
+
60
+ describe 'grouped "and" equality' do
61
+ it "makes a grouping node with an and node" do
62
+ node = SqlLiteral.new("foo").eq_all([1, 2])
63
+ _(compile(node)).must_be_like %{ (foo = 1 AND foo = 2) }
64
+ end
65
+ end
66
+
67
+ describe "serialization" do
68
+ it "serializes into YAML" do
69
+ yaml_literal = SqlLiteral.new("foo").to_yaml
70
+ assert_equal("foo", YAML.load(yaml_literal))
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end