diff --git a/app/models/comment.rb b/app/models/comment.rb index 06e2070052..c792088dbc 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -36,10 +36,11 @@ def self.counts_for(commentables) def self.counts_for_requests(requests) # rubocop:todo Metrics/AbcSize all_commentables = requests.flat_map { |request| [request, request.asset, request.asset&.labware] } counts = where(commentable: all_commentables.compact).group(:commentable_type, :commentable_id).count + requests.each_with_object({}) do |request, counter_cache| request_count = counts.fetch(['Request', request.id], 0) receptacle_count = counts.fetch(['Receptacle', request.asset_id], 0) - labware_count = counts.fetch(['Labware', request.asset.labware_id], 0) + labware_count = counts.fetch(['Labware', request.asset&.labware_id], 0) counter_cache[request.id] = request_count + receptacle_count + labware_count end end diff --git a/spec/models/comment_spec.rb b/spec/models/comment_spec.rb index 153ea85bee..e0e14f2c2d 100644 --- a/spec/models/comment_spec.rb +++ b/spec/models/comment_spec.rb @@ -18,17 +18,29 @@ end describe '#counts_for_requests' do - let(:request) { create :sequencing_request, asset: tube } - let(:tube) { create :multiplexed_library_tube } + context 'when request has asset' do + let(:request) { create :sequencing_request, asset: tube } + let(:tube) { create :multiplexed_library_tube } - before do - create :comment, commentable: tube, description: 'An excellent tube' - create :comment, commentable: tube.receptacle, description: 'A good receptacle' - create :comment, commentable: request, description: 'A reasonable request' + before do + create :comment, commentable: tube, description: 'An excellent tube' + create :comment, commentable: tube.receptacle, description: 'A good receptacle' + create :comment, commentable: request, description: 'A reasonable request' + end + + it 'counts comments on requests, their assets and receptacles' do + expect(described_class.counts_for_requests([request])).to eq({ request.id => 3 }) + end end - it 'counts comments on requests, their assets and receptacles' do - expect(described_class.counts_for_requests([request])).to eq({ request.id => 3 }) + context 'when request has no asset' do + let(:request) { create :sequencing_request } + + before { create :comment, commentable: request, description: 'A reasonable request' } + + it 'counts comments on requests only' do + expect(described_class.counts_for_requests([request])).to eq({ request.id => 1 }) + end end end