File: instance_filters_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 (107 lines) | stat: -rw-r--r-- 4,399 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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
require_relative "spec_helper"

describe "instance_filters plugin" do
  before do
    @c = Class.new(Sequel::Model(:people))
    @c.columns :id, :name, :num
    @c.plugin :instance_filters
    @p = @c.load(:id=>1, :name=>'John', :num=>1)
    DB.sqls
  end

  it "should raise an error when updating a stale record" do
    @p.update(:name=>'Bob')
    DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
    @p.instance_filter(:name=>'Jim')
    @p.instance_variable_set(:@this, @p.this.with_numrows(0))
    proc{@p.update(:name=>'Joe')}.must_raise(Sequel::Plugins::InstanceFilters::Error)
    DB.sqls.must_equal ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"]
  end 

  it "should raise an error when destroying a stale record" do
    @p.destroy
    DB.sqls.must_equal ["DELETE FROM people WHERE id = 1"]
    @p.instance_filter(:name=>'Jim')
    @p.instance_variable_set(:@this, @p.this.with_numrows(0))
    proc{@p.destroy}.must_raise(Sequel::Plugins::InstanceFilters::Error)
    DB.sqls.must_equal ["DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"]
  end 
  
  it "should work when using the prepared_statements plugin" do
    @c.plugin :prepared_statements

    @p.update(:name=>'Bob')
    DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
    @p.instance_filter(:name=>'Jim')
    @p.instance_variable_set(:@this, @p.this.with_numrows(0))
    proc{@p.update(:name=>'Joe')}.must_raise(Sequel::Plugins::InstanceFilters::Error)
    DB.sqls.must_equal ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"]

    @p = @c.load(:id=>1, :name=>'John', :num=>1)
    @p.instance_variable_set(:@this, @p.this.with_numrows(1))
    @c.instance_variable_set(:@fast_instance_delete_sql, nil)
    @p.destroy
    DB.sqls.must_equal ["DELETE FROM people WHERE (id = 1)"]
    @p.instance_filter(:name=>'Jim')
    @p.instance_variable_set(:@this, @p.this.with_numrows(0))
    proc{@p.destroy}.must_raise(Sequel::Plugins::InstanceFilters::Error)
    DB.sqls.must_equal ["DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"]
    
    @c.create.must_be_kind_of(@c)
  end 
  
  it "should work when using the prepared_statements plugin when loading the prepared_statements plugin first" do
    @c = Class.new(Sequel::Model(:people))
    @c.columns :id, :name, :num
    @c.plugin :prepared_statements
    @c.plugin :instance_filters
    @p = @c.load(:id=>1, :name=>'John', :num=>1)
    DB.sqls

    @p.update(:name=>'Bob')
    DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
    @p.instance_filter(:name=>'Jim')
    @p.instance_variable_set(:@this, @p.this.with_numrows(0))
    proc{@p.update(:name=>'Joe')}.must_raise(Sequel::Plugins::InstanceFilters::Error)
    DB.sqls.must_equal ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"]

    @p = @c.load(:id=>1, :name=>'John', :num=>1)
    @p.instance_variable_set(:@this, @p.this.with_numrows(1))
    @c.instance_variable_set(:@fast_instance_delete_sql, nil)
    @p.destroy
    DB.sqls.must_equal ["DELETE FROM people WHERE (id = 1)"]
    @p.instance_filter(:name=>'Jim')
    @p.instance_variable_set(:@this, @p.this.with_numrows(0))
    proc{@p.destroy}.must_raise(Sequel::Plugins::InstanceFilters::Error)
    DB.sqls.must_equal ["DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"]
    
    @c.create.must_be_kind_of(@c)
  end 
  
  it "should apply all instance filters" do
    @p.instance_filter(:name=>'Jim')
    @p.instance_filter{num > 2}
    @p.update(:name=>'Bob')
    DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE ((id = 1) AND (name = 'Jim') AND (num > 2))"]
  end 

  it "should drop instance filters after updating" do
    @p.instance_filter(:name=>'Joe')
    @p.update(:name=>'Joe')
    DB.sqls.must_equal ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Joe'))"]
    @p.update(:name=>'Bob')
    DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
  end

  it "shouldn't allow instance filters on frozen objects" do
    @p.instance_filter(:name=>'Joe')
    @p.freeze
    proc{@p.instance_filter(:name=>'Jim')}.must_raise
  end 

  it "should have dup duplicate internal structures" do
    @p.instance_filter(:name=>'Joe')
    @p.dup.send(:instance_filters).must_equal @p.send(:instance_filters)
    @p.dup.send(:instance_filters).wont_be_same_as(@p.send(:instance_filters))
  end 
end