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
|