import { ViajesService } from '../viajes.service';

describe('ViajesService.findAll — búsqueda por número o descripción', () => {
  const crear = () => {
    const prisma: any = {
      usuario: { findUnique: jest.fn().mockResolvedValue({ is_superadmin: true }) },
      empresas: { findUnique: jest.fn().mockResolvedValue({ type: 'subsidiary' }) },
      rubros: { findFirst: jest.fn().mockResolvedValue(null) },
      asignacion_sucursal_caja_usuario: { findMany: jest.fn().mockResolvedValue([]) },
      empresas_sucursales: { findMany: jest.fn().mockResolvedValue([]) },
      depositos: { findMany: jest.fn().mockResolvedValue([]) },
      viajes: {
        findMany: jest.fn().mockResolvedValue([]),
        count: jest.fn().mockResolvedValue(0),
      },
      $transaction: jest.fn().mockImplementation((args: any[]) => Promise.all(args)),
    };
    const service = Object.create(ViajesService.prototype) as any;
    service.prisma = prisma;
    return { service, prisma };
  };

  it('sin "search" no agrega el OR a la query', async () => {
    const { service, prisma } = crear();
    await service.findAll('emp-1', {}, 'usr-1');
    const where = prisma.viajes.findMany.mock.calls[0][0].where;
    expect(where.OR).toBeUndefined();
  });

  it('con "search" filtra por número o descripción (case-insensitive)', async () => {
    const { service, prisma } = crear();
    await service.findAll('emp-1', { search: 'VJ-0001' }, 'usr-1');
    const where = prisma.viajes.findMany.mock.calls[0][0].where;
    expect(where.OR).toEqual([
      { numero: { contains: 'VJ-0001', mode: 'insensitive' } },
      { descripcion: { contains: 'VJ-0001', mode: 'insensitive' } },
    ]);
  });

  it('el search convive con los demás filtros', async () => {
    const { service, prisma } = crear();
    await service.findAll('emp-1', { search: 'interior', estado: 'EN_RUTA' }, 'usr-1');
    const where = prisma.viajes.findMany.mock.calls[0][0].where;
    expect(where.estado).toBe('EN_RUTA');
    expect(where.OR).toHaveLength(2);
  });
});
