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
data/spec/models/fe/page_spec.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require 'rails_helper'
|
|
2
2
|
|
|
3
|
-
describe Fe::Page do
|
|
3
|
+
describe Fe::Page, type: :model do
|
|
4
4
|
it { expect belong_to :question_sheet }
|
|
5
5
|
it { expect have_many :page_elements }
|
|
6
6
|
it { expect have_many :elements }
|
|
@@ -9,38 +9,195 @@ describe Fe::Page do
|
|
|
9
9
|
it { expect have_many :question_grid_with_totals }
|
|
10
10
|
# it { expect validate_presence_of :label } # this isn't working
|
|
11
11
|
# it { expect validate_presence_of :number } # this isn't working
|
|
12
|
-
it { expect
|
|
12
|
+
it { expect validate_length_of :label }
|
|
13
13
|
# it { expect validate_numericality_of :number }
|
|
14
14
|
|
|
15
15
|
it "should not require a hidden element" do
|
|
16
|
-
question_sheet =
|
|
17
|
-
conditional_el =
|
|
16
|
+
question_sheet = FactoryBot.create(:question_sheet_with_pages)
|
|
17
|
+
conditional_el = FactoryBot.create(:choice_field_element, label: "This is a test for a yes/no question that will show the next element if the answer is yes", conditional_type: "Fe::Element", conditional_answer: "yes")
|
|
18
18
|
question_sheet.pages.reload
|
|
19
19
|
question_sheet.pages[3].elements << conditional_el
|
|
20
|
-
element =
|
|
20
|
+
element = FactoryBot.create(:text_field_element, label: "This is a test of a short answer that is made visible by the previous element")
|
|
21
21
|
question_sheet.pages[3].elements << element
|
|
22
22
|
conditional_el.reload
|
|
23
23
|
expect(conditional_el.conditional).to eq(element)
|
|
24
24
|
|
|
25
25
|
# set up an answer sheet
|
|
26
|
-
application =
|
|
27
|
-
application.answer_sheet_question_sheet =
|
|
28
|
-
application.answer_sheet_question_sheets.first.
|
|
26
|
+
application = FactoryBot.create(:answer_sheet)
|
|
27
|
+
application.answer_sheet_question_sheet = FactoryBot.create(:answer_sheet_question_sheet, answer_sheet: application, question_sheet: question_sheet)
|
|
28
|
+
application.answer_sheet_question_sheets.first.update(question_sheet_id: question_sheet.id)
|
|
29
|
+
application.reload
|
|
29
30
|
|
|
30
|
-
# make the answer to the conditional question '
|
|
31
|
+
# make the answer to the conditional question 'no' so that the next element does not show up and is not required
|
|
31
32
|
conditional_el.set_response("no", application)
|
|
32
33
|
conditional_el.save_response(application)
|
|
33
34
|
|
|
34
|
-
# validate the page -- the next element after the conditional should not be required
|
|
35
|
+
# validate the page -- the next element after the conditional should not be required (because it's hidden)
|
|
35
36
|
page = question_sheet.pages[3]
|
|
37
|
+
question_sheet.pages.reload
|
|
36
38
|
expect(page.complete?(application)).to eq(true)
|
|
37
39
|
|
|
38
40
|
# make the answer to the conditional question 'yes' so that the next element shows up and is thus required
|
|
39
41
|
conditional_el.set_response("yes", application)
|
|
40
42
|
conditional_el.save_response(application)
|
|
43
|
+
conditional_el.display_response(application)
|
|
41
44
|
|
|
42
|
-
# validate the page -- the next element after the conditional
|
|
45
|
+
# validate the page -- the next element after the conditional be required now, making the page incomplete
|
|
43
46
|
page = question_sheet.pages[3]
|
|
44
47
|
expect(page.complete?(application)).to eq(false)
|
|
45
48
|
end
|
|
49
|
+
|
|
50
|
+
context '#all_elements' do
|
|
51
|
+
it 'should return elements in the same order the ids were given' do
|
|
52
|
+
p = create(:page, all_element_ids: '2,1')
|
|
53
|
+
e1 = create(:text_field_element)
|
|
54
|
+
e2 = create(:text_field_element)
|
|
55
|
+
expect(p.all_elements).to eq([e2,e1])
|
|
56
|
+
end
|
|
57
|
+
it 'should include elements in a grid' do
|
|
58
|
+
p = create(:page)
|
|
59
|
+
e = create(:question_grid)
|
|
60
|
+
create(:page_element, page: p, element: e)
|
|
61
|
+
tf1 = create(:text_field_element, question_grid: e)
|
|
62
|
+
|
|
63
|
+
# add text field directly to page
|
|
64
|
+
tf2 = create(:text_field_element)
|
|
65
|
+
create(:page_element, page: p, element: tf2)
|
|
66
|
+
|
|
67
|
+
# add section to grid
|
|
68
|
+
section = create(:section, question_grid: e)
|
|
69
|
+
|
|
70
|
+
p.reload # get the updated all_element_ids column
|
|
71
|
+
expect(p.all_elements).to eq([e, tf1, section, tf2])
|
|
72
|
+
end
|
|
73
|
+
it 'should return an empty active record result set when no elements are added' do
|
|
74
|
+
p = create(:page)
|
|
75
|
+
expect(p.all_elements).to eq([])
|
|
76
|
+
end
|
|
77
|
+
it 'should rebuild_all_element_ids first when not set' do
|
|
78
|
+
p = create(:page)
|
|
79
|
+
p.all_elements
|
|
80
|
+
p.reload
|
|
81
|
+
expect(p.all_element_ids).to eq('')
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
context '#has_questions?' do
|
|
85
|
+
it 'should return true when there is a question directly on the page' do
|
|
86
|
+
p = create(:page)
|
|
87
|
+
e = create(:text_field_element)
|
|
88
|
+
create(:page_element, page: p, element: e)
|
|
89
|
+
expect(p.has_questions?).to be true
|
|
90
|
+
end
|
|
91
|
+
it 'should not count a non-question directly on the page' do
|
|
92
|
+
p = create(:page)
|
|
93
|
+
e = create(:section)
|
|
94
|
+
create(:page_element, page: p, element: e)
|
|
95
|
+
expect(p.has_questions?).to be false
|
|
96
|
+
end
|
|
97
|
+
it 'should return true when the only question is in a grid' do
|
|
98
|
+
p = create(:page)
|
|
99
|
+
e = create(:question_grid)
|
|
100
|
+
create(:page_element, page: p, element: e)
|
|
101
|
+
tf1 = create(:text_field_element, question_grid: e)
|
|
102
|
+
section = create(:section, question_grid: e)
|
|
103
|
+
p.reload # get the updated all_element_ids column
|
|
104
|
+
expect(p.has_questions?).to be true
|
|
105
|
+
end
|
|
106
|
+
it 'should not count a non-question inside a grid as a question' do
|
|
107
|
+
p = create(:page)
|
|
108
|
+
e = create(:question_grid)
|
|
109
|
+
create(:page_element, page: p, element: e)
|
|
110
|
+
section = create(:section, question_grid: e)
|
|
111
|
+
p.reload # get the updated all_element_ids column
|
|
112
|
+
expect(p.has_questions?).to be false
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
context '#all_questions' do
|
|
116
|
+
it 'should include elements in a grid with total' do
|
|
117
|
+
p = create(:page)
|
|
118
|
+
grid = create(:question_grid_with_total) # shouldn't be included in all_questions because it's a not a question
|
|
119
|
+
create(:page_element, page: p, element: grid, position: 1)
|
|
120
|
+
tf1 = create(:text_field_element, question_grid: grid)
|
|
121
|
+
tf2 = create(:text_field_element) # add directly to page
|
|
122
|
+
create(:page_element, page: p, element: tf2, position: 2)
|
|
123
|
+
section = create(:section, question_grid: grid) # shouldn't be included in all_questions because it's not a question
|
|
124
|
+
p.reload # get the updated all_element_ids column
|
|
125
|
+
expect(p.all_questions).to eq([tf1, tf2])
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
context '#rebuild_all_element_ids' do
|
|
129
|
+
it 'should include elements in a grid' do
|
|
130
|
+
p = create(:page)
|
|
131
|
+
e = create(:question_grid)
|
|
132
|
+
create(:page_element, page: p, element: e)
|
|
133
|
+
tf1 = create(:text_field_element, question_grid: e)
|
|
134
|
+
tf2 = create(:text_field_element) # add directly to page
|
|
135
|
+
create(:page_element, page: p, element: tf2)
|
|
136
|
+
section = create(:section, question_grid: e)
|
|
137
|
+
p.update_column :all_element_ids, nil
|
|
138
|
+
p.rebuild_all_element_ids
|
|
139
|
+
expect(p.all_element_ids).to eq("#{e.id},#{tf1.id},#{section.id},#{tf2.id}")
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
context '#all_element_ids' do
|
|
143
|
+
it 'should rebuild_all_element_ids first when not set' do
|
|
144
|
+
p = create(:page)
|
|
145
|
+
p.all_element_ids
|
|
146
|
+
p.reload
|
|
147
|
+
expect(p.all_element_ids).to eq('')
|
|
148
|
+
end
|
|
149
|
+
it 'should rebuild_all_element_ids when an element is removed from a page' do
|
|
150
|
+
p = create(:page)
|
|
151
|
+
e = create(:text_field_element, question_grid: e)
|
|
152
|
+
pe = create(:page_element, page: p, element: e)
|
|
153
|
+
expect(p.all_element_ids).to eq(e.id.to_s)
|
|
154
|
+
pe.destroy
|
|
155
|
+
p.reload
|
|
156
|
+
expect(p.all_element_ids).to eq('')
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
context '#copy_to' do
|
|
160
|
+
it 'should return the new page' do
|
|
161
|
+
q = create(:question_sheet)
|
|
162
|
+
p = create(:page)
|
|
163
|
+
r = p.copy_to(q)
|
|
164
|
+
expect(r.class).to be(Fe::Page)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
context '#complete' do
|
|
168
|
+
it "is complete when there's a required element inside a hidden group" do
|
|
169
|
+
q = create(:question_sheet)
|
|
170
|
+
p = create(:page, question_sheet: q)
|
|
171
|
+
g1 = create(:question_grid)
|
|
172
|
+
c = create(:text_field_element, conditional_answer: 'asdf', conditional: g1)
|
|
173
|
+
create(:page_element, page: p, element: c)
|
|
174
|
+
create(:page_element, page: p, element: g1)
|
|
175
|
+
g2 = create(:question_grid_with_total, question_grid: g1)
|
|
176
|
+
e = create(:text_field_element, question_grid: g2)
|
|
177
|
+
|
|
178
|
+
application = create(:answer_sheet)
|
|
179
|
+
application.question_sheets << q
|
|
180
|
+
|
|
181
|
+
c.set_response('asdf', application)
|
|
182
|
+
c.save_response(application)
|
|
183
|
+
expect(e.hidden?(application)).to be(false)
|
|
184
|
+
expect(p.complete?(application)).to be(false)
|
|
185
|
+
|
|
186
|
+
# change the answer to make sure it changes to not required
|
|
187
|
+
c.set_response('something else', application)
|
|
188
|
+
c.save_response(application)
|
|
189
|
+
expect(c.display_response(application)).to eq('something else')
|
|
190
|
+
|
|
191
|
+
expect(e.hidden?(application)).to be(true)
|
|
192
|
+
p.clear_all_hidden_elements
|
|
193
|
+
expect(p.complete?(application)).to be(true)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
context '#hidden' do
|
|
197
|
+
it 'checks the hidden column' do
|
|
198
|
+
q = create(:question_sheet)
|
|
199
|
+
p = create(:page, question_sheet: q, hidden: true)
|
|
200
|
+
expect(p.hidden).to be true
|
|
201
|
+
end
|
|
202
|
+
end
|
|
46
203
|
end
|
|
@@ -1,4 +1,95 @@
|
|
|
1
1
|
require 'rails_helper'
|
|
2
2
|
|
|
3
3
|
describe Fe::QuestionSet do
|
|
4
|
+
let(:app) { create(:application) }
|
|
5
|
+
let(:app2) { create(:application) }
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@page = create(:page)
|
|
9
|
+
@el_confidential = create(:text_field_element, label: 'conf1', is_confidential: true, share: true)
|
|
10
|
+
@el_visible = create(:text_field_element, label: 'vis1', is_confidential: false, share: false)
|
|
11
|
+
@el_confidential2 = create(:text_field_element, label: 'conf2', is_confidential: true, share: true)
|
|
12
|
+
@el_visible2 = create(:text_field_element, label: 'vis2', is_confidential: false, share: true)
|
|
13
|
+
@page.elements << @el_confidential << @el_visible << @el_confidential2 << @el_visible2
|
|
14
|
+
@question_set = Fe::QuestionSet.new(@page.elements, app)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it 'should filter default show' do
|
|
18
|
+
# filter out confidential questions and questions with share flag (the share flag would likely
|
|
19
|
+
# never be used to filter, but just to test that it will only filter those that match all the
|
|
20
|
+
# filter methods)
|
|
21
|
+
@question_set.set_filter(filter_default: :show, filter: [ :is_confidential, :share ])
|
|
22
|
+
expect(@question_set.elements).to eq([@el_visible, @el_visible2])
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'should filter default hide' do
|
|
26
|
+
# show only confidential questions and questions with share flag (the share flag would likely
|
|
27
|
+
# never be used to filter, but just to test that it will only filter those that match all the
|
|
28
|
+
# filter methods)
|
|
29
|
+
@question_set.set_filter(filter_default: :hide, filter: [ :is_confidential, :share ])
|
|
30
|
+
expect(@question_set.elements).to eq([@el_confidential, @el_confidential2])
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context 'saving answers (#post then #save)' do
|
|
34
|
+
it 'saves a new value' do
|
|
35
|
+
@question_set.post({ @el_visible.id => 'a text response' }, app)
|
|
36
|
+
@question_set.save
|
|
37
|
+
expect(Fe::Answer.count).to eq(1)
|
|
38
|
+
expect(Fe::Answer.first.value).to eq('a text response')
|
|
39
|
+
expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
|
|
40
|
+
expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
|
|
41
|
+
end
|
|
42
|
+
it 'replaces an existing answer' do
|
|
43
|
+
create(:answer, value: 'a text response', answer_sheet: app, question: @el_visible)
|
|
44
|
+
@question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
|
|
45
|
+
@question_set.post({ @el_visible.id => 'an updated response' }, app)
|
|
46
|
+
@question_set.save
|
|
47
|
+
expect(Fe::Answer.count).to eq(1)
|
|
48
|
+
expect(Fe::Answer.first.value).to eq('an updated response')
|
|
49
|
+
expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
|
|
50
|
+
expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
|
|
51
|
+
end
|
|
52
|
+
it "doesn't save empty strings continually" do
|
|
53
|
+
create(:answer, value: '', answer_sheet: app, question: @el_visible)
|
|
54
|
+
@question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
|
|
55
|
+
@question_set.post({ @el_visible.id => '' }, app)
|
|
56
|
+
@question_set.save
|
|
57
|
+
expect(Fe::Answer.count).to eq(1)
|
|
58
|
+
expect(Fe::Answer.first.value).to eq('')
|
|
59
|
+
expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
|
|
60
|
+
expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
|
|
61
|
+
end
|
|
62
|
+
it 'saves multiple values' do
|
|
63
|
+
@el_visible.update(kind: 'Fe::ChoiceField', style: 'checkbox', content: "choice 1\nchoice 2")
|
|
64
|
+
create(:answer, value: 'choice 1', answer_sheet: app, question: @el_visible)
|
|
65
|
+
@question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
|
|
66
|
+
@question_set.post({ @el_visible.id => { '0' => 'choice 1', '1' => 'choice 2' } }, app)
|
|
67
|
+
@question_set.save
|
|
68
|
+
expect(Fe::Answer.count).to eq(2)
|
|
69
|
+
expect(Fe::Answer.first.value).to eq('choice 1')
|
|
70
|
+
expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
|
|
71
|
+
expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
|
|
72
|
+
expect(Fe::Answer.second.value).to eq('choice 2')
|
|
73
|
+
expect(Fe::Answer.second.answer_sheet_id).to eq(app.id)
|
|
74
|
+
expect(Fe::Answer.second.question_id).to eq(@el_visible.id)
|
|
75
|
+
end
|
|
76
|
+
it 'saves the same value for different answer sheets' do
|
|
77
|
+
@el_visible.update(kind: 'Fe::ChoiceField', style: 'checkbox', content: "choice 1\nchoice 2")
|
|
78
|
+
@question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
|
|
79
|
+
@question_set.post({ @el_visible.id => { '0' => 'choice 1' } }, app)
|
|
80
|
+
@question_set.save
|
|
81
|
+
@question_set = Fe::QuestionSet.new(@page.elements, app2) # need this to save answers to app2
|
|
82
|
+
$b = true
|
|
83
|
+
@question_set.post({ @el_visible.id => { '0' => 'choice 1' } }, app2)
|
|
84
|
+
@question_set.save
|
|
85
|
+
$b = false
|
|
86
|
+
expect(Fe::Answer.count).to eq(2)
|
|
87
|
+
expect(Fe::Answer.first.value).to eq('choice 1')
|
|
88
|
+
expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
|
|
89
|
+
expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
|
|
90
|
+
expect(Fe::Answer.second.value).to eq('choice 1')
|
|
91
|
+
expect(Fe::Answer.second.answer_sheet_id).to eq(app2.id)
|
|
92
|
+
expect(Fe::Answer.second.question_id).to eq(@el_visible.id)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
4
95
|
end
|
|
@@ -1,8 +1,110 @@
|
|
|
1
1
|
require 'rails_helper'
|
|
2
2
|
|
|
3
|
-
describe Fe::QuestionSheet do
|
|
3
|
+
describe Fe::QuestionSheet, type: :model do
|
|
4
4
|
it { expect have_many :pages }
|
|
5
5
|
it { expect have_many :answer_sheets }
|
|
6
6
|
it { expect validate_presence_of :label }
|
|
7
7
|
it { expect validate_uniqueness_of :label }
|
|
8
|
+
|
|
9
|
+
context '#all_elements' do
|
|
10
|
+
it 'should return elements in the same order as the ids' do
|
|
11
|
+
s = create(:question_sheet)
|
|
12
|
+
|
|
13
|
+
# P1
|
|
14
|
+
p1 = create(:page, question_sheet: s)
|
|
15
|
+
tf1 = create(:text_field_element)
|
|
16
|
+
create(:page_element, page: p1, element: tf1)
|
|
17
|
+
tf2 = create(:text_field_element)
|
|
18
|
+
create(:page_element, page: p1, element: tf2)
|
|
19
|
+
p1.update_column(:all_element_ids, "#{tf2.id},#{tf1.id}")
|
|
20
|
+
|
|
21
|
+
# P2
|
|
22
|
+
p2 = create(:page, question_sheet: s)
|
|
23
|
+
tf3 = create(:text_field_element)
|
|
24
|
+
create(:page_element, page: p2, element: tf3)
|
|
25
|
+
tf4 = create(:text_field_element)
|
|
26
|
+
create(:page_element, page: p2, element: tf4)
|
|
27
|
+
p2.update_column(:all_element_ids, "#{tf4.id},#{tf3.id}")
|
|
28
|
+
|
|
29
|
+
p1.reload # get the updated all_element_ids column
|
|
30
|
+
p2.reload # get the updated all_element_ids column
|
|
31
|
+
expect(s.all_elements).to eq([tf2, tf1, tf4, tf3])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'should include elements in a grid' do
|
|
35
|
+
s = create(:question_sheet)
|
|
36
|
+
p = create(:page, question_sheet: s)
|
|
37
|
+
e = create(:question_grid)
|
|
38
|
+
create(:page_element, page: p, element: e)
|
|
39
|
+
tf1 = create(:text_field_element, question_grid: e)
|
|
40
|
+
tf2 = create(:text_field_element) # add directly to page
|
|
41
|
+
create(:page_element, page: p, element: tf2)
|
|
42
|
+
section = create(:section, question_grid: e)
|
|
43
|
+
p.reload # get the updated all_element_ids column
|
|
44
|
+
expect(s.all_elements).to eq([e, tf1, section, tf2])
|
|
45
|
+
end
|
|
46
|
+
it 'should include elements across multiple pages' do
|
|
47
|
+
s = create(:question_sheet)
|
|
48
|
+
|
|
49
|
+
# P1
|
|
50
|
+
p1 = create(:page, question_sheet: s)
|
|
51
|
+
|
|
52
|
+
# grid pg1
|
|
53
|
+
g1 = create(:question_grid)
|
|
54
|
+
create(:page_element, page: p1, element: g1)
|
|
55
|
+
tf1 = create(:text_field_element, question_grid: g1)
|
|
56
|
+
s1 = create(:section, question_grid: g1)
|
|
57
|
+
|
|
58
|
+
# tf added directly to pg1
|
|
59
|
+
tf2 = create(:text_field_element)
|
|
60
|
+
create(:page_element, page: p1, element: tf2)
|
|
61
|
+
|
|
62
|
+
# P2
|
|
63
|
+
p2 = create(:page, question_sheet: s)
|
|
64
|
+
|
|
65
|
+
# grid pg2
|
|
66
|
+
g2 = create(:question_grid)
|
|
67
|
+
create(:page_element, page: p2, element: g2)
|
|
68
|
+
tf3 = create(:text_field_element, question_grid: g2)
|
|
69
|
+
s2 = create(:section, question_grid: g2)
|
|
70
|
+
|
|
71
|
+
# tf added directly to pg2
|
|
72
|
+
tf4 = create(:text_field_element)
|
|
73
|
+
create(:page_element, page: p2, element: tf4)
|
|
74
|
+
|
|
75
|
+
p1.reload # get the updated all_element_ids column
|
|
76
|
+
p2.reload # get the updated all_element_ids column
|
|
77
|
+
expect(s.all_elements).to eq([g1, tf1, s1, tf2, g2, tf3, s2, tf4])
|
|
78
|
+
end
|
|
79
|
+
it 'should handle pages with no elements' do
|
|
80
|
+
qs = create(:question_sheet)
|
|
81
|
+
p = create(:page)
|
|
82
|
+
qs.pages << p
|
|
83
|
+
expect(qs.all_elements).to eq([])
|
|
84
|
+
end
|
|
85
|
+
it 'should handle pages with no elements with empty string for all_elements' do
|
|
86
|
+
qs = create(:question_sheet)
|
|
87
|
+
p = create(:page, all_element_ids: '')
|
|
88
|
+
p2 = create(:page, all_element_ids: '')
|
|
89
|
+
e = create(:text_field_element)
|
|
90
|
+
create(:page_element, page: p2, element: e)
|
|
91
|
+
qs.pages << p << p2
|
|
92
|
+
expect(qs.all_elements).to eq([e])
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context '#elements' do
|
|
97
|
+
it 'should not include elements in a grid' do
|
|
98
|
+
s = create(:question_sheet)
|
|
99
|
+
p = create(:page, question_sheet: s)
|
|
100
|
+
e = create(:question_grid)
|
|
101
|
+
create(:page_element, page: p, element: e)
|
|
102
|
+
tf1 = create(:text_field_element, question_grid: e) # shouldn't be included because it's in grid
|
|
103
|
+
tf2 = create(:text_field_element)
|
|
104
|
+
create(:page_element, page: p, element: tf2)
|
|
105
|
+
create(:section, question_grid: e) # shouldn't be included because it's in grid
|
|
106
|
+
p.reload # get the updated all_element_ids column
|
|
107
|
+
expect(s.elements).to eq([e, tf2])
|
|
108
|
+
end
|
|
109
|
+
end
|
|
8
110
|
end
|
|
@@ -1,21 +1,88 @@
|
|
|
1
1
|
require 'rails_helper'
|
|
2
2
|
|
|
3
|
-
describe Fe::Question do
|
|
3
|
+
describe Fe::Question, type: :model do
|
|
4
4
|
it { expect have_many :conditions }
|
|
5
5
|
it { expect have_many :dependents }
|
|
6
6
|
it { expect have_many :sheet_answers }
|
|
7
7
|
it { expect belong_to :related_question_sheet }
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
# it { expect validate_format_of :slug }
|
|
10
10
|
# it { expect validate_length_of :slug }
|
|
11
11
|
# it { expect validate_uniqueness_of :slug }
|
|
12
|
-
|
|
13
|
-
describe '#default_label?' do
|
|
14
|
-
it 'expect return true' do
|
|
12
|
+
|
|
13
|
+
describe '#default_label?' do
|
|
14
|
+
it 'expect return true' do
|
|
15
15
|
question = Fe::Question.new
|
|
16
16
|
#question.default_label?.expect be_true
|
|
17
17
|
expect(question.default_label?).to eq(true)
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
|
-
|
|
20
|
+
|
|
21
|
+
context 'slug' do
|
|
22
|
+
let(:qs) { create(:question_sheet_with_pages) }
|
|
23
|
+
let(:page) { qs.pages.first }
|
|
24
|
+
let(:qs2) { create(:question_sheet_with_pages) }
|
|
25
|
+
let(:page2) { qs2.pages.first }
|
|
26
|
+
let(:e1) { create(:text_field_element, slug: 'test') }
|
|
27
|
+
let(:e2) { create(:text_field_element) }
|
|
28
|
+
|
|
29
|
+
before do
|
|
30
|
+
e1.pages << page
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "doesn't let the same slug be used in the question sheet" do
|
|
34
|
+
e2.pages << page
|
|
35
|
+
e2.slug = 'test'
|
|
36
|
+
e2.save
|
|
37
|
+
expect(e2.errors.full_messages.join(', ')).to include('Slug must be unique (within the question sheet)')
|
|
38
|
+
end
|
|
39
|
+
it "lets two elements with the same slug save on different sheets" do
|
|
40
|
+
e2.pages << page2
|
|
41
|
+
e2.slug = 'test'
|
|
42
|
+
expect(e2.save).to be true
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context 'saving' do
|
|
47
|
+
let(:e) { create(:text_field_element) }
|
|
48
|
+
let(:app) { create(:text_field_element) }
|
|
49
|
+
let(:app2) { create(:text_field_element) }
|
|
50
|
+
|
|
51
|
+
before do
|
|
52
|
+
e.set_response('answer value', app)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
context '#save_file' do
|
|
56
|
+
it ' checks that the answer sheet that calls set_response is the same one that calls save' do
|
|
57
|
+
expect {
|
|
58
|
+
e.save_file(app2, nil)
|
|
59
|
+
}.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context '#delete_file' do
|
|
64
|
+
it ' checks that the answer sheet that calls set_response is the same one that calls delete' do
|
|
65
|
+
expect {
|
|
66
|
+
e.delete_file(app2, nil)
|
|
67
|
+
}.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'deletes the given answer record' do
|
|
71
|
+
answer_sheet = create(:answer_sheet)
|
|
72
|
+
question = create(:attachment_field_element)
|
|
73
|
+
answer = create(:answer, attachment_file_name: 'test_file', answer_sheet: answer_sheet, question: question)
|
|
74
|
+
question.set_response('', answer_sheet)
|
|
75
|
+
question.delete_file(answer_sheet, answer)
|
|
76
|
+
expect{answer.reload}.to raise_error(ActiveRecord::RecordNotFound)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context '#save_response' do
|
|
81
|
+
it ' checks that the answer sheet that calls set_response is the same one that calls save' do
|
|
82
|
+
expect {
|
|
83
|
+
e.save_response(app2)
|
|
84
|
+
}.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
21
88
|
end
|
|
@@ -14,4 +14,24 @@ describe Fe::ReferenceQuestion do
|
|
|
14
14
|
expect(ref.ptemplate).to eq("fe/reference_abc")
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
|
+
|
|
18
|
+
it 'resets the question_sheet_id for references not created' do
|
|
19
|
+
qs1 = create(:question_sheet)
|
|
20
|
+
reference_question = create(:reference_question, related_question_sheet_id: qs1.id)
|
|
21
|
+
reference_sheet = create(:reference_sheet, question: reference_question)
|
|
22
|
+
expect(reference_sheet.question_sheet_id).to eq(qs1.id)
|
|
23
|
+
|
|
24
|
+
# change question sheet on ref element, the reference_sheet's question sheet should change
|
|
25
|
+
qs2 = create(:question_sheet)
|
|
26
|
+
expect(reference_sheet.status).to eq('created')
|
|
27
|
+
reference_question.update_attribute(:related_question_sheet_id, qs2.id)
|
|
28
|
+
expect(reference_sheet.reload.question_sheet_id).to eq(qs2.id)
|
|
29
|
+
|
|
30
|
+
# start the reference, then change question sheet on ref element,
|
|
31
|
+
# the reference_sheet's question sheet should not change
|
|
32
|
+
reference_sheet.update_attribute(:status, 'started')
|
|
33
|
+
qs3 = create(:question_sheet)
|
|
34
|
+
reference_question.update_attribute(:related_question_sheet_id, qs3.id)
|
|
35
|
+
expect(reference_sheet.reload.question_sheet_id).to eq(qs2.id)
|
|
36
|
+
end
|
|
17
37
|
end
|