Merge branch 'deprecate-public_endpoint' into 'develop'
[akkoma] / test / support / helpers.ex
index c6f7fa5e243b2f6ba45a769960c19331b3cb1e54..856a6a376f8865fa08be93448402adebd940f28c 100644 (file)
@@ -1,5 +1,5 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Tests.Helpers do
@@ -8,6 +8,8 @@ defmodule Pleroma.Tests.Helpers do
   """
   alias Pleroma.Config
 
+  require Logger
+
   defmacro clear_config(config_path) do
     quote do
       clear_config(unquote(config_path)) do
@@ -17,83 +19,74 @@ defmodule Pleroma.Tests.Helpers do
 
   defmacro clear_config(config_path, do: yield) do
     quote do
-      setup do
-        initial_setting = Config.get(unquote(config_path))
-        unquote(yield)
-        on_exit(fn -> Config.put(unquote(config_path), initial_setting) end)
-        :ok
-      end
-    end
-  end
+      initial_setting = Config.fetch(unquote(config_path))
 
-  defmacro clear_config(config_path, temp_setting) do
-    quote do
-      clear_config(unquote(config_path)) do
-        Config.put(unquote(config_path), unquote(temp_setting))
-      end
-    end
-  end
+      unquote(yield)
 
-  @doc """
-  From _within a test case_, sets config to provided value and restores initial value on exit.
-  For multi-case setup use `clear_config/2` instead.
-  """
-  def set_config(config_path, temp_setting) do
-    initial_setting = Config.get(config_path)
-    Config.put(config_path, temp_setting)
+      on_exit(fn ->
+        case initial_setting do
+          :error ->
+            Config.delete(unquote(config_path))
 
-    ExUnit.Callbacks.on_exit(fn -> Config.put(config_path, initial_setting) end)
-  end
+          {:ok, value} ->
+            Config.put(unquote(config_path), value)
+        end
+      end)
 
-  @doc "Stores initial config value and restores it after *all* test examples are executed."
-  defmacro clear_config_all(config_path) do
-    quote do
-      clear_config_all(unquote(config_path)) do
-      end
+      :ok
     end
   end
 
-  @doc """
-  Stores initial config value and restores it after *all* test examples are executed.
-  Only use if *all* test examples should work with the same stubbed value
-  (*no* examples set a different value).
-  """
-  defmacro clear_config_all(config_path, do: yield) do
-    quote do
-      setup_all do
-        initial_setting = Config.get(unquote(config_path))
-        unquote(yield)
-        on_exit(fn -> Config.put(unquote(config_path), initial_setting) end)
-        :ok
-      end
+  defmacro clear_config(config_path, temp_setting) do
+    # NOTE: `clear_config([section, key], value)` != `clear_config([section], key: value)` (!)
+    # Displaying a warning to prevent unintentional clearing of all but one keys in section
+    if Keyword.keyword?(temp_setting) and length(temp_setting) == 1 do
+      Logger.warn(
+        "Please change to `clear_config([section]); clear_config([section, key], value)`: " <>
+          "#{inspect(config_path)}, #{inspect(temp_setting)}"
+      )
     end
-  end
 
-  defmacro clear_config_all(config_path, temp_setting) do
     quote do
-      clear_config_all(unquote(config_path)) do
+      clear_config(unquote(config_path)) do
         Config.put(unquote(config_path), unquote(temp_setting))
       end
     end
   end
 
+  def require_migration(migration_name) do
+    [{module, _}] = Code.require_file("#{migration_name}.exs", "priv/repo/migrations")
+    {:ok, %{migration: module}}
+  end
+
   defmacro __using__(_opts) do
     quote do
       import Pleroma.Tests.Helpers,
         only: [
           clear_config: 1,
-          clear_config: 2,
-          clear_config_all: 1,
-          clear_config_all: 2,
-          set_config: 2
+          clear_config: 2
         ]
 
-      def to_datetime(naive_datetime) do
+      def time_travel(entity, seconds) do
+        new_time = NaiveDateTime.add(entity.inserted_at, seconds)
+
+        entity
+        |> Ecto.Changeset.change(%{inserted_at: new_time, updated_at: new_time})
+        |> Pleroma.Repo.update()
+      end
+
+      def to_datetime(%NaiveDateTime{} = naive_datetime) do
         naive_datetime
         |> DateTime.from_naive!("Etc/UTC")
         |> DateTime.truncate(:second)
       end
 
+      def to_datetime(datetime) when is_binary(datetime) do
+        datetime
+        |> NaiveDateTime.from_iso8601!()
+        |> to_datetime()
+      end
+
       def collect_ids(collection) do
         collection
         |> Enum.map(& &1.id)
@@ -112,8 +105,8 @@ defmodule Pleroma.Tests.Helpers do
         assigns = Map.new(assigns)
 
         view.render(template, assigns)
-        |> Poison.encode!()
-        |> Poison.decode!()
+        |> Jason.encode!()
+        |> Jason.decode!()
       end
 
       def stringify_keys(nil), do: nil