Merge pull request #3106 from consul/2918-crud_budget_groups_headings
Change CRUD for budget groups and headings
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)
|
||||
|
||||
Reference in New Issue
Block a user