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,11 +1,314 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::ReferenceSheet do
4
- it { expect belong_to :question }
3
+ describe Fe::ReferenceSheet, type: :model do
4
+ it { expect belong_to :question }
5
5
  it { expect belong_to :applicant_answer_sheet }
6
6
  # it { expect validate_presence_of :first_name } # need to add started_at column
7
7
  # it { expect validate_presence_of :last_name } # need to add started_at column
8
8
  # it { expect validate_presence_of :phone } # need to add started_at column
9
9
  # it { expect validate_presence_of :email } # need to add started_at column
10
10
  # it { expect validate_presence_of :relationship } # need to add started_at column
11
+
12
+ context '#access_key' do
13
+ it 'should generate two different in the same second' do
14
+ # there's a small chance the first and second access keys generated will be in different seconds
15
+ # doing it 5 times should make it extremely to pass despite there being a bug
16
+ 5.times do
17
+ r = Fe::ReferenceSheet.new email: 'tester@test.com'
18
+ k1 = r.generate_access_key
19
+ k2 = r.generate_access_key
20
+ expect(k1).to_not eq(k2)
21
+ end
22
+ end
23
+ end
24
+
25
+ it 'returns the user for applicant' do
26
+ p = create(:fe_person)
27
+ a = create(:answer_sheet, applicant_id: p.id)
28
+ r = create(:reference_sheet, applicant_answer_sheet: a)
29
+ expect(r.applicant).to eq(a.applicant)
30
+ end
31
+
32
+ it 'returns the user for applicant' do
33
+ p = create(:fe_person)
34
+ a = create(:answer_sheet, applicant_id: p.id)
35
+ r = create(:reference_sheet, applicant_answer_sheet: a)
36
+ expect(r.applicant).to eq(a.applicant)
37
+ end
38
+
39
+ context '#required?' do
40
+ it 'should return the opposite of required? when optional? is false' do
41
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
42
+ application = FactoryBot.create(:answer_sheet)
43
+ application.question_sheets << question_sheet
44
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true)
45
+ question_sheet.pages.first.elements << element
46
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
47
+ allow(reference).to receive(:optional?).and_return(false)
48
+ expect(reference.optional?).to be false
49
+ expect(reference.required?).to be true
50
+ end
51
+ it 'should return the opposite of required? when optional? is true' do
52
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
53
+ application = FactoryBot.create(:answer_sheet)
54
+ application.question_sheets << question_sheet
55
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true)
56
+ question_sheet.pages.first.elements << element
57
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
58
+ allow(reference).to receive(:optional?).and_return(true)
59
+ expect(reference.optional?).to be true
60
+ expect(reference.required?).to be false
61
+ end
62
+ it 'should return false when the element is not required' do
63
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
64
+ application = FactoryBot.create(:answer_sheet)
65
+ application.question_sheets << question_sheet
66
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: false)
67
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
68
+ expect(reference.required?).to be false
69
+ end
70
+ end
71
+
72
+ context '#optional?' do
73
+ it 'returns true when the ref question element is hidden from a yes/no choice_field' do
74
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
75
+ choice_field = FactoryBot.create(:choice_field_element, label: "Is the reference required?")
76
+ question_sheet.pages.reload
77
+ question_sheet.pages[3].elements << choice_field
78
+ element = FactoryBot.create(:reference_element, label: "Reference question here", choice_field_id: choice_field.id, required: true)
79
+ question_sheet.pages[3].elements << element
80
+
81
+ application = FactoryBot.create(:answer_sheet)
82
+ application.question_sheets << question_sheet
83
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
84
+
85
+ # make the answer to the conditional question 'no' so that the ref is not required (optional true)
86
+ choice_field.set_response("no", application)
87
+ choice_field.save_response(application)
88
+
89
+ expect(reference.optional?).to be true
90
+ end
91
+ it 'returns false when the ref question element is visible from a yes/no choice_field' do
92
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
93
+ choice_field = FactoryBot.create(:choice_field_element, label: "Is the reference required?")
94
+ question_sheet.pages.reload
95
+ question_sheet.pages[3].elements << choice_field
96
+ element = FactoryBot.create(:reference_element, label: "Reference question here", choice_field_id: choice_field.id, required: true)
97
+ question_sheet.pages[3].elements << element
98
+
99
+ question_sheet.pages[3].elements << choice_field
100
+ application = FactoryBot.create(:answer_sheet)
101
+ application.question_sheets << question_sheet
102
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
103
+
104
+ # make the answer to the conditional question 'yes' so that the ref is required (optional false)
105
+ choice_field.set_response("yes", application)
106
+ choice_field.save_response(application)
107
+
108
+ expect(reference.optional?).to be false
109
+ end
110
+ it 'returns false when the ref question element is hidden from a conditional element' do
111
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
112
+ choice_field = FactoryBot.create(:choice_field_element, label: "Is the reference required?", conditional_type: "Fe::Element", conditional_answer: "yes")
113
+ question_sheet.pages.reload
114
+ question_sheet.pages[3].elements << choice_field
115
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true)
116
+ question_sheet.pages[3].elements << element
117
+
118
+ application = FactoryBot.create(:answer_sheet)
119
+ application.question_sheets << question_sheet
120
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
121
+
122
+ # make the answer to the conditional question 'no' so that the ref is not required (optional true)
123
+ choice_field.set_response("no", application)
124
+ choice_field.save_response(application)
125
+
126
+ expect(reference.optional?).to be true
127
+ end
128
+ it 'returns false when the ref question element is visible from a conditional element' do
129
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
130
+ choice_field = FactoryBot.create(:choice_field_element, label: "Is the reference required?", conditional_type: "Fe::Element", conditional_answer: "yes")
131
+ question_sheet.pages.reload
132
+ question_sheet.pages[3].elements << choice_field
133
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true)
134
+ question_sheet.pages[3].elements << element
135
+
136
+ application = FactoryBot.create(:answer_sheet)
137
+ application.question_sheets << question_sheet
138
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
139
+
140
+ # make the answer to the conditional question 'yes' so that the ref is required (optional false)
141
+ choice_field.set_response("yes", application)
142
+ choice_field.save_response(application)
143
+
144
+ expect(reference.optional?).to be false
145
+ end
146
+ end
147
+
148
+ it 'sets the question_sheet_id' do
149
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true, related_question_sheet_id: 1)
150
+ application = FactoryBot.create(:answer_sheet)
151
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
152
+ expect(reference.question_sheet_id).to eq(1)
153
+ end
154
+
155
+ it 'starts out in created status' do
156
+ r = create(:reference_sheet)
157
+ expect(r.status).to eq('created')
158
+ end
159
+
160
+ context '#check_email_change' do
161
+ let(:qs) { create(:question_sheet) }
162
+ let(:ref_qs) { create(:question_sheet) }
163
+ let(:ref_tf) { create(:text_field_element) }
164
+ let(:q) { create(:reference_question, related_question_sheet: ref_qs) }
165
+ let(:applicant) { FactoryBot.create(:fe_person) }
166
+ let(:application) { FactoryBot.create(:answer_sheet, applicant_id: applicant.id) }
167
+ let(:r) { create(:reference_sheet, status: 'started', question: q, email_sent_at: 1.hour.ago, applicant_answer_sheet: application) }
168
+ let(:a) { create(:answer, value: 'test', answer_sheet_id: r.id, question: ref_tf) }
169
+
170
+ before do
171
+ ref_qs.pages << create(:page)
172
+ ref_qs.pages.first.elements << ref_tf
173
+ @access_key_before = r.access_key
174
+ @a = create(:answer, value: 'test', answer_sheet_id: r.id, question: ref_tf)
175
+ create(:fe_email_template, name: 'Reference Deleted', subject: 'Reference Deleted', content: "<a href='test'>reference deleted</a>")
176
+ end
177
+
178
+ it 'should reset the answers and access key if created' do
179
+ r.update_column(:status, 'created')
180
+ r.update_attribute(:email, 'a@b.com')
181
+ expect(r.access_key).to_not eq(@access_key_before)
182
+ expect(Fe::Answer.count).to eq(0)
183
+ end
184
+
185
+ it 'should reset the answers and access key if started' do
186
+ r.update_column(:status, 'started')
187
+ r.update_attribute(:email, 'a@b.com')
188
+ expect(r.access_key).to_not eq(@access_key_before)
189
+ expect(Fe::Answer.count).to eq(0)
190
+ end
191
+
192
+ it 'should not reset the answers and access key if completed' do
193
+ r.update_column(:status, 'completed')
194
+ r.update_attribute(:email, 'a@b.com')
195
+ expect(r.access_key).to eq(@access_key_before)
196
+ expect(Fe::Answer.count).to eq(1)
197
+ end
198
+
199
+ it 'should not reset the answers and access key if completed' do
200
+ r.update_column(:status, 'completed')
201
+ r.update_attribute(:email, 'a@b.com')
202
+ expect(r.access_key).to eq(@access_key_before)
203
+ expect(Fe::Answer.find_by(id: a.id)).to_not be_nil
204
+ end
205
+
206
+ it "doesn't delete the answers if allow_quiet_reference_email_changes is set " do
207
+ r.update_column(:status, 'started')
208
+ r.update_attribute(:email, 'a@b.com')
209
+ r.allow_quiet_reference_email_changes = true
210
+ expect(r.access_key).to_not eq(@access_key_before)
211
+ expect(Fe::Answer.count).to eq(0)
212
+ end
213
+ end
214
+
215
+ context do
216
+ let(:qs) { create(:question_sheet_with_pages) }
217
+ let(:qs2) { create(:question_sheet_with_pages) }
218
+ let(:p) { qs.pages.first }
219
+ let(:p2) { qs.pages.first }
220
+ let(:ref_el) { create(:reference_element) }
221
+ let(:ref_el2) { create(:reference_element) }
222
+ let(:ref_el3) { create(:reference_element) }
223
+ let(:app) { create(:application) }
224
+ let(:affecting_el) { create(:choice_field_element, label: "Is the reference required?", conditional_type: "Fe::Element", conditional_id: ref_el.id, conditional_answer: "yes") }
225
+ let(:ref_sheet) { create(:reference_sheet, question: ref_el, applicant_answer_sheet_id: app.id) }
226
+
227
+ before do
228
+ p.elements << affecting_el << ref_el
229
+ p2.elements << ref_el2
230
+ app.question_sheets << qs << qs2
231
+ end
232
+
233
+ context '#computed_visibility_cache_key' do
234
+ it 'returns a cache key that changes when the answers on visibility_affecting_element_ids changes' do
235
+ # make the answer to the conditional question 'no' so that the ref is required (optional false)
236
+ affecting_el.set_response('no', app)
237
+ affecting_el.save_response(app)
238
+
239
+ cache_key_before = ref_sheet.computed_visibility_cache_key
240
+
241
+ # make the answer to the conditional question 'yes' so that the ref is required (optional false)
242
+ sleep(1) # make sure the update_at for the answer is changed
243
+ affecting_el.set_response('yes', app)
244
+ affecting_el.save_response(app)
245
+ cache_key_after = ref_sheet.computed_visibility_cache_key
246
+
247
+ expect(cache_key_before).to_not eq(cache_key_after)
248
+ end
249
+ end
250
+
251
+ context '#update_visible' do
252
+ it "doesn't recompute the visibility if the cache key is the same" do
253
+ # make the answer to the conditional question 'no' so that the ref is required (optional false)
254
+ affecting_el.set_response('no', app)
255
+ affecting_el.save_response(app)
256
+ ref_sheet.update_visible
257
+
258
+ # call update_visible again, it shouldn't update anything because the cache
259
+ # key hasn't changed
260
+ allow(ref_sheet).to receive(:question).and_return(ref_el)
261
+ expect(ref_el).to_not receive(:visible?)
262
+ ref_sheet.update_visible
263
+ end
264
+ it 'computes the visibility and sets the cache key if cache key is initially null' do
265
+ ref_sheet.update(visibility_cache_key: nil)
266
+
267
+ # make the answer to the conditional question 'no' so that the ref is required (optional false)
268
+ affecting_el.set_response('no', app)
269
+ affecting_el.save_response(app)
270
+ allow(ref_sheet).to receive(:question).and_return(ref_el)
271
+ expect(ref_el).to receive(:visible?).and_return(true)
272
+ ref_sheet.update_visible
273
+ ref_sheet.reload
274
+ expect(ref_sheet.visible).to be true
275
+ expect(ref_sheet.visibility_cache_key).to_not be_nil
276
+ end
277
+ it 'computes the visibility and sets the cache key if the cache key changes' do
278
+ ref_sheet.update(visibility_cache_key: 'something')
279
+
280
+ # make the answer to the conditional question 'no' so that the ref is required (optional false)
281
+ affecting_el.set_response('no', app)
282
+ affecting_el.save_response(app)
283
+ allow(ref_sheet).to receive(:question).and_return(ref_el)
284
+ expect(ref_el).to receive(:visible?).and_return(false)
285
+ ref_sheet.update_visible
286
+ ref_sheet.reload
287
+ expect(ref_sheet.visible).to be false
288
+ expect(ref_sheet.visibility_cache_key).to_not eq('something')
289
+ end
290
+ end
291
+ end
292
+
293
+ context '#all_affecting_questions_answered' do
294
+ let(:p) { create(:fe_person) }
295
+ let(:a) { create(:answer_sheet, applicant_id: p.id) }
296
+ let(:ref_el) { create(:reference_element) }
297
+ let(:r) { create(:reference_sheet, question_id: ref_el.id, applicant_answer_sheet: a) }
298
+ let(:text_el) { create(:text_field_element) }
299
+
300
+ it 'returns true when all visibility affecting questions are answered' do
301
+ expect(r).to receive(:question).and_return(ref_el).twice
302
+ expect(ref_el).to receive(:visibility_affecting_questions).and_return([text_el])
303
+ text_el.set_response('some text response', a)
304
+ text_el.save_response(a)
305
+ expect(r.all_affecting_questions_answered).to be true
306
+ end
307
+
308
+ it 'returns false when not all visibility affecting questions are answered' do
309
+ expect(r).to receive(:question).and_return(ref_el).twice
310
+ expect(ref_el).to receive(:visibility_affecting_questions).and_return([text_el])
311
+ expect(r.all_affecting_questions_answered).to be false
312
+ end
313
+ end
11
314
  end
