ostatus_test.exs 16.4 KB
Newer Older
1
2
3
defmodule Pleroma.Web.OStatusTest do
  use Pleroma.DataCase
  alias Pleroma.Web.OStatus
4
  alias Pleroma.Web.XML
5
  alias Pleroma.{Object, Repo, User, Activity}
6
  import Pleroma.Factory
7

lain's avatar
lain committed
8
9
  test "don't insert create notes twice" do
    incoming = File.read!("test/fixtures/incoming_note_activity.xml")
10
11
    {:ok, [activity]} = OStatus.handle_incoming(incoming)
    assert {:ok, [activity]} == OStatus.handle_incoming(incoming)
lain's avatar
lain committed
12
13
  end

lain's avatar
lain committed
14
  test "handle incoming note - GS, Salmon" do
15
    incoming = File.read!("test/fixtures/incoming_note_activity.xml")
lain's avatar
lain committed
16
    {:ok, [activity]} = OStatus.handle_incoming(incoming)
17

18
19
    user = User.get_by_ap_id(activity.data["actor"])
    assert user.info["note_count"] == 1
20
21
    assert activity.data["type"] == "Create"
    assert activity.data["object"]["type"] == "Note"
22
    assert activity.data["object"]["id"] == "tag:gs.example.org:4040,2017-04-23:noticeId=29:objectType=note"
23
    assert activity.data["published"] == "2017-04-23T14:51:03+00:00"
lain's avatar
lain committed
24
    assert activity.data["object"]["published"] == "2017-04-23T14:51:03+00:00"
lain's avatar
lain committed
25
    assert activity.data["context"] == "tag:gs.example.org:4040,2017-04-23:objectType=thread:nonce=f09e22f58abd5c7b"
lain's avatar
lain committed
26
    assert "http://pleroma.example.org:4000/users/lain3" in activity.data["to"]
lain's avatar
lain committed
27
    assert activity.data["object"]["emoji"] == %{ "marko" => "marko.png", "reimu" => "reimu.png" }
lain's avatar
lain committed
28
    assert activity.local == false
29
30
  end

