2018-12-23 13:11:29 -07:00
# Pleroma: A lightweight social networking server
2019-01-09 05:54:37 -07:00
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
2018-12-23 13:11:29 -07:00
# SPDX-License-Identifier: AGPL-3.0-only
2017-09-09 05:15:01 -06:00
defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
use Pleroma.Web.ConnCase
2019-03-04 19:52:23 -07:00
alias Ecto.Changeset
2019-02-10 14:57:38 -07:00
alias Pleroma.Activity
alias Pleroma.Notification
2019-03-04 19:52:23 -07:00
alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.User
2018-05-28 11:45:23 -06:00
alias Pleroma.Web.ActivityPub.ActivityPub
2019-03-04 19:52:23 -07:00
alias Pleroma.Web.CommonAPI
2018-12-11 05:31:52 -07:00
alias Pleroma.Web.MastodonAPI.FilterView
2019-03-26 14:21:31 -06:00
alias Pleroma.Web.OAuth.App
2019-03-04 19:52:23 -07:00
alias Pleroma.Web.OStatus
2019-03-26 14:21:31 -06:00
alias Pleroma.Web.Push
2019-03-04 19:52:23 -07:00
alias Pleroma.Web.TwitterAPI.TwitterAPI
2017-09-09 05:15:01 -06:00
import Pleroma.Factory
2018-02-12 02:13:54 -07:00
import ExUnit.CaptureLog
2018-12-03 11:37:55 -07:00
import Tesla.Mock
setup do
mock ( fn env -> apply ( HttpRequestMock , :request , [ env ] ) end )
:ok
end
2017-09-09 05:15:01 -06:00
test " the home timeline " , %{ conn : conn } do
user = insert ( :user )
following = insert ( :user )
{ :ok , _activity } = TwitterAPI . create_status ( following , %{ " status " = > " test " } )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/timelines/home " )
2017-09-09 05:15:01 -06:00
2019-02-10 16:08:48 -07:00
assert Enum . empty? ( json_response ( conn , 200 ) )
2017-09-09 05:15:01 -06:00
{ :ok , user } = User . follow ( user , following )
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> get ( " /api/v1/timelines/home " )
2017-09-09 05:15:01 -06:00
assert [ %{ " content " = > " test " } ] = json_response ( conn , 200 )
end
test " the public timeline " , %{ conn : conn } do
following = insert ( :user )
2018-03-30 07:01:53 -06:00
capture_log ( fn ->
2018-02-12 02:13:54 -07:00
{ :ok , _activity } = TwitterAPI . create_status ( following , %{ " status " = > " test " } )
2017-09-09 05:15:01 -06:00
2018-03-30 07:01:53 -06:00
{ :ok , [ _activity ] } =
OStatus . fetch_activity_from_url ( " https://shitposter.club/notice/2827873 " )
conn =
conn
|> get ( " /api/v1/timelines/public " , %{ " local " = > " False " } )
2017-09-09 05:15:01 -06:00
2018-02-12 02:13:54 -07:00
assert length ( json_response ( conn , 200 ) ) == 2
2017-09-09 05:15:01 -06:00
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> get ( " /api/v1/timelines/public " , %{ " local " = > " True " } )
2017-09-09 05:15:01 -06:00
2018-02-12 02:13:54 -07:00
assert [ %{ " content " = > " test " } ] = json_response ( conn , 200 )
2017-12-19 08:15:07 -07:00
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> get ( " /api/v1/timelines/public " , %{ " local " = > " 1 " } )
2017-12-19 08:15:07 -07:00
2018-02-12 02:13:54 -07:00
assert [ %{ " content " = > " test " } ] = json_response ( conn , 200 )
2018-03-30 07:01:53 -06:00
end )
2017-09-09 05:15:01 -06:00
end
test " posting a status " , %{ conn : conn } do
user = insert ( :user )
2018-05-04 12:30:29 -06:00
idempotency_key = " Pikachu rocks! "
conn_one =
2018-03-30 07:01:53 -06:00
conn
|> assign ( :user , user )
2018-05-04 12:30:29 -06:00
|> put_req_header ( " idempotency-key " , idempotency_key )
2018-03-30 07:01:53 -06:00
|> post ( " /api/v1/statuses " , %{
" status " = > " cofe " ,
" spoiler_text " = > " 2hu " ,
" sensitive " = > " false "
} )
2018-05-05 03:15:57 -06:00
{ :ok , ttl } = Cachex . ttl ( :idempotency_cache , idempotency_key )
# Six hours
assert ttl > :timer . seconds ( 6 * 60 * 60 - 1 )
2018-05-04 13:15:39 -06:00
2018-03-30 07:01:53 -06:00
assert %{ " content " = > " cofe " , " id " = > id , " spoiler_text " = > " 2hu " , " sensitive " = > false } =
2018-05-04 12:30:29 -06:00
json_response ( conn_one , 200 )
2017-09-09 05:15:01 -06:00
2019-04-02 04:08:03 -06:00
assert Activity . get_by_id ( id )
2018-05-04 12:30:29 -06:00
conn_two =
conn
|> assign ( :user , user )
|> put_req_header ( " idempotency-key " , idempotency_key )
|> post ( " /api/v1/statuses " , %{
" status " = > " cofe " ,
" spoiler_text " = > " 2hu " ,
" sensitive " = > " false "
} )
assert %{ " id " = > second_id } = json_response ( conn_two , 200 )
assert id == second_id
2018-05-05 03:15:57 -06:00
conn_three =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses " , %{
" status " = > " cofe " ,
" spoiler_text " = > " 2hu " ,
" sensitive " = > " false "
} )
assert %{ " id " = > third_id } = json_response ( conn_three , 200 )
refute id == third_id
2017-09-09 05:15:01 -06:00
end
2017-11-18 07:30:18 -07:00
test " posting a sensitive status " , %{ conn : conn } do
user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses " , %{ " status " = > " cofe " , " sensitive " = > true } )
2017-11-18 07:30:18 -07:00
assert %{ " content " = > " cofe " , " id " = > id , " sensitive " = > true } = json_response ( conn , 200 )
2019-04-02 04:08:03 -06:00
assert Activity . get_by_id ( id )
2017-11-18 07:30:18 -07:00
end
2019-03-29 12:59:04 -06:00
test " posting a fake status " , %{ conn : conn } do
user = insert ( :user )
real_conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses " , %{
" status " = >
" \" Tenshi Eating a Corndog \" is a much discussed concept on /jp/. The significance of it is disputed, so I will focus on one core concept: the symbolism behind it "
} )
2019-04-02 05:31:18 -06:00
real_status = json_response ( real_conn , 200 )
assert real_status
assert Object . get_by_ap_id ( real_status [ " uri " ] )
2019-03-29 12:59:04 -06:00
real_status =
2019-04-02 05:31:18 -06:00
real_status
2019-03-29 12:59:04 -06:00
|> Map . put ( " id " , nil )
|> Map . put ( " url " , nil )
|> Map . put ( " uri " , nil )
|> Map . put ( " created_at " , nil )
|> Kernel . put_in ( [ " pleroma " , " conversation_id " ] , nil )
fake_conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses " , %{
" status " = >
" \" Tenshi Eating a Corndog \" is a much discussed concept on /jp/. The significance of it is disputed, so I will focus on one core concept: the symbolism behind it " ,
2019-04-02 05:31:18 -06:00
" preview " = > true
2019-03-29 12:59:04 -06:00
} )
2019-04-02 05:31:18 -06:00
fake_status = json_response ( fake_conn , 200 )
assert fake_status
refute Object . get_by_ap_id ( fake_status [ " uri " ] )
2019-03-29 12:59:04 -06:00
fake_status =
2019-04-02 05:31:18 -06:00
fake_status
2019-03-29 12:59:04 -06:00
|> Map . put ( " id " , nil )
|> Map . put ( " url " , nil )
|> Map . put ( " uri " , nil )
|> Map . put ( " created_at " , nil )
|> Kernel . put_in ( [ " pleroma " , " conversation_id " ] , nil )
assert real_status == fake_status
end
2019-01-27 23:19:00 -07:00
test " posting a status with OGP link preview " , %{ conn : conn } do
2019-02-03 10:54:39 -07:00
Pleroma.Config . put ( [ :rich_media , :enabled ] , true )
2019-01-27 23:19:00 -07:00
user = insert ( :user )
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses " , %{
" status " = > " http://example.com/ogp "
} )
assert %{ " id " = > id , " card " = > %{ " title " = > " The Rock " } } = json_response ( conn , 200 )
2019-04-02 04:08:03 -06:00
assert Activity . get_by_id ( id )
2019-02-03 10:54:39 -07:00
Pleroma.Config . put ( [ :rich_media , :enabled ] , false )
2019-01-27 23:19:00 -07:00
end
2018-05-13 19:21:42 -06:00
test " posting a direct status " , %{ conn : conn } do
2018-05-14 19:48:06 -06:00
user1 = insert ( :user )
user2 = insert ( :user )
content = " direct cofe @ #{ user2 . nickname } "
conn =
conn
|> assign ( :user , user1 )
|> post ( " api/v1/statuses " , %{ " status " = > content , " visibility " = > " direct " } )
assert %{ " id " = > id , " visibility " = > " direct " } = json_response ( conn , 200 )
2019-04-02 04:08:03 -06:00
assert activity = Activity . get_by_id ( id )
2019-01-18 18:25:15 -07:00
assert activity . recipients == [ user2 . ap_id , user1 . ap_id ]
2018-05-26 08:25:32 -06:00
assert activity . data [ " to " ] == [ user2 . ap_id ]
assert activity . data [ " cc " ] == [ ]
2018-05-14 19:48:06 -06:00
end
test " direct timeline " , %{ conn : conn } do
2018-05-26 08:25:32 -06:00
user_one = insert ( :user )
user_two = insert ( :user )
2018-05-14 19:48:06 -06:00
2018-05-26 08:25:32 -06:00
{ :ok , user_two } = User . follow ( user_two , user_one )
2018-05-14 19:48:06 -06:00
2018-05-26 08:25:32 -06:00
{ :ok , direct } =
CommonAPI . post ( user_one , %{
" status " = > " Hi @ #{ user_two . nickname } ! " ,
" visibility " = > " direct "
} )
{ :ok , _follower_only } =
CommonAPI . post ( user_one , %{
" status " = > " Hi @ #{ user_two . nickname } ! " ,
" visibility " = > " private "
} )
# Only direct should be visible here
res_conn =
2018-05-14 19:48:06 -06:00
conn
2018-05-26 08:25:32 -06:00
|> assign ( :user , user_two )
2018-05-14 19:48:06 -06:00
|> get ( " api/v1/timelines/direct " )
2018-05-26 08:25:32 -06:00
[ status ] = json_response ( res_conn , 200 )
assert %{ " visibility " = > " direct " } = status
assert status [ " url " ] != direct . data [ " id " ]
2019-01-18 12:40:52 -07:00
# User should be able to see his own direct message
res_conn =
build_conn ( )
|> assign ( :user , user_one )
|> get ( " api/v1/timelines/direct " )
[ status ] = json_response ( res_conn , 200 )
assert %{ " visibility " = > " direct " } = status
2018-05-26 08:25:32 -06:00
# Both should be visible here
res_conn =
conn
|> assign ( :user , user_two )
|> get ( " api/v1/timelines/home " )
2018-05-14 19:48:06 -06:00
2018-05-26 08:25:32 -06:00
[ _s1 , _s2 ] = json_response ( res_conn , 200 )
2018-11-13 11:46:34 -07:00
# Test pagination
Enum . each ( 1 . . 20 , fn _ ->
{ :ok , _ } =
CommonAPI . post ( user_one , %{
" status " = > " Hi @ #{ user_two . nickname } ! " ,
" visibility " = > " direct "
} )
end )
res_conn =
conn
|> assign ( :user , user_two )
|> get ( " api/v1/timelines/direct " )
statuses = json_response ( res_conn , 200 )
assert length ( statuses ) == 20
res_conn =
conn
|> assign ( :user , user_two )
|> get ( " api/v1/timelines/direct " , %{ max_id : List . last ( statuses ) [ " id " ] } )
[ status ] = json_response ( res_conn , 200 )
assert status [ " url " ] != direct . data [ " id " ]
2018-05-13 19:21:42 -06:00
end
2019-03-03 16:59:54 -07:00
test " doesn't include DMs from blocked users " , %{ conn : conn } do
blocker = insert ( :user )
blocked = insert ( :user )
user = insert ( :user )
{ :ok , blocker } = User . block ( blocker , blocked )
{ :ok , _blocked_direct } =
CommonAPI . post ( blocked , %{
" status " = > " Hi @ #{ blocker . nickname } ! " ,
" visibility " = > " direct "
} )
{ :ok , direct } =
CommonAPI . post ( user , %{
" status " = > " Hi @ #{ blocker . nickname } ! " ,
" visibility " = > " direct "
} )
res_conn =
conn
|> assign ( :user , user )
|> get ( " api/v1/timelines/direct " )
[ status ] = json_response ( res_conn , 200 )
assert status [ " id " ] == direct . id
end
2017-09-09 05:15:01 -06:00
test " replying to a status " , %{ conn : conn } do
user = insert ( :user )
{ :ok , replied_to } = TwitterAPI . create_status ( user , %{ " status " = > " cofe " } )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses " , %{ " status " = > " xD " , " in_reply_to_id " = > replied_to . id } )
2017-09-09 05:15:01 -06:00
assert %{ " content " = > " xD " , " id " = > id } = json_response ( conn , 200 )
2019-04-02 04:08:03 -06:00
activity = Activity . get_by_id ( id )
2017-09-09 05:15:01 -06:00
assert activity . data [ " context " ] == replied_to . data [ " context " ]
assert activity . data [ " object " ] [ " inReplyToStatusId " ] == replied_to . id
end
2018-11-02 10:33:51 -06:00
test " posting a status with an invalid in_reply_to_id " , %{ conn : conn } do
user = insert ( :user )
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses " , %{ " status " = > " xD " , " in_reply_to_id " = > " " } )
assert %{ " content " = > " xD " , " id " = > id } = json_response ( conn , 200 )
2019-04-02 04:08:03 -06:00
activity = Activity . get_by_id ( id )
2018-11-02 10:33:51 -06:00
assert activity
end
2017-09-09 05:15:01 -06:00
test " verify_credentials " , %{ conn : conn } do
user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/verify_credentials " )
2017-09-09 05:15:01 -06:00
2018-08-31 21:59:43 -06:00
assert %{ " id " = > id , " source " = > %{ " privacy " = > " public " } } = json_response ( conn , 200 )
assert id == to_string ( user . id )
end
test " verify_credentials default scope unlisted " , %{ conn : conn } do
2018-11-20 12:12:39 -07:00
user = insert ( :user , %{ info : % Pleroma.User.Info { default_scope : " unlisted " } } )
2018-08-31 21:59:43 -06:00
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/verify_credentials " )
assert %{ " id " = > id , " source " = > %{ " privacy " = > " unlisted " } } = json_response ( conn , 200 )
2017-11-10 09:18:19 -07:00
assert id == to_string ( user . id )
2017-09-09 05:15:01 -06:00
end
2019-03-26 12:42:03 -06:00
test " apps/verify_credentials " , %{ conn : conn } do
token = insert ( :oauth_token )
conn =
conn
|> assign ( :user , token . user )
|> assign ( :token , token )
|> get ( " /api/v1/apps/verify_credentials " )
app = Repo . preload ( token , :app ) . app
expected = %{
" name " = > app . client_name ,
" website " = > app . website ,
2019-03-26 14:21:31 -06:00
" vapid_key " = > Push . vapid_config ( ) |> Keyword . get ( :public_key )
}
assert expected == json_response ( conn , 200 )
end
test " creates an oauth app " , %{ conn : conn } do
user = insert ( :user )
app_attrs = build ( :oauth_app )
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/apps " , %{
client_name : app_attrs . client_name ,
redirect_uris : app_attrs . redirect_uris
} )
[ app ] = Repo . all ( App )
expected = %{
" name " = > app . client_name ,
" website " = > app . website ,
" client_id " = > app . client_id ,
" client_secret " = > app . client_secret ,
" id " = > app . id |> to_string ( ) ,
" redirect_uri " = > app . redirect_uris ,
" vapid_key " = > Push . vapid_config ( ) |> Keyword . get ( :public_key )
2019-03-26 12:42:03 -06:00
}
assert expected == json_response ( conn , 200 )
end
2017-09-09 05:15:01 -06:00
test " get a status " , %{ conn : conn } do
activity = insert ( :note_activity )
2018-03-30 07:01:53 -06:00
conn =
conn
|> get ( " /api/v1/statuses/ #{ activity . id } " )
2017-09-09 05:15:01 -06:00
assert %{ " id " = > id } = json_response ( conn , 200 )
2017-10-31 10:57:26 -06:00
assert id == to_string ( activity . id )
2017-09-09 05:15:01 -06:00
end
2017-09-09 05:56:51 -06:00
describe " deleting a status " do
test " when you created it " , %{ conn : conn } do
activity = insert ( :note_activity )
author = User . get_by_ap_id ( activity . data [ " actor " ] )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , author )
|> delete ( " /api/v1/statuses/ #{ activity . id } " )
2017-09-09 05:56:51 -06:00
assert %{ } = json_response ( conn , 200 )
2019-04-02 04:08:03 -06:00
refute Activity . get_by_id ( activity . id )
2017-09-09 05:56:51 -06:00
end
test " when you didn't create it " , %{ conn : conn } do
activity = insert ( :note_activity )
user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> delete ( " /api/v1/statuses/ #{ activity . id } " )
2017-09-09 05:56:51 -06:00
assert %{ " error " = > _ } = json_response ( conn , 403 )
2019-04-02 04:08:03 -06:00
assert Activity . get_by_id ( activity . id ) == activity
2017-09-09 05:56:51 -06:00
end
2019-03-08 10:21:56 -07:00
test " when you're an admin or moderator " , %{ conn : conn } do
activity1 = insert ( :note_activity )
activity2 = insert ( :note_activity )
admin = insert ( :user , info : %{ is_admin : true } )
moderator = insert ( :user , info : %{ is_moderator : true } )
res_conn =
conn
|> assign ( :user , admin )
|> delete ( " /api/v1/statuses/ #{ activity1 . id } " )
assert %{ } = json_response ( res_conn , 200 )
res_conn =
conn
|> assign ( :user , moderator )
|> delete ( " /api/v1/statuses/ #{ activity2 . id } " )
assert %{ } = json_response ( res_conn , 200 )
2019-04-02 04:08:03 -06:00
refute Activity . get_by_id ( activity1 . id )
refute Activity . get_by_id ( activity2 . id )
2019-03-08 10:21:56 -07:00
end
2017-09-09 05:56:51 -06:00
end
2017-09-09 09:48:57 -06:00
2018-08-13 20:27:28 -06:00
describe " filters " do
test " creating a filter " , %{ conn : conn } do
user = insert ( :user )
filter = % Pleroma.Filter {
phrase : " knights " ,
context : [ " home " ]
}
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/filters " , %{ " phrase " = > filter . phrase , context : filter . context } )
assert response = json_response ( conn , 200 )
assert response [ " phrase " ] == filter . phrase
assert response [ " context " ] == filter . context
2018-10-11 23:19:43 -06:00
assert response [ " id " ] != nil
assert response [ " id " ] != " "
2018-08-13 20:27:28 -06:00
end
test " fetching a list of filters " , %{ conn : conn } do
user = insert ( :user )
query_one = % Pleroma.Filter {
user_id : user . id ,
filter_id : 1 ,
phrase : " knights " ,
context : [ " home " ]
}
query_two = % Pleroma.Filter {
user_id : user . id ,
filter_id : 2 ,
phrase : " who " ,
context : [ " home " ]
}
{ :ok , filter_one } = Pleroma.Filter . create ( query_one )
{ :ok , filter_two } = Pleroma.Filter . create ( query_two )
2018-12-11 05:31:52 -07:00
response =
2018-08-13 20:27:28 -06:00
conn
|> assign ( :user , user )
|> get ( " /api/v1/filters " )
2018-12-11 05:31:52 -07:00
|> json_response ( 200 )
assert response ==
render_json (
FilterView ,
" filters.json " ,
filters : [ filter_two , filter_one ]
)
2018-08-13 20:27:28 -06:00
end
test " get a filter " , %{ conn : conn } do
user = insert ( :user )
query = % Pleroma.Filter {
user_id : user . id ,
filter_id : 2 ,
phrase : " knight " ,
context : [ " home " ]
}
{ :ok , filter } = Pleroma.Filter . create ( query )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/filters/ #{ filter . filter_id } " )
2019-01-15 21:09:01 -07:00
assert _response = json_response ( conn , 200 )
2018-08-13 20:27:28 -06:00
end
test " update a filter " , %{ conn : conn } do
user = insert ( :user )
query = % Pleroma.Filter {
user_id : user . id ,
filter_id : 2 ,
phrase : " knight " ,
context : [ " home " ]
}
2018-12-11 05:31:52 -07:00
{ :ok , _filter } = Pleroma.Filter . create ( query )
2018-08-13 20:27:28 -06:00
new = % Pleroma.Filter {
phrase : " nii " ,
context : [ " home " ]
}
conn =
conn
|> assign ( :user , user )
|> put ( " /api/v1/filters/ #{ query . filter_id } " , %{
phrase : new . phrase ,
context : new . context
} )
assert response = json_response ( conn , 200 )
assert response [ " phrase " ] == new . phrase
assert response [ " context " ] == new . context
end
test " delete a filter " , %{ conn : conn } do
user = insert ( :user )
query = % Pleroma.Filter {
user_id : user . id ,
filter_id : 2 ,
phrase : " knight " ,
context : [ " home " ]
}
{ :ok , filter } = Pleroma.Filter . create ( query )
conn =
conn
|> assign ( :user , user )
|> delete ( " /api/v1/filters/ #{ filter . filter_id } " )
assert response = json_response ( conn , 200 )
assert response == %{ }
end
end
2018-04-29 07:02:46 -06:00
describe " lists " do
test " creating a list " , %{ conn : conn } do
user = insert ( :user )
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/lists " , %{ " title " = > " cuties " } )
assert %{ " title " = > title } = json_response ( conn , 200 )
assert title == " cuties "
end
test " adding users to a list " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , list } = Pleroma.List . create ( " name " , user )
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/lists/ #{ list . id } /accounts " , %{ " account_ids " = > [ other_user . id ] } )
assert %{ } == json_response ( conn , 200 )
% Pleroma.List { following : following } = Pleroma.List . get ( list . id , user )
assert following == [ other_user . follower_address ]
end
test " removing users from a list " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
third_user = insert ( :user )
{ :ok , list } = Pleroma.List . create ( " name " , user )
{ :ok , list } = Pleroma.List . follow ( list , other_user )
{ :ok , list } = Pleroma.List . follow ( list , third_user )
conn =
conn
|> assign ( :user , user )
|> delete ( " /api/v1/lists/ #{ list . id } /accounts " , %{ " account_ids " = > [ other_user . id ] } )
assert %{ } == json_response ( conn , 200 )
% Pleroma.List { following : following } = Pleroma.List . get ( list . id , user )
assert following == [ third_user . follower_address ]
end
test " listing users in a list " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , list } = Pleroma.List . create ( " name " , user )
{ :ok , list } = Pleroma.List . follow ( list , other_user )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/lists/ #{ list . id } /accounts " , %{ " account_ids " = > [ other_user . id ] } )
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
assert id == to_string ( other_user . id )
end
test " retrieving a list " , %{ conn : conn } do
user = insert ( :user )
{ :ok , list } = Pleroma.List . create ( " name " , user )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/lists/ #{ list . id } " )
assert %{ " id " = > id } = json_response ( conn , 200 )
assert id == to_string ( list . id )
end
test " renaming a list " , %{ conn : conn } do
user = insert ( :user )
{ :ok , list } = Pleroma.List . create ( " name " , user )
conn =
conn
|> assign ( :user , user )
|> put ( " /api/v1/lists/ #{ list . id } " , %{ " title " = > " newname " } )
assert %{ " title " = > name } = json_response ( conn , 200 )
assert name == " newname "
end
test " deleting a list " , %{ conn : conn } do
user = insert ( :user )
{ :ok , list } = Pleroma.List . create ( " name " , user )
conn =
conn
|> assign ( :user , user )
|> delete ( " /api/v1/lists/ #{ list . id } " )
assert %{ } = json_response ( conn , 200 )
assert is_nil ( Repo . get ( Pleroma.List , list . id ) )
end
test " list timeline " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
2018-05-26 07:11:50 -06:00
{ :ok , _activity_one } = TwitterAPI . create_status ( user , %{ " status " = > " Marisa is cute. " } )
2018-04-29 07:02:46 -06:00
{ :ok , activity_two } = TwitterAPI . create_status ( other_user , %{ " status " = > " Marisa is cute. " } )
{ :ok , list } = Pleroma.List . create ( " name " , user )
{ :ok , list } = Pleroma.List . follow ( list , other_user )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/timelines/list/ #{ list . id } " )
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
assert id == to_string ( activity_two . id )
end
2018-08-29 02:50:23 -06:00
test " list timeline does not leak non-public statuses for unfollowed users " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , activity_one } = TwitterAPI . create_status ( other_user , %{ " status " = > " Marisa is cute. " } )
2018-12-11 05:31:52 -07:00
{ :ok , _activity_two } =
2018-08-29 02:50:23 -06:00
TwitterAPI . create_status ( other_user , %{
" status " = > " Marisa is cute. " ,
" visibility " = > " private "
} )
{ :ok , list } = Pleroma.List . create ( " name " , user )
{ :ok , list } = Pleroma.List . follow ( list , other_user )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/timelines/list/ #{ list . id } " )
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
assert id == to_string ( activity_one . id )
end
2018-04-29 07:02:46 -06:00
end
2017-11-10 06:24:39 -07:00
describe " notifications " do
test " list of notifications " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
2018-03-30 07:01:53 -06:00
{ :ok , activity } =
TwitterAPI . create_status ( other_user , %{ " status " = > " hi @ #{ user . nickname } " } )
2018-02-12 02:13:54 -07:00
{ :ok , [ _notification ] } = Notification . create_notifications ( activity )
2017-11-10 06:24:39 -07:00
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/notifications " )
expected_response =
2019-01-15 21:09:01 -07:00
" hi <span class= \" h-card \" ><a data-user= \" #{ user . id } \" class= \" u-url mention \" href= \" #{
user . ap_id
} \ " >@<span> #{ user . nickname } </span></a></span> "
2017-11-10 06:24:39 -07:00
assert [ %{ " status " = > %{ " content " = > response } } | _rest ] = json_response ( conn , 200 )
assert response == expected_response
end
test " getting a single notification " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
2018-03-30 07:01:53 -06:00
{ :ok , activity } =
TwitterAPI . create_status ( other_user , %{ " status " = > " hi @ #{ user . nickname } " } )
2017-11-10 06:24:39 -07:00
{ :ok , [ notification ] } = Notification . create_notifications ( activity )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/notifications/ #{ notification . id } " )
expected_response =
2019-01-15 21:09:01 -07:00
" hi <span class= \" h-card \" ><a data-user= \" #{ user . id } \" class= \" u-url mention \" href= \" #{
user . ap_id
} \ " >@<span> #{ user . nickname } </span></a></span> "
2017-11-10 06:24:39 -07:00
assert %{ " status " = > %{ " content " = > response } } = json_response ( conn , 200 )
assert response == expected_response
end
test " dismissing a single notification " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
2018-03-30 07:01:53 -06:00
{ :ok , activity } =
TwitterAPI . create_status ( other_user , %{ " status " = > " hi @ #{ user . nickname } " } )
2017-11-10 06:24:39 -07:00
{ :ok , [ notification ] } = Notification . create_notifications ( activity )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/notifications/dismiss " , %{ " id " = > notification . id } )
2017-11-10 06:24:39 -07:00
assert %{ } = json_response ( conn , 200 )
end
test " clearing all notifications " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
2018-03-30 07:01:53 -06:00
{ :ok , activity } =
TwitterAPI . create_status ( other_user , %{ " status " = > " hi @ #{ user . nickname } " } )
2018-02-12 02:13:54 -07:00
{ :ok , [ _notification ] } = Notification . create_notifications ( activity )
2017-11-10 06:24:39 -07:00
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/notifications/clear " )
2017-11-10 06:24:39 -07:00
assert %{ } = json_response ( conn , 200 )
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> get ( " /api/v1/notifications " )
2017-11-10 06:24:39 -07:00
assert all = json_response ( conn , 200 )
assert all == [ ]
end
2019-03-17 19:32:23 -06:00
test " paginates notifications using min_id, since_id, max_id, and limit " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , activity1 } = CommonAPI . post ( other_user , %{ " status " = > " hi @ #{ user . nickname } " } )
{ :ok , activity2 } = CommonAPI . post ( other_user , %{ " status " = > " hi @ #{ user . nickname } " } )
{ :ok , activity3 } = CommonAPI . post ( other_user , %{ " status " = > " hi @ #{ user . nickname } " } )
{ :ok , activity4 } = CommonAPI . post ( other_user , %{ " status " = > " hi @ #{ user . nickname } " } )
notification1_id = Repo . get_by ( Notification , activity_id : activity1 . id ) . id |> to_string ( )
notification2_id = Repo . get_by ( Notification , activity_id : activity2 . id ) . id |> to_string ( )
notification3_id = Repo . get_by ( Notification , activity_id : activity3 . id ) . id |> to_string ( )
notification4_id = Repo . get_by ( Notification , activity_id : activity4 . id ) . id |> to_string ( )
conn =
conn
|> assign ( :user , user )
# min_id
conn_res =
conn
|> get ( " /api/v1/notifications?limit=2&min_id= #{ notification1_id } " )
result = json_response ( conn_res , 200 )
assert [ %{ " id " = > ^ notification3_id } , %{ " id " = > ^ notification2_id } ] = result
# since_id
conn_res =
conn
|> get ( " /api/v1/notifications?limit=2&since_id= #{ notification1_id } " )
result = json_response ( conn_res , 200 )
assert [ %{ " id " = > ^ notification4_id } , %{ " id " = > ^ notification3_id } ] = result
# max_id
conn_res =
conn
|> get ( " /api/v1/notifications?limit=2&max_id= #{ notification4_id } " )
result = json_response ( conn_res , 200 )
assert [ %{ " id " = > ^ notification3_id } , %{ " id " = > ^ notification2_id } ] = result
end
test " filters notifications using exclude_types " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , mention_activity } = CommonAPI . post ( other_user , %{ " status " = > " hey @ #{ user . nickname } " } )
{ :ok , create_activity } = CommonAPI . post ( user , %{ " status " = > " hey " } )
{ :ok , favorite_activity , _ } = CommonAPI . favorite ( create_activity . id , other_user )
{ :ok , reblog_activity , _ } = CommonAPI . repeat ( create_activity . id , other_user )
{ :ok , _ , _ , follow_activity } = CommonAPI . follow ( other_user , user )
mention_notification_id =
Repo . get_by ( Notification , activity_id : mention_activity . id ) . id |> to_string ( )
favorite_notification_id =
Repo . get_by ( Notification , activity_id : favorite_activity . id ) . id |> to_string ( )
reblog_notification_id =
Repo . get_by ( Notification , activity_id : reblog_activity . id ) . id |> to_string ( )
follow_notification_id =
Repo . get_by ( Notification , activity_id : follow_activity . id ) . id |> to_string ( )
conn =
conn
|> assign ( :user , user )
conn_res =
get ( conn , " /api/v1/notifications " , %{ exclude_types : [ " mention " , " favourite " , " reblog " ] } )
assert [ %{ " id " = > ^ follow_notification_id } ] = json_response ( conn_res , 200 )
conn_res =
get ( conn , " /api/v1/notifications " , %{ exclude_types : [ " favourite " , " reblog " , " follow " ] } )
assert [ %{ " id " = > ^ mention_notification_id } ] = json_response ( conn_res , 200 )
conn_res =
get ( conn , " /api/v1/notifications " , %{ exclude_types : [ " reblog " , " follow " , " mention " ] } )
assert [ %{ " id " = > ^ favorite_notification_id } ] = json_response ( conn_res , 200 )
conn_res =
get ( conn , " /api/v1/notifications " , %{ exclude_types : [ " follow " , " mention " , " favourite " ] } )
assert [ %{ " id " = > ^ reblog_notification_id } ] = json_response ( conn_res , 200 )
end
2017-11-10 06:24:39 -07:00
end
2017-09-09 09:48:57 -06:00
describe " reblogging " do
test " reblogs and returns the reblogged status " , %{ conn : conn } do
activity = insert ( :note_activity )
user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity . id } /reblog " )
assert %{ " reblog " = > %{ " id " = > id , " reblogged " = > true , " reblogs_count " = > 1 } } =
json_response ( conn , 200 )
2017-09-09 09:48:57 -06:00
2017-10-31 10:57:26 -06:00
assert to_string ( activity . id ) == id
2017-09-09 09:48:57 -06:00
end
end
2017-09-09 10:09:37 -06:00
2018-04-14 20:34:06 -06:00
describe " unreblogging " do
test " unreblogs and returns the unreblogged status " , %{ conn : conn } do
activity = insert ( :note_activity )
user = insert ( :user )
{ :ok , _ , _ } = CommonAPI . repeat ( activity . id , user )
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity . id } /unreblog " )
2018-04-24 23:43:45 -06:00
assert %{ " id " = > id , " reblogged " = > false , " reblogs_count " = > 0 } = json_response ( conn , 200 )
2018-04-14 20:34:06 -06:00
assert to_string ( activity . id ) == id
end
end
2017-09-09 10:09:37 -06:00
describe " favoriting " do
test " favs a status and returns it " , %{ conn : conn } do
activity = insert ( :note_activity )
user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity . id } /favourite " )
assert %{ " id " = > id , " favourites_count " = > 1 , " favourited " = > true } =
json_response ( conn , 200 )
2017-09-09 10:09:37 -06:00
2017-10-31 10:57:26 -06:00
assert to_string ( activity . id ) == id
2017-09-09 10:09:37 -06:00
end
2018-06-03 11:28:11 -06:00
test " returns 500 for a wrong id " , %{ conn : conn } do
user = insert ( :user )
resp =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/1/favourite " )
|> json_response ( 500 )
assert resp == " Something went wrong "
end
2017-09-09 10:09:37 -06:00
end
2017-09-09 10:30:02 -06:00
describe " unfavoriting " do
test " unfavorites a status and returns it " , %{ conn : conn } do
activity = insert ( :note_activity )
user = insert ( :user )
{ :ok , _ , _ } = CommonAPI . favorite ( activity . id , user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity . id } /unfavourite " )
assert %{ " id " = > id , " favourites_count " = > 0 , " favourited " = > false } =
json_response ( conn , 200 )
2017-09-09 10:30:02 -06:00
2017-10-31 10:57:26 -06:00
assert to_string ( activity . id ) == id
2017-09-09 10:30:02 -06:00
end
end
2017-09-10 09:46:43 -06:00
describe " user timelines " do
test " gets a users statuses " , %{ conn : conn } do
2018-05-20 08:15:18 -06:00
user_one = insert ( :user )
user_two = insert ( :user )
user_three = insert ( :user )
2017-09-10 09:46:43 -06:00
2018-05-20 08:15:18 -06:00
{ :ok , user_three } = User . follow ( user_three , user_one )
2017-09-10 09:46:43 -06:00
2018-05-20 08:15:18 -06:00
{ :ok , activity } = CommonAPI . post ( user_one , %{ " status " = > " HI!!! " } )
{ :ok , direct_activity } =
CommonAPI . post ( user_one , %{
" status " = > " Hi, @ #{ user_two . nickname } . " ,
" visibility " = > " direct "
} )
{ :ok , private_activity } =
CommonAPI . post ( user_one , %{ " status " = > " private " , " visibility " = > " private " } )
resp =
2018-03-30 07:01:53 -06:00
conn
2018-05-20 08:15:18 -06:00
|> get ( " /api/v1/accounts/ #{ user_one . id } /statuses " )
2017-09-10 09:46:43 -06:00
2018-05-20 08:15:18 -06:00
assert [ %{ " id " = > id } ] = json_response ( resp , 200 )
assert id == to_string ( activity . id )
2017-09-10 09:46:43 -06:00
2018-05-20 08:15:18 -06:00
resp =
conn
|> assign ( :user , user_two )
|> get ( " /api/v1/accounts/ #{ user_one . id } /statuses " )
2017-09-10 09:46:43 -06:00
2018-05-20 08:15:18 -06:00
assert [ %{ " id " = > id_one } , %{ " id " = > id_two } ] = json_response ( resp , 200 )
assert id_one == to_string ( direct_activity . id )
assert id_two == to_string ( activity . id )
resp =
conn
|> assign ( :user , user_three )
|> get ( " /api/v1/accounts/ #{ user_one . id } /statuses " )
2017-09-10 09:46:43 -06:00
2018-05-20 08:15:18 -06:00
assert [ %{ " id " = > id_one } , %{ " id " = > id_two } ] = json_response ( resp , 200 )
assert id_one == to_string ( private_activity . id )
assert id_two == to_string ( activity . id )
2017-09-10 09:46:43 -06:00
end
2017-11-14 06:41:16 -07:00
2018-04-11 13:48:32 -06:00
test " unimplemented pinned statuses feature " , %{ conn : conn } do
note = insert ( :note_activity )
2018-04-11 13:51:02 -06:00
user = User . get_by_ap_id ( note . data [ " actor " ] )
2018-04-11 13:48:32 -06:00
conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /statuses?pinned=true " )
assert json_response ( conn , 200 ) == [ ]
end
2017-11-14 06:41:16 -07:00
test " gets an users media " , %{ conn : conn } do
note = insert ( :note_activity )
user = User . get_by_ap_id ( note . data [ " actor " ] )
2018-03-30 07:01:53 -06:00
file = % Plug.Upload {
content_type : " image/jpg " ,
path : Path . absname ( " test/fixtures/image.jpg " ) ,
filename : " an_image.jpg "
}
2017-11-14 06:41:16 -07:00
2018-03-30 07:01:53 -06:00
media =
2018-12-05 03:37:06 -07:00
TwitterAPI . upload ( file , user , " json " )
2018-03-30 07:01:53 -06:00
|> Poison . decode! ( )
2017-11-14 06:41:16 -07:00
2018-03-30 07:01:53 -06:00
{ :ok , image_post } =
TwitterAPI . create_status ( user , %{ " status " = > " cofe " , " media_ids " = > [ media [ " media_id " ] ] } )
conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /statuses " , %{ " only_media " = > " true " } )
2017-11-14 06:50:23 -07:00
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
assert id == to_string ( image_post . id )
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> get ( " /api/v1/accounts/ #{ user . id } /statuses " , %{ " only_media " = > " 1 " } )
2017-11-14 06:41:16 -07:00
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
assert id == to_string ( image_post . id )
end
2018-12-26 22:30:01 -07:00
test " gets a user's statuses without reblogs " , %{ conn : conn } do
user = insert ( :user )
{ :ok , post } = CommonAPI . post ( user , %{ " status " = > " HI!!! " } )
{ :ok , _ , _ } = CommonAPI . repeat ( post . id , user )
conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /statuses " , %{ " exclude_reblogs " = > " true " } )
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
assert id == to_string ( post . id )
conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /statuses " , %{ " exclude_reblogs " = > " 1 " } )
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
assert id == to_string ( post . id )
end
2017-09-10 09:46:43 -06:00
end
2017-09-13 07:55:10 -06:00
describe " user relationships " do
test " returns the relationships for the current user " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , user } = User . follow ( user , other_user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/relationships " , %{ " id " = > [ other_user . id ] } )
2017-09-13 07:55:10 -06:00
assert [ relationship ] = json_response ( conn , 200 )
2017-11-10 09:18:19 -07:00
assert to_string ( other_user . id ) == relationship [ " id " ]
2017-09-13 07:55:10 -06:00
end
end
2017-09-13 09:36:02 -06:00
2018-05-28 11:45:23 -06:00
describe " locked accounts " do
test " /api/v1/follow_requests works " do
2018-11-20 12:12:39 -07:00
user = insert ( :user , %{ info : % Pleroma.User.Info { locked : true } } )
2018-05-28 11:45:23 -06:00
other_user = insert ( :user )
2018-12-11 05:31:52 -07:00
{ :ok , _activity } = ActivityPub . follow ( other_user , user )
2018-05-28 11:45:23 -06:00
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
other_user = User . get_by_id ( other_user . id )
2018-05-28 11:51:50 -06:00
assert User . following? ( other_user , user ) == false
2018-05-28 11:45:23 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> get ( " /api/v1/follow_requests " )
assert [ relationship ] = json_response ( conn , 200 )
assert to_string ( other_user . id ) == relationship [ " id " ]
end
test " /api/v1/follow_requests/:id/authorize works " do
2019-02-09 16:26:29 -07:00
user = insert ( :user , %{ info : % User.Info { locked : true } } )
2018-05-28 11:45:23 -06:00
other_user = insert ( :user )
2018-12-11 05:31:52 -07:00
{ :ok , _activity } = ActivityPub . follow ( other_user , user )
2018-05-28 11:45:23 -06:00
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
other_user = User . get_by_id ( other_user . id )
2018-05-28 11:51:50 -06:00
assert User . following? ( other_user , user ) == false
2018-05-28 11:45:23 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> post ( " /api/v1/follow_requests/ #{ other_user . id } /authorize " )
assert relationship = json_response ( conn , 200 )
assert to_string ( other_user . id ) == relationship [ " id " ]
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
other_user = User . get_by_id ( other_user . id )
2018-05-28 11:45:23 -06:00
assert User . following? ( other_user , user ) == true
end
2018-08-31 21:59:43 -06:00
test " verify_credentials " , %{ conn : conn } do
2018-11-20 12:12:39 -07:00
user = insert ( :user , %{ info : % Pleroma.User.Info { default_scope : " private " } } )
2018-08-31 21:59:43 -06:00
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/verify_credentials " )
assert %{ " id " = > id , " source " = > %{ " privacy " = > " private " } } = json_response ( conn , 200 )
assert id == to_string ( user . id )
end
2018-05-28 11:45:23 -06:00
test " /api/v1/follow_requests/:id/reject works " do
2018-11-20 12:12:39 -07:00
user = insert ( :user , %{ info : % Pleroma.User.Info { locked : true } } )
2018-05-28 11:45:23 -06:00
other_user = insert ( :user )
2018-12-11 05:31:52 -07:00
{ :ok , _activity } = ActivityPub . follow ( other_user , user )
2018-05-28 11:45:23 -06:00
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
2019-02-09 16:26:29 -07:00
2018-05-28 11:45:23 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> post ( " /api/v1/follow_requests/ #{ other_user . id } /reject " )
assert relationship = json_response ( conn , 200 )
assert to_string ( other_user . id ) == relationship [ " id " ]
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
other_user = User . get_by_id ( other_user . id )
2018-05-28 11:45:23 -06:00
assert User . following? ( other_user , user ) == false
end
end
2017-09-13 09:36:02 -06:00
test " account fetching " , %{ conn : conn } do
user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } " )
2017-09-13 09:36:02 -06:00
assert %{ " id " = > id } = json_response ( conn , 200 )
2017-11-10 09:18:19 -07:00
assert id == to_string ( user . id )
2017-09-13 09:36:02 -06:00
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> get ( " /api/v1/accounts/-1 " )
2017-09-13 09:36:02 -06:00
assert %{ " error " = > " Can't find user " } = json_response ( conn , 404 )
end
2017-09-14 00:08:32 -06:00
2019-03-11 08:18:32 -06:00
test " account fetching also works nickname " , %{ conn : conn } do
user = insert ( :user )
conn =
conn
|> get ( " /api/v1/accounts/ #{ user . nickname } " )
assert %{ " id " = > id } = json_response ( conn , 200 )
assert id == user . id
end
2017-09-14 00:08:32 -06:00
test " media upload " , %{ conn : conn } do
2018-03-30 07:01:53 -06:00
file = % Plug.Upload {
content_type : " image/jpg " ,
path : Path . absname ( " test/fixtures/image.jpg " ) ,
filename : " an_image.jpg "
}
2017-09-14 00:08:32 -06:00
2018-07-16 21:37:26 -06:00
desc = " Description of the image "
2017-09-14 00:08:32 -06:00
user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
2018-07-16 21:37:26 -06:00
|> post ( " /api/v1/media " , %{ " file " = > file , " description " = > desc } )
2017-09-14 00:08:32 -06:00
assert media = json_response ( conn , 200 )
assert media [ " type " ] == " image "
2018-07-16 21:37:26 -06:00
assert media [ " description " ] == desc
2018-12-06 00:26:17 -07:00
assert media [ " id " ]
object = Repo . get ( Object , media [ " id " ] )
assert object . data [ " actor " ] == User . ap_id ( user )
2017-09-14 00:08:32 -06:00
end
2017-09-14 05:22:09 -06:00
test " hashtag timeline " , %{ conn : conn } do
following = insert ( :user )
2018-03-30 07:01:53 -06:00
capture_log ( fn ->
2018-02-12 02:13:54 -07:00
{ :ok , activity } = TwitterAPI . create_status ( following , %{ " status " = > " test # 2hu " } )
2018-03-30 07:01:53 -06:00
{ :ok , [ _activity ] } =
OStatus . fetch_activity_from_url ( " https://shitposter.club/notice/2827873 " )
2018-11-03 04:41:40 -06:00
nconn =
2018-03-30 07:01:53 -06:00
conn
|> get ( " /api/v1/timelines/tag/2hu " )
2017-09-14 05:22:09 -06:00
2018-11-03 04:41:40 -06:00
assert [ %{ " id " = > id } ] = json_response ( nconn , 200 )
assert id == to_string ( activity . id )
# works for different capitalization too
nconn =
conn
|> get ( " /api/v1/timelines/tag/2HU " )
assert [ %{ " id " = > id } ] = json_response ( nconn , 200 )
2017-09-14 05:22:09 -06:00
2018-02-12 02:13:54 -07:00
assert id == to_string ( activity . id )
2018-03-30 07:01:53 -06:00
end )
2017-09-14 05:22:09 -06:00
end
2017-09-14 10:30:05 -06:00
2018-12-21 11:34:08 -07:00
test " multi-hashtag timeline " , %{ conn : conn } do
user = insert ( :user )
{ :ok , activity_test } = CommonAPI . post ( user , %{ " status " = > " # test " } )
2019-01-22 07:42:46 -07:00
{ :ok , activity_test1 } = CommonAPI . post ( user , %{ " status " = > " # test # test1 " } )
2018-12-21 11:34:08 -07:00
{ :ok , activity_none } = CommonAPI . post ( user , %{ " status " = > " # test # none " } )
2019-01-10 08:44:28 -07:00
any_test =
2018-12-21 11:34:08 -07:00
conn
2019-01-22 07:42:46 -07:00
|> get ( " /api/v1/timelines/tag/test " , %{ " any " = > [ " test1 " ] } )
2018-12-21 11:34:08 -07:00
2019-01-10 08:44:28 -07:00
[ status_none , status_test1 , status_test ] = json_response ( any_test , 200 )
2018-12-21 11:34:08 -07:00
assert to_string ( activity_test . id ) == status_test [ " id " ]
assert to_string ( activity_test1 . id ) == status_test1 [ " id " ]
assert to_string ( activity_none . id ) == status_none [ " id " ]
restricted_test =
conn
|> get ( " /api/v1/timelines/tag/test " , %{ " all " = > [ " test1 " ] , " none " = > [ " none " ] } )
2019-01-22 07:42:46 -07:00
assert [ status_test1 ] == json_response ( restricted_test , 200 )
2019-01-10 08:44:28 -07:00
all_test = conn |> get ( " /api/v1/timelines/tag/test " , %{ " all " = > [ " none " ] } )
assert [ status_none ] == json_response ( all_test , 200 )
2018-12-21 11:34:08 -07:00
end
2017-09-14 10:30:05 -06:00
test " getting followers " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , user } = User . follow ( user , other_user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> get ( " /api/v1/accounts/ #{ other_user . id } /followers " )
2017-09-14 10:30:05 -06:00
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
2017-11-10 09:18:19 -07:00
assert id == to_string ( user . id )
2017-09-14 10:30:05 -06:00
end
2019-02-03 11:24:09 -07:00
test " getting followers, hide_followers " , %{ conn : conn } do
2018-12-02 09:48:00 -07:00
user = insert ( :user )
2019-02-03 11:24:09 -07:00
other_user = insert ( :user , %{ info : %{ hide_followers : true } } )
2018-12-11 05:31:52 -07:00
{ :ok , _user } = User . follow ( user , other_user )
2018-12-02 09:48:00 -07:00
conn =
conn
|> get ( " /api/v1/accounts/ #{ other_user . id } /followers " )
assert [ ] == json_response ( conn , 200 )
end
2019-02-03 11:24:09 -07:00
test " getting followers, hide_followers, same user requesting " , %{ conn : conn } do
2018-12-05 13:25:06 -07:00
user = insert ( :user )
2019-02-03 11:24:09 -07:00
other_user = insert ( :user , %{ info : %{ hide_followers : true } } )
2018-12-11 05:31:52 -07:00
{ :ok , _user } = User . follow ( user , other_user )
2018-12-05 13:25:06 -07:00
conn =
conn
|> assign ( :user , other_user )
|> get ( " /api/v1/accounts/ #{ other_user . id } /followers " )
refute [ ] == json_response ( conn , 200 )
end
2019-03-11 12:03:30 -06:00
test " getting followers, pagination " , %{ conn : conn } do
user = insert ( :user )
follower1 = insert ( :user )
follower2 = insert ( :user )
follower3 = insert ( :user )
{ :ok , _ } = User . follow ( follower1 , user )
{ :ok , _ } = User . follow ( follower2 , user )
{ :ok , _ } = User . follow ( follower3 , user )
conn =
conn
|> assign ( :user , user )
res_conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /followers?since_id= #{ follower1 . id } " )
assert [ %{ " id " = > id3 } , %{ " id " = > id2 } ] = json_response ( res_conn , 200 )
assert id3 == follower3 . id
assert id2 == follower2 . id
res_conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /followers?max_id= #{ follower3 . id } " )
assert [ %{ " id " = > id2 } , %{ " id " = > id1 } ] = json_response ( res_conn , 200 )
assert id2 == follower2 . id
assert id1 == follower1 . id
res_conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /followers?limit=1&max_id= #{ follower3 . id } " )
assert [ %{ " id " = > id2 } ] = json_response ( res_conn , 200 )
assert id2 == follower2 . id
assert [ link_header ] = get_resp_header ( res_conn , " link " )
assert link_header =~ ~r/ since_id= #{ follower2 . id } /
assert link_header =~ ~r/ max_id= #{ follower2 . id } /
end
2017-09-14 10:30:05 -06:00
test " getting following " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , user } = User . follow ( user , other_user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /following " )
2017-09-14 10:30:05 -06:00
assert [ %{ " id " = > id } ] = json_response ( conn , 200 )
2017-11-10 09:18:19 -07:00
assert id == to_string ( other_user . id )
2017-09-14 10:30:05 -06:00
end
2019-02-06 15:34:44 -07:00
test " getting following, hide_follows " , %{ conn : conn } do
user = insert ( :user , %{ info : %{ hide_follows : true } } )
2018-12-02 09:48:00 -07:00
other_user = insert ( :user )
{ :ok , user } = User . follow ( user , other_user )
conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /following " )
assert [ ] == json_response ( conn , 200 )
end
2019-02-06 15:34:44 -07:00
test " getting following, hide_follows, same user requesting " , %{ conn : conn } do
user = insert ( :user , %{ info : %{ hide_follows : true } } )
2018-12-05 13:25:06 -07:00
other_user = insert ( :user )
{ :ok , user } = User . follow ( user , other_user )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/ #{ user . id } /following " )
refute [ ] == json_response ( conn , 200 )
end
2019-03-11 12:03:30 -06:00
test " getting following, pagination " , %{ conn : conn } do
user = insert ( :user )
following1 = insert ( :user )
following2 = insert ( :user )
following3 = insert ( :user )
{ :ok , _ } = User . follow ( user , following1 )
{ :ok , _ } = User . follow ( user , following2 )
{ :ok , _ } = User . follow ( user , following3 )
conn =
conn
|> assign ( :user , user )
res_conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /following?since_id= #{ following1 . id } " )
assert [ %{ " id " = > id3 } , %{ " id " = > id2 } ] = json_response ( res_conn , 200 )
assert id3 == following3 . id
assert id2 == following2 . id
res_conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /following?max_id= #{ following3 . id } " )
assert [ %{ " id " = > id2 } , %{ " id " = > id1 } ] = json_response ( res_conn , 200 )
assert id2 == following2 . id
assert id1 == following1 . id
res_conn =
conn
|> get ( " /api/v1/accounts/ #{ user . id } /following?limit=1&max_id= #{ following3 . id } " )
assert [ %{ " id " = > id2 } ] = json_response ( res_conn , 200 )
assert id2 == following2 . id
assert [ link_header ] = get_resp_header ( res_conn , " link " )
assert link_header =~ ~r/ since_id= #{ following2 . id } /
assert link_header =~ ~r/ max_id= #{ following2 . id } /
end
2017-09-14 10:30:05 -06:00
test " following / unfollowing a user " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/accounts/ #{ other_user . id } /follow " )
2017-09-14 10:30:05 -06:00
2018-02-12 02:13:54 -07:00
assert %{ " id " = > _id , " following " = > true } = json_response ( conn , 200 )
2017-09-14 10:30:05 -06:00
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> post ( " /api/v1/accounts/ #{ other_user . id } /unfollow " )
2017-09-14 10:30:05 -06:00
2018-02-12 02:13:54 -07:00
assert %{ " id " = > _id , " following " = > false } = json_response ( conn , 200 )
2017-10-27 04:55:36 -06:00
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> post ( " /api/v1/follows " , %{ " uri " = > other_user . nickname } )
2017-10-27 04:55:36 -06:00
2017-10-29 06:25:11 -06:00
assert %{ " id " = > id } = json_response ( conn , 200 )
2017-11-10 09:18:19 -07:00
assert id == to_string ( other_user . id )
2017-09-14 10:30:05 -06:00
end
2018-09-01 15:34:15 -06:00
test " muting / unmuting a user " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/accounts/ #{ other_user . id } /mute " )
assert %{ " id " = > _id , " muting " = > true } = json_response ( conn , 200 )
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
2018-09-01 15:34:15 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> post ( " /api/v1/accounts/ #{ other_user . id } /unmute " )
assert %{ " id " = > _id , " muting " = > false } = json_response ( conn , 200 )
end
test " getting a list of mutes " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , user } = User . mute ( user , other_user )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/mutes " )
other_user_id = to_string ( other_user . id )
assert [ %{ " id " = > ^ other_user_id } ] = json_response ( conn , 200 )
end
2017-11-03 01:38:05 -06:00
test " blocking / unblocking a user " , %{ conn : conn } do
2017-09-14 10:30:05 -06:00
user = insert ( :user )
other_user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/accounts/ #{ other_user . id } /block " )
2017-11-03 01:38:05 -06:00
2018-02-12 02:13:54 -07:00
assert %{ " id " = > _id , " blocking " = > true } = json_response ( conn , 200 )
2017-11-03 01:38:05 -06:00
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
2018-03-30 07:01:53 -06:00
conn =
build_conn ( )
|> assign ( :user , user )
|> post ( " /api/v1/accounts/ #{ other_user . id } /unblock " )
2017-11-03 01:38:05 -06:00
2018-02-12 02:13:54 -07:00
assert %{ " id " = > _id , " blocking " = > false } = json_response ( conn , 200 )
2017-11-03 01:38:05 -06:00
end
2017-11-03 01:51:17 -06:00
test " getting a list of blocks " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , user } = User . block ( user , other_user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/blocks " )
2017-11-03 01:51:17 -06:00
2017-11-10 09:18:19 -07:00
other_user_id = to_string ( other_user . id )
2017-11-03 01:51:17 -06:00
assert [ %{ " id " = > ^ other_user_id } ] = json_response ( conn , 200 )
end
2018-06-03 13:21:23 -06:00
test " blocking / unblocking a domain " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user , %{ ap_id : " https://dogwhistle.zone/@pundit " } )
conn =
conn
|> assign ( :user , user )
|> post ( " /api/v1/domain_blocks " , %{ " domain " = > " dogwhistle.zone " } )
assert %{ } = json_response ( conn , 200 )
user = User . get_cached_by_ap_id ( user . ap_id )
assert User . blocks? ( user , other_user )
conn =
build_conn ( )
|> assign ( :user , user )
|> delete ( " /api/v1/domain_blocks " , %{ " domain " = > " dogwhistle.zone " } )
assert %{ } = json_response ( conn , 200 )
user = User . get_cached_by_ap_id ( user . ap_id )
refute User . blocks? ( user , other_user )
end
2018-11-27 10:12:03 -07:00
test " getting a list of domain blocks " , %{ conn : conn } do
2018-06-03 13:21:23 -06:00
user = insert ( :user )
{ :ok , user } = User . block_domain ( user , " bad.site " )
{ :ok , user } = User . block_domain ( user , " even.worse.site " )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/domain_blocks " )
domain_blocks = json_response ( conn , 200 )
assert " bad.site " in domain_blocks
assert " even.worse.site " in domain_blocks
end
2018-09-01 15:34:15 -06:00
test " unimplemented follow_requests, blocks, domain blocks " do
2017-09-14 10:30:05 -06:00
user = insert ( :user )
2018-09-01 15:34:15 -06:00
[ " blocks " , " domain_blocks " , " follow_requests " ]
2018-03-30 07:01:53 -06:00
|> Enum . each ( fn endpoint ->
conn =
build_conn ( )
|> assign ( :user , user )
|> get ( " /api/v1/ #{ endpoint } " )
2017-09-14 10:30:05 -06:00
assert [ ] = json_response ( conn , 200 )
end )
end
2017-09-16 02:42:24 -06:00
2017-10-31 07:46:01 -06:00
test " account search " , %{ conn : conn } do
2017-10-30 12:23:16 -06:00
user = insert ( :user )
2018-05-16 09:55:20 -06:00
user_two = insert ( :user , %{ nickname : " shp@shitposter.club " } )
2017-10-30 12:23:16 -06:00
user_three = insert ( :user , %{ nickname : " shp@heldscal.la " , name : " I love 2hu " } )
2018-05-16 09:55:20 -06:00
results =
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/search " , %{ " q " = > " shp " } )
|> json_response ( 200 )
result_ids = for result <- results , do : result [ " acct " ]
assert user_two . nickname in result_ids
assert user_three . nickname in result_ids
results =
2018-03-30 07:01:53 -06:00
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/search " , %{ " q " = > " 2hu " } )
2018-05-16 09:55:20 -06:00
|> json_response ( 200 )
2017-10-30 12:23:16 -06:00
2018-05-16 09:55:20 -06:00
result_ids = for result <- results , do : result [ " acct " ]
assert user_three . nickname in result_ids
2017-10-30 12:23:16 -06:00
end
2017-09-16 02:42:24 -06:00
test " search " , %{ conn : conn } do
user = insert ( :user )
user_two = insert ( :user , %{ nickname : " shp@shitposter.club " } )
user_three = insert ( :user , %{ nickname : " shp@heldscal.la " , name : " I love 2hu " } )
{ :ok , activity } = CommonAPI . post ( user , %{ " status " = > " This is about 2hu " } )
2018-04-07 08:40:03 -06:00
{ :ok , _activity } =
CommonAPI . post ( user , %{
" status " = > " This is about 2hu, but private " ,
" visibility " = > " private "
} )
2017-09-16 02:42:24 -06:00
{ :ok , _ } = CommonAPI . post ( user_two , %{ " status " = > " This isn't " } )
2018-03-30 07:01:53 -06:00
conn =
conn
|> get ( " /api/v1/search " , %{ " q " = > " 2hu " } )
2017-09-16 02:42:24 -06:00
assert results = json_response ( conn , 200 )
2018-05-16 09:55:20 -06:00
[ account | _ ] = results [ " accounts " ]
2017-11-10 09:18:19 -07:00
assert account [ " id " ] == to_string ( user_three . id )
2017-09-16 02:42:24 -06:00
assert results [ " hashtags " ] == [ ]
[ status ] = results [ " statuses " ]
2017-10-31 10:57:26 -06:00
assert status [ " id " ] == to_string ( activity . id )
2017-09-16 02:42:24 -06:00
end
2017-09-16 03:26:20 -06:00
2017-11-09 08:48:45 -07:00
test " search fetches remote statuses " , %{ conn : conn } do
2018-03-30 07:01:53 -06:00
capture_log ( fn ->
conn =
conn
|> get ( " /api/v1/search " , %{ " q " = > " https://shitposter.club/notice/2827873 " } )
2018-02-12 02:13:54 -07:00
assert results = json_response ( conn , 200 )
2017-11-09 08:48:45 -07:00
2018-02-12 02:13:54 -07:00
[ status ] = results [ " statuses " ]
assert status [ " uri " ] == " tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment "
2018-03-30 07:01:53 -06:00
end )
2017-11-09 08:48:45 -07:00
end
2019-01-07 05:13:37 -07:00
test " search doesn't show statuses that it shouldn't " , %{ conn : conn } do
{ :ok , activity } =
CommonAPI . post ( insert ( :user ) , %{
" status " = > " This is about 2hu, but private " ,
" visibility " = > " private "
} )
capture_log ( fn ->
conn =
conn
|> get ( " /api/v1/search " , %{ " q " = > activity . data [ " object " ] [ " id " ] } )
assert results = json_response ( conn , 200 )
[ ] = results [ " statuses " ]
end )
end
2017-09-16 03:26:20 -06:00
test " search fetches remote accounts " , %{ conn : conn } do
2018-03-30 07:01:53 -06:00
conn =
conn
|> get ( " /api/v1/search " , %{ " q " = > " shp@social.heldscal.la " , " resolve " = > " true " } )
2017-09-16 03:26:20 -06:00
assert results = json_response ( conn , 200 )
[ account ] = results [ " accounts " ]
assert account [ " acct " ] == " shp@social.heldscal.la "
end
2017-09-17 05:09:49 -06:00
test " returns the favorites of a user " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , _ } = CommonAPI . post ( other_user , %{ " status " = > " bla " } )
{ :ok , activity } = CommonAPI . post ( other_user , %{ " status " = > " traps are happy " } )
{ :ok , _ , _ } = CommonAPI . favorite ( activity . id , user )
2019-01-13 08:17:47 -07:00
first_conn =
2018-03-30 07:01:53 -06:00
conn
|> assign ( :user , user )
|> get ( " /api/v1/favourites " )
2017-09-17 05:09:49 -06:00
2019-01-13 08:17:47 -07:00
assert [ status ] = json_response ( first_conn , 200 )
2017-10-31 10:57:26 -06:00
assert status [ " id " ] == to_string ( activity . id )
2019-01-13 08:17:47 -07:00
2019-01-15 21:09:01 -07:00
assert [ { " link " , _link_header } ] =
2019-01-13 08:17:47 -07:00
Enum . filter ( first_conn . resp_headers , fn element -> match? ( { " link " , _ } , element ) end )
# Honours query params
{ :ok , second_activity } =
CommonAPI . post ( other_user , %{
" status " = >
" Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful. "
} )
{ :ok , _ , _ } = CommonAPI . favorite ( second_activity . id , user )
last_like = status [ " id " ]
second_conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/favourites?since_id= #{ last_like } " )
assert [ second_status ] = json_response ( second_conn , 200 )
assert second_status [ " id " ] == to_string ( second_activity . id )
third_conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/favourites?limit=0 " )
assert [ ] = json_response ( third_conn , 200 )
2017-09-17 05:09:49 -06:00
end
2017-11-11 15:27:09 -07:00
describe " updating credentials " do
2018-02-12 01:33:01 -07:00
test " updates the user's bio " , %{ conn : conn } do
2017-11-11 15:27:09 -07:00
user = insert ( :user )
2018-12-03 08:59:50 -07:00
user2 = insert ( :user )
2017-11-11 15:27:09 -07:00
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
2018-12-03 08:59:50 -07:00
|> patch ( " /api/v1/accounts/update_credentials " , %{
" note " = > " I drink # cofe with @ #{ user2 . nickname } "
} )
2017-11-11 15:27:09 -07:00
assert user = json_response ( conn , 200 )
2018-12-03 08:59:50 -07:00
assert user [ " note " ] ==
2019-03-17 07:46:46 -06:00
~s( I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe" rel="tag"> # cofe</a> with <span class="h-card"><a data-user=" ) <>
2019-03-04 21:44:53 -07:00
user2 . id <>
~s( " class="u-url mention" href=" ) <>
user2 . ap_id <> ~s( ">@<span> ) <> user2 . nickname <> ~s( </span></a></span> )
2017-11-11 15:27:09 -07:00
end
2018-12-01 02:40:01 -07:00
test " updates the user's locking status " , %{ conn : conn } do
user = insert ( :user )
conn =
conn
|> assign ( :user , user )
|> patch ( " /api/v1/accounts/update_credentials " , %{ locked : " true " } )
assert user = json_response ( conn , 200 )
assert user [ " locked " ] == true
end
2018-02-12 01:33:01 -07:00
test " updates the user's name " , %{ conn : conn } do
2017-11-11 15:27:09 -07:00
user = insert ( :user )
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> patch ( " /api/v1/accounts/update_credentials " , %{ " display_name " = > " markorepairs " } )
2017-11-11 15:27:09 -07:00
assert user = json_response ( conn , 200 )
assert user [ " display_name " ] == " markorepairs "
end
2018-02-12 01:33:01 -07:00
test " updates the user's avatar " , %{ conn : conn } do
2017-11-11 15:27:09 -07:00
user = insert ( :user )
2018-03-30 07:01:53 -06:00
new_avatar = % Plug.Upload {
content_type : " image/jpg " ,
path : Path . absname ( " test/fixtures/image.jpg " ) ,
filename : " an_image.jpg "
}
2017-11-11 15:27:09 -07:00
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> patch ( " /api/v1/accounts/update_credentials " , %{ " avatar " = > new_avatar } )
2017-11-11 15:27:09 -07:00
2018-12-01 02:40:01 -07:00
assert user_response = json_response ( conn , 200 )
assert user_response [ " avatar " ] != User . avatar_url ( user )
2017-11-11 15:27:09 -07:00
end
2018-02-12 01:33:01 -07:00
test " updates the user's banner " , %{ conn : conn } do
2017-11-11 15:27:09 -07:00
user = insert ( :user )
2018-03-30 07:01:53 -06:00
new_header = % Plug.Upload {
content_type : " image/jpg " ,
path : Path . absname ( " test/fixtures/image.jpg " ) ,
filename : " an_image.jpg "
}
2017-11-11 15:27:09 -07:00
2018-03-30 07:01:53 -06:00
conn =
conn
|> assign ( :user , user )
|> patch ( " /api/v1/accounts/update_credentials " , %{ " header " = > new_header } )
2017-11-11 15:27:09 -07:00
2018-12-01 02:40:01 -07:00
assert user_response = json_response ( conn , 200 )
assert user_response [ " header " ] != User . banner_url ( user )
2017-11-11 15:27:09 -07:00
end
2019-02-19 12:28:21 -07:00
test " requires 'write' permission " , %{ conn : conn } do
token1 = insert ( :oauth_token , scopes : [ " read " ] )
token2 = insert ( :oauth_token , scopes : [ " write " , " follow " ] )
for token <- [ token1 , token2 ] do
conn =
conn
|> put_req_header ( " authorization " , " Bearer #{ token . token } " )
|> patch ( " /api/v1/accounts/update_credentials " , %{ } )
if token == token1 do
assert %{ " error " = > " Insufficient permissions: write. " } == json_response ( conn , 403 )
else
assert json_response ( conn , 200 )
end
end
end
2017-11-11 15:27:09 -07:00
end
2017-11-30 06:59:44 -07:00
2018-02-12 01:33:01 -07:00
test " get instance information " , %{ conn : conn } do
2019-03-26 09:13:24 -06:00
conn = get ( conn , " /api/v1/instance " )
assert result = json_response ( conn , 200 )
# Note: not checking for "max_toot_chars" since it's optional
assert %{
2019-03-26 09:18:36 -06:00
" uri " = > _ ,
" title " = > _ ,
" description " = > _ ,
" version " = > _ ,
" email " = > _ ,
" urls " = > %{
" streaming_api " = > _
} ,
" stats " = > _ ,
" thumbnail " = > _ ,
" languages " = > _ ,
" registrations " = > _
} = result
2019-03-26 09:13:24 -06:00
end
test " get instance stats " , %{ conn : conn } do
2017-11-30 06:59:44 -07:00
user = insert ( :user , %{ local : true } )
2019-01-17 09:16:02 -07:00
user2 = insert ( :user , %{ local : true } )
{ :ok , _user2 } = User . deactivate ( user2 , ! user2 . info . deactivated )
2019-01-16 01:07:46 -07:00
insert ( :user , %{ local : false , nickname : " u@peer1.com " } )
insert ( :user , %{ local : false , nickname : " u@peer2.com " } )
2017-11-30 06:59:44 -07:00
{ :ok , _ } = TwitterAPI . create_status ( user , %{ " status " = > " cofe " } )
2019-01-22 07:12:53 -07:00
# Stats should count users with missing or nil `info.deactivated` value
2019-04-02 04:01:26 -06:00
user = User . get_by_id ( user . id )
2019-01-22 07:12:53 -07:00
info_change = Changeset . change ( user . info , %{ deactivated : nil } )
{ :ok , _user } =
user
|> Changeset . change ( )
|> Changeset . put_embed ( :info , info_change )
|> User . update_and_set_cache ( )
2018-01-13 23:28:35 -07:00
Pleroma.Stats . update_stats ( )
2019-01-16 01:07:46 -07:00
conn = get ( conn , " /api/v1/instance " )
assert result = json_response ( conn , 200 )
stats = result [ " stats " ]
assert stats
2019-01-17 09:16:02 -07:00
assert stats [ " user_count " ] == 1
2019-01-16 01:07:46 -07:00
assert stats [ " status_count " ] == 1
assert stats [ " domain_count " ] == 2
end
test " get peers " , %{ conn : conn } do
insert ( :user , %{ local : false , nickname : " u@peer1.com " } )
insert ( :user , %{ local : false , nickname : " u@peer2.com " } )
Pleroma.Stats . update_stats ( )
conn = get ( conn , " /api/v1/instance/peers " )
2017-11-30 06:59:44 -07:00
assert result = json_response ( conn , 200 )
2019-01-16 01:07:46 -07:00
assert [ " peer1.com " , " peer2.com " ] == Enum . sort ( result )
2017-11-30 06:59:44 -07:00
end
2018-12-16 04:15:34 -07:00
test " put settings " , %{ conn : conn } do
user = insert ( :user )
conn =
conn
|> assign ( :user , user )
|> put ( " /api/web/settings " , %{ " data " = > %{ " programming " = > " socks " } } )
2019-01-15 21:09:01 -07:00
assert _result = json_response ( conn , 200 )
2018-12-16 04:15:34 -07:00
user = User . get_cached_by_ap_id ( user . ap_id )
assert user . info . settings == %{ " programming " = > " socks " }
end
2019-01-07 06:45:33 -07:00
2019-01-08 01:25:50 -07:00
describe " pinned statuses " do
2019-01-09 05:54:37 -07:00
setup do
2019-01-08 01:25:50 -07:00
Pleroma.Config . put ( [ :instance , :max_pinned_statuses ] , 1 )
2019-01-07 06:45:33 -07:00
2019-01-09 05:54:37 -07:00
user = insert ( :user )
2019-01-07 06:45:33 -07:00
{ :ok , activity } = CommonAPI . post ( user , %{ " status " = > " HI!!! " } )
2019-01-09 05:54:37 -07:00
[ user : user , activity : activity ]
end
test " returns pinned statuses " , %{ conn : conn , user : user , activity : activity } do
2019-01-07 06:45:33 -07:00
{ :ok , _ } = CommonAPI . pin ( activity . id , user )
result =
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/ #{ user . id } /statuses?pinned=true " )
2019-01-09 05:54:37 -07:00
|> json_response ( 200 )
2019-01-07 06:45:33 -07:00
2019-01-09 05:54:37 -07:00
id_str = to_string ( activity . id )
2019-01-07 06:45:33 -07:00
2019-01-08 01:27:02 -07:00
assert [ %{ " id " = > ^ id_str , " pinned " = > true } ] = result
2019-01-07 06:45:33 -07:00
end
2019-01-09 05:54:37 -07:00
test " pin status " , %{ conn : conn , user : user , activity : activity } do
id_str = to_string ( activity . id )
2019-01-07 06:45:33 -07:00
2019-01-08 01:27:02 -07:00
assert %{ " id " = > ^ id_str , " pinned " = > true } =
2019-01-07 06:45:33 -07:00
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity . id } /pin " )
2019-01-09 05:54:37 -07:00
|> json_response ( 200 )
2019-01-07 06:45:33 -07:00
2019-01-08 01:27:02 -07:00
assert [ %{ " id " = > ^ id_str , " pinned " = > true } ] =
2019-01-07 06:45:33 -07:00
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/ #{ user . id } /statuses?pinned=true " )
2019-01-09 05:54:37 -07:00
|> json_response ( 200 )
2019-01-07 06:45:33 -07:00
end
2019-01-09 05:54:37 -07:00
test " unpin status " , %{ conn : conn , user : user , activity : activity } do
2019-01-07 06:45:33 -07:00
{ :ok , _ } = CommonAPI . pin ( activity . id , user )
2019-01-09 05:54:37 -07:00
id_str = to_string ( activity . id )
2019-01-08 02:01:35 -07:00
user = refresh_record ( user )
2019-01-07 06:45:33 -07:00
2019-01-08 01:27:02 -07:00
assert %{ " id " = > ^ id_str , " pinned " = > false } =
2019-01-07 06:45:33 -07:00
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity . id } /unpin " )
2019-01-09 05:54:37 -07:00
|> json_response ( 200 )
2019-01-07 06:45:33 -07:00
assert [ ] =
conn
|> assign ( :user , user )
|> get ( " /api/v1/accounts/ #{ user . id } /statuses?pinned=true " )
2019-01-09 05:54:37 -07:00
|> json_response ( 200 )
2019-01-07 06:45:33 -07:00
end
2019-01-09 05:54:37 -07:00
test " max pinned statuses " , %{ conn : conn , user : user , activity : activity_one } do
2019-01-07 06:45:33 -07:00
{ :ok , activity_two } = CommonAPI . post ( user , %{ " status " = > " HI!!! " } )
2019-01-09 05:54:37 -07:00
id_str_one = to_string ( activity_one . id )
2019-01-07 06:45:33 -07:00
2019-01-08 01:27:02 -07:00
assert %{ " id " = > ^ id_str_one , " pinned " = > true } =
2019-01-07 06:45:33 -07:00
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ id_str_one } /pin " )
2019-01-09 05:54:37 -07:00
|> json_response ( 200 )
2019-01-07 06:45:33 -07:00
2019-01-08 02:01:35 -07:00
user = refresh_record ( user )
2019-01-07 06:45:33 -07:00
2019-01-08 01:25:50 -07:00
assert %{ " error " = > " You have already pinned the maximum number of statuses " } =
2019-01-07 06:45:33 -07:00
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity_two . id } /pin " )
2019-01-09 05:54:37 -07:00
|> json_response ( 400 )
2019-01-07 06:45:33 -07:00
end
2019-01-13 16:06:55 -07:00
test " Status rich-media Card " , %{ conn : conn , user : user } do
2019-02-03 10:54:39 -07:00
Pleroma.Config . put ( [ :rich_media , :enabled ] , true )
2019-01-13 16:06:55 -07:00
{ :ok , activity } = CommonAPI . post ( user , %{ " status " = > " http://example.com/ogp " } )
response =
conn
|> get ( " /api/v1/statuses/ #{ activity . id } /card " )
|> json_response ( 200 )
assert response == %{
" image " = > " http://ia.media-imdb.com/images/rock.jpg " ,
2019-01-26 08:20:27 -07:00
" provider_name " = > " www.imdb.com " ,
2019-01-27 02:37:11 -07:00
" provider_url " = > " http://www.imdb.com " ,
2019-01-13 16:06:55 -07:00
" title " = > " The Rock " ,
" type " = > " link " ,
2019-01-27 02:37:11 -07:00
" url " = > " http://www.imdb.com/title/tt0117500/ " ,
" description " = > nil ,
" pleroma " = > %{
" opengraph " = > %{
" image " = > " http://ia.media-imdb.com/images/rock.jpg " ,
" title " = > " The Rock " ,
" type " = > " video.movie " ,
" url " = > " http://www.imdb.com/title/tt0117500/ "
}
}
2019-01-13 16:06:55 -07:00
}
2019-02-03 10:54:39 -07:00
2019-02-22 04:02:51 -07:00
# works with private posts
{ :ok , activity } =
CommonAPI . post ( user , %{ " status " = > " http://example.com/ogp " , " visibility " = > " direct " } )
response_two =
conn
|> assign ( :user , user )
|> get ( " /api/v1/statuses/ #{ activity . id } /card " )
|> json_response ( 200 )
assert response_two == response
2019-02-03 10:54:39 -07:00
Pleroma.Config . put ( [ :rich_media , :enabled ] , false )
2019-01-13 16:06:55 -07:00
end
2019-01-07 06:45:33 -07:00
end
2018-09-18 18:04:56 -06:00
test " bookmarks " do
user = insert ( :user )
for_user = insert ( :user )
{ :ok , activity1 } =
CommonAPI . post ( user , %{
" status " = > " heweoo? "
} )
{ :ok , activity2 } =
CommonAPI . post ( user , %{
" status " = > " heweoo! "
} )
response1 =
build_conn ( )
|> assign ( :user , for_user )
|> post ( " /api/v1/statuses/ #{ activity1 . id } /bookmark " )
assert json_response ( response1 , 200 ) [ " bookmarked " ] == true
response2 =
build_conn ( )
|> assign ( :user , for_user )
|> post ( " /api/v1/statuses/ #{ activity2 . id } /bookmark " )
assert json_response ( response2 , 200 ) [ " bookmarked " ] == true
bookmarks =
build_conn ( )
|> assign ( :user , for_user )
|> get ( " /api/v1/bookmarks " )
assert [ json_response ( response2 , 200 ) , json_response ( response1 , 200 ) ] ==
json_response ( bookmarks , 200 )
response1 =
build_conn ( )
|> assign ( :user , for_user )
|> post ( " /api/v1/statuses/ #{ activity1 . id } /unbookmark " )
assert json_response ( response1 , 200 ) [ " bookmarked " ] == false
bookmarks =
build_conn ( )
|> assign ( :user , for_user )
|> get ( " /api/v1/bookmarks " )
assert [ json_response ( response2 , 200 ) ] == json_response ( bookmarks , 200 )
end
2019-02-11 03:59:51 -07:00
describe " conversation muting " do
setup do
user = insert ( :user )
{ :ok , activity } = CommonAPI . post ( user , %{ " status " = > " HIE " } )
[ user : user , activity : activity ]
end
test " mute conversation " , %{ conn : conn , user : user , activity : activity } do
id_str = to_string ( activity . id )
assert %{ " id " = > ^ id_str , " muted " = > true } =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity . id } /mute " )
|> json_response ( 200 )
end
test " unmute conversation " , %{ conn : conn , user : user , activity : activity } do
{ :ok , _ } = CommonAPI . add_mute ( user , activity )
id_str = to_string ( activity . id )
user = refresh_record ( user )
assert %{ " id " = > ^ id_str , " muted " = > false } =
conn
|> assign ( :user , user )
|> post ( " /api/v1/statuses/ #{ activity . id } /unmute " )
|> json_response ( 200 )
end
end
2019-02-10 15:11:12 -07:00
test " flavours switching (Pleroma Extension) " , %{ conn : conn } do
user = insert ( :user )
get_old_flavour =
conn
|> assign ( :user , user )
|> get ( " /api/v1/pleroma/flavour " )
assert " glitch " == json_response ( get_old_flavour , 200 )
set_flavour =
conn
|> assign ( :user , user )
|> post ( " /api/v1/pleroma/flavour/vanilla " )
assert " vanilla " == json_response ( set_flavour , 200 )
get_new_flavour =
conn
|> assign ( :user , user )
|> post ( " /api/v1/pleroma/flavour/vanilla " )
assert json_response ( set_flavour , 200 ) == json_response ( get_new_flavour , 200 )
end
2019-02-20 09:51:25 -07:00
describe " reports " do
setup do
reporter = insert ( :user )
target_user = insert ( :user )
{ :ok , activity } = CommonAPI . post ( target_user , %{ " status " = > " foobar " } )
[ reporter : reporter , target_user : target_user , activity : activity ]
end
test " submit a basic report " , %{ conn : conn , reporter : reporter , target_user : target_user } do
assert %{ " action_taken " = > false , " id " = > _ } =
conn
|> assign ( :user , reporter )
|> post ( " /api/v1/reports " , %{ " account_id " = > target_user . id } )
|> json_response ( 200 )
end
test " submit a report with statuses and comment " , %{
conn : conn ,
reporter : reporter ,
target_user : target_user ,
activity : activity
} do
assert %{ " action_taken " = > false , " id " = > _ } =
conn
|> assign ( :user , reporter )
|> post ( " /api/v1/reports " , %{
" account_id " = > target_user . id ,
" status_ids " = > [ activity . id ] ,
" comment " = > " bad status! "
} )
|> json_response ( 200 )
end
2019-03-11 08:18:32 -06:00
test " account_id is required " , %{
2019-02-20 09:51:25 -07:00
conn : conn ,
reporter : reporter ,
activity : activity
} do
assert %{ " error " = > " Valid `account_id` required " } =
conn
|> assign ( :user , reporter )
|> post ( " /api/v1/reports " , %{ " status_ids " = > [ activity . id ] } )
|> json_response ( 400 )
end
test " comment must be up to the size specified in the config " , %{
conn : conn ,
reporter : reporter ,
target_user : target_user
} do
max_size = Pleroma.Config . get ( [ :instance , :max_report_comment_size ] , 1000 )
comment = String . pad_trailing ( " a " , max_size + 1 , " a " )
error = %{ " error " = > " Comment must be up to #{ max_size } characters " }
assert ^ error =
conn
|> assign ( :user , reporter )
|> post ( " /api/v1/reports " , %{ " account_id " = > target_user . id , " comment " = > comment } )
|> json_response ( 400 )
end
end
2019-03-06 19:29:42 -07:00
describe " link headers " do
test " preserves parameters in link headers " , %{ conn : conn } do
user = insert ( :user )
other_user = insert ( :user )
{ :ok , activity1 } =
CommonAPI . post ( other_user , %{
" status " = > " hi @ #{ user . nickname } " ,
" visibility " = > " public "
} )
{ :ok , activity2 } =
CommonAPI . post ( other_user , %{
" status " = > " hi @ #{ user . nickname } " ,
" visibility " = > " public "
} )
notification1 = Repo . get_by ( Notification , activity_id : activity1 . id )
notification2 = Repo . get_by ( Notification , activity_id : activity2 . id )
conn =
conn
|> assign ( :user , user )
|> get ( " /api/v1/notifications " , %{ media_only : true } )
assert [ link_header ] = get_resp_header ( conn , " link " )
assert link_header =~ ~r/ media_only=true /
assert link_header =~ ~r/ since_id= #{ notification2 . id } /
assert link_header =~ ~r/ max_id= #{ notification1 . id } /
end
end
2019-04-02 04:51:33 -06:00
test " accounts fetches correct account for nicknames beginning with numbers " , %{ conn : conn } do
# Need to set an old-style integer ID to reproduce the problem
# (these are no longer assigned to new accounts but were preserved
# for existing accounts during the migration to flakeIDs)
user_one = insert ( :user , %{ id : 1212 } )
user_two = insert ( :user , %{ nickname : " #{ user_one . id } garbage " } )
resp_one =
conn
|> get ( " /api/v1/accounts/ #{ user_one . id } " )
resp_two =
conn
|> get ( " /api/v1/accounts/ #{ user_two . nickname } " )
resp_three =
conn
|> get ( " /api/v1/accounts/ #{ user_two . id } " )
acc_one = json_response ( resp_one , 200 )
acc_two = json_response ( resp_two , 200 )
acc_three = json_response ( resp_three , 200 )
refute acc_one == acc_two
assert acc_two == acc_three
end
2017-09-09 05:15:01 -06:00
end