change CRUD for budget groups and headings
To make it more consistent with the rest of the Admin panel, the CRUD for budget groups and headings has been changed from the old "all-in-one" form to a separate form for each resource.
This commit is contained in:
@@ -1,89 +1,177 @@
|
||||
require 'rails_helper'
|
||||
|
||||
feature 'Admin can change the groups name' do
|
||||
feature "Admin budget groups" do
|
||||
|
||||
let(:budget) { create(:budget, phase: 'drafting') }
|
||||
let(:group) { create(:budget_group, budget: budget) }
|
||||
let(:budget) { create(:budget, phase: "drafting") }
|
||||
|
||||
background do
|
||||
admin = create(:administrator)
|
||||
login_as(admin.user)
|
||||
end
|
||||
|
||||
scenario "Show button" do
|
||||
visit admin_budget_path(group.budget)
|
||||
|
||||
within("#budget_group_#{group.id}") do
|
||||
expect(page).to have_content('Edit group')
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Change name" do
|
||||
group.update(name: 'Google')
|
||||
expect(group.name).to eq('Google')
|
||||
end
|
||||
|
||||
scenario "Can change name when the budget isn't drafting, but the slug remains" do
|
||||
old_slug = group.slug
|
||||
budget.update(phase: 'reviewing')
|
||||
group.update(name: 'Google')
|
||||
|
||||
expect(group.name).to eq('Google')
|
||||
expect(group.slug).to eq old_slug
|
||||
end
|
||||
|
||||
scenario "Can't repeat names" do
|
||||
budget.groups << create(:budget_group, name: 'group_name')
|
||||
group.name = 'group_name'
|
||||
|
||||
expect(group).not_to be_valid
|
||||
expect(group.errors.size).to eq(1)
|
||||
end
|
||||
|
||||
context "Maximum votable headings" do
|
||||
context "Feature flag" do
|
||||
|
||||
background do
|
||||
3.times { create(:budget_heading, group: group) }
|
||||
Setting["feature.budgets"] = nil
|
||||
end
|
||||
|
||||
scenario "Defaults to 1 heading per group", :js do
|
||||
visit admin_budget_path(group.budget)
|
||||
after do
|
||||
Setting["feature.budgets"] = true
|
||||
end
|
||||
|
||||
expect(page).to have_content('Maximum number of headings in which a user can vote 1 of 3')
|
||||
scenario "Disabled with a feature flag" do
|
||||
expect { visit admin_budget_groups_path(budget) }.to raise_exception(FeatureFlags::FeatureDisabled)
|
||||
end
|
||||
|
||||
within("#budget_group_#{group.id}") do
|
||||
click_link 'Edit group'
|
||||
end
|
||||
|
||||
expect(page).to have_select('budget_group_max_votable_headings', selected: '1')
|
||||
context "Index" do
|
||||
|
||||
scenario "Displaying no groups for budget" do
|
||||
visit admin_budget_groups_path(budget)
|
||||
|
||||
expect(page).to have_content "No groups created yet. Each user will be able to vote in only one heading per group."
|
||||
end
|
||||
|
||||
scenario "Displaying groups" do
|
||||
group1 = create(:budget_group, budget: budget)
|
||||
|
||||
group2 = create(:budget_group, budget: budget)
|
||||
create(:budget_heading, group: group2)
|
||||
|
||||
group3 = create(:budget_group, budget: budget, max_votable_headings: 2)
|
||||
3.times { create(:budget_heading, group: group3) }
|
||||
|
||||
visit admin_budget_groups_path(budget)
|
||||
expect(page).to have_content "There are 3 groups"
|
||||
|
||||
within "#budget_group_#{group1.id}" do
|
||||
expect(page).to have_content(group1.name)
|
||||
expect(page).to have_content(group1.max_votable_headings)
|
||||
expect(page).to have_content(group1.headings.count)
|
||||
expect(page).to have_link "Manage headings", href: admin_budget_group_headings_path(budget, group1)
|
||||
end
|
||||
|
||||
within "#budget_group_#{group2.id}" do
|
||||
expect(page).to have_content(group2.name)
|
||||
expect(page).to have_content(group2.max_votable_headings)
|
||||
expect(page).to have_content(group2.headings.count)
|
||||
expect(page).to have_link "Manage headings", href: admin_budget_group_headings_path(budget, group2)
|
||||
end
|
||||
|
||||
within "#budget_group_#{group3.id}" do
|
||||
expect(page).to have_content(group3.name)
|
||||
expect(page).to have_content(group3.max_votable_headings)
|
||||
expect(page).to have_content(group3.headings.count)
|
||||
expect(page).to have_link "Manage headings", href: admin_budget_group_headings_path(budget, group3)
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Update", :js do
|
||||
visit admin_budget_path(group.budget)
|
||||
scenario "Delete a group without headings" do
|
||||
group = create(:budget_group, budget: budget)
|
||||
|
||||
within("#budget_group_#{group.id}") do
|
||||
click_link 'Edit group'
|
||||
visit admin_budget_groups_path(budget)
|
||||
within("#budget_group_#{group.id}") { click_link "Delete" }
|
||||
|
||||
select '2', from: 'budget_group_max_votable_headings'
|
||||
click_button 'Save group'
|
||||
end
|
||||
|
||||
expect(page).to have_content('Maximum number of headings in which a user can vote 2 of 3')
|
||||
|
||||
within("#budget_group_#{group.id}") do
|
||||
click_link 'Edit group'
|
||||
|
||||
expect(page).to have_select('budget_group_max_votable_headings', selected: '2')
|
||||
end
|
||||
expect(page).to have_content "Group deleted successfully"
|
||||
expect(page).not_to have_selector "#budget_group_#{group.id}"
|
||||
end
|
||||
|
||||
scenario "Do not display maximum votable headings' select in new form", :js do
|
||||
visit admin_budget_path(group.budget)
|
||||
scenario "Try to delete a group with headings" do
|
||||
group = create(:budget_group, budget: budget)
|
||||
create(:budget_heading, group: group)
|
||||
|
||||
click_link 'Add new group'
|
||||
visit admin_budget_groups_path(budget)
|
||||
within("#budget_group_#{group.id}") { click_link "Delete" }
|
||||
|
||||
expect(page).to have_field('budget_group_name')
|
||||
expect(page).not_to have_field('budget_group_max_votable_headings')
|
||||
expect(page).to have_content "You cannot destroy a Group that has associated headings"
|
||||
expect(page).to have_selector "#budget_group_#{group.id}"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "New" do
|
||||
|
||||
scenario "Create group" do
|
||||
visit admin_budget_groups_path(budget)
|
||||
click_link "Create new group"
|
||||
|
||||
fill_in "Group name", with: "All City"
|
||||
|
||||
click_button "Create new group"
|
||||
|
||||
expect(page).to have_content "Group created successfully!"
|
||||
expect(page).to have_link "All City"
|
||||
end
|
||||
|
||||
scenario "Maximum number of headings in which a user can vote is set to 1 by default" do
|
||||
visit new_admin_budget_group_path(budget)
|
||||
fill_in "Group name", with: "All City"
|
||||
|
||||
click_button "Create new group"
|
||||
|
||||
expect(page).to have_content "Group created successfully!"
|
||||
expect(Budget::Group.first.max_votable_headings).to be 1
|
||||
end
|
||||
|
||||
scenario "Group name is mandatory" do
|
||||
visit new_admin_budget_group_path(budget)
|
||||
click_button "Create new group"
|
||||
|
||||
expect(page).not_to have_content "Group created successfully!"
|
||||
expect(page).to have_css("label.error", text: "Group name")
|
||||
expect(page).to have_content "can't be blank"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "Edit" do
|
||||
|
||||
scenario "Show group information" do
|
||||
group = create(:budget_group, budget: budget, max_votable_headings: 2)
|
||||
2.times { create(:budget_heading, group: group) }
|
||||
|
||||
visit admin_budget_groups_path(budget)
|
||||
within("#budget_group_#{group.id}") { click_link "Edit" }
|
||||
|
||||
expect(page).to have_field "Group name", with: group.name
|
||||
expect(page).to have_field "Maximum number of headings in which a user can vote", with: "2"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "Update" do
|
||||
let!(:group) { create(:budget_group, budget: budget, name: "All City") }
|
||||
|
||||
scenario "Updates group" do
|
||||
2.times { create(:budget_heading, group: group) }
|
||||
|
||||
visit edit_admin_budget_group_path(budget, group)
|
||||
expect(page).to have_field "Group name", with: "All City"
|
||||
|
||||
fill_in "Group name", with: "Districts"
|
||||
select "2", from: "Maximum number of headings in which a user can vote"
|
||||
click_button "Edit group"
|
||||
|
||||
expect(page).to have_content "Group updated successfully"
|
||||
|
||||
visit edit_admin_budget_group_path(budget, group)
|
||||
expect(page).to have_field "Group name", with: "Districts"
|
||||
expect(page).to have_field "Maximum number of headings in which a user can vote", with: "2"
|
||||
end
|
||||
|
||||
scenario "Group name is already used" do
|
||||
create(:budget_group, budget: budget, name: "Districts")
|
||||
|
||||
visit edit_admin_budget_group_path(budget, group)
|
||||
expect(page).to have_field "Group name", with: "All City"
|
||||
|
||||
fill_in "Group name", with: "Districts"
|
||||
click_button "Edit group"
|
||||
|
||||
expect(page).not_to have_content "Group updated successfully"
|
||||
expect(page).to have_css("label.error", text: "Group name")
|
||||
expect(page).to have_content "has already been taken"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
208
spec/features/admin/budget_headings_spec.rb
Normal file
208
spec/features/admin/budget_headings_spec.rb
Normal file
@@ -0,0 +1,208 @@
|
||||
require 'rails_helper'
|
||||
|
||||
feature "Admin budget headings" do
|
||||
|
||||
let(:budget) { create(:budget, phase: "drafting") }
|
||||
let(:group) { create(:budget_group, budget: budget) }
|
||||
|
||||
background do
|
||||
admin = create(:administrator)
|
||||
login_as(admin.user)
|
||||
end
|
||||
|
||||
context "Feature flag" do
|
||||
|
||||
background do
|
||||
Setting["feature.budgets"] = nil
|
||||
end
|
||||
|
||||
after do
|
||||
Setting["feature.budgets"] = true
|
||||
end
|
||||
|
||||
scenario "Disabled with a feature flag" do
|
||||
expect { visit admin_budget_group_headings_path(budget, group) }.to raise_exception(FeatureFlags::FeatureDisabled)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "Index" do
|
||||
|
||||
scenario "Displaying no headings for group" do
|
||||
visit admin_budget_group_headings_path(budget, group)
|
||||
|
||||
expect(page).to have_content "No headings created yet. Each user will be able to vote in only one heading per group."
|
||||
end
|
||||
|
||||
scenario "Displaying headings" do
|
||||
heading1 = create(:budget_heading, group: group, price: 1000, allow_custom_content: true)
|
||||
heading2 = create(:budget_heading, group: group, price: 2000, population: 10000)
|
||||
heading3 = create(:budget_heading, group: group, price: 3000, population: 10000)
|
||||
|
||||
visit admin_budget_group_headings_path(budget, group)
|
||||
expect(page).to have_content "There are 3 headings"
|
||||
|
||||
within "#budget_heading_#{heading1.id}" do
|
||||
expect(page).to have_content(heading1.name)
|
||||
expect(page).to have_content "€1,000"
|
||||
expect(page).not_to have_content "10000"
|
||||
expect(page).to have_content "Yes"
|
||||
expect(page).to have_link "Edit", href: edit_admin_budget_group_heading_path(budget, group, heading1)
|
||||
expect(page).to have_link "Delete", href: admin_budget_group_heading_path(budget, group, heading1)
|
||||
end
|
||||
|
||||
within "#budget_heading_#{heading2.id}" do
|
||||
expect(page).to have_content(heading2.name)
|
||||
expect(page).to have_content "€2,000"
|
||||
expect(page).to have_content "10000"
|
||||
expect(page).to have_content "No"
|
||||
expect(page).to have_link "Edit", href: edit_admin_budget_group_heading_path(budget, group, heading2)
|
||||
expect(page).to have_link "Delete", href: admin_budget_group_heading_path(budget, group, heading2)
|
||||
end
|
||||
|
||||
within "#budget_heading_#{heading3.id}" do
|
||||
expect(page).to have_content(heading3.name)
|
||||
expect(page).to have_content "€3,000"
|
||||
expect(page).to have_content "10000"
|
||||
expect(page).to have_content "No"
|
||||
expect(page).to have_link "Edit", href: edit_admin_budget_group_heading_path(budget, group, heading3)
|
||||
expect(page).to have_link "Delete", href: admin_budget_group_heading_path(budget, group, heading3)
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Delete a heading without investments" do
|
||||
heading = create(:budget_heading, group: group)
|
||||
|
||||
visit admin_budget_group_headings_path(budget, group)
|
||||
within("#budget_heading_#{heading.id}") { click_link "Delete" }
|
||||
|
||||
expect(page).to have_content "Heading deleted successfully"
|
||||
expect(page).not_to have_selector "#budget_heading_#{heading.id}"
|
||||
end
|
||||
|
||||
scenario "Try to delete a heading with investments" do
|
||||
heading = create(:budget_heading, group: group)
|
||||
investment = create(:budget_investment, heading: heading)
|
||||
|
||||
visit admin_budget_group_headings_path(budget, group)
|
||||
within("#budget_heading_#{heading.id}") { click_link "Delete" }
|
||||
|
||||
expect(page).to have_content "You cannot destroy a Heading that has associated investments"
|
||||
expect(page).to have_selector "#budget_heading_#{heading.id}"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "New" do
|
||||
|
||||
scenario "Create heading" do
|
||||
visit admin_budget_group_headings_path(budget, group)
|
||||
click_link "Create new heading"
|
||||
|
||||
fill_in "Heading name", with: "All City"
|
||||
fill_in "Amount", with: "1000"
|
||||
fill_in "Population (optional)", with: "10000"
|
||||
check "Allow content block"
|
||||
|
||||
click_button "Create new heading"
|
||||
|
||||
expect(page).to have_content "Heading created successfully!"
|
||||
expect(page).to have_link "All City"
|
||||
expect(page).to have_content "€1,000"
|
||||
expect(page).to have_content "10000"
|
||||
expect(page).to have_content "Yes"
|
||||
end
|
||||
|
||||
scenario "Heading name is mandatory" do
|
||||
visit new_admin_budget_group_heading_path(budget, group)
|
||||
click_button "Create new heading"
|
||||
|
||||
expect(page).not_to have_content "Heading created successfully!"
|
||||
expect(page).to have_css("label.error", text: "Heading name")
|
||||
expect(page).to have_content "can't be blank"
|
||||
end
|
||||
|
||||
scenario "Heading amount is mandatory" do
|
||||
visit new_admin_budget_group_heading_path(budget, group)
|
||||
click_button "Create new heading"
|
||||
|
||||
expect(page).not_to have_content "Heading created successfully!"
|
||||
expect(page).to have_css("label.error", text: "Amount")
|
||||
expect(page).to have_content "can't be blank"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "Edit" do
|
||||
|
||||
scenario "Show heading information" do
|
||||
heading = create(:budget_heading, group: group)
|
||||
|
||||
visit admin_budget_group_headings_path(budget, group)
|
||||
within("#budget_heading_#{heading.id}") { click_link "Edit" }
|
||||
|
||||
expect(page).to have_field "Heading name", with: heading.name
|
||||
expect(page).to have_field "Amount", with: heading.price
|
||||
expect(page).to have_field "Population (optional)", with: heading.population
|
||||
expect(page).to have_field "Longitude", with: heading.longitude
|
||||
expect(page).to have_field "Latitude", with: heading.latitude
|
||||
expect(find_field("Allow content block")).not_to be_checked
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "Update" do
|
||||
let(:heading) { create(:budget_heading,
|
||||
group: group,
|
||||
name: "All City",
|
||||
price: 1000,
|
||||
population: 10000,
|
||||
longitude: 20.50,
|
||||
latitude: -10.50,
|
||||
allow_custom_content: true) }
|
||||
|
||||
scenario "Updates group" do
|
||||
visit edit_admin_budget_group_heading_path(budget, group, heading)
|
||||
|
||||
expect(page).to have_field "Heading name", with: "All City"
|
||||
expect(page).to have_field "Amount", with: 1000
|
||||
expect(page).to have_field "Population (optional)", with: 10000
|
||||
expect(page).to have_field "Longitude", with: 20.50
|
||||
expect(page).to have_field "Latitude", with: -10.50
|
||||
expect(find_field("Allow content block")).to be_checked
|
||||
|
||||
fill_in "Heading name", with: "Districts"
|
||||
fill_in "Amount", with: "2000"
|
||||
fill_in "Population (optional)", with: "20000"
|
||||
fill_in "Longitude", with: "-40.47"
|
||||
fill_in "Latitude", with: "25.25"
|
||||
uncheck "Allow content block"
|
||||
click_button "Edit heading"
|
||||
|
||||
expect(page).to have_content "Heading updated successfully"
|
||||
|
||||
visit edit_admin_budget_group_heading_path(budget, group, heading)
|
||||
expect(page).to have_field "Heading name", with: "Districts"
|
||||
expect(page).to have_field "Amount", with: 2000
|
||||
expect(page).to have_field "Population (optional)", with: 20000
|
||||
expect(page).to have_field "Longitude", with: -40.47
|
||||
expect(page).to have_field "Latitude", with: 25.25
|
||||
expect(find_field("Allow content block")).not_to be_checked
|
||||
end
|
||||
|
||||
scenario "Heading name is already used" do
|
||||
create(:budget_heading, group: group, name: "Districts")
|
||||
|
||||
visit edit_admin_budget_group_heading_path(budget, group, heading)
|
||||
expect(page).to have_field "Heading name", with: "All City"
|
||||
|
||||
fill_in "Heading name", with: "Districts"
|
||||
click_button "Edit heading"
|
||||
|
||||
expect(page).not_to have_content "Heading updated successfully"
|
||||
expect(page).to have_css("label.error", text: "Heading name")
|
||||
expect(page).to have_content "has already been taken"
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@@ -227,109 +227,6 @@ feature 'Admin budgets' do
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context 'Manage groups and headings' do
|
||||
|
||||
scenario 'Create group', :js do
|
||||
budget = create(:budget, name: 'Yearly budget')
|
||||
|
||||
visit admin_budgets_path
|
||||
|
||||
within("#budget_#{budget.id}") do
|
||||
click_link 'Edit headings groups'
|
||||
end
|
||||
|
||||
expect(page).to have_content '0 Groups of budget headings'
|
||||
expect(page).to have_content 'No groups created yet.'
|
||||
|
||||
click_link 'Add new group'
|
||||
|
||||
fill_in 'budget_group_name', with: 'Health'
|
||||
click_button 'Create group'
|
||||
|
||||
expect(page).to have_content '1 Group of budget headings'
|
||||
expect(page).to have_content 'Health'
|
||||
expect(page).to have_content 'Yearly budget'
|
||||
expect(page).not_to have_content 'No groups created yet.'
|
||||
|
||||
visit admin_budgets_path
|
||||
within("#budget_#{budget.id}") do
|
||||
click_link 'Edit headings groups'
|
||||
end
|
||||
|
||||
expect(page).to have_content '1 Group of budget headings'
|
||||
expect(page).to have_content 'Health'
|
||||
expect(page).to have_content 'Yearly budget'
|
||||
expect(page).not_to have_content 'No groups created yet.'
|
||||
end
|
||||
|
||||
scenario 'Create heading', :js do
|
||||
budget = create(:budget, name: 'Yearly budget')
|
||||
group = create(:budget_group, budget: budget, name: 'Districts improvments')
|
||||
|
||||
visit admin_budget_path(budget)
|
||||
|
||||
within("#budget_group_#{group.id}") do
|
||||
expect(page).to have_content 'This group has no assigned heading.'
|
||||
click_link 'Add heading'
|
||||
|
||||
fill_in 'budget_heading_name', with: 'District 9 reconstruction'
|
||||
fill_in 'budget_heading_price', with: '6785'
|
||||
fill_in 'budget_heading_population', with: '100500'
|
||||
fill_in 'budget_heading_latitude', with: '40.416775'
|
||||
fill_in 'budget_heading_longitude', with: '-3.703790'
|
||||
click_button 'Save heading'
|
||||
end
|
||||
|
||||
visit admin_budget_path(budget)
|
||||
|
||||
within("#budget_group_#{group.id}") do
|
||||
expect(page).not_to have_content 'This group has no assigned heading.'
|
||||
expect(page).to have_content 'District 9 reconstruction'
|
||||
expect(page).to have_content '€6,785'
|
||||
expect(page).to have_content '100500'
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'Update heading', :js do
|
||||
budget = create(:budget, name: 'Yearly budget')
|
||||
group = create(:budget_group, budget: budget, name: 'Districts improvments')
|
||||
heading = create(:budget_heading, group: group, name: "District 1")
|
||||
heading = create(:budget_heading, group: group, name: "District 3")
|
||||
|
||||
visit admin_budget_path(budget)
|
||||
|
||||
within("#heading-#{heading.id}") do
|
||||
click_link 'Edit'
|
||||
|
||||
fill_in 'budget_heading_name', with: 'District 2'
|
||||
fill_in 'budget_heading_price', with: '10000'
|
||||
fill_in 'budget_heading_population', with: '6000'
|
||||
click_button 'Save heading'
|
||||
end
|
||||
|
||||
expect(page).to have_content 'District 2'
|
||||
expect(page).to have_content '€10,000'
|
||||
expect(page).to have_content '6000'
|
||||
end
|
||||
|
||||
scenario 'Delete heading', :js do
|
||||
budget = create(:budget, name: 'Yearly budget')
|
||||
group = create(:budget_group, budget: budget, name: 'Districts improvments')
|
||||
heading = create(:budget_heading, group: group, name: "District 1")
|
||||
|
||||
visit admin_budget_path(budget)
|
||||
|
||||
expect(page).to have_content 'District 1'
|
||||
|
||||
within("#heading-#{heading.id}") do
|
||||
click_link 'Delete'
|
||||
end
|
||||
|
||||
expect(page).not_to have_content 'District 1'
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
def translated_phase_name(phase_kind: kind)
|
||||
|
||||
@@ -161,6 +161,34 @@ feature 'Ballots' do
|
||||
end
|
||||
end
|
||||
|
||||
scenario "the Map shoud be visible before and after", :js do
|
||||
investment = create(:budget_investment, :selected, heading: new_york, price: 10000)
|
||||
|
||||
visit budget_path(budget)
|
||||
click_link "States"
|
||||
click_link "New York"
|
||||
|
||||
within("#sidebar") do
|
||||
expect(page).to have_content "OpenStreetMap"
|
||||
end
|
||||
|
||||
add_to_ballot(investment)
|
||||
|
||||
within("#sidebar") do
|
||||
expect(page).to have_content investment.title
|
||||
expect(page).to have_content "OpenStreetMap"
|
||||
end
|
||||
|
||||
within("#budget_investment_#{investment.id}") do
|
||||
click_link "Remove vote"
|
||||
end
|
||||
|
||||
within("#sidebar") do
|
||||
expect(page).not_to have_content investment.title
|
||||
expect(page).to have_content "OpenStreetMap"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
#Break up or simplify with helpers
|
||||
|
||||
Reference in New Issue
Block a user