fe 0.0.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +4 -4
  3. data/Rakefile +16 -36
  4. data/app/assets/config/fe/manifest.js +3 -0
  5. data/app/assets/config/manifest.js +3 -0
  6. data/app/assets/javascripts/application.js.erb +1 -1
  7. data/app/assets/javascripts/fe/admin.js +0 -2
  8. data/app/assets/javascripts/fe/fe.admin.js +40 -20
  9. data/app/assets/javascripts/fe/fe.common.js.erb +98 -0
  10. data/app/assets/javascripts/fe/fe.public.js +2 -416
  11. data/app/assets/javascripts/fe/fe.public.nojquery.js.erb +526 -0
  12. data/app/assets/javascripts/fe/jquery.html5_upload.js +258 -0
  13. data/app/assets/javascripts/fe/jquery.validate.pack.js +3 -15
  14. data/app/assets/stylesheets/fe/fe.screen.css.scss.erb +90 -10
  15. data/app/assets/stylesheets/fe/validation.css +5 -1
  16. data/app/controllers/concerns/fe/admin/question_sheets_controller_concern.rb +111 -0
  17. data/app/controllers/concerns/fe/answer_pages_controller_concern.rb +131 -0
  18. data/app/controllers/{fe/concerns → concerns/fe}/answer_sheets_controller_concern.rb +15 -7
  19. data/app/controllers/{fe/concerns → concerns/fe}/application_controller_concern.rb +15 -2
  20. data/app/controllers/fe/admin/elements_controller.rb +102 -64
  21. data/app/controllers/fe/admin/email_templates_controller.rb +7 -7
  22. data/app/controllers/fe/admin/question_pages_controller.rb +9 -9
  23. data/app/controllers/fe/admin/question_sheets_controller.rb +2 -103
  24. data/app/controllers/fe/reference_pages_controller.rb +11 -11
  25. data/app/controllers/fe/reference_sheets_controller.rb +6 -4
  26. data/app/controllers/fe/references_controller.rb +20 -19
  27. data/app/controllers/fe/submit_pages_controller.rb +5 -5
  28. data/app/helpers/fe/answer_pages_helper.rb +1 -1
  29. data/app/helpers/fe/application_helper.rb +8 -3
  30. data/app/jobs/fe/update_reference_sheet_visibility_job.rb +11 -0
  31. data/app/mailers/fe/notifier.rb +12 -5
  32. data/app/models/answer_sheet.rb +2 -0
  33. data/app/models/application_record.rb +3 -0
  34. data/app/models/{fe/concerns → concerns/fe}/answer_concern.rb +2 -2
  35. data/app/models/{fe/concerns → concerns/fe}/answer_pages_presenter_concern.rb +15 -5
  36. data/app/models/concerns/fe/answer_sheet_concern.rb +125 -0
  37. data/app/models/{fe/concerns → concerns/fe}/choice_field_concern.rb +56 -31
  38. data/app/models/fe/address.rb +2 -2
  39. data/app/models/fe/answer.rb +1 -1
  40. data/app/models/fe/answer_sheet.rb +1 -1
  41. data/app/models/fe/answer_sheet_question_sheet.rb +2 -2
  42. data/app/models/fe/application.rb +15 -10
  43. data/app/models/fe/condition.rb +4 -4
  44. data/app/models/fe/date_field.rb +2 -2
  45. data/app/models/fe/element.rb +201 -45
  46. data/app/models/fe/email_address.rb +2 -2
  47. data/app/models/fe/email_template.rb +1 -1
  48. data/app/models/fe/page.rb +138 -31
  49. data/app/models/fe/page_element.rb +8 -3
  50. data/app/models/fe/page_link.rb +6 -3
  51. data/app/models/fe/paragraph.rb +1 -1
  52. data/app/models/fe/person.rb +16 -13
  53. data/app/models/fe/phone_number.rb +1 -1
  54. data/app/models/fe/question.rb +64 -44
  55. data/app/models/fe/question_grid.rb +16 -4
  56. data/app/models/fe/question_grid_with_total.rb +15 -0
  57. data/app/models/fe/question_set.rb +54 -14
  58. data/app/models/fe/question_sheet.rb +54 -19
  59. data/app/models/fe/reference_question.rb +9 -13
  60. data/app/models/fe/reference_sheet.rb +113 -54
  61. data/app/models/fe/state_chooser.rb +2 -2
  62. data/app/models/fe/text_field.rb +2 -2
  63. data/app/models/fe/user.rb +1 -1
  64. data/app/models/staff.rb +8 -6
  65. data/app/validators/email_validator.rb +11 -0
  66. data/app/views/fe/admin/elements/create.js.erb +4 -3
  67. data/app/views/fe/admin/elements/destroy.js.erb +1 -1
  68. data/app/views/fe/admin/elements/drop.js.erb +2 -1
  69. data/app/views/fe/admin/elements/duplicate.js.erb +2 -1
  70. data/app/views/fe/admin/elements/edit.js.erb +1 -1
  71. data/app/views/fe/admin/elements/error.js.erb +1 -1
  72. data/app/views/fe/admin/elements/new.js.erb +13 -6
  73. data/app/views/fe/admin/elements/update.js.erb +1 -1
  74. data/app/views/fe/admin/email_templates/_form.html.erb +3 -3
  75. data/app/views/fe/admin/email_templates/edit.html.erb +3 -3
  76. data/app/views/fe/admin/email_templates/index.html.erb +3 -3
  77. data/app/views/fe/admin/email_templates/new.html.erb +3 -3
  78. data/app/views/fe/admin/panels/_advanced_options.html.erb +16 -10
  79. data/app/views/fe/admin/panels/_common_boolean_fields.html.erb +1 -0
  80. data/app/views/fe/admin/panels/_common_boolean_fields_default.html.erb +11 -0
  81. data/app/views/fe/admin/panels/_common_fields.html.erb +18 -19
  82. data/app/views/fe/admin/panels/_condition.html.erb +1 -1
  83. data/app/views/fe/admin/panels/_insert.html.erb +25 -25
  84. data/app/views/fe/admin/panels/_nav_controls.html.erb +4 -4
  85. data/app/views/fe/admin/panels/_page.html.erb +2 -2
  86. data/app/views/fe/admin/panels/_pages_list.html.erb +3 -3
  87. data/app/views/fe/admin/panels/_prop_attachment_field.html.erb +2 -2
  88. data/app/views/fe/admin/panels/_prop_choice_field.html.erb +52 -24
  89. data/app/views/fe/admin/panels/_prop_date_field.html.erb +1 -1
  90. data/app/views/fe/admin/panels/_prop_element.html.erb +7 -14
  91. data/app/views/fe/admin/panels/_prop_page.html.erb +11 -6
  92. data/app/views/fe/admin/panels/_prop_paragraph.html.erb +38 -24
  93. data/app/views/fe/admin/panels/_prop_question_grid.html.erb +7 -2
  94. data/app/views/fe/admin/panels/_prop_question_grid_with_total.html.erb +2 -2
  95. data/app/views/fe/admin/panels/_prop_reference_question.html.erb +3 -3
  96. data/app/views/fe/admin/panels/_prop_section.html.erb +8 -2
  97. data/app/views/fe/admin/panels/_prop_sheet.html.erb +7 -4
  98. data/app/views/fe/admin/panels/_prop_text_field.html.erb +12 -12
  99. data/app/views/fe/admin/question_pages/_element.html.erb +16 -6
  100. data/app/views/fe/admin/question_pages/_element_show.html.erb +2 -2
  101. data/app/views/fe/admin/question_pages/_question_page.html.erb +4 -4
  102. data/app/views/fe/admin/question_pages/create.js.erb +3 -3
  103. data/app/views/fe/admin/question_pages/destroy.js.erb +3 -3
  104. data/app/views/fe/admin/question_pages/edit.js.erb +1 -1
  105. data/app/views/fe/admin/question_pages/error.js.erb +1 -1
  106. data/app/views/fe/admin/question_pages/show.js.erb +2 -2
  107. data/app/views/fe/admin/question_pages/show_panel.js.erb +1 -1
  108. data/app/views/fe/admin/question_pages/update.js.erb +1 -1
  109. data/app/views/fe/admin/question_sheets/edit.js.erb +1 -1
  110. data/app/views/fe/admin/question_sheets/error.js.erb +1 -1
  111. data/app/views/fe/admin/question_sheets/index.html.erb +8 -8
  112. data/app/views/fe/admin/question_sheets/new.html.erb +3 -3
  113. data/app/views/fe/admin/question_sheets/show.html.erb +5 -5
  114. data/app/views/fe/admin/question_sheets/update.js.erb +1 -1
  115. data/app/views/fe/answer_pages/_answer_page.html.erb +14 -14
  116. data/app/views/fe/answer_pages/_element.html.erb +25 -6
  117. data/app/views/fe/answer_pages/_page_name.html.erb +1 -0
  118. data/app/views/fe/answer_pages/show.html.erb +39 -0
  119. data/app/views/fe/answer_pages/update.js.erb +11 -3
  120. data/app/views/fe/answer_sheets/_answer_sheet.html.erb +6 -6
  121. data/app/views/fe/answer_sheets/_element.html.erb +55 -35
  122. data/app/views/fe/answer_sheets/_incomplete.html.erb +1 -1
  123. data/app/views/fe/answer_sheets/_page_link.html.erb +9 -7
  124. data/app/views/fe/answer_sheets/_pages_list.html.erb +4 -4
  125. data/app/views/fe/answer_sheets/_submit_to.html.erb +1 -0
  126. data/app/views/fe/answer_sheets/_title.html.erb +1 -1
  127. data/app/views/fe/answer_sheets/edit.html.erb +24 -24
  128. data/app/views/fe/answer_sheets/incomplete.js.erb +9 -3
  129. data/app/views/fe/answer_sheets/index.html.erb +3 -3
  130. data/app/views/fe/answer_sheets/show.html.erb +1 -1
  131. data/app/views/fe/applications/_logout.html.erb +1 -0
  132. data/app/views/fe/applications/show.html.erb +1 -0
  133. data/app/views/fe/questions/fe/_acceptance.html.erb +11 -10
  134. data/app/views/fe/questions/fe/_attachment_field.html.erb +133 -10
  135. data/app/views/fe/questions/fe/_checkbox_field.html.erb +34 -30
  136. data/app/views/fe/questions/fe/_country.html.erb +6 -6
  137. data/app/views/fe/questions/fe/_date_field.html.erb +5 -5
  138. data/app/views/fe/questions/fe/_date_field_mmyy.html.erb +8 -8
  139. data/app/views/fe/questions/fe/_drop_down_field.html.erb +7 -6
  140. data/app/views/fe/questions/fe/_paragraph.html.erb +1 -1
  141. data/app/views/fe/questions/fe/_question_grid.html.erb +21 -16
  142. data/app/views/fe/questions/fe/_question_grid_with_total.html.erb +25 -18
  143. data/app/views/fe/questions/fe/_questions.html.erb +11 -5
  144. data/app/views/fe/questions/fe/_radio_button_field.html.erb +42 -25
  145. data/app/views/fe/questions/fe/_rating.html.erb +57 -18
  146. data/app/views/fe/questions/fe/_reference_discipler.html.erb +1 -1
  147. data/app/views/fe/questions/fe/_reference_friend.html.erb +1 -1
  148. data/app/views/fe/questions/fe/_reference_parent.html.erb +1 -1
  149. data/app/views/fe/questions/fe/_reference_peer.html.erb +1 -1
  150. data/app/views/fe/questions/fe/_reference_question.html.erb +44 -21
  151. data/app/views/fe/questions/fe/_reference_roommate.html.erb +1 -1
  152. data/app/views/fe/questions/fe/_reference_spiritual.html.erb +1 -1
  153. data/app/views/fe/questions/fe/_reference_staff.html.erb +1 -1
  154. data/app/views/fe/questions/fe/_section.html.erb +1 -1
  155. data/app/views/fe/questions/fe/_state_chooser.html.erb +6 -6
  156. data/app/views/fe/questions/fe/_text_area_field.html.erb +17 -6
  157. data/app/views/fe/questions/fe/_text_field.html.erb +7 -6
  158. data/app/views/fe/questions/fe/_yes_no.html.erb +8 -8
  159. data/app/views/fe/questions/fe/_yes_no_field.erb +12 -9
  160. data/app/views/fe/reference_pages/_reference.html.erb +15 -15
  161. data/app/views/fe/reference_pages/edit.html.erb +9 -9
  162. data/app/views/fe/reference_sheets/done.html.erb +2 -2
  163. data/app/views/fe/reference_sheets/not_found.html.erb +4 -4
  164. data/app/views/fe/references/edit.html.erb +6 -6
  165. data/app/views/fe/references/show.html.erb +8 -8
  166. data/app/views/fe/references/submit.js.erb +3 -3
  167. data/app/views/fe/submit_pages/_thankyou.html.erb +1 -1
  168. data/app/views/fe/submit_pages/edit.html.erb +12 -12
  169. data/app/views/fe/submit_pages/error.js.erb +1 -1
  170. data/app/views/fe/submit_pages/submit.js.erb +2 -2
  171. data/app/views/layouts/fe/_error_messages_for.html.erb +7 -0
  172. data/app/views/layouts/fe/application.html.erb +4 -5
  173. data/app/views/layouts/fe/fe_admin.html.erb +30 -0
  174. data/app/views.current/fe/admin/elements/_errors.html.erb +11 -0
  175. data/app/views.current/fe/admin/elements/create.js.erb +12 -0
  176. data/app/views.current/fe/admin/elements/destroy.js.erb +4 -0
  177. data/app/views.current/fe/admin/elements/drop.js.erb +3 -0
  178. data/app/views.current/fe/admin/elements/duplicate.js.erb +3 -0
  179. data/app/views.current/fe/admin/elements/edit.js.erb +4 -0
  180. data/app/views.current/fe/admin/elements/error.js.erb +4 -0
  181. data/app/views.current/fe/admin/elements/new.js.erb +17 -0
  182. data/app/views.current/fe/admin/elements/reorder.js.erb +0 -0
  183. data/app/views.current/fe/admin/elements/update.js.erb +9 -0
  184. data/app/views.current/fe/admin/email_templates/_form.html.erb +8 -0
  185. data/app/views.current/fe/admin/email_templates/edit.html.erb +13 -0
  186. data/app/views.current/fe/admin/email_templates/index.html.erb +20 -0
  187. data/app/views.current/fe/admin/email_templates/new.html.erb +11 -0
  188. data/app/views.current/fe/admin/panels/_advanced_options.html.erb +49 -0
  189. data/app/views.current/fe/admin/panels/_common_boolean_fields.html.erb +1 -0
  190. data/app/views.current/fe/admin/panels/_common_boolean_fields_default.html.erb +11 -0
  191. data/app/views.current/fe/admin/panels/_common_fields.html.erb +23 -0
  192. data/app/views.current/fe/admin/panels/_condition.html.erb +6 -0
  193. data/app/views.current/fe/admin/panels/_insert.html.erb +39 -0
  194. data/app/views.current/fe/admin/panels/_nav_controls.html.erb +6 -0
  195. data/app/views.current/fe/admin/panels/_page.html.erb +3 -0
  196. data/app/views.current/fe/admin/panels/_pages_list.html.erb +16 -0
  197. data/app/views.current/fe/admin/panels/_prop_attachment_field.html.erb +2 -0
  198. data/app/views.current/fe/admin/panels/_prop_choice_field.html.erb +74 -0
  199. data/app/views.current/fe/admin/panels/_prop_date_field.html.erb +7 -0
  200. data/app/views.current/fe/admin/panels/_prop_element.html.erb +23 -0
  201. data/app/views.current/fe/admin/panels/_prop_page.html.erb +26 -0
  202. data/app/views.current/fe/admin/panels/_prop_paragraph.html.erb +46 -0
  203. data/app/views.current/fe/admin/panels/_prop_question_grid.html.erb +28 -0
  204. data/app/views.current/fe/admin/panels/_prop_question_grid_with_total.html.erb +14 -0
  205. data/app/views.current/fe/admin/panels/_prop_reference_question.html.erb +12 -0
  206. data/app/views.current/fe/admin/panels/_prop_section.html.erb +8 -0
  207. data/app/views.current/fe/admin/panels/_prop_sheet.html.erb +20 -0
  208. data/app/views.current/fe/admin/panels/_prop_text_field.html.erb +20 -0
  209. data/app/views.current/fe/admin/question_pages/_element.html.erb +28 -0
  210. data/app/views.current/fe/admin/question_pages/_element_show.html.erb +10 -0
  211. data/app/views.current/fe/admin/question_pages/_errors.html.erb +10 -0
  212. data/app/views.current/fe/admin/question_pages/_question_page.html.erb +13 -0
  213. data/app/views.current/fe/admin/question_pages/create.js.erb +11 -0
  214. data/app/views.current/fe/admin/question_pages/destroy.js.erb +5 -0
  215. data/app/views.current/fe/admin/question_pages/edit.js.erb +3 -0
  216. data/app/views.current/fe/admin/question_pages/error.js.erb +4 -0
  217. data/app/views.current/fe/admin/question_pages/show.js.erb +9 -0
  218. data/app/views.current/fe/admin/question_pages/show_panel.js.erb +3 -0
  219. data/app/views.current/fe/admin/question_pages/update.js.erb +2 -0
  220. data/app/views.current/fe/admin/question_sheets/_errors.html.erb +11 -0
  221. data/app/views.current/fe/admin/question_sheets/edit.js.erb +3 -0
  222. data/app/views.current/fe/admin/question_sheets/error.js.erb +5 -0
  223. data/app/views.current/fe/admin/question_sheets/index.html.erb +41 -0
  224. data/app/views.current/fe/admin/question_sheets/new.html.erb +15 -0
  225. data/app/views.current/fe/admin/question_sheets/show.html.erb +27 -0
  226. data/app/views.current/fe/admin/question_sheets/update.js.erb +2 -0
  227. data/app/views.current/fe/answer_pages/_answer_page.html.erb +53 -0
  228. data/app/views.current/fe/answer_pages/_element.html.erb +32 -0
  229. data/app/views.current/fe/answer_pages/_page_name.html.erb +1 -0
  230. data/app/views.current/fe/answer_pages/show.html.erb +39 -0
  231. data/app/views.current/fe/answer_pages/update.js.erb +13 -0
  232. data/app/views.current/fe/answer_sheets/_answer_sheet.html.erb +26 -0
  233. data/app/views.current/fe/answer_sheets/_element.html.erb +74 -0
  234. data/app/views.current/fe/answer_sheets/_incomplete.html.erb +10 -0
  235. data/app/views.current/fe/answer_sheets/_page_link.html.erb +9 -0
  236. data/app/views.current/fe/answer_sheets/_pages_list.html.erb +11 -0
  237. data/app/views.current/fe/answer_sheets/_submit_to.html.erb +1 -0
  238. data/app/views.current/fe/answer_sheets/_title.html.erb +1 -0
  239. data/app/views.current/fe/answer_sheets/edit.html.erb +66 -0
  240. data/app/views.current/fe/answer_sheets/incomplete.js.erb +11 -0
  241. data/app/views.current/fe/answer_sheets/index.html.erb +18 -0
  242. data/app/views.current/fe/answer_sheets/send_reference_invite.js.erb +8 -0
  243. data/app/views.current/fe/answer_sheets/show.html.erb +13 -0
  244. data/app/views.current/fe/applications/_logout.html.erb +1 -0
  245. data/app/views.current/fe/applications/show.html.erb +1 -0
  246. data/app/views.current/fe/help/builder.html +33 -0
  247. data/app/views.current/fe/help/question_grid.html +18 -0
  248. data/app/views.current/fe/questions/fe/_acceptance.html.erb +14 -0
  249. data/app/views.current/fe/questions/fe/_attachment_field.html.erb +165 -0
  250. data/app/views.current/fe/questions/fe/_checkbox_field.html.erb +53 -0
  251. data/app/views.current/fe/questions/fe/_country.html.erb +7 -0
  252. data/app/views.current/fe/questions/fe/_date_field.html.erb +7 -0
  253. data/app/views.current/fe/questions/fe/_date_field_mmyy.html.erb +9 -0
  254. data/app/views.current/fe/questions/fe/_drop_down_field.html.erb +8 -0
  255. data/app/views.current/fe/questions/fe/_paragraph.html.erb +1 -0
  256. data/app/views.current/fe/questions/fe/_question_grid.html.erb +70 -0
  257. data/app/views.current/fe/questions/fe/_question_grid_with_total.html.erb +64 -0
  258. data/app/views.current/fe/questions/fe/_questions.html.erb +15 -0
  259. data/app/views.current/fe/questions/fe/_radio_button_field.html.erb +60 -0
  260. data/app/views.current/fe/questions/fe/_rating.html.erb +64 -0
  261. data/app/views.current/fe/questions/fe/_reference_discipler.html.erb +1 -0
  262. data/app/views.current/fe/questions/fe/_reference_friend.html.erb +1 -0
  263. data/app/views.current/fe/questions/fe/_reference_parent.html.erb +1 -0
  264. data/app/views.current/fe/questions/fe/_reference_peer.html.erb +1 -0
  265. data/app/views.current/fe/questions/fe/_reference_question.html.erb +61 -0
  266. data/app/views.current/fe/questions/fe/_reference_roommate.html.erb +1 -0
  267. data/app/views.current/fe/questions/fe/_reference_spiritual.html.erb +1 -0
  268. data/app/views.current/fe/questions/fe/_reference_staff.html.erb +1 -0
  269. data/app/views.current/fe/questions/fe/_section.html.erb +1 -0
  270. data/app/views.current/fe/questions/fe/_state_chooser.html.erb +7 -0
  271. data/app/views.current/fe/questions/fe/_text_area_field.html.erb +17 -0
  272. data/app/views.current/fe/questions/fe/_text_field.html.erb +9 -0
  273. data/app/views.current/fe/questions/fe/_yes_no.html.erb +17 -0
  274. data/app/views.current/fe/questions/fe/_yes_no_field.erb +20 -0
  275. data/app/views.current/fe/reference_pages/_reference.html.erb +31 -0
  276. data/app/views.current/fe/reference_pages/edit.html.erb +24 -0
  277. data/app/views.current/fe/reference_sheets/done.html.erb +2 -0
  278. data/app/views.current/fe/reference_sheets/not_found.html.erb +5 -0
  279. data/app/views.current/fe/reference_sheets/submitted.js.erb +1 -0
  280. data/app/views.current/fe/references/edit.html.erb +8 -0
  281. data/app/views.current/fe/references/send_invite.js.erb +7 -0
  282. data/app/views.current/fe/references/show.html.erb +18 -0
  283. data/app/views.current/fe/references/submit.js.erb +3 -0
  284. data/app/views.current/fe/submit_pages/_errors.html.erb +1 -0
  285. data/app/views.current/fe/submit_pages/_thankyou.html.erb +2 -0
  286. data/app/views.current/fe/submit_pages/edit.html.erb +36 -0
  287. data/app/views.current/fe/submit_pages/error.js.erb +1 -0
  288. data/app/views.current/fe/submit_pages/submit.js.erb +3 -0
  289. data/app/views.current/layouts/fe/_error_messages_for.html.erb +7 -0
  290. data/app/views.current/layouts/fe/application.html.erb +47 -0
  291. data/app/{views/layouts/fe/fe.admin.html.erb → views.current/layouts/fe/fe_admin.html.erb} +4 -4
  292. data/config/initializers/paper_trail.rb +3 -0
  293. data/config/routes.rb +3 -37
  294. data/db/migrate/20131003041856_core.rb +23 -23
  295. data/db/migrate/20131003044250_create_reference_sheets.rb +2 -1
  296. data/db/migrate/20131003044436_add_element_and_answer_fields.rb +3 -3
  297. data/db/migrate/20131003044518_create_email_templates.rb +2 -2
  298. data/db/migrate/20131003044621_add_max_lengths.rb +1 -1
  299. data/db/migrate/20131003044714_create_join_table.rb +1 -1
  300. data/db/migrate/20131016162128_remove_question_id_from_element.rb +1 -1
  301. data/db/migrate/20140623153424_create_fe_people.rb +2 -2
  302. data/db/migrate/20140624180246_create_fe_addresses.rb +2 -2
  303. data/db/migrate/{20140624182216_create_create_fe_phone_numbers.rb → 20140624182216_create_fe_phone_numbers.rb} +2 -2
  304. data/db/migrate/20140625160545_create_fe_users.rb +2 -2
  305. data/db/migrate/20140808202507_add_conditional_type_to_elements.rb +1 -1
  306. data/db/migrate/20140808203609_add_conditional_answer_to_elements.rb +1 -1
  307. data/db/migrate/20141103204704_remove_short_value_column.rb +1 -1
  308. data/db/migrate/20141109154522_move_conditional_ids_used_for_choice_field_to_their_own_column.rb +1 -1
  309. data/db/migrate/20150504221439_add_all_element_ids_to_pages.rb +5 -0
  310. data/db/migrate/20150713022326_add_locale_columns.rb +9 -0
  311. data/db/migrate/20150714220730_add_locale_to_answer_sheet.rb +5 -0
  312. data/db/migrate/20150925181652_add_share_to_elements.rb +5 -0
  313. data/db/migrate/20150928085325_change_pages_all_element_ids_to_text.rb +5 -0
  314. data/db/migrate/20150930191538_add_locale_to_reference_sheets.rb +5 -0
  315. data/db/migrate/20151021181928_switch_conditional_answer_separator_to_semicolon.rb +7 -0
  316. data/db/migrate/20151021184250_add_question_sheet_id_in_refs.rb +12 -0
  317. data/db/migrate/20160201185838_add_visible_and_visibility_cache_key_to_reference_sheets.rb +6 -0
  318. data/db/migrate/20160805221415_add_rating_extra_labels.rb +10 -0
  319. data/db/migrate/20181108201746_create_versions.rb +80 -0
  320. data/db/migrate/20181218201130_increase_slug_length.rb +5 -0
  321. data/lib/access_key_generator.rb +12 -0
  322. data/lib/distinct_distinct_patch.rb +20 -0
  323. data/lib/fe/engine.rb +26 -14
  324. data/lib/fe/version.rb +1 -1
  325. data/lib/fe.rb +11 -1
  326. data/spec/controllers/fe/admin/elements_controller_spec.rb +211 -1
  327. data/spec/controllers/fe/admin/email_templates_controller_spec.rb +26 -1
  328. data/spec/controllers/fe/admin/question_pages_controller_spec.rb +8 -1
  329. data/spec/controllers/fe/admin/question_sheets_controller_spec.rb +48 -1
  330. data/spec/controllers/fe/answer_pages_controller_spec.rb +129 -1
  331. data/spec/controllers/fe/answer_sheets_controller_spec.rb +136 -1
  332. data/spec/controllers/fe/reference_pages_controller.rb +4 -0
  333. data/spec/controllers/fe/references_controller_spec.rb +4 -0
  334. data/spec/controllers/fe/submit_pages_controller_spec.rb +4 -0
  335. data/spec/dummy/app/assets/config/manifest.js +0 -0
  336. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  337. data/spec/dummy/app/helpers/application_helper.rb +9 -0
  338. data/spec/dummy/app/models/application.rb +3 -0
  339. data/spec/dummy/app/models/person.rb +11 -0
  340. data/spec/dummy/app/models/user.rb +3 -0
  341. data/spec/dummy/app/views/layouts/application.html.erb +2 -2
  342. data/spec/dummy/config/application.rb +3 -1
  343. data/spec/dummy/config/database.yml +20 -17
  344. data/spec/dummy/config/environments/production.rb +1 -5
  345. data/spec/dummy/config/environments/test.rb +4 -2
  346. data/spec/dummy/config/initializers/assets.rb +5 -2
  347. data/spec/dummy/config/initializers/fast_gettext.rb +5 -0
  348. data/spec/dummy/config/initializers/to_unsafe_h.rb +5 -0
  349. data/spec/dummy/config/initializers/to_unsafe_h.rb.new +5 -0
  350. data/spec/dummy/config/secrets.yml +2 -2
  351. data/spec/dummy/db/migrate/20141203214017_core.fe_engine.rb +92 -0
  352. data/spec/dummy/db/migrate/20141203214018_create_reference_sheets.fe_engine.rb +25 -0
  353. data/spec/dummy/db/migrate/20141203214019_add_element_and_answer_fields.fe_engine.rb +11 -0
  354. data/spec/dummy/db/migrate/20141203214020_create_email_templates.fe_engine.rb +18 -0
  355. data/spec/dummy/db/migrate/20141203214021_add_max_lengths.fe_engine.rb +9 -0
  356. data/spec/dummy/db/migrate/20141203214022_create_join_table.fe_engine.rb +12 -0
  357. data/spec/dummy/db/migrate/20141203214023_remove_question_id_from_element.fe_engine.rb +10 -0
  358. data/spec/dummy/db/migrate/20141203214024_create_fe_people.fe_engine.rb +13 -0
  359. data/spec/dummy/db/migrate/20141203214025_create_fe_addresses.fe_engine.rb +21 -0
  360. data/spec/dummy/db/migrate/20141203214027_create_fe_users.fe_engine.rb +13 -0
  361. data/spec/dummy/db/migrate/20141203214028_add_conditional_type_to_elements.fe_engine.rb +6 -0
  362. data/spec/dummy/db/migrate/20141203214029_add_conditional_answer_to_elements.fe_engine.rb +6 -0
  363. data/spec/dummy/db/migrate/20141203214030_remove_short_value_column.fe_engine.rb +6 -0
  364. data/spec/dummy/db/migrate/20141203214031_move_conditional_ids_used_for_choice_field_to_their_own_column.fe_engine.rb +8 -0
  365. data/spec/dummy/db/migrate/20150123215803_create_users.rb +9 -0
  366. data/spec/dummy/db/migrate/20150504222619_add_all_element_ids_to_pages.fe_engine.rb +6 -0
  367. data/spec/dummy/db/migrate/20150925192557_add_share_to_elements.fe_engine.rb +6 -0
  368. data/spec/dummy/db/migrate/20150930190001_create_fe_phone_numbers.fe_engine.rb +20 -0
  369. data/spec/dummy/db/migrate/20150930190002_add_locale_columns.fe_engine.rb +10 -0
  370. data/spec/dummy/db/migrate/20150930190003_add_locale_to_answer_sheet.fe_engine.rb +6 -0
  371. data/spec/dummy/db/migrate/20150930190004_change_pages_all_element_ids_to_text.fe_engine.rb +6 -0
  372. data/spec/dummy/db/migrate/20150930191756_add_locale_to_reference_sheets.fe_engine.rb +6 -0
  373. data/spec/dummy/db/migrate/20151021190027_add_question_sheet_id_in_refs.fe_engine.rb +13 -0
  374. data/spec/dummy/db/migrate/20160204164612_switch_conditional_answer_separator_to_semicolon.fe_engine.rb +8 -0
  375. data/spec/dummy/db/migrate/20160204164613_add_visible_and_visibility_cache_key_to_reference_sheets.fe_engine.rb +7 -0
  376. data/spec/dummy/db/migrate/20181108201746_create_versions.rb +80 -0
  377. data/spec/dummy/db/schema.rb +91 -69
  378. data/spec/dummy/log/test.log +101278 -419
  379. data/spec/factories/answer_sheet_question_sheets.rb +1 -1
  380. data/spec/factories/answer_sheets.rb +2 -2
  381. data/spec/factories/answers.rb +1 -1
  382. data/spec/factories/applications.rb +3 -4
  383. data/spec/factories/dummy_applications.rb +6 -0
  384. data/spec/factories/dummy_people.rb +6 -0
  385. data/spec/factories/dummy_users.rb +6 -0
  386. data/spec/factories/elements.rb +35 -10
  387. data/spec/factories/email_templates.rb +5 -0
  388. data/spec/factories/fe_addresses.rb +10 -10
  389. data/spec/factories/fe_email_addresses.rb +3 -3
  390. data/spec/factories/fe_email_templates.rb +9 -0
  391. data/spec/factories/fe_people.rb +5 -7
  392. data/spec/factories/fe_phone_numbers.rb +3 -3
  393. data/spec/factories/fe_user.rb +6 -0
  394. data/spec/factories/page.rb +1 -1
  395. data/spec/factories/page_elements.rb +1 -1
  396. data/spec/factories/paragraphs.rb +1 -1
  397. data/spec/factories/question_sheet.rb +3 -3
  398. data/spec/factories/reference_questions.rb +1 -1
  399. data/spec/factories/reference_sheets.rb +9 -0
  400. data/spec/jobs/fe/update_reference_sheet_visibility_job_spec.rb +40 -0
  401. data/spec/mailers/fe/notifier_spec.rb +39 -0
  402. data/spec/models/fe/answer_sheet_question_sheet_spec.rb +1 -1
  403. data/spec/models/fe/answer_spec.rb +2 -2
  404. data/spec/models/fe/application_spec.rb +94 -1
  405. data/spec/models/fe/choice_field_spec.rb +66 -0
  406. data/spec/models/fe/condition_spec.rb +2 -2
  407. data/spec/models/fe/element_spec.rb +414 -37
  408. data/spec/models/fe/email_template_spec.rb +1 -1
  409. data/spec/models/fe/page_element_spec.rb +1 -1
  410. data/spec/models/fe/page_spec.rb +168 -11
  411. data/spec/models/fe/person_spec.rb +1 -1
  412. data/spec/models/fe/question_set_spec.rb +91 -0
  413. data/spec/models/fe/question_sheet_spec.rb +103 -1
  414. data/spec/models/fe/question_spec.rb +73 -6
  415. data/spec/models/fe/reference_question_spec.rb +20 -0
  416. data/spec/models/fe/reference_sheet_spec.rb +305 -2
  417. data/spec/models/fe/text_field_spec.rb +22 -0
  418. data/spec/rails_helper.rb +85 -54
  419. data/spec/support/choices.xml +6 -0
  420. metadata +310 -84
  421. data/app/assets/javascripts/fe/fe.common.js +0 -57
  422. data/app/assets/javascripts/fe/jquery.scrollTo-min.js +0 -7
  423. data/app/assets/javascripts/fe/rails.extra.js +0 -6
  424. data/app/controllers/fe/applications_controller.rb +0 -183
  425. data/app/controllers/fe/concerns/answer_pages_controller_concern.rb +0 -83
  426. data/app/controllers/fe/payments_controller.rb +0 -184
  427. data/app/models/fe/concerns/answer_sheet_concern.rb +0 -55
  428. data/app/models/fe/payment.rb +0 -77
  429. data/app/models/fe/payment_question.rb +0 -22
  430. data/app/views/fe/admin/panels/_prop_payment_question.html.erb +0 -1
  431. data/app/views/fe/application/_logout.html.erb +0 -1
  432. data/app/views/fe/payment_pages/_credit.html.erb +0 -47
  433. data/app/views/fe/payment_pages/_mail.html.erb +0 -27
  434. data/app/views/fe/payment_pages/_payment.html.erb +0 -6
  435. data/app/views/fe/payment_pages/_staff.html.erb +0 -25
  436. data/app/views/fe/payment_pages/_staff_results.html.erb +0 -17
  437. data/app/views/fe/payment_pages/edit.html.erb +0 -75
  438. data/app/views/fe/payment_pages/staff_search.js.erb +0 -2
  439. data/app/views/fe/payments/_credit.html.erb +0 -47
  440. data/app/views/fe/payments/_errors.html.erb +0 -1
  441. data/app/views/fe/payments/_payment.html.erb +0 -13
  442. data/app/views/fe/payments/_staff.html.erb +0 -21
  443. data/app/views/fe/payments/_staff_results.html.erb +0 -18
  444. data/app/views/fe/payments/approve.js.erb +0 -3
  445. data/app/views/fe/payments/create.js.erb +0 -19
  446. data/app/views/fe/payments/destroy.js.erb +0 -7
  447. data/app/views/fe/payments/edit.html.erb +0 -56
  448. data/app/views/fe/payments/error.js.erb +0 -3
  449. data/app/views/fe/payments/no_access.html.erb +0 -7
  450. data/app/views/fe/payments/staff_search.js.erb +0 -1
  451. data/app/views/fe/payments/update.html.erb +0 -24
  452. data/app/views/fe/questions/fe/_payment_question.html.erb +0 -70
  453. data/db/migrate/20140828045339_create_payments.rb +0 -13
  454. data/spec/dummy/db/test.sqlite3 +0 -0
  455. data/spec/factories/payments.rb +0 -7
  456. data/spec/models/fe/payment_question_spec.rb +0 -65
