Add customizable user roles (#18641)
* Add customizable user roles * Various fixes and improvements * Add migration for old settings and fix tootctl role management
This commit is contained in:
		
					parent
					
						
							
								1b4054256f
							
						
					
				
			
			
				commit
				
					
						44b2ee3485
					
				
			
		
					 187 changed files with 1945 additions and 1032 deletions
				
			
		|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Admin::AccountModerationNotesController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:user) { Fabricate(:user, admin: true) } | ||||
|   let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
|   let(:target_account) { Fabricate(:account) } | ||||
| 
 | ||||
|   before do | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|   before { sign_in current_user, scope: :user } | ||||
| 
 | ||||
|   describe 'GET #index' do | ||||
|     let(:current_user) { Fabricate(:user, admin: true) } | ||||
|     let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|     around do |example| | ||||
|       default_per_page = Account.default_per_page | ||||
|  | @ -60,7 +60,7 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   describe 'GET #show' do | ||||
|     let(:current_user) { Fabricate(:user, admin: true) } | ||||
|     let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
|     let(:account) { Fabricate(:account) } | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|  | @ -72,15 +72,15 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|   describe 'POST #memorialize' do | ||||
|     subject { post :memorialize, params: { id: account.id } } | ||||
| 
 | ||||
|     let(:current_user) { Fabricate(:user, admin: current_user_admin) } | ||||
|     let(:current_user) { Fabricate(:user, role: current_role) } | ||||
|     let(:account) { user.account } | ||||
|     let(:user) { Fabricate(:user, admin: target_user_admin) } | ||||
|     let(:user) { Fabricate(:user, role: target_role) } | ||||
| 
 | ||||
|     context 'when user is admin' do | ||||
|       let(:current_user_admin) { true } | ||||
|       let(:current_role) { UserRole.find_by(name: 'Admin') } | ||||
| 
 | ||||
|       context 'when target user is admin' do | ||||
|         let(:target_user_admin) { true } | ||||
|         let(:target_role) { UserRole.find_by(name: 'Admin') } | ||||
| 
 | ||||
|         it 'fails to memorialize account' do | ||||
|           is_expected.to have_http_status :forbidden | ||||
|  | @ -89,7 +89,7 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|       end | ||||
| 
 | ||||
|       context 'when target user is not admin' do | ||||
|         let(:target_user_admin) { false } | ||||
|         let(:target_role) { UserRole.find_by(name: 'Moderator') } | ||||
| 
 | ||||
|         it 'succeeds in memorializing account' do | ||||
|           is_expected.to redirect_to admin_account_path(account.id) | ||||
|  | @ -99,10 +99,10 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     context 'when user is not admin' do | ||||
|       let(:current_user_admin) { false } | ||||
|       let(:current_role) { UserRole.find_by(name: 'Moderator') } | ||||
| 
 | ||||
|       context 'when target user is admin' do | ||||
|         let(:target_user_admin) { true } | ||||
|         let(:target_role) { UserRole.find_by(name: 'Admin') } | ||||
| 
 | ||||
|         it 'fails to memorialize account' do | ||||
|           is_expected.to have_http_status :forbidden | ||||
|  | @ -111,7 +111,7 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|       end | ||||
| 
 | ||||
|       context 'when target user is not admin' do | ||||
|         let(:target_user_admin) { false } | ||||
|         let(:target_role) { UserRole.find_by(name: 'Moderator') } | ||||
| 
 | ||||
|         it 'fails to memorialize account' do | ||||
|           is_expected.to have_http_status :forbidden | ||||
|  | @ -124,12 +124,12 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|   describe 'POST #enable' do | ||||
|     subject { post :enable, params: { id: account.id } } | ||||
| 
 | ||||
|     let(:current_user) { Fabricate(:user, admin: admin) } | ||||
|     let(:current_user) { Fabricate(:user, role: role) } | ||||
|     let(:account) { user.account } | ||||
|     let(:user) { Fabricate(:user, disabled: true) } | ||||
| 
 | ||||
|     context 'when user is admin' do | ||||
|       let(:admin) { true } | ||||
|       let(:role) { UserRole.find_by(name: 'Admin') } | ||||
| 
 | ||||
|       it 'succeeds in enabling account' do | ||||
|         is_expected.to redirect_to admin_account_path(account.id) | ||||
|  | @ -138,7 +138,7 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     context 'when user is not admin' do | ||||
|       let(:admin) { false } | ||||
|       let(:role) { UserRole.everyone } | ||||
| 
 | ||||
|       it 'fails to enable account' do | ||||
|         is_expected.to have_http_status :forbidden | ||||
|  | @ -150,19 +150,23 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|   describe 'POST #redownload' do | ||||
|     subject { post :redownload, params: { id: account.id } } | ||||
| 
 | ||||
|     let(:current_user) { Fabricate(:user, admin: admin) } | ||||
|     let(:account) { Fabricate(:account) } | ||||
|     let(:current_user) { Fabricate(:user, role: role) } | ||||
|     let(:account) { Fabricate(:account, domain: 'example.com') } | ||||
| 
 | ||||
|     before do | ||||
|       allow_any_instance_of(ResolveAccountService).to receive(:call) | ||||
|     end | ||||
| 
 | ||||
