Files
Reem-Notas/spec/requests/admin/configuracao_notificacoes_spec.rb

135 lines
4.7 KiB
Ruby

require 'rails_helper'
RSpec.describe 'Admin::ConfiguracaoNotificacoes', type: :request do
let(:config) { ConfiguracaoNotificacao.instancia }
def patch_config(atributos, acao: 'salvar')
patch admin_configuracao_notificacao_path,
params: { acao: acao, configuracao_notificacao: atributos }
end
describe 'permissão' do
it 'exige login' do
get admin_configuracao_notificacao_path
expect(response).to redirect_to(new_user_session_path)
end
it 'bloqueia gerente (só admin mexe em credenciais de envio)' do
sign_in create(:gerente)
get admin_configuracao_notificacao_path
expect(response).to redirect_to(root_path)
expect(flash[:alert]).to match(/permissão/i)
end
it 'bloqueia gerente também no update' do
sign_in create(:gerente)
patch_config(smtp_address: 'smtp.invasor.com')
expect(response).to redirect_to(root_path)
expect(config.reload.smtp_address).not_to eq('smtp.invasor.com')
end
it 'libera admin' do
sign_in create(:admin)
get admin_configuracao_notificacao_path
expect(response).to have_http_status(:ok)
end
end
context 'como admin' do
let(:admin) { create(:admin) }
before { sign_in admin }
it 'salva as configurações' do
patch_config(smtp_address: 'smtp.gmail.com', smtp_port: 465,
email_admin: 'Chefe@Reem.com.br', whatsapp_admin: '(11) 92005-1157')
expect(response).to redirect_to(admin_configuracao_notificacao_path)
config.reload
expect(config.smtp_address).to eq('smtp.gmail.com')
expect(config.smtp_port).to eq(465)
expect(config.email_admin).to eq('chefe@reem.com.br')
expect(config.whatsapp_admin).to eq('+5511920051157')
end
it 'mantém a senha gravada quando o campo vem em branco' do
config.update!(smtp_password: 'senha-original')
patch_config(smtp_address: 'smtp.outro.com', smtp_password: '')
expect(config.reload.smtp_password).to eq('senha-original')
end
it 'substitui a senha quando o campo é preenchido' do
config.update!(smtp_password: 'senha-original')
patch_config(smtp_password: 'senha-nova')
expect(config.reload.smtp_password).to eq('senha-nova')
end
it 'reexibe o formulário quando ativa o e-mail sem credenciais' do
patch_config(smtp_ativo: '1', smtp_address: '', smtp_username: '')
expect(response).to have_http_status(:unprocessable_entity)
expect(config.reload.smtp_ativo).to be(false)
end
it 'registra auditoria sem vazar a senha nem o token' do
patch_config(smtp_address: 'smtp.gmail.com', smtp_password: 'super-secreta',
twilio_auth_token: 'token-secreto')
log = AuditoriaLog.where(entidade: 'ConfiguracaoNotificacao').last
expect(log.acao).to eq('editar_notificacoes')
expect(log.user_id).to eq(admin.id)
serializado = [log.dados_anteriores, log.dados_novos].to_json
expect(serializado).not_to include('super-secreta')
expect(serializado).not_to include('token-secreto')
expect(log.dados_novos['smtp_password_definida']).to be(true)
end
describe 'botões de teste' do
it 'avisa quando o e-mail administrativo não foi preenchido' do
patch_config({ email_admin: '' }, acao: 'testar_email')
expect(response).to redirect_to(admin_configuracao_notificacao_path)
expect(flash[:alert]).to match(/E-mail do administrador/i)
end
it 'avisa quando o SMTP não está pronto' do
patch_config({ email_admin: 'chefe@reem.com.br' }, acao: 'testar_email')
expect(flash[:alert]).to match(/Ativar envio de e-mail/i)
end
it 'envia o e-mail de teste quando o SMTP está configurado' do
resultado = Notificacao::Resultado.sucesso('E-mail de teste enviado.')
expect(Notificacao::TesteEmail).to receive(:new).and_return(double(executar: resultado))
patch_config({ email_admin: 'chefe@reem.com.br' }, acao: 'testar_email')
expect(flash[:notice]).to eq('E-mail de teste enviado.')
end
it 'avisa quando o WhatsApp administrativo não foi preenchido' do
patch_config({ whatsapp_admin: '' }, acao: 'testar_whatsapp')
expect(flash[:alert]).to match(/WhatsApp do administrador/i)
end
it 'reporta o erro traduzido do Twilio no flash' do
resultado = Notificacao::Resultado.falha('Sandbox exige opt-in.', '[63015] detalhe')
expect(Notificacao::TesteWhatsapp).to receive(:new).and_return(double(executar: resultado))
patch_config({ whatsapp_admin: '11 920051157' }, acao: 'testar_whatsapp')
expect(flash[:alert]).to include('Sandbox exige opt-in.')
expect(flash[:alert]).to include('63015')
end
end
end
end