import { describe, expect, it } from 'vitest'; import { buildOverpassQuery, clampRadiusMiles, milesToMeters, parseOverpassResponse, } from '../../../lib/pricing/overpass.js'; describe('overpass', () => { it('clamps radius miles between 1 and 50', () => { expect(clampRadiusMiles(0)).toBe(1); expect(clampRadiusMiles(100)).toBe(50); expect(clampRadiusMiles(25)).toBe(25); }); it('builds fixed-template query with numeric injection only', () => { const query = buildOverpassQuery({ lat: 40.1, lng: -74.2, radiusMeters: 16093 }); expect(query).toContain('around:16093,40.1,-74.2'); expect(query).toContain('shop"="games"'); expect(query).toContain('shop"="hobby"'); expect(query).not.toContain('; DROP'); }); it('parses elements with distance-ready coordinates', () => { const stores = parseOverpassResponse( { elements: [ { type: 'node', id: 42, lat: 40.11, lon: -74.21, tags: { name: 'Game Haven', 'addr:street': 'Main St', 'addr:city': 'Town', phone: '555-0100', website: 'https://example.com', }, }, ], }, { originLat: 40.1, originLng: -74.2 } ); expect(stores).toHaveLength(1); expect(stores[0]).toMatchObject({ name: 'Game Haven', lat: 40.11, lng: -74.21, phone: '555-0100', website: 'https://example.com', osmUrl: 'https://www.openstreetmap.org/node/42', }); expect(stores[0].distanceMiles).toBeGreaterThan(0); expect(stores[0].address).toContain('Main St'); }); it('converts miles to meters with clamping', () => { expect(milesToMeters(25)).toBe(Math.round(25 * 1609.344)); expect(milesToMeters(0)).toBe(Math.round(1 * 1609.344)); }); });