File: subset_conditions_spec.rb

package info (click to toggle)
ruby-sequel 5.97.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,188 kB
  • sloc: ruby: 123,115; makefile: 3
file content (76 lines) | stat: -rw-r--r-- 3,675 bytes parent folder | download
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
70
71
72
73
74
75
76
require_relative "spec_helper"

describe "subset_conditions plugin" do
  before do
    @c = Class.new(Sequel::Model(:a))
    @c.plugin :subset_conditions
  end

  it "should name generated dataset module class" do
    c = Sequel::Model(:items)
    c.plugin :subset_conditions
    c.dataset_module_class.name.must_equal "Sequel::_Model(:items)::@dataset_module_class(SubsetConditions)"
  end if RUBY_VERSION >= '3.3'

  it "should provide *_conditions method return the arguments passed" do
    @c.dataset_module{subset(:published, :published => true)}
    @c.where(@c.published_conditions).sql.must_equal @c.published.sql

    @c.dataset_module{where(:active, :active)}
    @c.where(@c.active_conditions).sql.must_equal @c.active.sql

    @c.dataset_module{exclude(:not_bad, :bad)}
    @c.where(@c.not_bad_conditions).sql.must_equal @c.not_bad.sql

    @c.dataset_module{subset(:active_published, Sequel.&(:active, :published => true))}
    @c.where(@c.active_published_conditions).sql.must_equal @c.active_published.sql
    @c.where(Sequel.&(@c.active_conditions, @c.published_conditions)).sql.must_equal @c.active_published.sql
    @c.where(Sequel.|(@c.active_conditions, @c.published_conditions)).sql.must_equal "SELECT * FROM a WHERE (active OR (published IS TRUE))"
    @c.where(Sequel.|(@c.active_published_conditions, :foo)).sql.must_equal "SELECT * FROM a WHERE ((active AND (published IS TRUE)) OR foo)"

    @c.dataset_module{exclude(:not_x_or_y, :x){:y}}
    @c.where(@c.not_x_or_y_conditions).sql.must_equal @c.not_x_or_y.sql

  end

  it "should work with blocks" do
    p1 = proc{{:published=>true}}
    @c.dataset_module{subset(:published, &p1)}
    @c.where(@c.published_conditions).sql.must_equal @c.published.sql

    p2 = :active
    @c.dataset_module{subset(:active, p2)}
    @c.where(@c.active_conditions).sql.must_equal @c.active.sql

    @c.dataset_module{exclude(:inactive){p2}}
    @c.where(@c.inactive_conditions).sql.must_equal @c.inactive.sql

    @c.dataset_module{subset(:active_published, p2, &p1)}
    @c.where(@c.active_published_conditions).sql.must_equal @c.active_published.sql
    @c.where(Sequel.&(@c.active_conditions, @c.published_conditions)).sql.must_equal @c.active_published.sql
    @c.where(Sequel.|(@c.active_conditions, @c.published_conditions)).sql.must_equal "SELECT * FROM a WHERE (active OR (published IS TRUE))"
    @c.where(Sequel.|(@c.active_published_conditions, :foo)).sql.must_equal "SELECT * FROM a WHERE ((active AND (published IS TRUE)) OR foo)"
  end

  it "should support where_all and where_any for combining subset conditions" do
    @c.dataset_module do
      subset(:published, :published => true)
      where(:active, :active)
      exclude(:not_bad, :bad)

      where_all(:active_all1, :active)
      where_any(:active_any1, :active)
      where_all(:active_and_published, :active, :published)
      where_any(:active_or_published, :active, :published)
      where_all(:active_and_published_and_not_bad, :active, :published, :not_bad)
      where_any(:active_or_published_or_not_bad, :active, :published, :not_bad)
    end

    @c.active_all1.sql.must_equal 'SELECT * FROM a WHERE active'
    @c.active_any1.sql.must_equal 'SELECT * FROM a WHERE active'
    @c.active_and_published.sql.must_equal 'SELECT * FROM a WHERE (active AND (published IS TRUE))'
    @c.active_or_published.sql.must_equal 'SELECT * FROM a WHERE (active OR (published IS TRUE))'
    @c.active_and_published_and_not_bad.sql.must_equal 'SELECT * FROM a WHERE (active AND (published IS TRUE) AND NOT bad)'
    @c.active_or_published_or_not_bad.sql.must_equal 'SELECT * FROM a WHERE (active OR (published IS TRUE) OR NOT bad)'
  end
end