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-09-15 12:17:36 +00:00
defmodule Pleroma.Web.CommonAPI.UtilsTest do
2019-03-05 02:52:23 +00:00
alias Pleroma.Builders.UserBuilder
2019-03-21 23:37:00 +00:00
alias Pleroma.Object
2019-06-03 17:08:38 +00:00
alias Pleroma.Web.CommonAPI
2017-09-15 12:17:36 +00:00
alias Pleroma.Web.CommonAPI.Utils
2017-06-14 12:46:18 +00:00
use Pleroma.DataCase
2019-07-15 19:47:23 +00:00
import ExUnit.CaptureLog
2019-06-03 17:08:38 +00:00
import Pleroma.Factory
@public_address " https://www.w3.org/ns/activitystreams # Public "
2020-05-22 15:19:25 +00:00
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 "
2017-08-28 17:17:38 +00:00
2020-05-22 15:19:25 +00:00
attachment = %{
" url " = > [ %{ " href " = > URI . encode ( name ) } ]
}
2017-06-14 12:46:18 +00:00
2020-05-22 15:19:25 +00:00
%{ name : name , attachment : attachment }
end
2017-06-14 12:46:18 +00:00
2020-05-22 15:19:25 +00:00
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
2017-06-14 12:46:18 +00:00
end
2018-05-11 11:32:59 +00:00
describe " it confirms the password given is the current users password " do
2018-05-13 13:56:59 +00:00
test " incorrect password given " do
2018-05-11 11:32:59 +00:00
{ :ok , user } = UserBuilder . insert ( )
2018-05-21 21:32:28 +00:00
assert Utils . confirm_current_password ( user , " " ) == { :error , " Invalid password. " }
2018-05-11 11:32:59 +00:00
end
2018-05-13 13:56:59 +00:00
test " correct password given " do
2018-05-11 11:32:59 +00:00
{ :ok , user } = UserBuilder . insert ( )
2018-05-21 21:32:28 +00:00
assert Utils . confirm_current_password ( user , " test " ) == { :ok , user }
2018-05-11 11:32:59 +00:00
end
end
2018-08-12 19:24:10 +00:00
2019-02-26 23:32:26 +00:00
describe " format_input/3 " do
2019-01-10 03:46:34 +00:00
test " works for bare text/plain " do
text = " hello world! "
expected = " hello world! "
2019-02-26 23:32:26 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/plain " )
2019-01-10 03:46:34 +00:00
assert output == expected
text = " hello world! \n \n second paragraph! "
expected = " hello world!<br><br>second paragraph! "
2019-02-26 23:32:26 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/plain " )
2019-01-10 03:46:34 +00:00
assert output == expected
end
test " works for bare text/html " do
text = " <p>hello world!</p> "
expected = " <p>hello world!</p> "
2019-02-26 23:32:26 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/html " )
2019-01-10 03:46:34 +00:00
assert output == expected
2020-02-13 02:39:47 +00:00
text = " <p>hello world!</p><br/> \n <p>second paragraph</p> "
expected = " <p>hello world!</p><br/> \n <p>second paragraph</p> "
2019-01-10 03:46:34 +00:00
2019-02-26 23:32:26 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/html " )
2019-01-10 03:46:34 +00:00
assert output == expected
end
test " works for bare text/markdown " do
text = " **hello world** "
2020-02-13 02:39:47 +00:00
expected = " <p><strong>hello world</strong></p> "
2019-01-10 03:46:34 +00:00
2019-02-26 23:32:26 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/markdown " )
2019-01-10 03:46:34 +00:00
assert output == expected
text = " **hello world** \n \n *another paragraph* "
2020-02-13 02:39:47 +00:00
expected = " <p><strong>hello world</strong></p><p><em>another paragraph</em></p> "
2019-01-10 03:46:34 +00:00
2019-02-26 23:32:26 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/markdown " )
assert output == expected
2019-02-27 08:40:30 +00:00
text = """
> cool quote
by someone
"""
2020-02-13 02:39:47 +00:00
expected = " <blockquote><p>cool quote</p></blockquote><p>by someone</p> "
2019-02-27 08:40:30 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/markdown " )
assert output == expected
2019-02-26 23:32:26 +00:00
end
2019-04-26 10:17:57 +00:00
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 \n second paragraph! "
2020-02-13 02:39:47 +00:00
expected = " <strong>hello world!</strong><br><br>second paragraph! "
2019-04-26 22:38:56 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/bbcode " )
assert output == expected
text = " [b]hello world![/b] \n \n <strong>second paragraph!</strong> "
expected =
2020-02-13 02:39:47 +00:00
" <strong>hello world!</strong><br><br><strong>second paragraph!</strong> "
2019-04-26 10:17:57 +00:00
{ output , [ ] , [ ] } = Utils . format_input ( text , " text/bbcode " )
assert output == expected
end
2019-02-26 23:32:26 +00:00
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 " )
2019-01-10 03:46:34 +00:00
2020-02-13 02:39:47 +00:00
assert output ==
2020-04-08 19:58:31 +00:00
~s( <p><strong>hello world</strong></p><p><em>another <span class="h-card"><a class="u-url mention" data-user=" #{
2020-02-13 02:39:47 +00:00
user . id
2020-04-08 19:58:31 +00:00
} " 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= " #{
2020-02-13 02:39:47 +00:00
user . id
2020-04-08 19:58:31 +00:00
} " 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>)
2019-01-10 03:46:34 +00:00
end
end
2019-03-21 23:17:53 +00:00
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
2019-04-01 20:40:48 +00:00
describe " formats date to asctime " do
2019-04-02 09:25:51 +00:00
test " when date is in ISO 8601 format " do
date = DateTime . utc_now ( ) |> DateTime . to_iso8601 ( )
2019-04-01 20:40:48 +00:00
expected =
date
2019-04-02 09:25:51 +00:00
|> DateTime . from_iso8601 ( )
|> elem ( 1 )
2019-04-01 20:40:48 +00:00
|> Calendar.Strftime . strftime! ( " %a %b %d %H:%M:%S %z %Y " )
assert Utils . date_to_asctime ( date ) == expected
end
2019-04-02 09:25:51 +00:00
test " when date is a binary in wrong format " do
date = DateTime . utc_now ( )
2019-04-01 20:40:48 +00:00
2019-04-02 09:25:51 +00:00
expected = " "
2019-04-01 20:40:48 +00:00
2019-07-15 19:47:23 +00:00
assert capture_log ( fn ->
assert Utils . date_to_asctime ( date ) == expected
end ) =~ " [warn] Date #{ date } in wrong format, must be ISO 8601 "
2019-04-01 20:40:48 +00:00
end
2019-04-02 09:25:51 +00:00
test " when date is a Unix timestamp " do
date = DateTime . utc_now ( ) |> DateTime . to_unix ( )
2019-04-01 20:40:48 +00:00
2019-04-02 09:25:51 +00:00
expected = " "
2019-04-01 20:40:48 +00:00
2019-07-15 19:47:23 +00:00
assert capture_log ( fn ->
assert Utils . date_to_asctime ( date ) == expected
end ) =~ " [warn] Date #{ date } in wrong format, must be ISO 8601 "
2019-04-01 20:40:48 +00:00
end
2019-04-02 09:25:51 +00:00
test " when date is nil " do
expected = " "
2019-07-15 19:47:23 +00:00
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 "
2019-04-02 09:25:51 +00:00
end
2019-04-01 20:40:48 +00:00
end
2019-06-03 17:08:38 +00:00
describe " get_to_and_cc " do
test " for public posts, not a reply " do
user = insert ( :user )
mentioned_user = insert ( :user )
mentions = [ mentioned_user . ap_id ]
2019-08-02 17:53:08 +00:00
{ to , cc } = Utils . get_to_and_cc ( user , mentions , nil , " public " , nil )
2019-06-03 17:08:38 +00:00
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 )
2020-05-12 19:59:26 +00:00
{ :ok , activity } = CommonAPI . post ( third_user , %{ status : " uguu " } )
2019-06-03 17:08:38 +00:00
mentions = [ mentioned_user . ap_id ]
2019-08-02 17:53:08 +00:00
{ to , cc } = Utils . get_to_and_cc ( user , mentions , activity , " public " , nil )
2019-06-03 17:08:38 +00:00
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 )
mentions = [ mentioned_user . ap_id ]
2019-08-02 17:53:08 +00:00
{ to , cc } = Utils . get_to_and_cc ( user , mentions , nil , " unlisted " , nil )
2019-06-03 17:08:38 +00:00
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 )
2020-05-12 19:59:26 +00:00
{ :ok , activity } = CommonAPI . post ( third_user , %{ status : " uguu " } )
2019-06-03 17:08:38 +00:00
mentions = [ mentioned_user . ap_id ]
2019-08-02 17:53:08 +00:00
{ to , cc } = Utils . get_to_and_cc ( user , mentions , activity , " unlisted " , nil )
2019-06-03 17:08:38 +00:00
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 )
mentions = [ mentioned_user . ap_id ]
2019-08-02 17:53:08 +00:00
{ to , cc } = Utils . get_to_and_cc ( user , mentions , nil , " private " , nil )
2019-06-03 17:08:38 +00:00
assert length ( to ) == 2
2020-01-20 10:53:14 +00:00
assert Enum . empty? ( cc )
2019-06-03 17:08:38 +00:00
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 )
2020-05-12 19:59:26 +00:00
{ :ok , activity } = CommonAPI . post ( third_user , %{ status : " uguu " } )
2019-06-03 17:08:38 +00:00
mentions = [ mentioned_user . ap_id ]
2019-08-02 17:53:08 +00:00
{ to , cc } = Utils . get_to_and_cc ( user , mentions , activity , " private " , nil )
2019-06-03 17:08:38 +00:00
2020-05-20 11:38:47 +00:00
assert length ( to ) == 2
2020-01-20 10:53:14 +00:00
assert Enum . empty? ( cc )
2019-06-03 17:08:38 +00:00
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 )
mentions = [ mentioned_user . ap_id ]
2019-08-02 17:53:08 +00:00
{ to , cc } = Utils . get_to_and_cc ( user , mentions , nil , " direct " , nil )
2019-06-03 17:08:38 +00:00
assert length ( to ) == 1
2020-01-20 10:53:14 +00:00
assert Enum . empty? ( cc )
2019-06-03 17:08:38 +00:00
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 )
2020-05-12 19:59:26 +00:00
{ :ok , activity } = CommonAPI . post ( third_user , %{ status : " uguu " } )
2019-06-03 17:08:38 +00:00
mentions = [ mentioned_user . ap_id ]
2019-08-02 17:53:08 +00:00
{ to , cc } = Utils . get_to_and_cc ( user , mentions , activity , " direct " , nil )
2019-06-03 17:08:38 +00:00
2020-05-20 11:38:47 +00:00
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 " } )
{ to , cc } = Utils . get_to_and_cc ( user , mentions , direct_activity , " direct " , nil )
2019-06-03 17:08:38 +00:00
assert length ( to ) == 2
2020-01-20 10:53:14 +00:00
assert Enum . empty? ( cc )
2019-06-03 17:08:38 +00:00
assert mentioned_user . ap_id in to
assert third_user . ap_id in to
end
end
2019-07-31 18:35:15 +00:00
2019-08-05 15:37:05 +00:00
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 )
2020-02-11 07:12:57 +00:00
obj_url = activity . data [ " object " ]
Tesla.Mock . mock ( fn
%{ method : :get , url : ^ obj_url } ->
% Tesla.Env { status : 404 , body : " " }
end )
2019-08-05 15:37:05 +00:00
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 ( %{
2020-05-12 19:59:26 +00:00
media_ids : [ " #{ object . id } " ] ,
descriptions : desc
2019-08-05 15:37:05 +00:00
} ) == [
Map . merge ( object . data , %{ " name " = > " test-desc " } )
]
end
test " returns attachments without descs " do
object = insert ( :note )
2020-05-12 19:59:26 +00:00
assert Utils . attachments_from_ids ( %{ media_ids : [ " #{ object . id } " ] } ) == [ object . data ]
2019-08-05 15:37:05 +00:00
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 " make_note_data/11 " do
test " returns note data " do
user = insert ( :user )
note = insert ( :note )
user2 = insert ( :user )
user3 = insert ( :user )
assert Utils . make_note_data (
user . ap_id ,
[ user2 . ap_id ] ,
" 2hu " ,
" <h1>This is :moominmamma: note</h1> " ,
[ ] ,
note . id ,
[ name : " jimm " ] ,
" test summary " ,
[ user3 . ap_id ] ,
false ,
%{ " custom_tag " = > " test " }
) == %{
" actor " = > user . ap_id ,
" attachment " = > [ ] ,
" cc " = > [ user3 . ap_id ] ,
" content " = > " <h1>This is :moominmamma: note</h1> " ,
" context " = > " 2hu " ,
" sensitive " = > false ,
" summary " = > " test summary " ,
" tag " = > [ " jimm " ] ,
" to " = > [ user2 . ap_id ] ,
" type " = > " Note " ,
" custom_tag " = > " test "
}
end
end
describe " maybe_add_attachments/3 " do
2020-02-11 21:39:19 +00:00
test " returns parsed results when attachment_links is false " do
2019-08-05 15:37:05 +00:00
assert Utils . maybe_add_attachments (
{ " test " , [ ] , [ " tags " ] } ,
[ ] ,
2020-02-11 21:39:19 +00:00
false
2019-08-05 15:37:05 +00:00
) == { " test " , [ ] , [ " tags " ] }
end
test " adds attachments to parsed results " do
attachment = %{ " url " = > [ %{ " href " = > " SakuraPM.png " } ] }
assert Utils . maybe_add_attachments (
{ " test " , [ ] , [ " tags " ] } ,
[ attachment ] ,
2020-02-11 21:39:19 +00:00
true
2019-08-05 15:37:05 +00:00
) == {
" test<br><a href= \" SakuraPM.png \" class='attachment'>SakuraPM.png</a> " ,
[ ] ,
[ " tags " ]
}
end
end
2017-06-14 12:46:18 +00:00
end