Update OpenAPI spec/schema and test to verify support for pleroma:emoji_reaction...
[akkoma] / test / pleroma / web / mastodon_api / controllers / subscription_controller_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do
6 use Pleroma.Web.ConnCase
7
8 import Pleroma.Factory
9
10 alias Pleroma.Web.Push
11 alias Pleroma.Web.Push.Subscription
12
13 @sub %{
14 "endpoint" => "https://example.com/example/1234",
15 "keys" => %{
16 "auth" => "8eDyX_uCN0XRhSbY5hs7Hg==",
17 "p256dh" =>
18 "BCIWgsnyXDv1VkhqL2P7YRBvdeuDnlwAPT2guNhdIoW3IP7GmHh1SMKPLxRf7x8vJy6ZFK3ol2ohgn_-0yP7QQA="
19 }
20 }
21 @server_key Keyword.get(Push.vapid_config(), :public_key)
22
23 setup do
24 user = insert(:user)
25 token = insert(:oauth_token, user: user, scopes: ["push"])
26
27 conn =
28 build_conn()
29 |> assign(:user, user)
30 |> assign(:token, token)
31 |> put_req_header("content-type", "application/json")
32
33 %{conn: conn, user: user, token: token}
34 end
35
36 defmacro assert_error_when_disable_push(do: yield) do
37 quote do
38 vapid_details = Application.get_env(:web_push_encryption, :vapid_details, [])
39 Application.put_env(:web_push_encryption, :vapid_details, [])
40
41 assert %{"error" => "Web push subscription is disabled on this Pleroma instance"} ==
42 unquote(yield)
43
44 Application.put_env(:web_push_encryption, :vapid_details, vapid_details)
45 end
46 end
47
48 describe "creates push subscription" do
49 test "returns error when push disabled ", %{conn: conn} do
50 assert_error_when_disable_push do
51 conn
52 |> post("/api/v1/push/subscription", %{subscription: @sub})
53 |> json_response_and_validate_schema(403)
54 end
55 end
56
57 test "successful creation", %{conn: conn} do
58 result =
59 conn
60 |> post("/api/v1/push/subscription", %{
61 "data" => %{
62 "alerts" => %{
63 "mention" => true,
64 "test" => true,
65 "pleroma:chat_mention" => true,
66 "pleroma:emoji_reaction" => true
67 }
68 },
69 "subscription" => @sub
70 })
71 |> json_response_and_validate_schema(200)
72
73 [subscription] = Pleroma.Repo.all(Subscription)
74
75 assert %{
76 "alerts" => %{
77 "mention" => true,
78 "pleroma:chat_mention" => true,
79 "pleroma:emoji_reaction" => true
80 },
81 "endpoint" => subscription.endpoint,
82 "id" => to_string(subscription.id),
83 "server_key" => @server_key
84 } == result
85 end
86 end
87
88 describe "gets a user subscription" do
89 test "returns error when push disabled ", %{conn: conn} do
90 assert_error_when_disable_push do
91 conn
92 |> get("/api/v1/push/subscription", %{})
93 |> json_response_and_validate_schema(403)
94 end
95 end
96
97 test "returns error when user hasn't subscription", %{conn: conn} do
98 res =
99 conn
100 |> get("/api/v1/push/subscription", %{})
101 |> json_response_and_validate_schema(404)
102
103 assert %{"error" => "Record not found"} == res
104 end
105
106 test "returns a user subsciption", %{conn: conn, user: user, token: token} do
107 subscription =
108 insert(:push_subscription,
109 user: user,
110 token: token,
111 data: %{"alerts" => %{"mention" => true}}
112 )
113
114 res =
115 conn
116 |> get("/api/v1/push/subscription", %{})
117 |> json_response_and_validate_schema(200)
118
119 expect = %{
120 "alerts" => %{"mention" => true},
121 "endpoint" => "https://example.com/example/1234",
122 "id" => to_string(subscription.id),
123 "server_key" => @server_key
124 }
125
126 assert expect == res
127 end
128 end
129
130 describe "updates a user subsciption" do
131 setup %{conn: conn, user: user, token: token} do
132 subscription =
133 insert(:push_subscription,
134 user: user,
135 token: token,
136 data: %{"alerts" => %{"mention" => true}}
137 )
138
139 %{conn: conn, user: user, token: token, subscription: subscription}
140 end
141
142 test "returns error when push disabled ", %{conn: conn} do
143 assert_error_when_disable_push do
144 conn
145 |> put("/api/v1/push/subscription", %{data: %{"alerts" => %{"mention" => false}}})
146 |> json_response_and_validate_schema(403)
147 end
148 end
149
150 test "returns updated subsciption", %{conn: conn, subscription: subscription} do
151 res =
152 conn
153 |> put("/api/v1/push/subscription", %{
154 data: %{"alerts" => %{"mention" => false, "follow" => true}}
155 })
156 |> json_response_and_validate_schema(200)
157
158 expect = %{
159 "alerts" => %{"follow" => true, "mention" => false},
160 "endpoint" => "https://example.com/example/1234",
161 "id" => to_string(subscription.id),
162 "server_key" => @server_key
163 }
164
165 assert expect == res
166 end
167 end
168
169 describe "deletes the user subscription" do
170 test "returns error when push disabled ", %{conn: conn} do
171 assert_error_when_disable_push do
172 conn
173 |> delete("/api/v1/push/subscription", %{})
174 |> json_response_and_validate_schema(403)
175 end
176 end
177
178 test "returns error when user hasn't subscription", %{conn: conn} do
179 res =
180 conn
181 |> delete("/api/v1/push/subscription", %{})
182 |> json_response_and_validate_schema(404)
183
184 assert %{"error" => "Record not found"} == res
185 end
186
187 test "returns empty result and delete user subsciption", %{
188 conn: conn,
189 user: user,
190 token: token
191 } do
192 subscription =
193 insert(:push_subscription,
194 user: user,
195 token: token,
196 data: %{"alerts" => %{"mention" => true}}
197 )
198
199 res =
200 conn
201 |> delete("/api/v1/push/subscription", %{})
202 |> json_response_and_validate_schema(200)
203
204 assert %{} == res
205 refute Pleroma.Repo.get(Subscription, subscription.id)
206 end
207 end
208 end