Merge branch 'develop' of https://git.pleroma.social/pleroma/pleroma into develop
[akkoma] / test / plugs / cache_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Plugs.CacheTest do
6 use ExUnit.Case, async: true
7 use Plug.Test
8
9 alias Pleroma.Plugs.Cache
10
11 @miss_resp {200,
12 [
13 {"cache-control", "max-age=0, private, must-revalidate"},
14 {"content-type", "cofe/hot; charset=utf-8"},
15 {"x-cache", "MISS from Pleroma"}
16 ], "cofe"}
17
18 @hit_resp {200,
19 [
20 {"cache-control", "max-age=0, private, must-revalidate"},
21 {"content-type", "cofe/hot; charset=utf-8"},
22 {"x-cache", "HIT from Pleroma"}
23 ], "cofe"}
24
25 @ttl 5
26
27 setup do
28 Cachex.clear(:web_resp_cache)
29 :ok
30 end
31
32 test "caches a response" do
33 assert @miss_resp ==
34 conn(:get, "/")
35 |> Cache.call(%{query_params: false, ttl: nil})
36 |> put_resp_content_type("cofe/hot")
37 |> send_resp(:ok, "cofe")
38 |> sent_resp()
39
40 assert_raise(Plug.Conn.AlreadySentError, fn ->
41 conn(:get, "/")
42 |> Cache.call(%{query_params: false, ttl: nil})
43 |> put_resp_content_type("cofe/hot")
44 |> send_resp(:ok, "cofe")
45 |> sent_resp()
46 end)
47
48 assert @hit_resp ==
49 conn(:get, "/")
50 |> Cache.call(%{query_params: false, ttl: nil})
51 |> sent_resp()
52 end
53
54 test "ttl is set" do
55 assert @miss_resp ==
56 conn(:get, "/")
57 |> Cache.call(%{query_params: false, ttl: @ttl})
58 |> put_resp_content_type("cofe/hot")
59 |> send_resp(:ok, "cofe")
60 |> sent_resp()
61
62 assert @hit_resp ==
63 conn(:get, "/")
64 |> Cache.call(%{query_params: false, ttl: @ttl})
65 |> sent_resp()
66
67 :timer.sleep(@ttl + 1)
68
69 assert @miss_resp ==
70 conn(:get, "/")
71 |> Cache.call(%{query_params: false, ttl: @ttl})
72 |> put_resp_content_type("cofe/hot")
73 |> send_resp(:ok, "cofe")
74 |> sent_resp()
75 end
76
77 test "set ttl via conn.assigns" do
78 assert @miss_resp ==
79 conn(:get, "/")
80 |> Cache.call(%{query_params: false, ttl: nil})
81 |> put_resp_content_type("cofe/hot")
82 |> assign(:cache_ttl, @ttl)
83 |> send_resp(:ok, "cofe")
84 |> sent_resp()
85
86 assert @hit_resp ==
87 conn(:get, "/")
88 |> Cache.call(%{query_params: false, ttl: nil})
89 |> sent_resp()
90
91 :timer.sleep(@ttl + 1)
92
93 assert @miss_resp ==
94 conn(:get, "/")
95 |> Cache.call(%{query_params: false, ttl: nil})
96 |> put_resp_content_type("cofe/hot")
97 |> send_resp(:ok, "cofe")
98 |> sent_resp()
99 end
100
101 test "ignore query string when `query_params` is false" do
102 assert @miss_resp ==
103 conn(:get, "/?cofe")
104 |> Cache.call(%{query_params: false, ttl: nil})
105 |> put_resp_content_type("cofe/hot")
106 |> send_resp(:ok, "cofe")
107 |> sent_resp()
108
109 assert @hit_resp ==
110 conn(:get, "/?cofefe")
111 |> Cache.call(%{query_params: false, ttl: nil})
112 |> sent_resp()
113 end
114
115 test "take query string into account when `query_params` is true" do
116 assert @miss_resp ==
117 conn(:get, "/?cofe")
118 |> Cache.call(%{query_params: true, ttl: nil})
119 |> put_resp_content_type("cofe/hot")
120 |> send_resp(:ok, "cofe")
121 |> sent_resp()
122
123 assert @miss_resp ==
124 conn(:get, "/?cofefe")
125 |> Cache.call(%{query_params: true, ttl: nil})
126 |> put_resp_content_type("cofe/hot")
127 |> send_resp(:ok, "cofe")
128 |> sent_resp()
129 end
130
131 test "take specific query params into account when `query_params` is list" do
132 assert @miss_resp ==
133 conn(:get, "/?a=1&b=2&c=3&foo=bar")
134 |> fetch_query_params()
135 |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
136 |> put_resp_content_type("cofe/hot")
137 |> send_resp(:ok, "cofe")
138 |> sent_resp()
139
140 assert @hit_resp ==
141 conn(:get, "/?bar=foo&c=3&b=2&a=1")
142 |> fetch_query_params()
143 |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
144 |> sent_resp()
145
146 assert @miss_resp ==
147 conn(:get, "/?bar=foo&c=3&b=2&a=2")
148 |> fetch_query_params()
149 |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
150 |> put_resp_content_type("cofe/hot")
151 |> send_resp(:ok, "cofe")
152 |> sent_resp()
153 end
154
155 test "ignore not GET requests" do
156 expected =
157 {200,
158 [
159 {"cache-control", "max-age=0, private, must-revalidate"},
160 {"content-type", "cofe/hot; charset=utf-8"}
161 ], "cofe"}
162
163 assert expected ==
164 conn(:post, "/")
165 |> Cache.call(%{query_params: true, ttl: nil})
166 |> put_resp_content_type("cofe/hot")
167 |> send_resp(:ok, "cofe")
168 |> sent_resp()
169 end
170
171 test "ignore non-successful responses" do
172 expected =
173 {418,
174 [
175 {"cache-control", "max-age=0, private, must-revalidate"},
176 {"content-type", "tea/iced; charset=utf-8"}
177 ], "🥤"}
178
179 assert expected ==
180 conn(:get, "/cofe")
181 |> Cache.call(%{query_params: true, ttl: nil})
182 |> put_resp_content_type("tea/iced")
183 |> send_resp(:im_a_teapot, "🥤")
184 |> sent_resp()
185 end
186 end