@@ -1,6 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Page do
3
+ describe Fe::Page, type: :model do
4
4
  it { expect belong_to :question_sheet }
5
5
  it { expect have_many :page_elements }
6
6
  it { expect have_many :elements }
@@ -9,38 +9,195 @@ describe Fe::Page do
9
9
  it { expect have_many :question_grid_with_totals }
10
10
  # it { expect validate_presence_of :label } # this isn't working
11
11
  # it { expect validate_presence_of :number } # this isn't working
12
- it { expect ensure_length_of :label }
12
+ it { expect validate_length_of :label }
13
13
  # it { expect validate_numericality_of :number }
14
14
 
15
15
  it "should not require a hidden element" do
16
- question_sheet = FactoryGirl.create(:question_sheet_with_pages)
17
- conditional_el = FactoryGirl.create(:choice_field_element, label: "This is a test for a yes/no question that will hide the next element if the answer is yes", conditional_type: "Fe::Element", conditional_answer: "yes")
16
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
17
+ conditional_el = FactoryBot.create(:choice_field_element, label: "This is a test for a yes/no question that will show the next element if the answer is yes", conditional_type: "Fe::Element", conditional_answer: "yes")
18
18
  question_sheet.pages.reload
19
19
  question_sheet.pages[3].elements << conditional_el
