Create less records in budget stats specs
Creating only the necessary data for each test makes tests easier to read. It also makes tests slightly faster.
This commit is contained in:
@@ -10,6 +10,10 @@ class Budget::Stats
|
|||||||
total_participants_web total_participants_booths]
|
total_participants_web total_participants_booths]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def participants
|
||||||
|
User.where(id: (authors + voters + balloters + poll_ballot_voters).uniq.compact)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def total_participants
|
def total_participants
|
||||||
@@ -52,10 +56,6 @@ class Budget::Stats
|
|||||||
supports(budget).count
|
supports(budget).count
|
||||||
end
|
end
|
||||||
|
|
||||||
def participants
|
|
||||||
User.where(id: (authors + voters + balloters + poll_ballot_voters).uniq.compact)
|
|
||||||
end
|
|
||||||
|
|
||||||
def authors
|
def authors
|
||||||
budget.investments.pluck(:author_id)
|
budget.investments.pluck(:author_id)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ FactoryBot.define do
|
|||||||
transient { user nil }
|
transient { user nil }
|
||||||
|
|
||||||
ballot do
|
ballot do
|
||||||
association :budget_ballot, budget: investment.budget, user: user || association(:user)
|
association :budget_ballot, budget: investment.budget.reload, user: user || association(:user)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,206 +1,225 @@
|
|||||||
require "rails_helper"
|
require "rails_helper"
|
||||||
|
|
||||||
describe Budget::Stats do
|
describe Budget::Stats do
|
||||||
|
let(:budget) { create(:budget) }
|
||||||
|
let(:stats) { Budget::Stats.new(budget) }
|
||||||
|
let(:investment) { create(:budget_investment, :selected, budget: budget) }
|
||||||
|
|
||||||
|
describe "#participants" do
|
||||||
|
let(:author) { investment.author }
|
||||||
|
let(:author_and_voter) { create(:user) }
|
||||||
|
let(:voter) { create(:user) }
|
||||||
|
let(:voter_and_balloter) { create(:user) }
|
||||||
|
let(:balloter) { create(:user) }
|
||||||
|
let(:poll_balloter) { create(:user, :level_two) }
|
||||||
|
let(:non_participant) { create(:user, :level_two) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
@budget = create(:budget)
|
create(:budget_investment, :selected, budget: budget, author: author_and_voter)
|
||||||
@heading = create(:budget_heading, budget: @budget, price: 1000)
|
|
||||||
|
|
||||||
@investment1 = create(:budget_investment, :selected, author: create(:user, gender: "female"),
|
create(:vote, votable: investment, voter: author_and_voter)
|
||||||
heading: @heading, price: 200, ballot_lines_count: 900, winner: true)
|
create(:vote, votable: investment, voter: voter)
|
||||||
@investment2 = create(:budget_investment, :selected, author: create(:user, gender: "female"),
|
create(:vote, votable: investment, voter: voter_and_balloter)
|
||||||
heading: @heading, price: 300, ballot_lines_count: 800, winner: true)
|
|
||||||
@investment3 = create(:budget_investment, :selected, author: create(:user, gender: "female",
|
|
||||||
date_of_birth: 40.years.ago), heading: @heading, price: 400,
|
|
||||||
ballot_lines_count: 880, winner: true)
|
|
||||||
@investment4 = create(:budget_investment, :selected, author: create(:user, gender: "male"),
|
|
||||||
heading: @heading, price: 100, ballot_lines_count: 915, winner: true)
|
|
||||||
@investment5 = create(:budget_investment, :unfeasible, author: create(:user, gender: "male",
|
|
||||||
date_of_birth: 25.years.ago), heading: @heading)
|
|
||||||
|
|
||||||
@support1 = create(:vote, votable: @investment1, voter: create(:user, gender: "male"))
|
create(:budget_ballot_line, investment: investment, user: balloter)
|
||||||
@support2 = create(:vote, votable: @investment2, voter: create(:user))
|
create(:budget_ballot_line, investment: investment, user: voter_and_balloter)
|
||||||
|
|
||||||
@budget_ballot_line1 = create(:budget_ballot_line,
|
create(:poll_voter, :from_booth, user: poll_balloter, budget: budget)
|
||||||
user: create(:user, gender: "female", date_of_birth: 54.years.ago),
|
|
||||||
investment: @investment1)
|
|
||||||
@budget_ballot_line2 = create(:budget_ballot_line, user: create(:user, gender: "female"),
|
|
||||||
investment: @investment2)
|
|
||||||
@budget_ballot_line3 = create(:budget_ballot_line, user: create(:user, gender: "male"),
|
|
||||||
investment: @investment3)
|
|
||||||
|
|
||||||
@poll_voter = create(:poll_voter, :from_booth, budget: @budget)
|
create(:poll_voter, :from_booth, user: non_participant, budget: create(:budget))
|
||||||
|
|
||||||
@budget_ballot4 = create(:budget_ballot, budget: @budget, physical: true, user: nil)
|
|
||||||
@budget_ballot_line4 = create(:budget_ballot_line, ballot: @budget_ballot4,
|
|
||||||
investment: @investment4)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:stats) { Budget::Stats.new(@budget).generate }
|
it "returns unique participants, including authors" do
|
||||||
|
expect(stats.participants).to match_array(
|
||||||
context "#total_participants" do
|
[author, author_and_voter, voter, voter_and_balloter, balloter, poll_balloter]
|
||||||
|
)
|
||||||
it "returns the number of total participants" do
|
expect(stats.generate[:total_participants]).to be 6
|
||||||
expect(stats[:total_participants]).to be 11
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
describe "#total_participants_support_phase" do
|
||||||
|
|
||||||
context "#total_participants_support_phase" do
|
|
||||||
|
|
||||||
it "returns the number of total participants in the support phase" do
|
it "returns the number of total participants in the support phase" do
|
||||||
expect(stats[:total_participants_support_phase]).to be 2
|
2.times { create(:vote, votable: investment) }
|
||||||
|
create(:budget_ballot_line, investment: investment)
|
||||||
|
|
||||||
|
expect(stats.generate[:total_participants_support_phase]).to be 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "counts a user who is voter and balloter" do
|
||||||
|
voter_and_balloter = create(:user)
|
||||||
|
create(:vote, votable: investment, voter: voter_and_balloter)
|
||||||
|
create(:budget_ballot_line, investment: investment, user: voter_and_balloter)
|
||||||
|
|
||||||
|
expect(stats.generate[:total_participants_support_phase]).to be 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "#total_participants_vote_phase" do
|
describe "#total_participants_vote_phase" do
|
||||||
|
|
||||||
it "returns the number of total participants in the votes phase" do
|
it "returns the number of total participants in the votes phase" do
|
||||||
expect(stats[:total_participants_vote_phase]).to be 4
|
2.times { create(:budget_ballot_line, investment: investment) }
|
||||||
|
create(:vote, votable: investment)
|
||||||
|
|
||||||
|
expect(stats.generate[:total_participants_vote_phase]).to be 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "counts a user who is voter and balloter" do
|
||||||
|
voter_and_balloter = create(:user)
|
||||||
|
create(:vote, votable: investment, voter: voter_and_balloter)
|
||||||
|
create(:budget_ballot_line, investment: investment, user: voter_and_balloter)
|
||||||
|
|
||||||
|
expect(stats.generate[:total_participants_vote_phase]).to be 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "#total_participants_web" do
|
describe "#total_participants_web" do
|
||||||
|
|
||||||
it "returns the number of total participants in the votes phase via web" do
|
it "returns the number of total participants in the votes phase via web" do
|
||||||
expect(stats[:total_participants_web]).to be 3
|
2.times { create(:budget_ballot_line, investment: investment) }
|
||||||
|
create(:poll_voter, :from_booth, budget: budget)
|
||||||
|
|
||||||
|
expect(stats.generate[:total_participants_web]).to be 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
describe "#total_participants_booths" do
|
||||||
|
|
||||||
context "#total_participants_booths" do
|
|
||||||
|
|
||||||
it "returns the number of total participants in the votes phase in booths" do
|
it "returns the number of total participants in the votes phase in booths" do
|
||||||
expect(stats[:total_participants_booths]).to be 1
|
2.times { create(:poll_voter, :from_booth, budget: budget) }
|
||||||
|
create(:budget_ballot_line, investment: investment)
|
||||||
|
|
||||||
|
expect(stats.generate[:total_participants_booths]).to be 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
describe "#total_budget_investments" do
|
||||||
|
|
||||||
context "#total_budget_investments" do
|
|
||||||
|
|
||||||
it "returns the number of total budget investments" do
|
it "returns the number of total budget investments" do
|
||||||
expect(stats[:total_budget_investments]).to be 5
|
2.times { create(:budget_investment, budget: budget) }
|
||||||
|
create(:budget_investment, budget: create(:budget))
|
||||||
|
|
||||||
|
expect(stats.generate[:total_budget_investments]).to be 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
describe "#total_votes" do
|
||||||
|
|
||||||
context "#total_votes" do
|
|
||||||
|
|
||||||
it "returns the number of total votes" do
|
it "returns the number of total votes" do
|
||||||
expect(stats[:total_votes]).to be 4
|
create(:budget_ballot_line, investment: investment)
|
||||||
|
create(:budget_ballot_line, investment: create(:budget_investment, :selected, budget: budget))
|
||||||
|
|
||||||
|
expect(stats.generate[:total_votes]).to be 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
describe "#total_selected_investments" do
|
||||||
|
|
||||||
context "#total_selected_investments" do
|
|
||||||
|
|
||||||
it "returns the number of total selected investments" do
|
it "returns the number of total selected investments" do
|
||||||
expect(stats[:total_selected_investments]).to be 4
|
3.times { create(:budget_investment, :selected, budget: budget) }
|
||||||
|
create(:budget_investment, :selected, budget: create(:budget))
|
||||||
|
create(:budget_investment, :unfeasible, budget: budget)
|
||||||
|
|
||||||
|
expect(stats.generate[:total_selected_investments]).to be 3
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
describe "#total_unfeasible_investments" do
|
||||||
|
|
||||||
context "#total_unfeasible_investments" do
|
|
||||||
|
|
||||||
it "returns the number of total unfeasible investments" do
|
it "returns the number of total unfeasible investments" do
|
||||||
expect(stats[:total_unfeasible_investments]).to be 1
|
3.times { create(:budget_investment, :unfeasible, budget: budget) }
|
||||||
|
create(:budget_investment, :unfeasible, budget: create(:budget))
|
||||||
|
create(:budget_investment, :selected, budget: budget)
|
||||||
|
|
||||||
|
expect(stats.generate[:total_unfeasible_investments]).to be 3
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
describe "#total_supports" do
|
||||||
|
|
||||||
context "#total_male_participants" do
|
|
||||||
|
|
||||||
it "returns the number of total male participants" do
|
|
||||||
expect(stats[:total_male_participants]).to be 4
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
context "#total_female_participants" do
|
|
||||||
|
|
||||||
it "returns the number of total female participants" do
|
|
||||||
expect(stats[:total_female_participants]).to be 6
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
context "#total_supports" do
|
|
||||||
|
|
||||||
it "returns the number of total supports" do
|
it "returns the number of total supports" do
|
||||||
expect(stats[:total_supports]).to be 2
|
2.times { create(:vote, votable: investment) }
|
||||||
|
|
||||||
|
expect(stats.generate[:total_supports]).to be 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "Participants by gender" do
|
||||||
|
before do
|
||||||
|
3.times { create(:user, gender: "male") }
|
||||||
|
2.times { create(:user, gender: "female") }
|
||||||
|
create(:user, gender: nil)
|
||||||
|
|
||||||
|
allow(stats).to receive(:participants).and_return(User.all)
|
||||||
end
|
end
|
||||||
|
|
||||||
context "#total_unknown_gender_or_age" do
|
describe "#total_male_participants" do
|
||||||
|
it "returns the number of total male participants" do
|
||||||
|
expect(stats.generate[:total_male_participants]).to be 3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#total_female_participants" do
|
||||||
|
it "returns the number of total female participants" do
|
||||||
|
expect(stats.generate[:total_female_participants]).to be 2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#total_unknown_gender_or_age" do
|
||||||
it "returns the number of total unknown participants' gender or age" do
|
it "returns the number of total unknown participants' gender or age" do
|
||||||
expect(stats[:total_unknown_gender_or_age]).to be 1
|
expect(stats.generate[:total_unknown_gender_or_age]).to be 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#male_percentage" do
|
||||||
|
it "returns the percentage of male participants" do
|
||||||
|
expect(stats.generate[:male_percentage]).to be 60.0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "#participants_by_age" do
|
describe "#female_percentage" do
|
||||||
|
it "returns the percentage of female participants" do
|
||||||
|
expect(stats.generate[:female_percentage]).to be 40.0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#participants_by_age" do
|
||||||
|
before do
|
||||||
|
[21, 22, 23, 23, 34, 42, 43, 44, 50, 51].each do |age|
|
||||||
|
create(:user, date_of_birth: age.years.ago)
|
||||||
|
end
|
||||||
|
|
||||||
|
allow(stats).to receive(:participants).and_return(User.all)
|
||||||
|
end
|
||||||
|
|
||||||
it "returns the age groups hash" do
|
it "returns the age groups hash" do
|
||||||
expect(stats[:participants_by_age]["16 - 19"][:count]).to be 0
|
expect(stats.generate[:participants_by_age]["16 - 19"][:count]).to be 0
|
||||||
expect(stats[:participants_by_age]["20 - 24"][:count]).to be 7
|
expect(stats.generate[:participants_by_age]["20 - 24"][:count]).to be 4
|
||||||
expect(stats[:participants_by_age]["25 - 29"][:count]).to be 1
|
expect(stats.generate[:participants_by_age]["25 - 29"][:count]).to be 0
|
||||||
expect(stats[:participants_by_age]["30 - 34"][:count]).to be 0
|
expect(stats.generate[:participants_by_age]["30 - 34"][:count]).to be 1
|
||||||
expect(stats[:participants_by_age]["35 - 39"][:count]).to be 1
|
expect(stats.generate[:participants_by_age]["35 - 39"][:count]).to be 0
|
||||||
expect(stats[:participants_by_age]["40 - 44"][:count]).to be 1
|
expect(stats.generate[:participants_by_age]["40 - 44"][:count]).to be 3
|
||||||
expect(stats[:participants_by_age]["45 - 49"][:count]).to be 0
|
expect(stats.generate[:participants_by_age]["45 - 49"][:count]).to be 0
|
||||||
expect(stats[:participants_by_age]["50 - 54"][:count]).to be 1
|
expect(stats.generate[:participants_by_age]["50 - 54"][:count]).to be 2
|
||||||
expect(stats[:participants_by_age]["55 - 59"][:count]).to be 0
|
expect(stats.generate[:participants_by_age]["55 - 59"][:count]).to be 0
|
||||||
expect(stats[:participants_by_age]["60 - 64"][:count]).to be 0
|
expect(stats.generate[:participants_by_age]["60 - 64"][:count]).to be 0
|
||||||
expect(stats[:participants_by_age]["65 - 69"][:count]).to be 0
|
expect(stats.generate[:participants_by_age]["65 - 69"][:count]).to be 0
|
||||||
expect(stats[:participants_by_age]["70 - 74"][:count]).to be 0
|
expect(stats.generate[:participants_by_age]["70 - 74"][:count]).to be 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#headings" do
|
||||||
|
before do
|
||||||
|
investment.heading.update_column(:population, 1234)
|
||||||
|
create(:budget_investment, heading: investment.heading)
|
||||||
|
2.times { create(:vote, votable: investment) }
|
||||||
|
create(:budget_ballot_line, investment: investment)
|
||||||
end
|
end
|
||||||
|
|
||||||
context "#male_percentage" do
|
|
||||||
|
|
||||||
it "returns the percentage of male participants" do
|
|
||||||
expect(stats[:male_percentage]).to be 40.0
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
context "#female_percentage" do
|
|
||||||
|
|
||||||
it "returns the percentage of female participants" do
|
|
||||||
expect(stats[:female_percentage]).to be 60.0
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
context "#headings" do
|
|
||||||
|
|
||||||
it "returns headings data" do
|
it "returns headings data" do
|
||||||
heading_stats = stats[:headings][@heading.id]
|
heading_stats = stats.generate[:headings][investment.heading.id]
|
||||||
expect(heading_stats[:total_investments_count]).to be 5
|
expect(heading_stats[:total_investments_count]).to be 2
|
||||||
expect(heading_stats[:total_participants_support_phase]).to be 2
|
expect(heading_stats[:total_participants_support_phase]).to be 2
|
||||||
expect(heading_stats[:total_participants_vote_phase]).to be 4
|
expect(heading_stats[:total_participants_vote_phase]).to be 1
|
||||||
expect(heading_stats[:total_participants_all_phase]).to be 6
|
expect(heading_stats[:total_participants_all_phase]).to be 3
|
||||||
expect(heading_stats[:percentage_participants_support_phase]).to be 100.0
|
expect(heading_stats[:percentage_participants_support_phase]).to be 100.0
|
||||||
expect(heading_stats[:percentage_district_population_support_phase]).to be 0.162
|
expect(heading_stats[:percentage_district_population_support_phase]).to be 0.162
|
||||||
expect(heading_stats[:percentage_participants_vote_phase]).to be 100.0
|
expect(heading_stats[:percentage_participants_vote_phase]).to be 100.0
|
||||||
expect(heading_stats[:percentage_district_population_vote_phase]).to be 0.324
|
expect(heading_stats[:percentage_district_population_vote_phase]).to be 0.081
|
||||||
expect(heading_stats[:percentage_participants_all_phase]).to be 100.0
|
|
||||||
expect(heading_stats[:percentage_district_population_all_phase]).to be 0.486
|
|
||||||
|
|
||||||
expect(heading_stats[:total_investments_count]).to be 5
|
|
||||||
expect(heading_stats[:total_participants_support_phase]).to be 2
|
|
||||||
expect(heading_stats[:total_participants_vote_phase]).to be 4
|
|
||||||
expect(heading_stats[:total_participants_all_phase]).to be 6
|
|
||||||
expect(heading_stats[:percentage_participants_support_phase]).to be 100.0
|
|
||||||
expect(heading_stats[:percentage_participants_vote_phase]).to be 100.0
|
|
||||||
expect(heading_stats[:percentage_participants_all_phase]).to be 100.0
|
expect(heading_stats[:percentage_participants_all_phase]).to be 100.0
|
||||||
|
expect(heading_stats[:percentage_district_population_all_phase]).to be 0.243
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user