File: test_polls.py

package info (click to toggle)
toot 0.51.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,108 kB
  • sloc: python: 9,284; makefile: 41
file content (144 lines) | stat: -rw-r--r-- 4,444 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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")