Files
grecia/spec/system/admin/budget_investments_spec.rb
Javi Martín ffc14e499a Upgrade to Rails 6.0
All the code in the `bin/` and the `config/` folders has been generated
running `rake app:update`. The only exception is the code in
`config/application.rb` where we've excluded the engines that Rails 6.0
has added, since we don't use them.

There are a few changes in Active Storage which aren't compatible with
the code we were using until now.

Since the method to assign an attachment in ActiveStorage has changed
and is incompatible with the hack we used to allow assigning `nil`
attachments, and since ActiveStorage now supports assigning `nil`
attachments, we're removing the mentioned hack. This makes the
HasAttachment module redundant, so we're removing it.

Another change in ActiveStorage is files are no longer saved before
saving the `ActiveStorage::Attachment` record. This means we need to
manually upload the file when using direct uploads. We also have to
change the width and height validations we used for images; however,
doing so results in very complex code, and we currently have to write
that code for both images and site customization images.

So, for now, we're just uploading the file before checking its
dimensions. Not ideal, though. We might use active_storage_validations
in the future to fix this issue (when they support a proc/lambda, as
mentioned in commit 600f5c35e).

We also need to update a couple of tests due to a small change in
response headers. Now the content disposition returns something like:

```
attachment; filename="budget_investments.csv"; filename*=UTF-8''budget_investments.csv
```

So we're updating regular expression we use to check the filename.

Finally, Rails 6.0.1 changed the way the host is set in integration
tests [1] and so both `Capybara.app_host` and `Capybara.default_host`
were ignored when generating URLs in the relationable examples. The only
way I've found to make it work is to explicitely assign the host to the
integration session. Rails 6.1 will change this setup again, so maybe
then we can remove this hack.

[1] https://github.com/rails/rails/pull/36283/commits/fe00711e9
2022-08-24 14:33:02 +02:00

1891 lines
72 KiB
Ruby

