Merge remote-tracking branch 'pleroma/develop' into bugfix/apc2s_upload_activity
[akkoma] / test / web / twitter_api / remote_follow_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.TwitterAPI.RemoteFollowControllerTest do
6 use Pleroma.Web.ConnCase
7
8 alias Pleroma.Config
9 alias Pleroma.User
10 alias Pleroma.Web.CommonAPI
11
12 import ExUnit.CaptureLog
13 import Pleroma.Factory
14
15 setup do
16 Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
17 :ok
18 end
19
20 clear_config_all([:instance, :federating]) do
21 Config.put([:instance, :federating], true)
22 end
23
24 clear_config([:instance])
25 clear_config([:frontend_configurations, :pleroma_fe])
26 clear_config([:user, :deny_follow_blocked])
27
28 describe "GET /ostatus_subscribe - remote_follow/2" do
29 test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} do
30 assert conn
31 |> get(
32 remote_follow_path(conn, :follow, %{
33 acct: "https://mastodon.social/users/emelie/statuses/101849165031453009"
34 })
35 )
36 |> redirected_to() =~ "/notice/"
37 end
38
39 test "show follow account page if the `acct` is a account link", %{conn: conn} do
40 response =
41 conn
42 |> get(remote_follow_path(conn, :follow, %{acct: "https://mastodon.social/users/emelie"}))
43 |> html_response(200)
44
45 assert response =~ "Log in to follow"
46 end
47
48 test "show follow page if the `acct` is a account link", %{conn: conn} do
49 user = insert(:user)
50
51 response =
52 conn
53 |> assign(:user, user)
54 |> get(remote_follow_path(conn, :follow, %{acct: "https://mastodon.social/users/emelie"}))
55 |> html_response(200)
56
57 assert response =~ "Remote follow"
58 end
59
60 test "show follow page with error when user cannot fecth by `acct` link", %{conn: conn} do
61 user = insert(:user)
62
63 assert capture_log(fn ->
64 response =
65 conn
66 |> assign(:user, user)
67 |> get(
68 remote_follow_path(conn, :follow, %{
69 acct: "https://mastodon.social/users/not_found"
70 })
71 )
72 |> html_response(200)
73
74 assert response =~ "Error fetching user"
75 end) =~ "Object has been deleted"
76 end
77 end
78
79 describe "POST /ostatus_subscribe - do_follow/2 with assigned user " do
80 test "required `follow | write:follows` scope", %{conn: conn} do
81 user = insert(:user)
82 user2 = insert(:user)
83 read_token = insert(:oauth_token, user: user, scopes: ["read"])
84
85 assert capture_log(fn ->
86 response =
87 conn
88 |> assign(:user, user)
89 |> assign(:token, read_token)
90 |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}})
91 |> response(200)
92
93 assert response =~ "Error following account"
94 end) =~ "Insufficient permissions: follow | write:follows."
95 end
96
97 test "follows user", %{conn: conn} do
98 user = insert(:user)
99 user2 = insert(:user)
100
101 conn =
102 conn
103 |> assign(:user, user)
104 |> assign(:token, insert(:oauth_token, user: user, scopes: ["write:follows"]))
105 |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}})
106
107 assert redirected_to(conn) == "/users/#{user2.id}"
108 end
109
110 test "returns error when user is deactivated", %{conn: conn} do
111 user = insert(:user, deactivated: true)
112 user2 = insert(:user)
113
114 response =
115 conn
116 |> assign(:user, user)
117 |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}})
118 |> response(200)
119
120 assert response =~ "Error following account"
121 end
122
123 test "returns error when user is blocked", %{conn: conn} do
124 Pleroma.Config.put([:user, :deny_follow_blocked], true)
125 user = insert(:user)
126 user2 = insert(:user)
127
128 {:ok, _user_block} = Pleroma.User.block(user2, user)
129
130 response =
131 conn
132 |> assign(:user, user)
133 |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}})
134 |> response(200)
135
136 assert response =~ "Error following account"
137 end
138
139 test "returns error when followee not found", %{conn: conn} do
140 user = insert(:user)
141
142 response =
143 conn
144 |> assign(:user, user)
145 |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => "jimm"}})
146 |> response(200)
147
148 assert response =~ "Error following account"
149 end
150
151 test "returns success result when user already in followers", %{conn: conn} do
152 user = insert(:user)
153 user2 = insert(:user)
154 {:ok, _, _, _} = CommonAPI.follow(user, user2)
155
156 conn =
157 conn
158 |> assign(:user, refresh_record(user))
159 |> assign(:token, insert(:oauth_token, user: user, scopes: ["write:follows"]))
160 |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}})
161
162 assert redirected_to(conn) == "/users/#{user2.id}"
163 end
164 end
165
166 describe "POST /ostatus_subscribe - follow/2 without assigned user " do
167 test "follows", %{conn: conn} do
168 user = insert(:user)
169 user2 = insert(:user)
170
171 conn =
172 conn
173 |> post(remote_follow_path(conn, :do_follow), %{
174 "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id}
175 })
176
177 assert redirected_to(conn) == "/users/#{user2.id}"
178 assert user2.follower_address in User.following(user)
179 end
180
181 test "returns error when followee not found", %{conn: conn} do
182 user = insert(:user)
183
184 response =
185 conn
186 |> post(remote_follow_path(conn, :do_follow), %{
187 "authorization" => %{"name" => user.nickname, "password" => "test", "id" => "jimm"}
188 })
189 |> response(200)
190
191 assert response =~ "Error following account"
192 end
193
194 test "returns error when login invalid", %{conn: conn} do
195 user = insert(:user)
196
197 response =
198 conn
199 |> post(remote_follow_path(conn, :do_follow), %{
200 "authorization" => %{"name" => "jimm", "password" => "test", "id" => user.id}
201 })
202 |> response(200)
203
204 assert response =~ "Wrong username or password"
205 end
206
207 test "returns error when password invalid", %{conn: conn} do
208 user = insert(:user)
209 user2 = insert(:user)
210
211 response =
212 conn
213 |> post(remote_follow_path(conn, :do_follow), %{
214 "authorization" => %{"name" => user.nickname, "password" => "42", "id" => user2.id}
215 })
216 |> response(200)
217
218 assert response =~ "Wrong username or password"
219 end
220
221 test "returns error when user is blocked", %{conn: conn} do
222 Pleroma.Config.put([:user, :deny_follow_blocked], true)
223 user = insert(:user)
224 user2 = insert(:user)
225 {:ok, _user_block} = Pleroma.User.block(user2, user)
226
227 response =
228 conn
229 |> post(remote_follow_path(conn, :do_follow), %{
230 "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id}
231 })
232 |> response(200)
233
234 assert response =~ "Error following account"
235 end
236 end
237 end