|     context 'when user is admin' do | ||||
|       let(:admin) { true } | ||||
|       let(:role) { UserRole.find_by(name: 'Admin') } | ||||
| 
 | ||||
|       it 'succeeds in redownloadin' do | ||||
|       it 'succeeds in redownloading' do | ||||
|         is_expected.to redirect_to admin_account_path(account.id) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when user is not admin' do | ||||
|       let(:admin) { false } | ||||
|       let(:role) { UserRole.everyone } | ||||
| 
 | ||||
|       it 'fails to redownload' do | ||||
|         is_expected.to have_http_status :forbidden | ||||
|  | @ -173,11 +177,11 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|   describe 'POST #remove_avatar' do | ||||
|     subject { post :remove_avatar, params: { id: account.id } } | ||||
| 
 | ||||
|     let(:current_user) { Fabricate(:user, admin: admin) } | ||||
|     let(:current_user) { Fabricate(:user, role: role) } | ||||
|     let(:account) { Fabricate(:account) } | ||||
| 
 | ||||
|     context 'when user is admin' do | ||||
|       let(:admin) { true } | ||||
|       let(:role) { UserRole.find_by(name: 'Admin') } | ||||
| 
 | ||||
|       it 'succeeds in removing avatar' do | ||||
|         is_expected.to redirect_to admin_account_path(account.id) | ||||
|  | @ -185,7 +189,7 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     context 'when user is not admin' do | ||||
|       let(:admin) { false } | ||||
|       let(:role) { UserRole.everyone } | ||||
| 
 | ||||
|       it 'fails to remove avatar' do | ||||
|         is_expected.to have_http_status :forbidden | ||||
|  | @ -196,12 +200,12 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|   describe 'POST #unblock_email' do | ||||
|     subject { post :unblock_email, params: { id: account.id } } | ||||
| 
 | ||||
|     let(:current_user) { Fabricate(:user, admin: admin) } | ||||
|     let(:current_user) { Fabricate(:user, role: role) } | ||||
|     let(:account) { Fabricate(:account, suspended: true) } | ||||
|     let!(:email_block) { Fabricate(:canonical_email_block, reference_account: account) } | ||||
| 
 | ||||
|     context 'when user is admin' do | ||||
|       let(:admin) { true } | ||||
|       let(:role) { UserRole.find_by(name: 'Admin') } | ||||
| 
 | ||||
|       it 'succeeds in removing email blocks' do | ||||
|         expect { subject }.to change { CanonicalEmailBlock.where(reference_account: account).count }.from(1).to(0) | ||||
|  | @ -214,7 +218,7 @@ RSpec.describe Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     context 'when user is not admin' do | ||||
|       let(:admin) { false } | ||||
|       let(:role) { UserRole.everyone } | ||||
| 
 | ||||
|       it 'fails to remove avatar' do | ||||
|         subject | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ require 'rails_helper' | |||
| describe Admin::ActionLogsController, type: :controller do | ||||
|   describe 'GET #index' do | ||||
|     it 'returns 200' do | ||||
|       sign_in Fabricate(:user, admin: true) | ||||
|       sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) | ||||
|       get :index, params: { page: 1 } | ||||
| 
 | ||||
|       expect(response).to have_http_status(200) | ||||
|  |  | |||
|  | @ -5,13 +5,14 @@ require 'rails_helper' | |||
| describe Admin::BaseController, type: :controller do | ||||
|   controller do | ||||
|     def success | ||||
|       authorize :dashboard, :index? | ||||
|       render 'admin/reports/show' | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   it 'requires administrator or moderator' do | ||||
|     routes.draw { get 'success' => 'admin/base#success' } | ||||
|     sign_in(Fabricate(:user, admin: false, moderator: false)) | ||||
|     sign_in(Fabricate(:user)) | ||||
|     get :success | ||||
| 
 | ||||
|     expect(response).to have_http_status(:forbidden) | ||||
|  | @ -19,14 +20,14 @@ describe Admin::BaseController, type: :controller do | |||
| 
 | ||||
|   it 'renders admin layout as a moderator' do | ||||
|     routes.draw { get 'success' => 'admin/base#success' } | ||||
|     sign_in(Fabricate(:user, moderator: true)) | ||||
|     sign_in(Fabricate(:user, role: UserRole.find_by(name: 'Moderator'))) | ||||
|     get :success | ||||
|     expect(response).to render_template layout: 'admin' | ||||
|   end | ||||
| 
 | ||||
|   it 'renders admin layout as an admin' do | ||||
|     routes.draw { get 'success' => 'admin/base#success' } | ||||
|     sign_in(Fabricate(:user, admin: true)) | ||||
|     sign_in(Fabricate(:user, role: UserRole.find_by(name: 'Admin'))) | ||||
|     get :success | ||||
|     expect(response).to render_template layout: 'admin' | ||||
|   end | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Admin::ChangeEmailsController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:admin) { Fabricate(:user, admin: true) } | ||||
|   let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|   before do | ||||
|     sign_in admin | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ RSpec.describe Admin::ConfirmationsController, type: :controller do | |||
|   render_views | ||||
| 
 | ||||
