utils_test.exs 21.9 KB
Newer Older
kaniini's avatar
kaniini committed
1
# Pleroma: A lightweight social networking server
Haelwenn's avatar
Haelwenn committed
2
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
kaniini's avatar
kaniini committed
3 4
# SPDX-License-Identifier: AGPL-3.0-only

5
defmodule Pleroma.Web.CommonAPI.UtilsTest do
6
  alias Pleroma.Builders.UserBuilder
kaniini's avatar
kaniini committed
7
  alias Pleroma.Object
lain's avatar
lain committed
8
  alias Pleroma.Web.CommonAPI
minibikini's avatar
minibikini committed
9
  alias Pleroma.Web.CommonAPI.ActivityDraft
10
  alias Pleroma.Web.CommonAPI.Utils
lain's avatar
lain committed
11 12
  use Pleroma.DataCase

13
  import ExUnit.CaptureLog
lain's avatar
lain committed
14 15 16 17
  import Pleroma.Factory

  @public_address "https://www.w3.org/ns/activitystreams#Public"

18 19 20 21
  describe "add_attachments/2" do
    setup do
      name =
        "Sakura Mana – Turned on by a Senior OL with a Temptating Tight Skirt-s Full Hipline and Panty Shot- Beautiful Thick Thighs- and Erotic Ass- -2015- -- Oppaitime 8-28-2017 6-50-33 PM.png"
lain's avatar
lain committed
22

23 24 25
      attachment = %{
        "url" => [%{"href" => URI.encode(name)}]
      }
lain's avatar
lain committed
26

27 28
      %{name: name, attachment: attachment}
    end
lain's avatar
lain committed
29

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
    test "it adds attachment links to a given text and attachment set", %{
      name: name,
      attachment: attachment
    } do
      len = 10
      clear_config([Pleroma.Upload, :filename_display_max_length], len)

      expected =
        "<br><a href=\"#{URI.encode(name)}\" class='attachment'>#{String.slice(name, 0..len)}…</a>"

      assert Utils.add_attachments("", [attachment]) == expected
    end

    test "doesn't truncate file name if config for truncate is set to 0", %{
      name: name,
      attachment: attachment
    } do
      clear_config([Pleroma.Upload, :filename_display_max_length], 0)

      expected = "<br><a href=\"#{URI.encode(name)}\" class='attachment'>#{name}</a>"

      assert Utils.add_attachments("", [attachment]) == expected
    end
lain's avatar
lain committed
53
  end
54 55

  describe "it confirms the password given is the current users password" do
Syldexia's avatar
Syldexia committed
56
    test "incorrect password given" do
57 58
      {:ok, user} = UserBuilder.insert()

Syldexia's avatar
Syldexia committed
59
      assert Utils.confirm_current_password(user, "") == {:error, "Invalid password."}
60 61
    end

Syldexia's avatar
Syldexia committed
62
    test "correct password given" do
63
      {:ok, user} = UserBuilder.insert()
Syldexia's avatar
Syldexia committed
64
      assert Utils.confirm_current_password(user, "test") == {:ok, user}
65 66
    end
  end
67

minibikini's avatar
minibikini committed
68
  describe "format_input/3" do
69 70 71 72
    test "works for bare text/plain" do
      text = "hello world!"
      expected = "hello world!"

minibikini's avatar
minibikini committed
73
      {output, [], []} = Utils.format_input(text, "text/plain")
74 75 76 77 78 79

      assert output == expected

      text = "hello world!\n\nsecond paragraph!"
      expected = "hello world!<br><br>second paragraph!"

minibikini's avatar
minibikini committed
80
      {output, [], []} = Utils.format_input(text, "text/plain")
81 82 83 84 85 86 87 88

      assert output == expected
    end

    test "works for bare text/html" do
      text = "<p>hello world!</p>"
      expected = "<p>hello world!</p>"

minibikini's avatar
minibikini committed
89
      {output, [], []} = Utils.format_input(text, "text/html")
90 91 92

      assert output == expected

93 94
      text = "<p>hello world!</p><br/>\n<p>second paragraph</p>"
      expected = "<p>hello world!</p><br/>\n<p>second paragraph</p>"
95

minibikini's avatar
minibikini committed
96
      {output, [], []} = Utils.format_input(text, "text/html")
97 98 99 100 101 102

      assert output == expected
    end

    test "works for bare text/markdown" do
      text = "**hello world**"
103
      expected = "<p><strong>hello world</strong></p>"
104

minibikini's avatar
minibikini committed
105
      {output, [], []} = Utils.format_input(text, "text/markdown")
106 107 108 109

      assert output == expected

      text = "**hello world**\n\n*another paragraph*"
110
      expected = "<p><strong>hello world</strong></p><p><em>another paragraph</em></p>"
111

minibikini's avatar
minibikini committed
112 113 114
      {output, [], []} = Utils.format_input(text, "text/markdown")

      assert output == expected
minibikini's avatar
minibikini committed
115 116 117 118 119 120 121

      text = """
      > cool quote

      by someone
      """

122
      expected = "<blockquote><p>cool quote</p></blockquote><p>by someone</p>"
minibikini's avatar
minibikini committed
123 124 125 126

      {output, [], []} = Utils.format_input(text, "text/markdown")

      assert output == expected
minibikini's avatar
minibikini committed
127 128
    end

kaniini's avatar
kaniini committed
129 130 131 132 133 134 135 136 137
    test "works for bare text/bbcode" do
      text = "[b]hello world[/b]"
      expected = "<strong>hello world</strong>"

      {output, [], []} = Utils.format_input(text, "text/bbcode")

      assert output == expected

      text = "[b]hello world![/b]\n\nsecond paragraph!"
138
      expected = "<strong>hello world!</strong><br><br>second paragraph!"
139 140 141 142 143 144 145 146

      {output, [], []} = Utils.format_input(text, "text/bbcode")

      assert output == expected

      text = "[b]hello world![/b]\n\n<strong>second paragraph!</strong>"

      expected =
147
        "<strong>hello world!</strong><br><br>&lt;strong&gt;second paragraph!&lt;/strong&gt;"
kaniini's avatar
kaniini committed
148 149 150 151 152 153

      {output, [], []} = Utils.format_input(text, "text/bbcode")

      assert output == expected
    end

minibikini's avatar
minibikini committed
154 155 156 157 158 159 160
    test "works for text/markdown with mentions" do
      {:ok, user} =
        UserBuilder.insert(%{nickname: "user__test", ap_id: "http://foo.com/user__test"})

      text = "**hello world**\n\n*another @user__test and @user__test google.com paragraph*"

      {output, _, _} = Utils.format_input(text, "text/markdown")
161

162
      assert output ==
163
               ~s(<p><strong>hello world</strong></p><p><em>another <span class="h-card"><a class="u-url mention" data-user="#{
164
                 user.id
165
               }" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> and <span class="h-card"><a class="u-url mention" data-user="#{
166
                 user.id
167
               }" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> <a href="http://google.com" rel="ugc">google.com</a> paragraph</em></p>)
168 169
    end
  end
170

Alex Gleason's avatar
Alex Gleason committed
171 172 173 174 175 176 177
  describe "format_input/3 with markdown" do
    test "Paragraph" do
      code = ~s[Hello\n\nWorld!]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == "<p>Hello</p><p>World!</p>"
    end

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
    test "links" do
      code = "https://en.wikipedia.org/wiki/Animal_Crossing_(video_game)"
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == ~s[<p><a href="#{code}">#{code}</a></p>]

      code = "https://github.com/pragdave/earmark/"
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == ~s[<p><a href="#{code}">#{code}</a></p>]
    end

    test "link with local mention" do
      insert(:user, %{nickname: "lain"})

      code = "https://example.com/@lain"
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == ~s[<p><a href="#{code}">#{code}</a></p>]
    end

    test "local mentions" do
      mario = insert(:user, %{nickname: "mario"})
      luigi = insert(:user, %{nickname: "luigi"})

      code = "@mario @luigi yo what's up?"
      {result, _, []} = Utils.format_input(code, "text/markdown")

      assert result ==
               ~s[<p><span class="h-card"><a class="u-url mention" data-user="#{mario.id}" href="#{
                 mario.ap_id
               }" rel="ugc">@<span>mario</span></a></span> <span class="h-card"><a class="u-url mention" data-user="#{
                 luigi.id
               }" href="#{luigi.ap_id}" rel="ugc">@<span>luigi</span></a></span> yo what’s up?</p>]
    end

    test "remote mentions" do
212 213
      mario = insert(:user, %{nickname: "mario@mushroom.world", local: false})
      luigi = insert(:user, %{nickname: "luigi@mushroom.world", local: false})
214

215
      code = "@mario@mushroom.world @luigi@mushroom.world yo what's up?"
216 217 218 219 220 221 222 223 224 225
      {result, _, []} = Utils.format_input(code, "text/markdown")

      assert result ==
               ~s[<p><span class="h-card"><a class="u-url mention" data-user="#{mario.id}" href="#{
                 mario.ap_id
               }" rel="ugc">@<span>mario</span></a></span> <span class="h-card"><a class="u-url mention" data-user="#{
                 luigi.id
               }" href="#{luigi.ap_id}" rel="ugc">@<span>luigi</span></a></span> yo what’s up?</p>]
    end

Alex Gleason's avatar
Alex Gleason committed
226 227 228
    test "raw HTML" do
      code = ~s[<a href="http://example.org/">OwO</a><!-- what's this?-->]
      {result, [], []} = Utils.format_input(code, "text/markdown")
229
      assert result == ~s[<a href="http://example.org/">OwO</a>]
Alex Gleason's avatar
Alex Gleason committed
230 231 232 233 234
    end

    test "rulers" do
      code = ~s[before\n\n-----\n\nafter]
      {result, [], []} = Utils.format_input(code, "text/markdown")
235
      assert result == "<p>before</p><hr/><p>after</p>"
Alex Gleason's avatar
Alex Gleason committed
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
    end

    test "blockquote" do
      code = ~s[> whoms't are you quoting?]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == "<blockquote><p>whoms’t are you quoting?</p></blockquote>"
    end

    test "code" do
      code = ~s[`mix`]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == ~s[<p><code class="inline">mix</code></p>]

      code = ~s[``mix``]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == ~s[<p><code class="inline">mix</code></p>]

      code = ~s[```\nputs "Hello World"\n```]
      {result, [], []} = Utils.format_input(code, "text/markdown")
255
      assert result == ~s[<pre><code>puts &quot;Hello World&quot;</code></pre>]
256 257 258 259

      code = ~s[    <div>\n    </div>]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == ~s[<pre><code>&lt;div&gt;\n&lt;/div&gt;</code></pre>]
Alex Gleason's avatar
Alex Gleason committed
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
    end

    test "lists" do
      code = ~s[- one\n- two\n- three\n- four]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == "<ul><li>one</li><li>two</li><li>three</li><li>four</li></ul>"

      code = ~s[1. one\n2. two\n3. three\n4. four\n]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == "<ol><li>one</li><li>two</li><li>three</li><li>four</li></ol>"
    end

    test "delegated renderers" do
      code = ~s[*aaaa~*]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == ~s[<p><em>aaaa~</em></p>]

      code = ~s[**aaaa~**]
      {result, [], []} = Utils.format_input(code, "text/markdown")
      assert result == ~s[<p><strong>aaaa~</strong></p>]

Alex Gleason's avatar
Alex Gleason committed
281
      # strikethrough
282
      code = ~s[~~aaaa~~~]
Alex Gleason's avatar
Alex Gleason committed
283
      {result, [], []} = Utils.format_input(code, "text/markdown")
284
      assert result == ~s[<p><del>aaaa</del>~</p>]
Alex Gleason's avatar
Alex Gleason committed
285 286 287
    end
  end

288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
  describe "context_to_conversation_id" do
    test "creates a mapping object" do
      conversation_id = Utils.context_to_conversation_id("random context")
      object = Object.get_by_ap_id("random context")

      assert conversation_id == object.id
    end

    test "returns an existing mapping for an existing object" do
      {:ok, object} = Object.context_mapping("random context") |> Repo.insert()
      conversation_id = Utils.context_to_conversation_id("random context")

      assert conversation_id == object.id
    end
  end
303 304

  describe "formats date to asctime" do
305 306
    test "when date is in ISO 8601 format" do
      date = DateTime.utc_now() |> DateTime.to_iso8601()
307 308 309

      expected =
        date
310 311
        |> DateTime.from_iso8601()
        |> elem(1)
312 313 314 315 316
        |> Calendar.Strftime.strftime!("%a %b %d %H:%M:%S %z %Y")

      assert Utils.date_to_asctime(date) == expected
    end

317 318
    test "when date is a binary in wrong format" do
      date = DateTime.utc_now()
319

320
      expected = ""
321

322 323 324
      assert capture_log(fn ->
               assert Utils.date_to_asctime(date) == expected
             end) =~ "[warn] Date #{date} in wrong format, must be ISO 8601"
325 326
    end

327 328
    test "when date is a Unix timestamp" do
      date = DateTime.utc_now() |> DateTime.to_unix()
329

330
      expected = ""
331

332 333 334
      assert capture_log(fn ->
               assert Utils.date_to_asctime(date) == expected
             end) =~ "[warn] Date #{date} in wrong format, must be ISO 8601"
335
    end
336 337 338 339

    test "when date is nil" do
      expected = ""

340 341 342 343 344 345 346 347 348
      assert capture_log(fn ->
               assert Utils.date_to_asctime(nil) == expected
             end) =~ "[warn] Date  in wrong format, must be ISO 8601"
    end

    test "when date is a random string" do
      assert capture_log(fn ->
               assert Utils.date_to_asctime("foo") == ""
             end) =~ "[warn] Date foo in wrong format, must be ISO 8601"
349
    end
350
  end
lain's avatar
lain committed
351 352 353 354 355

  describe "get_to_and_cc" do
    test "for public posts, not a reply" do
      user = insert(:user)
      mentioned_user = insert(:user)
minibikini's avatar
minibikini committed
356
      draft = %ActivityDraft{user: user, mentions: [mentioned_user.ap_id], visibility: "public"}
lain's avatar
lain committed
357

minibikini's avatar
minibikini committed
358
      {to, cc} = Utils.get_to_and_cc(draft)
lain's avatar
lain committed
359 360 361 362 363 364 365 366 367 368 369 370 371

      assert length(to) == 2
      assert length(cc) == 1

      assert @public_address in to
      assert mentioned_user.ap_id in to
      assert user.follower_address in cc
    end

    test "for public posts, a reply" do
      user = insert(:user)
      mentioned_user = insert(:user)
      third_user = insert(:user)
372
      {:ok, activity} = CommonAPI.post(third_user, %{status: "uguu"})
lain's avatar
lain committed
373

minibikini's avatar
minibikini committed
374 375 376 377 378 379 380 381
      draft = %ActivityDraft{
        user: user,
        mentions: [mentioned_user.ap_id],
        visibility: "public",
        in_reply_to: activity
      }

      {to, cc} = Utils.get_to_and_cc(draft)
lain's avatar
lain committed
382 383 384 385 386 387 388 389 390 391 392 393 394

      assert length(to) == 3
      assert length(cc) == 1

      assert @public_address in to
      assert mentioned_user.ap_id in to
      assert third_user.ap_id in to
      assert user.follower_address in cc
    end

    test "for unlisted posts, not a reply" do
      user = insert(:user)
      mentioned_user = insert(:user)
minibikini's avatar
minibikini committed
395
      draft = %ActivityDraft{user: user, mentions: [mentioned_user.ap_id], visibility: "unlisted"}
lain's avatar
lain committed
396

minibikini's avatar
minibikini committed
397
      {to, cc} = Utils.get_to_and_cc(draft)
lain's avatar
lain committed
398 399 400 401 402 403 404 405 406 407 408 409 410

      assert length(to) == 2
      assert length(cc) == 1

      assert @public_address in cc
      assert mentioned_user.ap_id in to
      assert user.follower_address in to
    end

    test "for unlisted posts, a reply" do
      user = insert(:user)
      mentioned_user = insert(:user)
      third_user = insert(:user)
411
      {:ok, activity} = CommonAPI.post(third_user, %{status: "uguu"})
lain's avatar
lain committed
412

minibikini's avatar
minibikini committed
413 414 415 416 417 418 419 420
      draft = %ActivityDraft{
        user: user,
        mentions: [mentioned_user.ap_id],
        visibility: "unlisted",
        in_reply_to: activity
      }

      {to, cc} = Utils.get_to_and_cc(draft)
lain's avatar
lain committed
421 422 423 424 425 426 427 428 429 430 431 432 433

      assert length(to) == 3
      assert length(cc) == 1

      assert @public_address in cc
      assert mentioned_user.ap_id in to
      assert third_user.ap_id in to
      assert user.follower_address in to
    end

    test "for private posts, not a reply" do
      user = insert(:user)
      mentioned_user = insert(:user)
minibikini's avatar
minibikini committed
434
      draft = %ActivityDraft{user: user, mentions: [mentioned_user.ap_id], visibility: "private"}
lain's avatar
lain committed
435

minibikini's avatar
minibikini committed
436
      {to, cc} = Utils.get_to_and_cc(draft)
lain's avatar
lain committed
437
      assert length(to) == 2
Haelwenn's avatar
Haelwenn committed
438
      assert Enum.empty?(cc)
lain's avatar
lain committed
439 440 441 442 443 444 445 446 447

      assert mentioned_user.ap_id in to
      assert user.follower_address in to
    end

    test "for private posts, a reply" do
      user = insert(:user)
      mentioned_user = insert(:user)
      third_user = insert(:user)
448
      {:ok, activity} = CommonAPI.post(third_user, %{status: "uguu"})
lain's avatar
lain committed
449

minibikini's avatar
minibikini committed
450 451 452 453 454 455 456 457
      draft = %ActivityDraft{
        user: user,
        mentions: [mentioned_user.ap_id],
        visibility: "private",
        in_reply_to: activity
      }

      {to, cc} = Utils.get_to_and_cc(draft)
lain's avatar
lain committed
458

459
      assert length(to) == 2
Haelwenn's avatar
Haelwenn committed
460
      assert Enum.empty?(cc)
lain's avatar
lain committed
461 462 463 464 465 466 467 468

      assert mentioned_user.ap_id in to
      assert user.follower_address in to
    end

    test "for direct posts, not a reply" do
      user = insert(:user)
      mentioned_user = insert(:user)
minibikini's avatar
minibikini committed
469
      draft = %ActivityDraft{user: user, mentions: [mentioned_user.ap_id], visibility: "direct"}
lain's avatar
lain committed
470

minibikini's avatar
minibikini committed
471
      {to, cc} = Utils.get_to_and_cc(draft)
lain's avatar
lain committed
472 473

      assert length(to) == 1
Haelwenn's avatar
Haelwenn committed
474
      assert Enum.empty?(cc)
lain's avatar
lain committed
475 476 477 478 479 480 481 482

      assert mentioned_user.ap_id in to
    end

    test "for direct posts, a reply" do
      user = insert(:user)
      mentioned_user = insert(:user)
      third_user = insert(:user)
483
      {:ok, activity} = CommonAPI.post(third_user, %{status: "uguu"})
lain's avatar
lain committed
484

minibikini's avatar
minibikini committed
485 486 487 488 489 490 491 492
      draft = %ActivityDraft{
        user: user,
        mentions: [mentioned_user.ap_id],
        visibility: "direct",
        in_reply_to: activity
      }

      {to, cc} = Utils.get_to_and_cc(draft)
lain's avatar
lain committed
493

494 495 496 497 498 499 500
      assert length(to) == 1
      assert Enum.empty?(cc)

      assert mentioned_user.ap_id in to

      {:ok, direct_activity} = CommonAPI.post(third_user, %{status: "uguu", visibility: "direct"})

minibikini's avatar
minibikini committed
501 502 503 504 505 506 507 508
      draft = %ActivityDraft{
        user: user,
        mentions: [mentioned_user.ap_id],
        visibility: "direct",
        in_reply_to: direct_activity
      }

      {to, cc} = Utils.get_to_and_cc(draft)
509

lain's avatar
lain committed
510
      assert length(to) == 2
Haelwenn's avatar
Haelwenn committed
511
      assert Enum.empty?(cc)
lain's avatar
lain committed
512 513 514 515 516

      assert mentioned_user.ap_id in to
      assert third_user.ap_id in to
    end
  end
517

Maksim's avatar
Maksim committed
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
  describe "to_master_date/1" do
    test "removes microseconds from date (NaiveDateTime)" do
      assert Utils.to_masto_date(~N[2015-01-23 23:50:07.123]) == "2015-01-23T23:50:07.000Z"
    end

    test "removes microseconds from date (String)" do
      assert Utils.to_masto_date("2015-01-23T23:50:07.123Z") == "2015-01-23T23:50:07.000Z"
    end

    test "returns empty string when date invalid" do
      assert Utils.to_masto_date("2015-01?23T23:50:07.123Z") == ""
    end
  end

  describe "conversation_id_to_context/1" do
    test "returns id" do
      object = insert(:note)
      assert Utils.conversation_id_to_context(object.id) == object.data["id"]
    end

    test "returns error if object not found" do
      assert Utils.conversation_id_to_context("123") == {:error, "No such conversation"}
    end
  end

  describe "maybe_notify_mentioned_recipients/2" do
    test "returns recipients when activity is not `Create`" do
      activity = insert(:like_activity)
      assert Utils.maybe_notify_mentioned_recipients(["test"], activity) == ["test"]
    end

    test "returns recipients from tag" do
      user = insert(:user)

      object =
        insert(:note,
          user: user,
          data: %{
            "tag" => [
              %{"type" => "Hashtag"},
              "",
              %{"type" => "Mention", "href" => "https://testing.pleroma.lol/users/lain"},
              %{"type" => "Mention", "href" => "https://shitposter.club/user/5381"},
              %{"type" => "Mention", "href" => "https://shitposter.club/user/5381"}
            ]
          }
        )

      activity = insert(:note_activity, user: user, note: object)

      assert Utils.maybe_notify_mentioned_recipients(["test"], activity) == [
               "test",
               "https://testing.pleroma.lol/users/lain",
               "https://shitposter.club/user/5381"
             ]
    end

    test "returns recipients when object is map" do
      user = insert(:user)
      object = insert(:note, user: user)

      activity =
        insert(:note_activity,
          user: user,
          note: object,
          data_attrs: %{
            "object" => %{
              "tag" => [
                %{"type" => "Hashtag"},
                "",
                %{"type" => "Mention", "href" => "https://testing.pleroma.lol/users/lain"},
                %{"type" => "Mention", "href" => "https://shitposter.club/user/5381"},
                %{"type" => "Mention", "href" => "https://shitposter.club/user/5381"}
              ]
            }
          }
        )

      Pleroma.Repo.delete(object)

      assert Utils.maybe_notify_mentioned_recipients(["test"], activity) == [
               "test",
               "https://testing.pleroma.lol/users/lain",
               "https://shitposter.club/user/5381"
             ]
    end

    test "returns recipients when object not found" do
      user = insert(:user)
      object = insert(:note, user: user)

      activity = insert(:note_activity, user: user, note: object)
      Pleroma.Repo.delete(object)

Alexander Strizhakov's avatar
Alexander Strizhakov committed
612 613 614 615 616 617 618
      obj_url = activity.data["object"]

      Tesla.Mock.mock(fn
        %{method: :get, url: ^obj_url} ->
          %Tesla.Env{status: 404, body: ""}
      end)

Maksim's avatar
Maksim committed
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
      assert Utils.maybe_notify_mentioned_recipients(["test-test"], activity) == [
               "test-test"
             ]
    end
  end

  describe "attachments_from_ids_descs/2" do
    test "returns [] when attachment ids is empty" do
      assert Utils.attachments_from_ids_descs([], "{}") == []
    end

    test "returns list attachments with desc" do
      object = insert(:note)
      desc = Jason.encode!(%{object.id => "test-desc"})

      assert Utils.attachments_from_ids_descs(["#{object.id}", "34"], desc) == [
               Map.merge(object.data, %{"name" => "test-desc"})
             ]
    end
  end

  describe "attachments_from_ids/1" do
    test "returns attachments with descs" do
      object = insert(:note)
      desc = Jason.encode!(%{object.id => "test-desc"})

      assert Utils.attachments_from_ids(%{
646 647
               media_ids: ["#{object.id}"],
               descriptions: desc
Maksim's avatar
Maksim committed
648 649 650 651 652 653 654
             }) == [
               Map.merge(object.data, %{"name" => "test-desc"})
             ]
    end

    test "returns attachments without descs" do
      object = insert(:note)
655
      assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == [object.data]
Maksim's avatar
Maksim committed
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684
    end

    test "returns [] when not pass media_ids" do
      assert Utils.attachments_from_ids(%{}) == []
    end
  end

  describe "maybe_add_list_data/3" do
    test "adds list params when found user list" do
      user = insert(:user)
      {:ok, %Pleroma.List{} = list} = Pleroma.List.create("title", user)

      assert Utils.maybe_add_list_data(%{additional: %{}, object: %{}}, user, {:list, list.id}) ==
               %{
                 additional: %{"bcc" => [list.ap_id], "listMessage" => list.ap_id},
                 object: %{"listMessage" => list.ap_id}
               }
    end

    test "returns original params when list not found" do
      user = insert(:user)
      {:ok, %Pleroma.List{} = list} = Pleroma.List.create("title", insert(:user))

      assert Utils.maybe_add_list_data(%{additional: %{}, object: %{}}, user, {:list, list.id}) ==
               %{additional: %{}, object: %{}}
    end
  end

  describe "maybe_add_attachments/3" do
685
    test "returns parsed results when attachment_links is false" do
Maksim's avatar
Maksim committed
686 687 688
      assert Utils.maybe_add_attachments(
               {"test", [], ["tags"]},
               [],
689
               false
Maksim's avatar
Maksim committed
690 691 692 693 694 695 696 697 698
             ) == {"test", [], ["tags"]}
    end

    test "adds attachments to parsed results" do
      attachment = %{"url" => [%{"href" => "SakuraPM.png"}]}

      assert Utils.maybe_add_attachments(
               {"test", [], ["tags"]},
               [attachment],
699
               true
Maksim's avatar
Maksim committed
700 701 702 703 704 705 706
             ) == {
               "test<br><a href=\"SakuraPM.png\" class='attachment'>SakuraPM.png</a>",
               [],
               ["tags"]
             }
    end
  end
lain's avatar
lain committed
707
end