require 'rails_helper' # As três falhas de acesso que existiam antes dos perfis. Cada exemplo aqui é um # furo real que foi fechado — se algum voltar a passar "verde ao contrário", o # sistema regrediu para o estado em que qualquer usuário virava admin. RSpec.describe 'Controle de acesso', type: :request do describe 'auto-promoção a administrador' do it 'ignora role e perfil enviados por quem edita a PRÓPRIA ficha' do operador = create(:operador) perfil_total = create(:perfil_acesso, permissoes: Permissao.chaves) sign_in operador patch admin_usuario_path(operador), params: { user: { nome: 'Nome Novo', role: 'admin', perfil_acesso_id: perfil_total.id } } operador.reload expect(operador.nome).to eq('Nome Novo') # o que ele PODE mudar, mudou expect(operador.role).to eq('operador') # o que ele não pode, não mudou expect(operador.perfil_acesso_id).to be_nil expect(operador.pode?('admin.usuarios_gerenciar')).to be(false) end it 'quem administra usuários continua podendo trocar o perfil de outra pessoa' do perfil_admin = create(:perfil_acesso, permissoes: Permissao.chaves) admin = create(:admin, perfil_acesso: perfil_admin) alvo = create(:operador) novo = create(:perfil_acesso, nome: 'Financeiro', permissoes: ['consolidacao.ver']) sign_in admin patch admin_usuario_path(alvo), params: { user: { nome: alvo.nome, perfil_acesso_id: novo.id } } expect(alvo.reload.perfil_acesso_id).to eq(novo.id) end end describe 'papel externo no dashboard' do it 'entra no dashboard mas não vê custo nem pagamento' do sign_in create(:externo) get dashboard_path expect(response).to have_http_status(:ok) expect(response.body).not_to include('Consolidado / Pago') expect(response.body).not_to include('Ticket médio') end it 'não baixa o relatório financeiro nem abre as entregas em aberto' do sign_in create(:externo) get dashboard_relatorio_financeiro_path expect(response).to have_http_status(:redirect) get dashboard_pendentes_path expect(response).to have_http_status(:redirect) end it 'gerente continua vendo o financeiro' do sign_in create(:gerente) get dashboard_path expect(response.body).to include('Consolidado / Pago') end end describe 'conta desativada' do it 'não faz login por e-mail e senha' do usuario = create(:gerente, ativo: false, password: 'Gade@2026!') post user_session_path, params: { user: { email: usuario.email, password: 'Gade@2026!' } } expect(response).not_to redirect_to(dashboard_path) expect(controller.current_user).to be_nil end end describe 'sem nenhuma permissão' do it 'cai na tela de sem-acesso em vez de entrar em loop com a raiz' do usuario = create(:operador, perfil_acesso: create(:perfil_acesso, permissoes: [])) sign_in usuario get dashboard_path expect(response).to redirect_to(sem_acesso_path) get sem_acesso_path expect(response).to have_http_status(:ok) expect(response.body).to include('não tem acesso') end end end