From: Ivan Tashkinov <ivantashkinov@gmail.com>
Date: Sun, 27 Dec 2020 21:08:09 +0000 (+0300)
Subject: [#3213] Made Object.hashtags/1 work with :hashtags assoc. Adjusted tests.
X-Git-Url: https://git.squeep.com/?a=commitdiff_plain;h=14fae94c0e4b04123c7af148260d0a4a51042570;p=akkoma

[#3213] Made Object.hashtags/1 work with :hashtags assoc. Adjusted tests.
---

diff --git a/lib/pleroma/config.ex b/lib/pleroma/config.ex
index 86d4f6b72..ee0167f4e 100644
--- a/lib/pleroma/config.ex
+++ b/lib/pleroma/config.ex
@@ -96,6 +96,8 @@ defmodule Pleroma.Config do
     end
   end
 
+  def object_embedded_hashtags?, do: !get([:instance, :improved_hashtag_timeline])
+
   def oauth_consumer_strategies, do: get([:auth, :oauth_consumer_strategies], [])
 
   def oauth_consumer_enabled?, do: oauth_consumer_strategies() != []
diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex
index 1d756bcd1..08114d4f2 100644
--- a/lib/pleroma/object.ex
+++ b/lib/pleroma/object.ex
@@ -384,7 +384,19 @@ defmodule Pleroma.Object do
 
   def tags(_), do: []
 
-  def hashtags(object), do: embedded_hashtags(object)
+  def hashtags(%Object{} = object) do
+    cond do
+      Config.object_embedded_hashtags?() ->
+        embedded_hashtags(object)
+
+      object.id == "pleroma:fake_object_id" ->
+        []
+
+      true ->
+        hashtag_records = Repo.preload(object, :hashtags).hashtags
+        Enum.map(hashtag_records, & &1.name)
+    end
+  end
 
   defp embedded_hashtags(%Object{data: data}) do
     object_data_hashtags(data)
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 54d1a2350..626cad336 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -1199,16 +1199,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       |> exclude_invisible_actors(opts)
       |> exclude_visibility(opts)
 
-    if Config.get([:instance, :improved_hashtag_timeline]) do
-      query
-      |> restrict_hashtag_any(opts)
-      |> restrict_hashtag_all(opts)
-      |> restrict_hashtag_reject_any(opts)
-    else
+    if Config.object_embedded_hashtags?() do
       query
       |> restrict_tag(opts)
       |> restrict_tag_reject(opts)
       |> restrict_tag_all(opts)
+    else
+      query
+      |> restrict_hashtag_any(opts)
+      |> restrict_hashtag_all(opts)
+      |> restrict_hashtag_reject_any(opts)
     end
   end
 
diff --git a/test/pleroma/activity/ir/topics_test.exs b/test/pleroma/activity/ir/topics_test.exs
index b464822d9..984777bda 100644
--- a/test/pleroma/activity/ir/topics_test.exs
+++ b/test/pleroma/activity/ir/topics_test.exs
@@ -11,6 +11,8 @@ defmodule Pleroma.Activity.Ir.TopicsTest do
 
   require Pleroma.Constants
 
+  import Mock
+
   describe "poll answer" do
     test "produce no topics" do
       activity = %Activity{object: %Object{data: %{"type" => "Answer"}}}
@@ -77,14 +79,13 @@ defmodule Pleroma.Activity.Ir.TopicsTest do
       refute Enum.member?(topics, "public:local:media")
     end
 
-    test "converts tags to hash tags", %{activity: %{object: %{data: data} = object} = activity} do
-      tagged_data = Map.put(data, "tag", ["foo", "bar"])
-      activity = %{activity | object: %{object | data: tagged_data}}
-
-      topics = Topics.get_activity_topics(activity)
+    test "converts tags to hash tags", %{activity: activity} do
+      with_mock(Object, [:passthrough], hashtags: fn _ -> ["foo", "bar"] end) do
+        topics = Topics.get_activity_topics(activity)
 
-      assert Enum.member?(topics, "hashtag:foo")
-      assert Enum.member?(topics, "hashtag:bar")
+        assert Enum.member?(topics, "hashtag:foo")
+        assert Enum.member?(topics, "hashtag:bar")
+      end
     end
 
     test "only converts strings to hash tags", %{