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