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