-
Notifications
You must be signed in to change notification settings - Fork 11
/
singleness_validator_spec.rb
145 lines (113 loc) · 4.99 KB
/
singleness_validator_spec.rb
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
require 'rails_helper'
describe Releaf::Content::Node::SinglenessValidator do
class DummySinglenessValidatorModel < ActiveRecord::Base
acts_as_node
self.table_name = 'text_pages'
end
class DummySinglenessValidator2Model < ActiveRecord::Base
acts_as_node
self.table_name = 'text_pages'
end
class DummySinglenessValidatorController < ActionController::Base
acts_as_node
end
class DummySinglenessValidator2Controller < ActionController::Base
acts_as_node
end
class DummySinglenessValidatorNode < ActiveRecord::Base
self.table_name = 'nodes'
include Releaf::Content::Node
validates_with Releaf::Content::Node::SinglenessValidator, for: DummySinglenessValidatorModel
validates_with Releaf::Content::Node::SinglenessValidator, for: DummySinglenessValidator2Controller, under: TextPage
end
def create_node *params
DummySinglenessValidatorNode.create!( FactoryBot.attributes_for(:node, *params) )
end
def build_node *params
DummySinglenessValidatorNode.new( FactoryBot.attributes_for(:node, *params) )
end
let!(:root_node) { create_node(content_type: 'HomePage') }
context "when scope is entire page" do
context "When node not mentioned in list" do
it "doesn't add error" do
node = build_node(content_type: 'DummySinglenessValidatorController', parent_id: root_node.id)
expect( node ).to be_valid
end
end
context "when node with given content doesn't exist in tree" do
it "doesn't add error" do
node = build_node(content_type: 'DummySinglenessValidatorModel', parent_id: root_node.id)
expect( node ).to be_valid
end
end
context "when node with given content exists in tree" do
before do
create_node(content_type: 'DummySinglenessValidatorModel', parent_id: root_node.id)
end
it "adds error to #content_type" do
node = build_node(content_type: 'DummySinglenessValidatorModel', parent_id: root_node.id)
expect( node ).to be_invalid
expect( node.errors[:content_type].size ).to eq(1)
expect( node.errors[:content_type] ).to include("node exists")
end
end
context "when node is saved, and is only one in the tree" do
it "doesn't add error" do
node = create_node(content_type: 'DummySinglenessValidatorModel', parent_id: root_node.id)
expect( node ).to be_valid
end
end
end
context "when scope is subtree" do
context "when has ancestor in :under list" do
let!(:grand_parent_node) { create_node(content_type: 'TextPage', parent_id: root_node.id) }
let!(:parent_node) { create_node(content_type: 'DummySinglenessValidator2Model', parent_id: grand_parent_node.id) }
context "when node with given content doesn't exist in subtree" do
it "doesn't add error" do
node = build_node(content_type: 'DummySinglenessValidator2Controller', parent_id: parent_node.id)
expect( node ).to be_valid
end
end
context "when node with given content exists in subtree" do
before do
create_node(content_type: 'DummySinglenessValidator2Controller', parent_id: grand_parent_node.id)
end
it "adds error to #content_type" do
node = build_node(content_type: 'DummySinglenessValidator2Controller', parent_id: parent_node.id)
expect( node ).to be_invalid
expect( node.errors[:content_type].size ).to eq(1)
expect( node.errors[:content_type] ).to include("node exists")
end
end
context "when node is saved, and is only one in subtree" do
it "doesn't add error" do
node = create_node(content_type: 'DummySinglenessValidator2Controller', parent_id: parent_node.id)
expect( node ).to be_valid
end
end
end
context "when node has no ancestor in :under list" do
it "doesn't add error" do
node = create_node(content_type: 'DummySinglenessValidator2Controller', parent_id: root_node.id)
expect( node ).to be_valid
end
end
end
context "regression tests" do
context "@node.parent.self_and_ancestors bug" do
it "works correctly / is worked around" do
# for details see Releaf::Content::Node::SinglenessValidator#base_relation_for_subtree
@node1 = create_node(content_type: 'TextPage', locale: 'en')
@node2 = create_node(content_type: 'TextPage', locale: 'lv')
@node3 = create_node(content_type: 'TextPage', locale: 'ru')
@node4 = create_node(content_type: 'TextPage', locale: 'sp')
@node1_1 = create_node(content_type: 'DummySinglenessValidator2Controller', parent: @node1)
expect do
@node1_2 = create_node(content_type: 'DummySinglenessValidator2Controller', parent: @node2)
@node1_3 = create_node(content_type: 'DummySinglenessValidator2Controller', parent: @node3)
@node1_4 = create_node(content_type: 'DummySinglenessValidator2Controller', parent: @node4)
end.to_not raise_error
end
end
end
end