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 end