diff options
Diffstat (limited to 'test/web')
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 20 | ||||
| -rw-r--r-- | test/web/admin_api/admin_api_controller_test.exs | 808 | ||||
| -rw-r--r-- | test/web/admin_api/config_test.exs | 497 | ||||
| -rw-r--r-- | test/web/mastodon_api/views/status_view_test.exs | 7 | ||||
| -rw-r--r-- | test/web/pleroma_api/controllers/pleroma_api_controller_test.exs | 4 | 
5 files changed, 678 insertions, 658 deletions
| diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index ad6b9810c..ff4604a52 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -867,6 +867,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      test "adds an emoji reaction activity to the db" do        user = insert(:user)        reactor = insert(:user) +      third_user = insert(:user) +      fourth_user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"})        assert object = Object.normalize(activity) @@ -881,7 +883,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert reaction_activity.data["to"] == [User.ap_followers(reactor), activity.data["actor"]]        assert reaction_activity.data["context"] == object.data["context"]        assert object.data["reaction_count"] == 1 -      assert object.data["reactions"]["🔥"] == [reactor.ap_id] +      assert object.data["reactions"] == [["🔥", [reactor.ap_id]]] + +      {:ok, _reaction_activity, object} = ActivityPub.react_with_emoji(third_user, object, "☕") + +      assert object.data["reaction_count"] == 2 +      assert object.data["reactions"] == [["🔥", [reactor.ap_id]], ["☕", [third_user.ap_id]]] + +      {:ok, _reaction_activity, object} = ActivityPub.react_with_emoji(fourth_user, object, "🔥") + +      assert object.data["reaction_count"] == 3 + +      assert object.data["reactions"] == [ +               ["🔥", [fourth_user.ap_id, reactor.ap_id]], +               ["☕", [third_user.ap_id]] +             ]      end    end @@ -919,7 +935,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        object = Object.get_by_ap_id(object.data["id"])        assert object.data["reaction_count"] == 0 -      assert object.data["reactions"] == %{} +      assert object.data["reactions"] == []      end    end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index c8f8ba310..5c767219a 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -7,6 +7,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    use Oban.Testing, repo: Pleroma.Repo    alias Pleroma.Activity +  alias Pleroma.ConfigDB    alias Pleroma.HTML    alias Pleroma.ModerationLog    alias Pleroma.Repo @@ -597,7 +598,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 @@ -1884,25 +1885,42 @@ 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 +    test "with settings only in db", %{conn: conn} do        config1 = insert(:config)        config2 = insert(:config) -      conn = get(conn, "/api/pleroma/admin/config") +      conn = get(conn, "/api/pleroma/admin/config", %{"only_db" => true})        %{          "configs" => [            %{ +            "group" => ":pleroma",              "key" => key1,              "value" => _            },            %{ +            "group" => ":pleroma",              "key" => key2,              "value" => _            } @@ -1912,11 +1930,107 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert key1 == config1.key        assert key2 == config2.key      end + +    test "db is added to settings that are in db", %{conn: conn} do +      _config = insert(:config, key: ":instance", value: ConfigDB.to_binary(name: "Some name")) + +      %{"configs" => configs} = +        conn +        |> get("/api/pleroma/admin/config") +        |> json_response(200) + +      [instance_config] = +        Enum.filter(configs, fn %{"group" => group, "key" => key} -> +          group == ":pleroma" and key == ":instance" +        end) + +      assert instance_config["db"] == [":name"] +    end + +    test "merged default setting with db settings", %{conn: conn} do +      config1 = insert(:config) +      config2 = insert(:config) + +      config3 = +        insert(:config, +          value: ConfigDB.to_binary(k1: :v1, k2: :v2) +        ) + +      %{"configs" => configs} = +        conn +        |> get("/api/pleroma/admin/config") +        |> json_response(200) + +      assert length(configs) > 3 + +      received_configs = +        Enum.filter(configs, fn %{"group" => group, "key" => key} -> +          group == ":pleroma" and key in [config1.key, config2.key, config3.key] +        end) + +      assert length(received_configs) == 3 + +      db_keys = +        config3.value +        |> ConfigDB.from_binary() +        |> Keyword.keys() +        |> ConfigDB.convert() + +      Enum.each(received_configs, fn %{"value" => value, "db" => db} -> +        assert db in [[config1.key], [config2.key], db_keys] + +        assert value in [ +                 ConfigDB.from_binary_with_convert(config1.value), +                 ConfigDB.from_binary_with_convert(config2.value), +                 ConfigDB.from_binary_with_convert(config3.value) +               ] +      end) +    end + +    test "subkeys with full update right merge", %{conn: conn} do +      config1 = +        insert(:config, +          key: ":emoji", +          value: ConfigDB.to_binary(groups: [a: 1, b: 2], key: [a: 1]) +        ) + +      config2 = +        insert(:config, +          key: ":assets", +          value: ConfigDB.to_binary(mascots: [a: 1, b: 2], key: [a: 1]) +        ) + +      %{"configs" => configs} = +        conn +        |> get("/api/pleroma/admin/config") +        |> json_response(200) + +      vals = +        Enum.filter(configs, fn %{"group" => group, "key" => key} -> +          group == ":pleroma" and key in [config1.key, config2.key] +        end) + +      emoji = Enum.find(vals, fn %{"key" => key} -> key == ":emoji" end) +      assets = Enum.find(vals, fn %{"key" => key} -> key == ":assets" end) + +      emoji_val = ConfigDB.transform_with_out_binary(emoji["value"]) +      assets_val = ConfigDB.transform_with_out_binary(assets["value"]) + +      assert emoji_val[:groups] == [a: 1, b: 2] +      assert assets_val[:mascots] == [a: 1, b: 2] +    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) @@ -1927,28 +2041,33 @@ 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      test "create new config setting in db", %{conn: conn} do +      ueberauth = Application.get_env(:ueberauth, Ueberauth) +      on_exit(fn -> Application.put_env(:ueberauth, Ueberauth, ueberauth) end) +        conn =          post(conn, "/api/pleroma/admin/config", %{            configs: [ -            %{group: "pleroma", key: "key1", value: "value1"}, +            %{group: ":pleroma", key: ":key1", value: "value1"},              %{ -              group: "ueberauth", -              key: "Ueberauth.Strategy.Twitter.OAuth", +              group: ":ueberauth", +              key: "Ueberauth",                value: [%{"tuple" => [":consumer_secret", "aaaa"]}]              },              %{ -              group: "pleroma", -              key: "key2", +              group: ":pleroma", +              key: ":key2",                value: %{                  ":nested_1" => "nested_value1",                  ":nested_2" => [ @@ -1958,21 +2077,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", []]}              }            ] @@ -1981,43 +2100,49 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "pleroma", -                   "key" => "key1", -                   "value" => "value1" +                   "group" => ":pleroma", +                   "key" => ":key1", +                   "value" => "value1", +                   "db" => [":key1"]                   },                   %{ -                   "group" => "ueberauth", -                   "key" => "Ueberauth.Strategy.Twitter.OAuth", -                   "value" => [%{"tuple" => [":consumer_secret", "aaaa"]}] +                   "group" => ":ueberauth", +                   "key" => "Ueberauth", +                   "value" => [%{"tuple" => [":consumer_secret", "aaaa"]}], +                   "db" => [":consumer_secret"]                   },                   %{ -                   "group" => "pleroma", -                   "key" => "key2", +                   "group" => ":pleroma", +                   "key" => ":key2",                     "value" => %{                       ":nested_1" => "nested_value1",                       ":nested_2" => [                         %{":nested_22" => "nested_value222"},                         %{":nested_33" => %{":nested_44" => "nested_444"}}                       ] -                   } +                   }, +                   "db" => [":key2"]                   },                   %{ -                   "group" => "pleroma", -                   "key" => "key3", +                   "group" => ":pleroma", +                   "key" => ":key3",                     "value" => [                       %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},                       %{"nested_4" => true} -                   ] +                   ], +                   "db" => [":key3"]                   },                   %{ -                   "group" => "pleroma", -                   "key" => "key4", -                   "value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"} +                   "group" => ":pleroma", +                   "key" => ":key4", +                   "value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"}, +                   "db" => [":key4"]                   },                   %{ -                   "group" => "idna", -                   "key" => "key5", -                   "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]} +                   "group" => ":idna", +                   "key" => ":key5", +                   "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}, +                   "db" => [":key5"]                   }                 ]               } @@ -2045,25 +2170,34 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []}      end -    test "update config setting & delete", %{conn: conn} do -      config1 = insert(:config, key: "keyaa1") -      config2 = insert(:config, key: "keyaa2") +    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) -      insert(:config, -        group: "ueberauth", -        key: "Ueberauth.Strategy.Microsoft.OAuth", -        value: :erlang.term_to_binary([]) -      ) +      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: config1.group, key: config1.key, value: "another_value"}, -            %{group: config2.group, key: config2.key, delete: "true"},              %{ -              group: "ueberauth", -              key: "Ueberauth.Strategy.Microsoft.OAuth", -              delete: "true" +              group: ":quack", +              key: ":level", +              value: ":info" +            }, +            %{ +              group: ":quack", +              key: ":meta", +              value: [":none"] +            }, +            %{ +              group: ":quack", +              key: ":webhook_url", +              value: "https://hooks.slack.com/services/KEY"              }            ]          }) @@ -2071,23 +2205,300 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "pleroma", +                   "group" => ":quack", +                   "key" => ":level", +                   "value" => ":info", +                   "db" => [":level"] +                 }, +                 %{ +                   "group" => ":quack", +                   "key" => ":meta", +                   "value" => [":none"], +                   "db" => [":meta"] +                 }, +                 %{ +                   "group" => ":quack", +                   "key" => ":webhook_url", +                   "value" => "https://hooks.slack.com/services/KEY", +                   "db" => [":webhook_url"] +                 } +               ] +             } + +      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]} +                   ], +                   "db" => [":key1", ":key2", ":key3"] +                 } +               ] +             } +    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]} +                         ] +                       ] +                     } +                   ], +                   "db" => [":key1", ":key3", ":key2"] +                 } +               ] +             } +    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"]]}] +                       ] +                     } +                   ], +                   "db" => [":ssl_options"] +                 } +               ] +             } + +      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"]} +                   ], +                   "db" => [":backends"] +                 } +               ] +             } + +      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", +                   "db" => [":adapter"] +                 } +               ] +             } +    end + +    test "update config setting & delete with fallback to default value", %{ +      conn: conn, +      admin: admin, +      token: token +    } do +      ueberauth = Application.get_env(:ueberauth, Ueberauth) +      config1 = insert(:config, key: ":keyaa1") +      config2 = insert(:config, key: ":keyaa2") + +      config3 = +        insert(:config, +          group: ":ueberauth", +          key: "Ueberauth" +        ) + +      conn = +        post(conn, "/api/pleroma/admin/config", %{ +          configs: [ +            %{group: config1.group, key: config1.key, value: "another_value"}, +            %{group: config2.group, key: config2.key, value: "another_value"} +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma",                     "key" => config1.key, -                   "value" => "another_value" +                   "value" => "another_value", +                   "db" => [":keyaa1"] +                 }, +                 %{ +                   "group" => ":pleroma", +                   "key" => config2.key, +                   "value" => "another_value", +                   "db" => [":keyaa2"]                   }                 ]               }        assert Application.get_env(:pleroma, :keyaa1) == "another_value" -      refute Application.get_env(:pleroma, :keyaa2) +      assert Application.get_env(:pleroma, :keyaa2) == "another_value" +      assert Application.get_env(:ueberauth, Ueberauth) == ConfigDB.from_binary(config3.value) + +      conn = +        build_conn() +        |> assign(:user, admin) +        |> assign(:token, token) +        |> post("/api/pleroma/admin/config", %{ +          configs: [ +            %{group: config2.group, key: config2.key, delete: true}, +            %{ +              group: ":ueberauth", +              key: "Ueberauth", +              delete: true +            } +          ] +        }) + +      assert json_response(conn, 200) == %{ +               "configs" => [] +             } + +      assert Application.get_env(:ueberauth, Ueberauth) == ueberauth +      refute Keyword.has_key?(Application.get_all_env(:pleroma), :keyaa2)      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]}, @@ -2099,16 +2510,25 @@ 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]}, @@ -2120,8 +2540,28 @@ 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"]} +                   ], +                   "db" => [ +                     ":enabled", +                     ":method", +                     ":seconds_valid", +                     ":path", +                     ":key1", +                     ":partial_chain", +                     ":regex1", +                     ":regex2", +                     ":regex3", +                     ":regex4", +                     ":name"                     ] +                 }, +                 %{ +                   "group" => ":tesla", +                   "key" => ":adapter", +                   "value" => "Tesla.Adapter.Httpc", +                   "db" => [":adapter"]                   }                 ]               } @@ -2132,7 +2572,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "pleroma", +              "group" => ":pleroma",                "key" => "Pleroma.Web.Endpoint.NotReal",                "value" => [                  %{ @@ -2196,7 +2636,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "pleroma", +                   "group" => ":pleroma",                     "key" => "Pleroma.Web.Endpoint.NotReal",                     "value" => [                       %{ @@ -2252,7 +2692,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                           ]                         ]                       } -                   ] +                   ], +                   "db" => [":http"]                   }                 ]               } @@ -2263,7 +2704,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"]}, @@ -2293,7 +2734,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 %{                   "configs" => [                     %{ -                     "group" => "pleroma", +                     "group" => ":pleroma",                       "key" => ":key1",                       "value" => [                         %{"tuple" => [":key2", "some_val"]}, @@ -2314,7 +2755,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                             }                           ]                         } -                     ] +                     ], +                     "db" => [":key2", ":key3"]                     }                   ]                 } @@ -2325,7 +2767,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "pleroma", +              "group" => ":pleroma",                "key" => ":key1",                "value" => %{"key" => "some_val"}              } @@ -2336,83 +2778,21 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 %{                   "configs" => [                     %{ -                     "group" => "pleroma", +                     "group" => ":pleroma",                       "key" => ":key1", -                     "value" => %{"key" => "some_val"} +                     "value" => %{"key" => "some_val"}, +                     "db" => [":key1"]                     }                   ]                 }      end -    test "dispatch setting", %{conn: conn} do -      conn = -        post(conn, "/api/pleroma/admin/config", %{ -          configs: [ -            %{ -              "group" => "pleroma", -              "key" => "Pleroma.Web.Endpoint.NotReal", -              "value" => [ -                %{ -                  "tuple" => [ -                    ":http", -                    [ -                      %{"tuple" => [":ip", %{"tuple" => [127, 0, 0, 1]}]}, -                      %{"tuple" => [":dispatch", ["{:_, -       [ -         {\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, -         {\"/websocket\", Phoenix.Endpoint.CowboyWebSocket, -          {Phoenix.Transports.WebSocket, -           {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}}, -         {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}} -       ]}"]]} -                    ] -                  ] -                } -              ] -            } -          ] -        }) - -      dispatch_string = -        "{:_, [{\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, " <> -          "{\"/websocket\", Phoenix.Endpoint.CowboyWebSocket, {Phoenix.Transports.WebSocket, " <> -          "{Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}}, " <> -          "{:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}]}" - -      assert json_response(conn, 200) == %{ -               "configs" => [ -                 %{ -                   "group" => "pleroma", -                   "key" => "Pleroma.Web.Endpoint.NotReal", -                   "value" => [ -                     %{ -                       "tuple" => [ -                         ":http", -                         [ -                           %{"tuple" => [":ip", %{"tuple" => [127, 0, 0, 1]}]}, -                           %{ -                             "tuple" => [ -                               ":dispatch", -                               [ -                                 dispatch_string -                               ] -                             ] -                           } -                         ] -                       ] -                     } -                   ] -                 } -               ] -             } -    end -      test "queues key as atom", %{conn: conn} do        conn =          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{ -              "group" => "oban", +              "group" => ":oban",                "key" => ":queues",                "value" => [                  %{"tuple" => [":federator_incoming", 50]}, @@ -2430,7 +2810,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, 200) == %{                 "configs" => [                   %{ -                   "group" => "oban", +                   "group" => ":oban",                     "key" => ":queues",                     "value" => [                       %{"tuple" => [":federator_incoming", 50]}, @@ -2440,6 +2820,15 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                       %{"tuple" => [":transmogrifier", 20]},                       %{"tuple" => [":scheduled_activities", 10]},                       %{"tuple" => [":background", 5]} +                   ], +                   "db" => [ +                     ":federator_incoming", +                     ":federator_outgoing", +                     ":web_push", +                     ":mailer", +                     ":transmogrifier", +                     ":scheduled_activities", +                     ":background"                     ]                   }                 ] @@ -2449,7 +2838,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")          ) @@ -2460,41 +2849,127 @@ 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"]}], +                   "db" => [":subkey2"] +                 } +               ] +             } +    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]} +                   ], +                   "db" => [":proxy_url", ":send_user_agent"] +                 } +               ] +             } +    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]} +                   ], +                   "db" => [":proxy_url", ":send_user_agent"] +                 } +               ] +             } +    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]} +                   ], +                   "db" => [":proxy_url", ":send_user_agent"] +                 } +               ] +             }      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 @@ -2502,15 +2977,27 @@ 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 +      assert Repo.all(Pleroma.ConfigDB) == [] +      Mix.Tasks.Pleroma.Config.migrate_to_db("test/fixtures/config/temp.secret.exs") +      assert Repo.aggregate(Pleroma.ConfigDB, :count, :id) > 0 + +      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, 200) == %{} +      assert Repo.all(Pleroma.ConfigDB) == [] +    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") -      assert json_response(ret_conn, 200) == %{} -      assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == [] +      assert json_response(conn, 400) == +               "To use this endpoint you need to enable configuration from database." + +      assert Repo.all(Pleroma.ConfigDB) == []      end    end @@ -2979,6 +3466,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 deleted file mode 100644 index 204446b79..000000000 --- a/test/web/admin_api/config_test.exs +++ /dev/null @@ -1,497 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -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_params(%{group: config.group, key: config.key}) -  end - -  test "create/1" do -    {:ok, config} = Config.create(%{group: "pleroma", key: "some_key", value: "some_value"}) -    assert config == Config.get_by_params(%{group: "pleroma", key: "some_key"}) -  end - -  test "update/1" do -    config = insert(:config) -    {:ok, updated} = Config.update(config, %{value: "some_value"}) -    loaded = Config.get_by_params(%{group: config.group, key: config.key}) -    assert loaded == updated -  end - -  test "update_or_create/1" 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)) - -    assert Repo.all(Config) |> length() == 2 - -    config1 = Config.get_by_params(%{group: config.group, key: config.key}) -    config2 = Config.get_by_params(%{group: "pleroma", 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(%{key: config.key, group: config.group}) -    refute Config.get_by_params(%{key: config.key, group: config.group}) -  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 "boolean" do -      binary = Config.transform(false) -      assert binary == :erlang.term_to_binary(false) -      assert Config.from_binary(binary) == false -    end - -    test "nil" do -      binary = Config.transform(nil) -      assert binary == :erlang.term_to_binary(nil) -      assert Config.from_binary(binary) == nil -    end - -    test "integer" do -      binary = Config.transform(150) -      assert binary == :erlang.term_to_binary(150) -      assert Config.from_binary(binary) == 150 -    end - -    test "atom" do -      binary = Config.transform(":atom") -      assert binary == :erlang.term_to_binary(:atom) -      assert Config.from_binary(binary) == :atom -    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 "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 "sigil" do -      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 - -    test "link sigil" do -      binary = Config.transform("~r/https:\/\/example.com/") -      assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/) -      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 -    end - -    test "link sigil with i modifier" do -      binary = Config.transform("~r/https:\/\/example.com/i") -      assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/i) -      assert Config.from_binary(binary) == ~r/https:\/\/example.com/i -    end - -    test "link sigil with s modifier" do -      binary = Config.transform("~r/https:\/\/example.com/s") -      assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/s) -      assert Config.from_binary(binary) == ~r/https:\/\/example.com/s -    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 "tuple with n childs" do -      binary = -        Config.transform(%{ -          "tuple" => [ -            "v1", -            ":v2", -            "Pleroma.Bookmark", -            150, -            false, -            "Phoenix.Socket.V1.JSONSerializer" -          ] -        }) - -      assert binary == -               :erlang.term_to_binary( -                 {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer} -               ) - -      assert Config.from_binary(binary) == -               {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer} -    end - -    test "tuple with dispatch key" do -      binary = Config.transform(%{"tuple" => [":dispatch", ["{:_, -       [ -         {\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, -         {\"/websocket\", Phoenix.Endpoint.CowboyWebSocket, -          {Phoenix.Transports.WebSocket, -           {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}}, -         {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}} -       ]}"]]}) - -      assert binary == -               :erlang.term_to_binary( -                 {:dispatch, -                  [ -                    {:_, -                     [ -                       {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, -                       {"/websocket", Phoenix.Endpoint.CowboyWebSocket, -                        {Phoenix.Transports.WebSocket, -                         {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: "/websocket"]}}}, -                       {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}} -                     ]} -                  ]} -               ) - -      assert Config.from_binary(binary) == -               {:dispatch, -                [ -                  {:_, -                   [ -                     {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, -                     {"/websocket", Phoenix.Endpoint.CowboyWebSocket, -                      {Phoenix.Transports.WebSocket, -                       {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: "/websocket"]}}}, -                     {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}} -                   ]} -                ]} -    end - -    test "map with string key" do -      binary = Config.transform(%{"key" => "value"}) -      assert binary == :erlang.term_to_binary(%{"key" => "value"}) -      assert Config.from_binary(binary) == %{"key" => "value"} -    end - -    test "map with atom key" do -      binary = Config.transform(%{":key" => "value"}) -      assert binary == :erlang.term_to_binary(%{key: "value"}) -      assert Config.from_binary(binary) == %{key: "value"} -    end - -    test "list of strings" do -      binary = Config.transform(["v1", "v2", "v3"]) -      assert binary == :erlang.term_to_binary(["v1", "v2", "v3"]) -      assert Config.from_binary(binary) == ["v1", "v2", "v3"] -    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 atoms" do -      binary = Config.transform([":v1", ":v2", ":v3"]) -      assert binary == :erlang.term_to_binary([:v1, :v2, :v3]) -      assert Config.from_binary(binary) == [:v1, :v2, :v3] -    end - -    test "list of mixed values" do -      binary = -        Config.transform([ -          "v1", -          ":v2", -          "Pleroma.Repo", -          "Phoenix.Socket.V1.JSONSerializer", -          15, -          false -        ]) - -      assert binary == -               :erlang.term_to_binary([ -                 "v1", -                 :v2, -                 Pleroma.Repo, -                 Phoenix.Socket.V1.JSONSerializer, -                 15, -                 false -               ]) - -      assert Config.from_binary(binary) == [ -               "v1", -               :v2, -               Pleroma.Repo, -               Phoenix.Socket.V1.JSONSerializer, -               15, -               false -             ] -    end - -    test "simple keyword" do -      binary = Config.transform([%{"tuple" => [":key", "value"]}]) -      assert binary == :erlang.term_to_binary([{:key, "value"}]) -      assert Config.from_binary(binary) == [{:key, "value"}] -      assert Config.from_binary(binary) == [key: "value"] -    end - -    test "keyword with partial_chain key" do -      binary = -        Config.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}]) - -      assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1) -      assert Config.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1] -    end - -    test "keyword" do -      binary = -        Config.transform([ -          %{"tuple" => [":types", "Pleroma.PostgresTypes"]}, -          %{"tuple" => [":telemetry_event", ["Pleroma.Repo.Instrumenter"]]}, -          %{"tuple" => [":migration_lock", nil]}, -          %{"tuple" => [":key1", 150]}, -          %{"tuple" => [":key2", "string"]} -        ]) - -      assert binary == -               :erlang.term_to_binary( -                 types: Pleroma.PostgresTypes, -                 telemetry_event: [Pleroma.Repo.Instrumenter], -                 migration_lock: nil, -                 key1: 150, -                 key2: "string" -               ) - -      assert Config.from_binary(binary) == [ -               types: Pleroma.PostgresTypes, -               telemetry_event: [Pleroma.Repo.Instrumenter], -               migration_lock: nil, -               key1: 150, -               key2: "string" -             ] -    end - -    test "complex keyword with nested mixed childs" do -      binary = -        Config.transform([ -          %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]}, -          %{"tuple" => [":filters", ["Pleroma.Upload.Filter.Dedupe"]]}, -          %{"tuple" => [":link_name", true]}, -          %{"tuple" => [":proxy_remote", false]}, -          %{"tuple" => [":common_map", %{":key" => "value"}]}, -          %{ -            "tuple" => [ -              ":proxy_opts", -              [ -                %{"tuple" => [":redirect_on_failure", false]}, -                %{"tuple" => [":max_body_length", 1_048_576]}, -                %{ -                  "tuple" => [ -                    ":http", -                    [%{"tuple" => [":follow_redirect", true]}, %{"tuple" => [":pool", ":upload"]}] -                  ] -                } -              ] -            ] -          } -        ]) - -      assert binary == -               :erlang.term_to_binary( -                 uploader: Pleroma.Uploaders.Local, -                 filters: [Pleroma.Upload.Filter.Dedupe], -                 link_name: true, -                 proxy_remote: false, -                 common_map: %{key: "value"}, -                 proxy_opts: [ -                   redirect_on_failure: false, -                   max_body_length: 1_048_576, -                   http: [ -                     follow_redirect: true, -                     pool: :upload -                   ] -                 ] -               ) - -      assert Config.from_binary(binary) == -               [ -                 uploader: Pleroma.Uploaders.Local, -                 filters: [Pleroma.Upload.Filter.Dedupe], -                 link_name: true, -                 proxy_remote: false, -                 common_map: %{key: "value"}, -                 proxy_opts: [ -                   redirect_on_failure: false, -                   max_body_length: 1_048_576, -                   http: [ -                     follow_redirect: true, -                     pool: :upload -                   ] -                 ] -               ] -    end - -    test "common keyword" do -      binary = -        Config.transform([ -          %{"tuple" => [":level", ":warn"]}, -          %{"tuple" => [":meta", [":all"]]}, -          %{"tuple" => [":path", ""]}, -          %{"tuple" => [":val", nil]}, -          %{"tuple" => [":webhook_url", "https://hooks.slack.com/services/YOUR-KEY-HERE"]} -        ]) - -      assert binary == -               :erlang.term_to_binary( -                 level: :warn, -                 meta: [:all], -                 path: "", -                 val: nil, -                 webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE" -               ) - -      assert Config.from_binary(binary) == [ -               level: :warn, -               meta: [:all], -               path: "", -               val: nil, -               webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE" -             ] -    end - -    test "complex keyword with sigil" do -      binary = -        Config.transform([ -          %{"tuple" => [":federated_timeline_removal", []]}, -          %{"tuple" => [":reject", ["~r/comp[lL][aA][iI][nN]er/"]]}, -          %{"tuple" => [":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 - -    test "complex keyword with tuples with more than 2 values" do -      binary = -        Config.transform([ -          %{ -            "tuple" => [ -              ":http", -              [ -                %{ -                  "tuple" => [ -                    ":key1", -                    [ -                      %{ -                        "tuple" => [ -                          ":_", -                          [ -                            %{ -                              "tuple" => [ -                                "/api/v1/streaming", -                                "Pleroma.Web.MastodonAPI.WebsocketHandler", -                                [] -                              ] -                            }, -                            %{ -                              "tuple" => [ -                                "/websocket", -                                "Phoenix.Endpoint.CowboyWebSocket", -                                %{ -                                  "tuple" => [ -                                    "Phoenix.Transports.WebSocket", -                                    %{ -                                      "tuple" => [ -                                        "Pleroma.Web.Endpoint", -                                        "Pleroma.Web.UserSocket", -                                        [] -                                      ] -                                    } -                                  ] -                                } -                              ] -                            }, -                            %{ -                              "tuple" => [ -                                ":_", -                                "Phoenix.Endpoint.Cowboy2Handler", -                                %{"tuple" => ["Pleroma.Web.Endpoint", []]} -                              ] -                            } -                          ] -                        ] -                      } -                    ] -                  ] -                } -              ] -            ] -          } -        ]) - -      assert binary == -               :erlang.term_to_binary( -                 http: [ -                   key1: [ -                     _: [ -                       {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, -                       {"/websocket", Phoenix.Endpoint.CowboyWebSocket, -                        {Phoenix.Transports.WebSocket, -                         {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}}, -                       {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}} -                     ] -                   ] -                 ] -               ) - -      assert Config.from_binary(binary) == [ -               http: [ -                 key1: [ -                   {:_, -                    [ -                      {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, -                      {"/websocket", Phoenix.Endpoint.CowboyWebSocket, -                       {Phoenix.Transports.WebSocket, -                        {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}}, -                      {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}} -                    ]} -                 ] -               ] -             ] -    end -  end -end diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index b54b19c0b..069bb8eac 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -31,13 +31,12 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      {:ok, activity} = CommonAPI.post(user, %{"status" => "dae cofe??"})      {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, user, "☕") -    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")      {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, third_user, "🍵") +    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")      activity = Repo.get(Activity, activity.id)      status = StatusView.render("show.json", activity: activity) -    assert status[:pleroma][:emoji_reactions]["🍵"] == 1 -    assert status[:pleroma][:emoji_reactions]["☕"] == 2 +    assert status[:pleroma][:emoji_reactions] == [["☕", 2], ["🍵", 1]]    end    test "loads and returns the direct conversation id when given the `with_direct_conversation_id` option" do @@ -189,7 +188,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do          expires_at: nil,          direct_conversation_id: nil,          thread_muted: false, -        emoji_reactions: %{} +        emoji_reactions: []        }      } diff --git a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs index fb7500134..a79ecd05b 100644 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs @@ -62,7 +62,7 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do        |> get("/api/v1/pleroma/statuses/#{activity.id}/emoji_reactions_by")        |> json_response(200) -    assert result == %{} +    assert result == []      {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") @@ -71,7 +71,7 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do        |> get("/api/v1/pleroma/statuses/#{activity.id}/emoji_reactions_by")        |> json_response(200) -    [represented_user] = result["🎅"] +    [["🎅", [represented_user]]] = result      assert represented_user["id"] == other_user.id    end | 
