surveyor 1.3.0 → 1.4.0

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.
Files changed (48) hide show
  1. data/CHANGELOG.md +22 -0
  2. data/Gemfile +1 -1
  3. data/README.md +1 -1
  4. data/Rakefile +4 -1
  5. data/app/views/partials/_answer.html.haml +1 -1
  6. data/app/views/partials/_section_menu.html.haml +8 -1
  7. data/app/views/surveyor/edit.html.haml +1 -1
  8. data/app/views/surveyor/new.html.haml +1 -1
  9. data/app/views/surveyor/show.html.haml +17 -20
  10. data/ci-exec.sh +1 -1
  11. data/config/routes.rb +7 -7
  12. data/features/internationalization.feature +68 -2
  13. data/features/show_survey.feature +29 -0
  14. data/features/step_definitions/parser_steps.rb +15 -0
  15. data/features/step_definitions/surveyor_steps.rb +11 -9
  16. data/features/support/paths.rb +5 -2
  17. data/features/z_redcap_parser.feature +4 -1
  18. data/lib/assets/javascripts/surveyor/jquery.surveyor.js +5 -1
  19. data/lib/assets/stylesheets/surveyor.sass +2 -0
  20. data/lib/generators/surveyor/install_generator.rb +4 -0
  21. data/lib/generators/surveyor/templates/app/controllers/surveyor_controller.rb +2 -2
  22. data/lib/generators/surveyor/templates/config/locales/surveyor_en.yml +1 -0
  23. data/lib/generators/surveyor/templates/config/locales/surveyor_es.yml +1 -0
  24. data/lib/generators/surveyor/templates/config/locales/surveyor_he.yml +1 -0
  25. data/lib/generators/surveyor/templates/config/locales/surveyor_ko.yml +2 -1
  26. data/lib/generators/surveyor/templates/surveys/languages.rb +9 -5
  27. data/lib/generators/surveyor/templates/surveys/translations/languages.es.yml +4 -0
  28. data/lib/generators/surveyor/templates/surveys/translations/languages.he.yml +4 -0
  29. data/lib/generators/surveyor/templates/surveys/translations/languages.ko.yml +4 -0
  30. data/lib/surveyor/helpers/surveyor_helper_methods.rb +1 -1
  31. data/lib/surveyor/models/answer_methods.rb +2 -2
  32. data/lib/surveyor/models/question_methods.rb +3 -3
  33. data/lib/surveyor/models/response_methods.rb +18 -5
  34. data/lib/surveyor/models/response_set_methods.rb +1 -1
  35. data/lib/surveyor/models/survey_methods.rb +2 -2
  36. data/lib/surveyor/models/survey_section_methods.rb +2 -2
  37. data/lib/surveyor/parser.rb +25 -4
  38. data/lib/surveyor/redcap_parser.rb +13 -13
  39. data/lib/surveyor/surveyor_controller_methods.rb +22 -19
  40. data/lib/surveyor/version.rb +1 -1
  41. data/lib/tasks/surveyor_tasks.rake +1 -1
  42. data/spec/controllers/surveyor_controller_spec.rb +155 -269
  43. data/spec/lib/parser_spec.rb +189 -21
  44. data/spec/models/response_set_spec.rb +7 -5
  45. data/spec/spec_helper.rb +3 -1
  46. data/stacktests.sh +1 -1
  47. data/surveyor.gemspec +3 -1
  48. metadata +271 -275
@@ -1,3 +1,3 @@
1
1
  module Surveyor
2
- VERSION = '1.3.0'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -7,7 +7,7 @@ namespace :surveyor do
7
7
  file = File.join(Rails.root, ENV["FILE"])
8
8
  raise "File does not exist: #{file}" unless FileTest.exists?(file)
9
9
  puts "--- Parsing #{file} ---"
10
- Surveyor::Parser.parse(File.read(file), {:trace => Rake.application.options.trace})
10
+ Surveyor::Parser.parse_file(file, {:trace => Rake.application.options.trace})
11
11
  puts "--- Done #{file} ---"
12
12
  end
13
13
  desc "generate and load survey from REDCap Data Dictionary (specify FILE=surveys/redcap.csv)"
