surveyor 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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