121 lines
4.8 KiB
Ruby
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
|