1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.PleromaAPI.EmojiReactionControllerTest do
6 use Oban.Testing, repo: Pleroma.Repo
7 use Pleroma.Web.ConnCase
10 alias Pleroma.Tests.ObanHelpers
12 alias Pleroma.Web.CommonAPI
14 import Pleroma.Factory
16 test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
18 other_user = insert(:user)
20 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
24 |> assign(:user, other_user)
25 |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
26 |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕")
27 |> json_response_and_validate_schema(200)
29 # We return the status, but this our implementation detail.
30 assert %{"id" => id} = result
31 assert to_string(activity.id) == id
33 assert result["pleroma"]["emoji_reactions"] == [
39 "account_ids" => [other_user.id]
43 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
45 ObanHelpers.perform_all()
46 # Reacting with a custom emoji
49 |> assign(:user, other_user)
50 |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
51 |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/:dinosaur:")
52 |> json_response_and_validate_schema(200)
54 # We return the status, but this our implementation detail.
55 assert %{"id" => id} = result
56 assert to_string(activity.id) == id
58 assert result["pleroma"]["emoji_reactions"] == [
63 "url" => "http://localhost:4001/emoji/dino walking.gif",
64 "account_ids" => [other_user.id]
68 # Reacting with a non-emoji
70 |> assign(:user, other_user)
71 |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
72 |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/x")
73 |> json_response_and_validate_schema(400)
76 test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
78 other_user = insert(:user)
80 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
81 {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
82 {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, ":dinosaur:")
84 ObanHelpers.perform_all()
88 |> assign(:user, other_user)
89 |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
90 |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕")
92 assert %{"id" => id} = json_response_and_validate_schema(result, 200)
93 assert to_string(activity.id) == id
99 |> assign(:user, other_user)
100 |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
101 |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/:dinosaur:")
103 assert %{"id" => id} = json_response_and_validate_schema(result, 200)
104 assert to_string(activity.id) == id
106 ObanHelpers.perform_all()
108 object = Object.get_by_ap_id(activity.data["object"])
110 assert object.data["reaction_count"] == 0
113 test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do
115 other_user = insert(:user)
116 doomed_user = insert(:user)
118 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
122 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
123 |> json_response_and_validate_schema(200)
127 {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
128 {:ok, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅")
130 User.perform(:delete, doomed_user)
134 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
135 |> json_response_and_validate_schema(200)
137 [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result
139 assert represented_user["id"] == other_user.id
143 |> assign(:user, other_user)
144 |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"]))
145 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
146 |> json_response_and_validate_schema(200)
148 assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] =
152 test "GET /api/v1/pleroma/statuses/:id/reactions?with_muted=true", %{conn: conn} do
154 user2 = insert(:user)
155 user3 = insert(:user)
157 token = insert(:oauth_token, user: user, scopes: ["read:statuses"])
159 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
161 {:ok, _} = CommonAPI.react_with_emoji(activity.id, user2, "🎅")
162 {:ok, _} = CommonAPI.react_with_emoji(activity.id, user3, "🎅")
166 |> assign(:user, user)
167 |> assign(:token, token)
168 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
169 |> json_response_and_validate_schema(200)
171 assert [%{"name" => "🎅", "count" => 2}] = result
173 User.mute(user, user3)
177 |> assign(:user, user)
178 |> assign(:token, token)
179 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
180 |> json_response_and_validate_schema(200)
182 assert [%{"name" => "🎅", "count" => 1}] = result
186 |> assign(:user, user)
187 |> assign(:token, token)
188 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions?with_muted=true")
189 |> json_response_and_validate_schema(200)
191 assert [%{"name" => "🎅", "count" => 2}] = result
194 test "GET /api/v1/pleroma/statuses/:id/reactions with :show_reactions disabled", %{conn: conn} do
195 clear_config([:instance, :show_reactions], false)
198 other_user = insert(:user)
200 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
201 {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
205 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
206 |> json_response_and_validate_schema(200)
211 test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
213 other_user = insert(:user)
215 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
219 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅")
220 |> json_response_and_validate_schema(200)
224 {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
225 {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
231 "accounts" => [represented_user],
237 |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅")
238 |> json_response_and_validate_schema(200)
240 assert represented_user["id"] == other_user.id