20
- element = FactoryGirl.create(:text_field_element, label: "This is a test of a short answer that is made visible by the previous elemenet")
20
+ element = FactoryBot.create(:text_field_element, label: "This is a test of a short answer that is made visible by the previous element")
21
21
  question_sheet.pages[3].elements << element
22
22
  conditional_el.reload
23
23
  expect(conditional_el.conditional).to eq(element)
24
24
 
25
25
  # set up an answer sheet
26
- application = FactoryGirl.create(:answer_sheet)
27
- application.answer_sheet_question_sheet = FactoryGirl.create(:answer_sheet_question_sheet, answer_sheet: application, question_sheet: question_sheet)
28
- application.answer_sheet_question_sheets.first.update_attributes(question_sheet_id: question_sheet.id)
26
+ application = FactoryBot.create(:answer_sheet)
27
+ application.answer_sheet_question_sheet = FactoryBot.create(:answer_sheet_question_sheet, answer_sheet: application, question_sheet: question_sheet)
28
+ application.answer_sheet_question_sheets.first.update(question_sheet_id: question_sheet.id)
29
+ application.reload
29
30
 
30
- # make the answer to the conditional question 'yes' so that the next element shows up and is thus required
31
+ # make the answer to the conditional question 'no' so that the next element does not show up and is not required
31
32
  conditional_el.set_response("no", application)
