Merge pull request #2075 from wairbut-m2c/iagirre-poll-stats
Iagirre poll stats
This commit is contained in:
@@ -25,6 +25,8 @@ class PollsController < ApplicationController
|
||||
|
||||
@commentable = @poll
|
||||
@comment_tree = CommentTree.new(@commentable, params[:page], @current_order)
|
||||
|
||||
@stats = Poll::Stats.new(@poll).generate
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -23,6 +23,7 @@ module Abilities
|
||||
can [:read], Legislation::Question
|
||||
can [:create], Legislation::Answer
|
||||
can [:search, :comments, :read, :create, :new_comment], Legislation::Annotation
|
||||
can :read_stats, Poll
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
125
app/models/poll/stats.rb
Normal file
125
app/models/poll/stats.rb
Normal file
@@ -0,0 +1,125 @@
|
||||
class Poll
|
||||
class Stats
|
||||
|
||||
def initialize(poll)
|
||||
@poll = poll
|
||||
end
|
||||
|
||||
def generate
|
||||
stats = %w[total_participants total_participants_web total_web_valid total_web_white total_web_null
|
||||
total_participants_booth total_booth_valid total_booth_white total_booth_null
|
||||
total_valid_votes total_white_votes total_null_votes valid_percentage_web valid_percentage_booth
|
||||
total_valid_percentage white_percentage_web white_percentage_booth total_white_percentage
|
||||
null_percentage_web null_percentage_booth total_null_percentage total_participants_web_percentage
|
||||
total_participants_booth_percentage]
|
||||
stats.map { |stat_name| [stat_name.to_sym, send(stat_name)] }.to_h
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def total_participants
|
||||
total_participants_web + total_participants_booth
|
||||
end
|
||||
|
||||
def total_participants_web
|
||||
total_web_valid + total_web_white + total_web_null
|
||||
end
|
||||
|
||||
def total_participants_web_percentage
|
||||
(total_participants) == 0 ? 0 : total_participants_web * 100 / total_participants
|
||||
end
|
||||
|
||||
def total_participants_booth
|
||||
voters.where(origin: 'booth').count
|
||||
end
|
||||
|
||||
def total_participants_booth_percentage
|
||||
(total_participants) == 0 ? 0 : total_participants_booth * 100 / total_participants.to_f
|
||||
end
|
||||
|
||||
def total_web_valid
|
||||
voters.where(origin: 'web').count
|
||||
end
|
||||
|
||||
def valid_percentage_web
|
||||
(total_valid_votes) == 0 ? 0 : total_web_valid * 100 / total_valid_votes.to_f
|
||||
end
|
||||
|
||||
def total_web_white
|
||||
0
|
||||
end
|
||||
|
||||
def white_percentage_web
|
||||
0
|
||||
end
|
||||
|
||||
def total_web_null
|
||||
0
|
||||
end
|
||||
|
||||
def null_percentage_web
|
||||
0
|
||||
end
|
||||
|
||||
def total_booth_valid
|
||||
recounts.sum(:total_amount)
|
||||
end
|
||||
|
||||
def valid_percentage_booth
|
||||
(total_valid_votes) == 0 ? 0 : total_booth_valid * 100 / total_valid_votes.to_f
|
||||
end
|
||||
|
||||
def total_booth_white
|
||||
recounts.sum(:white_amount)
|
||||
end
|
||||
|
||||
def white_percentage_booth
|
||||
(total_white_votes) == 0 ? 0 : total_booth_white * 100 / total_white_votes.to_f
|
||||
end
|
||||
|
||||
def total_booth_null
|
||||
recounts.sum(:null_amount)
|
||||
end
|
||||
|
||||
def null_percentage_booth
|
||||
(total_null_votes == 0) ? 0 : total_booth_null * 100 / total_null_votes.to_f
|
||||
end
|
||||
|
||||
def total_valid_votes
|
||||
total_web_valid + total_booth_valid
|
||||
end
|
||||
|
||||
def total_valid_percentage
|
||||
(total_participants) == 0 ? 0 : total_valid_votes * 100 / total_participants.to_f
|
||||
end
|
||||
|
||||
def total_white_votes
|
||||
total_web_white + total_booth_white
|
||||
end
|
||||
|
||||
def total_white_percentage
|
||||
(total_participants) == 0 ? 0 : total_white_votes * 100 / total_participants.to_f
|
||||
end
|
||||
|
||||
def total_null_votes
|
||||
total_web_null + total_booth_null
|
||||
end
|
||||
|
||||
def total_null_percentage
|
||||
(total_participants) == 0 ? 0 : total_null_votes * 100 / total_participants.to_f
|
||||
end
|
||||
|
||||
def voters
|
||||
@poll.voters
|
||||
end
|
||||
|
||||
def recounts
|
||||
@poll.recounts
|
||||
end
|
||||
|
||||
def stats_cache(key, &block)
|
||||
Rails.cache.fetch("polls_stats/#{@poll.id}/#{key}/v7", &block)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
20
app/views/polls/_results_subnavigation.html.erb
Normal file
20
app/views/polls/_results_subnavigation.html.erb
Normal file
@@ -0,0 +1,20 @@
|
||||
<div class="row">
|
||||
<div class="small-12 column">
|
||||
<ul class="tabs" data-tabs id="polls-tabs">
|
||||
<li class="tabs-title">
|
||||
<%= link_to "#tab-stats" do %>
|
||||
<h3>
|
||||
<%= t("polls.show.stats_menu") %> <!-- t("polls.show.comments_tab") -->
|
||||
</h3>
|
||||
<% end %>
|
||||
</li>
|
||||
<li class="tabs-title is-active">
|
||||
<%= link_to "#tab-information" do %>
|
||||
<h3>
|
||||
<%= t("polls.show.info_menu") %>
|
||||
</h3>
|
||||
<% end %>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
126
app/views/polls/_show.html.erb
Normal file
126
app/views/polls/_show.html.erb
Normal file
@@ -0,0 +1,126 @@
|
||||
<div class="row margin">
|
||||
<div class="small-12 medium-9 column">
|
||||
<%= render "callout" %>
|
||||
|
||||
<% if @poll.voted_in_booth?(current_user) %>
|
||||
<div class="callout warning">
|
||||
<%= t("polls.show.already_voted_in_booth") %>
|
||||
</div>
|
||||
<% else %>
|
||||
|
||||
<% if current_user && @poll.voted_in_web?(current_user) %>
|
||||
<div class="callout warning">
|
||||
<%= t("polls.show.already_voted_in_web") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% @questions.each do |question| %>
|
||||
<%= render 'polls/questions/question', question: question, token: @token %>
|
||||
<% end %>
|
||||
|
||||
<% if poll_voter_token(@poll, current_user).empty? %>
|
||||
<div class="callout token-message js-token-message" style="display: none">
|
||||
<%= t('poll_questions.show.voted_token') %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= link_to t("polls.show.participate_in_other_polls"), polls_path, class: "button hollow" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="expanded poll-more-info">
|
||||
<div class="row margin">
|
||||
<div class="small-12 medium-9 column">
|
||||
<h3><%= t("polls.show.more_info_title") %></h3>
|
||||
<%= safe_html_with_links simple_format(@poll.description) %>
|
||||
</div>
|
||||
|
||||
<% if false %>
|
||||
<aside class="small-12 medium-3 column">
|
||||
<div class="sidebar-divider"></div>
|
||||
<h2><%= t("polls.show.documents") %></h2>
|
||||
</aside>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="expanded poll-more-info-answers">
|
||||
<div class="row padding">
|
||||
|
||||
<% @poll_questions_answers.each do |answer| %>
|
||||
<div class="small-12 medium-6 column end answer <%= cycle('first', '') %>" id="answer_<%= answer.id %>">
|
||||
|
||||
<% if answer.description.present? %>
|
||||
<h3><%= answer.title %></h3>
|
||||
<% end %>
|
||||
|
||||
<% if answer.images.any? %>
|
||||
<%= render "gallery", answer: answer %>
|
||||
<% end %>
|
||||
|
||||
<% if answer.description.present? %>
|
||||
<div class="margin-top">
|
||||
<div id="answer_description_<%= answer.id %>" class="answer-description short" data-toggler="short">
|
||||
<%= safe_html_with_links simple_format(answer.description) %>
|
||||
</div>
|
||||
<div class="margin">
|
||||
<a id="read_more_<%= answer.id %>"
|
||||
data-toggle="answer_description_<%= answer.id %> read_more_<%= answer.id %> read_less_<%= answer.id %>"
|
||||
data-toggler="hide">
|
||||
<%= t("polls.show.read_more", answer: answer.title) %>
|
||||
</a>
|
||||
<a id="read_less_<%= answer.id %>"
|
||||
data-toggle="answer_description_<%= answer.id %> read_more_<%= answer.id %> read_less_<%= answer.id %>"
|
||||
data-toggler="hide"
|
||||
class="hide">
|
||||
<%= t("polls.show.read_less", answer: answer.title) %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if answer.documents.present? %>
|
||||
<div class="document-link">
|
||||
<p>
|
||||
<span class="icon-document"></span>
|
||||
<strong><%= t("polls.show.documents") %></strong>
|
||||
</p>
|
||||
|
||||
<% answer.documents.each do |document| %>
|
||||
<%= link_to document.title,
|
||||
document.attachment.url,
|
||||
target: "_blank",
|
||||
rel: "nofollow" %><br>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if answer.videos.present? %>
|
||||
<div class="video-link">
|
||||
<p>
|
||||
<span class="icon-video"></span>
|
||||
<strong><%= t("polls.show.videos") %></strong>
|
||||
</p>
|
||||
|
||||
<% answer.videos.each do |video| %>
|
||||
<%= link_to video.title,
|
||||
video.url,
|
||||
target: "_blank",
|
||||
rel: "nofollow" %><br>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="tabs-content" data-tabs-content="proposals-tabs" role="tablist">
|
||||
<%= render "filter_subnav" %>
|
||||
|
||||
<div class="tabs-panel is-active" id="tab-comments">
|
||||
<%= render "comments" %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -28,131 +28,17 @@
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tabs-content" data-tabs-content="polls-tabs" role="tablist">
|
||||
<%= render "results_subnavigation" %>
|
||||
|
||||
<div class="row margin">
|
||||
<div class="small-12 medium-9 column">
|
||||
<%= render "callout" %>
|
||||
|
||||
<% if @poll.voted_in_booth?(current_user) %>
|
||||
<div class="callout warning">
|
||||
<%= t("polls.show.already_voted_in_booth") %>
|
||||
</div>
|
||||
<% else %>
|
||||
|
||||
<% if current_user && @poll.voted_in_web?(current_user) %>
|
||||
<div class="callout warning">
|
||||
<%= t("polls.show.already_voted_in_web") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% @questions.each do |question| %>
|
||||
<%= render 'polls/questions/question', question: question, token: @token %>
|
||||
<% end %>
|
||||
|
||||
<% if poll_voter_token(@poll, current_user).empty? %>
|
||||
<div class="callout token-message js-token-message" style="display: none">
|
||||
<%= t('poll_questions.show.voted_token') %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= link_to t("polls.show.participate_in_other_polls"), polls_path, class: "button hollow" %>
|
||||
<div id="tab-stats" class="tabs-panel">
|
||||
<%= render "polls/stats/show" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="expanded poll-more-info">
|
||||
<div class="row margin">
|
||||
<div class="small-12 medium-9 column">
|
||||
<h3><%= t("polls.show.more_info_title") %></h3>
|
||||
<%= safe_html_with_links simple_format(@poll.description) %>
|
||||
</div>
|
||||
|
||||
<% if false %>
|
||||
<aside class="small-12 medium-3 column">
|
||||
<div class="sidebar-divider"></div>
|
||||
<h2><%= t("polls.show.documents") %></h2>
|
||||
</aside>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="expanded poll-more-info-answers">
|
||||
<div class="row padding">
|
||||
|
||||
<% @poll_questions_answers.each do |answer| %>
|
||||
<div class="small-12 medium-6 column end answer <%= cycle('first', '') %>" id="answer_<%= answer.id %>">
|
||||
|
||||
<% if answer.description.present? %>
|
||||
<h3><%= answer.title %></h3>
|
||||
<% end %>
|
||||
|
||||
<% if answer.images.any? %>
|
||||
<%= render "gallery", answer: answer %>
|
||||
<% end %>
|
||||
|
||||
<% if answer.description.present? %>
|
||||
<div class="margin-top">
|
||||
<div id="answer_description_<%= answer.id %>" class="answer-description short" data-toggler="short">
|
||||
<%= safe_html_with_links simple_format(answer.description) %>
|
||||
</div>
|
||||
<div class="margin">
|
||||
<a id="read_more_<%= answer.id %>"
|
||||
data-toggle="answer_description_<%= answer.id %> read_more_<%= answer.id %> read_less_<%= answer.id %>"
|
||||
data-toggler="hide">
|
||||
<%= t("polls.show.read_more", answer: answer.title) %>
|
||||
</a>
|
||||
<a id="read_less_<%= answer.id %>"
|
||||
data-toggle="answer_description_<%= answer.id %> read_more_<%= answer.id %> read_less_<%= answer.id %>"
|
||||
data-toggler="hide"
|
||||
class="hide">
|
||||
<%= t("polls.show.read_less", answer: answer.title) %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if answer.documents.present? %>
|
||||
<div class="document-link">
|
||||
<p>
|
||||
<span class="icon-document"></span>
|
||||
<strong><%= t("polls.show.documents") %></strong>
|
||||
</p>
|
||||
|
||||
<% answer.documents.each do |document| %>
|
||||
<%= link_to document.title,
|
||||
document.attachment.url,
|
||||
target: "_blank",
|
||||
rel: "nofollow" %><br>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if answer.videos.present? %>
|
||||
<div class="video-link">
|
||||
<p>
|
||||
<span class="icon-video"></span>
|
||||
<strong><%= t("polls.show.videos") %></strong>
|
||||
</p>
|
||||
|
||||
<% answer.videos.each do |video| %>
|
||||
<%= link_to video.title,
|
||||
video.url,
|
||||
target: "_blank",
|
||||
rel: "nofollow" %><br>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="tab-information" class="tabs-panel is-active">
|
||||
<%= render "show" %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tabs-content" data-tabs-content="proposals-tabs" role="tablist">
|
||||
<%= render "filter_subnav" %>
|
||||
|
||||
<div class="tabs-panel is-active" id="tab-comments">
|
||||
<%= render "comments" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
85
app/views/polls/stats/_show.html.erb
Normal file
85
app/views/polls/stats/_show.html.erb
Normal file
@@ -0,0 +1,85 @@
|
||||
<div class="row">
|
||||
<div class="small-12 medium-3 column sidebar">
|
||||
<p><%= t("polls.show.stats.title") %></p>
|
||||
<ul class="menu vertical margin-top">
|
||||
<li><a href="#total"><%= t("polls.show.stats.total_participation") %></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="small-12 medium-9 column">
|
||||
<h3 id="total"><%= t("polls.show.stats.total_participation") %></h3>
|
||||
|
||||
<p class="stat-number margin-top">
|
||||
<%= t("polls.show.stats.total_votes") %><br>
|
||||
<span><%= @stats[:total_participants] %></span>
|
||||
</p>
|
||||
<table class="polls-total-stats">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col"><%= t("polls.show.stats.votes") %></th>
|
||||
<th scope="col"><%= t("polls.show.stats.web") %></th>
|
||||
<th scope="col"><%= t("polls.show.stats.booth") %></th>
|
||||
<th scope="col"><%= t("polls.show.stats.total") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th><%= t("polls.show.stats.valid") %></th>
|
||||
<td><%= @stats[:total_web_valid] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:valid_percentage_web],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_booth_valid] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:valid_percentage_booth],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_valid_votes] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_valid_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><%= t("polls.show.stats.white") %></th>
|
||||
<td><%= @stats[:total_web_white] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:white_percentage_web],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_booth_white] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:white_percentage_booth],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_white_votes] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_white_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><%= t("polls.show.stats.null_votes") %></th>
|
||||
<td><%= @stats[:total_web_null] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:null_percentage_web],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_booth_null] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:null_percentage_booth],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_null_votes] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_null_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><%= t("polls.show.stats.total") %></th>
|
||||
<td><%= @stats[:total_participants_web] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_participants_web_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_participants_booth] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_participants_booth_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_participants_web] + @stats[:total_participants_booth] %></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -498,6 +498,19 @@ en:
|
||||
read_less: "Read less about %{answer}"
|
||||
participate_in_other_polls: Participate in other polls
|
||||
videos: "External video"
|
||||
info_menu: "Information"
|
||||
stats_menu: "Participation statistics"
|
||||
stats:
|
||||
title: "Participation data"
|
||||
total_participation: "Total participation"
|
||||
total_votes: "Total amount of given votes"
|
||||
votes: "VOTES"
|
||||
web: "WEB"
|
||||
booth: "BOOTH"
|
||||
total: "TOTAL"
|
||||
valid: "Valid"
|
||||
white: "White votes"
|
||||
null_votes: "Invalid"
|
||||
poll_questions:
|
||||
create_question: "Create question"
|
||||
show:
|
||||
|
||||
@@ -498,6 +498,19 @@ es:
|
||||
read_less: "Leer menos sobre %{answer}"
|
||||
participate_in_other_polls: Participar en otras votaciones
|
||||
videos: "Vídeo externo"
|
||||
info_menu: "Información"
|
||||
stats_menu: "Estadísticas de participación"
|
||||
stats:
|
||||
title: "Datos de participación"
|
||||
total_participation: "Participación total"
|
||||
total_votes: "Nº total de votos emitidos"
|
||||
votes: "VOTOS"
|
||||
web: "WEB"
|
||||
booth: "URNAS"
|
||||
total: "TOTAL"
|
||||
valid: "Válidos"
|
||||
white: "En blanco"
|
||||
null_votes: "Nulos"
|
||||
poll_questions:
|
||||
create_question: "Crear pregunta para votación"
|
||||
show:
|
||||
|
||||
@@ -111,7 +111,7 @@ Rails.application.routes.draw do
|
||||
resources :annotations do
|
||||
get :search, on: :collection
|
||||
end
|
||||
|
||||
|
||||
resources :polls, only: [:show, :index] do
|
||||
resources :questions, controller: 'polls/questions', shallow: true do
|
||||
post :answer, on: :member
|
||||
|
||||
@@ -367,4 +367,17 @@ feature 'Polls' do
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "Results and stats" do
|
||||
scenario "See polls statistics", :js do
|
||||
user = create(:user)
|
||||
poll = create(:poll, summary: "Summary", description: "Description")
|
||||
login_as user
|
||||
visit poll_path(poll)
|
||||
|
||||
click_link "Participation statistics"
|
||||
|
||||
expect(page).to have_content("Total participation")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
45
spec/models/poll/stats_spec.rb
Normal file
45
spec/models/poll/stats_spec.rb
Normal file
@@ -0,0 +1,45 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe Poll::Stats do
|
||||
|
||||
describe "Calculate stats" do
|
||||
it "Generate the correct stats" do
|
||||
poll = create(:poll)
|
||||
booth = create(:poll_booth)
|
||||
booth_assignment = create(:poll_booth_assignment, poll: poll, booth: booth)
|
||||
create(:poll_voter, poll: poll, origin: 'web')
|
||||
3.times {create(:poll_voter, poll: poll, origin: 'booth')}
|
||||
create(:poll_voter, poll: poll)
|
||||
create(:poll_recount, origin: 'booth', white_amount: 1, null_amount: 0, total_amount: 2, booth_assignment_id: booth_assignment.id)
|
||||
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
|
||||
Reference in New Issue
Block a user