summaryrefslogtreecommitdiff
path: root/test/web/mastodon_api/views/poll_view_test.exs
blob: 6211fa888758c92aa53733c899d2967c44dfbf7a (plain)
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
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.MastodonAPI.PollViewTest do
  use Pleroma.DataCase

  alias Pleroma.Object
  alias Pleroma.Web.CommonAPI
  alias Pleroma.Web.MastodonAPI.PollView

  import Pleroma.Factory
  import Tesla.Mock

  setup do
    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
    :ok
  end

  test "renders a poll" do
    user = insert(:user)

    {:ok, activity} =
      CommonAPI.post(user, %{
        "status" => "Is Tenshi eating a corndog cute?",
        "poll" => %{
          "options" => ["absolutely!", "sure", "yes", "why are you even asking?"],
          "expires_in" => 20
        }
      })

    object = Object.normalize(activity)

    expected = %{
      emojis: [],
      expired: false,
      id: to_string(object.id),
      multiple: false,
      options: [
        %{title: "absolutely!", votes_count: 0},
        %{title: "sure", votes_count: 0},
        %{title: "yes", votes_count: 0},
        %{title: "why are you even asking?", votes_count: 0}
      ],
      voted: false,
      votes_count: 0
    }

    result = PollView.render("show.json", %{object: object})
    expires_at = result.expires_at
    result = Map.delete(result, :expires_at)

    assert result == expected

    expires_at = NaiveDateTime.from_iso8601!(expires_at)
    assert NaiveDateTime.diff(expires_at, NaiveDateTime.utc_now()) in 15..20
  end

  test "detects if it is multiple choice" do
    user = insert(:user)

    {:ok, activity} =
      CommonAPI.post(user, %{
        "status" => "Which Mastodon developer is your favourite?",
        "poll" => %{
          "options" => ["Gargron", "Eugen"],
          "expires_in" => 20,
          "multiple" => true
        }
      })

    object = Object.normalize(activity)

    assert %{multiple: true} = PollView.render("show.json", %{object: object})
  end

  test "detects emoji" do
    user = insert(:user)

    {:ok, activity} =
      CommonAPI.post(user, %{
        "status" => "What's with the smug face?",
        "poll" => %{
          "options" => [":blank: sip", ":blank::blank: sip", ":blank::blank::blank: sip"],
          "expires_in" => 20
        }
      })

    object = Object.normalize(activity)

    assert %{emojis: [%{shortcode: "blank"}]} = PollView.render("show.json", %{object: object})
  end

  test "detects vote status" do
    user = insert(:user)
    other_user = insert(:user)

    {:ok, activity} =
      CommonAPI.post(user, %{
        "status" => "Which input devices do you use?",
        "poll" => %{
          "options" => ["mouse", "trackball", "trackpoint"],
          "multiple" => true,
          "expires_in" => 20
        }
      })

    object = Object.normalize(activity)

    {:ok, _, object} = CommonAPI.vote(other_user, object, [1, 2])

    result = PollView.render("show.json", %{object: object, for: other_user})

    assert result[:voted] == true
    assert Enum.at(result[:options], 1)[:votes_count] == 1
    assert Enum.at(result[:options], 2)[:votes_count] == 1
  end

  test "does not crash on polls with no end date" do
    object = Object.normalize("https://skippers-bin.com/notes/7x9tmrp97i")
    result = PollView.render("show.json", %{object: object})

    assert result[:expires_at] == nil
    assert result[:expired] == false
  end
end