|   before do | ||||
|     sign_in Fabricate(:user, admin: true), scope: :user | ||||
|     sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST #create' do | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| describe Admin::CustomEmojisController do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:user) { Fabricate(:user, admin: true) } | ||||
|   let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|   before do | ||||
|     sign_in user, scope: :user | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ describe Admin::DashboardController, type: :controller do | |||
|         Admin::SystemCheck::Message.new(:rules_check, nil, admin_rules_path), | ||||
|         Admin::SystemCheck::Message.new(:sidekiq_process_check, 'foo, bar'), | ||||
|       ]) | ||||
|       sign_in Fabricate(:user, admin: true) | ||||
|       sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) | ||||
|     end | ||||
| 
 | ||||
|     it 'returns 200' do | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ RSpec.describe Admin::Disputes::AppealsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   describe 'POST #approve' do | ||||
|     let(:current_user) { Fabricate(:user, admin: true) } | ||||
|     let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|     before do | ||||
|       allow(UserMailer).to receive(:appeal_approved).and_return(double('email', deliver_later: nil)) | ||||
|  | @ -35,7 +35,7 @@ RSpec.describe Admin::Disputes::AppealsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   describe 'POST #reject' do | ||||
|     let(:current_user) { Fabricate(:user, admin: true) } | ||||
|     let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|     before do | ||||
|       allow(UserMailer).to receive(:appeal_rejected).and_return(double('email', deliver_later: nil)) | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do | |||
|   render_views | ||||
| 
 | ||||
|   before do | ||||
|     sign_in Fabricate(:user, admin: true), scope: :user | ||||
|     sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user | ||||
|   end | ||||
| 
 | ||||
|   describe 'GET #new' do | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ RSpec.describe Admin::EmailDomainBlocksController, type: :controller do | |||
|   render_views | ||||
| 
 | ||||
|   before do | ||||
|     sign_in Fabricate(:user, admin: true), scope: :user | ||||
|     sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user | ||||
|   end | ||||
| 
 | ||||
|   describe 'GET #index' do | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Admin::InstancesController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:current_user) { Fabricate(:user, admin: true) } | ||||
|   let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|   let!(:account)     { Fabricate(:account, domain: 'popular') } | ||||
|   let!(:account2)    { Fabricate(:account, domain: 'popular') } | ||||
|  | @ -35,11 +35,11 @@ RSpec.describe Admin::InstancesController, type: :controller do | |||
|   describe 'DELETE #destroy' do | ||||
|     subject { delete :destroy, params: { id: Instance.first.id } } | ||||
| 
 | ||||
|     let(:current_user) { Fabricate(:user, admin: admin) } | ||||
|     let(:current_user) { Fabricate(:user, role: role) } | ||||
|     let(:account) { Fabricate(:account) } | ||||
| 
 | ||||
|     context 'when user is admin' do | ||||
|       let(:admin) { true } | ||||
|       let(:role) { UserRole.find_by(name: 'Admin') } | ||||
| 
 | ||||
|       it 'succeeds in purging instance' do | ||||
|         is_expected.to redirect_to admin_instances_path | ||||
|  | @ -47,7 +47,7 @@ RSpec.describe Admin::InstancesController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     context 'when user is not admin' do | ||||
|       let(:admin) { false } | ||||
|       let(:role) { nil } | ||||
| 
 | ||||
|       it 'fails to purge instance' do | ||||
|         is_expected.to have_http_status :forbidden | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ require 'rails_helper' | |||
| describe Admin::InvitesController do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:user) { Fabricate(:user, admin: true) } | ||||
|   let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|   before do | ||||
|     sign_in user, scope: :user | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| describe Admin::ReportNotesController do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:user) { Fabricate(:user, admin: true) } | ||||
|   let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|   before do | ||||
|     sign_in user, scope: :user | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| describe Admin::ReportsController do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:user) { Fabricate(:user, admin: true) } | ||||
|   let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
|   before do | ||||
|     sign_in user, scope: :user | ||||
|   end | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ describe Admin::ResetsController do | |||
| 
 | ||||
|   let(:account) { Fabricate(:account) } | ||||
|   before do | ||||
|     sign_in Fabricate(:user, admin: true), scope: :user | ||||
|     sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST #create' do | ||||
|  |  | |||
|  | @ -3,31 +3,247 @@ require 'rails_helper' | |||
| describe Admin::RolesController do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:admin) { Fabricate(:user, admin: true) } | ||||
|   let(:permissions)  { UserRole::Flags::NONE } | ||||
|   let(:current_role) { UserRole.create(name: 'Foo', permissions: permissions, position: 10) } | ||||
|   let(:current_user) { Fabricate(:user, role: current_role) } | ||||
| 
 | ||||
|   before do | ||||
|     sign_in admin, scope: :user | ||||
|     sign_in current_user, scope: :user | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST #promote' do | ||||
|     subject { post :promote, params: { account_id: user.account_id } } | ||||
|   describe 'GET #index' do | ||||
|     before do | ||||
|       get :index | ||||
|     end | ||||
| 
 | ||||
|     let(:user) { Fabricate(:user, moderator: false, admin: false) } | ||||
|     context 'when user does not have permission to manage roles' do | ||||
|       it 'returns http forbidden' do | ||||
|         expect(response).to have_http_status(:forbidden) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     it 'promotes user' do | ||||
|       expect(subject).to redirect_to admin_account_path(user.account_id) | ||||
|       expect(user.reload).to be_moderator | ||||
|     context 'when user has permission to manage roles' do | ||||
|       let(:permissions) { UserRole::FLAGS[:manage_roles] } | ||||
| 
 | ||||
