Use option instead of answer text to find multiple answers
This commit is contained in:
@@ -89,7 +89,7 @@ class Poll::Question < ApplicationRecord
|
|||||||
when "unique", nil
|
when "unique", nil
|
||||||
{ author: user }
|
{ author: user }
|
||||||
when "multiple"
|
when "multiple"
|
||||||
{ author: user, answer: option.title }
|
{ author: user, option: option }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -86,4 +86,68 @@ RSpec.describe Poll::Question do
|
|||||||
expect(question.options_total_votes).to eq 3
|
expect(question.options_total_votes).to eq 3
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#find_or_initialize_user_answer" do
|
||||||
|
let(:user) { create(:user) }
|
||||||
|
let(:other_user) { create(:user) }
|
||||||
|
|
||||||
|
context "unique question" do
|
||||||
|
let(:question) { create(:poll_question_unique, :abc) }
|
||||||
|
let(:answer_a) { question.question_options.find_by(title: "Answer A") }
|
||||||
|
let(:answer_b) { question.question_options.find_by(title: "Answer B") }
|
||||||
|
|
||||||
|
it "finds the existing answer for the same user" do
|
||||||
|
existing_answer = create(:poll_answer, question: question, author: user, option: answer_a)
|
||||||
|
create(:poll_answer, question: question, author: other_user, option: answer_b)
|
||||||
|
|
||||||
|
answer = question.find_or_initialize_user_answer(user, answer_b.id)
|
||||||
|
|
||||||
|
expect(answer).to eq existing_answer
|
||||||
|
expect(answer.author).to eq user
|
||||||
|
expect(answer.option).to eq answer_b
|
||||||
|
expect(answer.answer).to eq "Answer B"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "initializes a new answer when only another user has answered" do
|
||||||
|
create(:poll_answer, question: question, author: other_user, option: answer_a)
|
||||||
|
|
||||||
|
answer = question.find_or_initialize_user_answer(user, answer_a.id)
|
||||||
|
|
||||||
|
expect(answer).to be_new_record
|
||||||
|
expect(answer.author).to eq user
|
||||||
|
expect(answer.option).to eq answer_a
|
||||||
|
expect(answer.answer).to eq "Answer A"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "multiple question" do
|
||||||
|
let(:question) { create(:poll_question_multiple, :abc, max_votes: 3) }
|
||||||
|
let(:answer_a) { question.question_options.find_by(title: "Answer A") }
|
||||||
|
let(:answer_b) { question.question_options.find_by(title: "Answer B") }
|
||||||
|
|
||||||
|
it "finds the existing answer for the same user and option" do
|
||||||
|
existing_answer = create(:poll_answer, question: question, author: user, option: answer_a)
|
||||||
|
create(:poll_answer, question: question, author: other_user, option: answer_a)
|
||||||
|
|
||||||
|
answer = question.find_or_initialize_user_answer(user, answer_a.id)
|
||||||
|
|
||||||
|
expect(answer).to eq existing_answer
|
||||||
|
expect(answer.author).to eq user
|
||||||
|
expect(answer.option).to eq answer_a
|
||||||
|
expect(answer.answer).to eq "Answer A"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "initializes a new answer when selecting a different option" do
|
||||||
|
create(:poll_answer, question: question, author: user, option: answer_a)
|
||||||
|
create(:poll_answer, question: question, author: other_user, option: answer_b)
|
||||||
|
|
||||||
|
answer = question.find_or_initialize_user_answer(user, answer_b.id)
|
||||||
|
|
||||||
|
expect(answer).to be_new_record
|
||||||
|
expect(answer.author).to eq user
|
||||||
|
expect(answer.option).to eq answer_b
|
||||||
|
expect(answer.answer).to eq "Answer B"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user