diff options
Diffstat (limited to 'test/web/admin_api/controllers')
5 files changed, 888 insertions, 757 deletions
diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index ead840186..a1bff5688 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -17,10 +17,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    alias Pleroma.MFA    alias Pleroma.ModerationLog    alias Pleroma.Repo -  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 @@ -588,122 +586,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      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) @@ -757,8 +639,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      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} = @@ -767,8 +649,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 |> 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 @@ -776,8 +657,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 |> 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 @@ -785,8 +665,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 |> 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 @@ -1318,392 +1197,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest 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) -      activity = insert(:note_activity, user: target_user) - -      {:ok, %{id: report_id}} = -        CommonAPI.report(reporter, %{ -          account_id: target_user.id, -          comment: "I feel offended", -          status_ids: [activity.id] -        }) - -      response = -        conn -        |> get("/api/pleroma/admin/reports/#{report_id}") -        |> json_response(:ok) - -      assert response["id"] == report_id -    end - -    test "returns 404 when report id is invalid", %{conn: conn} do -      conn = get(conn, "/api/pleroma/admin/reports/test") - -      assert json_response(conn, :not_found) == %{"error" => "Not found"} -    end -  end - -  describe "PATCH /api/pleroma/admin/reports" do -    setup do -      [reporter, target_user] = insert_pair(:user) -      activity = insert(:note_activity, user: target_user) - -      {:ok, %{id: report_id}} = -        CommonAPI.report(reporter, %{ -          account_id: target_user.id, -          comment: "I feel offended", -          status_ids: [activity.id] -        }) - -      {:ok, %{id: second_report_id}} = -        CommonAPI.report(reporter, %{ -          account_id: target_user.id, -          comment: "I feel very offended", -          status_ids: [activity.id] -        }) - -      %{ -        id: report_id, -        second_report_id: second_report_id -      } -    end - -    test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} do -      read_token = insert(:oauth_token, user: admin, scopes: ["admin:read"]) -      write_token = insert(:oauth_token, user: admin, scopes: ["admin:write:reports"]) - -      response = -        conn -        |> assign(:token, read_token) -        |> patch("/api/pleroma/admin/reports", %{ -          "reports" => [%{"state" => "resolved", "id" => id}] -        }) -        |> json_response(403) - -      assert response == %{ -               "error" => "Insufficient permissions: admin:write:reports." -             } - -      conn -      |> assign(:token, write_token) -      |> patch("/api/pleroma/admin/reports", %{ -        "reports" => [%{"state" => "resolved", "id" => id}] -      }) -      |> json_response(:no_content) -    end - -    test "mark report as resolved", %{conn: conn, id: id, admin: admin} do -      conn -      |> patch("/api/pleroma/admin/reports", %{ -        "reports" => [ -          %{"state" => "resolved", "id" => id} -        ] -      }) -      |> json_response(:no_content) - -      activity = Activity.get_by_id(id) -      assert activity.data["state"] == "resolved" - -      log_entry = Repo.one(ModerationLog) - -      assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} updated report ##{id} with 'resolved' state" -    end - -    test "closes report", %{conn: conn, id: id, admin: admin} do -      conn -      |> patch("/api/pleroma/admin/reports", %{ -        "reports" => [ -          %{"state" => "closed", "id" => id} -        ] -      }) -      |> json_response(:no_content) - -      activity = Activity.get_by_id(id) -      assert activity.data["state"] == "closed" - -      log_entry = Repo.one(ModerationLog) - -      assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} updated report ##{id} with 'closed' state" -    end - -    test "returns 400 when state is unknown", %{conn: conn, id: id} do -      conn = -        conn -        |> patch("/api/pleroma/admin/reports", %{ -          "reports" => [ -            %{"state" => "test", "id" => id} -          ] -        }) - -      assert hd(json_response(conn, :bad_request))["error"] == "Unsupported state" -    end - -    test "returns 404 when report is not exist", %{conn: conn} do -      conn = -        conn -        |> patch("/api/pleroma/admin/reports", %{ -          "reports" => [ -            %{"state" => "closed", "id" => "test"} -          ] -        }) - -      assert hd(json_response(conn, :bad_request))["error"] == "not_found" -    end - -    test "updates state of multiple reports", %{ -      conn: conn, -      id: id, -      admin: admin, -      second_report_id: second_report_id -    } do -      conn -      |> patch("/api/pleroma/admin/reports", %{ -        "reports" => [ -          %{"state" => "resolved", "id" => id}, -          %{"state" => "closed", "id" => second_report_id} -        ] -      }) -      |> json_response(:no_content) - -      activity = Activity.get_by_id(id) -      second_activity = Activity.get_by_id(second_report_id) -      assert activity.data["state"] == "resolved" -      assert second_activity.data["state"] == "closed" - -      [first_log_entry, second_log_entry] = Repo.all(ModerationLog) - -      assert ModerationLog.get_log_entry_message(first_log_entry) == -               "@#{admin.nickname} updated report ##{id} with 'resolved' state" - -      assert ModerationLog.get_log_entry_message(second_log_entry) == -               "@#{admin.nickname} updated report ##{second_report_id} with 'closed' state" -    end -  end - -  describe "GET /api/pleroma/admin/reports" do -    test "returns empty response when no reports created", %{conn: conn} do -      response = -        conn -        |> get("/api/pleroma/admin/reports") -        |> json_response(:ok) - -      assert Enum.empty?(response["reports"]) -      assert response["total"] == 0 -    end - -    test "returns reports", %{conn: conn} do -      [reporter, target_user] = insert_pair(:user) -      activity = insert(:note_activity, user: target_user) - -      {:ok, %{id: report_id}} = -        CommonAPI.report(reporter, %{ -          account_id: target_user.id, -          comment: "I feel offended", -          status_ids: [activity.id] -        }) - -      response = -        conn -        |> get("/api/pleroma/admin/reports") -        |> json_response(:ok) - -      [report] = response["reports"] - -      assert length(response["reports"]) == 1 -      assert report["id"] == report_id - -      assert response["total"] == 1 -    end - -    test "returns reports with specified state", %{conn: conn} do -      [reporter, target_user] = insert_pair(:user) -      activity = insert(:note_activity, user: target_user) - -      {:ok, %{id: first_report_id}} = -        CommonAPI.report(reporter, %{ -          account_id: target_user.id, -          comment: "I feel offended", -          status_ids: [activity.id] -        }) - -      {:ok, %{id: second_report_id}} = -        CommonAPI.report(reporter, %{ -          account_id: target_user.id, -          comment: "I don't like this user" -        }) - -      CommonAPI.update_report_state(second_report_id, "closed") - -      response = -        conn -        |> get("/api/pleroma/admin/reports", %{ -          "state" => "open" -        }) -        |> json_response(:ok) - -      [open_report] = response["reports"] - -      assert length(response["reports"]) == 1 -      assert open_report["id"] == first_report_id - -      assert response["total"] == 1 - -      response = -        conn -        |> get("/api/pleroma/admin/reports", %{ -          "state" => "closed" -        }) -        |> json_response(:ok) - -      [closed_report] = response["reports"] - -      assert length(response["reports"]) == 1 -      assert closed_report["id"] == second_report_id - -      assert response["total"] == 1 - -      response = -        conn -        |> get("/api/pleroma/admin/reports", %{ -          "state" => "resolved" -        }) -        |> json_response(:ok) - -      assert Enum.empty?(response["reports"]) -      assert response["total"] == 0 -    end - -    test "returns 403 when requested by a non-admin" do -      user = insert(:user) -      token = insert(:oauth_token, user: user) - -      conn = -        build_conn() -        |> assign(:user, user) -        |> assign(:token, token) -        |> get("/api/pleroma/admin/reports") - -      assert json_response(conn, :forbidden) == -               %{"error" => "User is not an admin or OAuth admin scope is not granted."} -    end - -    test "returns 403 when requested by anonymous" do -      conn = get(build_conn(), "/api/pleroma/admin/reports") - -      assert json_response(conn, :forbidden) == %{"error" => "Invalid credentials."} -    end -  end -    describe "GET /api/pleroma/admin/config" do      setup do: clear_config(:configurable_from_database, true) @@ -3421,66 +2914,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "POST /reports/:id/notes" do -    setup %{conn: conn, admin: admin} do -      [reporter, target_user] = insert_pair(:user) -      activity = insert(:note_activity, user: target_user) - -      {:ok, %{id: report_id}} = -        CommonAPI.report(reporter, %{ -          account_id: target_user.id, -          comment: "I feel offended", -          status_ids: [activity.id] -        }) - -      post(conn, "/api/pleroma/admin/reports/#{report_id}/notes", %{ -        content: "this is disgusting!" -      }) - -      post(conn, "/api/pleroma/admin/reports/#{report_id}/notes", %{ -        content: "this is disgusting2!" -      }) - -      %{ -        admin_id: admin.id, -        report_id: report_id -      } -    end - -    test "it creates report note", %{admin_id: admin_id, report_id: report_id} do -      [note, _] = Repo.all(ReportNote) - -      assert %{ -               activity_id: ^report_id, -               content: "this is disgusting!", -               user_id: ^admin_id -             } = note -    end - -    test "it returns reports with notes", %{conn: conn, admin: admin} do -      conn = get(conn, "/api/pleroma/admin/reports") - -      response = json_response(conn, 200) -      notes = hd(response["reports"])["notes"] -      [note, _] = notes - -      assert note["user"]["nickname"] == admin.nickname -      assert note["content"] == "this is disgusting!" -      assert note["created_at"] -      assert response["total"] == 1 -    end - -    test "it deletes the note", %{conn: conn, report_id: report_id} do -      assert ReportNote |> Repo.all() |> length() == 2 - -      [note, _] = Repo.all(ReportNote) - -      delete(conn, "/api/pleroma/admin/reports/#{report_id}/notes/#{note.id}") - -      assert ReportNote |> Repo.all() |> length() == 1 -    end -  end -    describe "GET /api/pleroma/admin/config/descriptions" do      test "structure", %{conn: conn} do        admin = insert(:user, is_admin: true) @@ -3549,191 +2982,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest 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 diff --git a/test/web/admin_api/controllers/invite_controller_test.exs b/test/web/admin_api/controllers/invite_controller_test.exs new file mode 100644 index 000000000..ab186c5e7 --- /dev/null +++ b/test/web/admin_api/controllers/invite_controller_test.exs @@ -0,0 +1,281 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InviteControllerTest do +  use Pleroma.Web.ConnCase, async: true + +  import Pleroma.Factory + +  alias Pleroma.Config +  alias Pleroma.Repo +  alias Pleroma.UserInviteToken + +  setup do +    admin = insert(:user, is_admin: true) +    token = insert(:oauth_admin_token, user: admin) + +    conn = +      build_conn() +      |> assign(:user, admin) +      |> assign(:token, token) + +    {:ok, %{admin: admin, token: token, conn: conn}} +  end + +  describe "POST /api/pleroma/admin/users/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 = +        conn +        |> put_req_header("content-type", "application/json;charset=utf-8") +        |> post("/api/pleroma/admin/users/email_invite", %{ +          email: recipient_email, +          name: recipient_name +        }) + +      assert json_response_and_validate_schema(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) +        |> put_req_header("content-type", "application/json;charset=utf-8") +        |> 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_and_validate_schema(: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 = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/users/email_invite", %{ +          email: "foo@bar.com", +          name: "JD" +        }) + +      assert json_response_and_validate_schema(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 = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/users/email_invite", %{ +          email: "foo@bar.com", +          name: "JD" +        }) + +      assert json_response_and_validate_schema(conn, :bad_request) == +               %{ +                 "error" => +                   "To send invites you need to set the `registrations_open` option to false." +               } +    end +  end + +  describe "POST /api/pleroma/admin/users/invite_token" do +    test "without options", %{conn: conn} do +      conn = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/users/invite_token") + +      invite_json = json_response_and_validate_schema(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 = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/users/invite_token", %{ +          "expires_at" => Date.to_string(Date.utc_today()) +        }) + +      invite_json = json_response_and_validate_schema(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 = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/users/invite_token", %{"max_use" => 150}) + +      invite_json = json_response_and_validate_schema(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 = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/users/invite_token", %{ +          "max_use" => 150, +          "expires_at" => Date.to_string(Date.utc_today()) +        }) + +      invite_json = json_response_and_validate_schema(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_and_validate_schema(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_and_validate_schema(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 = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token}) + +      assert json_response_and_validate_schema(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 = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"}) + +      assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} +    end +  end +end diff --git a/test/web/admin_api/controllers/oauth_app_controller_test.exs b/test/web/admin_api/controllers/oauth_app_controller_test.exs new file mode 100644 index 000000000..ed7c4172c --- /dev/null +++ b/test/web/admin_api/controllers/oauth_app_controller_test.exs @@ -0,0 +1,220 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.OAuthAppControllerTest do +  use Pleroma.Web.ConnCase, async: true +  use Oban.Testing, repo: Pleroma.Repo + +  import Pleroma.Factory + +  alias Pleroma.Config +  alias Pleroma.Web + +  setup do +    admin = insert(:user, is_admin: true) +    token = insert(:oauth_admin_token, user: admin) + +    conn = +      build_conn() +      |> assign(:user, admin) +      |> assign(:token, token) + +    {:ok, %{admin: admin, token: token, conn: conn}} +  end + +  describe "POST /api/pleroma/admin/oauth_app" do +    test "errors", %{conn: conn} do +      response = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/oauth_app", %{}) +        |> json_response_and_validate_schema(400) + +      assert %{ +               "error" => "Missing field: name. Missing field: redirect_uris." +             } = response +    end + +    test "success", %{conn: conn} do +      base_url = Web.base_url() +      app_name = "Trusted app" + +      response = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/oauth_app", %{ +          name: app_name, +          redirect_uris: base_url +        }) +        |> json_response_and_validate_schema(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 +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/admin/oauth_app", %{ +          name: app_name, +          redirect_uris: base_url, +          trusted: true +        }) +        |> json_response_and_validate_schema(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_and_validate_schema(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=#{page_size}") +        |> json_response_and_validate_schema(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_and_validate_schema(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_and_validate_schema(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_and_validate_schema(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_and_validate_schema(:no_content) + +      assert response == "" +    end + +    test "with non existance id", %{conn: conn} do +      response = +        conn +        |> delete("/api/pleroma/admin/oauth_app/0") +        |> json_response_and_validate_schema(: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 +        |> put_req_header("content-type", "application/json") +        |> patch("/api/pleroma/admin/oauth_app/#{id}", %{ +          name: name, +          trusted: true, +          redirect_uris: url, +          scopes: scopes, +          website: website +        }) +        |> json_response_and_validate_schema(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 +        |> put_req_header("content-type", "application/json") +        |> patch("/api/pleroma/admin/oauth_app/0") +        |> json_response_and_validate_schema(:bad_request) + +      assert response == "" +    end +  end +end diff --git a/test/web/admin_api/controllers/report_controller_test.exs b/test/web/admin_api/controllers/report_controller_test.exs new file mode 100644 index 000000000..940bce340 --- /dev/null +++ b/test/web/admin_api/controllers/report_controller_test.exs @@ -0,0 +1,374 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ReportControllerTest do +  use Pleroma.Web.ConnCase + +  import Pleroma.Factory + +  alias Pleroma.Activity +  alias Pleroma.Config +  alias Pleroma.ModerationLog +  alias Pleroma.Repo +  alias Pleroma.ReportNote +  alias Pleroma.Web.CommonAPI + +  setup do +    admin = insert(:user, is_admin: true) +    token = insert(:oauth_admin_token, user: admin) + +    conn = +      build_conn() +      |> assign(:user, admin) +      |> assign(:token, token) + +    {:ok, %{admin: admin, token: token, conn: conn}} +  end + +  describe "GET /api/pleroma/admin/reports/:id" do +    test "returns report by its id", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id] +        }) + +      response = +        conn +        |> get("/api/pleroma/admin/reports/#{report_id}") +        |> json_response_and_validate_schema(:ok) + +      assert response["id"] == report_id +    end + +    test "returns 404 when report id is invalid", %{conn: conn} do +      conn = get(conn, "/api/pleroma/admin/reports/test") + +      assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} +    end +  end + +  describe "PATCH /api/pleroma/admin/reports" do +    setup do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id] +        }) + +      {:ok, %{id: second_report_id}} = +        CommonAPI.report(reporter, %{ +          account_id: target_user.id, +          comment: "I feel very offended", +          status_ids: [activity.id] +        }) + +      %{ +        id: report_id, +        second_report_id: second_report_id +      } +    end + +    test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} do +      read_token = insert(:oauth_token, user: admin, scopes: ["admin:read"]) +      write_token = insert(:oauth_token, user: admin, scopes: ["admin:write:reports"]) + +      response = +        conn +        |> assign(:token, read_token) +        |> put_req_header("content-type", "application/json") +        |> patch("/api/pleroma/admin/reports", %{ +          "reports" => [%{"state" => "resolved", "id" => id}] +        }) +        |> json_response_and_validate_schema(403) + +      assert response == %{ +               "error" => "Insufficient permissions: admin:write:reports." +             } + +      conn +      |> assign(:token, write_token) +      |> put_req_header("content-type", "application/json") +      |> patch("/api/pleroma/admin/reports", %{ +        "reports" => [%{"state" => "resolved", "id" => id}] +      }) +      |> json_response_and_validate_schema(:no_content) +    end + +    test "mark report as resolved", %{conn: conn, id: id, admin: admin} do +      conn +      |> put_req_header("content-type", "application/json") +      |> patch("/api/pleroma/admin/reports", %{ +        "reports" => [ +          %{"state" => "resolved", "id" => id} +        ] +      }) +      |> json_response_and_validate_schema(:no_content) + +      activity = Activity.get_by_id(id) +      assert activity.data["state"] == "resolved" + +      log_entry = Repo.one(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry) == +               "@#{admin.nickname} updated report ##{id} with 'resolved' state" +    end + +    test "closes report", %{conn: conn, id: id, admin: admin} do +      conn +      |> put_req_header("content-type", "application/json") +      |> patch("/api/pleroma/admin/reports", %{ +        "reports" => [ +          %{"state" => "closed", "id" => id} +        ] +      }) +      |> json_response_and_validate_schema(:no_content) + +      activity = Activity.get_by_id(id) +      assert activity.data["state"] == "closed" + +      log_entry = Repo.one(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry) == +               "@#{admin.nickname} updated report ##{id} with 'closed' state" +    end + +    test "returns 400 when state is unknown", %{conn: conn, id: id} do +      conn = +        conn +        |> put_req_header("content-type", "application/json") +        |> patch("/api/pleroma/admin/reports", %{ +          "reports" => [ +            %{"state" => "test", "id" => id} +          ] +        }) + +      assert "Unsupported state" = +               hd(json_response_and_validate_schema(conn, :bad_request))["error"] +    end + +    test "returns 404 when report is not exist", %{conn: conn} do +      conn = +        conn +        |> put_req_header("content-type", "application/json") +        |> patch("/api/pleroma/admin/reports", %{ +          "reports" => [ +            %{"state" => "closed", "id" => "test"} +          ] +        }) + +      assert hd(json_response_and_validate_schema(conn, :bad_request))["error"] == "not_found" +    end + +    test "updates state of multiple reports", %{ +      conn: conn, +      id: id, +      admin: admin, +      second_report_id: second_report_id +    } do +      conn +      |> put_req_header("content-type", "application/json") +      |> patch("/api/pleroma/admin/reports", %{ +        "reports" => [ +          %{"state" => "resolved", "id" => id}, +          %{"state" => "closed", "id" => second_report_id} +        ] +      }) +      |> json_response_and_validate_schema(:no_content) + +      activity = Activity.get_by_id(id) +      second_activity = Activity.get_by_id(second_report_id) +      assert activity.data["state"] == "resolved" +      assert second_activity.data["state"] == "closed" + +      [first_log_entry, second_log_entry] = Repo.all(ModerationLog) + +      assert ModerationLog.get_log_entry_message(first_log_entry) == +               "@#{admin.nickname} updated report ##{id} with 'resolved' state" + +      assert ModerationLog.get_log_entry_message(second_log_entry) == +               "@#{admin.nickname} updated report ##{second_report_id} with 'closed' state" +    end +  end + +  describe "GET /api/pleroma/admin/reports" do +    test "returns empty response when no reports created", %{conn: conn} do +      response = +        conn +        |> get("/api/pleroma/admin/reports") +        |> json_response_and_validate_schema(:ok) + +      assert Enum.empty?(response["reports"]) +      assert response["total"] == 0 +    end + +    test "returns reports", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id] +        }) + +      response = +        conn +        |> get("/api/pleroma/admin/reports") +        |> json_response_and_validate_schema(:ok) + +      [report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert report["id"] == report_id + +      assert response["total"] == 1 +    end + +    test "returns reports with specified state", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: first_report_id}} = +        CommonAPI.report(reporter, %{ +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id] +        }) + +      {:ok, %{id: second_report_id}} = +        CommonAPI.report(reporter, %{ +          account_id: target_user.id, +          comment: "I don't like this user" +        }) + +      CommonAPI.update_report_state(second_report_id, "closed") + +      response = +        conn +        |> get("/api/pleroma/admin/reports?state=open") +        |> json_response_and_validate_schema(:ok) + +      assert [open_report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert open_report["id"] == first_report_id + +      assert response["total"] == 1 + +      response = +        conn +        |> get("/api/pleroma/admin/reports?state=closed") +        |> json_response_and_validate_schema(:ok) + +      assert [closed_report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert closed_report["id"] == second_report_id + +      assert response["total"] == 1 + +      assert %{"total" => 0, "reports" => []} == +               conn +               |> get("/api/pleroma/admin/reports?state=resolved", %{ +                 "" => "" +               }) +               |> json_response_and_validate_schema(:ok) +    end + +    test "returns 403 when requested by a non-admin" do +      user = insert(:user) +      token = insert(:oauth_token, user: user) + +      conn = +        build_conn() +        |> assign(:user, user) +        |> assign(:token, token) +        |> get("/api/pleroma/admin/reports") + +      assert json_response(conn, :forbidden) == +               %{"error" => "User is not an admin or OAuth admin scope is not granted."} +    end + +    test "returns 403 when requested by anonymous" do +      conn = get(build_conn(), "/api/pleroma/admin/reports") + +      assert json_response(conn, :forbidden) == %{ +               "error" => "Invalid credentials." +             } +    end +  end + +  describe "POST /api/pleroma/admin/reports/:id/notes" do +    setup %{conn: conn, admin: admin} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id] +        }) + +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ +        content: "this is disgusting!" +      }) + +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ +        content: "this is disgusting2!" +      }) + +      %{ +        admin_id: admin.id, +        report_id: report_id +      } +    end + +    test "it creates report note", %{admin_id: admin_id, report_id: report_id} do +      assert [note, _] = Repo.all(ReportNote) + +      assert %{ +               activity_id: ^report_id, +               content: "this is disgusting!", +               user_id: ^admin_id +             } = note +    end + +    test "it returns reports with notes", %{conn: conn, admin: admin} do +      conn = get(conn, "/api/pleroma/admin/reports") + +      response = json_response_and_validate_schema(conn, 200) +      notes = hd(response["reports"])["notes"] +      [note, _] = notes + +      assert note["user"]["nickname"] == admin.nickname +      assert note["content"] == "this is disgusting!" +      assert note["created_at"] +      assert response["total"] == 1 +    end + +    test "it deletes the note", %{conn: conn, report_id: report_id} do +      assert ReportNote |> Repo.all() |> length() == 2 +      assert [note, _] = Repo.all(ReportNote) + +      delete(conn, "/api/pleroma/admin/reports/#{report_id}/notes/#{note.id}") + +      assert ReportNote |> Repo.all() |> length() == 1 +    end +  end +end diff --git a/test/web/admin_api/controllers/status_controller_test.exs b/test/web/admin_api/controllers/status_controller_test.exs index 124d8dc2e..eff78fb0a 100644 --- a/test/web/admin_api/controllers/status_controller_test.exs +++ b/test/web/admin_api/controllers/status_controller_test.exs @@ -42,6 +42,14 @@ defmodule Pleroma.Web.AdminAPI.StatusControllerTest do          |> json_response_and_validate_schema(200)        assert response["id"] == activity.id + +      account = response["account"] +      actor = User.get_by_ap_id(activity.actor) + +      assert account["id"] == actor.id +      assert account["nickname"] == actor.nickname +      assert account["deactivated"] == actor.deactivated +      assert account["confirmation_pending"] == actor.confirmation_pending      end    end  | 
