require "rails_helper" feature "User managing medical releases" do let(:current_user) { create(:user) } let(:project) { create(:project, members: current_user, account: current_user.primary_account) } context "when signed out" do scenario 'creating a release for an adult', js: true do allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) project = create(:project, members: current_user, account: current_user.primary_account) contract_template = create(:contract_template, project: project) visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) fill_in person_first_name_field, with: 'Jane' fill_in person_last_name_field, with: 'Doe' fill_in_person_address_fields fill_in person_phone_field, with: '555-555-5555' fill_in person_email_field, with: 'jane.doe@test.com' drop_file Rails.root.join(file_fixture("person_photo.png")), type: :dropzone draw_signature file_fixture("signature.png"), "medical_release_signature_base64" expect do click_button submit_release_button end.to change(MedicalRelease, :count).by(1) expect(page).to have_content(successful_submission_message) end scenario "creating a release for a minor - guardian fields are required when minor checkbox is checked", js: true do contract_template = create(:contract_template, project: project) visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) all('input[data-required-tag="guardian"]').each do |field| expect(field['required']).to eq 'false' expect(field).not_to be_visible end page.check person_is_minor_checkbox all('input[data-required-tag="guardian"]').each do |field| expect(field['required']).to eq 'true' expect(field).to be_visible end end scenario 'creating a release for a minor', js: true do allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) project = create(:project, members: current_user, account: current_user.primary_account) contract_template = create(:contract_template, project: project) visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) expect(page).not_to have_content guardian_information_heading.upcase expect(page).not_to have_content guardian_photo_heading.upcase page.check person_is_minor_checkbox expect(page).to have_content guardian_information_heading.upcase expect(page).to have_content guardian_photo_heading.upcase expect(page).to have_content guardian_email_field.titleize fill_in guardian_first_name_field, with: 'Guardian' fill_in guardian_last_name_field, with: 'Name' fill_in guardian_phone_field, with: '001101' fill_in guardian_email_field, with: "valid@email.com" fill_in person_first_name_field, with: 'Jane' fill_in person_last_name_field, with: 'Doe' fill_in_person_address_fields fill_in person_phone_field, with: '555-555-5555' fill_in person_email_field, with: 'jane.doe@test.com' drop_file Rails.root.join(file_fixture("person_photo.png")), type: :dropzone attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all draw_signature file_fixture('signature.png'), 'medical_release_signature_base64' fill_in_guardian_address_fields attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all draw_signature file_fixture('signature.png'), 'medical_release_signature_base64' click_button submit_release_button expect(page).to have_content(successful_submission_message) end scenario 'creating a release for a minor with two guardians', js: true do allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) project = create(:project, members: current_user, account: current_user.primary_account) contract_template = create(:contract_template, project: project) visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) expect(page).not_to have_content guardian_2_information_heading.upcase expect(page).not_to have_content guardian_2_photo_heading.upcase page.check person_is_minor_checkbox expect(page).to have_content guardian_information_heading.upcase expect(page).to have_content guardian_photo_heading.upcase expect(page).to have_content guardian_email_field.titleize expect(page).to have_content guardian_2_information_heading.upcase expect(page).to have_content guardian_2_photo_heading.upcase expect(page).to have_content guardian_2_email_field.titleize expect(page).to have_content guardian_2_phone_field.titleize expect(page).to have_content guardian_2_address_street1_field.titleize fill_in guardian_first_name_field, with: 'Guardian' fill_in guardian_last_name_field, with: 'Name' fill_in guardian_phone_field, with: '001101' fill_in guardian_email_field, with: "valid@email.com" fill_in person_first_name_field, with: 'Jane' fill_in person_last_name_field, with: 'Doe' fill_in_person_address_fields fill_in person_phone_field, with: '555-555-5555' fill_in person_email_field, with: 'jane.doe@test.com' drop_file Rails.root.join(file_fixture("person_photo.png")), type: :dropzone attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all draw_signature file_fixture('signature.png'), 'medical_release_signature_base64' fill_in_guardian_address_fields attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all draw_signature file_fixture('signature.png'), 'medical_release_signature_base64' fill_in guardian_2_first_name_field, with: 'Second' fill_in guardian_2_last_name_field, with: 'Guardian' fill_in guardian_2_phone_field, with: '999' click_button submit_release_button expect(page).to have_content(successful_submission_message) expect(MedicalRelease.last.guardian_2_first_name).to eq 'Second' end scenario 'when signing release, question answers are required', js: true do project = create(:project, members: current_user, account: current_user.primary_account) contract_template = create(:contract_template, project: project, question_1_text: 'Question 1', question_2_text: 'Question 2', questionnaire_legal_text: 'Questionnaire legal text', ) visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) expect(page).to have_content 'Questionnaire legal text' fill_in person_first_name_field, with: 'Jane' fill_in person_last_name_field, with: 'Doe' draw_signature file_fixture("signature.png"), "medical_release_signature_base64" expect do click_button submit_release_button end.to change(MedicalRelease, :count).by(0) expect(page).not_to have_content(successful_submission_message) fill_in answer_field_for_question(1), with: 'Answer 1' draw_signature file_fixture("signature.png"), "medical_release_signature_base64" expect do click_button submit_release_button end.to change(MedicalRelease, :count).by(0) expect(page).not_to have_content(successful_submission_message) fill_in answer_field_for_question(2), with: 'Answer 2' draw_signature file_fixture("signature.png"), "medical_release_signature_base64" expect do click_button submit_release_button end.to change(MedicalRelease, :count).by(1) expect(page).to have_content(successful_submission_message) end scenario "creating a release, if contract template contains signature legal language, it is shown" do contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text) visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) expect(page).to have_content dummy_signature_legal_text end end context "when signed in as account manager" do before do sign_in current_user end scenario "Approved releases have checkmark and non-approved releases don't have checkmarks" do create(:medical_release_with_contract_template, :native, project: project) visit project_medical_releases_path(project) expect(page).to have_css('i.fa.fa-check-circle.fa-2x', count: 0) create(:medical_release_with_contract_template, :native, project: project, approved_by_user_email: "some@email.com", approved_at: DateTime.now) visit project_medical_releases_path(project) expect(page).to have_css('i.fa.fa-check-circle.fa-2x', count: 1) end scenario "Download button is visible" do create(:medical_release_with_contract_template, :native, project: project) create(:medical_release_with_contract_template, :non_native, project: project) visit project_medical_releases_path(project) expect(page).to have_content download_button end scenario "Download action in Manage menu is visible" do create(:medical_release_with_contract_template, :native, project: project) create(:medical_release_with_contract_template, :non_native, project: project) visit project_medical_releases_path(project) expect(page).to have_link("Download", exact: true, count: 2) end scenario "Downloading PDF of native medical release is possible" do native_release = create(:medical_release_with_contract_template, :native, project: project) visit project_medical_releases_path(project) click_link *view_release_pdf_link_for(native_release) expect(content_type).to eq('application/pdf') end scenario 'viewing contract PDF with medical questionnaire' do contract_template = create(:medical_release_contract_template, project: project, questionnaire_legal_text: "Questionnaire legal text", question_1_text: "Question 1 text") medical_release = create(:medical_release, :native, contract_template: contract_template, project: project, person_first_name: "John", person_last_name: "Doe", question_1_answer: "Question 1 answer", ) sign_in(current_user) visit project_medical_releases_path(project) click_link *view_release_pdf_link_for(medical_release) expect(content_type).to eq("application/pdf") expect(content_disposition).to include("inline") expect(pdf_filename).to include("doe-john") expect(pdf_body).to have_content("John Doe") expect(pdf_body).to have_content questionnaire_heading.upcase expect(pdf_body).to have_content "Question 1 text" expect(pdf_body).to have_content "Question 1 answer" expect(pdf_body).to have_content "Questionnaire legal text" end scenario 'viewing contract PDF without medical questionnaire' do contract_template = create(:medical_release_contract_template, project: project) medical_release = create(:medical_release, :native, contract_template: contract_template, project: project, person_first_name: "John", person_last_name: "Doe", ) sign_in(current_user) visit project_medical_releases_path(project) click_link *view_release_pdf_link_for(medical_release) expect(content_type).to eq("application/pdf") expect(content_disposition).to include("inline") expect(pdf_filename).to include("doe-john") expect(pdf_body).not_to have_content questionnaire_heading.upcase end end context "when the user is manager(project manager)" do let(:current_user) { create(:user, :manager) } before do sign_in current_user end scenario "Download All is not visible" do create(:medical_release_with_contract_template, :native, project: project) create(:medical_release_with_contract_template, :non_native, project: project) visit project_medical_releases_path(project) expect(page).not_to have_content download_button end scenario "Download action in Manage menu is not visible" do create(:medical_release_with_contract_template, :native, project: project) create(:medical_release_with_contract_template, :non_native, project: project) visit project_medical_releases_path(project) expect(page).to have_link("Download", exact: true, count: 0) end scenario "Downloading PDF of native medical release is not possible" do native_release = create(:medical_release_with_contract_template, :native, project: project) visit project_medical_releases_path(project) link = medical_release_contracts_path(native_release, format: 'pdf') expect { visit link }.to raise_exception Pundit::NotAuthorizedError end scenario "Downloading PDF of non native medical release is not possible" do non_native_release = create(:medical_release_with_contract_template, :non_native, project: project) visit project_medical_releases_path(project) link = medical_release_contracts_path(non_native_release, format: 'pdf') expect { visit link }.to raise_exception Pundit::NotAuthorizedError end end context "when the user is associate" do let(:current_user) { create(:user, :associate) } before do sign_in current_user end scenario "Download All is not visible" do create(:medical_release_with_contract_template, :native, project: project) create(:medical_release_with_contract_template, :non_native, project: project) visit project_medical_releases_path(project) expect(page).not_to have_content download_button end scenario "Download action in Manage menu is not visible" do create(:medical_release_with_contract_template, :native, project: project) create(:medical_release_with_contract_template, :non_native, project: project) visit project_medical_releases_path(project) expect(page).to have_link("Download", exact: true, count: 0) end scenario "Downloading PDF of native medical release is not possible" do native_release = create(:medical_release_with_contract_template, :native, project: project) visit project_medical_releases_path(project) link = medical_release_contracts_path(native_release, format: 'pdf') expect { visit link }.to raise_exception Pundit::NotAuthorizedError end scenario "Downloading PDF of non native medical release is not possible" do non_native_release = create(:medical_release_with_contract_template, :non_native, project: project) visit project_medical_releases_path(project) link = medical_release_contracts_path(non_native_release, format: 'pdf') expect { visit link }.to raise_exception Pundit::NotAuthorizedError end end private def download_button 'Download' end def download_action 'Download' end def manage_button t 'medical_releases.medical_release.actions.manage' end def view_release_pdf_link_for(release) ['Download', href: medical_release_contracts_path(release, format: 'pdf')] end def person_first_name_field "medical_release[person_first_name]" end def person_last_name_field "medical_release[person_last_name]" end def person_email_field "medical_release[person_email]" end def person_phone_field "medical_release[person_phone]" end def submit_release_button t 'shared.submit_release_short' end def successful_submission_message "Your release was successfully submitted. Thank you." end def fill_in_person_address_fields fill_in person_address_street1_field, with: "123 Test Lane" fill_in person_address_city_field, with: "New York" fill_in person_address_state_field, with: "NY" fill_in person_address_zip_field, with: '1000' end def fill_in_guardian_address_fields fill_in guardian_address_street1_field, with: "124 Test Lane" fill_in guardian_address_city_field, with: "New York" fill_in guardian_address_state_field, with: "NY" fill_in guardian_address_zip_field, with: '1000' end def person_address_street1_field t('helpers.label.medical_release.person_address_street1') end def person_address_city_field t('helpers.label.medical_release.person_address_city') end def person_address_state_field t('helpers.label.medical_release.person_address_state') end def person_address_zip_field t('helpers.label.medical_release.person_address_zip') end def guardian_first_name_field t('helpers.label.medical_release.guardian_first_name') end def guardian_last_name_field t('helpers.label.medical_release.guardian_last_name') end def guardian_phone_field t('helpers.label.medical_release.guardian_phone') end def guardian_email_field t('helpers.label.medical_release.guardian_email') end def guardian_address_street1_field t('helpers.label.medical_release.guardian_address_street1') end def guardian_address_city_field t('helpers.label.medical_release.guardian_address_city') end def guardian_address_state_field t('helpers.label.medical_release.guardian_address_state') end def guardian_address_zip_field t('helpers.label.medical_release.guardian_address_zip') end def guardian_photo_field 'medical_release[guardian_photo]' end def person_is_minor_checkbox 'medical_release_minor' end def guardian_2_first_name_field t('helpers.label.medical_release.guardian_2_first_name') end def guardian_2_last_name_field t('helpers.label.medical_release.guardian_2_last_name') end def guardian_2_phone_field t('helpers.label.medical_release.guardian_2_phone') end def guardian_2_email_field t('helpers.label.medical_release.guardian_2_email') end def guardian_2_address_street1_field t('helpers.label.medical_release.guardian_2_address_street1') end def email_validation_error_for(prefix) "#{prefix} email is not an email" end def guardian_photo_heading t 'public.medical_releases.new.guardian_photo.heading' end def guardian_information_heading t 'public.medical_releases.new.guardian_info.heading' end def guardian_2_photo_heading t 'public.medical_releases.new.guardian_2_photo.heading' end def guardian_2_information_heading t 'public.medical_releases.new.guardian_2_info.heading' end def answer_field_for_question(number) "medical_release[question_#{number}_answer]" end def dummy_signature_legal_text 'Some signature legal language' end def questionnaire_heading t 'contracts.questionnaire.heading.medical_release' end end