require "rails_helper"
describe "Admin budget investments", :admin do
let(:budget) { create(:budget) }
let(:administrator) do
create(:administrator, user: create(:user, username: "Ana", email: "ana@admins.org"))
end
it_behaves_like "admin_milestoneable", :budget_investment, "admin_polymorphic_path"
context "Load" do
let!(:investment) { create(:budget_investment, budget: budget) }
before { budget.update(slug: "budget_slug") }
scenario "finds investments using budget slug" do
visit admin_budget_budget_investments_path("budget_slug")
expect(page).to have_link investment.title
end
end
context "Index" do
scenario "Displaying investments" do
budget_investment = create(:budget_investment, budget: budget, cached_votes_up: 77)
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_content(budget_investment.title)
expect(page).to have_content(budget_investment.heading.name)
expect(page).to have_content(budget_investment.id)
expect(page).to have_content(budget_investment.total_votes)
end
scenario "Do not show price column on budgets with hide money" do
budget_hide_money = create(:budget, :hide_money)
budget_investment = create(:budget_investment, budget: budget_hide_money)
visit admin_budget_budget_investments_path(budget_hide_money)
expect(page).to have_content(budget_investment.title)
expect(page).to have_content(budget_investment.heading.name)
expect(page).to have_content(budget_investment.id)
expect(page).not_to have_content("Price")
expect(page).not_to have_content("")
end
scenario "If budget is finished do not show 'Selected' button" do
finished_budget = create(:budget, :finished)
budget_investment = create(:budget_investment, budget: finished_budget, cached_votes_up: 77)
visit admin_budget_budget_investments_path(budget_id: finished_budget.id)
within("#budget_investment_#{budget_investment.id}") do
expect(page).to have_content(budget_investment.title)
expect(page).to have_content(budget_investment.heading.name)
expect(page).to have_content(budget_investment.id)
expect(page).to have_content(budget_investment.total_votes)
expect(page).not_to have_link("Selected")
end
end
scenario "Display admin and valuator assignments" do
olga = create(:user, username: "Olga")
miriam = create(:user, username: "Miriam")
valuator1 = create(:valuator, user: olga, description: "Valuator Olga")
valuator2 = create(:valuator, user: miriam, description: "Valuator Miriam")
valuator_group = create(:valuator_group, name: "Health")
admin = create(:administrator, user: create(:user, username: "Gema"))
budget_investment1 = create(:budget_investment, budget: budget, valuators: [valuator1])
budget_investment2 = create(:budget_investment, budget: budget, valuators: [valuator1, valuator2],
valuator_groups: [valuator_group])
budget_investment3 = create(:budget_investment, budget: budget)
visit admin_budget_budget_investments_path(budget_id: budget.id)
within("#budget_investment_#{budget_investment1.id}") do
expect(page).to have_content("No admin assigned")
expect(page).to have_content("Valuator Olga")
end
within("#budget_investment_#{budget_investment2.id}") do
expect(page).to have_content("No admin assigned")
expect(page).to have_content("Valuator Olga")
expect(page).to have_content("Valuator Miriam")
expect(page).to have_content("Health")
end
budget_investment3.update!(administrator_id: admin.id)
visit admin_budget_budget_investments_path(budget_id: budget.id)
within("#budget_investment_#{budget_investment3.id}") do
expect(page).to have_content("Gema")
expect(page).to have_content("No valuators assigned")
end
end
scenario "Filtering by budget heading" do
group1 = create(:budget_group, name: "Streets", budget: budget)
group2 = create(:budget_group, name: "Parks", budget: budget)
group1_heading1 = create(:budget_heading, group: group1, name: "Main Avenue")
group1_heading2 = create(:budget_heading, group: group1, name: "Mercy Street")
group2_heading1 = create(:budget_heading, group: group2, name: "Central Park")
create(:budget_investment, title: "Realocate visitors", heading: group1_heading1)
create(:budget_investment, title: "Change name", heading: group1_heading2)
create(:budget_investment, title: "Plant trees", heading: group2_heading1)
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_link("Realocate visitors")
expect(page).to have_link("Change name")
expect(page).to have_link("Plant trees")
select "Parks: Central Park", from: "heading_id"
click_button "Filter"
expect(page).not_to have_link("Realocate visitors")
expect(page).not_to have_link("Change name")
expect(page).to have_link("Plant trees")
select "All headings", from: "heading_id"
click_button "Filter"
expect(page).to have_link("Realocate visitors")
expect(page).to have_link("Change name")
expect(page).to have_link("Plant trees")
select "Streets: Main Avenue", from: "heading_id"
click_button "Filter"
expect(page).to have_link("Realocate visitors")
expect(page).not_to have_link("Change name")
expect(page).not_to have_link("Plant trees")
select "Streets: Mercy Street", from: "heading_id"
click_button "Filter"
expect(page).not_to have_link("Realocate visitors")
expect(page).to have_link("Change name")
expect(page).not_to have_link("Plant trees")
end
scenario "Filtering by admin" do
user = create(:user, username: "Admin 1")
user2 = create(:user, username: "Admin 2")
administrator = create(:administrator, user: user)
administrator2 = create(:administrator, user: user2, description: "Alias")
budget.administrators = [administrator, administrator2]
create(:budget_investment, title: "Realocate visitors", budget: budget,
administrator: administrator)
create(:budget_investment, title: "Destroy the city", budget: budget)
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_link("Realocate visitors")
expect(page).to have_link("Destroy the city")
select "Admin 1", from: "administrator_id"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).not_to have_link("Destroy the city")
expect(page).to have_link("Realocate visitors")
select "Alias", from: "administrator_id"
click_button "Filter"
expect(page).to have_content("There are no investment projects")
expect(page).not_to have_link("Destroy the city")
expect(page).not_to have_link("Realocate visitors")
select "All administrators", from: "administrator_id"
click_button "Filter"
expect(page).to have_content("There are 2 investments")
expect(page).to have_link("Destroy the city")
expect(page).to have_link("Realocate visitors")
select "Admin 1", from: "administrator_id"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).not_to have_link("Destroy the city")
expect(page).to have_link("Realocate visitors")
end
scenario "Filtering by valuator" do
user = create(:user)
valuator = create(:valuator, user: user, description: "Valuator 1")
budget.valuators = [valuator]
create(:budget_investment, title: "Realocate visitors", budget: budget, valuators: [valuator])
create(:budget_investment, title: "Destroy the city", budget: budget)
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_link("Realocate visitors")
expect(page).to have_link("Destroy the city")
select "Valuator 1", from: "valuator_or_group_id"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).not_to have_link("Destroy the city")
expect(page).to have_link("Realocate visitors")
select "All valuators", from: "valuator_or_group_id"
click_button "Filter"
expect(page).to have_content("There are 2 investments")
expect(page).to have_link("Destroy the city")
expect(page).to have_link("Realocate visitors")
select "Valuator 1", from: "valuator_or_group_id"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).not_to have_link("Destroy the city")
expect(page).to have_link("Realocate visitors")
end
scenario "Filtering by valuator group" do
health_group = create(:valuator_group, name: "Health")
culture_group = create(:valuator_group, name: "Culture")
create(:budget_investment, title: "Build a hospital", budget: budget, valuator_groups: [health_group])
create(:budget_investment, title: "Build a theatre", budget: budget, valuator_groups: [culture_group])
visit admin_budget_budget_investments_path(budget_id: budget)
expect(page).to have_link("Build a hospital")
expect(page).to have_link("Build a theatre")
select "Health", from: "valuator_or_group_id"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).to have_link("Build a hospital")
expect(page).not_to have_link("Build a theatre")
select "All valuators", from: "valuator_or_group_id"
click_button "Filter"
expect(page).to have_content("There are 2 investments")
expect(page).to have_link("Build a hospital")
expect(page).to have_link("Build a theatre")
select "Culture", from: "valuator_or_group_id"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).to have_link("Build a theatre")
expect(page).not_to have_link("Build a hospital")
end
scenario "Filtering by without assigned admin" do
create(:budget_investment, title: "Investment without admin", budget: budget)
create(:budget_investment, :with_administrator, title: "Investment with admin", budget: budget)
visit admin_budget_budget_investments_path(budget_id: budget)
expect(page).to have_link("Investment without admin")
expect(page).to have_link("Investment with admin")
click_link "Advanced filters"
check("Without assigned admin")
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).to have_link("Investment without admin")
expect(page).not_to have_link("Investment with admin")
uncheck("Without assigned admin")
click_button "Filter"
expect(page).to have_content("There are 2 investments")
expect(page).to have_link("Investment without admin")
expect(page).to have_link("Investment with admin")
end
scenario "Filtering by without assigned valuator" do
create(:budget_investment, title: "Investment without valuator", budget: budget)
create(:budget_investment, :with_valuator, title: "Investment with valuator", budget: budget)
visit admin_budget_budget_investments_path(budget_id: budget)
expect(page).to have_link("Investment without valuator")
expect(page).to have_link("Investment with valuator")
click_link "Advanced filters"
check "Without assigned valuator"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).to have_link("Investment without valuator")
expect(page).not_to have_link("Investment with valuator")
uncheck "Without assigned valuator"
click_button "Filter"
expect(page).to have_content("There are 2 investments")
expect(page).to have_link("Investment without valuator")
expect(page).to have_link("Investment with valuator")
end
scenario "Filtering by under valuation" do
create(:budget_investment,
:with_administrator,
:with_valuator,
:open,
title: "Investment without valuation",
budget: budget)
create(:budget_investment,
:with_administrator,
title: "Investment with valuation",
budget: budget)
visit admin_budget_budget_investments_path(budget_id: budget)
expect(page).to have_link("Investment without valuation")
expect(page).to have_link("Investment with valuation")
click_link "Advanced filters"
check "Under valuation"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).to have_link("Investment without valuation")
expect(page).not_to have_link("Investment with valuation")
uncheck "Under valuation"
click_button "Filter"
expect(page).to have_content("There are 2 investments")
expect(page).to have_link("Investment without valuation")
expect(page).to have_link("Investment with valuation")
end
scenario "Filtering by valuation finished" do
create(:budget_investment, title: "Investment valuation open", budget: budget)
create(:budget_investment, :finished, title: "Investment valuation finished", budget: budget)
visit admin_budget_budget_investments_path(budget_id: budget)
expect(page).to have_link("Investment valuation open")
expect(page).to have_link("Investment valuation finished")
click_link "Advanced filters"
check "Valuation finished"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).not_to have_link("Investment valuation open")
expect(page).to have_link("Investment valuation finished")
uncheck "Valuation finished"
click_button "Filter"
expect(page).to have_content("There are 2 investments")
expect(page).to have_link("Investment valuation open")
expect(page).to have_link("Investment valuation finished")
end
scenario "Filtering by winners" do
create(:budget_investment, :winner, :finished, title: "Investment winner", budget: budget)
create(:budget_investment, title: "Investment without winner", budget: budget)
visit admin_budget_budget_investments_path(budget_id: budget)
expect(page).to have_link("Investment winner")
expect(page).to have_link("Investment without winner")
click_link "Advanced filters"
check "Winners"
click_button "Filter"
expect(page).to have_content("There is 1 investment")
expect(page).to have_link("Investment winner")
expect(page).not_to have_link("Investment without winner")
uncheck "Winners"
click_button "Filter"
expect(page).to have_content("There are 2 investments")
expect(page).to have_link("Investment winner")
expect(page).to have_link("Investment without winner")
end
scenario "Current filter is properly highlighted" do
filters_links = { "all" => "All" }
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).not_to have_link(filters_links.values.first)
filters_links.keys.drop(1).each { |filter| expect(page).to have_link(filters_links[filter]) }
filters_links.each_pair do |current_filter, link|
visit admin_budget_budget_investments_path(budget_id: budget.id, filter: current_filter)
expect(page).not_to have_link(link)
(filters_links.keys - [current_filter]).each do |filter|
expect(page).to have_link(filters_links[filter])
end
end
end
scenario "Filtering by assignment status" do
create(:budget_investment, :with_administrator, title: "Assigned idea", budget: budget)
create(:budget_investment, :with_valuator, title: "Evaluating...", budget: budget)
create(:budget_investment, title: "With group", budget: budget,
valuator_groups: [create(:valuator_group)])
visit admin_budget_budget_investments_path(budget_id: budget.id, filter: "valuation_open")
expect(page).to have_content("Assigned idea")
expect(page).to have_content("Evaluating...")
expect(page).to have_content("With group")
visit admin_budget_budget_investments_path(budget_id: budget.id,
advanced_filters: ["without_admin"])
expect(page).to have_content("Evaluating...")
expect(page).to have_content("With group")
expect(page).not_to have_content("Assigned idea")
visit admin_budget_budget_investments_path(budget_id: budget.id,
advanced_filters: ["without_valuator"])
expect(page).to have_content("Assigned idea")
expect(page).not_to have_content("Evaluating...")
expect(page).not_to have_content("With group")
end
scenario "Filtering by valuation status" do
valuating = create(:budget_investment, :with_administrator, budget: budget, title: "Ongoing valuation")
valuated = create(:budget_investment, :finished, budget: budget, title: "Old idea")
valuating.valuators.push(create(:valuator))
valuated.valuators.push(create(:valuator))
query_params = { budget_id: budget.id, advanced_filters: ["under_valuation"] }
visit admin_budget_budget_investments_path(query_params)
expect(page).to have_content("Ongoing valuation")
expect(page).not_to have_content("Old idea")
visit admin_budget_budget_investments_path(budget_id: budget.id,
advanced_filters: ["valuation_finished"])
expect(page).not_to have_content("Ongoing valuation")
expect(page).to have_content("Old idea")
visit admin_budget_budget_investments_path(budget_id: budget.id, advanced_filters: ["filter"])
expect(page).to have_content("Ongoing valuation")
expect(page).to have_content("Old idea")
end
scenario "Filtering by tag" do
create(:budget_investment, budget: budget, title: "Educate children", tag_list: "Education")
create(:budget_investment, budget: budget, title: "More schools", tag_list: "Education")
create(:budget_investment, budget: budget, title: "More hospitals", tag_list: "Health")
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_css(".budget_investment", count: 3)
expect(page).to have_content("Educate children")
expect(page).to have_content("More schools")
expect(page).to have_content("More hospitals")
visit admin_budget_budget_investments_path(budget_id: budget.id, tag_name: "Education")
expect(page).not_to have_content("More hospitals")
expect(page).to have_css(".budget_investment", count: 2)
expect(page).to have_content("Educate children")
expect(page).to have_content("More schools")
end
scenario "Filtering by tag, display only valuation tags" do
investment1 = create(:budget_investment, budget: budget, tag_list: "Education")
investment2 = create(:budget_investment, budget: budget, tag_list: "Health")
investment1.set_tag_list_on(:valuation_tags, "Teachers")
investment2.set_tag_list_on(:valuation_tags, "Hospitals")
investment1.save!
investment2.save!
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_select("tag_name", options: ["All tags", "Hospitals", "Teachers"])
end
scenario "Filtering by tag, display only valuation tags of the current budget" do
new_budget = create(:budget)
investment1 = create(:budget_investment, budget: budget, tag_list: "Roads")
investment2 = create(:budget_investment, budget: new_budget, tag_list: "Accessibility")
investment1.set_tag_list_on(:valuation_tags, "Roads")
investment2.set_tag_list_on(:valuation_tags, "Accessibility")
investment1.save!
investment2.save!
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_select("tag_name", options: ["All tags", "Roads"])
expect(page).not_to have_select("tag_name", options: ["All tags", "Accessibility"])
end
scenario "Disable 'Calculate winner' button if incorrect phase" do
budget.update!(phase: "reviewing_ballots")
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
check "Winners"
click_button "Filter"
expect(page).to have_button "Calculate Winner Investments"
visit admin_budget_path(budget)
expect(page).to have_button "Calculate Winner Investments"
click_link "Edit budget"
select "Accepting projects", from: "Active phase"
click_button "Update Budget"
expect(page).to have_content "Participatory budget updated successfully"
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
check "Winners"
click_button "Filter"
expect(page).not_to have_button "Calculate Winner Investments"
expect(page).to have_content 'The budget has to stay on phase "Reviewing voting" '\
"in order to calculate winners projects"
visit admin_budget_path(budget)
expect(page).not_to have_button "Calculate Winner Investments"
end
scenario "Filtering by minimum number of votes" do
group_1 = create(:budget_group, budget: budget)
group_2 = create(:budget_group, budget: budget)
parks = create(:budget_heading, group: group_1)
roads = create(:budget_heading, group: group_2)
streets = create(:budget_heading, group: group_2)
create(:budget_investment, heading: parks, cached_votes_up: 40, title: "Park 40 supports")
create(:budget_investment, heading: parks, cached_votes_up: 99, title: "Park 99 supports")
create(:budget_investment, heading: roads, cached_votes_up: 100, title: "Road 100 supports")
create(:budget_investment, heading: roads, cached_votes_up: 199, title: "Road 199 supports")
create(:budget_investment, heading: streets, cached_votes_up: 200, title: "St. 200 supports")
create(:budget_investment, heading: streets, cached_votes_up: 300, title: "St. 300 supports")
visit admin_budget_budget_investments_path(budget)
expect(page).to have_link("Park 40 supports")
expect(page).to have_link("Park 99 supports")
expect(page).to have_link("Road 100 supports")
expect(page).to have_link("Road 199 supports")
expect(page).to have_link("St. 200 supports")
expect(page).to have_link("St. 300 supports")
click_link "Advanced filters"
fill_in "min_total_supports", with: 180
click_button "Filter"
expect(page).to have_content("There are 3 investments")
expect(page).to have_link("Road 199 supports")
expect(page).to have_link("St. 200 supports")
expect(page).to have_link("St. 300 supports")
expect(page).not_to have_link("Park 40 supports")
expect(page).not_to have_link("Park 99 supports")
expect(page).not_to have_link("Road 100 supports")
end
scenario "Filtering by maximum number of votes" do
group_1 = create(:budget_group, budget: budget)
group_2 = create(:budget_group, budget: budget)
parks = create(:budget_heading, group: group_1)
roads = create(:budget_heading, group: group_2)
streets = create(:budget_heading, group: group_2)
create(:budget_investment, heading: parks, cached_votes_up: 40, title: "Park 40 supports")
create(:budget_investment, heading: parks, cached_votes_up: 99, title: "Park 99 supports")
create(:budget_investment, heading: roads, cached_votes_up: 100, title: "Road 100 supports")
create(:budget_investment, heading: roads, cached_votes_up: 199, title: "Road 199 supports")
create(:budget_investment, heading: streets, cached_votes_up: 200, title: "St. 200 supports")
create(:budget_investment, heading: streets, cached_votes_up: 300, title: "St. 300 supports")
visit admin_budget_budget_investments_path(budget)
expect(page).to have_link("Park 40 supports")
expect(page).to have_link("Park 99 supports")
expect(page).to have_link("Road 100 supports")
expect(page).to have_link("Road 199 supports")
expect(page).to have_link("St. 200 supports")
expect(page).to have_link("St. 300 supports")
click_link "Advanced filters"
fill_in "max_total_supports", with: 180
click_button "Filter"
expect(page).to have_content("There are 3 investments")
expect(page).not_to have_link("Road 199 supports")
expect(page).not_to have_link("St. 200 supports")
expect(page).not_to have_link("St. 300 supports")
expect(page).to have_link("Park 40 supports")
expect(page).to have_link("Park 99 supports")
expect(page).to have_link("Road 100 supports")
end
scenario "Combination of checkbox with text search" do
user = create(:user, username: "Admin 1")
administrator = create(:administrator, user: user)
budget.administrators = [administrator]
educate_children = create(:budget_investment, budget: budget, title: "Educate the children",
administrator: administrator)
create(:budget_investment, budget: budget, title: "More schools",
administrator: administrator)
create(:budget_investment, budget: budget, title: "More hospitals")
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_css(".budget_investment", count: 3)
expect(page).to have_content("Educate the children")
expect(page).to have_content("More schools")
expect(page).to have_content("More hospitals")
select "Admin 1", from: "administrator_id"
click_button "Filter"
expect(page).to have_css(".budget_investment", count: 2)
expect(page).to have_content("Educate the children")
expect(page).to have_content("More schools")
expect(page).not_to have_content("More hospitals")
fill_in "title_or_id", with: educate_children.id
click_button "Filter"
expect(page).to have_css(".budget_investment", count: 1)
expect(page).to have_content("Educate the children")
expect(page).not_to have_content("More schools")
expect(page).not_to have_content("More hospitals")
expect(page).to have_content("Selected")
end
scenario "Combination of select with text search" do
educate_children = create(:budget_investment, :feasible, :finished,
budget: budget, title: "Educate the children")
create(:budget_investment, :feasible, :finished, budget: budget, title: "More schools")
create(:budget_investment, budget: budget, title: "More hospitals")
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_css(".budget_investment", count: 3)
expect(page).to have_content("Educate the children")
expect(page).to have_content("More schools")
expect(page).to have_content("More hospitals")
click_link "Advanced filters"
check("Feasible")
click_button "Filter"
expect(page).to have_css(".budget_investment", count: 2)
expect(page).to have_content("Educate the children")
expect(page).to have_content("More schools")
expect(page).not_to have_content("More hospitals")
fill_in "title_or_id", with: educate_children.id
click_button "Filter"
expect(page).to have_css(".budget_investment", count: 1)
expect(page).to have_content("Educate the children")
expect(page).not_to have_content("More schools")
expect(page).not_to have_content("More hospitals")
expect(page).to have_content("Selected")
end
scenario "Combination of checkbox with text search and checkbox" do
user = create(:user, username: "Admin 1")
administrator = create(:administrator, user: user)
budget.administrators = [administrator]
educate_children = create(:budget_investment, :feasible, :finished,
budget: budget, title: "Educate the children", administrator: administrator)
create(:budget_investment, :feasible, :finished, budget: budget, title: "More schools",
administrator: administrator)
create(:budget_investment, budget: budget, title: "More hospitals",
administrator: administrator)
create(:budget_investment, budget: budget, title: "More hostals")
visit admin_budget_budget_investments_path(budget_id: budget.id)
expect(page).to have_css(".budget_investment", count: 4)
expect(page).to have_content("Educate the children")
expect(page).to have_content("More schools")
expect(page).to have_content("More hospitals")
expect(page).to have_content("More hostals")
select "Admin 1", from: "administrator_id"
click_button "Filter"
expect(page).to have_css(".budget_investment", count: 3)
expect(page).to have_content("Educate the children")
expect(page).to have_content("More schools")
expect(page).to have_content("More hospitals")
expect(page).not_to have_content("More hostals")
click_link "Advanced filters"
within("#advanced_filters") { check("Feasible") }
click_button("Filter")
expect(page).to have_css(".budget_investment", count: 2)
expect(page).to have_content("Educate the children")
expect(page).to have_content("More schools")
expect(page).not_to have_content("More hospitals")
expect(page).not_to have_content("More hostals")
fill_in "title_or_id", with: educate_children.id
click_button "Filter"
expect(page).to have_css(".budget_investment", count: 1)
expect(page).to have_content("Educate the children")
expect(page).not_to have_content("More schools")
expect(page).not_to have_content("More hospitals")
expect(page).not_to have_content("More hostals")
expect(page).to have_content("Selected")
end
scenario "See results button appears when budget status is finished" do
finished_budget = create(:budget, :finished)
create(:budget_investment, :winner, budget: finished_budget, title: "Winner project")
visit admin_budget_budget_investments_path(budget_id: finished_budget.id)
expect(page).to have_content "See results"
end
scenario "See results button does not appear for unfinished budgets" do
not_finished_budget = create(:budget, :valuating)
visit admin_budget_budget_investments_path(budget_id: not_finished_budget.id)
expect(page).not_to have_content "See results"
end
end
context "Search" do
let!(:first_investment) do
create(:budget_investment, title: "Some other investment", budget: budget)
end
before do
I18n.with_locale(:es) do
create(:budget_investment, title: "Proyecto de inversión", budget: budget)
end
end
scenario "Search investments by title" do
visit admin_budget_budget_investments_path(budget)
expect(page).to have_content("Proyecto de inversión")
expect(page).to have_content("Some other investment")
fill_in "title_or_id", with: "Proyecto de inversión"
click_button "Filter"
expect(page).to have_content("Proyecto de inversión")
expect(page).not_to have_content("Some other investment")
fill_in "title_or_id", with: "Some other investment"
click_button "Filter"
expect(page).not_to have_content("Proyecto de inversión")
expect(page).to have_content("Some other investment")
end
scenario "Search investments by ID" do
visit admin_budget_budget_investments_path(budget)
expect(page).to have_content("Proyecto de inversión")
expect(page).to have_content("Some other investment")
fill_in "title_or_id", with: first_investment.id
click_button "Filter"
expect(page).to have_content("Some other investment")
expect(page).not_to have_content("Proyecto de inversión")
end
end
context "Sorting" do
before do
create(:budget_investment, title: "B First Investment", budget: budget, cached_votes_up: 50)
create(:budget_investment, title: "A Second Investment", budget: budget, cached_votes_up: 25)
create(:budget_investment, title: "C Third Investment", budget: budget, cached_votes_up: 10)
end
scenario "Default" do
create(:budget_investment, title: "D Fourth Investment", cached_votes_up: 50, budget: budget)
visit admin_budget_budget_investments_path(budget)
expect("D Fourth Investment").to appear_before("B First Investment")
expect("B First Investment").to appear_before("A Second Investment")
expect("A Second Investment").to appear_before("C Third Investment")
end
context "Ascending" do
scenario "Sort by ID" do
visit admin_budget_budget_investments_path(budget, sort_by: "id", direction: "asc")
expect("B First Investment").to appear_before("A Second Investment")
expect("A Second Investment").to appear_before("C Third Investment")
within("th", text: "ID") do
expect(page).to have_css ".icon-sortable.desc", visible: :all
end
end
scenario "Sort by title" do
visit admin_budget_budget_investments_path(budget, sort_by: "title", direction: "asc")
expect("A Second Investment").to appear_before("B First Investment")
expect("B First Investment").to appear_before("C Third Investment")
within("th", text: "Title") do
expect(page).to have_css ".icon-sortable.desc", visible: :all
end
end
scenario "Sort by supports" do
visit admin_budget_budget_investments_path(budget, sort_by: "supports", direction: "asc")
expect("C Third Investment").to appear_before("A Second Investment")
expect("A Second Investment").to appear_before("B First Investment")
within("th", text: "Supports") do
expect(page).to have_css ".icon-sortable.desc", visible: :all
end
end
end
context "Descending" do
scenario "Sort by ID" do
visit admin_budget_budget_investments_path(budget, sort_by: "id", direction: "desc")
expect("C Third Investment").to appear_before("A Second Investment")
expect("A Second Investment").to appear_before("B First Investment")
within("th", text: "ID") do
expect(page).to have_css ".icon-sortable.asc", visible: :all
end
end
scenario "Sort by title" do
visit admin_budget_budget_investments_path(budget, sort_by: "title", direction: "desc")
expect("C Third Investment").to appear_before("B First Investment")
expect("B First Investment").to appear_before("A Second Investment")
within("th", text: "Title") do
expect(page).to have_css ".icon-sortable.asc", visible: :all
end
end
scenario "Sort by supports" do
visit admin_budget_budget_investments_path(budget, sort_by: "supports", direction: "desc")
expect("B First Investment").to appear_before("A Second Investment")
expect("A Second Investment").to appear_before("C Third Investment")
within("th", text: "Supports") do
expect(page).to have_css ".icon-sortable.asc", visible: :all
end
end
end
context "With no direction provided sorts ascending" do
scenario "Sort by ID" do
visit admin_budget_budget_investments_path(budget, sort_by: "id")
expect("B First Investment").to appear_before("A Second Investment")
expect("A Second Investment").to appear_before("C Third Investment")
within("th", text: "ID") do
expect(page).to have_css ".icon-sortable.desc", visible: :all
end
end
scenario "Sort by title" do
visit admin_budget_budget_investments_path(budget, sort_by: "title")
expect("A Second Investment").to appear_before("B First Investment")
expect("B First Investment").to appear_before("C Third Investment")
within("th", text: "Title") do
expect(page).to have_css ".icon-sortable.desc", visible: :all
end
end
scenario "Sort by supports" do
visit admin_budget_budget_investments_path(budget, sort_by: "supports")
expect("C Third Investment").to appear_before("A Second Investment")
expect("A Second Investment").to appear_before("B First Investment")
within("th", text: "Supports") do
expect(page).to have_css ".icon-sortable.desc", visible: :all
end
end
end
context "With incorrect direction provided sorts ascending" do
scenario "Sort by ID" do
visit admin_budget_budget_investments_path(budget, sort_by: "id", direction: "incorrect")
expect("B First Investment").to appear_before("A Second Investment")
expect("A Second Investment").to appear_before("C Third Investment")
within("th", text: "ID") do
expect(page).to have_css ".icon-sortable.desc", visible: :all
end
end
end
end
context "Show" do
scenario "Show the investment details" do
user = create(:user, username: "Rachel", email: "rachel@valuators.org")
valuator = create(:valuator, user: user)
budget_investment = create(:budget_investment,
:unfeasible,
unfeasibility_explanation: "It is impossible",
price: 1234,
price_first_year: 1000,
administrator: administrator,
valuators: [valuator]
)
visit admin_budget_budget_investments_path(budget_investment.budget)
within_window(window_opened_by { click_link budget_investment.title }) do
expect(page).to have_content("Investment preview")
expect(page).to have_content(budget_investment.title)
expect(page).to have_content(budget_investment.description)
expect(page).to have_content(budget_investment.author.name)
expect(page).to have_content(budget_investment.heading.name)
expect(page).to have_content("1234")
expect(page).to have_content("1000")
expect(page).to have_content("Unfeasible")
expect(page).to have_content("It is impossible")
expect(page).to have_content("Ana (ana@admins.org)")
within("#assigned_valuators") do
expect(page).to have_content("Rachel (rachel@valuators.org)")
end
expect(page).to have_button "Publish comment"
end
end
scenario "Show image and documents on investment details" do
budget_investment = create(:budget_investment,
:with_image,
:unfeasible,
unfeasibility_explanation: "It is impossible",
price: 1234,
price_first_year: 1000,
administrator: administrator)
document = create(:document, documentable: budget_investment)
visit admin_budget_budget_investments_path(budget_investment.budget)
within_window(window_opened_by { click_link budget_investment.title }) do
expect(page).to have_content(budget_investment.title)
expect(page).to have_content(budget_investment.description)
expect(page).to have_content(budget_investment.author.name)
expect(page).to have_content(budget_investment.heading.name)
expect(page).to have_content("Investment preview")
expect(page).to have_content(budget_investment.image.title)
expect(page).to have_content("Documents (1)")
expect(page).to have_content(document.title)
expect(page).to have_content("Download file")
expect(page).to have_content("1234")
expect(page).to have_content("1000")
expect(page).to have_content("Unfeasible")
expect(page).to have_content("It is impossible")
expect(page).to have_content("Ana (ana@admins.org)")
end
end
scenario "Does not show related content or hide links on preview" do
budget_investment = create(:budget_investment,
:unfeasible,
price: 1234,
price_first_year: 1000,
administrator: administrator)
visit admin_budget_budget_investments_path(budget_investment.budget)
click_link budget_investment.title
expect(page).not_to have_content("Add related content")
expect(page).not_to have_content("Hide")
end
scenario "If budget is finished, investment cannot be edited or valuation comments created" do
finished_budget = create(:budget, :finished)
budget_investment = create(:budget_investment,
budget: finished_budget,
administrator: administrator)
visit admin_budget_budget_investments_path(budget_investment.budget)
within_window(window_opened_by { click_link budget_investment.title }) do
expect(page).not_to have_link "Edit"
expect(page).not_to have_link "Edit classification"
expect(page).not_to have_link "Edit dossier"
expect(page).to have_link "Create new milestone"
expect(page).not_to have_button "Publish comment"
end
end
end
context "Edit" do
scenario "Change title, incompatible, description or heading" do
budget_investment = create(:budget_investment, :incompatible)
create(:budget_heading, group: budget_investment.group, name: "Barbate")
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit"
fill_in "Title", with: "Potatoes"
fill_in_ckeditor "Description", with: "Carrots"
select "Barbate", from: "budget_investment[heading_id]"
uncheck "budget_investment_incompatible"
check "budget_investment_selected"
click_button "Update"
expect(page).to have_content "Potatoes"
expect(page).to have_content "Carrots"
expect(page).to have_content "Barbate"
expect(page).to have_content "Compatibility: Compatible"
expect(page).to have_content "Selected"
end
scenario "Compatible non-winner can't edit incompatibility" do
budget_investment = create(:budget_investment, :selected)
create(:budget_heading, group: budget_investment.group, name: "Tetuan")
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit"
expect(page).not_to have_content "Compatibility"
expect(page).not_to have_content "Mark as incompatible"
end
scenario "Add administrator" do
budget_investment = create(:budget_investment)
user = create(:user, username: "Marta", email: "marta@admins.org")
create(:administrator, user: user, description: "Marta desc")
visit edit_admin_budget_path(budget_investment.budget)
click_link "Select administrators"
check "Marta"
click_button "Update Budget"
expect(page).to have_content "Participatory budget updated successfully"
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit classification"
select "Marta desc (marta@admins.org)", from: "budget_investment[administrator_id]"
click_button "Update"
expect(page).to have_content "Investment project updated succesfully."
expect(page).to have_content "Assigned administrator: Marta"
end
scenario "Add valuators" do
budget_investment = create(:budget_investment)
user1 = create(:user, username: "Valentina", email: "v1@valuators.org")
user2 = create(:user, username: "Valerian", email: "v2@valuators.org")
user3 = create(:user, username: "Val", email: "v3@valuators.org")
valuator1 = create(:valuator, user: user1)
valuator3 = create(:valuator, user: user3)
create(:valuator, user: user2)
visit edit_admin_budget_path(budget_investment.budget)
click_link "Select valuators"
check "Valentina"
check "Val"
click_button "Update Budget"
expect(page).to have_content "Participatory budget updated successfully"
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit classification"
check "budget_investment_valuator_ids_#{valuator1.id}"
check "budget_investment_valuator_ids_#{valuator3.id}"
click_button "Update"
expect(page).to have_content "Investment project updated succesfully."
within("#assigned_valuators") do
expect(page).to have_content("Valentina (v1@valuators.org)")
expect(page).to have_content("Val (v3@valuators.org)")
expect(page).not_to have_content("Undefined")
expect(page).not_to have_content("Valerian (v2@valuators.org)")
end
end
scenario "Add valuator group" do
budget_investment = create(:budget_investment)
health_group = create(:valuator_group, name: "Health")
culture_group = create(:valuator_group, name: "Culture")
create(:valuator_group, name: "Economy")
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit classification"
check "budget_investment_valuator_group_ids_#{health_group.id}"
check "budget_investment_valuator_group_ids_#{culture_group.id}"
click_button "Update"
expect(page).to have_content "Investment project updated succesfully."
within("#assigned_valuator_groups") do
expect(page).to have_content("Health")
expect(page).to have_content("Culture")
expect(page).not_to have_content("Undefined")
expect(page).not_to have_content("Economy")
end
end
scenario "Do not display valuators of an assigned group" do
budget_investment = create(:budget_investment)
health_group = create(:valuator_group, name: "Health")
user = create(:user, username: "Valentina", email: "v1@valuators.org")
create(:valuator, user: user, valuator_group: health_group)
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit classification"
check "budget_investment_valuator_group_ids_#{health_group.id}"
click_button "Update"
expect(page).to have_content "Investment project updated succesfully."
within("#assigned_valuator_groups") { expect(page).to have_content("Health") }
within("#assigned_valuators") do
expect(page).to have_content("Undefined")
expect(page).not_to have_content("Valentina (v1@valuators.org)")
end
end
scenario "Adds existing valuation tags" do
budget_investment1 = create(:budget_investment)
budget_investment1.set_tag_list_on(:valuation_tags, "Education, Health")
budget_investment1.save!
budget_investment2 = create(:budget_investment)
visit edit_admin_budget_budget_investment_path(budget_investment2.budget, budget_investment2)
find(".js-add-tag-link", text: "Education").click
click_button "Update"
expect(page).to have_content "Investment project updated succesfully."
within "#tags" do
expect(page).to have_content "Education"
expect(page).not_to have_content "Health"
end
end
scenario "Adds non existent valuation tags" do
budget_investment = create(:budget_investment)
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit classification"
fill_in "budget_investment_valuation_tag_list", with: "Refugees, Solidarity"
click_button "Update"
expect(page).to have_content "Investment project updated succesfully."
within "#tags" do
expect(page).to have_content "Refugees"
expect(page).to have_content "Solidarity"
end
end
scenario "Changes valuation and user generated tags" do
budget_investment = create(:budget_investment, tag_list: "Park")
budget_investment.set_tag_list_on(:valuation_tags, "Education")
budget_investment.save!
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
within("#tags_budget_investment_#{budget_investment.id}") do
expect(page).not_to have_content "Education"
expect(page).to have_content "Park"
end
click_link "Edit classification"
fill_in "budget_investment_tag_list", with: "Park, Trees"
fill_in "budget_investment_valuation_tag_list", with: "Education, Environment"
click_button "Update"
expect(page).to have_content "Investment project updated succesfully"
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
within("#tags_budget_investment_#{budget_investment.id}") do
expect(page).not_to have_content "Education"
expect(page).not_to have_content "Environment"
expect(page).to have_content "Park"
expect(page).to have_content "Trees"
end
within("#tags") do
expect(page).to have_content "Education, Environment"
expect(page).not_to have_content "Park"
expect(page).not_to have_content "Trees"
end
end
scenario "Maintains user tags" do
budget_investment = create(:budget_investment, tag_list: "Park")
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit classification"
fill_in "budget_investment_valuation_tag_list", with: "Refugees, Solidarity"
click_button "Update"
expect(page).to have_content "Investment project updated succesfully."
visit budget_investment_path(budget_investment.budget, budget_investment)
expect(page).to have_content "Park"
expect(page).not_to have_content "Refugees, Solidarity"
end
scenario "Shows alert when 'Valuation finished' is checked" do
budget_investment = create(:budget_investment)
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit dossier"
expect(page).to have_content("Valuation finished")
accept_confirm { check("Valuation finished") }
expect(find("#js-investment-report-alert")).to be_checked
end
scenario "Shows alert with unfeasible status when 'Valuation finished' is checked" do
budget_investment = create(:budget_investment, :unfeasible)
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit dossier"
expect(page).to have_field "Valuation finished", checked: false
accept_confirm { check("Valuation finished") }
expect(page).to have_field "Valuation finished", checked: true
end
scenario "Undoes check in 'Valuation finished' if user clicks 'cancel' on alert" do
budget_investment = create(:budget_investment)
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit dossier"
dismiss_confirm { check("Valuation finished") }
expect(find("#js-investment-report-alert")).not_to be_checked
end
scenario "Errors on update" do
budget_investment = create(:budget_investment)
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
click_link "Edit"
fill_in "Title", with: ""
click_button "Update"
expect(page).to have_content "can't be blank"
end
scenario "Add milestone tags" do
budget_investment = create(:budget_investment)
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
expect(page).not_to have_content("Milestone Tags:")
click_link "Edit classification"
fill_in "budget_investment_milestone_tag_list", with: "tag1, tag2"
click_button "Update"
expect(page).to have_content "Investment project updated succesfully."
expect(page).to have_content("Milestone Tags: tag1, tag2")
end
end
context "Selecting" do
let!(:unfeasible_bi) do
create(:budget_investment, :unfeasible, budget: budget, title: "Unfeasible project")
end
let!(:feasible_bi) do
create(:budget_investment, :feasible, budget: budget, title: "Feasible project")
end
let!(:feasible_vf_bi) do
create(:budget_investment, :feasible, :finished, budget: budget, title: "Feasible, VF project")
end
let!(:selected_bi) do
create(:budget_investment, :selected, budget: budget, title: "Selected project")
end
let!(:winner_bi) do
create(:budget_investment, :winner, budget: budget, title: "Winner project")
end
let!(:undecided_bi) do
create(:budget_investment, :undecided, budget: budget, title: "Undecided project")
end
scenario "Filtering by valuation and selection" do
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
check "Valuation finished"
click_button "Filter"
expect(page).not_to have_content(unfeasible_bi.title)
expect(page).not_to have_content(feasible_bi.title)
expect(page).to have_content(feasible_vf_bi.title)
expect(page).to have_content(selected_bi.title)
expect(page).to have_content(winner_bi.title)
within("#advanced_filters") { check("Feasible") }
click_button("Filter")
expect(page).not_to have_content(unfeasible_bi.title)
expect(page).not_to have_content(feasible_bi.title)
expect(page).to have_content(feasible_vf_bi.title)
expect(page).to have_content(selected_bi.title)
expect(page).to have_content(winner_bi.title)
within("#advanced_filters") do
check("Selected")
uncheck("Feasible")
end
click_button("Filter")
expect(page).not_to have_content(unfeasible_bi.title)
expect(page).not_to have_content(feasible_bi.title)
expect(page).not_to have_content(feasible_vf_bi.title)
expect(page).to have_content(selected_bi.title)
expect(page).to have_content(winner_bi.title)
check "Winners"
click_button "Filter"
expect(page).not_to have_content(unfeasible_bi.title)
expect(page).not_to have_content(feasible_bi.title)
expect(page).not_to have_content(feasible_vf_bi.title)
expect(page).not_to have_content(selected_bi.title)
expect(page).to have_content(winner_bi.title)
end
scenario "Aggregating results" do
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
within("#advanced_filters") { check("Undecided") }
click_button("Filter")
expect(page).to have_content(undecided_bi.title)
expect(page).not_to have_content(winner_bi.title)
expect(page).not_to have_content(selected_bi.title)
expect(page).not_to have_content(feasible_bi.title)
expect(page).not_to have_content(unfeasible_bi.title)
expect(page).not_to have_content(feasible_vf_bi.title)
within("#advanced_filters") { check("Unfeasible") }
click_button("Filter")
expect(page).to have_content(undecided_bi.title)
expect(page).to have_content(unfeasible_bi.title)
expect(page).not_to have_content(winner_bi.title)
expect(page).not_to have_content(selected_bi.title)
expect(page).not_to have_content(feasible_bi.title)
expect(page).not_to have_content(feasible_vf_bi.title)
end
scenario "Showing the selection buttons" do
visit admin_budget_budget_investments_path(budget)
within("#budget_investment_#{unfeasible_bi.id}") do
expect(page).not_to have_link("Select")
expect(page).not_to have_link("Selected")
end
within("#budget_investment_#{feasible_bi.id}") do
expect(page).not_to have_link("Select")
expect(page).not_to have_link("Selected")
end
within("#budget_investment_#{feasible_vf_bi.id}") do
expect(page).to have_link("Select")
expect(page).not_to have_link("Selected")
end
within("#budget_investment_#{selected_bi.id}") do
expect(page).not_to have_link("Select")
expect(page).to have_link("Selected")
end
end
scenario "Show only selected text when budget is finished" do
budget.update!(phase: "finished")
visit admin_budget_budget_investments_path(budget)
within("#budget_investment_#{unfeasible_bi.id} #selection") do
expect(page).not_to have_content("Select")
expect(page).not_to have_content("Selected")
end
within("#budget_investment_#{feasible_bi.id} #selection") do
expect(page).not_to have_content("Select")
expect(page).not_to have_content("Selected")
end
within("#budget_investment_#{feasible_vf_bi.id} #selection") do
expect(page).not_to have_content("Select")
expect(page).not_to have_content("Selected")
end
within("#budget_investment_#{selected_bi.id} #selection") do
expect(page).not_to contain_exactly("Select")
expect(page).to have_content("Selected")
end
end
scenario "Selecting an investment" do
visit admin_budget_budget_investments_path(budget)
within("#budget_investment_#{feasible_vf_bi.id}") do
click_link("Select")
expect(page).to have_link("Selected")
end
click_link "Advanced filters"
within("#advanced_filters") { check("Selected") }
click_button("Filter")
within("#budget_investment_#{feasible_vf_bi.id}") do
expect(page).not_to have_link("Select")
expect(page).to have_link("Selected")
end
end
scenario "Unselecting an investment" do
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
within("#advanced_filters") { check("Selected") }
click_button("Filter")
expect(page).to have_content("There are 2 investments")
within("#budget_investment_#{selected_bi.id}") do
click_link("Selected")
expect(page).to have_link("Select")
end
click_button("Filter")
expect(page).not_to have_content(selected_bi.title)
expect(page).to have_content("There is 1 investment")
visit admin_budget_budget_investments_path(budget)
within("#budget_investment_#{selected_bi.id}") do
expect(page).to have_link("Select")
expect(page).not_to have_link("Selected")
end
end
describe "Pagination" do
before { selected_bi.update(cached_votes_up: 50) }
scenario "After unselecting an investment" do
allow(Budget::Investment).to receive(:default_per_page).and_return(3)
visit admin_budget_budget_investments_path(budget)
within("#budget_investment_#{selected_bi.id}") do
click_link("Selected")
expect(page).to have_link "Select"
end
click_link("Next")
expect(page).to have_link("Previous")
end
end
end
context "Mark as visible to valuators" do
let(:valuator) { create(:valuator) }
let(:admin) { create(:administrator) }
let(:heading) { create(:budget_heading, budget: budget) }
let(:investment1) { create(:budget_investment, heading: heading) }
let(:investment2) { create(:budget_investment, heading: heading) }
scenario "Mark as visible to valuator" do
investment1.valuators << valuator
investment2.valuators << valuator
investment1.update!(administrator: admin)
investment2.update!(administrator: admin)
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
check "Under valuation"
click_button "Filter"
within("#budget_investment_#{investment1.id}") do
check "budget_investment_visible_to_valuators"
end
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
check "Under valuation"
click_button "Filter"
within("#budget_investment_#{investment1.id}") do
expect(find("#budget_investment_visible_to_valuators")).to be_checked
end
end
scenario "Shows the correct investments to valuators" do
investment1.update!(visible_to_valuators: true)
investment2.update!(visible_to_valuators: false)
investment1.valuators << valuator
investment2.valuators << valuator
investment1.update!(administrator: admin)
investment2.update!(administrator: admin)
login_as(valuator.user)
visit valuation_root_path
within "#budget_#{budget.id}" do
click_link "Evaluate"
end
expect(page).to have_content investment1.title
expect(page).not_to have_content investment2.title
end
scenario "Unmark as visible to valuator" do
budget.update!(phase: "valuating")
investment1.valuators << valuator
investment2.valuators << valuator
investment1.update!(administrator: admin, visible_to_valuators: true)
investment2.update!(administrator: admin, visible_to_valuators: true)
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
check "Under valuation"
click_button "Filter"
within("#budget_investment_#{investment1.id}") do
uncheck "budget_investment_visible_to_valuators"
end
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
check "Under valuation"
click_button "Filter"
within("#budget_investment_#{investment1.id}") do
expect(find("#budget_investment_visible_to_valuators")).not_to be_checked
end
end
scenario "Cannot mark/unmark visible to valuators on finished budgets" do
budget.update!(phase: "finished")
create(:budget_investment, budget: budget, title: "Visible", visible_to_valuators: true)
create(:budget_investment, budget: budget, title: "Invisible", visible_to_valuators: false)
visit admin_budget_budget_investments_path(budget)
within "tr", text: "Visible" do
within "td[data-field=visible_to_valuators]" do
expect(page).to have_text "Yes"
expect(page).not_to have_field "budget_investment_visible_to_valuators"
end
end
within "tr", text: "Invisible" do
within "td[data-field=visible_to_valuators]" do
expect(page).to have_text "No"
expect(page).not_to have_field "budget_investment_visible_to_valuators"
end
end
end
scenario "Showing the valuating checkbox" do
investment1 = create(:budget_investment, :with_administrator, :with_valuator, :visible_to_valuators,
budget: budget)
investment2 = create(:budget_investment, :with_administrator, :with_valuator, :invisible_to_valuators,
budget: budget)
visit admin_budget_budget_investments_path(budget)
expect(page).to have_css("#budget_investment_visible_to_valuators")
click_link "Advanced filters"
check "Under valuation"
click_button "Filter"
within("#budget_investment_#{investment1.id}") do
valuating_checkbox = find("#budget_investment_visible_to_valuators")
expect(valuating_checkbox).to be_checked
end
within("#budget_investment_#{investment2.id}") do
valuating_checkbox = find("#budget_investment_visible_to_valuators")
expect(valuating_checkbox).not_to be_checked
end
end
scenario "Keeps the valuation tags" do
investment1.set_tag_list_on(:valuation_tags, %w[Possimpible Truthiness])
investment1.save!
visit admin_budget_budget_investments_path(budget)
within("#budget_investment_#{investment1.id}") do
check "budget_investment_visible_to_valuators"
end
visit edit_admin_budget_budget_investment_path(budget, investment1)
expect(page).to have_content "Possimpible"
expect(page).to have_content "Truthiness"
end
end
context "Selecting csv", :no_js do
scenario "Downloading CSV file" do
admin = create(:administrator, user: create(:user, username: "Admin"))
valuator = create(:valuator, user: create(:user, username: "Valuator"))
valuator_group = create(:valuator_group, name: "Valuator Group")
budget_group = create(:budget_group, name: "Budget Group", budget: budget)
first_budget_heading = create(:budget_heading, group: budget_group, name: "Budget Heading")
second_budget_heading = create(:budget_heading, group: budget_group, name: "Other Heading")
first_investment = create(:budget_investment, :feasible, :selected, title: "Le Investment",
budget: budget, group: budget_group,
heading: first_budget_heading,
cached_votes_up: 88, price: 99,
valuators: [],
valuator_groups: [valuator_group],
administrator: admin,
visible_to_valuators: true)
second_investment = create(:budget_investment, :unfeasible, title: "Alt Investment",
budget: budget, group: budget_group,
heading: second_budget_heading,
cached_votes_up: 66, price: 88,
valuators: [valuator],
valuator_groups: [],
visible_to_valuators: false)
visit admin_budget_budget_investments_path(budget)
click_link "Download current selection"
header = page.response_headers["Content-Disposition"]
expect(header).to match(/^attachment/)
expect(header).to match(/filename="budget_investments.csv"/)
csv_contents = "ID,Title,Supports,Administrator,Valuator,Valuation Group,Scope of operation,"\
"Feasibility,Val. Fin.,Selected,Show to valuators,Author username\n"\
"#{first_investment.id},Le Investment,88,Admin,-,Valuator Group,"\
"Budget Heading,Feasible (€99),Yes,Yes,Yes,"\
"#{first_investment.author.username}\n#{second_investment.id},"\
"Alt Investment,66,No admin assigned,Valuator,-,Other Heading,"\
"Unfeasible,No,No,No,#{second_investment.author.username}\n"
expect(page.body).to eq(csv_contents)
end
scenario "Downloading CSV file with applied filter" do
create(:budget_investment, :unfeasible, budget: budget, title: "Unfeasible one")
create(:budget_investment, :finished, budget: budget, title: "Finished Investment")
visit admin_budget_budget_investments_path(budget)
click_link "Advanced filters"
check "Valuation finished"
click_button "Filter"
expect(page).to have_content "Finished Investment"
expect(page).not_to have_content "Unfeasible one"
click_link "Download current selection"
expect(page).to have_content("Finished Investment")
expect(page).not_to have_content("Unfeasible one")
end
end
context "Columns chooser" do
let!(:investment) do
create(:budget_investment,
:winner,
:visible_to_valuators,
budget: budget,
author: create(:user, username: "Jon Doe")
)
end
let(:default_columns) do
%w[id title supports admin valuator geozone feasibility price
valuation_finished visible_to_valuators selected]
end
let(:selectable_columns) do
%w[title supports admin author valuator geozone feasibility price
valuation_finished visible_to_valuators selected]
end
scenario "Display default columns" do
visit admin_budget_budget_investments_path(budget)
within("table.column-selectable") do
default_columns.each do |default_column|
columns_header = I18n.t("admin.budget_investments.index.list.#{default_column}")
expect(page).to have_content(columns_header)
end
expect(page).to have_content(investment.title)
end
end
scenario "Display incompatible column as default if selected filter was set" do
visit admin_budget_budget_investments_path(budget, advanced_filters: ["selected"])
within("table.column-selectable") do
expect(page).to have_content("Incompatible")
end
expect(page).to have_content(investment.title)
end
scenario "Set cookie with default columns value if undefined" do
visit admin_budget_budget_investments_path(budget)
cookies = page.driver.browser.manage.all_cookies
columns_cookie = cookies.find { |cookie| cookie[:name] == "investments-columns" }
cookie_value = columns_cookie[:value]
expect(cookie_value).to eq("id,title,supports,admin,valuator,geozone," +
"feasibility,price,valuation_finished,visible_to_valuators,selected,incompatible")
end
scenario "Use column selector to display visible columns" do
visit admin_budget_budget_investments_path(budget)
click_button "Columns"
within("#js-columns-selector-wrapper") do
selectable_columns.each do |column|
check_text = I18n.t("admin.budget_investments.index.list.#{column}")
expect(page).to have_content(check_text)
end
end
within("#js-columns-selector-wrapper") do
uncheck "Title"
uncheck "Price"
check "Author"
end
within("table.column-selectable") do
expect(page).not_to have_content("Title")
expect(page).not_to have_content("Price")
expect(page).to have_content("Author")
expect(page).not_to have_content(investment.title)
expect(page).not_to have_content(investment.formatted_price)
expect(page).to have_content("Jon Doe")
end
end
scenario "Cookie will be updated after change columns selection" do
visit admin_budget_budget_investments_path(budget)
click_button "Columns"
within("#js-columns-selector-wrapper") do
uncheck "Title"
uncheck "Price"
uncheck "Valuation Group / Valuator"
check "Author"
end
cookies = page.driver.browser.manage.all_cookies
columns_cookie = cookies.find { |cookie| cookie[:name] == "investments-columns" }
cookie_value = columns_cookie[:value]
expect(cookie_value).to eq("id,supports,admin,geozone," +
"feasibility,valuation_finished,visible_to_valuators,selected,incompatible,author")
visit admin_budget_budget_investments_path(budget)
cookies = page.driver.browser.manage.all_cookies
columns_cookie = cookies.find { |cookie| cookie[:name] == "investments-columns" }
cookie_value = columns_cookie[:value]
expect(cookie_value).to eq("id,supports,admin,geozone,feasibility,valuation_finished," +
"visible_to_valuators,selected,incompatible,author")
end
scenario "Select an investment when some columns are not displayed" do
investment.update!(title: "Don't display me, please!")
visit admin_budget_budget_investments_path(budget)
click_button "Columns"
within("#js-columns-selector-wrapper") { uncheck "Title" }
within("#budget_investment_#{investment.id}") do
click_link "Selected"
expect(page).to have_link "Select"
expect(page).not_to have_content "Don't display me, please!"
end
end
scenario "When restoring the page from browser history renders columns selectors only once" do
visit admin_budget_budget_investments_path(budget)
click_link "Proposals"
expect(page).to have_content("There are no proposals.")
go_back
click_button "Columns"
within("#js-columns-selector-wrapper") do
selectable_columns.each do |column|
check_text = I18n.t("admin.budget_investments.index.list.#{column}")
expect(page).to have_content(check_text, count: 1)
end
end
end
end
end