Add `account_activation_required` to /api/v1/instance
[akkoma] / test / 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" => %{"alerts" => %{"mention" => true, "test" => true}},
62 "subscription" => @sub
63 })
64 |> json_response_and_validate_schema(200)
65
66 [subscription] = Pleroma.Repo.all(Subscription)
67
68 assert %{
69 "alerts" => %{"mention" => true},
70 "endpoint" => subscription.endpoint,
71 "id" => to_string(subscription.id),
72 "server_key" => @server_key
73 } == result
74 end
75 end
76
77 describe "gets a user subscription" do
78 test "returns error when push disabled ", %{conn: conn} do
79 assert_error_when_disable_push do
80 conn
81 |> get("/api/v1/push/subscription", %{})
82 |> json_response_and_validate_schema(403)
83 end
84 end
85
86 test "returns error when user hasn't subscription", %{conn: conn} do
87 res =
88 conn
89 |> get("/api/v1/push/subscription", %{})
90 |> json_response_and_validate_schema(404)
91
92 assert %{"error" => "Record not found"} == res
93 end
94
95 test "returns a user subsciption", %{conn: conn, user: user, token: token} do
96 subscription =
97 insert(:push_subscription,
98 user: user,
99 token: token,
100 data: %{"alerts" => %{"mention" => true}}
101 )
102
103 res =
104 conn
105 |> get("/api/v1/push/subscription", %{})
106 |> json_response_and_validate_schema(200)
107
108 expect = %{
109 "alerts" => %{"mention" => true},
110 "endpoint" => "https://example.com/example/1234",
111 "id" => to_string(subscription.id),
112 "server_key" => @server_key
113 }
114
115 assert expect == res
116 end
117 end
118
119 describe "updates a user subsciption" do
120 setup %{conn: conn, user: user, token: token} do
121 subscription =
122 insert(:push_subscription,
123 user: user,
124 token: token,
125 data: %{"alerts" => %{"mention" => true}}
126 )
127
128 %{conn: conn, user: user, token: token, subscription: subscription}
129 end
130
131 test "returns error when push disabled ", %{conn: conn} do
132 assert_error_when_disable_push do
133 conn
134 |> put("/api/v1/push/subscription", %{data: %{"alerts" => %{"mention" => false}}})
135 |> json_response_and_validate_schema(403)
136 end
137 end
138
139 test "returns updated subsciption", %{conn: conn, subscription: subscription} do
140 res =
141 conn
142 |> put("/api/v1/push/subscription", %{
143 data: %{"alerts" => %{"mention" => false, "follow" => true}}
144 })
145 |> json_response_and_validate_schema(200)
146
147 expect = %{
148 "alerts" => %{"follow" => true, "mention" => false},
149 "endpoint" => "https://example.com/example/1234",
150 "id" => to_string(subscription.id),
151 "server_key" => @server_key
152 }
153
154 assert expect == res
155 end
156 end
157
158 describe "deletes the user subscription" do
159 test "returns error when push disabled ", %{conn: conn} do
160 assert_error_when_disable_push do
161 conn
162 |> delete("/api/v1/push/subscription", %{})
163 |> json_response_and_validate_schema(403)
164 end
165 end
166
167 test "returns error when user hasn't subscription", %{conn: conn} do
168 res =
169 conn
170 |> delete("/api/v1/push/subscription", %{})
171 |> json_response_and_validate_schema(404)
172
173 assert %{"error" => "Record not found"} == res
174 end
175
176 test "returns empty result and delete user subsciption", %{
177 conn: conn,
178 user: user,
179 token: token
180 } do
181 subscription =
182 insert(:push_subscription,
183 user: user,
184 token: token,
185 data: %{"alerts" => %{"mention" => true}}
186 )
187
188 res =
189 conn
190 |> delete("/api/v1/push/subscription", %{})
191 |> json_response_and_validate_schema(200)
192
193 assert %{} == res
194 refute Pleroma.Repo.get(Subscription, subscription.id)
195 end
196 end
197 end