Files
grecia/spec/models/poll/stats_spec.rb
Javi Martín 76c7827cf4 Use stats objects instead of hashes
It will make it far easier to call other methods on the stats object,
and we're already caching the methods.

We had to remove the view fragment caching because the stats object
isn't as easy to cache. The good thing about it is the view will
automatically be updated when we change logic regarding which stats to
show, and the methods taking long to execute are cached in the model.
2019-05-21 13:50:18 +02:00

187 lines
6.2 KiB
Ruby

require "rails_helper"
describe Poll::Stats do
let(:poll) { create(:poll) }
let(:stats) { Poll::Stats.new(poll) }
describe "total participants" do
before { allow(stats).to receive(:total_web_white).and_return(1) }
it "supports every channel" do
3.times { create(:poll_voter, :from_web, poll: poll) }
create(:poll_recount, :from_booth, poll: poll,
total_amount: 8, white_amount: 4, null_amount: 1)
expect(stats.total_participants_web).to eq(3)
expect(stats.total_participants_booth).to eq(13)
expect(stats.total_participants).to eq(16)
end
end
describe "#total_participants_booth" do
it "uses recounts even if there are discrepancies when recounting" do
create(:poll_recount, :from_booth, poll: poll, total_amount: 1)
2.times { create(:poll_voter, :from_booth, poll: poll) }
expect(stats.total_participants_booth).to eq(1)
end
end
describe "total participants percentage by channel" do
it "is relative to the total amount of participants" do
create(:poll_voter, :from_web, poll: poll)
create(:poll_recount, :from_booth, poll: poll, total_amount: 5)
expect(stats.total_participants_web_percentage).to eq(16.667)
expect(stats.total_participants_booth_percentage).to eq(83.333)
end
end
describe "#total_web_valid" do
before { allow(stats).to receive(:total_web_white).and_return(1) }
it "returns only valid votes" do
3.times { create(:poll_voter, :from_web, poll: poll) }
expect(stats.total_web_valid).to eq(2)
end
end
describe "#total_web_white" do
pending "Too complex to test"
end
describe "#total_web_null" do
it "returns 0" do
expect(stats.total_web_null).to eq(0)
end
end
describe "#total_booth_valid" do
it "sums the total amounts in the recounts" do
create(:poll_recount, :from_booth, poll: poll, total_amount: 3, white_amount: 1)
create(:poll_recount, :from_booth, poll: poll, total_amount: 4, null_amount: 2)
expect(stats.total_booth_valid).to eq(7)
end
end
describe "#total_booth_white" do
it "sums the white amounts in the recounts" do
create(:poll_recount, :from_booth, poll: poll, white_amount: 120, total_amount: 3)
create(:poll_recount, :from_booth, poll: poll, white_amount: 203, null_amount: 5)
expect(stats.total_booth_white).to eq(323)
end
end
describe "#total_booth_null" do
it "sums the null amounts in the recounts" do
create(:poll_recount, :from_booth, poll: poll, null_amount: 125, total_amount: 3)
create(:poll_recount, :from_booth, poll: poll, null_amount: 34, white_amount: 5)
expect(stats.total_booth_null).to eq(159)
end
end
describe "valid percentage by channel" do
it "is relative to the total amount of valid votes" do
create(:poll_recount, :from_booth, poll: poll, total_amount: 2)
create(:poll_voter, :from_web, poll: poll)
expect(stats.valid_percentage_web).to eq(33.333)
expect(stats.valid_percentage_booth).to eq(66.667)
end
end
describe "white percentage by channel" do
before { allow(stats).to receive(:total_web_white).and_return(10) }
it "is relative to the total amount of white votes" do
create(:poll_recount, :from_booth, poll: poll, white_amount: 70)
expect(stats.white_percentage_web).to eq(12.5)
expect(stats.white_percentage_booth).to eq(87.5)
end
end
describe "null percentage by channel" do
it "only accepts null votes from booth" do
create(:poll_recount, :from_booth, poll: poll, null_amount: 70)
expect(stats.null_percentage_web).to eq(0)
expect(stats.null_percentage_booth).to eq(100)
end
end
describe "#total_valid_votes" do
it "counts valid votes from every channel" do
2.times { create(:poll_voter, :from_web, poll: poll) }
create(:poll_recount, :from_booth, poll: poll, total_amount: 3, white_amount: 10)
create(:poll_recount, :from_booth, poll: poll, total_amount: 4, null_amount: 20)
expect(stats.total_valid_votes).to eq(9)
end
end
describe "#total_white_votes" do
before { allow(stats).to receive(:total_web_white).and_return(9) }
it "counts white votes on every channel" do
create(:poll_recount, :from_booth, poll: poll, white_amount: 12)
expect(stats.total_white_votes).to eq(21)
end
end
describe "#total_null_votes" do
it "only accepts null votes from booth" do
create(:poll_recount, :from_booth, poll: poll, null_amount: 32)
expect(stats.total_null_votes).to eq(32)
end
end
describe "total percentage by type" do
before { allow(stats).to receive(:total_web_white).and_return(1) }
it "is relative to the total amount of votes" do
3.times { create(:poll_voter, :from_web, poll: poll) }
create(:poll_recount, :from_booth, poll: poll,
total_amount: 8, white_amount: 5, null_amount: 4)
expect(stats.total_valid_percentage).to eq(50)
expect(stats.total_white_percentage).to eq(30)
expect(stats.total_null_percentage).to eq(20)
end
end
describe "#participants_by_geozone" do
it "groups by geozones in alphabetic order" do
%w[Oceania Eurasia Eastasia].each { |name| create(:geozone, name: name) }
expect(stats.participants_by_geozone.keys).to eq %w[Eastasia Eurasia Oceania]
end
it "calculates percentage relative to total participants" do
hobbiton = create(:geozone, name: "Hobbiton")
rivendel = create(:geozone, name: "Rivendel")
3.times { create :poll_voter, poll: poll, user: create(:user, :level_two, geozone: hobbiton) }
2.times { create :poll_voter, poll: poll, user: create(:user, :level_two, geozone: rivendel) }
expect(stats.participants_by_geozone["Hobbiton"][:total]).to eq(count: 3, percentage: 60.0)
expect(stats.participants_by_geozone["Rivendel"][:total]).to eq(count: 2, percentage: 40.0)
end
it "calculates percentage relative to the geozone population" do
midgar = create(:geozone, name: "Midgar")
create(:poll_voter, poll: poll, user: create(:user, :level_two, geozone: midgar))
2.times { create :user, :level_two, geozone: midgar }
expect(stats.participants_by_geozone["Midgar"][:percentage]).to eq(33.333)
end
end
end