Merge pull request #1389 from consul/polls-answerable-by
Adds specs for Poll.answerable_by, fixing issue with SQL join
This commit is contained in:
@@ -3,7 +3,7 @@ class Officing::VotersController < Officing::BaseController
|
||||
|
||||
def new
|
||||
@user = User.find(params[:id])
|
||||
@polls = Poll.current # fix and use answerable_by(@user)
|
||||
@polls = Poll.answerable_by(@user)
|
||||
end
|
||||
|
||||
def create
|
||||
@@ -22,4 +22,4 @@ class Officing::VotersController < Officing::BaseController
|
||||
params.require(:voter).permit(:poll_id, :user_id)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -41,7 +41,8 @@ class Poll < ActiveRecord::Base
|
||||
|
||||
def self.answerable_by(user)
|
||||
return none if user.nil? || user.unverified?
|
||||
current.joins(:geozones).where('geozone_restricted = ? or geozones.id = ?', false, user.geozone_id)
|
||||
current.joins('LEFT JOIN "geozones_polls" ON "geozones_polls"."poll_id" = "polls"."id"')
|
||||
.where('geozone_restricted = ? OR geozones_polls.geozone_id = ?', false, user.geozone_id)
|
||||
end
|
||||
|
||||
def votable_by?(user)
|
||||
|
||||
@@ -77,4 +77,67 @@ describe :poll do
|
||||
expect(poll.document_has_voted?(voter.document_number, voter.document_type)).to eq(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "answerable_by" do
|
||||
let(:geozone) {create(:geozone) }
|
||||
|
||||
let!(:current_poll) { create(:poll) }
|
||||
let!(:expired_poll) { create(:poll, :expired) }
|
||||
let!(:incoming_poll) { create(:poll, :incoming) }
|
||||
let!(:current_restricted_poll) { create(:poll, geozone_restricted: true, geozones: [geozone]) }
|
||||
let!(:expired_restricted_poll) { create(:poll, :expired, geozone_restricted: true, geozones: [geozone]) }
|
||||
let!(:incoming_restricted_poll) { create(:poll, :incoming, geozone_restricted: true, geozones: [geozone]) }
|
||||
let!(:all_polls) { [current_poll, expired_poll, incoming_poll, current_poll, expired_restricted_poll, incoming_restricted_poll] }
|
||||
let(:non_current_polls) { [expired_poll, incoming_poll, expired_restricted_poll, incoming_restricted_poll] }
|
||||
|
||||
let(:non_user) { nil }
|
||||
let(:level1) { create(:user) }
|
||||
let(:level2) { create(:user, :level_two) }
|
||||
let(:level2_from_geozone) { create(:user, :level_two, geozone: geozone) }
|
||||
let(:all_users) { [non_user, level1, level2, level2_from_geozone] }
|
||||
|
||||
describe 'instance method' do
|
||||
it "rejects non-users and level 1 users" do
|
||||
all_polls.each do |poll|
|
||||
expect(poll).to_not be_answerable_by(non_user)
|
||||
expect(poll).to_not be_answerable_by(level1)
|
||||
end
|
||||
end
|
||||
|
||||
it "rejects everyone when not current" do
|
||||
non_current_polls.each do |poll|
|
||||
all_users.each do |user|
|
||||
expect(poll).to_not be_answerable_by(user)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "accepts level 2 users when unrestricted and current" do
|
||||
expect(current_poll).to be_answerable_by(level2)
|
||||
expect(current_poll).to be_answerable_by(level2_from_geozone)
|
||||
end
|
||||
|
||||
it "accepts level 2 users only from the same geozone when restricted by geozone" do
|
||||
expect(current_restricted_poll).to_not be_answerable_by(level2)
|
||||
expect(current_restricted_poll).to be_answerable_by(level2_from_geozone)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'class method' do
|
||||
it "returns no polls for non-users and level 1 users" do
|
||||
expect(Poll.answerable_by(nil)).to be_empty
|
||||
expect(Poll.answerable_by(level1)).to be_empty
|
||||
end
|
||||
|
||||
it "returns unrestricted polls for level 2 users" do
|
||||
expect(Poll.answerable_by(level2).to_a).to eq([current_poll])
|
||||
end
|
||||
|
||||
it "returns restricted & unrestricted polls for level 2 users of the correct geozone" do
|
||||
list = Poll.answerable_by(level2_from_geozone)
|
||||
.order(:geozone_restricted)
|
||||
expect(list.to_a).to eq([current_poll, current_restricted_poll])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user