1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Activity.Ir.TopicsTest do
6 use Pleroma.DataCase, async: true
9 alias Pleroma.Activity.Ir.Topics
12 require Pleroma.Constants
16 describe "chat message" do
17 test "Create produces no topics" do
19 object: %Object{data: %{"type" => "ChatMessage"}},
20 data: %{"type" => "Create"}
23 assert [] == Topics.get_activity_topics(activity)
26 test "Delete produces user and user:pleroma_chat" do
28 object: %Object{data: %{"type" => "ChatMessage"}},
29 data: %{"type" => "Delete"}
32 topics = Topics.get_activity_topics(activity)
33 assert [_, _] = topics
34 assert "user" in topics
35 assert "user:pleroma_chat" in topics
39 describe "poll answer" do
40 test "produce no topics" do
41 activity = %Activity{object: %Object{data: %{"type" => "Answer"}}}
43 assert [] == Topics.get_activity_topics(activity)
47 describe "non poll answer" do
48 test "always add user and list topics" do
49 activity = %Activity{object: %Object{data: %{"type" => "FooBar"}}}
50 topics = Topics.get_activity_topics(activity)
52 assert Enum.member?(topics, "user")
53 assert Enum.member?(topics, "list")
57 describe "public visibility" do
60 object: %Object{data: %{"type" => "Note"}},
61 data: %{"to" => [Pleroma.Constants.as_public()], "type" => "Create"}
64 {:ok, activity: activity}
67 test "produces public topic", %{activity: activity} do
68 topics = Topics.get_activity_topics(activity)
70 assert Enum.member?(topics, "public")
73 test "local action produces public:local topic", %{activity: activity} do
74 activity = %{activity | local: true}
75 topics = Topics.get_activity_topics(activity)
77 assert Enum.member?(topics, "public:local")
80 test "non-local action does not produce public:local topic", %{activity: activity} do
81 activity = %{activity | local: false}
82 topics = Topics.get_activity_topics(activity)
84 refute Enum.member?(topics, "public:local")
88 describe "public visibility create events" do
91 object: %Object{data: %{"attachment" => []}},
92 data: %{"type" => "Create", "to" => [Pleroma.Constants.as_public()]}
95 {:ok, activity: activity}
98 test "with no attachments doesn't produce public:media topics", %{activity: activity} do
99 topics = Topics.get_activity_topics(activity)
101 refute Enum.member?(topics, "public:media")
102 refute Enum.member?(topics, "public:local:media")
105 test "converts tags to hash tags", %{activity: activity} do
106 with_mock(Object, [:passthrough], hashtags: fn _ -> ["foo", "bar"] end) do
107 topics = Topics.get_activity_topics(activity)
109 assert Enum.member?(topics, "hashtag:foo")
110 assert Enum.member?(topics, "hashtag:bar")
114 test "only converts strings to hash tags", %{
115 activity: %{object: %{data: data} = object} = activity
117 tagged_data = Map.put(data, "tag", [2])
118 activity = %{activity | object: %{object | data: tagged_data}}
120 topics = Topics.get_activity_topics(activity)
122 refute Enum.member?(topics, "hashtag:2")
125 test "non-local action produces public:remote topic", %{activity: activity} do
126 activity = %{activity | local: false, actor: "https://lain.com/users/lain"}
127 topics = Topics.get_activity_topics(activity)
129 assert Enum.member?(topics, "public:remote:lain.com")
132 test "local action doesn't produce public:remote topic", %{activity: activity} do
133 activity = %{activity | local: true, actor: "https://lain.com/users/lain"}
134 topics = Topics.get_activity_topics(activity)
136 refute Enum.member?(topics, "public:remote:lain.com")
140 describe "public visibility Announces" do
142 activity = %Activity{
143 object: %Object{data: %{"attachment" => []}},
144 data: %{"type" => "Announce", "to" => [Pleroma.Constants.as_public()]}
147 {:ok, activity: activity}
150 test "does not generate public topics", %{activity: activity} do
151 topics = Topics.get_activity_topics(activity)
153 refute "public" in topics
154 refute "public:remote" in topics
155 refute "public:local" in topics
159 describe "local-public visibility create events" do
161 activity = %Activity{
162 object: %Object{data: %{"attachment" => []}},
163 data: %{"type" => "Create", "to" => [Pleroma.Web.ActivityPub.Utils.as_local_public()]}
166 {:ok, activity: activity}
169 test "doesn't produce public topics", %{activity: activity} do
170 topics = Topics.get_activity_topics(activity)
172 refute Enum.member?(topics, "public")
175 test "produces public:local topics", %{activity: activity} do
176 topics = Topics.get_activity_topics(activity)
178 assert Enum.member?(topics, "public:local")
181 test "with no attachments doesn't produce public:media topics", %{activity: activity} do
182 topics = Topics.get_activity_topics(activity)
184 refute Enum.member?(topics, "public:media")
185 refute Enum.member?(topics, "public:local:media")
189 describe "public visibility create events with attachments" do
191 activity = %Activity{
192 object: %Object{data: %{"attachment" => ["foo"]}},
193 data: %{"type" => "Create", "to" => [Pleroma.Constants.as_public()]}
196 {:ok, activity: activity}
199 test "produce public:media topics", %{activity: activity} do
200 topics = Topics.get_activity_topics(activity)
202 assert Enum.member?(topics, "public:media")
205 test "local produces public:local:media topics", %{activity: activity} do
206 topics = Topics.get_activity_topics(activity)
208 assert Enum.member?(topics, "public:local:media")
211 test "non-local doesn't produce public:local:media topics", %{activity: activity} do
212 activity = %{activity | local: false}
214 topics = Topics.get_activity_topics(activity)
216 refute Enum.member?(topics, "public:local:media")
219 test "non-local action produces public:remote:media topic", %{activity: activity} do
220 activity = %{activity | local: false, actor: "https://lain.com/users/lain"}
221 topics = Topics.get_activity_topics(activity)
223 assert Enum.member?(topics, "public:remote:media:lain.com")
227 describe "local-public visibility create events with attachments" do
229 activity = %Activity{
230 object: %Object{data: %{"attachment" => ["foo"]}},
231 data: %{"type" => "Create", "to" => [Pleroma.Web.ActivityPub.Utils.as_local_public()]}
234 {:ok, activity: activity}
237 test "do not produce public:media topics", %{activity: activity} do
238 topics = Topics.get_activity_topics(activity)
240 refute Enum.member?(topics, "public:media")
243 test "produces public:local:media topics", %{activity: activity} do
244 topics = Topics.get_activity_topics(activity)
246 assert Enum.member?(topics, "public:local:media")
250 describe "non-public visibility" do
251 test "produces direct topic" do
252 activity = %Activity{
253 object: %Object{data: %{"type" => "Note"}},
254 data: %{"to" => [], "type" => "Create"}
257 topics = Topics.get_activity_topics(activity)
259 assert Enum.member?(topics, "direct")
260 refute Enum.member?(topics, "public")
261 refute Enum.member?(topics, "public:local")
262 refute Enum.member?(topics, "public:media")
263 refute Enum.member?(topics, "public:local:media")