|       it 'returns http success' do | ||||
|         expect(response).to have_http_status(:success) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST #demote' do | ||||
|     subject { post :demote, params: { account_id: user.account_id } } | ||||
|   describe 'GET #new' do | ||||
|     before do | ||||
|       get :new | ||||
|     end | ||||
| 
 | ||||
|     let(:user) { Fabricate(:user, moderator: true, admin: false) } | ||||
|     context 'when user does not have permission to manage roles' do | ||||
|       it 'returns http forbidden' do | ||||
|         expect(response).to have_http_status(:forbidden) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     it 'demotes user' do | ||||
|       expect(subject).to redirect_to admin_account_path(user.account_id) | ||||
|       expect(user.reload).not_to be_moderator | ||||
|     context 'when user has permission to manage roles' do | ||||
|       let(:permissions) { UserRole::FLAGS[:manage_roles] } | ||||
| 
 | ||||
|       it 'returns http success' do | ||||
|         expect(response).to have_http_status(:success) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST #create' do | ||||
|     let(:selected_position) { 1 } | ||||
|     let(:selected_permissions_as_keys) { %w(manage_roles) } | ||||
| 
 | ||||
|     before do | ||||
|       post :create, params: { user_role: { name: 'Bar', position: selected_position, permissions_as_keys: selected_permissions_as_keys } } | ||||
|     end | ||||
| 
 | ||||
|     context 'when user has permission to manage roles' do | ||||
|       let(:permissions) { UserRole::FLAGS[:manage_roles] } | ||||
| 
 | ||||
|       context 'when new role\'s does not elevate above the user\'s role' do | ||||
|         let(:selected_position) { 1 } | ||||
|         let(:selected_permissions_as_keys) { %w(manage_roles) } | ||||
| 
 | ||||
|         it 'redirects to roles page' do | ||||
|           expect(response).to redirect_to(admin_roles_path) | ||||
|         end | ||||
| 
 | ||||
|         it 'creates new role' do | ||||
|           expect(UserRole.find_by(name: 'Bar')).to_not be_nil | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when new role\'s position is higher than user\'s role' do | ||||
|         let(:selected_position) { 100 } | ||||
|         let(:selected_permissions_as_keys) { %w(manage_roles) } | ||||
| 
 | ||||
|         it 'renders new template' do | ||||
|           expect(response).to render_template(:new) | ||||
|         end | ||||
| 
 | ||||
|         it 'does not create new role' do | ||||
|           expect(UserRole.find_by(name: 'Bar')).to be_nil | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when new role has permissions the user does not have' do | ||||
|         let(:selected_position) { 1 } | ||||
|         let(:selected_permissions_as_keys) { %w(manage_roles manage_users manage_reports) } | ||||
| 
 | ||||
|         it 'renders new template' do | ||||
|           expect(response).to render_template(:new) | ||||
|         end | ||||
| 
 | ||||
|         it 'does not create new role' do | ||||
|           expect(UserRole.find_by(name: 'Bar')).to be_nil | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when user has administrator permission' do | ||||
|         let(:permissions) { UserRole::FLAGS[:administrator] } | ||||
| 
 | ||||
|         let(:selected_position) { 1 } | ||||
|         let(:selected_permissions_as_keys) { %w(manage_roles manage_users manage_reports) } | ||||
| 
 | ||||
|         it 'redirects to roles page' do | ||||
|           expect(response).to redirect_to(admin_roles_path) | ||||
|         end | ||||
| 
 | ||||
|         it 'creates new role' do | ||||
|           expect(UserRole.find_by(name: 'Bar')).to_not be_nil | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'GET #edit' do | ||||
|     let(:role_position) { 8 } | ||||
|     let(:role) { UserRole.create(name: 'Bar', permissions: UserRole::FLAGS[:manage_users], position: role_position) } | ||||
| 
 | ||||
|     before do | ||||
|       get :edit, params: { id: role.id } | ||||
|     end | ||||
| 
 | ||||
|     context 'when user does not have permission to manage roles' do | ||||
|       it 'returns http forbidden' do | ||||
|         expect(response).to have_http_status(:forbidden) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when user has permission to manage roles' do | ||||
|       let(:permissions) { UserRole::FLAGS[:manage_roles] } | ||||
| 
 | ||||
|       context 'when user outranks the role' do | ||||
|         it 'returns http success' do | ||||
|           expect(response).to have_http_status(:success) | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when role outranks user' do | ||||
|         let(:role_position) { current_role.position + 1 } | ||||
| 
 | ||||
|         it 'returns http forbidden' do | ||||
|           expect(response).to have_http_status(:forbidden) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'PUT #update' do | ||||
|     let(:role_position) { 8 } | ||||
|     let(:role_permissions) { UserRole::FLAGS[:manage_users] } | ||||
|     let(:role) { UserRole.create(name: 'Bar', permissions: role_permissions, position: role_position) } | ||||
| 
 | ||||
|     let(:selected_position) { 8 } | ||||
|     let(:selected_permissions_as_keys) { %w(manage_users) } | ||||
| 
 | ||||
|     before do | ||||
|       put :update, params: { id: role.id, user_role: { name: 'Baz', position: selected_position, permissions_as_keys: selected_permissions_as_keys } } | ||||
|     end | ||||
| 
 | ||||
|     context 'when user does not have permission to manage roles' do | ||||
|       it 'returns http forbidden' do | ||||
|         expect(response).to have_http_status(:forbidden) | ||||
|       end | ||||
| 
 | ||||
|       it 'does not update the role' do | ||||
|         expect(role.reload.name).to eq 'Bar' | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when user has permission to manage roles' do | ||||
|       let(:permissions) { UserRole::FLAGS[:manage_roles] } | ||||
| 
 | ||||
|       context 'when role has permissions the user doesn\'t' do | ||||
|         it 'renders edit template' do | ||||
|           expect(response).to render_template(:edit) | ||||
|         end | ||||
| 
 | ||||
|         it 'does not update the role' do | ||||
|           expect(role.reload.name).to eq 'Bar' | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when user has all permissions of the role' do | ||||
|         let(:permissions) { UserRole::FLAGS[:manage_roles] | UserRole::FLAGS[:manage_users] } | ||||
| 
 | ||||
|         context 'when user outranks the role' do | ||||
|           it 'redirects to roles page' do | ||||
|             expect(response).to redirect_to(admin_roles_path) | ||||
|           end | ||||
| 
 | ||||
|           it 'updates the role' do | ||||
|             expect(role.reload.name).to eq 'Baz' | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|         context 'when role outranks user' do | ||||
|           let(:role_position) { current_role.position + 1 } | ||||
| 
 | ||||
|           it 'returns http forbidden' do | ||||
|             expect(response).to have_http_status(:forbidden) | ||||
|           end | ||||
| 
 | ||||
|           it 'does not update the role' do | ||||
|             expect(role.reload.name).to eq 'Bar' | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'DELETE #destroy' do | ||||
|     let(:role_position) { 8 } | ||||
|     let(:role) { UserRole.create(name: 'Bar', permissions: UserRole::FLAGS[:manage_users], position: role_position) } | ||||
| 
 | ||||
|     before do | ||||
|       delete :destroy, params: { id: role.id } | ||||
|     end | ||||
| 
 | ||||
|     context 'when user does not have permission to manage roles' do | ||||
|       it 'returns http forbidden' do | ||||
|         expect(response).to have_http_status(:forbidden) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when user has permission to manage roles' do | ||||
|       let(:permissions) { UserRole::FLAGS[:manage_roles] } | ||||
| 
 | ||||
|       context 'when user outranks the role' do | ||||
|         it 'redirects to roles page' do | ||||
|           expect(response).to redirect_to(admin_roles_path) | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'when role outranks user' do | ||||
|         let(:role_position) { current_role.position + 1 } | ||||
| 
 | ||||
|         it 'returns http forbidden' do | ||||
|           expect(response).to have_http_status(:forbidden) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ RSpec.describe Admin::SettingsController, type: :controller do | |||
| 
 | ||||
|   describe 'When signed in as an admin' do | ||||
|     before do | ||||
|       sign_in Fabricate(:user, admin: true), scope: :user | ||||
|       sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user | ||||
|     end | ||||
| 
 | ||||
|     describe 'GET #edit' do | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| describe Admin::StatusesController do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:user) { Fabricate(:user, admin: true) } | ||||
|   let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
|   let(:account) { Fabricate(:account) } | ||||
|   let!(:status) { Fabricate(:status, account: account) } | ||||
|   let(:media_attached_status) { Fabricate(:status, account: account, sensitive: !sensitive) } | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ RSpec.describe Admin::TagsController, type: :controller do | |||
|   render_views | ||||
| 
 | ||||
|   before do | ||||
|     sign_in Fabricate(:user, admin: true) | ||||
|     sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) | ||||
|   end | ||||
| 
 | ||||
|   describe 'GET #show' do | ||||
|  |  | |||
							
								
								
									
										81
									
								
								spec/controllers/admin/users/roles_controller.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								spec/controllers/admin/users/roles_controller.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,81 @@ | |||
| require 'rails_helper' | ||||
| 
 | ||||
| describe Admin::Users::RolesController do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:current_role) { UserRole.create(name: 'Foo', permissions: UserRole::FLAGS[:manage_roles], position: 10) } | ||||
|   let(:current_user) { Fabricate(:user, role: current_role) } | ||||
| 
 | ||||
|   let(:previous_role) { nil } | ||||
|   let(:user) { Fabricate(:user, role: previous_role) } | ||||
| 
 | ||||
|   before do | ||||
|     sign_in current_user, scope: :user | ||||
|   end | ||||
| 
 | ||||
|   describe 'GET #show' do | ||||
|     before do | ||||
|       get :show, params: { user_id: user.id } | ||||
|     end | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(:success) | ||||
|     end | ||||
| 
 | ||||
|     context 'when target user is higher ranked than current user' do | ||||
|       let(:previous_role) { UserRole.create(name: 'Baz', permissions: UserRole::FLAGS[:administrator], position: 100) } | ||||
| 
 | ||||
|       it 'returns http forbidden' do | ||||
|         expect(response).to have_http_status(:forbidden) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'PUT #update' do | ||||
|     let(:selected_role) { UserRole.create(name: 'Bar', permissions: permissions, position: position) } | ||||
| 
 | ||||
