diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/config/transfer_task_test.exs | 35 | ||||
| -rw-r--r-- | test/support/factory.ex | 13 | ||||
| -rw-r--r-- | test/tasks/config_test.exs | 54 | ||||
| -rw-r--r-- | test/tasks/instance.exs | 3 | ||||
| -rw-r--r-- | test/web/admin_api/admin_api_controller_test.exs | 172 | ||||
| -rw-r--r-- | test/web/admin_api/config_test.exs | 183 | 
6 files changed, 460 insertions, 0 deletions
| diff --git a/test/config/transfer_task_test.exs b/test/config/transfer_task_test.exs new file mode 100644 index 000000000..9b8a8dd45 --- /dev/null +++ b/test/config/transfer_task_test.exs @@ -0,0 +1,35 @@ +defmodule Pleroma.Config.TransferTaskTest do +  use Pleroma.DataCase + +  setup do +    dynamic = Pleroma.Config.get([:instance, :dynamic_configuration]) + +    Pleroma.Config.put([:instance, :dynamic_configuration], true) + +    on_exit(fn -> +      Pleroma.Config.put([:instance, :dynamic_configuration], dynamic) +    end) +  end + +  test "transfer config values from db to env" do +    refute Application.get_env(:pleroma, :test_key) +    Pleroma.Web.AdminAPI.Config.create(%{key: "test_key", value: [live: 2, com: 3]}) + +    Pleroma.Config.TransferTask.start_link() + +    assert Application.get_env(:pleroma, :test_key) == [live: 2, com: 3] + +    on_exit(fn -> +      Application.delete_env(:pleroma, :test_key) +    end) +  end + +  test "non existing atom" do +    Pleroma.Web.AdminAPI.Config.create(%{key: "undefined_atom_key", value: [live: 2, com: 3]}) + +    assert ExUnit.CaptureLog.capture_log(fn -> +             Pleroma.Config.TransferTask.start_link() +           end) =~ +             "updating env causes error, key: \"undefined_atom_key\", error: %ArgumentError{message: \"argument error\"}" +  end +end diff --git a/test/support/factory.ex b/test/support/factory.ex index be6247ca4..5be34660e 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -310,4 +310,17 @@ defmodule Pleroma.Factory do        }      }    end + +  def config_factory do +    %Pleroma.Web.AdminAPI.Config{ +      key: sequence(:key, &"some_key_#{&1}"), +      value: +        sequence( +          :value, +          fn key -> +            :erlang.term_to_binary(%{another_key: "#{key}somevalue", another: "#{key}somevalue"}) +          end +        ) +    } +  end  end diff --git a/test/tasks/config_test.exs b/test/tasks/config_test.exs new file mode 100644 index 000000000..7d3b1860c --- /dev/null +++ b/test/tasks/config_test.exs @@ -0,0 +1,54 @@ +defmodule Mix.Tasks.Pleroma.ConfigTest do +  use Pleroma.DataCase +  alias Pleroma.Repo +  alias Pleroma.Web.AdminAPI.Config + +  setup_all do +    Mix.shell(Mix.Shell.Process) +    temp_file = "config/temp.migrated.secret.exs" + +    dynamic = Pleroma.Config.get([:instance, :dynamic_configuration]) + +    Pleroma.Config.put([:instance, :dynamic_configuration], true) + +    on_exit(fn -> +      Mix.shell(Mix.Shell.IO) +      Application.delete_env(:pleroma, :first_setting) +      Application.delete_env(:pleroma, :second_setting) +      Pleroma.Config.put([:instance, :dynamic_configuration], dynamic) +      :ok = File.rm(temp_file) +    end) + +    {:ok, temp_file: temp_file} +  end + +  test "settings are migrated to db" do +    assert Repo.all(Config) == [] + +    Application.put_env(:pleroma, :first_setting, key: "value", key2: [Pleroma.Repo]) +    Application.put_env(:pleroma, :second_setting, key: "value2", key2: [Pleroma.Activity]) + +    Mix.Tasks.Pleroma.Config.run(["migrate_to_db"]) + +    first_db = Config.get_by_key("first_setting") +    second_db = Config.get_by_key("second_setting") +    refute Config.get_by_key("Pleroma.Repo") + +    assert Config.from_binary(first_db.value) == [key: "value", key2: [Pleroma.Repo]] +    assert Config.from_binary(second_db.value) == [key: "value2", key2: [Pleroma.Activity]] +  end + +  test "settings are migrated to file and deleted from db", %{temp_file: temp_file} do +    Config.create(%{key: "setting_first", value: [key: "value", key2: [Pleroma.Activity]]}) +    Config.create(%{key: "setting_second", value: [key: "valu2", key2: [Pleroma.Repo]]}) + +    Mix.Tasks.Pleroma.Config.run(["migrate_from_db", "temp"]) + +    assert Repo.all(Config) == [] +    assert File.exists?(temp_file) +    {:ok, file} = File.read(temp_file) + +    assert file =~ "config :pleroma, setting_first:" +    assert file =~ "config :pleroma, setting_second:" +  end +end diff --git a/test/tasks/instance.exs b/test/tasks/instance.exs index 6917a2376..1875f52a3 100644 --- a/test/tasks/instance.exs +++ b/test/tasks/instance.exs @@ -36,6 +36,8 @@ defmodule Pleroma.InstanceTest do          "--dbpass",          "dbpass",          "--indexable", +        "y", +        "--db-configurable",          "y"        ])      end @@ -53,6 +55,7 @@ defmodule Pleroma.InstanceTest do      assert generated_config =~ "database: \"dbname\""      assert generated_config =~ "username: \"dbuser\""      assert generated_config =~ "password: \"dbpass\"" +    assert generated_config =~ "dynamic_configuration: true"      assert File.read!(tmp_path() <> "setup.psql") == generated_setup_psql()    end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 43dcf945a..18f64f2b7 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -1292,4 +1292,176 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, :bad_request) == "Could not delete"      end    end + +  describe "GET /api/pleroma/admin/config" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      %{conn: assign(conn, :user, admin)} +    end + +    test "without any settings in db", %{conn: conn} do +      conn = get(conn, "/api/pleroma/admin/config") + +      assert json_response(conn, 200) == %{"configs" => []} +    end + +    test "with settings in db", %{conn: conn} do +      config1 = insert(:config) +      config2 = insert(:config) + +      conn = get(conn, "/api/pleroma/admin/config") + +      %{ +        "configs" => [ +          %{ +            "key" => key1, +            "value" => _ +          }, +          %{ +            "key" => key2, +            "value" => _ +          } +        ] +      } = json_response(conn, 200) + +      assert key1 == config1.key +      assert key2 == config2.key +    end +  end + +  describe "POST /api/pleroma/admin/config" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      temp_file = "config/test.migrated.secret.exs" + +      on_exit(fn -> +        Application.delete_env(:pleroma, :key1) +        Application.delete_env(:pleroma, :key2) +        Application.delete_env(:pleroma, :key3) +        Application.delete_env(:pleroma, :key4) +        Application.delete_env(:pleroma, :keyaa1) +        Application.delete_env(:pleroma, :keyaa2) +        :ok = File.rm(temp_file) +      end) + +      dynamic = Pleroma.Config.get([:instance, :dynamic_configuration]) + +      Pleroma.Config.put([:instance, :dynamic_configuration], true) + +      on_exit(fn -> +        Pleroma.Config.put([:instance, :dynamic_configuration], dynamic) +      end) + +      %{conn: assign(conn, :user, admin)} +    end + +    test "create new config setting in db", %{conn: conn} do +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{key: "key1", value: "value1"}, +            %{ +              key: "key2", +              value: %{ +                "nested_1" => "nested_value1", +                "nested_2" => [ +                  %{"nested_22" => "nested_value222"}, +                  %{"nested_33" => %{"nested_44" => "nested_444"}} +                ] +              } +            }, +            %{ +              key: "key3", +              value: [ +                %{"nested_3" => ":nested_3", "nested_33" => "nested_33"}, +                %{"nested_4" => ":true"} +              ] +            }, +            %{ +              key: "key4", +              value: %{"nested_5" => ":upload", "endpoint" => "https://example.com"} +            } +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "key" => "key1", +                   "value" => "value1" +                 }, +                 %{ +                   "key" => "key2", +                   "value" => [ +                     %{"nested_1" => "nested_value1"}, +                     %{ +                       "nested_2" => [ +                         %{"nested_22" => "nested_value222"}, +                         %{"nested_33" => %{"nested_44" => "nested_444"}} +                       ] +                     } +                   ] +                 }, +                 %{ +                   "key" => "key3", +                   "value" => [ +                     [%{"nested_3" => "nested_3"}, %{"nested_33" => "nested_33"}], +                     %{"nested_4" => true} +                   ] +                 }, +                 %{ +                   "key" => "key4", +                   "value" => [%{"endpoint" => "https://example.com"}, %{"nested_5" => "upload"}] +                 } +               ] +             } + +      assert Application.get_env(:pleroma, :key1) == "value1" + +      assert Application.get_env(:pleroma, :key2) == [ +               nested_1: "nested_value1", +               nested_2: [ +                 [nested_22: "nested_value222"], +                 [nested_33: [nested_44: "nested_444"]] +               ] +             ] + +      assert Application.get_env(:pleroma, :key3) == [ +               [nested_3: :nested_3, nested_33: "nested_33"], +               [nested_4: true] +             ] + +      assert Application.get_env(:pleroma, :key4) == [ +               endpoint: "https://example.com", +               nested_5: :upload +             ] +    end + +    test "update config setting & delete", %{conn: conn} do +      config1 = insert(:config, key: "keyaa1") +      config2 = insert(:config, key: "keyaa2") + +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{key: config1.key, value: "another_value"}, +            %{key: config2.key, delete: "true"} +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "key" => config1.key, +                   "value" => "another_value" +                 } +               ] +             } + +      assert Application.get_env(:pleroma, :keyaa1) == "another_value" +      refute Application.get_env(:pleroma, :keyaa2) +    end +  end  end diff --git a/test/web/admin_api/config_test.exs b/test/web/admin_api/config_test.exs new file mode 100644 index 000000000..a2fedca40 --- /dev/null +++ b/test/web/admin_api/config_test.exs @@ -0,0 +1,183 @@ +defmodule Pleroma.Web.AdminAPI.ConfigTest do +  use Pleroma.DataCase, async: true +  import Pleroma.Factory +  alias Pleroma.Web.AdminAPI.Config + +  test "get_by_key/1" do +    config = insert(:config) +    insert(:config) + +    assert config == Config.get_by_key(config.key) +  end + +  test "create/1" do +    {:ok, config} = Config.create(%{key: "some_key", value: "some_value"}) +    assert config == Config.get_by_key("some_key") +  end + +  test "update/1" do +    config = insert(:config) +    {:ok, updated} = Config.update(config, %{value: "some_value"}) +    loaded = Config.get_by_key(config.key) +    assert loaded == updated +  end + +  test "update_or_create/1" do +    config = insert(:config) +    key2 = "another_key" + +    params = [ +      %{key: key2, value: "another_value"}, +      %{key: config.key, value: "new_value"} +    ] + +    assert Repo.all(Config) |> length() == 1 + +    Enum.each(params, &Config.update_or_create(&1)) + +    assert Repo.all(Config) |> length() == 2 + +    config1 = Config.get_by_key(config.key) +    config2 = Config.get_by_key(key2) + +    assert config1.value == Config.transform("new_value") +    assert config2.value == Config.transform("another_value") +  end + +  test "delete/1" do +    config = insert(:config) +    {:ok, _} = Config.delete(config.key) +    refute Config.get_by_key(config.key) +  end + +  describe "transform/1" do +    test "string" do +      binary = Config.transform("value as string") +      assert binary == :erlang.term_to_binary("value as string") +      assert Config.from_binary(binary) == "value as string" +    end + +    test "list of modules" do +      binary = Config.transform(["Pleroma.Repo", "Pleroma.Activity"]) +      assert binary == :erlang.term_to_binary([Pleroma.Repo, Pleroma.Activity]) +      assert Config.from_binary(binary) == [Pleroma.Repo, Pleroma.Activity] +    end + +    test "list of strings" do +      binary = Config.transform(["string1", "string2"]) +      assert binary == :erlang.term_to_binary(["string1", "string2"]) +      assert Config.from_binary(binary) == ["string1", "string2"] +    end + +    test "map" do +      binary = +        Config.transform(%{ +          "types" => "Pleroma.PostgresTypes", +          "telemetry_event" => ["Pleroma.Repo.Instrumenter"], +          "migration_lock" => "" +        }) + +      assert binary == +               :erlang.term_to_binary( +                 telemetry_event: [Pleroma.Repo.Instrumenter], +                 types: Pleroma.PostgresTypes +               ) + +      assert Config.from_binary(binary) == [ +               telemetry_event: [Pleroma.Repo.Instrumenter], +               types: Pleroma.PostgresTypes +             ] +    end + +    test "complex map with nested integers, lists and atoms" do +      binary = +        Config.transform(%{ +          "uploader" => "Pleroma.Uploaders.Local", +          "filters" => ["Pleroma.Upload.Filter.Dedupe"], +          "link_name" => ":true", +          "proxy_remote" => ":false", +          "proxy_opts" => %{ +            "redirect_on_failure" => ":false", +            "max_body_length" => "i:1048576", +            "http" => %{ +              "follow_redirect" => ":true", +              "pool" => ":upload" +            } +          } +        }) + +      assert binary == +               :erlang.term_to_binary( +                 filters: [Pleroma.Upload.Filter.Dedupe], +                 link_name: true, +                 proxy_opts: [ +                   http: [ +                     follow_redirect: true, +                     pool: :upload +                   ], +                   max_body_length: 1_048_576, +                   redirect_on_failure: false +                 ], +                 proxy_remote: false, +                 uploader: Pleroma.Uploaders.Local +               ) + +      assert Config.from_binary(binary) == +               [ +                 filters: [Pleroma.Upload.Filter.Dedupe], +                 link_name: true, +                 proxy_opts: [ +                   http: [ +                     follow_redirect: true, +                     pool: :upload +                   ], +                   max_body_length: 1_048_576, +                   redirect_on_failure: false +                 ], +                 proxy_remote: false, +                 uploader: Pleroma.Uploaders.Local +               ] +    end + +    test "keyword" do +      binary = +        Config.transform(%{ +          "level" => ":warn", +          "meta" => [":all"], +          "webhook_url" => "https://hooks.slack.com/services/YOUR-KEY-HERE" +        }) + +      assert binary == +               :erlang.term_to_binary( +                 level: :warn, +                 meta: [:all], +                 webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE" +               ) + +      assert Config.from_binary(binary) == [ +               level: :warn, +               meta: [:all], +               webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE" +             ] +    end + +    test "complex map with sigil" do +      binary = +        Config.transform(%{ +          federated_timeline_removal: [], +          reject: [~r/comp[lL][aA][iI][nN]er/], +          replace: [] +        }) + +      assert binary == +               :erlang.term_to_binary( +                 federated_timeline_removal: [], +                 reject: [~r/comp[lL][aA][iI][nN]er/], +                 replace: [] +               ) + +      assert Config.from_binary(binary) == +               [federated_timeline_removal: [], reject: [~r/comp[lL][aA][iI][nN]er/], replace: []] +    end +  end +end | 
