Commit e7568213 authored by James Edwards-Jones's avatar James Edwards-Jones

Issue CSV preloads labels & author. Avoids N+1 queries.

parent c777bb91
......@@ -10,7 +10,7 @@ columns = {
'Created At (UTC)' => -> (issue) { issue.created_at&.strftime('%Y-%m-%d %H:%M:%S') },
'Updated At (UTC)' => -> (issue) { issue.updated_at&.strftime('%Y-%m-%d %H:%M:%S') },
'Milestone' => -> (issue) { issue.milestone&.title },
'Labels' => -> (issue) { issue.label_names.join(',').presence },
'Labels' => -> (issue) { issue.labels_array.sort_by(&:title).map(&:title).join(',').presence },
}
CsvBuilder.new(columns).render(@issues)
CsvBuilder.new(columns).render(@issues.includes(:author, :assignee, :labels))
......@@ -3,7 +3,10 @@ require 'spec_helper'
describe 'Issues csv', feature: true do
let(:user) { create(:user) }
let(:project) { create(:empty_project, :public) }
let!(:issue) { create(:issue, project: project) }
let(:milestone) { create(:milestone, title: 'v1.0', project: project) }
let(:idea_label) { create(:label, project: project, title: 'Idea') }
let(:feature_label) { create(:label, project: project, title: 'Feature') }
let!(:issue) { create(:issue, project: project, author: user) }
before { login_as(user) }
......@@ -15,7 +18,7 @@ describe 'Issues csv', feature: true do
end
it 'ignores pagination' do
create_list(:issue, 30, project: project)
create_list(:issue, 30, project: project, author: user)
visit namespace_project_issues_path(project.namespace, project)
click_on 'Download CSV'
......@@ -30,11 +33,23 @@ describe 'Issues csv', feature: true do
expect(csv.count).to eq 0
end
context 'includes' do
let(:label1) { create(:label, project: project, title: 'Feature') }
let(:label2) { create(:label, project: project, title: 'labels') }
let(:milestone) { create(:milestone, title: "v1.0", project: project) }
def visit_project_csv
visit namespace_project_issues_path(project.namespace, project, format: :csv)
end
it 'avoids excessive database calls' do
control_count = ActiveRecord::QueryRecorder.new{ visit_project_csv }.count
create_list(:labeled_issue,
10,
project: project,
assignee: user,
author: user,
milestone: milestone,
labels: [feature_label, idea_label])
expect{ visit_project_csv }.not_to exceed_query_limit(control_count)
end
context 'includes' do
before do
issue.update!(milestone: milestone,
assignee: user,
......@@ -42,9 +57,9 @@ describe 'Issues csv', feature: true do
due_date: DateTime.new(2014, 3, 2),
created_at: DateTime.new(2015, 4, 3, 2, 1, 0),
updated_at: DateTime.new(2016, 5, 4, 3, 2, 1),
labels: [label1, label2])
labels: [feature_label, idea_label])
visit namespace_project_issues_path(project.namespace, project, format: :csv)
visit_project_csv
end
specify 'title' do
......@@ -72,14 +87,13 @@ describe 'Issues csv', feature: true do
end
specify 'labels' do
expect(csv[0]['Labels']).to eq 'Feature,labels'
expect(csv[0]['Labels']).to eq 'Feature,Idea'
end
specify 'due_date' do
expect(csv[0]['Due Date']).to eq '2014-03-02'
end
specify 'created_at' do
expect(csv[0]['Created At (UTC)']).to eq '2015-04-03 02:01:00'
end
......@@ -91,7 +105,7 @@ describe 'Issues csv', feature: true do
context 'with minimal details' do
it 'renders labels as nil' do
visit namespace_project_issues_path(project.namespace, project, format: :csv)
visit_project_csv
expect(csv[0]['Labels']).to eq nil
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment