0
0
mirror of https://github.com/ihabunek/toot.git synced 2025-08-22 19:24:07 -04:00
toot/tests/integration/test_polls.py
2025-08-06 10:06:47 +02:00

145 lines
4.3 KiB
Python

import json
from tests.integration.conftest import Run, assert_error, assert_ok, posted_status_id, strip_ansi
from toot import App, User, api, cli
def test_show_poll(app: App, user: User, run: Run):
result = run(
cli.post.post, "Answer me this",
"--poll-option", "foo",
"--poll-option", "bar",
"--poll-option", "baz",
)
assert_ok(result)
status_id = posted_status_id(result.stdout)
status = api.fetch_status(app, user, status_id).json()
poll_id = status["poll"]["id"]
result = run(cli.polls.show, poll_id)
assert_ok(result)
assert "foo" in result.stdout
assert "bar" in result.stdout
assert "baz" in result.stdout
assert f"Poll {poll_id}" in result.stdout
def test_show_poll_json(app: App, user: User, run: Run):
result = run(
cli.post.post, "Answer me this",
"--poll-option", "foo",
"--poll-option", "bar",
"--poll-option", "baz",
)
assert_ok(result)
status_id = posted_status_id(result.stdout)
status = api.fetch_status(app, user, status_id).json()
poll_id = status["poll"]["id"]
result = run(cli.polls.show, poll_id, "--json")
assert_ok(result)
poll = json.loads(result.stdout)
assert poll["id"] == poll_id
assert poll["options"] == [
{"title": "foo", "votes_count": 0},
{"title": "bar", "votes_count": 0},
{"title": "baz", "votes_count": 0},
]
assert poll["multiple"] is False
def test_vote_poll(app: App, user: User, friend: User, run: Run, run_as: Run):
result = run(
cli.post.post,
"Answer me this",
"--poll-option", "foo",
"--poll-option", "bar",
"--poll-option", "baz",
)
assert_ok(result)
status_id = posted_status_id(result.stdout)
status = api.fetch_status(app, user, status_id).json()
poll_id = status["poll"]["id"]
result = run_as(friend, cli.polls.vote, poll_id, "0")
assert_ok(result)
output_lines = strip_ansi(result.stdout).split("\n")
assert "foo ✓ Your vote" in output_lines
assert "bar" in output_lines
assert "baz" in output_lines
# Voting a second time should not succeed
result = run_as(friend, cli.polls.vote, poll_id, "0")
assert_error(result, "You have already voted on this poll")
def test_vote_poll_invalid_choice(app: App, user: User, friend: User, run: Run, run_as: Run):
result = run(
cli.post.post,
"Answer me this",
"--poll-option", "foo",
"--poll-option", "bar",
"--poll-option", "baz",
)
assert_ok(result)
status_id = posted_status_id(result.stdout)
status = api.fetch_status(app, user, status_id).json()
poll_id = status["poll"]["id"]
result = run_as(friend, cli.polls.vote, poll_id, "5") # invalid index
assert_error(result, "The chosen vote option does not exist")
def test_vote_not_multiple(app: App, user: User, friend: User, run: Run, run_as: Run):
result = run(
cli.post.post,
"Answer me this",
"--poll-option", "foo",
"--poll-option", "bar",
"--poll-option", "baz",
)
assert_ok(result)
status_id = posted_status_id(result.stdout)
status = api.fetch_status(app, user, status_id).json()
poll_id = status["poll"]["id"]
# Voting on multiple choices when poll is not multiple
result = run_as(friend, cli.polls.vote, poll_id, "0", "2")
# NB: Mastodon returns the wrong error here
assert_error(result, "You have already voted on this poll")
def test_vote_poll_multiple(app: App, user: User, friend: User, run: Run, run_as: Run):
result = run(
cli.post.post,
"Answer me this",
"--poll-option", "foo",
"--poll-option", "bar",
"--poll-option", "baz",
"--poll-multiple"
)
assert_ok(result)
status_id = posted_status_id(result.stdout)
status = api.fetch_status(app, user, status_id).json()
poll_id = status["poll"]["id"]
result = run_as(friend, cli.polls.vote, poll_id, "0", "2")
assert_ok(result)
output_lines = strip_ansi(result.stdout).split("\n")
assert "foo ✓ Your vote" in output_lines
assert "bar" in output_lines
assert "baz ✓ Your vote" in output_lines
# Voting a second time should not succeed
result = run_as(friend, cli.polls.vote, poll_id, "0", "2")
assert_error(result, "You have already voted on this poll")