lain's avatar
lain committed
31
32
33
34
35
36
37
38
  test "handle incoming notes - GS, subscription" do
    incoming = File.read!("test/fixtures/ostatus_incoming_post.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Create"
    assert activity.data["object"]["type"] == "Note"
    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211"
    assert activity.data["object"]["content"] == "Will it blend?"
lain's avatar
lain committed
39
40
    user = User.get_cached_by_ap_id(activity.data["actor"])
    assert User.ap_followers(user) in activity.data["to"]
lain's avatar
lain committed
41
    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
lain's avatar
lain committed
42
43
  end

44
45
46
47
48
49
50
51
  test "handle incoming notes with attachments - GS, subscription" do
    incoming = File.read!("test/fixtures/incoming_websub_gnusocial_attachments.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Create"
    assert activity.data["object"]["type"] == "Note"
    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211"
    assert activity.data["object"]["attachment"] |> length == 2
lain's avatar
lain committed
52
    assert activity.data["object"]["external_url"] == "https://social.heldscal.la/notice/2020923"
lain's avatar
lain committed
53
    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
54
55
  end

lain's avatar
lain committed
56
57
58
59
60
  test "handle incoming notes with tags" do
    incoming = File.read!("test/fixtures/ostatus_incoming_post_tag.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)

    assert activity.data["object"]["tag"] == ["nsfw"]
lain's avatar
lain committed
61
    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
lain's avatar
lain committed
62
63
  end

lain's avatar
lain committed
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  test "handle incoming notes - Mastodon, salmon, reply" do
    # It uses the context of the replied to object
    Repo.insert!(%Object{
          data: %{
            "id" => "https://pleroma.soykaf.com/objects/c237d966-ac75-4fe3-a87a-d89d71a3a7a4",
            "context" => "2hu"
          }})
    incoming = File.read!("test/fixtures/incoming_reply_mastodon.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Create"
    assert activity.data["object"]["type"] == "Note"
    assert activity.data["object"]["actor"] == "https://mastodon.social/users/lambadalambda"
    assert activity.data["context"] == "2hu"
lain's avatar
lain committed
78
    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
lain's avatar
lain committed
79
80
  end

lain's avatar
lain committed
81
82
83
84
85
86
87
  test "handle incoming notes - Mastodon, with CW" do
    incoming = File.read!("test/fixtures/mastodon-note-cw.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Create"
    assert activity.data["object"]["type"] == "Note"
    assert activity.data["object"]["actor"] == "https://mastodon.social/users/lambadalambda"
lain's avatar
lain committed
88
    assert activity.data["object"]["summary"] == "technologic"
lain's avatar
lain committed
89
    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
lain's avatar
lain committed
90
91
  end

lain's avatar
lain committed
92
93
94
95
  test "handle incoming retweets - Mastodon, with CW" do
    incoming = File.read!("test/fixtures/cw_retweet.xml")
    {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)

lain's avatar
lain committed
96
    assert retweeted_activity.data["object"]["summary"] == "Hey."
lain's avatar
lain committed
97
98
  end

lain's avatar
lain committed
99
100
101
102
103
104
105
106
107
  test "handle incoming notes - GS, subscription, reply" do
    incoming = File.read!("test/fixtures/ostatus_incoming_reply.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Create"
    assert activity.data["object"]["type"] == "Note"
    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211"
    assert activity.data["object"]["content"] == "@<a href=\"https://gs.archae.me/user/4687\" class=\"h-card u-url p-nickname mention\" title=\"shpbot\">shpbot</a> why not indeed."
    assert activity.data["object"]["inReplyTo"] == "tag:gs.archae.me,2017-04-30:noticeId=778260:objectType=note"
lain's avatar
lain committed
108
    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
lain's avatar
lain committed
109
110
  end

lain's avatar
lain committed
111
112
113
114
115
116
117
  test "handle incoming retweets - GS, subscription" do
    incoming = File.read!("test/fixtures/share-gs.xml")
    {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Announce"
    assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
    assert activity.data["object"] == retweeted_activity.data["object"]["id"]
118
    assert "https://pleroma.soykaf.com/users/lain" in activity.data["to"]
lain's avatar
lain committed
119
    refute activity.local
120
121

    retweeted_activity = Repo.get(Activity, retweeted_activity.id)
lain's avatar
lain committed
122
123
124
    assert retweeted_activity.data["type"] == "Create"
    assert retweeted_activity.data["actor"] == "https://pleroma.soykaf.com/users/lain"
    refute retweeted_activity.local
125
    assert retweeted_activity.data["object"]["announcement_count"] == 1
lain's avatar
lain committed
126
    assert String.contains?(retweeted_activity.data["object"]["content"], "mastodon")
lain's avatar
lain committed
127
    refute String.contains?(retweeted_activity.data["object"]["content"], "Test account")
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  end

  test "handle incoming retweets - GS, subscription - local message" do
    incoming = File.read!("test/fixtures/share-gs-local.xml")
    note_activity = insert(:note_activity)
    user = User.get_cached_by_ap_id(note_activity.data["actor"])
    incoming = incoming
    |> String.replace("LOCAL_ID", note_activity.data["object"]["id"])
    |> String.replace("LOCAL_USER", user.ap_id)

    {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Announce"
    assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
    assert activity.data["object"] == retweeted_activity.data["object"]["id"]
    assert user.ap_id in activity.data["to"]
    refute activity.local

    retweeted_activity = Repo.get(Activity, retweeted_activity.id)
    assert note_activity.id == retweeted_activity.id
    assert retweeted_activity.data["type"] == "Create"
    assert retweeted_activity.data["actor"] == user.ap_id
    assert retweeted_activity.local
    assert retweeted_activity.data["object"]["announcement_count"] == 1
lain's avatar
lain committed
152
153
154
155
156
157
158
159
160
  end

  test "handle incoming retweets - Mastodon, salmon" do
    incoming = File.read!("test/fixtures/share.xml")
    {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Announce"
    assert activity.data["actor"] == "https://mastodon.social/users/lambadalambda"
    assert activity.data["object"] == retweeted_activity.data["object"]["id"]
lain's avatar
lain committed
161
162
    assert activity.data["id"] == "tag:mastodon.social,2017-05-03:objectId=4934452:objectType=Status"

lain's avatar
lain committed
163
164
165
166
    refute activity.local
    assert retweeted_activity.data["type"] == "Create"
    assert retweeted_activity.data["actor"] == "https://pleroma.soykaf.com/users/lain"
    refute retweeted_activity.local
lain's avatar
lain committed
167
    refute String.contains?(retweeted_activity.data["object"]["content"], "Test account")
lain's avatar
lain committed
168
169
  end

170
171
  test "handle incoming favorites - GS, websub" do
    incoming = File.read!("test/fixtures/favorite.xml")
172
    {:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming)
173
174
175

    assert activity.data["type"] == "Like"
    assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
176
    assert activity.data["object"] == favorited_activity.data["object"]["id"]
lain's avatar
lain committed
177
178
    assert activity.data["id"] == "tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00"

179
    refute activity.local
180
181
182
183
184
185
    assert favorited_activity.data["type"] == "Create"
    assert favorited_activity.data["actor"] == "https://shitposter.club/user/1"
    assert favorited_activity.data["object"]["id"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
    refute favorited_activity.local
  end

lain's avatar
lain committed
186
187
188
189
190
191
192
  test "handle conversation references" do
    incoming = File.read!("test/fixtures/mastodon_conversation.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)

    assert activity.data["context"] == "tag:mastodon.social,2017-08-28:objectId=7876885:objectType=Conversation"
  end

193
194
195
196
197
198
199
200
201
202
203
204
205
206
  test "handle incoming favorites with locally available object - GS, websub" do
    note_activity = insert(:note_activity)

    incoming = File.read!("test/fixtures/favorite_with_local_note.xml")
    |> String.replace("localid", note_activity.data["object"]["id"])

    {:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming)

    assert activity.data["type"] == "Like"
    assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
    assert activity.data["object"] == favorited_activity.data["object"]["id"]
    refute activity.local
    assert note_activity.id == favorited_activity.id
    assert favorited_activity.local
207
208
  end

lain's avatar
lain committed
209
210
  test "handle incoming replies" do
    incoming = File.read!("test/fixtures/incoming_note_activity_answer.xml")
lain's avatar
lain committed
211
    {:ok, [activity]} = OStatus.handle_incoming(incoming)
lain's avatar
lain committed
212
213
214
215
216

    assert activity.data["type"] == "Create"
    assert activity.data["object"]["type"] == "Note"
    assert activity.data["object"]["inReplyTo"] == "http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc"
    assert "http://pleroma.example.org:4000/users/lain5" in activity.data["to"]
lain's avatar
lain committed
217
    assert activity.data["object"]["id"] == "tag:gs.example.org:4040,2017-04-25:noticeId=55:objectType=note"
lain's avatar
lain committed
218
    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
lain's avatar
lain committed
219
220
  end

lain's avatar
lain committed
221
222
223
224
225
226
227
228
229
  test "handle incoming follows" do
    incoming = File.read!("test/fixtures/follow.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)
    assert activity.data["type"] == "Follow"
    assert activity.data["id"] == "tag:social.heldscal.la,2017-05-07:subscription:23211:person:44803:2017-05-07T09:54:48+00:00"
    assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
    assert activity.data["object"] == "https://pawoo.net/users/pekorino"
    refute activity.local

lain's avatar
lain committed
230
231
    follower = User.get_by_ap_id(activity.data["actor"])
    followed = User.get_by_ap_id(activity.data["object"])
lain's avatar
lain committed
232
233
234
235

    assert User.following?(follower, followed)
  end

236
  describe "new remote user creation" do
lain's avatar
lain committed
237
238
239
240
241
242
243
    test "returns local users" do
      local_user = insert(:user)
      {:ok, user} = OStatus.find_or_make_user(local_user.ap_id)

      assert user == local_user
    end

244
    test "tries to use the information in poco fields" do
lain's avatar
lain committed
245
      uri = "https://social.heldscal.la/user/23211"
246

lain's avatar
lain committed
247
      {:ok, user} = OStatus.find_or_make_user(uri)
248

lain's avatar
lain committed
249
      user = Repo.get(Pleroma.User, user.id)
250
      assert user.name == "Constance Variable"
lain's avatar
lain committed
251
      assert user.nickname == "lambadalambda@social.heldscal.la"
252
      assert user.local == false
lain's avatar
lain committed
253
254
      assert user.info["uri"] == uri
      assert user.ap_id == uri
255
      assert user.bio == "Call me Deacon Blues."
lain's avatar
lain committed
256
      assert user.avatar["type"] == "Image"
257

lain's avatar
lain committed
258
      {:ok, user_again} = OStatus.find_or_make_user(uri)
259
260
261

      assert user == user_again
    end
262
263
264
265
266

    test "find_make_or_update_user takes an author element and returns an updated user" do
      uri = "https://social.heldscal.la/user/23211"

      {:ok, user} = OStatus.find_or_make_user(uri)
267
268
269
      old_name = user.name
      old_bio = user.bio
      change = Ecto.Changeset.change(user, %{avatar: nil, bio: nil, old_name: nil})
270
271
272
273
274
275
276
277

      {:ok, user} = Repo.update(change)
      refute user.avatar

      doc = XML.parse_document(File.read!("test/fixtures/23211.atom"))
      [author] = :xmerl_xpath.string('//author[1]', doc)
      {:ok, user} = OStatus.find_make_or_update_user(author)
      assert user.avatar["type"] == "Image"
278
279
      assert user.name == old_name
      assert user.bio == old_bio
280
281
282
283

      {:ok, user_again} = OStatus.find_make_or_update_user(author)
      assert user_again == user
    end
284
  end
lain's avatar
lain committed
285
286
287
288
289
290
291
292
293

  describe "gathering user info from a user id" do
    test "it returns user info in a hash" do
      user = "shp@social.heldscal.la"

      # TODO: make test local
      {:ok, data} = OStatus.gather_user_info(user)

      expected = %{
294
295
296
297
298
299
300
301
302
303
        "hub" => "https://social.heldscal.la/main/push/hub",
        "magic_key" => "RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB",
        "name" => "shp",
        "nickname" => "shp",
        "salmon" => "https://social.heldscal.la/main/salmon/user/29191",
        "subject" => "acct:shp@social.heldscal.la",
        "topic" => "https://social.heldscal.la/api/statuses/user_timeline/29191.atom",
        "uri" => "https://social.heldscal.la/user/29191",
        "host" => "social.heldscal.la",
        "fqn" => user,
304
        "bio" => "cofe",
eal's avatar
eal committed
305
306
        "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", "mediaType" => "image/jpeg", "type" => "Link"}]},
        "subscribe_address" => "https://social.heldscal.la/main/ostatussub?profile={uri}"
lain's avatar
lain committed
307
308
309
      }
      assert data == expected
    end
lain's avatar
lain committed
310
311
312
313
314
315
316
317

    test "it works with the uri" do
      user = "https://social.heldscal.la/user/29191"

      # TODO: make test local
      {:ok, data} = OStatus.gather_user_info(user)

      expected = %{
318
319
320
321
322
323
324
325
326
327
        "hub" => "https://social.heldscal.la/main/push/hub",
        "magic_key" => "RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB",
        "name" => "shp",
        "nickname" => "shp",
        "salmon" => "https://social.heldscal.la/main/salmon/user/29191",
        "subject" => "https://social.heldscal.la/user/29191",
        "topic" => "https://social.heldscal.la/api/statuses/user_timeline/29191.atom",
        "uri" => "https://social.heldscal.la/user/29191",
        "host" => "social.heldscal.la",
        "fqn" => user,
328
        "bio" => "cofe",
eal's avatar
eal committed
329
330
        "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", "mediaType" => "image/jpeg", "type" => "Link"}]},
        "subscribe_address" => "https://social.heldscal.la/main/ostatussub?profile={uri}"
lain's avatar
lain committed
331
332
333
      }
      assert data == expected
    end
lain's avatar
lain committed
334
  end
335
336
337
338

  describe "fetching a status by it's HTML url" do
    test "it builds a missing status from an html url" do
      url = "https://shitposter.club/notice/2827873"
lain's avatar
lain committed
339
      {:ok, [activity] } = OStatus.fetch_activity_from_url(url)
340
341
342

      assert activity.data["actor"] == "https://shitposter.club/user/1"
      assert activity.data["object"]["id"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
lain's avatar
lain committed
343
    end
lain's avatar
lain committed
344
345
346
347
348
349
350

    test "it works for atom notes, too" do
      url = "https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056"
      {:ok, [activity] } = OStatus.fetch_activity_from_url(url)
      assert activity.data["actor"] == "https://social.sakamoto.gq/users/eal"
      assert activity.data["object"]["id"] == url
    end
351
  end
352
353
354
355
356
357
358

  test "insert or update a user from given data" do
    user = insert(:user, %{nickname: "nick@name.de"})
    data = %{ ap_id: user.ap_id <> "xxx", name: user.name, nickname: user.nickname }

    assert {:ok, %User{}} = OStatus.insert_or_update_user(data)
  end
lain's avatar
lain committed
359
360
361
362
363
364
365

  test "it doesn't add nil in the do field" do
    incoming = File.read!("test/fixtures/nil_mention_entry.xml")
    {:ok, [activity]} = OStatus.handle_incoming(incoming)

    assert activity.data["to"] == ["http://localhost:4001/users/atarifrosch@social.stopwatchingus-heidelberg.de/followers", "https://www.w3.org/ns/activitystreams#Public"]
  end
366
end