70 lines
2.7 KiB
Ruby
70 lines
2.7 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe EventoNotificacao do
|
|
it 'gera a chave a partir do nome quando não informada' do
|
|
evento = described_class.create!(nome: 'Aviso da Diretoria', gatilho: 'manual')
|
|
expect(evento.chave).to eq('aviso_da_diretoria')
|
|
end
|
|
|
|
it 'exige dia da semana na frequência semanal' do
|
|
evento = build(:evento_notificacao, gatilho: 'agendado', frequencia: 'semanal', dia_semana: nil)
|
|
expect(evento).not_to be_valid
|
|
expect(evento.errors[:dia_semana]).to be_present
|
|
end
|
|
|
|
it 'evento de sistema não é apagável' do
|
|
expect(build(:evento_notificacao, sistema: true).apagavel?).to be(false)
|
|
expect(build(:evento_notificacao, sistema: false).apagavel?).to be(true)
|
|
end
|
|
|
|
describe '#destinatarios' do
|
|
let(:evento) { create(:evento_notificacao) }
|
|
let(:diretoria) { create(:grupo_contato) }
|
|
let(:operacao) { create(:grupo_contato) }
|
|
|
|
it 'junta os contatos de todos os grupos assinantes, sem repetir' do
|
|
a = create(:contato, grupo_contato: diretoria, telefone: '11 92005-1157')
|
|
b = create(:contato, grupo_contato: operacao, telefone: '11 93005-1157')
|
|
create(:grupo_evento_assinatura, grupo_contato: diretoria, evento_notificacao: evento)
|
|
create(:grupo_evento_assinatura, grupo_contato: operacao, evento_notificacao: evento)
|
|
|
|
expect(evento.reload.destinatarios('whatsapp')).to contain_exactly(a, b)
|
|
end
|
|
|
|
it 'respeita o canal da assinatura' do
|
|
so_email = create(:contato, grupo_contato: diretoria, telefone: nil, email: 'dir@reem.com')
|
|
create(:grupo_evento_assinatura, grupo_contato: diretoria, evento_notificacao: evento, canal: 'email')
|
|
|
|
expect(evento.reload.destinatarios('email')).to contain_exactly(so_email)
|
|
expect(evento.reload.destinatarios('whatsapp')).to be_empty
|
|
end
|
|
|
|
it 'ignora assinatura desativada e contato desativado' do
|
|
create(:contato, grupo_contato: diretoria, ativo: false)
|
|
create(:grupo_evento_assinatura, grupo_contato: diretoria, evento_notificacao: evento, ativo: false)
|
|
|
|
expect(evento.reload.destinatarios('whatsapp')).to be_empty
|
|
end
|
|
end
|
|
|
|
describe '#vencido?' do
|
|
let(:evento) do
|
|
create(:evento_notificacao, gatilho: 'agendado', frequencia: 'diaria', hora: 8)
|
|
end
|
|
|
|
it 'vence depois da hora e só uma vez por dia' do
|
|
manha = Time.zone.local(2026, 8, 24, 9, 0)
|
|
expect(evento.vencido?(manha)).to be(true)
|
|
|
|
evento.update!(ultimo_disparo_em: Time.zone.local(2026, 8, 24, 8, 5))
|
|
expect(evento.vencido?(manha)).to be(false)
|
|
|
|
expect(evento.vencido?(Time.zone.local(2026, 8, 25, 9, 0))).to be(true)
|
|
end
|
|
|
|
it 'não vence antes da hora' do
|
|
expect(evento.vencido?(Time.zone.local(2026, 8, 24, 7, 0))).to be(false)
|
|
end
|
|
end
|
|
end
|