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,4 +1,4 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :answer_sheet_question_sheet, class: Fe::AnswerSheetQuestionSheet do
3
3
  end
4
4
  end
@@ -1,5 +1,5 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :answer_sheet, class: Fe::Application do
3
- created_at Time.now
3
+ created_at { Time.now }
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :answer, class: Fe::Answer do
3
3
  end
4
4
  end
@@ -1,7 +1,6 @@
1
- # Read about factories at https://github.com/thoughtbot/factory_girl
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
2
 
3
- FactoryGirl.define do
4
- factory :application, :class => 'Fe::Application' do
5
- applicant_id 1
3
+ FactoryBot.define do
4
+ factory :application, class: 'Fe::Application' do
6
5
  end
7
6
  end
@@ -0,0 +1,6 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
+
3
+ FactoryBot.define do
4
+ factory :dummy_application, class: 'Application' do
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
+
3
+ FactoryBot.define do
4
+ factory :dummy_person, class: 'Person' do
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
+
3
+ FactoryBot.define do
4
+ factory :dummy_user, class: 'User' do
5
+ end
6
+ end
@@ -1,19 +1,44 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :element, class: Fe::Element do
3
3
  sequence :label do |n| "Label Element #{n}" end
4
- required true
5
- sequence :slug do |n| "element_#{n}" end
4
+ required { true }
6
5
 
7
6
  factory :choice_field_element, class: Fe::ChoiceField do
8
- kind "Fe::ChoiceField"
9
- style "yes-no"
10
- content "Choice One\r\nChoice Two\r\nChoice Three"
7
+ kind { "Fe::ChoiceField" }
8
+ style { "yes-no" }
9
+ content { "Choice One\r\nChoice Two\r\nChoice Three" }
10
+ end
11
+ factory :date_field_element, class: Fe::DateField do
12
+ kind { "Fe::DateField" }
13
+ style { "date" }
11
14
  end
12
-
13
15
  factory :text_field_element, class: Fe::TextField do
14
- kind "Fe::TextField"
15
- style "short"
16
+ kind { "Fe::TextField" }
17
+ style { "short" }
18
+ end
19
+ factory :question_grid, class: Fe::QuestionGrid do
20
+ kind { "Fe::QuestionGrid" }
21
+ style { "grid" }
22
+ end
23
+ factory :question_grid_with_total, class: Fe::QuestionGridWithTotal do
24
+ kind { "Fe::QuestionGridWithTotal" }
25
+ style { "grid" }
26
+ end
27
+ factory :reference_element, class: Fe::ReferenceQuestion do
28
+ kind { "Fe::ReferenceQuestion" }
29
+ style { "staff" }
30
+ end
31
+ factory :section, class: Fe::Section do
32
+ kind { "Fe::Section" }
33
+ style { "section" }
34
+ end
35
+ factory :attachment_field_element, class: Fe::AttachmentField do
36
+ kind { "Fe::AttachmentField" }
37
+ style { "section" }
38
+ end
39
+ factory :state_chooser_element, class: Fe::StateChooser do
40
+ kind { "Fe::StateChooser" }
41
+ style { "section" }
16
42
  end
17
43
  end
18
44
  end
19
-
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :email_template, class: 'Fe::EmailTemplate' do
3
+ name { "Staff Payment Request" }
4
+ end
5
+ end
@@ -1,14 +1,14 @@
1
- # Read about factories at https://github.com/thoughtbot/factory_girl
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
2
 
3
- FactoryGirl.define do
3
+ FactoryBot.define do
4
4
  factory :fe_address, class: Fe::Address do
5
- address1 "MyString"
6
- address2 "MyString"
7
- address3 "MyString"
8
- address4 "MyString"
9
- city "MyString"
10
- state "MyString"
11
- zip "MyString"
12
- country "MyString"
5
+ address1 { "MyString" }
6
+ address2 { "MyString" }
7
+ address3 { "MyString" }
8
+ address4 { "MyString" }
9
+ city { "MyString" }
10
+ state { "MyString" }
11
+ zip { "MyString" }
12
+ country { "MyString" }
13
13
  end
14
14
  end
@@ -1,7 +1,7 @@
1
- # Read about factories at https://github.com/thoughtbot/factory_girl
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
2
 
3
- FactoryGirl.define do
4
- factory :fe_email_address, :class => Fe::EmailAddress do
3
+ FactoryBot.define do
4
+ factory :fe_email_address, class: Fe::EmailAddress do
5
5
  sequence(:email) { |n| "email_#{n}@email.com" }
