File: pg_row_ops_spec.rb

package info (click to toggle)
ruby-sequel 5.63.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,408 kB
  • sloc: ruby: 113,747; makefile: 3
file content (69 lines) | stat: -rw-r--r-- 2,235 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
require_relative "spec_helper"

Sequel.extension :pg_array, :pg_array_ops, :pg_row, :pg_row_ops

describe "Sequel::Postgres::PGRowOp" do
  before do
    @db = Sequel.connect('mock://postgres')
    @db.extend_datasets{def quote_identifiers?; false end}
    @a = Sequel.pg_row_op(:a)
  end

  it "#[] should access members of the composite type" do
    @db.literal(@a[:b]).must_equal "(a).b"
  end

  it "#[] should be chainable" do
    @db.literal(@a[:b][:c]).must_equal "((a).b).c"
  end

  it "#[] should support array access if not given an identifier" do
    @db.literal(@a[:b][1]).must_equal "((a).b)[1]"
  end

  it "#[] should be chainable with array access" do
    @db.literal(@a[1][:b]).must_equal "((a)[1]).b"
  end

  it "#splat should return a splatted argument inside parentheses" do
    @db.literal(@a.splat).must_equal "(a.*)"
  end

  it "#splat(type) should return a splatted argument cast to given type" do
    @db.literal(@a.splat(:b)).must_equal "(a.*)::b"
  end

  it "#splat should not work on an already accessed composite type" do
    proc{@a[:a].splat(:b)}.must_raise(Sequel::Error)
  end

  it "#* should reference all members of the composite type as separate columns if given no arguments" do
    @db.literal(@a.*).must_equal "(a).*"
    @db.literal(@a[:b].*).must_equal "((a).b).*"
  end

  it "#* should use a multiplication operation if any arguments are given" do
    @db.literal(@a.*(1)).must_equal "(a * 1)"
    @db.literal(@a[:b].*(1)).must_equal "((a).b * 1)"
  end

  it "#pg_row should be callable on literal strings" do
    @db.literal(Sequel.lit('a').pg_row[:b]).must_equal "(a).b"
  end

  it "#pg_row should be callable on Sequel expressions" do
    @db.literal(Sequel.function(:a).pg_row[:b]).must_equal "(a()).b"
  end

  it "Sequel.pg_row should work as well if the pg_row extension is loaded" do
    @db.literal(Sequel.pg_row(Sequel.function(:a))[:b]).must_equal "(a()).b"
  end

  it "Sequel.pg_row(array).op should work" do
    @db.literal(Sequel.pg_row([1, 2, 3]).op[:f1]).must_equal "(ROW(1, 2, 3)).f1"
  end

  it "Sequel.pg_row(array).op should work" do
    @db.literal(Sequel::Postgres::PGRow::HashRow.subclass(:rowx, [:a]).new(:a=>1).op[:a]).must_equal "(ROW(1)::rowx).a"
  end
end