Files
Reem-Notas/spec/requests/totais_por_motorista_spec.rb

121 lines
4.8 KiB
Ruby

require 'rails_helper'
# Modo de visualização "Por motorista" (/consolidacoes?visao=motoristas) e o
# painel do motorista: quem entra, o que a tela soma e o drill-down que responde
# "de onde vem esse valor".
RSpec.describe 'Visão por motorista', type: :request do
def consolidacao_finalizada(motorista:, valor:, nome: 'Fechamento Junho')
c = create(:consolidacao, nome: nome, status: :finalizada,
data_inicio: Date.new(2026, 6, 1), data_fim: Date.new(2026, 6, 30))
create(:consolidacao_entrega, consolidacao: c, motorista_nome: motorista, valor_aplicado: valor)
create(:consolidacao_motorista, consolidacao: c, motorista_nome: motorista)
c
end
let(:periodo) { { inicio: '2026-06-01', fim: '2026-06-30' } }
describe 'admin — /consolidacoes?visao=motoristas' do
it 'bloqueia motorista (Pundit)' do
sign_in create(:motorista)
get consolidacoes_path(visao: 'motoristas')
expect(response).to redirect_to(root_path)
end
it 'soma o total do motorista no período' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
sign_in create(:gerente)
get consolidacoes_path(periodo.merge(visao: 'motoristas'))
expect(response).to have_http_status(:ok)
expect(response.body).to include('Carlos')
expect(response.body).to include('R$ 120,00')
end
# O default tem que ser o MESMO recorte do dashboard ("Consolidado / Pago"),
# senão o operador compara as duas telas e vê valores diferentes.
it 'sem status na URL mostra o CONSOLIDADO (rascunho fica de fora)' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
rascunho = create(:consolidacao, status: :rascunho,
data_inicio: Date.new(2026, 6, 1), data_fim: Date.new(2026, 6, 30))
create(:consolidacao_entrega, consolidacao: rascunho, motorista_nome: 'Carlos', valor_aplicado: 500.0)
create(:consolidacao_motorista, consolidacao: rascunho, motorista_nome: 'Carlos')
sign_in create(:gerente)
get consolidacoes_path(periodo.merge(visao: 'motoristas'))
expect(response.body).to include('R$ 120,00')
expect(response.body).not_to include('R$ 620,00')
get consolidacoes_path(periodo.merge(visao: 'motoristas', status: 'todos'))
expect(response.body).to include('R$ 620,00')
end
it 'só abre a composição do motorista clicado' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
consolidacao_finalizada(motorista: 'Pedro', valor: 90.0, nome: 'Fechamento do Pedro')
sign_in create(:gerente)
get consolidacoes_path(periodo.merge(visao: 'motoristas'))
expect(response.body).not_to include('O que forma esse valor')
get consolidacoes_path(periodo.merge(visao: 'motoristas', detalhe: 'Carlos'))
expect(response.body).to include('O que forma esse valor')
expect(response.body).to include('Fechamento Junho')
expect(response.body).not_to include('Fechamento do Pedro')
end
it 'a visão lista continua sendo o padrão' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
sign_in create(:gerente)
get consolidacoes_path
expect(response.body).to include('Fechamento Junho')
expect(response.body).not_to include('Total do período')
end
it 'gera o PDF do período' do
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
sign_in create(:gerente)
get totais_pdf_consolidacoes_path(periodo)
expect(response).to have_http_status(:ok)
expect(response.media_type).to eq('application/pdf')
end
end
describe 'motorista — painel' do
it 'mostra o total fechado do período e os fechamentos que o compõem' do
motorista = create(:motorista, nome: 'Carlos')
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
consolidacao_finalizada(motorista: 'Pedro', valor: 999.0, nome: 'Fechamento do Pedro')
sign_in motorista
get motorista_dashboard_path(periodo)
expect(response).to have_http_status(:ok)
expect(response.body).to include('Fechamento Junho')
expect(response.body).to include('R$ 120,00')
expect(response.body).not_to include('Fechamento do Pedro')
end
it 'gera o PDF do período' do
motorista = create(:motorista, nome: 'Carlos')
consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
sign_in motorista
get motorista_totais_pdf_path(periodo)
expect(response).to have_http_status(:ok)
expect(response.media_type).to eq('application/pdf')
end
it 'não é acessível por quem não é motorista' do
sign_in create(:gerente)
get motorista_totais_pdf_path(periodo)
expect(response).to redirect_to(dashboard_path)
end
end
end