6
6
  end
7
7
  end
@@ -0,0 +1,9 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
+
3
+ FactoryBot.define do
4
+ factory :fe_email_template, class: Fe::EmailTemplate do
5
+ sequence(:content) { |n| "content_#{n}" }
6
+ sequence(:subject) { |n| "subject#{n}" }
7
+ enabled { true }
8
+ end
9
+ end
@@ -1,10 +1,8 @@
1
- # Read about factories at https://github.com/thoughtbot/factory_girl
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
2
 
3
- FactoryGirl.define do
4
- factory :fe_person, :class => 'Fe::Person' do
5
- first_name "MyString"
6
- last_name "MyString"
7
- user_id 1
8
- is_staff false
3
+ FactoryBot.define do
4
+ factory :fe_person, class: 'Fe::Person' do
5
+ first_name { "MyString" }
6
+ last_name { "MyString" }
9
7
  end
10
8
  end
@@ -1,7 +1,7 @@
1
- # Read about factories at https://github.com/thoughtbot/factory_girl
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
2
 
3
- FactoryGirl.define do
4
- factory :fe_phone_number, :class => Fe::PhoneNumber do
3
+ FactoryBot.define do
4
+ factory :fe_phone_number, class: Fe::PhoneNumber do
5
5
  sequence(:number) { |n| "#{n}" * 6 }
6
6
  end
7
7
  end
@@ -0,0 +1,6 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_bot
2
+
3
+ FactoryBot.define do
4
+ factory :fe_user, class: 'Fe::User' do
5
+ end
6
+ end
@@ -1,4 +1,4 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
 
3
3
  factory :page, class: Fe::Page do
4
4
  sequence :label do |n| "Label Page #{n}" end
@@ -1,4 +1,4 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :page_element, class: Fe::PageElement do
3
3
  end
4
4
  end
@@ -1,4 +1,4 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :paragraph, class: Fe::Paragraph do
3
3
  end
4
4
  end
@@ -1,10 +1,10 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :question_sheet, class: Fe::QuestionSheet do
3
3
  sequence(:label) { |n| "Question Sheet #{n}"}
4
4
 
5
5
  factory :question_sheet_with_pages do
6
- ignore do
7
- pages_count 5
6
+ transient do
7
+ pages_count { 5 }
8
8
  end
9
9
 
10
10
  after(:create) do |question_sheet, evaluator|
@@ -1,4 +1,4 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :reference_question, class: Fe::ReferenceQuestion do
3
3
  end
4
4
  end
