require 'rails_helper' # Perfis de acesso: quem entra na tela, e as travas que impedem o ADM de se # trancar para fora do próprio sistema. RSpec.describe 'Admin::PerfisAcesso', type: :request do # Perfil com acesso total, para o usuário que administra nos testes. let(:perfil_admin) { create(:perfil_acesso, nome: 'Administrador', permissoes: Permissao.chaves) } let(:administrador) { create(:admin, perfil_acesso: perfil_admin) } describe 'quem entra' do it 'exige login' do get admin_perfis_path expect(response).to redirect_to(new_user_session_path) end it 'nega quem não tem admin.perfis' do sign_in create(:gerente, perfil_acesso: create(:perfil_acesso, permissoes: ['consolidacao.ver'])) get admin_perfis_path expect(response).to have_http_status(:redirect) end it 'permite quem tem admin.perfis' do sign_in administrador get admin_perfis_path expect(response).to have_http_status(:ok) end end describe 'criar e editar' do before { sign_in administrador } it 'cria perfil só com as chaves do catálogo' do post admin_perfis_path, params: { perfil_acesso: { nome: 'Financeiro', descricao: 'Paga', ativo: '1', permissoes: ['consolidacao.ver', 'inventada.chave'] } } perfil = PerfilAcesso.find_by(nome: 'Financeiro') expect(perfil.permissoes).to eq(['consolidacao.ver']) end it 'desmarcar tudo realmente zera as permissões' do perfil = create(:perfil_acesso, permissoes: ['consolidacao.ver']) # O form manda um valor vazio quando nenhuma caixa está marcada; sem ele o # parâmetro sumiria e "desmarcar tudo" viraria "não mexeu". patch admin_perfil_path(perfil), params: { perfil_acesso: { nome: perfil.nome, ativo: '1', permissoes: [''] } } expect(perfil.reload.permissoes).to eq([]) end end describe 'trava do último administrador' do before { sign_in administrador } it 'impede tirar admin.perfis do único perfil que administra' do patch admin_perfil_path(perfil_admin), params: { perfil_acesso: { nome: perfil_admin.nome, ativo: '1', permissoes: Permissao.chaves - ['admin.perfis'] } } expect(response).to have_http_status(:unprocessable_entity) expect(perfil_admin.reload.permissoes).to include('admin.perfis') end it 'libera quando outra pessoa mantém o acesso' do outro = create(:perfil_acesso, nome: 'Admin 2', permissoes: Permissao.chaves) create(:admin, perfil_acesso: outro) patch admin_perfil_path(perfil_admin), params: { perfil_acesso: { nome: perfil_admin.nome, ativo: '1', permissoes: Permissao.chaves - ['admin.perfis'] } } expect(perfil_admin.reload.permissoes).not_to include('admin.perfis') end end describe 'exclusão' do before { sign_in administrador } it 'não exclui perfil de sistema' do perfil = create(:perfil_acesso, sistema: true) expect { delete admin_perfil_path(perfil) }.not_to change(PerfilAcesso, :count) end it 'não exclui perfil em uso' do perfil = create(:perfil_acesso) create(:operador, perfil_acesso: perfil) expect { delete admin_perfil_path(perfil) }.not_to change(PerfilAcesso, :count) end it 'exclui perfil livre' do perfil = create(:perfil_acesso) expect { delete admin_perfil_path(perfil) }.to change(PerfilAcesso, :count).by(-1) end end end