@@ -14,4 +14,26 @@ describe Fe::TextField do
14
14
  expect(text_field.ptemplate).to eq("fe/text_area_field")
15
15
  end
16
16
  end
17
+
18
+ it 'should match conditional_match' do
19
+ qs = create(:question_sheet)
20
+ app = create(:application)
21
+ app.question_sheets << qs
22
+ e = create(:text_field_element, conditional_answer: 'a;b', style: 'drop-down')
23
+ qs.pages << create(:page)
24
+ qs.pages.reload.first.elements << e
25
+ a = create(:answer, question_id: e.id, value: 'b', answer_sheet_id: app.id)
26
+ expect(e.conditional_match(app)).to be true
27
+ end
28
+
29
+ it "should not match conditional_match if the answer doesn't match" do
30
+ qs = create(:question_sheet)
31
+ app = create(:application)
32
+ app.question_sheets << qs
33
+ e = create(:text_field_element, conditional_answer: 'a;b', style: 'drop-down')
34
+ qs.pages << create(:page)
35
+ qs.pages.reload.first.elements << e
36
+ a = create(:answer, question_id: e.id, value: 'c', answer_sheet_id: app.id)
37
+ expect(e.conditional_match(app)).to_not be true
38
+ end
17
39
  end
data/spec/rails_helper.rb CHANGED
@@ -1,66 +1,97 @@
1
1
  # This file is copied to spec/ when you run 'rails generate rspec:install'
2
- require 'spork'
3
2
 
4
- Spork.prefork do
5
- ENV["RAILS_ENV"] ||= 'test'
6
- require File.expand_path("../dummy/config/environment.rb", __FILE__)
7
- require 'rspec/rails'
8
- require 'rspec'
9
- require 'shoulda'
10
- require 'database_cleaner'
11
- require 'factory_girl_rails'
12
- require 'simplecov'
13
- SimpleCov.start 'rails' do
14
- add_filter "vendor"
15
- end
16
- Rails.backtrace_cleaner.remove_silencers!
3
+ ENV["RAILS_ENV"] ||= 'test'
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require 'rspec/rails'
6
+ require 'rspec'
7
+ require 'shoulda'
8
+ require 'database_cleaner'
9
+ require 'simplecov'
10
+ SimpleCov.start 'rails' do
11
+ add_filter "vendor"
12
+ end
13
+ Rails.backtrace_cleaner.remove_silencers!
14
+
15
+ # load concerns and decorators here now that code coverage has started
16
+ Dir.glob(File.join(Fe::Engine.root + 'app/**/*_concern.rb')).each do |c|
17
+ require_dependency(c)
18
+ end
19
+ Dir.glob(File.join(Rails.root + 'app/decorators/**/*_decorator.rb')).each do |c|
20
+ require_dependency(c)
21
+ end
22
+ require 'factory_bot_rails'
17
23
 
