summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Chvanikov <chvanikoff@pm.me>2020-08-04 14:35:47 +0300
committerRoman Chvanikov <chvanikoff@pm.me>2020-08-04 14:35:47 +0300
commit56e9bf33932bacfdffd700b97e3117fc593cac11 (patch)
treee16ea207bb67fe8f54174f42fb3e0f4edd6e6fd7
parente3953923aca1706ab508bfda1ab892304b29c09a (diff)
downloadpleroma-56e9bf33932bacfdffd700b97e3117fc593cac11.tar.gz
pleroma-56e9bf33932bacfdffd700b97e3117fc593cac11.zip
Unify Config.get behaviour for atom/list key param
-rw-r--r--lib/pleroma/config.ex34
-rw-r--r--test/config_test.exs28
-rw-r--r--test/support/helpers.ex14
3 files changed, 67 insertions, 9 deletions
diff --git a/lib/pleroma/config.ex b/lib/pleroma/config.ex
index cc80deff5..88d1972ba 100644
--- a/lib/pleroma/config.ex
+++ b/lib/pleroma/config.ex
@@ -11,13 +11,33 @@ defmodule Pleroma.Config do
def get([key], default), do: get(key, default)
- def get([parent_key | keys], default) do
- case :pleroma
- |> Application.get_env(parent_key)
- |> get_in(keys) do
- nil -> default
- any -> any
- end
+ def get([root_key | keys], default) do
+ # This is to mimic Application.get_env/3 behaviour that returns `nil` if the
+ # actual value is `nil`.
+ Enum.reduce_while(keys, Application.get_env(:pleroma, root_key), fn key, config ->
+ case key do
+ [last_key] when is_map(config) ->
+ {:halt, Map.get(config, last_key, default)}
+
+ [last_key] when is_list(config) ->
+ {:halt, Keyword.get(config, last_key, default)}
+
+ _ ->
+ case config do
+ %{^key => value} ->
+ {:cont, value}
+
+ [_ | _] ->
+ case :lists.keyfind(key, 1, config) do
+ {_, value} -> {:cont, value}
+ _ -> {:halt, default}
+ end
+
+ _ ->
+ {:halt, default}
+ end
+ end
+ end)
end
def get(key, default) do
diff --git a/test/config_test.exs b/test/config_test.exs
index a46ab4302..3f3da06d0 100644
--- a/test/config_test.exs
+++ b/test/config_test.exs
@@ -28,6 +28,34 @@ defmodule Pleroma.ConfigTest do
assert Pleroma.Config.get([:azerty, :uiop], true) == true
end
+ describe "nil values" do
+ setup do
+ Pleroma.Config.put(:lorem, nil)
+ Pleroma.Config.put(:ipsum, %{dolor: [sit: nil]})
+ Pleroma.Config.put(:dolor, sit: %{amet: nil})
+
+ on_exit(fn -> Enum.each(~w(lorem ipsum dolor)a, &Pleroma.Config.delete/1) end)
+ end
+
+ test "get/1 with an atom for nil value" do
+ assert Pleroma.Config.get(:lorem) == nil
+ end
+
+ test "get/2 with an atom for nil value" do
+ assert Pleroma.Config.get(:lorem, true) == nil
+ end
+
+ test "get/1 with a list of keys for nil value" do
+ assert Pleroma.Config.get([:ipsum, :dolor, :sit]) == nil
+ assert Pleroma.Config.get([:dolor, :sit, :amet]) == nil
+ end
+
+ test "get/2 with a list of keys for nil value" do
+ assert Pleroma.Config.get([:ipsum, :dolor, :sit], true) == nil
+ assert Pleroma.Config.get([:dolor, :sit, :amet], true) == nil
+ end
+ end
+
test "get/1 when value is false" do
Pleroma.Config.put([:instance, :false_test], false)
Pleroma.Config.put([:instance, :nested], [])
diff --git a/test/support/helpers.ex b/test/support/helpers.ex
index 5cbf2e291..7d729541d 100644
--- a/test/support/helpers.ex
+++ b/test/support/helpers.ex
@@ -17,9 +17,19 @@ defmodule Pleroma.Tests.Helpers do
defmacro clear_config(config_path, do: yield) do
quote do
- initial_setting = Config.get(unquote(config_path))
+ initial_setting = Config.get(unquote(config_path), :__clear_config_absent__)
unquote(yield)
- on_exit(fn -> Config.put(unquote(config_path), initial_setting) end)
+
+ on_exit(fn ->
+ case initial_setting do
+ :__clear_config_absent__ ->
+ Config.delete(unquote(config_path))
+
+ _ ->
+ Config.put(unquote(config_path), initial_setting)
+ end
+ end)
+
:ok
end
end