c7a62be18fe1d37fa23708c673064ea16bc1a0ce
[anni] / test / pleroma / web / activity_pub / object_validators / article_note_page_validator_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest do
6   use Pleroma.DataCase, async: true
7
8   alias Pleroma.Web.ActivityPub.ObjectValidator
9   alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator
10   alias Pleroma.Web.ActivityPub.Utils
11
12   import Pleroma.Factory
13
14   describe "Notes" do
15     setup do
16       user = insert(:user)
17
18       note = %{
19         "id" => Utils.generate_activity_id(),
20         "type" => "Note",
21         "actor" => user.ap_id,
22         "to" => [user.follower_address],
23         "cc" => [],
24         "content" => "Hellow this is content.",
25         "context" => "xxx",
26         "summary" => "a post"
27       }
28
29       %{user: user, note: note}
30     end
31
32     test "a basic note validates", %{note: note} do
33       %{valid?: true} = ArticleNotePageValidator.cast_and_validate(note)
34     end
35
36     test "a note from factory validates" do
37       note = insert(:note)
38       %{valid?: true} = ArticleNotePageValidator.cast_and_validate(note.data)
39     end
40   end
41
42   describe "Note with history" do
43     setup do
44       user = insert(:user)
45       {:ok, activity} = Pleroma.Web.CommonAPI.post(user, %{status: "mew mew :dinosaur:"})
46       {:ok, edit} = Pleroma.Web.CommonAPI.update(user, activity, %{status: "edited :blank:"})
47
48       {:ok, %{"object" => external_rep}} =
49         Pleroma.Web.ActivityPub.Transmogrifier.prepare_outgoing(edit.data)
50
51       %{external_rep: external_rep}
52     end
53
54     test "edited note", %{external_rep: external_rep} do
55       assert %{"formerRepresentations" => %{"orderedItems" => [%{"tag" => [_]}]}} = external_rep
56
57       {:ok, validate_res, []} = ObjectValidator.validate(external_rep, [])
58
59       assert %{"formerRepresentations" => %{"orderedItems" => [%{"emoji" => %{"dinosaur" => _}}]}} =
60                validate_res
61     end
62
63     test "edited note, badly-formed formerRepresentations", %{external_rep: external_rep} do
64       external_rep = Map.put(external_rep, "formerRepresentations", %{})
65
66       assert {:error, _} = ObjectValidator.validate(external_rep, [])
67     end
68
69     test "edited note, badly-formed history item", %{external_rep: external_rep} do
70       history_item =
71         Enum.at(external_rep["formerRepresentations"]["orderedItems"], 0)
72         |> Map.put("type", "Foo")
73
74       external_rep =
75         put_in(
76           external_rep,
77           ["formerRepresentations", "orderedItems"],
78           [history_item]
79         )
80
81       assert {:error, _} = ObjectValidator.validate(external_rep, [])
82     end
83   end
84
85   test "a Note from Roadhouse validates" do
86     insert(:user, ap_id: "https://macgirvin.com/channel/mike")
87
88     %{"object" => note} =
89       "test/fixtures/roadhouse-create-activity.json"
90       |> File.read!()
91       |> Jason.decode!()
92
93     %{valid?: true} = ArticleNotePageValidator.cast_and_validate(note)
94   end
95
96   test "a note with an attachment should work", _ do
97     insert(:user, %{ap_id: "https://owncast.localhost.localdomain/federation/user/streamer"})
98
99     note =
100       "test/fixtures/owncast-note-with-attachment.json"
101       |> File.read!()
102       |> Jason.decode!()
103
104     %{valid?: true} = ArticleNotePageValidator.cast_and_validate(note)
105   end
106
107   test "a Note without replies/first/items validates" do
108     insert(:user, ap_id: "https://mastodon.social/users/emelie")
109
110     note =
111       "test/fixtures/tesla_mock/status.emelie.json"
112       |> File.read!()
113       |> Jason.decode!()
114       |> pop_in(["replies", "first", "items"])
115       |> elem(1)
116
117     %{valid?: true} = ArticleNotePageValidator.cast_and_validate(note)
118   end
119 end