From 86d42ce094b2dcdc1596f06584145b36e6b01fec Mon Sep 17 00:00:00 2001 From: kikito Date: Thu, 2 Feb 2017 16:41:04 +0100 Subject: [PATCH 1/2] Adds specs for Poll.answerable_by, fixing issue with SQL join --- app/models/poll.rb | 3 +- spec/models/poll/poll_spec.rb | 65 ++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/app/models/poll.rb b/app/models/poll.rb index 6acb5af03..a0486ae73 100644 --- a/app/models/poll.rb +++ b/app/models/poll.rb @@ -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) diff --git a/spec/models/poll/poll_spec.rb b/spec/models/poll/poll_spec.rb index b0bf923c0..80a57e916 100644 --- a/spec/models/poll/poll_spec.rb +++ b/spec/models/poll/poll_spec.rb @@ -77,4 +77,67 @@ describe :poll do expect(poll.document_has_voted?(voter.document_number, voter.document_type)).to eq(false) end end -end \ No newline at end of file + + 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 From 9c1a5847dedc22514873ecff886562cb70db2a4d Mon Sep 17 00:00:00 2001 From: kikito Date: Thu, 2 Feb 2017 16:53:57 +0100 Subject: [PATCH 2/2] uses answerable_by instead of current in voters controller --- app/controllers/officing/voters_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/officing/voters_controller.rb b/app/controllers/officing/voters_controller.rb index bb16a1412..dee1e00bd 100644 --- a/app/controllers/officing/voters_controller.rb +++ b/app/controllers/officing/voters_controller.rb @@ -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 \ No newline at end of file +end