82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
import pytest
|
|
|
|
from fbchat.models import Poll, PollOption, ThreadType
|
|
from utils import random_hex, subset
|
|
|
|
|
|
@pytest.fixture(scope="module", params=[
|
|
Poll(title=random_hex(), options=[]),
|
|
Poll(title=random_hex(), options=[
|
|
PollOption(random_hex(), vote=True),
|
|
PollOption(random_hex(), vote=True),
|
|
]),
|
|
Poll(title=random_hex(), options=[
|
|
PollOption(random_hex(), vote=False),
|
|
PollOption(random_hex(), vote=False),
|
|
]),
|
|
Poll(title=random_hex(), options=[
|
|
PollOption(random_hex(), vote=True),
|
|
PollOption(random_hex(), vote=True),
|
|
PollOption(random_hex(), vote=False),
|
|
PollOption(random_hex(), vote=False),
|
|
PollOption(random_hex()),
|
|
PollOption(random_hex()),
|
|
]),
|
|
pytest.param(
|
|
Poll(title=None, options=[]), marks=[pytest.mark.xfail(raises=ValueError)]
|
|
),
|
|
])
|
|
def poll_data(request, client1, group, catch_event):
|
|
with catch_event("onPollCreated") as x:
|
|
client1.createPoll(request.param, thread_id=group["id"])
|
|
options = client1.fetchPollOptions(x.res["poll"].uid)
|
|
return x.res, request.param, options
|
|
|
|
|
|
def test_create_poll(client1, group, catch_event, poll_data):
|
|
event, poll, _ = poll_data
|
|
assert subset(
|
|
event,
|
|
author_id=client1.uid,
|
|
thread_id=group["id"],
|
|
thread_type=ThreadType.GROUP,
|
|
)
|
|
assert subset(vars(event["poll"]), title=poll.title, options_count=len(poll.options))
|
|
for recv_option in event["poll"].options: # The recieved options may not be the full list
|
|
old_option, = list(filter(lambda o: o.text == recv_option.text, poll.options))
|
|
voters = [client1.uid] if old_option.vote else []
|
|
assert subset(vars(recv_option), voters=voters, votes_count=len(voters), vote=False)
|
|
|
|
|
|
def test_fetch_poll_options(client1, group, catch_event, poll_data):
|
|
_, poll, options = poll_data
|
|
assert len(options) == len(poll.options)
|
|
for option in options:
|
|
assert subset(vars(option))
|
|
|
|
|
|
@pytest.mark.trylast
|
|
def test_update_poll_vote(client1, group, catch_event, poll_data):
|
|
event, poll, options = poll_data
|
|
new_vote_ids = [o.uid for o in options[0:len(options):2] if not o.vote]
|
|
re_vote_ids = [o.uid for o in options[0:len(options):2] if o.vote]
|
|
new_options = [random_hex(), random_hex()]
|
|
with catch_event("onPollVoted") as x:
|
|
client1.updatePollVote(event["poll"].uid, option_ids=new_vote_ids + re_vote_ids, new_options=new_options)
|
|
|
|
assert subset(
|
|
x.res,
|
|
author_id=client1.uid,
|
|
thread_id=group["id"],
|
|
thread_type=ThreadType.GROUP,
|
|
)
|
|
assert subset(vars(x.res["poll"]), title=poll.title, options_count=len(options + new_options))
|
|
for o in new_vote_ids:
|
|
assert o in x.res["added_options"]
|
|
assert len(x.res["added_options"]) == len(new_vote_ids) + len(new_options)
|
|
assert set(x.res["removed_options"]) == set(o.uid for o in options if o.vote and o.uid not in re_vote_ids)
|