@@ -1,345 +1,255 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe SurveyorController do
4
+ include Surveyor::Engine.routes.url_helpers
5
+ before do
6
+ @routes = Surveyor::Engine.routes
7
+ end
8
+
9
+ let!(:survey) { Factory(:survey, :title => "Alphabet", :access_code => "alpha", :survey_version => 0)}
10
+ let!(:survey_beta) { Factory(:survey, :title => "Alphabet", :access_code => "alpha", :survey_version => 1)}
11
+ let!(:response_set) { Factory(:response_set, :survey => survey, :access_code => "pdq")}
12
+ let!(:response_set_beta) { Factory(:response_set, :survey => survey_beta, :access_code => "rst")}
13
+ before { ResponseSet.stub!(:create).and_return(response_set) }
4
14
 
5
- # map.with_options :controller => 'surveyor' do |s|
6
- # s.available_surveys "#{root}", :conditions => {:method => :get}, :action => "new" # GET survey list
7
- # s.take_survey "#{root}:survey_code", :conditions => {:method => :post}, :action => "create" # Only POST of survey to create
8
- # s.view_my_survey "#{root}:survey_code/:response_set_code", :conditions => {:method => :get}, :action => "show" # GET viewable/printable? survey
9
- # s.edit_my_survey "#{root}:survey_code/:response_set_code/take", :conditions => {:method => :get}, :action => "edit" # GET editable survey
10
- # s.update_my_survey "#{root}:survey_code/:response_set_code", :conditions => {:method => :put}, :action => "update" # PUT edited survey
11
- # end
15
+ # match '/', :to => 'surveyor#new', :as => 'available_surveys', :via => :get
16
+ # match '/:survey_code', :to => 'surveyor#create', :as => 'take_survey', :via => :post
17
+ # match '/:survey_code', :to => 'surveyor#export', :as => 'export_survey', :via => :get
18
+ # match '/:survey_code/:response_set_code', :to => 'surveyor#show', :as => 'view_my_survey', :via => :get
19
+ # match '/:survey_code/:response_set_code/take', :to => 'surveyor#edit', :as => 'edit_my_survey', :via => :get
20
+ # match '/:survey_code/:response_set_code', :to => 'surveyor#update', :as => 'update_my_survey', :via => :put
12
21
 
13
- describe "available surveys: GET /surveys" do
22
+ context "#new" do
14
23
  def do_get
15
24
  get :new
16
25
  end
17
-
18
- it "should render index template" do
26
+ it "renders new" do
19
27
  do_get
20
28
  response.should be_success
21
29
  response.should render_template('new')
22
30
  end
23
-
24
- it "assigns surveys_by_access_code to surveys grouped by access_code" do
25
- original = Factory(:survey, :title => "Foo", :access_code => 'foo')
26
- supplant = Factory(:survey, :title => "Foo", :access_code => 'foo', :survey_version => 1)
27
- hash = {"foo"=>[supplant, original]}
31
+ it "assigns surveys_by_access_code" do
28
32
  do_get
29
- assigns(:surveys_by_access_code).should eq hash
33
+ assigns(:surveys_by_access_code).should == {"alpha" => [survey_beta,survey]}
30
34
  end
31
35
  end
32
36
 
33
- describe "take survey: POST /surveys/xyz" do
34
- before(:each) do
35
- @survey = Factory(:survey, :title => "xyz", :access_code => "xyz")
36
- @newsurvey = Factory(:survey, :title => "xyz", :access_code => "xyz", :survey_version => 1)
37
- @response_set = Factory(:response_set, :access_code => "pdq")
38
- ResponseSet.stub!(:create).and_return(@response_set)
37
+ context "#create" do
38
+ def do_post(params = {})
39
+ post :create, {:survey_code => "alpha"}.merge(params)
39
40
  end
