Better error handling for ActivityPubController
[akkoma] / test / web / activity_pub / activity_pub_controller_test.exs
1 defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
2 use Pleroma.Web.ConnCase
3 import Pleroma.Factory
4 alias Pleroma.Web.ActivityPub.{UserView, ObjectView}
5 alias Pleroma.{Repo, User}
6 alias Pleroma.Activity
7
8 describe "/users/:nickname" do
9 test "it returns a json representation of the user", %{conn: conn} do
10 user = insert(:user)
11
12 conn =
13 conn
14 |> put_req_header("accept", "application/activity+json")
15 |> get("/users/#{user.nickname}")
16
17 user = Repo.get(User, user.id)
18
19 assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
20 end
21 end
22
23 describe "/object/:uuid" do
24 test "it returns a json representation of the object", %{conn: conn} do
25 note = insert(:note)
26 uuid = String.split(note.data["id"], "/") |> List.last()
27
28 conn =
29 conn
30 |> put_req_header("accept", "application/activity+json")
31 |> get("/objects/#{uuid}")
32
33 assert json_response(conn, 200) == ObjectView.render("object.json", %{object: note})
34 end
35
36 test "it returns 404 for non-public messages", %{conn: conn} do
37 note = insert(:direct_note)
38 uuid = String.split(note.data["id"], "/") |> List.last()
39
40 conn =
41 conn
42 |> put_req_header("accept", "application/activity+json")
43 |> get("/objects/#{uuid}")
44
45 assert json_response(conn, 404)
46 end
47 end
48
49 describe "/users/:nickname/inbox" do
50 test "it inserts an incoming activity into the database", %{conn: conn} do
51 data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
52
53 conn =
54 conn
55 |> assign(:valid_signature, true)
56 |> put_req_header("content-type", "application/activity+json")
57 |> post("/inbox", data)
58
59 assert "ok" == json_response(conn, 200)
60 :timer.sleep(500)
61 assert Activity.get_by_ap_id(data["id"])
62 end
63 end
64
65 describe "/users/:nickname/followers" do
66 test "it returns the followers in a collection", %{conn: conn} do
67 user = insert(:user)
68 user_two = insert(:user)
69 User.follow(user, user_two)
70
71 result =
72 conn
73 |> get("/users/#{user_two.nickname}/followers")
74 |> json_response(200)
75
76 assert result["first"]["orderedItems"] == [user.ap_id]
77 end
78
79 test "it works for more than 10 users", %{conn: conn} do
80 user = insert(:user)
81
82 Enum.each(1..15, fn _ ->
83 other_user = insert(:user)
84 User.follow(other_user, user)
85 end)
86
87 result =
88 conn
89 |> get("/users/#{user.nickname}/followers")
90 |> json_response(200)
91
92 assert length(result["first"]["orderedItems"]) == 10
93 assert result["first"]["totalItems"] == 15
94 assert result["totalItems"] == 15
95
96 result =
97 conn
98 |> get("/users/#{user.nickname}/followers?page=2")
99 |> json_response(200)
100
101 assert length(result["orderedItems"]) == 5
102 assert result["totalItems"] == 15
103 end
104 end
105
106 describe "/users/:nickname/following" do
107 test "it returns the following in a collection", %{conn: conn} do
108 user = insert(:user)
109 user_two = insert(:user)
110 User.follow(user, user_two)
111
112 result =
113 conn
114 |> get("/users/#{user.nickname}/following")
115 |> json_response(200)
116
117 assert result["first"]["orderedItems"] == [user_two.ap_id]
118 end
119
120 test "it works for more than 10 users", %{conn: conn} do
121 user = insert(:user)
122
123 Enum.each(1..15, fn _ ->
124 user = Repo.get(User, user.id)
125 other_user = insert(:user)
126 User.follow(user, other_user)
127 end)
128
129 result =
130 conn
131 |> get("/users/#{user.nickname}/following")
132 |> json_response(200)
133
134 assert length(result["first"]["orderedItems"]) == 10
135 assert result["first"]["totalItems"] == 15
136 assert result["totalItems"] == 15
137
138 result =
139 conn
140 |> get("/users/#{user.nickname}/following?page=2")
141 |> json_response(200)
142
143 assert length(result["orderedItems"]) == 5
144 assert result["totalItems"] == 15
145 end
146 end
147 end