surveyor 0.6.1

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 (137) hide show
  1. data/.gitignore +6 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +104 -0
  4. data/Rakefile +50 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/surveyor_controller.rb +117 -0
  7. data/app/helpers/survey_form_builder.rb +37 -0
  8. data/app/helpers/surveyor_helper.rb +66 -0
  9. data/app/models/answer.rb +21 -0
  10. data/app/models/dependency.rb +46 -0
  11. data/app/models/dependency_condition.rb +79 -0
  12. data/app/models/question.rb +54 -0
  13. data/app/models/question_group.rb +18 -0
  14. data/app/models/response.rb +47 -0
  15. data/app/models/response_set.rb +185 -0
  16. data/app/models/survey.rb +57 -0
  17. data/app/models/survey_section.rb +15 -0
  18. data/app/views/layouts/surveyor_default.html.erb +13 -0
  19. data/app/views/partials/_answer.html.haml +49 -0
  20. data/app/views/partials/_question.html.haml +73 -0
  21. data/app/views/partials/_question_group.html.haml +41 -0
  22. data/app/views/surveyor/edit.html.haml +32 -0
  23. data/app/views/surveyor/new.html.haml +17 -0
  24. data/app/views/surveyor/show.html.haml +12 -0
  25. data/config/routes.rb +10 -0
  26. data/generators/surveyor/EXTENDING_SURVEYOR +12 -0
  27. data/generators/surveyor/extend_surveyor_generator.rb +22 -0
  28. data/generators/surveyor/surveyor_generator.rb +60 -0
  29. data/generators/surveyor/templates/README +10 -0
  30. data/generators/surveyor/templates/assets/images/222222_11x11_icon_arrows_leftright.gif +0 -0
  31. data/generators/surveyor/templates/assets/images/222222_11x11_icon_arrows_updown.gif +0 -0
  32. data/generators/surveyor/templates/assets/images/222222_11x11_icon_close.gif +0 -0
  33. data/generators/surveyor/templates/assets/images/222222_11x11_icon_doc.gif +0 -0
  34. data/generators/surveyor/templates/assets/images/222222_11x11_icon_folder_closed.gif +0 -0
  35. data/generators/surveyor/templates/assets/images/222222_11x11_icon_folder_open.gif +0 -0
  36. data/generators/surveyor/templates/assets/images/222222_11x11_icon_minus.gif +0 -0
  37. data/generators/surveyor/templates/assets/images/222222_11x11_icon_plus.gif +0 -0
  38. data/generators/surveyor/templates/assets/images/222222_11x11_icon_resize_se.gif +0 -0
  39. data/generators/surveyor/templates/assets/images/222222_35x9_colorpicker_indicator.gif.gif +0 -0
  40. data/generators/surveyor/templates/assets/images/222222_7x7_arrow_down.gif +0 -0
  41. data/generators/surveyor/templates/assets/images/222222_7x7_arrow_left.gif +0 -0
  42. data/generators/surveyor/templates/assets/images/222222_7x7_arrow_right.gif +0 -0
  43. data/generators/surveyor/templates/assets/images/222222_7x7_arrow_up.gif +0 -0
  44. data/generators/surveyor/templates/assets/images/454545_11x11_icon_arrows_leftright.gif +0 -0
  45. data/generators/surveyor/templates/assets/images/454545_11x11_icon_arrows_updown.gif +0 -0
  46. data/generators/surveyor/templates/assets/images/454545_11x11_icon_close.gif +0 -0
  47. data/generators/surveyor/templates/assets/images/454545_11x11_icon_doc.gif +0 -0
  48. data/generators/surveyor/templates/assets/images/454545_11x11_icon_folder_closed.gif +0 -0
  49. data/generators/surveyor/templates/assets/images/454545_11x11_icon_folder_open.gif +0 -0
  50. data/generators/surveyor/templates/assets/images/454545_11x11_icon_minus.gif +0 -0
  51. data/generators/surveyor/templates/assets/images/454545_11x11_icon_plus.gif +0 -0
  52. data/generators/surveyor/templates/assets/images/454545_7x7_arrow_down.gif +0 -0
  53. data/generators/surveyor/templates/assets/images/454545_7x7_arrow_left.gif +0 -0
  54. data/generators/surveyor/templates/assets/images/454545_7x7_arrow_right.gif +0 -0
  55. data/generators/surveyor/templates/assets/images/454545_7x7_arrow_up.gif +0 -0
  56. data/generators/surveyor/templates/assets/images/888888_11x11_icon_arrows_leftright.gif +0 -0
  57. data/generators/surveyor/templates/assets/images/888888_11x11_icon_arrows_updown.gif +0 -0
  58. data/generators/surveyor/templates/assets/images/888888_11x11_icon_close.gif +0 -0
  59. data/generators/surveyor/templates/assets/images/888888_11x11_icon_doc.gif +0 -0
  60. data/generators/surveyor/templates/assets/images/888888_11x11_icon_folder_closed.gif +0 -0
  61. data/generators/surveyor/templates/assets/images/888888_11x11_icon_folder_open.gif +0 -0
  62. data/generators/surveyor/templates/assets/images/888888_11x11_icon_minus.gif +0 -0
  63. data/generators/surveyor/templates/assets/images/888888_11x11_icon_plus.gif +0 -0
  64. data/generators/surveyor/templates/assets/images/888888_7x7_arrow_down.gif +0 -0
  65. data/generators/surveyor/templates/assets/images/888888_7x7_arrow_left.gif +0 -0
  66. data/generators/surveyor/templates/assets/images/888888_7x7_arrow_right.gif +0 -0
  67. data/generators/surveyor/templates/assets/images/888888_7x7_arrow_up.gif +0 -0
  68. data/generators/surveyor/templates/assets/images/dadada_40x100_textures_02_glass_75.png +0 -0
  69. data/generators/surveyor/templates/assets/images/e6e6e6_40x100_textures_02_glass_75.png +0 -0
  70. data/generators/surveyor/templates/assets/images/ffffff_40x100_textures_01_flat_0.png +0 -0
  71. data/generators/surveyor/templates/assets/images/ffffff_40x100_textures_02_glass_65.png +0 -0
  72. data/generators/surveyor/templates/assets/javascripts/accessibleUISlider.jQuery.js +201 -0
  73. data/generators/surveyor/templates/assets/javascripts/jquery-1.2.6.js +3549 -0
  74. data/generators/surveyor/templates/assets/javascripts/jquery-ui-personalized-1.5.3.js +7616 -0
  75. data/generators/surveyor/templates/assets/javascripts/jquery.form.js +637 -0
  76. data/generators/surveyor/templates/assets/javascripts/surveyor.js +28 -0
  77. data/generators/surveyor/templates/assets/stylesheets/jquery-ui-slider-additions.css +71 -0
  78. data/generators/surveyor/templates/assets/stylesheets/reset.css +46 -0
  79. data/generators/surveyor/templates/assets/stylesheets/sass/surveyor.sass +245 -0
  80. data/generators/surveyor/templates/assets/stylesheets/surveyor.css +231 -0
  81. data/generators/surveyor/templates/assets/stylesheets/ui.theme.css +851 -0
  82. data/generators/surveyor/templates/extensions/survey_extensions.rb +18 -0
  83. data/generators/surveyor/templates/extensions/surveyor_controller_extensions.rb +28 -0
  84. data/generators/surveyor/templates/extensions/surveyor_custom.html.erb +13 -0
  85. data/generators/surveyor/templates/extensions/surveyor_helper_extensions.rb +18 -0
  86. data/generators/surveyor/templates/initializers/haml.rb +8 -0
  87. data/generators/surveyor/templates/initializers/surveyor.rb +11 -0
  88. data/generators/surveyor/templates/migrate/create_answers.rb +45 -0
  89. data/generators/surveyor/templates/migrate/create_dependencies.rb +21 -0
  90. data/generators/surveyor/templates/migrate/create_dependency_conditions.rb +29 -0
  91. data/generators/surveyor/templates/migrate/create_question_groups.rb +18 -0
  92. data/generators/surveyor/templates/migrate/create_questions.rb +33 -0
  93. data/generators/surveyor/templates/migrate/create_response_sets.rb +22 -0
  94. data/generators/surveyor/templates/migrate/create_responses.rb +33 -0
  95. data/generators/surveyor/templates/migrate/create_survey_sections.rb +25 -0
  96. data/generators/surveyor/templates/migrate/create_surveys.rb +25 -0
  97. data/generators/surveyor/templates/surveys/kitchen_sink_survey.rb +201 -0
  98. data/generators/surveyor/templates/tasks/surveyor.rb +4 -0
  99. data/init.rb +1 -0
  100. data/install.rb +1 -0
  101. data/lib/surveyor.rb +7 -0
  102. data/lib/surveyor/config.rb +45 -0
  103. data/lib/tasks/surveyor_tasks.rake +33 -0
  104. data/lib/tiny_code.rb +58 -0
  105. data/lib/xml_formatter.rb +12 -0
  106. data/script/surveyor/answer.rb +84 -0
  107. data/script/surveyor/columnizer.rb +36 -0
  108. data/script/surveyor/dependency.rb +43 -0
  109. data/script/surveyor/dependency_condition.rb +74 -0
  110. data/script/surveyor/question.rb +76 -0
  111. data/script/surveyor/question_group.rb +33 -0
  112. data/script/surveyor/specs/answer_spec.rb +66 -0
  113. data/script/surveyor/specs/question_dependency_spec.rb +46 -0
  114. data/script/surveyor/specs/question_group_spec.rb +9 -0
  115. data/script/surveyor/specs/question_spec.rb +111 -0
  116. data/script/surveyor/specs/section_spec.rb +58 -0
  117. data/script/surveyor/survey.rb +108 -0
  118. data/script/surveyor/survey_parser.rb +64 -0
  119. data/script/surveyor/survey_section.rb +153 -0
  120. data/script/surveyor/whr_dsl.tmproj +244 -0
  121. data/spec/controllers/surveyor_controller_spec.rb +328 -0
  122. data/spec/factories.rb +107 -0
  123. data/spec/models/answer_spec.rb +29 -0
  124. data/spec/models/dependency_condition_spec.rb +338 -0
  125. data/spec/models/dependency_spec.rb +82 -0
  126. data/spec/models/question_group_spec.rb +11 -0
  127. data/spec/models/question_spec.rb +75 -0
  128. data/spec/models/response_set_spec.rb +153 -0
  129. data/spec/models/response_spec.rb +94 -0
  130. data/spec/models/survey_section_spec.rb +34 -0
  131. data/spec/models/survey_spec.rb +72 -0
  132. data/spec/rcov.opts +2 -0
  133. data/spec/spec.opts +4 -0
  134. data/spec/spec_helper.rb +14 -0
  135. data/surveyor.gemspec +187 -0
  136. data/uninstall.rb +1 -0
  137. metadata +211 -0
