summaryrefslogtreecommitdiff
path: root/test/support/helpers.ex
blob: c6f7fa5e243b2f6ba45a769960c19331b3cb1e54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Tests.Helpers do
  @moduledoc """
  Helpers for use in tests.
  """
  alias Pleroma.Config

  defmacro clear_config(config_path) do
    quote do
      clear_config(unquote(config_path)) do
      end
    end
  end

  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

  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

  @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)

    ExUnit.Callbacks.on_exit(fn -> Config.put(config_path, initial_setting) 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
    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
    end
  end

  defmacro clear_config_all(config_path, temp_setting) do
    quote do
      clear_config_all(unquote(config_path)) do
        Config.put(unquote(config_path), unquote(temp_setting))
      end
    end
  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
        ]

      def to_datetime(naive_datetime) do
        naive_datetime
        |> DateTime.from_naive!("Etc/UTC")
        |> DateTime.truncate(:second)
      end

      def collect_ids(collection) do
        collection
        |> Enum.map(& &1.id)
        |> Enum.sort()
      end

      def refresh_record(%{id: id, __struct__: model} = _),
        do: refresh_record(model, %{id: id})

      def refresh_record(model, %{id: id} = _) do
        Pleroma.Repo.get_by(model, id: id)
      end

      # Used for comparing json rendering during tests.
      def render_json(view, template, assigns) do
        assigns = Map.new(assigns)

        view.render(template, assigns)
        |> Poison.encode!()
        |> Poison.decode!()
      end

      def stringify_keys(nil), do: nil

      def stringify_keys(key) when key in [true, false], do: key
      def stringify_keys(key) when is_atom(key), do: Atom.to_string(key)

      def stringify_keys(map) when is_map(map) do
        map
        |> Enum.map(fn {k, v} -> {stringify_keys(k), stringify_keys(v)} end)
        |> Enum.into(%{})
      end

      def stringify_keys([head | rest] = list) when is_list(list) do
        [stringify_keys(head) | stringify_keys(rest)]
      end

      def stringify_keys(key), do: key

      defmacro guards_config(config_path) do
        quote do
          initial_setting = Config.get(config_path)

          Config.put(config_path, true)
          on_exit(fn -> Config.put(config_path, initial_setting) end)
        end
      end
    end
  end
end