spec/unit/csv_builder_spec.rb in yousty-activeadmin-1.0.4.pre vs spec/unit/csv_builder_spec.rb in yousty-activeadmin-1.0.5.pre

- old
+ new

@@ -1,103 +1,231 @@ -require 'spec_helper' +require 'rails_helper' describe ActiveAdmin::CSVBuilder do describe '.default_for_resource using Post' do - let(:csv_builder) { ActiveAdmin::CSVBuilder.default_for_resource(Post) } + let(:csv_builder) { ActiveAdmin::CSVBuilder.default_for_resource(Post).tap(&:exec_columns) } - it "should return a default csv_builder for Post" do - csv_builder.should be_a(ActiveAdmin::CSVBuilder) + it 'returns a default csv_builder for Post' do + expect(csv_builder).to be_a(ActiveAdmin::CSVBuilder) end - specify "the first column should be Id" do - csv_builder.columns.first.name.should == 'Id' - csv_builder.columns.first.data.should == :id + it 'defines Id as the first column' do + expect(csv_builder.columns.first.name).to eq 'Id' + expect(csv_builder.columns.first.data).to eq :id end - specify "the following columns should be content_column" do + it "has Post's content_columns" do csv_builder.columns[1..-1].each_with_index do |column, index| - column.name.should == Post.content_columns[index].name.titleize - column.data.should == Post.content_columns[index].name.to_sym + expect(column.name).to eq Post.content_columns[index].name.humanize + expect(column.data).to eq Post.content_columns[index].name.to_sym end end + + context 'when column has a localized name' do + let(:localized_name) { 'Titulo' } + + before do + allow(Post).to receive(:human_attribute_name).and_call_original + allow(Post).to receive(:human_attribute_name).with(:title){ localized_name } + end + + it 'gets name from I18n' do + title_index = Post.content_columns.map(&:name).index('title') + 1 # First col is always id + expect(csv_builder.columns[title_index].name).to eq localized_name + end + end end context 'when empty' do - let(:builder){ ActiveAdmin::CSVBuilder.new } + let(:builder){ ActiveAdmin::CSVBuilder.new.tap(&:exec_columns) } it "should have no columns" do - builder.columns.should == [] + expect(builder.columns).to eq [] end end context "with a symbol column (:title)" do let(:builder) do ActiveAdmin::CSVBuilder.new do column :title - end + end.tap(&:exec_columns) end it "should have one column" do - builder.columns.size.should == 1 + expect(builder.columns.size).to eq 1 end describe "the column" do let(:column){ builder.columns.first } it "should have a name of 'Title'" do - column.name.should == "Title" + expect(column.name).to eq "Title" end it "should have the data :title" do - column.data.should == :title + expect(column.data).to eq :title end end end context "with a block and title" do let(:builder) do ActiveAdmin::CSVBuilder.new do column "My title" do # nothing end - end + end.tap(&:exec_columns) end it "should have one column" do - builder.columns.size.should == 1 + expect(builder.columns.size).to eq 1 end describe "the column" do let(:column){ builder.columns.first } it "should have a name of 'My title'" do - column.name.should == "My title" + expect(column.name).to eq "My title" end it "should have the data :title" do - column.data.should be_an_instance_of(Proc) + expect(column.data).to be_an_instance_of(Proc) end end end + context "with a humanize_name column option" do + context "with symbol column name" do + let(:builder) do + ActiveAdmin::CSVBuilder.new do + column :my_title, humanize_name: false + end.tap(&:exec_columns) + end + + describe "the column" do + let(:column){ builder.columns.first } + + it "should have a name of 'my_title'" do + expect(column.name).to eq "my_title" + end + end + end + + context "with string column name" do + let(:builder) do + ActiveAdmin::CSVBuilder.new do + column "my_title", humanize_name: false + end.tap(&:exec_columns) + end + + describe "the column" do + let(:column){ builder.columns.first } + + it "should have a name of 'my_title'" do + expect(column.name).to eq "my_title" + end + end + end + end + context "with a separator" do let(:builder) do - ActiveAdmin::CSVBuilder.new :col_sep => ";" + ActiveAdmin::CSVBuilder.new(col_sep: ";").tap(&:exec_columns) end it "should have proper separator" do - builder.options.should == {:col_sep => ";"} + expect(builder.options).to eq({col_sep: ";"}) end end + context "with humanize_name option" do + let(:builder) do + ActiveAdmin::CSVBuilder.new(humanize_name: false) do + column :my_title + end.tap(&:exec_columns) + end + + describe "the column" do + let(:column){ builder.columns.first } + + it "should have humanize_name option set" do + expect(column.options).to eq humanize_name: false + end + + it "should have a name of 'my_title'" do + expect(column.name).to eq "my_title" + end + end + end + context "with csv_options" do let(:builder) do - ActiveAdmin::CSVBuilder.new :force_quotes => true + ActiveAdmin::CSVBuilder.new(force_quotes: true).tap(&:exec_columns) end it "should have proper separator" do - builder.options.should == {:force_quotes => true} + expect(builder.options).to eq({force_quotes: true}) end + end + + context "with access to the controller" do + let(:dummy_view_context) { double(controller: dummy_controller) } + let(:dummy_controller) { double(names: %w(title summary updated_at created_at))} + let(:builder) do + ActiveAdmin::CSVBuilder.new do + column "id" + controller.names.each do |name| + column(name) + end + end.tap{ |b| b.exec_columns(dummy_view_context) } + end + + it "should build columns provided by the controller" do + expect(builder.columns.map(&:data)).to match_array([:id, :title, :summary, :updated_at, :created_at]) + end + end + + context "build csv using the supplied order" do + before do + @post1 = Post.create!(title: "Hello1", published_at: Date.today - 2.day ) + @post2 = Post.create!(title: "Hello2", published_at: Date.today - 1.day ) + end + let(:dummy_controller) { + class DummyController + def collection + Post.order('published_at DESC') + end + + def apply_decorator(resource) + resource + end + + def view_context + end + end + DummyController.new + } + let(:builder) do + ActiveAdmin::CSVBuilder.new do + column "id" + column "title" + column "published_at" + end + end + + it "should generate data with the supplied order" do + expect(builder).to receive(:build_row).and_return([]).once.ordered { |post| expect(post.id).to eq @post2.id } + expect(builder).to receive(:build_row).and_return([]).once.ordered { |post| expect(post.id).to eq @post1.id } + builder.build dummy_controller, [] + end + end + + skip '#exec_columns' + + skip '#build_row' do + it 'renders non-strings' + it 'encodes values correctly' + it 'passes custom encoding options to String#encode!' end end