40
-
41
- describe "with success" do
42
- def do_post
43
- post :create, :survey_code => "xyz"
44
- end
45
- it "should look for the latest survey_version of the survey if survey_version is not explicitely provided" do
46
- do_post
47
- assigns(:survey).should eq(@newsurvey)
48
- end
49
-
50
- it "should look for the partculer survey_version of the survey if it is provided" do
51
- post :create, :survey_code => "xyz", :survey_version => 0
52
- assigns(:survey).should eq(@survey)
53
- end
54
-
55
- it "should create a new response_set" do
56
- ResponseSet.should_receive(:create).and_return(@response_set)
57
- do_post
58
- end
59
- it "should redirect to the new response_set" do
60
- do_post
61
- response.should redirect_to(
62
- edit_my_survey_url(:survey_code => "xyz", :response_set_code => "pdq"))
63
- end
41
+ it "finds latest version" do
42
+ do_post
43
+ assigns(:survey).should == survey_beta
44
+ end
45
+ it "finds specified survey_version" do
46
+ do_post :survey_version => 0
47
+ assigns(:survey).should == survey
48
+ end
49
+ it "creates a new response_set" do
50
+ ResponseSet.should_receive(:create)
51
+ do_post
52
+ end
53
+ it "should redirects to the new response_set" do
54
+ do_post
55
+ response.should redirect_to( edit_my_survey_path(:survey_code => "alpha", :response_set_code => "pdq"))
64
56
  end
65
57
 
66
- describe "with failures" do
67
- it "should re-redirect to 'new' if ResponseSet failed create" do
58
+ context "with failures" do
59
+ it "redirect to #new on failed ResponseSet#create" do
68
60
  ResponseSet.should_receive(:create).and_return(false)
69
- post :create, :survey_code => "XYZ"
70
- response.should redirect_to(available_surveys_url)
61
+ do_post
62
+ response.should redirect_to(available_surveys_path)
71
63
  end
72
- it "should re-redirect to 'new' if Survey failed find" do
73
- post :create, :survey_code => "ABC"
74
- response.should redirect_to(available_surveys_url)
64
+ it "redirect to #new on failed Survey#find" do
65
+ do_post :survey_code => "missing"
66
+ response.should redirect_to(available_surveys_path)
75
67
  end
76
68
  end
77
69
 
78
- describe "determining if javascript is enabled" do
79
- it "sets the user session to know that javascript is enabled" do
80
- post :create, :survey_code => "xyz", :surveyor_javascript_enabled => "true"
70
+ context "with javascript check, assigned in session" do
71
+ it "enabled" do
72
+ do_post :surveyor_javascript_enabled => "true"
81
73
  session[:surveyor_javascript].should_not be_nil
82
74
  session[:surveyor_javascript].should == "enabled"
83
75
  end
84
-
85
- it "sets the user session to know that javascript is not enabled" do
76
+ it "disabled" do
86
77
  post :create, :survey_code => "xyz", :surveyor_javascript_enabled => "not_true"
87
78
  session[:surveyor_javascript].should_not be_nil
88
79
  session[:surveyor_javascript].should == "not_enabled"
89
80
  end
90
-
91
81
  end
92
-
93
82
  end
94
83
 
95
- describe "view my survey: GET /surveys/xyz/pdq" do
96
- before(:each) do
97
- @survey = Factory(:survey,
98
- :title => "xyz", :access_code => "xyz", :sections => [Factory(:survey_section)])
99
- @response_set = Factory(:response_set, :access_code => "pdq", :survey => @survey)
100
- end
101
-
102
- def do_get
103
- get :show, :survey_code => "xyz", :response_set_code => "pdq"
84
+ context "#show" do
85
+ def do_get(params = {})
86
+ get :show, {:survey_code => "alpha", :response_set_code => "pdq"}.merge(params)
104
87
  end
105
-
106
- it "should be successful" do
88
+ it "renders show" do
107
89
  do_get
108
90
  response.should be_success
109
- end
110
-
111
- it "should render show template" do
112
- do_get
113
91
  response.should render_template('show')
114
92
  end
115
-
116
- it "should find the response_set requested" do
117
- ResponseSet.should_receive(:find_by_access_code).
118
- with("pdq",{:include=>{:responses=>[:question, :answer]}}).and_return(@response_set)
93
+ it "finds ResponseSet with includes" do
94
+ ResponseSet.should_receive(:find_by_access_code).with("pdq",{:include=>{:responses=>[:question, :answer]}})
119
95
  do_get
120
96
  end
121
-
122
- it "should redirect if :response_code not found" do
123
- get :show, :survey_code => "xyz", :response_set_code => "DIFFERENT"
124
- response.should redirect_to(available_surveys_url)
97
+ it "redirects for missing response set" do
98
+ do_get :response_set_code => "DIFFERENT"
99
+ response.should redirect_to(available_surveys_path)
125
100
  end
126
-
127
- it "should render correct survey survey_version" do
128
- supplant = Factory(:survey, :title => "xyz", :access_code => 'xyz', :survey_version => 1)
129
- supplant_section = Factory(:survey_section, :survey => supplant)
130
- supplant_response_set = Factory(:response_set, :access_code => "rst", :survey => supplant)
131
-
132
- get :show, :survey_code => "xyz", :response_set_code => "pdq"
133
- response.should be_success
134
- response.should render_template('show')
135
- assigns[:response_set].should == @response_set
136
- assigns[:survey].should == @survey
137
-
138
- get :show, :survey_code => "xyz", :response_set_code => "rst"
139
- response.should be_success
140
- response.should render_template('show')
141
- assigns[:response_set].should == supplant_response_set
142
- assigns[:survey].should == supplant
101
+ it "assigns earlier survey_version" do
102
+ response_set
103
+ do_get
104
+ assigns[:response_set].should == response_set
105
+ assigns[:survey].should == survey
106
+ end
107
+ it "assigns later survey_version" do
108
+ response_set_beta
109
+ do_get :response_set_code => "rst"
110
+ assigns[:response_set].should == response_set_beta
111
+ assigns[:survey].should == survey_beta
143
112
  end
144
-
145
113
  end
146
114
 
147
- describe "edit my survey: GET /surveys/XYZ/PDQ/take" do
148
- before(:each) do
149
- @survey = Factory(:survey, :title => "XYZ", :access_code => "XYZ")
150
- @section = Factory(:survey_section, :survey => @survey)
151
- @response_set = Factory(:response_set, :access_code => "PDQ", :survey => @survey)
115
+ context "#edit" do
116
+ def do_get(params = {})
117
+ survey.sections = [Factory(:survey_section, :survey => survey)]
118
+ get :edit, {:survey_code => "alpha", :response_set_code => "pdq"}.merge(params)
152
119
  end
153
-
154
- it "should be successful, render edit with the requested survey" do
155
- ResponseSet.should_receive(:find_by_access_code).and_return(@response_set)
156
- get :edit, :survey_code => "XYZ", :response_set_code => "PDQ"
120
+ it "renders edit" do
121
+ do_get
157
122
  response.should be_success
158
123
  response.should render_template('edit')
159
- assigns[:response_set].should == @response_set
160
- assigns[:survey].should == @survey
161
124
  end
162
-
163
- it "should redirect if :response_code not found" do
164
- get :edit, :survey_code => "XYZ", :response_set_code => "DIFFERENT"
165
- response.should redirect_to(available_surveys_url)
125
+ it "assigns survey and response set" do
126
+ do_get
127
+ assigns[:survey].should == survey
128
+ assigns[:response_set].should == response_set
166
129
  end
167
-
168
- it "should only set dependents if javascript is not enabled" do
169
- ResponseSet.should_receive(:find_by_access_code).and_return(@response_set)
170
- controller.stub!(:get_unanswered_dependencies_minus_section_questions).
171
- and_return([Question.new])
172
-
173
- get :edit, :survey_code => "XYZ", :response_set_code => "PDQ"
174
- assigns[:dependents].should_not be_empty
130
+ it "redirects for missing response set" do
131
+ do_get :response_set_code => "DIFFERENT"
132
+ response.should redirect_to(available_surveys_path)
133
+ end
134
+ it "assigns dependents if javascript not enabled" do
135
+ controller.stub!(:get_unanswered_dependencies_minus_section_questions).and_return([Factory(:question)])
175
136
  session[:surveyor_javascript].should be_nil
137
+ do_get
138
+ assigns[:dependents].should_not be_empty
176
139
  end
177
-
178
- it "should not set dependents if javascript is enabled" do
179
- ResponseSet.should_receive(:find_by_access_code).and_return(@response_set)
180
- controller.stub!(:get_unanswered_dependencies_minus_section_questions).
181
- and_return([Question.new])
182
-
140
+ it "does not assign dependents if javascript is enabled" do
141
+ controller.stub!(:get_unanswered_dependencies_minus_section_questions).and_return([Factory(:question)])
183
142
  session[:surveyor_javascript] = "enabled"
