Why: * Slug must be unique among: 1. Budget slug: among other budgets 2. Group slug: among other groups from its budget 3. Heading slug: among other headings from all the groups from its budget How: * Adding checks for all possible scenarios on each model specs
149 lines
3.9 KiB
Ruby
149 lines
3.9 KiB
Ruby
require 'rails_helper'
|
|
|
|
describe Budget do
|
|
|
|
it_behaves_like "sluggable"
|
|
|
|
describe "name" do
|
|
before do
|
|
create(:budget, name: 'object name')
|
|
end
|
|
|
|
it "is validated for uniqueness" do
|
|
expect(build(:budget, name: 'object name')).not_to be_valid
|
|
end
|
|
end
|
|
|
|
describe "description" do
|
|
it "changes depending on the phase" do
|
|
budget = create(:budget)
|
|
|
|
Budget::PHASES.each do |phase|
|
|
budget.phase = phase
|
|
expect(budget.description).to eq(budget.send("description_#{phase}"))
|
|
expect(budget.description).to be_html_safe
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "phase" do
|
|
let(:budget) { create(:budget) }
|
|
|
|
it "is validated" do
|
|
Budget::PHASES.each do |phase|
|
|
budget.phase = phase
|
|
expect(budget).to be_valid
|
|
end
|
|
|
|
budget.phase = 'inexisting'
|
|
expect(budget).to_not be_valid
|
|
end
|
|
|
|
it "produces auxiliary methods" do
|
|
budget.phase = "accepting"
|
|
expect(budget).to be_accepting
|
|
|
|
budget.phase = "reviewing"
|
|
expect(budget).to be_reviewing
|
|
|
|
budget.phase = "selecting"
|
|
expect(budget).to be_selecting
|
|
|
|
budget.phase = "valuating"
|
|
expect(budget).to be_valuating
|
|
|
|
budget.phase = "balloting"
|
|
expect(budget).to be_balloting
|
|
|
|
budget.phase = "reviewing_ballots"
|
|
expect(budget).to be_reviewing_ballots
|
|
|
|
budget.phase = "finished"
|
|
expect(budget).to be_finished
|
|
end
|
|
|
|
it "on_hold?" do
|
|
budget.phase = "accepting"
|
|
expect(budget).to_not be_on_hold
|
|
|
|
budget.phase = "reviewing"
|
|
expect(budget).to be_on_hold
|
|
|
|
budget.phase = "selecting"
|
|
expect(budget).to_not be_on_hold
|
|
|
|
budget.phase = "valuating"
|
|
expect(budget).to be_on_hold
|
|
|
|
budget.phase = "balloting"
|
|
expect(budget).to_not be_on_hold
|
|
|
|
budget.phase = "reviewing_ballots"
|
|
expect(budget).to be_on_hold
|
|
|
|
budget.phase = "finished"
|
|
expect(budget).to_not be_on_hold
|
|
end
|
|
|
|
it "balloting_or_later?" do
|
|
budget.phase = "accepting"
|
|
expect(budget).to_not be_balloting_or_later
|
|
|
|
budget.phase = "reviewing"
|
|
expect(budget).to_not be_balloting_or_later
|
|
|
|
budget.phase = "selecting"
|
|
expect(budget).to_not be_balloting_or_later
|
|
|
|
budget.phase = "valuating"
|
|
expect(budget).to_not be_balloting_or_later
|
|
|
|
budget.phase = "balloting"
|
|
expect(budget).to be_balloting_or_later
|
|
|
|
budget.phase = "reviewing_ballots"
|
|
expect(budget).to be_balloting_or_later
|
|
|
|
budget.phase = "finished"
|
|
expect(budget).to be_balloting_or_later
|
|
end
|
|
end
|
|
|
|
describe "heading_price" do
|
|
let(:budget) { create(:budget) }
|
|
let(:group) { create(:budget_group, budget: budget) }
|
|
|
|
it "returns the heading price if the heading provided is part of the budget" do
|
|
heading = create(:budget_heading, price: 100, group: group)
|
|
expect(budget.heading_price(heading)).to eq(100)
|
|
end
|
|
|
|
it "returns -1 if the heading provided is not part of the budget" do
|
|
expect(budget.heading_price(create(:budget_heading))).to eq(-1)
|
|
end
|
|
end
|
|
|
|
describe "investments_orders" do
|
|
let(:budget) { create(:budget) }
|
|
it "is random when accepting and reviewing" do
|
|
budget.phase = 'accepting'
|
|
expect(budget.investments_orders).to eq(['random'])
|
|
budget.phase = 'reviewing'
|
|
expect(budget.investments_orders).to eq(['random'])
|
|
end
|
|
it "is random and price when ballotting and reviewing ballots" do
|
|
budget.phase = 'balloting'
|
|
expect(budget.investments_orders).to eq(['random', 'price'])
|
|
budget.phase = 'reviewing_ballots'
|
|
expect(budget.investments_orders).to eq(['random', 'price'])
|
|
end
|
|
it "is random and confidence_score in all other cases" do
|
|
budget.phase = 'selecting'
|
|
expect(budget.investments_orders).to eq(['random', 'confidence_score'])
|
|
budget.phase = 'valuating'
|
|
expect(budget.investments_orders).to eq(['random', 'confidence_score'])
|
|
end
|
|
end
|
|
end
|
|
|