sequel 5.29.0 → 5.30.0

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 (323) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +8 -1922
  3. data/doc/release_notes/5.30.0.txt +20 -0
  4. data/lib/sequel/adapters/shared/sqlite.rb +7 -1
  5. data/lib/sequel/database/transactions.rb +5 -9
  6. data/lib/sequel/version.rb +1 -1
  7. metadata +4 -368
  8. data/Rakefile +0 -151
  9. data/doc/release_notes/4.0.0.txt +0 -262
  10. data/doc/release_notes/4.1.0.txt +0 -85
  11. data/doc/release_notes/4.10.0.txt +0 -226
  12. data/doc/release_notes/4.11.0.txt +0 -147
  13. data/doc/release_notes/4.12.0.txt +0 -105
  14. data/doc/release_notes/4.13.0.txt +0 -169
  15. data/doc/release_notes/4.14.0.txt +0 -68
  16. data/doc/release_notes/4.15.0.txt +0 -56
  17. data/doc/release_notes/4.16.0.txt +0 -36
  18. data/doc/release_notes/4.17.0.txt +0 -38
  19. data/doc/release_notes/4.18.0.txt +0 -36
  20. data/doc/release_notes/4.19.0.txt +0 -45
  21. data/doc/release_notes/4.2.0.txt +0 -129
  22. data/doc/release_notes/4.20.0.txt +0 -79
  23. data/doc/release_notes/4.21.0.txt +0 -94
  24. data/doc/release_notes/4.22.0.txt +0 -72
  25. data/doc/release_notes/4.23.0.txt +0 -65
  26. data/doc/release_notes/4.24.0.txt +0 -99
  27. data/doc/release_notes/4.25.0.txt +0 -181
  28. data/doc/release_notes/4.26.0.txt +0 -44
  29. data/doc/release_notes/4.27.0.txt +0 -78
  30. data/doc/release_notes/4.28.0.txt +0 -57
  31. data/doc/release_notes/4.29.0.txt +0 -41
  32. data/doc/release_notes/4.3.0.txt +0 -40
  33. data/doc/release_notes/4.30.0.txt +0 -37
  34. data/doc/release_notes/4.31.0.txt +0 -57
  35. data/doc/release_notes/4.32.0.txt +0 -132
  36. data/doc/release_notes/4.33.0.txt +0 -88
  37. data/doc/release_notes/4.34.0.txt +0 -86
  38. data/doc/release_notes/4.35.0.txt +0 -130
  39. data/doc/release_notes/4.36.0.txt +0 -116
  40. data/doc/release_notes/4.37.0.txt +0 -50
  41. data/doc/release_notes/4.38.0.txt +0 -67
  42. data/doc/release_notes/4.39.0.txt +0 -127
  43. data/doc/release_notes/4.4.0.txt +0 -92
  44. data/doc/release_notes/4.40.0.txt +0 -179
  45. data/doc/release_notes/4.41.0.txt +0 -77
  46. data/doc/release_notes/4.42.0.txt +0 -221
  47. data/doc/release_notes/4.43.0.txt +0 -87
  48. data/doc/release_notes/4.44.0.txt +0 -125
  49. data/doc/release_notes/4.45.0.txt +0 -370
  50. data/doc/release_notes/4.46.0.txt +0 -404
  51. data/doc/release_notes/4.47.0.txt +0 -56
  52. data/doc/release_notes/4.48.0.txt +0 -293
  53. data/doc/release_notes/4.49.0.txt +0 -222
  54. data/doc/release_notes/4.5.0.txt +0 -34
  55. data/doc/release_notes/4.6.0.txt +0 -30
  56. data/doc/release_notes/4.7.0.txt +0 -103
  57. data/doc/release_notes/4.8.0.txt +0 -175
  58. data/doc/release_notes/4.9.0.txt +0 -190
  59. data/spec/adapter_spec.rb +0 -4
  60. data/spec/adapters/db2_spec.rb +0 -170
  61. data/spec/adapters/mssql_spec.rb +0 -828
  62. data/spec/adapters/mysql_spec.rb +0 -1060
  63. data/spec/adapters/oracle_spec.rb +0 -371
  64. data/spec/adapters/postgres_spec.rb +0 -4476
  65. data/spec/adapters/spec_helper.rb +0 -44
  66. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  67. data/spec/adapters/sqlite_spec.rb +0 -652
  68. data/spec/bin_spec.rb +0 -278
  69. data/spec/core/connection_pool_spec.rb +0 -1250
  70. data/spec/core/database_spec.rb +0 -2915
  71. data/spec/core/dataset_spec.rb +0 -5544
  72. data/spec/core/deprecated_spec.rb +0 -70
  73. data/spec/core/expression_filters_spec.rb +0 -1498
  74. data/spec/core/mock_adapter_spec.rb +0 -722
  75. data/spec/core/object_graph_spec.rb +0 -336
  76. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  77. data/spec/core/schema_generator_spec.rb +0 -214
  78. data/spec/core/schema_spec.rb +0 -1844
  79. data/spec/core/spec_helper.rb +0 -24
  80. data/spec/core/version_spec.rb +0 -14
  81. data/spec/core_extensions_spec.rb +0 -763
  82. data/spec/core_model_spec.rb +0 -2
  83. data/spec/core_spec.rb +0 -1
  84. data/spec/deprecation_helper.rb +0 -30
  85. data/spec/extensions/accessed_columns_spec.rb +0 -51
  86. data/spec/extensions/active_model_spec.rb +0 -99
  87. data/spec/extensions/after_initialize_spec.rb +0 -28
  88. data/spec/extensions/any_not_empty_spec.rb +0 -23
  89. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  90. data/spec/extensions/association_dependencies_spec.rb +0 -125
  91. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  92. data/spec/extensions/association_pks_spec.rb +0 -423
  93. data/spec/extensions/association_proxies_spec.rb +0 -100
  94. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  95. data/spec/extensions/auto_validations_spec.rb +0 -229
  96. data/spec/extensions/blacklist_security_spec.rb +0 -95
  97. data/spec/extensions/blank_spec.rb +0 -69
  98. data/spec/extensions/boolean_readers_spec.rb +0 -93
  99. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  100. data/spec/extensions/caching_spec.rb +0 -273
  101. data/spec/extensions/caller_logging_spec.rb +0 -52
  102. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  103. data/spec/extensions/column_conflicts_spec.rb +0 -75
  104. data/spec/extensions/column_select_spec.rb +0 -129
  105. data/spec/extensions/columns_introspection_spec.rb +0 -90
  106. data/spec/extensions/columns_updated_spec.rb +0 -35
  107. data/spec/extensions/composition_spec.rb +0 -248
  108. data/spec/extensions/connection_expiration_spec.rb +0 -151
  109. data/spec/extensions/connection_validator_spec.rb +0 -144
  110. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  111. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  112. data/spec/extensions/constraint_validations_spec.rb +0 -439
  113. data/spec/extensions/core_refinements_spec.rb +0 -528
  114. data/spec/extensions/csv_serializer_spec.rb +0 -183
  115. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  116. data/spec/extensions/dataset_associations_spec.rb +0 -365
  117. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  118. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  119. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  120. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  121. data/spec/extensions/defaults_setter_spec.rb +0 -150
  122. data/spec/extensions/delay_add_association_spec.rb +0 -73
  123. data/spec/extensions/dirty_spec.rb +0 -222
  124. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  125. data/spec/extensions/eager_each_spec.rb +0 -62
  126. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  127. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  128. data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
  129. data/spec/extensions/error_splitter_spec.rb +0 -18
  130. data/spec/extensions/error_sql_spec.rb +0 -20
  131. data/spec/extensions/escaped_like_spec.rb +0 -40
  132. data/spec/extensions/eval_inspect_spec.rb +0 -81
  133. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  134. data/spec/extensions/finder_spec.rb +0 -260
  135. data/spec/extensions/force_encoding_spec.rb +0 -126
  136. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  137. data/spec/extensions/graph_each_spec.rb +0 -113
  138. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  139. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  140. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  141. data/spec/extensions/index_caching_spec.rb +0 -66
  142. data/spec/extensions/inflector_spec.rb +0 -183
  143. data/spec/extensions/input_transformer_spec.rb +0 -69
  144. data/spec/extensions/insert_conflict_spec.rb +0 -103
  145. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  146. data/spec/extensions/instance_filters_spec.rb +0 -79
  147. data/spec/extensions/instance_hooks_spec.rb +0 -246
  148. data/spec/extensions/integer64_spec.rb +0 -22
  149. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  150. data/spec/extensions/json_serializer_spec.rb +0 -346
  151. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  152. data/spec/extensions/list_spec.rb +0 -291
  153. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  154. data/spec/extensions/many_through_many_spec.rb +0 -2177
  155. data/spec/extensions/migration_spec.rb +0 -864
  156. data/spec/extensions/modification_detection_spec.rb +0 -93
  157. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  158. data/spec/extensions/named_timezones_spec.rb +0 -218
  159. data/spec/extensions/nested_attributes_spec.rb +0 -815
  160. data/spec/extensions/null_dataset_spec.rb +0 -85
  161. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  162. data/spec/extensions/pagination_spec.rb +0 -116
  163. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  164. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  165. data/spec/extensions/pg_array_spec.rb +0 -398
  166. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  167. data/spec/extensions/pg_enum_spec.rb +0 -118
  168. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  169. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  170. data/spec/extensions/pg_hstore_spec.rb +0 -219
  171. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  172. data/spec/extensions/pg_inet_spec.rb +0 -72
  173. data/spec/extensions/pg_interval_spec.rb +0 -103
  174. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  175. data/spec/extensions/pg_json_spec.rb +0 -451
  176. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  177. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  178. data/spec/extensions/pg_range_spec.rb +0 -600
  179. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  180. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  181. data/spec/extensions/pg_row_spec.rb +0 -363
  182. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  183. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  184. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  185. data/spec/extensions/prepared_statements_spec.rb +0 -177
  186. data/spec/extensions/pretty_table_spec.rb +0 -123
  187. data/spec/extensions/query_spec.rb +0 -94
  188. data/spec/extensions/rcte_tree_spec.rb +0 -387
  189. data/spec/extensions/round_timestamps_spec.rb +0 -39
  190. data/spec/extensions/s_spec.rb +0 -60
  191. data/spec/extensions/schema_caching_spec.rb +0 -64
  192. data/spec/extensions/schema_dumper_spec.rb +0 -870
  193. data/spec/extensions/select_remove_spec.rb +0 -38
  194. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  195. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  196. data/spec/extensions/serialization_spec.rb +0 -365
  197. data/spec/extensions/server_block_spec.rb +0 -135
  198. data/spec/extensions/server_logging_spec.rb +0 -45
  199. data/spec/extensions/sharding_spec.rb +0 -197
  200. data/spec/extensions/shared_caching_spec.rb +0 -151
  201. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  202. data/spec/extensions/singular_table_names_spec.rb +0 -22
  203. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  204. data/spec/extensions/spec_helper.rb +0 -70
  205. data/spec/extensions/split_array_nil_spec.rb +0 -24
  206. data/spec/extensions/split_values_spec.rb +0 -57
  207. data/spec/extensions/sql_comments_spec.rb +0 -33
  208. data/spec/extensions/sql_expr_spec.rb +0 -59
  209. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  210. data/spec/extensions/static_cache_spec.rb +0 -471
  211. data/spec/extensions/string_agg_spec.rb +0 -90
  212. data/spec/extensions/string_date_time_spec.rb +0 -95
  213. data/spec/extensions/string_stripper_spec.rb +0 -68
  214. data/spec/extensions/subclasses_spec.rb +0 -79
  215. data/spec/extensions/subset_conditions_spec.rb +0 -38
  216. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  217. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  218. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  219. data/spec/extensions/table_select_spec.rb +0 -83
  220. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  221. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  222. data/spec/extensions/throw_failures_spec.rb +0 -74
  223. data/spec/extensions/timestamps_spec.rb +0 -209
  224. data/spec/extensions/to_dot_spec.rb +0 -153
  225. data/spec/extensions/touch_spec.rb +0 -226
  226. data/spec/extensions/tree_spec.rb +0 -334
  227. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  228. data/spec/extensions/unlimited_update_spec.rb +0 -21
  229. data/spec/extensions/update_or_create_spec.rb +0 -83
  230. data/spec/extensions/update_primary_key_spec.rb +0 -105
  231. data/spec/extensions/update_refresh_spec.rb +0 -59
  232. data/spec/extensions/uuid_spec.rb +0 -101
  233. data/spec/extensions/validate_associated_spec.rb +0 -52
  234. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  235. data/spec/extensions/validation_contexts_spec.rb +0 -31
  236. data/spec/extensions/validation_helpers_spec.rb +0 -525
  237. data/spec/extensions/whitelist_security_spec.rb +0 -157
  238. data/spec/extensions/xml_serializer_spec.rb +0 -213
  239. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  240. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  241. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  242. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  243. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  244. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  245. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  246. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  247. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  248. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  249. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  250. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  251. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  252. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  253. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  254. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  255. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  256. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  257. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  258. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  259. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  260. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  261. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  262. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  263. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  264. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  265. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  266. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  267. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  268. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  269. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  270. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  271. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  272. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  273. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  274. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  275. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  276. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  277. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  278. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  279. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  280. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  281. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  282. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  283. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  284. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  285. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  286. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  287. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  288. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  289. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  290. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  291. data/spec/guards_helper.rb +0 -59
  292. data/spec/integration/associations_test.rb +0 -2597
  293. data/spec/integration/database_test.rb +0 -113
  294. data/spec/integration/dataset_test.rb +0 -2037
  295. data/spec/integration/eager_loader_test.rb +0 -687
  296. data/spec/integration/migrator_test.rb +0 -262
  297. data/spec/integration/model_test.rb +0 -203
  298. data/spec/integration/plugin_test.rb +0 -2423
  299. data/spec/integration/prepared_statement_test.rb +0 -405
  300. data/spec/integration/schema_test.rb +0 -903
  301. data/spec/integration/spec_helper.rb +0 -71
  302. data/spec/integration/timezone_test.rb +0 -86
  303. data/spec/integration/transaction_test.rb +0 -603
  304. data/spec/integration/type_test.rb +0 -127
  305. data/spec/model/association_reflection_spec.rb +0 -803
  306. data/spec/model/associations_spec.rb +0 -4738
  307. data/spec/model/base_spec.rb +0 -875
  308. data/spec/model/class_dataset_methods_spec.rb +0 -146
  309. data/spec/model/dataset_methods_spec.rb +0 -198
  310. data/spec/model/eager_loading_spec.rb +0 -2377
  311. data/spec/model/hooks_spec.rb +0 -370
  312. data/spec/model/inflector_spec.rb +0 -26
  313. data/spec/model/model_spec.rb +0 -956
  314. data/spec/model/plugins_spec.rb +0 -429
  315. data/spec/model/record_spec.rb +0 -2118
  316. data/spec/model/spec_helper.rb +0 -46
  317. data/spec/model/validations_spec.rb +0 -220
  318. data/spec/model_no_assoc_spec.rb +0 -1
  319. data/spec/model_spec.rb +0 -1
  320. data/spec/plugin_spec.rb +0 -1
  321. data/spec/sequel_coverage.rb +0 -15
  322. data/spec/sequel_warning.rb +0 -5
  323. data/spec/spec_config.rb +0 -12