@@ -0,0 +1,9 @@
1
+ FactoryBot.define do
2
+ factory :reference_sheet, class: Fe::ReferenceSheet do
3
+ sequence(:email) { |n| "email_#{n}@email.com" }
4
+ sequence(:first_name) { |n| "fn_#{n}" }
5
+ sequence(:last_name) { |n| "ln_#{n}" }
6
+ sequence(:phone) { |n| "phone_#{n}" }
7
+ sequence(:relationship) { |n| "relationship_#{n}" }
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.describe Fe::UpdateReferenceSheetVisibilityJob, type: :job do
4
+ it "matches with enqueued job" do
5
+ expect {
6
+ Fe::UpdateReferenceSheetVisibilityJob.perform_later(create(:application), [1])
7
+ }.to have_enqueued_job(Fe::UpdateReferenceSheetVisibilityJob)
8
+ end
9
+
10
+ context '#perform' do
11
+ let(:qs) { create(:question_sheet_with_pages) }
12
+ let(:qs2) { create(:question_sheet_with_pages) }
13
+ let(:p) { qs.pages.first }
14
+ let(:p2) { qs.pages.first }
15
+ let(:ref_el) { create(:reference_element) }
16
+ let(:ref_el2) { create(:reference_element) }
17
+ let(:ref_el3) { create(:reference_element) }
18
+ let(:app) { create(:application) }
19
+ let(:affecting_el) { create(:text_field_element) }
20
+
21
+ before do
22
+ p.elements << ref_el
23
+ p2.elements << ref_el2
24
+ app.question_sheets << qs << qs2
25
+ end
26
+
27
+ it "calls update_visible for all refs whose visibility_affecting_element_ids include the answer's question" do
28
+ expect(app).to receive(:question_sheets_all_reference_elements).and_return([ref_el, ref_el2])
29
+ expect(ref_el).to receive(:visibility_affecting_element_ids).and_return([affecting_el.id])
30
+ expect(ref_el).to receive(:update_visible)
31
+ ref_el_arr = [ref_el]
32
+ allow(app).to receive(:all_references).and_return(ref_el_arr)
33
+ allow(ref_el_arr).to receive(:where).with(question_id: ref_el.id).and_return(ref_el_arr)
34
+ expect(ref_el2).to receive(:visibility_affecting_element_ids).and_return([])
35
+ qs = Fe::QuestionSet.new([affecting_el], app)
36
+ puts app.object_id
37
+ Fe::UpdateReferenceSheetVisibilityJob.new.perform(app, qs.questions.collect(&:id))
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Fe::Notifier do
4
+ describe 'instructions' do
5
+ let(:user) { mock_model User, name: 'Lucas', email: 'lucas@email.com' }
6
+ let(:mail) { Fe::Notifier.notification('recipient@test.com', 'from@test.com', 'Staff Payment Request', {}, {format: 'html'}) }
7
+
8
+ before(:each) do
9
+ create(:fe_email_template, name: 'Staff Payment Request', subject: 'Staff Payment Request Subject', content: "<a href='test'>test</a>")
10
+ end
11
+
12
+ it 'renders the subject' do
13
+ expect(mail.subject).to eql('Staff Payment Request Subject')
14
+ end
15
+
16
+ it 'renders the receiver email' do
17
+ expect(mail.to).to eql(['recipient@test.com'])
18
+ end
19
+
20
+ it 'renders the sender email' do
21
+ expect(mail.from).to eql(['from@test.com'])
22
+ end
23
+
24
+ it 'sets the email to be an html email when format passed in is html' do
25
+ mail = Fe::Notifier.notification('recipient@test.com', 'from@test.com', 'Staff Payment Request', {}, {format: 'html'})
26
+ expect(mail[:content_type].to_s).to match(/text\/html/)
27
+ end
28
+
29
+ it 'sets the email to be a text email when text format is passed in' do
30
+ mail = Fe::Notifier.notification('recipient@test.com', 'from@test.com', 'Staff Payment Request', {}, {format: 'text'})
31
+ expect(mail[:content_type].to_s).to match(/text\/plain/)
32
+ end
33
+
34
+ it 'sets the email to be a text email when no format passed in' do
35
+ mail = Fe::Notifier.notification('recipient@test.com', 'from@test.com', 'Staff Payment Request', {}, {})
36
+ expect(mail[:content_type].to_s).to match(/text\/plain/)
37
+ end
38
+ end
39
+ end
@@ -1,6 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::AnswerSheetQuestionSheet do
3
+ describe Fe::AnswerSheetQuestionSheet, type: :model do
4
4
  it { expect belong_to :answer_sheet }
5
5
  it { expect belong_to :question_sheet }
6
6
  end
@@ -1,9 +1,9 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Answer do
3
+ describe Fe::Answer, type: :model do
4
4
  it { expect belong_to :answer_sheet }
5
5
  it { expect belong_to :question }
6
- it { expect ensure_length_of :short_value }
6
+ it { expect validate_length_of :short_value }
7
7
 
8
8
  it '#to_s' do
9
9
  answer = Fe::Answer.new
@@ -1,8 +1,101 @@
1
1
  require 'rails_helper'
2
2
 
3
- RSpec.describe Fe::Application, :type => :model do
3
+ RSpec.describe Fe::Application, type: :model do
4
4
  it { expect have_many :answer_sheet_question_sheets }
5
5
  it { expect have_many :question_sheets }
6
6
  it { expect have_many :answers }
7
7
  it { expect have_many :reference_sheets }
