84 lines
3.3 KiB
Ruby
84 lines
3.3 KiB
Ruby
require 'rails_helper'
|
|
|
|
# O resolvedor é o que permite escrever qualquer variável numa mensagem sem que o
|
|
# gatilho conheça essa variável. As travas aqui protegem duas coisas: não
|
|
# sobrescrever o contexto real do acontecimento, e nunca derrubar um disparo.
|
|
RSpec.describe Notificacao::ResolvedorVariaveis do
|
|
describe '.usadas' do
|
|
it 'acha variáveis dentro dos blocos aninhados do template' do
|
|
blocos = [
|
|
{ 'tipo' => 'cabecalho', 'titulo' => 'Olá {{contato}}' },
|
|
{ 'tipo' => 'tabela', 'linhas' => [{ 'rotulo' => 'Valor', 'valor' => '{{valor}}' }] }
|
|
]
|
|
|
|
expect(described_class.usadas([blocos, 'Assunto {{empresa}}']))
|
|
.to match_array(%w[contato valor empresa])
|
|
end
|
|
end
|
|
|
|
describe '.completar' do
|
|
it 'não sobrescreve o que o gatilho já mandou' do
|
|
dados = described_class.completar(['{{empresa}} {{valor}}'],
|
|
{ 'empresa' => 'Contexto Ltda', 'valor' => 'R$ 10,00' })
|
|
|
|
expect(dados['empresa']).to eq('Contexto Ltda')
|
|
expect(dados['valor']).to eq('R$ 10,00')
|
|
end
|
|
|
|
it 'resolve variável de sistema' do
|
|
dados = described_class.completar(['{{data}}'], {})
|
|
expect(dados['data']).to eq(Date.current.strftime('%d/%m/%Y'))
|
|
end
|
|
|
|
it 'resolve variável personalizada do ADM' do
|
|
create(:variavel_personalizada, chave: 'telefone_suporte', valor: '(11) 4002-8922')
|
|
|
|
dados = described_class.completar(['Ligue {{telefone_suporte}}'], {})
|
|
expect(dados['telefone_suporte']).to eq('(11) 4002-8922')
|
|
end
|
|
|
|
it 'ignora variável desativada (a mensagem sai sem ela)' do
|
|
create(:variavel_personalizada, chave: 'promo', valor: 'X', ativo: false)
|
|
|
|
expect(described_class.completar(['{{promo}}'], {})).not_to have_key('promo')
|
|
end
|
|
|
|
it 'variável inexistente não vira valor inventado' do
|
|
expect(described_class.completar(['{{nao_existe}}'], {})).not_to have_key('nao_existe')
|
|
end
|
|
|
|
# Notificação não pode derrubar fechamento: se a consulta falhar, o disparo
|
|
# segue e a variável sai vazia.
|
|
it 'engole erro de uma variável de dados' do
|
|
allow(Entrega).to receive(:atendidas).and_raise(ActiveRecord::StatementInvalid, 'boom')
|
|
|
|
expect { described_class.completar(['{{entregas_mes}}'], {}) }.not_to raise_error
|
|
end
|
|
|
|
it 'só consulta o banco para a variável realmente escrita' do
|
|
expect(Entrega).not_to receive(:atendidas)
|
|
|
|
described_class.completar(['Sem número aqui, só {{empresa}}'], {})
|
|
end
|
|
end
|
|
|
|
describe Notificacao::CatalogoVariaveis do
|
|
it 'marca a variável de outro gatilho como não aplicável (em vez de escondê-la)' do
|
|
expect(described_class.aplicavel?('valor', 'pagamento_efetuado')).to be(true)
|
|
expect(described_class.aplicavel?('valor', 'operacao_alterada')).to be(false)
|
|
end
|
|
|
|
it 'variável de dados e de sistema valem em qualquer gatilho' do
|
|
expect(described_class.aplicavel?('entregas_mes', 'manual')).to be(true)
|
|
expect(described_class.aplicavel?('empresa', 'operacao_alterada')).to be(true)
|
|
end
|
|
|
|
it 'inclui as variáveis criadas pelo ADM' do
|
|
create(:variavel_personalizada, chave: 'horario_atendimento', valor: '8h às 18h')
|
|
|
|
expect(described_class.todas).to have_key('horario_atendimento')
|
|
expect(described_class.por_origem[:personalizada].map { |v| v[:chave] }).to include('horario_atendimento')
|
|
end
|
|
end
|
|
end
|