2017-03-21 17:53:20 +01:00
defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
use Pleroma.DataCase
2017-06-20 14:13:25 +02:00
alias Pleroma.Builders . { UserBuilder }
2017-06-20 16:34:15 +02:00
alias Pleroma.Web.TwitterAPI . { StatusView , TwitterAPI , Utils }
2017-03-30 17:07:03 +02:00
alias Pleroma . { Activity , User , Object , Repo }
2017-04-14 18:15:15 +02:00
alias Pleroma.Web.ActivityPub.ActivityPub
2017-03-21 17:53:20 +01:00
2017-04-13 16:19:07 +02:00
import Pleroma.Factory
2017-03-21 17:53:20 +01:00
test " create a status " do
2017-04-03 18:28:19 +02:00
user = UserBuilder . build ( %{ ap_id : " 142344 " } )
_mentioned_user = UserBuilder . insert ( %{ nickname : " shp " , ap_id : " shp " } )
2017-03-30 17:07:03 +02:00
object_data = %{
" type " = > " Image " ,
" url " = > [
%{
" type " = > " Link " ,
" mediaType " = > " image/jpg " ,
" href " = > " http://example.org/image.jpg "
}
] ,
" uuid " = > 1
}
object = Repo . insert! ( % Object { data : object_data } )
2017-03-21 17:53:20 +01:00
input = %{
2017-05-18 15:16:49 +02:00
" status " = > " Hello again, @shp.<script></script> \n This is on another line. # 2hu # epic # phantasmagoric " ,
2017-03-30 17:07:03 +02:00
" media_ids " = > [ object . id ]
2017-03-21 17:53:20 +01:00
}
{ :ok , activity = % Activity { } } = TwitterAPI . create_status ( user , input )
2017-06-14 14:46:18 +02:00
assert get_in ( activity . data , [ " object " , " content " ] ) == " Hello again, <a href='shp'>@shp</a>.<br> \n This is on another line. # 2hu # epic # phantasmagoric<br> \n <a href= \" http://example.org/image.jpg \" class='attachment'>image.jpg</a> "
2017-03-21 18:17:35 +01:00
assert get_in ( activity . data , [ " object " , " type " ] ) == " Note "
2017-04-13 14:56:19 +02:00
assert get_in ( activity . data , [ " object " , " actor " ] ) == user . ap_id
2017-04-03 18:28:19 +02:00
assert get_in ( activity . data , [ " actor " ] ) == user . ap_id
2017-03-21 18:17:35 +01:00
assert Enum . member? ( get_in ( activity . data , [ " to " ] ) , User . ap_followers ( user ) )
assert Enum . member? ( get_in ( activity . data , [ " to " ] ) , " https://www.w3.org/ns/activitystreams # Public " )
2017-04-03 18:28:19 +02:00
assert Enum . member? ( get_in ( activity . data , [ " to " ] ) , " shp " )
2017-05-02 10:43:35 +02:00
assert activity . local == true
2017-03-23 23:34:10 +01:00
2017-05-18 15:16:49 +02:00
# hashtags
assert activity . data [ " object " ] [ " tag " ] == [ " 2hu " , " epic " , " phantasmagoric " ]
2017-04-30 14:02:04 +02:00
# Add a context
2017-03-23 23:34:10 +01:00
assert is_binary ( get_in ( activity . data , [ " context " ] ) )
assert is_binary ( get_in ( activity . data , [ " object " , " context " ] ) )
2017-03-30 17:07:03 +02:00
2017-03-30 18:07:38 +02:00
assert is_list ( activity . data [ " object " ] [ " attachment " ] )
2017-04-14 18:59:11 +02:00
assert activity . data [ " object " ] == Object . get_by_ap_id ( activity . data [ " object " ] [ " id " ] ) . data
2017-03-23 23:34:10 +01:00
end
test " create a status that is a reply " do
2017-04-03 18:28:19 +02:00
user = UserBuilder . build ( %{ ap_id : " some_cool_id " } )
2017-03-23 23:34:10 +01:00
input = %{
" status " = > " Hello again. "
}
{ :ok , activity = % Activity { } } = TwitterAPI . create_status ( user , input )
input = %{
" status " = > " Here's your (you). " ,
" in_reply_to_status_id " = > activity . id
}
{ :ok , reply = % Activity { } } = TwitterAPI . create_status ( user , input )
assert get_in ( reply . data , [ " context " ] ) == get_in ( activity . data , [ " context " ] )
assert get_in ( reply . data , [ " object " , " context " ] ) == get_in ( activity . data , [ " object " , " context " ] )
assert get_in ( reply . data , [ " object " , " inReplyTo " ] ) == get_in ( activity . data , [ " object " , " id " ] )
assert get_in ( reply . data , [ " object " , " inReplyToStatusId " ] ) == activity . id
2017-04-03 18:28:19 +02:00
assert Enum . member? ( get_in ( reply . data , [ " to " ] ) , " some_cool_id " )
2017-03-21 17:53:20 +01:00
end
2017-03-29 02:05:51 +02:00
test " upload a file " do
file = % Plug.Upload { content_type : " image/jpg " , path : Path . absname ( " test/fixtures/image.jpg " ) , filename : " an_image.jpg " }
response = TwitterAPI . upload ( file )
assert is_binary ( response )
end
2017-04-03 18:28:19 +02:00
test " it adds user links to an existing text " do
2017-05-15 18:25:21 +02:00
text = " @gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me "
2017-04-03 18:28:19 +02:00
2017-04-16 15:28:28 +02:00
gsimg = insert ( :user , %{ nickname : " gsimg " } )
archaeme = insert ( :user , %{ nickname : " archaeme " } )
2017-05-15 18:25:21 +02:00
archaeme_remote = insert ( :user , %{ nickname : " archaeme@archae.me " } )
2017-04-03 18:28:19 +02:00
2017-06-14 13:58:56 +02:00
mentions = Pleroma.Formatter . parse_mentions ( text )
2017-05-30 14:26:31 +02:00
expected_text = " <a href=' #{ gsimg . ap_id } '>@gsimg</a> According to <a href=' #{ archaeme . ap_id } '>@archaeme</a>, that is @daggsy. Also hello <a href=' #{ archaeme_remote . ap_id } '>@archaeme</a> "
2017-04-03 18:28:19 +02:00
2017-05-17 18:00:20 +02:00
assert Utils . add_user_links ( text , mentions ) == expected_text
2017-04-03 18:28:19 +02:00
end
2017-04-13 16:19:07 +02:00
test " it favorites a status, returns the updated status " do
user = insert ( :user )
note_activity = insert ( :note_activity )
{ :ok , status } = TwitterAPI . favorite ( user , note_activity )
updated_activity = Activity . get_by_ap_id ( note_activity . data [ " id " ] )
2017-06-20 14:13:25 +02:00
assert StatusView . render ( " show.json " , %{ activity : status } ) == StatusView . render ( " show.json " , %{ activity : updated_activity } ) # FIXME: was complaining about microseconds
2017-04-13 16:19:07 +02:00
end
2017-04-14 17:13:51 +02:00
2017-04-14 18:15:15 +02:00
test " it unfavorites a status, returns the updated status " do
user = insert ( :user )
note_activity = insert ( :note_activity )
object = Object . get_by_ap_id ( note_activity . data [ " object " ] [ " id " ] )
2017-04-14 18:27:17 +02:00
{ :ok , _like_activity , _object } = ActivityPub . like ( user , object )
2017-06-20 14:13:25 +02:00
% Activity { data : %{ " object " = > object } } = Activity . get_by_ap_id ( note_activity . data [ " id " ] )
assert object [ " like_count " ] == 1
2017-04-14 18:15:15 +02:00
2017-06-20 14:13:25 +02:00
{ :ok , % Activity { data : %{ " object " = > object } } } = TwitterAPI . unfavorite ( user , note_activity )
2017-04-14 18:15:15 +02:00
2017-06-20 14:13:25 +02:00
assert object [ " like_count " ] == 0
2017-04-14 18:15:15 +02:00
end
2017-04-15 13:54:46 +02:00
test " it retweets a status and returns the retweet " do
user = insert ( :user )
note_activity = insert ( :note_activity )
{ :ok , status } = TwitterAPI . retweet ( user , note_activity )
updated_activity = Activity . get_by_ap_id ( note_activity . data [ " id " ] )
2017-06-20 14:13:25 +02:00
assert StatusView . render ( " show.json " , %{ activity : status } ) == StatusView . render ( " show.json " , %{ activity : updated_activity } ) # FIXME: was complaining about microseconds
2017-04-15 13:54:46 +02:00
end
2017-04-30 13:53:26 +02:00
test " it assigns an integer conversation_id " do
note_activity = insert ( :note_activity )
2017-06-20 14:13:25 +02:00
assert is_number ( StatusView . conversation_id ( note_activity ) )
2017-04-30 13:53:26 +02:00
end
2017-04-14 17:13:51 +02:00
setup do
2017-04-17 11:36:17 +02:00
Supervisor . terminate_child ( Pleroma.Supervisor , Cachex )
Supervisor . restart_child ( Pleroma.Supervisor , Cachex )
2017-04-14 17:13:51 +02:00
:ok
end
2017-04-30 13:53:26 +02:00
describe " context_to_conversation_id " do
test " creates a mapping object " do
conversation_id = TwitterAPI . 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 = TwitterAPI . context_to_conversation_id ( " random context " )
assert conversation_id == object . id
end
end
2017-03-21 17:53:20 +01:00
end