Skip to content

Commit

Permalink
Add zero concentration samples to LOD boxes
Browse files Browse the repository at this point in the history
  • Loading branch information
ysbaddaden committed Oct 10, 2022
1 parent a5dbff6 commit 88baa44
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 10 deletions.
4 changes: 2 additions & 2 deletions app/models/box.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ def self.purposes
entity_fields.find { |f| f.name == 'purpose' }.options
end

def build_samples(batch, concentration_exponents:, replicates:, media:)
def build_samples(batch, concentration_number: 1, concentration_exponents: [0], replicates:, media:)
concentration_exponents.each do |exponent|
1.upto(replicates) do |replicate|
samples << batch.build_sample(
concentration_number: 1,
concentration_number: concentration_number,
concentration_exponent: exponent,
replicate: replicate,
institution: institution,
Expand Down
1 change: 1 addition & 0 deletions app/models/box_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ def build_samples
case @box.purpose
when "LOD"
@box.build_samples(@batches["lod"], concentration_exponents: 1..8, replicates: 3, media: media)
@box.build_samples(@batches["lod"], concentration_number: 0, replicates: 4, media: media)

when "Variants"
@batches.each_value do |batch|
Expand Down
4 changes: 2 additions & 2 deletions app/models/sample.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ def self.institution_is_required
validate :validate_encounter
validate :validate_patient

validates_numericality_of :concentration_number, only_integer: true, greater_than: 0, allow_blank: true
validates_numericality_of :concentration_exponent, only_integer: true, greater_than: 0, allow_blank: true
validates_numericality_of :concentration_number, only_integer: true, greater_than_or_equal: 0, allow_blank: true
validates_numericality_of :concentration_exponent, only_integer: true, greater_than_or_equal: 0, allow_blank: true
validates_numericality_of :replicate, only_integer: true, greater_than_or_equal_to: 0, allow_blank: true
validates_inclusion_of :media, in: ->(_) { Sample.media }, allow_blank: true
validate :validate_box_context, if: -> { box.present? }
Expand Down
17 changes: 11 additions & 6 deletions spec/controllers/boxes_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -283,14 +283,18 @@
end.to change(institution.boxes, :count).by(0)
end

def expect_samples(batch, concentration_exponents:, replicates:)
samples = batch.samples.order(:id).to_a
expect(samples.size).to eq(concentration_exponents.size * replicates)
def expect_samples(batch, concentration_number: 1, concentration_exponents: [0], replicates:)
# NOTE: can't where/order in SQL because entity fields...
samples = batch.samples.to_a.reject { |s| s.concentration_number != concentration_number }.sort! do |a, b|
cmp = a.concentration_exponent <=> b.concentration_exponent
cmp = a.replicate <=> b.replicate if cmp == 0
cmp
end

concentration_exponents.each do |e|
1.upto(replicates) do |r|
expect(sample = samples.shift).to_not be_nil
expect(sample.concentration).to eq(1 * (10 ** -e))
expect(sample.concentration).to eq(concentration_number * (10 ** -e))
expect(sample.replicate).to eq(r)
end
end
Expand All @@ -304,10 +308,11 @@ def expect_samples(batch, concentration_exponents:, replicates:)
batch_uuids: { "lod" => batch.uuid },
} }
expect(response).to redirect_to(boxes_path)
end.to change(institution.samples, :count).by(24)
end.to change(institution.samples, :count).by(28)

expect(Box.last.samples.count).to eq(24)
expect(Box.last.samples.count).to eq(28)
expect_samples(batch, concentration_exponents: 1..8, replicates: 3)
expect_samples(batch, concentration_number: 0, replicates: 4)
end

it "requires one batch" do
Expand Down

0 comments on commit 88baa44

Please sign in to comment.