helena 1.0.0.rc1 → 1.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +171 -127
- data/README.md +1 -1
- data/app/controllers/helena/sessions_controller.rb +16 -17
- data/app/models/helena/label.rb +0 -1
- data/app/models/helena/question.rb +4 -9
- data/app/models/helena/questions/bipolar_radio_matrix.rb +6 -0
- data/app/models/helena/sub_question.rb +8 -1
- data/app/views/helena/questions/_bipolar_radio_matrix.html.haml +33 -0
- data/app/views/helena/questions/_checkbox_group.html.haml +1 -1
- data/app/views/helena/questions/_long_text.html.haml +1 -1
- data/app/views/helena/questions/_radio_group.html.haml +1 -1
- data/app/views/helena/questions/_radio_matrix.html.haml +6 -4
- data/app/views/helena/questions/_short_text.html.haml +1 -1
- data/app/views/helena/sessions/edit.html.slim +1 -1
- data/config/locales/en.yml +1 -2
- data/config/locales/models/question/en.yml +6 -2
- data/helena.gemspec +4 -3
- data/lib/helena/survey_importer.rb +4 -4
- data/lib/helena/version.rb +1 -1
- data/spec/controllers/helena/sessions_controller_spec.rb +15 -1
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/config/routes.rb +0 -1
- data/spec/factories/helena/questions.rb +1 -0
- data/spec/factories/helena/sessions.rb +0 -1
- data/spec/features/helena/manage_session_spec.rb +38 -31
- data/spec/lib/survey_importer_spec.rb +4 -0
- data/spec/models/helena/answer_spec.rb +0 -2
- data/spec/models/helena/label_spec.rb +0 -2
- data/spec/models/helena/questions/bipolar_radio_matrix_spec.rb +39 -0
- data/spec/models/helena/sub_question_spec.rb +18 -0
- metadata +25 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 390dd724977bdba8cd62758efcccd35fce495eee
|
4
|
+
data.tar.gz: e7ad85893364a0853ed95d85bbe94ab7d524dda1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29c53f9f7e399ed5a64a41e93710de9f00c87da442ea194aaa0ce3d400043e202d0a0ef6a7cb46f161c27d82a92951481ed02af2e89ef8cd95fc5994daf2dca8
|
7
|
+
data.tar.gz: 7ad9e37117d15ab0f403d0d1df08fd59912a1ee60c23f2725cc20e25572e8c5277285bb54417d0e696e6ef50d880eade07b33c1fc8b2059e4a51f8b19bfc9259
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,152 +1,176 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
helena (1.0.0.
|
4
|
+
helena (1.0.0.rc2)
|
5
5
|
bootstrap-sass (~> 3.2)
|
6
6
|
breadcrumbs_on_rails (~> 2.3)
|
7
7
|
haml-rails (~> 0.5)
|
8
8
|
jquery-rails (~> 3.1)
|
9
|
-
mongoid (~> 4.0
|
9
|
+
mongoid (~> 4.0)
|
10
10
|
mongoid-simple-tags (~> 0.1)
|
11
11
|
mongoid_orderable (~> 4.1)
|
12
12
|
rails (~> 4.1)
|
13
13
|
rails-i18n (~> 4.0)
|
14
|
-
|
14
|
+
responders (~> 2.0)
|
15
|
+
sass-rails (~> 5.0)
|
15
16
|
simple_form (~> 3.1.0.rc2)
|
16
|
-
slim (~>
|
17
|
+
slim (~> 3.0)
|
17
18
|
|
18
19
|
GEM
|
19
20
|
remote: https://rubygems.org/
|
20
21
|
specs:
|
21
|
-
actionmailer (4.1
|
22
|
-
actionpack (= 4.1
|
23
|
-
actionview (= 4.1
|
22
|
+
actionmailer (4.2.1)
|
23
|
+
actionpack (= 4.2.1)
|
24
|
+
actionview (= 4.2.1)
|
25
|
+
activejob (= 4.2.1)
|
24
26
|
mail (~> 2.5, >= 2.5.4)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
28
|
+
actionpack (4.2.1)
|
29
|
+
actionview (= 4.2.1)
|
30
|
+
activesupport (= 4.2.1)
|
31
|
+
rack (~> 1.6)
|
29
32
|
rack-test (~> 0.6.2)
|
30
|
-
|
31
|
-
|
33
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
34
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.1)
|
35
|
+
actionview (4.2.1)
|
36
|
+
activesupport (= 4.2.1)
|
32
37
|
builder (~> 3.1)
|
33
38
|
erubis (~> 2.7.0)
|
34
|
-
|
35
|
-
|
39
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
40
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.1)
|
41
|
+
activejob (4.2.1)
|
42
|
+
activesupport (= 4.2.1)
|
43
|
+
globalid (>= 0.3.0)
|
44
|
+
activemodel (4.2.1)
|
45
|
+
activesupport (= 4.2.1)
|
36
46
|
builder (~> 3.1)
|
37
|
-
activerecord (4.1
|
38
|
-
activemodel (= 4.1
|
39
|
-
activesupport (= 4.1
|
40
|
-
arel (~>
|
41
|
-
activesupport (4.1
|
42
|
-
i18n (~> 0.
|
47
|
+
activerecord (4.2.1)
|
48
|
+
activemodel (= 4.2.1)
|
49
|
+
activesupport (= 4.2.1)
|
50
|
+
arel (~> 6.0)
|
51
|
+
activesupport (4.2.1)
|
52
|
+
i18n (~> 0.7)
|
43
53
|
json (~> 1.7, >= 1.7.7)
|
44
54
|
minitest (~> 5.1)
|
45
|
-
thread_safe (~> 0.
|
55
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
46
56
|
tzinfo (~> 1.1)
|
47
|
-
addressable (2.3.
|
48
|
-
arel (
|
49
|
-
|
57
|
+
addressable (2.3.8)
|
58
|
+
arel (6.0.0)
|
59
|
+
autoprefixer-rails (5.1.10)
|
60
|
+
execjs
|
61
|
+
json
|
62
|
+
better_errors (2.1.1)
|
50
63
|
coderay (>= 1.0.0)
|
51
64
|
erubis (>= 2.6.6)
|
52
65
|
rack (>= 0.9.0)
|
53
66
|
binding_of_caller (0.7.2)
|
54
67
|
debug_inspector (>= 0.0.1)
|
55
|
-
bootstrap-sass (3.3.
|
56
|
-
|
68
|
+
bootstrap-sass (3.3.4.1)
|
69
|
+
autoprefixer-rails (>= 5.0.0.1)
|
70
|
+
sass (>= 3.2.19)
|
57
71
|
breadcrumbs_on_rails (2.3.0)
|
58
72
|
bson (2.3.0)
|
59
73
|
builder (3.2.2)
|
60
|
-
byebug (
|
61
|
-
columnize (
|
62
|
-
debugger-linecache (~> 1.2)
|
63
|
-
slop (~> 3.6)
|
74
|
+
byebug (4.0.5)
|
75
|
+
columnize (= 0.9.0)
|
64
76
|
capybara (2.4.4)
|
65
77
|
mime-types (>= 1.16)
|
66
78
|
nokogiri (>= 1.3.3)
|
67
79
|
rack (>= 1.0.0)
|
68
80
|
rack-test (>= 0.5.4)
|
69
81
|
xpath (~> 2.0)
|
70
|
-
childprocess (0.5.
|
82
|
+
childprocess (0.5.6)
|
71
83
|
ffi (~> 1.0, >= 1.0.11)
|
72
84
|
coderay (1.1.0)
|
73
|
-
columnize (0.
|
74
|
-
connection_pool (2.
|
75
|
-
coveralls (0.
|
76
|
-
multi_json (~> 1.
|
77
|
-
rest-client
|
78
|
-
simplecov (
|
79
|
-
term-ansicolor
|
80
|
-
thor
|
81
|
-
database_cleaner (1.
|
85
|
+
columnize (0.9.0)
|
86
|
+
connection_pool (2.2.0)
|
87
|
+
coveralls (0.8.0)
|
88
|
+
multi_json (~> 1.10)
|
89
|
+
rest-client (>= 1.6.8, < 2)
|
90
|
+
simplecov (~> 0.9.1)
|
91
|
+
term-ansicolor (~> 1.3)
|
92
|
+
thor (~> 0.19.1)
|
93
|
+
database_cleaner (1.4.1)
|
82
94
|
debug_inspector (0.0.2)
|
83
|
-
debugger-linecache (1.2.0)
|
84
95
|
diff-lcs (1.2.5)
|
85
96
|
docile (1.1.5)
|
97
|
+
domain_name (0.5.24)
|
98
|
+
unf (>= 0.0.5, < 1.0.0)
|
86
99
|
easy_translate (0.5.0)
|
87
100
|
json
|
88
101
|
thread
|
89
102
|
thread_safe
|
90
103
|
erubis (2.7.0)
|
104
|
+
execjs (2.5.2)
|
91
105
|
factory_girl (4.5.0)
|
92
106
|
activesupport (>= 3.0.0)
|
93
107
|
factory_girl_rails (4.5.0)
|
94
108
|
factory_girl (~> 4.5.0)
|
95
109
|
railties (>= 3.0.0)
|
96
|
-
ffaker (1.
|
97
|
-
ffi (1.9.
|
98
|
-
|
110
|
+
ffaker (1.32.1)
|
111
|
+
ffi (1.9.8)
|
112
|
+
globalid (0.3.5)
|
113
|
+
activesupport (>= 4.1.0)
|
114
|
+
haml (4.0.6)
|
99
115
|
tilt
|
100
|
-
haml-rails (0.
|
116
|
+
haml-rails (0.9.0)
|
101
117
|
actionpack (>= 4.0.1)
|
102
118
|
activesupport (>= 4.0.1)
|
103
|
-
haml (>=
|
119
|
+
haml (>= 4.0.6, < 5.0)
|
120
|
+
html2haml (>= 1.0.1)
|
104
121
|
railties (>= 4.0.1)
|
105
|
-
highline (1.
|
106
|
-
|
107
|
-
|
108
|
-
|
122
|
+
highline (1.7.1)
|
123
|
+
html2haml (2.0.0)
|
124
|
+
erubis (~> 2.7.0)
|
125
|
+
haml (~> 4.0.0)
|
126
|
+
nokogiri (~> 1.6.0)
|
127
|
+
ruby_parser (~> 3.5)
|
128
|
+
http-cookie (1.0.2)
|
129
|
+
domain_name (~> 0.5)
|
130
|
+
i18n (0.7.0)
|
131
|
+
i18n-tasks (0.8.2)
|
109
132
|
activesupport
|
110
133
|
easy_translate (>= 0.5.0)
|
111
134
|
erubis
|
112
135
|
highline
|
113
136
|
i18n
|
114
|
-
slop (>= 3.5.0)
|
115
137
|
term-ansicolor
|
116
138
|
terminal-table
|
117
139
|
jquery-rails (3.1.2)
|
118
140
|
railties (>= 3.0, < 5.0)
|
119
141
|
thor (>= 0.14, < 2.0)
|
120
|
-
json (1.8.
|
142
|
+
json (1.8.2)
|
121
143
|
launchy (2.4.3)
|
122
144
|
addressable (~> 2.3)
|
145
|
+
loofah (2.0.1)
|
146
|
+
nokogiri (>= 1.5.9)
|
123
147
|
mail (2.6.3)
|
124
148
|
mime-types (>= 1.16, < 3)
|
125
149
|
method_source (0.8.2)
|
126
150
|
mime-types (2.4.3)
|
127
|
-
mini_portile (0.6.
|
128
|
-
minitest (5.
|
129
|
-
mongoid (4.0.
|
151
|
+
mini_portile (0.6.2)
|
152
|
+
minitest (5.6.0)
|
153
|
+
mongoid (4.0.2)
|
130
154
|
activemodel (~> 4.0)
|
131
155
|
moped (~> 2.0.0)
|
132
156
|
origin (~> 2.1)
|
133
157
|
tzinfo (>= 0.3.37)
|
134
|
-
mongoid-rspec (2.0.0
|
158
|
+
mongoid-rspec (2.0.0)
|
135
159
|
mongoid (~> 4.0.0)
|
136
160
|
rake
|
137
|
-
rspec (~> 3.
|
161
|
+
rspec (~> 3.1)
|
138
162
|
mongoid-simple-tags (0.1.3)
|
139
163
|
json (~> 1.8)
|
140
164
|
mongoid (>= 3.0.3)
|
141
|
-
mongoid_orderable (4.1.
|
165
|
+
mongoid_orderable (4.1.1)
|
142
166
|
mongoid
|
143
|
-
moped (2.0.
|
167
|
+
moped (2.0.4)
|
144
168
|
bson (~> 2.2)
|
145
169
|
connection_pool (~> 2.0)
|
146
170
|
optionable (~> 0.2.0)
|
147
|
-
multi_json (1.
|
148
|
-
netrc (0.
|
149
|
-
nokogiri (1.6.
|
171
|
+
multi_json (1.11.0)
|
172
|
+
netrc (0.10.3)
|
173
|
+
nokogiri (1.6.6.2)
|
150
174
|
mini_portile (~> 0.6.0)
|
151
175
|
optionable (0.2.0)
|
152
176
|
origin (2.1.1)
|
@@ -154,104 +178,123 @@ GEM
|
|
154
178
|
coderay (~> 1.1.0)
|
155
179
|
method_source (~> 0.8.1)
|
156
180
|
slop (~> 3.4)
|
157
|
-
pry-byebug (
|
158
|
-
byebug (~>
|
181
|
+
pry-byebug (3.1.0)
|
182
|
+
byebug (~> 4.0)
|
159
183
|
pry (~> 0.10)
|
160
|
-
quiet_assets (1.0
|
184
|
+
quiet_assets (1.1.0)
|
161
185
|
railties (>= 3.1, < 5.0)
|
162
|
-
rack (1.
|
163
|
-
rack-test (0.6.
|
186
|
+
rack (1.6.0)
|
187
|
+
rack-test (0.6.3)
|
164
188
|
rack (>= 1.0)
|
165
|
-
rails (4.1
|
166
|
-
actionmailer (= 4.1
|
167
|
-
actionpack (= 4.1
|
168
|
-
actionview (= 4.1
|
169
|
-
|
170
|
-
|
171
|
-
|
189
|
+
rails (4.2.1)
|
190
|
+
actionmailer (= 4.2.1)
|
191
|
+
actionpack (= 4.2.1)
|
192
|
+
actionview (= 4.2.1)
|
193
|
+
activejob (= 4.2.1)
|
194
|
+
activemodel (= 4.2.1)
|
195
|
+
activerecord (= 4.2.1)
|
196
|
+
activesupport (= 4.2.1)
|
172
197
|
bundler (>= 1.3.0, < 2.0)
|
173
|
-
railties (= 4.1
|
174
|
-
sprockets-rails
|
175
|
-
rails-
|
198
|
+
railties (= 4.2.1)
|
199
|
+
sprockets-rails
|
200
|
+
rails-deprecated_sanitizer (1.0.3)
|
201
|
+
activesupport (>= 4.2.0.alpha)
|
202
|
+
rails-dom-testing (1.0.6)
|
203
|
+
activesupport (>= 4.2.0.beta, < 5.0)
|
204
|
+
nokogiri (~> 1.6.0)
|
205
|
+
rails-deprecated_sanitizer (>= 1.0.1)
|
206
|
+
rails-html-sanitizer (1.0.2)
|
207
|
+
loofah (~> 2.0)
|
208
|
+
rails-i18n (4.0.4)
|
176
209
|
i18n (~> 0.6)
|
177
210
|
railties (~> 4.0)
|
178
|
-
railties (4.1
|
179
|
-
actionpack (= 4.1
|
180
|
-
activesupport (= 4.1
|
211
|
+
railties (4.2.1)
|
212
|
+
actionpack (= 4.2.1)
|
213
|
+
activesupport (= 4.2.1)
|
181
214
|
rake (>= 0.8.7)
|
182
215
|
thor (>= 0.18.1, < 2.0)
|
183
|
-
rake (10.
|
184
|
-
|
216
|
+
rake (10.4.2)
|
217
|
+
responders (2.1.0)
|
218
|
+
railties (>= 4.2.0, < 5)
|
219
|
+
rest-client (1.8.0)
|
220
|
+
http-cookie (>= 1.0.2, < 2.0)
|
185
221
|
mime-types (>= 1.16, < 3.0)
|
186
222
|
netrc (~> 0.7)
|
187
|
-
rspec (3.
|
188
|
-
rspec-core (~> 3.
|
189
|
-
rspec-expectations (~> 3.
|
190
|
-
rspec-mocks (~> 3.
|
191
|
-
rspec-collection_matchers (1.
|
223
|
+
rspec (3.2.0)
|
224
|
+
rspec-core (~> 3.2.0)
|
225
|
+
rspec-expectations (~> 3.2.0)
|
226
|
+
rspec-mocks (~> 3.2.0)
|
227
|
+
rspec-collection_matchers (1.1.2)
|
192
228
|
rspec-expectations (>= 2.99.0.beta1)
|
193
|
-
rspec-core (3.
|
194
|
-
rspec-support (~> 3.
|
195
|
-
rspec-expectations (3.1
|
229
|
+
rspec-core (3.2.3)
|
230
|
+
rspec-support (~> 3.2.0)
|
231
|
+
rspec-expectations (3.2.1)
|
196
232
|
diff-lcs (>= 1.2.0, < 2.0)
|
197
|
-
rspec-support (~> 3.
|
198
|
-
rspec-mocks (3.1
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
rspec-
|
206
|
-
rspec-
|
207
|
-
rspec-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
233
|
+
rspec-support (~> 3.2.0)
|
234
|
+
rspec-mocks (3.2.1)
|
235
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
236
|
+
rspec-support (~> 3.2.0)
|
237
|
+
rspec-rails (3.2.1)
|
238
|
+
actionpack (>= 3.0, < 4.3)
|
239
|
+
activesupport (>= 3.0, < 4.3)
|
240
|
+
railties (>= 3.0, < 4.3)
|
241
|
+
rspec-core (~> 3.2.0)
|
242
|
+
rspec-expectations (~> 3.2.0)
|
243
|
+
rspec-mocks (~> 3.2.0)
|
244
|
+
rspec-support (~> 3.2.0)
|
245
|
+
rspec-support (3.2.2)
|
246
|
+
ruby-progressbar (1.7.5)
|
247
|
+
ruby_parser (3.6.6)
|
248
|
+
sexp_processor (~> 4.1)
|
249
|
+
rubyzip (1.1.7)
|
250
|
+
sass (3.4.13)
|
251
|
+
sass-rails (5.0.2)
|
213
252
|
railties (>= 4.0.0, < 5.0)
|
214
|
-
sass (~> 3.
|
215
|
-
sprockets (
|
216
|
-
sprockets-rails (
|
217
|
-
|
253
|
+
sass (~> 3.1)
|
254
|
+
sprockets (>= 2.8, < 4.0)
|
255
|
+
sprockets-rails (>= 2.0, < 4.0)
|
256
|
+
tilt (~> 1.1)
|
257
|
+
selenium-webdriver (2.45.0)
|
218
258
|
childprocess (~> 0.5)
|
219
259
|
multi_json (~> 1.0)
|
220
260
|
rubyzip (~> 1.0)
|
221
261
|
websocket (~> 1.0)
|
222
|
-
|
262
|
+
sexp_processor (4.5.0)
|
263
|
+
shoulda-matchers (2.8.0)
|
264
|
+
activesupport (>= 3.0.0)
|
265
|
+
simple_form (3.1.0)
|
223
266
|
actionpack (~> 4.0)
|
224
267
|
activemodel (~> 4.0)
|
225
|
-
simplecov (0.9.
|
268
|
+
simplecov (0.9.2)
|
226
269
|
docile (~> 1.1.0)
|
227
270
|
multi_json (~> 1.0)
|
228
|
-
simplecov-html (~> 0.
|
229
|
-
simplecov-html (0.
|
230
|
-
slim (
|
231
|
-
temple (~> 0.
|
271
|
+
simplecov-html (~> 0.9.0)
|
272
|
+
simplecov-html (0.9.0)
|
273
|
+
slim (3.0.3)
|
274
|
+
temple (~> 0.7.3)
|
232
275
|
tilt (>= 1.3.3, < 2.1)
|
233
276
|
slop (3.6.0)
|
234
|
-
sprockets (
|
235
|
-
hike (~> 1.2)
|
236
|
-
multi_json (~> 1.0)
|
277
|
+
sprockets (3.0.1)
|
237
278
|
rack (~> 1.0)
|
238
|
-
|
239
|
-
sprockets-rails (2.2.0)
|
279
|
+
sprockets-rails (2.2.4)
|
240
280
|
actionpack (>= 3.0)
|
241
281
|
activesupport (>= 3.0)
|
242
282
|
sprockets (>= 2.8, < 4.0)
|
243
|
-
temple (0.
|
283
|
+
temple (0.7.5)
|
244
284
|
term-ansicolor (1.3.0)
|
245
285
|
tins (~> 1.0)
|
246
286
|
terminal-table (1.4.5)
|
247
287
|
thor (0.19.1)
|
248
|
-
thread (0.
|
249
|
-
thread_safe (0.3.
|
288
|
+
thread (0.2.0)
|
289
|
+
thread_safe (0.3.5)
|
250
290
|
tilt (1.4.1)
|
251
|
-
tins (1.3.
|
291
|
+
tins (1.3.5)
|
252
292
|
tzinfo (1.2.2)
|
253
293
|
thread_safe (~> 0.1)
|
254
|
-
|
294
|
+
unf (0.1.4)
|
295
|
+
unf_ext
|
296
|
+
unf_ext (0.0.7.1)
|
297
|
+
websocket (1.2.2)
|
255
298
|
xpath (2.0.0)
|
256
299
|
nokogiri (~> 1.3)
|
257
300
|
|
@@ -280,4 +323,5 @@ DEPENDENCIES
|
|
280
323
|
rspec-rails (~> 3)
|
281
324
|
ruby-progressbar
|
282
325
|
selenium-webdriver
|
326
|
+
shoulda-matchers
|
283
327
|
simple_form
|
data/README.md
CHANGED
@@ -29,7 +29,7 @@ Add this line to your routes will and you will be good to go!
|
|
29
29
|
|
30
30
|
mount Helena::Engine => '/helena'
|
31
31
|
|
32
|
-
Since Version 1.0 the admin interface is no longer a part of the gem and was extracted to http://github.com/gurix/
|
32
|
+
Since Version 1.0 the admin interface is no longer a part of the gem and was extracted to http://github.com/gurix/helena_administration.
|
33
33
|
|
34
34
|
## TODOS
|
35
35
|
* Support more question types, i.e Dates, Numeric inputs with validation, emails, ...
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module Helena
|
2
|
+
# TODO: Needs refactoring, is really ugly atm :-(
|
2
3
|
class SessionsController < ApplicationController
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
before_action :load_session, only: [:edit, :update]
|
5
|
+
before_action :update_answers, only: :update
|
6
|
+
before_action :answer_errors, only: :update
|
7
|
+
after_action :update_last_question_group_id, only: :update
|
7
8
|
|
8
9
|
def show
|
9
10
|
@session = Helena::Session.find_by view_token: params[:token]
|
@@ -24,9 +25,6 @@ module Helena
|
|
24
25
|
end
|
25
26
|
|
26
27
|
def update
|
27
|
-
@answers = update_answers
|
28
|
-
@errors = answer_errors
|
29
|
-
|
30
28
|
if @question_group.last? && @errors.blank?
|
31
29
|
@session.update_attribute :completed, true
|
32
30
|
render 'end_message'
|
@@ -43,6 +41,7 @@ module Helena
|
|
43
41
|
@session = Helena::Session.find_by token: params[:token]
|
44
42
|
@survey = @session.survey
|
45
43
|
@version = @survey.versions.find @session.version_id
|
44
|
+
render text: 'Version not active', status: '404' unless @version && @version.active
|
46
45
|
@question_group = question_group
|
47
46
|
end
|
48
47
|
|
@@ -69,18 +68,18 @@ module Helena
|
|
69
68
|
end
|
70
69
|
|
71
70
|
def update_answers
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
@session.answers.where(code: question_code).delete
|
71
|
+
if session_params
|
72
|
+
@question_group.question_codes.each do |question_code|
|
73
|
+
@session.answers.where(code: question_code).delete
|
76
74
|
|
77
|
-
|
75
|
+
value = session_params[:answers][question_code]
|
78
76
|
|
79
|
-
|
77
|
+
next if value.blank?
|
80
78
|
|
81
|
-
|
79
|
+
@session.answers << Helena::Answer.build_generic(question_code, value, request.remote_ip)
|
80
|
+
end
|
82
81
|
end
|
83
|
-
session_answers
|
82
|
+
@answers = session_answers
|
84
83
|
end
|
85
84
|
|
86
85
|
def answer_errors
|
@@ -90,11 +89,11 @@ module Helena
|
|
90
89
|
errors[question_code] = t("errors.messages.#{error_message}")
|
91
90
|
end
|
92
91
|
end
|
93
|
-
errors
|
92
|
+
@errors = errors
|
94
93
|
end
|
95
94
|
|
96
95
|
def session_report
|
97
|
-
Slim::Template.new { @version.session_report }.render.html_safe if @version.session_report
|
96
|
+
Slim::Template.new { @version.session_report }.render(self).html_safe if @version.session_report
|
98
97
|
end
|
99
98
|
|
100
99
|
def update_last_question_group_id
|
data/app/models/helena/label.rb
CHANGED
@@ -3,21 +3,20 @@ module Helena
|
|
3
3
|
include Helena::Concerns::ApplicationModel
|
4
4
|
include Mongoid::Orderable
|
5
5
|
|
6
|
-
CODE_FORMAT = /\A[a-z]([-\w]{,498}[a-z\d])?\Z/
|
7
|
-
|
8
6
|
TYPES = [
|
9
7
|
Helena::Questions::ShortText,
|
10
8
|
Helena::Questions::LongText,
|
11
9
|
Helena::Questions::StaticText,
|
12
10
|
Helena::Questions::RadioGroup,
|
13
11
|
Helena::Questions::CheckboxGroup,
|
14
|
-
Helena::Questions::RadioMatrix
|
12
|
+
Helena::Questions::RadioMatrix,
|
13
|
+
Helena::Questions::BipolarRadioMatrix
|
15
14
|
]
|
16
15
|
|
17
16
|
belongs_to :question_group, inverse_of: :questions
|
18
17
|
|
19
|
-
embeds_many :labels, class_name: 'Helena::Label'
|
20
|
-
embeds_many :sub_questions, class_name: 'Helena::SubQuestion'
|
18
|
+
embeds_many :labels, class_name: 'Helena::Label', cascade_callbacks: true
|
19
|
+
embeds_many :sub_questions, class_name: 'Helena::SubQuestion', cascade_callbacks: true
|
21
20
|
|
22
21
|
accepts_nested_attributes_for :labels, allow_destroy: true, reject_if: :reject_labels
|
23
22
|
accepts_nested_attributes_for :sub_questions, allow_destroy: true, reject_if: :reject_sub_questions
|
@@ -28,10 +27,6 @@ module Helena
|
|
28
27
|
orderable scope: :question_group
|
29
28
|
|
30
29
|
validates :code, presence: true
|
31
|
-
|
32
|
-
# consist of lowercase characters or digits, not starting with a digit or underscore and not ending with an underscore
|
33
|
-
# foo_32: correct, 32_foo: incorrect, _bar: incorrect, bar_: incorrect, FooBaar: incorrect
|
34
|
-
validates :code, format: { with: CODE_FORMAT }
|
35
30
|
validate :uniqueness_of_code
|
36
31
|
|
37
32
|
def includes_labels?
|
@@ -12,10 +12,17 @@ module Helena
|
|
12
12
|
|
13
13
|
orderable
|
14
14
|
|
15
|
-
validates :code, format: { with: Helena::Question::CODE_FORMAT }
|
16
15
|
validate :uniqueness_of_code
|
17
16
|
validates :text, presence: true, uniqueness: true
|
18
17
|
|
18
|
+
def splitted?
|
19
|
+
parts.size > 1
|
20
|
+
end
|
21
|
+
|
22
|
+
def parts
|
23
|
+
text.split '|'
|
24
|
+
end
|
25
|
+
|
19
26
|
def uniqueness_of_code
|
20
27
|
question_code_occurences = question.question_group.version.question_code_occurences
|
21
28
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
- label_width = "#{60 / question.labels.count}%"
|
2
|
+
|
3
|
+
.radio_matrix.form-group{ class: "#{'has-error' if errors.present?}" }
|
4
|
+
%label{class: "#{'text-danger' if errors.present?}"}
|
5
|
+
!= question.question_text
|
6
|
+
= ' *' if question.required
|
7
|
+
.table-responsive
|
8
|
+
%table.table
|
9
|
+
%thead
|
10
|
+
%tr
|
11
|
+
%th
|
12
|
+
- question.labels.each do |label|
|
13
|
+
%th{ width: label_width }
|
14
|
+
= label.text
|
15
|
+
%th
|
16
|
+
|
17
|
+
%tbody
|
18
|
+
- question.sub_questions.each do |sub_question|
|
19
|
+
%tr
|
20
|
+
%td.text-right
|
21
|
+
= sub_question.parts.first
|
22
|
+
- if errors[sub_question.code]
|
23
|
+
.help-block.text-danger= errors[sub_question.code]
|
24
|
+
- question.labels.each do |label|
|
25
|
+
- checked = answers[sub_question.code].to_s == label.value.to_s if answers[sub_question.code].present?
|
26
|
+
- checked ||= (label.preselected? ? true : false)
|
27
|
+
%td{ width: label_width }
|
28
|
+
%label
|
29
|
+
= form.simple_fields_for :answers do |answer_form|
|
30
|
+
= answer_form.radio_button sub_question.code, label.value, checked: checked
|
31
|
+
%span.hide-text= label.text
|
32
|
+
%td
|
33
|
+
= sub_question.parts.last if sub_question.splitted?
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.checkbox_group.form-group{ class: "#{'has-error' if errors[question.code]}" }
|
2
2
|
%label
|
3
|
-
|
3
|
+
!= question.question_text
|
4
4
|
= ' *' if question.required
|
5
5
|
= form.simple_fields_for :answers do |answer_form|
|
6
6
|
- question.sub_questions.each do |sub_question|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.long_text.form-group{ class: "#{'has-error' if errors[question.code]}" }
|
2
2
|
%label
|
3
|
-
|
3
|
+
!= question.question_text
|
4
4
|
= ' *' if question.required
|
5
5
|
= form.simple_fields_for :answers do |answer_form|
|
6
6
|
= answer_form.text_area question.code, value: answers[question.code], class: 'form-control'
|
@@ -1,6 +1,8 @@
|
|
1
|
+
- label_width = "#{80 / question.labels.count}%"
|
2
|
+
|
1
3
|
.radio_matrix.form-group{ class: "#{'has-error' if errors.present?}" }
|
2
4
|
%label{class: "#{'text-danger' if errors.present?}"}
|
3
|
-
|
5
|
+
!= question.question_text
|
4
6
|
= ' *' if question.required
|
5
7
|
.table-responsive
|
6
8
|
%table.table
|
@@ -8,19 +10,19 @@
|
|
8
10
|
%tr
|
9
11
|
%th
|
10
12
|
- question.labels.each do |label|
|
11
|
-
%th{ width:
|
13
|
+
%th{ width: label_width }
|
12
14
|
= label.text
|
13
15
|
%tbody
|
14
16
|
- question.sub_questions.each do |sub_question|
|
15
17
|
%tr
|
16
18
|
%td
|
17
|
-
= sub_question.
|
19
|
+
= sub_question.parts.first
|
18
20
|
- if errors[sub_question.code]
|
19
21
|
.help-block.text-danger= errors[sub_question.code]
|
20
22
|
- question.labels.each do |label|
|
21
23
|
- checked = answers[sub_question.code].to_s == label.value.to_s if answers[sub_question.code].present?
|
22
24
|
- checked ||= (label.preselected? ? true : false)
|
23
|
-
%td{ width:
|
25
|
+
%td{ width: label_width }
|
24
26
|
%label
|
25
27
|
= form.simple_fields_for :answers do |answer_form|
|
26
28
|
= answer_form.radio_button sub_question.code, label.value, checked: checked
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.short_text.form-group{ class: "#{'has-error' if errors[question.code]}" }
|
2
2
|
%label
|
3
|
-
|
3
|
+
!= question.question_text
|
4
4
|
= ' *' if question.required
|
5
5
|
= form.simple_fields_for :answers do |answer_form|
|
6
6
|
= answer_form.text_field question.code, value: answers[question.code], class: 'form-control'
|
data/config/locales/en.yml
CHANGED
@@ -7,7 +7,7 @@ en:
|
|
7
7
|
add: Add
|
8
8
|
show: Show
|
9
9
|
required: '* indicates required fields'
|
10
|
-
code_hint: The code
|
10
|
+
code_hint: The code should consist only of lowercase letters, numbers and underscores. Don't begin with a digit or an underscore and don't end with an underscore.
|
11
11
|
move_up: Move up
|
12
12
|
move_down: Move down
|
13
13
|
untitled: Untitled
|
@@ -17,4 +17,3 @@ en:
|
|
17
17
|
updated: "'%{resource}' successfully updated"
|
18
18
|
created: "'%{resource}' successfully created"
|
19
19
|
error: Ooopss... something is wrong, please check your input
|
20
|
-
|
@@ -29,9 +29,13 @@ en:
|
|
29
29
|
one: Radio Matrix
|
30
30
|
other: Radio Matrice
|
31
31
|
|
32
|
+
'helena/questions/bipolar_radio_matrix':
|
33
|
+
one: Bipolar Radio Matrix
|
34
|
+
other: Bipolar Radio Matrice
|
35
|
+
|
32
36
|
'helena/questions/checkbox_matrix':
|
33
|
-
|
34
|
-
|
37
|
+
one: Checkbox Matrix
|
38
|
+
other: Checkbox Matrice
|
35
39
|
|
36
40
|
attributes:
|
37
41
|
'helena/question':
|
data/helena.gemspec
CHANGED
@@ -20,17 +20,18 @@ survey/test development, longitudinal studies and instant feedback.'
|
|
20
20
|
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
21
21
|
|
22
22
|
s.add_dependency 'rails', '~> 4.1'
|
23
|
-
s.add_dependency 'mongoid', '~> 4.0
|
23
|
+
s.add_dependency 'mongoid', '~> 4.0'
|
24
24
|
s.add_dependency 'mongoid_orderable', '~> 4.1'
|
25
25
|
s.add_dependency 'mongoid-simple-tags', '~> 0.1'
|
26
26
|
s.add_dependency 'haml-rails', '~> 0.5'
|
27
|
-
s.add_dependency 'slim', '~>
|
27
|
+
s.add_dependency 'slim', '~> 3.0'
|
28
28
|
s.add_dependency 'jquery-rails', '~> 3.1'
|
29
|
-
s.add_dependency 'sass-rails', '~>
|
29
|
+
s.add_dependency 'sass-rails', '~> 5.0'
|
30
30
|
s.add_dependency 'bootstrap-sass', '~> 3.2'
|
31
31
|
s.add_dependency 'simple_form', '~> 3.1.0.rc2'
|
32
32
|
s.add_dependency 'breadcrumbs_on_rails', '~> 2.3'
|
33
33
|
s.add_dependency 'rails-i18n', '~> 4.0'
|
34
|
+
s.add_dependency 'responders', '~> 2.0'
|
34
35
|
|
35
36
|
s.add_development_dependency 'rspec-rails', '~> 3'
|
36
37
|
s.add_development_dependency 'rspec-collection_matchers', '~> 1'
|
@@ -14,7 +14,7 @@ module Helena
|
|
14
14
|
|
15
15
|
def create_survey
|
16
16
|
@survey = Helena::Survey.new @parsed.except('versions')
|
17
|
-
return unless @survey.save
|
17
|
+
return unless @survey.save!
|
18
18
|
return unless @parsed['versions']
|
19
19
|
@parsed['versions'].each { |parsed_version| create_version parsed_version }
|
20
20
|
end
|
@@ -22,7 +22,7 @@ module Helena
|
|
22
22
|
def create_version(parsed_version)
|
23
23
|
version = build_version(parsed_version)
|
24
24
|
|
25
|
-
return unless version.save
|
25
|
+
return unless version.save!
|
26
26
|
return unless parsed_version.last['question_groups']
|
27
27
|
parsed_version.last['question_groups'].each { |parsed_question_group| create_question_group version, parsed_question_group }
|
28
28
|
end
|
@@ -30,7 +30,7 @@ module Helena
|
|
30
30
|
def create_question_group(version, parsed_question_group)
|
31
31
|
question_group = version.question_groups.build parsed_question_group.last.except('questions')
|
32
32
|
question_group.position = parsed_question_group.first
|
33
|
-
return unless question_group.save
|
33
|
+
return unless question_group.save!
|
34
34
|
return unless parsed_question_group.last['questions']
|
35
35
|
parsed_question_group.last['questions'].each { |parsed_question| create_question question_group, parsed_question }
|
36
36
|
end
|
@@ -38,7 +38,7 @@ module Helena
|
|
38
38
|
def create_question(question_group, parsed_question)
|
39
39
|
question = question_group.questions.build parsed_question.last
|
40
40
|
question.position = parsed_question.first
|
41
|
-
question.save
|
41
|
+
question.save!
|
42
42
|
question
|
43
43
|
end
|
44
44
|
|
data/lib/helena/version.rb
CHANGED
@@ -4,7 +4,7 @@ describe Helena::SessionsController do
|
|
4
4
|
routes { Helena::Engine.routes }
|
5
5
|
|
6
6
|
let(:survey) { create :survey }
|
7
|
-
let(:version) { survey.versions.create version: 0 }
|
7
|
+
let(:version) { survey.versions.create version: 0, question_groups: [build(:question_group)] }
|
8
8
|
let(:session) do
|
9
9
|
create :session, survey: survey, version: version, answers: [
|
10
10
|
build(:string_answer, code: 'string_answer_1', value: 'abc'),
|
@@ -12,6 +12,20 @@ describe Helena::SessionsController do
|
|
12
12
|
]
|
13
13
|
end
|
14
14
|
|
15
|
+
context 'version not active' do
|
16
|
+
before { version.update_attribute :active, false }
|
17
|
+
|
18
|
+
it 'raises not found when editing' do
|
19
|
+
get :edit, token: session.token
|
20
|
+
is_expected.to respond_with :not_found
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'raises not found when updating' do
|
24
|
+
patch :update, token: session.token
|
25
|
+
is_expected.to respond_with :not_found
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
15
29
|
it 'return json result of the current session' do
|
16
30
|
get :show, token: session.view_token, format: :json
|
17
31
|
|
@@ -13,7 +13,7 @@ Dummy::Application.configure do
|
|
13
13
|
config.eager_load = false
|
14
14
|
|
15
15
|
# Configure static asset server for tests with Cache-Control for performance.
|
16
|
-
config.
|
16
|
+
config.serve_static_files = true
|
17
17
|
config.static_cache_control = 'public, max-age=3600'
|
18
18
|
|
19
19
|
# Show full error reports and disable caching.
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -9,5 +9,6 @@ FactoryGirl.define do
|
|
9
9
|
factory :radio_group_question, class: Helena::Questions::RadioGroup
|
10
10
|
factory :checkbox_group_question, class: Helena::Questions::CheckboxGroup
|
11
11
|
factory :radio_matrix_question, class: Helena::Questions::RadioMatrix
|
12
|
+
factory :bipolar_radio_matrix_question, class: Helena::Questions::BipolarRadioMatrix
|
12
13
|
end
|
13
14
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
feature 'Session management' do
|
4
4
|
let(:survey) { create :survey, name: 'dummy' }
|
5
|
-
let(:base_version) { survey.versions.create version: 0 }
|
5
|
+
let(:base_version) { survey.versions.create version: 0, active: true }
|
6
6
|
let!(:first_question_group) { base_version.question_groups.create title: 'Question Group 1' }
|
7
7
|
|
8
8
|
background do
|
@@ -65,11 +65,10 @@ feature 'Session management' do
|
|
65
65
|
position: 5)
|
66
66
|
|
67
67
|
third_question_group.questions << satisfaction_matrix
|
68
|
-
version = Helena::VersionPublisher.publish(base_version)
|
69
|
-
version.settings = { display_progressbar: true }
|
70
|
-
version.save
|
71
68
|
|
72
|
-
|
69
|
+
base_version.update_attribute :settings, display_progressbar: '1'
|
70
|
+
|
71
|
+
session = survey.sessions.create version_id: base_version.id, token: 'abc'
|
73
72
|
|
74
73
|
visit helena.edit_session_path(session.token)
|
75
74
|
|
@@ -114,7 +113,7 @@ feature 'Session management' do
|
|
114
113
|
check('Oats')
|
115
114
|
check('Meat')
|
116
115
|
|
117
|
-
expect(page).to have_link 'Back', href: helena.edit_session_path(session.token, question_group:
|
116
|
+
expect(page).to have_link 'Back', href: helena.edit_session_path(session.token, question_group: base_version.question_groups.find_by(position: 1))
|
118
117
|
expect { click_button 'Next' }.to change { session.reload.answers.count }.from(2).to(6)
|
119
118
|
expect(session.reload.last_question_group_id).to eq third_question_group.id
|
120
119
|
|
@@ -147,7 +146,7 @@ feature 'Session management' do
|
|
147
146
|
choose('session_answers_nothing_to_change_5')
|
148
147
|
choose('session_answers_satisfied_with_life_7')
|
149
148
|
|
150
|
-
expect(page).to have_link 'Back', href: helena.edit_session_path(session.token, question_group:
|
149
|
+
expect(page).to have_link 'Back', href: helena.edit_session_path(session.token, question_group: base_version.question_groups.find_by(position: 2))
|
151
150
|
expect { click_button 'Save' }.to change { session.reload.answers.count }.from(6).to(11)
|
152
151
|
end
|
153
152
|
|
@@ -171,10 +170,7 @@ feature 'Session management' do
|
|
171
170
|
short_text_question = build :short_text_question, code: 'a_name', question_text: "What's your name?", required: true
|
172
171
|
first_question_group.questions << short_text_question
|
173
172
|
|
174
|
-
|
175
|
-
version.save
|
176
|
-
|
177
|
-
session = survey.sessions.create version_id: version.id, token: 'abc'
|
173
|
+
session = survey.sessions.create version_id: base_version.id, token: 'abc'
|
178
174
|
|
179
175
|
visit helena.edit_session_path(session.token)
|
180
176
|
|
@@ -200,10 +196,7 @@ feature 'Session management' do
|
|
200
196
|
long_text_question = build :long_text_question, code: 'selfdescription', question_text: 'Give a brief description of yourself', required: true
|
201
197
|
first_question_group.questions << long_text_question
|
202
198
|
|
203
|
-
|
204
|
-
version.save
|
205
|
-
|
206
|
-
session = survey.sessions.create version_id: version.id, token: 'abc'
|
199
|
+
session = survey.sessions.create version_id: base_version.id, token: 'abc'
|
207
200
|
|
208
201
|
visit helena.edit_session_path(session.token)
|
209
202
|
|
@@ -224,15 +217,13 @@ feature 'Session management' do
|
|
224
217
|
|
225
218
|
first_question_group.questions << all_and_everything
|
226
219
|
|
227
|
-
|
228
|
-
version.save
|
229
|
-
|
230
|
-
session = survey.sessions.create version_id: version.id, token: 'abc'
|
220
|
+
session = survey.sessions.create version_id: base_version.id, token: 'abc'
|
231
221
|
|
232
222
|
visit helena.edit_session_path(session.token)
|
233
223
|
|
234
224
|
expect(page).to have_content 'What is the answer to the Ultimate Question of Life, the Universe, and Everything? *'
|
235
225
|
expect { click_button 'Save' }.not_to change { session.reload.answers.count }
|
226
|
+
|
236
227
|
expect(page).to have_content("can't be blank")
|
237
228
|
end
|
238
229
|
|
@@ -247,10 +238,7 @@ feature 'Session management' do
|
|
247
238
|
|
248
239
|
first_question_group.questions << food_allergy
|
249
240
|
|
250
|
-
|
251
|
-
version.save
|
252
|
-
|
253
|
-
session = survey.sessions.create version_id: version.id, token: 'abc'
|
241
|
+
session = survey.sessions.create version_id: base_version.id, token: 'abc'
|
254
242
|
|
255
243
|
visit helena.edit_session_path(session.token)
|
256
244
|
|
@@ -270,10 +258,7 @@ feature 'Session management' do
|
|
270
258
|
|
271
259
|
first_question_group.questions << food_allergy
|
272
260
|
|
273
|
-
|
274
|
-
version.save
|
275
|
-
|
276
|
-
session = survey.sessions.create version_id: version.id, token: 'abc'
|
261
|
+
session = survey.sessions.create version_id: base_version.id, token: 'abc'
|
277
262
|
|
278
263
|
visit helena.edit_session_path(session.token)
|
279
264
|
|
@@ -304,10 +289,7 @@ feature 'Session management' do
|
|
304
289
|
|
305
290
|
first_question_group.questions << satisfaction_matrix
|
306
291
|
|
307
|
-
|
308
|
-
version.save
|
309
|
-
|
310
|
-
session = survey.sessions.create version_id: version.id, token: 'abc'
|
292
|
+
session = survey.sessions.create version_id: base_version.id, token: 'abc'
|
311
293
|
|
312
294
|
visit helena.edit_session_path(session.token)
|
313
295
|
|
@@ -320,6 +302,31 @@ feature 'Session management' do
|
|
320
302
|
expect(page).to have_content("can't be blank")
|
321
303
|
end
|
322
304
|
|
305
|
+
scenario 'Displaying a bipolar radio matrix question"' do
|
306
|
+
radio_matrix = build :bipolar_radio_matrix_question, code: :satisfaction,
|
307
|
+
question_text: 'What do you like more?'
|
308
|
+
|
309
|
+
radio_matrix.labels << build(:label, value: 1, text: 'Yo')
|
310
|
+
radio_matrix.labels << build(:label, value: 2, text: "can't decide")
|
311
|
+
radio_matrix.labels << build(:label, value: 3, text: 'Yo')
|
312
|
+
|
313
|
+
radio_matrix.sub_questions << build(:sub_question, code: 'food', text: 'Ice cream|Cookies')
|
314
|
+
radio_matrix.sub_questions << build(:sub_question, code: 'drugs', text: 'Weed|Booze')
|
315
|
+
radio_matrix.sub_questions << build(:sub_question, code: 'pets', text: 'Cats|Dogs')
|
316
|
+
radio_matrix.sub_questions << build(:sub_question, code: 'not_splitted', text: 'I am not splitted')
|
317
|
+
|
318
|
+
first_question_group.questions << radio_matrix
|
319
|
+
|
320
|
+
session = survey.sessions.create version_id: base_version.id, token: 'abc'
|
321
|
+
|
322
|
+
visit helena.edit_session_path(session.token)
|
323
|
+
|
324
|
+
expect(page.all('table thead tr th').size).to eq 5
|
325
|
+
expect(page.find('table tbody tr:first td:first')).to have_content 'Ice cream'
|
326
|
+
expect(page.find('table tbody tr:last td:first')).to have_content 'I am not splitted'
|
327
|
+
expect(page.find('table tbody tr:last td:last').text).to be_empty
|
328
|
+
end
|
329
|
+
|
323
330
|
scenario 'Allows to define whether a user an jump back for each question group seperately' do
|
324
331
|
second_question_group = base_version.question_groups.create title: 'Question Group 2', allow_to_go_back: true
|
325
332
|
base_version.question_groups.create title: 'Question Group 3', allow_to_go_back: false
|
@@ -9,6 +9,10 @@ describe Helena::SurveyImporter do
|
|
9
9
|
expect(survey.versions.first).to have_exactly(1).question_groups
|
10
10
|
expect(survey.versions.first.question_groups.first).to have_exactly(1).questions
|
11
11
|
expect(survey.versions.first.question_groups.first.questions.first).to have_exactly(7).labels
|
12
|
+
expect(survey.versions.first.question_groups.first.questions.first.labels.first.position).to eq 1
|
13
|
+
expect(survey.versions.first.question_groups.first.questions.first.labels.last.position).to eq 7
|
12
14
|
expect(survey.versions.first.question_groups.first.questions.first).to have_exactly(5).sub_questions
|
15
|
+
expect(survey.versions.first.question_groups.first.questions.first.sub_questions.first.position).to eq 1
|
16
|
+
expect(survey.versions.first.question_groups.first.questions.first.sub_questions.last.position).to eq 5
|
13
17
|
end
|
14
18
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Helena::Answer do
|
4
|
-
|
5
4
|
let(:survey) { create :survey }
|
6
5
|
let(:version) { build :version, survey: survey }
|
7
6
|
let(:session) { create :session, survey: survey, version: version }
|
@@ -48,5 +47,4 @@ describe Helena::Answer do
|
|
48
47
|
expect(Helena::Answer.build_generic('bla', 'false', '192.168.0.1')).to be_kind_of(Helena::BooleanAnswer)
|
49
48
|
end
|
50
49
|
end
|
51
|
-
|
52
50
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Helena::Label do
|
4
|
-
|
5
4
|
it { expect(subject).to be_embedded_in(:question) }
|
6
|
-
it { expect(subject).to validate_presence_of(:text) }
|
7
5
|
it { expect(subject).to validate_presence_of(:value) }
|
8
6
|
it { expect(subject).to validate_uniqueness_of(:value) }
|
9
7
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Helena::Questions::BipolarRadioMatrix do
|
4
|
+
let!(:version) { create :version, survey: create(:survey) }
|
5
|
+
|
6
|
+
let(:question_group) { build :question_group, version: version }
|
7
|
+
|
8
|
+
it 'has a valid factory' do
|
9
|
+
expect(build :bipolar_radio_matrix_question, question_group: question_group).to be_valid
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'validates uniquness of label preselection' do
|
13
|
+
question = create :bipolar_radio_matrix_question, question_group: question_group
|
14
|
+
question.labels << build(:label, preselected: true)
|
15
|
+
question.labels << build(:label, preselected: true)
|
16
|
+
expect(question).not_to be_valid
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'does not validates uniquness of label preselection for no preselection' do
|
20
|
+
question = create :bipolar_radio_matrix_question, question_group: question_group
|
21
|
+
question.labels << build(:label, preselected: false)
|
22
|
+
question.labels << build(:label, preselected: false)
|
23
|
+
expect(question).to be_valid
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'does not validates uniquness of label preselection for one preselection' do
|
27
|
+
question = create :bipolar_radio_matrix_question, question_group: question_group
|
28
|
+
question.labels << build(:label, preselected: false)
|
29
|
+
question.labels << build(:label, preselected: false)
|
30
|
+
expect(question).to be_valid
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'indicates that it includes sub_questions and labels' do
|
34
|
+
question = build :bipolar_radio_matrix_question, question_group: question_group
|
35
|
+
|
36
|
+
expect(question.includes_subquestions?).to eq true
|
37
|
+
expect(question.includes_labels?).to eq true
|
38
|
+
end
|
39
|
+
end
|
@@ -25,4 +25,22 @@ describe Helena::SubQuestion do
|
|
25
25
|
it 'has a valid factory' do
|
26
26
|
expect(build :sub_question, question: question).to be_valid
|
27
27
|
end
|
28
|
+
|
29
|
+
describe 'splitting the sub_question text with a vertical bar "|" i.e for pair comparisions' do
|
30
|
+
it 'recognize splitted sub questions' do
|
31
|
+
normal_sub_question = build :sub_question, question: question, text: 'just an ordinary subquestion'
|
32
|
+
|
33
|
+
expect(normal_sub_question.splitted?).to be false
|
34
|
+
|
35
|
+
splitted_sub_question = build :sub_question, question: question, text: 'i am|splitted'
|
36
|
+
|
37
|
+
expect(splitted_sub_question.splitted?).to be true
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'returns correct parts' do
|
41
|
+
splitted_sub_question = build :sub_question, question: question, text: 'first|last'
|
42
|
+
|
43
|
+
expect(splitted_sub_question.parts).to eq %w(first last)
|
44
|
+
end
|
45
|
+
end
|
28
46
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: helena
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Graf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 4.0
|
33
|
+
version: '4.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 4.0
|
40
|
+
version: '4.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mongoid_orderable
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: '3.0'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: '3.0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: jquery-rails
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: '5.0'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: '5.0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: bootstrap-sass
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '4.0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: responders
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '2.0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '2.0'
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: rspec-rails
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -302,6 +316,7 @@ files:
|
|
302
316
|
- app/models/helena/label.rb
|
303
317
|
- app/models/helena/question.rb
|
304
318
|
- app/models/helena/question_group.rb
|
319
|
+
- app/models/helena/questions/bipolar_radio_matrix.rb
|
305
320
|
- app/models/helena/questions/checkbox_group.rb
|
306
321
|
- app/models/helena/questions/long_text.rb
|
307
322
|
- app/models/helena/questions/radio_group.rb
|
@@ -314,6 +329,7 @@ files:
|
|
314
329
|
- app/models/helena/survey.rb
|
315
330
|
- app/models/helena/survey_detail.rb
|
316
331
|
- app/models/helena/version.rb
|
332
|
+
- app/views/helena/questions/_bipolar_radio_matrix.html.haml
|
317
333
|
- app/views/helena/questions/_checkbox_group.html.haml
|
318
334
|
- app/views/helena/questions/_long_text.html.haml
|
319
335
|
- app/views/helena/questions/_radio_group.html.haml
|
@@ -401,6 +417,7 @@ files:
|
|
401
417
|
- spec/models/helena/label_spec.rb
|
402
418
|
- spec/models/helena/question_group_spec.rb
|
403
419
|
- spec/models/helena/question_spec.rb
|
420
|
+
- spec/models/helena/questions/bipolar_radio_matrix_spec.rb
|
404
421
|
- spec/models/helena/questions/checkbox_group_spec.rb
|
405
422
|
- spec/models/helena/questions/radio_group_spec.rb
|
406
423
|
- spec/models/helena/questions/radio_matrix_spec.rb
|