32
33
  conditional_el.save_response(application)
33
34
 
34
- # validate the page -- the next element after the conditional should not be required
35
+ # validate the page -- the next element after the conditional should not be required (because it's hidden)
35
36
  page = question_sheet.pages[3]
37
+ question_sheet.pages.reload
36
38
  expect(page.complete?(application)).to eq(true)
37
39
 
38
40
  # make the answer to the conditional question 'yes' so that the next element shows up and is thus required
39
41
  conditional_el.set_response("yes", application)
40
42
  conditional_el.save_response(application)
43
+ conditional_el.display_response(application)
41
44
 
42
- # validate the page -- the next element after the conditional should not be required
45
+ # validate the page -- the next element after the conditional be required now, making the page incomplete
43
46
  page = question_sheet.pages[3]
44
47
  expect(page.complete?(application)).to eq(false)
45
48
  end
49
+
50
+ context '#all_elements' do
51
+ it 'should return elements in the same order the ids were given' do
52
+ p = create(:page, all_element_ids: '2,1')
53
+ e1 = create(:text_field_element)
54
+ e2 = create(:text_field_element)
55
+ expect(p.all_elements).to eq([e2,e1])
56
+ end
57
+ it 'should include elements in a grid' do
58
+ p = create(:page)
59
+ e = create(:question_grid)
60
+ create(:page_element, page: p, element: e)
61
+ tf1 = create(:text_field_element, question_grid: e)
62
+
63
+ # add text field directly to page
64
+ tf2 = create(:text_field_element)
65
+ create(:page_element, page: p, element: tf2)
66
+
67
+ # add section to grid
68
+ section = create(:section, question_grid: e)
69
+
70
+ p.reload # get the updated all_element_ids column
71
+ expect(p.all_elements).to eq([e, tf1, section, tf2])
72
+ end
73
+ it 'should return an empty active record result set when no elements are added' do
74
+ p = create(:page)
75
+ expect(p.all_elements).to eq([])
76
+ end
77
+ it 'should rebuild_all_element_ids first when not set' do
78
+ p = create(:page)
79
+ p.all_elements
80
+ p.reload
81
+ expect(p.all_element_ids).to eq('')
82
+ end
83
+ end
84
+ context '#has_questions?' do
85
+ it 'should return true when there is a question directly on the page' do
86
+ p = create(:page)
87
+ e = create(:text_field_element)
88
+ create(:page_element, page: p, element: e)
89
+ expect(p.has_questions?).to be true
90
+ end
91
+ it 'should not count a non-question directly on the page' do
92
+ p = create(:page)
93
+ e = create(:section)
94
+ create(:page_element, page: p, element: e)
95
+ expect(p.has_questions?).to be false
96
+ end
97
+ it 'should return true when the only question is in a grid' do
98
+ p = create(:page)
99
+ e = create(:question_grid)
100
+ create(:page_element, page: p, element: e)
101
+ tf1 = create(:text_field_element, question_grid: e)
102
+ section = create(:section, question_grid: e)
103
+ p.reload # get the updated all_element_ids column
104
+ expect(p.has_questions?).to be true
105
+ end
106
+ it 'should not count a non-question inside a grid as a question' do
107
+ p = create(:page)
108
+ e = create(:question_grid)
109
+ create(:page_element, page: p, element: e)
110
+ section = create(:section, question_grid: e)
111
+ p.reload # get the updated all_element_ids column
112
+ expect(p.has_questions?).to be false
113
+ end
114
+ end
115
+ context '#all_questions' do
116
+ it 'should include elements in a grid with total' do
117
+ p = create(:page)
118
+ grid = create(:question_grid_with_total) # shouldn't be included in all_questions because it's a not a question
119
+ create(:page_element, page: p, element: grid, position: 1)
120
+ tf1 = create(:text_field_element, question_grid: grid)
121
+ tf2 = create(:text_field_element) # add directly to page
122
+ create(:page_element, page: p, element: tf2, position: 2)
123
+ section = create(:section, question_grid: grid) # shouldn't be included in all_questions because it's not a question
124
+ p.reload # get the updated all_element_ids column
125
+ expect(p.all_questions).to eq([tf1, tf2])
126
+ end
127
+ end
128
+ context '#rebuild_all_element_ids' do
129
+ it 'should include elements in a grid' do
130
+ p = create(:page)
131
+ e = create(:question_grid)
132
+ create(:page_element, page: p, element: e)
133
+ tf1 = create(:text_field_element, question_grid: e)
134
+ tf2 = create(:text_field_element) # add directly to page
135
+ create(:page_element, page: p, element: tf2)
136
+ section = create(:section, question_grid: e)
137
+ p.update_column :all_element_ids, nil
138
+ p.rebuild_all_element_ids
139
+ expect(p.all_element_ids).to eq("#{e.id},#{tf1.id},#{section.id},#{tf2.id}")
140
+ end
141
+ end
142
+ context '#all_element_ids' do
143
+ it 'should rebuild_all_element_ids first when not set' do
144
+ p = create(:page)
145
+ p.all_element_ids
146
+ p.reload
147
+ expect(p.all_element_ids).to eq('')
148
+ end
149
+ it 'should rebuild_all_element_ids when an element is removed from a page' do
150
+ p = create(:page)
151
+ e = create(:text_field_element, question_grid: e)
152
+ pe = create(:page_element, page: p, element: e)
153
+ expect(p.all_element_ids).to eq(e.id.to_s)
154
+ pe.destroy
155
+ p.reload
156
+ expect(p.all_element_ids).to eq('')
157
+ end
158
+ end
159
+ context '#copy_to' do
160
+ it 'should return the new page' do
161
+ q = create(:question_sheet)
162
+ p = create(:page)
163
+ r = p.copy_to(q)
164
+ expect(r.class).to be(Fe::Page)
165
+ end
166
+ end
167
+ context '#complete' do
168
+ it "is complete when there's a required element inside a hidden group" do
169
+ q = create(:question_sheet)
170
+ p = create(:page, question_sheet: q)
171
+ g1 = create(:question_grid)
172
+ c = create(:text_field_element, conditional_answer: 'asdf', conditional: g1)
173
+ create(:page_element, page: p, element: c)
174
+ create(:page_element, page: p, element: g1)
175
+ g2 = create(:question_grid_with_total, question_grid: g1)
176
+ e = create(:text_field_element, question_grid: g2)
177
+
178
+ application = create(:answer_sheet)
179
+ application.question_sheets << q
180
+
181
+ c.set_response('asdf', application)
182
+ c.save_response(application)
183
+ expect(e.hidden?(application)).to be(false)
184
+ expect(p.complete?(application)).to be(false)
185
+
186
+ # change the answer to make sure it changes to not required
187
+ c.set_response('something else', application)
188
+ c.save_response(application)
189
+ expect(c.display_response(application)).to eq('something else')
190
+
191
+ expect(e.hidden?(application)).to be(true)
192
+ p.clear_all_hidden_elements
193
+ expect(p.complete?(application)).to be(true)
194
+ end
195
+ end
196
+ context '#hidden' do
197
+ it 'checks the hidden column' do
198
+ q = create(:question_sheet)
199
+ p = create(:page, question_sheet: q, hidden: true)
200
+ expect(p.hidden).to be true
201
+ end
202
+ end
46
203
  end
