Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 144 additions & 0 deletions lib/__tests__/parser.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import { describe, expect, it } from 'vitest';
import { parseQuery, validateQuery } from '../parser';

describe('parseQuery — structured queries', () => {
it('parses type, operator, region, radius', () => {
const parsed = parseQuery('type:data_center operator:google region:bavaria radius:100');
expect(parsed.type).toBe('data_center');
expect(parsed.operator).toBe('google');
expect(parsed.region).toBe('bavaria');
expect(parsed.radius).toBe(100);
});

it('parses country and near', () => {
const parsed = parseQuery('type:airport country:france');
expect(parsed.type).toBe('airport');
expect(parsed.country).toBe('france');
});

it('ignores unknown type keys', () => {
const parsed = parseQuery('type:not_a_real_type region:karnataka');
expect(parsed.type).toBeNull();
});

it('caps radius at 500 km', () => {
const parsed = parseQuery('type:telecom near:delhi radius:9999');
expect(parsed.radius).toBe(500);
});

it('decodes underscores in operator and region values', () => {
const parsed = parseQuery('type:power_plant operator:tata_power region:tamil_nadu');
expect(parsed.operator).toBe('tata power');
expect(parsed.region).toBe('tamil nadu');
});

it('defaults radius to 50 when unspecified', () => {
const parsed = parseQuery('type:telecom region:karnataka');
expect(parsed.radius).toBe(50);
});
});

describe('parseQuery — natural language', () => {
it('extracts telecom towers in a region', () => {
const parsed = parseQuery('telecom towers in karnataka');
expect(parsed.type).toBe('telecom');
expect(parsed.region).toBe('karnataka');
expect(parsed.near).toBeNull();
});

it('extracts "near X" as a proximity search', () => {
const parsed = parseQuery('power plants near mumbai');
expect(parsed.type).toBe('power_plant');
expect(parsed.near).toBe('mumbai');
expect(parsed.region).toBeNull();
});

it('extracts data centers', () => {
const parsed = parseQuery('data centers in california');
expect(parsed.type).toBe('data_center');
expect(parsed.region).toBe('california');
});

it('extracts airports', () => {
expect(parseQuery('airports in germany').type).toBe('airport');
});

it('extracts substations', () => {
expect(parseQuery('substations in texas').type).toBe('substation');
});

it('normalizes an operator alias to its canonical form', () => {
const parsed = parseQuery('aws data centers in oregon');
expect(parsed.operator).toBe('amazon');
});

it('parses an explicit radius from "within"', () => {
const parsed = parseQuery('cell towers near delhi within 25 km');
expect(parsed.near).toBe('delhi');
expect(parsed.radius).toBe(25);
});

it('strips stopwords like "show all" from the region', () => {
const parsed = parseQuery('show all hospitals in mumbai');
expect(parsed.type).toBe('hospital');
expect(parsed.region?.toLowerCase()).toContain('mumbai');
});

it('recognises cell vs broadcast vs radio tower variants', () => {
expect(parseQuery('cell towers in chennai').type).toBe('cell_tower');
expect(parseQuery('broadcast towers in chennai').type).toBe('broadcast_tower');
expect(parseQuery('radio towers in chennai').type).toBe('radio_tower');
});

it('recognises surveillance / CCTV', () => {
expect(parseQuery('surveillance cameras in london').type).toBe('surveillance_camera');
expect(parseQuery('cctv in london').type).toBe('surveillance_camera');
});
});

describe('parseQuery — empty / whitespace', () => {
it('returns an empty ParsedQuery for an empty string', () => {
const parsed = parseQuery('');
expect(parsed.type).toBeNull();
expect(parsed.region).toBeNull();
expect(parsed.near).toBeNull();
expect(parsed.raw).toBe('');
});

it('trims whitespace', () => {
const parsed = parseQuery(' telecom towers in karnataka ');
expect(parsed.type).toBe('telecom');
expect(parsed.region).toBe('karnataka');
});
});

describe('validateQuery', () => {
it('rejects queries with no type and no operator', () => {
const parsed = parseQuery('in karnataka');
const result = validateQuery(parsed);
expect(result.valid).toBe(false);
expect(result.error).toMatch(/asset type or operator/i);
});

it('rejects queries with no geographic scope', () => {
const parsed = parseQuery('type:data_center');
const result = validateQuery(parsed);
expect(result.valid).toBe(false);
expect(result.error).toMatch(/geographic scope/i);
});

it('accepts a complete structured query', () => {
const parsed = parseQuery('type:telecom region:karnataka');
expect(validateQuery(parsed).valid).toBe(true);
});

it('accepts a complete natural query', () => {
const parsed = parseQuery('power plants in california');
expect(validateQuery(parsed).valid).toBe(true);
});

it('accepts a "near" proximity query', () => {
const parsed = parseQuery('data centers near london');
expect(validateQuery(parsed).valid).toBe(true);
});
});
Loading