For now we think showing them would be showing too much data and it would be a bit confusing. I've been tempted to just remove the view and keep the methods in the model in case they're used by other institutions using CONSUL. However, it's probably better to wait until we're asked to re-implement them, and in the meantime we don't maintain code nobody uses. The code wasn't that great to start with (I know it because I wrote it).
226 lines
7.8 KiB
Ruby
226 lines
7.8 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
|
|
|
|
describe "#generate" do
|
|
it "generates the correct stats" do
|
|
poll = create(:poll)
|
|
2.times { create(:poll_voter, :from_web, poll: poll) }
|
|
3.times { create(:poll_voter, :from_booth, poll: poll) }
|
|
create(:poll_recount, :from_booth, poll: poll,
|
|
white_amount: 1, null_amount: 0, total_amount: 2)
|
|
|
|
stats = Poll::Stats.new(poll).generate
|
|
|
|
expect(stats[:total_participants]).to eq(5)
|
|
expect(stats[:total_participants_web]).to eq(2)
|
|
expect(stats[:total_participants_booth]).to eq(3)
|
|
expect(stats[:total_valid_votes]).to eq(4)
|
|
expect(stats[:total_white_votes]).to eq(1)
|
|
expect(stats[:total_null_votes]).to eq(0)
|
|
|
|
expect(stats[:total_web_valid]).to eq(2)
|
|
expect(stats[:total_web_white]).to eq(0)
|
|
expect(stats[:total_web_null]).to eq(0)
|
|
|
|
expect(stats[:total_booth_valid]).to eq(2)
|
|
expect(stats[:total_booth_white]).to eq(1)
|
|
expect(stats[:total_booth_null]).to eq(0)
|
|
|
|
expect(stats[:total_participants_web_percentage]).to eq(40)
|
|
expect(stats[:total_participants_booth_percentage]).to eq(60)
|
|
expect(stats[:valid_percentage_web]).to eq(50)
|
|
expect(stats[:white_percentage_web]).to eq(0)
|
|
expect(stats[:null_percentage_web]).to eq(0)
|
|
expect(stats[:valid_percentage_booth]).to eq(50)
|
|
expect(stats[:white_percentage_booth]).to eq(100)
|
|
expect(stats[:null_percentage_booth]).to eq(0)
|
|
expect(stats[:total_valid_percentage]).to eq(80)
|
|
expect(stats[:total_white_percentage]).to eq(20)
|
|
expect(stats[:total_null_percentage]).to eq(0)
|
|
end
|
|
end
|
|
|
|
end |