1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.PleromaAPI.SubscriptionNotificationControllerTest do
6 use Pleroma.Web.ConnCase
9 alias Pleroma.SubscriptionNotification
11 alias Pleroma.Web.CommonAPI
12 import Pleroma.Factory
16 mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
20 clear_config([:instance, :public])
21 clear_config([:rich_media, :enabled])
23 describe "subscription_notifications" do
26 subscriber = insert(:user)
28 User.subscribe(subscriber, user)
30 {:ok, %{user: user, subscriber: subscriber}}
33 test "list of notifications", %{conn: conn, user: user, subscriber: subscriber} do
35 {:ok, _activity} = CommonAPI.post(user, %{"status" => status_text})
36 path = subscription_notification_path(conn, :index)
40 |> assign(:user, subscriber)
43 assert [%{"status" => %{"content" => response}} | _rest] = json_response(conn, 200)
44 assert response == status_text
47 test "getting a single notification", %{conn: conn, user: user, subscriber: subscriber} do
50 {:ok, _activity} = CommonAPI.post(user, %{"status" => status_text})
51 [notification] = Repo.all(SubscriptionNotification)
53 path = subscription_notification_path(conn, :show, notification)
57 |> assign(:user, subscriber)
60 assert %{"status" => %{"content" => response}} = json_response(conn, 200)
61 assert response == status_text
64 test "dismissing a single notification also deletes it", %{
67 subscriber: subscriber
70 {:ok, _activity} = CommonAPI.post(user, %{"status" => status_text})
72 [notification] = Repo.all(SubscriptionNotification)
76 |> assign(:user, subscriber)
77 |> post(subscription_notification_path(conn, :dismiss), %{"id" => notification.id})
79 assert %{} = json_response(conn, 200)
81 assert Repo.all(SubscriptionNotification) == []
84 test "clearing all notifications also deletes them", %{
87 subscriber: subscriber
89 status_text1 = "Hello"
90 status_text2 = "Hello again"
91 {:ok, _activity1} = CommonAPI.post(user, %{"status" => status_text1})
92 {:ok, _activity2} = CommonAPI.post(user, %{"status" => status_text2})
96 |> assign(:user, subscriber)
97 |> post(subscription_notification_path(conn, :clear))
99 assert %{} = json_response(conn, 200)
103 |> assign(:user, subscriber)
104 |> get(subscription_notification_path(conn, :index))
106 assert json_response(conn, 200) == []
108 assert Repo.all(SubscriptionNotification) == []
111 test "paginates notifications using min_id, since_id, max_id, and limit", %{
114 subscriber: subscriber
116 {:ok, activity1} = CommonAPI.post(user, %{"status" => "Hello 1"})
117 {:ok, activity2} = CommonAPI.post(user, %{"status" => "Hello 2"})
118 {:ok, activity3} = CommonAPI.post(user, %{"status" => "Hello 3"})
119 {:ok, activity4} = CommonAPI.post(user, %{"status" => "Hello 4"})
122 Repo.get_by(SubscriptionNotification, activity_id: activity1.id).id |> to_string()
125 Repo.get_by(SubscriptionNotification, activity_id: activity2.id).id |> to_string()
128 Repo.get_by(SubscriptionNotification, activity_id: activity3.id).id |> to_string()
131 Repo.get_by(SubscriptionNotification, activity_id: activity4.id).id |> to_string()
133 conn = assign(conn, :user, subscriber)
139 subscription_notification_path(conn, :index, %{
141 "min_id" => notification1_id
145 result = json_response(conn_res, 200)
146 assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
152 subscription_notification_path(conn, :index, %{
154 "since_id" => notification1_id
158 result = json_response(conn_res, 200)
159 assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
165 subscription_notification_path(conn, :index, %{
167 "max_id" => notification4_id
171 result = json_response(conn_res, 200)
172 assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
175 test "destroy multiple", %{conn: conn, user: user1, subscriber: user2} do
176 # mutual subscription
177 User.subscribe(user1, user2)
179 {:ok, activity1} = CommonAPI.post(user1, %{"status" => "Hello 1"})
180 {:ok, activity2} = CommonAPI.post(user1, %{"status" => "World 1"})
181 {:ok, activity3} = CommonAPI.post(user2, %{"status" => "Hello 2"})
182 {:ok, activity4} = CommonAPI.post(user2, %{"status" => "World 2"})
185 Repo.get_by(SubscriptionNotification, activity_id: activity1.id).id |> to_string()
188 Repo.get_by(SubscriptionNotification, activity_id: activity2.id).id |> to_string()
191 Repo.get_by(SubscriptionNotification, activity_id: activity3.id).id |> to_string()
194 Repo.get_by(SubscriptionNotification, activity_id: activity4.id).id |> to_string()
196 conn = assign(conn, :user, user1)
198 conn_res = get(conn, subscription_notification_path(conn, :index))
200 result = json_response(conn_res, 200)
202 Enum.each(result, fn %{"id" => id} ->
203 assert id in [notification3_id, notification4_id]
206 conn2 = assign(conn, :user, user2)
208 conn_res = get(conn2, subscription_notification_path(conn, :index))
210 result = json_response(conn_res, 200)
212 Enum.each(result, fn %{"id" => id} ->
213 assert id in [notification1_id, notification2_id]
217 delete(conn, subscription_notification_path(conn, :destroy_multiple), %{
218 "ids" => [notification3_id, notification4_id]
221 assert json_response(conn_destroy, 200) == %{}
223 conn_res = get(conn2, subscription_notification_path(conn, :index))
225 result = json_response(conn_res, 200)
227 Enum.each(result, fn %{"id" => id} ->
228 assert id in [notification1_id, notification2_id]
231 assert length(Repo.all(SubscriptionNotification)) == 2