8
+
9
+ let(:qs) { create(:question_sheet_with_pages) }
10
+ let(:qs2) { create(:question_sheet_with_pages) }
11
+ let(:p) { qs.pages.first }
12
+ let(:p2) { qs.pages.first }
13
+ let(:ref_el) { create(:reference_element) }
14
+ let(:ref_el2) { create(:reference_element) }
15
+ let(:ref_el3) { create(:reference_element) }
16
+ let(:app) { create(:application) }
17
+
18
+ before do
19
+ p.elements << ref_el
20
+ p2.elements << ref_el2
21
+ app.question_sheets << qs << qs2
22
+ end
23
+
24
+ context '#percentage_complete' do
25
+ before do
26
+ @q = create(:question_sheet_with_pages)
27
+ @p = @q.pages.first
28
+ @p2 = @q.pages.second
29
+
30
+ @yesno = create(:choice_field_element, required: false, label: 'yesno lvl1 hidden-gridparent') # answered
31
+ @grid = create(:question_grid, choice_field: @yesno, label: 'hidden grid')
32
+ @text1 = create(:text_field_element, label: 'lvl2 hidden required', question_grid: @grid, required: true) # NOT answered
33
+ @text2 = create(:text_field_element, label: 'lvl2 hidden required2', question_grid: @grid, required: true) # answered (but doesn't count because hidden)
34
+ @text3 = create(:text_field_element, label: 'lvl2 hidden optional', question_grid: @grid, required: false) # answered (but doesn't count because hidden)
35
+
36
+ @text4 = create(:text_field_element, label: 'lvl1 optional', required: false) # answered
37
+ @text5 = create(:text_field_element, label: 'lvl1 required', required: true, object_name: 'applicant', attribute_name: 'first_name') # answered
38
+ @text6 = create(:text_field_element, label: 'lvl1 required2', required: true) # NOT answered
39
+
40
+ @yesno2 = create(:choice_field_element, required: false, label: 'yesno2 lvl1 visible-gridparent2') # answered
41
+ @grid2 = create(:question_grid, choice_field: @yesno2, label: 'visible grid')
42
+ @text7 = create(:text_field_element, label: 'lvl2 visible required', question_grid: @grid2, required: true) # NOT answered
43
+ @text8 = create(:text_field_element, label: 'lvl2 visible required2', question_grid: @grid2, required: true) # answered
44
+ @text9 = create(:text_field_element, label: 'lvl2 visible optional', question_grid: @grid2, required: false) # answered
45
+
46
+ @p.elements << @yesno
47
+ @p.elements << @yesno2
48
+ @p.elements << @text4
49
+ @p.elements << @text5
50
+ @p2.elements << @text6
51
+
52
+ person = create(:fe_person)
53
+ @a = create(:application, applicant_id: person.id)
54
+
55
+ @yesno.set_response('no', @a)
56
+ @yesno.save_response(@a)
57
+ @yesno2.set_response('yes', @a)
58
+ @yesno2.save_response(@a)
59
+ @text2.set_response('this answer is not counted, yesno parent is no so this is hidden', @a)
60
+ @text2.save_response(@a)
61
+ @text3.set_response('this answer is not counted, yesno parent is no so this is hidden', @a)
62
+ @text3.save_response(@a)
63
+ @text4.set_response('this answer is counted when optional included', @a)
64
+ @text4.save_response(@a)
65
+ @text5.set_response('this answer is counted', @a)
66
+ @text5.save_response(@a)
67
+
68
+ @text8.set_response('this answer is counted', @a)
69
+ @text8.save_response(@a)
70
+ @text9.set_response('this answer is counted when optional included', @a)
71
+ @text9.save_response(@a)
72
+
73
+ FactoryBot.create(:answer_sheet_question_sheet, answer_sheet: @a, question_sheet: @q)
74
+ end
75
+
76
+ it 'counts only required elements by default' do
77
+ @a.reload
78
+ expect(@a.percent_complete).to eq(50) # 2 of 4
79
+ end
80
+ it 'counts all questions, not just required ones, when specified' do
81
+ @a.reload
82
+ expect(@a.percent_complete(false)).to eq(75) # 6 of 8 (2 yes/no + 3 txts within the 1 visible grid + 2 txts directly on page, 1 on other page)
83
+ end
84
+ it 'supports specifying a page' do
85
+ @a.reload
86
+ expect(@a.percent_complete(false, [@p])).to eq(85) # 6 of 7 (2 yes/no + 3 txts within the 1 visible grid + 2 txts directly on page)
87
+ end
88
+ end
89
+
90
+ context '#question_sheets_all_reference_elements' do
91
+ it 'returns all reference elements for all question sheets' do
92
+ expect(app.question_sheets_all_reference_elements).to eq([ref_el, ref_el2])
93
+ end
94
+
95
+ it 'returns a reference that was just added' do
96
+ expect(app.question_sheets_all_reference_elements).to eq([ref_el, ref_el2])
97
+ p.elements << ref_el3
98
+ expect(app.question_sheets_all_reference_elements).to eq([ref_el, ref_el2, ref_el3])
99
+ end
100
+ end
8
101
  end
@@ -1,4 +1,5 @@
1
1
  require 'rails_helper'
