tests for release config provider
authorAlexander Strizhakov <alex.strizhakov@gmail.com>
Sat, 27 Mar 2021 06:05:33 +0000 (09:05 +0300)
committerAlexander Strizhakov <alex.strizhakov@gmail.com>
Sat, 27 Mar 2021 06:05:33 +0000 (09:05 +0300)
lib/pleroma/config/release_runtime_provider.ex
mix.exs
test/fixtures/config/temp.exported_from_db.secret.exs [new file with mode: 0644]
test/pleroma/config/release_runtime_provider_test.exs [new file with mode: 0644]

index 70ef3bcc16276f26c3b57a9c0fc017e1f74f33ba..46fa355591c77ad0b76d516d6dc4bafe2e6658e9 100644 (file)
@@ -1,6 +1,6 @@
 defmodule Pleroma.Config.ReleaseRuntimeProvider do
   @moduledoc """
-  Imports `runtime.exs` and `{env}.exported_from_db.secret.exs` for elixir releases.
+  Imports runtime config and `{env}.exported_from_db.secret.exs` for releases.
   """
   @behaviour Config.Provider
 
@@ -8,13 +8,13 @@ defmodule Pleroma.Config.ReleaseRuntimeProvider do
   def init(opts), do: opts
 
   @impl true
-  def load(config, _opts) do
+  def load(config, opts) do
     with_defaults = Config.Reader.merge(config, Pleroma.Config.Holder.release_defaults())
 
-    config_path = System.get_env("PLEROMA_CONFIG_PATH") || "/etc/pleroma/config.exs"
+    config_path = opts[:config_path]
 
     with_runtime_config =
-      if File.exists?(config_path) do
+      if config_path && File.exists?(config_path) do
         runtime_config = Config.Reader.read!(config_path)
 
         with_defaults
@@ -24,7 +24,7 @@ defmodule Pleroma.Config.ReleaseRuntimeProvider do
         warning = [
           IO.ANSI.red(),
           IO.ANSI.bright(),
-          "!!! #{config_path} not found! Please ensure it exists and that PLEROMA_CONFIG_PATH is unset or points to an existing file",
+          "!!! Config path is not declared! Please ensure it exists and that PLEROMA_CONFIG_PATH is unset or points to an existing file",
           IO.ANSI.reset()
         ]
 
@@ -32,13 +32,10 @@ defmodule Pleroma.Config.ReleaseRuntimeProvider do
         with_defaults
       end
 
-    exported_config_path =
-      config_path
-      |> Path.dirname()
-      |> Path.join("prod.exported_from_db.secret.exs")
+    exported_config_path = opts[:exported_config_path]
 
     with_exported =
-      if File.exists?(exported_config_path) do
+      if exported_config_path && File.exists?(exported_config_path) do
         exported_config = Config.Reader.read!(exported_config_path)
         Config.Reader.merge(with_runtime_config, exported_config)
       else
diff --git a/mix.exs b/mix.exs
index ae74f50a3ce3939284e60349d9c221e32a78abef..7328b533b497739c4efc52277f2f26cbe2163e64 100644 (file)
--- a/mix.exs
+++ b/mix.exs
@@ -38,7 +38,7 @@ defmodule Pleroma.Mixfile do
           include_executables_for: [:unix],
           applications: [ex_syslogger: :load, syslog: :load, eldap: :transient],
           steps: [:assemble, &put_otp_version/1, &copy_files/1, &copy_nginx_config/1],
-          config_providers: [{Pleroma.Config.ReleaseRuntimeProvider, nil}]
+          config_providers: [{Pleroma.Config.ReleaseRuntimeProvider, release_config_paths()}]
         ]
       ]
     ]
@@ -67,6 +67,17 @@ defmodule Pleroma.Mixfile do
     release
   end
 
+  defp release_config_paths do
+    config_path = System.get_env("PLEROMA_CONFIG_PATH") || "/etc/pleroma/config.exs"
+
+    exported_config_path =
+      config_path
+      |> Path.dirname()
+      |> Path.join("#{Mix.env()}.exported_from_db.secret.exs")
+
+    [config_path: config_path, exported_config_path: exported_config_path]
+  end
+
   # Configuration for the OTP application.
   #
   # Type `mix help compile.app` for more information.
diff --git a/test/fixtures/config/temp.exported_from_db.secret.exs b/test/fixtures/config/temp.exported_from_db.secret.exs
new file mode 100644 (file)
index 0000000..64bee7f
--- /dev/null
@@ -0,0 +1,5 @@
+use Mix.Config
+
+config :pleroma, exported_config_merged: true
+
+config :pleroma, :first_setting, key: "new value"
diff --git a/test/pleroma/config/release_runtime_provider_test.exs b/test/pleroma/config/release_runtime_provider_test.exs
new file mode 100644 (file)
index 0000000..1921698
--- /dev/null
@@ -0,0 +1,46 @@
+defmodule Pleroma.Config.ReleaseRuntimeProviderTest do
+  use ExUnit.Case, async: true
+
+  alias Pleroma.Config.ReleaseRuntimeProvider
+
+  describe "load/2" do
+    test "loads release defaults config and warns about non-existent runtime config" do
+      ExUnit.CaptureIO.capture_io(fn ->
+        merged = ReleaseRuntimeProvider.load([], [])
+        assert merged == Pleroma.Config.Holder.release_defaults()
+        IO.inspect(merged)
+      end) =~
+        "!!! Config path is not declared! Please ensure it exists and that PLEROMA_CONFIG_PATH is unset or points to an existing file"
+    end
+
+    test "merged runtime config" do
+      merged =
+        ReleaseRuntimeProvider.load([], config_path: "test/fixtures/config/temp.secret.exs")
+
+      assert merged[:pleroma][:first_setting] == [key: "value", key2: [Pleroma.Repo]]
+      assert merged[:pleroma][:second_setting] == [key: "value2", key2: ["Activity"]]
+    end
+
+    test "merged exported config" do
+      ExUnit.CaptureIO.capture_io(fn ->
+        merged =
+          ReleaseRuntimeProvider.load([],
+            exported_config_path: "test/fixtures/config/temp.exported_from_db.secret.exs"
+          )
+
+        assert merged[:pleroma][:exported_config_merged]
+      end) =~
+        "!!! Config path is not declared! Please ensure it exists and that PLEROMA_CONFIG_PATH is unset or points to an existing file"
+    end
+
+    test "runtime config is merged with exported config" do
+      merged =
+        ReleaseRuntimeProvider.load([],
+          config_path: "test/fixtures/config/temp.secret.exs",
+          exported_config_path: "test/fixtures/config/temp.exported_from_db.secret.exs"
+        )
+
+      assert merged[:pleroma][:first_setting] == [key2: [Pleroma.Repo], key: "new value"]
+    end
+  end
+end