File: class_table_inheritance_constraint_validations_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 (153 lines) | stat: -rw-r--r-- 4,784 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
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# frozen_string_literal: true

require_relative 'spec_helper'

describe "Sequel::Plugins::ClassTableInheritanceConstraintValidations" do
  before do
    @db = Sequel.mock
    def @db.schema(table, opts = {})
      {
        parents: [
          [:id, {primary_key: true, type: :integer}],
          [:column_a, {type: :string}]
        ],
        children: [
          [:id, {primary_key: false, type: :integer}], # foreign key to parents
          [:column_b, {type: :string}]
        ],
        grandchildren: [
          [:id, {primary_key: false, type: :integer}], # foreign key to children
          [:column_c, {type: :string}]
        ],
        siblings: [
          [:id, {primary_key: false, type: :integer}], # foreign key to parents
          [:column_d, {type: :string}]
        ]
      }[table]
    end
    def @db.supports_schema_parsing?
      true
    end

    db_constraint_validations = {}
    db_constraint_validations["parents"] = [{
      table: "parents",
      constraint_name: "foo",
      validation_type: "includes_str_array",
      column: "column_a",
      argument: "arg1,arg2",
      message: nil,
      allow_nil: true
    }]
    db_constraint_validations["children"] = [{
      table: "children",
      constraint_name: "bar",
      validation_type: "includes_str_array",
      column: "column_b",
      argument: "param1,param2",
      message: nil,
      allow_nil: true
    }]
    db_constraint_validations["siblings"] = [{
      table: "siblings",
      constraint_name: "qux",
      validation_type: "includes_str_array",
      column: "column_d",
      argument: "baz,quux",
      message: nil,
      allow_nil: true
    }]
    db_constraint_validations["grandchildren"] = [{
      table: "grandchildren",
      constraint_name: "baz",
      validation_type: "includes_str_array",
      column: "column_c",
      argument: "foo,bar",
      message: nil,
      allow_nil: true
    }]

    @db.instance_variable_set :@constraint_validations, db_constraint_validations

    class ::Parent < Sequel::Model(@db[:parents])
      plugin :class_table_inheritance, :key=>:kind, :table_map=>{:Child=>:children, :Grandchild=>:grandchildren, :Sibling=>:siblings}
      plugin :constraint_validations
      plugin :class_table_inheritance_constraint_validations
    end
    class ::Child < Parent; end
    class ::Grandchild < Child; end
    class ::Sibling < Parent; end
  end

  after do
    [:Sibling, :Grandchild, :Child, :Parent].each{|s| Object.send(:remove_const, s) if Object.const_defined?(s)}
  end

  it "includes constraint_validations from ancestor tables in class_table_inheritance table hierarchy" do
    # child has children and parent constraints
    Child.constraint_validations.must_include([
     :validates_includes,
      ["arg1", "arg2"],
      :column_a,
      {:allow_nil=>true, :from=>:values}
    ])
    Child.constraint_validations.must_include([
     :validates_includes,
      ["param1", "param2"],
      :column_b,
      {:allow_nil=>true, :from=>:values}
    ])

    # granchild has grandchildren, children and parent constraints
    Grandchild.constraint_validations.must_include([
     :validates_includes,
      ["arg1", "arg2"],
      :column_a,
      {:allow_nil=>true, :from=>:values}
    ])

    Grandchild.constraint_validations.must_include([
     :validates_includes,
      ["param1", "param2"],
      :column_b,
      {:allow_nil=>true, :from=>:values}
    ])

    Grandchild.constraint_validations.must_include([
     :validates_includes,
      ["foo", "bar"],
      :column_c,
      {:allow_nil=>true, :from=>:values}
    ])
  end

  it "does not include constraint_validations from singble tables in class_table_inheritance table hierarchy" do
    # siblling does *not* have constraints from childen or grandchildren
    Sibling.constraint_validations.wont_include([
     :validates_includes,
      ["param1", "param2"],
      :column_b,
      {:allow_nil=>true, :from=>:values}
    ])

    Sibling.constraint_validations.wont_include([
     :validates_includes,
      ["foo", "bar"],
      :column_c,
      {:allow_nil=>true, :from=>:values}
    ])
  end

  it "raises if attempting to load plugin into model without plugins it depends on" do
    c = Class.new(Sequel::Model)
    proc{c.plugin :class_table_inheritance_constraint_validations}.must_raise Sequel::Error

    c = Class.new(Sequel::Model)
    c.plugin :constraint_validations
    proc{c.plugin :class_table_inheritance_constraint_validations}.must_raise Sequel::Error

    c = Class.new(Sequel::Model(:parents))
    c.plugin :class_table_inheritance, :key=>:kind, :table_map=>{:Child=>:children, :Grandchild=>:grandchildren, :Sibling=>:siblings}
    proc{c.plugin :class_table_inheritance_constraint_validations}.must_raise Sequel::Error
  end
end