diff options
3 files changed, 259 insertions, 68 deletions
diff --git a/lib/pleroma/web/admin_api/controllers/config_controller.ex b/lib/pleroma/web/admin_api/controllers/config_controller.ex index 742980976..e221d9418 100644 --- a/lib/pleroma/web/admin_api/controllers/config_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/config_controller.ex @@ -11,23 +11,26 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do    @descriptions Pleroma.Docs.JSON.compile() +  plug(Pleroma.Web.ApiSpec.CastAndValidate) +  plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action == :update) +    plug(      OAuthScopesPlug,      %{scopes: ["read"], admin: true}      when action in [:show, :descriptions]    ) -  plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action == :update) -    action_fallback(Pleroma.Web.AdminAPI.FallbackController) +  defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ConfigOperation +    def descriptions(conn, _params) do      descriptions = Enum.filter(@descriptions, &whitelisted_config?/1)      json(conn, descriptions)    end -  def show(conn, %{"only_db" => true}) do +  def show(conn, %{only_db: true}) do      with :ok <- configurable_from_database() do        configs = Pleroma.Repo.all(ConfigDB)        render(conn, "index.json", %{configs: configs}) @@ -73,16 +76,16 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do      end    end -  def update(conn, %{"configs" => configs}) do +  def update(%{body_params: %{configs: configs}} = conn, _) do      with :ok <- configurable_from_database() do        results =          configs          |> Enum.filter(&whitelisted_config?/1)          |> Enum.map(fn -          %{"group" => group, "key" => key, "delete" => true} = params -> -            ConfigDB.delete(%{group: group, key: key, subkeys: params["subkeys"]}) +          %{group: group, key: key, delete: true} = params -> +            ConfigDB.delete(%{group: group, key: key, subkeys: params[:subkeys]}) -          %{"group" => group, "key" => key, "value" => value} -> +          %{group: group, key: key, value: value} ->              ConfigDB.update_or_create(%{group: group, key: key, value: value})          end)          |> Enum.reject(fn {result, _} -> result == :error end) @@ -140,11 +143,11 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do      end    end -  defp whitelisted_config?(%{"group" => group, "key" => key}) do +  defp whitelisted_config?(%{group: group, key: key}) do      whitelisted_config?(group, key)    end -  defp whitelisted_config?(%{:group => group} = config) do +  defp whitelisted_config?(%{group: group} = config) do      whitelisted_config?(group, config[:key])    end  end diff --git a/lib/pleroma/web/api_spec/operations/admin/config_operation.ex b/lib/pleroma/web/api_spec/operations/admin/config_operation.ex new file mode 100644 index 000000000..7b38a2ef4 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/config_operation.ex @@ -0,0 +1,142 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.ConfigOperation do +  alias OpenApiSpex.Operation +  alias OpenApiSpex.Schema +  alias Pleroma.Web.ApiSpec.Schemas.ApiError + +  import Pleroma.Web.ApiSpec.Helpers + +  def open_api_operation(action) do +    operation = String.to_existing_atom("#{action}_operation") +    apply(__MODULE__, operation, []) +  end + +  def show_operation do +    %Operation{ +      tags: ["Admin", "Config"], +      summary: "Get list of merged default settings with saved in database", +      operationId: "AdminAPI.ConfigController.show", +      parameters: [ +        Operation.parameter( +          :only_db, +          :query, +          %Schema{type: :boolean, default: false}, +          "Get only saved in database settings" +        ) +      ], +      security: [%{"oAuth" => ["read"]}], +      responses: %{ +        200 => Operation.response("Config", "application/json", config_response()), +        400 => Operation.response("Bad Request", "application/json", ApiError) +      } +    } +  end + +  def update_operation do +    %Operation{ +      tags: ["Admin", "Config"], +      summary: "Update config settings", +      operationId: "AdminAPI.ConfigController.update", +      security: [%{"oAuth" => ["write"]}], +      requestBody: +        request_body("Parameters", %Schema{ +          type: :object, +          properties: %{ +            configs: %Schema{ +              type: :array, +              items: %Schema{ +                type: :object, +                properties: %{ +                  group: %Schema{type: :string}, +                  key: %Schema{type: :string}, +                  value: any(), +                  delete: %Schema{type: :boolean}, +                  subkeys: %Schema{type: :array, items: %Schema{type: :string}} +                } +              } +            } +          } +        }), +      responses: %{ +        200 => Operation.response("Config", "application/json", config_response()), +        400 => Operation.response("Bad Request", "application/json", ApiError) +      } +    } +  end + +  def descriptions_operation do +    %Operation{ +      tags: ["Admin", "Config"], +      summary: "Get JSON with config descriptions.", +      operationId: "AdminAPI.ConfigController.descriptions", +      security: [%{"oAuth" => ["read"]}], +      responses: %{ +        200 => +          Operation.response("Config Descriptions", "application/json", %Schema{ +            type: :array, +            items: %Schema{ +              type: :object, +              properties: %{ +                group: %Schema{type: :string}, +                key: %Schema{type: :string}, +                type: %Schema{oneOf: [%Schema{type: :string}, %Schema{type: :array}]}, +                description: %Schema{type: :string}, +                children: %Schema{ +                  type: :array, +                  items: %Schema{ +                    type: :object, +                    properties: %{ +                      key: %Schema{type: :string}, +                      type: %Schema{oneOf: [%Schema{type: :string}, %Schema{type: :array}]}, +                      description: %Schema{type: :string}, +                      suggestions: %Schema{type: :array} +                    } +                  } +                } +              } +            } +          }), +        400 => Operation.response("Bad Request", "application/json", ApiError) +      } +    } +  end + +  defp any do +    %Schema{ +      oneOf: [ +        %Schema{type: :array}, +        %Schema{type: :object}, +        %Schema{type: :string}, +        %Schema{type: :integer}, +        %Schema{type: :boolean} +      ] +    } +  end + +  defp config_response do +    %Schema{ +      type: :object, +      properties: %{ +        configs: %Schema{ +          type: :array, +          items: %Schema{ +            type: :object, +            properties: %{ +              group: %Schema{type: :string}, +              key: %Schema{type: :string}, +              value: any() +            } +          } +        }, +        need_reboot: %Schema{ +          type: :boolean, +          description: +            "If `need_reboot` is `true`, instance must be restarted, so reboot time settings can take effect" +        } +      } +    } +  end +end diff --git a/test/web/admin_api/controllers/config_controller_test.exs b/test/web/admin_api/controllers/config_controller_test.exs index 9bc6fd91c..780de8d18 100644 --- a/test/web/admin_api/controllers/config_controller_test.exs +++ b/test/web/admin_api/controllers/config_controller_test.exs @@ -30,7 +30,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        Config.put(:configurable_from_database, false)        conn = get(conn, "/api/pleroma/admin/config") -      assert json_response(conn, 400) == +      assert json_response_and_validate_schema(conn, 400) ==                 %{                   "error" => "To use this endpoint you need to enable configuration from database."                 } @@ -40,7 +40,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        config1 = insert(:config)        config2 = insert(:config) -      conn = get(conn, "/api/pleroma/admin/config", %{"only_db" => true}) +      conn = get(conn, "/api/pleroma/admin/config?only_db=true")        %{          "configs" => [ @@ -55,7 +55,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do              "value" => _            }          ] -      } = json_response(conn, 200) +      } = json_response_and_validate_schema(conn, 200)        assert key1 == config1.key        assert key2 == config2.key @@ -67,7 +67,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        %{"configs" => configs} =          conn          |> get("/api/pleroma/admin/config") -        |> json_response(200) +        |> json_response_and_validate_schema(200)        [instance_config] =          Enum.filter(configs, fn %{"group" => group, "key" => key} -> @@ -89,7 +89,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        %{"configs" => configs} =          conn          |> get("/api/pleroma/admin/config") -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert length(configs) > 3 @@ -133,7 +133,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        %{"configs" => configs} =          conn          |> get("/api/pleroma/admin/config") -        |> json_response(200) +        |> json_response_and_validate_schema(200)        vals =          Enum.filter(configs, fn %{"group" => group, "key" => key} -> @@ -152,9 +152,12 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do    end    test "POST /api/pleroma/admin/config error", %{conn: conn} do -    conn = post(conn, "/api/pleroma/admin/config", %{"configs" => []}) +    conn = +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/pleroma/admin/config", %{"configs" => []}) -    assert json_response(conn, 400) == +    assert json_response_and_validate_schema(conn, 400) ==               %{"error" => "To use this endpoint you need to enable configuration from database."}    end @@ -185,7 +188,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        on_exit(fn -> Application.put_env(:ueberauth, Ueberauth, ueberauth) end)        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{group: ":pleroma", key: ":key1", value: "value1"},              %{ @@ -225,7 +230,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -310,7 +315,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        end)        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                group: ":quack", @@ -330,7 +337,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":quack", @@ -362,13 +369,15 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        config = insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: 2))        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{group: config.group, key: config.key, value: [%{"tuple" => [":key3", 3]}]}            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -388,8 +397,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        chat = Config.get(:chat)        on_exit(fn -> Config.put(:chat, chat) end) -      assert post( -               conn, +      assert conn +             |> put_req_header("content-type", "application/json") +             |> post(                 "/api/pleroma/admin/config",                 %{                   configs: [ @@ -397,7 +407,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                   ]                 }               ) -             |> json_response(200) == %{ +             |> json_response_and_validate_schema(200) == %{                 "configs" => [                   %{                     "db" => [":enabled"], @@ -412,18 +422,19 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        configs =          conn          |> get("/api/pleroma/admin/config") -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert configs["need_reboot"]        capture_log(fn -> -        assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} +        assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == +                 %{}        end) =~ "pleroma restarted"        configs =          conn          |> get("/api/pleroma/admin/config") -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert configs["need_reboot"] == false      end @@ -432,8 +443,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        chat = Config.get(:chat)        on_exit(fn -> Config.put(:chat, chat) end) -      assert post( -               conn, +      assert conn +             |> put_req_header("content-type", "application/json") +             |> post(                 "/api/pleroma/admin/config",                 %{                   configs: [ @@ -441,7 +453,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                   ]                 }               ) -             |> json_response(200) == %{ +             |> json_response_and_validate_schema(200) == %{                 "configs" => [                   %{                     "db" => [":enabled"], @@ -453,12 +465,14 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                 "need_reboot" => true               } -      assert post(conn, "/api/pleroma/admin/config", %{ +      assert conn +             |> put_req_header("content-type", "application/json") +             |> post("/api/pleroma/admin/config", %{                 configs: [                   %{group: ":pleroma", key: ":key1", value: [%{"tuple" => [":key3", 3]}]}                 ]               }) -             |> json_response(200) == %{ +             |> json_response_and_validate_schema(200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -473,13 +487,14 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do               }        capture_log(fn -> -        assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} +        assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == +                 %{}        end) =~ "pleroma restarted"        configs =          conn          |> get("/api/pleroma/admin/config") -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert configs["need_reboot"] == false      end @@ -489,7 +504,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: [k1: 1, k2: 2]))        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                group: config.group, @@ -510,7 +527,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -537,7 +554,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "saving special atoms", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            "configs" => [              %{                "group" => ":pleroma", @@ -554,7 +573,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -593,7 +612,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        assert Application.get_env(:logger, :backends) == []        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                group: config.group, @@ -603,7 +624,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":logger", @@ -630,13 +651,15 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          )        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{group: config.group, key: config.key, value: "Tesla.Adapter.Httpc"}            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":tesla", @@ -664,14 +687,16 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          )        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/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) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -696,6 +721,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          build_conn()          |> assign(:user, admin)          |> assign(:token, token) +        |> put_req_header("content-type", "application/json")          |> post("/api/pleroma/admin/config", %{            configs: [              %{group: config2.group, key: config2.key, delete: true}, @@ -707,7 +733,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => []               } @@ -717,7 +743,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "common config example", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                "group" => ":pleroma", @@ -741,7 +769,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do        assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma" -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -779,7 +807,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "tuples with more than two values", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                "group" => ":pleroma", @@ -843,7 +873,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -911,7 +941,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "settings with nesting map", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                "group" => ":pleroma", @@ -940,7 +972,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == +      assert json_response_and_validate_schema(conn, 200) ==                 %{                   "configs" => [                     %{ @@ -974,7 +1006,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "value as map", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                "group" => ":pleroma", @@ -984,7 +1018,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == +      assert json_response_and_validate_schema(conn, 200) ==                 %{                   "configs" => [                     %{ @@ -999,7 +1033,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "queues key as atom", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                "group" => ":oban", @@ -1017,7 +1053,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":oban", @@ -1053,7 +1089,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          )        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                group: config.group, @@ -1064,7 +1102,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do            ]          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "configs" => [                   %{                     "group" => ":pleroma", @@ -1078,7 +1116,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "proxy tuple localhost", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                group: ":pleroma", @@ -1099,7 +1139,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                     "db" => db                   }                 ] -             } = json_response(conn, 200) +             } = json_response_and_validate_schema(conn, 200)        assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} in value        assert ":proxy_url" in db @@ -1107,7 +1147,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "proxy tuple domain", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                group: ":pleroma", @@ -1128,7 +1170,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                     "db" => db                   }                 ] -             } = json_response(conn, 200) +             } = json_response_and_validate_schema(conn, 200)        assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} in value        assert ":proxy_url" in db @@ -1136,7 +1178,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      test "proxy tuple ip", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/admin/config", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/config", %{            configs: [              %{                group: ":pleroma", @@ -1157,7 +1201,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                     "db" => db                   }                 ] -             } = json_response(conn, 200) +             } = json_response_and_validate_schema(conn, 200)        assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} in value        assert ":proxy_url" in db @@ -1172,7 +1216,9 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          {:not_real}        ]) -      post(conn, "/api/pleroma/admin/config", %{ +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/pleroma/admin/config", %{          configs: [            %{group: ":pleroma", key: ":key1", value: "value1"},            %{group: ":pleroma", key: ":key2", value: "value2"}, @@ -1200,7 +1246,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          assign(conn, :user, admin)          |> get("/api/pleroma/admin/config/descriptions") -      assert [child | _others] = json_response(conn, 200) +      assert [child | _others] = json_response_and_validate_schema(conn, 200)        assert child["children"]        assert child["key"] @@ -1222,7 +1268,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          assign(conn, :user, admin)          |> get("/api/pleroma/admin/config/descriptions") -      children = json_response(conn, 200) +      children = json_response_and_validate_schema(conn, 200)        assert length(children) == 4  | 
