File: is_distinct_from_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 (61 lines) | stat: -rw-r--r-- 2,502 bytes parent folder | download | duplicates (2)
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
require_relative "spec_helper"

describe "is_distinct_from extension" do
  dbf = lambda do |db_type|
    db = Sequel.connect("mock://#{db_type}")
    db.extension :is_distinct_from
    db
  end

  it "should support Sequel.is_distinct_from" do
    dbf[:postgres].literal(Sequel.is_distinct_from(:a, :b)).must_equal '("a" IS DISTINCT FROM "b")'
  end

  it "should support is_distinct_from on Sequel expressions" do
    dbf[:postgres].literal(Sequel[:a].is_distinct_from(:b)).must_equal '("a" IS DISTINCT FROM "b")'
  end

  it "should support is_distinct_from on literal strings" do
    dbf[:postgres].literal(Sequel.lit('a').is_distinct_from(:b)).must_equal '(a IS DISTINCT FROM "b")'
  end

  it "should use IS DISTINCT FROM syntax on PostgreSQL and H2" do
    dbf[:postgres].literal(Sequel.is_distinct_from(:a, :b)).must_equal '("a" IS DISTINCT FROM "b")'
    db = dbf[:h2]
    def db.database_type; :h2; end
    db.literal(Sequel.is_distinct_from(:a, :b)).must_equal '(a IS DISTINCT FROM b)'
  end

  it "should use IS DISTINCT FROM syntax on SQLite 3.39+" do
    db = dbf[:sqlite]
    def db.sqlite_version; 33900; end
    db.literal(Sequel.is_distinct_from(:a, :b)).must_equal '(`a` IS DISTINCT FROM `b`)'

    db = dbf[:sqlite]
    def db.sqlite_version; 33800; end
    db.literal(Sequel.is_distinct_from(:a, :b)).must_equal "((CASE WHEN ((`a` = `b`) OR ((`a` IS NULL) AND (`b` IS NULL))) THEN 0 ELSE 1 END) = 1)"
  end

  it "should handle given nil values on derby" do
    db = dbf[:derby]
    def db.database_type; :derby; end
    db.literal(Sequel.is_distinct_from(:a, :b)).must_equal "((CASE WHEN ((a = b) OR ((a IS NULL) AND (b IS NULL))) THEN 0 ELSE 1 END) = 1)"
    db.literal(Sequel.is_distinct_from(nil, :b)).must_equal "(b IS NOT NULL)"
    db.literal(Sequel.is_distinct_from(:a, nil)).must_equal "(a IS NOT NULL)"
    db.literal(Sequel.is_distinct_from(nil, nil)).must_equal "'f'" # FALSE or (1 = 0) when using jdbc/derby adapter
  end

  it "should emulate IS DISTINCT FROM behavior on other databases" do
    dbf[:foo].literal(Sequel.is_distinct_from(:a, :b)).must_equal "((CASE WHEN ((a = b) OR ((a IS NULL) AND (b IS NULL))) THEN 0 ELSE 1 END) = 1)"
  end

  it "should respect existing supports_is_distinct_from? dataset method" do
    db = Sequel.mock
    db.extend_datasets do
      private
      def supports_is_distinct_from?; true; end
    end
    db.extension :is_distinct_from
    db.literal(Sequel.is_distinct_from(:a, :b)).must_equal "(a IS DISTINCT FROM b)"
  end
end