1 defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
2 use Pleroma.Web.ConnCase
4 alias Pleroma.Web.ActivityPub.{UserView, ObjectView}
5 alias Pleroma.{Repo, User}
9 Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
14 test "with the relay active, it returns the relay user", %{conn: conn} do
17 |> get(activity_pub_path(conn, :relay))
20 assert res["id"] =~ "/relay"
23 test "with the relay disabled, it returns 404", %{conn: conn} do
24 Pleroma.Config.put([:instance, :allow_relay], false)
27 |> get(activity_pub_path(conn, :relay))
31 Pleroma.Config.put([:instance, :allow_relay], true)
35 describe "/users/:nickname" do
36 test "it returns a json representation of the user", %{conn: conn} do
41 |> put_req_header("accept", "application/activity+json")
42 |> get("/users/#{user.nickname}")
44 user = Repo.get(User, user.id)
46 assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
50 describe "/object/:uuid" do
51 test "it returns a json representation of the object", %{conn: conn} do
53 uuid = String.split(note.data["id"], "/") |> List.last()
57 |> put_req_header("accept", "application/activity+json")
58 |> get("/objects/#{uuid}")
60 assert json_response(conn, 200) == ObjectView.render("object.json", %{object: note})
63 test "it returns 404 for non-public messages", %{conn: conn} do
64 note = insert(:direct_note)
65 uuid = String.split(note.data["id"], "/") |> List.last()
69 |> put_req_header("accept", "application/activity+json")
70 |> get("/objects/#{uuid}")
72 assert json_response(conn, 404)
77 test "it inserts an incoming activity into the database", %{conn: conn} do
78 data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
82 |> assign(:valid_signature, true)
83 |> put_req_header("content-type", "application/activity+json")
84 |> post("/inbox", data)
86 assert "ok" == json_response(conn, 200)
88 assert Activity.get_by_ap_id(data["id"])
92 describe "/users/:nickname/inbox" do
93 test "it inserts an incoming activity into the database", %{conn: conn} do
97 File.read!("test/fixtures/mastodon-post-activity.json")
99 |> Map.put("bcc", [user.ap_id])
103 |> assign(:valid_signature, true)
104 |> put_req_header("content-type", "application/activity+json")
105 |> post("/users/#{user.nickname}/inbox", data)
107 assert "ok" == json_response(conn, 200)
109 assert Activity.get_by_ap_id(data["id"])
113 describe "/users/:nickname/outbox" do
114 test "it returns a note activity in a collection", %{conn: conn} do
115 note_activity = insert(:note_activity)
116 user = User.get_cached_by_ap_id(note_activity.data["actor"])
120 |> put_req_header("accept", "application/activity+json")
121 |> get("/users/#{user.nickname}/outbox")
123 assert response(conn, 200) =~ note_activity.data["object"]["content"]
126 test "it returns an announce activity in a collection", %{conn: conn} do
127 announce_activity = insert(:announce_activity)
128 user = User.get_cached_by_ap_id(announce_activity.data["actor"])
132 |> put_req_header("accept", "application/activity+json")
133 |> get("/users/#{user.nickname}/outbox")
135 assert response(conn, 200) =~ announce_activity.data["object"]
139 describe "/users/:nickname/followers" do
140 test "it returns the followers in a collection", %{conn: conn} do
142 user_two = insert(:user)
143 User.follow(user, user_two)
147 |> get("/users/#{user_two.nickname}/followers")
148 |> json_response(200)
150 assert result["first"]["orderedItems"] == [user.ap_id]
153 test "it returns returns empty if the user has 'hide_network' set", %{conn: conn} do
155 user_two = insert(:user, %{info: %{hide_network: true}})
156 User.follow(user, user_two)
160 |> get("/users/#{user_two.nickname}/followers")
161 |> json_response(200)
163 assert result["first"]["orderedItems"] == []
164 assert result["totalItems"] == 1
167 test "it works for more than 10 users", %{conn: conn} do
170 Enum.each(1..15, fn _ ->
171 other_user = insert(:user)
172 User.follow(other_user, user)
177 |> get("/users/#{user.nickname}/followers")
178 |> json_response(200)
180 assert length(result["first"]["orderedItems"]) == 10
181 assert result["first"]["totalItems"] == 15
182 assert result["totalItems"] == 15
186 |> get("/users/#{user.nickname}/followers?page=2")
187 |> json_response(200)
189 assert length(result["orderedItems"]) == 5
190 assert result["totalItems"] == 15
194 describe "/users/:nickname/following" do
195 test "it returns the following in a collection", %{conn: conn} do
197 user_two = insert(:user)
198 User.follow(user, user_two)
202 |> get("/users/#{user.nickname}/following")
203 |> json_response(200)
205 assert result["first"]["orderedItems"] == [user_two.ap_id]
208 test "it returns returns empty if the user has 'hide_network' set", %{conn: conn} do
209 user = insert(:user, %{info: %{hide_network: true}})
210 user_two = insert(:user)
211 User.follow(user, user_two)
215 |> get("/users/#{user.nickname}/following")
216 |> json_response(200)
218 assert result["first"]["orderedItems"] == []
219 assert result["totalItems"] == 1
222 test "it works for more than 10 users", %{conn: conn} do
225 Enum.each(1..15, fn _ ->
226 user = Repo.get(User, user.id)
227 other_user = insert(:user)
228 User.follow(user, other_user)
233 |> get("/users/#{user.nickname}/following")
234 |> json_response(200)
236 assert length(result["first"]["orderedItems"]) == 10
237 assert result["first"]["totalItems"] == 15
238 assert result["totalItems"] == 15
242 |> get("/users/#{user.nickname}/following?page=2")
243 |> json_response(200)
245 assert length(result["orderedItems"]) == 5
246 assert result["totalItems"] == 15