require 'rails_helper' RSpec.describe ConsolidacaoVeiculo, type: :model do let(:consolidacao) { create(:consolidacao) } describe 'validações' do it 'exige motorista_nome e vehicle' do expect(build(:consolidacao_veiculo, motorista_nome: nil)).not_to be_valid expect(build(:consolidacao_veiculo, vehicle: nil)).not_to be_valid end it 'não permite o mesmo veículo duas vezes para o mesmo motorista' do create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1') dup = build(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1') expect(dup).not_to be_valid end end describe '#recalcular_valor (before_save)' do before do create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao', vehicle: 'GADE_1', tipo: :entrega_normal, valor_aplicado: 15) create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao', vehicle: 'GADE_1', tipo: :desconto, valor_aplicado: 5) create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao', vehicle: 'GADE_2', tipo: :entrega_normal, valor_aplicado: 99) end it 'soma só os pilares do veículo e trata desconto como negativo' do cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'Joao', vehicle: 'GADE_1') expect(cv.valor_total).to eq(10) # 15 - 5 (GADE_2 fica de fora) end it 'o bucket "(sem veículo)" casa pilares com vehicle NULL/vazio' do create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao', vehicle: nil, tipo: :bonus, valor_aplicado: 7) cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'Joao', vehicle: ConsolidacaoVeiculo::SEM_VEICULO) expect(cv.valor_total).to eq(7) end end describe 'fechamento e arquivamento' do let(:gerente) { create(:gerente) } it 'fecha e reabre registrando quem/quando' do cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1') expect(cv).not_to be_fechado cv.fechar!(gerente) cv.reload expect(cv).to be_fechado expect(cv.fechado_por).to eq(gerente.id) expect(cv.fechado_em).to be_present cv.reabrir!(gerente) expect(cv.reload).not_to be_fechado end it 'arquiva e desarquiva, e os escopos separam os estados' do aberto = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1') fechado = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'B', vehicle: 'GADE_2') arquivado = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'C', vehicle: 'GADE_3') fechado.fechar!(gerente) arquivado.arquivar!(gerente) expect(ConsolidacaoVeiculo.fechados).to include(fechado) expect(ConsolidacaoVeiculo.fechados).not_to include(aberto) expect(ConsolidacaoVeiculo.abertos).to include(aberto) expect(ConsolidacaoVeiculo.ativos).not_to include(arquivado) expect(ConsolidacaoVeiculo.arquivados).to contain_exactly(arquivado) end end end