diff --git a/app/models/sample.rb b/app/models/sample.rb index f6af730dd..51b99ed77 100644 --- a/app/models/sample.rb +++ b/app/models/sample.rb @@ -27,6 +27,7 @@ class Current < ActiveSupport::CurrentAttributes GC_CONTENTS = ['Neutral', 'High AT', 'High GC'].freeze GENDERS = ['Male', 'Female', 'Mixed', 'Hermaphrodite', 'Unknown', 'Not Applicable'].freeze + EGA_GENDERS = %w[Female Male Unknown].freeze DNA_SOURCES = [ 'Genomic', 'Whole Genome Amplified', @@ -194,6 +195,8 @@ class Current < ActiveSupport::CurrentAttributes with_options(on: :EGA) do validates :gender, presence: { message: 'is required' } + one_of_ega_genders = EGA_GENDERS.to_sentence(last_word_connector: ' or ', two_words_connector: ' or ') + validates :gender, inclusion: { in: EGA_GENDERS, message: "must be #{one_of_ega_genders}" } validates :phenotype, presence: { message: 'is required' } validates :donor_id, presence: { message: 'is required' } end diff --git a/lib/accession/sample.rb b/lib/accession/sample.rb index 55aae8a35..96cce5969 100644 --- a/lib/accession/sample.rb +++ b/lib/accession/sample.rb @@ -113,9 +113,8 @@ def check_required_fields # EBI will still perform its own validation on submission. return if Flipper.enabled?(:y25_714_skip_accessioning_tag_validation) - unless tags.meets_service_requirements?(service, standard_tags) - errors.add(:sample, "does not have the required metadata: #{tags.missing.sort.to_sentence.dasherize}.") - end + check_tags + check_samples end def check_studies @@ -125,5 +124,15 @@ def check_studies errors.add(:sample, 'can only be accessioned if linked to a releasable, accessioned study.') end end + + def check_tags + unless tags.meets_service_requirements?(service, standard_tags) + errors.add(:sample, "does not have the required metadata: #{tags.missing.sort.to_sentence.dasherize}.") + end + end + + def check_samples + sample.errors.full_messages.each { |msg| errors.add(:sample, msg) } unless sample.valid?(service.provider) + end end end diff --git a/spec/lib/accession/sample_spec.rb b/spec/lib/accession/sample_spec.rb index 6c96fb590..8654c382f 100644 --- a/spec/lib/accession/sample_spec.rb +++ b/spec/lib/accession/sample_spec.rb @@ -90,6 +90,55 @@ def find_value_at_tag(xml_received, tag_name) expect(described_class.new(tag_list, sample)).not_to be_valid end + it 'can have a gender of Female' do + sample.sample_metadata.gender = 'Female' + expect(described_class.new(tag_list, sample)).to be_valid + end + + it 'cannot have a leading space in gender' do + sample.sample_metadata.gender = ' Female' + expect(described_class.new(tag_list, sample)).not_to be_valid + end + + it 'cannot have a trailing space in gender' do + sample.sample_metadata.gender = 'Female ' + expect(described_class.new(tag_list, sample)).not_to be_valid + end + + it 'can have a gender of Male' do + sample.sample_metadata.gender = 'Male' + expect(described_class.new(tag_list, sample)).to be_valid + end + + it 'can have a gender of Unknown' do + sample.sample_metadata.gender = 'Unknown' + expect(described_class.new(tag_list, sample)).to be_valid + end + + it 'cannot have a gender of Mixed' do + sample.sample_metadata.gender = 'Mixed' + expect(described_class.new(tag_list, sample)).not_to be_valid + end + + it 'cannot have a gender of Hermaphrodite' do + sample.sample_metadata.gender = 'Hermaphrodite' + expect(described_class.new(tag_list, sample)).not_to be_valid + end + + it 'cannot have a gender of Not Applicable' do + sample.sample_metadata.gender = 'Not Applicable' + expect(described_class.new(tag_list, sample)).not_to be_valid + end + + it 'provides a clear error message about valid gender options' do + sample.sample_metadata.gender = 'Invalid Gender' + accession_sample = described_class.new(tag_list, sample) + accession_sample.validate + expect(accession_sample.errors.full_messages.join).to include( + 'Sample metadata gender must be Female, Male or Unknown' + ) + end + it 'is required to define phenotype' do sample.sample_metadata.phenotype = nil expect(described_class.new(tag_list, sample)).not_to be_valid diff --git a/spec/lib/accession/submission_spec.rb b/spec/lib/accession/submission_spec.rb index b4e3f011f..253084e64 100644 --- a/spec/lib/accession/submission_spec.rb +++ b/spec/lib/accession/submission_spec.rb @@ -55,7 +55,7 @@ allow(described_class).to receive(:client).and_return(mock_client) end - context 'when th sample has not yet been accessioned' do + context 'when the sample has not yet been accessioned' do context 'when the submission is successful' do let(:accession_number) { 'EGA00001000240' } let(:mock_client) do