Merge branch 'openapi/admin/oauth-apps' into 'develop'
authorlain <lain@soykaf.club>
Tue, 2 Jun 2020 14:13:24 +0000 (14:13 +0000)
committerlain <lain@soykaf.club>
Tue, 2 Jun 2020 14:13:24 +0000 (14:13 +0000)
Add OpenAPI spec for AdminAPI.OAuthAppContoller

See merge request pleroma/pleroma!2582

1  2 
lib/pleroma/web/admin_api/controllers/admin_api_controller.ex
lib/pleroma/web/router.ex
test/web/admin_api/controllers/admin_api_controller_test.exs

index 4a6a58342c6583d3b13f6d13bff108c9166431a3,4f10bd9478bdfabb63eba90c06b9997061afdd4b..9f499e2029907d064f09ee639b7cd24e192a1b81
@@@ -16,6 -16,7 +16,6 @@@ defmodule Pleroma.Web.AdminAPI.AdminAPI
    alias Pleroma.ReportNote
    alias Pleroma.Stats
    alias Pleroma.User
 -  alias Pleroma.UserInviteToken
    alias Pleroma.Web.ActivityPub.ActivityPub
    alias Pleroma.Web.ActivityPub.Builder
    alias Pleroma.Web.ActivityPub.Pipeline
@@@ -31,8 -32,6 +31,6 @@@
    alias Pleroma.Web.CommonAPI
    alias Pleroma.Web.Endpoint
    alias Pleroma.Web.MastodonAPI
