diff options
Diffstat (limited to 'test/web')
| -rw-r--r-- | test/web/admin_api/admin_api_controller_test.exs | 525 | ||||
| -rw-r--r-- | test/web/admin_api/config_test.exs | 190 | 
2 files changed, 624 insertions, 91 deletions
| diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index a3fbb6041..610fa5271 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -597,7 +597,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, :no_content) -      token_record = List.last(Pleroma.Repo.all(Pleroma.UserInviteToken)) +      token_record = List.last(Repo.all(Pleroma.UserInviteToken))        assert token_record        refute token_record.used @@ -1860,10 +1860,25 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "GET /api/pleroma/admin/config" do +    clear_config([:configurable_from_database]) do +      Pleroma.Config.put([:configurable_from_database], true) +    end + +    test "when configuration from database is off", %{conn: conn} do +      initial = Pleroma.Config.get([:configurable_from_database]) +      Pleroma.Config.put([:configurable_from_database], false) +      on_exit(fn -> Pleroma.Config.put([:configurable_from_database], initial) end) +      conn = get(conn, "/api/pleroma/admin/config") + +      assert json_response(conn, 400) == +               "To use this endpoint you need to enable configuration from database." +    end +      test "without any settings in db", %{conn: conn} do        conn = get(conn, "/api/pleroma/admin/config") -      assert json_response(conn, 200) == %{"configs" => []} +      assert json_response(conn, 400) == +               "To use configuration from database migrate your settings to database."      end      test "with settings in db", %{conn: conn} do @@ -1875,6 +1890,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        %{          "configs" => [            %{ +            "group" => ":pleroma",              "key" => key1,              "value" => _            }, @@ -1890,9 +1906,16 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end +  test "POST /api/pleroma/admin/config error", %{conn: conn} do +    conn = post(conn, "/api/pleroma/admin/config", %{"configs" => []}) + +    assert json_response(conn, 400) == +             "To use this endpoint you need to enable configuration from database." +  end +    describe "POST /api/pleroma/admin/config" do      setup do -      temp_file = "config/test.exported_from_db.secret.exs" +      http = Application.get_env(:pleroma, :http)        on_exit(fn ->          Application.delete_env(:pleroma, :key1) @@ -1903,12 +1926,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          Application.delete_env(:pleroma, :keyaa2)          Application.delete_env(:pleroma, Pleroma.Web.Endpoint.NotReal)          Application.delete_env(:pleroma, Pleroma.Captcha.NotReal) -        :ok = File.rm(temp_file) +        Application.put_env(:pleroma, :http, http) +        Application.put_env(:tesla, :adapter, Tesla.Mock) +        :ok = File.rm("config/test.exported_from_db.secret.exs")        end)      end -    clear_config([:instance, :dynamic_configuration]) do -      Pleroma.Config.put([:instance, :dynamic_configuration], true) +    clear_config([:configurable_from_database]) do +      Pleroma.Config.put([:configurable_from_database], true)      end      @tag capture_log: true @@ -1916,15 +1941,15 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn =          post(conn, "/api/pleroma/admin/config", %{            configs: [ -            %{group: "pleroma", key: "key1", value: "value1"}, +            %{group: ":pleroma", key: ":key1", value: "value1"},              %{ -              group: "ueberauth", +              group: ":ueberauth",                key: "Ueberauth.Strategy.Twitter.OAuth",                value: [%{"tuple" => [":consumer_secret", "aaaa"]}]              },              %{ -              group: "pleroma", -              key: "key2", +              group: ":pleroma", +              key: ":key2",                value: %{                  ":nested_1" => "nested_value1",                  ":nested_2" => [ @@ -1934,21 +1959,21 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                }              },              %{ -              group: "pleroma", -              key: "key3", +              group: ":pleroma", +              key: ":key3",                value: [                  %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},                  %{"nested_4" => true}                ]              },              %{ -              group: "pleroma", -              key: "key4", +              group: ":pleroma", +              key: ":key4",                value: %{":nested_5" => ":upload", "endpoint" => "https://example.com"}              },              %{ -              group: "idna", -              key: "key5", +              group: ":idna", +              key: ":key5",                value: %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}              }            ] @@ -1957,18 +1982,18 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "pleroma", -                   "key" => "key1", +                   "group" => ":pleroma", +                   "key" => ":key1",                     "value" => "value1"                   },                   %{ -                   "group" => "ueberauth", +                   "group" => ":ueberauth",                     "key" => "Ueberauth.Strategy.Twitter.OAuth",                     "value" => [%{"tuple" => [":consumer_secret", "aaaa"]}]                   },                   %{ -                   "group" => "pleroma", -                   "key" => "key2", +                   "group" => ":pleroma", +                   "key" => ":key2",                     "value" => %{                       ":nested_1" => "nested_value1",                       ":nested_2" => [ @@ -1978,21 +2003,21 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                     }                   },                   %{ -                   "group" => "pleroma", -                   "key" => "key3", +                   "group" => ":pleroma", +                   "key" => ":key3",                     "value" => [                       %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},                       %{"nested_4" => true}                     ]                   },                   %{ -                   "group" => "pleroma", -                   "key" => "key4", +                   "group" => ":pleroma", +                   "key" => ":key4",                     "value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"}                   },                   %{ -                   "group" => "idna", -                   "key" => "key5", +                   "group" => ":idna", +                   "key" => ":key5",                     "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}                   }                 ] @@ -2021,25 +2046,261 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []}      end +    test "save config setting without key", %{conn: conn} do +      level = Application.get_env(:quack, :level) +      meta = Application.get_env(:quack, :meta) +      webhook_url = Application.get_env(:quack, :webhook_url) + +      on_exit(fn -> +        Application.put_env(:quack, :level, level) +        Application.put_env(:quack, :meta, meta) +        Application.put_env(:quack, :webhook_url, webhook_url) +      end) + +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{ +              group: ":quack", +              key: ":level", +              value: ":info" +            }, +            %{ +              group: ":quack", +              key: ":meta", +              value: [":none"] +            }, +            %{ +              group: ":quack", +              key: ":webhook_url", +              value: "https://hooks.slack.com/services/KEY" +            } +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{"group" => ":quack", "key" => ":level", "value" => ":info"}, +                 %{"group" => ":quack", "key" => ":meta", "value" => [":none"]}, +                 %{ +                   "group" => ":quack", +                   "key" => ":webhook_url", +                   "value" => "https://hooks.slack.com/services/KEY" +                 } +               ] +             } + +      assert Application.get_env(:quack, :level) == :info +      assert Application.get_env(:quack, :meta) == [:none] +      assert Application.get_env(:quack, :webhook_url) == "https://hooks.slack.com/services/KEY" +    end + +    test "saving config with partial update", %{conn: conn} do +      config = insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: 2)) + +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{group: config.group, key: config.key, value: [%{"tuple" => [":key3", 3]}]} +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma", +                   "key" => ":key1", +                   "value" => [ +                     %{"tuple" => [":key1", 1]}, +                     %{"tuple" => [":key2", 2]}, +                     %{"tuple" => [":key3", 3]} +                   ] +                 } +               ] +             } +    end + +    test "saving config with nested merge", %{conn: conn} do +      config = +        insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: [k1: 1, k2: 2])) + +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{ +              group: config.group, +              key: config.key, +              value: [ +                %{"tuple" => [":key3", 3]}, +                %{ +                  "tuple" => [ +                    ":key2", +                    [ +                      %{"tuple" => [":k2", 1]}, +                      %{"tuple" => [":k3", 3]} +                    ] +                  ] +                } +              ] +            } +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma", +                   "key" => ":key1", +                   "value" => [ +                     %{"tuple" => [":key1", 1]}, +                     %{"tuple" => [":key3", 3]}, +                     %{ +                       "tuple" => [ +                         ":key2", +                         [ +                           %{"tuple" => [":k1", 1]}, +                           %{"tuple" => [":k2", 1]}, +                           %{"tuple" => [":k3", 3]} +                         ] +                       ] +                     } +                   ] +                 } +               ] +             } +    end + +    test "saving special atoms", %{conn: conn} do +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          "configs" => [ +            %{ +              "group" => ":pleroma", +              "key" => ":key1", +              "value" => [ +                %{ +                  "tuple" => [ +                    ":ssl_options", +                    [%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}] +                  ] +                } +              ] +            } +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma", +                   "key" => ":key1", +                   "value" => [ +                     %{ +                       "tuple" => [ +                         ":ssl_options", +                         [%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}] +                       ] +                     } +                   ] +                 } +               ] +             } + +      assert Application.get_env(:pleroma, :key1) == [ +               ssl_options: [versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"]] +             ] +    end + +    test "saving full setting if value is in full_key_update list", %{conn: conn} do +      backends = Application.get_env(:logger, :backends) +      on_exit(fn -> Application.put_env(:logger, :backends, backends) end) + +      config = +        insert(:config, +          group: ":logger", +          key: ":backends", +          value: :erlang.term_to_binary([]) +        ) + +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{ +              group: config.group, +              key: config.key, +              value: [":console", %{"tuple" => ["ExSyslogger", ":ex_syslogger"]}] +            } +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":logger", +                   "key" => ":backends", +                   "value" => [ +                     ":console", +                     %{"tuple" => ["ExSyslogger", ":ex_syslogger"]} +                   ] +                 } +               ] +             } + +      assert Application.get_env(:logger, :backends) == [ +               :console, +               {ExSyslogger, :ex_syslogger} +             ] + +      ExUnit.CaptureLog.capture_log(fn -> +        require Logger +        Logger.warn("Ooops...") +      end) =~ "Ooops..." +    end + +    test "saving full setting if value is not keyword", %{conn: conn} do +      config = +        insert(:config, +          group: ":tesla", +          key: ":adapter", +          value: :erlang.term_to_binary(Tesla.Adapter.Hackey) +        ) + +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{group: config.group, key: config.key, value: "Tesla.Adapter.Httpc"} +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":tesla", +                   "key" => ":adapter", +                   "value" => "Tesla.Adapter.Httpc" +                 } +               ] +             } +    end +      test "update config setting & delete", %{conn: conn} do -      config1 = insert(:config, key: "keyaa1") -      config2 = insert(:config, key: "keyaa2") +      config1 = insert(:config, key: ":keyaa1") +      config2 = insert(:config, key: ":keyaa2")        insert(:config,          group: "ueberauth", -        key: "Ueberauth.Strategy.Microsoft.OAuth", -        value: :erlang.term_to_binary([]) +        key: "Ueberauth.Strategy.Microsoft.OAuth"        )        conn =          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{group: config1.group, key: config1.key, value: "another_value"}, -            %{group: config2.group, key: config2.key, delete: "true"}, +            %{group: config2.group, key: config2.key, delete: true},              %{                group: "ueberauth",                key: "Ueberauth.Strategy.Microsoft.OAuth", -              delete: "true" +              delete: true              }            ]          }) @@ -2047,7 +2308,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "pleroma", +                   "group" => ":pleroma",                     "key" => config1.key,                     "value" => "another_value"                   } @@ -2059,11 +2320,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "common config example", %{conn: conn} do +      adapter = Application.get_env(:tesla, :adapter) +      on_exit(fn -> Application.put_env(:tesla, :adapter, adapter) end) +        conn =          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "pleroma", +              "group" => ":pleroma",                "key" => "Pleroma.Captcha.NotReal",                "value" => [                  %{"tuple" => [":enabled", false]}, @@ -2075,16 +2339,21 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                  %{"tuple" => [":regex1", "~r/https:\/\/example.com/"]},                  %{"tuple" => [":regex2", "~r/https:\/\/example.com/u"]},                  %{"tuple" => [":regex3", "~r/https:\/\/example.com/i"]}, -                %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]} +                %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]}, +                %{"tuple" => [":name", "Pleroma"]}                ] -            } +            }, +            %{"group" => ":tesla", "key" => ":adapter", "value" => "Tesla.Adapter.Httpc"}            ]          }) +      assert Application.get_env(:tesla, :adapter) == Tesla.Adapter.Httpc +      assert Pleroma.Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma" +        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "pleroma", +                   "group" => ":pleroma",                     "key" => "Pleroma.Captcha.NotReal",                     "value" => [                       %{"tuple" => [":enabled", false]}, @@ -2096,9 +2365,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                       %{"tuple" => [":regex1", "~r/https:\\/\\/example.com/"]},                       %{"tuple" => [":regex2", "~r/https:\\/\\/example.com/u"]},                       %{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]}, -                     %{"tuple" => [":regex4", "~r/https:\\/\\/example.com/s"]} +                     %{"tuple" => [":regex4", "~r/https:\\/\\/example.com/s"]}, +                     %{"tuple" => [":name", "Pleroma"]}                     ] -                 } +                 }, +                 %{"group" => ":tesla", "key" => ":adapter", "value" => "Tesla.Adapter.Httpc"}                 ]               }      end @@ -2108,7 +2379,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "pleroma", +              "group" => ":pleroma",                "key" => "Pleroma.Web.Endpoint.NotReal",                "value" => [                  %{ @@ -2172,7 +2443,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "pleroma", +                   "group" => ":pleroma",                     "key" => "Pleroma.Web.Endpoint.NotReal",                     "value" => [                       %{ @@ -2239,7 +2510,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "pleroma", +              "group" => ":pleroma",                "key" => ":key1",                "value" => [                  %{"tuple" => [":key2", "some_val"]}, @@ -2269,7 +2540,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 %{                   "configs" => [                     %{ -                     "group" => "pleroma", +                     "group" => ":pleroma",                       "key" => ":key1",                       "value" => [                         %{"tuple" => [":key2", "some_val"]}, @@ -2301,7 +2572,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "pleroma", +              "group" => ":pleroma",                "key" => ":key1",                "value" => %{"key" => "some_val"}              } @@ -2312,7 +2583,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 %{                   "configs" => [                     %{ -                     "group" => "pleroma", +                     "group" => ":pleroma",                       "key" => ":key1",                       "value" => %{"key" => "some_val"}                     } @@ -2325,7 +2596,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "pleroma", +              "group" => ":pleroma",                "key" => "Pleroma.Web.Endpoint.NotReal",                "value" => [                  %{ @@ -2358,7 +2629,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "pleroma", +                   "group" => ":pleroma",                     "key" => "Pleroma.Web.Endpoint.NotReal",                     "value" => [                       %{ @@ -2388,7 +2659,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "oban", +              "group" => ":oban",                "key" => ":queues",                "value" => [                  %{"tuple" => [":federator_incoming", 50]}, @@ -2406,7 +2677,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "oban", +                   "group" => ":oban",                     "key" => ":queues",                     "value" => [                       %{"tuple" => [":federator_incoming", 50]}, @@ -2425,7 +2696,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      test "delete part of settings by atom subkeys", %{conn: conn} do        config =          insert(:config, -          key: "keyaa1", +          key: ":keyaa1",            value: :erlang.term_to_binary(subkey1: "val1", subkey2: "val2", subkey3: "val3")          ) @@ -2436,41 +2707,123 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                group: config.group,                key: config.key,                subkeys: [":subkey1", ":subkey3"], -              delete: "true" +              delete: true              }            ]          }) -      assert( -        json_response(conn, 200) == %{ -          "configs" => [ +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma", +                   "key" => ":keyaa1", +                   "value" => [%{"tuple" => [":subkey2", "val2"]}] +                 } +               ] +             } +    end + +    test "proxy tuple localhost", %{conn: conn} do +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [              %{ -              "group" => "pleroma", -              "key" => "keyaa1", -              "value" => [%{"tuple" => [":subkey2", "val2"]}] +              group: ":pleroma", +              key: ":http", +              value: [ +                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]}, +                %{"tuple" => [":send_user_agent", false]} +              ]              }            ] -        } -      ) +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma", +                   "key" => ":http", +                   "value" => [ +                     %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]}, +                     %{"tuple" => [":send_user_agent", false]} +                   ] +                 } +               ] +             } +    end + +    test "proxy tuple domain", %{conn: conn} do +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{ +              group: ":pleroma", +              key: ":http", +              value: [ +                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]}, +                %{"tuple" => [":send_user_agent", false]} +              ] +            } +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma", +                   "key" => ":http", +                   "value" => [ +                     %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]}, +                     %{"tuple" => [":send_user_agent", false]} +                   ] +                 } +               ] +             } +    end + +    test "proxy tuple ip", %{conn: conn} do +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{ +              group: ":pleroma", +              key: ":http", +              value: [ +                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]}, +                %{"tuple" => [":send_user_agent", false]} +              ] +            } +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma", +                   "key" => ":http", +                   "value" => [ +                     %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]}, +                     %{"tuple" => [":send_user_agent", false]} +                   ] +                 } +               ] +             }      end    end    describe "config mix tasks run" do      setup do -      temp_file = "config/test.exported_from_db.secret.exs" -        Mix.shell(Mix.Shell.Quiet)        on_exit(fn ->          Mix.shell(Mix.Shell.IO) -        :ok = File.rm(temp_file)        end)        :ok      end -    clear_config([:instance, :dynamic_configuration]) do -      Pleroma.Config.put([:instance, :dynamic_configuration], true) +    clear_config([:configurable_from_database]) do +      Pleroma.Config.put([:configurable_from_database], true)      end      clear_config([:feed, :post_title]) do @@ -2478,15 +2831,28 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "transfer settings to DB and to file", %{conn: conn} do -      assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == [] -      ret_conn = get(conn, "/api/pleroma/admin/config/migrate_to_db") -      assert json_response(ret_conn, 200) == %{} -      assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) > 0 +      on_exit(fn -> :ok = File.rm("config/test.exported_from_db.secret.exs") end) +      assert Repo.all(Pleroma.Web.AdminAPI.Config) == [] +      Mix.Tasks.Pleroma.Config.run(["migrate_to_db"]) +      assert Repo.aggregate(Pleroma.Web.AdminAPI.Config, :count, :id) > 0 + +      conn = get(conn, "/api/pleroma/admin/config/migrate_from_db") + +      assert json_response(conn, 200) == %{} +      assert Repo.all(Pleroma.Web.AdminAPI.Config) == [] +    end + +    test "returns error if configuration from database is off", %{conn: conn} do +      initial = Pleroma.Config.get([:configurable_from_database]) +      on_exit(fn -> Pleroma.Config.put([:configurable_from_database], initial) end) +      Pleroma.Config.put([:configurable_from_database], false) + +      conn = get(conn, "/api/pleroma/admin/config/migrate_from_db") -      ret_conn = get(conn, "/api/pleroma/admin/config/migrate_from_db") +      assert json_response(conn, 400) == +               "To use this endpoint you need to enable configuration from database." -      assert json_response(ret_conn, 200) == %{} -      assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == [] +      assert Repo.all(Pleroma.Web.AdminAPI.Config) == []      end    end @@ -2955,6 +3321,21 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert ReportNote |> Repo.all() |> length() == 1      end    end + +  test "GET /api/pleroma/admin/config/descriptions", %{conn: conn} do +    admin = insert(:user, is_admin: true) + +    conn = +      assign(conn, :user, admin) +      |> get("/api/pleroma/admin/config/descriptions") + +    assert [child | _others] = json_response(conn, 200) + +    assert child["children"] +    assert child["key"] +    assert String.starts_with?(child["group"], ":") +    assert child["description"] +  end  end  # Needed for testing diff --git a/test/web/admin_api/config_test.exs b/test/web/admin_api/config_test.exs index 204446b79..2c0601b56 100644 --- a/test/web/admin_api/config_test.exs +++ b/test/web/admin_api/config_test.exs @@ -26,26 +26,112 @@ defmodule Pleroma.Web.AdminAPI.ConfigTest do      assert loaded == updated    end -  test "update_or_create/1" do -    config = insert(:config) -    key2 = "another_key" +  describe "update_or_create/1" do +    test "common" do +      config = insert(:config) +      key2 = "another_key" + +      params = [ +        %{group: "pleroma", key: key2, value: "another_value"}, +        %{group: config.group, key: config.key, value: "new_value"} +      ] + +      assert Repo.all(Config) |> length() == 1 + +      Enum.each(params, &Config.update_or_create(&1)) -    params = [ -      %{group: "pleroma", key: key2, value: "another_value"}, -      %{group: config.group, key: config.key, value: "new_value"} -    ] +      assert Repo.all(Config) |> length() == 2 -    assert Repo.all(Config) |> length() == 1 +      config1 = Config.get_by_params(%{group: config.group, key: config.key}) +      config2 = Config.get_by_params(%{group: "pleroma", key: key2}) -    Enum.each(params, &Config.update_or_create(&1)) +      assert config1.value == Config.transform("new_value") +      assert config2.value == Config.transform("another_value") +    end + +    test "partial update" do +      config = insert(:config, value: Config.to_binary(key1: "val1", key2: :val2)) -    assert Repo.all(Config) |> length() == 2 +      {:ok, _config} = +        Config.update_or_create(%{ +          group: config.group, +          key: config.key, +          value: [key1: :val1, key3: :val3] +        }) -    config1 = Config.get_by_params(%{group: config.group, key: config.key}) -    config2 = Config.get_by_params(%{group: "pleroma", key: key2}) +      updated = Config.get_by_params(%{group: config.group, key: config.key}) -    assert config1.value == Config.transform("new_value") -    assert config2.value == Config.transform("another_value") +      value = Config.from_binary(updated.value) +      assert length(value) == 3 +      assert value[:key1] == :val1 +      assert value[:key2] == :val2 +      assert value[:key3] == :val3 +    end + +    test "deep merge" do +      config = insert(:config, value: Config.to_binary(key1: "val1", key2: [k1: :v1, k2: "v2"])) + +      {:ok, config} = +        Config.update_or_create(%{ +          group: config.group, +          key: config.key, +          value: [key1: :val1, key2: [k2: :v2, k3: :v3], key3: :val3] +        }) + +      updated = Config.get_by_params(%{group: config.group, key: config.key}) + +      assert config.value == updated.value + +      value = Config.from_binary(updated.value) +      assert value[:key1] == :val1 +      assert value[:key2] == [k1: :v1, k2: :v2, k3: :v3] +      assert value[:key3] == :val3 +    end + +    test "only full update for some keys" do +      config1 = insert(:config, key: ":ecto_repos", value: Config.to_binary(repo: Pleroma.Repo)) +      config2 = insert(:config, group: ":cors_plug", key: ":max_age", value: Config.to_binary(18)) + +      {:ok, _config} = +        Config.update_or_create(%{ +          group: config1.group, +          key: config1.key, +          value: [another_repo: [Pleroma.Repo]] +        }) + +      {:ok, _config} = +        Config.update_or_create(%{ +          group: config2.group, +          key: config2.key, +          value: 777 +        }) + +      updated1 = Config.get_by_params(%{group: config1.group, key: config1.key}) +      updated2 = Config.get_by_params(%{group: config2.group, key: config2.key}) + +      assert Config.from_binary(updated1.value) == [another_repo: [Pleroma.Repo]] +      assert Config.from_binary(updated2.value) == 777 +    end + +    test "full update if value is not keyword" do +      config = +        insert(:config, +          group: ":tesla", +          key: ":adapter", +          value: Config.to_binary(Tesla.Adapter.Hackney) +        ) + +      {:ok, _config} = +        Config.update_or_create(%{ +          group: config.group, +          key: config.key, +          value: Tesla.Adapter.Httpc +        }) + +      updated = Config.get_by_params(%{group: config.group, key: config.key}) + +      assert Config.from_binary(updated.value) == Tesla.Adapter.Httpc +    end    end    test "delete/1" do @@ -85,20 +171,50 @@ defmodule Pleroma.Web.AdminAPI.ConfigTest do        assert Config.from_binary(binary) == :atom      end +    test "ssl options" do +      binary = Config.transform([":tlsv1", ":tlsv1.1", ":tlsv1.2"]) +      assert binary == :erlang.term_to_binary([:tlsv1, :"tlsv1.1", :"tlsv1.2"]) +      assert Config.from_binary(binary) == [:tlsv1, :"tlsv1.1", :"tlsv1.2"] +    end +      test "pleroma module" do        binary = Config.transform("Pleroma.Bookmark")        assert binary == :erlang.term_to_binary(Pleroma.Bookmark)        assert Config.from_binary(binary) == Pleroma.Bookmark      end +    test "pleroma string" do +      binary = Config.transform("Pleroma") +      assert binary == :erlang.term_to_binary("Pleroma") +      assert Config.from_binary(binary) == "Pleroma" +    end +      test "phoenix module" do        binary = Config.transform("Phoenix.Socket.V1.JSONSerializer")        assert binary == :erlang.term_to_binary(Phoenix.Socket.V1.JSONSerializer)        assert Config.from_binary(binary) == Phoenix.Socket.V1.JSONSerializer      end +    test "tesla module" do +      binary = Config.transform("Tesla.Adapter.Hackney") +      assert binary == :erlang.term_to_binary(Tesla.Adapter.Hackney) +      assert Config.from_binary(binary) == Tesla.Adapter.Hackney +    end + +    test "ExSyslogger module" do +      binary = Config.transform("ExSyslogger") +      assert binary == :erlang.term_to_binary(ExSyslogger) +      assert Config.from_binary(binary) == ExSyslogger +    end + +    test "Quack.Logger module" do +      binary = Config.transform("Quack.Logger") +      assert binary == :erlang.term_to_binary(Quack.Logger) +      assert Config.from_binary(binary) == Quack.Logger +    end +      test "sigil" do -      binary = Config.transform("~r/comp[lL][aA][iI][nN]er/") +      binary = Config.transform("~r[comp[lL][aA][iI][nN]er]")        assert binary == :erlang.term_to_binary(~r/comp[lL][aA][iI][nN]er/)        assert Config.from_binary(binary) == ~r/comp[lL][aA][iI][nN]er/      end @@ -109,10 +225,10 @@ defmodule Pleroma.Web.AdminAPI.ConfigTest do        assert Config.from_binary(binary) == ~r/https:\/\/example.com/      end -    test "link sigil with u modifier" do -      binary = Config.transform("~r/https:\/\/example.com/u") -      assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/u) -      assert Config.from_binary(binary) == ~r/https:\/\/example.com/u +    test "link sigil with um modifiers" do +      binary = Config.transform("~r/https:\/\/example.com/um") +      assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/um) +      assert Config.from_binary(binary) == ~r/https:\/\/example.com/um      end      test "link sigil with i modifier" do @@ -127,12 +243,48 @@ defmodule Pleroma.Web.AdminAPI.ConfigTest do        assert Config.from_binary(binary) == ~r/https:\/\/example.com/s      end +    test "raise if valid delimiter not found" do +      assert_raise ArgumentError, "valid delimiter for Regex expression not found", fn -> +        Config.transform("~r/https://[]{}<>\"'()|example.com/s") +      end +    end +      test "2 child tuple" do        binary = Config.transform(%{"tuple" => ["v1", ":v2"]})        assert binary == :erlang.term_to_binary({"v1", :v2})        assert Config.from_binary(binary) == {"v1", :v2}      end +    test "proxy tuple with localhost" do +      binary = +        Config.transform(%{ +          "tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}] +        }) + +      assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, :localhost, 1234}}) +      assert Config.from_binary(binary) == {:proxy_url, {:socks5, :localhost, 1234}} +    end + +    test "proxy tuple with domain" do +      binary = +        Config.transform(%{ +          "tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}] +        }) + +      assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, 'domain.com', 1234}}) +      assert Config.from_binary(binary) == {:proxy_url, {:socks5, 'domain.com', 1234}} +    end + +    test "proxy tuple with ip" do +      binary = +        Config.transform(%{ +          "tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}] +        }) + +      assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}}) +      assert Config.from_binary(binary) == {:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}} +    end +      test "tuple with n childs" do        binary =          Config.transform(%{ | 
