185 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| require 'rails_helper'
 | |
| 
 | |
| RSpec.shared_examples 'Status::Visibility' do
 | |
|   describe 'Validations' do
 | |
|     context 'when status is a reblog' do
 | |
|       subject { Fabricate.build :status, reblog: Fabricate(:status) }
 | |
| 
 | |
|       it { is_expected.to allow_values('public', 'unlisted', 'private').for(:visibility) }
 | |
|       it { is_expected.to_not allow_values('direct', 'limited').for(:visibility) }
 | |
|     end
 | |
| 
 | |
|     context 'when status is not reblog' do
 | |
|       subject { Fabricate.build :status, reblog_of_id: nil }
 | |
| 
 | |
|       it { is_expected.to allow_values('public', 'unlisted', 'private', 'direct', 'limited').for(:visibility) }
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe 'Scopes' do
 | |
|     let!(:direct_status) { Fabricate :status, visibility: :direct }
 | |
|     let!(:limited_status) { Fabricate :status, visibility: :limited }
 | |
|     let!(:private_status) { Fabricate :status, visibility: :private }
 | |
|     let!(:public_status) { Fabricate :status, visibility: :public }
 | |
|     let!(:unlisted_status) { Fabricate :status, visibility: :unlisted }
 | |
| 
 | |
|     describe '.list_eligible_visibility' do
 | |
|       it 'returns appropriate records' do
 | |
|         expect(Status.list_eligible_visibility)
 | |
|           .to include(
 | |
|             private_status,
 | |
|             public_status,
 | |
|             unlisted_status
 | |
|           )
 | |
|           .and not_include(direct_status)
 | |
|           .and not_include(limited_status)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     describe '.distributable_visibility' do
 | |
|       it 'returns appropriate records' do
 | |
|         expect(Status.distributable_visibility)
 | |
|           .to include(
 | |
|             public_status,
 | |
|             unlisted_status
 | |
|           )
 | |
|           .and not_include(private_status)
 | |
|           .and not_include(direct_status)
 | |
|           .and not_include(limited_status)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     describe '.not_direct_visibility' do
 | |
|       it 'returns appropriate records' do
 | |
|         expect(Status.not_direct_visibility)
 | |
|           .to include(
 | |
|             limited_status,
 | |
|             private_status,
 | |
|             public_status,
 | |
|             unlisted_status
 | |
|           )
 | |
|           .and not_include(direct_status)
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe 'Callbacks' do
 | |
|     describe 'Setting visibility in before validation' do
 | |
|       subject { Fabricate.build :status, visibility: nil }
 | |
| 
 | |
|       context 'when explicit value is set' do
 | |
|         before { subject.visibility = :public }
 | |
| 
 | |
|         it 'does not change' do
 | |
|           expect { subject.valid? }
 | |
|             .to_not change(subject, :visibility)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       context 'when status is a reblog' do
 | |
|         before { subject.reblog = Fabricate(:status, visibility: :public) }
 | |
| 
 | |
|         it 'changes to match the reblog' do
 | |
|           expect { subject.valid? }
 | |
|             .to change(subject, :visibility).to('public')
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       context 'when account is locked' do
 | |
|         before { subject.account = Fabricate.build(:account, locked: true) }
 | |
| 
 | |
|         it 'changes to private' do
 | |
|           expect { subject.valid? }
 | |
|             .to change(subject, :visibility).to('private')
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       context 'when account is not locked' do
 | |
|         before { subject.account = Fabricate.build(:account, locked: false) }
 | |
| 
 | |
|         it 'changes to public' do
 | |
|           expect { subject.valid? }
 | |
|             .to change(subject, :visibility).to('public')
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe '.selectable_visibilities' do
 | |
|     it 'returns options available for default privacy selection' do
 | |
|       expect(Status.selectable_visibilities)
 | |
|         .to match(%w(public unlisted private))
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe '#hidden?' do
 | |
|     subject { Status.new }
 | |
| 
 | |
|     context 'when visibility is private' do
 | |
|       before { subject.visibility = :private }
 | |
| 
 | |
|       it { is_expected.to be_hidden }
 | |
|     end
 | |
| 
 | |
|     context 'when visibility is direct' do
 | |
|       before { subject.visibility = :direct }
 | |
| 
 | |
|       it { is_expected.to be_hidden }
 | |
|     end
 | |
| 
 | |
|     context 'when visibility is limited' do
 | |
|       before { subject.visibility = :limited }
 | |
| 
 | |
|       it { is_expected.to be_hidden }
 | |
|     end
 | |
| 
 | |
|     context 'when visibility is public' do
 | |
|       before { subject.visibility = :public }
 | |
| 
 | |
|       it { is_expected.to_not be_hidden }
 | |
|     end
 | |
| 
 | |
|     context 'when visibility is unlisted' do
 | |
|       before { subject.visibility = :unlisted }
 | |
| 
 | |
|       it { is_expected.to_not be_hidden }
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe '#distributable?' do
 | |
|     subject { Status.new }
 | |
| 
 | |
|     context 'when visibility is public' do
 | |
|       before { subject.visibility = :public }
 | |
| 
 | |
|       it { is_expected.to be_distributable }
 | |
|     end
 | |
| 
 | |
|     context 'when visibility is unlisted' do
 | |
|       before { subject.visibility = :unlisted }
 | |
| 
 | |
|       it { is_expected.to be_distributable }
 | |
|     end
 | |
| 
 | |
|     context 'when visibility is private' do
 | |
|       before { subject.visibility = :private }
 | |
| 
 | |
|       it { is_expected.to_not be_distributable }
 | |
|     end
 | |
| 
 | |
|     context 'when visibility is direct' do
 | |
|       before { subject.visibility = :direct }
 | |
| 
 | |
|       it { is_expected.to_not be_distributable }
 | |
|     end
 | |
| 
 | |
|     context 'when visibility is limited' do
 | |
|       before { subject.visibility = :limited }
 | |
| 
 | |
|       it { is_expected.to_not be_distributable }
 | |
|     end
 | |
|   end
 | |
| end
 |