18
- ENGINE_RAILS_ROOT = File.join( File.dirname(__FILE__), '../' )
24
+ ENGINE_RAILS_ROOT = File.join( File.dirname(__FILE__), '../' )
19
25
 
20
- # Requires supporting ruby files with custom matchers and macros, etc,
21
- # in spec/support/ and its subdirectories.
22
- Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
23
- Dir[File.join(ENGINE_RAILS_ROOT,"spec/support/**/*.rb")].each {|f| require f}
26
+ # Requires supporting ruby files with custom matchers and macros, etc,
27
+ # in spec/support/ and its subdirectories.
28
+ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
29
+ Dir[File.join(ENGINE_RAILS_ROOT,"spec/support/**/*.rb")].each {|f| require f}
24
30
 
25
- RSpec.configure do |config|
31
+ RSpec.configure do |config|
26
32
 
27
- config.include FactoryGirl::Syntax::Methods
28
- #
29
- #config.before(:suite) do
30
- # DatabaseCleaner.strategy = :transaction
31
- # DatabaseCleaner.clean_with(:truncation)
32
- #end
33
- #config.before(:each) do
34
- # DatabaseCleaner.start
35
- #end
36
- #config.after(:each) do
37
- # DatabaseCleaner.clean
38
- #end
33
+ config.include FactoryBot::Syntax::Methods
39
34
 