184
-
185
- get :edit, :survey_code => "XYZ", :response_set_code => "PDQ"
143
+ do_get
186
144
  assigns[:dependents].should be_empty
187
- session[:surveyor_javascript].should == "enabled"
188
145
  end
146
+ it "assigns earlier survey_version" do
147
+ do_get
148
+ assigns[:response_set].should == response_set
149
+ assigns[:survey].should == survey
150
+ end
151
+ it "assigns later survey_version" do
152
+ survey_beta.sections = [Factory(:survey_section, :survey => survey_beta)]
153
+ do_get :response_set_code => "rst"
154
+ assigns[:survey].should == survey_beta
155
+ assigns[:response_set].should == response_set_beta
189
156
 
190
- it "should render correct survey survey_version" do
191
- supplant = Factory(:survey, :title => "XYZ", :access_code => 'XYZ', :survey_version => 1)
192
- supplant_section = Factory(:survey_section, :survey => supplant)
193
- supplant_response_set = Factory(:response_set, :access_code => "RST", :survey => supplant)
194
-
195
- get :edit, :survey_code => "XYZ", :response_set_code => "PDQ"
196
- response.should be_success
197
- response.should render_template('edit')
198
- assigns[:response_set].should == @response_set
199
- assigns[:survey].should == @survey
200
-
201
- get :edit, :survey_code => "XYZ", :response_set_code => "RST"
202
- response.should be_success
203
- response.should render_template('edit')
204
- assigns[:response_set].should == supplant_response_set
205
- assigns[:survey].should == supplant
206
157
  end
207
158
  end
208
159
 
209
- describe "update my survey: PUT /surveys/XYZ/PDQ" do
210
- let(:survey_code) { 'XYZ' }
211
- let!(:survey) { Factory(:survey, :title => survey_code, :access_code => survey_code) }
212
-
213
- let(:response_set_code) { 'PDQ' }
214
- let!(:response_set) { Factory(:response_set, :access_code => response_set_code, :survey => survey) }
215
-
160
+ context "#update" do
216
161
  let(:responses_ui_hash) { {} }
