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.
- checksums.yaml +5 -5
- data/README.md +4 -4
- data/Rakefile +16 -36
- data/app/assets/config/fe/manifest.js +3 -0
- data/app/assets/config/manifest.js +3 -0
- data/app/assets/javascripts/application.js.erb +1 -1
- data/app/assets/javascripts/fe/admin.js +0 -2
- data/app/assets/javascripts/fe/fe.admin.js +40 -20
- data/app/assets/javascripts/fe/fe.common.js.erb +98 -0
- data/app/assets/javascripts/fe/fe.public.js +2 -416
- data/app/assets/javascripts/fe/fe.public.nojquery.js.erb +526 -0
- data/app/assets/javascripts/fe/jquery.html5_upload.js +258 -0
- data/app/assets/javascripts/fe/jquery.validate.pack.js +3 -15
- data/app/assets/stylesheets/fe/fe.screen.css.scss.erb +90 -10
- data/app/assets/stylesheets/fe/validation.css +5 -1
- data/app/controllers/concerns/fe/admin/question_sheets_controller_concern.rb +111 -0
- data/app/controllers/concerns/fe/answer_pages_controller_concern.rb +131 -0
- data/app/controllers/{fe/concerns → concerns/fe}/answer_sheets_controller_concern.rb +15 -7
- data/app/controllers/{fe/concerns → concerns/fe}/application_controller_concern.rb +15 -2
- data/app/controllers/fe/admin/elements_controller.rb +102 -64
- data/app/controllers/fe/admin/email_templates_controller.rb +7 -7
- data/app/controllers/fe/admin/question_pages_controller.rb +9 -9
- data/app/controllers/fe/admin/question_sheets_controller.rb +2 -103
- data/app/controllers/fe/reference_pages_controller.rb +11 -11
- data/app/controllers/fe/reference_sheets_controller.rb +6 -4
- data/app/controllers/fe/references_controller.rb +20 -19
- data/app/controllers/fe/submit_pages_controller.rb +5 -5
- data/app/helpers/fe/answer_pages_helper.rb +1 -1
- data/app/helpers/fe/application_helper.rb +8 -3
- data/app/jobs/fe/update_reference_sheet_visibility_job.rb +11 -0
- data/app/mailers/fe/notifier.rb +12 -5
- data/app/models/answer_sheet.rb +2 -0
- data/app/models/application_record.rb +3 -0
- data/app/models/{fe/concerns → concerns/fe}/answer_concern.rb +2 -2
- data/app/models/{fe/concerns → concerns/fe}/answer_pages_presenter_concern.rb +15 -5
- data/app/models/concerns/fe/answer_sheet_concern.rb +125 -0
- data/app/models/{fe/concerns → concerns/fe}/choice_field_concern.rb +56 -31
- data/app/models/fe/address.rb +2 -2
- data/app/models/fe/answer.rb +1 -1
- data/app/models/fe/answer_sheet.rb +1 -1
- data/app/models/fe/answer_sheet_question_sheet.rb +2 -2
- data/app/models/fe/application.rb +15 -10
- data/app/models/fe/condition.rb +4 -4
- data/app/models/fe/date_field.rb +2 -2
- data/app/models/fe/element.rb +201 -45
- data/app/models/fe/email_address.rb +2 -2
- data/app/models/fe/email_template.rb +1 -1
- data/app/models/fe/page.rb +138 -31
- data/app/models/fe/page_element.rb +8 -3
- data/app/models/fe/page_link.rb +6 -3
- data/app/models/fe/paragraph.rb +1 -1
- data/app/models/fe/person.rb +16 -13
- data/app/models/fe/phone_number.rb +1 -1
- data/app/models/fe/question.rb +64 -44
- data/app/models/fe/question_grid.rb +16 -4
- data/app/models/fe/question_grid_with_total.rb +15 -0
- data/app/models/fe/question_set.rb +54 -14
- data/app/models/fe/question_sheet.rb +54 -19
- data/app/models/fe/reference_question.rb +9 -13
- data/app/models/fe/reference_sheet.rb +113 -54
- data/app/models/fe/state_chooser.rb +2 -2
- data/app/models/fe/text_field.rb +2 -2
- data/app/models/fe/user.rb +1 -1
- data/app/models/staff.rb +8 -6
- data/app/validators/email_validator.rb +11 -0
- data/app/views/fe/admin/elements/create.js.erb +4 -3
- data/app/views/fe/admin/elements/destroy.js.erb +1 -1
- data/app/views/fe/admin/elements/drop.js.erb +2 -1
- data/app/views/fe/admin/elements/duplicate.js.erb +2 -1
- data/app/views/fe/admin/elements/edit.js.erb +1 -1
- data/app/views/fe/admin/elements/error.js.erb +1 -1
- data/app/views/fe/admin/elements/new.js.erb +13 -6
- data/app/views/fe/admin/elements/update.js.erb +1 -1
- data/app/views/fe/admin/email_templates/_form.html.erb +3 -3
- data/app/views/fe/admin/email_templates/edit.html.erb +3 -3
- data/app/views/fe/admin/email_templates/index.html.erb +3 -3
- data/app/views/fe/admin/email_templates/new.html.erb +3 -3
- data/app/views/fe/admin/panels/_advanced_options.html.erb +16 -10
- data/app/views/fe/admin/panels/_common_boolean_fields.html.erb +1 -0
- data/app/views/fe/admin/panels/_common_boolean_fields_default.html.erb +11 -0
- data/app/views/fe/admin/panels/_common_fields.html.erb +18 -19
- data/app/views/fe/admin/panels/_condition.html.erb +1 -1
- data/app/views/fe/admin/panels/_insert.html.erb +25 -25
- data/app/views/fe/admin/panels/_nav_controls.html.erb +4 -4
- data/app/views/fe/admin/panels/_page.html.erb +2 -2
- data/app/views/fe/admin/panels/_pages_list.html.erb +3 -3
- data/app/views/fe/admin/panels/_prop_attachment_field.html.erb +2 -2
- data/app/views/fe/admin/panels/_prop_choice_field.html.erb +52 -24
- data/app/views/fe/admin/panels/_prop_date_field.html.erb +1 -1
- data/app/views/fe/admin/panels/_prop_element.html.erb +7 -14
- data/app/views/fe/admin/panels/_prop_page.html.erb +11 -6
- data/app/views/fe/admin/panels/_prop_paragraph.html.erb +38 -24
- data/app/views/fe/admin/panels/_prop_question_grid.html.erb +7 -2
- data/app/views/fe/admin/panels/_prop_question_grid_with_total.html.erb +2 -2
- data/app/views/fe/admin/panels/_prop_reference_question.html.erb +3 -3
- data/app/views/fe/admin/panels/_prop_section.html.erb +8 -2
- data/app/views/fe/admin/panels/_prop_sheet.html.erb +7 -4
- data/app/views/fe/admin/panels/_prop_text_field.html.erb +12 -12
- data/app/views/fe/admin/question_pages/_element.html.erb +16 -6
- data/app/views/fe/admin/question_pages/_element_show.html.erb +2 -2
- data/app/views/fe/admin/question_pages/_question_page.html.erb +4 -4
- data/app/views/fe/admin/question_pages/create.js.erb +3 -3
- data/app/views/fe/admin/question_pages/destroy.js.erb +3 -3
- data/app/views/fe/admin/question_pages/edit.js.erb +1 -1
- data/app/views/fe/admin/question_pages/error.js.erb +1 -1
- data/app/views/fe/admin/question_pages/show.js.erb +2 -2
- data/app/views/fe/admin/question_pages/show_panel.js.erb +1 -1
- data/app/views/fe/admin/question_pages/update.js.erb +1 -1
- data/app/views/fe/admin/question_sheets/edit.js.erb +1 -1
- data/app/views/fe/admin/question_sheets/error.js.erb +1 -1
- data/app/views/fe/admin/question_sheets/index.html.erb +8 -8
- data/app/views/fe/admin/question_sheets/new.html.erb +3 -3
- data/app/views/fe/admin/question_sheets/show.html.erb +5 -5
- data/app/views/fe/admin/question_sheets/update.js.erb +1 -1
- data/app/views/fe/answer_pages/_answer_page.html.erb +14 -14
- data/app/views/fe/answer_pages/_element.html.erb +25 -6
- data/app/views/fe/answer_pages/_page_name.html.erb +1 -0
- data/app/views/fe/answer_pages/show.html.erb +39 -0
- data/app/views/fe/answer_pages/update.js.erb +11 -3
- data/app/views/fe/answer_sheets/_answer_sheet.html.erb +6 -6
- data/app/views/fe/answer_sheets/_element.html.erb +55 -35
- data/app/views/fe/answer_sheets/_incomplete.html.erb +1 -1
- data/app/views/fe/answer_sheets/_page_link.html.erb +9 -7
- data/app/views/fe/answer_sheets/_pages_list.html.erb +4 -4
- data/app/views/fe/answer_sheets/_submit_to.html.erb +1 -0
- data/app/views/fe/answer_sheets/_title.html.erb +1 -1
- data/app/views/fe/answer_sheets/edit.html.erb +24 -24
- data/app/views/fe/answer_sheets/incomplete.js.erb +9 -3
- data/app/views/fe/answer_sheets/index.html.erb +3 -3
- data/app/views/fe/answer_sheets/show.html.erb +1 -1
- data/app/views/fe/applications/_logout.html.erb +1 -0
- data/app/views/fe/applications/show.html.erb +1 -0
- data/app/views/fe/questions/fe/_acceptance.html.erb +11 -10
- data/app/views/fe/questions/fe/_attachment_field.html.erb +133 -10
- data/app/views/fe/questions/fe/_checkbox_field.html.erb +34 -30
- data/app/views/fe/questions/fe/_country.html.erb +6 -6
- data/app/views/fe/questions/fe/_date_field.html.erb +5 -5
- data/app/views/fe/questions/fe/_date_field_mmyy.html.erb +8 -8
- data/app/views/fe/questions/fe/_drop_down_field.html.erb +7 -6
- data/app/views/fe/questions/fe/_paragraph.html.erb +1 -1
- data/app/views/fe/questions/fe/_question_grid.html.erb +21 -16
- data/app/views/fe/questions/fe/_question_grid_with_total.html.erb +25 -18
- data/app/views/fe/questions/fe/_questions.html.erb +11 -5
- data/app/views/fe/questions/fe/_radio_button_field.html.erb +42 -25
- data/app/views/fe/questions/fe/_rating.html.erb +57 -18
- data/app/views/fe/questions/fe/_reference_discipler.html.erb +1 -1
- data/app/views/fe/questions/fe/_reference_friend.html.erb +1 -1
- data/app/views/fe/questions/fe/_reference_parent.html.erb +1 -1
- data/app/views/fe/questions/fe/_reference_peer.html.erb +1 -1
- data/app/views/fe/questions/fe/_reference_question.html.erb +44 -21
- data/app/views/fe/questions/fe/_reference_roommate.html.erb +1 -1
- data/app/views/fe/questions/fe/_reference_spiritual.html.erb +1 -1
- data/app/views/fe/questions/fe/_reference_staff.html.erb +1 -1
- data/app/views/fe/questions/fe/_section.html.erb +1 -1
- data/app/views/fe/questions/fe/_state_chooser.html.erb +6 -6
- data/app/views/fe/questions/fe/_text_area_field.html.erb +17 -6
- data/app/views/fe/questions/fe/_text_field.html.erb +7 -6
- data/app/views/fe/questions/fe/_yes_no.html.erb +8 -8
- data/app/views/fe/questions/fe/_yes_no_field.erb +12 -9
- data/app/views/fe/reference_pages/_reference.html.erb +15 -15
- data/app/views/fe/reference_pages/edit.html.erb +9 -9
- data/app/views/fe/reference_sheets/done.html.erb +2 -2
- data/app/views/fe/reference_sheets/not_found.html.erb +4 -4
- data/app/views/fe/references/edit.html.erb +6 -6
- data/app/views/fe/references/show.html.erb +8 -8
- data/app/views/fe/references/submit.js.erb +3 -3
- data/app/views/fe/submit_pages/_thankyou.html.erb +1 -1
- data/app/views/fe/submit_pages/edit.html.erb +12 -12
- data/app/views/fe/submit_pages/error.js.erb +1 -1
- data/app/views/fe/submit_pages/submit.js.erb +2 -2
- data/app/views/layouts/fe/_error_messages_for.html.erb +7 -0
- data/app/views/layouts/fe/application.html.erb +4 -5
- data/app/views/layouts/fe/fe_admin.html.erb +30 -0
- data/app/views.current/fe/admin/elements/_errors.html.erb +11 -0
- data/app/views.current/fe/admin/elements/create.js.erb +12 -0
- data/app/views.current/fe/admin/elements/destroy.js.erb +4 -0
- data/app/views.current/fe/admin/elements/drop.js.erb +3 -0
- data/app/views.current/fe/admin/elements/duplicate.js.erb +3 -0
- data/app/views.current/fe/admin/elements/edit.js.erb +4 -0
- data/app/views.current/fe/admin/elements/error.js.erb +4 -0
- data/app/views.current/fe/admin/elements/new.js.erb +17 -0
- data/app/views.current/fe/admin/elements/reorder.js.erb +0 -0
- data/app/views.current/fe/admin/elements/update.js.erb +9 -0
- data/app/views.current/fe/admin/email_templates/_form.html.erb +8 -0
- data/app/views.current/fe/admin/email_templates/edit.html.erb +13 -0
- data/app/views.current/fe/admin/email_templates/index.html.erb +20 -0
- data/app/views.current/fe/admin/email_templates/new.html.erb +11 -0
- data/app/views.current/fe/admin/panels/_advanced_options.html.erb +49 -0
- data/app/views.current/fe/admin/panels/_common_boolean_fields.html.erb +1 -0
- data/app/views.current/fe/admin/panels/_common_boolean_fields_default.html.erb +11 -0
- data/app/views.current/fe/admin/panels/_common_fields.html.erb +23 -0
- data/app/views.current/fe/admin/panels/_condition.html.erb +6 -0
- data/app/views.current/fe/admin/panels/_insert.html.erb +39 -0
- data/app/views.current/fe/admin/panels/_nav_controls.html.erb +6 -0
- data/app/views.current/fe/admin/panels/_page.html.erb +3 -0
- data/app/views.current/fe/admin/panels/_pages_list.html.erb +16 -0
- data/app/views.current/fe/admin/panels/_prop_attachment_field.html.erb +2 -0
- data/app/views.current/fe/admin/panels/_prop_choice_field.html.erb +74 -0
- data/app/views.current/fe/admin/panels/_prop_date_field.html.erb +7 -0
- data/app/views.current/fe/admin/panels/_prop_element.html.erb +23 -0
- data/app/views.current/fe/admin/panels/_prop_page.html.erb +26 -0
- data/app/views.current/fe/admin/panels/_prop_paragraph.html.erb +46 -0
- data/app/views.current/fe/admin/panels/_prop_question_grid.html.erb +28 -0
- data/app/views.current/fe/admin/panels/_prop_question_grid_with_total.html.erb +14 -0
- data/app/views.current/fe/admin/panels/_prop_reference_question.html.erb +12 -0
- data/app/views.current/fe/admin/panels/_prop_section.html.erb +8 -0
- data/app/views.current/fe/admin/panels/_prop_sheet.html.erb +20 -0
- data/app/views.current/fe/admin/panels/_prop_text_field.html.erb +20 -0
- data/app/views.current/fe/admin/question_pages/_element.html.erb +28 -0
- data/app/views.current/fe/admin/question_pages/_element_show.html.erb +10 -0
- data/app/views.current/fe/admin/question_pages/_errors.html.erb +10 -0
- data/app/views.current/fe/admin/question_pages/_question_page.html.erb +13 -0
- data/app/views.current/fe/admin/question_pages/create.js.erb +11 -0
- data/app/views.current/fe/admin/question_pages/destroy.js.erb +5 -0
- data/app/views.current/fe/admin/question_pages/edit.js.erb +3 -0
- data/app/views.current/fe/admin/question_pages/error.js.erb +4 -0
- data/app/views.current/fe/admin/question_pages/show.js.erb +9 -0
- data/app/views.current/fe/admin/question_pages/show_panel.js.erb +3 -0
- data/app/views.current/fe/admin/question_pages/update.js.erb +2 -0
- data/app/views.current/fe/admin/question_sheets/_errors.html.erb +11 -0
- data/app/views.current/fe/admin/question_sheets/edit.js.erb +3 -0
- data/app/views.current/fe/admin/question_sheets/error.js.erb +5 -0
- data/app/views.current/fe/admin/question_sheets/index.html.erb +41 -0
- data/app/views.current/fe/admin/question_sheets/new.html.erb +15 -0
- data/app/views.current/fe/admin/question_sheets/show.html.erb +27 -0
- data/app/views.current/fe/admin/question_sheets/update.js.erb +2 -0
- data/app/views.current/fe/answer_pages/_answer_page.html.erb +53 -0
- data/app/views.current/fe/answer_pages/_element.html.erb +32 -0
- data/app/views.current/fe/answer_pages/_page_name.html.erb +1 -0
- data/app/views.current/fe/answer_pages/show.html.erb +39 -0
- data/app/views.current/fe/answer_pages/update.js.erb +13 -0
- data/app/views.current/fe/answer_sheets/_answer_sheet.html.erb +26 -0
- data/app/views.current/fe/answer_sheets/_element.html.erb +74 -0
- data/app/views.current/fe/answer_sheets/_incomplete.html.erb +10 -0
- data/app/views.current/fe/answer_sheets/_page_link.html.erb +9 -0
- data/app/views.current/fe/answer_sheets/_pages_list.html.erb +11 -0
- data/app/views.current/fe/answer_sheets/_submit_to.html.erb +1 -0
- data/app/views.current/fe/answer_sheets/_title.html.erb +1 -0
- data/app/views.current/fe/answer_sheets/edit.html.erb +66 -0
- data/app/views.current/fe/answer_sheets/incomplete.js.erb +11 -0
- data/app/views.current/fe/answer_sheets/index.html.erb +18 -0
- data/app/views.current/fe/answer_sheets/send_reference_invite.js.erb +8 -0
- data/app/views.current/fe/answer_sheets/show.html.erb +13 -0
- data/app/views.current/fe/applications/_logout.html.erb +1 -0
- data/app/views.current/fe/applications/show.html.erb +1 -0
- data/app/views.current/fe/help/builder.html +33 -0
- data/app/views.current/fe/help/question_grid.html +18 -0
- data/app/views.current/fe/questions/fe/_acceptance.html.erb +14 -0
- data/app/views.current/fe/questions/fe/_attachment_field.html.erb +165 -0
- data/app/views.current/fe/questions/fe/_checkbox_field.html.erb +53 -0
- data/app/views.current/fe/questions/fe/_country.html.erb +7 -0
- data/app/views.current/fe/questions/fe/_date_field.html.erb +7 -0
- data/app/views.current/fe/questions/fe/_date_field_mmyy.html.erb +9 -0
- data/app/views.current/fe/questions/fe/_drop_down_field.html.erb +8 -0
- data/app/views.current/fe/questions/fe/_paragraph.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_question_grid.html.erb +70 -0
- data/app/views.current/fe/questions/fe/_question_grid_with_total.html.erb +64 -0
- data/app/views.current/fe/questions/fe/_questions.html.erb +15 -0
- data/app/views.current/fe/questions/fe/_radio_button_field.html.erb +60 -0
- data/app/views.current/fe/questions/fe/_rating.html.erb +64 -0
- data/app/views.current/fe/questions/fe/_reference_discipler.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_reference_friend.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_reference_parent.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_reference_peer.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_reference_question.html.erb +61 -0
- data/app/views.current/fe/questions/fe/_reference_roommate.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_reference_spiritual.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_reference_staff.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_section.html.erb +1 -0
- data/app/views.current/fe/questions/fe/_state_chooser.html.erb +7 -0
- data/app/views.current/fe/questions/fe/_text_area_field.html.erb +17 -0
- data/app/views.current/fe/questions/fe/_text_field.html.erb +9 -0
- data/app/views.current/fe/questions/fe/_yes_no.html.erb +17 -0
- data/app/views.current/fe/questions/fe/_yes_no_field.erb +20 -0
- data/app/views.current/fe/reference_pages/_reference.html.erb +31 -0
- data/app/views.current/fe/reference_pages/edit.html.erb +24 -0
- data/app/views.current/fe/reference_sheets/done.html.erb +2 -0
- data/app/views.current/fe/reference_sheets/not_found.html.erb +5 -0
- data/app/views.current/fe/reference_sheets/submitted.js.erb +1 -0
- data/app/views.current/fe/references/edit.html.erb +8 -0
- data/app/views.current/fe/references/send_invite.js.erb +7 -0
- data/app/views.current/fe/references/show.html.erb +18 -0
- data/app/views.current/fe/references/submit.js.erb +3 -0
- data/app/views.current/fe/submit_pages/_errors.html.erb +1 -0
- data/app/views.current/fe/submit_pages/_thankyou.html.erb +2 -0
- data/app/views.current/fe/submit_pages/edit.html.erb +36 -0
- data/app/views.current/fe/submit_pages/error.js.erb +1 -0
- data/app/views.current/fe/submit_pages/submit.js.erb +3 -0
- data/app/views.current/layouts/fe/_error_messages_for.html.erb +7 -0
- data/app/views.current/layouts/fe/application.html.erb +47 -0
- data/app/{views/layouts/fe/fe.admin.html.erb → views.current/layouts/fe/fe_admin.html.erb} +4 -4
- data/config/initializers/paper_trail.rb +3 -0
- data/config/routes.rb +3 -37
- data/db/migrate/20131003041856_core.rb +23 -23
- data/db/migrate/20131003044250_create_reference_sheets.rb +2 -1
- data/db/migrate/20131003044436_add_element_and_answer_fields.rb +3 -3
- data/db/migrate/20131003044518_create_email_templates.rb +2 -2
- data/db/migrate/20131003044621_add_max_lengths.rb +1 -1
- data/db/migrate/20131003044714_create_join_table.rb +1 -1
- data/db/migrate/20131016162128_remove_question_id_from_element.rb +1 -1
- data/db/migrate/20140623153424_create_fe_people.rb +2 -2
- data/db/migrate/20140624180246_create_fe_addresses.rb +2 -2
- data/db/migrate/{20140624182216_create_create_fe_phone_numbers.rb → 20140624182216_create_fe_phone_numbers.rb} +2 -2
- data/db/migrate/20140625160545_create_fe_users.rb +2 -2
- data/db/migrate/20140808202507_add_conditional_type_to_elements.rb +1 -1
- data/db/migrate/20140808203609_add_conditional_answer_to_elements.rb +1 -1
- data/db/migrate/20141103204704_remove_short_value_column.rb +1 -1
- data/db/migrate/20141109154522_move_conditional_ids_used_for_choice_field_to_their_own_column.rb +1 -1
- data/db/migrate/20150504221439_add_all_element_ids_to_pages.rb +5 -0
- data/db/migrate/20150713022326_add_locale_columns.rb +9 -0
- data/db/migrate/20150714220730_add_locale_to_answer_sheet.rb +5 -0
- data/db/migrate/20150925181652_add_share_to_elements.rb +5 -0
- data/db/migrate/20150928085325_change_pages_all_element_ids_to_text.rb +5 -0
- data/db/migrate/20150930191538_add_locale_to_reference_sheets.rb +5 -0
- data/db/migrate/20151021181928_switch_conditional_answer_separator_to_semicolon.rb +7 -0
- data/db/migrate/20151021184250_add_question_sheet_id_in_refs.rb +12 -0
- data/db/migrate/20160201185838_add_visible_and_visibility_cache_key_to_reference_sheets.rb +6 -0
- data/db/migrate/20160805221415_add_rating_extra_labels.rb +10 -0
- data/db/migrate/20181108201746_create_versions.rb +80 -0
- data/db/migrate/20181218201130_increase_slug_length.rb +5 -0
- data/lib/access_key_generator.rb +12 -0
- data/lib/distinct_distinct_patch.rb +20 -0
- data/lib/fe/engine.rb +26 -14
- data/lib/fe/version.rb +1 -1
- data/lib/fe.rb +11 -1
- data/spec/controllers/fe/admin/elements_controller_spec.rb +211 -1
- data/spec/controllers/fe/admin/email_templates_controller_spec.rb +26 -1
- data/spec/controllers/fe/admin/question_pages_controller_spec.rb +8 -1
- data/spec/controllers/fe/admin/question_sheets_controller_spec.rb +48 -1
- data/spec/controllers/fe/answer_pages_controller_spec.rb +129 -1
- data/spec/controllers/fe/answer_sheets_controller_spec.rb +136 -1
- data/spec/controllers/fe/reference_pages_controller.rb +4 -0
- data/spec/controllers/fe/references_controller_spec.rb +4 -0
- data/spec/controllers/fe/submit_pages_controller_spec.rb +4 -0
- data/spec/dummy/app/assets/config/manifest.js +0 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +9 -0
- data/spec/dummy/app/models/application.rb +3 -0
- data/spec/dummy/app/models/person.rb +11 -0
- data/spec/dummy/app/models/user.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +2 -2
- data/spec/dummy/config/application.rb +3 -1
- data/spec/dummy/config/database.yml +20 -17
- data/spec/dummy/config/environments/production.rb +1 -5
- data/spec/dummy/config/environments/test.rb +4 -2
- data/spec/dummy/config/initializers/assets.rb +5 -2
- data/spec/dummy/config/initializers/fast_gettext.rb +5 -0
- data/spec/dummy/config/initializers/to_unsafe_h.rb +5 -0
- data/spec/dummy/config/initializers/to_unsafe_h.rb.new +5 -0
- data/spec/dummy/config/secrets.yml +2 -2
- data/spec/dummy/db/migrate/20141203214017_core.fe_engine.rb +92 -0
- data/spec/dummy/db/migrate/20141203214018_create_reference_sheets.fe_engine.rb +25 -0
- data/spec/dummy/db/migrate/20141203214019_add_element_and_answer_fields.fe_engine.rb +11 -0
- data/spec/dummy/db/migrate/20141203214020_create_email_templates.fe_engine.rb +18 -0
- data/spec/dummy/db/migrate/20141203214021_add_max_lengths.fe_engine.rb +9 -0
- data/spec/dummy/db/migrate/20141203214022_create_join_table.fe_engine.rb +12 -0
- data/spec/dummy/db/migrate/20141203214023_remove_question_id_from_element.fe_engine.rb +10 -0
- data/spec/dummy/db/migrate/20141203214024_create_fe_people.fe_engine.rb +13 -0
- data/spec/dummy/db/migrate/20141203214025_create_fe_addresses.fe_engine.rb +21 -0
- data/spec/dummy/db/migrate/20141203214027_create_fe_users.fe_engine.rb +13 -0
- data/spec/dummy/db/migrate/20141203214028_add_conditional_type_to_elements.fe_engine.rb +6 -0
- data/spec/dummy/db/migrate/20141203214029_add_conditional_answer_to_elements.fe_engine.rb +6 -0
- data/spec/dummy/db/migrate/20141203214030_remove_short_value_column.fe_engine.rb +6 -0
- data/spec/dummy/db/migrate/20141203214031_move_conditional_ids_used_for_choice_field_to_their_own_column.fe_engine.rb +8 -0
- data/spec/dummy/db/migrate/20150123215803_create_users.rb +9 -0
- data/spec/dummy/db/migrate/20150504222619_add_all_element_ids_to_pages.fe_engine.rb +6 -0
- data/spec/dummy/db/migrate/20150925192557_add_share_to_elements.fe_engine.rb +6 -0
- data/spec/dummy/db/migrate/20150930190001_create_fe_phone_numbers.fe_engine.rb +20 -0
- data/spec/dummy/db/migrate/20150930190002_add_locale_columns.fe_engine.rb +10 -0
- data/spec/dummy/db/migrate/20150930190003_add_locale_to_answer_sheet.fe_engine.rb +6 -0
- data/spec/dummy/db/migrate/20150930190004_change_pages_all_element_ids_to_text.fe_engine.rb +6 -0
- data/spec/dummy/db/migrate/20150930191756_add_locale_to_reference_sheets.fe_engine.rb +6 -0
- data/spec/dummy/db/migrate/20151021190027_add_question_sheet_id_in_refs.fe_engine.rb +13 -0
- data/spec/dummy/db/migrate/20160204164612_switch_conditional_answer_separator_to_semicolon.fe_engine.rb +8 -0
- data/spec/dummy/db/migrate/20160204164613_add_visible_and_visibility_cache_key_to_reference_sheets.fe_engine.rb +7 -0
- data/spec/dummy/db/migrate/20181108201746_create_versions.rb +80 -0
- data/spec/dummy/db/schema.rb +91 -69
- data/spec/dummy/log/test.log +101278 -419
- data/spec/factories/answer_sheet_question_sheets.rb +1 -1
- data/spec/factories/answer_sheets.rb +2 -2
- data/spec/factories/answers.rb +1 -1
- data/spec/factories/applications.rb +3 -4
- data/spec/factories/dummy_applications.rb +6 -0
- data/spec/factories/dummy_people.rb +6 -0
- data/spec/factories/dummy_users.rb +6 -0
- data/spec/factories/elements.rb +35 -10
- data/spec/factories/email_templates.rb +5 -0
- data/spec/factories/fe_addresses.rb +10 -10
- data/spec/factories/fe_email_addresses.rb +3 -3
- data/spec/factories/fe_email_templates.rb +9 -0
- data/spec/factories/fe_people.rb +5 -7
- data/spec/factories/fe_phone_numbers.rb +3 -3
- data/spec/factories/fe_user.rb +6 -0
- data/spec/factories/page.rb +1 -1
- data/spec/factories/page_elements.rb +1 -1
- data/spec/factories/paragraphs.rb +1 -1
- data/spec/factories/question_sheet.rb +3 -3
- data/spec/factories/reference_questions.rb +1 -1
- data/spec/factories/reference_sheets.rb +9 -0
- data/spec/jobs/fe/update_reference_sheet_visibility_job_spec.rb +40 -0
- data/spec/mailers/fe/notifier_spec.rb +39 -0
- data/spec/models/fe/answer_sheet_question_sheet_spec.rb +1 -1
- data/spec/models/fe/answer_spec.rb +2 -2
- data/spec/models/fe/application_spec.rb +94 -1
- data/spec/models/fe/choice_field_spec.rb +66 -0
- data/spec/models/fe/condition_spec.rb +2 -2
- data/spec/models/fe/element_spec.rb +414 -37
- data/spec/models/fe/email_template_spec.rb +1 -1
- data/spec/models/fe/page_element_spec.rb +1 -1
- data/spec/models/fe/page_spec.rb +168 -11
- data/spec/models/fe/person_spec.rb +1 -1
- data/spec/models/fe/question_set_spec.rb +91 -0
- data/spec/models/fe/question_sheet_spec.rb +103 -1
- data/spec/models/fe/question_spec.rb +73 -6
- data/spec/models/fe/reference_question_spec.rb +20 -0
- data/spec/models/fe/reference_sheet_spec.rb +305 -2
- data/spec/models/fe/text_field_spec.rb +22 -0
- data/spec/rails_helper.rb +85 -54
- data/spec/support/choices.xml +6 -0
- metadata +310 -84
- data/app/assets/javascripts/fe/fe.common.js +0 -57
- data/app/assets/javascripts/fe/jquery.scrollTo-min.js +0 -7
- data/app/assets/javascripts/fe/rails.extra.js +0 -6
- data/app/controllers/fe/applications_controller.rb +0 -183
- data/app/controllers/fe/concerns/answer_pages_controller_concern.rb +0 -83
- data/app/controllers/fe/payments_controller.rb +0 -184
- data/app/models/fe/concerns/answer_sheet_concern.rb +0 -55
- data/app/models/fe/payment.rb +0 -77
- data/app/models/fe/payment_question.rb +0 -22
- data/app/views/fe/admin/panels/_prop_payment_question.html.erb +0 -1
- data/app/views/fe/application/_logout.html.erb +0 -1
- data/app/views/fe/payment_pages/_credit.html.erb +0 -47
- data/app/views/fe/payment_pages/_mail.html.erb +0 -27
- data/app/views/fe/payment_pages/_payment.html.erb +0 -6
- data/app/views/fe/payment_pages/_staff.html.erb +0 -25
- data/app/views/fe/payment_pages/_staff_results.html.erb +0 -17
- data/app/views/fe/payment_pages/edit.html.erb +0 -75
- data/app/views/fe/payment_pages/staff_search.js.erb +0 -2
- data/app/views/fe/payments/_credit.html.erb +0 -47
- data/app/views/fe/payments/_errors.html.erb +0 -1
- data/app/views/fe/payments/_payment.html.erb +0 -13
- data/app/views/fe/payments/_staff.html.erb +0 -21
- data/app/views/fe/payments/_staff_results.html.erb +0 -18
- data/app/views/fe/payments/approve.js.erb +0 -3
- data/app/views/fe/payments/create.js.erb +0 -19
- data/app/views/fe/payments/destroy.js.erb +0 -7
- data/app/views/fe/payments/edit.html.erb +0 -56
- data/app/views/fe/payments/error.js.erb +0 -3
- data/app/views/fe/payments/no_access.html.erb +0 -7
- data/app/views/fe/payments/staff_search.js.erb +0 -1
- data/app/views/fe/payments/update.html.erb +0 -24
- data/app/views/fe/questions/fe/_payment_question.html.erb +0 -70
- data/db/migrate/20140828045339_create_payments.rb +0 -13
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/factories/payments.rb +0 -7
- 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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
24
|
+
ENGINE_RAILS_ROOT = File.join( File.dirname(__FILE__), '../' )
|
|
19
25
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
31
|
+
RSpec.configure do |config|
|
|
26
32
|
|
|
27
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
#
|
|
49
|
-
#
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
FactoryGirl.reload
|
|
95
|
+
config.include(Shoulda::Matchers::ActiveModel, type: :model)
|
|
96
|
+
config.include(Shoulda::Matchers::ActiveRecord, type: :model)
|
|
66
97
|
end
|