Use option instead of answer text to find multiple answers

This commit is contained in:
taitus
2025-09-29 17:14:37 +02:00
parent b4b00487cc
commit 62e1c13e7e
2 changed files with 65 additions and 1 deletions

View File

@@ -86,4 +86,68 @@ RSpec.describe Poll::Question do
expect(question.options_total_votes).to eq 3
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