Files
TREK/client/src/components/Planner/PlaceFormModal.helpers.test.ts
T
Maurice 84c277993c feat(maps): show where an Amap hit came from, and keep its id
An Amap row now carries the same source mark the TREK index, OpenStreetMap
and Google rows get, named per locale because 高德地图 is the name it goes
by where it matters. The "search is on OpenStreetMap" notices and the
key hint in the details column are gone with the keys dev had already
removed, and the client-side provider mirror with them.

amap_poi_id travels with a picked result into the form, the details
column and the shadow log, so a saved place keeps the id it was found
by. A pasted Amap link goes to the resolver like a Google one.
2026-09-12 18:03:10 +02:00

64 lines
2.5 KiB
TypeScript

import { describe, it, expect } from 'vitest'
import { isAmapUrl, isGoogleMapsUrl, isMapUrl } from './PlaceFormModal.helpers'
describe('isGoogleMapsUrl', () => {
it('accepts the short share hosts', () => {
expect(isGoogleMapsUrl('https://maps.app.goo.gl/abc123')).toBe(true)
expect(isGoogleMapsUrl('https://goo.gl/maps/xyz')).toBe(true)
})
it('rejects goo.gl links that are not /maps', () => {
expect(isGoogleMapsUrl('https://goo.gl/something')).toBe(false)
})
it('accepts maps.google.<tld> and maps.google.<sld>.<tld>', () => {
expect(isGoogleMapsUrl('https://maps.google.com/?q=eiffel')).toBe(true)
expect(isGoogleMapsUrl('https://maps.google.co.uk/?q=eiffel')).toBe(true)
})
it('accepts google.<tld>/maps with optional www', () => {
expect(isGoogleMapsUrl('https://google.com/maps/place/Eiffel')).toBe(true)
expect(isGoogleMapsUrl('https://www.google.co.uk/maps')).toBe(true)
})
it('rejects google.<tld> without a /maps path', () => {
expect(isGoogleMapsUrl('https://google.com/search?q=eiffel')).toBe(false)
})
it('rejects spoofed hosts like maps.google.evil.com', () => {
expect(isGoogleMapsUrl('https://maps.google.evil.com/maps')).toBe(false)
})
it('returns false for non-URL input', () => {
expect(isGoogleMapsUrl('not a url')).toBe(false)
expect(isGoogleMapsUrl('')).toBe(false)
expect(isGoogleMapsUrl('Eiffel Tower')).toBe(false)
})
it('trims surrounding whitespace before parsing', () => {
expect(isGoogleMapsUrl(' https://maps.app.goo.gl/abc123 ')).toBe(true)
})
})
describe('isAmapUrl', () => {
it('accepts the share, web and short-link hosts', () => {
expect(isAmapUrl('https://uri.amap.com/marker?position=116.397,39.908&name=天安门')).toBe(true)
expect(isAmapUrl('https://www.amap.com/place/B000A7BD6C')).toBe(true)
expect(isAmapUrl('https://surl.amap.com/abc')).toBe(true)
})
it('is an exact host list, so a lookalike stays a search query', () => {
expect(isAmapUrl('https://amap.com.evil.example/place/x')).toBe(false)
expect(isAmapUrl('https://restapi.amap.com/v3/place/text')).toBe(false)
expect(isAmapUrl('天安门')).toBe(false)
})
})
describe('isMapUrl', () => {
it('sends either provider\'s link to the resolver and nothing else', () => {
expect(isMapUrl('https://maps.app.goo.gl/abc123')).toBe(true)
expect(isMapUrl('https://uri.amap.com/marker?position=116.397,39.908')).toBe(true)
expect(isMapUrl('https://example.com/maps')).toBe(false)
})
})