Tests: Use NullCache for async tests.
authorlain <lain@soykaf.club>
Fri, 18 Dec 2020 18:49:01 +0000 (19:49 +0100)
committerlain <lain@soykaf.club>
Fri, 18 Dec 2020 18:53:19 +0000 (19:53 +0100)
Caching can't work in async tests, so for them it is mocked to a
null cache that is always empty. Synchronous tests are stubbed
with the real Cachex, which is emptied after every test.

13 files changed:
config/test.exs
lib/pleroma/emoji/pack.ex
lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex
test/pleroma/reverse_proxy_test.exs
test/pleroma/web/media_proxy/invalidation_test.exs
test/pleroma/web/plugs/idempotency_plug_test.exs
test/support/cachex_proxy.ex [new file with mode: 0644]
test/support/channel_case.ex
test/support/conn_case.ex
test/support/data_case.ex
test/support/mocks.ex [new file with mode: 0644]
test/support/null_cache.ex [new file with mode: 0644]
test/test_helper.exs

index 2a20a03e720c785ac4678137250242d615f187d7..397bc688ec52cbf5fc9e755614e3135f0fa1fb64 100644 (file)
@@ -121,6 +121,8 @@ config :tzdata, :autoupdate, :disabled
 
 config :pleroma, :mrf, policies: []
 
+config :pleroma, :cachex, provider: Pleroma.CachexMock
+
 if File.exists?("./config/test.secret.exs") do
   import_config "test.secret.exs"
 else
index 5a1a1a6c6dc6f8b3416705a8b76e7996f96a9bc5..ec97aa6529e4280a7836d6824f83af9e4f7cc63b 100644 (file)
@@ -417,7 +417,7 @@ defmodule Pleroma.Emoji.Pack do
     ttl_per_file = Pleroma.Config.get!([:emoji, :shared_pack_cache_seconds_per_file])
     overall_ttl = :timer.seconds(ttl_per_file * Enum.count(files))
 
-    @cachex.put!(
+    @cachex.put(
       :emoji_packs_cache,
       pack.name,
       # if pack.json MD5 changes, the cache is not valid anymore
index ecd3690370f4a58065c854c4d2a59d16811ecf67..2f712fb8cc44f27e7a3ba562aba9e404eb6ed519 100644 (file)
@@ -40,7 +40,7 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheController do
 
   defp fetch_entries(params) do
     MediaProxy.cache_table()
-    |> @cachex.stream!(@cachex.Query.create(true, :key))
+    |> @cachex.stream!(Cachex.Query.create(true, :key))
     |> filter_entries(params[:query])
   end
 
index 8df63de6550792385024933b36b3f92374a83ef7..0a2c169cef8969119d69182e090df62fb988203b 100644 (file)
@@ -3,8 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.ReverseProxyTest do
-  use Pleroma.Web.ConnCase, async: true
-
+  use Pleroma.Web.ConnCase
   import ExUnit.CaptureLog
   import Mox
 
index b9f1066f3eec6563e118b70076751955bde9d80b..b7be36b470a0a8a6c9874dca05466eaa5296a7bc 100644 (file)
@@ -3,8 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.MediaProxy.InvalidationTest do
-  use ExUnit.Case
-  use Pleroma.Tests.Helpers
+  use Pleroma.DataCase
 
   alias Pleroma.Config
   alias Pleroma.Web.MediaProxy.Invalidation
index 4a7835993324159dda0e11b170189f4abf200c7f..910ecd9c1ff9256cd9db57465f840fdf6c66257d 100644 (file)
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.Plugs.IdempotencyPlugTest do
-  use ExUnit.Case, async: true
+  use Pleroma.DataCase
   use Plug.Test
 
   alias Pleroma.Web.Plugs.IdempotencyPlug
diff --git a/test/support/cachex_proxy.ex b/test/support/cachex_proxy.ex
new file mode 100644 (file)
index 0000000..e296b5c
--- /dev/null
@@ -0,0 +1,40 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.CachexProxy do
+  @behaviour Pleroma.Caching
+
+  @impl true
+  defdelegate get!(cache, key), to: Cachex
+
+  @impl true
+  defdelegate stream!(cache, key), to: Cachex
+
+  @impl true
+  defdelegate put(cache, key, value, options), to: Cachex
+
+  @impl true
+  defdelegate put(cache, key, value), to: Cachex
+
+  @impl true
+  defdelegate get_and_update(cache, key, func), to: Cachex
+
+  @impl true
+  defdelegate get(cache, key), to: Cachex
+
+  @impl true
+  defdelegate fetch!(cache, key, func), to: Cachex
+
+  @impl true
+  defdelegate expire_at(cache, str, num), to: Cachex
+
+  @impl true
+  defdelegate exists?(cache, key), to: Cachex
+
+  @impl true
+  defdelegate del(cache, key), to: Cachex
+
+  @impl true
+  defdelegate execute!(cache, func), to: Cachex
+end
index 114184a9f0b5520cd57a69b5d2991e1045ace1ae..f4696adb305ec47a6466f1f70dbadc9538c3db70 100644 (file)
@@ -33,8 +33,14 @@ defmodule Pleroma.Web.ChannelCase do
   setup tags do
     :ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo)
 
-    unless tags[:async] do
+    if tags[:async] do
+      Mox.stub_with(Pleroma.CachexMock, Pleroma.NullCache)
+      Mox.set_mox_private()
+    else
       Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()})
