2018-12-23 20:11:29 +00:00
# Pleroma: A lightweight social networking server
2020-03-02 05:08:45 +00:00
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
2018-12-23 20:11:29 +00:00
# SPDX-License-Identifier: AGPL-3.0-only
2017-05-17 16:00:09 +00:00
defmodule Pleroma.FormatterTest do
alias Pleroma.Formatter
2018-10-17 19:27:05 +00:00
alias Pleroma.User
2017-05-17 16:00:09 +00:00
use Pleroma.DataCase
2017-06-14 11:58:56 +00:00
import Pleroma.Factory
2018-12-04 14:48:55 +00:00
2018-12-04 11:01:39 +00:00
setup_all do
2020-07-22 21:01:55 +00:00
clear_config ( Pleroma.Formatter )
2018-12-04 11:01:39 +00:00
Tesla.Mock . mock_global ( fn env -> apply ( HttpRequestMock , :request , [ env ] ) end )
:ok
end
2017-06-14 11:58:56 +00:00
2018-03-24 10:03:10 +00:00
describe " .add_hashtag_links " do
test " turns hashtags into links " do
text = " I love # cofe and # 2hu "
2018-03-30 13:01:53 +00:00
expected_text =
2019-09-19 07:39:52 +00:00
~s( I love <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe" rel="tag ugc"> # cofe</a> and <a class="hashtag" data-tag="2hu" href="http://localhost:4001/tag/2hu" rel="tag ugc"> # 2hu</a> )
2018-03-24 10:03:10 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected_text , [ ] , _tags } = Formatter . linkify ( text )
2018-03-24 10:03:10 +00:00
end
2018-12-18 19:10:56 +00:00
test " does not turn html characters to tags " do
2019-02-26 23:32:26 +00:00
text = " # fact_3: pleroma does what mastodon't "
2018-12-18 19:10:56 +00:00
expected_text =
2019-09-19 07:39:52 +00:00
~s( <a class="hashtag" data-tag="fact_3" href="http://localhost:4001/tag/fact_3" rel="tag ugc"> # fact_3</a>: pleroma does what mastodon't )
2018-12-18 19:10:56 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected_text , [ ] , _tags } = Formatter . linkify ( text )
2018-12-18 19:10:56 +00:00
end
2018-03-24 10:03:10 +00:00
end
describe " .add_links " do
2017-05-17 16:00:09 +00:00
test " turning urls into links " do
2018-06-23 11:28:14 +00:00
text = " Hey, check out https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2 # blabla . "
2017-05-17 16:00:09 +00:00
2018-03-30 13:01:53 +00:00
expected =
2019-09-17 08:22:46 +00:00
~S( Hey, check out <a href="https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla" rel="ugc">https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla</a> . )
2018-03-30 13:01:53 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2017-11-07 11:06:37 +00:00
text = " https://mastodon.social/@lambadalambda "
2018-03-30 13:01:53 +00:00
expected =
2019-09-17 08:22:46 +00:00
~S( <a href="https://mastodon.social/@lambadalambda" rel="ugc">https://mastodon.social/@lambadalambda</a> )
2018-03-30 13:01:53 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2017-11-07 11:06:37 +00:00
2018-04-06 14:35:54 +00:00
text = " https://mastodon.social:4000/@lambadalambda "
expected =
2019-09-17 08:22:46 +00:00
~S( <a href="https://mastodon.social:4000/@lambadalambda" rel="ugc">https://mastodon.social:4000/@lambadalambda</a> )
2018-04-06 14:35:54 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2018-04-06 14:35:54 +00:00
2017-11-07 11:06:37 +00:00
text = " @lambadalambda "
expected = " @lambadalambda "
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2017-11-07 11:06:37 +00:00
text = " http://www.cs.vu.nl/~ast/intel/ "
2019-09-17 08:22:46 +00:00
expected =
~S( <a href="http://www.cs.vu.nl/~ast/intel/" rel="ugc">http://www.cs.vu.nl/~ast/intel/</a> )
2017-11-07 11:06:37 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2017-12-07 19:38:31 +00:00
text = " https://forum.zdoom.org/viewtopic.php?f=44&t=57087 "
2018-03-30 13:01:53 +00:00
expected =
2019-09-17 08:22:46 +00:00
" <a href= \" https://forum.zdoom.org/viewtopic.php?f=44&t=57087 \" rel= \" ugc \" >https://forum.zdoom.org/viewtopic.php?f=44&t=57087</a> "
2018-03-30 13:01:53 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2017-12-07 19:38:31 +00:00
text = " https://en.wikipedia.org/wiki/Sophia_(Gnosticism) # Mythos_of_the_soul "
2018-03-30 13:01:53 +00:00
expected =
2019-09-17 08:22:46 +00:00
" <a href= \" https://en.wikipedia.org/wiki/Sophia_(Gnosticism) # Mythos_of_the_soul \" rel= \" ugc \" >https://en.wikipedia.org/wiki/Sophia_(Gnosticism) # Mythos_of_the_soul</a> "
2018-03-30 13:01:53 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2018-04-04 09:29:03 +00:00
text = " https://www.google.co.jp/search?q=Nasim+Aghdam "
expected =
2019-09-17 08:22:46 +00:00
" <a href= \" https://www.google.co.jp/search?q=Nasim+Aghdam \" rel= \" ugc \" >https://www.google.co.jp/search?q=Nasim+Aghdam</a> "
2018-04-21 16:24:45 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2018-04-21 16:24:45 +00:00
text = " https://en.wikipedia.org/wiki/Duff's_device "
expected =
2019-09-17 08:22:46 +00:00
" <a href= \" https://en.wikipedia.org/wiki/Duff's_device \" rel= \" ugc \" >https://en.wikipedia.org/wiki/Duff's_device</a> "
2018-04-04 09:29:03 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2018-05-19 09:27:14 +00:00
text = " https://pleroma.com https://pleroma.com/sucks "
expected =
2019-09-17 08:22:46 +00:00
" <a href= \" https://pleroma.com \" rel= \" ugc \" >https://pleroma.com</a> <a href= \" https://pleroma.com/sucks \" rel= \" ugc \" >https://pleroma.com/sucks</a> "
2018-05-19 09:27:14 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2018-06-23 11:32:03 +00:00
text = " xmpp:contact@hacktivis.me "
2019-09-17 08:22:46 +00:00
expected = " <a href= \" xmpp:contact@hacktivis.me \" rel= \" ugc \" >xmpp:contact@hacktivis.me</a> "
2018-06-23 11:32:03 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2018-09-28 15:20:28 +00:00
text =
" magnet:?xt=urn:btih:7ec9d298e91d6e4394d1379caf073c77ff3e3136&tr=udp%3A%2F%2Fopentor.org%3A2710&tr=udp%3A%2F%2Ftracker.blackunicorn.xyz%3A6969&tr=udp%3A%2F%2Ftracker.ccc.de%3A80&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com "
2019-09-17 08:22:46 +00:00
expected = " <a href= \" #{ text } \" rel= \" ugc \" > #{ text } </a> "
2018-09-28 15:20:28 +00:00
2019-02-26 23:32:26 +00:00
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
2018-03-24 10:03:10 +00:00
end
end
2020-01-28 12:38:21 +00:00
describe " Formatter.linkify " do
test " correctly finds mentions that contain the domain name " do
_user = insert ( :user , %{ nickname : " lain " } )
_remote_user = insert ( :user , %{ nickname : " lain@lain.com " , local : false } )
text = " hey @lain@lain.com what's up "
{ _text , mentions , [ ] } = Formatter . linkify ( text )
[ { username , user } ] = mentions
assert username == " @lain@lain.com "
assert user . nickname == " lain@lain.com "
end
2019-01-18 06:30:16 +00:00
test " gives a replacement for user links, using local nicknames in user links text " do
2018-12-12 17:17:15 +00:00
text = " @gsimg According to @archa_eme_, that is @daggsy. Also hello @archaeme@archae.me "
2018-03-24 10:03:10 +00:00
gsimg = insert ( :user , %{ nickname : " gsimg " } )
2018-04-03 16:32:46 +00:00
archaeme =
2019-10-16 18:59:21 +00:00
insert ( :user ,
2018-12-12 17:17:15 +00:00
nickname : " archa_eme_ " ,
2020-04-01 05:15:38 +00:00
uri : " https://archeme/@archa_eme_ "
2019-10-16 18:59:21 +00:00
)
2018-04-03 16:32:46 +00:00
2018-03-24 10:03:10 +00:00
archaeme_remote = insert ( :user , %{ nickname : " archaeme@archae.me " } )
2019-02-26 23:32:26 +00:00
{ text , mentions , [ ] } = Formatter . linkify ( text )
2018-03-24 10:03:10 +00:00
2019-02-26 23:32:26 +00:00
assert length ( mentions ) == 3
2018-03-24 10:03:10 +00:00
2018-03-30 13:01:53 +00:00
expected_text =
2020-04-08 19:58:31 +00:00
~s( <span class="h-card"><a class="u-url mention" data-user=" #{ gsimg . id } " href=" #{
2019-01-16 04:09:01 +00:00
gsimg . ap_id
2020-04-08 19:58:31 +00:00
} " rel= " ugc " >@<span>gsimg</span></a></span> According to <span class= " h - card " ><a class= " u - url mention " data-user= " #{
2018-12-05 19:58:52 +00:00
archaeme . id
2020-04-08 19:58:31 +00:00
} " href= " #{"https://archeme/@archa_eme_"}" rel="ugc">@<span>archa_eme_</span></a></span>, that is @daggsy. Also hello <span class="h-card"><a class="u-url mention" data-user="#{
2018-12-05 19:58:52 +00:00
archaeme_remote . id
2020-04-08 19:58:31 +00:00
} " href= " #{archaeme_remote.ap_id}" rel="ugc">@<span>archaeme</span></a></span>)
2018-03-24 10:03:10 +00:00
2019-02-26 23:32:26 +00:00
assert expected_text == text
2017-05-17 16:00:09 +00:00
end
2018-08-24 18:14:19 +00:00
2018-10-17 19:27:05 +00:00
test " gives a replacement for user links when the user is using Osada " do
2019-05-01 09:09:53 +00:00
{ :ok , mike } = User . get_or_fetch ( " mike@osada.macgirvin.com " )
2018-10-17 19:27:05 +00:00
text = " @mike@osada.macgirvin.com test "
2019-02-26 23:32:26 +00:00
{ text , mentions , [ ] } = Formatter . linkify ( text )
2018-10-17 19:27:05 +00:00
2019-02-26 23:32:26 +00:00
assert length ( mentions ) == 1
2018-10-17 19:27:05 +00:00
expected_text =
2020-04-08 19:58:31 +00:00
~s( <span class="h-card"><a class="u-url mention" data-user=" #{ mike . id } " href=" #{
2019-09-19 07:39:52 +00:00
mike . ap_id
} " rel= " ugc " >@<span>mike</span></a></span> test)
2018-10-17 19:27:05 +00:00
2019-02-26 23:32:26 +00:00
assert expected_text == text
2018-10-17 19:27:05 +00:00
end
2018-08-24 18:14:19 +00:00
test " gives a replacement for single-character local nicknames " do
text = " @o hi "
o = insert ( :user , %{ nickname : " o " } )
2019-02-26 23:32:26 +00:00
{ text , mentions , [ ] } = Formatter . linkify ( text )
2018-08-24 18:14:19 +00:00
2019-02-26 23:32:26 +00:00
assert length ( mentions ) == 1
2018-08-24 18:14:19 +00:00
2018-12-05 19:58:52 +00:00
expected_text =
2020-04-08 19:58:31 +00:00
~s( <span class="h-card"><a class="u-url mention" data-user=" #{ o . id } " href=" #{ o . ap_id } " rel="ugc">@<span>o</span></a></span> hi )
2018-12-05 19:58:52 +00:00
2019-02-26 23:32:26 +00:00
assert expected_text == text
2018-08-24 18:14:19 +00:00
end
test " does not give a replacement for single-character local nicknames who don't exist " do
text = " @a hi "
expected_text = " @a hi "
2019-02-26 23:32:26 +00:00
assert { ^ expected_text , [ ] = _mentions , [ ] = _tags } = Formatter . linkify ( text )
2018-08-24 18:14:19 +00:00
end
2019-03-20 20:09:36 +00:00
test " given the 'safe_mention' option, it will only mention people in the beginning " do
user = insert ( :user )
2019-05-24 20:34:23 +00:00
other_user = insert ( :user )
2019-03-20 20:09:36 +00:00
third_user = insert ( :user )
2019-05-24 20:34:23 +00:00
text = " @ #{ user . nickname } @ #{ other_user . nickname } hey dudes i hate @ #{ third_user . nickname } "
2019-03-20 20:09:36 +00:00
{ expected_text , mentions , [ ] = _tags } = Formatter . linkify ( text , safe_mention : true )
2019-05-24 20:34:23 +00:00
assert mentions == [ { " @ #{ user . nickname } " , user } , { " @ #{ other_user . nickname } " , other_user } ]
2019-03-20 20:09:36 +00:00
assert expected_text ==
2020-04-08 19:58:31 +00:00
~s( <span class="h-card"><a class="u-url mention" data-user=" #{ user . id } " href=" #{
2019-03-20 20:09:36 +00:00
user . ap_id
2020-04-08 19:58:31 +00:00
} " rel= " ugc " >@<span> #{ user . nickname } </span></a></span> <span class= " h - card " ><a class= " u - url mention " data-user= " #{
2019-05-24 20:34:23 +00:00
other_user . id
2020-04-08 19:58:31 +00:00
} " href= " #{other_user.ap_id}" rel="ugc">@<span>#{other_user.nickname}</span></a></span> hey dudes i hate <span class="h-card"><a class="u-url mention" data-user="#{
2019-03-20 20:09:36 +00:00
third_user . id
2020-04-08 19:58:31 +00:00
} " href= " #{third_user.ap_id}" rel="ugc">@<span>#{third_user.nickname}</span></a></span>)
2019-03-20 20:09:36 +00:00
end
test " given the 'safe_mention' option, it will still work without any mention " do
text = " A post without any mention "
{ expected_text , mentions , [ ] = _tags } = Formatter . linkify ( text , safe_mention : true )
assert mentions == [ ]
assert expected_text == text
end
2019-05-22 04:04:20 +00:00
test " given the 'safe_mention' option, it will keep text after newlines " do
user = insert ( :user )
text = " @ #{ user . nickname } \n hey dude \n \n how are you doing? "
{ expected_text , _ , _ } = Formatter . linkify ( text , safe_mention : true )
assert expected_text =~ " how are you doing? "
end
2019-08-29 03:22:18 +00:00
test " it can parse mentions and return the relevant users " do
text =
" @@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me and @o and @@@jimm "
o = insert ( :user , %{ nickname : " o " } )
2020-12-22 20:22:48 +00:00
_jimm = insert ( :user , %{ nickname : " jimm " } )
_gsimg = insert ( :user , %{ nickname : " gsimg " } )
2019-08-29 03:22:18 +00:00
archaeme = insert ( :user , %{ nickname : " archaeme " } )
archaeme_remote = insert ( :user , %{ nickname : " archaeme@archae.me " } )
expected_mentions = [
{ " @archaeme " , archaeme } ,
{ " @archaeme@archae.me " , archaeme_remote } ,
{ " @o " , o }
]
assert { _text , ^ expected_mentions , [ ] } = Formatter . linkify ( text )
end
2020-07-21 22:18:17 +00:00
test " it parses URL containing local mention " do
_user = insert ( :user , %{ nickname : " lain " } )
text = " https://example.com/@lain "
expected = ~S( <a href="https://example.com/@lain" rel="ugc">https://example.com/@lain</a> )
assert { ^ expected , [ ] , [ ] } = Formatter . linkify ( text )
end
test " it correctly parses angry face D:< with mention " do
lain =
insert ( :user , %{
nickname : " lain@lain.com " ,
ap_id : " https://lain.com/users/lain " ,
id : " 9qrWmR0cKniB0YU0TA "
} )
text = " @lain@lain.com D:< "
expected_text =
~S( <span class="h-card"><a class="u-url mention" data-user="9qrWmR0cKniB0YU0TA" href="https://lain.com/users/lain" rel="ugc">@<span>lain</span></a></span> D:< )
expected_mentions = [
{ " @lain@lain.com " , lain }
]
assert { ^ expected_text , ^ expected_mentions , [ ] } = Formatter . linkify ( text )
end
2017-05-17 16:00:09 +00:00
end
describe " .parse_tags " do
test " parses tags in the text " do
2017-06-18 17:04:46 +00:00
text = " Here's a # Test. Maybe these are # working or not. What about # 漢字? And # は。 "
2018-03-30 13:01:53 +00:00
2019-02-26 23:32:26 +00:00
expected_tags = [
2017-06-18 17:04:46 +00:00
{ " # Test " , " test " } ,
2017-05-17 16:00:09 +00:00
{ " # working " , " working " } ,
2019-02-26 23:32:26 +00:00
{ " # は " , " は " } ,
{ " # 漢字 " , " 漢字 " }
2017-05-17 16:00:09 +00:00
]
2019-02-26 23:32:26 +00:00
assert { _text , [ ] , ^ expected_tags } = Formatter . linkify ( text )
2017-05-17 16:00:09 +00:00
end
end
2017-06-14 11:58:56 +00:00
2019-02-26 23:32:26 +00:00
test " it escapes HTML in plain text " do
text = " hello & world google.com/?a=b&c=d \n http://test.com/?a=b&c=d 1 "
expected = " hello & world google.com/?a=b&c=d \n http://test.com/?a=b&c=d 1 "
assert Formatter . html_escape ( text , " text/plain " ) == expected
2018-12-14 09:41:55 +00:00
end
2017-05-17 16:00:09 +00:00
end