surveyor_gui 0.0.3

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 (283) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +44 -0
  3. data/.travis.yml +17 -0
  4. data/Gemfile +7 -0
  5. data/LICENSE +21 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +159 -0
  8. data/Rakefile +66 -0
  9. data/app/controllers/answers_controller.rb +3 -0
  10. data/app/controllers/application_controller.rb +3 -0
  11. data/app/controllers/dependencys_controller.rb +286 -0
  12. data/app/controllers/question_groups_controller.rb +84 -0
  13. data/app/controllers/questions_controller.rb +187 -0
  14. data/app/controllers/survey_sections_controller.rb +80 -0
  15. data/app/controllers/surveyforms_controller.rb +4 -0
  16. data/app/controllers/surveyor_controller.rb +89 -0
  17. data/app/controllers/surveyor_gui/reports_controller.rb +339 -0
  18. data/app/controllers/surveyor_gui/responses_controller.rb +39 -0
  19. data/app/controllers/surveyor_gui/survey_controller.rb +16 -0
  20. data/app/facades/report_formatter.rb +44 -0
  21. data/app/facades/report_preview_wrapper.rb +11 -0
  22. data/app/facades/report_response_generator.rb +147 -0
  23. data/app/helpers/application_helper.rb +2 -0
  24. data/app/helpers/dependency_helper.rb +5 -0
  25. data/app/helpers/question_helper.rb +22 -0
  26. data/app/helpers/surveyform_helper.rb +179 -0
  27. data/app/helpers/surveyor_gui/report_helper.rb +19 -0
  28. data/app/helpers/surveyor_helper.rb +4 -0
  29. data/app/inputs/currency_input.rb +5 -0
  30. data/app/inputs/date_picker_input.rb +7 -0
  31. data/app/inputs/datetime_picker_input.rb +5 -0
  32. data/app/inputs/percent_input.rb +5 -0
  33. data/app/inputs/time_picker_input.rb +5 -0
  34. data/app/mailers/.gitkeep +0 -0
  35. data/app/models/.gitkeep +0 -0
  36. data/app/models/answer.rb +4 -0
  37. data/app/models/column.rb +3 -0
  38. data/app/models/dependency.rb +4 -0
  39. data/app/models/dependency_condition.rb +4 -0
  40. data/app/models/permitted_params_decorator.rb +80 -0
  41. data/app/models/question.rb +4 -0
  42. data/app/models/question_group.rb +4 -0
  43. data/app/models/question_type.rb +7 -0
  44. data/app/models/response.rb +4 -0
  45. data/app/models/response_set.rb +4 -0
  46. data/app/models/row.rb +3 -0
  47. data/app/models/survey.rb +4 -0
  48. data/app/models/survey_section.rb +4 -0
  49. data/app/models/surveyform.rb +103 -0
  50. data/app/uploaders/blob_uploader.rb +48 -0
  51. data/app/views/dependencys/_column.html.erb +1 -0
  52. data/app/views/dependencys/_dependency.html.erb +22 -0
  53. data/app/views/dependencys/_dependency_condition_fields.html.erb +48 -0
  54. data/app/views/dependencys/_form.html.erb +20 -0
  55. data/app/views/dependencys/blank.html.erb +0 -0
  56. data/app/views/dependencys/edit.html.erb +1 -0
  57. data/app/views/dependencys/new.html.erb +1 -0
  58. data/app/views/layouts/application.html.erb +14 -0
  59. data/app/views/layouts/surveyor_gui_blank.html.erb +12 -0
  60. data/app/views/layouts/surveyor_gui_default.html.erb +16 -0
  61. data/app/views/layouts/surveyor_modified.html.erb +14 -0
  62. data/app/views/partials/_answer.html.haml +33 -0
  63. data/app/views/partials/_question.html.haml +33 -0
  64. data/app/views/partials/_question_group.html.haml +73 -0
  65. data/app/views/partials/_section.html.haml +13 -0
  66. data/app/views/question_groups/_form.html.erb +56 -0
  67. data/app/views/question_groups/_group_inline_field.html.erb +21 -0
  68. data/app/views/question_groups/_group_inline_fields.html.erb +25 -0
  69. data/app/views/question_groups/blank.html.erb +0 -0
  70. data/app/views/question_groups/edit.html.erb +1 -0
  71. data/app/views/question_groups/new.html.erb +1 -0
  72. data/app/views/questions/_answer_fields.html.erb +23 -0
  73. data/app/views/questions/_answer_options.html.erb +28 -0
  74. data/app/views/questions/_form.html.erb +65 -0
  75. data/app/views/questions/_grid_dropdown_columns.html.erb +10 -0
  76. data/app/views/questions/_grid_dropdown_fields.html.erb +42 -0
  77. data/app/views/questions/_grid_fields.html.erb +9 -0
  78. data/app/views/questions/_no_picks.html.erb +29 -0
  79. data/app/views/questions/_pick.html +21 -0
  80. data/app/views/questions/_picks.html.erb +12 -0
  81. data/app/views/questions/blank.html.erb +0 -0
  82. data/app/views/questions/edit.html.erb +1 -0
  83. data/app/views/questions/new.html.erb +1 -0
  84. data/app/views/survey_sections/_form.html.erb +13 -0
  85. data/app/views/survey_sections/blank.html.erb +0 -0
  86. data/app/views/survey_sections/edit.html.erb +1 -0
  87. data/app/views/survey_sections/new.html.erb +1 -0
  88. data/app/views/surveyforms/_form.html.erb +50 -0
  89. data/app/views/surveyforms/_question_field.html.erb +148 -0
  90. data/app/views/surveyforms/_question_group.html.erb +116 -0
  91. data/app/views/surveyforms/_question_group_fields.html.erb +3 -0
  92. data/app/views/surveyforms/_question_name_and_number.html.erb +6 -0
  93. data/app/views/surveyforms/_question_section.html.erb +15 -0
  94. data/app/views/surveyforms/_question_wrapper.html.erb +109 -0
  95. data/app/views/surveyforms/_survey_section_fields.html.erb +138 -0
  96. data/app/views/surveyforms/clone_survey.html.erb +13 -0
  97. data/app/views/surveyforms/edit.html.erb +5 -0
  98. data/app/views/surveyforms/index.html.erb +40 -0
  99. data/app/views/surveyforms/new.html.erb +1 -0
  100. data/app/views/surveyforms/show.html.erb +5 -0
  101. data/app/views/surveyor_gui/reports/_graphs.html.haml +21 -0
  102. data/app/views/surveyor_gui/reports/_grid.html.haml +42 -0
  103. data/app/views/surveyor_gui/reports/_grid_dropdown.html.haml +56 -0
  104. data/app/views/surveyor_gui/reports/_repeater.html.haml +28 -0
  105. data/app/views/surveyor_gui/reports/_show_report.html.haml +33 -0
  106. data/app/views/surveyor_gui/reports/_single_question.html.haml +70 -0
  107. data/app/views/surveyor_gui/reports/show.html.erb +14 -0
  108. data/app/views/surveyor_gui/responses/_grid.html.haml +20 -0
  109. data/app/views/surveyor_gui/responses/_grid_dropdown.html.haml +20 -0
  110. data/app/views/surveyor_gui/responses/_repeater.html.haml +22 -0
  111. data/app/views/surveyor_gui/responses/_survey_results.html.haml +40 -0
  112. data/app/views/surveyor_gui/responses/index.html.haml +24 -0
  113. data/app/views/surveyor_gui/responses/show.html.haml +42 -0
  114. data/app/views/surveyor_gui/shared/_grid_comments.html.haml +10 -0
  115. data/app/views/surveyor_gui/shared/_new_line.html.haml +2 -0
  116. data/app/views/surveyor_gui/shared/_pick_comments.html.haml +15 -0
  117. data/app/views/surveyor_gui/shared/_question_number.html.haml +9 -0
  118. data/app/views/surveyor_gui/shared/_report_data.html.haml +24 -0
  119. data/app/views/surveyor_gui/shared/_stars_report_data.html.haml +14 -0
  120. data/config.ru +4 -0
  121. data/config/environment.rb +0 -0
  122. data/config/routes.rb +71 -0
  123. data/db/migrate/20140307204049_add_template_to_surveys.rb +5 -0
  124. data/db/migrate/20140307235607_add_test_data_to_response_sets.rb +5 -0
  125. data/db/migrate/20140308171947_add_original_choice_to_answers.rb +5 -0
  126. data/db/migrate/20140308172118_add_blob_to_responses.rb +5 -0
  127. data/db/migrate/20140308172417_add_modifiable_to_survey_section.rb +5 -0
  128. data/db/migrate/20140308174532_add_modifiable_to_question.rb +5 -0
  129. data/db/migrate/20140308175305_add_dynamically_generate_to_questions.rb +5 -0
  130. data/db/migrate/20140311032923_add_dummy_blob_to_questions.rb +5 -0
  131. data/db/migrate/20140311160609_add_dynamic_source_to_questions.rb +5 -0
  132. data/db/migrate/20140311161714_add_report_code_to_questions.rb +5 -0
  133. data/db/migrate/20140530181134_add_is_comment_to_questions.rb +5 -0
  134. data/db/migrate/20140531012006_add_is_comment_to_answers.rb +5 -0
  135. data/db/migrate/20140531225529_create_rows.rb +9 -0
  136. data/db/migrate/20140601011151_create_columns.rb +11 -0
  137. data/db/migrate/20140602030330_add_column_id_to_answers.rb +5 -0
  138. data/db/migrate/20140603155606_add_column_id_to_responses.rb +5 -0
  139. data/db/migrate/20140606023527_add_column_id_to_dependency_conditions.rb +5 -0
  140. data/db/migrate/20140815165307_add_user_id_to_survey.rb +5 -0
  141. data/lib/assets/.gitkeep +0 -0
  142. data/lib/assets/images/addicon.png +0 -0
  143. data/lib/assets/images/datepicker.gif +0 -0
  144. data/lib/assets/images/delete.gif +0 -0
  145. data/lib/assets/images/delete.png +0 -0
  146. data/lib/assets/images/images/border.png +0 -0
  147. data/lib/assets/images/images/controls.png +0 -0
  148. data/lib/assets/images/images/loading.gif +0 -0
  149. data/lib/assets/images/images/loading_background.png +0 -0
  150. data/lib/assets/images/images/overlay.png +0 -0
  151. data/lib/assets/images/rails.png +0 -0
  152. data/lib/assets/images/star.gif +0 -0
  153. data/lib/assets/javascripts/.gitkeep +0 -0
  154. data/lib/assets/javascripts/surveyor_gui/jquery.MetaData.js +121 -0
  155. data/lib/assets/javascripts/surveyor_gui/jquery.blockUI.js +619 -0
  156. data/lib/assets/javascripts/surveyor_gui/jquery.rating.js +377 -0
  157. data/lib/assets/javascripts/surveyor_gui/jquery.validate.js +1188 -0
  158. data/lib/assets/javascripts/surveyor_gui/surveyor_add_ons.js +10 -0
  159. data/lib/assets/javascripts/surveyor_gui/surveyor_gui.js +1417 -0
  160. data/lib/assets/stylesheets/.gitkeep +0 -0
  161. data/lib/assets/stylesheets/surveyor_gui/jquery.rating.css +12 -0
  162. data/lib/assets/stylesheets/surveyor_gui/surveyor_add_ons.css +3 -0
  163. data/lib/assets/stylesheets/surveyor_gui/surveyor_gui.sass +650 -0
  164. data/lib/enumerable_extenders.rb +31 -0
  165. data/lib/generators/surveyor_gui/install_generator.rb +57 -0
  166. data/lib/generators/surveyor_gui/templates/app/assets/javascripts/surveyor_add_ons.js +2 -0
  167. data/lib/generators/surveyor_gui/templates/app/assets/javascripts/surveyor_gui_all.js +24 -0
  168. data/lib/generators/surveyor_gui/templates/app/assets/stylesheets/surveyor_add_ons.css.sass +1 -0
  169. data/lib/generators/surveyor_gui/templates/app/assets/stylesheets/surveyor_gui_all.css.sass +8 -0
  170. data/lib/generators/surveyor_gui/templates/app/helpers/surveyor_helper.rb +4 -0
  171. data/lib/generators/surveyor_gui/templates/app/models/response_set_user.rb +13 -0
  172. data/lib/generators/surveyor_gui/templates/app/views/layouts/surveyor_gui_default.html.erb +16 -0
  173. data/lib/generators/surveyor_gui/templates/config/initializers/simple_form.rb +140 -0
  174. data/lib/generators/surveyor_gui/templates/config/locales/en.yml +5 -0
  175. data/lib/surveyor_gui.rb +17 -0
  176. data/lib/surveyor_gui/engine.rb +30 -0
  177. data/lib/surveyor_gui/helpers/surveyor_helper_methods.rb +19 -0
  178. data/lib/surveyor_gui/models/answer_methods.rb +24 -0
  179. data/lib/surveyor_gui/models/column_methods.rb +43 -0
  180. data/lib/surveyor_gui/models/dependency_condition_methods.rb +53 -0
  181. data/lib/surveyor_gui/models/dependency_methods.rb +83 -0
  182. data/lib/surveyor_gui/models/question_and_group_shared_methods.rb +11 -0
  183. data/lib/surveyor_gui/models/question_group_methods.rb +55 -0
  184. data/lib/surveyor_gui/models/question_methods.rb +435 -0
  185. data/lib/surveyor_gui/models/question_type_methods.rb +493 -0
  186. data/lib/surveyor_gui/models/response_methods.rb +67 -0
  187. data/lib/surveyor_gui/models/response_set_methods.rb +54 -0
  188. data/lib/surveyor_gui/models/row_methods.rb +11 -0
  189. data/lib/surveyor_gui/models/survey_methods.rb +32 -0
  190. data/lib/surveyor_gui/models/survey_section_methods.rb +32 -0
  191. data/lib/surveyor_gui/surveyforms_controller_methods.rb +258 -0
  192. data/lib/surveyor_gui/version.rb +3 -0
  193. data/lib/tasks/.gitkeep +0 -0
  194. data/lib/tasks/surveyor_gui_tasks.rake +4 -0
  195. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  196. data/spec/controllers/surveyforms_controller_spec.rb +361 -0
  197. data/spec/controllers/surveyor_controller_spec.rb +303 -0
  198. data/spec/factories.rb +181 -0
  199. data/spec/features/create_survey_spec.rb +418 -0
  200. data/spec/features/dependencies_spec.rb +61 -0
  201. data/spec/features/rearrange_survey_spec.rb +118 -0
  202. data/spec/features/ui_spec.rb +469 -0
  203. data/spec/fixtures/REDCapDemoDatabase_DataDictionary.csv +127 -0
  204. data/spec/fixtures/chinese_survey.rb +14 -0
  205. data/spec/fixtures/everything.rb +215 -0
  206. data/spec/fixtures/favorites-ish.rb +22 -0
  207. data/spec/fixtures/favorites.rb +22 -0
  208. data/spec/fixtures/feelings.rb +38 -0
  209. data/spec/fixtures/lifestyle.rb +55 -0
  210. data/spec/fixtures/numbers.rb +21 -0
  211. data/spec/fixtures/redcap_new_headers.csv +1 -0
  212. data/spec/fixtures/redcap_siblings.csv +1 -0
  213. data/spec/fixtures/redcap_whitespace.csv +1 -0
  214. data/spec/helpers/formtastic_custom_input_spec.rb +15 -0
  215. data/spec/helpers/surveyor_helper_spec.rb +116 -0
  216. data/spec/lib/common_spec.rb +37 -0
  217. data/spec/lib/parser_spec.rb +393 -0
  218. data/spec/lib/rake_kitchen_sink.rb +42 -0
  219. data/spec/lib/redcap_parser_spec.rb +129 -0
  220. data/spec/lib/unparser_spec.rb +126 -0
  221. data/spec/models/answer_spec.rb +144 -0
  222. data/spec/models/dependency_condition_spec.rb +428 -0
  223. data/spec/models/dependency_spec.rb +90 -0
  224. data/spec/models/question_group_spec.rb +66 -0
  225. data/spec/models/question_spec.rb +176 -0
  226. data/spec/models/response_set_spec.rb +452 -0
  227. data/spec/models/response_spec.rb +208 -0
  228. data/spec/models/survey_section_spec.rb +58 -0
  229. data/spec/models/survey_spec.rb +155 -0
  230. data/spec/models/surveyor_gui/question_spec.rb +60 -0
  231. data/spec/models/surveyor_gui/question_type_spec.rb +268 -0
  232. data/spec/models/validation_condition_spec.rb +98 -0
  233. data/spec/models/validation_spec.rb +64 -0
  234. data/spec/spec.opts +4 -0
  235. data/spec/spec_helper.rb +119 -0
  236. data/spec/support/scenario_outline_helper.rb +39 -0
  237. data/spec/support/shared.rb +10 -0
  238. data/spec/support/surveyforms_creation_helpers.rb +312 -0
  239. data/spec/support/surveyforms_rearrangement_helpers.rb +170 -0
  240. data/spec/support/surveyor_api_helpers.rb +15 -0
  241. data/spec/support/surveyor_ui_helpers.rb +108 -0
  242. data/spec/support/wait_for_ajax.rb +11 -0
  243. data/spec/views/questions/edit.html.erb_spec.rb +73 -0
  244. data/spec/views/surveyforms/edit.html.erb_spec.rb +126 -0
  245. data/surveyor_gui.gemspec +52 -0
  246. data/test/dummy/README.rdoc +261 -0
  247. data/test/dummy/Rakefile +7 -0
  248. data/test/dummy/app/assets/javascripts/application.js +15 -0
  249. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  250. data/test/dummy/app/controllers/application_controller.rb +3 -0
  251. data/test/dummy/app/helpers/application_helper.rb +2 -0
  252. data/test/dummy/app/mailers/.gitkeep +0 -0
  253. data/test/dummy/app/models/.gitkeep +0 -0
  254. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  255. data/test/dummy/config.ru +4 -0
  256. data/test/dummy/config/application.rb +59 -0
  257. data/test/dummy/config/boot.rb +10 -0
  258. data/test/dummy/config/database.yml +25 -0
  259. data/test/dummy/config/environment.rb +5 -0
  260. data/test/dummy/config/environments/development.rb +37 -0
  261. data/test/dummy/config/environments/production.rb +67 -0
  262. data/test/dummy/config/environments/test.rb +37 -0
  263. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  264. data/test/dummy/config/initializers/inflections.rb +15 -0
  265. data/test/dummy/config/initializers/mime_types.rb +5 -0
  266. data/test/dummy/config/initializers/secret_token.rb +7 -0
  267. data/test/dummy/config/initializers/session_store.rb +8 -0
  268. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  269. data/test/dummy/config/locales/en.yml +5 -0
  270. data/test/dummy/config/routes.rb +58 -0
  271. data/test/dummy/lib/assets/.gitkeep +0 -0
  272. data/test/dummy/log/.gitkeep +0 -0
  273. data/test/dummy/public/404.html +26 -0
  274. data/test/dummy/public/422.html +26 -0
  275. data/test/dummy/public/500.html +25 -0
  276. data/test/dummy/public/favicon.ico +0 -0
  277. data/test/dummy/script/rails +6 -0
  278. data/test/surveyor-gui_test.rb +7 -0
  279. data/test/test_helper.rb +15 -0
  280. data/vendor/assets/stylesheets/.gitkeep +0 -0
  281. data/vendor/assets/stylesheets/custom.sass +5 -0
  282. data/vendor/plugins/.gitkeep +0 -0
  283. metadata +664 -0
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+ #from spec/support/surveyforms_helpers.rb
3
+ include SurveyFormsCreationHelpers::CreateSurvey
4
+ include SurveyFormsCreationHelpers::BuildASurvey
5
+
6
+ feature "User creates a dependency using browser", %q{
7
+ As a user
8
+ I want to create logic on questions
9
+ So that I can display one question depending on the answer to another} do
10
+
11
+ let!(:survey){FactoryGirl.create(:survey, title: "Hotel ratings")}
12
+ let!(:survey_section){FactoryGirl.create(:survey_section, survey: survey)}
13
+ let!(:question1) {FactoryGirl.create(:question, survey_section: survey_section, text: "Rate the service")}
14
+ let!(:answer1) {FactoryGirl.create(:answer, question: question1, text: "yes", display_type: "default", response_class: "answer")}
15
+ let!(:answer2) {FactoryGirl.create(:answer, question: question1, text: "no", display_type: "default", response_class: "answer")}
16
+ let!(:question2) {FactoryGirl.create(:question, survey_section: survey_section, text: "Who was your concierge?")}
17
+ let!(:answer2) {FactoryGirl.create(:answer, question: question2)}
18
+ before :each do
19
+ question1.pick = "one"
20
+ question1.save!
21
+ question1.reload
22
+ end
23
+
24
+ scenario "user creates a dependency", js: true do
25
+ #Given I have a survey with two questions
26
+ visit surveyforms_path
27
+ expect(page).to have_content("Hotel ratings")
28
+ within "tr", text: "Hotel ratings" do
29
+ click_link "Edit"
30
+ end
31
+ expect(page).to have_content("Rate the service")
32
+ #And I click Add Logic on the second question
33
+ within "fieldset.questions", text: "Who was your concierge" do
34
+ click_button "Add Logic"
35
+ end
36
+ #Then I see a window pop-up
37
+ expect(page).to have_css('iframe')
38
+ within_frame 0 do
39
+ #And it has logic, which defaults to checking the first question for the answer "yes"
40
+ expect(page).to have_content("conditions")
41
+ click_button "Save Changes"
42
+ end
43
+ #Then I see that this survey has been updated to include a dependency
44
+ expect(page).to have_content("This question is shown depending on the answer to question 1).")
45
+ visit surveyor_path
46
+ expect(page).to have_content("You may take these surveys")
47
+ within "li", text: "Hotel ratings" do
48
+ #And I take the newly created survey
49
+ click_button "Take it"
50
+ end
51
+ expect(page).to have_content("Hotel ratings")
52
+ expect(page).to have_content("Rate the service")
53
+ expect(page).to have_css('input[type="radio"][value="'+answer1.id.to_s+'"]')
54
+ #Then I don't see the second question just yet
55
+ expect(page).not_to have_content("Who was your concierge?")
56
+ #When I click yes as the answer to the first question
57
+ choose "yes"
58
+ #Then the second question magically appears
59
+ expect(page).to have_content("Who was your concierge?")
60
+ end
61
+ end
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ #from spec/support/surveyforms_helpers.rb
4
+ include SurveyFormsCreationHelpers::CreateSurvey
5
+ include SurveyFormsCreationHelpers::BuildASurvey
6
+
7
+ feature "Survey Creator rearranges survey", %q{
8
+ As a Survey Creator
9
+ I want to rearrange a survey
10
+ So that I can change my mind if I don't like the order of sections and questions} do
11
+
12
+ #force a cr/lf to make the output look better
13
+ scenario " " do
14
+ end
15
+ context "Survey creator rearranges questions", :js=>true do
16
+ before :each do
17
+ build_a_three_question_survey
18
+ end
19
+
20
+ #include helpers to simulate Cucumber type Scenario Outline.
21
+ #Found in spec/support/surveyforms_rearrangement_helpers.rb
22
+ include_context "question_cut_and_paste"
23
+
24
+ #Given that my survey has unique questions 1, 2, and 3 in order
25
+ #When I cut <from_item> and paste it <over_under> <to_item>
26
+ #Then I see questions in the correct <order>
27
+ #|from_item | over_under | to_item | order|
28
+ #|2 | over | 1 | 213 |
29
+ #|2 | over | 3 | 123 |
30
+ #|2 | under | 1 | 123 |
31
+ #|2 | under | 3 | 132 |
32
+ #|1 | over | 2 | 312 |
33
+ #|1 | over | 3 | 132 |
34
+ #|1 | under | 2 | 321 |
35
+ #|1 | under | 3 | 312 |
36
+ #|3 | over | 1 | 312 |
37
+ #|3 | over | 2 | 132 |
38
+ #|3 | under | 1 | 132 |
39
+ #|3 | under | 2 | 123 |
40
+
41
+ scenario "Survey Creator cuts and pastes questions" do
42
+ run_scenario
43
+ end
44
+ end
45
+
46
+ context "Survey creator rearranges sections", :js=>true do
47
+ before :each do
48
+ build_a_three_section_survey
49
+ end
50
+
51
+ #include helpers to simulate Cucumber type Scenario Outline.
52
+ #Found in spec/support/surveyforms_rearrangement_helpers.rb
53
+ include_context "section_cut_and_paste"
54
+
55
+ #Given that my survey has unique sections 1, 2, and 3 in order
56
+ #When I cut <from_item> and paste it <over_under> <to_item>
57
+ #Then I see sections in the correct <order> per same table as used for questions
58
+ scenario "Survey Creator cuts and pastes sections" do
59
+ run_scenario
60
+ end
61
+ end
62
+
63
+ context "Survey creator rearranges questions and sections together", :js=>true do
64
+ before :each do
65
+ build_a_survey
66
+ end
67
+
68
+ include_context "question_and_section_cut_and_paste"
69
+ scenario "Survey Creator cuts and pastes questions and sections" do
70
+ #Given that my survey has questions in the wrong sections
71
+ #and sections in the wrong order:
72
+ puts """
73
+ started with this survey:
74
+ Accommodations:
75
+ Describe your day at Fenway Park.
76
+ Entertainment:
77
+ Describe your room.
78
+ Food: """
79
+ expect(page).to have_content(Regexp.new(
80
+ """
81
+ Accommodations.*
82
+ Describe your day at Fenway Park\..*
83
+ Entertainment.*
84
+ Describe your room\..*
85
+ Food
86
+ """.gsub(/\n\s*/,"").strip
87
+ ))
88
+
89
+ #When I move questions to the appropriate sections
90
+ cut_question("Describe your day at Fenway Park.")
91
+ paste_question("over", "Describe your room.")
92
+ cut_question("Describe your room.")
93
+ paste_question("under", "How many days did you stay?")
94
+
95
+ #And I arrange sections in the appropriate order
96
+ cut_section("Accommodations")
97
+ paste_section("under", "Food")
98
+
99
+ #Then the survey is organized correctly:
100
+ puts """
101
+ ended with this survey:
102
+ Entertainment:
103
+ Describe your day at Fenway Park.
104
+ Food:
105
+ Accommodations:
106
+ Describe your room. """
107
+ expect(page).to have_content(Regexp.new(
108
+ """
109
+ Entertainment.*
110
+ Describe your day at Fenway Park\..*
111
+ Food.*
112
+ Accommodations.*
113
+ Describe your room\.
114
+ """.gsub(/\n\s*/,"").strip
115
+ ))
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,469 @@
1
+ require 'spec_helper'
2
+
3
+ describe "ui interactions" do
4
+ context "saves responses" do
5
+ include_context "everything"
6
+ it "radio button" do
7
+ response_set = start_survey('Everything')
8
+ expect(page).to have_content("What is your favorite color?")
9
+ within question("1") do
10
+ choose "red"
11
+ choose "blue"
12
+ end
13
+ click_button "Next section"
14
+ expect(response_set.count).to eq(1)
15
+ end
16
+ it "dropdown" do
17
+ response_set = start_survey('Everything')
18
+ expect(page).to have_content("What color is the sky right now?")
19
+ within question("3") do
20
+ select "sunset red", from: "What color is the sky right now?"
21
+ end
22
+ click_button "Next section"
23
+ expect(response_set.count).to eq(1)
24
+ expect(response_set.for("3", "sr").count).to eq(1)
25
+ click_button "Previous section"
26
+ within question("3") do
27
+ select "night black", from: "What color is the sky right now?"
28
+ end
29
+ click_button "Next section"
30
+ expect(response_set.count).to eq(1)
31
+ expect(response_set.for("3", "nb").count).to eq(1)
32
+ end
33
+ it "check and uncheck checkboxes" do
34
+ response_set = start_survey('Everything')
35
+ expect(page).to have_content("What color is the sky right now?")
36
+ check "orange"
37
+ click_button "Next section"
38
+ expect(response_set.count).to eq(1)
39
+ click_button "Previous section"
40
+ uncheck "orange"
41
+ click_button "Next section"
42
+ expect(response_set.count).to eq(0)
43
+ end
44
+ it "string" do
45
+ response_set = start_survey('Everything')
46
+ expect(page).to have_content("What is the best color for a fire engine?")
47
+ within question("fire_engine") do
48
+ fill_in "Color", with: "red"
49
+ end
50
+ click_button "Next section"
51
+ expect(response_set.count).to eq(1)
52
+ expect(response_set.for("fire_engine", "color").first.string_value).to eq("red")
53
+ end
54
+ it "free text" do
55
+ response_set = start_survey('Everything')
56
+ expect(page).to have_content("Please compose a poem about a color")
57
+ within question("color_poem") do
58
+ fill_in "Poem", with: "green, nature's color, you're not easy, but that's why you're worth it"
59
+ end
60
+ click_button "Next section"
61
+ expect(response_set.count).to eq(1)
62
+ expect(response_set.for("color_poem", "poem_text").first.text_value).to eq("green, nature's color, you're not easy, but that's why you're worth it")
63
+ end
64
+ it "date" do
65
+ response_set = start_survey('Everything')
66
+ expect(page).to have_content("When is the next color run?")
67
+ within question("color_run_date") do
68
+ fill_in "On", with: "2014-06-08"
69
+ end
70
+ click_button "Next section"
71
+ expect(response_set.count).to eq(1)
72
+ expect(response_set.for("color_run_date", "date").first.date_value).to eq("2014-06-08")
73
+ end
74
+ it "time" do
75
+ response_set = start_survey('Everything')
76
+ expect(page).to have_content("What time does it start?")
77
+ within question("color_run_time") do
78
+ fill_in "At", with: "1:30am"
79
+ end
80
+ click_button "Next section"
81
+ expect(response_set.count).to eq(1)
82
+ expect(response_set.for("color_run_time", "time").first.time_value).to eq("01:30")
83
+ end
84
+ it "datetime" do
85
+ response_set = start_survey('Everything')
86
+ expect(page).to have_content("When is your next hair color appointment?")
87
+ within question("hair_appointment") do
88
+ fill_in "At", with: "2014-06-08 17:00:00"
89
+ end
90
+ click_button "Next section"
91
+ expect(response_set.count).to eq(1)
92
+ expect(response_set.for("hair_appointment", "datetime").first.datetime_value).to eq(Time.zone.parse("2014-06-08 17:00:00"))
93
+ end
94
+ it "radio button with date" do
95
+ pending "better selectors"
96
+ # Issue 207 - Create separate fields for date and time
97
+ response_set = start_survey('Everything')
98
+ expect(page).to have_content("What is your birth date?")
99
+ within question("birth_date") do
100
+ choose "I was born on"
101
+ fill_in "I was born on", with: "2000-01-01"
102
+ end
103
+ click_button "Next section"
104
+ expect(response_set.count).to eq(1)
105
+ expect(response_set.for("birth_date", "date").first.date_value).to eq("2000-01-01")
106
+ end
107
+ it "checkbox with date" do
108
+ pending "better selectors"
109
+ # Issue 207 - Create separate fields for date and time
110
+ response_set = start_survey('Everything')
111
+ expect(page).to have_content("What is your birth date?")
112
+ within question("birth_time") do
113
+ choose "I was born at"
114
+ fill_in "I was born at", with: "12:01am"
115
+ end
116
+ click_button "Next section"
117
+ expect(response_set.count).to eq(1)
118
+ expect(response_set.for("birth_time", "time").first.date_value).to eq("00:01")
119
+ end
120
+ it "slider" do
121
+ pending "move slider programmatically"
122
+ end
123
+ end
124
+ context "saves group responses" do
125
+ include_context "everything"
126
+ it "grid" do
127
+ response_set = start_survey('Everything')
128
+ click_button "Groups"
129
+ expect(page).to have_content("How interested are you in the following?")
130
+ within( grid_row("weddings")){ choose "interested" }
131
+ click_button "Next section"
132
+ expect(response_set.count).to eq(1)
133
+ end
134
+ it "repeater, repeater with a dropdown" do
135
+ pending "investigate failure later"
136
+ response_set = start_survey('Everything')
137
+ click_button "Groups"
138
+ expect(page).to have_content("Tell us about your family")
139
+ within group("family") do
140
+ select "Parent", from: "Relation"
141
+ fill_in "Name", with: "Mom"
142
+ fill_in "Quality of your relationship", with: "great"
143
+ end
144
+ click_button "Next section"
145
+ click_button "Previous section"
146
+ within group("family") do
147
+ within( question("relation", 1)){ select "Parent", from: "Relation" }
148
+ within( question("name", 1)){ fill_in "Name", with: "Dad" }
149
+ within( question("quality", 1)){ fill_in "Quality of your relationship", with: "great" }
150
+ end
151
+ click_button "Next section"
152
+ expect(response_set.count).to eq(6)
153
+ end
154
+ it "group with a dropdown" do
155
+ # Issue 251 - Dropdowns inside of group display as radio buttons
156
+ response_set = start_survey('Everything')
157
+ click_button "Groups"
158
+ expect(page).to have_content("Drop it like it's hot")
159
+ within group("drop_it") do
160
+ select "It", from: "What to drop"
161
+ end
162
+ click_button "Next section"
163
+ expect(response_set.count).to eq(1)
164
+ end
165
+ it "group with labels" do
166
+ response_set = start_survey('Everything')
167
+ click_button "Groups"
168
+ expect(page).to have_content("Drop it like it's hot")
169
+ within group("drop_it") do
170
+ expect(page).to have_content("Like Snoop Dogg said")
171
+ end
172
+ end
173
+ end
174
+ context "dependencies" do
175
+ include_context "everything"
176
+ it "double letter rule keys" do
177
+ # for a dependency - try this with "lifestyle"
178
+ end
179
+ it "simple" do
180
+ end
181
+ it "inside a group" do
182
+ response_set = start_survey('Everything')
183
+ click_button "Dependencies"
184
+ expect(page).to have_hidden_question('who')
185
+ expect(page).to have_hidden_question('weird')
186
+ within question("anybody") do
187
+ choose "Yes"
188
+ end
189
+ click_button "Next section"
190
+ click_button "Previous section"
191
+ expect(page).to_not have_hidden_question('who')
192
+ expect(page).to have_hidden_question('weird')
193
+ within question("anybody") do
194
+ choose "No"
195
+ end
196
+ click_button "Next section"
197
+ click_button "Previous section"
198
+ expect(page).to have_hidden_question('who')
199
+ expect(page).to_not have_hidden_question('weird')
200
+
201
+ end
202
+ it "groups" do
203
+ response_set = start_survey('Everything')
204
+ click_button "Dependencies"
205
+ expect(page).to have_hidden_group('anybody_no')
206
+ within question("anybody") do
207
+ choose "No"
208
+ end
209
+ click_button "Next section"
210
+ click_button "Previous section"
211
+ expect(page).to_not have_hidden_group('anybody_no')
212
+ end
213
+ it "on question in dependent group" do
214
+ response_set = start_survey('Everything')
215
+ click_button "Dependencies"
216
+ expect(page).to have_hidden_question('feels_like_it')
217
+ within question("anybody") do
218
+ choose "No"
219
+ end
220
+ click_button "Next section"
221
+ click_button "Previous section"
222
+ expect(page).to have_hidden_question('feels_like_it')
223
+ within question("who_talking") do
224
+ choose "Are you nuts?"
225
+ end
226
+ click_button "Next section"
227
+ click_button "Previous section"
228
+ expect(page).to_not have_hidden_question('feels_like_it')
229
+ end
230
+ it "!= without responses" do
231
+ # Issue 337 answer != condition returns false if question was never activated
232
+ response_set = start_survey('Everything')
233
+ click_button "Dependencies"
234
+ expect(page).to have_content("How do you cool your home?")
235
+ expect(page).to_not have_hidden_question('cooling_2')
236
+ expect(page).to have_content("How much does it cost to run your non-passive cooling solutions?")
237
+ within question("cooling_1") do
238
+ choose "Passive"
239
+ end
240
+ click_button "Next section"
241
+ click_button "Previous section"
242
+ expect(page).to have_hidden_question('cooling_2')
243
+ end
244
+ it "!= without responses, count>0" do
245
+ # Issue 337 answer != condition returns false if question was never activated
246
+ response_set = start_survey('Everything')
247
+ click_button "Dependencies"
248
+ expect(page).to have_content("How do you heat your home?")
249
+ expect(page).to have_hidden_question('heating_2')
250
+ expect(page).to have_content("How much does it cost to run your non-passive heating solutions?")
251
+ within question("heating_1") do
252
+ check "Oven"
253
+ end
254
+ click_button "Next section"
255
+ click_button "Previous section"
256
+ expect(page).to_not have_hidden_question('heating_2')
257
+ end
258
+ it "count== dependencies" do
259
+ response_set = start_survey('Everything')
260
+ click_button "Dependencies"
261
+ expect(page).to have_content("How many times do you count a day")
262
+ expect(page).to have_hidden_question('counts_good')
263
+ expect(page).to have_hidden_question('counts_twice')
264
+
265
+ within question("counts") do
266
+ check "Once for me"
267
+ end
268
+ click_button "Next section"
269
+ click_button "Previous section"
270
+ expect(page).to_not have_hidden_question('counts_good')
271
+ expect(page).to have_hidden_question('counts_twice')
272
+
273
+ within question("counts") do
274
+ check "Once for you"
275
+ end
276
+ click_button "Next section"
277
+ click_button "Previous section"
278
+ expect(page).to have_hidden_question('counts_good')
279
+ expect(page).to_not have_hidden_question('counts_twice')
280
+ end
281
+ it "when the last response is removed" do
282
+ response_set = start_survey('Everything')
283
+ click_button "Dependencies"
284
+ expect(page).to have_content("How do you heat your home?")
285
+ expect(page).to have_hidden_question('heating_3')
286
+
287
+ within question("heating_1") do
288
+ check "Forced air"
289
+ end
290
+ click_button "Next section"
291
+ click_button "Previous section"
292
+ expect(page).to_not have_hidden_question('heating_3')
293
+
294
+ within question("heating_1") do
295
+ uncheck "Forced air"
296
+ end
297
+ click_button "Next section"
298
+ click_button "Previous section"
299
+ expect(page).to have_hidden_question('heating_3')
300
+ end
301
+ it "on checkboxes" do
302
+ response_set = start_survey('Everything')
303
+ click_button "Dependencies"
304
+ expect(page).to have_content("How many times do you count a day")
305
+ expect(page).to have_hidden_question('thanks_counting')
306
+ expect(page).to have_hidden_question('yay_everyone')
307
+ within question("counts") do
308
+ check "Once for me"
309
+ end
310
+ click_button "Next section"
311
+ click_button "Previous section"
312
+ expect(page).to_not have_hidden_question('thanks_counting')
313
+ expect(page).to have_hidden_question('yay_everyone')
314
+
315
+ within question("counts") do
316
+ check "Once for you"
317
+ end
318
+ click_button "Next section"
319
+ click_button "Previous section"
320
+ expect(page).to_not have_hidden_question('thanks_counting')
321
+ expect(page).to have_hidden_question('yay_everyone')
322
+
323
+ within question("counts") do
324
+ check "Once for everyone"
325
+ end
326
+ click_button "Next section"
327
+ click_button "Previous section"
328
+ expect(page).to_not have_hidden_question('thanks_counting')
329
+ expect(page).to_not have_hidden_question('yay_everyone')
330
+ end
331
+ end
332
+ context "special features" do
333
+ include_context "everything"
334
+ it "help text" do
335
+ response_set = start_survey('Everything')
336
+ click_button "Special"
337
+ within question("favorite_food") do
338
+ expect(page).to have_css("span.help", text: "just say beef")
339
+ end
340
+ end
341
+ it "images" do
342
+ response_set = start_survey('Everything')
343
+ click_button "Special"
344
+ within question("which_way") do
345
+ expect(page).to have_css('img[src^="/assets/surveyor/next.gif"]')
346
+ expect(page).to have_css('img[src^="/assets/surveyor/prev.gif"]')
347
+ end
348
+ end
349
+ it "custom css class" do
350
+ response_set = start_survey('Everything')
351
+ click_button "Special"
352
+ expect(page).to have_css("fieldset.q_default.hidden")
353
+ end
354
+ it "default answer" do
355
+ response_set = start_survey('Everything')
356
+ click_button "Special"
357
+ click_button "Click here to finish"
358
+ expect(response_set.count).to eq(1)
359
+ expect(response_set.for("favorite_food", "food").first.string_value).to eq("beef")
360
+ end
361
+ it "hidden questions" do
362
+ # Issue 197 - Add a hidden field type
363
+ # does not appear in DOM, does not receive question numering
364
+ response_set = start_survey('Everything')
365
+ click_button "Special"
366
+ expect(page).to_not have_content("What is your name?")
367
+ expect(page).to_not have_content("Friends")
368
+ expect(page).to_not have_content("Who are your friends?")
369
+ # custom class "hidden" does nothing unless you add your own css to hide it
370
+ expect(page).to have_content("5) What is your favorite number?")
371
+ end
372
+ it "customizing numbering" do
373
+ override_surveyor_helper_numbering
374
+ response_set = start_survey('Everything')
375
+ expect(page).to have_content("A. What is your favorite color?")
376
+ expect(page).to have_content("B. Choose the colors you don't like")
377
+ expect(page).to have_content("C. What color is the sky right now?")
378
+ expect(page).to have_content("D. What is the best color for a fire engine?")
379
+ expect(page).to have_content("E. What was the last room you painted, and what color?")
380
+ restore_surveyor_helper_numbering
381
+ end
382
+ it "mustache syntax" do
383
+ # Issue 259 - substitution of the text with Mustache
384
+ SurveyorController.send(:include, mustache_context_module(name: "Santa", thing: "beards"))
385
+ response_set = start_survey('Everything')
386
+ click_button "Special"
387
+ expect(page).to have_content("Regarding Santa")
388
+ expect(page).to have_content("Answer all you know about Santa")
389
+ expect(page).to have_content("Where does Santa live?")
390
+ expect(page).to have_content("If you don't know where Santa lives, skip the question")
391
+ expect(page).to have_content("Santa lives on North Pole")
392
+ expect(page).to have_content("Santa lives on South Pole")
393
+ expect(page).to have_content("Santa doesn't exist")
394
+ expect(page).to have_content("Now think about beards")
395
+ expect(page).to have_content("Yes, beards")
396
+ end
397
+ it "mustache with simple hash context" do
398
+ # Issue 296 - Mustache rendering doesn't work with simple hash contexts
399
+ SurveyorController.send(:include, hash_context_module({name: "Father Christmas", thing: "reindeer"}))
400
+ response_set = start_survey('Everything')
401
+ click_button "Special"
402
+ expect(page).to have_content("Regarding Father Christmas")
403
+ expect(page).to have_content("Answer all you know about Father Christmas")
404
+ expect(page).to have_content("Where does Father Christmas live?")
405
+ expect(page).to have_content("If you don't know where Father Christmas lives, skip the question")
406
+ expect(page).to have_content("Father Christmas lives on North Pole")
407
+ expect(page).to have_content("Father Christmas lives on South Pole")
408
+ expect(page).to have_content("Father Christmas doesn't exist")
409
+ expect(page).to have_content("Now think about reindeer")
410
+ expect(page).to have_content("Yes, reindeer")
411
+ end
412
+ end
413
+ context "versioning" do
414
+ include_context "favorites"
415
+ include_context "favorites-ish"
416
+ it "takes current survey" do
417
+ pending "only show one form for multiple versions"
418
+ response_set = start_survey('Favorites')
419
+ expect(page).to have_content("What is your favorite color?")
420
+ expect(page).to have_content("redish")
421
+ choose "blueish"
422
+ choose "redish"
423
+ click_button "Next section"
424
+ click_button "Click here to finish"
425
+ expect(response_set.count).to eq(1)
426
+ end
427
+ it "takes previous survey" do
428
+ pending "only show one form for multiple versions"
429
+ response_set = start_survey('Favorites', version: '0')
430
+ expect(page).to have_content("What is your favorite color?")
431
+ expect(page).to have_content("red")
432
+ choose "red"
433
+ choose "blue"
434
+ click_button "Next section"
435
+ click_button "Click here to finish"
436
+ expect(response_set.count).to eq(1)
437
+ end
438
+ end
439
+ context "shows responses" do
440
+ include_context "favorites"
441
+ include_context "feelings"
442
+ it "takes a survey, then shows it" do
443
+ response_set = start_survey('Favorites')
444
+ expect(page).to have_content("What is your favorite color?")
445
+ choose "red"
446
+ choose "blue"
447
+ check "orange"
448
+ check "brown"
449
+ click_button "Next section"
450
+ click_button "Click here to finish"
451
+ visit("/surveys/favorites/#{response_set.access_code}/")
452
+ expect(page).to have_disabled_selected_radio("blue")
453
+ expect(page).to have_disabled_selected_checkbox("orange")
454
+ expect(page).to have_disabled_selected_checkbox("brown")
455
+ end
456
+ it "takes a survey with grid questions, then shows it" do
457
+ response_set = start_survey('Feelings')
458
+ expect(page).to have_content("Tell us how you feel today")
459
+ within grid_row "anxious|calm" do
460
+ choose "-1"
461
+ end
462
+ click_button "Click here to finish"
463
+ visit("/surveys/favorites/#{response_set.access_code}/")
464
+ within grid_row "anxious|calm" do
465
+ expect(page).to have_disabled_selected_radio("-1")
466
+ end
467
+ end
468
+ end
469
+ end