2
+ require 'rexml/document'
2
3
 
3
4
  describe Fe::ChoiceField do
4
5
 
@@ -29,4 +30,69 @@ describe Fe::ChoiceField do
29
30
  end
30
31
  end
31
32
 
33
+ context '#choices' do
34
+ it 'should work for yes-no style' do
35
+ expect(Fe::ChoiceField.new(style: 'yes-no').choices).to eq([["Yes",1],["No",0]])
36
+ end
37
+ it 'should work for acceptance style' do
38
+ expect(Fe::ChoiceField.new(style: 'acceptance').choices).to eq([["Yes",1],["No",0]])
39
+ end
40
+ it 'should work for a local source using libxml' do
41
+ expect(Fe::ChoiceField.new(style: 'drop-down', source: 'spec/support/choices.xml', text_xpath: 'choice', value_xpath: 'value').choices).to eq([["A","1"],["B","0"]])
42
+ end
43
+ if RUBY_VERSION =~ /^2/
44
+ it 'should work for a remote source using rexml' do
45
+ expect(Fe::ChoiceField.new(style: 'drop-down', source: 'https://raw.githubusercontent.com/CruGlobal/fe/master/spec/support/choices.xml', text_xpath: '*/choice', value_xpath: '*/value').choices).to eq([["A","1"],["B","0"]])
46
+ end
47
+ end
48
+ it 'should work for content set' do
49
+ expect(Fe::ChoiceField.new(style: 'drop-down', content: "1;A\n0;B").choices).to eq([["A","1"],["B","0"]])
50
+ end
51
+ end
52
+
53
+ context '#conditional_match' do
54
+ it 'returns true if any of the options from conditional_answer are selected' do
55
+ qs = create(:question_sheet)
56
+ app = create(:application)
57
+ app.question_sheets << qs
58
+ e = create(:choice_field_element, conditional_answer: 'a;b', style: 'drop-down')
59
+ qs.pages << create(:page)
60
+ qs.pages.reload.first.elements << e
61
+ a = create(:answer, question: e, value: 'a', answer_sheet_id: app.id)
62
+ a = create(:answer, question: e, value: 'b', answer_sheet_id: app.id)
63
+ a = create(:answer, question: e, value: 'c', answer_sheet_id: app.id)
64
+ expect(e.conditional_match(app)).to be true
65
+ end
66
+ it 'returns false if any of none of the options match conditional_answer' do
67
+ qs = create(:question_sheet)
68
+ app = create(:application)
69
+ app.question_sheets << qs
70
+ e = create(:choice_field_element, conditional_answer: 'a;b', style: 'drop-down')
71
+ qs.pages << create(:page)
72
+ qs.pages.reload.first.elements << e
73
+ a = create(:answer, question: e, value: 'c', answer_sheet_id: app.id)
74
+ a = create(:answer, question: e, value: 'd', answer_sheet_id: app.id)
75
+ expect(e.conditional_match(app)).to be false
76
+ end
77
+ it 'returns true if the conditional_answer is empty and no options are selected' do
78
+ qs = create(:question_sheet)
79
+ app = create(:application)
80
+ app.question_sheets << qs
81
+ e = create(:choice_field_element, conditional_answer: '', style: 'drop-down')
82
+ qs.pages << create(:page)
83
+ qs.pages.reload.first.elements << e
84
+ expect(e.conditional_match(app)).to be true
85
+ end
86
+ it 'returns true regardless of whitespace separating conditional answers' do
87
+ qs = create(:question_sheet)
88
+ app = create(:application)
89
+ app.question_sheets << qs
90
+ e = create(:choice_field_element, conditional_answer: "a; b\n", style: 'drop-down')
91
+ qs.pages << create(:page)
92
+ qs.pages.reload.first.elements << e
93
+ a = create(:answer, question: e, value: 'a', answer_sheet_id: app.id)
94
+ a = create(:answer, question: e, value: 'd', answer_sheet_id: app.id)
95
+ expect(e.conditional_match(app)).to be true
96
+ end
97
+ end
32
98
  end
@@ -1,8 +1,8 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Condition do
3
+ describe Fe::Condition, type: :model do
4
4
  it { expect belong_to :question_sheet }
5
5
  it { expect belong_to :trigger }
6
6
  it { expect validate_presence_of :expression }
7
- it { expect ensure_length_of :expression }
7
+ it { expect validate_length_of :expression }
8
8
  end