First
[anni] / test / pleroma / web / admin_api / controllers / media_proxy_cache_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.AdminAPI.MediaProxyCacheControllerTest do
6   use Pleroma.Web.ConnCase
7
8   import Pleroma.Factory
9   import Mock
10
11   alias Pleroma.Web.MediaProxy
12
13   setup do: clear_config([:media_proxy])
14
15   setup do
16     admin = insert(:user, is_admin: true)
17     token = insert(:oauth_admin_token, user: admin)
18
19     conn =
20       build_conn()
21       |> assign(:user, admin)
22       |> assign(:token, token)
23
24     clear_config([:media_proxy, :enabled], true)
25     clear_config([:media_proxy, :invalidation, :enabled], true)
26     clear_config([:media_proxy, :invalidation, :provider], MediaProxy.Invalidation.Script)
27
28     {:ok, %{admin: admin, token: token, conn: conn}}
29   end
30
31   describe "GET /api/pleroma/admin/media_proxy_caches" do
32     test "shows banned MediaProxy URLs", %{conn: conn} do
33       MediaProxy.put_in_banned_urls([
34         "http://localhost:4001/media/a688346.jpg",
35         "http://localhost:4001/media/fb1f4d.jpg"
36       ])
37
38       MediaProxy.put_in_banned_urls("http://localhost:4001/media/gb1f44.jpg")
39       MediaProxy.put_in_banned_urls("http://localhost:4001/media/tb13f47.jpg")
40       MediaProxy.put_in_banned_urls("http://localhost:4001/media/wb1f46.jpg")
41
42       response =
43         conn
44         |> get("/api/pleroma/admin/media_proxy_caches?page_size=2")
45         |> json_response_and_validate_schema(200)
46
47       assert response["page_size"] == 2
48       assert response["count"] == 5
49
50       results = response["urls"]
51
52       response =
53         conn
54         |> get("/api/pleroma/admin/media_proxy_caches?page_size=2&page=2")
55         |> json_response_and_validate_schema(200)
56
57       assert response["page_size"] == 2
58       assert response["count"] == 5
59
60       results = results ++ response["urls"]
61
62       response =
63         conn
64         |> get("/api/pleroma/admin/media_proxy_caches?page_size=2&page=3")
65         |> json_response_and_validate_schema(200)
66
67       results = results ++ response["urls"]
68
69       assert results |> Enum.sort() ==
70                [
71                  "http://localhost:4001/media/wb1f46.jpg",
72                  "http://localhost:4001/media/gb1f44.jpg",
73                  "http://localhost:4001/media/tb13f47.jpg",
74                  "http://localhost:4001/media/fb1f4d.jpg",
75                  "http://localhost:4001/media/a688346.jpg"
76                ]
77                |> Enum.sort()
78     end
79
80     test "search banned MediaProxy URLs", %{conn: conn} do
81       MediaProxy.put_in_banned_urls([
82         "http://localhost:4001/media/a688346.jpg",
83         "http://localhost:4001/media/ff44b1f4d.jpg"
84       ])
85
86       MediaProxy.put_in_banned_urls("http://localhost:4001/media/gb1f44.jpg")
87       MediaProxy.put_in_banned_urls("http://localhost:4001/media/tb13f47.jpg")
88       MediaProxy.put_in_banned_urls("http://localhost:4001/media/wb1f46.jpg")
89
90       response =
91         conn
92         |> get("/api/pleroma/admin/media_proxy_caches?page_size=2&query=F44")
93         |> json_response_and_validate_schema(200)
94
95       assert response["urls"] |> Enum.sort() == [
96                "http://localhost:4001/media/ff44b1f4d.jpg",
97                "http://localhost:4001/media/gb1f44.jpg"
98              ]
99
100       assert response["page_size"] == 2
101       assert response["count"] == 2
102     end
103   end
104
105   describe "POST /api/pleroma/admin/media_proxy_caches/delete" do
106     test "deleted MediaProxy URLs from banned", %{conn: conn} do
107       MediaProxy.put_in_banned_urls([
108         "http://localhost:4001/media/a688346.jpg",
109         "http://localhost:4001/media/fb1f4d.jpg"
110       ])
111
112       conn
113       |> put_req_header("content-type", "application/json")
114       |> post("/api/pleroma/admin/media_proxy_caches/delete", %{
115         urls: ["http://localhost:4001/media/a688346.jpg"]
116       })
117       |> json_response_and_validate_schema(200)
118
119       refute MediaProxy.in_banned_urls("http://localhost:4001/media/a688346.jpg")
120       assert MediaProxy.in_banned_urls("http://localhost:4001/media/fb1f4d.jpg")
121     end
122   end
123
124   describe "POST /api/pleroma/admin/media_proxy_caches/purge" do
125     test "perform invalidates cache of MediaProxy", %{conn: conn} do
126       urls = [
127         "http://example.com/media/a688346.jpg",
128         "http://example.com/media/fb1f4d.jpg"
129       ]
130
131       with_mocks [
132         {MediaProxy.Invalidation.Script, [],
133          [
134            purge: fn _, _ -> {"ok", 0} end
135          ]}
136       ] do
137         conn
138         |> put_req_header("content-type", "application/json")
139         |> post("/api/pleroma/admin/media_proxy_caches/purge", %{urls: urls, ban: false})
140         |> json_response_and_validate_schema(200)
141
142         refute MediaProxy.in_banned_urls("http://example.com/media/a688346.jpg")
143         refute MediaProxy.in_banned_urls("http://example.com/media/fb1f4d.jpg")
144       end
145     end
146
147     test "perform invalidates cache of MediaProxy and adds url to banned", %{conn: conn} do
148       urls = [
149         "http://example.com/media/a688346.jpg",
150         "http://example.com/media/fb1f4d.jpg"
151       ]
152
153       with_mocks [{MediaProxy.Invalidation.Script, [], [purge: fn _, _ -> {"ok", 0} end]}] do
154         conn
155         |> put_req_header("content-type", "application/json")
156         |> post(
157           "/api/pleroma/admin/media_proxy_caches/purge",
158           %{urls: urls, ban: true}
159         )
160         |> json_response_and_validate_schema(200)
161
162         assert MediaProxy.in_banned_urls("http://example.com/media/a688346.jpg")
163         assert MediaProxy.in_banned_urls("http://example.com/media/fb1f4d.jpg")
164       end
165     end
166   end
167 end