1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.Feed.UserControllerTest do
6 use Pleroma.Web.ConnCase
15 clear_config_all([:instance, :federating]) do
16 Config.put([:instance, :federating], true)
22 test "gets a feed", %{conn: conn} do
25 %{max_length: 10, omission: "..."}
28 activity = insert(:note_activity)
33 "content" => "This is :moominmamma: note ",
37 %{"mediaType" => "image/png", "href" => "https://pleroma.gov/image.png"}
41 "inReplyTo" => activity.data["id"]
45 note_activity = insert(:note_activity, note: note)
46 user = User.get_cached_by_ap_id(note_activity.data["actor"])
52 "content" => "42 This is :moominmamma: note ",
53 "inReplyTo" => activity.data["id"]
57 _note_activity2 = insert(:note_activity, note: note2)
58 object = Object.normalize(note_activity)
62 |> put_req_header("content-type", "application/atom+xml")
63 |> get(user_feed_path(conn, :feed, user.nickname))
69 |> SweetXml.xpath(~x"//entry/title/text()"l)
71 assert activity_titles == ['42 This...', 'This is...']
72 assert resp =~ object.data["content"]
75 test "returns 404 for a missing feed", %{conn: conn} do
78 |> put_req_header("content-type", "application/atom+xml")
79 |> get(user_feed_path(conn, :feed, "nonexisting"))
81 assert response(conn, 404)
85 describe "feed_redirect" do
86 test "undefined format. it redirects to feed", %{conn: conn} do
87 note_activity = insert(:note_activity)
88 user = User.get_cached_by_ap_id(note_activity.data["actor"])
92 |> put_req_header("accept", "application/xml")
93 |> get("/users/#{user.nickname}")
97 "<html><body>You are being <a href=\"#{Pleroma.Web.base_url()}/users/#{
99 }/feed.atom\">redirected</a>.</body></html>"
102 test "undefined format. it returns error when user not found", %{conn: conn} do
105 |> put_req_header("accept", "application/xml")
106 |> get(user_feed_path(conn, :feed, "jimm"))
109 assert response == ~S({"error":"Not found"})
112 test "activity+json format. it redirects on actual feed of user", %{conn: conn} do
113 note_activity = insert(:note_activity)
114 user = User.get_cached_by_ap_id(note_activity.data["actor"])
118 |> put_req_header("accept", "application/activity+json")
119 |> get("/users/#{user.nickname}")
120 |> json_response(200)
122 assert response["endpoints"] == %{
123 "oauthAuthorizationEndpoint" => "#{Pleroma.Web.base_url()}/oauth/authorize",
124 "oauthRegistrationEndpoint" => "#{Pleroma.Web.base_url()}/api/v1/apps",
125 "oauthTokenEndpoint" => "#{Pleroma.Web.base_url()}/oauth/token",
126 "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox",
127 "uploadMedia" => "#{Pleroma.Web.base_url()}/api/ap/upload_media"
130 assert response["@context"] == [
131 "https://www.w3.org/ns/activitystreams",
132 "http://localhost:4001/schemas/litepub-0.1.jsonld",
133 %{"@language" => "und"}
136 assert Map.take(response, [
141 "manuallyApprovesFollowers",
150 "followers" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/followers",
151 "following" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/following",
152 "id" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}",
153 "inbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/inbox",
154 "manuallyApprovesFollowers" => false,
156 "outbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/outbox",
157 "preferredUsername" => user.nickname,
158 "summary" => user.bio,
161 "url" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}"
165 test "activity+json format. it returns error whe use not found", %{conn: conn} do
168 |> put_req_header("accept", "application/activity+json")
169 |> get("/users/jimm")
170 |> json_response(404)
172 assert response == "Not found"
175 test "json format. it redirects on actual feed of user", %{conn: conn} do
176 note_activity = insert(:note_activity)
177 user = User.get_cached_by_ap_id(note_activity.data["actor"])
181 |> put_req_header("accept", "application/json")
182 |> get("/users/#{user.nickname}")
183 |> json_response(200)
185 assert response["endpoints"] == %{
186 "oauthAuthorizationEndpoint" => "#{Pleroma.Web.base_url()}/oauth/authorize",
187 "oauthRegistrationEndpoint" => "#{Pleroma.Web.base_url()}/api/v1/apps",
188 "oauthTokenEndpoint" => "#{Pleroma.Web.base_url()}/oauth/token",
189 "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox",
190 "uploadMedia" => "#{Pleroma.Web.base_url()}/api/ap/upload_media"
193 assert response["@context"] == [
194 "https://www.w3.org/ns/activitystreams",
195 "http://localhost:4001/schemas/litepub-0.1.jsonld",
196 %{"@language" => "und"}
199 assert Map.take(response, [
204 "manuallyApprovesFollowers",
213 "followers" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/followers",
214 "following" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/following",
215 "id" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}",
216 "inbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/inbox",
217 "manuallyApprovesFollowers" => false,
219 "outbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/outbox",
220 "preferredUsername" => user.nickname,
221 "summary" => user.bio,
224 "url" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}"
228 test "json format. it returns error whe use not found", %{conn: conn} do
231 |> put_req_header("accept", "application/json")
232 |> get("/users/jimm")
233 |> json_response(404)
235 assert response == "Not found"
238 test "html format. it redirects on actual feed of user", %{conn: conn} do
239 note_activity = insert(:note_activity)
240 user = User.get_cached_by_ap_id(note_activity.data["actor"])
244 |> get("/users/#{user.nickname}")
248 Fallback.RedirectController.redirector_with_meta(
254 test "html format. it returns error when user not found", %{conn: conn} do
257 |> get("/users/jimm")
258 |> json_response(404)
260 assert response == %{"error" => "Not found"}
264 describe "feed_redirect (depending on federation enabled state)" do
265 setup %{conn: conn} do
267 conn = put_req_header(conn, "accept", "application/json")
269 %{conn: conn, user: user}
272 clear_config([:instance, :federating])
274 test "renders if instance is federating", %{conn: conn, user: user} do
275 Config.put([:instance, :federating], true)
277 conn = get(conn, "/users/#{user.nickname}")
278 assert json_response(conn, 200)
281 test "renders 404 if instance is NOT federating", %{conn: conn, user: user} do
282 Config.put([:instance, :federating], false)
284 conn = get(conn, "/users/#{user.nickname}")
285 assert json_response(conn, 404)