require 'rails_helper' RSpec.describe 'Admin::Romaneios', type: :request do let(:romaneio) { create(:romaneio) } describe 'permissão' do it 'exige login' do get admin_romaneios_path expect(response).to redirect_to(new_user_session_path) end it 'bloqueia operador (não tem admin.romaneio por padrão)' do sign_in create(:operador) get admin_romaneios_path expect(response).to have_http_status(:redirect) expect(flash[:alert]).to match(/permissão/i) end it 'libera gerente' do sign_in create(:gerente) get admin_romaneios_path expect(response).to have_http_status(:ok) end end describe 'GET #pdf' do before do create(:romaneio_linha, romaneio: romaneio, veiculo: 'GADE_001') sign_in create(:admin) end it 'sai INLINE quando um veículo é pedido — é a prévia do editor' do get pdf_admin_romaneio_path(romaneio, veiculo: 'GADE_001') expect(response.media_type).to eq('application/pdf') expect(response.headers['Content-Disposition']).to match(/inline/) end it 'sai como download quando nenhum veículo é pedido' do get pdf_admin_romaneio_path(romaneio) expect(response.headers['Content-Disposition']).to match(/attachment/) end end describe 'PATCH #atualizar_linha' do let(:linha) { create(:romaneio_linha, romaneio: romaneio, telefones: '(11) 1111-1111') } before { sign_in create(:admin) } it 'grava o campo e o marca como editado' do patch atualizar_linha_admin_romaneio_path(romaneio), params: { linha_id: linha.id, campo: 'telefones', valor: '(11) 99999-0000' }, as: :json expect(response.parsed_body['valor']).to eq('(11) 99999-0000') expect(response.parsed_body['editado']).to be(true) expect(linha.reload.campos_editados).to include('telefones') end it 'com valor null restaura o que o plano trouxe e destrava o campo' do patch atualizar_linha_admin_romaneio_path(romaneio), params: { linha_id: linha.id, campo: 'telefones', valor: '(11) 99999-0000' }, as: :json patch atualizar_linha_admin_romaneio_path(romaneio), params: { linha_id: linha.id, campo: 'telefones', valor: nil }, as: :json expect(linha.reload.telefones).to eq('(11) 1111-1111') expect(linha.campos_editados).to be_empty end it 'recusa campo fora da whitelist — veiculo e ordem são a verdade do roteiro' do patch atualizar_linha_admin_romaneio_path(romaneio), params: { linha_id: linha.id, campo: 'veiculo', valor: 'GADE_999' }, as: :json expect(response).to have_http_status(:unprocessable_entity) expect(linha.reload.veiculo).not_to eq('GADE_999') end end end