40
- config.mock_with :rspec
41
- # muted to allow database_cleaner to work
42
- #
43
- # If you're not using ActiveRecord, or you'd prefer not to run each of your
44
- # examples within a transaction, remove the following line or assign false
45
- # instead of true.
46
- config.use_transactional_fixtures = true
35
+ config.before(:suite) do
36
+ DatabaseCleaner.strategy = :truncation
37
+ ActiveJob::Base.queue_adapter = :test
47
38
 
48
- # set to true (embrace the future)
49
- #
50
- # If true, the base class of anonymous controllers will be inferred
51
- # automatically. This will be the default behavior in future versions of
52
- # rspec-rails.
53
- config.infer_base_class_for_anonymous_controllers = true
39
+ # this usually would go in the app/decorators folder but there's some load order issues with the dummy app
40
+ # and it's just way easier to do it here
41
+ Fe::Application.class_eval do
42
+ belongs_to :applicant, foreign_key: 'applicant_id', class_name: 'Fe::Person'
43
+ end
44
+ ApplicationController.class_eval do
45
+ # some views use current_person, and putting it in the dummy app's
46
+ # application_controller isn't working
47
+ def current_person
48
+ end
49
+ helper_method :current_person
50
+ end
51
+ Fe::Person.class_eval do
52
+ # defining apps will implement phone
53
+ def phone
54
+ "123-456-7890"
55
+ end
56
+ # defining apps will implement email
57
+ def email
58
+ "email@email.com"
59
+ end
60
+ end
54
61
 
55
- # Run specs in random order to surface order dependencies. If you find an
56
- # order dependency and want to debug it, you can fix the order by providing
57
- # the seed, which is printed after each run.
58
- # --seed 1234
59
- config.order = "random"
60
62
  end
61
- end
63
+ config.before(:each) do
64
+ DatabaseCleaner.start
65
+ end
66
+ config.after(:each) do
67
+ DatabaseCleaner.clean
68
+ end
69
+
70
+ config.mock_with :rspec
71
+ # muted to allow database_cleaner to work
72
+ #
73
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
74
+ # examples within a transaction, remove the following line or assign false
75
+ # instead of true.
76
+ config.use_transactional_fixtures = false
77
+
78
+ # set to true (embrace the future)
79
+ #
80
+ # If true, the base class of anonymous controllers will be inferred
81
+ # automatically. This will be the default behavior in future versions of
82
+ # rspec-rails.
83
+ config.infer_base_class_for_anonymous_controllers = true
84
+
85
+ # Run specs in random order to surface order dependencies. If you find an
86
+ # order dependency and want to debug it, you can fix the order by providing
87
+ # the seed, which is printed after each run.
88
+ # --seed 1234
89
+ config.order = "random"
90
+
91
+ # always render views. the more view code that gets run the more likely we are to
92
+ # discover crashes in testing than in production
93
+ config.render_views
62
94
 
63
- Spork.each_run do
64
- # This code will be run each time you run your specs.
65
- FactoryGirl.reload
95
+ config.include(Shoulda::Matchers::ActiveModel, type: :model)
96
+ config.include(Shoulda::Matchers::ActiveRecord, type: :model)
66
97
  end
@@ -0,0 +1,6 @@
1
+ <choices>
2
+ <choice>A</choice>
3
+ <value>1</value>
4
+ <choice>B</choice>
5
+ <value>0</value>
6
+ </choices>