Merge pull request #1366 from consul/polls-geozones

Polls Geozones
This commit is contained in:
Juanjo Bazán
2017-01-25 11:31:58 +01:00
committed by GitHub
29 changed files with 190 additions and 165 deletions

View File

@@ -49,6 +49,7 @@
//= require fixed_bar
//= require banners
//= require social_share
//= require checkbox_toggle
//= require custom
var initialize_modules = function() {
@@ -74,6 +75,7 @@ var initialize_modules = function() {
App.FixedBar.initialize();
App.Banners.initialize();
App.SocialShare.initialize();
App.CheckboxToggle.initialize();
};
$(function(){

View File

@@ -0,0 +1,12 @@
App.CheckboxToggle =
initialize: ->
$('[data-checkbox-toggle]').on 'change', ->
$this = $(this)
$target = $($this.data('checkbox-toggle'))
if $this.is(':checked')
$target.show()
else
$target.hide()

View File

@@ -1,6 +1,8 @@
class Admin::Poll::PollsController < Admin::BaseController
load_and_authorize_resource
before_action :load_search, only: [:search_booths, :search_questions, :search_officers]
before_action :load_geozones, only: [:new, :create, :edit, :update]
def index
end
@@ -78,9 +80,12 @@ class Admin::Poll::PollsController < Admin::BaseController
end
private
def load_geozones
@geozones = Geozone.all.order(:name)
end
def poll_params
params.require(:poll).permit(:name, :starts_at, :ends_at)
params.require(:poll).permit(:name, :starts_at, :ends_at, :geozone_restricted, geozone_ids: [])
end
def search_params
@@ -91,4 +96,4 @@ class Admin::Poll::PollsController < Admin::BaseController
@search = search_params[:search]
end
end
end

View File

@@ -2,8 +2,6 @@ class Admin::Poll::QuestionsController < Admin::BaseController
load_and_authorize_resource :poll
load_and_authorize_resource :question, class: 'Poll::Question'
before_action :load_geozones, only: [:new, :create, :edit, :update]
def index
@polls = Poll.all
@search = search_params[:search]
@@ -55,16 +53,12 @@ class Admin::Poll::QuestionsController < Admin::BaseController
private
def load_geozones
@geozones = Geozone.all.order(:name)
end
def question_params
params.require(:poll_question).permit(:title, :question, :summary, :description, :proposal_id, :valid_answers, :poll_id, :geozone_ids => [])
params.require(:poll_question).permit(:poll_id, :title, :question, :summary, :description, :proposal_id, :valid_answers)
end
def search_params
params.permit(:poll_id, :search)
end
end
end

View File

@@ -9,8 +9,7 @@ class PollsController < ApplicationController
end
def show
@answerable_questions = @poll.questions.answerable_by(current_user).for_render.sort_for_list
@non_answerable_questions = @poll.questions.where.not(id: @answerable_questions.map(&:id)).for_render.sort_for_list
@questions = @poll.questions.for_render.sort_for_list
@answers_by_question_id = {}
poll_partial_results = Poll::PartialResult.by_question(@poll.question_ids).by_author(current_user.try(:id))

View File

@@ -6,6 +6,8 @@ class Poll < ActiveRecord::Base
has_many :officers, through: :officer_assignments
has_many :questions
has_and_belongs_to_many :geozones
validates :name, presence: true
validate :date_range
@@ -14,6 +16,7 @@ class Poll < ActiveRecord::Base
scope :incoming, -> { where('? < starts_at', Time.current) }
scope :expired, -> { where('ends_at < ?', Time.current) }
scope :published, -> { where('published = ?', true) }
scope :by_geozone_id, ->(geozone_id) { where(geozones: {id: geozone_id}.joins(:geozones)) }
scope :sort_for_list, -> { order(:starts_at) }
@@ -30,12 +33,15 @@ class Poll < ActiveRecord::Base
end
def answerable_by?(user)
user.present? && user.level_two_or_three_verified? && current?
user.present? &&
user.level_two_or_three_verified? &&
current? &&
(!geozone_restricted || geozone_ids.include?(user.geozone_id))
end
def self.answerable_by(user)
return none if user.nil? || user.unverified?
current
current.joins(:geozones).where('geozone_restricted = ? or geozones.id = ?', false, user.geozone_id)
end
def document_has_voted?(document_number, document_type)

View File

@@ -11,7 +11,6 @@ class Poll::Question < ActiveRecord::Base
has_many :comments, as: :commentable
has_many :answers
has_many :partial_results
has_and_belongs_to_many :geozones
belongs_to :proposal
validates :title, presence: true
@@ -21,9 +20,7 @@ class Poll::Question < ActiveRecord::Base
validates :title, length: { in: 4..Poll::Question.title_max_length }
validates :description, length: { maximum: Poll::Question.description_max_length }
scope :no_poll, -> { where(poll_id: nil) }
scope :by_poll_id, -> (poll_id) { where(poll_id: poll_id) }
scope :by_geozone_id, -> (geozone_id) { where(geozones: {id: geozone_id}.joins(:geozones)) }
scope :by_poll_id, ->(poll_id) { where(poll_id: poll_id) }
scope :sort_for_list, -> { order('poll_questions.proposal_id IS NULL', :created_at)}
scope :for_render, -> { includes(:author, :proposal) }
@@ -41,9 +38,7 @@ class Poll::Question < ActiveRecord::Base
summary => 'B',
description => 'C',
author.username => 'C',
author_visible_name => 'C',
geozones.pluck(:name).join(' ') => 'C'
}
author_visible_name => 'C' }
end
def description
@@ -62,29 +57,17 @@ class Poll::Question < ActiveRecord::Base
self.title = proposal.title
self.description = proposal.description
self.summary = proposal.summary
self.all_geozones = true
self.valid_answers = I18n.t('poll_questions.default_valid_answers')
end
end
def answerable_by?(user)
poll.answerable_by?(user) && (self.all_geozones || self.geozone_ids.include?(user.geozone_id))
poll.answerable_by?(user)
end
def self.answerable_by(user)
return none if user.nil? || user.unverified?
where(poll_id: answerable_polls(user),
geozones: { id: answerable_geozones(user) }).
joins(:geozones)
end
def self.answerable_polls(user)
Poll.answerable_by(user)
end
def self.answerable_geozones(user)
user.geozone || Geozone.city
where(poll_id: Poll.answerable_by(user).pluck(:id))
end
end

View File

@@ -1,34 +1,46 @@
<%= form_for [:admin, @poll] do |f| %>
<div class="row">
<div class="small-12 medium-6 column">
<%= f.text_field :name,
placeholder: t('admin.polls.form.name'),
label: t("admin.polls.form.name") %>
<%= f.text_field :name %>
</div>
</div>
<div class="row">
<div class="small-12 medium-6 column">
<%= f.label :starts_at, t("admin.polls.form.starts_at") %>
<%= f.text_field :starts_at,
label: false,
value: @poll.starts_at.present? ? l(@poll.starts_at.to_date) : nil,
class: "js-calendar-full" %>
</div>
<div class="small-12 medium-6 column">
<%= f.label :ends_at, t("admin.polls.form.ends_at") %>
<%= f.text_field :ends_at,
label: false,
value: @poll.ends_at.present? ? l(@poll.ends_at.to_date) : nil,
class: "js-calendar-full" %>
</div>
</div>
<div class="row">
<div class="small-6 medium-6 column">
<%= f.check_box :geozone_restricted, data: { checkbox_toggle: "#geozones" } %>
</div>
</div>
<div id="geozones" style="<%= @poll.geozone_restricted? ? '' : 'display:none' %>">
<div class="row">
<%= f.collection_check_boxes(:geozone_ids, @geozones, :id, :name) do |b| %>
<div class="small-6 medium-3 column">
<%= b.label do %>
<%= b.check_box + b.text %>
<% end %>
</div>
<% end %>
</div>
</div>
<div class="row">
<div class="small-12 medium-4 column">
<%= f.submit t("admin.polls.#{admin_submit_action(@poll)}.submit_button"),
class: "button success expanded" %>
</div>
</div>
<% end %>
<% end %>

View File

@@ -6,9 +6,15 @@
<%= @poll.name %>
</h2>
<br>
<p class="inline-block">
<span>
(<%= l @poll.starts_at.to_date %> - <%= l @poll.ends_at.to_date %>)
</p>
</span>
<% if @poll.geozone_restricted %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span>
<%= @poll.geozones.pluck(:name).to_sentence %>
<span>
<% end %>
<div id="poll-resources" class="tabs-content" data-tabs-content="assigned-resources-tabs">
<%= render "filter_subnav" %>
@@ -27,4 +33,4 @@
<%= render "search_officers" %>
<%= render 'officers' %>
</div>
</div>
</div>

View File

@@ -29,17 +29,6 @@
ckeditor: { language: I18n.locale } %>
</div>
<div class="row">
<%= f.collection_check_boxes(:geozone_ids, @geozones, :id, :name) do |b| %>
<div class="small-6 medium-3 column">
<%= b.label do %>
<%= b.check_box + b.text %>
<% end %>
</div>
<% end %>
</div>
<%# TODO include all link %>
<div class="row">
<div class="actions small-12 medium-4 column margin-top">
<%= f.submit(class: "button expanded", value: t("shared.save")) %>
@@ -48,4 +37,4 @@
</div>
</div>
<% end %>
<% end %>

View File

@@ -46,15 +46,6 @@
<%= @question.description %>
</p>
<p>
<strong><%= t("admin.questions.show.geozones") %></strong>
<br>
<% @question.geozones.each do |geozone| %>
<span class="geozone">
<%= geozone.name %>
</span>
<% end %>
</p>
<%= link_to t("admin.questions.show.preview"), question_path(@question) %>
</div>

View File

@@ -14,12 +14,6 @@
<% end %>
<p><%= @question.summary %></p>
<ul class="no-bullet margin-top tags">
<% @question.geozones.each do |g| %>
<li class="inline-block"><span><%= g.name %></span></li>
<% end %>
</ul>
</div>
<div class="small-12 medium-3 column info">

View File

@@ -11,6 +11,11 @@
<%= t("polls.show.question_count_html",
count: @poll.questions.count) %>
</p>
<ul class="no-bullet margin-top tags">
<% @poll.geozones.each do |g| %>
<li class="inline-block"><span><%= g.name %></span></li>
<% end %>
</ul>
<%= render "callout" %>
</div>
@@ -30,21 +35,7 @@
<div class="row margin-top">
<div class="small-12 medium-9 column">
<% @answerable_questions.each do |question| %>
<%= render 'polls/questions/question', question: question %>
<% end %>
<% if can?(:answer, @poll) &&
@non_answerable_questions.present? %>
<div class="callout warning margin-top">
<h2 class="questions-callout">
<%= t("polls.show.cant_answer_wrong_geozone",
count: @non_answerable_questions.count) %>
</h2>
</div>
<% end %>
<% @non_answerable_questions.each do |question| %>
<% @questions.each do |question| %>
<%= render 'polls/questions/question', question: question %>
<% end %>
</div>

View File

@@ -105,6 +105,11 @@ en:
external_url: "Link to additional documentation"
geozone_id: "Scope of operation"
title: "Title"
poll:
name: "Name"
starts_at: "Start Date"
ends_at: "Closing Date"
geozone_restricted: "Restricted by geozone"
poll/question:
title: "Question"
valid_answers: "Posibles answers"

View File

@@ -100,6 +100,11 @@ es:
external_url: "Enlace a documentación adicional"
geozone_id: "Ámbito de actuación"
title: "Título"
poll:
name: "Nombre"
starts_at: "Fecha de apertura"
ends_at: "Fecha de cierre"
geozone_restricted: "Restringida por zonas"
poll/question:
title: "Pregunta"
valid_answers: "Posibles respuestas"

View File

@@ -301,10 +301,6 @@ en:
edit:
title: "Edit poll"
submit_button: "Update poll"
form:
name: "Name"
starts_at: "Open date"
ends_at: "Close date"
show:
questions_tab: Questions
booths_tab: Booths
@@ -357,7 +353,6 @@ en:
valid_answers: Valid answers
summary: Summary
description: Description
geozones: Geozones
preview: View on website
booths:
index:

View File

@@ -301,10 +301,6 @@ es:
edit:
title: "Editar votación"
submit_button: "Actualizar votación"
form:
name: "Nombre"
starts_at: "Fecha de apertura"
ends_at: "Fecha de cierre"
show:
questions_tab: Preguntas
booths_tab: Urnas
@@ -357,7 +353,6 @@ es:
valid_answers: Respuestas válidas
summary: Resumen
description: Descripción
geozones: Distritos
preview: Ver en la web
booths:
index:

View File

@@ -411,7 +411,6 @@ en:
verify_link: "verify your account"
cant_answer_incoming: "This poll has not yet started."
cant_answer_expired: "This poll has finished."
cant_answer_wrong_geozone: "You can't answers the following %{count} questions because are not available in your geozone."
question_count_html: "This poll has a total of <strong>%{count} qeustions</strong>."
poll_questions:
create_question: "Create question"

View File

@@ -411,7 +411,6 @@ es:
verify_link: "verifica tu cuenta"
cant_answer_incoming: "Esta votación todavía no ha comenzado."
cant_answer_expired: "Esta votación ha terminado."
cant_answer_wrong_geozone: "No puedes responder a las siguientes %{count} preguntas porque no están disponibles en tu zona:"
question_count_html: "Esta votación tiene un total de <strong>%{count} preguntas</strong>."
poll_questions:
create_question: "Crear pregunta para votación"

View File

@@ -466,27 +466,32 @@ end
puts "Creating polls"
puts "Active Poll"
poll = Poll.create(name: "Poll 1",
starts_at: 1.month.ago,
ends_at: 1.month.from_now)
puts " #{poll.name}"
puts "Active Polls"
(1..5).each do |i|
poll = Poll.create(name: "Active Poll #{i}",
starts_at: 1.month.ago,
ends_at: 1.month.from_now,
geozone_restricted: true,
geozones: Geozone.reorder("RANDOM()").limit(3)
)
puts " #{poll.name}"
end
puts "Upcoming Poll"
poll = Poll.create(name: "Poll 2",
poll = Poll.create(name: "Upcoming Poll",
starts_at: 1.month.from_now,
ends_at: 2.months.from_now)
puts " #{poll.name}"
puts "Expired Poll"
poll = Poll.create(name: "Poll 3",
poll = Poll.create(name: "Expired Poll",
starts_at: 2.months.ago,
ends_at: 1.months.ago)
puts " #{poll.name}"
puts "Creating Poll Questions"
(1..20).each do |i|
(1..50).each do |i|
poll = Poll.reorder("RANDOM()").first
author = User.reorder("RANDOM()").first
description = "<p>#{Faker::Lorem.paragraphs.join('</p><p>')}</p>"
@@ -496,14 +501,12 @@ puts "Creating Poll Questions"
summary: Faker::Lorem.sentence(3),
description: description,
valid_answers: Faker::Lorem.words(3).join(', '),
poll: poll,
geozones: Geozone.reorder("RANDOM()").limit(3),
all_geozones: [true, false].sample)
poll: poll)
puts " #{question.title}"
end
puts "Creating Poll Booths"
10.times.each_with_index do |i|
30.times.each_with_index do |i|
Poll::Booth.create(name: "Booth #{i}", polls: [Poll.all.sample])
end
@@ -515,7 +518,7 @@ end
puts "Creating Poll Officer Assignments"
(1..10).to_a.sample.times do |i|
Poll::BoothAssignment.all.sample(i).each do |booth_assignment|
Poll::OfficerAssignment.create(officer: poll_officer,
Poll::OfficerAssignment.create(officer: poll_officer.poll_officer,
booth_assignment: booth_assignment,
date: booth_assignment.poll.starts_at)
end
@@ -523,7 +526,7 @@ end
puts "Creating Poll Question from Proposals"
(1..3).each do |i|
(1..3).each do
proposal = Proposal.reorder("RANDOM()").first
poll = Poll.current.first
question = Poll::Question.create(valid_answers: "Yes, No")
@@ -535,7 +538,7 @@ end
puts "Creating Successful Proposals"
(1..10).each do |i|
(1..10).each do
proposal = Proposal.reorder("RANDOM()").first
poll = Poll.current.first
question = Poll::Question.create(valid_answers: "Yes, No")
@@ -547,11 +550,11 @@ end
puts "Commenting Poll Questions"
(1..30).each do |i|
(1..30).each do
author = User.reorder("RANDOM()").first
question = Poll::Question.reorder("RANDOM()").first
Comment.create!(user: author,
created_at: rand(question.created_at .. Time.current),
commentable: question,
body: Faker::Lorem.sentence)
end
end

View File

@@ -0,0 +1,10 @@
class MoveGeozonesFromPollQuestionsToPolls < ActiveRecord::Migration
def change
drop_table :geozones_poll_questions
create_table :geozones_polls do |t|
t.references :geozone, index: true, foreign_key: true
t.references :poll, index: true, foreign_key: true
end
end
end

View File

@@ -0,0 +1,5 @@
class AddGeozoneRestrictedToPolls < ActiveRecord::Migration
def change
add_column :polls, :geozone_restricted, :boolean, default: false, index: true
end
end

View File

@@ -0,0 +1,5 @@
class RemoveAllGeozonesFromPollQuestions < ActiveRecord::Migration
def change
remove_column :poll_questions, :all_geozones, :boolean
end
end

View File

@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170114154421) do
ActiveRecord::Schema.define(version: 20170120164547) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -307,13 +307,13 @@ ActiveRecord::Schema.define(version: 20170114154421) do
t.string "census_code"
end
create_table "geozones_poll_questions", force: :cascade do |t|
create_table "geozones_polls", force: :cascade do |t|
t.integer "geozone_id"
t.integer "question_id"
t.integer "poll_id"
end
add_index "geozones_poll_questions", ["geozone_id"], name: "index_geozones_poll_questions_on_geozone_id", using: :btree
add_index "geozones_poll_questions", ["question_id"], name: "index_geozones_poll_questions_on_question_id", using: :btree
add_index "geozones_polls", ["geozone_id"], name: "index_geozones_polls_on_geozone_id", using: :btree
add_index "geozones_polls", ["poll_id"], name: "index_geozones_polls_on_poll_id", using: :btree
create_table "identities", force: :cascade do |t|
t.integer "user_id"
@@ -424,7 +424,6 @@ ActiveRecord::Schema.define(version: 20170114154421) do
t.datetime "hidden_at"
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "all_geozones", default: false
t.tsvector "tsv"
end
@@ -459,7 +458,8 @@ ActiveRecord::Schema.define(version: 20170114154421) do
t.string "name"
t.datetime "starts_at"
t.datetime "ends_at"
t.boolean "published", default: false
t.boolean "published", default: false
t.boolean "geozone_restricted", default: false
end
create_table "proposal_notifications", force: :cascade do |t|
@@ -768,8 +768,8 @@ ActiveRecord::Schema.define(version: 20170114154421) do
add_foreign_key "annotations", "users"
add_foreign_key "failed_census_calls", "users"
add_foreign_key "flags", "users"
add_foreign_key "geozones_poll_questions", "geozones"
add_foreign_key "geozones_poll_questions", "poll_questions", column: "question_id"
add_foreign_key "geozones_polls", "geozones"
add_foreign_key "geozones_polls", "polls"
add_foreign_key "identities", "users"
add_foreign_key "locks", "users"
add_foreign_key "managers", "users"

View File

@@ -18,7 +18,8 @@ feature 'Admin poll questions' do
scenario 'Show' do
geozone = create(:geozone)
question = create(:poll_question, geozone_ids: geozone.id)
poll = create(:poll, geozone_restricted: true, geozone_ids: [geozone.id])
question = create(:poll_question, poll: poll)
visit admin_question_path(question)
@@ -27,10 +28,10 @@ feature 'Admin poll questions' do
expect(page).to have_content(question.summary)
expect(page).to have_content(question.author.name)
expect(page).to have_content(question.valid_answers.join(" "))
expect(page).to have_content(geozone.name)
end
scenario 'Create' do
poll = create(:poll, name: 'Movies')
title = "Star Wars: Episode IV - A New Hope"
summary = "It is a period of civil war. Rebel spaceships, striking from a hidden base, have won their first victory against the evil Galactic Empire"
description = %{
@@ -41,6 +42,7 @@ feature 'Admin poll questions' do
visit admin_questions_path
click_link "Create question"
select 'Movies', from: 'poll_question_poll_id'
fill_in 'poll_question_title', with: title
fill_in 'poll_question_summary', with: summary
fill_in 'poll_question_description', with: description
@@ -53,7 +55,7 @@ feature 'Admin poll questions' do
end
scenario 'Create from successful proposal index' do
geozones = create_list(:geozone, 3)
poll = create(:poll, name: 'Proposals')
proposal = create(:proposal, :successful)
visit proposals_path
@@ -65,6 +67,8 @@ feature 'Admin poll questions' do
expect(page).to have_field('poll_question_description', with: proposal.description)
expect(page).to have_field('poll_question_valid_answers', with: "Yes, No")
select 'Proposals', from: 'poll_question_poll_id'
click_button 'Save'
expect(page).to have_content(proposal.title)
@@ -115,4 +119,4 @@ feature 'Admin poll questions' do
pending "Mark all city by default when creating a poll question from a successful proposal"
end
end

View File

@@ -82,7 +82,9 @@ feature 'Polls' do
end
scenario 'Level 1 users' do
create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
poll.update(geozone_restricted: true)
poll.geozones << geozone
create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
login_as(create(:user, geozone: geozone))
visit poll_path(poll)
@@ -96,8 +98,9 @@ feature 'Polls' do
end
scenario 'Level 2 users in an incoming poll' do
incoming_poll = create(:poll, :incoming)
create(:poll_question, poll: incoming_poll, geozone_ids: [geozone.id], valid_answers: 'Rey, Finn')
incoming_poll = create(:poll, :incoming, geozone_restricted: true)
incoming_poll.geozones << geozone
create(:poll_question, poll: incoming_poll, valid_answers: 'Rey, Finn')
login_as(create(:user, :level_two, geozone: geozone))
visit poll_path(incoming_poll)
@@ -111,8 +114,9 @@ feature 'Polls' do
end
scenario 'Level 2 users in an expired poll' do
expired_poll = create(:poll, :expired)
create(:poll_question, poll: expired_poll, geozone_ids: [geozone.id], valid_answers: 'Luke, Leia')
expired_poll = create(:poll, :expired, geozone_restricted: true)
expired_poll.geozones << geozone
create(:poll_question, poll: expired_poll, valid_answers: 'Luke, Leia')
login_as(create(:user, :level_two, geozone: geozone))
visit poll_path(expired_poll)
@@ -126,21 +130,23 @@ feature 'Polls' do
end
scenario 'Level 2 users in a poll with questions for a geozone which is not theirs' do
create(:poll_question, poll: poll, geozone_ids: [], valid_answers: 'Vader, Palpatine')
poll.update(geozone_restricted: true)
poll.geozones << create(:geozone)
create(:poll_question, poll: poll, valid_answers: 'Vader, Palpatine')
login_as(create(:user, :level_two))
visit poll_path(poll)
expect(page).to have_content("You can't answers the following 1 questions because are not available in your geozone.")
expect(page).to have_content('Vader')
expect(page).to have_content('Palpatine')
expect(page).to_not have_link('Vader')
expect(page).to_not have_link('Palpatine')
end
scenario 'Level 2 users reading a same-geozone question' do
create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
scenario 'Level 2 users reading a same-geozone poll' do
poll.update(geozone_restricted: true)
poll.geozones << geozone
create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
login_as(create(:user, :level_two, geozone: geozone))
visit poll_path(poll)
@@ -148,9 +154,9 @@ feature 'Polls' do
expect(page).to have_link('Chewbacca')
end
scenario 'Level 2 users reading a all-geozones question' do
create(:poll_question, poll: poll, all_geozones: true, valid_answers: 'Han Solo, Chewbacca')
login_as(create(:user, :level_two, geozone: geozone))
scenario 'Level 2 users reading a all-geozones poll' do
create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
login_as(create(:user, :level_two))
visit poll_path(poll)
expect(page).to have_link('Han Solo')
@@ -158,8 +164,8 @@ feature 'Polls' do
end
scenario 'Level 2 users who have already answered' do
question = create(:poll_question, poll: poll, geozone_ids:[geozone.id], valid_answers: 'Han Solo, Chewbacca')
user = create(:user, :level_two, geozone: geozone)
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
user = create(:user, :level_two)
create(:poll_partial_result, question: question, author: user, answer: 'Chewbacca')
login_as user
@@ -171,7 +177,9 @@ feature 'Polls' do
end
scenario 'Level 2 users answering', :js do
create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
poll.update(geozone_restricted: true)
poll.geozones << geozone
create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
user = create(:user, :level_two, geozone: geozone)
login_as user
visit poll_path(poll)
@@ -183,4 +191,4 @@ feature 'Polls' do
end
end
end
end

View File

@@ -14,7 +14,7 @@ feature 'Poll Questions' do
context 'Answering' do
let(:geozone) { create(:geozone) }
let(:poll) { create(:poll, geozone_restricted: true, geozone_ids: [geozone.id]) }
scenario 'Non-logged in users' do
question = create(:poll_question, valid_answers: 'Han Solo, Chewbacca')
@@ -29,7 +29,7 @@ feature 'Poll Questions' do
end
scenario 'Level 1 users' do
question = create(:poll_question, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
login_as(create(:user, geozone: geozone))
visit question_path(question)
@@ -43,9 +43,11 @@ feature 'Poll Questions' do
end
scenario 'Level 2 users in an poll question for a geozone which is not theirs' do
question = create(:poll_question, geozone_ids: [], valid_answers: 'Vader, Palpatine')
login_as(create(:user, :level_two))
other_poll = create(:poll, geozone_restricted: true, geozone_ids: [create(:geozone).id])
question = create(:poll_question, poll: other_poll, valid_answers: 'Vader, Palpatine')
login_as(create(:user, :level_two, geozone: geozone))
visit question_path(question)
expect(page).to have_content('Vader')
@@ -55,7 +57,7 @@ feature 'Poll Questions' do
end
scenario 'Level 2 users who can answer' do
question = create(:poll_question, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
login_as(create(:user, :level_two, geozone: geozone))
visit question_path(question)
@@ -65,7 +67,7 @@ feature 'Poll Questions' do
end
scenario 'Level 2 users who have already answered' do
question = create(:poll_question, geozone_ids:[geozone.id], valid_answers: 'Han Solo, Chewbacca')
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
user = create(:user, :level_two, geozone: geozone)
create(:poll_partial_result, question: question, author: user, answer: 'Chewbacca')
@@ -79,7 +81,7 @@ feature 'Poll Questions' do
end
scenario 'Level 2 users answering', :js do
question = create(:poll_question, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
user = create(:user, :level_two, geozone: geozone)
login_as user
@@ -92,4 +94,4 @@ feature 'Poll Questions' do
end
end
end
end

View File

@@ -27,19 +27,26 @@ describe "Abilities::Common" do
let(:current_poll) { create(:poll) }
let(:incoming_poll) { create(:poll, :incoming) }
let(:incoming_poll_from_own_geozone) { create(:poll, :incoming, geozone_restricted: true, geozones: [geozone]) }
let(:incoming_poll_from_other_geozone) { create(:poll, :incoming, geozone_restricted: true, geozones: [create(:geozone)]) }
let(:expired_poll) { create(:poll, :expired) }
let(:expired_poll_from_own_geozone) { create(:poll, :expired, geozone_restricted: true, geozones: [geozone]) }
let(:expired_poll_from_other_geozone) { create(:poll, :expired, geozone_restricted: true, geozones: [create(:geozone)]) }
let(:poll) { create(:poll, geozone_restricted: false) }
let(:poll_from_own_geozone) { create(:poll, geozone_restricted: true, geozones: [geozone]) }
let(:poll_from_other_geozone) { create(:poll, geozone_restricted: true, geozones: [create(:geozone)]) }
let(:poll_question_from_own_geozone) { create(:poll_question, geozones: [geozone]) }
let(:poll_question_from_other_geozone) { create(:poll_question, geozones: [create(:geozone)]) }
let(:poll_question_from_all_geozones) { create(:poll_question, all_geozones: true) }
let(:poll_question_from_own_geozone) { create(:poll_question, poll: poll_from_own_geozone) }
let(:poll_question_from_other_geozone) { create(:poll_question, poll: poll_from_other_geozone) }
let(:poll_question_from_all_geozones) { create(:poll_question, poll: poll) }
let(:expired_poll_question_from_own_geozone) { create(:poll_question, poll: expired_poll, geozones: [geozone]) }
let(:expired_poll_question_from_other_geozone) { create(:poll_question, poll: expired_poll, geozones: [create(:geozone)]) }
let(:expired_poll_question_from_all_geozones) { create(:poll_question, poll: expired_poll, all_geozones: true) }
let(:expired_poll_question_from_own_geozone) { create(:poll_question, poll: expired_poll_from_own_geozone) }
let(:expired_poll_question_from_other_geozone) { create(:poll_question, poll: expired_poll_from_other_geozone) }
let(:expired_poll_question_from_all_geozones) { create(:poll_question, poll: expired_poll) }
let(:incoming_poll_question_from_own_geozone) { create(:poll_question, poll: incoming_poll, geozones: [geozone]) }
let(:incoming_poll_question_from_other_geozone) { create(:poll_question, poll: incoming_poll, geozones: [create(:geozone)]) }
let(:incoming_poll_question_from_all_geozones) { create(:poll_question, poll: incoming_poll, all_geozones: true) }
let(:incoming_poll_question_from_own_geozone) { create(:poll_question, poll: incoming_poll_from_own_geozone) }
let(:incoming_poll_question_from_other_geozone) { create(:poll_question, poll: incoming_poll_from_other_geozone) }
let(:incoming_poll_question_from_all_geozones) { create(:poll_question, poll: incoming_poll) }
it { should be_able_to(:index, Debate) }
it { should be_able_to(:show, debate) }

View File

@@ -20,7 +20,6 @@ RSpec.describe Poll::Question, type: :model do
expect(q.author_visible_name).to eq(p.author.name)
expect(q.proposal_id).to eq(p.id)
expect(q.title).to eq(p.title)
expect(q.all_geozones).to be true
end
end