Files
grecia/spec/components/budgets/budget_component_spec.rb
Javi Martín 57fcdc402d Use page.find instead of within in component tests
In component tests, the `within` method is actually an alias to RSpec's
`be_within` matcher, which is used to test numeric ranges. That meant
the tests always passed, even when there were bugs on the page.

In order to use `within` in component tests, we have to use
`page.within`. However, that also fails, since there's no such method
for `Capybara::Node::Simple'` objects, which are used in component
tests.

So we're using `page.find` instead.

See also pull request 945 in https://github.com/github/view_component
2021-10-18 13:51:32 +02:00

130 lines
4.6 KiB
Ruby

require "rails_helper"
describe Budgets::BudgetComponent do
let(:budget) { create(:budget) }
let(:heading) { create(:budget_heading, budget: budget) }
let(:user) { create(:user) }
before { sign_in(user) }
describe "budget header" do
it "shows budget name and link to help" do
budget.update!(phase: "informing")
render_inline Budgets::BudgetComponent.new(budget)
page.find(".budget-header") do |header|
expect(header).to have_content "Participatory budgets"
expect(header).to have_content budget.name
expect(header).to have_link "Help with participatory budgets"
end
end
it "shows budget main link when defined" do
render_inline Budgets::BudgetComponent.new(budget)
within(".budget-header") do
expect(page).not_to have_css("a.main-link")
end
budget.update!(main_link_text: "Partitipate now!", main_link_url: "https://consulproject.org")
render_inline Budgets::BudgetComponent.new(budget)
within(".budget-header") do
expect(page).to have_css("a.main-link", text: "Participate now!", href: "https://consulproject.org")
end
end
end
describe "map" do
before do
Setting["feature.map"] = true
end
it "displays investment's map location markers" do
investment1 = create(:budget_investment, heading: heading)
investment2 = create(:budget_investment, heading: heading)
investment3 = create(:budget_investment, heading: heading)
create(:map_location, longitude: 40.1234, latitude: -3.634, investment: investment1)
create(:map_location, longitude: 40.1235, latitude: -3.635, investment: investment2)
create(:map_location, longitude: 40.1236, latitude: -3.636, investment: investment3)
render_inline Budgets::BudgetComponent.new(budget)
within ".map_location" do
expect(page).to have_css(".map-icon", count: 3)
end
end
it "displays all investment's map location if there are no selected" do
budget.update!(phase: :publishing_prices)
investment1 = create(:budget_investment, heading: heading)
investment2 = create(:budget_investment, heading: heading)
investment3 = create(:budget_investment, heading: heading)
investment4 = create(:budget_investment, heading: heading)
investment1.create_map_location(longitude: 40.1234, latitude: 3.1234, zoom: 10)
investment2.create_map_location(longitude: 40.1235, latitude: 3.1235, zoom: 10)
investment3.create_map_location(longitude: 40.1236, latitude: 3.1236, zoom: 10)
investment4.create_map_location(longitude: 40.1240, latitude: 3.1240, zoom: 10)
render_inline Budgets::BudgetComponent.new(budget)
within ".map_location" do
expect(page).to have_css(".map-icon", count: 4)
end
end
it "displays only selected investment's map location from publishing prices phase" do
budget.update!(phase: :publishing_prices)
investment1 = create(:budget_investment, :selected, heading: heading)
investment2 = create(:budget_investment, :selected, heading: heading)
investment3 = create(:budget_investment, heading: heading)
investment4 = create(:budget_investment, heading: heading)
investment1.create_map_location(longitude: 40.1234, latitude: 3.1234, zoom: 10)
investment2.create_map_location(longitude: 40.1235, latitude: 3.1235, zoom: 10)
investment3.create_map_location(longitude: 40.1236, latitude: 3.1236, zoom: 10)
investment4.create_map_location(longitude: 40.1240, latitude: 3.1240, zoom: 10)
render_inline Budgets::BudgetComponent.new(budget)
within ".map_location" do
expect(page).to have_css(".map-icon", count: 2)
end
end
scenario "skips invalid map markers" do
map_locations = []
investment = create(:budget_investment, heading: heading)
map_locations << { longitude: 40.123456789, latitude: 3.12345678 }
map_locations << { longitude: 40.123456789, latitude: "********" }
map_locations << { longitude: "**********", latitude: 3.12345678 }
coordinates = map_locations.map do |map_location|
{
lat: map_location[:latitude],
long: map_location[:longitude],
investment_title: investment.title,
investment_id: investment.id,
budget_id: budget.id
}
end
allow_any_instance_of(Budgets::BudgetComponent).to receive(:coordinates).and_return(coordinates)
render_inline Budgets::BudgetComponent.new(budget)
within ".map_location" do
expect(page).to have_css(".map-icon", count: 1)
end
end
end
end