78 lines
3.3 KiB
Ruby
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
|