1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Plugs.CacheTest do
6 use ExUnit.Case, async: true
9 alias Pleroma.Plugs.Cache
13 {"cache-control", "max-age=0, private, must-revalidate"},
14 {"content-type", "cofe/hot; charset=utf-8"},
15 {"x-cache", "MISS from Pleroma"}
20 {"cache-control", "max-age=0, private, must-revalidate"},
21 {"content-type", "cofe/hot; charset=utf-8"},
22 {"x-cache", "HIT from Pleroma"}
28 Cachex.clear(:web_resp_cache)
32 test "caches a response" do
35 |> Cache.call(%{query_params: false, ttl: nil})
36 |> put_resp_content_type("cofe/hot")
37 |> send_resp(:ok, "cofe")
40 assert_raise(Plug.Conn.AlreadySentError, fn ->
42 |> Cache.call(%{query_params: false, ttl: nil})
43 |> put_resp_content_type("cofe/hot")
44 |> send_resp(:ok, "cofe")
50 |> Cache.call(%{query_params: false, ttl: nil})
57 |> Cache.call(%{query_params: false, ttl: @ttl})
58 |> put_resp_content_type("cofe/hot")
59 |> send_resp(:ok, "cofe")
64 |> Cache.call(%{query_params: false, ttl: @ttl})
67 :timer.sleep(@ttl + 1)
71 |> Cache.call(%{query_params: false, ttl: @ttl})
72 |> put_resp_content_type("cofe/hot")
73 |> send_resp(:ok, "cofe")
77 test "set ttl via conn.assigns" do
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")
88 |> Cache.call(%{query_params: false, ttl: nil})
91 :timer.sleep(@ttl + 1)
95 |> Cache.call(%{query_params: false, ttl: nil})
96 |> put_resp_content_type("cofe/hot")
97 |> send_resp(:ok, "cofe")
101 test "ignore query string when `query_params` is false" do
104 |> Cache.call(%{query_params: false, ttl: nil})
105 |> put_resp_content_type("cofe/hot")
106 |> send_resp(:ok, "cofe")
110 conn(:get, "/?cofefe")
111 |> Cache.call(%{query_params: false, ttl: nil})
115 test "take query string into account when `query_params` is true" do
118 |> Cache.call(%{query_params: true, ttl: nil})
119 |> put_resp_content_type("cofe/hot")
120 |> send_resp(:ok, "cofe")
124 conn(:get, "/?cofefe")
125 |> Cache.call(%{query_params: true, ttl: nil})
126 |> put_resp_content_type("cofe/hot")
127 |> send_resp(:ok, "cofe")
131 test "take specific query params into account when `query_params` is list" do
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")
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})
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")
155 test "ignore not GET requests" do
159 {"cache-control", "max-age=0, private, must-revalidate"},
160 {"content-type", "cofe/hot; charset=utf-8"}
165 |> Cache.call(%{query_params: true, ttl: nil})
166 |> put_resp_content_type("cofe/hot")
167 |> send_resp(:ok, "cofe")
171 test "ignore non-successful responses" do
175 {"cache-control", "max-age=0, private, must-revalidate"},
176 {"content-type", "tea/iced; charset=utf-8"}
181 |> Cache.call(%{query_params: true, ttl: nil})
182 |> put_resp_content_type("tea/iced")
183 |> send_resp(:im_a_teapot, "🥤")