total rebase
[anni] / test / pleroma / web / mastodon_api / views / poll_view_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.MastodonAPI.PollViewTest do
6   use Pleroma.DataCase
7
8   alias Pleroma.Object
9   alias Pleroma.Web.CommonAPI
10   alias Pleroma.Web.MastodonAPI.PollView
11
12   import Pleroma.Factory
13   import Tesla.Mock
14
15   setup do
16     mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
17     :ok
18   end
19
20   test "renders a poll" do
21     user = insert(:user)
22
23     {:ok, activity} =
24       CommonAPI.post(user, %{
25         status: "Is Tenshi eating a corndog cute?",
26         poll: %{
27           options: ["absolutely!", "sure", "yes", "why are you even asking?"],
28           expires_in: 20
29         }
30       })
31
32     object = Object.normalize(activity, fetch: false)
33
34     expected = %{
35       emojis: [],
36       expired: false,
37       id: to_string(object.id),
38       multiple: false,
39       options: [
40         %{title: "absolutely!", votes_count: 0},
41         %{title: "sure", votes_count: 0},
42         %{title: "yes", votes_count: 0},
43         %{title: "why are you even asking?", votes_count: 0}
44       ],
45       votes_count: 0,
46       voters_count: 0,
47       pleroma: %{non_anonymous: false}
48     }
49
50     result = PollView.render("show.json", %{object: object})
51     expires_at = result.expires_at
52     result = Map.delete(result, :expires_at)
53
54     assert result == expected
55
56     expires_at = NaiveDateTime.from_iso8601!(expires_at)
57     assert NaiveDateTime.diff(expires_at, NaiveDateTime.utc_now()) in 15..20
58   end
59
60   test "detects if it is multiple choice" do
61     user = insert(:user)
62
63     {:ok, activity} =
64       CommonAPI.post(user, %{
65         status: "Which Mastodon developer is your favourite?",
66         poll: %{
67           options: ["Gargron", "Eugen"],
68           expires_in: 20,
69           multiple: true
70         }
71       })
72
73     voter = insert(:user)
74
75     object = Object.normalize(activity, fetch: false)
76
77     {:ok, _votes, object} = CommonAPI.vote(voter, object, [0, 1])
78
79     assert match?(
80              %{
81                multiple: true,
82                voters_count: 1,
83                votes_count: 2
84              },
85              PollView.render("show.json", %{object: object})
86            )
87   end
88
89   test "detects emoji" do
90     user = insert(:user)
91
92     {:ok, activity} =
93       CommonAPI.post(user, %{
94         status: "What's with the smug face?",
95         poll: %{
96           options: [":blank: sip", ":blank::blank: sip", ":blank::blank::blank: sip"],
97           expires_in: 20
98         }
99       })
100
101     object = Object.normalize(activity, fetch: false)
102
103     assert %{emojis: [%{shortcode: "blank"}]} = PollView.render("show.json", %{object: object})
104   end
105
106   test "detects vote status" do
107     user = insert(:user)
108     other_user = insert(:user)
109
110     {:ok, activity} =
111       CommonAPI.post(user, %{
112         status: "Which input devices do you use?",
113         poll: %{
114           options: ["mouse", "trackball", "trackpoint"],
115           multiple: true,
116           expires_in: 20
117         }
118       })
119
120     object = Object.normalize(activity, fetch: false)
121
122     {:ok, _, object} = CommonAPI.vote(other_user, object, [1, 2])
123
124     result = PollView.render("show.json", %{object: object, for: other_user})
125
126     assert result[:voted] == true
127     assert 1 in result[:own_votes]
128     assert 2 in result[:own_votes]
129     assert Enum.at(result[:options], 1)[:votes_count] == 1
130     assert Enum.at(result[:options], 2)[:votes_count] == 1
131   end
132
133   test "does not crash on polls with no end date" do
134     object = Object.normalize("https://skippers-bin.com/notes/7x9tmrp97i", fetch: true)
135     result = PollView.render("show.json", %{object: object})
136
137     assert result[:expires_at] == nil
138     assert result[:expired] == false
139   end
140
141   test "doesn't strips HTML tags" do
142     user = insert(:user)
143
144     {:ok, activity} =
145       CommonAPI.post(user, %{
146         status: "What's with the smug face?",
147         poll: %{
148           options: [
149             "<input type=\"date\">",
150             "<input type=\"date\" >",
151             "<input type=\"date\"/>",
152             "<input type=\"date\"></input>"
153           ],
154           expires_in: 20
155         }
156       })
157
158     object = Object.normalize(activity, fetch: false)
159
160     assert %{
161              options: [
162                %{title: "<input type=\"date\">", votes_count: 0},
163                %{title: "<input type=\"date\" >", votes_count: 0},
164                %{title: "<input type=\"date\"/>", votes_count: 0},
165                %{title: "<input type=\"date\"></input>", votes_count: 0}
166              ]
167            } = PollView.render("show.json", %{object: object})
168   end
169
170   test "that poll is non anonymous" do
171     object = Object.normalize("https://friends.grishka.me/posts/54642", fetch: true)
172     result = PollView.render("show.json", %{object: object})
173
174     assert result[:pleroma][:non_anonymous] == true
175   end
176 end