-   alias Pleroma.Web.MastodonAPI.AppView
-   alias Pleroma.Web.OAuth.App
    alias Pleroma.Web.Router
  
    require Logger
           ]
    )
  
 -  plug(OAuthScopesPlug, %{scopes: ["read:invites"], admin: true} when action == :invites)
 -
 -  plug(
 -    OAuthScopesPlug,
 -    %{scopes: ["write:invites"], admin: true}
 -    when action in [:create_invite_token, :revoke_invite, :email_invite]
 -  )
 -
    plug(
      OAuthScopesPlug,
      %{scopes: ["write:follows"], admin: true}
             :config_update,
             :resend_confirmation_email,
             :confirm_email,
-            :oauth_app_create,
-            :oauth_app_list,
-            :oauth_app_update,
-            :oauth_app_delete,
             :reload_emoji
           ]
    )
      end
    end
  
 -  @doc "Sends registration invite via email"
 -  def email_invite(%{assigns: %{user: user}} = conn, %{"email" => email} = params) do
 -    with {_, false} <- {:registrations_open, Config.get([:instance, :registrations_open])},
 -         {_, true} <- {:invites_enabled, Config.get([:instance, :invites_enabled])},
 -         {:ok, invite_token} <- UserInviteToken.create_invite(),
 -         email <-
 -           Pleroma.Emails.UserEmail.user_invitation_email(
 -             user,
 -             invite_token,
 -             email,
 -             params["name"]
 -           ),
 -         {:ok, _} <- Pleroma.Emails.Mailer.deliver(email) do
 -      json_response(conn, :no_content, "")
 -    else
 -      {:registrations_open, _} ->
 -        {:error, "To send invites you need to set the `registrations_open` option to false."}
 -
 -      {:invites_enabled, _} ->
 -        {:error, "To send invites you need to set the `invites_enabled` option to true."}
 -    end
 -  end
 -
 -  @doc "Create an account registration invite token"
 -  def create_invite_token(conn, params) do
 -    opts = %{}
 -
 -    opts =
 -      if params["max_use"],
 -        do: Map.put(opts, :max_use, params["max_use"]),
 -        else: opts
 -
 -    opts =
 -      if params["expires_at"],
 -        do: Map.put(opts, :expires_at, params["expires_at"]),
 -        else: opts
 -
 -    {:ok, invite} = UserInviteToken.create_invite(opts)
 -
 -    json(conn, AccountView.render("invite.json", %{invite: invite}))
 -  end
 -
 -  @doc "Get list of created invites"
 -  def invites(conn, _params) do
 -    invites = UserInviteToken.list_invites()
 -
 -    conn
 -    |> put_view(AccountView)
 -    |> render("invites.json", %{invites: invites})
 -  end
 -
 -  @doc "Revokes invite by token"
 -  def revoke_invite(conn, %{"token" => token}) do
 -    with {:ok, invite} <- UserInviteToken.find_by_token(token),
 -         {:ok, updated_invite} = UserInviteToken.update_invite(invite, %{used: true}) do
 -      conn
 -      |> put_view(AccountView)
 -      |> render("invite.json", %{invite: updated_invite})
 -    else
 -      nil -> {:error, :not_found}
 -    end
 -  end
 -
    @doc "Get a password reset token (base64 string) for given nickname"
    def get_password_reset(conn, %{"nickname" => nickname}) do
      (%User{local: true} = user) = User.get_cached_by_nickname(nickname)
          %{assigns: %{user: admin}} = conn,
          %{"nickname" => nickname} = params
        ) do
 -    with {_, user} <- {:user, User.get_cached_by_nickname(nickname)},
 +    with {_, %User{} = user} <- {:user, User.get_cached_by_nickname(nickname)},
           {:ok, _user} <-
             User.update_as_admin(user, params) do
        ModerationLog.insert_log(%{
        json(conn, %{status: "success"})
      else
        {:error, changeset} ->
 -        {_, {error, _}} = Enum.at(changeset.errors, 0)
 -        json(conn, %{error: "New password #{error}."})
 +        errors = Map.new(changeset.errors, fn {key, {error, _}} -> {key, error} end)
 +
 +        json(conn, %{errors: errors})
  
        _ ->
 -        json(conn, %{error: "Unable to change password."})
 +        json(conn, %{error: "Unable to update user."})
      end
    end
  
      conn |> json("")
    end
  
-   def oauth_app_create(conn, params) do
-     params =
-       if params["name"] do
-         Map.put(params, "client_name", params["name"])
-       else
-         params
-       end
-     result =
-       case App.create(params) do
-         {:ok, app} ->
-           AppView.render("show.json", %{app: app, admin: true})
-         {:error, changeset} ->
-           App.errors(changeset)
-       end
-     json(conn, result)
-   end
-   def oauth_app_update(conn, params) do
-     params =
-       if params["name"] do
-         Map.put(params, "client_name", params["name"])
-       else
-         params
-       end
-     with {:ok, app} <- App.update(params) do
-       json(conn, AppView.render("show.json", %{app: app, admin: true}))
-     else
-       {:error, changeset} ->
-         json(conn, App.errors(changeset))
-       nil ->
-         json_response(conn, :bad_request, "")
-     end
-   end
-   def oauth_app_list(conn, params) do
-     {page, page_size} = page_params(params)
-     search_params = %{
-       client_name: params["name"],
-       client_id: params["client_id"],
-       page: page,
-       page_size: page_size
-     }
-     search_params =
-       if Map.has_key?(params, "trusted") do
-         Map.put(search_params, :trusted, params["trusted"])
-       else
-         search_params
-       end
-     with {:ok, apps, count} <- App.search(search_params) do
-       json(
-         conn,
-         AppView.render("index.json",
-           apps: apps,
-           count: count,
-           page_size: page_size,
-           admin: true
-         )
-       )
-     end
-   end
-   def oauth_app_delete(conn, params) do
-     with {:ok, _app} <- App.destroy(params["id"]) do
-       json_response(conn, :no_content, "")
-     else
-       _ -> json_response(conn, :bad_request, "")
-     end
-   end
    def stats(conn, _) do
      count = Stats.get_status_visibility_count()
  
index 330e04c977b422daa57a52d73c764cbe0cb5b55c,46f03cdfdf120ce8e1bebbf3b4777849f01a7074..369c111383218974b259b6d9f76b71c9645a362f
@@@ -164,10 -164,10 +164,10 @@@ defmodule Pleroma.Web.Router d
      post("/relay", AdminAPIController, :relay_follow)
      delete("/relay", AdminAPIController, :relay_unfollow)
  
 -    post("/users/invite_token", AdminAPIController, :create_invite_token)
 -    get("/users/invites", AdminAPIController, :invites)
 -    post("/users/revoke_invite", AdminAPIController, :revoke_invite)
 -    post("/users/email_invite", AdminAPIController, :email_invite)
 +    post("/users/invite_token", InviteController, :create)
 +    get("/users/invites", InviteController, :index)
 +    post("/users/revoke_invite", InviteController, :revoke)
 +    post("/users/email_invite", InviteController, :email)
  
      get("/users/:nickname/password_reset", AdminAPIController, :get_password_reset)
      patch("/users/force_password_reset", AdminAPIController, :force_password_reset)
      post("/reload_emoji", AdminAPIController, :reload_emoji)
      get("/stats", AdminAPIController, :stats)
  
-     get("/oauth_app", AdminAPIController, :oauth_app_list)
-     post("/oauth_app", AdminAPIController, :oauth_app_create)
-     patch("/oauth_app/:id", AdminAPIController, :oauth_app_update)
-     delete("/oauth_app/:id", AdminAPIController, :oauth_app_delete)
+     get("/oauth_app", OAuthAppController, :index)
+     post("/oauth_app", OAuthAppController, :create)
+     patch("/oauth_app/:id", OAuthAppController, :update)
+     delete("/oauth_app/:id", OAuthAppController, :delete)
    end
  
    scope "/api/pleroma/emoji", Pleroma.Web.PleromaAPI do
      post("/auth/password", MastodonAPI.AuthController, :password_reset)
  
      get("/web/*path", MastoFEController, :index)
 +
 +    get("/embed/:id", EmbedController, :show)
    end
  
    scope "/proxy/", Pleroma.Web.MediaProxy do
index 86f0dbcdf358b88f4e2acea5874afa90b780b2c8,f704cdd3ad5f82377d33c05d5c6ddca23b5bb20c..d72851c9e0f1f397fff0fe501fc5577ab34c7784
@@@ -20,6 -20,7 +20,6 @@@ defmodule Pleroma.Web.AdminAPI.AdminAPI
    alias Pleroma.ReportNote
    alias Pleroma.Tests.ObanHelpers
    alias Pleroma.User
 -  alias Pleroma.UserInviteToken
    alias Pleroma.Web
    alias Pleroma.Web.ActivityPub.Relay
    alias Pleroma.Web.CommonAPI
      end
    end
  
 -  describe "POST /api/pleroma/admin/email_invite, with valid config" do
 -    setup do: clear_config([:instance, :registrations_open], false)
 -    setup do: clear_config([:instance, :invites_enabled], true)
 -
 -    test "sends invitation and returns 204", %{admin: admin, conn: conn} do
 -      recipient_email = "foo@bar.com"
 -      recipient_name = "J. D."
 -
 -      conn =
 -        post(
 -          conn,
 -          "/api/pleroma/admin/users/email_invite?email=#{recipient_email}&name=#{recipient_name}"
 -        )
 -
 -      assert json_response(conn, :no_content)
 -
 -      token_record = List.last(Repo.all(Pleroma.UserInviteToken))
 -      assert token_record
 -      refute token_record.used
 -
 -      notify_email = Config.get([:instance, :notify_email])
 -      instance_name = Config.get([:instance, :name])
 -
 -      email =
 -        Pleroma.Emails.UserEmail.user_invitation_email(
 -          admin,
 -          token_record,
 -          recipient_email,
 -          recipient_name
 -        )
 -
 -      Swoosh.TestAssertions.assert_email_sent(
 -        from: {instance_name, notify_email},
 -        to: {recipient_name, recipient_email},
 -        html_body: email.html_body
 -      )
 -    end
 -
 -    test "it returns 403 if requested by a non-admin" do
 -      non_admin_user = insert(:user)
 -      token = insert(:oauth_token, user: non_admin_user)
 -
 -      conn =
 -        build_conn()
 -        |> assign(:user, non_admin_user)
 -        |> assign(:token, token)
 -        |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
 -
 -      assert json_response(conn, :forbidden)
 -    end
 -
 -    test "email with +", %{conn: conn, admin: admin} do
 -      recipient_email = "foo+bar@baz.com"
 -
 -      conn
 -      |> put_req_header("content-type", "application/json;charset=utf-8")
 -      |> post("/api/pleroma/admin/users/email_invite", %{email: recipient_email})
 -      |> json_response(:no_content)
 -
 -      token_record =
 -        Pleroma.UserInviteToken
 -        |> Repo.all()
 -        |> List.last()
 -
 -      assert token_record
 -      refute token_record.used
 -
 -      notify_email = Config.get([:instance, :notify_email])
 -      instance_name = Config.get([:instance, :name])
 -
 -      email =
 -        Pleroma.Emails.UserEmail.user_invitation_email(
 -          admin,
 -          token_record,
 -          recipient_email
 -        )
 -
 -      Swoosh.TestAssertions.assert_email_sent(
 -        from: {instance_name, notify_email},
 -        to: recipient_email,
 -        html_body: email.html_body
 -      )
 -    end
 -  end
 -
 -  describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do
 -    setup do: clear_config([:instance, :registrations_open])
 -    setup do: clear_config([:instance, :invites_enabled])
 -
 -    test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do
 -      Config.put([:instance, :registrations_open], false)
 -      Config.put([:instance, :invites_enabled], false)
 -
 -      conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
 -
 -      assert json_response(conn, :bad_request) ==
 -               %{
 -                 "error" =>
 -                   "To send invites you need to set the `invites_enabled` option to true."
 -               }
 -    end
 -
 -    test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do
 -      Config.put([:instance, :registrations_open], true)
 -      Config.put([:instance, :invites_enabled], true)
 -
 -      conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
 -
 -      assert json_response(conn, :bad_request) ==
 -               %{
 -                 "error" =>
 -                   "To send invites you need to set the `registrations_open` option to false."
 -               }
 -    end
 -  end
 -
    test "/api/pleroma/admin/users/:nickname/password_reset", %{conn: conn} do
      user = insert(:user)
  
      end
  
      test "pagination works correctly with service users", %{conn: conn} do
 -      service1 = insert(:user, ap_id: Web.base_url() <> "/relay")
 -      service2 = insert(:user, ap_id: Web.base_url() <> "/internal/fetch")
 +      service1 = User.get_or_create_service_actor_by_ap_id(Web.base_url() <> "/meido", "meido")
 +
        insert_list(25, :user)
  
        assert %{"count" => 26, "page_size" => 10, "users" => users1} =
                 |> json_response(200)
  
        assert Enum.count(users1) == 10
 -      assert service1 not in [users1]
 -      assert service2 not in [users1]
 +      assert service1 not in users1
  
        assert %{"count" => 26, "page_size" => 10, "users" => users2} =
                 conn
                 |> json_response(200)
  
        assert Enum.count(users2) == 10
 -      assert service1 not in [users2]
 -      assert service2 not in [users2]
 +      assert service1 not in users2
  
        assert %{"count" => 26, "page_size" => 10, "users" => users3} =
                 conn
                 |> json_response(200)
  
        assert Enum.count(users3) == 6
 -      assert service1 not in [users3]
 -      assert service2 not in [users3]
 +      assert service1 not in users3
      end
  
      test "renders empty array for the second page", %{conn: conn} do
      end
    end
  
 -  describe "POST /api/pleroma/admin/users/invite_token" do
 -    test "without options", %{conn: conn} do
 -      conn = post(conn, "/api/pleroma/admin/users/invite_token")
 -
 -      invite_json = json_response(conn, 200)
 -      invite = UserInviteToken.find_by_token!(invite_json["token"])
 -      refute invite.used
 -      refute invite.expires_at
 -      refute invite.max_use
 -      assert invite.invite_type == "one_time"
 -    end
 -
 -    test "with expires_at", %{conn: conn} do
 -      conn =
 -        post(conn, "/api/pleroma/admin/users/invite_token", %{
 -          "expires_at" => Date.to_string(Date.utc_today())
 -        })
 -
 -      invite_json = json_response(conn, 200)
 -      invite = UserInviteToken.find_by_token!(invite_json["token"])
 -
 -      refute invite.used
 -      assert invite.expires_at == Date.utc_today()
 -      refute invite.max_use
 -      assert invite.invite_type == "date_limited"
 -    end
 -
 -    test "with max_use", %{conn: conn} do
 -      conn = post(conn, "/api/pleroma/admin/users/invite_token", %{"max_use" => 150})
 -
 -      invite_json = json_response(conn, 200)
 -      invite = UserInviteToken.find_by_token!(invite_json["token"])
 -      refute invite.used
 -      refute invite.expires_at
 -      assert invite.max_use == 150
 -      assert invite.invite_type == "reusable"
 -    end
 -
 -    test "with max use and expires_at", %{conn: conn} do
 -      conn =
 -        post(conn, "/api/pleroma/admin/users/invite_token", %{
 -          "max_use" => 150,
 -          "expires_at" => Date.to_string(Date.utc_today())
 -        })
 -
 -      invite_json = json_response(conn, 200)
 -      invite = UserInviteToken.find_by_token!(invite_json["token"])
 -      refute invite.used
 -      assert invite.expires_at == Date.utc_today()
 -      assert invite.max_use == 150
 -      assert invite.invite_type == "reusable_date_limited"
 -    end
 -  end
 -
 -  describe "GET /api/pleroma/admin/users/invites" do
 -    test "no invites", %{conn: conn} do
 -      conn = get(conn, "/api/pleroma/admin/users/invites")
 -
 -      assert json_response(conn, 200) == %{"invites" => []}
 -    end
 -
 -    test "with invite", %{conn: conn} do
 -      {:ok, invite} = UserInviteToken.create_invite()
 -
 -      conn = get(conn, "/api/pleroma/admin/users/invites")
 -
 -      assert json_response(conn, 200) == %{
 -               "invites" => [
 -                 %{
 -                   "expires_at" => nil,
 -                   "id" => invite.id,
 -                   "invite_type" => "one_time",
 -                   "max_use" => nil,
 -                   "token" => invite.token,
 -                   "used" => false,
 -                   "uses" => 0
 -                 }
 -               ]
 -             }
 -    end
 -  end
 -
 -  describe "POST /api/pleroma/admin/users/revoke_invite" do
 -    test "with token", %{conn: conn} do
 -      {:ok, invite} = UserInviteToken.create_invite()
 -
 -      conn = post(conn, "/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token})
 -
 -      assert json_response(conn, 200) == %{
 -               "expires_at" => nil,
 -               "id" => invite.id,
 -               "invite_type" => "one_time",
 -               "max_use" => nil,
 -               "token" => invite.token,
 -               "used" => true,
 -               "uses" => 0
 -             }
 -    end
 -
 -    test "with invalid token", %{conn: conn} do
 -      conn = post(conn, "/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"})
 -
 -      assert json_response(conn, :not_found) == %{"error" => "Not found"}
 -    end
 -  end
 -
    describe "GET /api/pleroma/admin/reports/:id" do
      test "returns report by its id", %{conn: conn} do
        [reporter, target_user] = insert_pair(:user)
    end
  
    describe "PATCH /users/:nickname/credentials" do
 -    test "changes password and email", %{conn: conn, admin: admin} do
 +    setup do
        user = insert(:user)
 +      [user: user]
 +    end
 +
 +    test "changes password and email", %{conn: conn, admin: admin, user: user} do
        assert user.password_reset_pending == false
  
        conn =
                 "@#{admin.nickname} forced password reset for users: @#{user.nickname}"
      end
  
 -    test "returns 403 if requested by a non-admin" do
 -      user = insert(:user)
 -
 +    test "returns 403 if requested by a non-admin", %{user: user} do
        conn =
          build_conn()
          |> assign(:user, user)
  
        assert json_response(conn, :forbidden)
      end
 +
 +    test "changes actor type from permitted list", %{conn: conn, user: user} do
 +      assert user.actor_type == "Person"
 +
 +      assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{
 +               "actor_type" => "Service"
 +             })
 +             |> json_response(200) == %{"status" => "success"}
 +
 +      updated_user = User.get_by_id(user.id)
 +
 +      assert updated_user.actor_type == "Service"
 +
 +      assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{
 +               "actor_type" => "Application"
 +             })
 +             |> json_response(200) == %{"errors" => %{"actor_type" => "is invalid"}}
 +    end
 +
 +    test "update non existing user", %{conn: conn} do
 +      assert patch(conn, "/api/pleroma/admin/users/non-existing/credentials", %{
 +               "password" => "new_password"
 +             })
 +             |> json_response(200) == %{"error" => "Unable to update user."}
 +    end
    end
  
    describe "PATCH /users/:nickname/force_password_reset" do
                 response["status_visibility"]
      end
    end
