Merge pull request #3106 from consul/2918-crud_budget_groups_headings

Change CRUD for budget groups and headings
This commit is contained in:
Julian Nicolas Herrero
2018-12-18 10:23:24 +01:00
committed by GitHub
50 changed files with 832 additions and 507 deletions

View File

@@ -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

View 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

View File

@@ -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)