68 lines
2.7 KiB
Ruby
68 lines
2.7 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe MensagemTemplate do
|
|
let(:evento) { create(:evento_notificacao, gatilho: 'pagamento_efetuado') }
|
|
|
|
def montar(blocos, **extra)
|
|
described_class.new({ evento_notificacao: evento, canal: 'whatsapp', blocos: blocos }.merge(extra))
|
|
end
|
|
|
|
# `blocos` vem de um hidden preenchido por JavaScript — ou seja, de fora.
|
|
describe 'limpeza dos blocos na gravação' do
|
|
it 'descarta tipo fora do catálogo' do
|
|
t = montar([{ 'tipo' => 'iframe', 'texto' => 'x' }, { 'tipo' => 'texto', 'texto' => 'ok' }])
|
|
t.validate
|
|
expect(t.blocos.map { |b| b['tipo'] }).to eq(['texto'])
|
|
end
|
|
|
|
it 'descarta campo que o tipo não tem' do
|
|
t = montar([{ 'tipo' => 'divisor', 'onload' => 'alert(1)' }])
|
|
t.validate
|
|
expect(t.blocos.first.keys).to eq(['tipo'])
|
|
end
|
|
|
|
it 'descarta linha de tabela sem rótulo nem valor' do
|
|
t = montar([{ 'tipo' => 'tabela', 'linhas' => [{ 'rotulo' => '', 'valor' => '' },
|
|
{ 'rotulo' => 'Valor', 'valor' => '10' }] }])
|
|
t.validate
|
|
expect(t.blocos.first['linhas'].size).to eq(1)
|
|
end
|
|
|
|
it 'limita a quantidade de blocos' do
|
|
t = montar(Array.new(60) { { 'tipo' => 'divisor' } })
|
|
t.validate
|
|
expect(t.blocos.size).to eq(described_class::MAX_BLOCOS)
|
|
end
|
|
|
|
it 'aceita blocos com chave símbolo (vindos de código, não do form)' do
|
|
t = montar([{ tipo: 'texto', texto: 'oi' }])
|
|
t.validate
|
|
expect(t.blocos).to eq([{ 'tipo' => 'texto', 'texto' => 'oi' }])
|
|
end
|
|
end
|
|
|
|
it 'exige assunto no e-mail com conteúdo' do
|
|
t = montar([{ 'tipo' => 'texto', 'texto' => 'oi' }], canal: 'email', assunto: '')
|
|
expect(t).not_to be_valid
|
|
expect(t.errors[:assunto]).to be_present
|
|
end
|
|
|
|
# Template ativo e vazio mandaria mensagem em branco — pior que o texto padrão.
|
|
it 'template vazio não é utilizável mesmo estando ativo' do
|
|
expect(montar([], ativo: true).utilizavel?).to be(false)
|
|
expect(montar([{ 'tipo' => 'texto', 'texto' => 'oi' }], ativo: true).utilizavel?).to be(true)
|
|
expect(montar([{ 'tipo' => 'texto', 'texto' => 'oi' }], ativo: false).utilizavel?).to be(false)
|
|
end
|
|
|
|
it 'não deixa dois templates do mesmo canal no mesmo evento' do
|
|
described_class.create!(evento_notificacao: evento, canal: 'whatsapp', blocos: [])
|
|
duplicado = described_class.new(evento_notificacao: evento, canal: 'whatsapp', blocos: [])
|
|
expect(duplicado).not_to be_valid
|
|
end
|
|
|
|
it 'preview usa os valores de amostra do gatilho' do
|
|
t = montar([{ 'tipo' => 'texto', 'texto' => 'Valor: {{valor}}' }])
|
|
expect(t.preview).to include(Notificacao::Variaveis.amostra('pagamento_efetuado')['valor'])
|
|
end
|
|
end
|