|     before do | ||||
|       put :update, params: { user_id: user.id, user: { role_id: selected_role.id } } | ||||
|     end | ||||
| 
 | ||||
|     context do | ||||
|       let(:permissions) { UserRole::FLAGS[:manage_roles] } | ||||
|       let(:position) { 1 } | ||||
| 
 | ||||
|       it 'updates user role' do | ||||
|         expect(user.reload.role_id).to eq selected_role&.id | ||||
|       end | ||||
| 
 | ||||
|       it 'redirects back to account page' do | ||||
|         expect(response).to redirect_to(admin_account_path(user.account_id)) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when selected role has higher position than current user\'s role' do | ||||
|       let(:permissions) { UserRole::FLAGS[:administrator] } | ||||
|       let(:position) { 100 } | ||||
| 
 | ||||
|       it 'does not update user role' do | ||||
|         expect(user.reload.role_id).to eq previous_role&.id | ||||
|       end | ||||
| 
 | ||||
|       it 'renders edit form' do | ||||
|         expect(response).to render_template(:show) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when target user is higher ranked than current user' do | ||||
|       let(:previous_role) { UserRole.create(name: 'Baz', permissions: UserRole::FLAGS[:administrator], position: 100) } | ||||
|       let(:permissions) { UserRole::FLAGS[:manage_roles] } | ||||
|       let(:position) { 1 } | ||||
| 
 | ||||
|       it 'does not update user role' do | ||||
|         expect(user.reload.role_id).to eq previous_role&.id | ||||
|       end | ||||
| 
 | ||||
|       it 'returns http forbidden' do | ||||
|         expect(response).to have_http_status(:forbidden) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -1,12 +1,13 @@ | |||
| require 'rails_helper' | ||||
| require 'webauthn/fake_client' | ||||
| 
 | ||||
| describe Admin::TwoFactorAuthenticationsController do | ||||
| describe Admin::Users::TwoFactorAuthenticationsController do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:user) { Fabricate(:user) } | ||||
| 
 | ||||
|   before do | ||||
|     sign_in Fabricate(:user, admin: true), scope: :user | ||||
|     sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user | ||||
|   end | ||||
| 
 | ||||
|   describe 'DELETE #destroy' do | ||||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Api::V1::Admin::AccountActionsController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:role)   { 'moderator' } | ||||
|   let(:role)   { UserRole.find_by(name: 'Moderator') } | ||||
|   let(:user)   { Fabricate(:user, role: role) } | ||||
|   let(:scopes) { 'admin:read admin:write' } | ||||
|   let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } | ||||
|  | @ -22,7 +22,7 @@ RSpec.describe Api::V1::Admin::AccountActionsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   shared_examples 'forbidden for wrong role' do |wrong_role| | ||||
|     let(:role) { wrong_role } | ||||
|     let(:role) { UserRole.find_by(name: wrong_role) } | ||||
| 
 | ||||
|     it 'returns http forbidden' do | ||||
|       expect(response).to have_http_status(403) | ||||
|  | @ -35,7 +35,7 @@ RSpec.describe Api::V1::Admin::AccountActionsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:role)   { 'moderator' } | ||||
|   let(:role)   { UserRole.find_by(name: 'Moderator') } | ||||
|   let(:user)   { Fabricate(:user, role: role) } | ||||
|   let(:scopes) { 'admin:read admin:write' } | ||||
|   let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } | ||||
|  | @ -22,7 +22,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   shared_examples 'forbidden for wrong role' do |wrong_role| | ||||
|     let(:role) { wrong_role } | ||||
|     let(:role) { UserRole.find_by(name: wrong_role) } | ||||
| 
 | ||||
|     it 'returns http forbidden' do | ||||
|       expect(response).to have_http_status(403) | ||||
|  | @ -46,7 +46,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     [ | ||||
|       [{ active: 'true', local: 'true', staff: 'true' }, [:admin_account]], | ||||
|  | @ -77,7 +77,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -91,7 +91,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -109,7 +109,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -127,7 +127,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -145,7 +145,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -163,7 +163,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -181,7 +181,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Api::V1::Admin::DomainAllowsController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:role)   { 'admin' } | ||||
|   let(:role)   { UserRole.find_by(name: 'Admin') } | ||||
|   let(:user)   { Fabricate(:user, role: role) } | ||||
|   let(:scopes) { 'admin:read admin:write' } | ||||
|   let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } | ||||
|  | @ -21,7 +21,7 @@ RSpec.describe Api::V1::Admin::DomainAllowsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   shared_examples 'forbidden for wrong role' do |wrong_role| | ||||
|     let(:role) { wrong_role } | ||||
|     let(:role) { UserRole.find_by(name: wrong_role) } | ||||
| 
 | ||||
