diff options
Diffstat (limited to 'test/web/pleroma_api')
4 files changed, 336 insertions, 302 deletions
diff --git a/test/web/pleroma_api/controllers/conversation_controller_test.exs b/test/web/pleroma_api/controllers/conversation_controller_test.exs new file mode 100644 index 000000000..e6d0b3e37 --- /dev/null +++ b/test/web/pleroma_api/controllers/conversation_controller_test.exs @@ -0,0 +1,136 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.ConversationControllerTest do +  use Pleroma.Web.ConnCase + +  alias Pleroma.Conversation.Participation +  alias Pleroma.Repo +  alias Pleroma.User +  alias Pleroma.Web.CommonAPI + +  import Pleroma.Factory + +  test "/api/v1/pleroma/conversations/:id" do +    user = insert(:user) +    %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) + +    {:ok, _activity} = +      CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) + +    [participation] = Participation.for_user(other_user) + +    result = +      conn +      |> get("/api/v1/pleroma/conversations/#{participation.id}") +      |> json_response_and_validate_schema(200) + +    assert result["id"] == participation.id |> to_string() +  end + +  test "/api/v1/pleroma/conversations/:id/statuses" do +    user = insert(:user) +    %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) +    third_user = insert(:user) + +    {:ok, _activity} = +      CommonAPI.post(user, %{status: "Hi @#{third_user.nickname}!", visibility: "direct"}) + +    {:ok, activity} = +      CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) + +    [participation] = Participation.for_user(other_user) + +    {:ok, activity_two} = +      CommonAPI.post(other_user, %{ +        status: "Hi!", +        in_reply_to_status_id: activity.id, +        in_reply_to_conversation_id: participation.id +      }) + +    result = +      conn +      |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses") +      |> json_response_and_validate_schema(200) + +    assert length(result) == 2 + +    id_one = activity.id +    id_two = activity_two.id +    assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result + +    {:ok, %{id: id_three}} = +      CommonAPI.post(other_user, %{ +        status: "Bye!", +        in_reply_to_status_id: activity.id, +        in_reply_to_conversation_id: participation.id +      }) + +    assert [%{"id" => ^id_two}, %{"id" => ^id_three}] = +             conn +             |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?limit=2") +             |> json_response_and_validate_schema(:ok) + +    assert [%{"id" => ^id_three}] = +             conn +             |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?min_id=#{id_two}") +             |> json_response_and_validate_schema(:ok) +  end + +  test "PATCH /api/v1/pleroma/conversations/:id" do +    %{user: user, conn: conn} = oauth_access(["write:conversations"]) +    other_user = insert(:user) + +    {:ok, _activity} = CommonAPI.post(user, %{status: "Hi", visibility: "direct"}) + +    [participation] = Participation.for_user(user) + +    participation = Repo.preload(participation, :recipients) + +    user = User.get_cached_by_id(user.id) +    assert [user] == participation.recipients +    assert other_user not in participation.recipients + +    query = "recipients[]=#{user.id}&recipients[]=#{other_user.id}" + +    result = +      conn +      |> patch("/api/v1/pleroma/conversations/#{participation.id}?#{query}") +      |> json_response_and_validate_schema(200) + +    assert result["id"] == participation.id |> to_string + +    [participation] = Participation.for_user(user) +    participation = Repo.preload(participation, :recipients) + +    assert user in participation.recipients +    assert other_user in participation.recipients +  end + +  test "POST /api/v1/pleroma/conversations/read" do +    user = insert(:user) +    %{user: other_user, conn: conn} = oauth_access(["write:conversations"]) + +    {:ok, _activity} = +      CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) + +    {:ok, _activity} = +      CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) + +    [participation2, participation1] = Participation.for_user(other_user) +    assert Participation.get(participation2.id).read == false +    assert Participation.get(participation1.id).read == false +    assert User.get_cached_by_id(other_user.id).unread_conversation_count == 2 + +    [%{"unread" => false}, %{"unread" => false}] = +      conn +      |> post("/api/v1/pleroma/conversations/read", %{}) +      |> json_response_and_validate_schema(200) + +    [participation2, participation1] = Participation.for_user(other_user) +    assert Participation.get(participation2.id).read == true +    assert Participation.get(participation1.id).read == true +    assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0 +  end +end diff --git a/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs new file mode 100644 index 000000000..e1bb5ebfe --- /dev/null +++ b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs @@ -0,0 +1,132 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.EmojiReactionControllerTest do +  use Oban.Testing, repo: Pleroma.Repo +  use Pleroma.Web.ConnCase + +  alias Pleroma.Object +  alias Pleroma.Tests.ObanHelpers +  alias Pleroma.User +  alias Pleroma.Web.CommonAPI + +  import Pleroma.Factory + +  test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do +    user = insert(:user) +    other_user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + +    result = +      conn +      |> assign(:user, other_user) +      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) +      |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") +      |> json_response_and_validate_schema(200) + +    # We return the status, but this our implementation detail. +    assert %{"id" => id} = result +    assert to_string(activity.id) == id + +    assert result["pleroma"]["emoji_reactions"] == [ +             %{"name" => "☕", "count" => 1, "me" => true} +           ] + +    # Reacting with a non-emoji +    assert conn +           |> assign(:user, other_user) +           |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) +           |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/x") +           |> json_response_and_validate_schema(400) +  end + +  test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do +    user = insert(:user) +    other_user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) +    {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + +    ObanHelpers.perform_all() + +    result = +      conn +      |> assign(:user, other_user) +      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) +      |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") + +    assert %{"id" => id} = json_response_and_validate_schema(result, 200) +    assert to_string(activity.id) == id + +    ObanHelpers.perform_all() + +    object = Object.get_by_ap_id(activity.data["object"]) + +    assert object.data["reaction_count"] == 0 +  end + +  test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do +    user = insert(:user) +    other_user = insert(:user) +    doomed_user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + +    result = +      conn +      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") +      |> json_response_and_validate_schema(200) + +    assert result == [] + +    {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") +    {:ok, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅") + +    User.perform(:delete, doomed_user) + +    result = +      conn +      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") +      |> json_response_and_validate_schema(200) + +    [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result + +    assert represented_user["id"] == other_user.id + +    result = +      conn +      |> assign(:user, other_user) +      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"])) +      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") +      |> json_response_and_validate_schema(200) + +    assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] = +             result +  end + +  test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do +    user = insert(:user) +    other_user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + +    result = +      conn +      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") +      |> json_response_and_validate_schema(200) + +    assert result == [] + +    {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") +    {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + +    assert [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = +             conn +             |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") +             |> json_response_and_validate_schema(200) + +    assert represented_user["id"] == other_user.id +  end +end diff --git a/test/web/pleroma_api/controllers/notification_controller_test.exs b/test/web/pleroma_api/controllers/notification_controller_test.exs new file mode 100644 index 000000000..bb4fe6c49 --- /dev/null +++ b/test/web/pleroma_api/controllers/notification_controller_test.exs @@ -0,0 +1,68 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.NotificationControllerTest do +  use Pleroma.Web.ConnCase + +  alias Pleroma.Notification +  alias Pleroma.Repo +  alias Pleroma.Web.CommonAPI + +  import Pleroma.Factory + +  describe "POST /api/v1/pleroma/notifications/read" do +    setup do: oauth_access(["write:notifications"]) + +    test "it marks a single notification as read", %{user: user1, conn: conn} do +      user2 = insert(:user) +      {:ok, activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) +      {:ok, activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) +      {:ok, [notification1]} = Notification.create_notifications(activity1) +      {:ok, [notification2]} = Notification.create_notifications(activity2) + +      response = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/v1/pleroma/notifications/read", %{id: notification1.id}) +        |> json_response_and_validate_schema(:ok) + +      assert %{"pleroma" => %{"is_seen" => true}} = response +      assert Repo.get(Notification, notification1.id).seen +      refute Repo.get(Notification, notification2.id).seen +    end + +    test "it marks multiple notifications as read", %{user: user1, conn: conn} do +      user2 = insert(:user) +      {:ok, _activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) +      {:ok, _activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) +      {:ok, _activity3} = CommonAPI.post(user2, %{status: "HIE @#{user1.nickname}"}) + +      [notification3, notification2, notification1] = Notification.for_user(user1, %{limit: 3}) + +      [response1, response2] = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/v1/pleroma/notifications/read", %{max_id: notification2.id}) +        |> json_response_and_validate_schema(:ok) + +      assert %{"pleroma" => %{"is_seen" => true}} = response1 +      assert %{"pleroma" => %{"is_seen" => true}} = response2 +      assert Repo.get(Notification, notification1.id).seen +      assert Repo.get(Notification, notification2.id).seen +      refute Repo.get(Notification, notification3.id).seen +    end + +    test "it returns error when notification not found", %{conn: conn} do +      response = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/v1/pleroma/notifications/read", %{ +          id: 22_222_222_222_222 +        }) +        |> json_response_and_validate_schema(:bad_request) + +      assert response == %{"error" => "Cannot get notification"} +    end +  end +end diff --git a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs deleted file mode 100644 index cfd1dbd24..000000000 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ /dev/null @@ -1,302 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do -  use Oban.Testing, repo: Pleroma.Repo -  use Pleroma.Web.ConnCase - -  alias Pleroma.Conversation.Participation -  alias Pleroma.Notification -  alias Pleroma.Object -  alias Pleroma.Repo -  alias Pleroma.Tests.ObanHelpers -  alias Pleroma.User -  alias Pleroma.Web.CommonAPI - -  import Pleroma.Factory - -  test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do -    user = insert(:user) -    other_user = insert(:user) - -    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) - -    result = -      conn -      |> assign(:user, other_user) -      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) -      |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") -      |> json_response(200) - -    # We return the status, but this our implementation detail. -    assert %{"id" => id} = result -    assert to_string(activity.id) == id - -    assert result["pleroma"]["emoji_reactions"] == [ -             %{"name" => "☕", "count" => 1, "me" => true} -           ] -  end - -  test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do -    user = insert(:user) -    other_user = insert(:user) - -    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) -    {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") - -    ObanHelpers.perform_all() - -    result = -      conn -      |> assign(:user, other_user) -      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) -      |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") - -    assert %{"id" => id} = json_response(result, 200) -    assert to_string(activity.id) == id - -    ObanHelpers.perform_all() - -    object = Object.get_by_ap_id(activity.data["object"]) - -    assert object.data["reaction_count"] == 0 -  end - -  test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do -    user = insert(:user) -    other_user = insert(:user) -    doomed_user = insert(:user) - -    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) - -    result = -      conn -      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") -      |> json_response(200) - -    assert result == [] - -    {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") -    {:ok, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅") - -    User.perform(:delete, doomed_user) - -    result = -      conn -      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") -      |> json_response(200) - -    [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result - -    assert represented_user["id"] == other_user.id - -    result = -      conn -      |> assign(:user, other_user) -      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"])) -      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") -      |> json_response(200) - -    assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] = -             result -  end - -  test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do -    user = insert(:user) -    other_user = insert(:user) - -    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) - -    result = -      conn -      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") -      |> json_response(200) - -    assert result == [] - -    {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") -    {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") - -    result = -      conn -      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") -      |> json_response(200) - -    [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result - -    assert represented_user["id"] == other_user.id -  end - -  test "/api/v1/pleroma/conversations/:id" do -    user = insert(:user) -    %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) - -    {:ok, _activity} = -      CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) - -    [participation] = Participation.for_user(other_user) - -    result = -      conn -      |> get("/api/v1/pleroma/conversations/#{participation.id}") -      |> json_response(200) - -    assert result["id"] == participation.id |> to_string() -  end - -  test "/api/v1/pleroma/conversations/:id/statuses" do -    user = insert(:user) -    %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) -    third_user = insert(:user) - -    {:ok, _activity} = -      CommonAPI.post(user, %{status: "Hi @#{third_user.nickname}!", visibility: "direct"}) - -    {:ok, activity} = -      CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) - -    [participation] = Participation.for_user(other_user) - -    {:ok, activity_two} = -      CommonAPI.post(other_user, %{ -        status: "Hi!", -        in_reply_to_status_id: activity.id, -        in_reply_to_conversation_id: participation.id -      }) - -    result = -      conn -      |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses") -      |> json_response(200) - -    assert length(result) == 2 - -    id_one = activity.id -    id_two = activity_two.id -    assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result - -    {:ok, %{id: id_three}} = -      CommonAPI.post(other_user, %{ -        status: "Bye!", -        in_reply_to_status_id: activity.id, -        in_reply_to_conversation_id: participation.id -      }) - -    assert [%{"id" => ^id_two}, %{"id" => ^id_three}] = -             conn -             |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?limit=2") -             |> json_response(:ok) - -    assert [%{"id" => ^id_three}] = -             conn -             |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?min_id=#{id_two}") -             |> json_response(:ok) -  end - -  test "PATCH /api/v1/pleroma/conversations/:id" do -    %{user: user, conn: conn} = oauth_access(["write:conversations"]) -    other_user = insert(:user) - -    {:ok, _activity} = CommonAPI.post(user, %{status: "Hi", visibility: "direct"}) - -    [participation] = Participation.for_user(user) - -    participation = Repo.preload(participation, :recipients) - -    user = User.get_cached_by_id(user.id) -    assert [user] == participation.recipients -    assert other_user not in participation.recipients - -    result = -      conn -      |> patch("/api/v1/pleroma/conversations/#{participation.id}", %{ -        "recipients" => [user.id, other_user.id] -      }) -      |> json_response(200) - -    assert result["id"] == participation.id |> to_string - -    [participation] = Participation.for_user(user) -    participation = Repo.preload(participation, :recipients) - -    assert user in participation.recipients -    assert other_user in participation.recipients -  end - -  test "POST /api/v1/pleroma/conversations/read" do -    user = insert(:user) -    %{user: other_user, conn: conn} = oauth_access(["write:conversations"]) - -    {:ok, _activity} = -      CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) - -    {:ok, _activity} = -      CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) - -    [participation2, participation1] = Participation.for_user(other_user) -    assert Participation.get(participation2.id).read == false -    assert Participation.get(participation1.id).read == false -    assert User.get_cached_by_id(other_user.id).unread_conversation_count == 2 - -    [%{"unread" => false}, %{"unread" => false}] = -      conn -      |> post("/api/v1/pleroma/conversations/read", %{}) -      |> json_response(200) - -    [participation2, participation1] = Participation.for_user(other_user) -    assert Participation.get(participation2.id).read == true -    assert Participation.get(participation1.id).read == true -    assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0 -  end - -  describe "POST /api/v1/pleroma/notifications/read" do -    setup do: oauth_access(["write:notifications"]) - -    test "it marks a single notification as read", %{user: user1, conn: conn} do -      user2 = insert(:user) -      {:ok, activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) -      {:ok, activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) -      {:ok, [notification1]} = Notification.create_notifications(activity1) -      {:ok, [notification2]} = Notification.create_notifications(activity2) - -      response = -        conn -        |> post("/api/v1/pleroma/notifications/read", %{"id" => "#{notification1.id}"}) -        |> json_response(:ok) - -      assert %{"pleroma" => %{"is_seen" => true}} = response -      assert Repo.get(Notification, notification1.id).seen -      refute Repo.get(Notification, notification2.id).seen -    end - -    test "it marks multiple notifications as read", %{user: user1, conn: conn} do -      user2 = insert(:user) -      {:ok, _activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) -      {:ok, _activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) -      {:ok, _activity3} = CommonAPI.post(user2, %{status: "HIE @#{user1.nickname}"}) - -      [notification3, notification2, notification1] = Notification.for_user(user1, %{limit: 3}) - -      [response1, response2] = -        conn -        |> post("/api/v1/pleroma/notifications/read", %{"max_id" => "#{notification2.id}"}) -        |> json_response(:ok) - -      assert %{"pleroma" => %{"is_seen" => true}} = response1 -      assert %{"pleroma" => %{"is_seen" => true}} = response2 -      assert Repo.get(Notification, notification1.id).seen -      assert Repo.get(Notification, notification2.id).seen -      refute Repo.get(Notification, notification3.id).seen -    end - -    test "it returns error when notification not found", %{conn: conn} do -      response = -        conn -        |> post("/api/v1/pleroma/notifications/read", %{"id" => "22222222222222"}) -        |> json_response(:bad_request) - -      assert response == %{"error" => "Cannot get notification"} -    end -  end -end  | 