@@ -1,102 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :pg_inet_ops
4
-
5
- describe "Sequel::Postgres::InetOp" do
6
- before do
7
- db = Sequel.connect('mock://postgres')
8
- db.extend_datasets{def quote_identifiers?; false end}
9
- db.extension :pg_inet
10
- @ds = db.dataset
11
- @h = Sequel.pg_inet_op(:h)
12
- end
13
-
14
- it "#pg_inet should return self" do
15
- @h.pg_inet.must_be_same_as(@h)
16
- end
17
-
18
- it "Sequel.pg_inet_op should return argument if already an InetOp" do
19
- Sequel.pg_inet_op(@h).must_be_same_as(@h)
20
- end
21
-
22
- it "#pg_inet should return a InetOp for literal strings, and expressions" do
23
- @ds.literal(Sequel.function(:b, :h).pg_inet.abbrev).must_equal "abbrev(b(h))"
24
- @ds.literal(Sequel.lit('h').pg_inet.abbrev).must_equal "abbrev(h)"
25
- end
26
-
27
- it "should define methods for all of the PostgreSQL inet operators" do
28
- @ds.literal(@h + @h).must_equal "(h + h)"
29
- @ds.literal(@h - @h).must_equal "(h - h)"
30
- @ds.literal(@h << @h).must_equal "(h << h)"
31
- @ds.literal(@h >> @h).must_equal "(h >> h)"
32
- @ds.literal(@h & @h).must_equal "(h & h)"
33
- @ds.literal(@h | @h).must_equal "(h | h)"
34
- @ds.literal(~@h).must_equal "~h"
35
-
36
- @ds.literal(@h.contained_by(@h)).must_equal "(h << h)"
37
- @ds.literal(@h.contained_by_or_equals(@h)).must_equal "(h <<= h)"
38
- @ds.literal(@h.contains(@h)).must_equal "(h >> h)"
39
- @ds.literal(@h.contains_or_equals(@h)).must_equal "(h >>= h)"
40
- @ds.literal(@h.contains_or_contained_by(@h)).must_equal "(h && h)"
41
- end
42
-
43
- it "should define methods for all of the PostgreSQL inet functions" do
44
- @ds.literal(@h.abbrev).must_equal "abbrev(h)"
45
- @ds.literal(@h.broadcast).must_equal "broadcast(h)"
46
- @ds.literal(@h.family).must_equal "family(h)"
47
- @ds.literal(@h.host).must_equal "host(h)"
48
- @ds.literal(@h.hostmask).must_equal "hostmask(h)"
49
- @ds.literal(@h.masklen).must_equal "masklen(h)"
50
- @ds.literal(@h.netmask).must_equal "netmask(h)"
51
- @ds.literal(@h.network).must_equal "network(h)"
52
- @ds.literal(@h.set_masklen(16)).must_equal "set_masklen(h, 16)"
53
- @ds.literal(@h.text).must_equal "text(h)"
54
- end
55
-
56
- it "should have operators that return booleans return boolean expressions" do
57
- @ds.literal((@h << @h) & :b).must_equal "((h << h) AND b)"
58
- @ds.literal((@h >> @h) & :b).must_equal "((h >> h) AND b)"
59
-
60
- @ds.literal(@h.contained_by(@h) & :b).must_equal "((h << h) AND b)"
61
- @ds.literal(@h.contained_by_or_equals(@h) & :b).must_equal "((h <<= h) AND b)"
62
- @ds.literal(@h.contains(@h) & :b).must_equal "((h >> h) AND b)"
63
- @ds.literal(@h.contains_or_equals(@h) & :b).must_equal "((h >>= h) AND b)"
64
- @ds.literal(@h.contains_or_contained_by(@h) & :b).must_equal "((h && h) AND b)"
65
- end
66
-
67
- it "should have operators that return inet return InetOp" do
68
- @ds.literal((@h & @h).contains(:b)).must_equal "((h & h) >> b)"
69
- @ds.literal((@h | @h).contains(:b)).must_equal "((h | h) >> b)"
70
- @ds.literal((@h + @h).contains(:b)).must_equal "((h + h) >> b)"
71
- @ds.literal((@h - 3).contains(:b)).must_equal "((h - 3) >> b)"
72
- @ds.literal((~@h).contains(:b)).must_equal "(~h >> b)"
73
- end
74
-
75
- it "should have - operator with inet op return numeric expression" do
76
- @ds.literal((@h - @h) / :b).must_equal "((h - h) / b)"
77
- end
78
-
79
- it "should have function methods returning int return numeric expressions" do
80
- @ds.literal(@h.family / 2).must_equal "(family(h) / 2)"
81
- @ds.literal(@h.masklen / 2).must_equal "(masklen(h) / 2)"
82
- end
83
-
84
- it "should have function methods returning text return string expressions" do
85
- @ds.literal(@h.abbrev + :a).must_equal "(abbrev(h) || a)"
86
- @ds.literal(@h.host + :a).must_equal "(host(h) || a)"
87
- @ds.literal(@h.text + :a).must_equal "(text(h) || a)"
88
- end
89
-
90
- it "should have function methods returning inet return InetOp" do
91
- @ds.literal(@h.broadcast.contains(:a)).must_equal "(broadcast(h) >> a)"
92
- @ds.literal(@h.hostmask.contains(:a)).must_equal "(hostmask(h) >> a)"
93
- @ds.literal(@h.netmask.contains(:a)).must_equal "(netmask(h) >> a)"
94
- @ds.literal(@h.network.contains(:a)).must_equal "(network(h) >> a)"
95
- @ds.literal(@h.set_masklen(16).contains(:a)).must_equal "(set_masklen(h, 16) >> a)"
96
- end
97
-
98
- it "should string and IPAddr instances in a cast to inet" do
99
- @ds.literal(Sequel.pg_inet_op('1.2.3.4').contains(:a)).must_equal "(CAST('1.2.3.4' AS inet) >> a)"
100
- @ds.literal(Sequel.pg_inet_op(IPAddr.new('1.2.3.4')).contains(:a)).must_equal "(CAST('1.2.3.4/32' AS inet) >> a)"
101
- end
102
- end
@@ -1,72 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "pg_inet extension" do
4
- ipv6_broken = (IPAddr.new('::1'); false) rescue true
5
- before do
6
- @db = Sequel.connect('mock://postgres')
7
- @db.extend_datasets{def quote_identifiers?; false end}
8
- @db.extension(:pg_array, :pg_inet)
9
- end
10
-
11
- it "should literalize IPAddr v4 instances to strings correctly" do
12
- @db.literal(IPAddr.new('127.0.0.1')).must_equal "'127.0.0.1/32'"
13
- @db.literal(IPAddr.new('127.0.0.0/8')).must_equal "'127.0.0.0/8'"
14
- end
15
-
16
- it "should literalize IPAddr v6 instances to strings correctly" do
17
- @db.literal(IPAddr.new('2001:4f8:3:ba::/64')).must_equal "'2001:4f8:3:ba::/64'"
18
- @db.literal(IPAddr.new('2001:4f8:3:ba:2e0:81ff:fe22:d1f1')).must_equal "'2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128'"
19
- end unless ipv6_broken
20
-
21
- it "should set up conversion procs correctly" do
22
- cp = @db.conversion_procs
23
- cp[869].call("127.0.0.1").must_equal IPAddr.new('127.0.0.1')
24
- cp[650].call("127.0.0.1").must_equal IPAddr.new('127.0.0.1')
25
- end
26
-
27
- it "should set up conversion procs for arrays correctly" do
28
- cp = @db.conversion_procs
29
- cp[1041].call("{127.0.0.1}").must_equal [IPAddr.new('127.0.0.1')]
30
- cp[651].call("{127.0.0.1}").must_equal [IPAddr.new('127.0.0.1')]
31
- cp[1040].call("{127.0.0.1}").must_equal ['127.0.0.1']
32
- end
33
-
34
- it "should not affect literalization of custom objects" do
35
- o = Object.new
36
- def o.sql_literal(ds) 'v' end
37
- @db.literal(o).must_equal 'v'
38
- end
39
-
40
- it "should support using IPAddr as bound variables" do
41
- @db.bound_variable_arg(1, nil).must_equal 1
42
- @db.bound_variable_arg(IPAddr.new('127.0.0.1'), nil).must_equal '127.0.0.1/32'
43
- end
44
-
45
- it "should support using IPAddr instances in array types in bound variables" do
46
- @db.bound_variable_arg(Sequel.pg_array([IPAddr.new('127.0.0.1')]), nil).must_equal '{"127.0.0.1/32"}'
47
- end
48
-
49
- it "should parse inet/cidr type from the schema correctly" do
50
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'inet'}, {:name=>'c', :db_type=>'cidr'}]
51
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :ipaddr, :ipaddr]
52
- end
53
-
54
- it "should set :ruby_default schema entries if default value is recognized" do
55
- @db.fetch = [{:name=>'id', :db_type=>'integer', :default=>'1'}, {:name=>'t', :db_type=>'inet', :default=>"'127.0.0.1'::inet"}]
56
- s = @db.schema(:items)
57
- s[1][1][:ruby_default].must_equal IPAddr.new('127.0.0.1')
58
- end
59
-
60
- it "should support typecasting for the ipaddr type" do
61
- ip = IPAddr.new('127.0.0.1')
62
- @db.typecast_value(:ipaddr, ip).must_be_same_as(ip)
63
- @db.typecast_value(:ipaddr, ip.to_s).must_equal ip
64
- proc{@db.typecast_value(:ipaddr, '')}.must_raise(Sequel::InvalidValue)
65
- proc{@db.typecast_value(:ipaddr, 1)}.must_raise(Sequel::InvalidValue)
66
- end
67
-
68
- it "should return correct results for Database#schema_type_class" do
69
- @db.schema_type_class(:ipaddr).must_equal IPAddr
70
- @db.schema_type_class(:integer).must_equal Integer
71
- end
72
- end
@@ -1,103 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- begin
4
- require 'active_support/duration'
5
- begin
6
- require 'active_support/gem_version'
7
- rescue LoadError
8
- end
9
- rescue LoadError
10
- warn "Skipping test of pg_interval plugin: can't load active_support/duration"
11
- else
12
- describe "pg_interval extension" do
13
- before do
14
- @db = Sequel.connect('mock://postgres')
15
- @db.extend_datasets{def quote_identifiers?; false end}
16
- @db.extension(:pg_array, :pg_interval)
17
- end
18
-
19
- it "should literalize ActiveSupport::Duration instances to strings correctly" do
20
- @db.literal(ActiveSupport::Duration.new(0, [])).must_equal "'0'::interval"
21
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 0]])).must_equal "'0'::interval"
22
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 10], [:minutes, 20], [:days, 3], [:months, 4], [:years, 6]])).must_equal "'6 years 4 months 3 days 20 minutes 10 seconds '::interval"
23
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 10], [:minutes, 20], [:hours, 8], [:days, 3], [:weeks, 2], [:months, 4], [:years, 6]])).must_equal "'6 years 4 months 2 weeks 3 days 8 hours 20 minutes 10 seconds '::interval"
24
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, -10.000001], [:minutes, -20], [:days, -3], [:months, -4], [:years, -6]])).must_equal "'-6 years -4 months -3 days -20 minutes -10.000001 seconds '::interval"
25
- end
26
-
27
- it "should literalize ActiveSupport::Duration instances with repeated parts correctly" do
28
- if defined?(ActiveSupport::VERSION::STRING) && ActiveSupport::VERSION::STRING >= '5.1'
29
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 2], [:seconds, 1]])).must_equal "'1 seconds '::interval"
30
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 2], [:seconds, 1], [:days, 1], [:days, 4]])).must_equal "'4 days 1 seconds '::interval"
31
- else
32
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 2], [:seconds, 1]])).must_equal "'3 seconds '::interval"
33
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 2], [:seconds, 1], [:days, 1], [:days, 4]])).must_equal "'5 days 3 seconds '::interval"
34
- end
35
- end
36
-
37
- it "should set up conversion procs correctly" do
38
- cp = @db.conversion_procs
39
- cp[1186].call("1 sec").must_equal ActiveSupport::Duration.new(1, [[:seconds, 1]])
40
- end
41
-
42
- it "should set up conversion procs for arrays correctly" do
43
- cp = @db.conversion_procs
44
- cp[1187].call("{1 sec}").must_equal [ActiveSupport::Duration.new(1, [[:seconds, 1]])]
45
- end
46
-
47
- it "should not affect literalization of custom objects" do
48
- o = Object.new
49
- def o.sql_literal(ds) 'v' end
50
- @db.literal(o).must_equal 'v'
51
- end
52
-
53
- it "should support using ActiveSupport::Duration instances as bound variables" do
54
- @db.bound_variable_arg(1, nil).must_equal 1
55
- @db.bound_variable_arg(ActiveSupport::Duration.new(0, [[:seconds, 0]]), nil).must_equal '0'
56
- @db.bound_variable_arg(ActiveSupport::Duration.new(0, [[:seconds, -10.000001], [:minutes, -20], [:days, -3], [:months, -4], [:years, -6]]), nil).must_equal '-6 years -4 months -3 days -20 minutes -10.000001 seconds '
57
- end
58
-
59
- it "should support using ActiveSupport::Duration instances in array types in bound variables" do
60
- @db.bound_variable_arg(Sequel.pg_array([ActiveSupport::Duration.new(0, [[:seconds, 0]])]), nil).must_equal '{"0"}'
61
- @db.bound_variable_arg(Sequel.pg_array([ActiveSupport::Duration.new(0, [[:seconds, -10.000001], [:minutes, -20], [:days, -3], [:months, -4], [:years, -6]])]), nil).must_equal '{"-6 years -4 months -3 days -20 minutes -10.000001 seconds "}'
62
- end
63
-
64
- it "should parse interval type from the schema correctly" do
65
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'interval'}]
66
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :interval]
67
- end
68
-
69
- it "should set :ruby_default schema entries if default value is recognized" do
70
- @db.fetch = [{:name=>'id', :db_type=>'integer', :default=>'1'}, {:name=>'t', :db_type=>'interval', :default=>"'3 days'::interval"}]
71
- s = @db.schema(:items)
72
- s[1][1][:ruby_default].must_equal ActiveSupport::Duration.new(3*86400, :days=>3)
73
- end
74
-
75
- it "should support typecasting for the interval type" do
76
- d = ActiveSupport::Duration.new(31557600 + 2*86400*30 + 3*86400*7 + 4*86400 + 5*3600 + 6*60 + 7, [[:years, 1], [:months, 2], [:days, 25], [:seconds, 18367]])
77
- @db.typecast_value(:interval, d).object_id.must_equal d.object_id
78
-
79
- @db.typecast_value(:interval, "1 year 2 mons 25 days 05:06:07").is_a?(ActiveSupport::Duration).must_equal true
80
- @db.typecast_value(:interval, "1 year 2 mons 25 days 05:06:07").must_equal d
81
- @db.typecast_value(:interval, "1 year 2 mons 25 days 05:06:07").parts.sort_by{|k,v| k.to_s}.must_equal d.parts.sort_by{|k,v| k.to_s}
82
- @db.typecast_value(:interval, "1 year 2 mons 25 days 05:06:07.0").parts.sort_by{|k,v| k.to_s}.must_equal d.parts.sort_by{|k,v| k.to_s}
83
-
84
- @db.typecast_value(:interval, "1 year 2 mons 25 days 5 hours 6 mins 7 secs").is_a?(ActiveSupport::Duration).must_equal true
85
- @db.typecast_value(:interval, "1 year 2 mons 25 days 5 hours 6 mins 7 secs").must_equal d
86
- @db.typecast_value(:interval, "1 year 2 mons 25 days 5 hours 6 mins 7 secs").parts.sort_by{|k,v| k.to_s}.must_equal d.parts.sort_by{|k,v| k.to_s}
87
- @db.typecast_value(:interval, "1 year 2 mons 25 days 5 hours 6 mins 7.0 secs").parts.sort_by{|k,v| k.to_s}.must_equal d.parts.sort_by{|k,v| k.to_s}
88
-
89
- d2 = ActiveSupport::Duration.new(1, [[:seconds, 1]])
90
- @db.typecast_value(:interval, 1).is_a?(ActiveSupport::Duration).must_equal true
91
- @db.typecast_value(:interval, 1).must_equal d2
92
- @db.typecast_value(:interval, 1).parts.sort_by{|k,v| k.to_s}.must_equal d2.parts.sort_by{|k,v| k.to_s}
93
-
94
- proc{@db.typecast_value(:interval, 'foo')}.must_raise(Sequel::InvalidValue)
95
- proc{@db.typecast_value(:interval, Object.new)}.must_raise(Sequel::InvalidValue)
96
- end
97
-
98
- it "should return correct results for Database#schema_type_class" do
99
- @db.schema_type_class(:interval).must_equal ActiveSupport::Duration
100
- @db.schema_type_class(:integer).must_equal Integer
101
- end
102
- end
103
- end
@@ -1,356 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :pg_array, :pg_array_ops, :pg_json, :pg_json_ops
4
-
5
- describe "Sequel::Postgres::JSONOp" do
6
- before do
7
- @db = Sequel.connect('mock://postgres')
8
- @db.extend_datasets{def quote_identifiers?; false end}
9
- @j = Sequel.pg_json_op(:j)
10
- @jb = Sequel.pg_jsonb_op(:j)
11
- @l = proc{|o| @db.literal(o)}
12
- end
13
-
14
- it "should have #[] get the element" do
15
- @l[@j[1]].must_equal "(j -> 1)"
16
- @l[@j['a']].must_equal "(j -> 'a')"
17
- end
18
-
19
- it "should have #[] accept an array" do
20
- @l[@j[%w'a b']].must_equal "(j #> ARRAY['a','b'])"
21
- @l[@j[Sequel.pg_array(%w'a b')]].must_equal "(j #> ARRAY['a','b'])"
22
- @l[@j[Sequel.pg_array(:a)]].must_equal "(j #> a)"
23
- end
24
-
25
- it "should have #[] return an object of the same class" do
26
- @l[@j[1].to_recordset].must_equal "json_to_recordset((j -> 1))"
27
- @l[@j[%w'a b'][2]].must_equal "((j #> ARRAY['a','b']) -> 2)"
28
- @l[@jb[1].to_recordset].must_equal "jsonb_to_recordset((j -> 1))"
29
- @l[@jb[%w'a b'][2]].must_equal "((j #> ARRAY['a','b']) -> 2)"
30
- end
31
-
32
- it "should have #get be an alias to #[]" do
33
- @l[@j.get(1)].must_equal "(j -> 1)"
34
- @l[@j.get(%w'a b')].must_equal "(j #> ARRAY['a','b'])"
35
- end
36
-
37
- it "should have #get_text get the element as text" do
38
- @l[@j.get_text(1)].must_equal "(j ->> 1)"
39
- @l[@j.get_text('a')].must_equal "(j ->> 'a')"
40
- end
41
-
42
- it "should have #get_text accept an array" do
43
- @l[@j.get_text(%w'a b')].must_equal "(j #>> ARRAY['a','b'])"
44
- @l[@j.get_text(Sequel.pg_array(%w'a b'))].must_equal "(j #>> ARRAY['a','b'])"
45
- @l[@j.get_text(Sequel.pg_array(:a))].must_equal "(j #>> a)"
46
- end
47
-
48
- it "should have #get_text return an SQL::StringExpression" do
49
- @l[@j.get_text(1) + 'a'].must_equal "((j ->> 1) || 'a')"
50
- @l[@j.get_text(%w'a b') + 'a'].must_equal "((j #>> ARRAY['a','b']) || 'a')"
51
- end
52
-
53
- it "should have #array_length use the json_array_length function" do
54
- @l[@j.array_length].must_equal "json_array_length(j)"
55
- @l[@jb.array_length].must_equal "jsonb_array_length(j)"
56
- end
57
-
58
- it "should have #array_length return a numeric expression" do
59
- @l[@j.array_length & 1].must_equal "(json_array_length(j) & 1)"
60
- @l[@jb.array_length & 1].must_equal "(jsonb_array_length(j) & 1)"
61
- end
62
-
63
- it "should have #each use the json_each function" do
64
- @l[@j.each].must_equal "json_each(j)"
65
- @l[@jb.each].must_equal "jsonb_each(j)"
66
- end
67
-
68
- it "should have #each_text use the json_each_text function" do
69
- @l[@j.each_text].must_equal "json_each_text(j)"
70
- @l[@jb.each_text].must_equal "jsonb_each_text(j)"
71
- end
72
-
73
- it "should have #extract use the json_extract_path function" do
74
- @l[@j.extract('a')].must_equal "json_extract_path(j, 'a')"
75
- @l[@j.extract('a', 'b')].must_equal "json_extract_path(j, 'a', 'b')"
76
- @l[@jb.extract('a')].must_equal "jsonb_extract_path(j, 'a')"
77
- @l[@jb.extract('a', 'b')].must_equal "jsonb_extract_path(j, 'a', 'b')"
78
- end
79
-
80
- it "should have #extract return a JSONOp" do
81
- @l[@j.extract('a')[1]].must_equal "(json_extract_path(j, 'a') -> 1)"
82
- @l[@jb.extract('a')[1]].must_equal "(jsonb_extract_path(j, 'a') -> 1)"
83
- end
84
-
85
- it "should have #extract_text use the json_extract_path_text function" do
86
- @l[@j.extract_text('a')].must_equal "json_extract_path_text(j, 'a')"
87
- @l[@j.extract_text('a', 'b')].must_equal "json_extract_path_text(j, 'a', 'b')"
88
- @l[@jb.extract_text('a')].must_equal "jsonb_extract_path_text(j, 'a')"
89
- @l[@jb.extract_text('a', 'b')].must_equal "jsonb_extract_path_text(j, 'a', 'b')"
90
- end
91
-
92
- it "should have #extract_text return an SQL::StringExpression" do
93
- @l[@j.extract_text('a') + 'a'].must_equal "(json_extract_path_text(j, 'a') || 'a')"
94
- @l[@jb.extract_text('a') + 'a'].must_equal "(jsonb_extract_path_text(j, 'a') || 'a')"
95
- end
96
-
97
- it "should have #keys use the json_object_keys function" do
98
- @l[@j.keys].must_equal "json_object_keys(j)"
99
- @l[@jb.keys].must_equal "jsonb_object_keys(j)"
100
- end
101
-
102
- it "should have #array_elements use the json_array_elements function" do
103
- @l[@j.array_elements].must_equal "json_array_elements(j)"
104
- @l[@jb.array_elements].must_equal "jsonb_array_elements(j)"
105
- end
106
-
107
- it "should have #array_elements use the json_array_elements_text function" do
108
- @l[@j.array_elements_text].must_equal "json_array_elements_text(j)"
109
- @l[@jb.array_elements_text].must_equal "jsonb_array_elements_text(j)"
110
- end
111
-
112
- it "should have #strip_nulls use the json_strip_nulls function" do
113
- @l[@j.strip_nulls].must_equal "json_strip_nulls(j)"
114
- @l[@jb.strip_nulls].must_equal "jsonb_strip_nulls(j)"
115
- end
116
-
117
- it "should have #typeof use the json_typeof function" do
118
- @l[@j.typeof].must_equal "json_typeof(j)"
119
- @l[@jb.typeof].must_equal "jsonb_typeof(j)"
120
- end
121
-
122
- it "should have #to_record use the json_to_record function" do
123
- @l[@j.to_record].must_equal "json_to_record(j)"
124
- @l[@jb.to_record].must_equal "jsonb_to_record(j)"
125
- end
126
-
127
- it "should have #to_recordset use the json_to_recordsetfunction" do
128
- @l[@j.to_recordset].must_equal "json_to_recordset(j)"
129
- @l[@jb.to_recordset].must_equal "jsonb_to_recordset(j)"
130
- end
131
-
132
- it "should have #populate use the json_populate_record function" do
133
- @l[@j.populate(:a)].must_equal "json_populate_record(a, j)"
134
- @l[@jb.populate(:a)].must_equal "jsonb_populate_record(a, j)"
135
- end
136
-
137
- it "should have #populate_set use the json_populate_record function" do
138
- @l[@j.populate_set(:a)].must_equal "json_populate_recordset(a, j)"
139
- @l[@jb.populate_set(:a)].must_equal "jsonb_populate_recordset(a, j)"
140
- end
141
-
142
- it "#contain_all should use the ?& operator" do
143
- @l[@jb.contain_all(:h1)].must_equal "(j ?& h1)"
144
- end
145
-
146
- it "#contain_all handle arrays" do
147
- @l[@jb.contain_all(%w'h1')].must_equal "(j ?& ARRAY['h1'])"
148
- end
149
-
150
- it "#contain_any should use the ?| operator" do
151
- @l[@jb.contain_any(:h1)].must_equal "(j ?| h1)"
152
- end
153
-
154
- it "#contain_any should handle arrays" do
155
- @l[@jb.contain_any(%w'h1')].must_equal "(j ?| ARRAY['h1'])"
156
- end
157
-
158
- it "#contains should use the @> operator" do
159
- @l[@jb.contains(:h1)].must_equal "(j @> h1)"
160
- end
161
-
162
- it "#contains should handle hashes" do
163
- @l[@jb.contains('a'=>'b')].must_equal "(j @> '{\"a\":\"b\"}'::jsonb)"
164
- end
165
-
166
- it "#contains should handle arrays" do
167
- @l[@jb.contains([1, 2])].must_equal "(j @> '[1,2]'::jsonb)"
168
- end
169
-
170
- it "#contained_by should use the <@ operator" do
171
- @l[@jb.contained_by(:h1)].must_equal "(j <@ h1)"
172
- end
173
-
174
- it "#contained_by should handle hashes" do
175
- @l[@jb.contained_by('a'=>'b')].must_equal "(j <@ '{\"a\":\"b\"}'::jsonb)"
176
- end
177
-
178
- it "#contained_by should handle arrays" do
179
- @l[@jb.contained_by([1, 2])].must_equal "(j <@ '[1,2]'::jsonb)"
180
- end
181
-
182
- it "#concat should use the || operator" do
183
- @l[@jb.concat(:h1)].must_equal "(j || h1)"
184
- end
185
-
186
- it "#concat should handle hashes" do
187
- @l[@jb.concat('a'=>'b')].must_equal "(j || '{\"a\":\"b\"}'::jsonb)"
188
- end
189
-
190
- it "#concat should handle arrays" do
191
- @l[@jb.concat([1, 2])].must_equal "(j || '[1,2]'::jsonb)"
192
- end
193
-
194
- it "#insert should use the jsonb_insert function" do
195
- @l[@jb.insert(:a, :h)].must_equal "jsonb_insert(j, a, h, false)"
196
- @l[@jb.insert(:a, :h, true)].must_equal "jsonb_insert(j, a, h, true)"
197
- end
198
-
199
- it "#insert should handle hashes" do
200
- @l[@jb.insert(:a, 'a'=>'b')].must_equal "jsonb_insert(j, a, '{\"a\":\"b\"}'::jsonb, false)"
201
- end
202
-
203
- it "#insert should handle arrays" do
204
- @l[@jb.insert(%w'a b', [1, 2])].must_equal "jsonb_insert(j, ARRAY['a','b'], '[1,2]'::jsonb, false)"
205
- end
206
-
207
- it "#set should use the jsonb_set function" do
208
- @l[@jb.set(:a, :h)].must_equal "jsonb_set(j, a, h, true)"
209
- @l[@jb.set(:a, :h, false)].must_equal "jsonb_set(j, a, h, false)"
210
- end
211
-
212
- it "#set should handle hashes" do
213
- @l[@jb.set(:a, 'a'=>'b')].must_equal "jsonb_set(j, a, '{\"a\":\"b\"}'::jsonb, true)"
214
- end
215
-
216
- it "#set should handle arrays" do
217
- @l[@jb.set(%w'a b', [1, 2])].must_equal "jsonb_set(j, ARRAY['a','b'], '[1,2]'::jsonb, true)"
218
- end
219
-
220
- it "#pretty should use the jsonb_pretty function" do
221
- @l[@jb.pretty].must_equal "jsonb_pretty(j)"
222
- end
223
-
224
- it "#- should use the - operator" do
225
- @l[@jb - 1].must_equal "(j - 1)"
226
- end
227
-
228
- it "#delete_path should use the #- operator" do
229
- @l[@jb.delete_path(:a)].must_equal "(j #- a)"
230
- end
231
-
232
- it "#delete_path should handle arrays" do
233
- @l[@jb.delete_path(['a'])].must_equal "(j #- ARRAY['a'])"
234
- end
235
-
236
- it "#has_key? and aliases should use the ? operator" do
237
- @l[@jb.has_key?('a')].must_equal "(j ? 'a')"
238
- @l[@jb.include?('a')].must_equal "(j ? 'a')"
239
- end
240
-
241
- it "#pg_json should return self" do
242
- @j.pg_json.must_be_same_as(@j)
243
- @jb.pg_jsonb.must_be_same_as(@jb)
244
- end
245
-
246
- it "Sequel.pg_json_op should return arg for JSONOp" do
247
- Sequel.pg_json_op(@j).must_be_same_as(@j)
248
- Sequel.pg_jsonb_op(@jb).must_be_same_as(@jb)
249
- end
250
-
251
- it "should be able to turn expressions into json ops using pg_json" do
252
- @db.literal(Sequel.qualify(:b, :a).pg_json[1]).must_equal "(b.a -> 1)"
253
- @db.literal(Sequel.function(:a, :b).pg_json[1]).must_equal "(a(b) -> 1)"
254
- @db.literal(Sequel.qualify(:b, :a).pg_jsonb[1]).must_equal "(b.a -> 1)"
255
- @db.literal(Sequel.function(:a, :b).pg_jsonb[1]).must_equal "(a(b) -> 1)"
256
- end
257
-
258
- it "should be able to turn literal strings into json ops using pg_json" do
259
- @db.literal(Sequel.lit('a').pg_json[1]).must_equal "(a -> 1)"
260
- @db.literal(Sequel.lit('a').pg_jsonb[1]).must_equal "(a -> 1)"
261
- end
262
-
263
- it "should be able to turn symbols into json ops using Sequel.pg_json_op" do
264
- @db.literal(Sequel.pg_json_op(:a)[1]).must_equal "(a -> 1)"
265
- @db.literal(Sequel.pg_jsonb_op(:a)[1]).must_equal "(a -> 1)"
266
- end
267
-
268
- it "should be able to turn symbols into json ops using Sequel.pg_json" do
269
- @db.literal(Sequel.pg_json(:a)[1]).must_equal "(a -> 1)"
270
- @db.literal(Sequel.pg_jsonb(:a)[1]).must_equal "(a -> 1)"
271
- @db.literal(Sequel.pg_jsonb(:a).contains('a'=>1)).must_equal "(a @> '{\"a\":1}'::jsonb)"
272
- end
273
-
274
- it "should allow transforming JSONArray instances into ArrayOp instances" do
275
- @db.literal(Sequel.pg_json([1,2]).op[1]).must_equal "('[1,2]'::json -> 1)"
276
- end
277
-
278
- it "should allow transforming JSONHash instances into ArrayOp instances" do
279
- @db.literal(Sequel.pg_json('a'=>1).op['a']).must_equal "('{\"a\":1}'::json -> 'a')"
280
- end
281
-
282
- it "should allow transforming JSONBArray instances into ArrayOp instances" do
283
- @db.literal(Sequel.pg_jsonb([1,2]).op[1]).must_equal "('[1,2]'::jsonb -> 1)"
284
- end
285
-
286
- it "should allow transforming JSONBHash instances into ArrayOp instances" do
287
- @db.literal(Sequel.pg_jsonb('a'=>1).op['a']).must_equal "('{\"a\":1}'::jsonb -> 'a')"
288
- end
289
-
290
- it "#path_exists should use the @? operator" do
291
- @l[@jb.path_exists('$')].must_equal "(j @? '$')"
292
- end
293
-
294
- it "#path_exists result should be a boolean expression" do
295
- @jb.path_exists('$').must_be_kind_of Sequel::SQL::BooleanExpression
296
- end
297
-
298
- it "#path_match should use the @@ operator" do
299
- @l[@jb.path_match('$')].must_equal "(j @@ '$')"
300
- end
301
-
302
- it "#path_match result should be a boolean expression" do
303
- @jb.path_match('$').must_be_kind_of Sequel::SQL::BooleanExpression
304
- end
305
-
306
- it "#path_exists! should use the jsonb_path_exists function" do
307
- @l[@jb.path_exists!('$')].must_equal "jsonb_path_exists(j, '$')"
308
- @l[@jb.path_exists!('$', '{"x":2}')].must_equal "jsonb_path_exists(j, '$', '{\"x\":2}')"
309
- @l[@jb.path_exists!('$', x: 2)].must_equal "jsonb_path_exists(j, '$', '{\"x\":2}')"
310
- @l[@jb.path_exists!('$', {x: 2}, true)].must_equal "jsonb_path_exists(j, '$', '{\"x\":2}', true)"
311
- end
312
-
313
- it "#path_exists! result should be a boolean expression" do
314
- @jb.path_exists!('$').must_be_kind_of Sequel::SQL::BooleanExpression
315
- end
316
-
317
- it "#path_match! should use the jsonb_path_match function" do
318
- @l[@jb.path_match!('$')].must_equal "jsonb_path_match(j, '$')"
319
- @l[@jb.path_match!('$', '{"x":2}')].must_equal "jsonb_path_match(j, '$', '{\"x\":2}')"
320
- @l[@jb.path_match!('$', x: 2)].must_equal "jsonb_path_match(j, '$', '{\"x\":2}')"
321
- @l[@jb.path_match!('$', {x: 2}, true)].must_equal "jsonb_path_match(j, '$', '{\"x\":2}', true)"
322
- end
323
-
324
- it "#path_match! result should be a boolean expression" do
325
- @jb.path_match!('$').must_be_kind_of Sequel::SQL::BooleanExpression
326
- end
327
-
328
- it "#path_query should use the jsonb_path_query function" do
329
- @l[@jb.path_query('$')].must_equal "jsonb_path_query(j, '$')"
330
- @l[@jb.path_query('$', '{"x":2}')].must_equal "jsonb_path_query(j, '$', '{\"x\":2}')"
331
- @l[@jb.path_query('$', x: 2)].must_equal "jsonb_path_query(j, '$', '{\"x\":2}')"
332
- @l[@jb.path_query('$', {x: 2}, true)].must_equal "jsonb_path_query(j, '$', '{\"x\":2}', true)"
333
- end
334
-
335
- it "#path_query_array should use the jsonb_path_query_array function" do
336
- @l[@jb.path_query_array('$')].must_equal "jsonb_path_query_array(j, '$')"
337
- @l[@jb.path_query_array('$', '{"x":2}')].must_equal "jsonb_path_query_array(j, '$', '{\"x\":2}')"
338
- @l[@jb.path_query_array('$', x: 2)].must_equal "jsonb_path_query_array(j, '$', '{\"x\":2}')"
339
- @l[@jb.path_query_array('$', {x: 2}, true)].must_equal "jsonb_path_query_array(j, '$', '{\"x\":2}', true)"
340
- end
341
-
342
- it "#path_query_array result should be a JSONBOp" do
343
- @l[@jb.path_query_array('$').path_query_array('$')].must_equal "jsonb_path_query_array(jsonb_path_query_array(j, '$'), '$')"
344
- end
345
-
346
- it "#path_query_first should use the jsonb_path_query_first function" do
347
- @l[@jb.path_query_first('$')].must_equal "jsonb_path_query_first(j, '$')"
348
- @l[@jb.path_query_first('$', '{"x":2}')].must_equal "jsonb_path_query_first(j, '$', '{\"x\":2}')"
349
- @l[@jb.path_query_first('$', x: 2)].must_equal "jsonb_path_query_first(j, '$', '{\"x\":2}')"
350
- @l[@jb.path_query_first('$', {x: 2}, true)].must_equal "jsonb_path_query_first(j, '$', '{\"x\":2}', true)"
351
- end
352
-
353
- it "#path_query_first result should be a JSONBOp" do
354
- @l[@jb.path_query_first('$').path_query_first('$')].must_equal "jsonb_path_query_first(jsonb_path_query_first(j, '$'), '$')"
355
- end
356
- end