217
-
218
- let(:params) {
162
+ let(:update_params) {
219
163
  {
220
- :survey_code => survey_code,
221
- :response_set_code => response_set_code,
222
- :r => responses_ui_hash.empty? ? nil : responses_ui_hash
164
+ :survey_code => "alpha",
165
+ :response_set_code => "pdq"
223
166
  }
224
167
  }
225
-
226
- def a_ui_response(hash)
227
- { 'api_id' => 'something' }.merge(hash)
228
- end
229
-
230
- shared_examples 'common update behaviors' do
231
- it "should find the response set requested" do
168
+ shared_examples "#update action" do
169
+ before do
170
+ ResponseSet.stub!(:find_by_access_code).and_return(response_set)
171
+ responses_ui_hash['11'] = {'api_id' => 'something', 'answer_id' => '56', 'question_id' => '9'}
172
+ end
173
+ it "finds a response set" do
232
174
  ResponseSet.should_receive(:find_by_access_code).and_return(response_set)
233
175
  do_put
234
176
  end
235
-
236
- it 'applies any provided responses to the response set' do
237
- ResponseSet.stub!(:find_by_access_code).and_return(response_set)
238
-
239
- responses_ui_hash['11'] = a_ui_response('answer_id' => '56', 'question_id' => '9')
177
+ it "saves responses" do
240
178
  response_set.should_receive(:update_from_ui_hash).with(responses_ui_hash)
241
- do_put
242
- end
243
179
 
244
- it 'does not fail when there are no responses' do
180
+ do_put(:r => responses_ui_hash)
181
+ end
182
+ it "does not fail when there are no responses" do
245
183
  lambda { do_put }.should_not raise_error
246
184
  end
247
-
248
- describe 'when updating the response set produces a exception' do
249
- before do
250
- responses_ui_hash['11'] = a_ui_response('answer_id' => '56', 'question_id' => '9')
251
-
252
- ResponseSet.stub!(:find_by_access_code).and_return(response_set)
253
- end
254
-
185
+ context "with update exceptions" do
255
186
  it 'retries the update on a constraint violation' do
256
- response_set.should_receive(:update_from_ui_hash).ordered.
257
- with(responses_ui_hash).and_raise(ActiveRecord::StatementInvalid)
187
+ response_set.should_receive(:update_from_ui_hash).ordered.with(responses_ui_hash).and_raise(ActiveRecord::StatementInvalid)
258
188
  response_set.should_receive(:update_from_ui_hash).ordered.with(responses_ui_hash)
259
189
 
260
- lambda { do_put }.should_not raise_error
190
+ expect { do_put(:r => responses_ui_hash) }.to_not raise_error
261
191
  end
262
192
 
263
193
  it 'only retries three times' do
264
- response_set.should_receive(:update_from_ui_hash).exactly(3).times.
265
- with(responses_ui_hash).and_raise(ActiveRecord::StatementInvalid)
194
+ response_set.should_receive(:update_from_ui_hash).exactly(3).times.with(responses_ui_hash).and_raise(ActiveRecord::StatementInvalid)
266
195
 
267
- lambda { do_put }.should raise_error(ActiveRecord::StatementInvalid)
196
+ expect { do_put(:r => responses_ui_hash) }.to raise_error(ActiveRecord::StatementInvalid)
268
197
  end
269
198
 
270
199
  it 'does not retry for other errors' do
271
- response_set.should_receive(:update_from_ui_hash).once.
272
- with(responses_ui_hash).and_raise('Bad news')
200
+ response_set.should_receive(:update_from_ui_hash).once.with(responses_ui_hash).and_raise('Bad news')
273
201
 
274
- lambda { do_put }.should raise_error('Bad news')
202
+ expect { do_put(:r => responses_ui_hash) }.to raise_error('Bad news')
275
203
  end
276
204
  end
277
205
  end
278
206
 
279
- describe 'via full cycle form submission' do
280
- def do_put
281
- put :update, params
207
+ context "with form submission" do
208
+ def do_put(extra_params = {})
209
+ put :update, update_params.merge(extra_params)
282
210
  end
283
211
 
284
- include_examples 'common update behaviors'
285
-
286
- it "should redirect to 'edit' without params" do
212
+ it_behaves_like "#update action"
213
+ it "redirects to #edit without params" do
287
214
  do_put
288
- response.should redirect_to(:action => :edit)
215
+ response.should redirect_to(edit_my_survey_path(:survey_code => "alpha", :response_set_code => "pdq"))
289
216
  end
290
-
291
- describe 'on finish' do
292
- before do
293
- params[:finish] = 'finish'
294
- do_put
295
- end
296
-
297
- it "completes the found response set" do
298
- response_set.reload.should be_complete
299
- end
300
-
301
- it 'flashes completion' do
302
- flash[:notice].should == "Completed survey"
303
- end
217
+ it "completes the found response set on finish" do
218
+ do_put :finish => 'finish'
219
+ response_set.reload.should be_complete
304
220
  end
305
-
306
- it "should redirect to available surveys if :response_code not found" do
307
- params[:response_set_code] = "DIFFERENT"
308
- do_put
309
- response.should redirect_to(available_surveys_url)
221
+ it 'flashes completion' do
222
+ do_put :finish => 'finish'
223
+ flash[:notice].should == "Completed survey"
224
+ end
225
+ it "redirects for missing response set" do
226
+ do_put :response_set_code => "DIFFERENT"
227
+ response.should redirect_to(available_surveys_path)
310
228
  flash[:notice].should == "Unable to find your responses to the survey"
311
229
  end
312
230
  end
313
231
 
314
- describe 'via ajax' do
315
- def do_put
316
- xhr :put, :update, params
232
+ context 'with ajax' do
233
+ def do_put(extra_params = {})
234
+ xhr :put, :update, update_params.merge(extra_params)
317
235
  end
318
236
 
319
- include_examples 'common update behaviors'
320
-
321
- it "should return dependencies" do
237
+ it_behaves_like "#update action"
238
+ it "returns dependencies" do
322
239
  ResponseSet.stub!(:find_by_access_code).and_return(response_set)
240
+ response_set.should_receive(:all_dependencies).and_return({"show" => ['q_1'], "hide" => ['q_2']})
323
241
 
324
- response_set.should_receive(:all_dependencies).
325
- and_return({"show" => ['q_1'], "hide" => ['q_2']})
326
-
327
- responses_ui_hash['4'] = a_ui_response("question_id"=>"9", "answer_id"=>"12") # check
328
242
  do_put
329
-
330
- JSON.parse(response.body).
331
- should == {"show" => ['q_1'], "hide" => ["q_2"]}
243
+ JSON.parse(response.body).should == {"show" => ['q_1'], "hide" => ["q_2"]}
332
244
  end
333
-
334
- it '404s if the response set does not exist' do
335
- params[:response_set_code] = 'ELSE'
336
- do_put
245
+ it "returns 404 for missing response set" do
246
+ do_put :response_set_code => "DIFFERENT"
337
247
  response.status.should == 404
338
248
  end
339
249
  end
340
250
  end
341
251
 
342
- describe "serialize a survey: GET /surveys/XYZ.json" do
252
+ context "#export" do
343
253
  render_views
344
254
 
345
255
  let(:json) {
@@ -347,7 +257,7 @@ describe SurveyorController do
347
257
  JSON.parse(response.body)
348
258
  }
349
259
 
350
- describe 'for the same question inside and outside a question group' do
260
+ context "question inside and outside a question group" do
351
261
  def question_text(refid)
352
262
  <<-SURVEY
353
263
  q "Where is a foo?", :pick => :one, :help_text => 'Look around.', :reference_identifier => #{refid.inspect},
@@ -360,7 +270,6 @@ describe SurveyorController do
360
270
  condition_R :q_bar, "==", :a_1
361
271
  SURVEY
362
272
  end
363
-
364
273
  let(:survey_text) {
365
274
  <<-SURVEY
366
275
  survey 'xyz' do
@@ -378,42 +287,19 @@ describe SurveyorController do
378
287
  end
379
288
  SURVEY
380
289
  }
381
-
382
- let(:survey) {
383
- Surveyor::Parser.new.parse(survey_text)
384
- }
385
-
290
+ let(:survey) { Surveyor::Parser.new.parse(survey_text) }
386
291
  let(:solo_question_json) { json['sections'][0]['questions_and_groups'][1] }
387
292
  let(:grouped_question_json) { json['sections'][0]['questions_and_groups'][2]['questions'][0] }
388
293
 
389
- def remove_key_recursively(node, key)
390
- case node
391
- when Hash
392
- node.delete(key)
393
- node.values.each { |val| remove_key_recursively(val, key) }
394
- when Array
395
- node.each { |val| remove_key_recursively(val, key) }
396
- end
294
+ it "produces identical JSON except for API IDs and question reference identifers" do
295
+ solo_question_json['answers'].to_json.should be_json_eql( grouped_question_json['answers'].to_json).excluding("uuid", "reference_identifier")
296
+ solo_question_json['dependency'].to_json.should be_json_eql( grouped_question_json['dependency'].to_json).excluding("uuid", "reference_identifier")
297
+ solo_question_json.to_json.should be_json_eql( grouped_question_json.to_json).excluding("uuid", "reference_identifier")
397
298
  end
398
-
399
- it 'produces identical JSON except for API IDs and question reference identifers' do
400
- [solo_question_json, grouped_question_json].each do |node|
401
- node.reject! { |k, v| k == 'reference_identifier' }
402
- remove_key_recursively(node, 'uuid')
403
- end
404
-
405
- # easier to see differences this way
406
- solo_question_json['answers'].should == grouped_question_json['answers']
407
- solo_question_json['dependency'].should == grouped_question_json['dependency']
408
-
409
- solo_question_json.should == grouped_question_json
410
- end
411
-
412
- it 'produces the expected reference identifier for the solo question' do
299
+ it "produces the expected reference identifier for the solo question" do
413
300
  solo_question_json['reference_identifier'].should == 'foo_solo'
414
301
  end
415
-
416
- it 'produces the expected reference identifer for the question in the group' do
302
+ it "produces the expected reference identifer for the question in the group" do
417
303
  grouped_question_json['reference_identifier'].should == 'foo_grouped'
418
304
  end
419
305
  end