|     it 'returns http forbidden' do | ||||
|       expect(response).to have_http_status(403) | ||||
|  | @ -36,8 +36,8 @@ RSpec.describe Api::V1::Admin::DomainAllowsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', 'moderator' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
|     it_behaves_like 'forbidden for wrong role', 'Moderator' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -58,8 +58,8 @@ RSpec.describe Api::V1::Admin::DomainAllowsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', 'moderator' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
|     it_behaves_like 'forbidden for wrong role', 'Moderator' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -79,8 +79,8 @@ RSpec.describe Api::V1::Admin::DomainAllowsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', 'moderator' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
|     it_behaves_like 'forbidden for wrong role', 'Moderator' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -99,8 +99,8 @@ RSpec.describe Api::V1::Admin::DomainAllowsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', 'moderator' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
|     it_behaves_like 'forbidden for wrong role', 'Moderator' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:role)   { 'admin' } | ||||
|   let(:role)   { UserRole.find_by(name: 'Admin') } | ||||
|   let(:user)   { Fabricate(:user, role: role) } | ||||
|   let(:scopes) { 'admin:read admin:write' } | ||||
|   let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } | ||||
|  | @ -21,7 +21,7 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   shared_examples 'forbidden for wrong role' do |wrong_role| | ||||
|     let(:role) { wrong_role } | ||||
|     let(:role) { UserRole.find_by(name: wrong_role) } | ||||
| 
 | ||||
|     it 'returns http forbidden' do | ||||
|       expect(response).to have_http_status(403) | ||||
|  | @ -36,8 +36,8 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', 'moderator' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
|     it_behaves_like 'forbidden for wrong role', 'Moderator' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -58,8 +58,8 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', 'moderator' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
|     it_behaves_like 'forbidden for wrong role', 'Moderator' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -79,8 +79,8 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', 'moderator' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
|     it_behaves_like 'forbidden for wrong role', 'Moderator' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -100,8 +100,8 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', 'moderator' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
|     it_behaves_like 'forbidden for wrong role', 'Moderator' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Api::V1::Admin::ReportsController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:role)   { 'moderator' } | ||||
|   let(:role)   { UserRole.find_by(name: 'Moderator') } | ||||
|   let(:user)   { Fabricate(:user, role: role) } | ||||
|   let(:scopes) { 'admin:read admin:write' } | ||||
|   let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } | ||||
|  | @ -22,7 +22,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   shared_examples 'forbidden for wrong role' do |wrong_role| | ||||
|     let(:role) { wrong_role } | ||||
|     let(:role) { UserRole.find_by(name: wrong_role) } | ||||
| 
 | ||||
|     it 'returns http forbidden' do | ||||
|       expect(response).to have_http_status(403) | ||||
|  | @ -35,7 +35,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -48,7 +48,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -61,7 +61,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -74,7 +74,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -87,7 +87,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  | @ -100,7 +100,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     it 'returns http success' do | ||||
|       expect(response).to have_http_status(200) | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ RSpec.describe Api::V1::ReportsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   describe 'POST #create' do | ||||
|     let!(:admin) { Fabricate(:user, admin: true) } | ||||
|     let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|     let(:scopes) { 'write:reports' } | ||||
|     let(:status) { Fabricate(:status) } | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ require 'rails_helper' | |||
| RSpec.describe Api::V2::Admin::AccountsController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   let(:role)   { 'moderator' } | ||||
|   let(:role)   { UserRole.find_by(name: 'Moderator') } | ||||
|   let(:user)   { Fabricate(:user, role: role) } | ||||
|   let(:scopes) { 'admin:read admin:write' } | ||||
|   let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } | ||||
|  | @ -22,7 +22,7 @@ RSpec.describe Api::V2::Admin::AccountsController, type: :controller do | |||
|   end | ||||
| 
 | ||||
|   shared_examples 'forbidden for wrong role' do |wrong_role| | ||||
|     let(:role) { wrong_role } | ||||
|     let(:role) { UserRole.find_by(name: wrong_role) } | ||||
| 
 | ||||
|     it 'returns http forbidden' do | ||||
|       expect(response).to have_http_status(403) | ||||
|  | @ -46,7 +46,7 @@ RSpec.describe Api::V2::Admin::AccountsController, type: :controller do | |||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'forbidden for wrong scope', 'write:statuses' | ||||
|     it_behaves_like 'forbidden for wrong role', 'user' | ||||
|     it_behaves_like 'forbidden for wrong role', '' | ||||
| 
 | ||||