@@ -1,4 +1,4 @@
1
1
  require 'rails_helper'
2
2
 
3
- RSpec.describe Fe::Person, :type => :model do
3
+ RSpec.describe Fe::Person, type: :model do
4
4
  end
@@ -1,4 +1,95 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe Fe::QuestionSet do
4
+ let(:app) { create(:application) }
5
+ let(:app2) { create(:application) }
6
+
7
+ before do
8
+ @page = create(:page)
9
+ @el_confidential = create(:text_field_element, label: 'conf1', is_confidential: true, share: true)
10
+ @el_visible = create(:text_field_element, label: 'vis1', is_confidential: false, share: false)
11
+ @el_confidential2 = create(:text_field_element, label: 'conf2', is_confidential: true, share: true)
12
+ @el_visible2 = create(:text_field_element, label: 'vis2', is_confidential: false, share: true)
13
+ @page.elements << @el_confidential << @el_visible << @el_confidential2 << @el_visible2
14
+ @question_set = Fe::QuestionSet.new(@page.elements, app)
15
+ end
16
+
17
+ it 'should filter default show' do
18
+ # filter out confidential questions and questions with share flag (the share flag would likely
19
+ # never be used to filter, but just to test that it will only filter those that match all the
20
+ # filter methods)
21
+ @question_set.set_filter(filter_default: :show, filter: [ :is_confidential, :share ])
22
+ expect(@question_set.elements).to eq([@el_visible, @el_visible2])
23
+ end
24
+
25
+ it 'should filter default hide' do
26
+ # show only confidential questions and questions with share flag (the share flag would likely
27
+ # never be used to filter, but just to test that it will only filter those that match all the
28
+ # filter methods)
29
+ @question_set.set_filter(filter_default: :hide, filter: [ :is_confidential, :share ])
30
+ expect(@question_set.elements).to eq([@el_confidential, @el_confidential2])
31
+ end
32
+
33
+ context 'saving answers (#post then #save)' do
34
+ it 'saves a new value' do
35
+ @question_set.post({ @el_visible.id => 'a text response' }, app)
36
+ @question_set.save
37
+ expect(Fe::Answer.count).to eq(1)
38
+ expect(Fe::Answer.first.value).to eq('a text response')
39
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
40
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
41
+ end
42
+ it 'replaces an existing answer' do
43
+ create(:answer, value: 'a text response', answer_sheet: app, question: @el_visible)
44
+ @question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
45
+ @question_set.post({ @el_visible.id => 'an updated response' }, app)
46
+ @question_set.save
47
+ expect(Fe::Answer.count).to eq(1)
48
+ expect(Fe::Answer.first.value).to eq('an updated response')
49
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
50
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
51
+ end
52
+ it "doesn't save empty strings continually" do
53
+ create(:answer, value: '', answer_sheet: app, question: @el_visible)
54
+ @question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
55
+ @question_set.post({ @el_visible.id => '' }, app)
56
+ @question_set.save
57
+ expect(Fe::Answer.count).to eq(1)
58
+ expect(Fe::Answer.first.value).to eq('')
59
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
60
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
61
+ end
62
+ it 'saves multiple values' do
63
+ @el_visible.update(kind: 'Fe::ChoiceField', style: 'checkbox', content: "choice 1\nchoice 2")
64
+ create(:answer, value: 'choice 1', answer_sheet: app, question: @el_visible)
65
+ @question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
66
+ @question_set.post({ @el_visible.id => { '0' => 'choice 1', '1' => 'choice 2' } }, app)
67
+ @question_set.save
68
+ expect(Fe::Answer.count).to eq(2)
69
+ expect(Fe::Answer.first.value).to eq('choice 1')
70
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
71
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
72
+ expect(Fe::Answer.second.value).to eq('choice 2')
73
+ expect(Fe::Answer.second.answer_sheet_id).to eq(app.id)
74
+ expect(Fe::Answer.second.question_id).to eq(@el_visible.id)
75
+ end
76
+ it 'saves the same value for different answer sheets' do
77
+ @el_visible.update(kind: 'Fe::ChoiceField', style: 'checkbox', content: "choice 1\nchoice 2")
78
+ @question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
79
+ @question_set.post({ @el_visible.id => { '0' => 'choice 1' } }, app)
80
+ @question_set.save
81
+ @question_set = Fe::QuestionSet.new(@page.elements, app2) # need this to save answers to app2
82
+ $b = true
83
+ @question_set.post({ @el_visible.id => { '0' => 'choice 1' } }, app2)
84
+ @question_set.save
85
+ $b = false
86
+ expect(Fe::Answer.count).to eq(2)
87
+ expect(Fe::Answer.first.value).to eq('choice 1')
88
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
89
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
90
+ expect(Fe::Answer.second.value).to eq('choice 1')
91
+ expect(Fe::Answer.second.answer_sheet_id).to eq(app2.id)
92
+ expect(Fe::Answer.second.question_id).to eq(@el_visible.id)
93
+ end
94
+ end
4
95
  end