@@ -0,0 +1,153 @@
1
+ require File.dirname(__FILE__) + '/question_group'
2
+ require File.dirname(__FILE__) + '/question'
3
+ require File.dirname(__FILE__) + '/answer'
4
+ require File.dirname(__FILE__) + '/dependency'
5
+ require File.dirname(__FILE__) + '/dependency_condition'
6
+ require File.dirname(__FILE__) + '/columnizer'
7
+ require 'activesupport'
8
+ #require 'activesupport/lib/active_support/core_ext/string/inflections'
9
+
10
+ class SurveySection
11
+ include Columnizer
12
+
13
+ # Context, Content, Display, Reference, Children, Placeholders
14
+ attr_accessor :id, :survey_id, :parser
15
+ attr_accessor :title, :description
16
+ attr_accessor :display_order
17
+ attr_accessor :reference_identifier, :data_export_identifier
18
+ attr_accessor :question_groups, :questions, :grid_answers
19
+ attr_accessor :current_question_group, :current_question, :current_dependency
20
+
21
+
22
+ # id, survey, and title required
23
+ def initialize(id, survey, title, options = {})
24
+ self.id = id
25
+ self.survey_id = survey.id
26
+ self.parser = survey.parser
27
+ self.title = title.strip
28
+ self.questions = []
29
+ self.question_groups = []
30
+ self.grid_answers = []
31
+ self.current_question_group = nil
32
+ self.current_question = nil
33
+ self.current_dependency = nil
34
+ self.default_options(title).merge(options).each{|key,value| self.instance_variable_set("@#{key}", value)}
35
+ end
36
+
37
+ def default_options(title)
38
+ { :data_export_identifier => Columnizer.to_normalized_column(title)
39
+ }
40
+ end
41
+
42
+ # This method_missing magic does all the heavy lifting for the DSL
43
+ def method_missing(missing_method, *args, &block)
44
+ method_name, reference_identifier = missing_method.to_s.split("_")
45
+
46
+ case method_name
47
+
48
+ when "group", "g", "grid", "repeater"
49
+ puts " Group: #{reference_identifier}"
50
+ raise "Error: A question group cannot be empty" unless block_given?
51
+
52
+ options = {:reference_identifier => reference_identifier, :display_type => (method_name =~ /grid|repeater/)? method_name : nil }
53
+ self.question_groups << (self.current_question_group = QuestionGroup.new(self, args, options))
54
+ self.instance_eval(&block)
55
+ clear_current_question_group
56
+
57
+ when "question", "q", "label", "image"
58
+ puts " Question: #{reference_identifier}"
59
+ raise "Error: I'm dropping the block like it's hot" if block_given?
60
+
61
+ clear_current_question
62
+ options = {:reference_identifier => reference_identifier, :question_group_id => (current_question_group ? current_question_group.id : nil)}
63
+ options.merge!({:display_type => "label"}) if method_name == "label"
64
+ options.merge!({:display_type => "image"}) if method_name == "image"
65
+ self.questions << (self.current_question = Question.new(self, args, options))
66
+ add_grid_answers if self.current_question_group and self.current_question_group.display_type == "grid"
67
+
68
+ when "dependency", "d"
69
+ puts " Dependency: #{reference_identifier}"
70
+ raise "Error: I'm dropping the block like it's hot" if block_given?
71
+ raise "Error: " unless self.current_question
72
+
73
+ options = {:reference_identifier => reference_identifier}
74
+ self.current_question.dependency = (self.current_dependency = Dependency.new(current_question, args, options))
75
+
76
+ when "condition", "c"
77
+ puts " Condition: #{reference_identifier}"
78
+ raise "Error, I'm dropping the block like it's hot" if block_given?
79
+ raise "Error: No current dependency" unless self.current_dependency
80
+
81
+ options = {:reference_identifier => reference_identifier}
82
+ self.current_dependency.add_dependency_condition DependencyCondition.new(self, args, options)
83
+
84
+ when "answer", "a"
85
+ puts " Answer: #{reference_identifier}"
86
+ raise "Error, I'm dropping the block like it's hot" if block_given?
87
+
88
+ if self.current_question_group and self.current_question_group.display_type == "grid"
89
+ options = {:reference_identifier => reference_identifier, :display_order => self.grid_answers.size + 1}
90
+ self.grid_answers << Answer.new(nil, args, options)
91
+ else
92
+ raise "Error: No current question" unless self.current_question
93
+ options = {:reference_identifier => reference_identifier, :display_order => self.current_question.answers.size + 1}
94
+ self.current_question.answers << Answer.new(self.current_question, args, options)
95
+ end
96
+
97
+ else
98
+ raise " ERROR: '#{m_name}' not valid method_missing name"
99
+ end
100
+ end
101
+
102
+ def clear_current_question_group
103
+ self.current_question_group = nil
104
+ self.grid_answers = []
105
+ self.current_question = nil
106
+ end
107
+
108
+ def clear_current_question
109
+ self.current_question = nil
110
+ self.current_dependency = nil
111
+ end
112
+
113
+ def add_grid_answers
114
+ self.grid_answers.each do |grid_answer|
115
+ my_answer = grid_answer.dup
116
+ my_answer.id = self.parser.new_answer_id
117
+ my_answer.question_id = self.current_question.id
118
+ my_answer.parser = self.parser
119
+ self.current_question.answers << my_answer
120
+ end
121
+ end
122
+
123
+ # Used to find questions for dependency linking
124
+ def find_question_by_reference(ref_id)
125
+ question = nil
126
+ count = 0
127
+ while question.nil? and count < questions.size
128
+ question = self.questions[count] if self.questions[count].reference_identifier == ref_id
129
+ count +=1
130
+ end
131
+ question
132
+ end
133
+
134
+
135
+ def to_yml
136
+ out =[ %(#{@data_export_identifier}_#{@id}:) ]
137
+ out << %( id: #{@id})
138
+ out << %( survey_id: #{@survey_id})
139
+ out << %( title: "#{@title}")
140
+ out << %( description: "#{@description}")
141
+ out << %( display_order: #{display_order})
142
+ out << %( reference_identifier: #{@reference_identifier})
143
+ out << %( data_export_identifier: "#{@data_export_identifier}")
144
+ (out << nil ).join("\r\n")
145
+ end
146
+
147
+ def to_file
148
+ File.open(self.parser.survey_sections_yml, File::CREAT|File::APPEND|File::WRONLY) {|f| f << to_yml}
149
+ self.question_groups.compact.map(&:to_file)
150
+ self.questions.compact.map(&:to_file)
151
+ end
152
+
153
+ end
@@ -0,0 +1,244 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>currentDocument</key>
6
+ <string>whrparse.rb</string>
7
+ <key>documents</key>
8
+ <array>
9
+ <dict>
10
+ <key>expanded</key>
11
+ <true/>
12
+ <key>name</key>
13
+ <string>whr_dsl</string>
14
+ <key>regexFolderFilter</key>
15
+ <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
16
+ <key>sourceDirectory</key>
17
+ <string></string>
18
+ </dict>
19
+ </array>
20
+ <key>fileHierarchyDrawerWidth</key>
21
+ <integer>261</integer>
22
+ <key>metaData</key>
23
+ <dict>
24
+ <key>answer.rb</key>
25
+ <dict>
26
+ <key>caret</key>
27
+ <dict>
28
+ <key>column</key>
29
+ <integer>5</integer>
30
+ <key>line</key>
31
+ <integer>54</integer>
32
+ </dict>
33
+ <key>firstVisibleColumn</key>
34
+ <integer>0</integer>
35
+ <key>firstVisibleLine</key>
36
+ <integer>13</integer>
37
+ </dict>
38
+ <key>columnizer.rb</key>
39
+ <dict>
40
+ <key>caret</key>
41
+ <dict>
42
+ <key>column</key>
43
+ <integer>112</integer>
44
+ <key>line</key>
45
+ <integer>3</integer>
46
+ </dict>
47
+ <key>firstVisibleColumn</key>
48
+ <integer>0</integer>
49
+ <key>firstVisibleLine</key>
50
+ <integer>0</integer>
51
+ </dict>
52
+ <key>partials/_checkboxes.rhtml</key>
53
+ <dict>
54
+ <key>caret</key>
55
+ <dict>
56
+ <key>column</key>
57
+ <integer>0</integer>
58
+ <key>line</key>
59
+ <integer>0</integer>
60
+ </dict>
61
+ <key>firstVisibleColumn</key>
62
+ <integer>0</integer>
63
+ <key>firstVisibleLine</key>
64
+ <integer>0</integer>
65
+ </dict>
66
+ <key>partials/_date.rhtml</key>
67
+ <dict>
68
+ <key>caret</key>
69
+ <dict>
70
+ <key>column</key>
71
+ <integer>0</integer>
72
+ <key>line</key>
73
+ <integer>0</integer>
74
+ </dict>
75
+ <key>firstVisibleColumn</key>
76
+ <integer>0</integer>
77
+ <key>firstVisibleLine</key>
78
+ <integer>0</integer>
79
+ </dict>
80
+ <key>question.rb</key>
81
+ <dict>
82
+ <key>caret</key>
83
+ <dict>
84
+ <key>column</key>
85
+ <integer>68</integer>
86
+ <key>line</key>
87
+ <integer>68</integer>
88
+ </dict>
89
+ <key>firstVisibleColumn</key>
90
+ <integer>0</integer>
91
+ <key>firstVisibleLine</key>
92
+ <integer>46</integer>
93
+ </dict>
94
+ <key>registry_code.rb</key>
95
+ <dict>
96
+ <key>caret</key>
97
+ <dict>
98
+ <key>column</key>
99
+ <integer>49</integer>
100
+ <key>line</key>
101
+ <integer>19</integer>
102
+ </dict>
103
+ <key>firstVisibleColumn</key>
104
+ <integer>0</integer>
105
+ <key>firstVisibleLine</key>
106
+ <integer>0</integer>
107
+ </dict>
108
+ <key>section.rb</key>
109
+ <dict>
110
+ <key>caret</key>
111
+ <dict>
112
+ <key>column</key>
113
+ <integer>9</integer>
114
+ <key>line</key>
115
+ <integer>98</integer>
116
+ </dict>
117
+ <key>firstVisibleColumn</key>
118
+ <integer>0</integer>
119
+ <key>firstVisibleLine</key>
120
+ <integer>59</integer>
121
+ </dict>
122
+ <key>section_template.rhtml</key>
123
+ <dict>
124
+ <key>caret</key>
125
+ <dict>
126
+ <key>column</key>
127
+ <integer>134</integer>
128
+ <key>line</key>
129
+ <integer>3</integer>
130
+ </dict>
131
+ <key>firstVisibleColumn</key>
132
+ <integer>0</integer>
133
+ <key>firstVisibleLine</key>
134
+ <integer>0</integer>
135
+ </dict>
136
+ <key>specs/answer_spec.rb</key>
137
+ <dict>
138
+ <key>caret</key>
139
+ <dict>
140
+ <key>column</key>
141
+ <integer>50</integer>
142
+ <key>line</key>
143
+ <integer>24</integer>
144
+ </dict>
145
+ <key>columnSelection</key>
146
+ <false/>
147
+ <key>firstVisibleColumn</key>
148
+ <integer>0</integer>
149
+ <key>firstVisibleLine</key>
150
+ <integer>3</integer>
151
+ <key>selectFrom</key>
152
+ <dict>
153
+ <key>column</key>
154
+ <integer>60</integer>
155
+ <key>line</key>
156
+ <integer>24</integer>
157
+ </dict>
158
+ <key>selectTo</key>
159
+ <dict>
160
+ <key>column</key>
161
+ <integer>50</integer>
162
+ <key>line</key>
163
+ <integer>24</integer>
164
+ </dict>
165
+ </dict>
166
+ <key>specs/question_spec.rb</key>
167
+ <dict>
168
+ <key>caret</key>
169
+ <dict>
170
+ <key>column</key>
171
+ <integer>21</integer>
172
+ <key>line</key>
173
+ <integer>5</integer>
174
+ </dict>
175
+ <key>firstVisibleColumn</key>
176
+ <integer>0</integer>
177
+ <key>firstVisibleLine</key>
178
+ <integer>0</integer>
179
+ </dict>
180
+ <key>specs/section_spec.rb</key>
181
+ <dict>
182
+ <key>caret</key>
183
+ <dict>
184
+ <key>column</key>
185
+ <integer>43</integer>
186
+ <key>line</key>
187
+ <integer>43</integer>
188
+ </dict>
189
+ <key>firstVisibleColumn</key>
190
+ <integer>0</integer>
191
+ <key>firstVisibleLine</key>
192
+ <integer>0</integer>
193
+ </dict>
194
+ <key>specs/whrparse_spec.rb</key>
195
+ <dict>
196
+ <key>caret</key>
197
+ <dict>
198
+ <key>column</key>
199
+ <integer>5</integer>
200
+ <key>line</key>
201
+ <integer>6</integer>
202
+ </dict>
203
+ <key>firstVisibleColumn</key>
204
+ <integer>0</integer>
205
+ <key>firstVisibleLine</key>
206
+ <integer>0</integer>
207
+ </dict>
208
+ <key>whrparse.rb</key>
209
+ <dict>
210
+ <key>caret</key>
211
+ <dict>
212
+ <key>column</key>
213
+ <integer>9</integer>
214
+ <key>line</key>
215
+ <integer>20</integer>
216
+ </dict>
217
+ <key>firstVisibleColumn</key>
218
+ <integer>0</integer>
219
+ <key>firstVisibleLine</key>
220
+ <integer>0</integer>
221
+ </dict>
222
+ </dict>
223
+ <key>openDocuments</key>
224
+ <array>
225
+ <string>registry_code.rb</string>
226
+ <string>whrparse.rb</string>
227
+ <string>specs/answer_spec.rb</string>
228
+ <string>specs/question_spec.rb</string>
229
+ <string>specs/section_spec.rb</string>
230
+ <string>section.rb</string>
231
+ <string>section_template.rhtml</string>
232
+ <string>partials/_date.rhtml</string>
233
+ <string>partials/_checkboxes.rhtml</string>
234
+ <string>columnizer.rb</string>
235
+ <string>specs/whrparse_spec.rb</string>
236
+ <string>question.rb</string>
237
+ <string>answer.rb</string>
238
+ </array>
239
+ <key>showFileHierarchyDrawer</key>
240
+ <true/>
241
+ <key>windowFrame</key>
242
+ <string>{{282, 61}, {1119, 816}}</string>
243
+ </dict>
244
+ </plist>
@@ -0,0 +1,328 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe SurveyorController do
4
+
5
+ # map.available_surveys 'surveys', :conditions => {:method => :get}, :action => "new" # GET survey list
6
+ # map.take_survey 'surveys/:survey_code', :conditions => {:method => :post}, :action => "create" # Only POST of survey to create
7
+ # map.view_my_survey 'surveys/:survey_code/:response_set_code', :conditions => {:method => :get}, :action => "show" # GET viewable/printable? survey
8
+ # map.edit_my_survey 'surveys/:survey_code/:response_set_code/take', :conditions => {:method => :get}, :action => "edit" # GET editable survey
9
+ # map.update_my_survey 'surveys/:survey_code/:response_set_code', :conditions => {:method => :put}, :action => "update" # PUT edited survey
10
+ # map.finish_my_survey 'surveys/:survey_code/:response_set_code/finish', :conditions => {:method => :put}, :action => "finish" # PUT to close out the response_set
11
+
12
+ describe "handling GET /surveys (available_surveys)" do
13
+
14
+ before(:each) do
15
+ @survey = mock_model(Survey)
16
+ Survey.stub!(:find).and_return([@survey])
17
+ end
18
+
19
+ def do_get
20
+ get :new
21
+ end
22
+
23
+ it "should be successful" do
24
+ do_get
25
+ response.should be_success
26
+ end
27
+
28
+ it "should render index template" do
29
+ do_get
30
+ response.should render_template('new')
31
+ end
32
+
33
+ it "should find all surveys" do
34
+ Survey.should_receive(:find).with(:all).and_return([@survey])
35
+ do_get
36
+ end
37
+
38
+ it "should assign the found surveys for the view" do
39
+ do_get
40
+ assigns[:surveys].should == [@survey]
41
+ end
42
+ end
43
+
44
+ describe "handling GET /surveys.xml (available_surveys)" do
45
+ before(:each) do
46
+ @surveys = mock("Array of Surveys", :to_xml => "XML")
47
+ Survey.stub!(:find).and_return(@surveys)
48
+ end
49
+
50
+ def do_get
51
+ @request.env["HTTP_ACCEPT"] = "application/xml"
52
+ get :new
53
+ end
54
+
55
+ it "should be successful" do
56
+ do_get
57
+ response.should be_success
58
+ end
59
+
60
+ it "should find all surveys" do
61
+ Survey.should_receive(:find).with(:all).and_return(@surveys)
62
+ do_get
63
+ end
64
+
65
+ it "should render the found surveys as xml" do
66
+ @surveys.should_receive(:to_xml).and_return("XML")
67
+ do_get
68
+ response.body.should == "XML"
69
+ end
70
+ end
71
+
72
+ describe "handling POST /surveys/XYZ (take_survey)" do
73
+
74
+ before(:each) do
75
+ @survey = mock_model(Survey, :access_code => "XYZ")
76
+ @response_set = mock_model(ResponseSet, :access_code => "PDQ")
77
+ ResponseSet.stub!(:new).and_return(@response_set)
78
+ Survey.stub!(:find_by_access_code).and_return(@survey)
79
+ end
80
+
81
+ describe "with successful save" do
82
+
83
+ def do_post
84
+ @response_set.should_receive(:save!).and_return(true)
85
+ post :create, :survey_code => "XYZ"
86
+ end
87
+
88
+ it "should look for the survey" do
89
+ Survey.should_receive(:find_by_access_code).with("XYZ").and_return(@survey)
90
+ do_post
91
+ end
92
+ it "should create a new response_set" do
93
+ ResponseSet.should_receive(:new).and_return(@response_set)
94
+ do_post
95
+ end
96
+
97
+ it "should redirect to the new response_set" do
98
+ do_post
99
+ response.should redirect_to(edit_my_survey_url(:survey_code => "XYZ", :response_set_code => "PDQ"))
100
+ end
101
+
102
+ end
103
+
104
+ describe "with failed save" do
105
+
106
+ def do_post
107
+ @response_set.should_receive(:save!).and_return(false)
108
+ post :create, :survey_code => "XYZ"
109
+ end
110
+
111
+ it "should re-redirect to 'new'" do
112
+ do_post
113
+ response.should redirect_to(available_surveys_url)
114
+ end
115
+
116
+ end
117
+
118
+ describe "with survey not found" do
119
+
120
+ def do_post
121
+ Survey.should_receive(:find_by_access_code).and_return(nil)
122
+ post :create, :survey_code => "XYZ"
123
+ end
124
+
125
+ it "should re-redirect to 'new'" do
126
+ do_post
127
+ response.should redirect_to(available_surveys_url)
128
+ end
129
+
130
+ end
131
+ end
132
+
133
+ describe "handling GET /surveys/XYZ/PDQ (view_my_survey)" do
134
+
135
+ before(:each) do
136
+ @survey = mock_model(Survey, :access_code => "XYZ", :sections => [mock_model(SurveySection)])
137
+ @response_set = mock_model(ResponseSet, :access_code => "PDQ")
138
+ ResponseSet.stub!(:find_by_access_code).with("PDQ").and_return(@response_set)
139
+ @response_set.stub!(:survey).and_return(@survey)
140
+ end
141
+
142
+ def do_get
143
+ get :show, :survey_code => "XYZ", :response_set_code => "PDQ"
144
+ end
145
+
146
+ it "should be successful" do
147
+ do_get
148
+ response.should be_success
149
+ end
150
+
151
+ it "should render show template" do
152
+ do_get
153
+ response.should render_template('show')
154
+ end
155
+
156
+ it "should find the response_set requested" do
157
+ ResponseSet.should_receive(:find_by_access_code).with("PDQ").and_return(@response_set)
158
+ do_get
159
+ end
160
+
161
+ it "should assign the found response_set and survey for the view" do
162
+ do_get
163
+ assigns[:response_set].should equal(@response_set)
164
+ assigns[:survey].should equal(@survey)
165
+ end
166
+
167
+ it "should redirect if :response_code not found" do
168
+ get :show, :survey_code => "XYZ", :response_set_code => "DIFFERENT"
169
+ response.should redirect_to(available_surveys_url)
170
+ end
171
+
172
+ # I'm not sure this is enterly neccessary since we look up the survey from the response_code in the url -BC
173
+ it "should redirect if :survey_code in url doesn't match response_set.survey.access_code" do
174
+ pending
175
+ get :show, :survey_code => "DIFFERENT", :response_set_code => "PDQ"
176
+ response.should redirect_to(available_surveys_url)
177
+ end
178
+ end
179
+
180
+ describe "handling GET /surveys/XYZ/PDQ/take (edit_my_survey)" do
181
+
182
+ before(:each) do
183
+ @survey = mock_model(Survey, :access_code => "XYZ")
184
+ @survey_section = mock_model(SurveySection)
185
+ @survey.stub!(:sections).and_return([@survey_section])
186
+ @response_set = mock_model(ResponseSet, :access_code => "PDQ")
187
+ ResponseSet.stub!(:find_by_access_code).with("PDQ").and_return(@response_set)
188
+ @response_set.stub!(:survey).and_return(@survey)
189
+ end
190
+
191
+ it "should be successful, render edit with the requested survey" do
192
+ ResponseSet.should_receive(:find_by_access_code).with("PDQ").and_return(@response_set)
193
+
194
+ get :edit, :survey_code => "XYZ", :response_set_code => "PDQ"
195
+ response.should be_success
196
+ response.should render_template('edit')
197
+ assigns[:response_set].should equal(@response_set)
198
+ assigns[:survey].should equal(@survey)
199
+ end
200
+
201
+ it "should redirect if :response_code not found" do
202
+ get :edit, :survey_code => "XYZ", :response_set_code => "DIFFERENT"
203
+ response.should redirect_to(available_surveys_url)
204
+ end
205
+
206
+ end
207
+
208
+ describe "handling PUT /surveys/XYZ/PDQ (update_my_survey)" do
209
+
210
+ before(:each) do
211
+ @survey = mock_model(Survey, :access_code => "XYZ", :sections => [mock_model(SurveySection)])
212
+ @response_set = mock_model(ResponseSet, :access_code => "PDQ")
213
+ ResponseSet.stub!(:find_by_access_code).with("PDQ").and_return(@response_set)
214
+ @response_set.stub!(:survey).and_return(@survey)
215
+ @response_set.stub!(:add_responses).and_return(true)
216
+ end
217
+
218
+ describe "with no response_set in update" do
219
+
220
+ it "should find the response set requested" do
221
+ ResponseSet.should_receive(:find_by_access_code).with("PDQ").and_return(@response_set)
222
+ put :update, :survey_code => "XYZ", :response_set_code => "PDQ"
223
+
224
+ end
225
+
226
+ end
227
+
228
+ describe "with a new response set" do
229
+
230
+ it "should accept properly formatted params and save the data" do
231
+ response_set_params = {"survey_code"=>"XYZ", "response_set"=>{"new_response_attributes"=>{"1"=>[{"answer_id"=>"2"}]}}}
232
+
233
+
234
+ end
235
+
236
+ # describe "issue with posting data to an existing survey and the data not saving properly" do
237
+ # @survey = mock_model(Survey, :access_code => "XYZ")
238
+ # @response_set = mock_model(ResponseSet, :access_code => "PDQ")
239
+ # ResponseSet.stub!(:find_by_access_code).with("PDQ").and_return(@response_set)
240
+ # @response_set.stub!(:survey).and_return(@survey)
241
+ # @response_set.stub!(:complete!).and_return(Time.now)
242
+ #
243
+ #
244
+ # end
245
+
246
+ # first post {"survey_code"=>"test_survey", "commit"=>"Next Section (Utensiles and you!) >>", "response_set"=>{"new_response_attributes"=>{"1"=>[{"answer_id"=>"2"}, {"answer_id"=>"0", "string_value"=>""}], "2"=>[{"answer_id"=>"6"}], "3"=>[{"answer_id"=>"10"}], "4"=>[{"answer_id"=>"14"}], "5"=>[{"answer_id"=>"0"}, {"answer_id"=>"0"}]}, "existing_response_attributes"=>{"6"=>{"1"=>{"answer_id"=>"20", "string_value"=>"B"}}, "7"=>{"2"=>{"text_value"=>"foo", "answer_id"=>"21"}}, "5"=>{"7"=>{"answer_id"=>"17"}, "16"=>{"answer_id"=>"19", "string_value"=>"blah"}}}}, "authenticity_token"=>"d9ba68fe20a46703f3737b5cb0b7e17b7390de32", "_method"=>"put", "action"=>"update", "controller"=>"app", "response_set_code"=>"9VEsec1dK6", "section"=>"2"}
247
+ # second post {"survey_code"=>"test_survey", "commit"=>"Next Section (Utensiles and you!) >>", "response_set"=>{"new_response_attributes"=>{"1"=>[{"answer_id"=>"2"}, {"answer_id"=>"0", "string_value"=>""}], "2"=>[{"answer_id"=>"6"}], "3"=>[{"answer_id"=>"10"}], "4"=>[{"answer_id"=>"14"}], "5"=>[{"answer_id"=>"0"}, {"answer_id"=>"0"}]}, "existing_response_attributes"=>{"6"=>{"1"=>{"answer_id"=>"20", "string_value"=>"B"}}, "7"=>{"2"=>{"text_value"=>"boooo", "answer_id"=>"21"}}, "5"=>{"7"=>{"answer_id"=>"17"}, "16"=>{"answer_id"=>"19", "string_value"=>"blahblahstink"}}}}, "authenticity_token"=>"d9ba68fe20a46703f3737b5cb0b7e17b7390de32", "_method"=>"put", "action"=>"update", "controller"=>"app", "response_set_code"=>"9VEsec1dK6", "section"=>"2"}
248
+
249
+
250
+ end
251
+
252
+
253
+ describe "with failed update" do
254
+
255
+ it "should re-render 'edit'" do
256
+ put :update, :survey_code => "XYZ", :response_set_code => "PDQ"
257
+ response.should be_success
258
+ response.should render_template('edit')
259
+ flash[:notice].should == "Unable to update survey"
260
+ end
261
+
262
+ end
263
+ end
264
+
265
+ describe "handling PUT /surveys/XYZ/PDQ/finish (finish_my_survey)" do
266
+
267
+ before(:each) do
268
+ @survey = mock_model(Survey, :access_code => "XYZ", :sections => [mock_model(SurveySection)])
269
+ @response_set = mock_model(ResponseSet, :access_code => "PDQ")
270
+ ResponseSet.stub!(:find_by_access_code).with("PDQ").and_return(@response_set)
271
+ @response_set.stub!(:survey).and_return(@survey)
272
+ @response_set.stub!(:complete!).and_return(Time.now)
273
+ end
274
+
275
+ describe "with successful update" do
276
+
277
+ def do_put
278
+ put :finish, :survey_code => "XYZ", :response_set_code => "PDQ"
279
+ end
280
+
281
+ it "should find the response_set requested" do
282
+ ResponseSet.should_receive(:find_by_access_code).with("PDQ").and_return(@response_set)
283
+ do_put
284
+ end
285
+
286
+ it "should update the found response set" do
287
+ @response_set.should_receive(:complete!).and_return(Time.now)
288
+ do_put
289
+ end
290
+
291
+ it "should assign the found response set and survey for the view" do
292
+ do_put
293
+ assigns(:response_set).should equal(@response_set)
294
+ assigns(:survey).should equal(@response_set.survey)
295
+ end
296
+
297
+ it "should render the 'edit' template" do
298
+ do_put
299
+ response.should render_template('edit')
300
+ flash[:notice].should == "Completed survey"
301
+ end
302
+
303
+ it "should redirect to available surveys if :response_code not found" do
304
+ put :update, :survey_code => "XYZ", :response_set_code => "DIFFERENT"
305
+ response.should redirect_to(available_surveys_url)
306
+ flash[:notice].should == "Unable to find your responses to the survey"
307
+ end
308
+
309
+ end
310
+
311
+ describe "with failed update" do
312
+
313
+ def do_put
314
+ put :finish, :survey_code => "XYZ", :response_set_code => "PDQ"
315
+ end
316
+
317
+ it "should re-render 'edit'" do
318
+ @response_set.should_receive(:complete!).and_return(false)
319
+ do_put
320
+ response.should render_template('edit')
321
+ flash[:notice].should == "Unable to complete survey"
322
+ end
323
+
324
+ end
325
+ end
326
+
327
+
328
+ end