diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/support/factory.ex | 54 | ||||
| -rw-r--r-- | test/web/admin_api/controllers/admin_api_controller_test.exs | 47 | ||||
| -rw-r--r-- | test/web/admin_api/controllers/chat_controller_test.exs | 216 | ||||
| -rw-r--r-- | test/web/common_api/common_api_test.exs | 20 | 
4 files changed, 337 insertions, 0 deletions
| diff --git a/test/support/factory.ex b/test/support/factory.ex index 2fdfabbc5..e59d83242 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -441,4 +441,58 @@ defmodule Pleroma.Factory do        phrase: "cofe"      }    end + +  def chat_factory(attrs \\ %{}) do +    user = attrs[:user] || insert(:user) +    recipient = attrs[:recipient] || insert(:user) + +    %Pleroma.Chat{ +      user_id: user.id, +      recipient: recipient.ap_id +    } +  end + +  def chat_message_factory(attrs \\ %{}) do +    text = sequence(:text, &"This is :moominmamma: chat message #{&1}") +    chat = attrs[:chat] || insert(:chat) + +    data = %{ +      "type" => "ChatMessage", +      "content" => text, +      "id" => Pleroma.Web.ActivityPub.Utils.generate_object_id(), +      "actor" => User.get_by_id(chat.user_id).ap_id, +      "to" => [chat.recipient], +      "published" => DateTime.utc_now() |> DateTime.to_iso8601() +    } + +    %Pleroma.Object{ +      data: merge_attributes(data, Map.get(attrs, :data, %{})) +    } +  end + +  def chat_message_activity_factory(attrs \\ %{}) do +    chat = attrs[:chat] || insert(:chat) +    chat_message = attrs[:chat_message] || insert(:chat_message, chat: chat) + +    data_attrs = attrs[:data_attrs] || %{} +    attrs = Map.drop(attrs, [:chat, :chat_message, :data_attrs]) + +    data = +      %{ +        "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), +        "type" => "Create", +        "actor" => chat_message.data["actor"], +        "to" => chat_message.data["to"], +        "object" => chat_message.data["id"], +        "published" => DateTime.utc_now() |> DateTime.to_iso8601() +      } +      |> Map.merge(data_attrs) + +    %Pleroma.Activity{ +      data: data, +      actor: data["actor"], +      recipients: data["to"] +    } +    |> Map.merge(attrs) +  end  end 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 3bc88c6a9..3476fd0b4 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -1510,6 +1510,53 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end +  describe "GET /api/pleroma/admin/users/:nickname/chats" do +    setup do +      user = insert(:user) + +      insert(:chat, user: user) +      insert(:chat, user: user) +      insert(:chat, user: user) + +      %{user: user} +    end + +    test "renders user's statuses", %{conn: conn, user: user} do +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/chats") + +      assert json_response(conn, 200) |> length() == 3 +    end +  end + +  describe "GET /api/pleroma/admin/users/:nickname/chats unauthorized" do +    setup do +      user = insert(:user) +      insert(:chat, user: user) +      %{conn: conn} = oauth_access(["read:chats"]) +      %{conn: conn, user: user} +    end + +    test "returns 403", %{conn: conn, user: user} do +      conn +      |> get("/api/pleroma/admin/users/#{user.nickname}/chats") +      |> json_response(403) +    end +  end + +  describe "GET /api/pleroma/admin/users/:nickname/chats unauthenticated" do +    setup do +      user = insert(:user) +      insert(:chat, user: user) +      %{conn: build_conn(), user: user} +    end + +    test "returns 403", %{conn: conn, user: user} do +      conn +      |> get("/api/pleroma/admin/users/#{user.nickname}/chats") +      |> json_response(403) +    end +  end +    describe "GET /api/pleroma/admin/moderation_log" do      setup do        moderator = insert(:user, is_moderator: true) diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs new file mode 100644 index 000000000..e81484ce6 --- /dev/null +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -0,0 +1,216 @@ +# 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.ChatControllerTest do +  use Pleroma.Web.ConnCase + +  import Pleroma.Factory + +  alias Pleroma.Chat +  alias Pleroma.Chat.MessageReference +  alias Pleroma.Config +  alias Pleroma.ModerationLog +  alias Pleroma.Object +  alias Pleroma.Repo +  alias Pleroma.Web.CommonAPI + +  defp admin_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 "DELETE /api/pleroma/admin/chats/:id/messages/:message_id" do +    setup do: admin_setup() + +    test "it deletes a message from the chat", %{conn: conn, admin: admin} do +      user = insert(:user) +      recipient = insert(:user) + +      {:ok, message} = +        CommonAPI.post_chat_message(user, recipient, "Hello darkness my old friend") + +      object = Object.normalize(message, false) + +      chat = Chat.get(user.id, recipient.ap_id) + +      cm_ref = MessageReference.for_chat_and_object(chat, object) + +      result = +        conn +        |> put_req_header("content-type", "application/json") +        |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}") +        |> json_response_and_validate_schema(200) + +      log_entry = Repo.one(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry) == +               "@#{admin.nickname} deleted chat message ##{cm_ref.id}" + +      assert result["id"] == cm_ref.id +      refute MessageReference.get_by_id(cm_ref.id) +      assert %{data: %{"type" => "Tombstone"}} = Object.get_by_id(object.id) +    end +  end + +  describe "GET /api/pleroma/admin/chats/:id/messages" do +    setup do: admin_setup() + +    test "it paginates", %{conn: conn} do +      user = insert(:user) +      recipient = insert(:user) + +      Enum.each(1..30, fn _ -> +        {:ok, _} = CommonAPI.post_chat_message(user, recipient, "hey") +      end) + +      chat = Chat.get(user.id, recipient.ap_id) + +      result = +        conn +        |> get("/api/pleroma/admin/chats/#{chat.id}/messages") +        |> json_response_and_validate_schema(200) + +      assert length(result) == 20 + +      result = +        conn +        |> get("/api/pleroma/admin/chats/#{chat.id}/messages?max_id=#{List.last(result)["id"]}") +        |> json_response_and_validate_schema(200) + +      assert length(result) == 10 +    end + +    test "it returns the messages for a given chat", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) +      third_user = insert(:user) + +      {:ok, _} = CommonAPI.post_chat_message(user, other_user, "hey") +      {:ok, _} = CommonAPI.post_chat_message(user, third_user, "hey") +      {:ok, _} = CommonAPI.post_chat_message(user, other_user, "how are you?") +      {:ok, _} = CommonAPI.post_chat_message(other_user, user, "fine, how about you?") + +      chat = Chat.get(user.id, other_user.ap_id) + +      result = +        conn +        |> get("/api/pleroma/admin/chats/#{chat.id}/messages") +        |> json_response_and_validate_schema(200) + +      result +      |> Enum.each(fn message -> +        assert message["chat_id"] == chat.id |> to_string() +      end) + +      assert length(result) == 3 +    end +  end + +  describe "GET /api/pleroma/admin/chats/:id" do +    setup do: admin_setup() + +    test "it returns a chat", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + +      result = +        conn +        |> get("/api/pleroma/admin/chats/#{chat.id}") +        |> json_response_and_validate_schema(200) + +      assert result["id"] == to_string(chat.id) +      assert %{} = result["sender"] +      assert %{} = result["receiver"] +      refute result["account"] +    end +  end + +  describe "unauthorized chat moderation" do +    setup do +      user = insert(:user) +      recipient = insert(:user) + +      {:ok, message} = CommonAPI.post_chat_message(user, recipient, "Yo") +      object = Object.normalize(message, false) +      chat = Chat.get(user.id, recipient.ap_id) +      cm_ref = MessageReference.for_chat_and_object(chat, object) + +      %{conn: conn} = oauth_access(["read:chats", "write:chats"]) +      %{conn: conn, chat: chat, cm_ref: cm_ref} +    end + +    test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{ +      conn: conn, +      chat: chat, +      cm_ref: cm_ref +    } do +      conn +      |> put_req_header("content-type", "application/json") +      |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}") +      |> json_response(403) + +      assert MessageReference.get_by_id(cm_ref.id) == cm_ref +    end + +    test "GET /api/pleroma/admin/chats/:id/messages", %{conn: conn, chat: chat} do +      conn +      |> get("/api/pleroma/admin/chats/#{chat.id}/messages") +      |> json_response(403) +    end + +    test "GET /api/pleroma/admin/chats/:id", %{conn: conn, chat: chat} do +      conn +      |> get("/api/pleroma/admin/chats/#{chat.id}") +      |> json_response(403) +    end +  end + +  describe "unauthenticated chat moderation" do +    setup do +      user = insert(:user) +      recipient = insert(:user) + +      {:ok, message} = CommonAPI.post_chat_message(user, recipient, "Yo") +      object = Object.normalize(message, false) +      chat = Chat.get(user.id, recipient.ap_id) +      cm_ref = MessageReference.for_chat_and_object(chat, object) + +      %{conn: build_conn(), chat: chat, cm_ref: cm_ref} +    end + +    test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{ +      conn: conn, +      chat: chat, +      cm_ref: cm_ref +    } do +      conn +      |> put_req_header("content-type", "application/json") +      |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}") +      |> json_response(403) + +      assert MessageReference.get_by_id(cm_ref.id) == cm_ref +    end + +    test "GET /api/pleroma/admin/chats/:id/messages", %{conn: conn, chat: chat} do +      conn +      |> get("/api/pleroma/admin/chats/#{chat.id}/messages") +      |> json_response(403) +    end + +    test "GET /api/pleroma/admin/chats/:id", %{conn: conn, chat: chat} do +      conn +      |> get("/api/pleroma/admin/chats/#{chat.id}") +      |> json_response(403) +    end +  end +end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 5afb0a6dc..f5559f932 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -1193,4 +1193,24 @@ defmodule Pleroma.Web.CommonAPITest do        assert Visibility.get_visibility(activity) == "private"      end    end + +  describe "get_user/1" do +    test "gets user by ap_id" do +      user = insert(:user) +      assert CommonAPI.get_user(user.ap_id) == user +    end + +    test "gets user by guessed nickname" do +      user = insert(:user, ap_id: "", nickname: "mario@mushroom.kingdom") +      assert CommonAPI.get_user("https://mushroom.kingdom/users/mario") == user +    end + +    test "fallback" do +      assert %User{ +               name: "", +               ap_id: "", +               nickname: "erroruser@example.com" +             } = CommonAPI.get_user("") +    end +  end  end | 
