Project

General

Profile

« Previous | Next » 

Revision 20d817c8

Added by Tomer Brisker almost 7 years ago

Fixes #19585 - Allow csv export of nested attributes

This is required for example to export host facet attributes.

View differences:

app/services/csv_exporter.rb
module CsvExporter
def self.export(resources, columns)
header = csv_header(columns)
Enumerator.new do |csv|
csv << csv_header(columns)
csv << header
columns.map!{|c| c.to_s.split('.').map(&:to_sym)}
resources.uncached do
resources.reorder(nil).limit(nil).find_each do |obj|
csv << CSV.generate_line(columns.map{|c| obj.send(c)})
csv << CSV.generate_line(columns.map{|c| c.inject(obj, :try)})
end
end
end
test/controllers/concerns/csv_responder_test.rb
assert_equal "text/csv; charset=utf-8", response.headers["Content-Type"]
assert_equal "no-cache", response.headers["Cache-Control"]
assert_equal "attachment; filename=\"fake-#{Date.today}.csv\"", response.headers["Content-Disposition"]
assert response.stream.instance_variable_get(:@buf).is_a? Enumerator
assert_equal "Name\n", response.stream.instance_variable_get(:@buf).next
buf = response.stream.instance_variable_get(:@buf)
assert buf.is_a? Enumerator
assert_equal "Name\n", buf.next
end
end
......
tests Api::V2::FakeController
test "response is streamed correctly with right headers" do
get :index
get :index, {}, set_session_user
assert_equal "text/csv; charset=utf-8", response.headers["Content-Type"]
assert_equal "no-cache", response.headers["Cache-Control"]
assert_equal "attachment; filename=\"fake-#{Date.today}.csv\"", response.headers["Content-Disposition"]
assert response.stream.instance_variable_get(:@buf).is_a? Enumerator
assert_equal "Name\n", response.stream.instance_variable_get(:@buf).next
buf = response.stream.instance_variable_get(:@buf)
assert buf.is_a? Enumerator
assert_equal "Name\n", buf.next
end
end
test/unit/csv_exporter_test.rb
result = CsvExporter.export(Host::Managed, [:id])
assert_equal "Id\n", result.next
assert_equal result.count, Host::Managed.count+1
assert_difference('CsvExporter.export(Host::Managed, [:id]).count') do
FactoryGirl.create(:host)
end
end
test 'handles empty results correctly' do
......
result.next
end
end
test 'calls nested methods on records' do
host = FactoryGirl.create(:host)
result = CsvExporter.export(Host::Managed, [:name, 'location.name'])
assert_equal "Name,Location.Name\n", result.next
assert_equal "#{host.name},#{host.location.name}\n", result.next
assert_raises StopIteration do
result.next
end
end
end

Also available in: Unified diff