diff --git a/app/models/medical_release.rb b/app/models/medical_release.rb
index 62f08b9..49ca937 100644
--- a/app/models/medical_release.rb
+++ b/app/models/medical_release.rb
@@ -32,6 +32,7 @@ class MedicalRelease < ApplicationRecord
# These validations apply to all releases
validates :person_first_name, :person_last_name, presence: true
validates :person_email, email: true, allow_blank: true
+ validate :valid_answers
acts_as_taggable_on :internal_tags, :tags
@@ -76,4 +77,15 @@ class MedicalRelease < ApplicationRecord
def contract_file_name
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}"
end
+
+ private
+
+ def valid_answers
+ (1..ContractTemplate::NUMBER_OF_CUSTOM_FIELDS).each do |index|
+ if contract_template && contract_template["question_#{index}_text"].present? &&
+ public_send("question_#{index}_answer").blank?
+ errors.add("question_#{index}", I18n.t('medical_releases.custom_validation_errors.question_answer_is_required'))
+ end
+ end
+ end
end
diff --git a/app/views/public/medical_releases/new.html.erb b/app/views/public/medical_releases/new.html.erb
index 7f4dd2f..0ae2d9d 100644
--- a/app/views/public/medical_releases/new.html.erb
+++ b/app/views/public/medical_releases/new.html.erb
@@ -30,7 +30,7 @@
<% (1..MedicalRelease::NUMBER_OF_CUSTOM_FIELDS).each do |n| %>
<% if @contract_template.public_send("question_#{n}_text").present? %>
- <%= form.text_area "question_#{n}_answer", wrapper_class: "col-sm-12", label: @contract_template.public_send("question_#{n}_text") %>
+ <%= form.text_area "question_#{n}_answer", required: true, wrapper_class: "col-sm-12", label: @contract_template.public_send("question_#{n}_text") %>
<% end %>
<% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 7734d89..ef8b351 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -772,6 +772,8 @@ en:
update:
notice: The material release has been updated
medical_releases:
+ custom_validation_errors:
+ question_answer_is_required: answer is required
destroy:
alert: The medical release has been deleted
index:
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 91e271f..636e5f2 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -282,6 +282,9 @@ es:
form:
photos:
dropzone_label: Tap to take a photo of Licensed Material (optional) (ES)
+ medical_releases:
+ custom_validation_errors:
+ question_answer_is_required: answer is required (ES)
public:
appearance_releases:
create:
diff --git a/spec/controllers/public/medical_releases_controller_spec.rb b/spec/controllers/public/medical_releases_controller_spec.rb
index 794bdb2..d80325e 100644
--- a/spec/controllers/public/medical_releases_controller_spec.rb
+++ b/spec/controllers/public/medical_releases_controller_spec.rb
@@ -19,14 +19,29 @@ RSpec.describe Public::MedicalReleasesController, type: :controller do
end
it "displays validation errors" do
- contract_template = create(:contract_template, project: project)
+ contract_template = create(:contract_template,
+ project: project,
+ question_1_text: "Question 1",
+ question_2_text: "Question 2"
+ )
sign_in(user)
- post :create, params: { account_id: user.primary_account.to_param, project_id: project, contract_template_id: contract_template, medical_release: { person_address_city: "Albuquerque" } }
+ post :create, params: {
+ account_id: user.primary_account.to_param,
+ project_id: project,
+ contract_template_id: contract_template,
+ medical_release: {
+ person_address_city: "Albuquerque",
+ question_2_answer: "Answer 2"
+ }
+ }
+
body = CGI.unescape_html(response.body)
expect(body).to match /Person first name can't be blank/
expect(body).to match /Person last name can't be blank/
expect(body).to match />can't be blank
+ expect(body).to match /Question 1 #{question_answer_validation_error}/
+ expect(body).not_to match /Question 2 #{question_answer_validation_error}/
end
it "responds with success " do
@@ -68,4 +83,8 @@ RSpec.describe Public::MedicalReleasesController, type: :controller do
{ signature_base64: data_uri }
end
+
+ def question_answer_validation_error
+ t 'medical_releases.custom_validation_errors.question_answer_is_required'
+ end
end
diff --git a/spec/features/user_managing_medical_releases_spec.rb b/spec/features/user_managing_medical_releases_spec.rb
index 59510fb..fd619c5 100644
--- a/spec/features/user_managing_medical_releases_spec.rb
+++ b/spec/features/user_managing_medical_releases_spec.rb
@@ -121,6 +121,43 @@ feature "User managing medical releases" do
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'
+ )
+
+ 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'
+ 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
end
context "when signed in as account manager" do
@@ -396,4 +433,8 @@ feature "User managing medical releases" do
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
end
diff --git a/spec/models/medical_release_spec.rb b/spec/models/medical_release_spec.rb
index 917c3ef..53860fb 100644
--- a/spec/models/medical_release_spec.rb
+++ b/spec/models/medical_release_spec.rb
@@ -22,6 +22,23 @@ RSpec.describe MedicalRelease do
context "for non-native releases" do
it { is_expected.to validate_attachment_of(:contract).on(:non_native) }
end
+
+ context "question answers" do
+ let(:project) { create(:project) }
+ let(:contract_template) { create(:contract_template, project: project, question_1_text: 'Question 1') }
+
+ it "returns validation errors if answers are missing" do
+ expect do
+ create(:medical_release, contract_template: contract_template)
+ end.to raise_exception ActiveRecord::RecordInvalid
+ end
+
+ it "creates release if answers are present" do
+ expect do
+ create(:medical_release, contract_template: contract_template, question_1_answer: 'Answer 1')
+ end.to change(MedicalRelease, :count).by(1)
+ end
+ end
end
describe "attachments" do