1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.MastodonAPI.PollViewTest do
9 alias Pleroma.Web.CommonAPI
10 alias Pleroma.Web.MastodonAPI.PollView
12 import Pleroma.Factory
16 mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
20 test "renders a poll" do
24 CommonAPI.post(user, %{
25 status: "Is Tenshi eating a corndog cute?",
27 options: ["absolutely!", "sure", "yes", "why are you even asking?"],
32 object = Object.normalize(activity, fetch: false)
37 id: to_string(object.id),
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}
47 pleroma: %{non_anonymous: false}
50 result = PollView.render("show.json", %{object: object})
51 expires_at = result.expires_at
52 result = Map.delete(result, :expires_at)
54 assert result == expected
56 expires_at = NaiveDateTime.from_iso8601!(expires_at)
57 assert NaiveDateTime.diff(expires_at, NaiveDateTime.utc_now()) in 15..20
60 test "detects if it is multiple choice" do
64 CommonAPI.post(user, %{
65 status: "Which Mastodon developer is your favourite?",
67 options: ["Gargron", "Eugen"],
75 object = Object.normalize(activity, fetch: false)
77 {:ok, _votes, object} = CommonAPI.vote(voter, object, [0, 1])
85 PollView.render("show.json", %{object: object})
89 test "detects emoji" do
93 CommonAPI.post(user, %{
94 status: "What's with the smug face?",
96 options: [":blank: sip", ":blank::blank: sip", ":blank::blank::blank: sip"],
101 object = Object.normalize(activity, fetch: false)
103 assert %{emojis: [%{shortcode: "blank"}]} = PollView.render("show.json", %{object: object})
106 test "detects vote status" do
108 other_user = insert(:user)
111 CommonAPI.post(user, %{
112 status: "Which input devices do you use?",
114 options: ["mouse", "trackball", "trackpoint"],
120 object = Object.normalize(activity, fetch: false)
122 {:ok, _, object} = CommonAPI.vote(other_user, object, [1, 2])
124 result = PollView.render("show.json", %{object: object, for: other_user})
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
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})
137 assert result[:expires_at] == nil
138 assert result[:expired] == false
141 test "doesn't strips HTML tags" do
145 CommonAPI.post(user, %{
146 status: "What's with the smug face?",
149 "<input type=\"date\">",
150 "<input type=\"date\" >",
151 "<input type=\"date\"/>",
152 "<input type=\"date\"></input>"
158 object = Object.normalize(activity, fetch: false)
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}
167 } = PollView.render("show.json", %{object: object})
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})
174 assert result[:pleroma][:non_anonymous] == true