FIX: Error when voting on a multiple poll without the min/max attrs.

This commit is contained in:
Alan Guo Xiang Tan 2022-01-05 09:50:49 +08:00
parent 4134c9b478
commit 21822cf0b7
2 changed files with 54 additions and 3 deletions

View File

@ -38,7 +38,10 @@ class DiscoursePoll::Poll
# Ensure consistency here as we do not have a unique index to limit the # Ensure consistency here as we do not have a unique index to limit the
# number of votes per the poll's configuration. # number of votes per the poll's configuration.
DB.query(<<~SQL, poll_id: poll_id, user_id: user.id, offset: serialized_poll[:type] == "multiple" ? serialized_poll[:max] : 1) is_multiple = serialized_poll[:type] == "multiple"
offset = is_multiple ? (serialized_poll[:max] || serialized_poll[:options].length) : 1
DB.query(<<~SQL, poll_id: poll_id, user_id: user.id, offset: offset)
DELETE FROM poll_votes DELETE FROM poll_votes
USING ( USING (
SELECT SELECT
@ -315,12 +318,12 @@ class DiscoursePoll::Poll
num_of_options = options.length num_of_options = options.length
if poll.multiple? if poll.multiple?
if num_of_options < poll.min if poll.min && (num_of_options < poll.min)
raise DiscoursePoll::Error.new(I18n.t( raise DiscoursePoll::Error.new(I18n.t(
"poll.min_vote_per_user", "poll.min_vote_per_user",
count: poll.min count: poll.min
)) ))
elsif num_of_options > poll.max elsif poll.max && (num_of_options > poll.max)
raise DiscoursePoll::Error.new(I18n.t( raise DiscoursePoll::Error.new(I18n.t(
"poll.max_vote_per_user", "poll.max_vote_per_user",
count: poll.max count: poll.max

View File

@ -127,6 +127,54 @@ describe DiscoursePoll::Poll do
I18n.t("poll.min_vote_per_user", count: poll.min) I18n.t("poll.min_vote_per_user", count: poll.min)
) )
end end
it 'should allow user to vote on a multiple poll even if min option is not configured' do
post_with_multiple_poll = Fabricate(:post, raw: <<~RAW)
[poll type=multiple max=3]
* 1
* 2
* 3
* 4
* 5
[/poll]
RAW
poll = post_with_multiple_poll.polls.first
DiscoursePoll::Poll.vote(
user,
post_with_multiple_poll.id,
"poll",
[poll.poll_options.first.digest]
)
expect(PollVote.where(poll: poll, user: user).pluck(:poll_option_id))
.to contain_exactly(poll.poll_options.first.id)
end
it 'should allow user to vote on a multiple poll even if max option is not configured' do
post_with_multiple_poll = Fabricate(:post, raw: <<~RAW)
[poll type=multiple min=1]
* 1
* 2
* 3
* 4
* 5
[/poll]
RAW
poll = post_with_multiple_poll.polls.first
DiscoursePoll::Poll.vote(
user,
post_with_multiple_poll.id,
"poll",
[poll.poll_options.first.digest, poll.poll_options.second.digest]
)
expect(PollVote.where(poll: poll, user: user).pluck(:poll_option_id))
.to contain_exactly(poll.poll_options.first.id, poll.poll_options.second.id)
end
end end
describe "post_created" do describe "post_created" do