logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

cache_test.exs (6272B)


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