total rebase
[anni] / test / pleroma / web / web_finger / web_finger_controller_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
6   use Pleroma.Web.ConnCase
7
8   import ExUnit.CaptureLog
9   import Pleroma.Factory
10   import Tesla.Mock
11
12   setup do
13     mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
14     :ok
15   end
16
17   setup_all do: clear_config([:instance, :federating], true)
18
19   test "GET host-meta" do
20     response =
21       build_conn()
22       |> get("/.well-known/host-meta")
23
24     assert response.status == 200
25
26     response_xml =
27       response.resp_body
28       |> Floki.parse_document!(html_parser: Floki.HTMLParser.Mochiweb, attributes_as_maps: true)
29
30     expected_xml =
31       ~s(<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><Link rel="lrdd" template="#{Pleroma.Web.Endpoint.url()}/.well-known/webfinger?resource={uri}" type="application/xrd+xml" /></XRD>)
32       |> Floki.parse_document!(html_parser: Floki.HTMLParser.Mochiweb, attributes_as_maps: true)
33
34     assert match?(^response_xml, expected_xml)
35   end
36
37   test "Webfinger JRD" do
38     user =
39       insert(:user,
40         ap_id: "https://hyrule.world/users/zelda",
41         also_known_as: ["https://mushroom.kingdom/users/toad"]
42       )
43
44     response =
45       build_conn()
46       |> put_req_header("accept", "application/jrd+json")
47       |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
48       |> json_response(200)
49
50     assert response["subject"] == "acct:#{user.nickname}@localhost"
51
52     assert response["aliases"] == [
53              "https://hyrule.world/users/zelda",
54              "https://mushroom.kingdom/users/toad"
55            ]
56   end
57
58   test "reach user on tld, while pleroma is running on subdomain" do
59     clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com")
60
61     clear_config([Pleroma.Web.WebFinger, :domain], "example.com")
62
63     user = insert(:user, ap_id: "https://sub.example.com/users/bobby", nickname: "bobby")
64
65     response =
66       build_conn()
67       |> put_req_header("accept", "application/jrd+json")
68       |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@example.com")
69       |> json_response(200)
70
71     assert response["subject"] == "acct:#{user.nickname}@example.com"
72     assert response["aliases"] == ["https://sub.example.com/users/#{user.nickname}"]
73   end
74
75   test "it returns 404 when user isn't found (JSON)" do
76     result =
77       build_conn()
78       |> put_req_header("accept", "application/jrd+json")
79       |> get("/.well-known/webfinger?resource=acct:jimm@localhost")
80       |> json_response(404)
81
82     assert result == "Couldn't find user"
83   end
84
85   test "Webfinger XML" do
86     user =
87       insert(:user,
88         ap_id: "https://hyrule.world/users/zelda",
89         also_known_as: ["https://mushroom.kingdom/users/toad"]
90       )
91
92     response =
93       build_conn()
94       |> put_req_header("accept", "application/xrd+xml")
95       |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
96       |> response(200)
97
98     assert response =~ "<Alias>https://hyrule.world/users/zelda</Alias>"
99     assert response =~ "<Alias>https://mushroom.kingdom/users/toad</Alias>"
100   end
101
102   test "it returns 404 when user isn't found (XML)" do
103     result =
104       build_conn()
105       |> put_req_header("accept", "application/xrd+xml")
106       |> get("/.well-known/webfinger?resource=acct:jimm@localhost")
107       |> response(404)
108
109     assert result == "Couldn't find user"
110   end
111
112   test "Sends a 404 when invalid format" do
113     user = insert(:user)
114
115     assert capture_log(fn ->
116              assert_raise Phoenix.NotAcceptableError, fn ->
117                build_conn()
118                |> put_req_header("accept", "text/html")
119                |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
120              end
121            end) =~ "no supported media type in accept header"
122   end
123
124   test "Sends a 400 when resource param is missing" do
125     response =
126       build_conn()
127       |> put_req_header("accept", "application/xrd+xml,application/jrd+json")
128       |> get("/.well-known/webfinger")
129
130     assert response(response, 400)
131   end
132 end