|     [ | ||||
|       [{ status: 'active', origin: 'local', permissions: 'staff' }, [:admin_account]], | ||||
|  |  | |||
|  | @ -183,70 +183,6 @@ describe ApplicationController, type: :controller do | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'require_admin!' do | ||||
|     controller do | ||||
|       before_action :require_admin! | ||||
| 
 | ||||
|       def success | ||||
|         head 200 | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     before do | ||||
|       routes.draw { get 'success' => 'anonymous#success' } | ||||
|     end | ||||
| 
 | ||||
|     it 'returns a 403 if current user is not admin' do | ||||
|       sign_in(Fabricate(:user, admin: false)) | ||||
|       get 'success' | ||||
|       expect(response).to have_http_status(403) | ||||
|     end | ||||
| 
 | ||||
|     it 'returns a 403 if current user is only a moderator' do | ||||
|       sign_in(Fabricate(:user, moderator: true)) | ||||
|       get 'success' | ||||
|       expect(response).to have_http_status(403) | ||||
|     end | ||||
| 
 | ||||
|     it 'does nothing if current user is admin' do | ||||
|       sign_in(Fabricate(:user, admin: true)) | ||||
|       get 'success' | ||||
|       expect(response).to have_http_status(200) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'require_staff!' do | ||||
|     controller do | ||||
|       before_action :require_staff! | ||||
| 
 | ||||
|       def success | ||||
|         head 200 | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     before do | ||||
|       routes.draw { get 'success' => 'anonymous#success' } | ||||
|     end | ||||
| 
 | ||||
|     it 'returns a 403 if current user is not admin or moderator' do | ||||
|       sign_in(Fabricate(:user, admin: false, moderator: false)) | ||||
|       get 'success' | ||||
|       expect(response).to have_http_status(403) | ||||
|     end | ||||
| 
 | ||||
|     it 'does nothing if current user is moderator' do | ||||
|       sign_in(Fabricate(:user, moderator: true)) | ||||
|       get 'success' | ||||
|       expect(response).to have_http_status(200) | ||||
|     end | ||||
| 
 | ||||
|     it 'does nothing if current user is admin' do | ||||
|       sign_in(Fabricate(:user, admin: true)) | ||||
|       get 'success' | ||||
|       expect(response).to have_http_status(200) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'forbidden' do | ||||
|     controller do | ||||
|       def route_forbidden | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ RSpec.describe Disputes::AppealsController, type: :controller do | |||
| 
 | ||||
|   before { sign_in current_user, scope: :user } | ||||
| 
 | ||||
|   let!(:admin) { Fabricate(:user, admin: true) } | ||||
|   let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } | ||||
| 
 | ||||
|   describe '#create' do | ||||
|     let(:current_user) { Fabricate(:user) } | ||||
|  |  | |||
|  | @ -7,30 +7,30 @@ describe InvitesController do | |||
|     sign_in user | ||||
|   end | ||||
| 
 | ||||
|   around do |example| | ||||
|     min_invite_role = Setting.min_invite_role | ||||
|     example.run | ||||
|     Setting.min_invite_role = min_invite_role | ||||
|   end | ||||
| 
 | ||||
|   describe 'GET #index' do | ||||
|     subject { get :index } | ||||
| 
 | ||||
|     let(:user) { Fabricate(:user, moderator: false, admin: false) } | ||||
|     let(:user) { Fabricate(:user) } | ||||
|     let!(:invite) { Fabricate(:invite, user: user) } | ||||
| 
 | ||||
|     context 'when user is a staff' do | ||||
|     context 'when everyone can invite' do | ||||
|       before do | ||||
|         UserRole.everyone.update(permissions: UserRole.everyone.permissions | UserRole::FLAGS[:invite_users]) | ||||
|       end | ||||
| 
 | ||||
|       it 'renders index page' do | ||||
|         Setting.min_invite_role = 'user' | ||||
|         expect(subject).to render_template :index | ||||
|         expect(assigns(:invites)).to include invite | ||||
|         expect(assigns(:invites).count).to eq 1 | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when user is not a staff' do | ||||
|     context 'when not everyone can invite' do | ||||
|       before do | ||||
|         UserRole.everyone.update(permissions: UserRole.everyone.permissions & ~UserRole::FLAGS[:invite_users]) | ||||
|       end | ||||
| 
 | ||||
|       it 'returns 403' do | ||||
|         Setting.min_invite_role = 'modelator' | ||||
|         expect(subject).to have_http_status 403 | ||||
|       end | ||||
|     end | ||||
|  | @ -39,8 +39,12 @@ describe InvitesController do | |||
|   describe 'POST #create' do | ||||
|     subject { post :create, params: { invite: { max_uses: '10', expires_in: 1800 } } } | ||||
| 
 | ||||
|     context 'when user is an admin' do | ||||
|       let(:user) { Fabricate(:user, moderator: false, admin: true) } | ||||
|     context 'when everyone can invite' do | ||||
|       let(:user) { Fabricate(:user) } | ||||
| 
 | ||||
|       before do | ||||
|         UserRole.everyone.update(permissions: UserRole.everyone.permissions | UserRole::FLAGS[:invite_users]) | ||||
|       end | ||||
| 
 | ||||
|       it 'succeeds to create a invite' do | ||||
|         expect { subject }.to change { Invite.count }.by(1) | ||||
|  | @ -49,8 +53,12 @@ describe InvitesController do | |||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'when user is not an admin' do | ||||
|       let(:user) { Fabricate(:user, moderator: true, admin: false) } | ||||
|     context 'when not everyone can invite' do | ||||
|       let(:user) { Fabricate(:user) } | ||||
| 
 | ||||
|       before do | ||||
|         UserRole.everyone.update(permissions: UserRole.everyone.permissions & ~UserRole::FLAGS[:invite_users]) | ||||
|       end | ||||
| 
 | ||||
|       it 'returns 403' do | ||||
|         expect(subject).to have_http_status 403 | ||||
|  | @ -61,8 +69,8 @@ describe InvitesController do | |||
|   describe 'DELETE #create' do | ||||
|     subject { delete :destroy, params: { id: invite.id } } | ||||
| 
 | ||||
|     let(:user) { Fabricate(:user) } | ||||
|     let!(:invite) { Fabricate(:invite, user: user, expires_at: nil) } | ||||
|     let(:user) { Fabricate(:user, moderator: false, admin: true) } | ||||
| 
 | ||||
|     it 'expires invite' do | ||||
|       expect(subject).to redirect_to invites_path | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue