require 'rails_helper' RSpec.describe Notificacao::Gatilhos do before { allow(Notificacao::Despachante).to receive(:disparar_gatilho) } describe '.valor_alterado' do let(:consolidacao) { create(:consolidacao, status: :finalizada) } let(:cm) { create(:consolidacao_motorista, consolidacao: consolidacao, valor_total: 5060.0) } # Em rascunho o valor muda a cada clique do wizard — avisar ali seria spam. it 'não dispara enquanto a consolidação é rascunho' do rascunho = create(:consolidacao, status: :rascunho) cm_rasc = create(:consolidacao_motorista, consolidacao: rascunho, valor_total: 100.0) described_class.valor_alterado(rascunho, cm_rasc, anterior: 50.0) expect(Notificacao::Despachante).not_to have_received(:disparar_gatilho) end it 'não dispara quando o valor não mudou' do described_class.valor_alterado(consolidacao, cm, anterior: 5060.0) expect(Notificacao::Despachante).not_to have_received(:disparar_gatilho) end it 'descreve a mudança em {{o_que_mudou}}' do described_class.valor_alterado(consolidacao, cm, anterior: 4900.0) expect(Notificacao::Despachante).to have_received(:disparar_gatilho) do |args| expect(args[:gatilho]).to eq('valor_alterado') expect(args[:dados]['o_que_mudou']).to eq('Valor passou de R$ 4.900,00 para R$ 5.060,00') expect(args[:dados]['valor']).to eq('R$ 5.060,00') end end it 'não levanta quando algo dá errado — não pode travar um fechamento' do allow(Notificacao::Despachante).to receive(:disparar_gatilho).and_raise(StandardError, 'boom') expect { described_class.valor_alterado(consolidacao, cm, anterior: 1.0) }.not_to raise_error end end describe '.operacao_alterada' do it 'monta as variáveis do gatilho' do described_class.operacao_alterada(operacao: 'UBS NORTE AGO 2026', o_que_mudou: '3 notas na operação a mais', nf: '85382') expect(Notificacao::Despachante).to have_received(:disparar_gatilho) do |args| expect(args[:gatilho]).to eq('operacao_alterada') expect(args[:dados]['operacao']).to eq('UBS NORTE AGO 2026') expect(args[:dados]['nf']).to eq('85382') end end end # Toda variável que o editor anuncia precisa de par aqui: anunciada e não # preenchida sai vazia na mensagem, o que é pior do que não existir. describe 'cobertura das variáveis anunciadas no editor' do it 'valor_alterado preenche tudo que Variaveis oferece' do consolidacao = create(:consolidacao, status: :finalizada) cm = create(:consolidacao_motorista, consolidacao: consolidacao, valor_total: 10.0) described_class.valor_alterado(consolidacao, cm, anterior: 1.0) expect(Notificacao::Despachante).to have_received(:disparar_gatilho) do |args| esperadas = Notificacao::Variaveis.nomes('valor_alterado') - ['contato'] # vem por destinatário expect(args[:dados].keys).to include(*esperadas) end end end end