2018-12-23 13:11:29 -07:00
# Pleroma: A lightweight social networking server
2023-01-02 13:38:50 -07:00
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
2018-12-23 13:11:29 -07:00
# SPDX-License-Identifier: AGPL-3.0-only
2017-09-09 04:10:29 -06:00
defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
use Pleroma.DataCase
2019-03-04 19:52:23 -07:00
alias Pleroma.Activity
2019-04-27 14:06:46 -06:00
alias Pleroma.Bookmark
2019-10-30 18:44:27 -06:00
alias Pleroma.Conversation.Participation
2019-10-30 00:20:13 -06:00
alias Pleroma.HTML
2019-04-17 03:22:32 -06:00
alias Pleroma.Object
2019-04-17 05:52:01 -06:00
alias Pleroma.Repo
alias Pleroma.User
2020-03-25 11:33:34 -06:00
alias Pleroma.UserRelationship
2017-09-17 05:54:14 -06:00
alias Pleroma.Web.CommonAPI
2019-02-10 14:57:38 -07:00
alias Pleroma.Web.MastodonAPI.AccountView
alias Pleroma.Web.MastodonAPI.StatusView
2020-03-25 11:33:34 -06:00
2022-08-07 12:39:35 -06:00
require Bitwise
2017-09-09 04:10:29 -06:00
import Pleroma.Factory
2018-12-03 11:37:55 -07:00
import Tesla.Mock
2020-05-12 13:59:26 -06:00
import OpenApiSpex.TestAssertions
2018-12-03 11:37:55 -07:00
setup do
mock ( fn env -> apply ( HttpRequestMock , :request , [ env ] ) end )
:ok
end
2017-09-09 04:10:29 -06:00
2020-01-20 08:24:20 -07:00
test " has an emoji reaction list " do
user = insert ( :user )
other_user = insert ( :user )
third_user = insert ( :user )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " dae cofe?? " } )
2020-01-20 08:24:20 -07:00
2020-05-05 04:28:28 -06:00
{ :ok , _ } = CommonAPI . react_with_emoji ( activity . id , user , " ☕ " )
2022-12-18 11:52:19 -07:00
{ :ok , _ } = CommonAPI . react_with_emoji ( activity . id , user , " :dinosaur: " )
2020-05-05 04:28:28 -06:00
{ :ok , _ } = CommonAPI . react_with_emoji ( activity . id , third_user , " 🍵 " )
{ :ok , _ } = CommonAPI . react_with_emoji ( activity . id , other_user , " ☕ " )
2022-12-18 11:52:19 -07:00
{ :ok , _ } = CommonAPI . react_with_emoji ( activity . id , other_user , " :dinosaur: " )
2020-01-20 08:24:20 -07:00
activity = Repo . get ( Activity , activity . id )
status = StatusView . render ( " show.json " , activity : activity )
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2020-01-24 02:52:24 -07:00
assert status [ :pleroma ] [ :emoji_reactions ] == [
2022-12-18 11:52:19 -07:00
%{ name : " ☕ " , count : 2 , me : false , url : nil , account_ids : [ other_user . id , user . id ] } ,
%{
count : 2 ,
me : false ,
name : " dinosaur " ,
url : " http://localhost:4001/emoji/dino walking.gif " ,
account_ids : [ other_user . id , user . id ]
} ,
%{ name : " 🍵 " , count : 1 , me : false , url : nil , account_ids : [ third_user . id ] }
2020-01-29 03:39:06 -07:00
]
status = StatusView . render ( " show.json " , activity : activity , for : user )
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2020-01-29 03:39:06 -07:00
assert status [ :pleroma ] [ :emoji_reactions ] == [
2022-12-18 11:52:19 -07:00
%{ name : " ☕ " , count : 2 , me : true , url : nil , account_ids : [ other_user . id , user . id ] } ,
%{
count : 2 ,
me : true ,
name : " dinosaur " ,
url : " http://localhost:4001/emoji/dino walking.gif " ,
account_ids : [ other_user . id , user . id ]
} ,
%{ name : " 🍵 " , count : 1 , me : false , url : nil , account_ids : [ third_user . id ] }
2020-01-24 02:52:24 -07:00
]
2020-01-20 08:24:20 -07:00
end
2023-03-26 13:12:40 -06:00
test " works with legacy-formatted reactions " do
user = insert ( :user )
other_user = insert ( :user )
note =
insert ( :note ,
user : user ,
data : %{
" reactions " = > [ [ " 😿 " , [ other_user . ap_id ] ] ]
}
)
activity = insert ( :note_activity , user : user , note : note )
status = StatusView . render ( " show.json " , activity : activity , for : user )
assert status [ :pleroma ] [ :emoji_reactions ] == [
%{ name : " 😿 " , count : 1 , me : false , url : nil , account_ids : [ other_user . id ] }
]
end
2020-07-22 06:44:06 -06:00
test " works correctly with badly formatted emojis " do
user = insert ( :user )
{ :ok , activity } = CommonAPI . post ( user , %{ status : " yo " } )
activity
2021-01-04 05:38:31 -07:00
|> Object . normalize ( fetch : false )
2020-07-22 06:44:06 -06:00
|> Object . update_data ( %{ " reactions " = > %{ " ☕ " = > [ user . ap_id ] , " x " = > 1 } } )
activity = Activity . get_by_id ( activity . id )
status = StatusView . render ( " show.json " , activity : activity , for : user )
assert status [ :pleroma ] [ :emoji_reactions ] == [
2022-12-18 11:52:19 -07:00
%{ name : " ☕ " , count : 1 , me : true , url : nil , account_ids : [ user . id ] }
2020-07-22 06:44:06 -06:00
]
end
2020-11-16 11:23:25 -07:00
test " doesn't show reactions from muted and blocked users " do
user = insert ( :user )
other_user = insert ( :user )
third_user = insert ( :user )
{ :ok , activity } = CommonAPI . post ( user , %{ status : " dae cofe?? " } )
{ :ok , _ } = User . mute ( user , other_user )
{ :ok , _ } = User . block ( other_user , third_user )
{ :ok , _ } = CommonAPI . react_with_emoji ( activity . id , other_user , " ☕ " )
activity = Repo . get ( Activity , activity . id )
status = StatusView . render ( " show.json " , activity : activity )
assert status [ :pleroma ] [ :emoji_reactions ] == [
2022-12-18 11:52:19 -07:00
%{ name : " ☕ " , count : 1 , me : false , url : nil , account_ids : [ other_user . id ] }
2020-11-16 11:23:25 -07:00
]
status = StatusView . render ( " show.json " , activity : activity , for : user )
assert status [ :pleroma ] [ :emoji_reactions ] == [ ]
{ :ok , _ } = CommonAPI . react_with_emoji ( activity . id , third_user , " ☕ " )
status = StatusView . render ( " show.json " , activity : activity )
assert status [ :pleroma ] [ :emoji_reactions ] == [
2022-12-18 11:52:19 -07:00
%{
name : " ☕ " ,
count : 2 ,
me : false ,
url : nil ,
account_ids : [ third_user . id , other_user . id ]
}
2020-11-16 11:23:25 -07:00
]
status = StatusView . render ( " show.json " , activity : activity , for : user )
assert status [ :pleroma ] [ :emoji_reactions ] == [
2022-12-18 11:52:19 -07:00
%{ name : " ☕ " , count : 1 , me : false , url : nil , account_ids : [ third_user . id ] }
2020-11-16 11:23:25 -07:00
]
status = StatusView . render ( " show.json " , activity : activity , for : other_user )
assert status [ :pleroma ] [ :emoji_reactions ] == [
2022-12-18 11:52:19 -07:00
%{ name : " ☕ " , count : 1 , me : true , url : nil , account_ids : [ other_user . id ] }
2020-11-16 11:23:25 -07:00
]
end
2019-10-30 18:44:27 -06:00
test " loads and returns the direct conversation id when given the `with_direct_conversation_id` option " do
2019-07-31 07:12:29 -06:00
user = insert ( :user )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " Hey @shp! " , visibility : " direct " } )
2019-10-30 18:44:27 -06:00
[ participation ] = Participation . for_user ( user )
2019-07-31 07:12:29 -06:00
status =
2019-09-09 08:49:02 -06:00
StatusView . render ( " show.json " ,
2019-07-31 07:12:29 -06:00
activity : activity ,
with_direct_conversation_id : true ,
for : user
)
2019-10-30 18:44:27 -06:00
assert status [ :pleroma ] [ :direct_conversation_id ] == participation . id
status = StatusView . render ( " show.json " , activity : activity , for : user )
assert status [ :pleroma ] [ :direct_conversation_id ] == nil
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2019-10-30 18:44:27 -06:00
end
test " returns the direct conversation id when given the `direct_conversation_id` option " do
user = insert ( :user )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " Hey @shp! " , visibility : " direct " } )
2019-10-30 18:44:27 -06:00
[ participation ] = Participation . for_user ( user )
status =
StatusView . render ( " show.json " ,
activity : activity ,
direct_conversation_id : participation . id ,
for : user
)
assert status [ :pleroma ] [ :direct_conversation_id ] == participation . id
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2019-07-31 07:12:29 -06:00
end
2019-01-16 07:13:09 -07:00
test " returns a temporary ap_id based user for activities missing db users " do
user = insert ( :user )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " Hey @shp! " , visibility : " direct " } )
2019-01-16 07:13:09 -07:00
Repo . delete ( user )
2020-12-18 05:18:17 -07:00
User . invalidate_cache ( user )
2019-01-16 07:13:09 -07:00
2020-03-05 07:31:06 -07:00
finger_url =
" https://localhost/.well-known/webfinger?resource=acct: #{ user . nickname } @localhost "
Tesla.Mock . mock_global ( fn
%{ method : :get , url : " http://localhost/.well-known/host-meta " } ->
% Tesla.Env { status : 404 , body : " " }
%{ method : :get , url : " https://localhost/.well-known/host-meta " } ->
% Tesla.Env { status : 404 , body : " " }
%{
method : :get ,
url : ^ finger_url
} ->
% Tesla.Env { status : 404 , body : " " }
end )
2019-09-09 08:49:02 -06:00
%{ account : ms_user } = StatusView . render ( " show.json " , activity : activity )
2019-01-16 07:13:09 -07:00
assert ms_user . acct == " erroruser@example.com "
end
test " tries to get a user by nickname if fetching by ap_id doesn't work " do
user = insert ( :user )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " Hey @shp! " , visibility : " direct " } )
2019-01-16 07:13:09 -07:00
{ :ok , user } =
user
|> Ecto.Changeset . change ( %{ ap_id : " #{ user . ap_id } /extension/ #{ user . nickname } " } )
|> Repo . update ( )
2020-12-18 05:18:17 -07:00
User . invalidate_cache ( user )
2019-01-16 07:13:09 -07:00
2019-09-09 08:49:02 -06:00
result = StatusView . render ( " show.json " , activity : activity )
2019-01-16 07:13:09 -07:00
assert result [ :account ] [ :id ] == to_string ( user . id )
2020-05-12 13:59:26 -06:00
assert_schema ( result , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2019-01-16 07:13:09 -07:00
end
2017-09-09 04:10:29 -06:00
2018-11-03 09:28:29 -06:00
test " a note with null content " do
note = insert ( :note_activity )
2021-01-04 05:38:31 -07:00
note_object = Object . normalize ( note , fetch : false )
2018-11-03 09:40:57 -06:00
data =
2018-11-25 14:08:55 -07:00
note_object . data
|> Map . put ( " content " , nil )
2018-11-03 09:40:57 -06:00
2018-11-25 14:08:55 -07:00
Object . change ( note_object , %{ data : data } )
2019-04-17 06:46:59 -06:00
|> Object . update_and_set_cache ( )
2018-11-03 09:28:29 -06:00
2018-12-06 11:50:34 -07:00
User . get_cached_by_ap_id ( note . data [ " actor " ] )
2018-11-03 09:28:29 -06:00
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : note } )
2018-11-03 09:28:29 -06:00
assert status . content == " "
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2018-11-03 09:28:29 -06:00
end
2017-09-09 04:10:29 -06:00
test " a note activity " do
note = insert ( :note_activity )
2021-01-04 05:38:31 -07:00
object_data = Object . normalize ( note , fetch : false ) . data
2017-09-09 04:10:29 -06:00
user = User . get_cached_by_ap_id ( note . data [ " actor " ] )
2022-08-07 12:37:17 -06:00
convo_id = :erlang . crc32 ( object_data [ " context " ] ) |> Bitwise . band ( Bitwise . bnot ( 0x8000_0000 ) )
2019-03-21 17:25:41 -06:00
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : note } )
2017-09-09 04:10:29 -06:00
2018-03-30 07:01:53 -06:00
created_at =
2019-07-08 10:53:02 -06:00
( object_data [ " published " ] || " " )
2018-03-30 07:01:53 -06:00
|> String . replace ( ~r/ \. \d +Z / , " .000Z " )
2017-09-12 05:31:17 -06:00
2017-09-09 04:10:29 -06:00
expected = %{
2017-10-31 07:51:41 -06:00
id : to_string ( note . id ) ,
2019-07-08 10:53:02 -06:00
uri : object_data [ " id " ] ,
2019-02-20 09:36:16 -07:00
url : Pleroma.Web.Router.Helpers . o_status_url ( Pleroma.Web.Endpoint , :notice , note ) ,
2020-07-23 06:08:30 -06:00
account : AccountView . render ( " show.json " , %{ user : user , skip_visibility_check : true } ) ,
2017-09-09 04:10:29 -06:00
in_reply_to_id : nil ,
in_reply_to_account_id : nil ,
2019-01-27 05:21:51 -07:00
card : nil ,
2017-09-09 04:10:29 -06:00
reblog : nil ,
2019-10-30 00:20:13 -06:00
content : HTML . filter_tags ( object_data [ " content " ] ) ,
2020-06-25 23:16:24 -06:00
text : nil ,
2017-09-12 05:31:17 -06:00
created_at : created_at ,
2022-06-03 19:47:40 -06:00
edited_at : nil ,
2017-09-09 04:10:29 -06:00
reblogs_count : 0 ,
2018-09-20 08:10:46 -06:00
replies_count : 0 ,
2017-09-09 04:10:29 -06:00
favourites_count : 0 ,
reblogged : false ,
2018-09-18 18:04:56 -06:00
bookmarked : false ,
2017-09-09 04:10:29 -06:00
favourited : false ,
muted : false ,
2019-01-08 01:27:02 -07:00
pinned : false ,
2017-09-09 04:10:29 -06:00
sensitive : false ,
2019-05-18 04:29:28 -06:00
poll : nil ,
2019-10-30 00:20:13 -06:00
spoiler_text : HTML . filter_tags ( object_data [ " summary " ] ) ,
2017-09-09 04:10:29 -06:00
visibility : " public " ,
media_attachments : [ ] ,
mentions : [ ] ,
2018-12-13 05:13:02 -07:00
tags : [
%{
2020-12-21 12:54:26 -07:00
name : " #{ hd ( object_data [ " tag " ] ) } " ,
2021-01-22 00:05:28 -07:00
url : " http://localhost:4001/tag/ #{ hd ( object_data [ " tag " ] ) } "
2018-12-13 05:13:02 -07:00
}
] ,
2021-02-18 15:35:03 -07:00
application : nil ,
2017-10-23 08:27:51 -06:00
language : nil ,
emojis : [
%{
shortcode : " 2hu " ,
url : " corndog.png " ,
2018-09-10 17:40:29 -06:00
static_url : " corndog.png " ,
visible_in_picker : false
2017-10-23 08:27:51 -06:00
}
2019-03-11 06:48:27 -06:00
] ,
pleroma : %{
2019-03-21 17:25:41 -06:00
local : true ,
2016-12-31 17:10:08 -07:00
conversation_id : convo_id ,
2022-08-07 12:39:35 -06:00
context : object_data [ " context " ] ,
2019-04-22 02:53:37 -06:00
in_reply_to_account_acct : nil ,
2022-01-22 19:05:58 -07:00
quote : nil ,
2023-07-12 21:47:31 -06:00
quote_id : nil ,
2022-01-23 12:55:25 -07:00
quote_url : nil ,
2022-01-26 10:52:50 -07:00
quote_visible : false ,
2019-10-30 00:20:13 -06:00
content : %{ " text/plain " = > HTML . strip_tags ( object_data [ " content " ] ) } ,
spoiler_text : %{ " text/plain " = > HTML . strip_tags ( object_data [ " summary " ] ) } ,
2019-08-24 07:48:33 -06:00
expires_at : nil ,
2019-09-04 05:16:56 -06:00
direct_conversation_id : nil ,
2020-01-20 08:24:20 -07:00
thread_muted : false ,
2020-06-24 05:29:08 -06:00
emoji_reactions : [ ] ,
2021-02-03 06:09:28 -07:00
parent_visible : false ,
pinned_at : nil
2019-03-11 06:48:27 -06:00
}
2017-09-09 04:10:29 -06:00
}
assert status == expected
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2017-09-09 04:10:29 -06:00
end
2019-02-27 08:46:47 -07:00
test " tells if the message is muted for some reason " do
user = insert ( :user )
other_user = insert ( :user )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationships } = User . mute ( user , other_user )
2019-02-27 08:46:47 -07:00
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( other_user , %{ status : " test " } )
2019-02-27 08:46:47 -07:00
2020-03-25 11:33:34 -06:00
relationships_opt = UserRelationship . view_relationships_option ( user , [ other_user ] )
opts = %{ activity : activity }
status = StatusView . render ( " show.json " , opts )
2019-02-27 08:46:47 -07:00
assert status . muted == false
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2019-02-27 08:46:47 -07:00
2020-03-25 11:33:34 -06:00
status = StatusView . render ( " show.json " , Map . put ( opts , :relationships , relationships_opt ) )
assert status . muted == false
2019-02-27 08:46:47 -07:00
2020-03-25 11:33:34 -06:00
for_opts = %{ activity : activity , for : user }
status = StatusView . render ( " show.json " , for_opts )
assert status . muted == true
2019-02-27 08:46:47 -07:00
2020-03-25 11:33:34 -06:00
status = StatusView . render ( " show.json " , Map . put ( for_opts , :relationships , relationships_opt ) )
2019-02-27 08:46:47 -07:00
assert status . muted == true
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2019-02-27 08:46:47 -07:00
end
2019-09-04 05:16:56 -06:00
test " tells if the message is thread muted " do
user = insert ( :user )
other_user = insert ( :user )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationships } = User . mute ( user , other_user )
2019-09-04 05:16:56 -06:00
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( other_user , %{ status : " test " } )
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : activity , for : user } )
2019-09-04 05:16:56 -06:00
assert status . pleroma . thread_muted == false
{ :ok , activity } = CommonAPI . add_mute ( user , activity )
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : activity , for : user } )
2019-09-04 05:16:56 -06:00
assert status . pleroma . thread_muted == true
end
2019-04-27 14:06:46 -06:00
test " tells if the status is bookmarked " do
user = insert ( :user )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " Cute girls doing cute things " } )
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : activity } )
2019-04-27 14:06:46 -06:00
assert status . bookmarked == false
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : activity , for : user } )
2019-04-27 14:06:46 -06:00
assert status . bookmarked == false
{ :ok , _bookmark } = Bookmark . create ( user . id , activity . id )
2019-05-04 04:42:54 -06:00
activity = Activity . get_by_id_with_object ( activity . id )
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : activity , for : user } )
2019-04-27 14:06:46 -06:00
assert status . bookmarked == true
end
2018-03-27 09:43:08 -06:00
test " a reply " do
note = insert ( :note_activity )
user = insert ( :user )
2018-03-30 07:01:53 -06:00
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " he " , in_reply_to_status_id : note . id } )
2018-03-27 09:43:08 -06:00
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : activity } )
2018-03-27 10:18:24 -06:00
2018-06-15 13:37:29 -06:00
assert status . in_reply_to_id == to_string ( note . id )
2018-03-27 10:18:24 -06:00
[ status ] = StatusView . render ( " index.json " , %{ activities : [ activity ] , as : :activity } )
2018-06-15 13:37:29 -06:00
assert status . in_reply_to_id == to_string ( note . id )
2018-03-27 09:43:08 -06:00
end
2022-01-23 12:55:25 -07:00
test " a quote post " do
post = insert ( :note_activity )
user = insert ( :user )
{ :ok , quote_post } = CommonAPI . post ( user , %{ status : " he " , quote_id : post . id } )
{ :ok , quoted_quote_post } = CommonAPI . post ( user , %{ status : " yo " , quote_id : quote_post . id } )
status = StatusView . render ( " show.json " , %{ activity : quoted_quote_post } )
assert status . pleroma . quote . id == to_string ( quote_post . id )
2023-07-12 21:47:31 -06:00
assert status . pleroma . quote_id == to_string ( quote_post . id )
2022-01-23 12:55:25 -07:00
assert status . pleroma . quote_url == Object . normalize ( quote_post ) . data [ " id " ]
2023-07-12 21:56:54 -06:00
assert status . pleroma . quote_visible
2022-01-23 12:55:25 -07:00
# Quotes don't go more than one level deep
refute status . pleroma . quote . pleroma . quote
2023-07-12 21:47:31 -06:00
assert status . pleroma . quote . pleroma . quote_id == to_string ( post . id )
2022-01-23 12:55:25 -07:00
assert status . pleroma . quote . pleroma . quote_url == Object . normalize ( post ) . data [ " id " ]
2023-07-12 21:56:54 -06:00
assert status . pleroma . quote . pleroma . quote_visible
2022-01-23 12:55:25 -07:00
# In an index
[ status ] = StatusView . render ( " index.json " , %{ activities : [ quoted_quote_post ] , as : :activity } )
assert status . pleroma . quote . id == to_string ( quote_post . id )
end
2022-01-26 10:49:31 -07:00
test " quoted private post " do
user = insert ( :user )
# Insert a private post
private = insert ( :followers_only_note_activity , user : user )
private_object = Object . normalize ( private )
# Create a public post quoting the private post
quote_private =
insert ( :note_activity , note : insert ( :note , data : %{ " quoteUrl " = > private_object . data [ " id " ] } ) )
status = StatusView . render ( " show.json " , %{ activity : quote_private } )
# The quote isn't rendered
refute status . pleroma . quote
assert status . pleroma . quote_url == private_object . data [ " id " ]
2022-01-26 10:52:50 -07:00
refute status . pleroma . quote_visible
2022-01-26 10:49:31 -07:00
# After following the user, the quote is rendered
follower = insert ( :user )
CommonAPI . follow ( follower , user )
status = StatusView . render ( " show.json " , %{ activity : quote_private , for : follower } )
assert status . pleroma . quote . id == to_string ( private . id )
2022-01-26 10:52:50 -07:00
assert status . pleroma . quote_visible
2022-01-26 10:49:31 -07:00
end
test " quoted direct message " do
# Insert a direct message
direct = insert ( :direct_note_activity )
direct_object = Object . normalize ( direct )
# Create a public post quoting the direct message
quote_direct =
insert ( :note_activity , note : insert ( :note , data : %{ " quoteUrl " = > direct_object . data [ " id " ] } ) )
status = StatusView . render ( " show.json " , %{ activity : quote_direct } )
# The quote isn't rendered
refute status . pleroma . quote
assert status . pleroma . quote_url == direct_object . data [ " id " ]
2022-01-26 10:52:50 -07:00
refute status . pleroma . quote_visible
2022-01-26 10:49:31 -07:00
end
2022-01-28 11:33:07 -07:00
test " repost of quote post " do
post = insert ( :note_activity )
user = insert ( :user )
{ :ok , quote_post } = CommonAPI . post ( user , %{ status : " he " , quote_id : post . id } )
{ :ok , repost } = CommonAPI . repeat ( quote_post . id , user )
[ status ] = StatusView . render ( " index.json " , %{ activities : [ repost ] , as : :activity } )
assert status . reblog . pleroma . quote . id == to_string ( post . id )
end
2019-10-18 09:46:46 -06:00
test " contains mentions " do
user = insert ( :user )
mentioned = insert ( :user )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " hi @ #{ mentioned . nickname } " } )
2019-10-18 09:46:46 -06:00
status = StatusView . render ( " show.json " , %{ activity : activity } )
assert status . mentions ==
Enum . map ( [ mentioned ] , fn u -> AccountView . render ( " mention.json " , %{ user : u } ) end )
2020-05-12 13:59:26 -06:00
assert_schema ( status , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2019-10-18 09:46:46 -06:00
end
2019-07-10 07:29:50 -06:00
test " create mentions from the 'to' field " do
% User { ap_id : recipient_ap_id } = insert ( :user )
cc = insert_pair ( :user ) |> Enum . map ( & &1 . ap_id )
object =
insert ( :note , %{
data : %{
" to " = > [ recipient_ap_id ] ,
" cc " = > cc
}
} )
activity =
insert ( :note_activity , %{
note : object ,
recipients : [ recipient_ap_id | cc ]
} )
assert length ( activity . recipients ) == 3
2019-09-09 08:49:02 -06:00
%{ mentions : [ mention ] = mentions } = StatusView . render ( " show.json " , %{ activity : activity } )
2019-07-10 07:29:50 -06:00
assert length ( mentions ) == 1
assert mention . url == recipient_ap_id
end
test " create mentions from the 'tag' field " do
recipient = insert ( :user )
cc = insert_pair ( :user ) |> Enum . map ( & &1 . ap_id )
object =
insert ( :note , %{
data : %{
" cc " = > cc ,
" tag " = > [
%{
" href " = > recipient . ap_id ,
" name " = > recipient . nickname ,
" type " = > " Mention "
} ,
%{
" href " = > " https://example.com/search?tag=test " ,
" name " = > " # test " ,
" type " = > " Hashtag "
}
]
}
} )
activity =
insert ( :note_activity , %{
note : object ,
recipients : [ recipient . ap_id | cc ]
} )
assert length ( activity . recipients ) == 3
2019-09-09 08:49:02 -06:00
%{ mentions : [ mention ] = mentions } = StatusView . render ( " show.json " , %{ activity : activity } )
2019-07-10 07:29:50 -06:00
assert length ( mentions ) == 1
assert mention . url == recipient . ap_id
2017-09-09 04:10:29 -06:00
end
2017-09-10 03:51:01 -06:00
test " attachments " do
object = %{
" type " = > " Image " ,
" url " = > [
%{
" mediaType " = > " image/png " ,
2021-05-12 12:38:11 -06:00
" href " = > " someurl " ,
" width " = > 200 ,
" height " = > 100
2017-09-10 03:51:01 -06:00
}
] ,
2020-11-11 11:51:13 -07:00
" blurhash " = > " UJJ8X[xYW,%Jtq%NNFbXB5j]IVM|9GV=WHRn " ,
2017-09-10 03:51:01 -06:00
" uuid " = > 6
}
expected = %{
2017-11-15 10:58:13 -07:00
id : " 1638338801 " ,
2017-09-10 03:51:01 -06:00
type : " image " ,
url : " someurl " ,
remote_url : " someurl " ,
2017-09-14 00:38:48 -06:00
preview_url : " someurl " ,
2018-07-16 21:37:40 -06:00
text_url : " someurl " ,
2019-03-15 02:58:12 -06:00
description : nil ,
2020-11-11 11:51:13 -07:00
pleroma : %{ mime_type : " image/png " } ,
2021-05-12 12:38:11 -06:00
meta : %{ original : %{ width : 200 , height : 100 , aspect : 2 } } ,
2020-11-11 11:51:13 -07:00
blurhash : " UJJ8X[xYW,%Jtq%NNFbXB5j]IVM|9GV=WHRn "
2017-09-10 03:51:01 -06:00
}
2020-05-05 13:42:18 -06:00
api_spec = Pleroma.Web.ApiSpec . spec ( )
2017-09-10 03:51:01 -06:00
assert expected == StatusView . render ( " attachment.json " , %{ attachment : object } )
2020-05-12 13:59:26 -06:00
assert_schema ( expected , " Attachment " , api_spec )
2017-09-14 00:08:32 -06:00
# If theres a "id", use that instead of the generated one
object = Map . put ( object , " id " , 2 )
2020-05-05 13:42:18 -06:00
result = StatusView . render ( " attachment.json " , %{ attachment : object } )
assert %{ id : " 2 " } = result
2020-05-12 13:59:26 -06:00
assert_schema ( result , " Attachment " , api_spec )
2017-09-10 03:51:01 -06:00
end
2017-09-17 05:54:14 -06:00
2019-07-24 13:28:21 -06:00
test " put the url advertised in the Activity in to the url attribute " do
id = " https://wedistribute.org/wp-json/pterotype/v1/object/85810 "
[ activity ] = Activity . search ( nil , id )
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , %{ activity : activity } )
2019-07-24 13:28:21 -06:00
assert status . uri == id
assert status . url == " https://wedistribute.org/2019/07/mastodon-drops-ostatus/ "
end
2017-09-17 05:54:14 -06:00
test " a reblog " do
user = insert ( :user )
activity = insert ( :note_activity )
2020-05-21 05:16:21 -06:00
{ :ok , reblog } = CommonAPI . repeat ( activity . id , user )
2017-09-17 05:54:14 -06:00
2019-09-09 08:49:02 -06:00
represented = StatusView . render ( " show.json " , %{ for : user , activity : reblog } )
2017-09-17 05:54:14 -06:00
2017-10-31 07:51:41 -06:00
assert represented [ :id ] == to_string ( reblog . id )
assert represented [ :reblog ] [ :id ] == to_string ( activity . id )
2017-11-11 03:18:05 -07:00
assert represented [ :emojis ] == [ ]
2020-05-12 13:59:26 -06:00
assert_schema ( represented , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2017-09-17 05:54:14 -06:00
end
2018-12-13 05:13:02 -07:00
2018-12-23 06:42:42 -07:00
test " a peertube video " do
user = insert ( :user )
{ :ok , object } =
2019-04-17 05:21:39 -06:00
Pleroma.Object.Fetcher . fetch_object_from_id (
2018-12-23 06:42:42 -07:00
" https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3 "
)
2019-01-20 23:14:20 -07:00
% Activity { } = activity = Activity . get_create_by_object_ap_id ( object . data [ " id " ] )
2018-12-23 06:42:42 -07:00
2019-09-09 08:49:02 -06:00
represented = StatusView . render ( " show.json " , %{ for : user , activity : activity } )
2018-12-23 06:42:42 -07:00
assert represented [ :id ] == to_string ( activity . id )
assert length ( represented [ :media_attachments ] ) == 1
2020-05-12 13:59:26 -06:00
assert_schema ( represented , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2018-12-23 06:42:42 -07:00
end
2020-03-11 05:21:44 -06:00
test " funkwhale audio " do
user = insert ( :user )
{ :ok , object } =
Pleroma.Object.Fetcher . fetch_object_from_id (
" https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871 "
)
% Activity { } = activity = Activity . get_create_by_object_ap_id ( object . data [ " id " ] )
represented = StatusView . render ( " show.json " , %{ for : user , activity : activity } )
assert represented [ :id ] == to_string ( activity . id )
assert length ( represented [ :media_attachments ] ) == 1
end
2019-12-17 08:16:21 -07:00
test " a Mobilizon event " do
user = insert ( :user )
{ :ok , object } =
Pleroma.Object.Fetcher . fetch_object_from_id (
" https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39 "
)
% Activity { } = activity = Activity . get_create_by_object_ap_id ( object . data [ " id " ] )
represented = StatusView . render ( " show.json " , %{ for : user , activity : activity } )
assert represented [ :id ] == to_string ( activity . id )
2020-08-20 10:41:42 -06:00
assert represented [ :url ] ==
" https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39 "
assert represented [ :content ] ==
" <p><a href= \" https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39 \" >Mobilizon Launching Party</a></p><p>Mobilizon is now federated! 🎉</p><p></p><p>You can view this event from other instances if they are subscribed to mobilizon.org, and soon directly from Mastodon and Pleroma. It is possible that you may see some comments from other instances, including Mastodon ones, just below.</p><p></p><p>With a Mobilizon account on an instance, you may <strong>participate</strong> at events from other instances and <strong>add comments</strong> on events.</p><p></p><p>Of course, it& # 39;s still <u>a work in progress</u>: if reports made from an instance on events and comments can be federated, you can& # 39;t block people right now, and moderators actions are rather limited, but this <strong>will definitely get fixed over time</strong> until first stable version next year.</p><p></p><p>Anyway, if you want to come up with some feedback, head over to our forum or - if you feel you have technical skills and are familiar with it - on our Gitlab repository.</p><p></p><p>Also, to people that want to set Mobilizon themselves even though we really don& # 39;t advise to do that for now, we have a little documentation but it& # 39;s quite the early days and you& # 39;ll probably need some help. No worries, you can chat with us on our Forum or though our Matrix channel.</p><p></p><p>Check our website for more informations and follow us on Twitter or Mastodon.</p> "
2019-12-17 08:16:21 -07:00
end
2018-12-13 05:13:02 -07:00
describe " build_tags/1 " do
test " it returns a a dictionary tags " do
2018-12-14 12:56:37 -07:00
object_tags = [
" fediverse " ,
" mastodon " ,
" nextcloud " ,
%{
" href " = > " https://kawen.space/users/lain " ,
" name " = > " @lain@kawen.space " ,
" type " = > " Mention "
}
]
assert StatusView . build_tags ( object_tags ) == [
2021-01-21 15:49:19 -07:00
%{ name : " fediverse " , url : " http://localhost:4001/tag/fediverse " } ,
%{ name : " mastodon " , url : " http://localhost:4001/tag/mastodon " } ,
%{ name : " nextcloud " , url : " http://localhost:4001/tag/nextcloud " }
2018-12-13 05:13:02 -07:00
]
end
end
2019-02-06 11:12:26 -07:00
describe " rich media cards " do
test " a rich media card without a site name renders correctly " do
page_url = " http://example.com "
card = %{
url : page_url ,
image : page_url <> " /example.jpg " ,
title : " Example website "
}
%{ provider_name : " example.com " } =
StatusView . render ( " card.json " , %{ page_url : page_url , rich_media : card } )
end
test " a rich media card without a site name or image renders correctly " do
page_url = " http://example.com "
card = %{
url : page_url ,
title : " Example website "
}
%{ provider_name : " example.com " } =
StatusView . render ( " card.json " , %{ page_url : page_url , rich_media : card } )
end
test " a rich media card without an image renders correctly " do
page_url = " http://example.com "
card = %{
url : page_url ,
site_name : " Example site name " ,
title : " Example website "
}
2020-02-14 16:35:46 -07:00
%{ provider_name : " example.com " } =
2019-02-06 11:12:26 -07:00
StatusView . render ( " card.json " , %{ page_url : page_url , rich_media : card } )
end
2019-02-06 11:27:55 -07:00
test " a rich media card with all relevant data renders correctly " do
page_url = " http://example.com "
card = %{
url : page_url ,
site_name : " Example site name " ,
title : " Example website " ,
image : page_url <> " /example.jpg " ,
description : " Example description "
}
2020-02-14 16:35:46 -07:00
%{ provider_name : " example.com " } =
2019-02-06 11:27:55 -07:00
StatusView . render ( " card.json " , %{ page_url : page_url , rich_media : card } )
end
2019-02-06 11:12:26 -07:00
end
2019-06-02 14:25:33 -06:00
2020-05-01 09:45:24 -06:00
test " does not embed a relationship in the account " do
2019-07-08 02:47:40 -06:00
user = insert ( :user )
other_user = insert ( :user )
{ :ok , activity } =
CommonAPI . post ( user , %{
2020-05-12 13:59:26 -06:00
status : " drink more water "
2019-07-08 02:47:40 -06:00
} )
2019-09-09 08:49:02 -06:00
result = StatusView . render ( " show.json " , %{ activity : activity , for : other_user } )
2019-07-08 02:47:40 -06:00
2020-05-01 09:45:24 -06:00
assert result [ :account ] [ :pleroma ] [ :relationship ] == %{ }
2020-05-12 13:59:26 -06:00
assert_schema ( result , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2019-07-08 02:47:40 -06:00
end
2020-05-01 09:45:24 -06:00
test " does not embed a relationship in the account in reposts " do
2019-07-08 02:47:40 -06:00
user = insert ( :user )
other_user = insert ( :user )
{ :ok , activity } =
CommonAPI . post ( user , %{
2020-05-12 13:59:26 -06:00
status : " ˙˙ɐʎns "
2019-07-08 02:47:40 -06:00
} )
2020-05-21 05:16:21 -06:00
{ :ok , activity } = CommonAPI . repeat ( activity . id , other_user )
2019-07-08 02:47:40 -06:00
2019-09-09 08:49:02 -06:00
result = StatusView . render ( " show.json " , %{ activity : activity , for : user } )
2019-07-08 02:47:40 -06:00
2020-05-01 09:45:24 -06:00
assert result [ :account ] [ :pleroma ] [ :relationship ] == %{ }
assert result [ :reblog ] [ :account ] [ :pleroma ] [ :relationship ] == %{ }
2020-05-12 13:59:26 -06:00
assert_schema ( result , " Status " , Pleroma.Web.ApiSpec . spec ( ) )
2019-07-08 02:47:40 -06:00
end
2019-07-15 01:00:29 -06:00
test " visibility/list " do
user = insert ( :user )
{ :ok , list } = Pleroma.List . create ( " foo " , user )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " foobar " , visibility : " list: #{ list . id } " } )
2019-07-15 01:00:29 -06:00
2019-09-09 08:49:02 -06:00
status = StatusView . render ( " show.json " , activity : activity )
2019-07-15 01:00:29 -06:00
assert status . visibility == " list "
end
2020-06-24 05:29:08 -06:00
test " has a field for parent visibility " do
user = insert ( :user )
poster = insert ( :user )
{ :ok , invisible } = CommonAPI . post ( poster , %{ status : " hey " , visibility : " private " } )
{ :ok , visible } =
CommonAPI . post ( poster , %{ status : " hey " , visibility : " private " , in_reply_to_id : invisible . id } )
status = StatusView . render ( " show.json " , activity : visible , for : user )
refute status . pleroma . parent_visible
status = StatusView . render ( " show.json " , activity : visible , for : poster )
assert status . pleroma . parent_visible
end
2022-06-03 19:47:40 -06:00
test " it shows edited_at " do
poster = insert ( :user )
{ :ok , post } = CommonAPI . post ( poster , %{ status : " hey " } )
status = StatusView . render ( " show.json " , activity : post )
refute status . edited_at
{ :ok , _ } = CommonAPI . update ( poster , post , %{ status : " mew mew " } )
edited = Pleroma.Activity . normalize ( post )
status = StatusView . render ( " show.json " , activity : edited )
assert status . edited_at
end
2022-06-04 10:56:56 -06:00
test " with a source object " do
note =
insert ( :note ,
data : %{ " source " = > %{ " content " = > " object source " , " mediaType " = > " text/markdown " } }
)
activity = insert ( :note_activity , note : note )
status = StatusView . render ( " show.json " , activity : activity , with_source : true )
assert status . text == " object source "
end
describe " source.json " do
test " with a source object, renders both source and content type " do
note =
insert ( :note ,
data : %{ " source " = > %{ " content " = > " object source " , " mediaType " = > " text/markdown " } }
)
activity = insert ( :note_activity , note : note )
status = StatusView . render ( " source.json " , activity : activity )
assert status . text == " object source "
assert status . content_type == " text/markdown "
end
test " with a source string, renders source and put text/plain as the content type " do
note = insert ( :note , data : %{ " source " = > " string source " } )
activity = insert ( :note_activity , note : note )
status = StatusView . render ( " source.json " , activity : activity )
assert status . text == " string source "
assert status . content_type == " text/plain "
end
end
2017-09-09 04:10:29 -06:00
end