Files
Reem-Notas/spec/models/consolidacao_motorista_spec.rb

78 lines
3.3 KiB
Ruby

require 'rails_helper'
RSpec.describe ConsolidacaoMotorista, type: :model do
describe 'validações' do
it 'exige motorista_nome' do
expect(build(:consolidacao_motorista, motorista_nome: nil)).not_to be_valid
end
it 'não permite o mesmo motorista duas vezes na consolidação' do
consolidacao = create(:consolidacao)
create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
dup = build(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
expect(dup).not_to be_valid
end
end
describe '#recalcular_valor (fonte única: valor_aplicado)' do
let(:consolidacao) { create(:consolidacao) }
before do
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
tipo: :entrega_normal, valor_aplicado: 15)
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
tipo: :bonus, valor_aplicado: 10)
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
tipo: :desconto, valor_aplicado: 5)
end
it 'soma usando valor_aplicado e trata desconto como negativo' do
cm = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
# 15 + 10 - 5 = 20
expect(cm.valor_total).to eq(20)
end
it 'NÃO recalcula pelos preços atuais de Configuracao' do
# Mesmo que os preços de Configuracao mudem, o total usa o valor_aplicado capturado.
allow(Configuracao).to receive(:preco_entrega).and_return(999)
cm = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
expect(cm.valor_total).to eq(20)
end
it 'considera apenas as entregas do próprio motorista' do
create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Maria',
tipo: :entrega_normal, valor_aplicado: 100)
cm = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
expect(cm.valor_total).to eq(20)
end
end
describe 'arquivamento (reversível)' do
let(:consolidacao) { create(:consolidacao) }
let(:gerente) { create(:gerente) }
let(:cm) { create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao') }
it 'arquivar!/desarquivar! alternam arquivado? e registram quem arquivou' do
expect(cm.arquivado?).to be false
cm.arquivar!(gerente)
expect(cm.reload.arquivado?).to be true
expect(cm.arquivado_por).to eq(gerente.id)
expect(cm.arquivado_em).to be_present
cm.desarquivar!(gerente)
expect(cm.reload.arquivado?).to be false
expect(cm.arquivado_em).to be_nil
end
it 'scopes ativos/arquivados separam corretamente' do
ativo = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Ativo')
arquivado = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Arquivado')
arquivado.arquivar!(gerente)
expect(ConsolidacaoMotorista.ativos).to include(ativo)
expect(ConsolidacaoMotorista.ativos).not_to include(arquivado)
expect(ConsolidacaoMotorista.arquivados).to contain_exactly(arquivado)
end
end
end