Move list of investments tests to component tests

In general, slow system tests requiring no interaction from the user are
good candidates to be moved to component tests because component tests
are much faster.

In this case, the system tests were also updating the database after
starting the browser, which might cause concurrency issues. We could
split the test and have one system test per phase, but IMHO there's no
need.

We're still having a couple of system tests for the happy path, in order
to make sure users actually see the list of investments.
This commit is contained in:
Javi Martín
2021-08-07 20:05:21 +02:00
parent 9328c72aaa
commit f92796c7fa
2 changed files with 98 additions and 80 deletions

View File

@@ -1,10 +1,15 @@
require "rails_helper"
describe Budgets::InvestmentsListComponent, type: :component do
include Rails.application.routes.url_helpers
let(:budget) { create(:budget, :accepting) }
let(:group) { create(:budget_group, budget: budget) }
let(:heading) { create(:budget_heading, group: group) }
before { allow(controller).to receive(:current_user).and_return(nil) }
describe "#investments" do
let(:budget) { create(:budget, :accepting) }
let(:group) { create(:budget_group, budget: budget) }
let(:heading) { create(:budget_heading, group: group) }
let(:component) { Budgets::InvestmentsListComponent.new(budget) }
let!(:normal_investments) { create_list(:budget_investment, 4, heading: heading) }
@@ -60,4 +65,89 @@ describe Budgets::InvestmentsListComponent, type: :component do
end
end
end
describe "investment list" do
before { create_list(:budget_investment, 3, :selected, heading: heading, price: 999) }
it "is not shown in the informing or finished phases" do
%w[informing finished].each do |phase_name|
budget.phase = phase_name
render_inline Budgets::InvestmentsListComponent.new(budget)
expect(page).not_to have_content "List of investments"
expect(page).not_to have_css ".investments-list"
expect(page).not_to have_css ".budget-investment"
end
end
it "is shown without supports nor prices in the accepting phases" do
%w[accepting reviewing selecting].each do |phase_name|
budget.phase = phase_name
render_inline Budgets::InvestmentsListComponent.new(budget)
expect(page).to have_content "List of investments"
expect(page).not_to have_content "Supports"
expect(page).not_to have_content "Price"
end
end
it "is shown with supports in the valuating phase" do
budget.phase = "valuating"
render_inline Budgets::InvestmentsListComponent.new(budget)
expect(page).to have_content "List of investments"
expect(page).to have_content "Supports", count: 3
expect(page).not_to have_content "Price"
end
it "is shown with prices in the balloting phases" do
%w[publishing_prices balloting reviewing_ballots].each do |phase_name|
budget.phase = phase_name
render_inline Budgets::InvestmentsListComponent.new(budget)
expect(page).to have_content "List of investments"
expect(page).to have_content "Price", count: 3
expect(page).not_to have_content "Supports"
end
end
it "is not rendered for budgets with multiple headings" do
create(:budget_heading, budget: budget)
Budget::Phase::PHASE_KINDS.each do |phase_name|
budget.phase = phase_name
render_inline Budgets::InvestmentsListComponent.new(budget)
expect(page.native.inner_html).to be_empty
end
end
end
describe "link to see all investments" do
before { create_list(:budget_investment, 3, :selected, heading: heading, price: 999) }
it "is not shown in the informing phase" do
budget.phase = "informing"
render_inline Budgets::InvestmentsListComponent.new(budget)
expect(page).not_to have_link "See all investments"
end
it "is shown in all other phases" do
(Budget::Phase::PHASE_KINDS - ["informing"]).each do |phase_name|
budget.phase = phase_name
render_inline Budgets::InvestmentsListComponent.new(budget)
expect(page).to have_link "See all investments",
href: budget_investments_path(budget)
end
end
end
end

View File

@@ -301,107 +301,35 @@ describe "Budgets" do
expect(page).to have_link "See results"
end
scenario "Show link to see all investments" do
budget = create(:budget)
group = create(:budget_group, budget: budget)
heading = create(:budget_heading, group: group)
create_list(:budget_investment, 3, :selected, heading: heading, price: 999)
budget.update!(phase: "informing")
visit budget_path(budget)
expect(page).not_to have_link "See all investments"
(Budget::Phase::PHASE_KINDS - ["informing"]).each do |phase_name|
budget.update!(phase: phase_name)
visit budget_path(budget)
expect(page).to have_link "See all investments",
href: budget_investments_path(budget)
end
end
scenario "Show investments list" do
budget = create(:budget)
budget = create(:budget, phase: "balloting")
group = create(:budget_group, budget: budget)
heading = create(:budget_heading, group: group)
create_list(:budget_investment, 3, :selected, heading: heading, price: 999)
%w[informing finished].each do |phase_name|
budget.update!(phase: phase_name)
visit budget_path(budget)
expect(page).not_to have_content "List of investments"
expect(page).not_to have_css ".investments-list"
expect(page).not_to have_css ".budget-investment"
end
%w[accepting reviewing selecting].each do |phase_name|
budget.update!(phase: phase_name)
visit budget_path(budget)
within(".investments-list") do
expect(page).to have_content "List of investments"
expect(page).not_to have_content "SUPPORTS"
expect(page).not_to have_content "PRICE"
end
end
budget.update!(phase: "valuating")
visit budget_path(budget)
within(".investments-list") do
expect(page).to have_content "List of investments"
expect(page).to have_content("SUPPORTS", count: 3)
expect(page).not_to have_content "PRICE"
expect(page).to have_content "PRICE", count: 3
end
%w[publishing_prices balloting reviewing_ballots].each do |phase_name|
budget.update!(phase: phase_name)
visit budget_path(budget)
within(".investments-list") do
expect(page).to have_content "List of investments"
expect(page).to have_content("PRICE", count: 3)
end
end
expect(page).to have_link "See all investments",
href: budget_investments_path(budget)
end
scenario "Do not show investments list when budget has multiple headings" do
budget = create(:budget)
budget = create(:budget, phase: "accepting")
group = create(:budget_group, budget: budget)
heading_1 = create(:budget_heading, group: group)
create(:budget_heading, group: group)
create_list(:budget_investment, 3, :selected, heading: heading_1, price: 999)
%w[accepting reviewing selecting].each do |phase_name|
budget.update!(phase: phase_name)
visit budget_path(budget)
expect(page).not_to have_css ".investments-list"
end
budget.update!(phase: "valuating")
visit budget_path(budget)
expect(page).not_to have_css ".investments-list"
%w[publishing_prices balloting reviewing_ballots].each do |phase_name|
budget.update!(phase: phase_name)
visit budget_path(budget)
expect(page).not_to have_css ".investments-list"
end
end
scenario "Show supports info on selecting phase" do