require "spec_helper"
RSpec.describe Greedo::GridHelper, type: :helper do
it "renders a table" do
create_project(name: "Foo")
html = helper.greedo(Project.all)
expect(html).to have_selector("table.table.table-striped")
end
it "renders a column header for each column specified" do
create_project(name: "Foo")
html = helper.greedo(Project.all) do |g|
g.column :id, label: "ID"
g.column :name
end
expect(html).to include("
ID | ")
expect(html).to include("Name | ")
end
it "renders values for each of the columns specified" do
foo = create_project(name: "Foo")
bar = create_project(name: "Bar")
html = helper.greedo(Project.all) do |g|
g.column :id, label: "ID"
g.column :name
end
expect(html).to include("Foo")
expect(html).to include(foo.id.to_s)
expect(html).to include("Bar")
expect(html).to include(bar.id.to_s)
end
it "allows customizing how the content will be displayed" do
create_project(name: "Foo")
html = helper.greedo(Project.all) do |g|
g.column :name do |p|
p.name.upcase
end
end
expect(html).to include("FOO")
end
it "adds pagination" do
create_project(name: "Bar")
create_project(name: "Baz")
create_project(name: "Foo")
params[:controller] = "projects"
html = helper.greedo(Project.all, per_page: 2) do |g|
g.column :id
g.column :name
end
expect(html).not_to include("Foo")
expect(html).to include("Bar")
expect(html).to include("Baz")
end
it "allows changing the page param name" do
create_project(name: "Bar")
create_project(name: "Baz")
create_project(name: "Foo")
params[:controller] = "projects"
params[:foo_page] = "2"
html = helper.greedo(Project.all, param_name: :foo_page, per_page: 2) do |g|
g.column :id
g.column :name
end
expect(html).to include("Foo")
expect(html).not_to include("Bar")
expect(html).not_to include("Baz")
end
it "adds row id" do
foo = create_project(name: "foo")
bar = create_project(name: "Bar")
html = helper.greedo(Project.all) do |g|
g.column :id
g.column :name
end
expect(html).to have_selector("tr#project-#{foo.id}")
expect(html).to have_selector("tr#project-#{bar.id}")
end
it "adds custom row id" do
foo = create_project(name: "foo")
bar = create_project(name: "Bar")
html = helper.greedo(Project.all) do |g|
g.row_id { |p| "asdf-#{p.id}" }
g.column :id
g.column :name
end
expect(html).to have_selector("tr#asdf-#{foo.id}")
expect(html).to have_selector("tr#asdf-#{bar.id}")
end
it "show a no records message" do
html = helper.greedo(Project.all) do |g|
g.column :id
end
expect(html).to include("No data to show.")
end
class ProjectPresenter < SimpleDelegator
def author
"No Author"
end
end
it "wraps items in presenter" do
create_project(name: "foo")
html = helper.greedo(Project.all) do |g|
g.presenter ProjectPresenter
g.column :author
end
expect(html).to include("No Author")
end
it "wraps items in a block presenter" do
create_project(name: "foo")
html = helper.greedo(Project.all) do |g|
g.presenter do |record|
record.name
end
g.column :length
end
expect(html).to include("3")
end
it "does not pollute the output when printing the presenter output" do
helper.greedo(Project.all) do |g|
expect(g.presenter {|r| r.name}).to be_nil
end
end
def create_project(attrs = {})
Project.create!({
name: "Project #{Project.count + 1}"
}.merge(attrs))
end
end