spec/components/shared/banner_component_spec.rb
require "rails_helper"
describe Shared::BannerComponent do
it "renders given a banner" do
banner = create(:banner,
title: "Vote now!",
description: "Banner description",
target_url: "http://www.url.com",
post_started_at: (Date.current - 4.days),
post_ended_at: (Date.current + 10.days),
background_color: "#FF0000",
font_color: "#FFFFFF")
render_inline Shared::BannerComponent.new(banner)
expect(page.find(".banner")).to have_content "Vote now!"
expect(page.find(".banner")).to have_content "Banner description"
expect(page.find(".banner")[:style]).to eq("background-color:#FF0000;")
expect(page.find("h2")[:style]).to eq("color:#FFFFFF;")
expect(page.find("h3")[:style]).to eq("color:#FFFFFF;")
expect(page).to have_link href: "http://www.url.com"
end
it "renders given a section" do
create(:banner, web_sections: [WebSection.find_by!(name: "debates")], title: "Debate banner")
create(:banner, web_sections: [WebSection.find_by!(name: "proposals")], title: "Proposal banner")
render_inline Shared::BannerComponent.new("debates")
expect(page.find(".banner")).to have_content "Debate banner"
expect(page).not_to have_content "Proposal banner"
end
context "several banners available in the same section" do
before do
create(:banner,
web_sections: [WebSection.find_by!(name: "debates")],
title: "First banner",
description: "First description",
target_url: "/first_target")
create(:banner,
web_sections: [WebSection.find_by!(name: "debates")],
title: "Second banner",
description: "Second description",
target_url: "/second_target")
end
it "only renders one banner" do
render_inline Shared::BannerComponent.new("debates")
expect(page).to have_css ".banner", count: 1
end
it "consistently renders one banner" do
render_inline Shared::BannerComponent.new("debates")
if page.has_content?("First banner")
expect(page).to have_content "First description"
expect(page).to have_css "[href='/first_target']"
expect(page).not_to have_content "Second banner"
else
expect(page).to have_content "Second description"
expect(page).to have_css "[href='/second_target']"
end
end
it "only renders active banners" do
Banner.first.update!(post_ended_at: Date.current - 1.day)
render_inline Shared::BannerComponent.new("debates")
expect(page).to have_content "Second banner"
expect(page).not_to have_content "First banner"
end
it "does not render anything with no active banners" do
Banner.find_each { |banner| banner.update!(post_ended_at: Date.current - 1.day) }
render_inline Shared::BannerComponent.new("debates")
expect(page).not_to be_rendered
end
end
it "does not render anything given nil" do
render_inline Shared::BannerComponent.new(nil)
expect(page).not_to be_rendered
end
end