@@ -1,8 +1,110 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::QuestionSheet do
3
+ describe Fe::QuestionSheet, type: :model do
4
4
  it { expect have_many :pages }
5
5
  it { expect have_many :answer_sheets }
6
6
  it { expect validate_presence_of :label }
7
7
  it { expect validate_uniqueness_of :label }
8
+
9
+ context '#all_elements' do
10
+ it 'should return elements in the same order as the ids' do
11
+ s = create(:question_sheet)
12
+
13
+ # P1
14
+ p1 = create(:page, question_sheet: s)
15
+ tf1 = create(:text_field_element)
16
+ create(:page_element, page: p1, element: tf1)
17
+ tf2 = create(:text_field_element)
18
+ create(:page_element, page: p1, element: tf2)
19
+ p1.update_column(:all_element_ids, "#{tf2.id},#{tf1.id}")
20
+
21
+ # P2
22
+ p2 = create(:page, question_sheet: s)
23
+ tf3 = create(:text_field_element)
24
+ create(:page_element, page: p2, element: tf3)
25
+ tf4 = create(:text_field_element)
26
+ create(:page_element, page: p2, element: tf4)
27
+ p2.update_column(:all_element_ids, "#{tf4.id},#{tf3.id}")
28
+
29
+ p1.reload # get the updated all_element_ids column
30
+ p2.reload # get the updated all_element_ids column
31
+ expect(s.all_elements).to eq([tf2, tf1, tf4, tf3])
32
+ end
33
+
34
+ it 'should include elements in a grid' do
35
+ s = create(:question_sheet)
36
+ p = create(:page, question_sheet: s)
37
+ e = create(:question_grid)
38
+ create(:page_element, page: p, element: e)
39
+ tf1 = create(:text_field_element, question_grid: e)
40
+ tf2 = create(:text_field_element) # add directly to page
41
+ create(:page_element, page: p, element: tf2)
42
+ section = create(:section, question_grid: e)
43
+ p.reload # get the updated all_element_ids column
44
+ expect(s.all_elements).to eq([e, tf1, section, tf2])
45
+ end
46
+ it 'should include elements across multiple pages' do
47
+ s = create(:question_sheet)
48
+
49
+ # P1
50
+ p1 = create(:page, question_sheet: s)
51
+
52
+ # grid pg1
53
+ g1 = create(:question_grid)
54
+ create(:page_element, page: p1, element: g1)
55
+ tf1 = create(:text_field_element, question_grid: g1)
56
+ s1 = create(:section, question_grid: g1)
57
+
58
+ # tf added directly to pg1
59
+ tf2 = create(:text_field_element)
60
+ create(:page_element, page: p1, element: tf2)
61
+
62
+ # P2
63
+ p2 = create(:page, question_sheet: s)
64
+
65
+ # grid pg2
66
+ g2 = create(:question_grid)
67
+ create(:page_element, page: p2, element: g2)
68
+ tf3 = create(:text_field_element, question_grid: g2)
69
+ s2 = create(:section, question_grid: g2)
70
+
71
+ # tf added directly to pg2
72
+ tf4 = create(:text_field_element)
73
+ create(:page_element, page: p2, element: tf4)
74
+
75
+ p1.reload # get the updated all_element_ids column
76
+ p2.reload # get the updated all_element_ids column
77
+ expect(s.all_elements).to eq([g1, tf1, s1, tf2, g2, tf3, s2, tf4])
78
+ end
79
+ it 'should handle pages with no elements' do
80
+ qs = create(:question_sheet)
81
+ p = create(:page)
82
+ qs.pages << p
83
+ expect(qs.all_elements).to eq([])
84
+ end
85
+ it 'should handle pages with no elements with empty string for all_elements' do
86
+ qs = create(:question_sheet)
87
+ p = create(:page, all_element_ids: '')
88
+ p2 = create(:page, all_element_ids: '')
89
+ e = create(:text_field_element)
90
+ create(:page_element, page: p2, element: e)
91
+ qs.pages << p << p2
92
+ expect(qs.all_elements).to eq([e])
93
+ end
94
+ end
95
+
96
+ context '#elements' do
97
+ it 'should not include elements in a grid' do
98
+ s = create(:question_sheet)
99
+ p = create(:page, question_sheet: s)
100
+ e = create(:question_grid)
101
+ create(:page_element, page: p, element: e)
102
+ tf1 = create(:text_field_element, question_grid: e) # shouldn't be included because it's in grid
103
+ tf2 = create(:text_field_element)
104
+ create(:page_element, page: p, element: tf2)
105
+ create(:section, question_grid: e) # shouldn't be included because it's in grid
106
+ p.reload # get the updated all_element_ids column
107
+ expect(s.elements).to eq([e, tf2])
108
+ end
109
+ end
8
110
  end
@@ -1,21 +1,88 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Question do
3
+ describe Fe::Question, type: :model do
4
4
  it { expect have_many :conditions }
5
5
  it { expect have_many :dependents }
6
6
  it { expect have_many :sheet_answers }
7
7
  it { expect belong_to :related_question_sheet }
8
-
8
+
9
9
  # it { expect validate_format_of :slug }
10
10
  # it { expect validate_length_of :slug }
11
11
  # it { expect validate_uniqueness_of :slug }
12
-
13
- describe '#default_label?' do
14
- it 'expect return true' do
12
+
13
+ describe '#default_label?' do
14
+ it 'expect return true' do
15
15
  question = Fe::Question.new
16
16
  #question.default_label?.expect be_true
17
17
  expect(question.default_label?).to eq(true)
18
18
  end
19
19
  end
20
-
20
+
21
+ context 'slug' do
22
+ let(:qs) { create(:question_sheet_with_pages) }
23
+ let(:page) { qs.pages.first }
24
+ let(:qs2) { create(:question_sheet_with_pages) }
25
+ let(:page2) { qs2.pages.first }
26
+ let(:e1) { create(:text_field_element, slug: 'test') }
27
+ let(:e2) { create(:text_field_element) }
28
+
29
+ before do
30
+ e1.pages << page
31
+ end
32
+
33
+ it "doesn't let the same slug be used in the question sheet" do
34
+ e2.pages << page
35
+ e2.slug = 'test'
36
+ e2.save
37
+ expect(e2.errors.full_messages.join(', ')).to include('Slug must be unique (within the question sheet)')
38
+ end
39
+ it "lets two elements with the same slug save on different sheets" do
40
+ e2.pages << page2
41
+ e2.slug = 'test'
42
+ expect(e2.save).to be true
43
+ end
44
+ end
45
+
46
+ context 'saving' do
47
+ let(:e) { create(:text_field_element) }
48
+ let(:app) { create(:text_field_element) }
49
+ let(:app2) { create(:text_field_element) }
50
+
51
+ before do
52
+ e.set_response('answer value', app)
53
+ end
54
+
55
+ context '#save_file' do
56
+ it ' checks that the answer sheet that calls set_response is the same one that calls save' do
57
+ expect {
58
+ e.save_file(app2, nil)
59
+ }.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
60
+ end
61
+ end
62
+
63
+ context '#delete_file' do
64
+ it ' checks that the answer sheet that calls set_response is the same one that calls delete' do
65
+ expect {
66
+ e.delete_file(app2, nil)
67
+ }.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
68
+ end
69
+
70
+ it 'deletes the given answer record' do
71
+ answer_sheet = create(:answer_sheet)
72
+ question = create(:attachment_field_element)
73
+ answer = create(:answer, attachment_file_name: 'test_file', answer_sheet: answer_sheet, question: question)
74
+ question.set_response('', answer_sheet)
75
+ question.delete_file(answer_sheet, answer)
76
+ expect{answer.reload}.to raise_error(ActiveRecord::RecordNotFound)
77
+ end
78
+ end
79
+
80
+ context '#save_response' do
81
+ it ' checks that the answer sheet that calls set_response is the same one that calls save' do
82
+ expect {
83
+ e.save_response(app2)
84
+ }.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
85
+ end
86
+ end
87
+ end
21
88
  end
