2019-06-22 20:32:21 +00:00
import pytest
2022-11-07 21:11:30 +00:00
import time
2022-11-27 00:43:22 +00:00
from datetime import datetime , timedelta
from mastodon import MastodonIllegalArgumentError
2025-02-14 20:55:20 +00:00
import hashlib
2019-06-22 20:32:21 +00:00
@pytest.mark.vcr ( )
def test_admin_accounts ( api2 ) :
accounts = api2 . admin_accounts ( )
assert accounts
assert len ( accounts ) > 0
account_self = api2 . account_verify_credentials ( )
account_admin = api2 . admin_account ( account_self )
assert ( account_admin )
assert ( account_admin . id == account_self . id )
2022-11-27 22:55:41 +00:00
@pytest.mark.vcr ( )
def test_admin_accounts_v1 ( api2 ) :
accounts = api2 . admin_accounts_v1 ( )
assert accounts
assert len ( accounts ) > 0
account_self = api2 . account_verify_credentials ( )
account_admin = api2 . admin_account ( account_self )
assert ( account_admin )
assert ( account_admin . id == account_self . id )
@pytest.mark.vcr ( )
def test_admin_accounts_v2 ( api2 ) :
accounts = api2 . admin_accounts_v2 ( permissions = " staff " , origin = " local " )
assert accounts
assert len ( accounts ) > 0
account_self = api2 . account_verify_credentials ( )
account_admin = api2 . admin_account ( account_self )
assert ( account_admin )
assert ( account_admin . id == account_self . id )
accounts = api2 . admin_accounts_v2 ( permissions = " staff " , origin = " remote " )
assert len ( accounts ) == 0
with pytest . raises ( MastodonIllegalArgumentError ) :
accounts = api2 . admin_accounts_v2 ( permissions = " stave " )
with pytest . raises ( MastodonIllegalArgumentError ) :
accounts = api2 . admin_accounts_v2 ( origin = " global " )
with pytest . raises ( MastodonIllegalArgumentError ) :
accounts = api2 . admin_accounts_v2 ( status = " sick " )
2022-11-13 16:39:56 +00:00
@pytest.mark.vcr ( match_on = [ ' path ' ] )
2025-02-13 21:35:34 +00:00
def test_admin_moderation ( api3 , api2 ) :
account_initial = api3 . account_verify_credentials ( )
2019-06-22 20:32:21 +00:00
account = account_initial
2022-11-07 21:11:30 +00:00
try :
2019-06-22 20:32:21 +00:00
api2 . admin_account_moderate ( account , " disable " )
account = api2 . admin_account ( account_initial )
assert ( account . disabled )
account = api2 . admin_account_enable ( account )
assert ( not account . disabled )
api2 . admin_account_moderate ( account , " silence " )
account = api2 . admin_account ( account_initial )
assert ( account . silenced )
account = api2 . admin_account_unsilence ( account )
assert ( not account . silenced )
2022-11-13 16:39:56 +00:00
api2 . admin_account_moderate ( account , " sensitive " )
account = api2 . admin_account ( account_initial )
2025-02-13 21:35:34 +00:00
image = api3 . media_post ( ' tests/image.jpg ' )
2022-11-13 16:39:56 +00:00
assert image
2025-02-13 21:35:34 +00:00
status = api3 . status_post ( " oh no! " , media_ids = image , sensitive = False )
2022-11-13 16:39:56 +00:00
assert status
status = api2 . status ( status )
assert status . sensitive
2025-02-13 21:35:34 +00:00
api3 . status_delete ( status )
2022-11-13 16:39:56 +00:00
account = api2 . admin_account_unsensitive ( account )
2025-02-13 21:35:34 +00:00
image = api3 . media_post ( ' tests/image.jpg ' )
2022-11-13 16:39:56 +00:00
assert image
2025-02-13 21:35:34 +00:00
status = api3 . status_post ( " oh no! " , media_ids = image , sensitive = False )
2022-11-13 16:39:56 +00:00
assert status
status = api2 . status ( status )
assert not status . sensitive
2025-02-13 21:35:34 +00:00
api3 . status_delete ( status )
2022-11-13 16:39:56 +00:00
2019-06-22 20:32:21 +00:00
api2 . admin_account_moderate ( account , " suspend " )
account = api2 . admin_account ( account_initial )
assert ( account . suspended )
account = api2 . admin_account_unsuspend ( account )
assert ( not account . suspended )
finally :
2022-11-07 21:11:30 +00:00
try :
api2 . admin_account_unsuspend ( account )
except :
pass
try :
api2 . admin_account_enable ( account )
except :
pass
try :
api2 . admin_account_unsilence ( account )
except :
pass
2022-11-13 16:39:56 +00:00
try :
api . status_delete ( status )
except :
pass
2019-06-22 20:48:30 +00:00
@pytest.mark.vcr ( )
2025-02-13 21:35:34 +00:00
def test_admin_reports ( api3 , api2 , status3 ) :
account = api3 . account_verify_credentials ( )
2019-06-22 20:48:30 +00:00
account2 = api2 . account_verify_credentials ( )
2025-02-13 21:35:34 +00:00
report = api2 . report ( account , status3 , " api crimes " )
2019-06-22 20:48:30 +00:00
assert ( report )
assert ( not report . action_taken )
report_list = api2 . admin_reports ( )
assert ( report . id in [ x . id for x in report_list ] )
report = api2 . admin_report_resolve ( report )
report_list = api2 . admin_reports ( )
assert ( report . action_taken )
assert ( report . action_taken_by_account . id == account2 . id )
assert ( not report . id in [ x . id for x in report_list ] )
report = api2 . admin_report_reopen ( report )
report_list = api2 . admin_reports ( )
assert ( not report . action_taken )
assert ( report . id in [ x . id for x in report_list ] )
report = api2 . admin_report_assign ( report )
assert ( report . assigned_account . id == account2 . id )
report = api2 . admin_report_unassign ( report )
assert ( report . assigned_account is None )
report2 = api2 . admin_report ( report )
assert ( report2 )
assert ( report2 . id == report . id )
2022-11-24 22:01:07 +00:00
@pytest.mark.vcr ( )
def test_admin_trends ( api2 ) :
assert isinstance ( api2 . admin_trending_tags ( ) , list )
assert isinstance ( api2 . admin_trending_statuses ( ) , list )
assert isinstance ( api2 . admin_trending_links ( ) , list )
assert isinstance ( api2 . admin_trending_tags ( limit = 5 ) , list )
2025-02-15 16:05:20 +00:00
# The management functions are unfortunately not really testable easily.
2025-02-15 16:20:27 +00:00
2019-06-22 20:48:30 +00:00
@pytest.mark.skip ( reason = " reject / accept of account requests isn ' t really testable without modifying instance settings. anyone want to fumble those into the DB setup and write this test, please do. " )
def test_admin_accountrequests ( api2 ) :
pass
2022-11-25 23:00:44 +00:00
@pytest.mark.vcr ( )
def test_admin_domain_blocks ( api2 ) :
2025-02-13 21:35:34 +00:00
block = api2 . admin_create_domain_block ( domain = " chitter.xyz " , public_comment = " sicko behaviour " , severity = " suspend " )
2022-11-25 23:00:44 +00:00
assert isinstance ( api2 . admin_domain_blocks ( ) , list )
block2 = api2 . admin_domain_blocks ( block )
assert block . severity == " suspend "
assert block . public_comment == " sicko behaviour "
assert block . severity == block2 . severity
block3 = api2 . admin_update_domain_block ( block , severity = " silence " , private_comment = " jk ilu <3 " )
assert block3 . severity == " silence "
assert block3 . public_comment == " sicko behaviour "
assert block3 . private_comment == " jk ilu <3 "
api2 . admin_delete_domain_block ( block2 )
2022-12-03 21:04:26 +00:00
assert not any ( x . id == block3 . id for x in api2 . admin_domain_blocks ( ) )
2022-11-27 00:43:22 +00:00
2025-02-13 21:35:34 +00:00
# Xfail test for domain block that starts with https://
@pytest.mark.xfail
@pytest.mark.vcr ( )
def test_admin_domain_blocks_protocol ( api2 ) :
api2 . admin_create_domain_block ( domain = " https://chitter.xyz " , public_comment = " sicko behaviour " , severity = " silence " )
2022-11-27 01:02:22 +00:00
@pytest.mark.vcr ( match_on = [ ' path ' ] )
2022-11-27 00:43:22 +00:00
def test_admin_stats ( api2 ) :
assert api2 . admin_measures (
2022-11-27 00:53:42 +00:00
datetime ( 2020 , 10 , 10 ) - timedelta ( hours = 24 * 5 ) ,
datetime ( 2020 , 10 , 10 ) ,
2022-11-27 00:43:22 +00:00
active_users = True ,
new_users = True ,
opened_reports = True ,
resolved_reports = True ,
instance_accounts = " chitter.xyz " ,
instance_media_attachments = " chitter.xyz " ,
instance_reports = " http://chitter.xyz/ " ,
instance_statuses = " chitter.xyz " ,
instance_follows = " http://chitter.xyz " ,
instance_followers = " chitter.xyz " ,
#tag_accounts=0,
#tag_uses=0,
#tag_servers=0,
)
assert api2 . admin_dimensions (
2022-11-27 00:53:42 +00:00
datetime ( 2020 , 10 , 10 ) - timedelta ( hours = 24 * 5 ) ,
datetime ( 2020 , 10 , 10 ) ,
2022-11-27 00:43:22 +00:00
limit = 3 ,
languages = True ,
sources = True ,
servers = True ,
space_usage = True ,
#tag_servers=0,
#tag_languages=0,
instance_accounts = " chitter.xyz " ,
instance_languages = " https://chitter.xyz "
)
api2 . admin_retention (
2022-11-27 00:53:42 +00:00
datetime ( 2020 , 10 , 10 ) - timedelta ( days = 10 ) ,
datetime ( 2020 , 10 , 10 )
2022-11-27 00:43:22 +00:00
)
with pytest . raises ( MastodonIllegalArgumentError ) :
api2 . admin_retention (
2022-11-27 00:53:42 +00:00
datetime ( 2020 , 10 , 10 ) - timedelta ( days = 10 ) ,
datetime ( 2020 , 10 , 10 ) ,
2022-11-27 00:43:22 +00:00
frequency = " dayz "
2025-02-14 20:55:20 +00:00
)
@pytest.mark.vcr ( )
def test_admin_canonical_email_block ( api2 ) :
blocked_email = " test@example.com "
try :
response = api2 . admin_create_canonical_email_block ( email = blocked_email )
assert response is not None
assert hasattr ( response , ' id ' )
block_id = response . id
test_response = api2 . admin_test_canonical_email_block ( blocked_email )
assert any ( b . id == block_id for b in test_response )
variations = [
" Test@example.com " ,
" te.st@example.com " ,
" test+other@EXAMPLE.com "
]
for variation in variations :
test_response = api2 . admin_test_canonical_email_block ( variation )
assert any ( b . id == block_id for b in test_response )
all_blocks = api2 . admin_canonical_email_blocks ( )
assert any ( b . id == block_id for b in all_blocks )
api2 . admin_delete_canonical_email_block ( block_id )
all_blocks_after_delete = api2 . admin_canonical_email_blocks ( )
assert not any ( b . id == block_id for b in all_blocks_after_delete )
email_hash = hashlib . sha256 ( blocked_email . encode ( " utf-8 " ) ) . hexdigest ( )
response = api2 . admin_create_canonical_email_block ( canonical_email_hash = email_hash )
assert response is not None
assert hasattr ( response , ' id ' )
block_id = response . id
test_response = api2 . admin_canonical_email_block ( block_id )
assert test_response . id == block_id
for variation in variations :
test_response = api2 . admin_test_canonical_email_block ( variation )
assert any ( b . id == block_id for b in test_response )
finally :
try :
api2 . admin_delete_canonical_email_block ( block_id )
except Exception :
pass
2025-02-15 15:04:18 +00:00
@pytest.mark.vcr ( match_on = [ ' path ' ] )
def test_admin_email_domain_blocks ( api2 ) :
test_domain = " blockedexample.com "
created_block = api2 . admin_create_email_domain_block ( test_domain )
assert created_block is not None
assert created_block . domain == test_domain
retrieved_block = api2 . admin_email_domain_block ( created_block . id )
assert retrieved_block . id == created_block . id
assert retrieved_block . domain == test_domain
all_blocks = api2 . admin_email_domain_blocks ( )
assert any ( block . id == created_block . id for block in all_blocks )
api2 . admin_delete_email_domain_block ( created_block . id )
all_blocks_after_delete = api2 . admin_email_domain_blocks ( )
assert not any ( block . id == created_block . id for block in all_blocks_after_delete )
2025-02-15 16:20:27 +00:00
@pytest.mark.vcr ( )
def test_admin_ip_blocks ( api2 ) :
try :
test_ip = " 8.8.8.0/24 "
test_severity = " no_access "
test_comment = " Google DNS is ULTRA BANNED "
created_block = api2 . admin_create_ip_block ( test_ip , test_severity , comment = test_comment )
assert created_block is not None
assert created_block . ip == test_ip
assert created_block . severity == test_severity
assert created_block . comment == test_comment
retrieved_block = api2 . admin_ip_block ( created_block . id )
assert retrieved_block . id == created_block . id
assert retrieved_block . ip == test_ip
assert retrieved_block . severity == test_severity
all_blocks = api2 . admin_ip_blocks ( )
assert any ( block . id == created_block . id for block in all_blocks )
updated_comment = " Updated test block "
updated_block = api2 . admin_update_ip_block ( created_block . id , comment = updated_comment )
assert updated_block . id == created_block . id
assert updated_block . comment == updated_comment
api2 . admin_delete_ip_block ( created_block . id )
all_blocks_after_delete = api2 . admin_ip_blocks ( )
assert not any ( block . id == created_block . id for block in all_blocks_after_delete )
finally :
all_blocks = api2 . admin_ip_blocks ( )
for block in all_blocks :
api2 . admin_delete_ip_block ( block . id )