2018-12-23 13:11:29 -07:00
# Pleroma: A lightweight social networking server
2021-01-12 23:49:20 -07:00
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
2018-12-23 13:11:29 -07:00
# SPDX-License-Identifier: AGPL-3.0-only
2017-03-21 10:53:20 -06:00
defmodule Pleroma.UserTest do
2019-02-10 14:57:38 -07:00
alias Pleroma.Activity
2019-03-04 19:52:23 -07:00
alias Pleroma.Builders.UserBuilder
2022-03-06 09:36:30 -07:00
alias Pleroma.Notification
2019-04-18 00:28:20 -06:00
alias Pleroma.Object
2019-02-10 14:57:38 -07:00
alias Pleroma.Repo
2019-08-13 11:20:26 -06:00
alias Pleroma.Tests.ObanHelpers
2019-02-10 14:57:38 -07:00
alias Pleroma.User
2019-04-12 03:38:32 -06:00
alias Pleroma.Web.ActivityPub.ActivityPub
2017-11-16 08:49:51 -07:00
alias Pleroma.Web.CommonAPI
2019-03-26 16:51:59 -06:00
2017-03-21 10:53:20 -06:00
use Pleroma.DataCase
2019-08-01 08:28:00 -06:00
use Oban.Testing , repo : Pleroma.Repo
2017-03-21 10:53:20 -06:00
2017-04-16 07:28:28 -06:00
import Pleroma.Factory
2020-01-08 06:40:38 -07:00
import ExUnit.CaptureLog
2020-07-21 00:25:53 -06:00
import Swoosh.TestAssertions
2017-04-16 07:28:28 -06:00
2018-12-04 04:01:39 -07:00
setup_all do
Tesla.Mock . mock_global ( fn env -> apply ( HttpRequestMock , :request , [ env ] ) end )
:ok
end
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :account_activation_required ] )
2019-08-19 09:34:29 -06:00
2019-11-04 10:44:24 -07:00
describe " service actors " do
2020-01-08 06:40:38 -07:00
test " returns updated invisible actor " do
uri = " #{ Pleroma.Web.Endpoint . url ( ) } /relay "
followers_uri = " #{ uri } /followers "
insert (
:user ,
%{
nickname : " relay " ,
invisible : false ,
local : true ,
ap_id : uri ,
follower_address : followers_uri
}
)
actor = User . get_or_create_service_actor_by_ap_id ( uri , " relay " )
assert actor . invisible
end
test " returns relay user " do
uri = " #{ Pleroma.Web.Endpoint . url ( ) } /relay "
followers_uri = " #{ uri } /followers "
assert % User {
nickname : " relay " ,
invisible : true ,
local : true ,
ap_id : ^ uri ,
follower_address : ^ followers_uri
} = User . get_or_create_service_actor_by_ap_id ( uri , " relay " )
assert capture_log ( fn ->
refute User . get_or_create_service_actor_by_ap_id ( " /relay " , " relay " )
end ) =~ " Cannot create service actor: "
end
2019-11-04 10:44:24 -07:00
test " returns invisible actor " do
uri = " #{ Pleroma.Web.Endpoint . url ( ) } /internal/fetch-test "
followers_uri = " #{ uri } /followers "
user = User . get_or_create_service_actor_by_ap_id ( uri , " internal.fetch-test " )
assert % User {
nickname : " internal.fetch-test " ,
invisible : true ,
local : true ,
ap_id : ^ uri ,
follower_address : ^ followers_uri
} = user
user2 = User . get_or_create_service_actor_by_ap_id ( uri , " internal.fetch-test " )
assert user . id == user2 . id
end
end
2019-11-20 05:46:11 -07:00
describe " AP ID user relationships " do
setup do
{ :ok , user : insert ( :user ) }
end
2020-03-25 00:04:00 -06:00
test " outgoing_relationships_ap_ids/1 " , %{ user : user } do
2019-11-20 05:46:11 -07:00
rel_types = [ :block , :mute , :notification_mute , :reblog_mute , :inverse_subscription ]
ap_ids_by_rel =
Enum . into (
rel_types ,
%{ } ,
fn rel_type ->
rel_records =
insert_list ( 2 , :user_relationship , %{ source : user , relationship_type : rel_type } )
ap_ids = Enum . map ( rel_records , fn rr -> Repo . preload ( rr , :target ) . target . ap_id end )
{ rel_type , Enum . sort ( ap_ids ) }
end
)
assert ap_ids_by_rel [ :block ] == Enum . sort ( User . blocked_users_ap_ids ( user ) )
assert ap_ids_by_rel [ :block ] == Enum . sort ( Enum . map ( User . blocked_users ( user ) , & &1 . ap_id ) )
assert ap_ids_by_rel [ :mute ] == Enum . sort ( User . muted_users_ap_ids ( user ) )
assert ap_ids_by_rel [ :mute ] == Enum . sort ( Enum . map ( User . muted_users ( user ) , & &1 . ap_id ) )
assert ap_ids_by_rel [ :notification_mute ] ==
Enum . sort ( User . notification_muted_users_ap_ids ( user ) )
assert ap_ids_by_rel [ :notification_mute ] ==
Enum . sort ( Enum . map ( User . notification_muted_users ( user ) , & &1 . ap_id ) )
assert ap_ids_by_rel [ :reblog_mute ] == Enum . sort ( User . reblog_muted_users_ap_ids ( user ) )
assert ap_ids_by_rel [ :reblog_mute ] ==
Enum . sort ( Enum . map ( User . reblog_muted_users ( user ) , & &1 . ap_id ) )
assert ap_ids_by_rel [ :inverse_subscription ] == Enum . sort ( User . subscriber_users_ap_ids ( user ) )
assert ap_ids_by_rel [ :inverse_subscription ] ==
Enum . sort ( Enum . map ( User . subscriber_users ( user ) , & &1 . ap_id ) )
2020-03-25 00:04:00 -06:00
outgoing_relationships_ap_ids = User . outgoing_relationships_ap_ids ( user , rel_types )
2019-11-20 05:46:11 -07:00
assert ap_ids_by_rel ==
2020-03-25 00:04:00 -06:00
Enum . into ( outgoing_relationships_ap_ids , %{ } , fn { k , v } -> { k , Enum . sort ( v ) } end )
2019-11-20 05:46:11 -07:00
end
end
2018-12-17 12:12:01 -07:00
describe " when tags are nil " do
test " tagging a user " do
user = insert ( :user , %{ tags : nil } )
user = User . tag ( user , [ " cool " , " dude " ] )
assert " cool " in user . tags
assert " dude " in user . tags
end
test " untagging a user " do
user = insert ( :user , %{ tags : nil } )
user = User . untag ( user , [ " cool " , " dude " ] )
assert user . tags == [ ]
end
end
2017-03-21 10:53:20 -06:00
test " ap_id returns the activity pub id for the user " do
2018-03-30 07:01:53 -06:00
user = UserBuilder . build ( )
2017-03-21 10:53:20 -06:00
2021-05-31 14:09:11 -06:00
expected_ap_id = " #{ Pleroma.Web.Endpoint . url ( ) } /users/ #{ user . nickname } "
2017-03-21 10:53:20 -06:00
assert expected_ap_id == User . ap_id ( user )
end
test " ap_followers returns the followers collection for the user " do
2018-03-30 07:01:53 -06:00
user = UserBuilder . build ( )
2017-03-21 10:53:20 -06:00
expected_followers_collection = " #{ User . ap_id ( user ) } /followers "
assert expected_followers_collection == User . ap_followers ( user )
end
2017-03-22 11:36:08 -06:00
2019-07-10 08:39:07 -06:00
test " ap_following returns the following collection for the user " do
user = UserBuilder . build ( )
expected_followers_collection = " #{ User . ap_id ( user ) } /following "
assert expected_followers_collection == User . ap_following ( user )
end
2019-02-27 06:51:07 -07:00
test " returns all pending follow requests " do
unlocked = insert ( :user )
2020-10-13 08:31:13 -06:00
locked = insert ( :user , is_locked : true )
2019-02-27 06:51:07 -07:00
follower = insert ( :user )
2019-08-31 01:20:34 -06:00
CommonAPI . follow ( follower , unlocked )
CommonAPI . follow ( follower , locked )
2019-02-27 06:51:07 -07:00
2019-09-24 01:16:52 -06:00
assert [ ] = User . get_follow_requests ( unlocked )
assert [ activity ] = User . get_follow_requests ( locked )
2019-02-27 06:51:07 -07:00
assert activity
end
2019-03-02 12:18:51 -07:00
test " doesn't return already accepted or duplicate follow requests " do
2020-10-13 08:31:13 -06:00
locked = insert ( :user , is_locked : true )
2019-03-02 12:18:51 -07:00
pending_follower = insert ( :user )
accepted_follower = insert ( :user )
2019-08-31 01:20:34 -06:00
CommonAPI . follow ( pending_follower , locked )
CommonAPI . follow ( pending_follower , locked )
CommonAPI . follow ( accepted_follower , locked )
2020-03-28 09:49:03 -06:00
Pleroma.FollowingRelationship . update ( accepted_follower , locked , :follow_accept )
2019-03-02 12:18:51 -07:00
2019-10-10 13:35:32 -06:00
assert [ ^ pending_follower ] = User . get_follow_requests ( locked )
2019-03-02 12:18:51 -07:00
end
2020-06-24 16:18:53 -06:00
test " doesn't return follow requests for deactivated accounts " do
2020-10-13 08:31:13 -06:00
locked = insert ( :user , is_locked : true )
2020-10-12 16:42:27 -06:00
pending_follower = insert ( :user , %{ is_active : false } )
2020-06-24 16:18:53 -06:00
CommonAPI . follow ( pending_follower , locked )
2020-10-12 16:42:27 -06:00
refute pending_follower . is_active
2020-06-24 16:18:53 -06:00
assert [ ] = User . get_follow_requests ( locked )
end
2019-08-18 13:29:31 -06:00
test " clears follow requests when requester is blocked " do
2020-10-13 08:31:13 -06:00
followed = insert ( :user , is_locked : true )
2019-08-18 13:29:31 -06:00
follower = insert ( :user )
2019-08-18 15:54:40 -06:00
CommonAPI . follow ( follower , followed )
2019-09-24 01:16:52 -06:00
assert [ _activity ] = User . get_follow_requests ( followed )
2019-08-18 13:29:31 -06:00
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( followed , follower )
2019-09-24 01:16:52 -06:00
assert [ ] = User . get_follow_requests ( followed )
2019-08-18 13:29:31 -06:00
end
2019-01-09 03:35:23 -07:00
test " follow_all follows mutliple users " do
user = insert ( :user )
2019-01-30 11:33:25 -07:00
followed_zero = insert ( :user )
2019-01-09 03:35:23 -07:00
followed_one = insert ( :user )
followed_two = insert ( :user )
2019-02-09 05:24:23 -07:00
blocked = insert ( :user )
2019-01-30 11:33:25 -07:00
not_followed = insert ( :user )
2019-02-13 05:52:27 -07:00
reverse_blocked = insert ( :user )
2019-01-30 11:33:25 -07:00
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( user , blocked )
{ :ok , _user_relationship } = User . block ( reverse_blocked , user )
2019-02-09 05:24:23 -07:00
2020-12-01 13:17:52 -07:00
{ :ok , user , followed_zero } = User . follow ( user , followed_zero )
2019-01-09 03:35:23 -07:00
2019-02-13 05:52:27 -07:00
{ :ok , user } = User . follow_all ( user , [ followed_one , followed_two , blocked , reverse_blocked ] )
2019-01-09 03:35:23 -07:00
assert User . following? ( user , followed_one )
assert User . following? ( user , followed_two )
2019-01-30 11:33:25 -07:00
assert User . following? ( user , followed_zero )
refute User . following? ( user , not_followed )
2019-02-09 05:24:23 -07:00
refute User . following? ( user , blocked )
2019-02-13 05:52:27 -07:00
refute User . following? ( user , reverse_blocked )
2019-01-09 03:35:23 -07:00
end
2019-01-31 10:07:46 -07:00
test " follow_all follows mutliple users without duplicating " do
user = insert ( :user )
followed_zero = insert ( :user )
followed_one = insert ( :user )
followed_two = insert ( :user )
{ :ok , user } = User . follow_all ( user , [ followed_zero , followed_one ] )
2019-10-10 13:35:32 -06:00
assert length ( User . following ( user ) ) == 3
2019-01-31 10:07:46 -07:00
{ :ok , user } = User . follow_all ( user , [ followed_one , followed_two ] )
2019-10-10 13:35:32 -06:00
assert length ( User . following ( user ) ) == 4
2019-01-31 10:07:46 -07:00
end
2017-03-23 06:13:09 -06:00
test " follow takes a user and another user " do
2017-04-16 07:28:28 -06:00
user = insert ( :user )
followed = insert ( :user )
2017-03-22 11:36:08 -06:00
2020-12-01 13:17:52 -07:00
{ :ok , user , followed } = User . follow ( user , followed )
2017-03-22 11:36:08 -06:00
2019-04-22 01:20:43 -06:00
user = User . get_cached_by_id ( user . id )
followed = User . get_cached_by_ap_id ( followed . ap_id )
2019-11-21 02:31:13 -07:00
2019-10-16 12:59:21 -06:00
assert followed . follower_count == 1
2019-11-21 02:31:13 -07:00
assert user . following_count == 1
2017-07-22 09:42:15 -06:00
2019-10-10 13:35:32 -06:00
assert User . ap_followers ( followed ) in User . following ( user )
2017-03-22 11:36:08 -06:00
end
2017-03-23 06:13:09 -06:00
2017-12-07 09:51:55 -07:00
test " can't follow a deactivated users " do
user = insert ( :user )
2020-10-12 16:42:27 -06:00
followed = insert ( :user , %{ is_active : false } )
2017-12-07 09:51:55 -07:00
{ :error , _ } = User . follow ( user , followed )
end
2018-05-24 21:16:02 -06:00
test " can't follow a user who blocked us " do
blocker = insert ( :user )
blockee = insert ( :user )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( blocker , blockee )
2018-05-24 21:16:02 -06:00
{ :error , _ } = User . follow ( blockee , blocker )
end
2019-04-08 05:46:12 -06:00
test " can't subscribe to a user who blocked us " do
blocker = insert ( :user )
blocked = insert ( :user )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( blocker , blocked )
2019-04-08 05:46:12 -06:00
{ :error , _ } = User . subscribe ( blocked , blocker )
end
2018-10-11 04:35:32 -06:00
test " local users do not automatically follow local locked accounts " do
2020-10-13 08:31:13 -06:00
follower = insert ( :user , is_locked : true )
followed = insert ( :user , is_locked : true )
2018-10-11 04:35:32 -06:00
2020-12-01 13:17:52 -07:00
{ :ok , follower , followed } = User . maybe_direct_follow ( follower , followed )
2018-10-11 04:35:32 -06:00
refute User . following? ( follower , followed )
end
2019-08-16 06:58:42 -06:00
describe " unfollow/2 " do
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :external_user_synchronization ] )
2017-03-23 06:13:09 -06:00
2022-10-19 04:01:14 -06:00
test " unfollow with synchronizes external user " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :external_user_synchronization ] , true )
2017-03-23 08:51:34 -06:00
2019-08-16 06:58:42 -06:00
followed =
insert ( :user ,
nickname : " fuser1 " ,
follower_address : " http://localhost:4001/users/fuser1/followers " ,
following_address : " http://localhost:4001/users/fuser1/following " ,
ap_id : " http://localhost:4001/users/fuser1 "
)
2017-11-19 16:21:53 -07:00
2019-08-16 06:58:42 -06:00
user =
insert ( :user , %{
local : false ,
nickname : " fuser2 " ,
ap_id : " http://localhost:4001/users/fuser2 " ,
follower_address : " http://localhost:4001/users/fuser2/followers " ,
2019-10-10 13:35:32 -06:00
following_address : " http://localhost:4001/users/fuser2/following "
2019-08-16 06:58:42 -06:00
} )
2017-11-19 16:21:53 -07:00
2020-12-01 13:17:52 -07:00
{ :ok , user , followed } = User . follow ( user , followed , :follow_accept )
2019-10-10 13:35:32 -06:00
2019-08-16 06:58:42 -06:00
{ :ok , user , _activity } = User . unfollow ( user , followed )
2017-11-19 16:21:53 -07:00
2019-08-16 06:58:42 -06:00
user = User . get_cached_by_id ( user . id )
2019-10-14 00:50:43 -06:00
assert User . following ( user ) == [ ]
2019-08-16 06:58:42 -06:00
end
test " unfollow takes a user and another user " do
followed = insert ( :user )
2019-10-10 13:35:32 -06:00
user = insert ( :user )
2019-08-16 06:58:42 -06:00
2020-12-01 13:17:52 -07:00
{ :ok , user , followed } = User . follow ( user , followed , :follow_accept )
2019-08-16 06:58:42 -06:00
2019-10-10 13:35:32 -06:00
assert User . following ( user ) == [ user . follower_address , followed . follower_address ]
2019-08-16 06:58:42 -06:00
2019-10-10 13:35:32 -06:00
{ :ok , user , _activity } = User . unfollow ( user , followed )
assert User . following ( user ) == [ user . follower_address ]
2019-08-16 06:58:42 -06:00
end
test " unfollow doesn't unfollow yourself " do
user = insert ( :user )
{ :error , _ } = User . unfollow ( user , user )
2019-10-10 13:35:32 -06:00
assert User . following ( user ) == [ user . follower_address ]
2019-08-16 06:58:42 -06:00
end
2017-11-19 16:21:53 -07:00
end
2017-03-23 08:51:34 -06:00
test " test if a user is following another user " do
2017-04-16 07:28:28 -06:00
followed = insert ( :user )
2019-10-10 13:35:32 -06:00
user = insert ( :user )
2020-03-28 09:49:03 -06:00
User . follow ( user , followed , :follow_accept )
2017-03-23 08:51:34 -06:00
assert User . following? ( user , followed )
refute User . following? ( followed , user )
end
2017-04-15 08:40:09 -06:00
2019-04-02 04:51:33 -06:00
test " fetches correct profile for nickname beginning with number " do
# Use old-style integer ID to try to reproduce the problem
user = insert ( :user , %{ id : 1080 } )
2019-04-12 03:38:32 -06:00
user_with_numbers = insert ( :user , %{ nickname : " #{ user . id } garbage " } )
assert user_with_numbers == User . get_cached_by_nickname_or_id ( user_with_numbers . nickname )
2019-04-02 04:51:33 -06:00
end
2017-04-15 08:40:09 -06:00
describe " user registration " do
@full_user_data %{
bio : " A guy " ,
name : " my name " ,
nickname : " nick " ,
password : " test " ,
password_confirmation : " test " ,
email : " email@example.com "
}
2020-07-21 00:25:53 -06:00
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :autofollowed_nicknames ] )
2020-10-16 11:32:05 -06:00
setup do : clear_config ( [ :instance , :autofollowing_nicknames ] )
2020-07-21 00:25:53 -06:00
setup do : clear_config ( [ :welcome ] )
2020-07-10 22:20:35 -06:00
setup do : clear_config ( [ :instance , :account_activation_required ] )
2017-04-15 08:40:09 -06:00
2019-01-08 01:55:33 -07:00
test " it autofollows accounts that are set for it " do
user = insert ( :user )
remote_user = insert ( :user , %{ local : false } )
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :autofollowed_nicknames ] , [
2019-01-08 01:55:33 -07:00
user . nickname ,
remote_user . nickname
] )
cng = User . register_changeset ( % User { } , @full_user_data )
{ :ok , registered_user } = User . register ( cng )
assert User . following? ( registered_user , user )
refute User . following? ( registered_user , remote_user )
2019-02-16 08:42:34 -07:00
end
2020-10-16 11:32:05 -06:00
test " it adds automatic followers for new registered accounts " do
user1 = insert ( :user )
user2 = insert ( :user )
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :autofollowing_nicknames ] , [
2020-10-16 11:32:05 -06:00
user1 . nickname ,
user2 . nickname
] )
cng = User . register_changeset ( % User { } , @full_user_data )
{ :ok , registered_user } = User . register ( cng )
assert User . following? ( user1 , registered_user )
assert User . following? ( user2 , registered_user )
end
2019-02-16 08:42:34 -07:00
test " it sends a welcome message if it is set " do
welcome_user = insert ( :user )
2021-01-26 10:58:43 -07:00
clear_config ( [ :welcome , :direct_message , :enabled ] , true )
clear_config ( [ :welcome , :direct_message , :sender_nickname ] , welcome_user . nickname )
clear_config ( [ :welcome , :direct_message , :message ] , " Hello, this is a direct message " )
2020-07-21 00:25:53 -06:00
2020-08-02 07:54:59 -06:00
cng = User . register_changeset ( % User { } , @full_user_data )
{ :ok , registered_user } = User . register ( cng )
ObanHelpers . perform_all ( )
activity = Repo . one ( Pleroma.Activity )
assert registered_user . ap_id in activity . recipients
2021-01-04 05:38:31 -07:00
assert Object . normalize ( activity , fetch : false ) . data [ " content " ] =~ " direct message "
2020-08-02 07:54:59 -06:00
assert activity . actor == welcome_user . ap_id
end
2020-09-15 02:25:10 -06:00
setup do :
2022-11-06 16:50:32 -07:00
clear_config (
[ :mrf_simple ] ,
%{
media_removal : [ ] ,
media_nsfw : [ ] ,
federated_timeline_removal : [ ] ,
report_removal : [ ] ,
reject : [ ] ,
followers_only : [ ] ,
accept : [ ] ,
avatar_removal : [ ] ,
banner_removal : [ ] ,
reject_deletes : [ ]
}
2020-09-15 02:25:10 -06:00
)
setup do :
clear_config ( :mrf ,
policies : [
Pleroma.Web.ActivityPub.MRF.SimplePolicy
]
)
2020-08-02 07:54:59 -06:00
test " it sends a welcome email message if it is set " do
welcome_user = insert ( :user )
2021-01-26 10:58:43 -07:00
clear_config ( [ :welcome , :email , :enabled ] , true )
clear_config ( [ :welcome , :email , :sender ] , welcome_user . email )
2020-07-21 00:25:53 -06:00
2021-01-26 10:58:43 -07:00
clear_config (
2020-07-21 00:25:53 -06:00
[ :welcome , :email , :subject ] ,
" Hello, welcome to cool site: <%= instance_name %> "
)
2019-02-16 08:42:34 -07:00
2020-07-21 00:25:53 -06:00
instance_name = Pleroma.Config . get ( [ :instance , :name ] )
2019-02-16 08:42:34 -07:00
cng = User . register_changeset ( % User { } , @full_user_data )
{ :ok , registered_user } = User . register ( cng )
2020-07-21 00:25:53 -06:00
ObanHelpers . perform_all ( )
2019-02-16 08:42:34 -07:00
2020-07-21 00:25:53 -06:00
assert_email_sent (
from : { instance_name , welcome_user . email } ,
to : { registered_user . name , registered_user . email } ,
subject : " Hello, welcome to cool site: #{ instance_name } " ,
html_body : " Welcome to #{ instance_name } "
)
2019-01-08 01:55:33 -07:00
end
2020-07-10 22:20:35 -06:00
test " it sends a confirm email " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :account_activation_required ] , true )
2020-07-10 22:20:35 -06:00
cng = User . register_changeset ( % User { } , @full_user_data )
{ :ok , registered_user } = User . register ( cng )
ObanHelpers . perform_all ( )
2020-09-21 14:05:46 -06:00
Pleroma.Emails.UserEmail . account_confirmation_email ( registered_user )
|> assert_email_sent ( )
2020-07-10 22:20:35 -06:00
end
2020-02-26 09:13:53 -07:00
2020-10-11 20:38:01 -06:00
test " sends a pending approval email " do
clear_config ( [ :instance , :account_approval_required ] , true )
{ :ok , user } =
User . register_changeset ( % User { } , @full_user_data )
|> User . register ( )
ObanHelpers . perform_all ( )
assert_email_sent (
from : Pleroma.Config.Helpers . sender ( ) ,
to : { user . name , user . email } ,
subject : " Your account is awaiting approval "
)
end
2021-02-04 16:56:46 -07:00
test " it sends a registration confirmed email if no others will be sent " do
clear_config ( [ :welcome , :email , :enabled ] , false )
clear_config ( [ :instance , :account_activation_required ] , false )
clear_config ( [ :instance , :account_approval_required ] , false )
{ :ok , user } =
User . register_changeset ( % User { } , @full_user_data )
|> User . register ( )
2021-02-05 08:00:17 -07:00
2021-02-04 16:56:46 -07:00
ObanHelpers . perform_all ( )
instance_name = Pleroma.Config . get ( [ :instance , :name ] )
sender = Pleroma.Config . get ( [ :instance , :notify_email ] )
assert_email_sent (
from : { instance_name , sender } ,
to : { user . name , user . email } ,
subject : " Account registered on #{ instance_name } "
)
end
2021-05-03 13:27:03 -06:00
test " it fails gracefully with invalid email config " do
cng = User . register_changeset ( % User { } , @full_user_data )
# Disable the mailer but enable all the things that want to send emails
clear_config ( [ Pleroma.Emails.Mailer , :enabled ] , false )
clear_config ( [ :instance , :account_activation_required ] , true )
clear_config ( [ :instance , :account_approval_required ] , true )
clear_config ( [ :welcome , :email , :enabled ] , true )
clear_config ( [ :welcome , :email , :sender ] , " lain@lain.com " )
# The user is still created
assert { :ok , % User { nickname : " nick " } } = User . register ( cng )
# No emails are sent
ObanHelpers . perform_all ( )
refute_email_sent ( )
end
2022-12-13 23:04:42 -07:00
test " it works when the registering user does not provide an email " do
clear_config ( [ Pleroma.Emails.Mailer , :enabled ] , false )
clear_config ( [ :instance , :account_activation_required ] , false )
clear_config ( [ :instance , :account_approval_required ] , true )
cng = User . register_changeset ( % User { } , @full_user_data |> Map . put ( :email , " " ) )
# The user is still created
assert { :ok , % User { nickname : " nick " } } = User . register ( cng )
# No emails are sent
ObanHelpers . perform_all ( )
refute_email_sent ( )
end
2020-02-26 09:13:53 -07:00
test " it requires an email, name, nickname and password, bio is optional when account_activation_required is enabled " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :account_activation_required ] , true )
2020-02-26 09:13:53 -07:00
2017-04-15 08:40:09 -06:00
@full_user_data
2018-03-30 07:01:53 -06:00
|> Map . keys ( )
|> Enum . each ( fn key ->
2017-04-15 08:40:09 -06:00
params = Map . delete ( @full_user_data , key )
changeset = User . register_changeset ( % User { } , params )
2018-02-21 13:31:57 -07:00
2018-03-30 07:01:53 -06:00
assert if key == :bio , do : changeset . valid? , else : not changeset . valid?
2020-02-26 09:13:53 -07:00
end )
end
test " it requires an name, nickname and password, bio and email are optional when account_activation_required is disabled " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :account_activation_required ] , false )
2020-02-26 09:13:53 -07:00
@full_user_data
|> Map . keys ( )
|> Enum . each ( fn key ->
params = Map . delete ( @full_user_data , key )
changeset = User . register_changeset ( % User { } , params )
assert if key in [ :bio , :email ] , do : changeset . valid? , else : not changeset . valid?
2017-04-15 08:40:09 -06:00
end )
end
2018-12-25 12:09:27 -07:00
test " it restricts certain nicknames " do
2019-05-17 01:25:20 -06:00
[ restricted_name | _ ] = Pleroma.Config . get ( [ User , :restricted_nicknames ] )
2018-12-25 12:09:27 -07:00
assert is_bitstring ( restricted_name )
params =
@full_user_data
|> Map . put ( :nickname , restricted_name )
changeset = User . register_changeset ( % User { } , params )
refute changeset . valid?
end
2020-08-02 13:53:42 -06:00
test " it blocks blacklisted email domains " do
clear_config ( [ User , :email_blacklist ] , [ " trolling.world " ] )
# Block with match
params = Map . put ( @full_user_data , :email , " troll@trolling.world " )
changeset = User . register_changeset ( % User { } , params )
refute changeset . valid?
# Block with subdomain match
params = Map . put ( @full_user_data , :email , " troll@gnomes.trolling.world " )
changeset = User . register_changeset ( % User { } , params )
refute changeset . valid?
# Pass with different domains that are similar
params = Map . put ( @full_user_data , :email , " troll@gnomestrolling.world " )
changeset = User . register_changeset ( % User { } , params )
assert changeset . valid?
params = Map . put ( @full_user_data , :email , " troll@trolling.world.us " )
changeset = User . register_changeset ( % User { } , params )
assert changeset . valid?
end
2022-08-26 10:30:43 -06:00
test " it sets the password_hash, ap_id, private key and followers collection address " do
2017-04-15 08:40:09 -06:00
changeset = User . register_changeset ( % User { } , @full_user_data )
assert changeset . valid?
assert is_binary ( changeset . changes [ :password_hash ] )
2022-08-26 10:30:43 -06:00
assert is_binary ( changeset . changes [ :keys ] )
2017-04-15 08:40:09 -06:00
assert changeset . changes [ :ap_id ] == User . ap_id ( % User { nickname : @full_user_data . nickname } )
2022-08-24 08:36:33 -06:00
assert is_binary ( changeset . changes [ :keys ] )
2017-07-19 10:49:25 -06:00
assert changeset . changes . follower_address == " #{ changeset . changes . ap_id } /followers "
2017-04-15 08:40:09 -06:00
end
2020-07-29 03:47:03 -06:00
test " it creates a confirmed user " do
changeset = User . register_changeset ( % User { } , @full_user_data )
assert changeset . valid?
{ :ok , user } = Repo . insert ( changeset )
2020-10-13 13:29:34 -06:00
assert user . is_confirmed
2020-07-29 03:47:03 -06:00
end
2017-04-15 08:40:09 -06:00
end
2017-04-30 10:48:48 -06:00
2018-12-18 07:13:52 -07:00
describe " user registration, with :account_activation_required " do
@full_user_data %{
bio : " A guy " ,
name : " my name " ,
nickname : " nick " ,
password : " test " ,
password_confirmation : " test " ,
email : " email@example.com "
}
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :account_activation_required ] , true )
2018-12-18 07:13:52 -07:00
test " it creates unconfirmed user " do
changeset = User . register_changeset ( % User { } , @full_user_data )
assert changeset . valid?
{ :ok , user } = Repo . insert ( changeset )
2020-10-13 13:29:34 -06:00
refute user . is_confirmed
2019-10-16 12:59:21 -06:00
assert user . confirmation_token
2018-12-18 07:13:52 -07:00
end
test " it creates confirmed user if :confirmed option is given " do
2020-10-13 15:07:36 -06:00
changeset = User . register_changeset ( % User { } , @full_user_data , confirmed : true )
2018-12-18 07:13:52 -07:00
assert changeset . valid?
{ :ok , user } = Repo . insert ( changeset )
2020-10-13 13:29:34 -06:00
assert user . is_confirmed
2019-10-16 12:59:21 -06:00
refute user . confirmation_token
2018-12-18 07:13:52 -07:00
end
end
2020-07-12 20:31:13 -06:00
describe " user registration, with :account_approval_required " do
@full_user_data %{
bio : " A guy " ,
name : " my name " ,
nickname : " nick " ,
password : " test " ,
password_confirmation : " test " ,
2020-07-27 14:13:34 -06:00
email : " email@example.com " ,
registration_reason : " I'm a cool guy :) "
2020-07-12 20:31:13 -06:00
}
setup do : clear_config ( [ :instance , :account_approval_required ] , true )
test " it creates unapproved user " do
changeset = User . register_changeset ( % User { } , @full_user_data )
assert changeset . valid?
{ :ok , user } = Repo . insert ( changeset )
2020-10-16 15:44:25 -06:00
refute user . is_approved
2020-07-27 14:13:34 -06:00
assert user . registration_reason == " I'm a cool guy :) "
end
test " it restricts length of registration reason " do
reason_limit = Pleroma.Config . get ( [ :instance , :registration_reason_length ] )
assert is_integer ( reason_limit )
params =
@full_user_data
2020-07-27 18:19:14 -06:00
|> Map . put (
:registration_reason ,
" Quia et nesciunt dolores numquam ipsam nisi sapiente soluta. Ullam repudiandae nisi quam porro officiis officiis ad. Consequatur animi velit ex quia. Odit voluptatem perferendis quia ut nisi. Dignissimos sit soluta atque aliquid dolorem ut dolorum ut. Labore voluptates iste iusto amet voluptatum earum. Ad fugit illum nam eos ut nemo. Pariatur ea fuga non aspernatur. Dignissimos debitis officia corporis est nisi ab et. Atque itaque alias eius voluptas minus. Accusamus numquam tempore occaecati in. "
)
2020-07-27 14:13:34 -06:00
changeset = User . register_changeset ( % User { } , params )
refute changeset . valid?
2020-07-12 20:31:13 -06:00
end
end
2018-12-11 05:31:52 -07:00
describe " get_or_fetch/1 " do
test " gets an existing user by nickname " do
user = insert ( :user )
2019-05-01 03:09:53 -06:00
{ :ok , fetched_user } = User . get_or_fetch ( user . nickname )
2018-12-11 05:31:52 -07:00
assert user == fetched_user
end
test " gets an existing user by ap_id " do
ap_id = " http://mastodon.example.org/users/admin "
user =
insert (
:user ,
local : false ,
nickname : " admin@mastodon.example.org " ,
2019-11-23 04:06:19 -07:00
ap_id : ap_id
2018-12-11 05:31:52 -07:00
)
2019-05-01 03:09:53 -06:00
{ :ok , fetched_user } = User . get_or_fetch ( ap_id )
2018-12-11 05:31:52 -07:00
freshed_user = refresh_record ( user )
assert freshed_user == fetched_user
end
2022-09-08 09:58:17 -06:00
test " gets an existing user by nickname starting with http " do
user = insert ( :user , nickname : " httpssome " )
{ :ok , fetched_user } = User . get_or_fetch ( " httpssome " )
assert user == fetched_user
end
2018-12-11 05:31:52 -07:00
end
2022-08-02 07:54:22 -06:00
describe " get_or_fetch/1 remote users with tld, while BE is runned on subdomain " do
setup do : clear_config ( [ Pleroma.Web.WebFinger , :update_nickname_on_user_fetch ] , true )
test " for mastodon " do
Tesla.Mock . mock ( fn
%{ url : " https://example.com/.well-known/host-meta " } ->
% Tesla.Env {
status : 302 ,
headers : [ { " location " , " https://sub.example.com/.well-known/host-meta " } ]
}
%{ url : " https://sub.example.com/.well-known/host-meta " } ->
% Tesla.Env {
status : 200 ,
body :
" test/fixtures/webfinger/masto-host-meta.xml "
|> File . read! ( )
|> String . replace ( " {{domain}} " , " sub.example.com " )
}
%{ url : " https://sub.example.com/.well-known/webfinger?resource=acct:a@example.com " } ->
% Tesla.Env {
status : 200 ,
body :
" test/fixtures/webfinger/masto-webfinger.json "
|> File . read! ( )
|> String . replace ( " {{nickname}} " , " a " )
|> String . replace ( " {{domain}} " , " example.com " )
|> String . replace ( " {{subdomain}} " , " sub.example.com " ) ,
headers : [ { " content-type " , " application/jrd+json " } ]
}
%{ url : " https://sub.example.com/users/a " } ->
% Tesla.Env {
status : 200 ,
body :
" test/fixtures/webfinger/masto-user.json "
|> File . read! ( )
|> String . replace ( " {{nickname}} " , " a " )
|> String . replace ( " {{domain}} " , " sub.example.com " ) ,
headers : [ { " content-type " , " application/activity+json " } ]
}
%{ url : " https://sub.example.com/users/a/collections/featured " } ->
% Tesla.Env {
status : 200 ,
body :
File . read! ( " test/fixtures/users_mock/masto_featured.json " )
|> String . replace ( " {{domain}} " , " sub.example.com " )
|> String . replace ( " {{nickname}} " , " a " ) ,
headers : [ { " content-type " , " application/activity+json " } ]
}
end )
ap_id = " a@example.com "
{ :ok , fetched_user } = User . get_or_fetch ( ap_id )
assert fetched_user . ap_id == " https://sub.example.com/users/a "
assert fetched_user . nickname == " a@example.com "
end
test " for pleroma " do
Tesla.Mock . mock ( fn
%{ url : " https://example.com/.well-known/host-meta " } ->
% Tesla.Env {
status : 302 ,
headers : [ { " location " , " https://sub.example.com/.well-known/host-meta " } ]
}
%{ url : " https://sub.example.com/.well-known/host-meta " } ->
% Tesla.Env {
status : 200 ,
body :
" test/fixtures/webfinger/pleroma-host-meta.xml "
|> File . read! ( )
|> String . replace ( " {{domain}} " , " sub.example.com " )
}
%{ url : " https://sub.example.com/.well-known/webfinger?resource=acct:a@example.com " } ->
% Tesla.Env {
status : 200 ,
body :
" test/fixtures/webfinger/pleroma-webfinger.json "
|> File . read! ( )
|> String . replace ( " {{nickname}} " , " a " )
|> String . replace ( " {{domain}} " , " example.com " )
|> String . replace ( " {{subdomain}} " , " sub.example.com " ) ,
headers : [ { " content-type " , " application/jrd+json " } ]
}
%{ url : " https://sub.example.com/users/a " } ->
% Tesla.Env {
status : 200 ,
body :
" test/fixtures/webfinger/pleroma-user.json "
|> File . read! ( )
|> String . replace ( " {{nickname}} " , " a " )
|> String . replace ( " {{domain}} " , " sub.example.com " ) ,
headers : [ { " content-type " , " application/activity+json " } ]
}
end )
ap_id = " a@example.com "
{ :ok , fetched_user } = User . get_or_fetch ( ap_id )
assert fetched_user . ap_id == " https://sub.example.com/users/a "
assert fetched_user . nickname == " a@example.com "
end
end
2017-04-30 10:48:48 -06:00
describe " fetching a user from nickname or trying to build one " do
test " gets an existing user " do
user = insert ( :user )
2019-05-01 03:09:53 -06:00
{ :ok , fetched_user } = User . get_or_fetch_by_nickname ( user . nickname )
2017-04-30 10:48:48 -06:00
assert user == fetched_user
end
2017-05-22 10:10:50 -06:00
test " gets an existing user, case insensitive " do
user = insert ( :user , nickname : " nick " )
2019-05-01 03:09:53 -06:00
{ :ok , fetched_user } = User . get_or_fetch_by_nickname ( " NICK " )
2017-05-22 10:10:50 -06:00
assert user == fetched_user
end
2018-12-29 02:26:23 -07:00
test " gets an existing user by fully qualified nickname " do
user = insert ( :user )
2019-05-01 03:09:53 -06:00
{ :ok , fetched_user } =
2018-12-29 02:26:23 -07:00
User . get_or_fetch_by_nickname ( user . nickname <> " @ " <> Pleroma.Web.Endpoint . host ( ) )
assert user == fetched_user
end
test " gets an existing user by fully qualified nickname, case insensitive " do
user = insert ( :user , nickname : " nick " )
casing_altered_fqn = String . upcase ( user . nickname <> " @ " <> Pleroma.Web.Endpoint . host ( ) )
2019-05-01 03:09:53 -06:00
{ :ok , fetched_user } = User . get_or_fetch_by_nickname ( casing_altered_fqn )
2018-12-29 02:26:23 -07:00
assert user == fetched_user
end
2020-05-19 06:36:13 -06:00
@tag capture_log : true
2017-04-30 10:48:48 -06:00
test " returns nil if no user could be fetched " do
2019-05-01 03:09:53 -06:00
{ :error , fetched_user } = User . get_or_fetch_by_nickname ( " nonexistant@social.heldscal.la " )
assert fetched_user == " not found nonexistant@social.heldscal.la "
2017-04-30 10:48:48 -06:00
end
2017-05-01 05:14:58 -06:00
test " returns nil for nonexistant local user " do
2019-05-01 03:09:53 -06:00
{ :error , fetched_user } = User . get_or_fetch_by_nickname ( " nonexistant " )
assert fetched_user == " not found nonexistant "
2017-05-01 05:14:58 -06:00
end
2018-09-20 17:49:08 -06:00
test " updates an existing user, if stale " do
a_week_ago = NaiveDateTime . add ( NaiveDateTime . utc_now ( ) , - 604_800 )
orig_user =
insert (
:user ,
local : false ,
nickname : " admin@mastodon.example.org " ,
ap_id : " http://mastodon.example.org/users/admin " ,
2019-11-23 04:06:19 -07:00
last_refreshed_at : a_week_ago
2018-09-20 17:49:08 -06:00
)
assert orig_user . last_refreshed_at == a_week_ago
2019-05-01 03:09:53 -06:00
{ :ok , user } = User . get_or_fetch_by_ap_id ( " http://mastodon.example.org/users/admin " )
2019-10-16 12:59:21 -06:00
2020-04-06 02:59:35 -06:00
assert user . inbox
2018-09-20 17:49:08 -06:00
refute user . last_refreshed_at == orig_user . last_refreshed_at
end
2020-05-25 04:49:38 -06:00
2020-07-01 04:26:07 -06:00
test " if nicknames clash, the old user gets a prefix with the old id to the nickname " do
a_week_ago = NaiveDateTime . add ( NaiveDateTime . utc_now ( ) , - 604_800 )
orig_user =
insert (
:user ,
local : false ,
nickname : " admin@mastodon.example.org " ,
ap_id : " http://mastodon.example.org/users/harinezumigari " ,
last_refreshed_at : a_week_ago
)
assert orig_user . last_refreshed_at == a_week_ago
{ :ok , user } = User . get_or_fetch_by_ap_id ( " http://mastodon.example.org/users/admin " )
assert user . inbox
refute user . id == orig_user . id
orig_user = User . get_by_id ( orig_user . id )
assert orig_user . nickname == " #{ orig_user . id } .admin@mastodon.example.org "
end
2020-05-25 04:49:38 -06:00
@tag capture_log : true
test " it returns the old user if stale, but unfetchable " do
a_week_ago = NaiveDateTime . add ( NaiveDateTime . utc_now ( ) , - 604_800 )
orig_user =
insert (
:user ,
local : false ,
nickname : " admin@mastodon.example.org " ,
ap_id : " http://mastodon.example.org/users/raymoo " ,
last_refreshed_at : a_week_ago
)
assert orig_user . last_refreshed_at == a_week_ago
{ :ok , user } = User . get_or_fetch_by_ap_id ( " http://mastodon.example.org/users/raymoo " )
assert user . last_refreshed_at == orig_user . last_refreshed_at
end
2022-11-18 04:14:35 -07:00
test " it doesn't fail on invalid alsoKnownAs entries " do
Tesla.Mock . mock ( fn
%{ url : " https://mbp.example.com/ " } ->
% Tesla.Env {
status : 200 ,
body :
" test/fixtures/microblogpub/user_with_invalid_also_known_as.json "
|> File . read! ( ) ,
headers : [ { " content-type " , " application/activity+json " } ]
}
_ ->
% Tesla.Env { status : 404 }
end )
assert { :ok , % User { also_known_as : [ ] } } =
User . get_or_fetch_by_ap_id ( " https://mbp.example.com/ " )
end
2017-04-30 10:48:48 -06:00
end
2017-05-03 06:26:49 -06:00
test " returns an ap_id for a user " do
user = insert ( :user )
2018-03-30 07:01:53 -06:00
2023-08-15 04:22:18 -06:00
assert User . ap_id ( user ) == url ( @endpoint , ~p[ /users/ #{ user . nickname } ] )
2017-05-03 06:26:49 -06:00
end
test " returns an ap_followers link for a user " do
user = insert ( :user )
2018-03-30 07:01:53 -06:00
2023-08-15 04:22:18 -06:00
assert User . ap_followers ( user ) == url ( @endpoint , ~p[ /users/ #{ user . nickname } /followers ] )
2017-05-03 06:26:49 -06:00
end
2017-05-09 10:11:51 -06:00
2020-04-11 12:44:52 -06:00
describe " remote user changeset " do
2017-05-09 10:11:51 -06:00
@valid_remote %{
bio : " hello " ,
name : " Someone " ,
nickname : " a@b.de " ,
ap_id : " http... " ,
2017-05-10 02:16:20 -06:00
avatar : %{ some : " avatar " }
2017-05-09 10:11:51 -06:00
}
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :user_bio_length ] )
setup do : clear_config ( [ :instance , :user_name_length ] )
2019-08-21 12:24:35 -06:00
2017-05-09 10:11:51 -06:00
test " it confirms validity " do
2020-04-11 12:44:52 -06:00
cs = User . remote_user_changeset ( @valid_remote )
2017-05-09 10:11:51 -06:00
assert cs . valid?
end
2017-07-19 10:49:25 -06:00
test " it sets the follower_adress " do
2020-04-11 12:44:52 -06:00
cs = User . remote_user_changeset ( @valid_remote )
2017-07-19 10:49:25 -06:00
# remote users get a fake local follower address
2018-03-30 07:01:53 -06:00
assert cs . changes . follower_address ==
User . ap_followers ( % User { nickname : @valid_remote [ :nickname ] } )
2017-07-19 10:49:25 -06:00
end
2017-05-09 10:11:51 -06:00
test " it enforces the fqn format for nicknames " do
2020-04-11 12:44:52 -06:00
cs = User . remote_user_changeset ( %{ @valid_remote | nickname : " bla " } )
2019-09-24 01:16:52 -06:00
assert Ecto.Changeset . get_field ( cs , :local ) == false
2017-05-10 02:16:20 -06:00
assert cs . changes . avatar
2017-05-09 10:11:51 -06:00
refute cs . valid?
end
test " it has required fields " do
2020-04-11 12:44:52 -06:00
[ :ap_id ]
2018-03-30 07:01:53 -06:00
|> Enum . each ( fn field ->
2020-04-11 12:44:52 -06:00
cs = User . remote_user_changeset ( Map . delete ( @valid_remote , field ) )
2017-05-09 10:11:51 -06:00
refute cs . valid?
end )
end
2020-12-02 04:18:43 -07:00
test " it is invalid given a local user " do
user = insert ( :user )
cs = User . remote_user_changeset ( user , %{ name : " tom from myspace " } )
refute cs . valid?
end
2017-05-09 10:11:51 -06:00
end
2017-07-20 11:37:41 -06:00
describe " followers and friends " do
test " gets all followers for a given user " do
user = insert ( :user )
follower_one = insert ( :user )
follower_two = insert ( :user )
not_follower = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , follower_one , user } = User . follow ( follower_one , user )
{ :ok , follower_two , user } = User . follow ( follower_two , user )
2017-07-20 11:37:41 -06:00
2019-09-24 01:16:52 -06:00
res = User . get_followers ( user )
2017-07-20 11:37:41 -06:00
2017-11-02 14:57:21 -06:00
assert Enum . member? ( res , follower_one )
assert Enum . member? ( res , follower_two )
refute Enum . member? ( res , not_follower )
2017-07-20 11:37:41 -06:00
end
test " gets all friends (followed users) for a given user " do
user = insert ( :user )
followed_one = insert ( :user )
followed_two = insert ( :user )
not_followed = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , user , followed_one } = User . follow ( user , followed_one )
{ :ok , user , followed_two } = User . follow ( user , followed_two )
2017-07-20 11:37:41 -06:00
2019-09-24 01:16:52 -06:00
res = User . get_friends ( user )
2017-07-20 11:37:41 -06:00
2019-04-22 01:20:43 -06:00
followed_one = User . get_cached_by_ap_id ( followed_one . ap_id )
followed_two = User . get_cached_by_ap_id ( followed_two . ap_id )
2017-11-02 14:57:21 -06:00
assert Enum . member? ( res , followed_one )
assert Enum . member? ( res , followed_two )
refute Enum . member? ( res , not_followed )
2017-07-20 11:37:41 -06:00
end
end
2017-07-22 09:42:15 -06:00
describe " updating note and follower count " do
2019-10-16 12:59:21 -06:00
test " it sets the note_count property " do
2017-07-22 09:42:15 -06:00
note = insert ( :note )
2019-04-22 01:20:43 -06:00
user = User . get_cached_by_ap_id ( note . data [ " actor " ] )
2017-07-22 09:42:15 -06:00
2019-10-16 12:59:21 -06:00
assert user . note_count == 0
2017-07-22 09:42:15 -06:00
{ :ok , user } = User . update_note_count ( user )
2019-10-16 12:59:21 -06:00
assert user . note_count == 1
2017-07-22 09:42:15 -06:00
end
2019-10-16 12:59:21 -06:00
test " it increases the note_count property " do
2017-10-31 09:37:11 -06:00
note = insert ( :note )
2019-04-22 01:20:43 -06:00
user = User . get_cached_by_ap_id ( note . data [ " actor " ] )
2017-10-31 09:37:11 -06:00
2019-10-16 12:59:21 -06:00
assert user . note_count == 0
2017-10-31 09:37:11 -06:00
{ :ok , user } = User . increase_note_count ( user )
2019-10-16 12:59:21 -06:00
assert user . note_count == 1
2017-10-31 09:37:11 -06:00
{ :ok , user } = User . increase_note_count ( user )
2019-10-16 12:59:21 -06:00
assert user . note_count == 2
2017-10-31 09:37:11 -06:00
end
2019-10-16 12:59:21 -06:00
test " it decreases the note_count property " do
2018-04-24 03:34:18 -06:00
note = insert ( :note )
2019-04-22 01:20:43 -06:00
user = User . get_cached_by_ap_id ( note . data [ " actor " ] )
2018-04-24 03:34:18 -06:00
2019-10-16 12:59:21 -06:00
assert user . note_count == 0
2018-04-24 03:34:18 -06:00
{ :ok , user } = User . increase_note_count ( user )
2019-10-16 12:59:21 -06:00
assert user . note_count == 1
2018-04-24 03:34:18 -06:00
{ :ok , user } = User . decrease_note_count ( user )
2019-10-16 12:59:21 -06:00
assert user . note_count == 0
2018-04-24 03:34:18 -06:00
{ :ok , user } = User . decrease_note_count ( user )
2019-10-16 12:59:21 -06:00
assert user . note_count == 0
2018-04-24 03:34:18 -06:00
end
2019-10-16 12:59:21 -06:00
test " it sets the follower_count property " do
2017-07-22 09:42:15 -06:00
user = insert ( :user )
follower = insert ( :user )
User . follow ( follower , user )
2019-10-16 12:59:21 -06:00
assert user . follower_count == 0
2017-07-22 09:42:15 -06:00
{ :ok , user } = User . update_follower_count ( user )
2019-10-16 12:59:21 -06:00
assert user . follower_count == 1
2017-07-22 09:42:15 -06:00
end
end
2017-11-02 14:57:37 -06:00
2019-02-20 06:14:52 -07:00
describe " mutes " do
test " it mutes people " do
user = insert ( :user )
muted_user = insert ( :user )
refute User . mutes? ( user , muted_user )
2019-07-14 07:29:31 -06:00
refute User . muted_notifications? ( user , muted_user )
2019-02-20 06:14:52 -07:00
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationships } = User . mute ( user , muted_user )
2019-02-20 06:14:52 -07:00
assert User . mutes? ( user , muted_user )
2019-07-14 07:29:31 -06:00
assert User . muted_notifications? ( user , muted_user )
2019-02-20 06:14:52 -07:00
end
2020-09-08 05:11:00 -06:00
test " expiring " do
user = insert ( :user )
muted_user = insert ( :user )
{ :ok , _user_relationships } = User . mute ( user , muted_user , %{ expires_in : 60 } )
assert User . mutes? ( user , muted_user )
2020-09-08 06:13:50 -06:00
worker = Pleroma.Workers.MuteExpireWorker
args = %{ " op " = > " unmute_user " , " muter_id " = > user . id , " mutee_id " = > muted_user . id }
2020-09-08 05:11:00 -06:00
assert_enqueued (
2020-09-08 06:13:50 -06:00
worker : worker ,
args : args
2020-09-08 05:11:00 -06:00
)
2020-09-08 06:13:50 -06:00
assert :ok = perform_job ( worker , args )
refute User . mutes? ( user , muted_user )
refute User . muted_notifications? ( user , muted_user )
2020-09-08 05:11:00 -06:00
end
2019-02-20 06:14:52 -07:00
test " it unmutes users " do
user = insert ( :user )
muted_user = insert ( :user )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationships } = User . mute ( user , muted_user )
2019-11-15 11:38:54 -07:00
{ :ok , _user_mute } = User . unmute ( user , muted_user )
2019-02-20 06:14:52 -07:00
refute User . mutes? ( user , muted_user )
2019-07-14 07:29:31 -06:00
refute User . muted_notifications? ( user , muted_user )
end
2020-09-20 11:51:20 -06:00
test " it unmutes users by id " do
user = insert ( :user )
muted_user = insert ( :user )
{ :ok , _user_relationships } = User . mute ( user , muted_user )
{ :ok , _user_mute } = User . unmute ( user . id , muted_user . id )
refute User . mutes? ( user , muted_user )
refute User . muted_notifications? ( user , muted_user )
end
2019-07-14 07:29:31 -06:00
test " it mutes user without notifications " do
user = insert ( :user )
muted_user = insert ( :user )
refute User . mutes? ( user , muted_user )
refute User . muted_notifications? ( user , muted_user )
2020-09-08 04:26:44 -06:00
{ :ok , _user_relationships } = User . mute ( user , muted_user , %{ notifications : false } )
2019-07-14 07:29:31 -06:00
assert User . mutes? ( user , muted_user )
refute User . muted_notifications? ( user , muted_user )
2019-02-20 06:14:52 -07:00
end
end
2017-11-02 14:57:37 -06:00
describe " blocks " do
test " it blocks people " do
user = insert ( :user )
blocked_user = insert ( :user )
refute User . blocks? ( user , blocked_user )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( user , blocked_user )
2017-11-02 14:57:37 -06:00
assert User . blocks? ( user , blocked_user )
end
test " it unblocks users " do
user = insert ( :user )
blocked_user = insert ( :user )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( user , blocked_user )
2019-11-10 06:30:21 -07:00
{ :ok , _user_block } = User . unblock ( user , blocked_user )
2017-11-02 14:57:37 -06:00
refute User . blocks? ( user , blocked_user )
end
2018-06-18 18:45:24 -06:00
test " blocks tear down cyclical follow relationships " do
blocker = insert ( :user )
blocked = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , blocker , blocked } = User . follow ( blocker , blocked )
{ :ok , blocked , blocker } = User . follow ( blocked , blocker )
2018-06-18 18:45:24 -06:00
assert User . following? ( blocker , blocked )
assert User . following? ( blocked , blocker )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( blocker , blocked )
2019-04-22 01:20:43 -06:00
blocked = User . get_cached_by_id ( blocked . id )
2018-06-18 18:45:24 -06:00
assert User . blocks? ( blocker , blocked )
refute User . following? ( blocker , blocked )
refute User . following? ( blocked , blocker )
end
test " blocks tear down blocker->blocked follow relationships " do
blocker = insert ( :user )
blocked = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , blocker , blocked } = User . follow ( blocker , blocked )
2018-06-18 18:45:24 -06:00
assert User . following? ( blocker , blocked )
refute User . following? ( blocked , blocker )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( blocker , blocked )
2019-04-22 01:20:43 -06:00
blocked = User . get_cached_by_id ( blocked . id )
2018-06-18 18:45:24 -06:00
assert User . blocks? ( blocker , blocked )
refute User . following? ( blocker , blocked )
refute User . following? ( blocked , blocker )
end
test " blocks tear down blocked->blocker follow relationships " do
blocker = insert ( :user )
blocked = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , blocked , blocker } = User . follow ( blocked , blocker )
2018-06-18 18:45:24 -06:00
refute User . following? ( blocker , blocked )
assert User . following? ( blocked , blocker )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( blocker , blocked )
2019-04-22 01:20:43 -06:00
blocked = User . get_cached_by_id ( blocked . id )
2018-06-18 18:45:24 -06:00
assert User . blocks? ( blocker , blocked )
refute User . following? ( blocker , blocked )
refute User . following? ( blocked , blocker )
end
2019-04-08 05:46:12 -06:00
test " blocks tear down blocked->blocker subscription relationships " do
blocker = insert ( :user )
blocked = insert ( :user )
2019-11-20 05:46:11 -07:00
{ :ok , _subscription } = User . subscribe ( blocked , blocker )
2019-04-08 05:46:12 -06:00
assert User . subscribed_to? ( blocked , blocker )
refute User . subscribed_to? ( blocker , blocked )
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( blocker , blocked )
2019-04-08 05:46:12 -06:00
assert User . blocks? ( blocker , blocked )
refute User . subscribed_to? ( blocker , blocked )
refute User . subscribed_to? ( blocked , blocker )
end
2017-11-02 14:57:37 -06:00
end
2017-11-16 08:49:51 -07:00
2018-06-03 13:01:37 -06:00
describe " domain blocking " do
test " blocks domains " do
user = insert ( :user )
collateral_user = insert ( :user , %{ ap_id : " https://awful-and-rude-instance.com/user/bully " } )
{ :ok , user } = User . block_domain ( user , " awful-and-rude-instance.com " )
assert User . blocks? ( user , collateral_user )
end
2019-07-22 08:33:58 -06:00
test " does not block domain with same end " do
user = insert ( :user )
collateral_user =
insert ( :user , %{ ap_id : " https://another-awful-and-rude-instance.com/user/bully " } )
{ :ok , user } = User . block_domain ( user , " awful-and-rude-instance.com " )
refute User . blocks? ( user , collateral_user )
end
test " does not block domain with same end if wildcard added " do
user = insert ( :user )
collateral_user =
insert ( :user , %{ ap_id : " https://another-awful-and-rude-instance.com/user/bully " } )
2022-11-06 16:50:32 -07:00
{ :ok , user } = User . block_domain ( user , " awful-and-rude-instance.com " )
2019-07-22 08:33:58 -06:00
refute User . blocks? ( user , collateral_user )
end
test " blocks domain with wildcard for subdomain " do
user = insert ( :user )
user_from_subdomain =
insert ( :user , %{ ap_id : " https://subdomain.awful-and-rude-instance.com/user/bully " } )
user_with_two_subdomains =
insert ( :user , %{
ap_id : " https://subdomain.second_subdomain.awful-and-rude-instance.com/user/bully "
} )
user_domain = insert ( :user , %{ ap_id : " https://awful-and-rude-instance.com/user/bully " } )
2022-11-06 16:50:32 -07:00
{ :ok , user } = User . block_domain ( user , " awful-and-rude-instance.com " )
2019-07-22 08:33:58 -06:00
assert User . blocks? ( user , user_from_subdomain )
assert User . blocks? ( user , user_with_two_subdomains )
assert User . blocks? ( user , user_domain )
end
2018-06-03 13:01:37 -06:00
test " unblocks domains " do
user = insert ( :user )
collateral_user = insert ( :user , %{ ap_id : " https://awful-and-rude-instance.com/user/bully " } )
{ :ok , user } = User . block_domain ( user , " awful-and-rude-instance.com " )
{ :ok , user } = User . unblock_domain ( user , " awful-and-rude-instance.com " )
refute User . blocks? ( user , collateral_user )
end
2019-11-28 03:38:38 -07:00
test " follows take precedence over domain blocks " do
2019-11-28 03:40:50 -07:00
user = insert ( :user )
good_eggo = insert ( :user , %{ ap_id : " https://meanies.social/user/cuteposter " } )
{ :ok , user } = User . block_domain ( user , " meanies.social " )
2020-12-01 13:17:52 -07:00
{ :ok , user , good_eggo } = User . follow ( user , good_eggo )
2019-11-28 03:38:38 -07:00
2019-11-28 03:40:50 -07:00
refute User . blocks? ( user , good_eggo )
2019-11-28 03:38:38 -07:00
end
2018-06-03 13:01:37 -06:00
end
2019-10-30 05:14:07 -06:00
describe " get_recipients_from_activity " do
2020-04-22 09:21:13 -06:00
test " works for announces " do
actor = insert ( :user )
user = insert ( :user , local : true )
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( actor , %{ status : " hello " } )
2020-05-21 05:16:21 -06:00
{ :ok , announce } = CommonAPI . repeat ( activity . id , user )
2020-04-22 09:21:13 -06:00
recipients = User . get_recipients_from_activity ( announce )
assert user in recipients
end
2019-10-30 05:14:07 -06:00
test " get recipients " do
actor = insert ( :user )
user = insert ( :user , local : true )
user_two = insert ( :user , local : false )
addressed = insert ( :user , local : true )
addressed_remote = insert ( :user , local : false )
{ :ok , activity } =
CommonAPI . post ( actor , %{
2020-05-12 13:59:26 -06:00
status : " hey @ #{ addressed . nickname } @ #{ addressed_remote . nickname } "
2019-10-30 05:14:07 -06:00
} )
assert Enum . map ( [ actor , addressed ] , & &1 . ap_id ) --
Enum . map ( User . get_recipients_from_activity ( activity ) , & &1 . ap_id ) == [ ]
2020-12-01 13:17:52 -07:00
{ :ok , user , actor } = User . follow ( user , actor )
{ :ok , _user_two , _actor } = User . follow ( user_two , actor )
2019-10-30 05:14:07 -06:00
recipients = User . get_recipients_from_activity ( activity )
assert length ( recipients ) == 3
assert user in recipients
assert addressed in recipients
end
test " has following " do
actor = insert ( :user )
user = insert ( :user )
user_two = insert ( :user )
addressed = insert ( :user , local : true )
{ :ok , activity } =
CommonAPI . post ( actor , %{
2020-05-12 13:59:26 -06:00
status : " hey @ #{ addressed . nickname } "
2019-10-30 05:14:07 -06:00
} )
assert Enum . map ( [ actor , addressed ] , & &1 . ap_id ) --
Enum . map ( User . get_recipients_from_activity ( activity ) , & &1 . ap_id ) == [ ]
2020-12-01 13:17:52 -07:00
{ :ok , _actor , _user } = User . follow ( actor , user )
{ :ok , _actor , _user_two } = User . follow ( actor , user_two )
2019-10-30 05:14:07 -06:00
recipients = User . get_recipients_from_activity ( activity )
assert length ( recipients ) == 2
assert addressed in recipients
end
2017-11-16 08:49:51 -07:00
end
2017-04-30 10:48:48 -06:00
2020-10-13 16:16:03 -06:00
describe " .set_activation " do
2019-04-12 03:38:32 -06:00
test " can de-activate then re-activate a user " do
user = insert ( :user )
2020-10-12 16:42:27 -06:00
assert user . is_active
2020-10-13 16:16:03 -06:00
{ :ok , user } = User . set_activation ( user , false )
2020-10-12 16:42:27 -06:00
refute user . is_active
2020-10-13 16:16:03 -06:00
{ :ok , user } = User . set_activation ( user , true )
2020-10-12 16:42:27 -06:00
assert user . is_active
2019-04-12 03:38:32 -06:00
end
2019-10-16 12:59:21 -06:00
test " hide a user from followers " do
2019-04-12 03:38:32 -06:00
user = insert ( :user )
user2 = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , user , user2 } = User . follow ( user , user2 )
2020-10-13 16:16:03 -06:00
{ :ok , _user } = User . set_activation ( user , false )
2019-04-12 03:38:32 -06:00
2019-11-27 05:43:47 -07:00
user2 = User . get_cached_by_id ( user2 . id )
2019-04-12 03:38:32 -06:00
2019-11-27 05:43:47 -07:00
assert user2 . follower_count == 0
2019-09-24 01:16:52 -06:00
assert [ ] = User . get_followers ( user2 )
2019-04-12 03:38:32 -06:00
end
test " hide a user from friends " do
user = insert ( :user )
user2 = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , user2 , user } = User . follow ( user2 , user )
2019-11-21 02:31:13 -07:00
assert user2 . following_count == 1
2019-04-12 03:38:32 -06:00
assert User . following_count ( user2 ) == 1
2020-10-13 16:16:03 -06:00
{ :ok , _user } = User . set_activation ( user , false )
2019-04-12 03:38:32 -06:00
2019-11-27 05:43:47 -07:00
user2 = User . get_cached_by_id ( user2 . id )
2019-04-12 03:38:32 -06:00
2019-11-21 02:31:13 -07:00
assert refresh_record ( user2 ) . following_count == 0
2019-11-27 05:43:47 -07:00
assert user2 . following_count == 0
2019-04-12 03:38:32 -06:00
assert User . following_count ( user2 ) == 0
2019-09-24 01:16:52 -06:00
assert [ ] = User . get_friends ( user2 )
2019-04-12 03:38:32 -06:00
end
test " hide a user's statuses from timelines and notifications " do
user = insert ( :user )
user2 = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , user2 , user } = User . follow ( user2 , user )
2019-04-12 03:38:32 -06:00
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " hey @ #{ user2 . nickname } " } )
2019-04-12 03:38:32 -06:00
2019-05-14 05:15:56 -06:00
activity = Repo . preload ( activity , :bookmark )
2019-04-22 00:08:30 -06:00
[ notification ] = Pleroma.Notification . for_user ( user2 )
assert notification . activity . id == activity . id
2019-04-12 03:38:32 -06:00
2019-05-14 05:15:56 -06:00
assert [ activity ] == ActivityPub . fetch_public_activities ( %{ } ) |> Repo . preload ( :bookmark )
2019-04-12 03:38:32 -06:00
2019-05-20 10:35:46 -06:00
assert [ %{ activity | thread_muted? : CommonAPI . thread_muted? ( user2 , activity ) } ] ==
2019-10-10 13:35:32 -06:00
ActivityPub . fetch_activities ( [ user2 . ap_id | User . following ( user2 ) ] , %{
2020-06-04 11:33:16 -06:00
user : user2
2019-10-10 13:35:32 -06:00
} )
2019-04-12 03:38:32 -06:00
2020-10-13 16:16:03 -06:00
{ :ok , _user } = User . set_activation ( user , false )
2019-04-12 03:38:32 -06:00
assert [ ] == ActivityPub . fetch_public_activities ( %{ } )
2019-04-22 00:08:30 -06:00
assert [ ] == Pleroma.Notification . for_user ( user2 )
2019-04-12 03:38:32 -06:00
assert [ ] ==
2019-10-10 13:35:32 -06:00
ActivityPub . fetch_activities ( [ user2 . ap_id | User . following ( user2 ) ] , %{
2020-06-04 11:33:16 -06:00
user : user2
2019-10-10 13:35:32 -06:00
} )
2019-04-12 03:38:32 -06:00
end
2017-12-07 09:47:23 -07:00
end
2017-12-07 10:13:05 -07:00
2020-07-14 17:02:44 -06:00
describe " approve " do
test " approves a user " do
2020-10-16 15:44:25 -06:00
user = insert ( :user , is_approved : false )
refute user . is_approved
2020-07-14 17:02:44 -06:00
{ :ok , user } = User . approve ( user )
2020-10-16 15:44:25 -06:00
assert user . is_approved
2020-07-14 17:02:44 -06:00
end
test " approves a list of users " do
unapproved_users = [
2020-10-16 15:44:25 -06:00
insert ( :user , is_approved : false ) ,
insert ( :user , is_approved : false ) ,
insert ( :user , is_approved : false )
2020-07-14 17:02:44 -06:00
]
{ :ok , users } = User . approve ( unapproved_users )
assert Enum . count ( users ) == 3
Enum . each ( users , fn user ->
2020-10-16 15:44:25 -06:00
assert user . is_approved
2020-07-14 17:02:44 -06:00
end )
end
2020-10-12 15:32:34 -06:00
test " it sends welcome email if it is set " do
clear_config ( [ :welcome , :email , :enabled ] , true )
clear_config ( [ :welcome , :email , :sender ] , " tester@test.me " )
2020-10-16 15:44:25 -06:00
user = insert ( :user , is_approved : false )
2020-10-12 15:32:34 -06:00
welcome_user = insert ( :user , email : " tester@test.me " )
instance_name = Pleroma.Config . get ( [ :instance , :name ] )
User . approve ( user )
ObanHelpers . perform_all ( )
assert_email_sent (
from : { instance_name , welcome_user . email } ,
to : { user . name , user . email } ,
html_body : " Welcome to #{ instance_name } "
)
end
2020-10-12 15:42:59 -06:00
test " approving an approved user does not trigger post-register actions " do
clear_config ( [ :welcome , :email , :enabled ] , true )
2020-10-16 15:44:25 -06:00
user = insert ( :user , is_approved : true )
2020-10-12 15:42:59 -06:00
User . approve ( user )
ObanHelpers . perform_all ( )
assert_no_email_sent ( )
end
2020-10-12 15:32:34 -06:00
end
describe " confirm " do
test " confirms a user " do
2020-10-13 13:29:34 -06:00
user = insert ( :user , is_confirmed : false )
refute user . is_confirmed
2020-10-12 15:32:34 -06:00
{ :ok , user } = User . confirm ( user )
2020-10-13 13:29:34 -06:00
assert user . is_confirmed
2020-10-12 15:32:34 -06:00
end
test " confirms a list of users " do
unconfirmed_users = [
2020-10-13 13:29:34 -06:00
insert ( :user , is_confirmed : false ) ,
insert ( :user , is_confirmed : false ) ,
insert ( :user , is_confirmed : false )
2020-10-12 15:32:34 -06:00
]
{ :ok , users } = User . confirm ( unconfirmed_users )
assert Enum . count ( users ) == 3
Enum . each ( users , fn user ->
2020-10-13 13:29:34 -06:00
assert user . is_confirmed
2020-10-12 15:32:34 -06:00
end )
end
2020-10-16 15:44:25 -06:00
test " sends approval emails when `is_approved: false` " do
2020-10-12 15:32:34 -06:00
admin = insert ( :user , is_admin : true )
2021-01-18 11:05:05 -07:00
user = insert ( :user , is_confirmed : false , is_approved : false )
2020-10-12 15:32:34 -06:00
User . confirm ( user )
ObanHelpers . perform_all ( )
user_email = Pleroma.Emails.UserEmail . approval_pending_email ( user )
admin_email = Pleroma.Emails.AdminEmail . new_unapproved_registration ( admin , user )
notify_email = Pleroma.Config . get ( [ :instance , :notify_email ] )
instance_name = Pleroma.Config . get ( [ :instance , :name ] )
# User approval email
assert_email_sent (
from : { instance_name , notify_email } ,
to : { user . name , user . email } ,
html_body : user_email . html_body
)
# Admin email
assert_email_sent (
from : { instance_name , notify_email } ,
to : { admin . name , admin . email } ,
html_body : admin_email . html_body
)
end
2020-10-12 15:42:59 -06:00
test " confirming a confirmed user does not trigger post-register actions " do
2021-01-18 11:05:05 -07:00
user = insert ( :user , is_confirmed : true , is_approved : false )
2020-10-12 15:42:59 -06:00
User . confirm ( user )
ObanHelpers . perform_all ( )
assert_no_email_sent ( )
end
2020-07-14 17:02:44 -06:00
end
2019-07-09 23:16:08 -06:00
describe " delete " do
setup do
{ :ok , user } = insert ( :user ) |> User . set_cache ( )
2019-04-02 03:30:11 -06:00
2019-07-09 23:16:08 -06:00
[ user : user ]
end
2019-04-02 03:30:11 -06:00
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :federating ] )
2019-08-19 09:34:29 -06:00
2019-07-09 23:16:08 -06:00
test " .delete_user_activities deletes all create activities " , %{ user : user } do
2020-05-12 13:59:26 -06:00
{ :ok , activity } = CommonAPI . post ( user , %{ status : " 2hu " } )
2019-06-24 12:59:12 -06:00
2019-09-24 01:16:52 -06:00
User . delete_user_activities ( user )
2019-04-02 03:30:11 -06:00
2020-04-30 11:53:30 -06:00
# TODO: Test removal favorites, repeats, delete activities.
2019-07-09 23:16:08 -06:00
refute Activity . get_by_id ( activity . id )
end
2020-04-29 05:26:31 -06:00
test " it deactivates a user, all follow relationships and all activities " , %{ user : user } do
2019-07-09 23:16:08 -06:00
follower = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , follower , user } = User . follow ( follower , user )
2019-07-09 23:16:08 -06:00
2020-10-13 08:31:13 -06:00
locked_user = insert ( :user , name : " locked " , is_locked : true )
2020-12-01 13:17:52 -07:00
{ :ok , _ , _ } = User . follow ( user , locked_user , :follow_pending )
2020-06-07 09:31:37 -06:00
2019-07-09 23:16:08 -06:00
object = insert ( :note , user : user )
activity = insert ( :note_activity , user : user , note : object )
object_two = insert ( :note , user : follower )
activity_two = insert ( :note_activity , user : follower , note : object_two )
2017-12-07 10:13:05 -07:00
2019-10-16 08:16:39 -06:00
{ :ok , like } = CommonAPI . favorite ( user , activity_two . id )
{ :ok , like_two } = CommonAPI . favorite ( follower , activity . id )
2020-05-21 05:16:21 -06:00
{ :ok , repeat } = CommonAPI . repeat ( activity_two . id , user )
2017-12-07 10:13:05 -07:00
2019-08-13 11:20:26 -06:00
{ :ok , job } = User . delete ( user )
{ :ok , _user } = ObanHelpers . perform ( job )
2017-12-07 10:13:05 -07:00
2019-07-09 23:16:08 -06:00
follower = User . get_cached_by_id ( follower . id )
2017-12-07 10:13:05 -07:00
2019-07-09 23:16:08 -06:00
refute User . following? ( follower , user )
2020-10-12 16:42:27 -06:00
assert %{ is_active : false } = User . get_by_id ( user . id )
2017-12-07 10:13:05 -07:00
2020-06-07 09:31:37 -06:00
assert [ ] == User . get_follow_requests ( locked_user )
2019-07-09 23:16:08 -06:00
user_activities =
user . ap_id
2019-09-03 08:58:30 -06:00
|> Activity.Queries . by_actor ( )
2019-07-09 23:16:08 -06:00
|> Repo . all ( )
|> Enum . map ( fn act -> act . data [ " type " ] end )
2017-12-07 10:13:05 -07:00
2019-07-09 23:16:08 -06:00
assert Enum . all? ( user_activities , fn act -> act in ~w( Delete Undo ) end )
refute Activity . get_by_id ( activity . id )
refute Activity . get_by_id ( like . id )
refute Activity . get_by_id ( like_two . id )
refute Activity . get_by_id ( repeat . id )
end
2017-12-07 10:13:05 -07:00
end
2018-02-11 12:43:33 -07:00
2021-01-20 10:26:14 -07:00
test " delete/1 when confirmation is pending deletes the user " do
clear_config ( [ :instance , :account_activation_required ] , true )
user = insert ( :user , is_confirmed : false )
2020-05-08 07:54:53 -06:00
2021-01-20 10:26:14 -07:00
{ :ok , job } = User . delete ( user )
{ :ok , _ } = ObanHelpers . perform ( job )
2020-05-08 07:54:53 -06:00
2021-01-20 10:26:14 -07:00
refute User . get_cached_by_id ( user . id )
refute User . get_by_id ( user . id )
2020-05-08 07:54:53 -06:00
end
2020-07-17 11:19:41 -06:00
test " delete/1 when approval is pending deletes the user " do
2020-10-16 15:44:25 -06:00
user = insert ( :user , is_approved : false )
2020-07-17 11:19:41 -06:00
{ :ok , job } = User . delete ( user )
{ :ok , _ } = ObanHelpers . perform ( job )
refute User . get_cached_by_id ( user . id )
refute User . get_by_id ( user . id )
end
2020-08-17 23:10:09 -06:00
test " delete/1 purges a user when they wouldn't be fully deleted " do
user =
insert ( :user , %{
bio : " eyy lmao " ,
name : " qqqqqqq " ,
password_hash : " pdfk2$1b3n159001 " ,
keys : " RSA begin buplic key " ,
public_key : " --PRIVATE KEYE-- " ,
avatar : %{ " a " = > " b " } ,
tags : [ " qqqqq " ] ,
banner : %{ " a " = > " b " } ,
background : %{ " a " = > " b " } ,
note_count : 9 ,
follower_count : 9 ,
following_count : 9001 ,
2020-10-13 08:31:13 -06:00
is_locked : true ,
2021-06-30 00:14:34 -06:00
is_confirmed : true ,
2020-08-17 23:10:09 -06:00
password_reset_pending : true ,
2021-06-30 00:14:34 -06:00
is_approved : true ,
2020-08-17 23:10:09 -06:00
registration_reason : " ahhhhh " ,
confirmation_token : " qqqq " ,
domain_blocks : [ " lain.com " ] ,
2020-10-12 16:42:27 -06:00
is_active : false ,
2020-08-17 23:10:09 -06:00
ap_enabled : true ,
is_moderator : true ,
is_admin : true ,
2022-01-08 14:44:37 -07:00
mastofe_settings : %{ " a " = > " b " } ,
2020-08-17 23:10:09 -06:00
mascot : %{ " a " = > " b " } ,
emoji : %{ " a " = > " b " } ,
pleroma_settings_store : %{ " q " = > " x " } ,
fields : [ %{ " gg " = > " qq " } ] ,
raw_fields : [ %{ " gg " = > " qq " } ] ,
2020-10-13 08:45:08 -06:00
is_discoverable : true ,
2020-08-17 23:10:09 -06:00
also_known_as : [ " https://lol.olo/users/loll " ]
} )
{ :ok , job } = User . delete ( user )
{ :ok , _ } = ObanHelpers . perform ( job )
user = User . get_by_id ( user . id )
assert % User {
2020-09-01 00:25:32 -06:00
bio : " " ,
2020-08-17 23:10:09 -06:00
raw_bio : nil ,
email : nil ,
name : nil ,
password_hash : nil ,
2021-06-30 00:48:17 -06:00
keys : " RSA begin buplic key " ,
public_key : " --PRIVATE KEYE-- " ,
2020-08-17 23:10:09 -06:00
avatar : %{ } ,
tags : [ ] ,
last_refreshed_at : nil ,
last_digest_emailed_at : nil ,
banner : %{ } ,
background : %{ } ,
note_count : 0 ,
follower_count : 0 ,
following_count : 0 ,
2020-10-13 08:31:13 -06:00
is_locked : false ,
2021-06-30 00:14:34 -06:00
is_confirmed : true ,
2020-08-17 23:10:09 -06:00
password_reset_pending : false ,
2021-06-30 00:14:34 -06:00
is_approved : true ,
2020-08-17 23:10:09 -06:00
registration_reason : nil ,
confirmation_token : nil ,
domain_blocks : [ ] ,
2020-10-12 16:42:27 -06:00
is_active : false ,
2020-08-17 23:10:09 -06:00
ap_enabled : false ,
is_moderator : false ,
is_admin : false ,
2022-01-08 14:44:37 -07:00
mastofe_settings : nil ,
2020-08-17 23:10:09 -06:00
mascot : nil ,
emoji : %{ } ,
pleroma_settings_store : %{ } ,
fields : [ ] ,
raw_fields : [ ] ,
2020-10-13 08:45:08 -06:00
is_discoverable : false ,
2020-08-17 23:10:09 -06:00
also_known_as : [ ]
} = user
end
2021-06-29 20:45:38 -06:00
test " delete/1 purges a remote user " do
user =
insert ( :user , %{
name : " qqqqqqq " ,
avatar : %{ " a " = > " b " } ,
banner : %{ " a " = > " b " } ,
local : false
} )
{ :ok , job } = User . delete ( user )
{ :ok , _ } = ObanHelpers . perform ( job )
user = User . get_by_id ( user . id )
assert user . name == nil
assert user . avatar == %{ }
assert user . banner == %{ }
end
2021-11-26 14:19:01 -07:00
describe " set_suggestion " do
test " suggests a user " do
user = insert ( :user , is_suggested : false )
refute user . is_suggested
{ :ok , user } = User . set_suggestion ( user , true )
assert user . is_suggested
end
test " suggests a list of users " do
unsuggested_users = [
insert ( :user , is_suggested : false ) ,
insert ( :user , is_suggested : false ) ,
insert ( :user , is_suggested : false )
]
{ :ok , users } = User . set_suggestion ( unsuggested_users , true )
assert Enum . count ( users ) == 3
Enum . each ( users , fn user ->
assert user . is_suggested
end )
end
test " unsuggests a user " do
user = insert ( :user , is_suggested : true )
assert user . is_suggested
{ :ok , user } = User . set_suggestion ( user , false )
refute user . is_suggested
end
end
2018-02-11 12:43:33 -07:00
test " get_public_key_for_ap_id fetches a user that's not in the db " do
assert { :ok , _key } = User . get_public_key_for_ap_id ( " http://mastodon.example.org/users/admin " )
end
2018-02-15 11:58:12 -07:00
2018-09-21 21:01:01 -06:00
describe " per-user rich-text filtering " do
2018-12-31 00:34:14 -07:00
test " html_filter_policy returns default policies, when rich-text is enabled " do
2018-09-21 21:01:01 -06:00
user = insert ( :user )
2018-12-30 14:12:14 -07:00
assert Pleroma.Config . get ( [ :markup , :scrub_policy ] ) == User . html_filter_policy ( user )
2018-09-21 21:01:01 -06:00
end
test " html_filter_policy returns TwitterText scrubber when rich-text is disabled " do
2019-10-16 12:59:21 -06:00
user = insert ( :user , no_rich_text : true )
2018-09-21 21:01:01 -06:00
assert Pleroma.HTML.Scrubber.TwitterText == User . html_filter_policy ( user )
end
end
2018-11-01 02:09:51 -06:00
describe " caching " do
test " invalidate_cache works " do
user = insert ( :user )
2019-11-27 05:43:47 -07:00
User . set_cache ( user )
2018-11-01 02:09:51 -06:00
User . invalidate_cache ( user )
{ :ok , nil } = Cachex . get ( :user_cache , " ap_id: #{ user . ap_id } " )
{ :ok , nil } = Cachex . get ( :user_cache , " nickname: #{ user . nickname } " )
end
test " User.delete() plugs any possible zombie objects " do
user = insert ( :user )
2019-08-13 11:20:26 -06:00
{ :ok , job } = User . delete ( user )
{ :ok , _ } = ObanHelpers . perform ( job )
2018-11-01 02:09:51 -06:00
{ :ok , cached_user } = Cachex . get ( :user_cache , " ap_id: #{ user . ap_id } " )
assert cached_user != user
{ :ok , cached_user } = Cachex . get ( :user_cache , " nickname: #{ user . ap_id } " )
assert cached_user != user
end
end
2018-11-16 10:31:32 -07:00
2020-01-17 04:55:36 -07:00
describe " account_status/1 " do
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :account_activation_required ] )
2019-01-08 22:02:00 -07:00
2020-01-17 04:55:36 -07:00
test " return confirmation_pending for unconfirm user " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :account_activation_required ] , true )
2020-10-13 13:29:34 -06:00
user = insert ( :user , is_confirmed : false )
2020-01-17 04:55:36 -07:00
assert User . account_status ( user ) == :confirmation_pending
end
2019-01-08 22:02:00 -07:00
2020-01-17 04:55:36 -07:00
test " return active for confirmed user " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :account_activation_required ] , true )
2020-10-13 13:29:34 -06:00
user = insert ( :user , is_confirmed : true )
2020-01-17 04:55:36 -07:00
assert User . account_status ( user ) == :active
end
2019-11-11 04:37:13 -07:00
2020-01-17 04:55:36 -07:00
test " return active for remote user " do
user = insert ( :user , local : false )
assert User . account_status ( user ) == :active
end
2019-11-11 04:37:13 -07:00
2020-01-17 04:55:36 -07:00
test " returns :password_reset_pending for user with reset password " do
user = insert ( :user , password_reset_pending : true )
assert User . account_status ( user ) == :password_reset_pending
end
2019-11-11 04:37:13 -07:00
2020-01-17 04:55:36 -07:00
test " returns :deactivated for deactivated user " do
2021-01-18 13:58:21 -07:00
user = insert ( :user , local : true , is_confirmed : true , is_active : false )
2020-01-17 04:55:36 -07:00
assert User . account_status ( user ) == :deactivated
end
2020-07-12 18:11:30 -06:00
test " returns :approval_pending for unapproved user " do
2020-10-16 15:44:25 -06:00
user = insert ( :user , local : true , is_approved : false )
2020-07-14 17:46:57 -06:00
assert User . account_status ( user ) == :approval_pending
2021-01-18 11:05:05 -07:00
user = insert ( :user , local : true , is_confirmed : false , is_approved : false )
2020-07-12 18:11:30 -06:00
assert User . account_status ( user ) == :approval_pending
end
2019-01-08 22:02:00 -07:00
end
2019-01-08 23:50:31 -07:00
describe " superuser?/1 " do
test " returns false for unprivileged users " do
user = insert ( :user , local : true )
refute User . superuser? ( user )
end
test " returns false for remote users " do
user = insert ( :user , local : false )
2019-10-16 12:59:21 -06:00
remote_admin_user = insert ( :user , local : false , is_admin : true )
2019-01-08 23:50:31 -07:00
refute User . superuser? ( user )
refute User . superuser? ( remote_admin_user )
end
test " returns true for local moderators " do
2019-10-16 12:59:21 -06:00
user = insert ( :user , local : true , is_moderator : true )
2019-01-08 23:50:31 -07:00
assert User . superuser? ( user )
end
test " returns true for local admins " do
2019-10-16 12:59:21 -06:00
user = insert ( :user , local : true , is_admin : true )
2019-01-08 23:50:31 -07:00
assert User . superuser? ( user )
end
end
2019-01-09 00:03:32 -07:00
2019-10-05 14:11:43 -06:00
describe " invisible?/1 " do
test " returns true for an invisible user " do
2019-10-21 02:58:22 -06:00
user = insert ( :user , local : true , invisible : true )
2019-10-05 14:11:43 -06:00
assert User . invisible? ( user )
end
test " returns false for a non-invisible user " do
user = insert ( :user , local : true )
refute User . invisible? ( user )
end
end
2020-05-07 04:44:38 -06:00
describe " visible_for/2 " do
2019-01-09 00:03:32 -07:00
test " returns true when the account is itself " do
user = insert ( :user , local : true )
2020-05-15 11:29:09 -06:00
assert User . visible_for ( user , user ) == :visible
2019-01-09 00:03:32 -07:00
end
2020-09-16 09:29:16 -06:00
test " returns false when the account is unconfirmed and confirmation is required " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :account_activation_required ] , true )
2019-01-09 00:03:32 -07:00
2020-10-13 13:29:34 -06:00
user = insert ( :user , local : true , is_confirmed : false )
2019-01-09 00:03:32 -07:00
other_user = insert ( :user , local : true )
2020-05-15 11:29:09 -06:00
refute User . visible_for ( user , other_user ) == :visible
2019-01-09 00:03:32 -07:00
end
2020-09-16 09:29:16 -06:00
test " returns true when the account is unconfirmed and confirmation is required but the account is remote " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :account_activation_required ] , true )
2020-09-16 09:29:16 -06:00
2020-10-13 13:29:34 -06:00
user = insert ( :user , local : false , is_confirmed : false )
2020-09-16 09:29:16 -06:00
other_user = insert ( :user , local : true )
assert User . visible_for ( user , other_user ) == :visible
end
test " returns true when the account is unconfirmed and being viewed by a privileged account (confirmation required) " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :account_activation_required ] , true )
2019-01-09 00:03:32 -07:00
2020-10-13 13:29:34 -06:00
user = insert ( :user , local : true , is_confirmed : false )
2019-10-16 12:59:21 -06:00
other_user = insert ( :user , local : true , is_admin : true )
2019-01-09 00:03:32 -07:00
2020-05-15 11:29:09 -06:00
assert User . visible_for ( user , other_user ) == :visible
2019-01-09 00:03:32 -07:00
end
end
2019-01-17 23:30:16 -07:00
describe " parse_bio/2 " do
test " preserves hosts in user links text " do
remote_user = insert ( :user , local : false , nickname : " nick@domain.com " )
user = insert ( :user )
bio = " A.k.a. @nick@domain.com "
expected_text =
2021-10-06 00:08:21 -06:00
~s( A.k.a. <span class="h-card"><a class="u-url mention" data-user=" #{ remote_user . id } " href=" #{ remote_user . ap_id } " rel="ugc">@<span>nick@domain.com</span></a></span> )
2019-01-17 23:30:16 -07:00
assert expected_text == User . parse_bio ( bio , user )
end
2019-03-01 22:59:09 -07:00
test " Adds rel=me on linkbacked urls " do
2019-08-25 00:48:38 -06:00
user = insert ( :user , ap_id : " https://social.example.org/users/lain " )
2019-03-01 22:59:09 -07:00
2019-08-25 00:48:38 -06:00
bio = " http://example.com/rel_me/null "
2019-03-01 22:59:09 -07:00
expected_text = " <a href= \" #{ bio } \" > #{ bio } </a> "
assert expected_text == User . parse_bio ( bio , user )
2019-08-25 00:48:38 -06:00
bio = " http://example.com/rel_me/link "
expected_text = " <a href= \" #{ bio } \" rel= \" me \" > #{ bio } </a> "
2019-03-01 22:59:09 -07:00
assert expected_text == User . parse_bio ( bio , user )
2019-08-25 00:48:38 -06:00
bio = " http://example.com/rel_me/anchor "
expected_text = " <a href= \" #{ bio } \" rel= \" me \" > #{ bio } </a> "
2019-03-01 22:59:09 -07:00
assert expected_text == User . parse_bio ( bio , user )
end
2019-01-17 23:30:16 -07:00
end
2018-09-18 18:04:56 -06:00
2019-04-08 03:31:18 -06:00
test " follower count is updated when a follower is blocked " do
user = insert ( :user )
follower = insert ( :user )
follower2 = insert ( :user )
follower3 = insert ( :user )
2020-12-01 13:17:52 -07:00
{ :ok , follower , user } = User . follow ( follower , user )
{ :ok , _follower2 , _user } = User . follow ( follower2 , user )
{ :ok , _follower3 , _user } = User . follow ( follower3 , user )
2019-04-08 03:31:18 -06:00
2019-11-19 13:22:10 -07:00
{ :ok , _user_relationship } = User . block ( user , follower )
2019-11-10 06:30:21 -07:00
user = refresh_record ( user )
2019-04-08 03:31:18 -06:00
2019-11-27 05:43:47 -07:00
assert user . follower_count == 2
2019-04-08 03:31:18 -06:00
end
2019-05-16 07:23:41 -06:00
2019-04-19 09:17:54 -06:00
describe " list_inactive_users_query/1 " do
defp days_ago ( days ) do
NaiveDateTime . add (
NaiveDateTime . truncate ( NaiveDateTime . utc_now ( ) , :second ) ,
- days * 60 * 60 * 24 ,
:second
)
end
test " Users are inactive by default " do
total = 10
users =
Enum . map ( 1 . . total , fn _ ->
2020-10-12 16:42:27 -06:00
insert ( :user , last_digest_emailed_at : days_ago ( 20 ) , is_active : true )
2019-04-19 09:17:54 -06:00
end )
inactive_users_ids =
Pleroma.User . list_inactive_users_query ( )
|> Pleroma.Repo . all ( )
|> Enum . map ( & &1 . id )
Enum . each ( users , fn user ->
assert user . id in inactive_users_ids
end )
end
test " Only includes users who has no recent activity " do
total = 10
users =
Enum . map ( 1 . . total , fn _ ->
2020-10-12 16:42:27 -06:00
insert ( :user , last_digest_emailed_at : days_ago ( 20 ) , is_active : true )
2019-04-19 09:17:54 -06:00
end )
{ inactive , active } = Enum . split ( users , trunc ( total / 2 ) )
Enum . map ( active , fn user ->
to = Enum . random ( users -- [ user ] )
{ :ok , _ } =
2019-08-31 01:20:34 -06:00
CommonAPI . post ( user , %{
2020-05-12 13:59:26 -06:00
status : " hey @ #{ to . nickname } "
2019-04-19 09:17:54 -06:00
} )
end )
inactive_users_ids =
Pleroma.User . list_inactive_users_query ( )
|> Pleroma.Repo . all ( )
|> Enum . map ( & &1 . id )
Enum . each ( active , fn user ->
refute user . id in inactive_users_ids
end )
Enum . each ( inactive , fn user ->
assert user . id in inactive_users_ids
end )
end
test " Only includes users with no read notifications " do
total = 10
users =
Enum . map ( 1 . . total , fn _ ->
2020-10-12 16:42:27 -06:00
insert ( :user , last_digest_emailed_at : days_ago ( 20 ) , is_active : true )
2019-04-19 09:17:54 -06:00
end )
[ sender | recipients ] = users
{ inactive , active } = Enum . split ( recipients , trunc ( total / 2 ) )
Enum . each ( recipients , fn to ->
{ :ok , _ } =
2019-08-31 01:20:34 -06:00
CommonAPI . post ( sender , %{
2020-05-12 13:59:26 -06:00
status : " hey @ #{ to . nickname } "
2019-04-19 09:17:54 -06:00
} )
{ :ok , _ } =
2019-08-31 01:20:34 -06:00
CommonAPI . post ( sender , %{
2020-05-12 13:59:26 -06:00
status : " hey again @ #{ to . nickname } "
2019-04-19 09:17:54 -06:00
} )
end )
Enum . each ( active , fn user ->
[ n1 , _n2 ] = Pleroma.Notification . for_user ( user )
{ :ok , _ } = Pleroma.Notification . read_one ( user , n1 . id )
end )
inactive_users_ids =
Pleroma.User . list_inactive_users_query ( )
|> Pleroma.Repo . all ( )
|> Enum . map ( & &1 . id )
Enum . each ( active , fn user ->
refute user . id in inactive_users_ids
end )
Enum . each ( inactive , fn user ->
assert user . id in inactive_users_ids
end )
end
end
2019-05-29 09:18:22 -06:00
2019-06-03 10:16:11 -06:00
describe " get_ap_ids_by_nicknames " do
test " it returns a list of AP ids for a given set of nicknames " do
user = insert ( :user )
user_two = insert ( :user )
ap_ids = User . get_ap_ids_by_nicknames ( [ user . nickname , user_two . nickname , " nonexistent " ] )
assert length ( ap_ids ) == 2
assert user . ap_id in ap_ids
assert user_two . ap_id in ap_ids
end
end
2019-07-09 11:36:35 -06:00
describe " sync followers count " do
setup do
user1 = insert ( :user , local : false , ap_id : " http://localhost:4001/users/masto_closed " )
user2 = insert ( :user , local : false , ap_id : " http://localhost:4001/users/fuser2 " )
insert ( :user , local : true )
2020-10-12 16:42:27 -06:00
insert ( :user , local : false , is_active : false )
2019-07-09 11:36:35 -06:00
{ :ok , user1 : user1 , user2 : user2 }
end
test " external_users/1 external active users with limit " , %{ user1 : user1 , user2 : user2 } do
[ fdb_user1 ] = User . external_users ( limit : 1 )
assert fdb_user1 . ap_id
assert fdb_user1 . ap_id == user1 . ap_id
assert fdb_user1 . id == user1 . id
[ fdb_user2 ] = User . external_users ( max_id : fdb_user1 . id , limit : 1 )
assert fdb_user2 . ap_id
assert fdb_user2 . ap_id == user2 . ap_id
assert fdb_user2 . id == user2 . id
assert User . external_users ( max_id : fdb_user2 . id , limit : 1 ) == [ ]
end
end
2019-07-17 11:12:42 -06:00
describe " is_internal_user?/1 " do
test " non-internal user returns false " do
user = insert ( :user )
refute User . is_internal_user? ( user )
end
test " user with no nickname returns true " do
user = insert ( :user , %{ nickname : nil } )
assert User . is_internal_user? ( user )
end
test " user with internal-prefixed nickname returns true " do
user = insert ( :user , %{ nickname : " internal.test " } )
assert User . is_internal_user? ( user )
end
end
2019-07-28 14:29:26 -06:00
describe " update_and_set_cache/1 " do
test " returns error when user is stale instead Ecto.StaleEntryError " do
user = insert ( :user )
changeset = Ecto.Changeset . change ( user , bio : " test " )
Repo . delete ( user )
assert { :error , % Ecto.Changeset { errors : [ id : { " is stale " , [ stale : true ] } ] , valid? : false } } =
User . update_and_set_cache ( changeset )
end
test " performs update cache if user updated " do
user = insert ( :user )
assert { :ok , nil } = Cachex . get ( :user_cache , " ap_id: #{ user . ap_id } " )
changeset = Ecto.Changeset . change ( user , bio : " test-bio " )
assert { :ok , % User { bio : " test-bio " } = user } = User . update_and_set_cache ( changeset )
assert { :ok , user } = Cachex . get ( :user_cache , " ap_id: #{ user . ap_id } " )
assert % User { bio : " test-bio " } = User . get_cached_by_ap_id ( user . ap_id )
end
2022-03-06 09:36:30 -07:00
test " removes report notifs when user isn't superuser any more " do
report_activity = insert ( :report_activity )
user = insert ( :user , is_moderator : true , is_admin : true )
{ :ok , _ } = Notification . create_notifications ( report_activity )
assert [ % Pleroma.Notification { type : " pleroma:report " } ] = Notification . for_user ( user )
{ :ok , user } = user |> User . admin_api_update ( %{ is_moderator : false } )
# is still superuser because still admin
assert [ % Pleroma.Notification { type : " pleroma:report " } ] = Notification . for_user ( user )
{ :ok , user } = user |> User . admin_api_update ( %{ is_moderator : true , is_admin : false } )
# is still superuser because still moderator
assert [ % Pleroma.Notification { type : " pleroma:report " } ] = Notification . for_user ( user )
{ :ok , user } = user |> User . admin_api_update ( %{ is_moderator : false } )
# is not a superuser any more
assert [ ] = Notification . for_user ( user )
end
2019-07-28 14:29:26 -06:00
end
2019-07-31 10:37:55 -06:00
describe " following/followers synchronization " do
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :external_user_synchronization ] )
2019-07-31 10:37:55 -06:00
test " updates the counters normally on following/getting a follow when disabled " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :external_user_synchronization ] , false )
2019-07-31 10:37:55 -06:00
user = insert ( :user )
other_user =
insert ( :user ,
local : false ,
follower_address : " http://localhost:4001/users/masto_closed/followers " ,
following_address : " http://localhost:4001/users/masto_closed/following " ,
2019-10-16 12:59:21 -06:00
ap_enabled : true
2019-07-31 10:37:55 -06:00
)
2019-11-27 05:43:47 -07:00
assert other_user . following_count == 0
assert other_user . follower_count == 0
2019-07-31 10:37:55 -06:00
2020-12-01 13:17:52 -07:00
{ :ok , user , other_user } = Pleroma.User . follow ( user , other_user )
2019-07-31 10:37:55 -06:00
2019-11-27 05:43:47 -07:00
assert user . following_count == 1
assert other_user . follower_count == 1
2019-07-31 10:37:55 -06:00
end
2022-10-19 04:01:14 -06:00
test " synchronizes the counters with the remote instance for the followed when enabled " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :external_user_synchronization ] , false )
2019-07-31 10:37:55 -06:00
user = insert ( :user )
other_user =
insert ( :user ,
local : false ,
follower_address : " http://localhost:4001/users/masto_closed/followers " ,
following_address : " http://localhost:4001/users/masto_closed/following " ,
2019-10-16 12:59:21 -06:00
ap_enabled : true
2019-07-31 10:37:55 -06:00
)
2019-11-27 05:43:47 -07:00
assert other_user . following_count == 0
assert other_user . follower_count == 0
2019-07-31 10:37:55 -06:00
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :external_user_synchronization ] , true )
2020-12-01 13:17:52 -07:00
{ :ok , _user , other_user } = User . follow ( user , other_user )
2019-07-31 10:37:55 -06:00
2019-11-27 05:43:47 -07:00
assert other_user . follower_count == 437
2019-07-31 10:37:55 -06:00
end
2022-10-19 04:01:14 -06:00
test " synchronizes the counters with the remote instance for the follower when enabled " do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :external_user_synchronization ] , false )
2019-07-31 10:37:55 -06:00
user = insert ( :user )
other_user =
insert ( :user ,
local : false ,
follower_address : " http://localhost:4001/users/masto_closed/followers " ,
following_address : " http://localhost:4001/users/masto_closed/following " ,
2019-10-16 12:59:21 -06:00
ap_enabled : true
2019-07-31 10:37:55 -06:00
)
2019-11-27 05:43:47 -07:00
assert other_user . following_count == 0
assert other_user . follower_count == 0
2019-07-31 10:37:55 -06:00
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :external_user_synchronization ] , true )
2020-12-01 13:17:52 -07:00
{ :ok , other_user , _user } = User . follow ( other_user , user )
2019-07-31 10:37:55 -06:00
2019-11-27 05:43:47 -07:00
assert other_user . following_count == 152
2019-07-31 10:37:55 -06:00
end
end
2019-09-13 00:09:35 -06:00
describe " change_email/2 " do
setup do
[ user : insert ( :user ) ]
end
2021-09-05 18:56:16 -06:00
test " blank email returns error if we require an email on registration " , %{ user : user } do
orig_account_activation_required =
Pleroma.Config . get ( [ :instance , :account_activation_required ] )
Pleroma.Config . put ( [ :instance , :account_activation_required ] , true )
on_exit ( fn ->
Pleroma.Config . put (
[ :instance , :account_activation_required ] ,
orig_account_activation_required
)
end )
2019-09-13 00:09:35 -06:00
assert { :error , %{ errors : [ email : { " can't be blank " , _ } ] } } = User . change_email ( user , " " )
assert { :error , %{ errors : [ email : { " can't be blank " , _ } ] } } = User . change_email ( user , nil )
end
2021-09-05 18:56:16 -06:00
test " blank email should be fine if we do not require an email on registration " , %{ user : user } do
orig_account_activation_required =
Pleroma.Config . get ( [ :instance , :account_activation_required ] )
Pleroma.Config . put ( [ :instance , :account_activation_required ] , false )
on_exit ( fn ->
Pleroma.Config . put (
[ :instance , :account_activation_required ] ,
orig_account_activation_required
)
end )
assert { :ok , % User { email : nil } } = User . change_email ( user , " " )
assert { :ok , % User { email : nil } } = User . change_email ( user , nil )
end
2019-09-13 00:09:35 -06:00
test " non unique email returns error " , %{ user : user } do
%{ email : email } = insert ( :user )
assert { :error , %{ errors : [ email : { " has already been taken " , _ } ] } } =
User . change_email ( user , email )
end
test " invalid email returns error " , %{ user : user } do
assert { :error , %{ errors : [ email : { " has invalid format " , _ } ] } } =
User . change_email ( user , " cofe " )
end
test " changes email " , %{ user : user } do
assert { :ok , % User { email : " cofe@cofe.party " } } = User . change_email ( user , " cofe@cofe.party " )
end
2021-09-05 18:56:16 -06:00
test " adds email " , %{ user : user } do
orig_account_activation_required =
Pleroma.Config . get ( [ :instance , :account_activation_required ] )
Pleroma.Config . put ( [ :instance , :account_activation_required ] , false )
on_exit ( fn ->
Pleroma.Config . put (
[ :instance , :account_activation_required ] ,
orig_account_activation_required
)
end )
assert { :ok , _ } = User . change_email ( user , " " )
Pleroma.Config . put ( [ :instance , :account_activation_required ] , true )
assert { :ok , % User { email : " cofe2@cofe.party " } } = User . change_email ( user , " cofe2@cofe.party " )
end
2019-09-13 00:09:35 -06:00
end
2019-09-22 07:08:07 -06:00
2019-10-03 16:05:50 -06:00
describe " get_cached_by_nickname_or_id " do
setup do
local_user = insert ( :user )
remote_user = insert ( :user , nickname : " nickname@example.com " , local : false )
[ local_user : local_user , remote_user : remote_user ]
end
2020-03-20 09:33:00 -06:00
setup do : clear_config ( [ :instance , :limit_to_local_content ] )
2020-02-13 11:55:47 -07:00
2019-10-03 16:05:50 -06:00
test " allows getting remote users by id no matter what :limit_to_local_content is set to " , %{
remote_user : remote_user
} do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , false )
2019-10-03 16:05:50 -06:00
assert % User { } = User . get_cached_by_nickname_or_id ( remote_user . id )
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , true )
2019-10-03 16:05:50 -06:00
assert % User { } = User . get_cached_by_nickname_or_id ( remote_user . id )
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , :unauthenticated )
2019-10-03 16:05:50 -06:00
assert % User { } = User . get_cached_by_nickname_or_id ( remote_user . id )
end
test " disallows getting remote users by nickname without authentication when :limit_to_local_content is set to :unauthenticated " ,
%{ remote_user : remote_user } do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , :unauthenticated )
2019-10-03 16:05:50 -06:00
assert nil == User . get_cached_by_nickname_or_id ( remote_user . nickname )
end
test " allows getting remote users by nickname with authentication when :limit_to_local_content is set to :unauthenticated " ,
%{ remote_user : remote_user , local_user : local_user } do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , :unauthenticated )
2019-10-03 16:05:50 -06:00
assert % User { } = User . get_cached_by_nickname_or_id ( remote_user . nickname , for : local_user )
end
test " disallows getting remote users by nickname when :limit_to_local_content is set to true " ,
%{ remote_user : remote_user } do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , true )
2019-10-03 16:05:50 -06:00
assert nil == User . get_cached_by_nickname_or_id ( remote_user . nickname )
end
test " allows getting local users by nickname no matter what :limit_to_local_content is set to " ,
%{ local_user : local_user } do
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , false )
2019-10-03 16:05:50 -06:00
assert % User { } = User . get_cached_by_nickname_or_id ( local_user . nickname )
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , true )
2019-10-03 16:05:50 -06:00
assert % User { } = User . get_cached_by_nickname_or_id ( local_user . nickname )
2021-01-26 10:58:43 -07:00
clear_config ( [ :instance , :limit_to_local_content ] , :unauthenticated )
2019-10-03 16:05:50 -06:00
assert % User { } = User . get_cached_by_nickname_or_id ( local_user . nickname )
end
end
2019-10-16 12:59:21 -06:00
describe " update_email_notifications/2 " do
setup do
user = insert ( :user , email_notifications : %{ " digest " = > true } )
{ :ok , user : user }
end
test " Notifications are updated " , %{ user : user } do
true = user . email_notifications [ " digest " ]
assert { :ok , result } = User . update_email_notifications ( user , %{ " digest " = > false } )
assert result . email_notifications [ " digest " ] == false
end
end
2020-04-12 13:54:43 -06:00
2021-01-28 09:49:43 -07:00
describe " local_nickname/1 " do
test " returns nickname without host " do
assert User . local_nickname ( " @mentioned " ) == " mentioned "
assert User . local_nickname ( " a_local_nickname " ) == " a_local_nickname "
assert User . local_nickname ( " nickname@host.com " ) == " nickname "
end
end
describe " full_nickname/1 " do
test " returns fully qualified nickname for local and remote users " do
local_user =
insert ( :user , nickname : " local_user " , ap_id : " https://somehost.com/users/local_user " )
remote_user = insert ( :user , nickname : " remote@host.com " , local : false )
assert User . full_nickname ( local_user ) == " local_user@somehost.com "
assert User . full_nickname ( remote_user ) == " remote@host.com "
end
test " strips leading @ from mentions " do
assert User . full_nickname ( " @mentioned " ) == " mentioned "
assert User . full_nickname ( " @nickname@host.com " ) == " nickname@host.com "
end
test " does not modify nicknames " do
assert User . full_nickname ( " nickname " ) == " nickname "
assert User . full_nickname ( " nickname@host.com " ) == " nickname@host.com "
end
end
2020-04-12 13:54:43 -06:00
test " avatar fallback " do
user = insert ( :user )
assert User . avatar_url ( user ) =~ " /images/avi.png "
2020-05-30 07:47:09 -06:00
clear_config ( [ :assets , :default_user_avatar ] , " avatar.png " )
2020-04-12 13:54:43 -06:00
user = User . get_cached_by_nickname_or_id ( user . nickname )
assert User . avatar_url ( user ) =~ " avatar.png "
assert User . avatar_url ( user , no_default : true ) == nil
end
2020-11-28 11:51:06 -07:00
2023-03-12 11:14:05 -06:00
test " avatar object with nil in href " do
user = insert ( :user , avatar : %{ " url " = > [ %{ " href " = > nil } ] } )
assert User . avatar_url ( user ) != nil
end
test " banner object with nil in href " do
user = insert ( :user , banner : %{ " url " = > [ %{ " href " = > nil } ] } )
assert User . banner_url ( user ) != nil
end
2020-11-28 11:51:06 -07:00
test " get_host/1 " do
user = insert ( :user , ap_id : " https://lain.com/users/lain " , nickname : " lain " )
assert User . get_host ( user ) == " lain.com "
end
2021-01-27 07:18:46 -07:00
test " update_last_active_at/1 " do
user = insert ( :user )
assert is_nil ( user . last_active_at )
test_started_at = NaiveDateTime . utc_now ( ) |> NaiveDateTime . truncate ( :second )
assert { :ok , user } = User . update_last_active_at ( user )
assert user . last_active_at >= test_started_at
assert user . last_active_at <= NaiveDateTime . truncate ( NaiveDateTime . utc_now ( ) , :second )
last_active_at =
NaiveDateTime . utc_now ( )
|> NaiveDateTime . add ( - :timer . hours ( 24 ) , :millisecond )
|> NaiveDateTime . truncate ( :second )
assert { :ok , user } =
user
|> cast ( %{ last_active_at : last_active_at } , [ :last_active_at ] )
|> User . update_and_set_cache ( )
assert user . last_active_at == last_active_at
assert { :ok , user } = User . update_last_active_at ( user )
assert user . last_active_at >= test_started_at
assert user . last_active_at <= NaiveDateTime . truncate ( NaiveDateTime . utc_now ( ) , :second )
end
test " active_user_count/1 " do
insert ( :user )
2021-01-28 11:23:10 -07:00
insert ( :user , %{ local : false } )
2021-01-27 07:18:46 -07:00
insert ( :user , %{ last_active_at : NaiveDateTime . utc_now ( ) } )
2021-11-15 08:58:25 -07:00
insert ( :user , %{ last_active_at : Timex . shift ( NaiveDateTime . utc_now ( ) , days : - 15 ) } )
insert ( :user , %{ last_active_at : Timex . shift ( NaiveDateTime . utc_now ( ) , weeks : - 6 ) } )
insert ( :user , %{ last_active_at : Timex . shift ( NaiveDateTime . utc_now ( ) , months : - 7 ) } )
insert ( :user , %{ last_active_at : Timex . shift ( NaiveDateTime . utc_now ( ) , years : - 2 ) } )
2021-01-27 07:18:46 -07:00
assert User . active_user_count ( ) == 2
2021-11-15 08:58:25 -07:00
assert User . active_user_count ( 180 ) == 3
assert User . active_user_count ( 365 ) == 4
assert User . active_user_count ( 1000 ) == 5
2021-01-27 07:18:46 -07:00
end
2021-02-03 06:09:28 -07:00
describe " pins " do
setup do
user = insert ( :user )
[ user : user , object_id : object_id_from_created_activity ( user ) ]
end
test " unique pins " , %{ user : user , object_id : object_id } do
assert { :ok , %{ pinned_objects : %{ ^ object_id = > pinned_at1 } = pins } = updated_user } =
User . add_pinned_object_id ( user , object_id )
assert Enum . count ( pins ) == 1
assert { :ok , %{ pinned_objects : %{ ^ object_id = > pinned_at2 } = pins } } =
User . add_pinned_object_id ( updated_user , object_id )
assert pinned_at1 == pinned_at2
assert Enum . count ( pins ) == 1
end
test " respects max_pinned_statuses limit " , %{ user : user , object_id : object_id } do
clear_config ( [ :instance , :max_pinned_statuses ] , 1 )
{ :ok , updated } = User . add_pinned_object_id ( user , object_id )
object_id2 = object_id_from_created_activity ( user )
{ :error , %{ errors : errors } } = User . add_pinned_object_id ( updated , object_id2 )
assert Keyword . has_key? ( errors , :pinned_objects )
end
test " remove_pinned_object_id/2 " , %{ user : user , object_id : object_id } do
assert { :ok , updated } = User . add_pinned_object_id ( user , object_id )
{ :ok , after_remove } = User . remove_pinned_object_id ( updated , object_id )
assert after_remove . pinned_objects == %{ }
end
end
defp object_id_from_created_activity ( user ) do
%{ id : id } = insert ( :note_activity , user : user )
%{ object : %{ data : %{ " id " = > object_id } } } = Activity . get_by_id_with_object ( id )
object_id
end
2022-07-04 10:29:39 -06:00
describe " add_alias/2 " do
test " should add alias for another user " do
user = insert ( :user )
user2 = insert ( :user )
assert { :ok , user_updated } = user |> User . add_alias ( user2 )
assert user_updated . also_known_as |> length ( ) == 1
assert user2 . ap_id in user_updated . also_known_as
end
test " should add multiple aliases " do
user = insert ( :user )
user2 = insert ( :user )
user3 = insert ( :user )
assert { :ok , user } = user |> User . add_alias ( user2 )
assert { :ok , user_updated } = user |> User . add_alias ( user3 )
assert user_updated . also_known_as |> length ( ) == 2
assert user2 . ap_id in user_updated . also_known_as
assert user3 . ap_id in user_updated . also_known_as
end
test " should not add duplicate aliases " do
user = insert ( :user )
user2 = insert ( :user )
assert { :ok , user } = user |> User . add_alias ( user2 )
assert { :ok , user_updated } = user |> User . add_alias ( user2 )
assert user_updated . also_known_as |> length ( ) == 1
assert user2 . ap_id in user_updated . also_known_as
end
end
describe " alias_users/1 " do
test " should get aliases for a user " do
user = insert ( :user )
user2 = insert ( :user , also_known_as : [ user . ap_id ] )
aliases = user2 |> User . alias_users ( )
assert aliases |> length ( ) == 1
alias_user = aliases |> Enum . at ( 0 )
assert alias_user . ap_id == user . ap_id
end
end
describe " delete_alias/2 " do
test " should delete existing alias " do
user = insert ( :user )
user2 = insert ( :user , also_known_as : [ user . ap_id ] )
assert { :ok , user_updated } = user2 |> User . delete_alias ( user )
assert user_updated . also_known_as == [ ]
end
test " should report error on non-existing alias " do
user = insert ( :user )
user2 = insert ( :user )
user3 = insert ( :user , also_known_as : [ user . ap_id ] )
assert { :error , :no_such_alias } = user3 |> User . delete_alias ( user2 )
user3_updated = User . get_cached_by_ap_id ( user3 . ap_id )
assert user3_updated . also_known_as |> length ( ) == 1
assert user . ap_id in user3_updated . also_known_as
end
end
2022-12-05 05:58:48 -07:00
describe " follow_hashtag/2 " do
test " should follow a hashtag " do
user = insert ( :user )
hashtag = insert ( :hashtag )
assert { :ok , _ } = user |> User . follow_hashtag ( hashtag )
user = User . get_cached_by_ap_id ( user . ap_id )
assert user . followed_hashtags |> Enum . count ( ) == 1
assert hashtag . name in Enum . map ( user . followed_hashtags , fn %{ name : name } -> name end )
end
test " should not follow a hashtag twice " do
user = insert ( :user )
hashtag = insert ( :hashtag )
assert { :ok , _ } = user |> User . follow_hashtag ( hashtag )
assert { :ok , _ } = user |> User . follow_hashtag ( hashtag )
user = User . get_cached_by_ap_id ( user . ap_id )
assert user . followed_hashtags |> Enum . count ( ) == 1
assert hashtag . name in Enum . map ( user . followed_hashtags , fn %{ name : name } -> name end )
end
test " can follow multiple hashtags " do
user = insert ( :user )
hashtag = insert ( :hashtag )
other_hashtag = insert ( :hashtag )
assert { :ok , _ } = user |> User . follow_hashtag ( hashtag )
assert { :ok , _ } = user |> User . follow_hashtag ( other_hashtag )
user = User . get_cached_by_ap_id ( user . ap_id )
assert user . followed_hashtags |> Enum . count ( ) == 2
assert hashtag . name in Enum . map ( user . followed_hashtags , fn %{ name : name } -> name end )
assert other_hashtag . name in Enum . map ( user . followed_hashtags , fn %{ name : name } -> name end )
end
end
describe " unfollow_hashtag/2 " do
test " should unfollow a hashtag " do
user = insert ( :user )
hashtag = insert ( :hashtag )
assert { :ok , _ } = user |> User . follow_hashtag ( hashtag )
assert { :ok , _ } = user |> User . unfollow_hashtag ( hashtag )
user = User . get_cached_by_ap_id ( user . ap_id )
assert user . followed_hashtags |> Enum . count ( ) == 0
end
test " should not error when trying to unfollow a hashtag twice " do
user = insert ( :user )
hashtag = insert ( :hashtag )
assert { :ok , _ } = user |> User . follow_hashtag ( hashtag )
assert { :ok , _ } = user |> User . unfollow_hashtag ( hashtag )
assert { :ok , _ } = user |> User . unfollow_hashtag ( hashtag )
user = User . get_cached_by_ap_id ( user . ap_id )
assert user . followed_hashtags |> Enum . count ( ) == 0
end
end
2023-05-22 16:53:44 -06:00
describe " accepts_direct_messages?/2 " do
2023-05-23 03:29:08 -06:00
test " should return true if the recipient follows the sender and has set accept to :people_i_follow " do
2023-05-22 16:53:44 -06:00
recipient =
insert ( :user , %{
2023-05-23 03:29:08 -06:00
accepts_direct_messages_from : :people_i_follow
2023-05-22 16:53:44 -06:00
} )
sender = insert ( :user )
refute User . accepts_direct_messages? ( recipient , sender )
CommonAPI . follow ( recipient , sender )
assert User . accepts_direct_messages? ( recipient , sender )
end
2023-05-23 03:29:08 -06:00
test " should return true if the recipient has set accept to :everyone " do
recipient = insert ( :user , %{ accepts_direct_messages_from : :everybody } )
2023-05-22 16:53:44 -06:00
sender = insert ( :user )
assert User . accepts_direct_messages? ( recipient , sender )
end
2023-05-23 03:29:08 -06:00
test " should return false if the receipient set accept to :nobody " do
recipient = insert ( :user , %{ accepts_direct_messages_from : :nobody } )
2023-05-22 16:53:44 -06:00
sender = insert ( :user )
refute User . accepts_direct_messages? ( recipient , sender )
end
end
2017-12-07 09:47:23 -07:00
end