+      Mox.stub_with(Pleroma.CachexMock, Pleroma.CachexProxy)
+      Mox.set_mox_global()
+      Pleroma.DataCase.clear_cachex()
     end
 
     :ok
index b5bd71809a195089fc1fbc098721154d83733346..a7cebf9714f3a847bc404cb507d504e33a6576aa 100644 (file)
@@ -118,8 +118,13 @@ defmodule Pleroma.Web.ConnCase do
   setup tags do
     :ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo)
 
-    unless tags[:async] do
+    if tags[:async] do
+      Mox.stub_with(Pleroma.CachexMock, Pleroma.NullCache)
+      Mox.set_mox_private()
+    else
       Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()})
+      Mox.stub_with(Pleroma.CachexMock, Pleroma.CachexProxy)
+      Mox.set_mox_global()
       Pleroma.DataCase.clear_cachex()
     end
 
index 1f1d40863655d6bcd950547487ddc70b6471c49e..a3ce9e282c8f942bf8471e93e714e7c17ef771bd 100644 (file)
@@ -65,8 +65,13 @@ defmodule Pleroma.DataCase do
   setup tags do
     :ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo)
 
-    unless tags[:async] do
+    if tags[:async] do
+      Mox.stub_with(Pleroma.CachexMock, Pleroma.NullCache)
+      Mox.set_mox_private()
+    else
       Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()})
+      Mox.stub_with(Pleroma.CachexMock, Pleroma.CachexProxy)
+      Mox.set_mox_global()
       clear_cachex()
     end
 
diff --git a/test/support/mocks.ex b/test/support/mocks.ex
new file mode 100644 (file)
index 0000000..d790553
--- /dev/null
@@ -0,0 +1,5 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+Mox.defmock(Pleroma.CachexMock, for: Pleroma.Caching)
diff --git a/test/support/null_cache.ex b/test/support/null_cache.ex
new file mode 100644 (file)
index 0000000..72e7c99
--- /dev/null
@@ -0,0 +1,47 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.NullCache do
+  @moduledoc """
+  A module simulating a permanently empty cache.
+  """
+  @behaviour Pleroma.Caching
+
+  @impl true
+  def get!(_, _), do: nil
+
+  @impl true
+  def put(_, _, _, _ \\ nil), do: {:ok, true}
+
+  @impl true
+  def stream!(_, _), do: []
+
+  @impl true
+  def get(_, _), do: {:ok, nil}
+
+  @impl true
+  def fetch!(_, _, func) do
+    {_, res} = func.()
+    res
+  end
+
+  @impl true
+  def get_and_update(_, _, func) do
+    func.(nil)
+  end
+
+  @impl true
+  def expire_at(_, _, _), do: {:ok, true}
+
+  @impl true
+  def exists?(_, _), do: {:ok, false}
+
+  @impl true
+  def execute!(_, func) do
+    func.(:nothing)
+  end
+
+  @impl true
+  def del(_, _), do: {:ok, true}
+end
index 25f0ecba68d8c641bfcfed55ac83af0036be11cc..ee880e22687483f57ada7ad2a6bb5f2b617615fd 100644 (file)
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 os_exclude = if :os.type() == {:unix, :darwin}, do: [skip_on_mac: true], else: []
-ExUnit.start(exclude: [:test] ++ [:federated | os_exclude], include: [async: true])
+ExUnit.start(exclude: [:federated | os_exclude])
 
 Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, :manual)