spec/controllers/poll_participations_controller_spec.rb
# frozen_string_literal: true

describe PollParticipationsController, type: :controller do
  let(:poll_post) { FactoryBot.create(:status_message_with_poll, public: true) }
  let(:poll_answer) { poll_post.poll.poll_answers.first }

  before do
    sign_in alice, scope: :user
    request.env["HTTP_ACCEPT"] = "application/json"
  end

  describe "voting on poll" do
    it "succeeds" do
      post :create, params: {post_id: poll_post.id, poll_answer_id: poll_answer.id}
      expect(response.status).to eq(201)
      poll_participation = JSON.parse(response.body)["poll_participation"]
      expect(poll_participation["poll_answer_id"]).to eq(poll_answer.id)
    end

    it "fails to vote twice" do
      post :create, params: {post_id: poll_post.id, poll_answer_id: poll_answer.id}
      expect(response.status).to eq(201)
      post :create, params: {post_id: poll_post.id, poll_answer_id: poll_answer.id}
      expect(response.status).to eq(403)
    end

    it "fails with bad answer id" do
      expect {
        post :create, params: {post_id: poll_post.id, poll_answer_id: -1}
      }.to raise_error(ActiveRecord::RecordNotFound)
    end

    it "fails with bad post id" do
      expect { post :create, params: {post_id: -1, poll_answer_id: poll_answer.id} }
        .to raise_error(ActiveRecord::RecordNotFound)
    end
  end
end
