active_record_survey 0.1.3 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 63a522c8b6c32002e303859368fba6fca36f0952
4
- data.tar.gz: 38d7e702b42eee467578db3ab511d529ceeb1c7d
3
+ metadata.gz: 5e14e2ac1a5afccd6174d0c4a6a6d63eaf299648
4
+ data.tar.gz: 851b819031bbf4121f31003892eed93168ba0bb6
5
5
  SHA512:
6
- metadata.gz: 63be44b810cfbb1a11613eae3d4f5196bc77136876cfc9c059a34e1806dd7a4024b7dc3dba32f85ef189ca03096024fa50029d60847fe4d4acd537e21243c184
7
- data.tar.gz: 9869e801ed85f59607a5971686b5344f5f0c9b4d7afeabf520807b17631cf46e3d13f808f1aaa9c8fcb508f44c0673df79b783d07837471824871cc838f8db69
6
+ metadata.gz: 96cd0a3783d52e6a472229deea9782fb11b46fa8e71a24739eefab6d2be7c6fc8080531fdc01c4532600094da451b05d9e57c5f6d00dee308dc3b2a554eb6140
7
+ data.tar.gz: 61fa51b61fe2e0de0e7b6fe9c0fa5f0de3fa9e1348f65d78a69e0458ee49f99c0a5f96f153bdc1916c32931826a4c35b8cc9bc9177ac8a5c3edd993a1b9e798d
@@ -1,12 +1,47 @@
1
1
  module ActiveRecordSurvey
2
- # Rank in relation to parent/children
2
+ # Rank in relation to parent/children of ActiveRecordSurvey::Node::Answer::Rank
3
3
  class Node::Answer::Rank < Node::Answer
4
4
  # Accept integer or empty values
5
+ # Must be within range of the number of ranking nodes
5
6
  def validate_instance_node(instance_node)
6
7
  # super - all validations on this node pass
7
8
  super &&
8
- (instance_node.value.to_s.empty? ||
9
- !instance_node.value.to_s.match(/^\d+$/).nil?)
9
+ (instance_node.value.to_s.empty? || !instance_node.value.to_s.match(/^\d+$/).nil?) &&
10
+ (instance_node.value.to_s.empty? || instance_node.value.to_i >= 1) &&
11
+ instance_node.value.to_i <= self.max_rank
12
+ end
13
+
14
+ protected
15
+
16
+ # Calculate the number of Rank nodes above this one
17
+ def num_above
18
+ count = 0
19
+ self.node_maps.each { |i|
20
+ # Parent is one of us as well - include it and check its parents
21
+ if i.parent.node.class.ancestors.include?(self.class)
22
+ count = count + 1 + i.parent.node.num_above
23
+ end
24
+ }
25
+ count
26
+ end
27
+
28
+ # Calculate the number of Rank nodes below this one
29
+ def num_below
30
+ count = 0
31
+ self.node_maps.each { |node_map|
32
+ node_map.children.each { |child|
33
+ # Child is one of us as well - include it and check its children
34
+ if child.node.class.ancestors.include?(self.class)
35
+ count = count + 1 + child.node.num_below
36
+ end
37
+ }
38
+ }
39
+ count
40
+ end
41
+
42
+ # Calculate the maximum rank value that is accepted
43
+ def max_rank
44
+ self.num_above + self.num_below + 1
10
45
  end
11
46
  end
12
47
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveRecordSurvey
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -0,0 +1,221 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveRecordSurvey::Node::Answer::Rank, :focus => true do
4
+ describe 'survey is' do
5
+ before(:all) do
6
+ @survey = ActiveRecordSurvey::Survey.new
7
+
8
+ @q1 = ActiveRecordSurvey::Node::Question.new(:text => "Order by preference")
9
+ @q1_a1 = ActiveRecordSurvey::Node::Answer::Rank.new(:text => "Dogs")
10
+ @q1_a2 = ActiveRecordSurvey::Node::Answer::Rank.new(:text => "Cats")
11
+ @q1_a3 = ActiveRecordSurvey::Node::Answer::Rank.new(:text => "Mice")
12
+ @q1_a4 = ActiveRecordSurvey::Node::Answer::Rank.new(:text => "Ferrets")
13
+ @q1_a5 = ActiveRecordSurvey::Node::Answer::Rank.new(:text => "Rats")
14
+
15
+ nodes = @survey.build_question(@q1, [@q1_a1])
16
+ nodes = @survey.build_question(@q1_a2, [], nodes[1])
17
+ nodes = @survey.build_question(@q1_a3, [], nodes[0])
18
+ nodes = @survey.build_question(@q1_a4, [], nodes[0])
19
+ nodes = @survey.build_question(@q1_a5, [], nodes[0])
20
+
21
+ @survey.save
22
+ end
23
+
24
+ describe 'valid when' do
25
+ it 'accepts an integer value' do
26
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
27
+ instance.instance_nodes.build(
28
+ :instance => instance,
29
+ :node => @q1_a1,
30
+ :value => 1
31
+ )
32
+ instance.save
33
+
34
+ expect(instance.valid?).to be(true)
35
+ end
36
+
37
+ it 'accepts an empty value (no rank given)' do
38
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
39
+ instance.instance_nodes.build(
40
+ :instance => instance,
41
+ :node => @q1_a1,
42
+ )
43
+ instance.save
44
+
45
+ expect(instance.valid?).to be(true)
46
+ end
47
+
48
+ it 'ranked at than maximum number of answers' do
49
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
50
+ instance.instance_nodes.build(
51
+ :instance => instance,
52
+ :node => @q1_a1,
53
+ :value => 5
54
+ )
55
+ instance.save
56
+
57
+ expect(instance.valid?).to be(true)
58
+ end
59
+
60
+ it 'all answers are ranked in the correct order' do
61
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
62
+ instance.instance_nodes.build(
63
+ :instance => instance,
64
+ :node => @q1_a1,
65
+ :value => 1
66
+ )
67
+ instance.instance_nodes.build(
68
+ :instance => instance,
69
+ :node => @q1_a2,
70
+ :value => 3
71
+ )
72
+ instance.instance_nodes.build(
73
+ :instance => instance,
74
+ :node => @q1_a3,
75
+ :value => 2
76
+ )
77
+ instance.instance_nodes.build(
78
+ :instance => instance,
79
+ :node => @q1_a4,
80
+ :value => 5
81
+ )
82
+ instance.instance_nodes.build(
83
+ :instance => instance,
84
+ :node => @q1_a5,
85
+ :value => 4
86
+ )
87
+ instance.save
88
+
89
+ expect(instance.valid?).to be(true)
90
+ end
91
+
92
+ it 'one answer is not ranked' do
93
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
94
+ instance.instance_nodes.build(
95
+ :instance => instance,
96
+ :node => @q1_a1,
97
+ :value => 1
98
+ )
99
+ instance.instance_nodes.build(
100
+ :instance => instance,
101
+ :node => @q1_a2,
102
+ :value => 3
103
+ )
104
+ # Refusal to rank a3
105
+ instance.instance_nodes.build(
106
+ :instance => instance,
107
+ :node => @q1_a3
108
+ )
109
+ instance.instance_nodes.build(
110
+ :instance => instance,
111
+ :node => @q1_a4,
112
+ :value => 2
113
+ )
114
+ # Refusal to rank a5
115
+ instance.instance_nodes.build(
116
+ :instance => instance,
117
+ :node => @q1_a5
118
+ )
119
+ instance.save
120
+
121
+ expect(instance.valid?).to be(true)
122
+ end
123
+
124
+ # TODO - additional min and max answer required validation nodes...
125
+ end
126
+
127
+ describe 'invalid when' do
128
+ it 'rejects a float value' do
129
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
130
+ instance.instance_nodes.build(
131
+ :instance => instance,
132
+ :node => @q1_a1,
133
+ :value => 1.5
134
+ )
135
+ instance.save
136
+
137
+ expect(instance.valid?).to be(false)
138
+ end
139
+
140
+ it 'rejects an alphabetical value' do
141
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
142
+ instance.instance_nodes.build(
143
+ :instance => instance,
144
+ :node => @q1_a1,
145
+ :value => "1a2"
146
+ )
147
+ instance.save
148
+
149
+ expect(instance.valid?).to be(false)
150
+ end
151
+
152
+ it 'ranked 0' do
153
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
154
+ instance.instance_nodes.build(
155
+ :instance => instance,
156
+ :node => @q1_a1,
157
+ :value => 0
158
+ )
159
+ instance.save
160
+
161
+ expect(instance.valid?).to be(false)
162
+ end
163
+
164
+ it 'ranked higher than maximum number of answers' do
165
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
166
+ instance.instance_nodes.build(
167
+ :instance => instance,
168
+ :node => @q1_a1,
169
+ :value => 6
170
+ )
171
+ instance.save
172
+
173
+ expect(instance.valid?).to be(false)
174
+ end
175
+
176
+ it 'rejects when not answered in order' do
177
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
178
+ instance.instance_nodes.build(
179
+ :instance => instance,
180
+ :node => @q1_a2,
181
+ :value => 1
182
+ )
183
+ instance.save
184
+
185
+ expect(instance.valid?).to be(false)
186
+ end
187
+
188
+ it 'all one answer is ranked in correctly' do
189
+ instance = ActiveRecordSurvey::Instance.new(:survey => @survey)
190
+ instance.instance_nodes.build(
191
+ :instance => instance,
192
+ :node => @q1_a1,
193
+ :value => 1
194
+ )
195
+ instance.instance_nodes.build(
196
+ :instance => instance,
197
+ :node => @q1_a2,
198
+ :value => 3
199
+ )
200
+ instance.instance_nodes.build(
201
+ :instance => instance,
202
+ :node => @q1_a3,
203
+ :value => 12
204
+ )
205
+ instance.instance_nodes.build(
206
+ :instance => instance,
207
+ :node => @q1_a4,
208
+ :value => 5
209
+ )
210
+ instance.instance_nodes.build(
211
+ :instance => instance,
212
+ :node => @q1_a5,
213
+ :value => 4
214
+ )
215
+ instance.save
216
+
217
+ expect(instance.valid?).to be(false)
218
+ end
219
+ end
220
+ end
221
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ActiveRecordSurvey::Node::Answer::Scale, :focus => true do
3
+ describe ActiveRecordSurvey::Node::Answer::Scale do
4
4
  describe 'survey is' do
5
5
  before(:all) do
6
6
  @survey = ActiveRecordSurvey::Survey.new
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_survey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Butch Marshall
@@ -144,6 +144,7 @@ files:
144
144
  - lib/generators/active_record_survey/templates/migration_0.1.0.rb
145
145
  - rspec_rvm
146
146
  - spec/active_record_survey/node/answer/boolean_spec.rb
147
+ - spec/active_record_survey/node/answer/rank_spec.rb
147
148
  - spec/active_record_survey/node/answer/scale_spec.rb
148
149
  - spec/active_record_survey/survey_spec.rb
149
150
  - spec/active_record_survey_spec.rb
@@ -174,6 +175,7 @@ specification_version: 4
174
175
  summary: Surveys using activerecord
175
176
  test_files:
176
177
  - spec/active_record_survey/node/answer/boolean_spec.rb
178
+ - spec/active_record_survey/node/answer/rank_spec.rb
177
179
  - spec/active_record_survey/node/answer/scale_spec.rb
178
180
  - spec/active_record_survey/survey_spec.rb
179
181
  - spec/active_record_survey_spec.rb