Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/models/sample.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -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
Expand Down
15 changes: 12 additions & 3 deletions lib/accession/sample.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
49 changes: 49 additions & 0 deletions spec/lib/accession/sample_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion spec/lib/accession/submission_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading