Users (particularly, screen reader users) usually identify links with
things that take you somewhere, and buttons with things that either send
forms or change things on the page.
Using a button we can also use the `aria-expanded` attribute, meaning
screen reader users will know that the button has two states ("expanded"
and "collapsed"), the current state of the button, and will get
immediate feedback when clicking the button because the new state of the
button will be announced.
Thanks to this change, we can also slightly simplify the code; we
obviously have to remove the (useless) `href` attribute, and we don't
have to prevent the default event in JavaScript since there's no default
event for buttons with `type="button"`.
454 lines
16 KiB
Ruby
454 lines
16 KiB
Ruby
require "rails_helper"
|
|
|
|
describe "Advanced search" do
|
|
let(:budget) { create(:budget, name: "Big Budget") }
|
|
let(:heading) { create(:budget_heading, budget: budget, name: "More hospitals") }
|
|
|
|
scenario "Search debates" do
|
|
debate1 = create(:debate, title: "Get Schwifty")
|
|
debate2 = create(:debate, title: "Schwifty Hello")
|
|
debate3 = create(:debate, title: "Do not show me")
|
|
|
|
visit debates_path
|
|
|
|
click_button "Advanced search"
|
|
fill_in "Write the text", with: "Schwifty"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 debates")
|
|
|
|
within("#debates") do
|
|
expect(page).to have_content(debate1.title)
|
|
expect(page).to have_content(debate2.title)
|
|
expect(page).not_to have_content(debate3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Search proposals" do
|
|
proposal1 = create(:proposal, title: "Get Schwifty")
|
|
proposal2 = create(:proposal, title: "Schwifty Hello")
|
|
proposal3 = create(:proposal, title: "Do not show me")
|
|
|
|
visit proposals_path
|
|
|
|
click_button "Advanced search"
|
|
fill_in "Write the text", with: "Schwifty"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 citizen proposals")
|
|
|
|
within("#proposals") do
|
|
expect(page).to have_content(proposal1.title)
|
|
expect(page).to have_content(proposal2.title)
|
|
expect(page).not_to have_content(proposal3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Search investments" do
|
|
bdgt_invest1 = create(:budget_investment, heading: heading, title: "Get Schwifty")
|
|
bdgt_invest2 = create(:budget_investment, heading: heading, title: "Schwifty Hello")
|
|
bdgt_invest3 = create(:budget_investment, heading: heading, title: "Do not show me")
|
|
|
|
visit budget_investments_path(budget)
|
|
|
|
click_button "Advanced search"
|
|
fill_in "Write the text", with: "Schwifty"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 investments")
|
|
|
|
within("#budget-investments") do
|
|
expect(page).to have_content(bdgt_invest1.title)
|
|
expect(page).to have_content(bdgt_invest2.title)
|
|
expect(page).not_to have_content(bdgt_invest3.title)
|
|
end
|
|
end
|
|
|
|
context "Search by author type" do
|
|
scenario "Public employee" do
|
|
Setting["official_level_1_name"] = "Official position 1"
|
|
ana = create :user, official_level: 1
|
|
john = create :user, official_level: 2
|
|
|
|
debate1 = create(:debate, author: ana)
|
|
debate2 = create(:debate, author: ana)
|
|
debate3 = create(:debate, author: john)
|
|
|
|
visit debates_path
|
|
|
|
click_button "Advanced search"
|
|
select "Official position 1", from: "advanced_search_official_level"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 debates")
|
|
|
|
within("#debates") do
|
|
expect(page).to have_content(debate1.title)
|
|
expect(page).to have_content(debate2.title)
|
|
expect(page).not_to have_content(debate3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Municipal Organization" do
|
|
Setting["official_level_2_name"] = "Official position 2"
|
|
ana = create :user, official_level: 2
|
|
john = create :user, official_level: 3
|
|
|
|
proposal1 = create(:proposal, author: ana)
|
|
proposal2 = create(:proposal, author: ana)
|
|
proposal3 = create(:proposal, author: john)
|
|
|
|
visit proposals_path
|
|
|
|
click_button "Advanced search"
|
|
select "Official position 2", from: "advanced_search_official_level"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 citizen proposals")
|
|
|
|
within("#proposals") do
|
|
expect(page).to have_content(proposal1.title)
|
|
expect(page).to have_content(proposal2.title)
|
|
expect(page).not_to have_content(proposal3.title)
|
|
end
|
|
end
|
|
|
|
scenario "General director" do
|
|
Setting["official_level_3_name"] = "Official position 3"
|
|
ana = create :user, official_level: 3
|
|
john = create :user, official_level: 4
|
|
|
|
bdgt_invest1 = create(:budget_investment, heading: heading, author: ana)
|
|
bdgt_invest2 = create(:budget_investment, heading: heading, author: ana)
|
|
bdgt_invest3 = create(:budget_investment, heading: heading, author: john)
|
|
|
|
visit budget_investments_path(budget)
|
|
|
|
click_button "Advanced search"
|
|
select "Official position 3", from: "advanced_search_official_level"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 investments")
|
|
|
|
within("#budget-investments") do
|
|
expect(page).to have_content(bdgt_invest1.title)
|
|
expect(page).to have_content(bdgt_invest2.title)
|
|
expect(page).not_to have_content(bdgt_invest3.title)
|
|
end
|
|
end
|
|
|
|
scenario "City councillor" do
|
|
Setting["official_level_4_name"] = "Official position 4"
|
|
ana = create :user, official_level: 4
|
|
john = create :user, official_level: 5
|
|
|
|
debate1 = create(:debate, author: ana)
|
|
debate2 = create(:debate, author: ana)
|
|
debate3 = create(:debate, author: john)
|
|
|
|
visit debates_path
|
|
|
|
click_button "Advanced search"
|
|
select "Official position 4", from: "advanced_search_official_level"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 debates")
|
|
|
|
within("#debates") do
|
|
expect(page).to have_content(debate1.title)
|
|
expect(page).to have_content(debate2.title)
|
|
expect(page).not_to have_content(debate3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Mayoress" do
|
|
Setting["official_level_5_name"] = "Official position 5"
|
|
ana = create :user, official_level: 5
|
|
john = create :user, official_level: 4
|
|
|
|
proposal1 = create(:proposal, author: ana)
|
|
proposal2 = create(:proposal, author: ana)
|
|
proposal3 = create(:proposal, author: john)
|
|
|
|
visit proposals_path
|
|
|
|
click_button "Advanced search"
|
|
select "Official position 5", from: "advanced_search_official_level"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 citizen proposals")
|
|
|
|
within("#proposals") do
|
|
expect(page).to have_content(proposal1.title)
|
|
expect(page).to have_content(proposal2.title)
|
|
expect(page).not_to have_content(proposal3.title)
|
|
end
|
|
end
|
|
|
|
context "Search by date" do
|
|
context "Predefined date ranges" do
|
|
scenario "Last day" do
|
|
bdgt_invest1 = create(:budget_investment, heading: heading, created_at: 1.minute.ago)
|
|
bdgt_invest2 = create(:budget_investment, heading: heading, created_at: 1.hour.ago)
|
|
bdgt_invest3 = create(:budget_investment, heading: heading, created_at: 2.days.ago)
|
|
|
|
visit budget_investments_path(budget)
|
|
|
|
click_button "Advanced search"
|
|
select "Last 24 hours", from: "js-advanced-search-date-min"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 investments")
|
|
|
|
within("#budget-investments") do
|
|
expect(page).to have_content(bdgt_invest1.title)
|
|
expect(page).to have_content(bdgt_invest2.title)
|
|
expect(page).not_to have_content(bdgt_invest3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Last week" do
|
|
debate1 = create(:debate, created_at: 1.day.ago)
|
|
debate2 = create(:debate, created_at: 5.days.ago)
|
|
debate3 = create(:debate, created_at: 8.days.ago)
|
|
|
|
visit debates_path
|
|
|
|
click_button "Advanced search"
|
|
select "Last week", from: "js-advanced-search-date-min"
|
|
click_button "Filter"
|
|
|
|
within("#debates") do
|
|
expect(page).to have_css(".debate", count: 2)
|
|
|
|
expect(page).to have_content(debate1.title)
|
|
expect(page).to have_content(debate2.title)
|
|
expect(page).not_to have_content(debate3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Last month" do
|
|
proposal1 = create(:proposal, created_at: 10.days.ago)
|
|
proposal2 = create(:proposal, created_at: 20.days.ago)
|
|
proposal3 = create(:proposal, created_at: 33.days.ago)
|
|
|
|
visit proposals_path
|
|
|
|
click_button "Advanced search"
|
|
select "Last month", from: "js-advanced-search-date-min"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 citizen proposals")
|
|
|
|
within("#proposals") do
|
|
expect(page).to have_content(proposal1.title)
|
|
expect(page).to have_content(proposal2.title)
|
|
expect(page).not_to have_content(proposal3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Last year" do
|
|
bdgt_invest1 = create(:budget_investment, heading: heading, created_at: 300.days.ago)
|
|
bdgt_invest2 = create(:budget_investment, heading: heading, created_at: 350.days.ago)
|
|
bdgt_invest3 = create(:budget_investment, heading: heading, created_at: 370.days.ago)
|
|
|
|
visit budget_investments_path(budget)
|
|
|
|
click_button "Advanced search"
|
|
select "Last year", from: "js-advanced-search-date-min"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 2 investments")
|
|
|
|
within("#budget-investments") do
|
|
expect(page).to have_content(bdgt_invest1.title)
|
|
expect(page).to have_content(bdgt_invest2.title)
|
|
expect(page).not_to have_content(bdgt_invest3.title)
|
|
end
|
|
end
|
|
end
|
|
|
|
scenario "Search by custom date range" do
|
|
debate1 = create(:debate, created_at: 2.days.ago)
|
|
debate2 = create(:debate, created_at: 3.days.ago)
|
|
debate3 = create(:debate, created_at: 9.days.ago)
|
|
|
|
visit debates_path
|
|
|
|
click_button "Advanced search"
|
|
select "Customized", from: "js-advanced-search-date-min"
|
|
fill_in "advanced_search_date_min", with: 7.days.ago.strftime("%d/%m/%Y")
|
|
fill_in "advanced_search_date_max", with: 1.day.ago.strftime("%d/%m/%Y")
|
|
find_field("With the text").click
|
|
click_button "Filter"
|
|
|
|
within("#debates") do
|
|
expect(page).to have_css(".debate", count: 2)
|
|
|
|
expect(page).to have_content(debate1.title)
|
|
expect(page).to have_content(debate2.title)
|
|
expect(page).not_to have_content(debate3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Search by custom invalid date range" do
|
|
proposal1 = create(:proposal, created_at: 2.days.ago)
|
|
proposal2 = create(:proposal, created_at: 3.days.ago)
|
|
proposal3 = create(:proposal, created_at: 9.days.ago)
|
|
|
|
visit proposals_path
|
|
|
|
click_button "Advanced search"
|
|
select "Customized", from: "js-advanced-search-date-min"
|
|
fill_in "advanced_search_date_min", with: 4000.years.ago.strftime("%d/%m/%Y")
|
|
fill_in "advanced_search_date_max", with: "13/13/2199"
|
|
find_field("With the text").click
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There are 3 citizen proposals")
|
|
|
|
within("#proposals") do
|
|
expect(page).to have_content(proposal1.title)
|
|
expect(page).to have_content(proposal2.title)
|
|
expect(page).to have_content(proposal3.title)
|
|
end
|
|
end
|
|
|
|
scenario "Search by multiple filters" do
|
|
Setting["official_level_1_name"] = "Official position 1"
|
|
ana = create :user, official_level: 1
|
|
john = create :user, official_level: 1
|
|
|
|
create(:budget_investment, heading: heading, title: "Get Schwifty", author: ana, created_at: 1.minute.ago)
|
|
create(:budget_investment, heading: heading, title: "Hello Schwifty", author: john, created_at: 2.days.ago)
|
|
create(:budget_investment, heading: heading, title: "Save the forest")
|
|
|
|
visit budget_investments_path(budget)
|
|
|
|
click_button "Advanced search"
|
|
fill_in "Write the text", with: "Schwifty"
|
|
select "Official position 1", from: "advanced_search_official_level"
|
|
select "Last 24 hours", from: "js-advanced-search-date-min"
|
|
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There is 1 investment")
|
|
|
|
within("#budget-investments") do
|
|
expect(page).to have_content "Get Schwifty"
|
|
end
|
|
end
|
|
|
|
scenario "Maintain advanced search criteria" do
|
|
Setting["official_level_1_name"] = "Official position 1"
|
|
|
|
visit debates_path
|
|
click_button "Advanced search"
|
|
|
|
fill_in "Write the text", with: "Schwifty"
|
|
select "Official position 1", from: "advanced_search_official_level"
|
|
select "Last 24 hours", from: "js-advanced-search-date-min"
|
|
|
|
click_button "Filter"
|
|
|
|
within "#js-advanced-search" do
|
|
expect(page).to have_selector("input[name='search'][value='Schwifty']")
|
|
expect(page).to have_select("advanced_search[official_level]", selected: "Official position 1")
|
|
expect(page).to have_select("advanced_search[date_min]", selected: "Last 24 hours")
|
|
end
|
|
end
|
|
|
|
scenario "Maintain custom date search criteria" do
|
|
visit proposals_path
|
|
click_button "Advanced search"
|
|
|
|
select "Customized", from: "js-advanced-search-date-min"
|
|
fill_in "advanced_search_date_min", with: 7.days.ago.strftime("%d/%m/%Y")
|
|
fill_in "advanced_search_date_max", with: 1.day.ago.strftime("%d/%m/%Y")
|
|
find_field("With the text").click
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("citizen proposals cannot be found")
|
|
|
|
within "#js-advanced-search" do
|
|
expect(page).to have_select("advanced_search[date_min]", selected: "Customized")
|
|
expect(page).to have_selector("input[name='advanced_search[date_min]'][value*='#{7.days.ago.strftime("%d/%m/%Y")}']")
|
|
expect(page).to have_selector("input[name='advanced_search[date_max]'][value*='#{1.day.ago.strftime("%d/%m/%Y")}']")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "SDG" do
|
|
before do
|
|
Setting["feature.sdg"] = true
|
|
Setting["sdg.process.debates"] = true
|
|
Setting["sdg.process.proposals"] = true
|
|
Setting["sdg.process.budgets"] = true
|
|
end
|
|
|
|
scenario "Search by goal" do
|
|
create(:budget_investment, title: "Purifier", heading: heading, sdg_goals: [SDG::Goal[6]])
|
|
create(:budget_investment, title: "Hospital", heading: heading, sdg_goals: [SDG::Goal[3]])
|
|
|
|
visit budget_investments_path(budget)
|
|
click_button "Advanced search"
|
|
select "6. Clean Water and Sanitation", from: "By SDG"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There is 1 investment")
|
|
|
|
within("#budget-investments") do
|
|
expect(page).to have_content "Purifier"
|
|
expect(page).not_to have_content "Hospital"
|
|
end
|
|
|
|
expect(page).to have_select "By target",
|
|
selected: "Select a target",
|
|
enabled_options: ["Select a target"] + %w[6.1 6.2 6.3 6.4 6.5 6.6 6.A 6.B]
|
|
end
|
|
|
|
scenario "Search by target" do
|
|
create(:debate, title: "Unrelated")
|
|
create(:debate, title: "High school", sdg_targets: [SDG::Target["4.1"]])
|
|
create(:debate, title: "Preschool", sdg_targets: [SDG::Target["4.2"]])
|
|
|
|
visit debates_path
|
|
click_button "Advanced search"
|
|
select "4.2", from: "By target"
|
|
click_button "Filter"
|
|
|
|
expect(page).to have_content("There is 1 debate")
|
|
|
|
within("#debates") do
|
|
expect(page).to have_content("Preschool")
|
|
expect(page).not_to have_content("High school")
|
|
expect(page).not_to have_content("Unrelated")
|
|
end
|
|
end
|
|
|
|
scenario "Dynamic target options depending on the selected goal" do
|
|
visit proposals_path
|
|
|
|
click_button "Advanced search"
|
|
select "1. No Poverty", from: "By SDG"
|
|
|
|
expect(page).to have_select "By target",
|
|
selected: "Select a target",
|
|
enabled_options: ["Select a target"] + %w[1.1 1.2 1.3 1.4 1.5 1.A 1.B]
|
|
|
|
select "1.1", from: "By target"
|
|
select "13. Climate Action", from: "By SDG"
|
|
|
|
expect(page).to have_select "By target",
|
|
selected: "Select a target",
|
|
enabled_options: ["Select a target"] + %w[13.1 13.2 13.3 13.A 13.B]
|
|
|
|
select "13.1", from: "By target"
|
|
select "Select a goal", from: "By SDG"
|
|
|
|
expect(page).to have_select "By target", selected: "13.1", disabled_options: []
|
|
end
|
|
end
|
|
end
|
|
end
|