@@ -14,4 +14,24 @@ describe Fe::ReferenceQuestion do
14
14
  expect(ref.ptemplate).to eq("fe/reference_abc")
15
15
  end
16
16
  end
17
+
18
+ it 'resets the question_sheet_id for references not created' do
19
+ qs1 = create(:question_sheet)
20
+ reference_question = create(:reference_question, related_question_sheet_id: qs1.id)
21
+ reference_sheet = create(:reference_sheet, question: reference_question)
22
+ expect(reference_sheet.question_sheet_id).to eq(qs1.id)
23
+
24
+ # change question sheet on ref element, the reference_sheet's question sheet should change
25
+ qs2 = create(:question_sheet)
26
+ expect(reference_sheet.status).to eq('created')
27
+ reference_question.update_attribute(:related_question_sheet_id, qs2.id)
28
+ expect(reference_sheet.reload.question_sheet_id).to eq(qs2.id)
29
+
30
+ # start the reference, then change question sheet on ref element,
31
+ # the reference_sheet's question sheet should not change
32
+ reference_sheet.update_attribute(:status, 'started')
33
+ qs3 = create(:question_sheet)
34
+ reference_question.update_attribute(:related_question_sheet_id, qs3.id)
35
+ expect(reference_sheet.reload.question_sheet_id).to eq(qs2.id)
36
+ end
17
37
  end