1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
6 use Pleroma.Web.ConnCase
8 alias Pleroma.Web.ActivityPub.{UserView, ObjectView}
9 alias Pleroma.{Repo, User}
10 alias Pleroma.Activity
13 Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
18 test "with the relay active, it returns the relay user", %{conn: conn} do
21 |> get(activity_pub_path(conn, :relay))
24 assert res["id"] =~ "/relay"
27 test "with the relay disabled, it returns 404", %{conn: conn} do
28 Pleroma.Config.put([:instance, :allow_relay], false)
31 |> get(activity_pub_path(conn, :relay))
35 Pleroma.Config.put([:instance, :allow_relay], true)
39 describe "/users/:nickname" do
40 test "it returns a json representation of the user", %{conn: conn} do
45 |> put_req_header("accept", "application/activity+json")
46 |> get("/users/#{user.nickname}")
48 user = Repo.get(User, user.id)
50 assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
54 describe "/object/:uuid" do
55 test "it returns a json representation of the object", %{conn: conn} do
57 uuid = String.split(note.data["id"], "/") |> List.last()
61 |> put_req_header("accept", "application/activity+json")
62 |> get("/objects/#{uuid}")
64 assert json_response(conn, 200) == ObjectView.render("object.json", %{object: note})
67 test "it returns 404 for non-public messages", %{conn: conn} do
68 note = insert(:direct_note)
69 uuid = String.split(note.data["id"], "/") |> List.last()
73 |> put_req_header("accept", "application/activity+json")
74 |> get("/objects/#{uuid}")
76 assert json_response(conn, 404)
81 test "it inserts an incoming activity into the database", %{conn: conn} do
82 data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
86 |> assign(:valid_signature, true)
87 |> put_req_header("content-type", "application/activity+json")
88 |> post("/inbox", data)
90 assert "ok" == json_response(conn, 200)
92 assert Activity.get_by_ap_id(data["id"])
96 describe "/users/:nickname/inbox" do
97 test "it inserts an incoming activity into the database", %{conn: conn} do
101 File.read!("test/fixtures/mastodon-post-activity.json")
103 |> Map.put("bcc", [user.ap_id])
107 |> assign(:valid_signature, true)
108 |> put_req_header("content-type", "application/activity+json")
109 |> post("/users/#{user.nickname}/inbox", data)
111 assert "ok" == json_response(conn, 200)
113 assert Activity.get_by_ap_id(data["id"])
116 test "it rejects reads from other users", %{conn: conn} do
118 otheruser = insert(:user)
122 |> assign(:user, otheruser)
123 |> put_req_header("accept", "application/activity+json")
124 |> get("/users/#{user.nickname}/inbox")
126 assert json_response(conn, 403)
130 describe "/users/:nickname/outbox" do
131 test "it returns a note activity in a collection", %{conn: conn} do
132 note_activity = insert(:note_activity)
133 user = User.get_cached_by_ap_id(note_activity.data["actor"])
137 |> put_req_header("accept", "application/activity+json")
138 |> get("/users/#{user.nickname}/outbox")
140 assert response(conn, 200) =~ note_activity.data["object"]["content"]
143 test "it returns an announce activity in a collection", %{conn: conn} do
144 announce_activity = insert(:announce_activity)
145 user = User.get_cached_by_ap_id(announce_activity.data["actor"])
149 |> put_req_header("accept", "application/activity+json")
150 |> get("/users/#{user.nickname}/outbox")
152 assert response(conn, 200) =~ announce_activity.data["object"]
155 test "it rejects posts from other users", %{conn: conn} do
156 data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!()
158 otheruser = insert(:user)
162 |> assign(:user, otheruser)
163 |> put_req_header("content-type", "application/activity+json")
164 |> post("/users/#{user.nickname}/outbox", data)
166 assert json_response(conn, 403)
170 describe "/users/:nickname/followers" do
171 test "it returns the followers in a collection", %{conn: conn} do
173 user_two = insert(:user)
174 User.follow(user, user_two)
178 |> get("/users/#{user_two.nickname}/followers")
179 |> json_response(200)
181 assert result["first"]["orderedItems"] == [user.ap_id]
184 test "it returns returns empty if the user has 'hide_network' set", %{conn: conn} do
186 user_two = insert(:user, %{info: %{hide_network: true}})
187 User.follow(user, user_two)
191 |> get("/users/#{user_two.nickname}/followers")
192 |> json_response(200)
194 assert result["first"]["orderedItems"] == []
195 assert result["totalItems"] == 1
198 test "it works for more than 10 users", %{conn: conn} do
201 Enum.each(1..15, fn _ ->
202 other_user = insert(:user)
203 User.follow(other_user, user)
208 |> get("/users/#{user.nickname}/followers")
209 |> json_response(200)
211 assert length(result["first"]["orderedItems"]) == 10
212 assert result["first"]["totalItems"] == 15
213 assert result["totalItems"] == 15
217 |> get("/users/#{user.nickname}/followers?page=2")
218 |> json_response(200)
220 assert length(result["orderedItems"]) == 5
221 assert result["totalItems"] == 15
225 describe "/users/:nickname/following" do
226 test "it returns the following in a collection", %{conn: conn} do
228 user_two = insert(:user)
229 User.follow(user, user_two)
233 |> get("/users/#{user.nickname}/following")
234 |> json_response(200)
236 assert result["first"]["orderedItems"] == [user_two.ap_id]
239 test "it returns returns empty if the user has 'hide_network' set", %{conn: conn} do
240 user = insert(:user, %{info: %{hide_network: true}})
241 user_two = insert(:user)
242 User.follow(user, user_two)
246 |> get("/users/#{user.nickname}/following")
247 |> json_response(200)
249 assert result["first"]["orderedItems"] == []
250 assert result["totalItems"] == 1
253 test "it works for more than 10 users", %{conn: conn} do
256 Enum.each(1..15, fn _ ->
257 user = Repo.get(User, user.id)
258 other_user = insert(:user)
259 User.follow(user, other_user)
264 |> get("/users/#{user.nickname}/following")
265 |> json_response(200)
267 assert length(result["first"]["orderedItems"]) == 10
268 assert result["first"]["totalItems"] == 15
269 assert result["totalItems"] == 15
273 |> get("/users/#{user.nickname}/following?page=2")
274 |> json_response(200)
276 assert length(result["orderedItems"]) == 5
277 assert result["totalItems"] == 15