diff options
| -rw-r--r-- | lib/pleroma/web/mastodon_api/views/status_view.ex | 8 | ||||
| -rw-r--r-- | test/support/factory.ex | 2 | ||||
| -rw-r--r-- | test/web/admin_api/admin_api_controller_test.exs | 1 | ||||
| -rw-r--r-- | test/web/mastodon_api/status_view_test.exs | 67 | 
4 files changed, 73 insertions, 5 deletions
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index a070bc942..06a7251d8 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -149,8 +149,14 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do      tags = object.data["tag"] || []      sensitive = object.data["sensitive"] || Enum.member?(tags, "nsfw") +    tag_mentions = +      tags +      |> Enum.filter(fn tag -> is_map(tag) and tag["type"] == "Mention" end) +      |> Enum.map(fn tag -> tag["href"] end) +      mentions = -      activity.recipients +      (object.data["to"] ++ tag_mentions) +      |> Enum.uniq()        |> Enum.map(fn ap_id -> User.get_cached_by_ap_id(ap_id) end)        |> Enum.filter(& &1)        |> Enum.map(fn user -> AccountView.render("mention.json", %{user: user}) end) diff --git a/test/support/factory.ex b/test/support/factory.ex index 0e3c900c9..a9f750eec 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -117,6 +117,7 @@ defmodule Pleroma.Factory do    def note_activity_factory(attrs \\ %{}) do      user = attrs[:user] || insert(:user)      note = attrs[:note] || insert(:note, user: user) +    attrs = Map.drop(attrs, [:user, :note])      data = %{        "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), @@ -133,6 +134,7 @@ defmodule Pleroma.Factory do        actor: data["actor"],        recipients: data["to"]      } +    |> Map.merge(attrs)    end    def article_activity_factory do diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 4ea33a6cc..0e04e7e94 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -1234,7 +1234,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        recipients = Enum.map(response["mentions"], & &1["username"]) -      assert conn.assigns[:user].nickname in recipients        assert reporter.nickname in recipients        assert response["content"] == "I will check it out"        assert response["visibility"] == "direct" diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs index 49b4c529f..ac42819d8 100644 --- a/test/web/mastodon_api/status_view_test.exs +++ b/test/web/mastodon_api/status_view_test.exs @@ -203,10 +203,71 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      status = StatusView.render("status.json", %{activity: activity}) -    actor = User.get_cached_by_ap_id(activity.actor) -      assert status.mentions == -             Enum.map([user, actor], fn u -> AccountView.render("mention.json", %{user: u}) end) +             Enum.map([user], fn u -> AccountView.render("mention.json", %{user: u}) end) +  end + +  test "create mentions from the 'to' field" do +    %User{ap_id: recipient_ap_id} = insert(:user) +    cc = insert_pair(:user) |> Enum.map(& &1.ap_id) + +    object = +      insert(:note, %{ +        data: %{ +          "to" => [recipient_ap_id], +          "cc" => cc +        } +      }) + +    activity = +      insert(:note_activity, %{ +        note: object, +        recipients: [recipient_ap_id | cc] +      }) + +    assert length(activity.recipients) == 3 + +    %{mentions: [mention] = mentions} = StatusView.render("status.json", %{activity: activity}) + +    assert length(mentions) == 1 +    assert mention.url == recipient_ap_id +  end + +  test "create mentions from the 'tag' field" do +    recipient = insert(:user) +    cc = insert_pair(:user) |> Enum.map(& &1.ap_id) + +    object = +      insert(:note, %{ +        data: %{ +          "cc" => cc, +          "tag" => [ +            %{ +              "href" => recipient.ap_id, +              "name" => recipient.nickname, +              "type" => "Mention" +            }, +            %{ +              "href" => "https://example.com/search?tag=test", +              "name" => "#test", +              "type" => "Hashtag" +            } +          ] +        } +      }) + +    activity = +      insert(:note_activity, %{ +        note: object, +        recipients: [recipient.ap_id | cc] +      }) + +    assert length(activity.recipients) == 3 + +    %{mentions: [mention] = mentions} = StatusView.render("status.json", %{activity: activity}) + +    assert length(mentions) == 1 +    assert mention.url == recipient.ap_id    end    test "attachments" do  | 
