discourse/plugins/poll/spec/integration/poll_endpoints_spec.rb

123 lines
3.4 KiB
Ruby

# frozen_string_literal: true
require "rails_helper"
describe "DiscoursePoll endpoints" do
describe "fetch voters for a poll" do
let(:user) { Fabricate(:user) }
let(:post) { Fabricate(:post, raw: "[poll public=true]\n- A\n- B\n[/poll]") }
let(:option_a) { "5c24fc1df56d764b550ceae1b9319125" }
let(:option_b) { "e89dec30bbd9bf50fabf6a05b4324edf" }
it "should return the right response" do
DiscoursePoll::Poll.vote(
post.id,
DiscoursePoll::DEFAULT_POLL_NAME,
[option_a],
user
)
get "/polls/voters.json", params: {
post_id: post.id,
poll_name: DiscoursePoll::DEFAULT_POLL_NAME
}
expect(response.status).to eq(200)
poll = JSON.parse(response.body)["voters"]
option = poll[option_a]
expect(option.length).to eq(1)
expect(option.first["id"]).to eq(user.id)
expect(option.first["username"]).to eq(user.username)
end
it 'should return the right response for a single option' do
DiscoursePoll::Poll.vote(
post.id,
DiscoursePoll::DEFAULT_POLL_NAME,
[option_a, option_b],
user
)
get "/polls/voters.json", params: {
post_id: post.id,
poll_name: DiscoursePoll::DEFAULT_POLL_NAME,
option_id: option_b
}
expect(response.status).to eq(200)
poll = JSON.parse(response.body)["voters"]
expect(poll[option_a]).to eq(nil)
option = poll[option_b]
expect(option.length).to eq(1)
expect(option.first["id"]).to eq(user.id)
expect(option.first["username"]).to eq(user.username)
end
describe 'when post_id is blank' do
it 'should raise the right error' do
get "/polls/voters.json", params: { poll_name: DiscoursePoll::DEFAULT_POLL_NAME }
expect(response.status).to eq(400)
end
end
describe 'when post_id is not valid' do
it 'should raise the right error' do
get "/polls/voters.json", params: {
post_id: -1,
poll_name: DiscoursePoll::DEFAULT_POLL_NAME
}
expect(response.status).to eq(422)
expect(response.body).to include('post_id is invalid')
end
end
describe 'when poll_name is blank' do
it 'should raise the right error' do
get "/polls/voters.json", params: { post_id: post.id }
expect(response.status).to eq(400)
end
end
describe 'when poll_name is not valid' do
it 'should raise the right error' do
get "/polls/voters.json", params: { post_id: post.id, poll_name: 'wrongpoll' }
expect(response.status).to eq(422)
expect(response.body).to include('poll_name is invalid')
end
end
context "number poll" do
let(:post) { Fabricate(:post, raw: "[poll type=number min=1 max=20 step=1 public=true]\n[/poll]") }
it 'should return the right response' do
post
DiscoursePoll::Poll.vote(
post.id,
DiscoursePoll::DEFAULT_POLL_NAME,
["4d8a15e3cc35750f016ce15a43937620"],
user
)
get "/polls/voters.json", params: {
post_id: post.id,
poll_name: DiscoursePoll::DEFAULT_POLL_NAME
}
expect(response.status).to eq(200)
poll = JSON.parse(response.body)["voters"]
expect(poll.first["id"]).to eq(user.id)
expect(poll.first["username"]).to eq(user.username)
end
end
end
end