FIX: Error when voting on a multiple poll without the min/max attrs.
This commit is contained in:
parent
4134c9b478
commit
21822cf0b7
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue