import { lookupGeoIp } from '../../../src/comm/geoip/lookup'; import { CrmRadarService } from '../../../src/modules/crm/service/radar'; describe('T34: 内置 GeoIP 前缀表 (lookupGeoIp)', () => { describe('lookupGeoIp', () => { it('应将 8.8.8.8 解析为 US / Mountain View', () => { expect(lookupGeoIp('8.8.8.8')).toEqual({ country: 'US', city: 'Mountain View', }); }); it('应将 114.114.114.114 解析为 CN / Nanjing', () => { expect(lookupGeoIp('114.114.114.114')).toEqual({ country: 'CN', city: 'Nanjing', }); }); it('回环与私网 IP 应返回 null,交由雷达归 Local', () => { expect(lookupGeoIp('127.0.0.1')).toBeNull(); expect(lookupGeoIp('::1')).toBeNull(); expect(lookupGeoIp('localhost')).toBeNull(); expect(lookupGeoIp('192.168.1.100')).toBeNull(); expect(lookupGeoIp('10.0.8.1')).toBeNull(); expect(lookupGeoIp('172.16.0.8')).toBeNull(); }); it('应覆盖其余内置公网短前缀', () => { expect(lookupGeoIp('8.8.4.4')).toEqual({ country: 'US', city: 'Mountain View', }); expect(lookupGeoIp('1.1.1.1')).toEqual({ country: 'AU', city: 'Sydney', }); expect(lookupGeoIp('9.9.9.9')).toEqual({ country: 'US', city: 'Berkeley', }); }); }); describe('CrmRadarService.parseIpLocation', () => { let radarService: CrmRadarService; beforeEach(() => { radarService = new CrmRadarService(); }); it('公网 8.8.8.8 应命中 GeoIP 为 US,不再 Unknown', () => { const loc = radarService.parseIpLocation('8.8.8.8'); expect(loc.country).toBe('US'); expect(loc.city).toBe('Mountain View'); }); it('公网 114.114.114.114 应命中 GeoIP 为 CN', () => { const loc = radarService.parseIpLocation('114.114.114.114'); expect(loc.country).toBe('CN'); expect(loc.city).toBe('Nanjing'); }); it('127.0.0.1 在 lookup 为 null 时 parseIpLocation 仍归 Local', () => { expect(lookupGeoIp('127.0.0.1')).toBeNull(); expect(radarService.parseIpLocation('127.0.0.1')).toEqual({ country: 'Local', city: 'Local', }); }); it('cf-ipcountry=AE 应优先于公网 IP 的 GeoIP 结果', () => { const loc = radarService.parseIpLocation('8.8.8.8', { 'cf-ipcountry': 'AE', }); expect(loc.country).toBe('AE'); expect(loc.city).toBe('Unknown'); }); }); });