sequel 5.8.0 → 5.38.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -380
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -275
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -840
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -487
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -182
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -868
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -61
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -410
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -1,722 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel Mock Adapter" do
4
- it "should have an adapter method" do
5
- db = Sequel.mock
6
- db.must_be_kind_of(Sequel::Mock::Database)
7
- db.adapter_scheme.must_equal :mock
8
- end
9
-
10
- it "should support registering mock adapter type" do
11
- begin
12
- Module.new do
13
- Sequel::Database.set_shared_adapter_scheme(:foo, self)
14
-
15
- def self.mock_adapter_setup(db)
16
- db.instance_variable_set(:@foo, :foo)
17
- end
18
-
19
- module self::DatabaseMethods
20
- def foo
21
- @foo
22
- end
23
- end
24
-
25
- module self::DatasetMethods
26
- def foo
27
- db.foo
28
- end
29
- end
30
- end
31
-
32
- Sequel.connect('mock://foo') do |db|
33
- db.foo.must_equal :foo
34
- db.dataset.foo.must_equal :foo
35
- end
36
- ensure
37
- Sequel.synchronize{Sequel::SHARED_ADAPTER_MAP.delete(:foo)}
38
- end
39
- end
40
-
41
- it "should have constructor accept no arguments" do
42
- Sequel.require 'adapters/mock'
43
- Sequel::Mock::Database.new.must_be_kind_of(Sequel::Mock::Database)
44
- end
45
-
46
- it "should each not return any rows by default" do
47
- called = false
48
- Sequel.mock[:t].each{|r| called = true}
49
- called.must_equal false
50
- end
51
-
52
- it "should return 0 for update/delete/with_sql_delete/execute_dui by default" do
53
- Sequel.mock[:t].update(:a=>1).must_equal 0
54
- Sequel.mock[:t].delete.must_equal 0
55
- Sequel.mock[:t].with_sql_delete('DELETE FROM t').must_equal 0
56
- Sequel.mock.execute_dui('DELETE FROM t').must_equal 0
57
- end
58
-
59
- it "should return nil for insert/execute_insert by default" do
60
- Sequel.mock[:t].insert(:a=>1).must_be_nil
61
- Sequel.mock.execute_insert('INSERT INTO a () DEFAULT VALUES').must_be_nil
62
- end
63
-
64
- it "should be able to set the rows returned by each using :fetch option with a single hash" do
65
- rs = []
66
- db = Sequel.mock(:fetch=>{:a=>1})
67
- db[:t].each{|r| rs << r}
68
- rs.must_equal [{:a=>1}]
69
- db[:t].each{|r| rs << r}
70
- rs.must_equal [{:a=>1}, {:a=>1}]
71
- db[:t].each{|r| r[:a] = 2; rs << r}
72
- rs.must_equal [{:a=>1}, {:a=>1}, {:a=>2}]
73
- db[:t].each{|r| rs << r}
74
- rs.must_equal [{:a=>1}, {:a=>1}, {:a=>2}, {:a=>1}]
75
- end
76
-
77
- it "should be able to set the rows returned by each using :fetch option with an array of hashes" do
78
- rs = []
79
- db = Sequel.mock(:fetch=>[{:a=>1}, {:a=>2}])
80
- db[:t].each{|r| rs << r}
81
- rs.must_equal [{:a=>1}, {:a=>2}]
82
- db[:t].each{|r| rs << r}
83
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>1}, {:a=>2}]
84
- db[:t].each{|r| r[:a] += 2; rs << r}
85
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
86
- db[:t].each{|r| rs << r}
87
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}, {:a=>1}, {:a=>2}]
88
- end
89
-
90
- it "should be able to set the rows returned by each using :fetch option with an array or arrays of hashes" do
91
- rs = []
92
- db = Sequel.mock(:fetch=>[[{:a=>1}, {:a=>2}], [{:a=>3}, {:a=>4}]])
93
- db[:t].each{|r| rs << r}
94
- rs.must_equal [{:a=>1}, {:a=>2}]
95
- db[:t].each{|r| rs << r}
96
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
97
- db[:t].each{|r| rs << r}
98
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
99
- end
100
-
101
- it "should be able to set the rows returned by each using :fetch option with a proc that takes sql" do
102
- rs = []
103
- db = Sequel.mock(:fetch=>proc{|sql| sql =~ /FROM t/ ? {:b=>1} : [{:a=>1}, {:a=>2}]})
104
- db[:t].each{|r| rs << r}
105
- rs.must_equal [{:b=>1}]
106
- db[:b].each{|r| rs << r}
107
- rs.must_equal [{:b=>1}, {:a=>1}, {:a=>2}]
108
- db[:t].each{|r| r[:b] += 1; rs << r}
109
- db[:b].each{|r| r[:a] += 2; rs << r}
110
- rs.must_equal [{:b=>1}, {:a=>1}, {:a=>2}, {:b=>2}, {:a=>3}, {:a=>4}]
111
- db[:t].each{|r| rs << r}
112
- db[:b].each{|r| rs << r}
113
- rs.must_equal [{:b=>1}, {:a=>1}, {:a=>2}, {:b=>2}, {:a=>3}, {:a=>4}, {:b=>1}, {:a=>1}, {:a=>2}]
114
- end
115
-
116
- it "should have a fetch= method for setting rows returned by each after the fact" do
117
- rs = []
118
- db = Sequel.mock
119
- db.fetch = {:a=>1}
120
- db[:t].each{|r| rs << r}
121
- rs.must_equal [{:a=>1}]
122
- db[:t].each{|r| rs << r}
123
- rs.must_equal [{:a=>1}] * 2
124
- end
125
-
126
- it "should be able to set an exception to raise by setting the :fetch option to an exception class " do
127
- db = Sequel.mock(:fetch=>ArgumentError)
128
- proc{db[:t].all}.must_raise(Sequel::DatabaseError)
129
- begin
130
- db[:t].all
131
- rescue => e
132
- end
133
- e.must_be_kind_of(Sequel::DatabaseError)
134
- e.wrapped_exception.must_be_kind_of(ArgumentError)
135
- end
136
-
137
- it "should be able to set separate kinds of results for fetch using an array" do
138
- rs = []
139
- db = Sequel.mock(:fetch=>[{:a=>1}, [{:a=>2}, {:a=>3}], proc{|s| {:a=>4}}, proc{|s| }, nil, ArgumentError])
140
- db[:t].each{|r| rs << r}
141
- rs.must_equal [{:a=>1}]
142
- db[:t].each{|r| rs << r}
143
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}]
144
- db[:t].each{|r| rs << r}
145
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
146
- db[:t].each{|r| rs << r}
147
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
148
- db[:t].each{|r| rs << r}
149
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
150
- proc{db[:t].all}.must_raise(Sequel::DatabaseError)
151
- end
152
-
153
- it "should be able to set the rows returned by each on a per dataset basis using with_fetch" do
154
- rs = []
155
- db = Sequel.mock(:fetch=>{:a=>1})
156
- ds = db[:t]
157
- ds.each{|r| rs << r}
158
- rs.must_equal [{:a=>1}]
159
- ds = ds.with_fetch(:b=>2)
160
- ds.each{|r| rs << r}
161
- rs.must_equal [{:a=>1}, {:b=>2}]
162
- end
163
-
164
- it "should raise Error if given an invalid object to fetch" do
165
- proc{Sequel.mock(:fetch=>Class.new).get(:a)}.must_raise(Sequel::DatabaseError)
166
- proc{Sequel.mock(:fetch=>Object.new).get(:a)}.must_raise(Sequel::DatabaseError)
167
- end
168
-
169
- it "should be able to set the number of rows modified by update and delete using :numrows option as an integer" do
170
- db = Sequel.mock(:numrows=>2)
171
- db[:t].update(:a=>1).must_equal 2
172
- db[:t].delete.must_equal 2
173
- db[:t].update(:a=>1).must_equal 2
174
- db[:t].delete.must_equal 2
175
- end
176
-
177
- it "should be able to set the number of rows modified by update and delete using :numrows option as an array of integers" do
178
- db = Sequel.mock(:numrows=>[2, 1])
179
- db[:t].update(:a=>1).must_equal 2
180
- db[:t].delete.must_equal 1
181
- db[:t].update(:a=>1).must_equal 0
182
- db[:t].delete.must_equal 0
183
- end
184
-
185
- it "should be able to set the number of rows modified by update and delete using :numrows option as a proc" do
186
- db = Sequel.mock(:numrows=>proc{|sql| sql =~ / t/ ? 2 : 1})
187
- db[:t].update(:a=>1).must_equal 2
188
- db[:t].delete.must_equal 2
189
- db[:b].update(:a=>1).must_equal 1
190
- db[:b].delete.must_equal 1
191
- end
192
-
193
- it "should be able to set an exception to raise by setting the :numrows option to an exception class " do
194
- db = Sequel.mock(:numrows=>ArgumentError)
195
- proc{db[:t].update(:a=>1)}.must_raise(Sequel::DatabaseError)
196
- begin
197
- db[:t].delete
198
- rescue => e
199
- end
200
- e.must_be_kind_of(Sequel::DatabaseError)
201
- e.wrapped_exception.must_be_kind_of(ArgumentError)
202
- end
203
-
204
- it "should be able to set separate kinds of results for numrows using an array" do
205
- db = Sequel.mock(:numrows=>[1, proc{|s| 2}, nil, ArgumentError])
206
- db[:t].delete.must_equal 1
207
- db[:t].update(:a=>1).must_equal 2
208
- db[:t].delete.must_equal 0
209
- proc{db[:t].delete}.must_raise(Sequel::DatabaseError)
210
- end
211
-
212
- it "should have a numrows= method to set the number of rows modified by update and delete after the fact" do
213
- db = Sequel.mock
214
- db.numrows = 2
215
- db[:t].update(:a=>1).must_equal 2
216
- db[:t].delete.must_equal 2
217
- db[:t].update(:a=>1).must_equal 2
218
- db[:t].delete.must_equal 2
219
- end
220
-
221
- it "should be able to set the number of rows modified by update and delete on a per dataset basis" do
222
- db = Sequel.mock(:numrows=>2)
223
- ds = db[:t]
224
- ds.update(:a=>1).must_equal 2
225
- ds.delete.must_equal 2
226
- ds = ds.with_numrows(3)
227
- ds.update(:a=>1).must_equal 3
228
- ds.delete.must_equal 3
229
- end
230
-
231
- it "should raise Error if given an invalid object for numrows or autoid" do
232
- proc{Sequel.mock(:numrows=>Class.new)[:a].delete}.must_raise(Sequel::DatabaseError)
233
- proc{Sequel.mock(:numrows=>Object.new)[:a].delete}.must_raise(Sequel::DatabaseError)
234
- proc{Sequel.mock(:autoid=>Class.new)[:a].insert}.must_raise(Sequel::DatabaseError)
235
- proc{Sequel.mock(:autoid=>Object.new)[:a].insert}.must_raise(Sequel::DatabaseError)
236
- end
237
-
238
- it "should be able to set the autogenerated primary key returned by insert using :autoid option as an integer" do
239
- db = Sequel.mock(:autoid=>1)
240
- db[:t].insert(:a=>1).must_equal 1
241
- db[:t].insert(:a=>1).must_equal 2
242
- db[:t].insert(:a=>1).must_equal 3
243
- end
244
-
245
- it "should be able to set the autogenerated primary key returned by insert using :autoid option as an array of integers" do
246
- db = Sequel.mock(:autoid=>[1, 3, 5])
247
- db[:t].insert(:a=>1).must_equal 1
248
- db[:t].insert(:a=>1).must_equal 3
249
- db[:t].insert(:a=>1).must_equal 5
250
- db[:t].insert(:a=>1).must_be_nil
251
- end
252
-
253
- it "should be able to set the autogenerated primary key returned by insert using :autoid option as a proc" do
254
- db = Sequel.mock(:autoid=>proc{|sql| sql =~ /INTO t / ? 2 : 1})
255
- db[:t].insert(:a=>1).must_equal 2
256
- db[:t].insert(:a=>1).must_equal 2
257
- db[:b].insert(:a=>1).must_equal 1
258
- db[:b].insert(:a=>1).must_equal 1
259
- end
260
-
261
- it "should be able to set an exception to raise by setting the :autoid option to an exception class " do
262
- db = Sequel.mock(:autoid=>ArgumentError)
263
- proc{db[:t].insert(:a=>1)}.must_raise(Sequel::DatabaseError)
264
- begin
265
- db[:t].insert
266
- rescue => e
267
- end
268
- e.must_be_kind_of(Sequel::DatabaseError)
269
- e.wrapped_exception.must_be_kind_of(ArgumentError)
270
- end
271
-
272
- it "should be able to set separate kinds of results for autoid using an array" do
273
- db = Sequel.mock(:autoid=>[1, proc{|s| 2}, nil, ArgumentError])
274
- db[:t].insert.must_equal 1
275
- db[:t].insert.must_equal 2
276
- db[:t].insert.must_be_nil
277
- proc{db[:t].insert}.must_raise(Sequel::DatabaseError)
278
- end
279
-
280
- it "should have an autoid= method to set the autogenerated primary key returned by insert after the fact" do
281
- db = Sequel.mock
282
- db.autoid = 1
283
- db[:t].insert(:a=>1).must_equal 1
284
- db[:t].insert(:a=>1).must_equal 2
285
- db[:t].insert(:a=>1).must_equal 3
286
- end
287
-
288
- it "should be able to set the autogenerated primary key returned by insert on a per dataset basis" do
289
- db = Sequel.mock(:autoid=>1)
290
- ds = db[:t]
291
- ds.insert(:a=>1).must_equal 1
292
- ds = ds.with_autoid(5)
293
- ds.insert(:a=>1).must_equal 5
294
- ds.insert(:a=>1).must_equal 6
295
- db[:t].insert(:a=>1).must_equal 2
296
- end
297
-
298
- it "should be able to set the columns to set in the dataset as an array of symbols" do
299
- db = Sequel.mock(:columns=>[:a, :b])
300
- db[:t].columns.must_equal [:a, :b]
301
- db.sqls.must_equal ["SELECT * FROM t LIMIT 1"]
302
- ds = db[:t]
303
- ds.all
304
- db.sqls.must_equal ["SELECT * FROM t"]
305
- ds.columns.must_equal [:a, :b]
306
- db.sqls.must_equal []
307
- db[:t].columns.must_equal [:a, :b]
308
- end
309
-
310
- it "should be able to set the columns to set in the dataset as an array of arrays of symbols" do
311
- db = Sequel.mock(:columns=>[[:a, :b], [:c, :d]])
312
- db[:t].columns.must_equal [:a, :b]
313
- db[:x].columns.must_equal [:c, :d]
314
- end
315
-
316
- it "should be able to set the columns to set in the dataset as a proc" do
317
- db = Sequel.mock(:columns=>proc{|sql| (sql =~ / t/) ? [:a, :b] : [:c, :d]})
318
- db[:b].columns.must_equal [:c, :d]
319
- db[:t].columns.must_equal [:a, :b]
320
- end
321
-
322
- it "should have a columns= method to set the columns to set after the fact" do
323
- db = Sequel.mock
324
- db.columns = [[:a, :b], [:c, :d]]
325
- db[:t].columns.must_equal [:a, :b]
326
- db[:x].columns.must_equal [:c, :d]
327
- end
328
-
329
- it "should raise Error if given an invalid columns" do
330
- proc{Sequel.mock(:columns=>Object.new)[:a].columns}.must_raise(Sequel::DatabaseError)
331
- end
332
-
333
- it "should not quote identifiers by default" do
334
- Sequel.mock.send(:quote_identifiers_default).must_equal false
335
- end
336
-
337
- it "should allow overriding of server_version" do
338
- db = Sequel.mock
339
- db.server_version.must_be_nil
340
- db.server_version = 80102
341
- db.server_version.must_equal 80102
342
- end
343
-
344
- it "should not fold to uppercase by default" do
345
- Sequel.mock.send(:folds_unquoted_identifiers_to_uppercase?).must_equal false
346
- end
347
-
348
- it "should keep a record of all executed SQL in #sqls" do
349
- db = Sequel.mock
350
- db[:t].all
351
- db[:b].delete
352
- db[:c].insert(:a=>1)
353
- db[:d].update(:a=>1)
354
- db.sqls.must_equal ['SELECT * FROM t', 'DELETE FROM b', 'INSERT INTO c (a) VALUES (1)', 'UPDATE d SET a = 1']
355
- end
356
-
357
- it "should clear sqls on retrieval" do
358
- db = Sequel.mock
359
- db[:t].all
360
- db.sqls.must_equal ['SELECT * FROM t']
361
- db.sqls.must_equal []
362
- end
363
-
364
- it "should also log SQL executed to the given loggers" do
365
- a = []
366
- def a.method_missing(m, *x) push(*x) end
367
- db = Sequel.mock(:loggers=>[a])
368
- db[:t].all
369
- db[:b].delete
370
- db[:c].insert(:a=>1)
371
- db[:d].update(:a=>1)
372
- a.zip(['SELECT * FROM t', 'DELETE FROM b', 'INSERT INTO c (a) VALUES (1)', 'UPDATE d SET a = 1']).each do |is, should|
373
- is.must_match should
374
- end
375
- end
376
-
377
- it "should correctly handle transactions" do
378
- db = Sequel.mock
379
- db.transaction{db[:a].all}
380
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'COMMIT']
381
- db.transaction{db[:a].all; raise Sequel::Rollback}
382
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
383
- proc{db.transaction{db[:a].all; raise ArgumentError}}.must_raise(ArgumentError)
384
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
385
- proc{db.transaction(:rollback=>:reraise){db[:a].all; raise Sequel::Rollback}}.must_raise(Sequel::Rollback)
386
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
387
- db.transaction(:rollback=>:always){db[:a].all}
388
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
389
- db.transaction{db.transaction{db[:a].all; raise Sequel::Rollback}}
390
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
391
- db.transaction{db.transaction(:savepoint=>true){db[:a].all; raise Sequel::Rollback}}
392
- db.sqls.must_equal ['BEGIN', 'SAVEPOINT autopoint_1', 'SELECT * FROM a', 'ROLLBACK TO SAVEPOINT autopoint_1', 'COMMIT']
393
- db.transaction{db.transaction(:savepoint=>true){db[:a].all}; raise Sequel::Rollback}
394
- db.sqls.must_equal ['BEGIN', 'SAVEPOINT autopoint_1', 'SELECT * FROM a', 'RELEASE SAVEPOINT autopoint_1', 'ROLLBACK']
395
- end
396
-
397
- it "should correctly handle transactions when sharding" do
398
- db = Sequel.mock(:servers=>{:test=>{}})
399
- db.transaction{db.transaction(:server=>:test){db[:a].all; db[:t].server(:test).all}}
400
- db.sqls.must_equal ['BEGIN', 'BEGIN -- test', 'SELECT * FROM a', 'SELECT * FROM t -- test', 'COMMIT -- test', 'COMMIT']
401
- end
402
-
403
- it "should yield a mock connection object from synchronize" do
404
- c = Sequel.mock.synchronize{|conn| conn}
405
- c.must_be_kind_of(Sequel::Mock::Connection)
406
- end
407
-
408
- it "should deal correctly with sharding" do
409
- db = Sequel.mock(:servers=>{:test=>{}})
410
- c1 = db.synchronize{|conn| conn}
411
- c2 = db.synchronize(:test){|conn| conn}
412
- c1.server.must_equal :default
413
- c2.server.must_equal :test
414
- end
415
-
416
- it "should disconnect correctly" do
417
- db = Sequel.mock
418
- db.test_connection
419
- db.disconnect
420
- end
421
-
422
- it "should accept :extend option for extending the object with a module" do
423
- Sequel.mock(:extend=>Module.new{def foo(v) v * 2 end}).foo(3).must_equal 6
424
- end
425
-
426
- it "should accept :sqls option for where to store the SQL queries" do
427
- a = []
428
- Sequel.mock(:sqls=>a)[:t].all
429
- a.must_equal ['SELECT * FROM t']
430
- end
431
-
432
- it "should include :append option in SQL if it is given" do
433
- db = Sequel.mock(:append=>'a')
434
- db[:t].all
435
- db.sqls.must_equal ['SELECT * FROM t -- a']
436
- end
437
-
438
- it "should append :arguments option to execute to the SQL if present" do
439
- db = Sequel.mock
440
- db.execute('SELECT * FROM t', :arguments=>[1, 2])
441
- db.sqls.must_equal ['SELECT * FROM t -- args: [1, 2]']
442
- end
443
-
444
- it "should have Dataset#columns take columns to set and return self" do
445
- db = Sequel.mock
446
- ds = db[:t].columns(:id, :a, :b)
447
- ds.must_be_kind_of(Sequel::Mock::Dataset)
448
- ds.columns.must_equal [:id, :a, :b]
449
- end
450
-
451
- it "should be able to load dialects based on the database name" do
452
- Sequel.mock(:host=>'access').select(Date.new(2011, 12, 13)).sql.must_equal 'SELECT #2011-12-13#'
453
- Sequel.mock(:host=>'db2').select(1).sql.must_equal 'SELECT 1 FROM "SYSIBM"."SYSDUMMY1"'
454
- Sequel.mock(:host=>'mssql')[:A].full_text_search(:B, 'C').with_quote_identifiers(false).sql.must_equal "SELECT * FROM A WHERE (CONTAINS (B, 'C'))"
455
- Sequel.mock(:host=>'mysql')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (MATCH (b) AGAINST ('c'))"
456
- Sequel.mock(:host=>'oracle')[:a].limit(1).with_quote_identifiers(false).sql.upcase.must_equal 'SELECT * FROM (SELECT * FROM A) T1 WHERE (ROWNUM <= 1)'
457
- Sequel.mock(:host=>'postgres')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (to_tsvector(CAST('simple' AS regconfig), (COALESCE(b, ''))) @@ to_tsquery(CAST('simple' AS regconfig), 'c'))"
458
- Sequel.mock(:host=>'sqlanywhere').from(:A).offset(1).with_quote_identifiers(false).sql.must_equal 'SELECT TOP 2147483647 START AT (1 + 1) * FROM A'
459
- Sequel.mock(:host=>'sqlite')[Sequel[:a].as(:b)].with_quote_identifiers(false).sql.must_equal "SELECT * FROM a AS 'b'"
460
- end
461
-
462
- it "should be able to mock schema calls" do
463
- Sequel.mock(:host=>'mysql', :fetch=>{:Field=>'a'}).schema(:a).first.first.must_equal :a
464
- end
465
-
466
- it "should automatically set version for adapters needing versions" do
467
- Sequel.mock(:host=>'postgres').server_version.must_be :>=, 90400
468
- Sequel.mock(:host=>'mssql').server_version.must_be :>=, 11000000
469
- Sequel.mock(:host=>'mysql').server_version.must_be :>=, 50617
470
- Sequel.mock(:host=>'sqlite').sqlite_version.must_be :>=, 30804
471
- Sequel.mock(:host=>'oracle').server_version.must_be :>=, 11000000
472
- end
473
-
474
- it "should stub out the primary_key method for postgres" do
475
- Sequel.mock(:host=>'postgres').primary_key(:t).must_equal :id
476
- end
477
-
478
- it "should stub out the bound_variable_arg method for postgres" do
479
- Sequel.mock(:host=>'postgres').bound_variable_arg(:t, nil).must_equal :t
480
- end
481
-
482
- it "should handle creating tables on oracle" do
483
- Sequel.mock(:host=>'oracle').create_table(:a){String :b}
484
- end
485
- end
486
-
487
- describe "PostgreSQL support" do
488
- before do
489
- @db = Sequel.mock(:host=>'postgres')
490
- end
491
-
492
- it "should create an unlogged table" do
493
- @db.create_table(:unlogged_dolls, :unlogged => true){text :name}
494
- @db.sqls.must_equal ['CREATE UNLOGGED TABLE "unlogged_dolls" ("name" text)']
495
- end
496
-
497
- it "should support spatial indexes" do
498
- @db.alter_table(:posts){add_spatial_index [:geom]}
499
- @db.sqls.must_equal ['CREATE INDEX "posts_geom_index" ON "posts" USING gist ("geom")']
500
- end
501
-
502
- it "should support indexes with index type" do
503
- @db.alter_table(:posts){add_index :p, :type => 'gist'}
504
- @db.sqls.must_equal ['CREATE INDEX "posts_p_index" ON "posts" USING gist ("p")']
505
- end
506
-
507
- it "should have #transaction support various types of synchronous options" do
508
- @db.transaction(:synchronous=>:on){}
509
- @db.transaction(:synchronous=>true){}
510
- @db.transaction(:synchronous=>:off){}
511
- @db.transaction(:synchronous=>false){}
512
- @db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = on", "SET LOCAL synchronous_commit = on", "SET LOCAL synchronous_commit = off", "SET LOCAL synchronous_commit = off"]
513
-
514
- @db.transaction(:synchronous=>nil){}
515
- @db.sqls.must_equal ['BEGIN', 'COMMIT']
516
-
517
- if @db.server_version >= 90100
518
- @db.transaction(:synchronous=>:local){}
519
- @db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = local"]
520
-
521
- if @db.server_version >= 90200
522
- @db.transaction(:synchronous=>:remote_write){}
523
- @db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = remote_write"]
524
- end
525
- end
526
- end
527
-
528
- it "should have #transaction support read only transactions" do
529
- @db.transaction(:read_only=>true){}
530
- @db.transaction(:read_only=>false){}
531
- @db.transaction(:isolation=>:serializable, :read_only=>true){}
532
- @db.transaction(:isolation=>:serializable, :read_only=>false){}
533
- @db.sqls.grep(/READ/).must_equal ["SET TRANSACTION READ ONLY", "SET TRANSACTION READ WRITE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE"]
534
- end
535
-
536
- it "should have #transaction support deferrable transactions" do
537
- @db.transaction(:deferrable=>true){}
538
- @db.transaction(:deferrable=>false){}
539
- @db.transaction(:deferrable=>true, :read_only=>true){}
540
- @db.transaction(:deferrable=>false, :read_only=>false){}
541
- @db.transaction(:isolation=>:serializable, :deferrable=>true, :read_only=>true){}
542
- @db.transaction(:isolation=>:serializable, :deferrable=>false, :read_only=>false){}
543
- @db.sqls.grep(/DEF/).must_equal ["SET TRANSACTION DEFERRABLE", "SET TRANSACTION NOT DEFERRABLE", "SET TRANSACTION READ ONLY DEFERRABLE", "SET TRANSACTION READ WRITE NOT DEFERRABLE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE NOT DEFERRABLE"]
544
- end
545
-
546
- it "should support creating indexes concurrently" do
547
- @db.add_index :test, [:name, :value], :concurrently=>true
548
- @db.sqls.must_equal ['CREATE INDEX CONCURRENTLY "test_name_value_index" ON "test" ("name", "value")']
549
- end
550
-
551
- it "should support dropping indexes concurrently" do
552
- @db.drop_index :test, [:name, :value], :concurrently=>true, :name=>'tnv2'
553
- @db.sqls.must_equal ['DROP INDEX CONCURRENTLY "tnv2"']
554
- end
555
-
556
- it "should use INSERT RETURNING for inserts" do
557
- @db[:test5].insert(:value=>10)
558
- @db.sqls.must_equal ['INSERT INTO "test5" ("value") VALUES (10) RETURNING "id"']
559
- end
560
-
561
- it "should support opclass specification" do
562
- @db.alter_table(:posts){add_index(:user_id, :opclass => :int4_ops, :type => :btree)}
563
- @db.sqls.must_equal ['CREATE INDEX "posts_user_id_index" ON "posts" USING btree ("user_id" int4_ops)']
564
- end
565
-
566
- it 'should quote NaN' do
567
- nan = 0.0/0.0
568
- @db[:test5].insert_sql(:value => nan).must_equal %q{INSERT INTO "test5" ("value") VALUES ('NaN')}
569
- end
570
-
571
- it 'should quote +Infinity' do
572
- inf = 1.0/0.0
573
- @db[:test5].insert_sql(:value => inf).must_equal %q{INSERT INTO "test5" ("value") VALUES ('Infinity')}
574
- end
575
-
576
- it 'should quote -Infinity' do
577
- inf = -1.0/0.0
578
- @db[:test5].insert_sql(:value => inf).must_equal %q{INSERT INTO "test5" ("value") VALUES ('-Infinity')}
579
- end
580
-
581
- it "Dataset#insert_conflict should respect expressions in the target argument" do
582
- @ds = @db[:ic_test]
583
- @ds.insert_conflict(:target=>:a).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"a\") DO NOTHING"
584
- @ds.insert_conflict(:target=>:c, :conflict_where=>{:c_is_unique=>true}).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"c\") WHERE (\"c_is_unique\" IS TRUE) DO NOTHING"
585
- @ds.insert_conflict(:target=>[:b, :c]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", \"c\") DO NOTHING"
586
- @ds.insert_conflict(:target=>[:b, Sequel.function(:round, :c)]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", round(\"c\")) DO NOTHING"
587
- @ds.insert_conflict(:target=>[:b, Sequel.virtual_row{|o| o.round(:c)}]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", round(\"c\")) DO NOTHING"
588
- end
589
-
590
- it "should support creating and dropping foreign tables" do
591
- @db.create_table(:t, :foreign=>:f, :options=>{:o=>1}){Integer :a}
592
- @db.drop_table(:t, :foreign=>true)
593
- @db.sqls.must_equal ['CREATE FOREIGN TABLE "t" ("a" integer) SERVER "f" OPTIONS (o \'1\')',
594
- 'DROP FOREIGN TABLE "t"']
595
- end
596
-
597
- it "#create_function and #drop_function should create and drop functions" do
598
- @db.create_function('tf', 'SELECT 1', :returns=>:integer)
599
- @db.drop_function('tf')
600
- @db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ["CREATE FUNCTION tf() RETURNS integer LANGUAGE SQL AS 'SELECT 1'",
601
- 'DROP FUNCTION tf()']
602
- end
603
-
604
- it "#create_function and #drop_function should support options" do
605
- @db.create_function('tf', 'SELECT $1 + $2', :args=>[[:integer, :a], :integer], :replace=>true, :returns=>:integer, :language=>'SQL', :behavior=>:immutable, :strict=>true, :security_definer=>true, :cost=>2, :set=>{:search_path => 'public'})
606
- @db.drop_function('tf', :if_exists=>true, :cascade=>true, :args=>[[:integer, :a], :integer])
607
- @db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ["CREATE OR REPLACE FUNCTION tf(a integer, integer) RETURNS integer LANGUAGE SQL IMMUTABLE STRICT SECURITY DEFINER COST 2 SET search_path = public AS 'SELECT $1 + $2'",
608
- 'DROP FUNCTION IF EXISTS tf(a integer, integer) CASCADE']
609
- end
610
-
611
- it "#create_language and #drop_language should create and drop languages" do
612
- @db.create_language(:plpgsql)
613
- @db.create_language(:plpgsql, :replace=>true, :trusted=>true, :handler=>:a, :validator=>:b)
614
- @db.drop_language(:plpgsql)
615
- @db.drop_language(:plpgsql, :if_exists=>true, :cascade=>true)
616
- @db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ['CREATE LANGUAGE plpgsql',
617
- 'CREATE OR REPLACE TRUSTED LANGUAGE plpgsql HANDLER a VALIDATOR b',
618
- 'DROP LANGUAGE plpgsql',
619
- 'DROP LANGUAGE IF EXISTS plpgsql CASCADE']
620
- end
621
-
622
- it "#create_schema and #drop_schema should create and drop schemas" do
623
- @db.create_schema(:sequel)
624
- @db.create_schema(:sequel, :if_not_exists=>true, :owner=>:foo)
625
- @db.drop_schema(:sequel)
626
- @db.drop_schema(:sequel, :if_exists=>true, :cascade=>true)
627
- @db.sqls.must_equal ['CREATE SCHEMA "sequel"',
628
- 'CREATE SCHEMA IF NOT EXISTS "sequel" AUTHORIZATION "foo"',
629
- 'DROP SCHEMA "sequel"',
630
- 'DROP SCHEMA IF EXISTS "sequel" CASCADE']
631
- end
632
-
633
- it "#create_trigger and #drop_trigger should create and drop triggers" do
634
- @db.create_trigger(:test, :identity, :tf, :each_row=>true)
635
- @db.create_trigger(:test, :identity, :tf, :after=>true, :events=>:insert, :args=>[1, 'a'])
636
- @db.create_trigger(:test, :identity, :tf, :each_row=>true, :when=> {Sequel[:new][:name] => 'b'})
637
- @db.drop_trigger(:test, :identity)
638
- @db.drop_trigger(:test, :identity, :if_exists=>true, :cascade=>true)
639
- @db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ['CREATE TRIGGER identity BEFORE INSERT OR UPDATE OR DELETE ON "test" FOR EACH ROW EXECUTE PROCEDURE tf()',
640
- 'CREATE TRIGGER identity AFTER INSERT ON "test" EXECUTE PROCEDURE tf(1, \'a\')',
641
- %q{CREATE TRIGGER identity BEFORE INSERT OR UPDATE OR DELETE ON "test" FOR EACH ROW WHEN ("new"."name" = 'b') EXECUTE PROCEDURE tf()},
642
- 'DROP TRIGGER identity ON "test"',
643
- 'DROP TRIGGER IF EXISTS identity ON "test" CASCADE']
644
- end
645
- end
646
-
647
- describe "MySQL support" do
648
- before do
649
- @db = Sequel.mock(:host=>'mysql')
650
- end
651
-
652
- it "should support spatial indexes" do
653
- @db.alter_table(:posts){add_spatial_index [:geom]}
654
- @db.sqls.must_equal ['CREATE SPATIAL INDEX `posts_geom_index` ON `posts` (`geom`)']
655
- end
656
-
657
- it "should support fulltext indexes and full_text_search" do
658
- @db.alter_table(:posts){add_full_text_index :title; add_full_text_index [:title, :body]}
659
- @db.sqls.must_equal [ "CREATE FULLTEXT INDEX `posts_title_index` ON `posts` (`title`)", "CREATE FULLTEXT INDEX `posts_title_body_index` ON `posts` (`title`, `body`)" ]
660
- end
661
-
662
- it "should support indexes with index type" do
663
- @db.alter_table(:posts){add_index :id, :type => :btree}
664
- @db.sqls.must_equal ["CREATE INDEX `posts_id_index` USING btree ON `posts` (`id`)"]
665
- end
666
- end
667
-
668
- describe "SQLite support" do
669
- before do
670
- @db = Sequel.mock(:host=>'sqlite')
671
- end
672
-
673
- it "should use a string literal for Sequel[:col].as(:alias)" do
674
- @db.literal(Sequel[:c].as(:a)).must_equal "`c` AS 'a'"
675
- end
676
-
677
- it "should use a string literal for Sequel[:table][:col].as(:alias)" do
678
- @db.literal(Sequel[:t][:c].as(:a)).must_equal "`t`.`c` AS 'a'"
679
- end
680
-
681
- it "should use a string literal for :column.as(:alias)" do
682
- @db.literal(Sequel.as(:c, :a)).must_equal "`c` AS 'a'"
683
- end
684
-
685
- it "should use a string literal in the SELECT clause" do
686
- @db[:t].select(Sequel[:c].as(:a)).sql.must_equal "SELECT `c` AS 'a' FROM `t`"
687
- end
688
-
689
- it "should use a string literal in the FROM clause" do
690
- @db[Sequel[:t].as(:a)].sql.must_equal "SELECT * FROM `t` AS 'a'"
691
- end
692
-
693
- it "should use a string literal in the JOIN clause" do
694
- @db[:t].join_table(:natural, :j, nil, :table_alias=>:a).sql.must_equal "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
695
- end
696
-
697
- it "should have support for various #transaction modes" do
698
- @db.transaction{}
699
- @db.transaction(:mode => :immediate){}
700
- @db.transaction(:mode => :exclusive){}
701
- @db.transaction(:mode => :deferred){}
702
- @db.sqls.must_equal ["BEGIN", "COMMIT", "BEGIN IMMEDIATE TRANSACTION", "COMMIT", "BEGIN EXCLUSIVE TRANSACTION", "COMMIT", "BEGIN DEFERRED TRANSACTION", "COMMIT"]
703
-
704
- @db.transaction_mode.must_be_nil
705
- @db.transaction_mode = :immediate
706
- @db.transaction_mode.must_equal :immediate
707
- @db.transaction{}
708
- @db.transaction(:mode => :exclusive){}
709
- @db.sqls.must_equal ["BEGIN IMMEDIATE TRANSACTION", "COMMIT", "BEGIN EXCLUSIVE TRANSACTION", "COMMIT"]
710
- end
711
-
712
- it "should choose a temporary table name that isn't already used when dropping or renaming columns" do
713
- exists = [true, true, false]
714
- @db.define_singleton_method(:table_exists?){|x| exists.shift}
715
- @db.drop_column(:test3, :i)
716
- @db.sqls.grep(/ALTER/).must_equal ["ALTER TABLE `test3` RENAME TO `test3_backup2`"]
717
-
718
- exists = [true, true, true, false]
719
- @db.rename_column(:test3, :h, :i)
720
- @db.sqls.grep(/ALTER/).must_equal ["ALTER TABLE `test3` RENAME TO `test3_backup3`"]
721
- end
722
- end