-   describe "POST /api/pleroma/admin/oauth_app" do
-     test "errors", %{conn: conn} do
-       response = conn |> post("/api/pleroma/admin/oauth_app", %{}) |> json_response(200)
-       assert response == %{"name" => "can't be blank", "redirect_uris" => "can't be blank"}
-     end
-     test "success", %{conn: conn} do
-       base_url = Web.base_url()
-       app_name = "Trusted app"
-       response =
-         conn
-         |> post("/api/pleroma/admin/oauth_app", %{
-           name: app_name,
-           redirect_uris: base_url
-         })
-         |> json_response(200)
-       assert %{
-                "client_id" => _,
-                "client_secret" => _,
-                "name" => ^app_name,
-                "redirect_uri" => ^base_url,
-                "trusted" => false
-              } = response
-     end
-     test "with trusted", %{conn: conn} do
-       base_url = Web.base_url()
-       app_name = "Trusted app"
-       response =
-         conn
-         |> post("/api/pleroma/admin/oauth_app", %{
-           name: app_name,
-           redirect_uris: base_url,
-           trusted: true
-         })
-         |> json_response(200)
-       assert %{
-                "client_id" => _,
-                "client_secret" => _,
-                "name" => ^app_name,
-                "redirect_uri" => ^base_url,
-                "trusted" => true
-              } = response
-     end
-   end
-   describe "GET /api/pleroma/admin/oauth_app" do
-     setup do
-       app = insert(:oauth_app)
-       {:ok, app: app}
-     end
-     test "list", %{conn: conn} do
-       response =
-         conn
-         |> get("/api/pleroma/admin/oauth_app")
-         |> json_response(200)
-       assert %{"apps" => apps, "count" => count, "page_size" => _} = response
-       assert length(apps) == count
-     end
-     test "with page size", %{conn: conn} do
-       insert(:oauth_app)
-       page_size = 1
-       response =
-         conn
-         |> get("/api/pleroma/admin/oauth_app", %{page_size: to_string(page_size)})
-         |> json_response(200)
-       assert %{"apps" => apps, "count" => _, "page_size" => ^page_size} = response
-       assert length(apps) == page_size
-     end
-     test "search by client name", %{conn: conn, app: app} do
-       response =
-         conn
-         |> get("/api/pleroma/admin/oauth_app", %{name: app.client_name})
-         |> json_response(200)
-       assert %{"apps" => [returned], "count" => _, "page_size" => _} = response
-       assert returned["client_id"] == app.client_id
-       assert returned["name"] == app.client_name
-     end
-     test "search by client id", %{conn: conn, app: app} do
-       response =
-         conn
-         |> get("/api/pleroma/admin/oauth_app", %{client_id: app.client_id})
-         |> json_response(200)
-       assert %{"apps" => [returned], "count" => _, "page_size" => _} = response
-       assert returned["client_id"] == app.client_id
-       assert returned["name"] == app.client_name
-     end
-     test "only trusted", %{conn: conn} do
-       app = insert(:oauth_app, trusted: true)
-       response =
-         conn
-         |> get("/api/pleroma/admin/oauth_app", %{trusted: true})
-         |> json_response(200)
-       assert %{"apps" => [returned], "count" => _, "page_size" => _} = response
-       assert returned["client_id"] == app.client_id
-       assert returned["name"] == app.client_name
-     end
-   end
-   describe "DELETE /api/pleroma/admin/oauth_app/:id" do
-     test "with id", %{conn: conn} do
-       app = insert(:oauth_app)
-       response =
-         conn
-         |> delete("/api/pleroma/admin/oauth_app/" <> to_string(app.id))
-         |> json_response(:no_content)
-       assert response == ""
-     end
-     test "with non existance id", %{conn: conn} do
-       response =
-         conn
-         |> delete("/api/pleroma/admin/oauth_app/0")
-         |> json_response(:bad_request)
-       assert response == ""
-     end
-   end
-   describe "PATCH /api/pleroma/admin/oauth_app/:id" do
-     test "with id", %{conn: conn} do
-       app = insert(:oauth_app)
-       name = "another name"
-       url = "https://example.com"
-       scopes = ["admin"]
-       id = app.id
-       website = "http://website.com"
-       response =
-         conn
-         |> patch("/api/pleroma/admin/oauth_app/" <> to_string(app.id), %{
-           name: name,
-           trusted: true,
-           redirect_uris: url,
-           scopes: scopes,
-           website: website
-         })
-         |> json_response(200)
-       assert %{
-                "client_id" => _,
-                "client_secret" => _,
-                "id" => ^id,
-                "name" => ^name,
-                "redirect_uri" => ^url,
-                "trusted" => true,
-                "website" => ^website
-              } = response
-     end
-     test "without id", %{conn: conn} do
-       response =
-         conn
-         |> patch("/api/pleroma/admin/oauth_app/0")
-         |> json_response(:bad_request)
-       assert response == ""
-     end
-   end
  end
  
  # Needed for testing