active_record_survey 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/active_record_survey/instance_node.rb +1 -1
- data/lib/active_record_survey/node.rb +23 -3
- data/lib/active_record_survey/node/answer/text.rb +2 -0
- data/lib/active_record_survey/node/question.rb +6 -0
- data/lib/active_record_survey/node_validation/maximum_answer.rb +6 -2
- data/lib/active_record_survey/node_validation/maximum_length.rb +6 -2
- data/lib/active_record_survey/node_validation/maximum_value.rb +6 -3
- data/lib/active_record_survey/node_validation/minimum_answer.rb +5 -1
- data/lib/active_record_survey/node_validation/minimum_length.rb +6 -2
- data/lib/active_record_survey/node_validation/minimum_value.rb +6 -3
- data/lib/active_record_survey/version.rb +1 -1
- data/spec/active_record_survey/node/answer/boolean_spec.rb +1 -1
- data/spec/active_record_survey/node/answer/text_spec.rb +160 -56
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d54c3e737a268c6e9aa3f60f02a62433131007f3
|
4
|
+
data.tar.gz: 56c1e7fa286ef30e2735fc1f6f118cae6facc6f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4618ddd55a8dda8bc1b6589ba8241cb9afc73bfdf502439990fb449441c4334d1a3b3d1306843e8b00f9c040b331787d265dc594c616dc32e953847e0745b05d
|
7
|
+
data.tar.gz: 1ce77748739de54e4189e94a40951bf22e877d69bd636401ca9097fee94d6211e56c7bf7b8627b7740a356244441acdd80545031984d14446f7efb746a9c915c
|
@@ -9,7 +9,7 @@ module ActiveRecordSurvey
|
|
9
9
|
validate do |instance_node|
|
10
10
|
# This instance_node has no valid path to the root node
|
11
11
|
if !self.node.instance_node_path_to_root?(self)
|
12
|
-
instance_node.errors[:base] << "
|
12
|
+
instance_node.errors[:base] << "INVALID_PATH"
|
13
13
|
end
|
14
14
|
|
15
15
|
parent_nodes = self.node.node_maps.collect { |j| j.parent }
|
@@ -30,22 +30,42 @@ module ActiveRecordSurvey
|
|
30
30
|
self.has_instance_node_for_instance?(instance)
|
31
31
|
end
|
32
32
|
|
33
|
+
# Default behaviour is to recurse up the chain (goal is to hit a question node)
|
34
|
+
def validate_parent_instance_node(instance_node, child_node)
|
35
|
+
!self.node_maps.collect { |node_map|
|
36
|
+
if node_map.parent
|
37
|
+
node_map.parent.node.validate_parent_instance_node(instance_node, self)
|
38
|
+
# Hit top node
|
39
|
+
else
|
40
|
+
true
|
41
|
+
end
|
42
|
+
}.include?(false)
|
43
|
+
end
|
44
|
+
|
33
45
|
# Run all validations applied to this node
|
34
46
|
def validate_instance_node(instance_node)
|
35
47
|
# Basically this cache is messed up? Why? TODO.
|
36
48
|
# Reloading in the spec seems to fix this... but... this could be a booby trap for others
|
37
49
|
#self.node_validations(true)
|
38
50
|
|
39
|
-
|
51
|
+
# Check the validations on this node against the instance_node
|
52
|
+
validations_passed = !self.node_validations.collect { |node_validation|
|
40
53
|
node_validation.validate_instance_node(instance_node, self)
|
41
|
-
}.include?(false)
|
54
|
+
}.include?(false)
|
55
|
+
|
56
|
+
# More complex....
|
57
|
+
# Recureses to the parent node to check
|
58
|
+
# This is to validate Node::Question since they don't have instance_nodes directly to validate them
|
59
|
+
parent_validations_passed = !self.node_maps.collect { |node_map|
|
42
60
|
if node_map.parent
|
43
|
-
node_map.parent.node.
|
61
|
+
node_map.parent.node.validate_parent_instance_node(instance_node, self)
|
44
62
|
# Hit top node
|
45
63
|
else
|
46
64
|
true
|
47
65
|
end
|
48
66
|
}.include?(false)
|
67
|
+
|
68
|
+
validations_passed && parent_validations_passed
|
49
69
|
end
|
50
70
|
|
51
71
|
# Whether there is a valid answer path from this node to the root node for the instance
|
@@ -1,4 +1,10 @@
|
|
1
1
|
module ActiveRecordSurvey
|
2
2
|
class Node::Question < Node
|
3
|
+
# Stop validating at the Question node
|
4
|
+
def validate_parent_instance_node(instance_node, child_node)
|
5
|
+
!self.node_validations.collect { |node_validation|
|
6
|
+
node_validation.validate_instance_node(instance_node, self)
|
7
|
+
}.include?(false)
|
8
|
+
end
|
3
9
|
end
|
4
10
|
end
|
@@ -5,7 +5,7 @@ module ActiveRecordSurvey
|
|
5
5
|
def validate_instance_node(instance_node, question_node = nil)
|
6
6
|
# Only makes sense for questions to have maximum answers
|
7
7
|
if !question_node.class.ancestors.include?(::ActiveRecordSurvey::Node::Question)
|
8
|
-
return false
|
8
|
+
return false
|
9
9
|
end
|
10
10
|
|
11
11
|
instance = instance_node.instance
|
@@ -20,7 +20,11 @@ module ActiveRecordSurvey
|
|
20
20
|
}
|
21
21
|
}.flatten.select { |i| i }.count
|
22
22
|
|
23
|
-
total_answered <= self.value.to_i
|
23
|
+
is_valid = (total_answered <= self.value.to_i)
|
24
|
+
|
25
|
+
instance_node.errors[:base] << { :nodes => { question_node.id => ["MAXIMUM_ANSWER"] } } if !is_valid
|
26
|
+
|
27
|
+
is_valid
|
24
28
|
end
|
25
29
|
end
|
26
30
|
end
|
@@ -2,8 +2,12 @@ module ActiveRecordSurvey
|
|
2
2
|
# Ensure the instance_node has a length less than the maximum
|
3
3
|
class NodeValidation::MaximumLength < NodeValidation
|
4
4
|
# Validate the instance_node value
|
5
|
-
def validate_instance_node(instance_node,
|
6
|
-
(self.value.to_i >= instance_node.value.to_s.length.to_i)
|
5
|
+
def validate_instance_node(instance_node, answer_node = nil)
|
6
|
+
is_valid = (self.value.to_i >= instance_node.value.to_s.length.to_i)
|
7
|
+
|
8
|
+
instance_node.errors[:base] << { :nodes => { answer_node.id => ["MAXIMUM_LENGTH"] } } if !is_valid
|
9
|
+
|
10
|
+
is_valid
|
7
11
|
end
|
8
12
|
end
|
9
13
|
end
|
@@ -2,9 +2,12 @@ module ActiveRecordSurvey
|
|
2
2
|
# Ensure the instance_node has a value less than the maximum
|
3
3
|
class NodeValidation::MaximumValue < NodeValidation
|
4
4
|
# Validate the instance_node value is less than the maximum
|
5
|
-
def validate_instance_node(instance_node,
|
6
|
-
!instance_node.value.to_s.empty? &&
|
7
|
-
|
5
|
+
def validate_instance_node(instance_node, answer_node = nil)
|
6
|
+
is_valid = (!instance_node.value.to_s.empty? && instance_node.value.to_f <= self.value.to_f)
|
7
|
+
|
8
|
+
instance_node.errors[:base] << { :nodes => { answer_node.id => ["MAXIMUM_VALUE"] } } if !is_valid
|
9
|
+
|
10
|
+
is_valid
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
@@ -20,7 +20,11 @@ module ActiveRecordSurvey
|
|
20
20
|
}
|
21
21
|
}.flatten.select { |i| i }.count
|
22
22
|
|
23
|
-
total_answered >= self.value.to_i
|
23
|
+
is_valid = (total_answered >= self.value.to_i)
|
24
|
+
|
25
|
+
instance_node.errors[:base] << { :nodes => { question_node.id => ["MINIMUM_ANSWER"] } } if !is_valid
|
26
|
+
|
27
|
+
is_valid
|
24
28
|
end
|
25
29
|
end
|
26
30
|
end
|
@@ -2,8 +2,12 @@ module ActiveRecordSurvey
|
|
2
2
|
# Ensure the instance_node has a value greater than the minimum
|
3
3
|
class NodeValidation::MinimumLength < NodeValidation
|
4
4
|
# Validate the instance_node value is greater than the minimum
|
5
|
-
def validate_instance_node(instance_node,
|
6
|
-
instance_node.value.to_s.length >= self.value.to_i
|
5
|
+
def validate_instance_node(instance_node, answer_node = nil)
|
6
|
+
is_valid = (instance_node.value.to_s.length >= self.value.to_i)
|
7
|
+
|
8
|
+
instance_node.errors[:base] << { :nodes => { answer_node.id => ["MINIMUM_LENGTH"] } } if !is_valid
|
9
|
+
|
10
|
+
is_valid
|
7
11
|
end
|
8
12
|
end
|
9
13
|
end
|
@@ -2,9 +2,12 @@ module ActiveRecordSurvey
|
|
2
2
|
# Ensure the instance_node has a value greater than the minimum
|
3
3
|
class NodeValidation::MinimumValue < NodeValidation
|
4
4
|
# Validate the instance_node value is greater than the minimum
|
5
|
-
def validate_instance_node(instance_node,
|
6
|
-
!instance_node.value.to_s.empty? &&
|
7
|
-
|
5
|
+
def validate_instance_node(instance_node, answer_node = nil)
|
6
|
+
is_valid = (!instance_node.value.to_s.empty? && instance_node.value.to_f >= self.value.to_f)
|
7
|
+
|
8
|
+
instance_node.errors[:base] << { :nodes => { answer_node.id => ["MINIMUM_VALUE"] } } if !is_valid
|
9
|
+
|
10
|
+
is_valid
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
@@ -87,7 +87,7 @@ describe ActiveRecordSurvey::Node::Answer::Boolean, :boolean_spec => true do
|
|
87
87
|
expect(instance.valid?).to be(false)
|
88
88
|
end
|
89
89
|
|
90
|
-
it 'not answered in order' do
|
90
|
+
it 'when not answered in order' do
|
91
91
|
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
92
92
|
instance.instance_nodes.build(
|
93
93
|
:instance => instance,
|
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe ActiveRecordSurvey::Node::Answer::Text do
|
3
|
+
describe ActiveRecordSurvey::Node::Answer::Text, :text_spec => true do
|
4
4
|
describe 'a text survey is' do
|
5
5
|
before(:all) do
|
6
6
|
@survey = ActiveRecordSurvey::Survey.new
|
7
7
|
|
8
8
|
@q1 = ActiveRecordSurvey::Node::Question.new(:text => "What... what do you think?")
|
9
|
-
@q1_a1 = ActiveRecordSurvey::Node::Answer::Text.new()
|
9
|
+
@q1_a1 = ActiveRecordSurvey::Node::Answer::Text.new(:text => "Text #1")
|
10
|
+
@q1_a2 = ActiveRecordSurvey::Node::Answer::Text.new(:text => "Text #2")
|
10
11
|
|
11
|
-
@survey.build_question(@q1, [@q1_a1])
|
12
|
+
nodes = @survey.build_question(@q1, [@q1_a1])
|
13
|
+
nodes = @survey.build_question(@q1_a2, [], nodes[1])
|
12
14
|
|
13
15
|
@survey.save
|
14
16
|
end
|
@@ -50,78 +52,180 @@ describe ActiveRecordSurvey::Node::Answer::Text do
|
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
53
|
-
describe ActiveRecordSurvey::NodeValidation
|
54
|
-
describe
|
55
|
-
|
56
|
-
@q1_a1.node_validations << ActiveRecordSurvey::NodeValidation::
|
57
|
-
:node => @q1_a1,
|
58
|
-
:value => 3
|
59
|
-
)
|
60
|
-
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
61
|
-
instance.instance_nodes.build(
|
62
|
-
:instance => instance,
|
55
|
+
describe ActiveRecordSurvey::NodeValidation do
|
56
|
+
describe ActiveRecordSurvey::NodeValidation::MaximumLength do
|
57
|
+
before(:all) do
|
58
|
+
@q1_a1.node_validations << ActiveRecordSurvey::NodeValidation::MaximumLength.new(
|
63
59
|
:node => @q1_a1,
|
64
|
-
:value =>
|
60
|
+
:value => 15
|
65
61
|
)
|
66
|
-
|
67
|
-
|
68
|
-
|
62
|
+
|
63
|
+
# Weird caching is happening
|
64
|
+
@q1_a1.reload
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'invalid when' do
|
68
|
+
it 'has a value greater than the maximum' do
|
69
|
+
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
70
|
+
instance.instance_nodes.build(
|
71
|
+
:instance => instance,
|
72
|
+
:node => @q1_a1,
|
73
|
+
:value => "123456789111213141516",
|
74
|
+
)
|
75
|
+
instance.save
|
76
|
+
|
77
|
+
expect(instance.valid?).to be(false)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'valid when' do
|
82
|
+
it 'has a value less than the maximum' do
|
83
|
+
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
84
|
+
instance.instance_nodes.build(
|
85
|
+
:instance => instance,
|
86
|
+
:node => @q1_a1,
|
87
|
+
:value => "test",
|
88
|
+
)
|
89
|
+
instance.save
|
90
|
+
|
91
|
+
expect(instance.valid?).to be(true)
|
92
|
+
end
|
69
93
|
end
|
70
94
|
end
|
71
95
|
|
72
|
-
describe
|
73
|
-
|
96
|
+
describe ActiveRecordSurvey::NodeValidation::MinimumLength do
|
97
|
+
before(:all) do
|
74
98
|
@q1_a1.node_validations << ActiveRecordSurvey::NodeValidation::MinimumLength.new(
|
75
99
|
:node => @q1_a1,
|
76
|
-
:value =>
|
77
|
-
)
|
78
|
-
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
79
|
-
instance.instance_nodes.build(
|
80
|
-
:instance => instance,
|
81
|
-
:node => @q1_a1,
|
82
|
-
:value => "12",
|
100
|
+
:value => 5
|
83
101
|
)
|
84
|
-
instance.save
|
85
102
|
|
86
|
-
|
103
|
+
# Weird caching is happening
|
104
|
+
@q1_a1.reload
|
105
|
+
end
|
106
|
+
|
107
|
+
describe 'invalid when' do
|
108
|
+
it 'has a value less than the minimum' do
|
109
|
+
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
110
|
+
instance.instance_nodes.build(
|
111
|
+
:instance => instance,
|
112
|
+
:node => @q1_a1,
|
113
|
+
:value => "1234",
|
114
|
+
)
|
115
|
+
instance.save
|
116
|
+
|
117
|
+
expect(instance.valid?).to be(false)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe 'valid when' do
|
122
|
+
it 'has a value greater than the minimum' do
|
123
|
+
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
124
|
+
instance.instance_nodes.build(
|
125
|
+
:instance => instance,
|
126
|
+
:node => @q1_a1,
|
127
|
+
:value => "12345",
|
128
|
+
)
|
129
|
+
instance.save
|
130
|
+
|
131
|
+
expect(instance.valid?).to be(true)
|
132
|
+
end
|
87
133
|
end
|
88
134
|
end
|
89
|
-
end
|
90
135
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
:
|
96
|
-
:value => 15
|
136
|
+
describe ActiveRecordSurvey::NodeValidation::MaximumAnswer do
|
137
|
+
before(:all) do
|
138
|
+
@q1.node_validations << ActiveRecordSurvey::NodeValidation::MaximumAnswer.new(
|
139
|
+
:node => @q1,
|
140
|
+
:value => 1
|
97
141
|
)
|
98
|
-
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
99
|
-
instance.instance_nodes.build(
|
100
|
-
:instance => instance,
|
101
|
-
:node => @q1_a1,
|
102
|
-
:value => "123456789111213141516",
|
103
|
-
)
|
104
|
-
instance.save
|
105
142
|
|
106
|
-
|
143
|
+
# Weird caching is happening
|
144
|
+
@q1_a1.reload
|
145
|
+
end
|
146
|
+
|
147
|
+
describe 'invalid when' do
|
148
|
+
it 'has more answers than the maximum' do
|
149
|
+
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
150
|
+
instance.instance_nodes.build(
|
151
|
+
:instance => instance,
|
152
|
+
:node => @q1_a1,
|
153
|
+
:value => "123456",
|
154
|
+
)
|
155
|
+
instance.instance_nodes.build(
|
156
|
+
:instance => instance,
|
157
|
+
:node => @q1_a1,
|
158
|
+
:value => "abcdefg",
|
159
|
+
)
|
160
|
+
instance.save
|
161
|
+
|
162
|
+
expect(instance.valid?).to be(false)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe 'valid when' do
|
167
|
+
it 'has less answers than the maximum' do
|
168
|
+
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
169
|
+
instance.instance_nodes.build(
|
170
|
+
:instance => instance,
|
171
|
+
:node => @q1_a1,
|
172
|
+
:value => "123456",
|
173
|
+
)
|
174
|
+
instance.instance_nodes.build(
|
175
|
+
:instance => instance,
|
176
|
+
:node => @q1_a2,
|
177
|
+
)
|
178
|
+
instance.save
|
179
|
+
puts instance.errors.inspect
|
180
|
+
expect(instance.valid?).to be(true)
|
181
|
+
end
|
107
182
|
end
|
108
183
|
end
|
109
184
|
|
110
|
-
describe
|
111
|
-
|
112
|
-
@
|
113
|
-
:node => @
|
114
|
-
:value =>
|
115
|
-
)
|
116
|
-
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
117
|
-
instance.instance_nodes.build(
|
118
|
-
:instance => instance,
|
119
|
-
:node => @q1_a1,
|
120
|
-
:value => "test",
|
185
|
+
describe ActiveRecordSurvey::NodeValidation::MinimumAnswer do
|
186
|
+
before(:all) do
|
187
|
+
@q1.node_validations << ActiveRecordSurvey::NodeValidation::MinimumAnswer.new(
|
188
|
+
:node => @q1,
|
189
|
+
:value => 1
|
121
190
|
)
|
122
|
-
instance.save
|
123
191
|
|
124
|
-
|
192
|
+
# Weird caching is happening
|
193
|
+
@q1_a1.reload
|
194
|
+
end
|
195
|
+
|
196
|
+
describe 'invalid when' do
|
197
|
+
it 'has less than the minimum number of answers' do
|
198
|
+
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
199
|
+
instance.instance_nodes.build(
|
200
|
+
:instance => instance,
|
201
|
+
:node => @q1_a1,
|
202
|
+
)
|
203
|
+
instance.instance_nodes.build(
|
204
|
+
:instance => instance,
|
205
|
+
:node => @q1_a2,
|
206
|
+
)
|
207
|
+
instance.save
|
208
|
+
|
209
|
+
expect(instance.valid?).to be(false)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
describe 'valid when' do
|
214
|
+
it 'has greater than the minimum number of answers' do
|
215
|
+
instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
|
216
|
+
instance.instance_nodes.build(
|
217
|
+
:instance => instance,
|
218
|
+
:node => @q1_a1,
|
219
|
+
:value => "12345",
|
220
|
+
)
|
221
|
+
instance.instance_nodes.build(
|
222
|
+
:instance => instance,
|
223
|
+
:node => @q1_a2,
|
224
|
+
)
|
225
|
+
instance.save
|
226
|
+
puts instance.errors.inspect
|
227
|
+
expect(instance.valid?).to be(true)
|
228
|
+
end
|
125
229
|
end
|
126
230
|
end
|
127
231
|
end
|