Merge branch 'develop' into feature/addressable-lists
[akkoma] / test / web / mastodon_api / search_controller_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do
6 use Pleroma.Web.ConnCase
7
8 alias Pleroma.Object
9 alias Pleroma.Web
10 alias Pleroma.Web.CommonAPI
11 import Pleroma.Factory
12 import ExUnit.CaptureLog
13 import Tesla.Mock
14 import Mock
15
16 setup do
17 mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
18 :ok
19 end
20
21 describe ".search2" do
22 test "it returns empty result if user or status search return undefined error", %{conn: conn} do
23 with_mocks [
24 {Pleroma.User, [], [search: fn _q, _o -> raise "Oops" end]},
25 {Pleroma.Activity, [], [search: fn _u, _q -> raise "Oops" end]}
26 ] do
27 conn = get(conn, "/api/v2/search", %{"q" => "2hu"})
28
29 assert results = json_response(conn, 200)
30
31 assert results["accounts"] == []
32 assert results["statuses"] == []
33 end
34 end
35
36 test "search", %{conn: conn} do
37 user = insert(:user)
38 user_two = insert(:user, %{nickname: "shp@shitposter.club"})
39 user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
40
41 {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu private"})
42
43 {:ok, _activity} =
44 CommonAPI.post(user, %{
45 "status" => "This is about 2hu, but private",
46 "visibility" => "private"
47 })
48
49 {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
50
51 conn = get(conn, "/api/v2/search", %{"q" => "2hu #private"})
52
53 assert results = json_response(conn, 200)
54 # IO.inspect results
55
56 [account | _] = results["accounts"]
57 assert account["id"] == to_string(user_three.id)
58
59 assert results["hashtags"] == [
60 %{"name" => "private", "url" => "#{Web.base_url()}/tag/private"}
61 ]
62
63 [status] = results["statuses"]
64 assert status["id"] == to_string(activity.id)
65 end
66 end
67
68 describe ".account_search" do
69 test "account search", %{conn: conn} do
70 user = insert(:user)
71 user_two = insert(:user, %{nickname: "shp@shitposter.club"})
72 user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
73
74 results =
75 conn
76 |> assign(:user, user)
77 |> get("/api/v1/accounts/search", %{"q" => "shp"})
78 |> json_response(200)
79
80 result_ids = for result <- results, do: result["acct"]
81
82 assert user_two.nickname in result_ids
83 assert user_three.nickname in result_ids
84
85 results =
86 conn
87 |> assign(:user, user)
88 |> get("/api/v1/accounts/search", %{"q" => "2hu"})
89 |> json_response(200)
90
91 result_ids = for result <- results, do: result["acct"]
92
93 assert user_three.nickname in result_ids
94 end
95 end
96
97 describe ".search" do
98 test "it returns empty result if user or status search return undefined error", %{conn: conn} do
99 with_mocks [
100 {Pleroma.User, [], [search: fn _q, _o -> raise "Oops" end]},
101 {Pleroma.Activity, [], [search: fn _u, _q -> raise "Oops" end]}
102 ] do
103 conn =
104 conn
105 |> get("/api/v1/search", %{"q" => "2hu"})
106
107 assert results = json_response(conn, 200)
108
109 assert results["accounts"] == []
110 assert results["statuses"] == []
111 end
112 end
113
114 test "search", %{conn: conn} do
115 user = insert(:user)
116 user_two = insert(:user, %{nickname: "shp@shitposter.club"})
117 user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
118
119 {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
120
121 {:ok, _activity} =
122 CommonAPI.post(user, %{
123 "status" => "This is about 2hu, but private",
124 "visibility" => "private"
125 })
126
127 {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
128
129 conn =
130 conn
131 |> get("/api/v1/search", %{"q" => "2hu"})
132
133 assert results = json_response(conn, 200)
134
135 [account | _] = results["accounts"]
136 assert account["id"] == to_string(user_three.id)
137
138 assert results["hashtags"] == []
139
140 [status] = results["statuses"]
141 assert status["id"] == to_string(activity.id)
142 end
143
144 test "search fetches remote statuses", %{conn: conn} do
145 capture_log(fn ->
146 conn =
147 conn
148 |> get("/api/v1/search", %{"q" => "https://shitposter.club/notice/2827873"})
149
150 assert results = json_response(conn, 200)
151
152 [status] = results["statuses"]
153
154 assert status["uri"] ==
155 "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
156 end)
157 end
158
159 test "search doesn't show statuses that it shouldn't", %{conn: conn} do
160 {:ok, activity} =
161 CommonAPI.post(insert(:user), %{
162 "status" => "This is about 2hu, but private",
163 "visibility" => "private"
164 })
165
166 capture_log(fn ->
167 conn =
168 conn
169 |> get("/api/v1/search", %{"q" => Object.normalize(activity).data["id"]})
170
171 assert results = json_response(conn, 200)
172
173 [] = results["statuses"]
174 end)
175 end
176
177 test "search fetches remote accounts", %{conn: conn} do
178 user = insert(:user)
179
180 conn =
181 conn
182 |> assign(:user, user)
183 |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "true"})
184
185 assert results = json_response(conn, 200)
186 [account] = results["accounts"]
187 assert account["acct"] == "shp@social.heldscal.la"
188 end
189
190 test "search doesn't fetch remote accounts if resolve is false", %{conn: conn} do
191 conn =
192 conn
193 |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "false"})
194
195 assert results = json_response(conn, 200)
196 assert [] == results["accounts"]
197 end
198 end
199 end