require 'rails_helper' RSpec.describe User, type: :model do describe 'validações de nome' do it 'exige nome com ao menos 3 caracteres' do user = build(:operador, nome: 'ab') expect(user).not_to be_valid expect(user.errors[:nome]).to be_present end end describe 'e-mail e senha por papel' do it 'exige e-mail para não-motoristas' do expect(build(:operador).email_required?).to be true expect(build(:operador, email: nil)).not_to be_valid end it 'NÃO exige e-mail nem senha para motoristas (login por PIN)' do motorista = build(:motorista, email: nil, password: nil) expect(motorista.email_required?).to be false expect(motorista.password_required?).to be false expect(motorista).to be_valid end end describe 'validação de PIN (somente motoristas)' do it 'aceita PIN de 4 dígitos numéricos' do expect(build(:motorista, pin_code: '0420')).to be_valid end it 'rejeita PIN com tamanho diferente de 4' do expect(build(:motorista, pin_code: '123')).not_to be_valid end it 'rejeita PIN não numérico' do expect(build(:motorista, pin_code: '12ab')).not_to be_valid end it 'ignora a validação de PIN para não-motoristas' do expect(build(:operador, pin_code: 'xyz')).to be_valid end end describe 'PIN único entre motoristas' do it 'impede dois motoristas com o mesmo PIN' do create(:motorista, pin_code: '4242') duplicado = build(:motorista, pin_code: '4242') expect(duplicado).not_to be_valid expect(duplicado.errors[:pin_code]).to be_present end end describe '#regenerar_login_token!' do it 'gera e persiste um token novo' do motorista = create(:motorista) expect { motorista.regenerar_login_token! } .to change { motorista.reload.login_token }.from(nil) end end end