e46c32984ebefb16f1abd106f0742172803c9411
[akkoma] / test / pleroma / web / 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.Web.Plugs.CacheTest do
6 use Pleroma.DataCase
7 use Plug.Test
8
9 alias Pleroma.Web.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 test "caches a response" do
28 assert @miss_resp ==
29 conn(:get, "/")
30 |> Cache.call(%{query_params: false, ttl: nil})
31 |> put_resp_content_type("cofe/hot")
32 |> send_resp(:ok, "cofe")
33 |> sent_resp()
34
35 assert_raise(Plug.Conn.AlreadySentError, fn ->
36 conn(:get, "/")
37 |> Cache.call(%{query_params: false, ttl: nil})
38 |> put_resp_content_type("cofe/hot")
39 |> send_resp(:ok, "cofe")
40 |> sent_resp()
41 end)
42
43 assert @hit_resp ==
44 conn(:get, "/")
45 |> Cache.call(%{query_params: false, ttl: nil})
46 |> sent_resp()
47 end
48
49 test "ttl is set" do
50 assert @miss_resp ==
51 conn(:get, "/")
52 |> Cache.call(%{query_params: false, ttl: @ttl})
53 |> put_resp_content_type("cofe/hot")
54 |> send_resp(:ok, "cofe")
55 |> sent_resp()
56
57 assert @hit_resp ==
58 conn(:get, "/")
59 |> Cache.call(%{query_params: false, ttl: @ttl})
60 |> sent_resp()
61
62 :timer.sleep(@ttl + 1)
63
64 assert @miss_resp ==
65 conn(:get, "/")
66 |> Cache.call(%{query_params: false, ttl: @ttl})
67 |> put_resp_content_type("cofe/hot")
68 |> send_resp(:ok, "cofe")
69 |> sent_resp()
70 end
71
72 test "set ttl via conn.assigns" do
73 assert @miss_resp ==
74 conn(:get, "/")
75 |> Cache.call(%{query_params: false, ttl: nil})
76 |> put_resp_content_type("cofe/hot")
77 |> assign(:cache_ttl, @ttl)
78 |> send_resp(:ok, "cofe")
79 |> sent_resp()
80
81 assert @hit_resp ==
82 conn(:get, "/")
83 |> Cache.call(%{query_params: false, ttl: nil})
84 |> sent_resp()
85
86 :timer.sleep(@ttl + 1)
87
88 assert @miss_resp ==
89 conn(:get, "/")
90 |> Cache.call(%{query_params: false, ttl: nil})
91 |> put_resp_content_type("cofe/hot")
92 |> send_resp(:ok, "cofe")
93 |> sent_resp()
94 end
95
96 test "ignore query string when `query_params` is false" do
97 assert @miss_resp ==
98 conn(:get, "/?cofe")
99 |> Cache.call(%{query_params: false, ttl: nil})
100 |> put_resp_content_type("cofe/hot")
101 |> send_resp(:ok, "cofe")
102 |> sent_resp()
103
104 assert @hit_resp ==
105 conn(:get, "/?cofefe")
106 |> Cache.call(%{query_params: false, ttl: nil})
107 |> sent_resp()
108 end
109
110 test "take query string into account when `query_params` is true" do
111 assert @miss_resp ==
112 conn(:get, "/?cofe")
113 |> Cache.call(%{query_params: true, ttl: nil})
114 |> put_resp_content_type("cofe/hot")
115 |> send_resp(:ok, "cofe")
116 |> sent_resp()
117
118 assert @miss_resp ==
119 conn(:get, "/?cofefe")
120 |> Cache.call(%{query_params: true, ttl: nil})
121 |> put_resp_content_type("cofe/hot")
122 |> send_resp(:ok, "cofe")
123 |> sent_resp()
124 end
125
126 test "take specific query params into account when `query_params` is list" do
127 assert @miss_resp ==
128 conn(:get, "/?a=1&b=2&c=3&foo=bar")
129 |> fetch_query_params()
130 |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
131 |> put_resp_content_type("cofe/hot")
132 |> send_resp(:ok, "cofe")
133 |> sent_resp()
134
135 assert @hit_resp ==
136 conn(:get, "/?bar=foo&c=3&b=2&a=1")
137 |> fetch_query_params()
138 |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
139 |> sent_resp()
140
141 assert @miss_resp ==
142 conn(:get, "/?bar=foo&c=3&b=2&a=2")
143 |> fetch_query_params()
144 |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
145 |> put_resp_content_type("cofe/hot")
146 |> send_resp(:ok, "cofe")
147 |> sent_resp()
148 end
149
150 test "ignore not GET requests" do
151 expected =
152 {200,
153 [
154 {"cache-control", "max-age=0, private, must-revalidate"},
155 {"content-type", "cofe/hot; charset=utf-8"}
156 ], "cofe"}
157
158 assert expected ==
159 conn(:post, "/")
160 |> Cache.call(%{query_params: true, ttl: nil})
161 |> put_resp_content_type("cofe/hot")
162 |> send_resp(:ok, "cofe")
163 |> sent_resp()
164 end
165
166 test "ignore non-successful responses" do
167 expected =
168 {418,
169 [
170 {"cache-control", "max-age=0, private, must-revalidate"},
171 {"content-type", "tea/iced; charset=utf-8"}
172 ], "🥤"}
173
174 assert expected ==
175 conn(:get, "/cofe")
176 |> Cache.call(%{query_params: true, ttl: nil})
177 |> put_resp_content_type("tea/iced")
178 |> send_resp(:im_a_teapot, "🥤")
179 |> sent_resp()
180 end
181 end