2023-02-22 01:55:31 +01:00
# frozen_string_literal: true
2016-10-09 14:48:43 +02:00
require 'rails_helper'
2024-03-13 09:39:26 +01:00
RSpec . describe BlockDomainService do
2023-06-06 13:58:33 +02:00
subject { described_class . new }
2023-02-20 05:24:14 +01:00
2024-03-20 16:37:21 +01:00
let ( :local_account ) { Fabricate ( :account ) }
let ( :bystander ) { Fabricate ( :account , domain : 'evil.org' ) }
2019-05-14 19:05:02 +02:00
let! ( :bad_account ) { Fabricate ( :account , username : 'badguy666' , domain : 'evil.org' ) }
2023-06-14 16:44:37 +02:00
let! ( :bad_status_plain ) { Fabricate ( :status , account : bad_account , text : 'You suck' ) }
let! ( :bad_status_with_attachment ) { Fabricate ( :status , account : bad_account , text : 'Hahaha' ) }
let! ( :bad_attachment ) { Fabricate ( :media_attachment , account : bad_account , status : bad_status_with_attachment , file : attachment_fixture ( 'attachment.jpg' ) ) }
2019-05-14 19:05:02 +02:00
let! ( :already_banned_account ) { Fabricate ( :account , username : 'badguy' , domain : 'evil.org' , suspended : true , silenced : true ) }
2016-10-09 14:48:43 +02:00
2017-04-26 20:09:01 +02:00
describe 'for a suspension' do
before do
2024-03-20 16:37:21 +01:00
local_account . follow! ( bad_account )
bystander . follow! ( local_account )
2017-04-26 20:09:01 +02:00
end
2024-03-22 17:25:36 +01:00
it 'creates a domain block, suspends remote accounts with appropriate suspension date, records severed relationships and sends notification' , :aggregate_failures do
2024-03-20 16:37:21 +01:00
subject . call ( DomainBlock . create! ( domain : 'evil.org' , severity : :suspend ) )
2017-04-26 20:09:01 +02:00
expect ( DomainBlock . blocked? ( 'evil.org' ) ) . to be true
2024-03-20 16:37:21 +01:00
# Suspends account with appropriate suspension date
2023-12-21 15:23:53 +01:00
expect ( bad_account . reload . suspended? ) . to be true
expect ( bad_account . reload . suspended_at ) . to eq DomainBlock . find_by ( domain : 'evil.org' ) . created_at
2019-05-14 19:05:02 +02:00
2024-03-20 16:37:21 +01:00
# Keep already-suspended account without updating the suspension date
2023-12-21 15:23:53 +01:00
expect ( already_banned_account . reload . suspended? ) . to be true
expect ( already_banned_account . reload . suspended_at ) . to_not eq DomainBlock . find_by ( domain : 'evil.org' ) . created_at
2019-05-14 19:05:02 +02:00
2024-03-20 16:37:21 +01:00
# Removes content
2023-06-14 16:44:37 +02:00
expect { bad_status_plain . reload } . to raise_exception ActiveRecord :: RecordNotFound
expect { bad_status_with_attachment . reload } . to raise_exception ActiveRecord :: RecordNotFound
2017-04-26 20:09:01 +02:00
expect { bad_attachment . reload } . to raise_exception ActiveRecord :: RecordNotFound
2024-03-20 16:37:21 +01:00
# Records severed relationships
severed_relationships = local_account . severed_relationships . to_a
expect ( severed_relationships . count ) . to eq 2
expect ( severed_relationships [ 0 ] . relationship_severance_event ) . to eq severed_relationships [ 1 ] . relationship_severance_event
expect ( severed_relationships . map { | rel | [ rel . account , rel . target_account ] } ) . to contain_exactly ( [ bystander , local_account ] , [ local_account , bad_account ] )
2024-03-22 17:25:36 +01:00
# Sends severed relationships notification
expect ( LocalNotificationWorker ) . to have_enqueued_sidekiq_job ( local_account . id , anything , 'AccountRelationshipSeveranceEvent' , 'severed_relationships' )
2017-04-26 20:09:01 +02:00
end
2016-10-09 14:48:43 +02:00
end
2017-04-26 20:09:01 +02:00
describe 'for a silence with reject media' do
2024-03-20 16:37:21 +01:00
it 'does not mark the domain as blocked, but silences accounts with an appropriate silencing date, clears media' , :aggregate_failures , :sidekiq_inline do
2017-04-26 20:09:01 +02:00
subject . call ( DomainBlock . create! ( domain : 'evil.org' , severity : :silence , reject_media : true ) )
expect ( DomainBlock . blocked? ( 'evil.org' ) ) . to be false
2024-03-20 16:37:21 +01:00
# Silences account with appropriate silecing date
2023-12-21 15:23:53 +01:00
expect ( bad_account . reload . silenced? ) . to be true
expect ( bad_account . reload . silenced_at ) . to eq DomainBlock . find_by ( domain : 'evil.org' ) . created_at
2019-05-14 19:05:02 +02:00
2024-03-20 16:37:21 +01:00
# Keeps already-silenced accounts without updating the silecing date
2023-12-21 15:23:53 +01:00
expect ( already_banned_account . reload . silenced? ) . to be true
expect ( already_banned_account . reload . silenced_at ) . to_not eq DomainBlock . find_by ( domain : 'evil.org' ) . created_at
2019-05-14 19:05:02 +02:00
2024-03-20 16:37:21 +01:00
# Leaves posts but clears media
2023-06-14 16:44:37 +02:00
expect { bad_status_plain . reload } . to_not raise_error
expect { bad_status_with_attachment . reload } . to_not raise_error
2023-02-20 02:33:27 +01:00
expect { bad_attachment . reload } . to_not raise_error
2017-04-26 20:09:01 +02:00
expect ( bad_attachment . file . exists? ) . to be false
end
2016-10-09 14:48:43 +02:00
end
end