| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  | require 'rails_helper' | 
					
						
							|  |  |  | require 'pundit/rspec' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RSpec.describe StatusPolicy, type: :model do | 
					
						
							|  |  |  |   subject { described_class } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-30 13:56:31 -07:00
										 |  |  |   let(:admin) { Fabricate(:user, admin: true) } | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  |   let(:alice) { Fabricate(:account, username: 'alice') } | 
					
						
							| 
									
										
										
										
											2017-05-30 13:56:31 -07:00
										 |  |  |   let(:bob) { Fabricate(:account, username: 'bob') } | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  |   let(:status) { Fabricate(:status, account: alice) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-30 06:16:14 -07:00
										 |  |  |   permissions :show?, :reblog? do | 
					
						
							|  |  |  |     it 'grants access when no viewer' do | 
					
						
							|  |  |  |       expect(subject).to permit(nil, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'denies access when viewer is blocked' do | 
					
						
							|  |  |  |       block = Fabricate(:block) | 
					
						
							|  |  |  |       status.visibility = :private | 
					
						
							|  |  |  |       status.account = block.target_account | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(subject).to_not permit(block.account, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  |   permissions :show? do | 
					
						
							|  |  |  |     it 'grants access when direct and account is viewer' do | 
					
						
							|  |  |  |       status.visibility = :direct | 
					
						
							| 
									
										
										
										
											2017-05-30 13:14:32 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  |       expect(subject).to permit(status.account, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'grants access when direct and viewer is mentioned' do | 
					
						
							|  |  |  |       status.visibility = :direct | 
					
						
							|  |  |  |       status.mentions = [Fabricate(:mention, account: alice)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(subject).to permit(alice, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'denies access when direct and viewer is not mentioned' do | 
					
						
							|  |  |  |       viewer = Fabricate(:account) | 
					
						
							|  |  |  |       status.visibility = :direct | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(subject).to_not permit(viewer, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'grants access when private and account is viewer' do | 
					
						
							| 
									
										
										
										
											2017-05-30 13:14:32 -07:00
										 |  |  |       status.visibility = :private | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       expect(subject).to permit(status.account, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'grants access when private and account is following viewer' do | 
					
						
							|  |  |  |       follow = Fabricate(:follow) | 
					
						
							|  |  |  |       status.visibility = :private | 
					
						
							|  |  |  |       status.account = follow.target_account | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(subject).to permit(follow.account, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'grants access when private and viewer is mentioned' do | 
					
						
							|  |  |  |       status.visibility = :private | 
					
						
							|  |  |  |       status.mentions = [Fabricate(:mention, account: alice)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(subject).to permit(alice, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'denies access when private and viewer is not mentioned or followed' do | 
					
						
							|  |  |  |       viewer = Fabricate(:account) | 
					
						
							|  |  |  |       status.visibility = :private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(subject).to_not permit(viewer, status) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-05-30 06:16:14 -07:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-30 06:16:14 -07:00
										 |  |  |   permissions :reblog? do | 
					
						
							|  |  |  |     it 'denies access when private' do | 
					
						
							|  |  |  |       viewer = Fabricate(:account) | 
					
						
							|  |  |  |       status.visibility = :private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(subject).to_not permit(viewer, status) | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-30 06:16:14 -07:00
										 |  |  |     it 'denies access when direct' do | 
					
						
							|  |  |  |       viewer = Fabricate(:account) | 
					
						
							|  |  |  |       status.visibility = :direct | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-30 06:16:14 -07:00
										 |  |  |       expect(subject).to_not permit(viewer, status) | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-05-30 13:56:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   permissions :destroy?, :unreblog? do | 
					
						
							|  |  |  |     it 'grants access when account is deleter' do | 
					
						
							|  |  |  |       expect(subject).to permit(status.account, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'grants access when account is admin' do | 
					
						
							|  |  |  |       expect(subject).to permit(admin.account, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'denies access when account is not deleter' do | 
					
						
							|  |  |  |       expect(subject).to_not permit(bob, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'denies access when no deleter' do | 
					
						
							|  |  |  |       expect(subject).to_not permit(nil, status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-05-29 09:22:22 -07:00
										 |  |  | end |